From 5546f26619359bbfe1aa23885e93d7bea6d0ece6 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 12 Dec 2019 15:20:41 +0100 Subject: [PATCH] Initial dirty commit of old code into git --- .gitignore | 8 + Game/.settings/org.eclipse.jdt.core.prefs | 11 + Game/src/Ammunition.java | 90 + Game/src/Button.java | 50 + Game/src/ControlledShip.java | 19 + Game/src/Game.java | 279 + Game/src/Item.java | 28 + Game/src/MathShit.java | 29 + Game/src/Menu.java | 7 + Game/src/Metroid.java | 108 + Game/src/MovingObject.java | 251 + Game/src/Shape.java | 202 + Game/src/Ship.java | 47 + Game/src/SpaceSpiel.java | 380 + Game/src/Turret.java | 31 + download all.sh | 2 + etc/lwjgl-2.9.1/build.xml | 670 ++ .../doc/3rdparty/jinput_license.txt | 32 + etc/lwjgl-2.9.1/doc/3rdparty/jogl_license.txt | 152 + etc/lwjgl-2.9.1/doc/3rdparty/lzma_license.txt | 15 + .../doc/3rdparty/openal_license.txt | 437 ++ etc/lwjgl-2.9.1/doc/CREDITS | 38 + etc/lwjgl-2.9.1/doc/LICENSE | 31 + etc/lwjgl-2.9.1/doc/README | 50 + .../doc/lwjgl_hidden_switches.text | 28 + etc/lwjgl-2.9.1/jar/AppleJavaExtensions.jar | Bin 0 -> 4189 bytes etc/lwjgl-2.9.1/jar/asm-debug-all.jar | Bin 0 -> 321450 bytes etc/lwjgl-2.9.1/jar/jinput.jar | Bin 0 -> 214859 bytes etc/lwjgl-2.9.1/jar/lwjgl-debug.jar | Bin 0 -> 1030793 bytes etc/lwjgl-2.9.1/jar/lwjgl.jar | Bin 0 -> 1014790 bytes etc/lwjgl-2.9.1/jar/lwjgl_test.jar | Bin 0 -> 283689 bytes etc/lwjgl-2.9.1/jar/lwjgl_util.jar | Bin 0 -> 173909 bytes etc/lwjgl-2.9.1/jar/lwjgl_util_applet.jar | Bin 0 -> 35975 bytes etc/lwjgl-2.9.1/jar/lzma.jar | Bin 0 -> 5848 bytes .../native/linux/libjinput-linux.so | Bin 0 -> 13824 bytes .../native/linux/libjinput-linux64.so | Bin 0 -> 14512 bytes etc/lwjgl-2.9.1/native/linux/liblwjgl.so | Bin 0 -> 378724 bytes etc/lwjgl-2.9.1/native/linux/liblwjgl64.so | Bin 0 -> 449456 bytes etc/lwjgl-2.9.1/native/linux/libopenal.so | Bin 0 -> 368392 bytes etc/lwjgl-2.9.1/native/linux/libopenal64.so | Bin 0 -> 404085 bytes .../native/macosx/libjinput-osx.jnilib | Bin 0 -> 64608 bytes etc/lwjgl-2.9.1/native/macosx/liblwjgl.jnilib | Bin 0 -> 954384 bytes etc/lwjgl-2.9.1/native/macosx/openal.dylib | Bin 0 -> 731648 bytes etc/lwjgl-2.9.1/native/solaris/liblwjgl.so | Bin 0 -> 359332 bytes etc/lwjgl-2.9.1/native/solaris/liblwjgl64.so | Bin 0 -> 557824 bytes etc/lwjgl-2.9.1/native/solaris/libopenal.so | Bin 0 -> 341608 bytes etc/lwjgl-2.9.1/native/solaris/libopenal64.so | Bin 0 -> 391368 bytes etc/lwjgl-2.9.1/native/windows/OpenAL32.dll | Bin 0 -> 390144 bytes etc/lwjgl-2.9.1/native/windows/OpenAL64.dll | Bin 0 -> 382464 bytes etc/lwjgl-2.9.1/native/windows/jinput-dx8.dll | Bin 0 -> 61952 bytes .../native/windows/jinput-dx8_64.dll | Bin 0 -> 65024 bytes etc/lwjgl-2.9.1/native/windows/jinput-raw.dll | Bin 0 -> 59392 bytes .../native/windows/jinput-raw_64.dll | Bin 0 -> 62464 bytes etc/lwjgl-2.9.1/native/windows/lwjgl.dll | Bin 0 -> 298496 bytes etc/lwjgl-2.9.1/native/windows/lwjgl64.dll | Bin 0 -> 310272 bytes etc/lwjgl-2.9.1/platform_build/JLzma.jar | Bin 0 -> 35773 bytes .../platform_build/Pack200Task.jar | Bin 0 -> 6969 bytes .../platform_build/bsd_ant/build.xml | 127 + .../platform_build/build-applet.xml | 158 + .../platform_build/build-definitions.xml | 203 + .../platform_build/build-generator.xml | 340 + .../platform_build/build-maven.xml | 211 + .../platform_build/build-webstart.xml | 181 + .../platform_build/linux_ant/build.xml | 126 + .../platform_build/linux_ant/build_es.xml | 129 + .../macosx_ant/build-symbol-list | 4 + .../platform_build/macosx_ant/build.xml | 1 + .../platform_build/mingw_ant/build.xml | 68 + .../platform_build/windows_ant/build.xml | 66 + .../platform_build/windows_ant/build_es.xml | 67 + etc/lwjgl-2.9.1/res/Footsteps.wav | Bin 0 -> 282748 bytes etc/lwjgl-2.9.1/res/appletlogo.gif | Bin 0 -> 3474 bytes etc/lwjgl-2.9.1/res/appletprogress.gif | Bin 0 -> 7468 bytes etc/lwjgl-2.9.1/res/ball.png | Bin 0 -> 4817 bytes etc/lwjgl-2.9.1/res/ball_sm.png | Bin 0 -> 1802 bytes etc/lwjgl-2.9.1/res/center.wav | Bin 0 -> 55188 bytes etc/lwjgl-2.9.1/res/ding.wav | Bin 0 -> 40474 bytes etc/lwjgl-2.9.1/res/left.wav | Bin 0 -> 55188 bytes .../res/logo/lwjgl_logo-with_jacket.ai | 1086 +++ .../res/logo/lwjgl_logo-with_jacket.svg | 198 + etc/lwjgl-2.9.1/res/lwjgl_16x16.xpm | 141 + etc/lwjgl-2.9.1/res/lwjgl_32x32.xpm | 275 + etc/lwjgl-2.9.1/res/resources.txt | 11 + etc/lwjgl-2.9.1/res/right.wav | Bin 0 -> 55188 bytes etc/lwjgl-2.9.1/res/spaceinvaders/alien.gif | Bin 0 -> 1318 bytes etc/lwjgl-2.9.1/res/spaceinvaders/alien2.gif | Bin 0 -> 1294 bytes etc/lwjgl-2.9.1/res/spaceinvaders/alien3.gif | Bin 0 -> 1297 bytes etc/lwjgl-2.9.1/res/spaceinvaders/gotyou.gif | Bin 0 -> 4003 bytes etc/lwjgl-2.9.1/res/spaceinvaders/hit.wav | Bin 0 -> 1886 bytes etc/lwjgl-2.9.1/res/spaceinvaders/loose.wav | Bin 0 -> 17810 bytes .../res/spaceinvaders/pressanykey.gif | Bin 0 -> 2664 bytes etc/lwjgl-2.9.1/res/spaceinvaders/ship.gif | Bin 0 -> 1129 bytes etc/lwjgl-2.9.1/res/spaceinvaders/shot.gif | Bin 0 -> 935 bytes etc/lwjgl-2.9.1/res/spaceinvaders/shot.wav | Bin 0 -> 8276 bytes etc/lwjgl-2.9.1/res/spaceinvaders/start.wav | Bin 0 -> 20280 bytes etc/lwjgl-2.9.1/res/spaceinvaders/win.wav | Bin 0 -> 23496 bytes etc/lwjgl-2.9.1/res/spaceinvaders/youwin.gif | Bin 0 -> 3937 bytes .../src/generated/org/lwjgl/openal/AL10.java | 1420 ++++ .../src/generated/org/lwjgl/openal/AL11.java | 289 + .../src/generated/org/lwjgl/openal/EFX10.java | 757 ++ .../lwjgl/opencl/AMDDeviceAttributeQuery.java | 17 + .../lwjgl/opencl/AMDDeviceMemoryFlags.java | 16 + .../org/lwjgl/opencl/AMDOfflineDevices.java | 13 + .../opencl/APPLEContextLoggingFunctions.java | 41 + .../org/lwjgl/opencl/APPLEGLSharing.java | 51 + .../opencl/APPLESetMemObjectDestructor.java | 25 + .../src/generated/org/lwjgl/opencl/CL10.java | 1800 +++++ .../generated/org/lwjgl/opencl/CL10GL.java | 146 + .../src/generated/org/lwjgl/opencl/CL11.java | 350 + .../src/generated/org/lwjgl/opencl/CL12.java | 495 ++ .../generated/org/lwjgl/opencl/CL12GL.java | 29 + .../org/lwjgl/opencl/CLCapabilities.java | 362 + .../lwjgl/opencl/CLDeviceCapabilities.java | 193 + .../lwjgl/opencl/CLPlatformCapabilities.java | 76 + .../org/lwjgl/opencl/EXTAtomicCounters32.java | 16 + .../org/lwjgl/opencl/EXTAtomicCounters64.java | 16 + .../org/lwjgl/opencl/EXTDeviceFission.java | 122 + .../org/lwjgl/opencl/EXTMigrateMemobject.java | 50 + .../lwjgl/opencl/INTELImmediateExecution.java | 21 + .../lwjgl/opencl/INTELThreadLocalExec.java | 24 + .../org/lwjgl/opencl/KHRDepthImages.java | 16 + .../generated/org/lwjgl/opencl/KHRFp16.java | 16 + .../generated/org/lwjgl/opencl/KHRFp64.java | 16 + .../org/lwjgl/opencl/KHRGLDepthImages.java | 21 + .../org/lwjgl/opencl/KHRGLEvent.java | 27 + .../org/lwjgl/opencl/KHRGLMsaaSharing.java | 16 + .../org/lwjgl/opencl/KHRGLSharing.java | 50 + .../generated/org/lwjgl/opencl/KHRICD.java | 33 + .../lwjgl/opencl/KHRImage2DFromBuffer.java | 17 + .../org/lwjgl/opencl/KHRInitializeMemory.java | 21 + .../org/lwjgl/opencl/KHRSubgroups.java | 25 + .../org/lwjgl/opencl/KHRTerminateContext.java | 22 + .../lwjgl/opencl/NVDeviceAttributeQuery.java | 22 + .../lwjgl/opengl/AMDBlendMinmaxFactor.java | 19 + .../org/lwjgl/opengl/AMDDebugOutput.java | 103 + .../lwjgl/opengl/AMDDepthClampSeparate.java | 19 + .../org/lwjgl/opengl/AMDDrawBuffersBlend.java | 43 + .../lwjgl/opengl/AMDInterleavedElements.java | 30 + .../lwjgl/opengl/AMDMultiDrawIndirect.java | 67 + .../org/lwjgl/opengl/AMDNameGenDelete.java | 65 + .../lwjgl/opengl/AMDPerformanceMonitor.java | 201 + .../org/lwjgl/opengl/AMDPinnedMemory.java | 18 + .../lwjgl/opengl/AMDQueryBufferObject.java | 31 + .../org/lwjgl/opengl/AMDSamplePositions.java | 25 + .../opengl/AMDSeamlessCubemapPerTexture.java | 17 + .../org/lwjgl/opengl/AMDSparseTexture.java | 58 + .../opengl/AMDStencilOperationExtended.java | 39 + .../opengl/AMDVertexShaderTessellator.java | 50 + .../lwjgl/opengl/APPLEAuxDepthStencil.java | 16 + .../org/lwjgl/opengl/APPLEClientStorage.java | 16 + .../org/lwjgl/opengl/APPLEElementArray.java | 87 + .../org/lwjgl/opengl/APPLEFence.java | 104 + .../org/lwjgl/opengl/APPLEFloatPixels.java | 40 + .../lwjgl/opengl/APPLEFlushBufferRange.java | 34 + .../lwjgl/opengl/APPLEObjectPurgeable.java | 73 + .../org/lwjgl/opengl/APPLEPackedPixels.java | 33 + .../org/lwjgl/opengl/APPLERgb422.java | 30 + .../org/lwjgl/opengl/APPLERowBytes.java | 18 + .../org/lwjgl/opengl/APPLETextureRange.java | 55 + .../lwjgl/opengl/APPLEVertexArrayObject.java | 70 + .../lwjgl/opengl/APPLEVertexArrayRange.java | 73 + .../opengl/APPLEVertexProgramEvaluators.java | 92 + .../org/lwjgl/opengl/APPLEYcbcr422.java | 32 + .../org/lwjgl/opengl/ARBBaseInstance.java | 41 + .../org/lwjgl/opengl/ARBBindlessTexture.java | 153 + .../lwjgl/opengl/ARBBlendFuncExtended.java | 45 + .../org/lwjgl/opengl/ARBBufferObject.java | 323 + .../org/lwjgl/opengl/ARBBufferStorage.java | 107 + .../org/lwjgl/opengl/ARBCLEvent.java | 31 + .../lwjgl/opengl/ARBClearBufferObject.java | 37 + .../org/lwjgl/opengl/ARBClearTexture.java | 55 + .../org/lwjgl/opengl/ARBColorBufferFloat.java | 57 + .../ARBCompressedTexturePixelStorage.java | 24 + .../org/lwjgl/opengl/ARBComputeShader.java | 79 + .../opengl/ARBComputeVariableGroupSize.java | 33 + .../org/lwjgl/opengl/ARBCopyBuffer.java | 25 + .../org/lwjgl/opengl/ARBCopyImage.java | 15 + .../org/lwjgl/opengl/ARBDebugOutput.java | 131 + .../org/lwjgl/opengl/ARBDepthBufferFloat.java | 27 + .../org/lwjgl/opengl/ARBDepthClamp.java | 18 + .../org/lwjgl/opengl/ARBDepthTexture.java | 31 + .../org/lwjgl/opengl/ARBDrawBuffers.java | 50 + .../org/lwjgl/opengl/ARBDrawBuffersBlend.java | 43 + .../opengl/ARBDrawElementsBaseVertex.java | 50 + .../org/lwjgl/opengl/ARBDrawIndirect.java | 50 + .../org/lwjgl/opengl/ARBDrawInstanced.java | 53 + .../org/lwjgl/opengl/ARBES2Compatibility.java | 64 + .../org/lwjgl/opengl/ARBES3Compatibility.java | 41 + .../org/lwjgl/opengl/ARBEnhancedLayouts.java | 18 + .../opengl/ARBExplicitUniformLocation.java | 17 + .../org/lwjgl/opengl/ARBFragmentProgram.java | 44 + .../org/lwjgl/opengl/ARBFragmentShader.java | 31 + .../opengl/ARBFramebufferNoAttachments.java | 71 + .../lwjgl/opengl/ARBFramebufferObject.java | 297 + .../org/lwjgl/opengl/ARBFramebufferSRGB.java | 37 + .../org/lwjgl/opengl/ARBGeometryShader4.java | 99 + .../org/lwjgl/opengl/ARBGetProgramBinary.java | 41 + .../org/lwjgl/opengl/ARBGpuShader5.java | 26 + .../org/lwjgl/opengl/ARBGpuShaderFp64.java | 250 + .../org/lwjgl/opengl/ARBHalfFloatPixel.java | 21 + .../org/lwjgl/opengl/ARBHalfFloatVertex.java | 18 + .../org/lwjgl/opengl/ARBImaging.java | 1662 +++++ .../lwjgl/opengl/ARBIndirectParameters.java | 81 + .../org/lwjgl/opengl/ARBInstancedArrays.java | 25 + .../lwjgl/opengl/ARBInternalformatQuery.java | 25 + .../lwjgl/opengl/ARBInternalformatQuery2.java | 150 + .../lwjgl/opengl/ARBInvalidateSubdata.java | 35 + .../lwjgl/opengl/ARBMapBufferAlignment.java | 17 + .../org/lwjgl/opengl/ARBMapBufferRange.java | 43 + .../org/lwjgl/opengl/ARBMatrixPalette.java | 94 + .../org/lwjgl/opengl/ARBMultiBind.java | 35 + .../lwjgl/opengl/ARBMultiDrawIndirect.java | 35 + .../org/lwjgl/opengl/ARBMultisample.java | 29 + .../org/lwjgl/opengl/ARBMultitexture.java | 191 + .../org/lwjgl/opengl/ARBOcclusionQuery.java | 158 + .../org/lwjgl/opengl/ARBOcclusionQuery2.java | 17 + .../lwjgl/opengl/ARBPixelBufferObject.java | 26 + .../org/lwjgl/opengl/ARBPointParameters.java | 33 + .../org/lwjgl/opengl/ARBPointSprite.java | 26 + .../org/lwjgl/opengl/ARBProgram.java | 322 + .../opengl/ARBProgramInterfaceQuery.java | 121 + .../org/lwjgl/opengl/ARBProvokingVertex.java | 28 + .../lwjgl/opengl/ARBQueryBufferObject.java | 37 + .../org/lwjgl/opengl/ARBRobustness.java | 1712 +++++ .../org/lwjgl/opengl/ARBSampleShading.java | 32 + .../org/lwjgl/opengl/ARBSamplerObjects.java | 103 + .../org/lwjgl/opengl/ARBSeamlessCubeMap.java | 18 + .../opengl/ARBSeamlessCubemapPerTexture.java | 18 + .../opengl/ARBSeparateShaderObjects.java | 329 + .../lwjgl/opengl/ARBShaderAtomicCounters.java | 84 + .../lwjgl/opengl/ARBShaderImageLoadStore.java | 111 + .../org/lwjgl/opengl/ARBShaderObjects.java | 552 ++ .../opengl/ARBShaderStorageBufferObject.java | 62 + .../org/lwjgl/opengl/ARBShaderSubroutine.java | 102 + .../lwjgl/opengl/ARBShadingLanguage100.java | 16 + .../opengl/ARBShadingLanguageInclude.java | 160 + .../generated/org/lwjgl/opengl/ARBShadow.java | 15 + .../org/lwjgl/opengl/ARBShadowAmbient.java | 13 + .../org/lwjgl/opengl/ARBSparseTexture.java | 57 + .../org/lwjgl/opengl/ARBStencilTexturing.java | 16 + .../generated/org/lwjgl/opengl/ARBSync.java | 106 + .../lwjgl/opengl/ARBTessellationShader.java | 107 + .../lwjgl/opengl/ARBTextureBorderClamp.java | 13 + .../lwjgl/opengl/ARBTextureBufferObject.java | 37 + .../lwjgl/opengl/ARBTextureBufferRange.java | 35 + .../lwjgl/opengl/ARBTextureCompression.java | 149 + .../opengl/ARBTextureCompressionBPTC.java | 22 + .../opengl/ARBTextureCompressionRGTC.java | 21 + .../org/lwjgl/opengl/ARBTextureCubeMap.java | 24 + .../lwjgl/opengl/ARBTextureCubeMapArray.java | 42 + .../lwjgl/opengl/ARBTextureEnvCombine.java | 34 + .../org/lwjgl/opengl/ARBTextureEnvDot3.java | 14 + .../org/lwjgl/opengl/ARBTextureFloat.java | 44 + .../org/lwjgl/opengl/ARBTextureGather.java | 19 + .../opengl/ARBTextureMirrorClampToEdge.java | 20 + .../opengl/ARBTextureMirroredRepeat.java | 13 + .../lwjgl/opengl/ARBTextureMultisample.java | 94 + .../lwjgl/opengl/ARBTextureRGB10_A2UI.java | 18 + .../org/lwjgl/opengl/ARBTextureRectangle.java | 53 + .../org/lwjgl/opengl/ARBTextureRg.java | 44 + .../org/lwjgl/opengl/ARBTextureStorage.java | 52 + .../opengl/ARBTextureStorageMultisample.java | 35 + .../org/lwjgl/opengl/ARBTextureSwizzle.java | 27 + .../org/lwjgl/opengl/ARBTextureView.java | 25 + .../org/lwjgl/opengl/ARBTimerQuery.java | 46 + .../lwjgl/opengl/ARBTransformFeedback2.java | 62 + .../lwjgl/opengl/ARBTransformFeedback3.java | 39 + .../opengl/ARBTransformFeedbackInstanced.java | 19 + .../org/lwjgl/opengl/ARBTransposeMatrix.java | 34 + .../lwjgl/opengl/ARBUniformBufferObject.java | 175 + .../org/lwjgl/opengl/ARBVertexArrayBgra.java | 17 + .../lwjgl/opengl/ARBVertexArrayObject.java | 43 + .../lwjgl/opengl/ARBVertexAttrib64bit.java | 78 + .../lwjgl/opengl/ARBVertexAttribBinding.java | 55 + .../org/lwjgl/opengl/ARBVertexBlend.java | 189 + .../lwjgl/opengl/ARBVertexBufferObject.java | 41 + .../org/lwjgl/opengl/ARBVertexProgram.java | 154 + .../org/lwjgl/opengl/ARBVertexShader.java | 402 ++ .../opengl/ARBVertexType2_10_10_10_REV.java | 172 + .../org/lwjgl/opengl/ARBViewportArray.java | 121 + .../org/lwjgl/opengl/ARBWindowPos.java | 75 + .../org/lwjgl/opengl/ATIDrawBuffers.java | 50 + .../org/lwjgl/opengl/ATIElementArray.java | 54 + .../org/lwjgl/opengl/ATIEnvmapBumpmap.java | 56 + .../org/lwjgl/opengl/ATIFragmentShader.java | 230 + .../org/lwjgl/opengl/ATIMapObjectBuffer.java | 85 + .../org/lwjgl/opengl/ATIMeminfo.java | 18 + .../org/lwjgl/opengl/ATIPnTriangles.java | 37 + .../org/lwjgl/opengl/ATISeparateStencil.java | 32 + .../lwjgl/opengl/ATITextFragmentShader.java | 22 + .../opengl/ATITextureCompression3DC.java | 13 + .../lwjgl/opengl/ATITextureEnvCombine3.java | 20 + .../org/lwjgl/opengl/ATITextureFloat.java | 28 + .../lwjgl/opengl/ATITextureMirrorOnce.java | 14 + .../lwjgl/opengl/ATIVertexArrayObject.java | 203 + .../opengl/ATIVertexAttribArrayObject.java | 37 + .../org/lwjgl/opengl/ATIVertexStreams.java | 182 + .../org/lwjgl/opengl/ContextCapabilities.java | 6239 +++++++++++++++++ .../generated/org/lwjgl/opengl/EXTAbgr.java | 13 + .../generated/org/lwjgl/opengl/EXTBgra.java | 14 + .../org/lwjgl/opengl/EXTBindableUniform.java | 54 + .../org/lwjgl/opengl/EXTBlendColor.java | 33 + .../opengl/EXTBlendEquationSeparate.java | 26 + .../lwjgl/opengl/EXTBlendFuncSeparate.java | 24 + .../org/lwjgl/opengl/EXTBlendMinmax.java | 32 + .../org/lwjgl/opengl/EXTBlendSubtract.java | 14 + .../org/lwjgl/opengl/EXTCgShader.java | 20 + .../lwjgl/opengl/EXTCompiledVertexArray.java | 30 + .../org/lwjgl/opengl/EXTDepthBoundsTest.java | 32 + .../lwjgl/opengl/EXTDirectStateAccess.java | 3103 ++++++++ .../org/lwjgl/opengl/EXTDrawBuffers2.java | 82 + .../org/lwjgl/opengl/EXTDrawInstanced.java | 53 + .../lwjgl/opengl/EXTDrawRangeElements.java | 48 + .../org/lwjgl/opengl/EXTFogCoord.java | 64 + .../org/lwjgl/opengl/EXTFramebufferBlit.java | 51 + .../opengl/EXTFramebufferMultisample.java | 39 + .../EXTFramebufferMultisampleBlitScaled.java | 17 + .../lwjgl/opengl/EXTFramebufferObject.java | 327 + .../org/lwjgl/opengl/EXTFramebufferSRGB.java | 37 + .../org/lwjgl/opengl/EXTGeometryShader4.java | 99 + .../lwjgl/opengl/EXTGpuProgramParameters.java | 29 + .../org/lwjgl/opengl/EXTGpuShader4.java | 396 ++ .../org/lwjgl/opengl/EXTMultiDrawArrays.java | 21 + .../lwjgl/opengl/EXTPackedDepthStencil.java | 42 + .../org/lwjgl/opengl/EXTPackedFloat.java | 55 + .../org/lwjgl/opengl/EXTPackedPixels.java | 17 + .../org/lwjgl/opengl/EXTPalettedTexture.java | 169 + .../lwjgl/opengl/EXTPixelBufferObject.java | 26 + .../org/lwjgl/opengl/EXTPointParameters.java | 33 + .../org/lwjgl/opengl/EXTProvokingVertex.java | 32 + .../org/lwjgl/opengl/EXTRescaleNormal.java | 13 + .../org/lwjgl/opengl/EXTSecondaryColor.java | 88 + .../opengl/EXTSeparateShaderObjects.java | 52 + .../opengl/EXTSeparateSpecularColor.java | 15 + .../lwjgl/opengl/EXTShaderImageLoadStore.java | 99 + .../lwjgl/opengl/EXTSharedTexturePalette.java | 13 + .../org/lwjgl/opengl/EXTStencilClearTag.java | 31 + .../org/lwjgl/opengl/EXTStencilTwoSide.java | 22 + .../org/lwjgl/opengl/EXTStencilWrap.java | 14 + .../org/lwjgl/opengl/EXTTextureArray.java | 64 + .../lwjgl/opengl/EXTTextureBufferObject.java | 37 + .../opengl/EXTTextureCompressionLATC.java | 21 + .../opengl/EXTTextureCompressionRGTC.java | 21 + .../opengl/EXTTextureCompressionS3TC.java | 16 + .../lwjgl/opengl/EXTTextureEnvCombine.java | 33 + .../org/lwjgl/opengl/EXTTextureEnvDot3.java | 14 + .../opengl/EXTTextureFilterAnisotropic.java | 14 + .../org/lwjgl/opengl/EXTTextureInteger.java | 162 + .../org/lwjgl/opengl/EXTTextureLODBias.java | 30 + .../lwjgl/opengl/EXTTextureMirrorClamp.java | 21 + .../org/lwjgl/opengl/EXTTextureRectangle.java | 16 + .../org/lwjgl/opengl/EXTTextureSRGB.java | 38 + .../lwjgl/opengl/EXTTextureSRGBDecode.java | 28 + .../opengl/EXTTextureSharedExponent.java | 34 + .../org/lwjgl/opengl/EXTTextureSnorm.java | 45 + .../org/lwjgl/opengl/EXTTextureSwizzle.java | 27 + .../org/lwjgl/opengl/EXTTimerQuery.java | 55 + .../lwjgl/opengl/EXTTransformFeedback.java | 154 + .../org/lwjgl/opengl/EXTVertexArrayBgra.java | 17 + .../lwjgl/opengl/EXTVertexAttrib64bit.java | 127 + .../org/lwjgl/opengl/EXTVertexShader.java | 589 ++ .../org/lwjgl/opengl/EXTVertexWeighting.java | 52 + .../src/generated/org/lwjgl/opengl/GL11.java | 3267 +++++++++ .../src/generated/org/lwjgl/opengl/GL12.java | 208 + .../src/generated/org/lwjgl/opengl/GL13.java | 383 + .../src/generated/org/lwjgl/opengl/GL14.java | 292 + .../src/generated/org/lwjgl/opengl/GL15.java | 486 ++ .../src/generated/org/lwjgl/opengl/GL20.java | 1130 +++ .../src/generated/org/lwjgl/opengl/GL21.java | 112 + .../src/generated/org/lwjgl/opengl/GL30.java | 1564 +++++ .../src/generated/org/lwjgl/opengl/GL31.java | 391 ++ .../src/generated/org/lwjgl/opengl/GL32.java | 505 ++ .../src/generated/org/lwjgl/opengl/GL33.java | 705 ++ .../src/generated/org/lwjgl/opengl/GL40.java | 811 +++ .../src/generated/org/lwjgl/opengl/GL41.java | 1033 +++ .../src/generated/org/lwjgl/opengl/GL42.java | 377 + .../src/generated/org/lwjgl/opengl/GL43.java | 1082 +++ .../src/generated/org/lwjgl/opengl/GL44.java | 304 + .../lwjgl/opengl/GREMEDYFrameTerminator.java | 19 + .../org/lwjgl/opengl/GREMEDYStringMarker.java | 28 + .../org/lwjgl/opengl/HPOcclusionTest.java | 23 + .../org/lwjgl/opengl/IBMRasterposClip.java | 17 + .../org/lwjgl/opengl/INTELMapTexture.java | 57 + .../generated/org/lwjgl/opengl/KHRDebug.java | 179 + .../opengl/KHRTextureCompressionAstcLdr.java | 45 + .../opengl/NVBindlessMultiDrawIndirect.java | 47 + .../org/lwjgl/opengl/NVBindlessTexture.java | 122 + .../lwjgl/opengl/NVBlendEquationAdvanced.java | 93 + .../org/lwjgl/opengl/NVComputeProgram5.java | 30 + .../org/lwjgl/opengl/NVConditionalRender.java | 35 + .../org/lwjgl/opengl/NVCopyDepthToColor.java | 14 + .../org/lwjgl/opengl/NVCopyImage.java | 19 + .../org/lwjgl/opengl/NVDeepTexture3D.java | 18 + .../org/lwjgl/opengl/NVDepthBufferFloat.java | 57 + .../org/lwjgl/opengl/NVDepthClamp.java | 13 + .../org/lwjgl/opengl/NVDrawTexture.java | 19 + .../org/lwjgl/opengl/NVEvaluators.java | 116 + .../lwjgl/opengl/NVExplicitMultisample.java | 92 + .../generated/org/lwjgl/opengl/NVFence.java | 94 + .../org/lwjgl/opengl/NVFloatBuffer.java | 41 + .../org/lwjgl/opengl/NVFogDistance.java | 15 + .../org/lwjgl/opengl/NVFragmentProgram.java | 68 + .../org/lwjgl/opengl/NVFragmentProgram2.java | 20 + .../NVFramebufferMultisampleCoverage.java | 31 + .../org/lwjgl/opengl/NVGeometryProgram4.java | 44 + .../org/lwjgl/opengl/NVGpuProgram4.java | 161 + .../org/lwjgl/opengl/NVGpuProgram5.java | 20 + .../org/lwjgl/opengl/NVGpuShader5.java | 339 + .../org/lwjgl/opengl/NVHalfFloat.java | 224 + .../org/lwjgl/opengl/NVLightMaxExponent.java | 14 + .../lwjgl/opengl/NVMultisampleCoverage.java | 18 + .../lwjgl/opengl/NVMultisampleFilterHint.java | 17 + .../org/lwjgl/opengl/NVOcclusionQuery.java | 117 + .../lwjgl/opengl/NVPackedDepthStencil.java | 14 + .../lwjgl/opengl/NVParameterBufferObject.java | 54 + .../org/lwjgl/opengl/NVPathRendering.java | 768 ++ .../org/lwjgl/opengl/NVPixelDataRange.java | 77 + .../org/lwjgl/opengl/NVPointSprite.java | 32 + .../org/lwjgl/opengl/NVPresentVideo.java | 128 + .../org/lwjgl/opengl/NVPrimitiveRestart.java | 41 + .../generated/org/lwjgl/opengl/NVProgram.java | 181 + .../org/lwjgl/opengl/NVRegisterCombiners.java | 235 + .../lwjgl/opengl/NVRegisterCombiners2.java | 31 + .../org/lwjgl/opengl/NVShaderBufferLoad.java | 172 + .../org/lwjgl/opengl/NVShaderBufferStore.java | 22 + .../lwjgl/opengl/NVTessellationProgram5.java | 37 + .../org/lwjgl/opengl/NVTexgenReflection.java | 14 + .../org/lwjgl/opengl/NVTextureBarrier.java | 19 + .../lwjgl/opengl/NVTextureCompressionVTC.java | 21 + .../lwjgl/opengl/NVTextureEnvCombine4.java | 17 + .../lwjgl/opengl/NVTextureExpandNormal.java | 18 + .../lwjgl/opengl/NVTextureMultisample.java | 65 + .../org/lwjgl/opengl/NVTextureRectangle.java | 16 + .../org/lwjgl/opengl/NVTextureShader.java | 149 + .../org/lwjgl/opengl/NVTextureShader2.java | 40 + .../org/lwjgl/opengl/NVTextureShader3.java | 29 + .../org/lwjgl/opengl/NVTransformFeedback.java | 278 + .../lwjgl/opengl/NVTransformFeedback2.java | 101 + .../org/lwjgl/opengl/NVVertexArrayRange.java | 80 + .../org/lwjgl/opengl/NVVertexArrayRange2.java | 13 + .../opengl/NVVertexAttribInteger64bit.java | 180 + .../opengl/NVVertexBufferUnifiedMemory.java | 163 + .../org/lwjgl/opengl/NVVertexProgram.java | 545 ++ .../lwjgl/opengl/NVVertexProgram2Option.java | 17 + .../org/lwjgl/opengl/NVVertexProgram3.java | 17 + .../org/lwjgl/opengl/NVVideoCapture.java | 245 + .../org/lwjgl/opengl/NVXGpuMemoryInfo.java | 23 + .../org/lwjgl/opengl/References.java | 51 + .../org/lwjgl/opengl/SGISGenerateMipmap.java | 23 + .../org/lwjgl/opengl/SGISTextureLOD.java | 20 + .../org/lwjgl/opengl/SUNSliceAccum.java | 16 + .../opengles/AMDCompressed3DCTexture.java | 18 + .../opengles/AMDCompressedATCTexture.java | 19 + .../lwjgl/opengles/AMDPerformanceMonitor.java | 149 + .../lwjgl/opengles/AMDProgramBinaryZ400.java | 16 + .../lwjgl/opengles/ANGLEFramebufferBlit.java | 33 + .../opengles/ANGLEFramebufferMultisample.java | 34 + .../opengles/APPLEFramebufferMultisample.java | 54 + .../org/lwjgl/opengles/APPLERgb422.java | 30 + .../org/lwjgl/opengles/APPLESync.java | 122 + .../opengles/APPLETextureFormatBGRA8888.java | 16 + .../lwjgl/opengles/APPLETextureMaxLevel.java | 17 + .../org/lwjgl/opengles/ARBDrawBuffers.java | 45 + .../org/lwjgl/opengles/ARBHalfFloatPixel.java | 18 + .../lwjgl/opengles/ARBTextureRectangle.java | 53 + .../lwjgl/opengles/ARMMaliShaderBinary.java | 16 + .../org/lwjgl/opengles/ARMRgba8.java | 16 + .../lwjgl/opengles/ContextCapabilities.java | 361 + .../org/lwjgl/opengles/DMPShaderBinary.java | 16 + .../generated/org/lwjgl/opengles/EXTBgra.java | 18 + .../org/lwjgl/opengles/EXTBlendMinmax.java | 25 + .../org/lwjgl/opengles/EXTCgShader.java | 20 + .../opengles/EXTColorBufferHalfFloat.java | 30 + .../lwjgl/opengles/EXTCopyTextureLevels.java | 18 + .../org/lwjgl/opengles/EXTDebugLabel.java | 53 + .../org/lwjgl/opengles/EXTDebugMarker.java | 40 + .../lwjgl/opengles/EXTDiscardFramebuffer.java | 27 + .../org/lwjgl/opengles/EXTMapBufferRange.java | 50 + .../lwjgl/opengles/EXTMultiDrawArrays.java | 20 + .../EXTMultisampledRenderToTexture.java | 44 + .../opengles/EXTMultiviewDrawBuffers.java | 55 + .../opengles/EXTOcclusionQueryBoolean.java | 98 + .../org/lwjgl/opengles/EXTPackedFloat.java | 30 + .../org/lwjgl/opengles/EXTReadFormatBgra.java | 22 + .../org/lwjgl/opengles/EXTRobustness.java | 71 + .../generated/org/lwjgl/opengles/EXTSRGB.java | 29 + .../opengles/EXTSeparateShaderObjects.java | 273 + .../opengles/EXTShaderFramebufferFetch.java | 17 + .../org/lwjgl/opengles/EXTShadowSamplers.java | 25 + .../org/lwjgl/opengles/EXTTextureArray.java | 58 + .../opengles/EXTTextureCompressionDXT1.java | 18 + .../opengles/EXTTextureCompressionLATC.java | 21 + .../opengles/EXTTextureCompressionS3TC.java | 21 + .../opengles/EXTTextureFilterAnisotropic.java | 24 + .../opengles/EXTTextureFormatBGRA8888.java | 17 + .../org/lwjgl/opengles/EXTTextureLODBias.java | 30 + .../org/lwjgl/opengles/EXTTextureRg.java | 25 + .../org/lwjgl/opengles/EXTTextureStorage.java | 69 + .../opengles/EXTTextureType2101010REV.java | 16 + .../org/lwjgl/opengles/EXTUnpackSubimage.java | 19 + .../generated/org/lwjgl/opengles/GLES20.java | 1715 +++++ .../generated/org/lwjgl/opengles/GLES30.java | 1261 ++++ .../IMGMultisampledRenderToTexture.java | 44 + .../org/lwjgl/opengles/IMGProgramBinary.java | 16 + .../org/lwjgl/opengles/IMGReadFormat.java | 17 + .../org/lwjgl/opengles/IMGShaderBinary.java | 16 + .../opengles/IMGTextureCompressionPvrtc.java | 20 + .../org/lwjgl/opengles/KHRDebug.java | 228 + .../KHRTextureCompressionAstcLdr.java | 45 + .../org/lwjgl/opengles/NVCoverageSample.java | 67 + .../org/lwjgl/opengles/NVDepthNonlinear.java | 31 + .../org/lwjgl/opengles/NVDrawBuffers.java | 66 + .../org/lwjgl/opengles/NVDrawPath.java | 148 + .../org/lwjgl/opengles/NVDrawTexture.java | 18 + .../opengles/NVEGLStreamConsumerExternal.java | 31 + .../lwjgl/opengles/NVFboColorAttachments.java | 29 + .../generated/org/lwjgl/opengles/NVFence.java | 76 + .../NVFramebufferVertexAttribArray.java | 28 + .../org/lwjgl/opengles/NVGetTexImage.java | 79 + .../org/lwjgl/opengles/NVPlatformBinary.java | 16 + .../org/lwjgl/opengles/NVReadBuffer.java | 21 + .../org/lwjgl/opengles/NVSystemTime.java | 25 + .../opengles/OESBlendEquationSeparate.java | 25 + .../lwjgl/opengles/OESBlendFuncSeparate.java | 27 + .../org/lwjgl/opengles/OESBlendSubtract.java | 31 + .../OESCompressedETC1RGB8Texture.java | 16 + .../OESCompressedPalettedTexture.java | 25 + .../org/lwjgl/opengles/OESDepth24.java | 16 + .../org/lwjgl/opengles/OESDepth32.java | 16 + .../org/lwjgl/opengles/OESDepthTexture.java | 23 + .../org/lwjgl/opengles/OESEGLImage.java | 23 + .../lwjgl/opengles/OESEGLImageExternal.java | 39 + .../lwjgl/opengles/OESElementIndexUint.java | 16 + .../lwjgl/opengles/OESFramebufferObject.java | 244 + .../lwjgl/opengles/OESGetProgramBinary.java | 40 + .../org/lwjgl/opengles/OESMapbuffer.java | 107 + .../lwjgl/opengles/OESPackedDepthStencil.java | 29 + .../org/lwjgl/opengles/OESRGB8RGBA8.java | 17 + .../opengles/OESStandardDerivatives.java | 17 + .../org/lwjgl/opengles/OESStencil1.java | 16 + .../org/lwjgl/opengles/OESStencil4.java | 16 + .../org/lwjgl/opengles/OESStencil8.java | 16 + .../lwjgl/opengles/OESSurfacelessContext.java | 16 + .../org/lwjgl/opengles/OESTexture3D.java | 95 + .../lwjgl/opengles/OESTextureHalfFloat.java | 17 + .../lwjgl/opengles/OESVertexArrayObject.java | 53 + .../lwjgl/opengles/OESVertexHalfFloat.java | 16 + .../lwjgl/opengles/OESVertexType1010102.java | 17 + .../lwjgl/opengles/QCOMBinningControl.java | 24 + .../org/lwjgl/opengles/QCOMDriverControl.java | 50 + .../org/lwjgl/opengles/QCOMExtendedGet.java | 95 + .../org/lwjgl/opengles/QCOMExtendedGet2.java | 40 + .../QCOMPerformanceMonitorGlobalMode.java | 18 + .../lwjgl/opengles/QCOMTiledRendering.java | 60 + .../opengles/QCOMWriteonlyRendering.java | 16 + .../org/lwjgl/opengles/VIVShaderBinary.java | 16 + .../src/java/org/lwjgl/BufferChecks.java | 286 + .../src/java/org/lwjgl/BufferUtils.java | 205 + .../org/lwjgl/DefaultSysImplementation.java | 57 + .../java/org/lwjgl/J2SESysImplementation.java | 73 + .../src/java/org/lwjgl/LWJGLException.java | 79 + .../src/java/org/lwjgl/LWJGLUtil.java | 614 ++ .../org/lwjgl/LinuxSysImplementation.java | 93 + .../org/lwjgl/MacOSXSysImplementation.java | 67 + .../src/java/org/lwjgl/MemoryUtil.java | 430 ++ .../src/java/org/lwjgl/MemoryUtilSun.java | 135 + .../src/java/org/lwjgl/PointerBuffer.java | 960 +++ .../src/java/org/lwjgl/PointerWrapper.java | 43 + .../org/lwjgl/PointerWrapperAbstract.java | 92 + etc/lwjgl-2.9.1/src/java/org/lwjgl/Sys.java | 267 + .../src/java/org/lwjgl/SysImplementation.java | 81 + .../org/lwjgl/WindowsSysImplementation.java | 123 + .../src/java/org/lwjgl/examples/Game.java | 194 + .../examples/spaceinvaders/AlienEntity.java | 157 + .../lwjgl/examples/spaceinvaders/Entity.java | 184 + .../lwjgl/examples/spaceinvaders/Game.java | 609 ++ .../examples/spaceinvaders/GameApplet.java | 104 + .../examples/spaceinvaders/ShipEntity.java | 98 + .../examples/spaceinvaders/ShotEntity.java | 120 + .../examples/spaceinvaders/SoundManager.java | 189 + .../lwjgl/examples/spaceinvaders/Sprite.java | 127 + .../lwjgl/examples/spaceinvaders/Texture.java | 188 + .../examples/spaceinvaders/TextureLoader.java | 291 + .../src/java/org/lwjgl/input/Controller.java | 290 + .../java/org/lwjgl/input/ControllerEvent.java | 222 + .../src/java/org/lwjgl/input/Controllers.java | 308 + .../src/java/org/lwjgl/input/Cursor.java | 365 + .../org/lwjgl/input/JInputController.java | 537 ++ .../src/java/org/lwjgl/input/Keyboard.java | 610 ++ .../src/java/org/lwjgl/input/Mouse.java | 712 ++ .../org/lwjgl/input/OpenGLPackageAccess.java | 80 + .../src/java/org/lwjgl/openal/AL.java | 243 + .../src/java/org/lwjgl/openal/ALC10.java | 439 ++ .../src/java/org/lwjgl/openal/ALC11.java | 201 + .../src/java/org/lwjgl/openal/ALCcontext.java | 115 + .../src/java/org/lwjgl/openal/ALCdevice.java | 122 + .../src/java/org/lwjgl/openal/EFXUtil.java | 228 + .../org/lwjgl/openal/OpenALException.java | 85 + .../src/java/org/lwjgl/openal/Util.java | 86 + .../src/java/org/lwjgl/opencl/APIUtil.java | 550 ++ .../lwjgl/opencl/APPLEContextLoggingUtil.java | 77 + .../src/java/org/lwjgl/opencl/CL.java | 158 + .../lwjgl/opencl/CLBuildProgramCallback.java | 43 + .../src/java/org/lwjgl/opencl/CLChecks.java | 268 + .../java/org/lwjgl/opencl/CLCommandQueue.java | 112 + .../opencl/CLCompileProgramCallback.java | 43 + .../src/java/org/lwjgl/opencl/CLContext.java | 322 + .../org/lwjgl/opencl/CLContextCallback.java | 78 + .../src/java/org/lwjgl/opencl/CLDevice.java | 206 + .../src/java/org/lwjgl/opencl/CLEvent.java | 131 + .../org/lwjgl/opencl/CLEventCallback.java | 77 + .../org/lwjgl/opencl/CLFunctionAddress.java | 47 + .../src/java/org/lwjgl/opencl/CLKernel.java | 262 + .../lwjgl/opencl/CLLinkProgramCallback.java | 43 + .../src/java/org/lwjgl/opencl/CLMem.java | 279 + .../opencl/CLMemObjectDestructorCallback.java | 54 + .../java/org/lwjgl/opencl/CLNativeKernel.java | 61 + .../src/java/org/lwjgl/opencl/CLObject.java | 51 + .../java/org/lwjgl/opencl/CLObjectChild.java | 58 + .../org/lwjgl/opencl/CLObjectRegistry.java | 54 + .../org/lwjgl/opencl/CLObjectRetainable.java | 70 + .../src/java/org/lwjgl/opencl/CLPlatform.java | 226 + .../org/lwjgl/opencl/CLPrintfCallback.java | 51 + .../src/java/org/lwjgl/opencl/CLProgram.java | 220 + .../org/lwjgl/opencl/CLProgramCallback.java | 74 + .../src/java/org/lwjgl/opencl/CLSampler.java | 85 + .../java/org/lwjgl/opencl/CallbackUtil.java | 172 + .../java/org/lwjgl/opencl/FastLongMap.java | 239 + .../src/java/org/lwjgl/opencl/InfoUtil.java | 51 + .../org/lwjgl/opencl/InfoUtilAbstract.java | 135 + .../org/lwjgl/opencl/InfoUtilFactory.java | 606 ++ .../org/lwjgl/opencl/OpenCLException.java | 54 + .../src/java/org/lwjgl/opencl/Util.java | 68 + .../org/lwjgl/opencl/api/CLBufferRegion.java | 62 + .../org/lwjgl/opencl/api/CLImageFormat.java | 60 + .../src/java/org/lwjgl/opencl/api/Filter.java | 51 + .../lwjgl/opengl/AMDDebugOutputCallback.java | 173 + .../src/java/org/lwjgl/opengl/APIUtil.java | 296 + .../lwjgl/opengl/ARBDebugOutputCallback.java | 201 + .../lwjgl/opengl/AWTCanvasImplementation.java | 59 + .../java/org/lwjgl/opengl/AWTGLCanvas.java | 414 ++ .../java/org/lwjgl/opengl/AWTSurfaceLock.java | 107 + .../src/java/org/lwjgl/opengl/AWTUtil.java | 185 + .../java/org/lwjgl/opengl/BaseReferences.java | 107 + .../java/org/lwjgl/opengl/CallbackUtil.java | 186 + .../src/java/org/lwjgl/opengl/Context.java | 50 + .../java/org/lwjgl/opengl/ContextAttribs.java | 350 + .../opengl/ContextAttribsImplementation.java | 56 + .../src/java/org/lwjgl/opengl/ContextGL.java | 295 + .../java/org/lwjgl/opengl/ContextGLES.java | 224 + .../lwjgl/opengl/ContextImplementation.java | 90 + .../src/java/org/lwjgl/opengl/Display.java | 1375 ++++ .../lwjgl/opengl/DisplayImplementation.java | 200 + .../java/org/lwjgl/opengl/DisplayMode.java | 142 + .../src/java/org/lwjgl/opengl/Drawable.java | 77 + .../src/java/org/lwjgl/opengl/DrawableGL.java | 155 + .../java/org/lwjgl/opengl/DrawableGLES.java | 243 + .../java/org/lwjgl/opengl/DrawableLWJGL.java | 71 + .../src/java/org/lwjgl/opengl/EventQueue.java | 83 + .../src/java/org/lwjgl/opengl/FastIntMap.java | 238 + .../src/java/org/lwjgl/opengl/GLChecks.java | 359 + .../src/java/org/lwjgl/opengl/GLContext.java | 415 ++ .../src/java/org/lwjgl/opengl/GLSync.java | 47 + .../java/org/lwjgl/opengl/GLUConstants.java | 60 + .../src/java/org/lwjgl/opengl/GlobalLock.java | 40 + .../org/lwjgl/opengl/InputImplementation.java | 134 + .../org/lwjgl/opengl/KHRDebugCallback.java | 209 + .../org/lwjgl/opengl/KeyboardEventQueue.java | 366 + .../opengl/LinuxAWTGLCanvasPeerInfo.java | 73 + .../opengl/LinuxCanvasImplementation.java | 123 + .../org/lwjgl/opengl/LinuxContextAttribs.java | 91 + .../opengl/LinuxContextImplementation.java | 185 + .../java/org/lwjgl/opengl/LinuxDisplay.java | 1653 +++++ .../lwjgl/opengl/LinuxDisplayPeerInfo.java | 102 + .../src/java/org/lwjgl/opengl/LinuxEvent.java | 208 + .../java/org/lwjgl/opengl/LinuxKeyboard.java | 353 + .../java/org/lwjgl/opengl/LinuxKeycodes.java | 763 ++ .../src/java/org/lwjgl/opengl/LinuxMouse.java | 318 + .../lwjgl/opengl/LinuxPbufferPeerInfo.java | 83 + .../java/org/lwjgl/opengl/LinuxPeerInfo.java | 57 + .../opengl/MacOSXAWTGLCanvasPeerInfo.java | 55 + .../opengl/MacOSXCanvasImplementation.java | 66 + .../lwjgl/opengl/MacOSXCanvasListener.java | 125 + .../lwjgl/opengl/MacOSXCanvasPeerInfo.java | 235 + .../opengl/MacOSXContextImplementation.java | 135 + .../java/org/lwjgl/opengl/MacOSXDisplay.java | 641 ++ .../lwjgl/opengl/MacOSXDisplayPeerInfo.java | 67 + .../java/org/lwjgl/opengl/MacOSXGLCanvas.java | 77 + .../lwjgl/opengl/MacOSXMouseEventQueue.java | 113 + .../lwjgl/opengl/MacOSXNativeKeyboard.java | 298 + .../org/lwjgl/opengl/MacOSXNativeMouse.java | 228 + .../lwjgl/opengl/MacOSXPbufferPeerInfo.java | 63 + .../java/org/lwjgl/opengl/MacOSXPeerInfo.java | 66 + .../org/lwjgl/opengl/MouseEventQueue.java | 270 + .../org/lwjgl/opengl/NVPresentVideoUtil.java | 122 + .../org/lwjgl/opengl/NVVideoCaptureUtil.java | 153 + .../org/lwjgl/opengl/OpenGLException.java | 89 + .../src/java/org/lwjgl/opengl/Pbuffer.java | 320 + .../src/java/org/lwjgl/opengl/PeerInfo.java | 97 + .../java/org/lwjgl/opengl/PixelFormat.java | 424 ++ .../org/lwjgl/opengl/PixelFormatLWJGL.java | 41 + .../org/lwjgl/opengl/ReferencesStack.java | 75 + .../java/org/lwjgl/opengl/RenderTexture.java | 251 + .../java/org/lwjgl/opengl/SharedDrawable.java | 57 + .../src/java/org/lwjgl/opengl/StateStack.java | 65 + .../java/org/lwjgl/opengl/StateTracker.java | 162 + .../src/java/org/lwjgl/opengl/Sync.java | 175 + .../src/java/org/lwjgl/opengl/Util.java | 90 + .../opengl/WindowsAWTGLCanvasPeerInfo.java | 71 + .../opengl/WindowsCanvasImplementation.java | 85 + .../lwjgl/opengl/WindowsContextAttribs.java | 92 + .../opengl/WindowsContextImplementation.java | 123 + .../java/org/lwjgl/opengl/WindowsDisplay.java | 1234 ++++ .../lwjgl/opengl/WindowsDisplayPeerInfo.java | 78 + .../org/lwjgl/opengl/WindowsFileVersion.java | 54 + .../org/lwjgl/opengl/WindowsKeyboard.java | 164 + .../org/lwjgl/opengl/WindowsKeycodes.java | 578 ++ .../java/org/lwjgl/opengl/WindowsMouse.java | 199 + .../lwjgl/opengl/WindowsPbufferPeerInfo.java | 83 + .../org/lwjgl/opengl/WindowsPeerInfo.java | 66 + .../org/lwjgl/opengl/WindowsRegistry.java | 69 + .../src/java/org/lwjgl/opengl/XRandR.java | 304 + .../src/java/org/lwjgl/opengles/APIUtil.java | 329 + .../java/org/lwjgl/opengles/CallbackUtil.java | 134 + .../org/lwjgl/opengles/ContextAttribs.java | 88 + .../src/java/org/lwjgl/opengles/EGL.java | 922 +++ .../java/org/lwjgl/opengles/EGLConfig.java | 120 + .../java/org/lwjgl/opengles/EGLContext.java | 114 + .../java/org/lwjgl/opengles/EGLDisplay.java | 216 + .../java/org/lwjgl/opengles/EGLImageOES.java | 43 + .../org/lwjgl/opengles/EGLKHRFenceSync.java | 174 + .../lwjgl/opengles/EGLKHRReusableSync.java | 156 + .../java/org/lwjgl/opengles/EGLNVSync.java | 215 + .../java/org/lwjgl/opengles/EGLSurface.java | 120 + .../java/org/lwjgl/opengles/EGLSyncKHR.java | 43 + .../java/org/lwjgl/opengles/EGLSyncNV.java | 43 + .../java/org/lwjgl/opengles/FastIntMap.java | 238 + .../src/java/org/lwjgl/opengles/GLChecks.java | 212 + .../java/org/lwjgl/opengles/GLContext.java | 312 + .../src/java/org/lwjgl/opengles/GLSync.java | 47 + .../org/lwjgl/opengles/KHRDebugCallback.java | 205 + .../src/java/org/lwjgl/opengles/PeerInfo.java | 97 + .../java/org/lwjgl/opengles/PixelFormat.java | 767 ++ .../PowerManagementEventException.java | 68 + .../java/org/lwjgl/opengles/StateTracker.java | 116 + .../src/java/org/lwjgl/opengles/Util.java | 139 + .../src/java/org/lwjgl/test/DisplayTest.java | 252 + .../src/java/org/lwjgl/test/NativeTest.java | 62 + .../src/java/org/lwjgl/test/SysTest.java | 180 + .../src/java/org/lwjgl/test/WaveDataTest.java | 135 + .../org/lwjgl/test/WindowCreationTest.java | 326 + .../lwjgl/test/applet/AppletLoaderTest.java | 72 + .../lwjgl/test/applet/ControllersTest.java | 52 + .../org/lwjgl/test/applet/GearsApplet.java | 405 ++ .../java/org/lwjgl/test/applet/OpenAL.java | 183 + .../java/org/lwjgl/test/applet/OpenGL.java | 129 + .../src/java/org/lwjgl/test/applet/Speed.java | 92 + .../src/java/org/lwjgl/test/applet/Test.java | 38 + .../test/glu/tessellation/TessCallback.java | 81 + .../glu/tessellation/TessellationTest.java | 196 + .../test/glu/tessellation/VertexData.java | 40 + .../org/lwjgl/test/input/HWCursorTest.java | 404 ++ .../org/lwjgl/test/input/KeyboardTest.java | 234 + .../lwjgl/test/input/MouseCreationTest.java | 218 + .../java/org/lwjgl/test/input/MouseTest.java | 430 ++ .../org/lwjgl/test/input/TestControllers.java | 186 + .../org/lwjgl/test/mapped/MappedFloat.java | 54 + .../lwjgl/test/mapped/MappedObjectBench.java | 237 + .../lwjgl/test/mapped/MappedObjectTests1.java | 180 + .../lwjgl/test/mapped/MappedObjectTests2.java | 98 + .../lwjgl/test/mapped/MappedObjectTests3.java | 145 + .../lwjgl/test/mapped/MappedObjectTests4.java | 253 + .../test/mapped/MappedObjectWithLibrary.java | 17 + .../lwjgl/test/mapped/MappedSomething.java | 56 + .../org/lwjgl/test/mapped/MappedVec2.java | 48 + .../org/lwjgl/test/mapped/MappedVec3.java | 50 + .../lwjgl/test/mapped/TestMappedObject.java | 87 + .../org/lwjgl/test/openal/ALCCaptureTest.java | 154 + .../java/org/lwjgl/test/openal/ALCTest.java | 110 + .../java/org/lwjgl/test/openal/BasicTest.java | 140 + .../java/org/lwjgl/test/openal/EFX10Test.java | 464 ++ .../lwjgl/test/openal/MovingSoundTest.java | 218 + .../lwjgl/test/openal/OpenALCreationTest.java | 225 + .../org/lwjgl/test/openal/OpenALInfo.java | 238 + .../java/org/lwjgl/test/openal/PlayTest.java | 221 + .../org/lwjgl/test/openal/PlayTestMemory.java | 234 + .../org/lwjgl/test/openal/PositionTest.java | 553 ++ .../lwjgl/test/openal/SourceLimitTest.java | 165 + .../org/lwjgl/test/openal/StressTest.java | 223 + .../org/lwjgl/test/opencl/HelloOpenCL.java | 229 + .../org/lwjgl/test/opencl/gl/DemoFractal.java | 896 +++ .../org/lwjgl/test/opencl/gl/Mandelbrot.cl | 83 + .../test/opengl/FullScreenWindowedTest.java | 283 + .../src/java/org/lwjgl/test/opengl/Gears.java | 343 + .../org/lwjgl/test/opengl/PbufferTest.java | 398 ++ .../java/org/lwjgl/test/opengl/SyncTest.java | 180 + .../org/lwjgl/test/opengl/VBOIndexTest.java | 244 + .../java/org/lwjgl/test/opengl/VBOTest.java | 210 + .../org/lwjgl/test/opengl/VersionTest.java | 261 + .../org/lwjgl/test/opengl/awt/AWTGears.java | 74 + .../lwjgl/test/opengl/awt/AWTGearsCanvas.java | 326 + .../org/lwjgl/test/opengl/awt/AWTTest.java | 140 + .../org/lwjgl/test/opengl/awt/DemoBox.java | 639 ++ .../test/opengl/awt/DisplayParentTest.java | 133 + .../multithread/BackgroundLoadTest.java | 297 + .../opengl/multithread/BackgroundLoader.java | 226 + .../test/opengl/pbuffers/PbufferTest.java | 436 ++ .../test/opengl/pbuffers/TextureRenderer.java | 101 + .../test/opengl/pbuffers/UniqueRenderer.java | 73 + .../opengl/pbuffers/UniqueRendererRTT.java | 83 + .../org/lwjgl/test/opengl/shaders/Shader.java | 148 + .../lwjgl/test/opengl/shaders/ShaderFP.java | 108 + .../lwjgl/test/opengl/shaders/ShaderFSH.java | 127 + .../lwjgl/test/opengl/shaders/ShaderUNI.java | 169 + .../lwjgl/test/opengl/shaders/ShaderVP.java | 79 + .../lwjgl/test/opengl/shaders/ShaderVSH.java | 98 + .../test/opengl/shaders/ShadersTest.java | 346 + .../org/lwjgl/test/opengl/shaders/shaderFP.fp | 40 + .../org/lwjgl/test/opengl/shaders/shaderFP.vp | 37 + .../lwjgl/test/opengl/shaders/shaderFSH.fsh | 21 + .../lwjgl/test/opengl/shaders/shaderFSH.vsh | 13 + .../lwjgl/test/opengl/shaders/shaderUNI.vsh | 28 + .../org/lwjgl/test/opengl/shaders/shaderVP.vp | 59 + .../lwjgl/test/opengl/shaders/shaderVSH.vsh | 22 + .../test/opengl/sprites/SpriteShootout.java | 752 ++ .../test/opengl/sprites/SpriteShootout2P.java | 625 ++ .../test/opengl/sprites/SpriteShootoutCL.java | 598 ++ .../opengl/sprites/SpriteShootoutMapped.java | 839 +++ .../lwjgl/test/opengl/sprites/StreamVBO.java | 144 + .../test/opengles/FullScreenWindowedTest.java | 330 + .../java/org/lwjgl/test/opengles/Gears.java | 580 ++ .../test/opengles/MappedIndexedVBOTest.java | 252 + .../org/lwjgl/test/opengles/QuadRenderer.java | 70 + .../test/opengles/util/BufferObject.java | 99 + .../test/opengles/util/BufferObjectArray.java | 41 + .../opengles/util/BufferObjectElement.java | 41 + .../org/lwjgl/test/opengles/util/GLLight.java | 165 + .../lwjgl/test/opengles/util/GLMatrix.java | 163 + .../lwjgl/test/opengles/util/GLObject.java | 9 + .../lwjgl/test/opengles/util/Geometry.java | 78 + .../opengles/util/ImmediateModeBuffer.java | 58 + .../org/lwjgl/test/opengles/util/Shader.java | 98 + .../test/opengles/util/ShaderProgram.java | 82 + .../org/lwjgl/test/opengles/util/Sphere.java | 414 ++ .../src/java/org/lwjgl/util/Color.java | 494 ++ .../src/java/org/lwjgl/util/Dimension.java | 156 + .../src/java/org/lwjgl/util/Display.java | 243 + .../src/java/org/lwjgl/util/Point.java | 170 + .../java/org/lwjgl/util/ReadableColor.java | 146 + .../org/lwjgl/util/ReadableDimension.java | 60 + .../java/org/lwjgl/util/ReadablePoint.java | 57 + .../org/lwjgl/util/ReadableRectangle.java | 48 + .../src/java/org/lwjgl/util/Rectangle.java | 581 ++ .../src/java/org/lwjgl/util/Renderable.java | 49 + .../src/java/org/lwjgl/util/Timer.java | 156 + .../src/java/org/lwjgl/util/WaveData.java | 257 + .../java/org/lwjgl/util/WritableColor.java | 126 + .../org/lwjgl/util/WritableDimension.java | 54 + .../java/org/lwjgl/util/WritablePoint.java | 45 + .../org/lwjgl/util/WritableRectangle.java | 63 + .../src/java/org/lwjgl/util/XPMFile.java | 302 + .../org/lwjgl/util/applet/AppletLoader.java | 2259 ++++++ .../java/org/lwjgl/util/generator/Alias.java | 54 + .../org/lwjgl/util/generator/Alternate.java | 57 + .../java/org/lwjgl/util/generator/Auto.java | 48 + .../org/lwjgl/util/generator/AutoSize.java | 55 + .../org/lwjgl/util/generator/AutoType.java | 51 + .../org/lwjgl/util/generator/BufferKind.java | 47 + .../lwjgl/util/generator/BufferObject.java | 50 + .../lwjgl/util/generator/CachedReference.java | 54 + .../lwjgl/util/generator/CachedResult.java | 47 + .../java/org/lwjgl/util/generator/Check.java | 48 + .../java/org/lwjgl/util/generator/Code.java | 59 + .../java/org/lwjgl/util/generator/Const.java | 46 + .../org/lwjgl/util/generator/Constant.java | 51 + .../org/lwjgl/util/generator/Dependent.java | 47 + .../lwjgl/util/generator/DeprecatedGL.java | 46 + .../org/lwjgl/util/generator/Extension.java | 49 + .../java/org/lwjgl/util/generator/Extern.java | 46 + .../lwjgl/util/generator/FieldsGenerator.java | 124 + .../org/lwjgl/util/generator/ForceInit.java | 45 + .../lwjgl/util/generator/GenerateAutos.java | 48 + .../generator/GeneratorProcessorFactory.java | 176 + .../util/generator/GeneratorVisitor.java | 346 + .../java/org/lwjgl/util/generator/Helper.java | 46 + .../org/lwjgl/util/generator/Imports.java | 46 + .../org/lwjgl/util/generator/Indirect.java | 49 + .../util/generator/JNITypeTranslator.java | 151 + .../util/generator/JavaMethodsGenerator.java | 738 ++ .../util/generator/JavaTypeTranslator.java | 160 + .../java/org/lwjgl/util/generator/Mode.java | 39 + .../generator/NativeMethodStubsGenerator.java | 412 ++ .../org/lwjgl/util/generator/NativeType.java | 50 + .../util/generator/NativeTypeTranslator.java | 253 + .../lwjgl/util/generator/NoErrorCheck.java | 49 + .../lwjgl/util/generator/NullTerminated.java | 50 + .../org/lwjgl/util/generator/Optional.java | 47 + .../lwjgl/util/generator/OutParameter.java | 48 + .../org/lwjgl/util/generator/Platform.java | 93 + .../util/generator/PlatformDependent.java | 51 + .../lwjgl/util/generator/PointerArray.java | 48 + .../org/lwjgl/util/generator/PointerType.java | 41 + .../lwjgl/util/generator/PointerWrapper.java | 46 + .../util/generator/PostfixTranslator.java | 183 + .../org/lwjgl/util/generator/Private.java | 46 + .../generator/RegisterStubsGenerator.java | 134 + .../java/org/lwjgl/util/generator/Result.java | 49 + .../java/org/lwjgl/util/generator/Reuse.java | 49 + .../util/generator/SignatureTranslator.java | 164 + .../org/lwjgl/util/generator/Signedness.java | 46 + .../lwjgl/util/generator/StripPostfix.java | 53 + .../org/lwjgl/util/generator/TypeInfo.java | 239 + .../org/lwjgl/util/generator/TypeMap.java | 70 + .../util/generator/TypedefsGenerator.java | 98 + .../java/org/lwjgl/util/generator/Utils.java | 458 ++ .../util/generator/openal/ALTypeMap.java | 246 + .../util/generator/openal/ALboolean.java | 49 + .../lwjgl/util/generator/openal/ALbyte.java | 49 + .../lwjgl/util/generator/openal/ALdouble.java | 49 + .../lwjgl/util/generator/openal/ALenum.java | 49 + .../lwjgl/util/generator/openal/ALfloat.java | 49 + .../lwjgl/util/generator/openal/ALint.java | 49 + .../lwjgl/util/generator/openal/ALshort.java | 49 + .../lwjgl/util/generator/openal/ALsizei.java | 49 + .../lwjgl/util/generator/openal/ALubyte.java | 49 + .../lwjgl/util/generator/openal/ALuint.java | 49 + .../lwjgl/util/generator/openal/ALvoid.java | 49 + .../opencl/CLCapabilitiesGenerator.java | 159 + .../generator/opencl/CLDeviceExtension.java | 41 + .../opencl/CLGeneratorProcessorFactory.java | 181 + .../opencl/CLPDCapabilitiesGenerator.java | 148 + .../generator/opencl/CLPlatformExtension.java | 41 + .../util/generator/opencl/CLTypeMap.java | 270 + .../util/generator/opencl/cl_bitfield.java | 43 + .../lwjgl/util/generator/opencl/cl_bool.java | 43 + .../lwjgl/util/generator/opencl/cl_byte.java | 43 + .../lwjgl/util/generator/opencl/cl_char.java | 43 + .../util/generator/opencl/cl_double.java | 43 + .../lwjgl/util/generator/opencl/cl_float.java | 43 + .../lwjgl/util/generator/opencl/cl_int.java | 42 + .../lwjgl/util/generator/opencl/cl_long.java | 43 + .../lwjgl/util/generator/opencl/cl_short.java | 43 + .../lwjgl/util/generator/opencl/cl_uchar.java | 43 + .../lwjgl/util/generator/opencl/cl_uint.java | 42 + .../lwjgl/util/generator/opencl/cl_void.java | 45 + .../lwjgl/util/generator/opencl/size_t.java | 43 + .../util/generator/opengl/EGLint64NV.java | 12 + .../util/generator/opengl/EGLuint64NV.java | 12 + .../opengl/GLCapabilitiesGenerator.java | 329 + .../opengl/GLESCapabilitiesGenerator.java | 308 + .../opengl/GLESGeneratorProcessorFactory.java | 184 + .../util/generator/opengl/GLESTypeMap.java | 301 + .../opengl/GLGeneratorProcessorFactory.java | 189 + ...GLReferencesGeneratorProcessorFactory.java | 218 + .../util/generator/opengl/GLTypeMap.java | 331 + .../util/generator/opengl/GLbitfield.java | 49 + .../util/generator/opengl/GLboolean.java | 49 + .../lwjgl/util/generator/opengl/GLbyte.java | 49 + .../lwjgl/util/generator/opengl/GLchar.java | 49 + .../util/generator/opengl/GLcharARB.java | 49 + .../lwjgl/util/generator/opengl/GLclampd.java | 49 + .../lwjgl/util/generator/opengl/GLclampf.java | 49 + .../lwjgl/util/generator/opengl/GLdouble.java | 49 + .../lwjgl/util/generator/opengl/GLenum.java | 49 + .../lwjgl/util/generator/opengl/GLfloat.java | 49 + .../lwjgl/util/generator/opengl/GLhalf.java | 49 + .../util/generator/opengl/GLhandleARB.java | 49 + .../lwjgl/util/generator/opengl/GLint.java | 49 + .../lwjgl/util/generator/opengl/GLint64.java | 42 + .../util/generator/opengl/GLint64EXT.java | 42 + .../lwjgl/util/generator/opengl/GLintptr.java | 51 + .../util/generator/opengl/GLintptrARB.java | 51 + .../lwjgl/util/generator/opengl/GLreturn.java | 57 + .../lwjgl/util/generator/opengl/GLshort.java | 49 + .../lwjgl/util/generator/opengl/GLsizei.java | 49 + .../util/generator/opengl/GLsizeiptr.java | 51 + .../util/generator/opengl/GLsizeiptrARB.java | 51 + .../lwjgl/util/generator/opengl/GLtime.java | 49 + .../lwjgl/util/generator/opengl/GLubyte.java | 49 + .../lwjgl/util/generator/opengl/GLuint.java | 49 + .../lwjgl/util/generator/opengl/GLuint64.java | 42 + .../util/generator/opengl/GLuint64EXT.java | 42 + .../lwjgl/util/generator/opengl/GLushort.java | 49 + .../lwjgl/util/generator/opengl/GLvoid.java | 52 + .../src/java/org/lwjgl/util/glu/Cylinder.java | 201 + .../src/java/org/lwjgl/util/glu/Disk.java | 214 + .../src/java/org/lwjgl/util/glu/GLU.java | 430 ++ .../org/lwjgl/util/glu/GLUtessellator.java | 72 + .../util/glu/GLUtessellatorCallback.java | 388 + .../glu/GLUtessellatorCallbackAdapter.java | 116 + .../src/java/org/lwjgl/util/glu/MipMap.java | 353 + .../java/org/lwjgl/util/glu/PartialDisk.java | 358 + .../org/lwjgl/util/glu/PixelStoreState.java | 84 + .../src/java/org/lwjgl/util/glu/Project.java | 412 ++ .../src/java/org/lwjgl/util/glu/Quadric.java | 199 + .../src/java/org/lwjgl/util/glu/Registry.java | 80 + .../src/java/org/lwjgl/util/glu/Sphere.java | 229 + .../src/java/org/lwjgl/util/glu/Util.java | 247 + .../util/glu/tessellation/ActiveRegion.java | 100 + .../util/glu/tessellation/CachedVertex.java | 90 + .../org/lwjgl/util/glu/tessellation/Dict.java | 172 + .../lwjgl/util/glu/tessellation/DictNode.java | 91 + .../lwjgl/util/glu/tessellation/GLUface.java | 97 + .../util/glu/tessellation/GLUhalfEdge.java | 105 + .../lwjgl/util/glu/tessellation/GLUmesh.java | 94 + .../glu/tessellation/GLUtessellatorImpl.java | 669 ++ .../util/glu/tessellation/GLUvertex.java | 97 + .../org/lwjgl/util/glu/tessellation/Geom.java | 350 + .../org/lwjgl/util/glu/tessellation/Mesh.java | 766 ++ .../lwjgl/util/glu/tessellation/Normal.java | 319 + .../util/glu/tessellation/PriorityQ.java | 132 + .../util/glu/tessellation/PriorityQHeap.java | 296 + .../util/glu/tessellation/PriorityQSort.java | 312 + .../lwjgl/util/glu/tessellation/Render.java | 589 ++ .../lwjgl/util/glu/tessellation/Sweep.java | 1384 ++++ .../lwjgl/util/glu/tessellation/TessMono.java | 241 + .../util/glu/tessellation/TessState.java | 91 + .../lwjgl/util/input/ControllerAdapter.java | 340 + .../java/org/lwjgl/util/jinput/KeyMap.java | 293 + .../util/jinput/LWJGLEnvironmentPlugin.java | 55 + .../org/lwjgl/util/jinput/LWJGLKeyboard.java | 130 + .../org/lwjgl/util/jinput/LWJGLMouse.java | 191 + .../org/lwjgl/util/mapped/CacheLinePad.java | 66 + .../org/lwjgl/util/mapped/CacheLineSize.java | 141 + .../java/org/lwjgl/util/mapped/CacheUtil.java | 193 + .../org/lwjgl/util/mapped/MappedField.java | 65 + .../org/lwjgl/util/mapped/MappedForeach.java | 71 + .../org/lwjgl/util/mapped/MappedHelper.java | 392 ++ .../org/lwjgl/util/mapped/MappedObject.java | 287 + .../util/mapped/MappedObjectClassLoader.java | 193 + .../util/mapped/MappedObjectTransformer.java | 1319 ++++ .../lwjgl/util/mapped/MappedObjectUnsafe.java | 110 + .../java/org/lwjgl/util/mapped/MappedSet.java | 69 + .../org/lwjgl/util/mapped/MappedSet2.java | 56 + .../org/lwjgl/util/mapped/MappedSet3.java | 59 + .../org/lwjgl/util/mapped/MappedSet4.java | 61 + .../org/lwjgl/util/mapped/MappedType.java | 102 + .../java/org/lwjgl/util/mapped/Pointer.java | 50 + .../java/org/lwjgl/util/vector/Matrix.java | 134 + .../java/org/lwjgl/util/vector/Matrix2f.java | 400 ++ .../java/org/lwjgl/util/vector/Matrix3f.java | 510 ++ .../java/org/lwjgl/util/vector/Matrix4f.java | 849 +++ .../org/lwjgl/util/vector/Quaternion.java | 530 ++ .../org/lwjgl/util/vector/ReadableVector.java | 54 + .../lwjgl/util/vector/ReadableVector2f.java | 46 + .../lwjgl/util/vector/ReadableVector3f.java | 42 + .../lwjgl/util/vector/ReadableVector4f.java | 44 + .../java/org/lwjgl/util/vector/Vector.java | 112 + .../java/org/lwjgl/util/vector/Vector2f.java | 303 + .../java/org/lwjgl/util/vector/Vector3f.java | 360 + .../java/org/lwjgl/util/vector/Vector4f.java | 351 + .../lwjgl/util/vector/WritableVector2f.java | 61 + .../lwjgl/util/vector/WritableVector3f.java | 56 + .../lwjgl/util/vector/WritableVector4f.java | 57 + etc/lwjgl-2.9.1/src/lwjgl-git.iml | 25 + etc/lwjgl-2.9.1/src/native/common/CL/cl.h | 998 +++ .../src/native/common/CL/cl_d3d10.h | 126 + etc/lwjgl-2.9.1/src/native/common/CL/cl_ext.h | 213 + etc/lwjgl-2.9.1/src/native/common/CL/cl_gl.h | 155 + .../src/native/common/CL/cl_gl_ext.h | 69 + .../src/native/common/CL/cl_platform.h | 1198 ++++ etc/lwjgl-2.9.1/src/native/common/EGL/egl.h | 329 + .../src/native/common/EGL/eglext.h | 230 + .../src/native/common/EGL/eglplatform.h | 110 + etc/lwjgl-2.9.1/src/native/common/GLES2/gl2.h | 621 ++ .../src/native/common/GLES2/gl2ext.h | 803 +++ .../src/native/common/GLES2/gl2extimg.h | 51 + .../src/native/common/GLES2/gl2platform.h | 30 + .../src/native/common/KHR/khrplatform.h | 269 + .../src/native/common/OpenCL/cl_platform.h | 296 + etc/lwjgl-2.9.1/src/native/common/awt_tools.h | 53 + .../src/native/common/common_tools.c | 398 ++ .../src/native/common/common_tools.h | 159 + etc/lwjgl-2.9.1/src/native/common/extal.c | 78 + etc/lwjgl-2.9.1/src/native/common/extal.h | 172 + etc/lwjgl-2.9.1/src/native/common/extcl.c | 67 + etc/lwjgl-2.9.1/src/native/common/extcl.h | 85 + .../src/native/common/extcl_types.h | 95 + etc/lwjgl-2.9.1/src/native/common/opencl.h | 56 + .../src/native/common/opengl/extgl.c | 83 + .../src/native/common/opengl/extgl.h | 124 + .../src/native/common/opengl/extgl_types.h | 55 + .../opengl/org_lwjgl_opengl_CallbackUtil.c | 143 + .../opengl/org_lwjgl_opengl_CallbackUtil.h | 53 + .../opengl/org_lwjgl_opengl_GLContext.c | 52 + .../opengl/org_lwjgl_opengl_GLContext.h | 45 + ..._opengl_GLContext_CapabilitiesCacheEntry.h | 13 + .../org_lwjgl_opengl_NVPresentVideoUtil.c | 70 + .../org_lwjgl_opengl_NVPresentVideoUtil.h | 37 + .../org_lwjgl_opengl_NVVideoCaptureUtil.c | 82 + .../org_lwjgl_opengl_NVVideoCaptureUtil.h | 53 + .../common/opengl/org_lwjgl_opengl_Pbuffer.h | 47 + .../src/native/common/opengles/extgl.c | 83 + .../src/native/common/opengles/extgl.h | 92 + .../src/native/common/opengles/extgl_egl.c | 106 + .../src/native/common/opengles/extgl_egl.h | 80 + .../src/native/common/opengles/extgl_types.h | 73 + .../org_lwjgl_opengles_CallbackUtil.c | 82 + .../org_lwjgl_opengles_CallbackUtil.h | 37 + .../common/opengles/org_lwjgl_opengles_EGL.c | 211 + .../common/opengles/org_lwjgl_opengles_EGL.h | 469 ++ .../org_lwjgl_opengles_EGLKHRFenceSync.c | 81 + .../org_lwjgl_opengles_EGLKHRFenceSync.h | 77 + .../org_lwjgl_opengles_EGLKHRReusableSync.c | 52 + .../org_lwjgl_opengles_EGLKHRReusableSync.h | 49 + .../opengles/org_lwjgl_opengles_EGLNVSync.c | 94 + .../opengles/org_lwjgl_opengles_EGLNVSync.h | 95 + .../opengles/org_lwjgl_opengles_GLContext.c | 48 + .../opengles/org_lwjgl_opengles_GLContext.h | 37 + ...pengles_GLContext_CapabilitiesCacheEntry.h | 13 + .../src/native/common/org_lwjgl_BufferUtils.c | 10 + .../src/native/common/org_lwjgl_BufferUtils.h | 29 + .../org_lwjgl_DefaultSysImplementation.h | 37 + .../native/common/org_lwjgl_input_Cursor.h | 19 + .../org_lwjgl_input_Cursor_CursorElement.h | 13 + .../native/common/org_lwjgl_input_Keyboard.h | 287 + .../org_lwjgl_input_Keyboard_KeyEvent.h | 13 + .../src/native/common/org_lwjgl_input_Mouse.h | 17 + .../src/native/common/org_lwjgl_openal_AL.c | 47 + .../src/native/common/org_lwjgl_openal_AL.h | 45 + .../native/common/org_lwjgl_openal_ALC10.c | 287 + .../native/common/org_lwjgl_openal_ALC11.c | 125 + .../src/native/common/org_lwjgl_opencl_CL.c | 55 + .../src/native/common/org_lwjgl_opencl_CL.h | 61 + .../common/org_lwjgl_opencl_CallbackUtil.c | 256 + .../common/org_lwjgl_opencl_CallbackUtil.h | 101 + .../common/org_lwjgl_opengl_AWTSurfaceLock.c | 111 + .../common/org_lwjgl_opengl_AWTSurfaceLock.h | 39 + .../generated/openal/org_lwjgl_openal_AL10.c | 444 ++ .../generated/openal/org_lwjgl_openal_AL11.c | 128 + .../generated/openal/org_lwjgl_openal_EFX10.c | 313 + ...wjgl_opencl_APPLEContextLoggingFunctions.c | 33 + .../opencl/org_lwjgl_opencl_APPLEGLSharing.c | 16 + ...lwjgl_opencl_APPLESetMemObjectDestructor.c | 13 + .../generated/opencl/org_lwjgl_opencl_CL10.c | 732 ++ .../opencl/org_lwjgl_opencl_CL10GL.c | 76 + .../generated/opencl/org_lwjgl_opencl_CL11.c | 82 + .../generated/opencl/org_lwjgl_opencl_CL12.c | 194 + .../opencl/org_lwjgl_opencl_CL12GL.c | 14 + .../org_lwjgl_opencl_EXTDeviceFission.c | 30 + .../org_lwjgl_opencl_EXTMigrateMemobject.c | 16 + .../opencl/org_lwjgl_opencl_KHRGLEvent.c | 14 + .../opencl/org_lwjgl_opencl_KHRGLSharing.c | 16 + .../opencl/org_lwjgl_opencl_KHRICD.c | 15 + .../opencl/org_lwjgl_opencl_KHRSubgroups.c | 16 + .../org_lwjgl_opencl_KHRTerminateContext.c | 13 + .../opengl/org_lwjgl_opengl_AMDDebugOutput.c | 38 + .../org_lwjgl_opengl_AMDDrawBuffersBlend.c | 30 + .../org_lwjgl_opengl_AMDInterleavedElements.c | 12 + .../org_lwjgl_opengl_AMDMultiDrawIndirect.c | 32 + .../org_lwjgl_opengl_AMDNameGenDelete.c | 27 + .../org_lwjgl_opengl_AMDPerformanceMonitor.c | 87 + .../org_lwjgl_opengl_AMDSamplePositions.c | 13 + .../org_lwjgl_opengl_AMDSparseTexture.c | 18 + ...lwjgl_opengl_AMDStencilOperationExtended.c | 12 + ..._lwjgl_opengl_AMDVertexShaderTessellator.c | 18 + .../org_lwjgl_opengl_APPLEElementArray.c | 41 + .../opengl/org_lwjgl_opengl_APPLEFence.c | 59 + .../org_lwjgl_opengl_APPLEFlushBufferRange.c | 18 + .../org_lwjgl_opengl_APPLEObjectPurgeable.c | 27 + .../org_lwjgl_opengl_APPLETextureRange.c | 21 + .../org_lwjgl_opengl_APPLEVertexArrayObject.c | 33 + .../org_lwjgl_opengl_APPLEVertexArrayRange.c | 26 + ...wjgl_opengl_APPLEVertexProgramEvaluators.c | 53 + .../org_lwjgl_opengl_ARBBindlessTexture.c | 111 + .../opengl/org_lwjgl_opengl_ARBBufferObject.c | 83 + .../org_lwjgl_opengl_ARBBufferStorage.c | 13 + .../opengl/org_lwjgl_opengl_ARBCLEvent.c | 13 + .../org_lwjgl_opengl_ARBClearBufferObject.c | 20 + .../org_lwjgl_opengl_ARBColorBufferFloat.c | 12 + ...lwjgl_opengl_ARBComputeVariableGroupSize.c | 12 + .../opengl/org_lwjgl_opengl_ARBDebugOutput.c | 39 + .../opengl/org_lwjgl_opengl_ARBDrawBuffers.c | 13 + .../org_lwjgl_opengl_ARBDrawBuffersBlend.c | 30 + .../org_lwjgl_opengl_ARBDrawInstanced.c | 25 + ...lwjgl_opengl_ARBFramebufferNoAttachments.c | 19 + .../org_lwjgl_opengl_ARBGeometryShader4.c | 30 + .../org_lwjgl_opengl_ARBGpuShaderFp64.c | 121 + .../opengl/org_lwjgl_opengl_ARBImaging.c | 280 + .../org_lwjgl_opengl_ARBIndirectParameters.c | 32 + .../org_lwjgl_opengl_ARBInstancedArrays.c | 12 + .../org_lwjgl_opengl_ARBMatrixPalette.c | 46 + .../opengl/org_lwjgl_opengl_ARBMultisample.c | 12 + .../opengl/org_lwjgl_opengl_ARBMultitexture.c | 114 + .../org_lwjgl_opengl_ARBOcclusionQuery.c | 60 + .../org_lwjgl_opengl_ARBPointParameters.c | 19 + .../opengl/org_lwjgl_opengl_ARBProgram.c | 134 + .../opengl/org_lwjgl_opengl_ARBRobustness.c | 192 + .../org_lwjgl_opengl_ARBSampleShading.c | 12 + .../org_lwjgl_opengl_ARBShaderObjects.c | 288 + ...g_lwjgl_opengl_ARBShadingLanguageInclude.c | 81 + .../org_lwjgl_opengl_ARBSparseTexture.c | 18 + .../org_lwjgl_opengl_ARBTextureBufferObject.c | 12 + .../org_lwjgl_opengl_ARBTextureBufferRange.c | 12 + .../org_lwjgl_opengl_ARBTextureCompression.c | 97 + .../org_lwjgl_opengl_ARBTextureStorage.c | 24 + ...wjgl_opengl_ARBTextureStorageMultisample.c | 18 + .../org_lwjgl_opengl_ARBTransposeMatrix.c | 20 + .../org_lwjgl_opengl_ARBVertexAttrib64bit.c | 12 + .../opengl/org_lwjgl_opengl_ARBVertexBlend.c | 81 + .../opengl/org_lwjgl_opengl_ARBVertexShader.c | 163 + .../opengl/org_lwjgl_opengl_ARBWindowPos.c | 54 + .../opengl/org_lwjgl_opengl_ATIDrawBuffers.c | 13 + .../opengl/org_lwjgl_opengl_ATIElementArray.c | 25 + .../org_lwjgl_opengl_ATIEnvmapBumpmap.c | 34 + .../org_lwjgl_opengl_ATIFragmentShader.c | 92 + .../org_lwjgl_opengl_ATIMapObjectBuffer.c | 19 + .../opengl/org_lwjgl_opengl_ATIPnTriangles.c | 18 + .../org_lwjgl_opengl_ATISeparateStencil.c | 18 + .../org_lwjgl_opengl_ATIVertexArrayObject.c | 88 + ..._lwjgl_opengl_ATIVertexAttribArrayObject.c | 26 + .../org_lwjgl_opengl_ATIVertexStreams.c | 126 + .../org_lwjgl_opengl_EXTBindableUniform.c | 26 + .../opengl/org_lwjgl_opengl_EXTBlendColor.c | 12 + ...rg_lwjgl_opengl_EXTBlendEquationSeparate.c | 12 + .../org_lwjgl_opengl_EXTBlendFuncSeparate.c | 12 + .../opengl/org_lwjgl_opengl_EXTBlendMinmax.c | 12 + .../org_lwjgl_opengl_EXTCompiledVertexArray.c | 18 + .../org_lwjgl_opengl_EXTDepthBoundsTest.c | 12 + .../org_lwjgl_opengl_EXTDirectStateAccess.c | 1588 +++++ .../opengl/org_lwjgl_opengl_EXTDrawBuffers2.c | 45 + .../org_lwjgl_opengl_EXTDrawInstanced.c | 25 + .../org_lwjgl_opengl_EXTDrawRangeElements.c | 19 + .../opengl/org_lwjgl_opengl_EXTFogCoord.c | 31 + .../org_lwjgl_opengl_EXTFramebufferBlit.c | 12 + ...g_lwjgl_opengl_EXTFramebufferMultisample.c | 12 + .../org_lwjgl_opengl_EXTFramebufferObject.c | 117 + .../org_lwjgl_opengl_EXTGeometryShader4.c | 30 + ...org_lwjgl_opengl_EXTGpuProgramParameters.c | 20 + .../opengl/org_lwjgl_opengl_EXTGpuShader4.c | 239 + .../org_lwjgl_opengl_EXTMultiDrawArrays.c | 14 + .../org_lwjgl_opengl_EXTPalettedTexture.c | 41 + .../org_lwjgl_opengl_EXTPointParameters.c | 19 + .../org_lwjgl_opengl_EXTProvokingVertex.c | 12 + .../org_lwjgl_opengl_EXTSecondaryColor.c | 43 + ...rg_lwjgl_opengl_EXTSeparateShaderObjects.c | 26 + ...org_lwjgl_opengl_EXTShaderImageLoadStore.c | 18 + .../org_lwjgl_opengl_EXTStencilClearTag.c | 12 + .../org_lwjgl_opengl_EXTStencilTwoSide.c | 12 + .../org_lwjgl_opengl_EXTTextureBufferObject.c | 12 + .../org_lwjgl_opengl_EXTTextureInteger.c | 46 + .../opengl/org_lwjgl_opengl_EXTTimerQuery.c | 20 + .../org_lwjgl_opengl_EXTTransformFeedback.c | 63 + .../org_lwjgl_opengl_EXTVertexAttrib64bit.c | 78 + .../opengl/org_lwjgl_opengl_EXTVertexShader.c | 294 + .../org_lwjgl_opengl_EXTVertexWeighting.c | 25 + .../generated/opengl/org_lwjgl_opengl_GL11.c | 1605 +++++ .../generated/opengl/org_lwjgl_opengl_GL12.c | 51 + .../generated/opengl/org_lwjgl_opengl_GL13.c | 191 + .../generated/opengl/org_lwjgl_opengl_GL14.c | 156 + .../generated/opengl/org_lwjgl_opengl_GL15.c | 137 + .../generated/opengl/org_lwjgl_opengl_GL20.c | 503 ++ .../generated/opengl/org_lwjgl_opengl_GL21.c | 48 + .../generated/opengl/org_lwjgl_opengl_GL30.c | 578 ++ .../generated/opengl/org_lwjgl_opengl_GL31.c | 106 + .../generated/opengl/org_lwjgl_opengl_GL32.c | 144 + .../generated/opengl/org_lwjgl_opengl_GL33.c | 389 + .../generated/opengl/org_lwjgl_opengl_GL40.c | 327 + .../generated/opengl/org_lwjgl_opengl_GL41.c | 637 ++ .../generated/opengl/org_lwjgl_opengl_GL42.c | 94 + .../generated/opengl/org_lwjgl_opengl_GL43.c | 312 + .../generated/opengl/org_lwjgl_opengl_GL44.c | 73 + .../org_lwjgl_opengl_GREMEDYFrameTerminator.c | 12 + .../org_lwjgl_opengl_GREMEDYStringMarker.c | 13 + .../opengl/org_lwjgl_opengl_INTELMapTexture.c | 27 + ...lwjgl_opengl_NVBindlessMultiDrawIndirect.c | 32 + .../org_lwjgl_opengl_NVBindlessTexture.c | 91 + ...org_lwjgl_opengl_NVBlendEquationAdvanced.c | 18 + .../org_lwjgl_opengl_NVConditionalRender.c | 18 + .../opengl/org_lwjgl_opengl_NVCopyImage.c | 12 + .../org_lwjgl_opengl_NVDepthBufferFloat.c | 24 + .../opengl/org_lwjgl_opengl_NVDrawTexture.c | 12 + .../opengl/org_lwjgl_opengl_NVEvaluators.c | 68 + .../org_lwjgl_opengl_NVExplicitMultisample.c | 25 + .../opengl/org_lwjgl_opengl_NVFence.c | 53 + .../org_lwjgl_opengl_NVFragmentProgram.c | 36 + ..._opengl_NVFramebufferMultisampleCoverage.c | 12 + .../org_lwjgl_opengl_NVGeometryProgram4.c | 12 + .../opengl/org_lwjgl_opengl_NVGpuProgram4.c | 114 + .../opengl/org_lwjgl_opengl_NVGpuShader5.c | 228 + .../opengl/org_lwjgl_opengl_NVHalfFloat.c | 160 + .../org_lwjgl_opengl_NVOcclusionQuery.c | 53 + ...org_lwjgl_opengl_NVParameterBufferObject.c | 27 + .../opengl/org_lwjgl_opengl_NVPathRendering.c | 350 + .../org_lwjgl_opengl_NVPixelDataRange.c | 19 + .../opengl/org_lwjgl_opengl_NVPointSprite.c | 19 + .../opengl/org_lwjgl_opengl_NVPresentVideo.c | 46 + .../org_lwjgl_opengl_NVPrimitiveRestart.c | 18 + .../opengl/org_lwjgl_opengl_NVProgram.c | 70 + .../org_lwjgl_opengl_NVRegisterCombiners.c | 92 + .../org_lwjgl_opengl_NVRegisterCombiners2.c | 20 + .../org_lwjgl_opengl_NVShaderBufferLoad.c | 91 + .../org_lwjgl_opengl_NVTextureBarrier.c | 12 + .../org_lwjgl_opengl_NVTextureMultisample.c | 42 + .../org_lwjgl_opengl_NVTransformFeedback.c | 82 + .../org_lwjgl_opengl_NVTransformFeedback2.c | 51 + .../org_lwjgl_opengl_NVVertexArrayRange.c | 33 + ..._lwjgl_opengl_NVVertexAttribInteger64bit.c | 130 + ...lwjgl_opengl_NVVertexBufferUnifiedMemory.c | 79 + .../opengl/org_lwjgl_opengl_NVVertexProgram.c | 270 + .../opengl/org_lwjgl_opengl_NVVideoCapture.c | 88 + ...org_lwjgl_opengles_AMDPerformanceMonitor.c | 106 + .../org_lwjgl_opengles_ANGLEFramebufferBlit.c | 20 + ...jgl_opengles_ANGLEFramebufferMultisample.c | 20 + ...jgl_opengles_APPLEFramebufferMultisample.c | 27 + .../opengles/org_lwjgl_opengles_APPLESync.c | 69 + .../org_lwjgl_opengles_ARBDrawBuffers.c | 22 + .../org_lwjgl_opengles_EXTBlendMinmax.c | 20 + .../org_lwjgl_opengles_EXTCopyTextureLevels.c | 20 + .../org_lwjgl_opengles_EXTDebugLabel.c | 31 + .../org_lwjgl_opengles_EXTDebugMarker.c | 36 + ...org_lwjgl_opengles_EXTDiscardFramebuffer.c | 21 + .../org_lwjgl_opengles_EXTMapBufferRange.c | 28 + .../org_lwjgl_opengles_EXTMultiDrawArrays.c | 22 + ..._opengles_EXTMultisampledRenderToTexture.c | 27 + ...g_lwjgl_opengles_EXTMultiviewDrawBuffers.c | 38 + ..._lwjgl_opengles_EXTOcclusionQueryBoolean.c | 68 + .../org_lwjgl_opengles_EXTRobustness.c | 45 + ..._lwjgl_opengles_EXTSeparateShaderObjects.c | 277 + .../org_lwjgl_opengles_EXTTextureArray.c | 20 + .../org_lwjgl_opengles_EXTTextureStorage.c | 55 + .../opengles/org_lwjgl_opengles_GLES20.c | 1124 +++ .../opengles/org_lwjgl_opengles_GLES30.c | 885 +++ ..._opengles_IMGMultisampledRenderToTexture.c | 27 + .../opengles/org_lwjgl_opengles_KHRDebug.c | 100 + .../org_lwjgl_opengles_NVCoverageSample.c | 27 + .../org_lwjgl_opengles_NVDrawBuffers.c | 22 + .../opengles/org_lwjgl_opengles_NVDrawPath.c | 110 + .../org_lwjgl_opengles_NVDrawTexture.c | 20 + .../opengles/org_lwjgl_opengles_NVFence.c | 67 + ..._opengles_NVFramebufferVertexAttribArray.c | 20 + .../org_lwjgl_opengles_NVGetTexImage.c | 46 + .../org_lwjgl_opengles_NVReadBuffer.c | 20 + .../org_lwjgl_opengles_NVSystemTime.c | 29 + ..._lwjgl_opengles_OESBlendEquationSeparate.c | 20 + .../org_lwjgl_opengles_OESBlendFuncSeparate.c | 20 + .../org_lwjgl_opengles_OESBlendSubtract.c | 20 + .../opengles/org_lwjgl_opengles_OESEGLImage.c | 27 + .../org_lwjgl_opengles_OESEGLImageExternal.c | 20 + .../org_lwjgl_opengles_OESFramebufferObject.c | 127 + .../org_lwjgl_opengles_OESGetProgramBinary.c | 31 + .../org_lwjgl_opengles_OESMapbuffer.c | 38 + .../org_lwjgl_opengles_OESTexture3D.c | 59 + .../org_lwjgl_opengles_OESVertexArrayObject.c | 44 + .../org_lwjgl_opengles_QCOMDriverControl.c | 45 + .../org_lwjgl_opengles_QCOMExtendedGet.c | 81 + .../org_lwjgl_opengles_QCOMExtendedGet2.c | 48 + .../org_lwjgl_opengles_QCOMTiledRendering.c | 27 + etc/lwjgl-2.9.1/src/native/linux/linux_al.c | 65 + etc/lwjgl-2.9.1/src/native/linux/linux_cl.c | 64 + etc/lwjgl-2.9.1/src/native/linux/lwjgl.map | 7 + etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.c | 121 + etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.h | 60 + .../src/native/linux/opengl/context.c | 359 + .../src/native/linux/opengl/context.h | 83 + .../src/native/linux/opengl/display.c | 411 ++ .../src/native/linux/opengl/extgl_glx.c | 280 + .../src/native/linux/opengl/extgl_glx.h | 441 ++ .../linux/opengl/org_lwjgl_opengl_Display.c | 670 ++ ...rg_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.c | 82 + ...rg_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h | 29 + ...g_lwjgl_opengl_LinuxCanvasImplementation.c | 65 + ...g_lwjgl_opengl_LinuxCanvasImplementation.h | 21 + ..._lwjgl_opengl_LinuxContextImplementation.c | 205 + ..._lwjgl_opengl_LinuxContextImplementation.h | 85 + .../org_lwjgl_opengl_LinuxDisplayPeerInfo.h | 29 + .../org_lwjgl_opengl_LinuxPbufferPeerInfo.h | 29 + .../linux/opengl/org_lwjgl_opengl_Pbuffer.c | 90 + .../src/native/linux/opengles/context.c | 56 + .../src/native/linux/opengles/context.h | 57 + .../src/native/linux/opengles/display.c | 409 ++ .../src/native/linux/opengles/extgl_glx.c | 69 + .../linux/opengles/org_lwjgl_opengl_Display.c | 658 ++ .../linux/org_lwjgl_LinuxSysImplementation.h | 15 + .../src/native/linux/org_lwjgl_input_Cursor.c | 120 + .../native/linux/org_lwjgl_opengl_Display.c | 0 .../linux/org_lwjgl_opengl_LinuxDisplay.h | 495 ++ .../org_lwjgl_opengl_LinuxDisplay_Compiz.h | 13 + ...wjgl_opengl_LinuxDisplay_Compiz_Provider.h | 13 + .../linux/org_lwjgl_opengl_LinuxEvent.c | 185 + .../linux/org_lwjgl_opengl_LinuxEvent.h | 257 + .../linux/org_lwjgl_opengl_LinuxKeyboard.c | 153 + .../linux/org_lwjgl_opengl_LinuxKeyboard.h | 155 + .../linux/org_lwjgl_opengl_LinuxMouse.c | 118 + .../linux/org_lwjgl_opengl_LinuxMouse.h | 87 + .../linux/org_lwjgl_opengl_LinuxPeerInfo.c | 58 + .../linux/org_lwjgl_opengl_LinuxPeerInfo.h | 37 + etc/lwjgl-2.9.1/src/native/macosx/context.h | 160 + etc/lwjgl-2.9.1/src/native/macosx/context.m | 162 + etc/lwjgl-2.9.1/src/native/macosx/macosx_al.c | 120 + etc/lwjgl-2.9.1/src/native/macosx/macosx_cl.c | 114 + .../org_lwjgl_MacOSXSysImplementation.h | 15 + .../native/macosx/org_lwjgl_opengl_Display.m | 891 +++ .../macosx/org_lwjgl_opengl_MacOSXAWTMouse.m | 73 + .../org_lwjgl_opengl_MacOSXCanvasPeerInfo.h | 29 + .../org_lwjgl_opengl_MacOSXCanvasPeerInfo.m | 343 + ...lwjgl_opengl_MacOSXContextImplementation.h | 101 + ...lwjgl_opengl_MacOSXContextImplementation.m | 242 + .../macosx/org_lwjgl_opengl_MacOSXDisplay.h | 161 + .../org_lwjgl_opengl_MacOSXMouseEventQueue.h | 43 + .../org_lwjgl_opengl_MacOSXNativeKeyboard.h | 31 + .../org_lwjgl_opengl_MacOSXNativeKeyboard.m | 58 + .../org_lwjgl_opengl_MacOSXNativeMouse.h | 75 + .../org_lwjgl_opengl_MacOSXNativeMouse.m | 170 + .../org_lwjgl_opengl_MacOSXPbufferPeerInfo.h | 29 + .../org_lwjgl_opengl_MacOSXPbufferPeerInfo.m | 78 + .../macosx/org_lwjgl_opengl_MacOSXPeerInfo.h | 37 + .../macosx/org_lwjgl_opengl_MacOSXPeerInfo.m | 73 + etc/lwjgl-2.9.1/src/native/windows/LWJGL.c | 65 + etc/lwjgl-2.9.1/src/native/windows/Window.h | 69 + etc/lwjgl-2.9.1/src/native/windows/display.c | 277 + etc/lwjgl-2.9.1/src/native/windows/display.h | 57 + .../src/native/windows/opengl/WGL.c | 95 + .../src/native/windows/opengl/WGL.h | 60 + .../src/native/windows/opengl/context.c | 501 ++ .../src/native/windows/opengl/context.h | 90 + .../src/native/windows/opengl/extgl_wgl.c | 216 + .../src/native/windows/opengl/extgl_wgl.h | 299 + .../windows/opengl/org_lwjgl_opengl_Pbuffer.c | 212 + ...wjgl_opengl_WindowsContextImplementation.c | 173 + ...wjgl_opengl_WindowsContextImplementation.h | 85 + .../org_lwjgl_opengl_WindowsPbufferPeerInfo.h | 61 + .../opengl/org_lwjgl_opengl_WindowsPeerInfo.c | 69 + .../opengl/org_lwjgl_opengl_WindowsPeerInfo.h | 53 + .../src/native/windows/opengles/context.c | 507 ++ .../src/native/windows/opengles/context.h | 87 + .../src/native/windows/opengles/extgl_wgl.c | 70 + .../org_lwjgl_opengl_WindowsPeerInfo.c | 57 + .../org_lwjgl_opengl_WindowsPeerInfo.h | 53 + .../src/native/windows/org_lwjgl_Sys.c | 114 + .../org_lwjgl_WindowsSysImplementation.h | 47 + .../native/windows/org_lwjgl_input_Cursor.c | 167 + .../native/windows/org_lwjgl_opengl_Display.c | 539 ++ ..._lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.c | 54 + ..._lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h | 21 + .../windows/org_lwjgl_opengl_WindowsDisplay.h | 545 ++ .../org_lwjgl_opengl_WindowsDisplayPeerInfo.c | 53 + .../org_lwjgl_opengl_WindowsDisplayPeerInfo.h | 21 + .../org_lwjgl_opengl_WindowsDisplay_Rect.h | 13 + .../org_lwjgl_opengl_WindowsKeyboard.c | 79 + .../org_lwjgl_opengl_WindowsKeyboard.h | 69 + .../org_lwjgl_opengl_WindowsRegistry.c | 145 + .../org_lwjgl_opengl_WindowsRegistry.h | 29 + .../src/native/windows/windows_al.c | 71 + .../src/native/windows/windows_cl.c | 73 + .../src/templates/org/lwjgl/openal/AL10.java | 1256 ++++ .../src/templates/org/lwjgl/openal/AL11.java | 278 + .../src/templates/org/lwjgl/openal/EFX10.java | 731 ++ .../opencl/AMD_device_attribute_query.java | 45 + .../lwjgl/opencl/AMD_device_memory_flags.java | 42 + .../templates/org/lwjgl/opencl/AMD_fp64.java | 39 + .../org/lwjgl/opencl/AMD_media_ops.java | 39 + .../org/lwjgl/opencl/AMD_media_ops2.java | 39 + .../org/lwjgl/opencl/AMD_offline_devices.java | 41 + .../org/lwjgl/opencl/AMD_popcnt.java | 39 + .../org/lwjgl/opencl/AMD_printf.java | 39 + .../templates/org/lwjgl/opencl/AMD_vec3.java | 39 + .../opencl/APPLE_ContextLoggingFunctions.java | 62 + .../opencl/APPLE_SetMemObjectDestructor.java | 57 + .../org/lwjgl/opencl/APPLE_gl_sharing.java | 80 + .../src/templates/org/lwjgl/opencl/CL10.java | 1161 +++ .../templates/org/lwjgl/opencl/CL10GL.java | 138 + .../src/templates/org/lwjgl/opencl/CL11.java | 204 + .../src/templates/org/lwjgl/opencl/CL12.java | 454 ++ .../templates/org/lwjgl/opencl/CL12GL.java | 60 + .../lwjgl/opencl/EXT_atomic_counters_32.java | 42 + .../lwjgl/opencl/EXT_atomic_counters_64.java | 42 + .../org/lwjgl/opencl/EXT_device_fission.java | 143 + .../lwjgl/opencl/EXT_migrate_memobject.java | 77 + .../opencl/INTEL_immediate_execution.java | 47 + .../org/lwjgl/opencl/INTEL_printf.java | 39 + .../lwjgl/opencl/INTEL_thread_local_exec.java | 52 + .../org/lwjgl/opencl/KHR_3d_image_writes.java | 39 + .../opencl/KHR_byte_addressable_store.java | 39 + .../org/lwjgl/opencl/KHR_d3d10_sharing.java | 39 + .../org/lwjgl/opencl/KHR_depth_images.java | 42 + .../templates/org/lwjgl/opencl/KHR_fp16.java | 42 + .../templates/org/lwjgl/opencl/KHR_fp64.java | 42 + .../org/lwjgl/opencl/KHR_gl_depth_images.java | 47 + .../org/lwjgl/opencl/KHR_gl_event.java | 56 + .../org/lwjgl/opencl/KHR_gl_msaa_sharing.java | 44 + .../org/lwjgl/opencl/KHR_gl_sharing.java | 77 + .../opencl/KHR_global_int32_base_atomics.java | 39 + .../KHR_global_int32_extended_atomics.java | 39 + .../templates/org/lwjgl/opencl/KHR_icd.java | 58 + .../lwjgl/opencl/KHR_image2d_from_buffer.java | 45 + .../lwjgl/opencl/KHR_initialize_memory.java | 46 + .../lwjgl/opencl/KHR_int64_base_atomics.java | 39 + .../opencl/KHR_int64_extended_atomics.java | 39 + .../opencl/KHR_local_int32_base_atomics.java | 39 + .../KHR_local_int32_extended_atomics.java | 39 + .../org/lwjgl/opencl/KHR_mipmap_image.java | 39 + .../lwjgl/opencl/KHR_mipmap_image_writes.java | 39 + .../opencl/KHR_select_fprounding_mode.java | 39 + .../templates/org/lwjgl/opencl/KHR_spir.java | 40 + .../lwjgl/opencl/KHR_srgb_image_writes.java | 39 + .../org/lwjgl/opencl/KHR_subgroups.java | 56 + .../lwjgl/opencl/KHR_terminate_context.java | 47 + .../org/lwjgl/opencl/NV_compiler_options.java | 39 + .../opencl/NV_device_attribute_query.java | 48 + .../org/lwjgl/opencl/NV_pragma_unroll.java | 39 + .../lwjgl/opengl/AMD_blend_minmax_factor.java | 44 + .../lwjgl/opengl/AMD_conservative_depth.java | 35 + .../org/lwjgl/opengl/AMD_debug_output.java | 104 + .../opengl/AMD_depth_clamp_separate.java | 44 + .../lwjgl/opengl/AMD_draw_buffers_blend.java | 49 + .../opengl/AMD_interleaved_elements.java | 50 + .../lwjgl/opengl/AMD_multi_draw_indirect.java | 70 + .../org/lwjgl/opengl/AMD_name_gen_delete.java | 65 + .../lwjgl/opengl/AMD_performance_monitor.java | 120 + .../org/lwjgl/opengl/AMD_pinned_memory.java | 43 + .../lwjgl/opengl/AMD_query_buffer_object.java | 56 + .../lwjgl/opengl/AMD_sample_positions.java | 50 + .../AMD_seamless_cubemap_per_texture.java | 42 + .../opengl/AMD_shader_atomic_counter_ops.java | 36 + .../opengl/AMD_shader_stencil_export.java | 35 + .../opengl/AMD_shader_trinary_minmax.java | 35 + .../org/lwjgl/opengl/AMD_sparse_texture.java | 83 + .../AMD_stencil_operation_extended.java | 61 + .../lwjgl/opengl/AMD_texture_texture4.java | 35 + ...D_transform_feedback3_lines_triangles.java | 36 + .../lwjgl/opengl/AMD_vertex_shader_layer.java | 35 + .../opengl/AMD_vertex_shader_tessellator.java | 57 + .../AMD_vertex_shader_viewport_index.java | 35 + .../lwjgl/opengl/APPLE_aux_depth_stencil.java | 39 + .../lwjgl/opengl/APPLE_client_storage.java | 39 + .../org/lwjgl/opengl/APPLE_element_array.java | 78 + .../org/lwjgl/opengl/APPLE_fence.java | 72 + .../org/lwjgl/opengl/APPLE_float_pixels.java | 63 + .../opengl/APPLE_flush_buffer_range.java | 51 + .../lwjgl/opengl/APPLE_object_purgeable.java | 81 + .../org/lwjgl/opengl/APPLE_packed_pixels.java | 58 + .../org/lwjgl/opengl/APPLE_rgb_422.java | 55 + .../org/lwjgl/opengl/APPLE_row_bytes.java | 43 + .../org/lwjgl/opengl/APPLE_texture_range.java | 72 + .../opengl/APPLE_vertex_array_object.java | 65 + .../opengl/APPLE_vertex_array_range.java | 83 + .../APPLE_vertex_program_evaluators.java | 84 + .../org/lwjgl/opengl/APPLE_ycbcr_422.java | 57 + .../lwjgl/opengl/ARB_ES2_compatibility.java | 89 + .../lwjgl/opengl/ARB_ES3_compatibility.java | 60 + .../lwjgl/opengl/ARB_arrays_of_arrays.java | 35 + .../org/lwjgl/opengl/ARB_base_instance.java | 73 + .../lwjgl/opengl/ARB_bindless_texture.java | 86 + .../lwjgl/opengl/ARB_blend_func_extended.java | 73 + .../org/lwjgl/opengl/ARB_buffer_object.java | 161 + .../org/lwjgl/opengl/ARB_buffer_storage.java | 97 + .../org/lwjgl/opengl/ARB_cl_event.java | 54 + .../lwjgl/opengl/ARB_clear_buffer_object.java | 74 + .../org/lwjgl/opengl/ARB_clear_texture.java | 75 + .../lwjgl/opengl/ARB_color_buffer_float.java | 74 + .../org/lwjgl/opengl/ARB_compatibility.java | 35 + .../ARB_compressed_texture_pixel_storage.java | 49 + .../org/lwjgl/opengl/ARB_compute_shader.java | 101 + .../ARB_compute_variable_group_size.java | 55 + .../lwjgl/opengl/ARB_conservative_depth.java | 35 + .../org/lwjgl/opengl/ARB_copy_buffer.java | 56 + .../org/lwjgl/opengl/ARB_copy_image.java | 49 + .../org/lwjgl/opengl/ARB_debug_output.java | 138 + .../lwjgl/opengl/ARB_depth_buffer_float.java | 52 + .../org/lwjgl/opengl/ARB_depth_clamp.java | 43 + .../org/lwjgl/opengl/ARB_depth_texture.java | 55 + .../org/lwjgl/opengl/ARB_draw_buffers.java | 69 + .../lwjgl/opengl/ARB_draw_buffers_blend.java | 47 + .../opengl/ARB_draw_elements_base_vertex.java | 67 + .../org/lwjgl/opengl/ARB_draw_indirect.java | 74 + .../org/lwjgl/opengl/ARB_draw_instanced.java | 50 + .../lwjgl/opengl/ARB_enhanced_layouts.java | 41 + .../opengl/ARB_explicit_attrib_location.java | 35 + .../opengl/ARB_explicit_uniform_location.java | 42 + .../ARB_fragment_coord_conventions.java | 35 + .../opengl/ARB_fragment_layer_viewport.java | 35 + .../lwjgl/opengl/ARB_fragment_program.java | 69 + .../opengl/ARB_fragment_program_shadow.java | 36 + .../org/lwjgl/opengl/ARB_fragment_shader.java | 55 + .../ARB_framebuffer_no_attachments.java | 94 + .../lwjgl/opengl/ARB_framebuffer_object.java | 312 + .../lwjgl/opengl/ARB_framebuffer_sRGB.java | 62 + .../lwjgl/opengl/ARB_geometry_shader4.java | 101 + .../lwjgl/opengl/ARB_get_program_binary.java | 73 + .../org/lwjgl/opengl/ARB_gpu_shader5.java | 49 + .../org/lwjgl/opengl/ARB_gpu_shader_fp64.java | 196 + .../lwjgl/opengl/ARB_half_float_pixel.java | 45 + .../lwjgl/opengl/ARB_half_float_vertex.java | 43 + .../org/lwjgl/opengl/ARB_imaging.java | 336 + .../lwjgl/opengl/ARB_indirect_parameters.java | 89 + .../lwjgl/opengl/ARB_instanced_arrays.java | 46 + .../opengl/ARB_internalformat_query.java | 59 + .../opengl/ARB_internalformat_query2.java | 187 + .../lwjgl/opengl/ARB_invalidate_subdata.java | 68 + .../opengl/ARB_map_buffer_alignment.java | 42 + .../lwjgl/opengl/ARB_map_buffer_range.java | 72 + .../org/lwjgl/opengl/ARB_matrix_palette.java | 71 + .../org/lwjgl/opengl/ARB_multi_bind.java | 68 + .../lwjgl/opengl/ARB_multi_draw_indirect.java | 74 + .../org/lwjgl/opengl/ARB_multisample.java | 49 + .../org/lwjgl/opengl/ARB_multitexture.java | 126 + .../org/lwjgl/opengl/ARB_occlusion_query.java | 110 + .../lwjgl/opengl/ARB_occlusion_query2.java | 42 + .../lwjgl/opengl/ARB_pixel_buffer_object.java | 50 + .../lwjgl/opengl/ARB_point_parameters.java | 51 + .../org/lwjgl/opengl/ARB_point_sprite.java | 50 + .../org/lwjgl/opengl/ARB_program.java | 195 + .../opengl/ARB_program_interface_query.java | 161 + .../lwjgl/opengl/ARB_provoking_vertex.java | 53 + .../lwjgl/opengl/ARB_query_buffer_object.java | 60 + .../ARB_robust_buffer_access_behavior.java | 35 + .../org/lwjgl/opengl/ARB_robustness.java | 191 + .../opengl/ARB_robustness_isolation.java | 35 + .../org/lwjgl/opengl/ARB_sample_shading.java | 53 + .../org/lwjgl/opengl/ARB_sampler_objects.java | 136 + .../lwjgl/opengl/ARB_seamless_cube_map.java | 43 + .../ARB_seamless_cubemap_per_texture.java | 43 + .../opengl/ARB_separate_shader_objects.java | 351 + .../opengl/ARB_shader_atomic_counters.java | 106 + .../lwjgl/opengl/ARB_shader_bit_encoding.java | 35 + .../opengl/ARB_shader_draw_parameters.java | 36 + .../lwjgl/opengl/ARB_shader_group_vote.java | 36 + .../opengl/ARB_shader_image_load_store.java | 135 + .../lwjgl/opengl/ARB_shader_image_size.java | 35 + .../org/lwjgl/opengl/ARB_shader_objects.java | 272 + .../lwjgl/opengl/ARB_shader_precision.java | 35 + .../opengl/ARB_shader_stencil_export.java | 35 + .../ARB_shader_storage_buffer_object.java | 87 + .../lwjgl/opengl/ARB_shader_subroutine.java | 139 + .../lwjgl/opengl/ARB_shader_texture_lod.java | 35 + .../opengl/ARB_shading_language_100.java | 40 + .../opengl/ARB_shading_language_420pack.java | 36 + .../opengl/ARB_shading_language_include.java | 108 + .../opengl/ARB_shading_language_packing.java | 36 + .../org/lwjgl/opengl/ARB_shadow.java | 38 + .../org/lwjgl/opengl/ARB_shadow_ambient.java | 36 + .../org/lwjgl/opengl/ARB_sparse_texture.java | 92 + .../lwjgl/opengl/ARB_stencil_texturing.java | 39 + .../templates/org/lwjgl/opengl/ARB_sync.java | 126 + .../lwjgl/opengl/ARB_tessellation_shader.java | 125 + .../opengl/ARB_texture_border_clamp.java | 36 + .../opengl/ARB_texture_buffer_object.java | 58 + .../ARB_texture_buffer_object_rgb32.java | 38 + .../opengl/ARB_texture_buffer_range.java | 69 + .../lwjgl/opengl/ARB_texture_compression.java | 102 + .../opengl/ARB_texture_compression_bptc.java | 52 + .../opengl/ARB_texture_compression_rgtc.java | 49 + .../lwjgl/opengl/ARB_texture_cube_map.java | 47 + .../opengl/ARB_texture_cube_map_array.java | 65 + .../org/lwjgl/opengl/ARB_texture_env_add.java | 35 + .../lwjgl/opengl/ARB_texture_env_combine.java | 63 + .../opengl/ARB_texture_env_crossbar.java | 35 + .../lwjgl/opengl/ARB_texture_env_dot3.java | 37 + .../org/lwjgl/opengl/ARB_texture_float.java | 68 + .../org/lwjgl/opengl/ARB_texture_gather.java | 44 + .../ARB_texture_mirror_clamp_to_edge.java | 45 + .../opengl/ARB_texture_mirrored_repeat.java | 36 + .../lwjgl/opengl/ARB_texture_multisample.java | 119 + .../opengl/ARB_texture_non_power_of_two.java | 35 + .../opengl/ARB_texture_query_levels.java | 35 + .../lwjgl/opengl/ARB_texture_query_lod.java | 35 + .../lwjgl/opengl/ARB_texture_rectangle.java | 78 + .../org/lwjgl/opengl/ARB_texture_rg.java | 74 + .../lwjgl/opengl/ARB_texture_rgb10_a2ui.java | 46 + .../lwjgl/opengl/ARB_texture_stencil8.java | 36 + .../org/lwjgl/opengl/ARB_texture_storage.java | 78 + .../ARB_texture_storage_multisample.java | 79 + .../org/lwjgl/opengl/ARB_texture_swizzle.java | 52 + .../org/lwjgl/opengl/ARB_texture_view.java | 56 + .../org/lwjgl/opengl/ARB_timer_query.java | 79 + .../lwjgl/opengl/ARB_transform_feedback2.java | 86 + .../lwjgl/opengl/ARB_transform_feedback3.java | 71 + .../ARB_transform_feedback_instanced.java | 47 + .../lwjgl/opengl/ARB_transpose_matrix.java | 49 + .../opengl/ARB_uniform_buffer_object.java | 214 + .../lwjgl/opengl/ARB_vertex_array_bgra.java | 42 + .../lwjgl/opengl/ARB_vertex_array_object.java | 71 + .../lwjgl/opengl/ARB_vertex_attrib_64bit.java | 99 + .../opengl/ARB_vertex_attrib_binding.java | 80 + .../org/lwjgl/opengl/ARB_vertex_blend.java | 123 + .../opengl/ARB_vertex_buffer_object.java | 65 + .../org/lwjgl/opengl/ARB_vertex_program.java | 171 + .../org/lwjgl/opengl/ARB_vertex_shader.java | 216 + .../ARB_vertex_type_10f_11f_11f_rev.java | 36 + .../ARB_vertex_type_2_10_10_10_rev.java | 223 + .../org/lwjgl/opengl/ARB_viewport_array.java | 144 + .../org/lwjgl/opengl/ARB_window_pos.java | 62 + .../org/lwjgl/opengl/ATI_draw_buffers.java | 69 + .../org/lwjgl/opengl/ATI_element_array.java | 54 + .../org/lwjgl/opengl/ATI_envmap_bumpmap.java | 60 + .../org/lwjgl/opengl/ATI_fragment_shader.java | 176 + .../lwjgl/opengl/ATI_map_object_buffer.java | 72 + .../org/lwjgl/opengl/ATI_meminfo.java | 41 + .../org/lwjgl/opengl/ATI_pn_triangles.java | 50 + .../lwjgl/opengl/ATI_separate_stencil.java | 46 + .../lwjgl/opengl/ATI_shader_texture_lod.java | 35 + .../opengl/ATI_text_fragment_shader.java | 47 + .../opengl/ATI_texture_compression_3dc.java | 39 + .../opengl/ATI_texture_env_combine3.java | 45 + .../org/lwjgl/opengl/ATI_texture_float.java | 52 + .../lwjgl/opengl/ATI_texture_mirror_once.java | 37 + .../lwjgl/opengl/ATI_vertex_array_object.java | 98 + .../ATI_vertex_attrib_array_object.java | 49 + .../org/lwjgl/opengl/ATI_vertex_streams.java | 105 + .../templates/org/lwjgl/opengl/EXT_abgr.java | 36 + .../templates/org/lwjgl/opengl/EXT_bgra.java | 37 + .../lwjgl/opengl/EXT_bindable_uniform.java | 63 + .../org/lwjgl/opengl/EXT_blend_color.java | 52 + .../opengl/EXT_blend_equation_separate.java | 46 + .../lwjgl/opengl/EXT_blend_func_separate.java | 43 + .../org/lwjgl/opengl/EXT_blend_minmax.java | 51 + .../org/lwjgl/opengl/EXT_blend_subtract.java | 37 + .../org/lwjgl/opengl/EXT_cg_shader.java | 44 + .../opengl/EXT_compiled_vertex_array.java | 43 + .../lwjgl/opengl/EXT_depth_bounds_test.java | 52 + .../lwjgl/opengl/EXT_direct_state_access.java | 1515 ++++ .../org/lwjgl/opengl/EXT_draw_buffers2.java | 70 + .../org/lwjgl/opengl/EXT_draw_instanced.java | 50 + .../lwjgl/opengl/EXT_draw_range_elements.java | 49 + .../org/lwjgl/opengl/EXT_fog_coord.java | 63 + .../lwjgl/opengl/EXT_framebuffer_blit.java | 77 + .../opengl/EXT_framebuffer_multisample.java | 59 + ...T_framebuffer_multisample_blit_scaled.java | 40 + .../lwjgl/opengl/EXT_framebuffer_object.java | 208 + .../lwjgl/opengl/EXT_framebuffer_sRGB.java | 62 + .../lwjgl/opengl/EXT_geometry_shader4.java | 101 + .../opengl/EXT_gpu_program_parameters.java | 49 + .../org/lwjgl/opengl/EXT_gpu_shader4.java | 210 + .../lwjgl/opengl/EXT_multi_draw_arrays.java | 42 + .../opengl/EXT_packed_depth_stencil.java | 67 + .../org/lwjgl/opengl/EXT_packed_float.java | 80 + .../org/lwjgl/opengl/EXT_packed_pixels.java | 40 + .../lwjgl/opengl/EXT_paletted_texture.java | 102 + .../lwjgl/opengl/EXT_pixel_buffer_object.java | 50 + .../lwjgl/opengl/EXT_point_parameters.java | 49 + .../lwjgl/opengl/EXT_provoking_vertex.java | 51 + .../org/lwjgl/opengl/EXT_rescale_normal.java | 36 + .../org/lwjgl/opengl/EXT_secondary_color.java | 66 + .../opengl/EXT_separate_shader_objects.java | 57 + .../opengl/EXT_separate_specular_color.java | 38 + .../opengl/EXT_shader_image_load_store.java | 110 + .../org/lwjgl/opengl/EXT_shadow_funcs.java | 35 + .../opengl/EXT_shared_texture_palette.java | 36 + .../lwjgl/opengl/EXT_stencil_clear_tag.java | 53 + .../lwjgl/opengl/EXT_stencil_two_side.java | 41 + .../org/lwjgl/opengl/EXT_stencil_wrap.java | 37 + .../org/lwjgl/opengl/EXT_texture_3d.java | 35 + .../org/lwjgl/opengl/EXT_texture_array.java | 90 + .../opengl/EXT_texture_buffer_object.java | 59 + .../opengl/EXT_texture_compression_latc.java | 49 + .../opengl/EXT_texture_compression_rgtc.java | 49 + .../opengl/EXT_texture_compression_s3tc.java | 42 + .../lwjgl/opengl/EXT_texture_env_combine.java | 56 + .../lwjgl/opengl/EXT_texture_env_dot3.java | 37 + .../EXT_texture_filter_anisotropic.java | 37 + .../org/lwjgl/opengl/EXT_texture_integer.java | 146 + .../lwjgl/opengl/EXT_texture_lod_bias.java | 58 + .../opengl/EXT_texture_mirror_clamp.java | 45 + .../lwjgl/opengl/EXT_texture_rectangle.java | 39 + .../org/lwjgl/opengl/EXT_texture_sRGB.java | 63 + .../lwjgl/opengl/EXT_texture_sRGB_decode.java | 53 + .../opengl/EXT_texture_shared_exponent.java | 59 + .../org/lwjgl/opengl/EXT_texture_snorm.java | 70 + .../org/lwjgl/opengl/EXT_texture_swizzle.java | 52 + .../org/lwjgl/opengl/EXT_timer_query.java | 64 + .../lwjgl/opengl/EXT_transform_feedback.java | 129 + .../lwjgl/opengl/EXT_vertex_array_bgra.java | 42 + .../lwjgl/opengl/EXT_vertex_attrib_64bit.java | 89 + .../org/lwjgl/opengl/EXT_vertex_shader.java | 291 + .../lwjgl/opengl/EXT_vertex_weighting.java | 65 + .../src/templates/org/lwjgl/opengl/GL11.java | 1651 +++++ .../src/templates/org/lwjgl/opengl/GL12.java | 123 + .../src/templates/org/lwjgl/opengl/GL13.java | 258 + .../src/templates/org/lwjgl/opengl/GL14.java | 173 + .../src/templates/org/lwjgl/opengl/GL15.java | 255 + .../src/templates/org/lwjgl/opengl/GL20.java | 596 ++ .../src/templates/org/lwjgl/opengl/GL21.java | 125 + .../src/templates/org/lwjgl/opengl/GL30.java | 1059 +++ .../src/templates/org/lwjgl/opengl/GL31.java | 321 + .../src/templates/org/lwjgl/opengl/GL32.java | 357 + .../src/templates/org/lwjgl/opengl/GL33.java | 436 ++ .../src/templates/org/lwjgl/opengl/GL40.java | 494 ++ .../src/templates/org/lwjgl/opengl/GL41.java | 473 ++ .../src/templates/org/lwjgl/opengl/GL42.java | 322 + .../src/templates/org/lwjgl/opengl/GL43.java | 858 +++ .../src/templates/org/lwjgl/opengl/GL44.java | 190 + .../opengl/GREMEDY_frame_terminator.java | 38 + .../lwjgl/opengl/GREMEDY_string_marker.java | 47 + .../org/lwjgl/opengl/HP_occlusion_test.java | 48 + .../org/lwjgl/opengl/IBM_rasterpos_clip.java | 42 + .../org/lwjgl/opengl/INTEL_map_texture.java | 67 + .../templates/org/lwjgl/opengl/KHR_debug.java | 233 + .../KHR_texture_compression_astc_ldr.java | 70 + .../org/lwjgl/opengl/NVX_gpu_memory_info.java | 44 + .../NV_bindless_multi_draw_indirect.java | 59 + .../org/lwjgl/opengl/NV_bindless_texture.java | 80 + .../opengl/NV_blend_equation_advanced.java | 105 + .../org/lwjgl/opengl/NV_blend_square.java | 35 + .../org/lwjgl/opengl/NV_compute_program5.java | 55 + .../lwjgl/opengl/NV_conditional_render.java | 50 + .../lwjgl/opengl/NV_copy_depth_to_color.java | 37 + .../org/lwjgl/opengl/NV_copy_image.java | 49 + .../org/lwjgl/opengl/NV_deep_texture3D.java | 43 + .../lwjgl/opengl/NV_depth_buffer_float.java | 64 + .../org/lwjgl/opengl/NV_depth_clamp.java | 36 + .../org/lwjgl/opengl/NV_draw_texture.java | 46 + .../org/lwjgl/opengl/NV_evaluators.java | 95 + .../lwjgl/opengl/NV_explicit_multisample.java | 107 + .../templates/org/lwjgl/opengl/NV_fence.java | 68 + .../org/lwjgl/opengl/NV_float_buffer.java | 91 + .../org/lwjgl/opengl/NV_fog_distance.java | 38 + .../org/lwjgl/opengl/NV_fragment_program.java | 72 + .../lwjgl/opengl/NV_fragment_program2.java | 44 + .../lwjgl/opengl/NV_fragment_program4.java | 36 + .../opengl/NV_fragment_program_option.java | 35 + .../NV_framebuffer_multisample_coverage.java | 49 + .../lwjgl/opengl/NV_geometry_program4.java | 62 + .../org/lwjgl/opengl/NV_geometry_shader4.java | 36 + .../org/lwjgl/opengl/NV_gpu_program4.java | 111 + .../org/lwjgl/opengl/NV_gpu_program5.java | 45 + .../opengl/NV_gpu_program5_mem_extended.java | 36 + .../org/lwjgl/opengl/NV_gpu_shader5.java | 186 + .../org/lwjgl/opengl/NV_half_float.java | 140 + .../lwjgl/opengl/NV_light_max_exponent.java | 37 + .../lwjgl/opengl/NV_multisample_coverage.java | 43 + .../opengl/NV_multisample_filter_hint.java | 41 + .../org/lwjgl/opengl/NV_occlusion_query.java | 85 + .../lwjgl/opengl/NV_packed_depth_stencil.java | 37 + .../opengl/NV_parameter_buffer_object.java | 70 + .../opengl/NV_parameter_buffer_object2.java | 36 + .../org/lwjgl/opengl/NV_path_rendering.java | 515 ++ .../org/lwjgl/opengl/NV_pixel_data_range.java | 70 + .../org/lwjgl/opengl/NV_point_sprite.java | 48 + .../org/lwjgl/opengl/NV_present_video.java | 116 + .../lwjgl/opengl/NV_primitive_restart.java | 57 + .../org/lwjgl/opengl/NV_program.java | 114 + .../lwjgl/opengl/NV_register_combiners.java | 157 + .../lwjgl/opengl/NV_register_combiners2.java | 47 + .../opengl/NV_shader_atomic_counters.java | 35 + .../lwjgl/opengl/NV_shader_atomic_float.java | 36 + .../lwjgl/opengl/NV_shader_buffer_load.java | 104 + .../lwjgl/opengl/NV_shader_buffer_store.java | 43 + .../NV_shader_storage_buffer_object.java | 35 + .../opengl/NV_tessellation_program5.java | 60 + .../lwjgl/opengl/NV_texgen_reflection.java | 37 + .../org/lwjgl/opengl/NV_texture_barrier.java | 38 + .../opengl/NV_texture_compression_vtc.java | 48 + .../lwjgl/opengl/NV_texture_env_combine4.java | 40 + .../opengl/NV_texture_expand_normal.java | 42 + .../lwjgl/opengl/NV_texture_multisample.java | 79 + .../lwjgl/opengl/NV_texture_rectangle.java | 39 + .../org/lwjgl/opengl/NV_texture_shader.java | 175 + .../org/lwjgl/opengl/NV_texture_shader2.java | 63 + .../org/lwjgl/opengl/NV_texture_shader3.java | 52 + .../lwjgl/opengl/NV_transform_feedback.java | 187 + .../lwjgl/opengl/NV_transform_feedback2.java | 78 + .../lwjgl/opengl/NV_vertex_array_range.java | 63 + .../lwjgl/opengl/NV_vertex_array_range2.java | 36 + .../NV_vertex_attrib_integer_64bit.java | 98 + .../NV_vertex_buffer_unified_memory.java | 113 + .../org/lwjgl/opengl/NV_vertex_program.java | 331 + .../lwjgl/opengl/NV_vertex_program1_1.java | 35 + .../org/lwjgl/opengl/NV_vertex_program2.java | 35 + .../opengl/NV_vertex_program2_option.java | 41 + .../org/lwjgl/opengl/NV_vertex_program3.java | 41 + .../org/lwjgl/opengl/NV_vertex_program4.java | 36 + .../org/lwjgl/opengl/NV_video_capture.java | 201 + .../lwjgl/opengl/SGIS_generate_mipmap.java | 50 + .../org/lwjgl/opengl/SGIS_texture_lod.java | 47 + .../org/lwjgl/opengl/SUN_slice_accum.java | 41 + .../opengles/AMD_compressed_3DC_texture.java | 43 + .../opengles/AMD_compressed_ATC_texture.java | 44 + .../opengles/AMD_performance_monitor.java | 121 + .../opengles/AMD_program_binary_Z400.java | 39 + .../opengles/ANGLE_framebuffer_blit.java | 56 + .../ANGLE_framebuffer_multisample.java | 55 + .../APPLE_framebuffer_multisample.java | 73 + .../org/lwjgl/opengles/APPLE_rgb_422.java | 55 + .../org/lwjgl/opengles/APPLE_sync.java | 112 + .../APPLE_texture_format_BGRA8888.java | 39 + .../opengles/APPLE_texture_max_level.java | 42 + .../org/lwjgl/opengles/ARB_draw_buffers.java | 69 + .../lwjgl/opengles/ARB_half_float_pixel.java | 43 + .../lwjgl/opengles/ARB_texture_rectangle.java | 78 + .../opengles/ARM_mali_shader_binary.java | 39 + .../org/lwjgl/opengles/ARM_rgba8.java | 39 + .../org/lwjgl/opengles/DMP_shader_binary.java | 39 + .../org/lwjgl/opengles/EXT_Cg_shader.java | 45 + .../org/lwjgl/opengles/EXT_bgra.java | 43 + .../org/lwjgl/opengles/EXT_blend_minmax.java | 45 + .../opengles/EXT_color_buffer_half_float.java | 51 + .../opengles/EXT_copy_texture_levels.java | 42 + .../org/lwjgl/opengles/EXT_debug_label.java | 74 + .../org/lwjgl/opengles/EXT_debug_marker.java | 57 + .../opengles/EXT_discard_framebuffer.java | 53 + .../org/lwjgl/opengles/EXT_frag_depth.java | 36 + .../lwjgl/opengles/EXT_map_buffer_range.java | 71 + .../lwjgl/opengles/EXT_multi_draw_arrays.java | 48 + .../EXT_multisampled_render_to_texture.java | 65 + .../opengles/EXT_multiview_draw_buffers.java | 67 + .../opengles/EXT_occlusion_query_boolean.java | 94 + .../org/lwjgl/opengles/EXT_packed_float.java | 53 + .../lwjgl/opengles/EXT_read_format_bgra.java | 43 + .../org/lwjgl/opengles/EXT_robustness.java | 78 + .../org/lwjgl/opengles/EXT_sRGB.java | 50 + .../opengles/EXT_separate_shader_objects.java | 180 + .../EXT_shader_framebuffer_fetch.java | 42 + .../opengles/EXT_shader_texture_lod.java | 36 + .../lwjgl/opengles/EXT_shadow_samplers.java | 50 + .../org/lwjgl/opengles/EXT_texture_array.java | 79 + .../EXT_texture_compression_dxt1.java | 46 + .../EXT_texture_compression_latc.java | 49 + .../EXT_texture_compression_s3tc.java | 49 + .../EXT_texture_filter_anisotropic.java | 49 + .../opengles/EXT_texture_format_BGRA8888.java | 42 + .../lwjgl/opengles/EXT_texture_lod_bias.java | 58 + .../org/lwjgl/opengles/EXT_texture_rg.java | 50 + .../lwjgl/opengles/EXT_texture_storage.java | 88 + .../EXT_texture_type_2_10_10_10_REV.java | 39 + .../lwjgl/opengles/EXT_unpack_subimage.java | 44 + .../templates/org/lwjgl/opengles/GLES20.java | 1050 +++ .../templates/org/lwjgl/opengles/GLES30.java | 856 +++ .../IMG_multisampled_render_to_texture.java | 65 + .../lwjgl/opengles/IMG_program_binary.java | 39 + .../org/lwjgl/opengles/IMG_read_format.java | 40 + .../org/lwjgl/opengles/IMG_shader_binary.java | 39 + .../IMG_texture_compression_pvrtc.java | 45 + .../org/lwjgl/opengles/KHR_debug.java | 222 + .../KHR_texture_compression_astc_ldr.java | 70 + .../NV_EGL_stream_consumer_external.java | 48 + .../lwjgl/opengles/NV_coverage_sample.java | 80 + .../lwjgl/opengles/NV_depth_nonlinear.java | 56 + .../org/lwjgl/opengles/NV_draw_buffers.java | 90 + .../org/lwjgl/opengles/NV_draw_path.java | 123 + .../org/lwjgl/opengles/NV_draw_texture.java | 46 + .../opengles/NV_fbo_color_attachments.java | 54 + .../org/lwjgl/opengles/NV_fence.java | 72 + .../NV_framebuffer_vertex_attrib_array.java | 53 + .../org/lwjgl/opengles/NV_get_tex_image.java | 89 + .../lwjgl/opengles/NV_platform_binary.java | 39 + .../org/lwjgl/opengles/NV_read_buffer.java | 43 + .../lwjgl/opengles/NV_read_depth_stencil.java | 36 + .../opengles/NV_shader_framebuffer_fetch.java | 36 + .../org/lwjgl/opengles/NV_system_time.java | 44 + .../NV_texture_compression_s3tc_update.java | 36 + .../opengles/NV_texture_npot_2D_mipmap.java | 36 + .../org/lwjgl/opengles/OES_EGL_image.java | 43 + .../opengles/OES_EGL_image_external.java | 56 + .../org/lwjgl/opengles/OES_EGL_sync.java | 39 + .../opengles/OES_blend_equation_separate.java | 47 + .../opengles/OES_blend_func_separate.java | 52 + .../lwjgl/opengles/OES_blend_subtract.java | 51 + .../OES_compressed_ETC1_RGB8_texture.java | 39 + .../OES_compressed_paletted_texture.java | 48 + .../org/lwjgl/opengles/OES_depth24.java | 39 + .../org/lwjgl/opengles/OES_depth32.java | 39 + .../org/lwjgl/opengles/OES_depth_texture.java | 46 + .../opengles/OES_element_index_uint.java | 39 + .../lwjgl/opengles/OES_fbo_render_mipmap.java | 36 + .../opengles/OES_framebuffer_object.java | 198 + .../opengles/OES_get_program_binary.java | 65 + .../org/lwjgl/opengles/OES_mapbuffer.java | 86 + .../opengles/OES_packed_depth_stencil.java | 52 + .../opengles/OES_required_internalformat.java | 35 + .../org/lwjgl/opengles/OES_rgb8_rgba8.java | 43 + .../opengles/OES_standard_derivatives.java | 42 + .../org/lwjgl/opengles/OES_stencil1.java | 39 + .../org/lwjgl/opengles/OES_stencil4.java | 39 + .../org/lwjgl/opengles/OES_stencil8.java | 39 + .../opengles/OES_surfaceless_context.java | 39 + .../org/lwjgl/opengles/OES_texture_3D.java | 91 + .../org/lwjgl/opengles/OES_texture_float.java | 35 + .../opengles/OES_texture_float_linear.java | 36 + .../opengles/OES_texture_half_float.java | 42 + .../OES_texture_half_float_linear.java | 36 + .../org/lwjgl/opengles/OES_texture_npot.java | 36 + .../opengles/OES_vertex_array_object.java | 61 + .../lwjgl/opengles/OES_vertex_half_float.java | 39 + .../opengles/OES_vertex_type_10_10_10_2.java | 40 + .../lwjgl/opengles/QCOM_binning_control.java | 45 + .../lwjgl/opengles/QCOM_driver_control.java | 65 + .../org/lwjgl/opengles/QCOM_extended_get.java | 95 + .../lwjgl/opengles/QCOM_extended_get2.java | 59 + .../QCOM_performance_monitor_global_mode.java | 43 + .../lwjgl/opengles/QCOM_tiled_rendering.java | 81 + .../opengles/QCOM_writeonly_rendering.java | 39 + .../org/lwjgl/opengles/VIV_shader_binary.java | 39 + etc/slick-util.jar | Bin 0 -> 102748 bytes upload all.sh | 0 1985 files changed, 255900 insertions(+) create mode 100644 .gitignore create mode 100644 Game/.settings/org.eclipse.jdt.core.prefs create mode 100644 Game/src/Ammunition.java create mode 100644 Game/src/Button.java create mode 100644 Game/src/ControlledShip.java create mode 100644 Game/src/Game.java create mode 100644 Game/src/Item.java create mode 100644 Game/src/MathShit.java create mode 100644 Game/src/Menu.java create mode 100644 Game/src/Metroid.java create mode 100644 Game/src/MovingObject.java create mode 100644 Game/src/Shape.java create mode 100644 Game/src/Ship.java create mode 100644 Game/src/SpaceSpiel.java create mode 100644 Game/src/Turret.java create mode 100644 download all.sh create mode 100644 etc/lwjgl-2.9.1/build.xml create mode 100644 etc/lwjgl-2.9.1/doc/3rdparty/jinput_license.txt create mode 100644 etc/lwjgl-2.9.1/doc/3rdparty/jogl_license.txt create mode 100644 etc/lwjgl-2.9.1/doc/3rdparty/lzma_license.txt create mode 100644 etc/lwjgl-2.9.1/doc/3rdparty/openal_license.txt create mode 100644 etc/lwjgl-2.9.1/doc/CREDITS create mode 100644 etc/lwjgl-2.9.1/doc/LICENSE create mode 100644 etc/lwjgl-2.9.1/doc/README create mode 100644 etc/lwjgl-2.9.1/doc/lwjgl_hidden_switches.text create mode 100644 etc/lwjgl-2.9.1/jar/AppleJavaExtensions.jar create mode 100644 etc/lwjgl-2.9.1/jar/asm-debug-all.jar create mode 100644 etc/lwjgl-2.9.1/jar/jinput.jar create mode 100644 etc/lwjgl-2.9.1/jar/lwjgl-debug.jar create mode 100644 etc/lwjgl-2.9.1/jar/lwjgl.jar create mode 100644 etc/lwjgl-2.9.1/jar/lwjgl_test.jar create mode 100644 etc/lwjgl-2.9.1/jar/lwjgl_util.jar create mode 100644 etc/lwjgl-2.9.1/jar/lwjgl_util_applet.jar create mode 100644 etc/lwjgl-2.9.1/jar/lzma.jar create mode 100644 etc/lwjgl-2.9.1/native/linux/libjinput-linux.so create mode 100644 etc/lwjgl-2.9.1/native/linux/libjinput-linux64.so create mode 100644 etc/lwjgl-2.9.1/native/linux/liblwjgl.so create mode 100644 etc/lwjgl-2.9.1/native/linux/liblwjgl64.so create mode 100644 etc/lwjgl-2.9.1/native/linux/libopenal.so create mode 100644 etc/lwjgl-2.9.1/native/linux/libopenal64.so create mode 100644 etc/lwjgl-2.9.1/native/macosx/libjinput-osx.jnilib create mode 100644 etc/lwjgl-2.9.1/native/macosx/liblwjgl.jnilib create mode 100644 etc/lwjgl-2.9.1/native/macosx/openal.dylib create mode 100644 etc/lwjgl-2.9.1/native/solaris/liblwjgl.so create mode 100644 etc/lwjgl-2.9.1/native/solaris/liblwjgl64.so create mode 100644 etc/lwjgl-2.9.1/native/solaris/libopenal.so create mode 100644 etc/lwjgl-2.9.1/native/solaris/libopenal64.so create mode 100644 etc/lwjgl-2.9.1/native/windows/OpenAL32.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/OpenAL64.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/jinput-dx8.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/jinput-dx8_64.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/jinput-raw.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/jinput-raw_64.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/lwjgl.dll create mode 100644 etc/lwjgl-2.9.1/native/windows/lwjgl64.dll create mode 100644 etc/lwjgl-2.9.1/platform_build/JLzma.jar create mode 100644 etc/lwjgl-2.9.1/platform_build/Pack200Task.jar create mode 100644 etc/lwjgl-2.9.1/platform_build/bsd_ant/build.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/build-applet.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/build-definitions.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/build-generator.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/build-maven.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/build-webstart.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/linux_ant/build.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/linux_ant/build_es.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/macosx_ant/build-symbol-list create mode 100644 etc/lwjgl-2.9.1/platform_build/macosx_ant/build.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/mingw_ant/build.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/windows_ant/build.xml create mode 100644 etc/lwjgl-2.9.1/platform_build/windows_ant/build_es.xml create mode 100644 etc/lwjgl-2.9.1/res/Footsteps.wav create mode 100644 etc/lwjgl-2.9.1/res/appletlogo.gif create mode 100644 etc/lwjgl-2.9.1/res/appletprogress.gif create mode 100644 etc/lwjgl-2.9.1/res/ball.png create mode 100644 etc/lwjgl-2.9.1/res/ball_sm.png create mode 100644 etc/lwjgl-2.9.1/res/center.wav create mode 100644 etc/lwjgl-2.9.1/res/ding.wav create mode 100644 etc/lwjgl-2.9.1/res/left.wav create mode 100644 etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.ai create mode 100644 etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.svg create mode 100644 etc/lwjgl-2.9.1/res/lwjgl_16x16.xpm create mode 100644 etc/lwjgl-2.9.1/res/lwjgl_32x32.xpm create mode 100644 etc/lwjgl-2.9.1/res/resources.txt create mode 100644 etc/lwjgl-2.9.1/res/right.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/alien.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/alien2.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/alien3.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/gotyou.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/hit.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/loose.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/pressanykey.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/ship.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/shot.gif create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/shot.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/start.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/win.wav create mode 100644 etc/lwjgl-2.9.1/res/spaceinvaders/youwin.gif create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL10.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL11.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/EFX10.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceAttributeQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceMemoryFlags.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDOfflineDevices.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEContextLoggingFunctions.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEGLSharing.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLESetMemObjectDestructor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10GL.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL11.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12GL.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLCapabilities.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLDeviceCapabilities.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLPlatformCapabilities.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters32.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters64.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTDeviceFission.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTMigrateMemobject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELImmediateExecution.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELThreadLocalExec.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRDepthImages.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp16.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp64.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLDepthImages.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLEvent.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLMsaaSharing.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLSharing.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRICD.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRImage2DFromBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRInitializeMemory.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRSubgroups.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRTerminateContext.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/NVDeviceAttributeQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDBlendMinmaxFactor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDebugOutput.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDepthClampSeparate.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDrawBuffersBlend.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDInterleavedElements.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDMultiDrawIndirect.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDNameGenDelete.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPerformanceMonitor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPinnedMemory.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDQueryBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSamplePositions.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSparseTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDStencilOperationExtended.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDVertexShaderTessellator.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEAuxDepthStencil.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEClientStorage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEElementArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFence.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFloatPixels.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFlushBufferRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEObjectPurgeable.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEPackedPixels.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERgb422.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERowBytes.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLETextureRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexProgramEvaluators.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEYcbcr422.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBaseInstance.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBindlessTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBlendFuncExtended.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferStorage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCLEvent.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBColorBufferFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeVariableGroupSize.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyImage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDebugOutput.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthBufferFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthClamp.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffersBlend.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawIndirect.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawInstanced.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES2Compatibility.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES3Compatibility.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBEnhancedLayouts.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBExplicitUniformLocation.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferNoAttachments.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferSRGB.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGeometryShader4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGetProgramBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShader5.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShaderFp64.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatPixel.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatVertex.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBImaging.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBIndirectParameters.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInstancedArrays.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInvalidateSubdata.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferAlignment.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMatrixPalette.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiBind.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiDrawIndirect.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultitexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPixelBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointParameters.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointSprite.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgramInterfaceQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProvokingVertex.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBQueryBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBRobustness.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSampleShading.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSamplerObjects.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubeMap.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeparateShaderObjects.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderAtomicCounters.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderImageLoadStore.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderObjects.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderStorageBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderSubroutine.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguage100.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguageInclude.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadow.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadowAmbient.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSparseTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBStencilTexturing.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSync.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTessellationShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBorderClamp.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompression.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionBPTC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionRGTC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMap.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMapArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvCombine.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvDot3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureGather.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirroredRepeat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRg.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorageMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureSwizzle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureView.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTimerQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransposeMatrix.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBUniformBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayBgra.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttrib64bit.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttribBinding.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBlend.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBViewportArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBWindowPos.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIDrawBuffers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIElementArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIEnvmapBumpmap.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIFragmentShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMapObjectBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMeminfo.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIPnTriangles.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATISeparateStencil.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextFragmentShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureCompression3DC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureEnvCombine3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureMirrorOnce.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexArrayObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexAttribArrayObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexStreams.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ContextCapabilities.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTAbgr.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBgra.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBindableUniform.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendColor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendEquationSeparate.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendFuncSeparate.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendMinmax.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendSubtract.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCgShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCompiledVertexArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDepthBoundsTest.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDirectStateAccess.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawBuffers2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawInstanced.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawRangeElements.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFogCoord.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferBlit.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferSRGB.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGeometryShader4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuProgramParameters.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuShader4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTMultiDrawArrays.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedDepthStencil.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedPixels.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPalettedTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPixelBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPointParameters.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTProvokingVertex.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTRescaleNormal.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSecondaryColor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateShaderObjects.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateSpecularColor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTShaderImageLoadStore.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSharedTexturePalette.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilClearTag.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilTwoSide.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilWrap.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionLATC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionRGTC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionS3TC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvCombine.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvDot3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureInteger.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureLODBias.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureMirrorClamp.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGB.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGBDecode.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSharedExponent.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSnorm.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSwizzle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTimerQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTransformFeedback.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexArrayBgra.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexAttrib64bit.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexWeighting.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL11.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL12.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL13.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL14.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL15.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL20.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL21.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL30.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL31.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL32.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL33.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL40.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL41.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL42.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL43.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL44.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYFrameTerminator.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYStringMarker.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/HPOcclusionTest.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/IBMRasterposClip.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/INTELMapTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRDebug.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRTextureCompressionAstcLdr.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBlendEquationAdvanced.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVComputeProgram5.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVConditionalRender.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyDepthToColor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyImage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDeepTexture3D.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthBufferFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthClamp.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDrawTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVEvaluators.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVExplicitMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFence.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFloatBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFogDistance.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGeometryProgram4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram5.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuShader5.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVHalfFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVLightMaxExponent.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleCoverage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleFilterHint.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVOcclusionQuery.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPackedDepthStencil.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVParameterBufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPathRendering.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPixelDataRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPointSprite.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPresentVideo.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPrimitiveRestart.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferLoad.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferStore.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTessellationProgram5.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTexgenReflection.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureBarrier.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureCompressionVTC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureEnvCombine4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureExpandNormal.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexAttribInteger64bit.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram2Option.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram3.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVideoCapture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVXGpuMemoryInfo.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/References.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISGenerateMipmap.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISTextureLOD.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SUNSliceAccum.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressed3DCTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressedATCTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDPerformanceMonitor.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDProgramBinaryZ400.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferBlit.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLEFramebufferMultisample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLERgb422.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLESync.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureFormatBGRA8888.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureMaxLevel.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBDrawBuffers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBHalfFloatPixel.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBTextureRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMMaliShaderBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMRgba8.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ContextCapabilities.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/DMPShaderBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBgra.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBlendMinmax.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCgShader.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTColorBufferHalfFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCopyTextureLevels.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugLabel.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugMarker.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDiscardFramebuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMapBufferRange.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiDrawArrays.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultisampledRenderToTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiviewDrawBuffers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTOcclusionQueryBoolean.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTPackedFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTReadFormatBgra.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTRobustness.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSRGB.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSeparateShaderObjects.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShaderFramebufferFetch.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShadowSamplers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionDXT1.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionLATC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionS3TC.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFilterAnisotropic.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFormatBGRA8888.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureLODBias.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureRg.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureStorage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureType2101010REV.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTUnpackSubimage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES20.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES30.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGMultisampledRenderToTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGProgramBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGReadFormat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGShaderBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGTextureCompressionPvrtc.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRDebug.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRTextureCompressionAstcLdr.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVCoverageSample.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDepthNonlinear.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawBuffers.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawPath.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVEGLStreamConsumerExternal.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFboColorAttachments.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFence.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFramebufferVertexAttribArray.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVGetTexImage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVPlatformBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVReadBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVSystemTime.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendEquationSeparate.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendFuncSeparate.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendSubtract.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedETC1RGB8Texture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedPalettedTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth24.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth32.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepthTexture.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImage.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImageExternal.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESElementIndexUint.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESFramebufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESGetProgramBinary.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESMapbuffer.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESPackedDepthStencil.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESRGB8RGBA8.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStandardDerivatives.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil1.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil4.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil8.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESSurfacelessContext.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTexture3D.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTextureHalfFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexArrayObject.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexHalfFloat.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexType1010102.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMBinningControl.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMDriverControl.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet2.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMPerformanceMonitorGlobalMode.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMTiledRendering.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMWriteonlyRendering.java create mode 100644 etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/VIVShaderBinary.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferChecks.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferUtils.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/DefaultSysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/J2SESysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLException.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/LinuxSysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/MacOSXSysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtilSun.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapper.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapperAbstract.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/Sys.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/SysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/WindowsSysImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/Game.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/AlienEntity.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Entity.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Game.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShipEntity.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShotEntity.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/SoundManager.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Sprite.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Texture.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/TextureLoader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controller.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/ControllerEvent.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controllers.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Cursor.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/JInputController.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Keyboard.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Mouse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/input/OpenGLPackageAccess.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/AL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC10.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC11.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCcontext.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCdevice.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/EFXUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/OpenALException.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/Util.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APIUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APPLEContextLoggingUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLBuildProgramCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLChecks.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCommandQueue.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCompileProgramCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContext.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContextCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLDevice.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEvent.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEventCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLFunctionAddress.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLKernel.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLLinkProgramCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMem.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMemObjectDestructorCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLNativeKernel.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectChild.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRegistry.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRetainable.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPlatform.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPrintfCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgram.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgramCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLSampler.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CallbackUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/FastLongMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilAbstract.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/OpenCLException.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/Util.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLBufferRegion.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLImageFormat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/Filter.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AMDDebugOutputCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/APIUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ARBDebugOutputCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTCanvasImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTGLCanvas.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTSurfaceLock.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/BaseReferences.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/CallbackUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Context.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribs.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribsImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGLES.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Display.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayMode.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Drawable.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGLES.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableLWJGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/EventQueue.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/FastIntMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLChecks.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLContext.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLSync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLUConstants.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GlobalLock.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/InputImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KHRDebugCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KeyboardEventQueue.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxAWTGLCanvasPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxCanvasImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextAttribs.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplay.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplayPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxEvent.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeyboard.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeycodes.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxMouse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPbufferPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXAWTGLCanvasPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplay.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplayPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeMouse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPbufferPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MouseEventQueue.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVPresentVideoUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVVideoCaptureUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/OpenGLException.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Pbuffer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormatLWJGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ReferencesStack.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/RenderTexture.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/SharedDrawable.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateStack.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateTracker.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Sync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Util.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsAWTGLCanvasPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsCanvasImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextAttribs.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextImplementation.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplay.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplayPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsFileVersion.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeyboard.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeycodes.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsMouse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPbufferPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsRegistry.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/XRandR.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/APIUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/CallbackUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/ContextAttribs.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLConfig.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLContext.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLDisplay.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLImageOES.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRFenceSync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRReusableSync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLNVSync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSurface.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncKHR.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncNV.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/FastIntMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLChecks.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLContext.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLSync.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/KHRDebugCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PeerInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PixelFormat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PowerManagementEventException.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/StateTracker.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/Util.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/DisplayTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/NativeTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/SysTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WaveDataTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WindowCreationTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/AppletLoaderTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/ControllersTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/GearsApplet.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenAL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Speed.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Test.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessellationTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/VertexData.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/HWCursorTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/KeyboardTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseCreationTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/TestControllers.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedFloat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectBench.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests1.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests2.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectWithLibrary.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedSomething.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec2.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec3.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/TestMappedObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCCaptureTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/BasicTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/EFX10Test.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/MovingSoundTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALCreationTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTestMemory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PositionTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/SourceLimitTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/StressTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/HelloOpenCL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/DemoFractal.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/Mandelbrot.cl create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/Gears.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/PbufferTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/SyncTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOIndexTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VersionTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGears.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DemoBox.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DisplayParentTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoadTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/PbufferTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/TextureRenderer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRenderer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRendererRTT.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/Shader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.fp create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.vp create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.fsh create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.vsh create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVP.vp create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVSH.vsh create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout2P.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutCL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/StreamVBO.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/FullScreenWindowedTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/Gears.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/MappedIndexedVBOTest.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/QuadRenderer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectArray.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectElement.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLLight.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLMatrix.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Geometry.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ImmediateModeBuffer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Shader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ShaderProgram.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Sphere.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Color.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Dimension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Display.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Point.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableColor.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableDimension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadablePoint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Rectangle.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Renderable.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Timer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WaveData.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableColor.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableDimension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritablePoint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableRectangle.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/XPMFile.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/applet/AppletLoader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alias.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alternate.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Auto.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoSize.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoType.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferKind.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedReference.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedResult.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Check.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Code.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Const.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Constant.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Dependent.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/DeprecatedGL.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extern.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/FieldsGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/ForceInit.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GenerateAutos.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorProcessorFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorVisitor.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Helper.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Imports.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Indirect.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JNITypeTranslator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaTypeTranslator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Mode.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeType.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NoErrorCheck.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NullTerminated.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Optional.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/OutParameter.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Platform.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PlatformDependent.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerArray.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerType.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerWrapper.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PostfixTranslator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Private.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/RegisterStubsGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Result.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Reuse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/SignatureTranslator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Signedness.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/StripPostfix.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeInfo.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypedefsGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Utils.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALTypeMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALboolean.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALbyte.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALdouble.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALenum.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALfloat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALshort.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALsizei.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALubyte.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALuint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALvoid.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLCapabilitiesGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLDeviceExtension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLGeneratorProcessorFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPDCapabilitiesGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPlatformExtension.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLTypeMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bitfield.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bool.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_byte.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_char.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_double.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_float.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_int.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_long.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_short.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uchar.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_void.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/size_t.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLint64NV.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLuint64NV.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLCapabilitiesGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESCapabilitiesGenerator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESGeneratorProcessorFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESTypeMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLGeneratorProcessorFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLReferencesGeneratorProcessorFactory.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbitfield.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLboolean.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbyte.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLchar.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLcharARB.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampd.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampf.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLdouble.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLenum.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLfloat.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhalf.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhandleARB.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64EXT.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptr.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLreturn.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLshort.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizei.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLtime.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLubyte.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64EXT.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLushort.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLvoid.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Cylinder.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Disk.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLU.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellator.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallback.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/MipMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PartialDisk.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PixelStoreState.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Project.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Quadric.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Registry.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Sphere.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Util.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/CachedVertex.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Dict.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/DictNode.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUface.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUmesh.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUvertex.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Geom.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Mesh.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Normal.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQ.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Render.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Sweep.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessMono.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessState.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/input/ControllerAdapter.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/KeyMap.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLKeyboard.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLMouse.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLinePad.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLineSize.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheUtil.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedField.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedForeach.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedHelper.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObject.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet2.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet3.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet4.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedType.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/Pointer.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix2f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix3f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix4f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Quaternion.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector2f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector3f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector4f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector2f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector3f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector4f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector2f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector3f.java create mode 100644 etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector4f.java create mode 100644 etc/lwjgl-2.9.1/src/lwjgl-git.iml create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl_d3d10.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl_ext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl_gl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl_gl_ext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/CL/cl_platform.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/EGL/egl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/EGL/eglext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/EGL/eglplatform.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/GLES2/gl2.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/GLES2/gl2ext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/GLES2/gl2extimg.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/GLES2/gl2platform.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/KHR/khrplatform.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/OpenCL/cl_platform.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/awt_tools.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/common_tools.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/common_tools.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/extal.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/extal.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/extcl.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/extcl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/extcl_types.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opencl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/extgl.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/extgl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/extgl_types.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_Pbuffer.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/extgl.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/extgl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/extgl_types.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_DefaultSysImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor_CursorElement.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard_KeyEvent.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Mouse.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC10.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC11.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.h create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c create mode 100644 etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.h create mode 100644 etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL10.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL11.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_EFX10.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEContextLoggingFunctions.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEGLSharing.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLESetMemObjectDestructor.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10GL.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL11.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12GL.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTDeviceFission.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTMigrateMemobject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLEvent.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLSharing.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRICD.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRSubgroups.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRTerminateContext.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDebugOutput.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDrawBuffersBlend.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDInterleavedElements.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDMultiDrawIndirect.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDNameGenDelete.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDPerformanceMonitor.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSamplePositions.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSparseTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDStencilOperationExtended.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDVertexShaderTessellator.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEElementArray.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFence.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFlushBufferRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEObjectPurgeable.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLETextureRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexProgramEvaluators.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBindlessTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferStorage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBCLEvent.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBClearBufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBColorBufferFloat.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBComputeVariableGroupSize.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDebugOutput.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffers.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffersBlend.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawInstanced.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBFramebufferNoAttachments.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGeometryShader4.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGpuShaderFp64.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBImaging.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBIndirectParameters.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBInstancedArrays.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMatrixPalette.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultitexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBOcclusionQuery.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBPointParameters.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBProgram.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBRobustness.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSampleShading.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShaderObjects.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShadingLanguageInclude.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSparseTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureCompression.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorageMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTransposeMatrix.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexAttrib64bit.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexBlend.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexShader.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBWindowPos.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIDrawBuffers.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIElementArray.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIEnvmapBumpmap.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIFragmentShader.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIMapObjectBuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIPnTriangles.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATISeparateStencil.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexArrayObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexAttribArrayObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexStreams.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBindableUniform.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendColor.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendEquationSeparate.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendFuncSeparate.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendMinmax.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTCompiledVertexArray.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDepthBoundsTest.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDirectStateAccess.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawBuffers2.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawInstanced.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawRangeElements.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFogCoord.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferBlit.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGeometryShader4.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuProgramParameters.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuShader4.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTMultiDrawArrays.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPalettedTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPointParameters.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTProvokingVertex.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSecondaryColor.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSeparateShaderObjects.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTShaderImageLoadStore.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilClearTag.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilTwoSide.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureBufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureInteger.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTimerQuery.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTransformFeedback.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexAttrib64bit.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexShader.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexWeighting.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL11.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL12.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL13.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL14.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL15.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL20.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL21.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL30.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL31.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL32.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL33.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL40.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL41.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL42.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL43.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL44.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYFrameTerminator.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYStringMarker.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_INTELMapTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessMultiDrawIndirect.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBlendEquationAdvanced.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVConditionalRender.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVCopyImage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDepthBufferFloat.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDrawTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVEvaluators.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVExplicitMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFence.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFragmentProgram.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFramebufferMultisampleCoverage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGeometryProgram4.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuProgram4.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuShader5.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVHalfFloat.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVOcclusionQuery.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVParameterBufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPathRendering.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPixelDataRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPointSprite.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPresentVideo.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPrimitiveRestart.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVProgram.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners2.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVShaderBufferLoad.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureBarrier.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback2.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexArrayRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexAttribInteger64bit.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexBufferUnifiedMemory.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexProgram.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVideoCapture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_AMDPerformanceMonitor.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferBlit.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLEFramebufferMultisample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLESync.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ARBDrawBuffers.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTBlendMinmax.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTCopyTextureLevels.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugLabel.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugMarker.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDiscardFramebuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMapBufferRange.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiDrawArrays.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultisampledRenderToTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiviewDrawBuffers.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTOcclusionQueryBoolean.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTRobustness.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTSeparateShaderObjects.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureArray.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureStorage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES20.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES30.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_IMGMultisampledRenderToTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_KHRDebug.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVCoverageSample.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawBuffers.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawPath.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawTexture.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFence.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFramebufferVertexAttribArray.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVGetTexImage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVReadBuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVSystemTime.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendEquationSeparate.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendFuncSeparate.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendSubtract.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImage.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImageExternal.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESFramebufferObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESGetProgramBinary.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESMapbuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESTexture3D.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESVertexArrayObject.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMDriverControl.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet2.c create mode 100644 etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMTiledRendering.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/linux_al.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/linux_cl.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/lwjgl.map create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/context.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/context.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/display.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Display.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxDisplayPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxPbufferPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Pbuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengles/context.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengles/context.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengles/display.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengles/extgl_glx.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/opengles/org_lwjgl_opengl_Display.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_LinuxSysImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_input_Cursor.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_Display.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz_Provider.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.h create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/context.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/context.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/macosx_al.c create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/macosx_cl.c create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_MacOSXSysImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_Display.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXAWTMouse.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXDisplay.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXMouseEventQueue.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.m create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.m create mode 100644 etc/lwjgl-2.9.1/src/native/windows/LWJGL.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/Window.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/display.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/display.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/context.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/context.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_Pbuffer.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPbufferPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengles/context.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengles/context.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengles/extgl_wgl.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_Sys.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_WindowsSysImplementation.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_input_Cursor.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_Display.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay_Rect.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.h create mode 100644 etc/lwjgl-2.9.1/src/native/windows/windows_al.c create mode 100644 etc/lwjgl-2.9.1/src/native/windows/windows_cl.c create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL10.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL11.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/EFX10.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_attribute_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_memory_flags.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_fp64.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_offline_devices.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_popcnt.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_printf.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_vec3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_ContextLoggingFunctions.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_SetMemObjectDestructor.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10GL.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL11.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12GL.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_32.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_64.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_device_fission.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_migrate_memobject.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_immediate_execution.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_printf.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_thread_local_exec.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_3d_image_writes.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_byte_addressable_store.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_d3d10_sharing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_depth_images.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp16.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp64.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_depth_images.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_event.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_msaa_sharing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_base_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_extended_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_icd.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_image2d_from_buffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_initialize_memory.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_base_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_extended_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_base_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_extended_atomics.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image_writes.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_select_fprounding_mode.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_spir.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_srgb_image_writes.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_subgroups.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_terminate_context.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_compiler_options.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_device_attribute_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_pragma_unroll.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_blend_minmax_factor.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_conservative_depth.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_debug_output.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_depth_clamp_separate.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_draw_buffers_blend.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_interleaved_elements.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_multi_draw_indirect.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_name_gen_delete.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_performance_monitor.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_pinned_memory.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_query_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sample_positions.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_seamless_cubemap_per_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_atomic_counter_ops.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_stencil_export.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_trinary_minmax.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sparse_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_stencil_operation_extended.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_texture_texture4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_transform_feedback3_lines_triangles.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_layer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_tessellator.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_viewport_index.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_aux_depth_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_client_storage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_element_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_fence.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_float_pixels.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_flush_buffer_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_object_purgeable.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_packed_pixels.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_rgb_422.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_row_bytes.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_texture_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_program_evaluators.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_ycbcr_422.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES2_compatibility.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES3_compatibility.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_arrays_of_arrays.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_base_instance.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_bindless_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_blend_func_extended.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_storage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_cl_event.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_color_buffer_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compatibility.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compressed_texture_pixel_storage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_variable_group_size.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_conservative_depth.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_buffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_image.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_debug_output.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_buffer_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_clamp.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers_blend.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_elements_base_vertex.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_indirect.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_instanced.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_enhanced_layouts.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_attrib_location.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_uniform_location.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_coord_conventions.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_layer_viewport.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program_shadow.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_no_attachments.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_sRGB.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_geometry_shader4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_get_program_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader5.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader_fp64.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_pixel.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_vertex.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_imaging.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_indirect_parameters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_instanced_arrays.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_invalidate_subdata.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_alignment.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_matrix_palette.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_bind.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_draw_indirect.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multitexture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_pixel_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_parameters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_sprite.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program_interface_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_provoking_vertex.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_query_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robust_buffer_access_behavior.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness_isolation.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sample_shading.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sampler_objects.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cube_map.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cubemap_per_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_separate_shader_objects.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_atomic_counters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_bit_encoding.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_draw_parameters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_group_vote.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_load_store.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_size.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_objects.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_precision.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_stencil_export.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_storage_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_subroutine.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_texture_lod.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_100.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_420pack.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_include.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_packing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow_ambient.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sparse_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_stencil_texturing.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sync.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_tessellation_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_border_clamp.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object_rgb32.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_bptc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_rgtc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_add.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_combine.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_crossbar.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_dot3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_gather.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirror_clamp_to_edge.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirrored_repeat.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_non_power_of_two.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_levels.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_lod.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rectangle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rg.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rgb10_a2ui.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_stencil8.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_swizzle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_view.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_timer_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback_instanced.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transpose_matrix.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_uniform_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_bgra.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_64bit.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_binding.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_blend.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_10f_11f_11f_rev.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_2_10_10_10_rev.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_viewport_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_window_pos.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_draw_buffers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_element_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_envmap_bumpmap.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_fragment_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_map_object_buffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_meminfo.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_pn_triangles.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_separate_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_shader_texture_lod.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_text_fragment_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_compression_3dc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_env_combine3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_mirror_once.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_array_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_attrib_array_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_streams.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_abgr.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bgra.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bindable_uniform.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_color.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_equation_separate.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_func_separate.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_minmax.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_subtract.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_cg_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_compiled_vertex_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_depth_bounds_test.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_direct_state_access.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_buffers2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_instanced.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_range_elements.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_fog_coord.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_blit.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample_blit_scaled.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_sRGB.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_geometry_shader4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_program_parameters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_shader4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_multi_draw_arrays.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_depth_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_pixels.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_paletted_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_pixel_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_point_parameters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_provoking_vertex.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_rescale_normal.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_secondary_color.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_shader_objects.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_specular_color.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shader_image_load_store.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shadow_funcs.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shared_texture_palette.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_clear_tag.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_two_side.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_wrap.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_3d.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_latc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_rgtc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_s3tc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_combine.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_dot3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_filter_anisotropic.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_integer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_lod_bias.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_mirror_clamp.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_rectangle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB_decode.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_shared_exponent.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_snorm.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_swizzle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_timer_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_transform_feedback.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_array_bgra.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_attrib_64bit.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_weighting.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL11.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL12.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL13.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL14.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL15.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL20.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL21.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL30.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL31.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL32.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL33.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL40.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL41.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL42.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL43.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL44.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_frame_terminator.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_string_marker.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/HP_occlusion_test.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/IBM_rasterpos_clip.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/INTEL_map_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_debug.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_texture_compression_astc_ldr.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NVX_gpu_memory_info.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_multi_draw_indirect.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_equation_advanced.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_square.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_compute_program5.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_conditional_render.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_depth_to_color.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_image.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_deep_texture3D.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_buffer_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_clamp.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_draw_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_evaluators.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_explicit_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fence.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_float_buffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fog_distance.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program_option.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_framebuffer_multisample_coverage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_program4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_shader4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5_mem_extended.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_shader5.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_half_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_light_max_exponent.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_coverage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_filter_hint.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_occlusion_query.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_packed_depth_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_path_rendering.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_pixel_data_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_point_sprite.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_present_video.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_primitive_restart.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_counters.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_load.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_store.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_storage_buffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_tessellation_program5.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texgen_reflection.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_barrier.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_compression_vtc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_env_combine4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_expand_normal.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_rectangle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_attrib_integer_64bit.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_buffer_unified_memory.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program1_1.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2_option.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program3.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_video_capture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_generate_mipmap.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_texture_lod.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SUN_slice_accum.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_3DC_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_ATC_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_performance_monitor.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_program_binary_Z400.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_blit.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_framebuffer_multisample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_rgb_422.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_sync.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_format_BGRA8888.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_max_level.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_draw_buffers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_half_float_pixel.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_texture_rectangle.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_mali_shader_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_rgba8.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/DMP_shader_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_Cg_shader.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_bgra.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_blend_minmax.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_color_buffer_half_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_copy_texture_levels.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_label.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_marker.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_discard_framebuffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_frag_depth.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_map_buffer_range.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multi_draw_arrays.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multisampled_render_to_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multiview_draw_buffers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_occlusion_query_boolean.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_packed_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_read_format_bgra.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_robustness.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_sRGB.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_separate_shader_objects.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_framebuffer_fetch.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_texture_lod.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shadow_samplers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_dxt1.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_latc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_s3tc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_filter_anisotropic.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_format_BGRA8888.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_lod_bias.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_rg.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_storage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_type_2_10_10_10_REV.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_unpack_subimage.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES20.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES30.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_multisampled_render_to_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_program_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_read_format.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_shader_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_texture_compression_pvrtc.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_debug.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_texture_compression_astc_ldr.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_EGL_stream_consumer_external.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_coverage_sample.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_depth_nonlinear.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_buffers.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_path.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fbo_color_attachments.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fence.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_framebuffer_vertex_attrib_array.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_get_tex_image.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_platform_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_buffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_depth_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_shader_framebuffer_fetch.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_system_time.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_compression_s3tc_update.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_npot_2D_mipmap.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image_external.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_sync.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_equation_separate.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_func_separate.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_subtract.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_ETC1_RGB8_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_paletted_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth24.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth32.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth_texture.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_element_index_uint.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_fbo_render_mipmap.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_framebuffer_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_get_program_binary.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_mapbuffer.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_packed_depth_stencil.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_required_internalformat.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_rgb8_rgba8.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_standard_derivatives.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil1.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil4.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil8.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_surfaceless_context.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_3D.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float_linear.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float_linear.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_npot.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_array_object.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_half_float.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_type_10_10_10_2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_binning_control.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_driver_control.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get2.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_performance_monitor_global_mode.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_tiled_rendering.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_writeonly_rendering.java create mode 100644 etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/VIV_shader_binary.java create mode 100644 etc/slick-util.jar create mode 100644 upload all.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37a21f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.metadata/ +*/.metadata/ + +*/.project +*/.classpath +*/.setting/ + +*/bin/ diff --git a/Game/.settings/org.eclipse.jdt.core.prefs b/Game/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..7341ab1 --- /dev/null +++ b/Game/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/Game/src/Ammunition.java b/Game/src/Ammunition.java new file mode 100644 index 0000000..33d9e8c --- /dev/null +++ b/Game/src/Ammunition.java @@ -0,0 +1,90 @@ +/** + * Projectile with ballistic attributes and physics + * @author vanitas,lil + * + */ +public class Ammunition extends MovingObject +{ + private float durability, //Lifetime in seconds + lifetime; //"Age" of the projectile in seconds + + + /** + * Constructor + * @param direction + * @param x location + * @param y + * @param pearcing can this penetrate other Objects? + */ + public Ammunition(float rotation, float x, float y, boolean pearcing) + { + //this.direction = (float) Math.toRadians(direction+90); //Set the direction of the projectile + this.setRotation(rotation); + this.x = x; this.y = y; this.durability = 0; //Set variables + this.setShape(new Shape(Shape.S_BULLET)); + this.getShape().setSize(1f); + this.durability = 2; //Lifetime in seconds + } + /** + * moves the object one frame + */ + @Override + public void move(float delta, boolean keepOnScreen) + { + float xNeu = (float) (x+Math.cos((float) Math.toRadians(90-this.getRotation()))*0.35f*delta); + float yNeu = (float) (y+Math.sin((float) Math.toRadians(90-this.getRotation()))*0.35f*delta); + this.lifetime += (delta/1000); //Let the projectile "age" + if(this.lifetime>this.durability) //If "too old" do something + { + SpaceSpiel.getMunition().remove(this); + } + x = xNeu; + y = yNeu; + + if(keepOnScreen) keepOnScreen(); + + } + /** + * modifies the speedvector (In this case it doesnt, cause a bullet in space doesn't + * change direction and speed + */ + @Override + public void accelerate() + { + //Keep this empty, Munition doesn't accelerate (Except for rockets maybe) + } + + //Getters and setters + public float getDurability() + { + return durability; + } + public void setDurability(float durability) + { + this.durability = durability; + } + public float getX() + { + return x; + } + public void setX(float x) + { + this.x = x; + } + public float getY() + { + return y; + } + public void setY(float y) + { + this.y = y; + } + public float getLifetime() + { + return lifetime; + } + public void setLifetime(float lifetime) + { + this.lifetime = lifetime; + } +} diff --git a/Game/src/Button.java b/Game/src/Button.java new file mode 100644 index 0000000..e80556e --- /dev/null +++ b/Game/src/Button.java @@ -0,0 +1,50 @@ +import org.lwjgl.util.Rectangle; +import java.awt.Font; +import org.newdawn.slick.Color; +import org.newdawn.slick.TrueTypeFont; + + +public class Button{ + + private boolean isClicked; + private String name; + Rectangle bounds = new Rectangle(); + private TrueTypeFont font; + + public Button(float loc, String name) { + super(); + this.name = name; + this.isClicked = false; + bounds.setX(50); + bounds.setY((int) ((loc * 50) - 15)); + bounds.setHeight(30); + bounds.setWidth(100); + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean isClicked() { + return isClicked; + } + public void setClicked(boolean isClicked) { + this.isClicked = isClicked; + } + public Rectangle getBounds() { + return bounds; + } + public void setBounds(Rectangle bounds) { + this.bounds = bounds; + } + public TrueTypeFont getFont() { + return font; + } + public void setFont(TrueTypeFont font) { + this.font = font; + } + public void init(String name) { + + } +} diff --git a/Game/src/ControlledShip.java b/Game/src/ControlledShip.java new file mode 100644 index 0000000..26ede56 --- /dev/null +++ b/Game/src/ControlledShip.java @@ -0,0 +1,19 @@ +/** + * Implementation of a ship controlled by a human + * @author vanitas + * + */ +public class ControlledShip extends Ship +{ + public ControlledShip() + { + super(); + this.setX(SpaceSpiel.frameSizeX/2); //Place the ship in the middle of the screen + this.setY(SpaceSpiel.frameSizeY/2); + this.setRotation(0f); //Initialize rotation + this.setThrust(0.1f); //Set thrust and maxSpeed + this.setMaxSpeed(6f); + } + + +} diff --git a/Game/src/Game.java b/Game/src/Game.java new file mode 100644 index 0000000..31dd96e --- /dev/null +++ b/Game/src/Game.java @@ -0,0 +1,279 @@ + +import java.util.ArrayList; + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GL11; +import org.lwjgl.input.Mouse; + + +/** + * This is the main class of the game. This renders the game, handles input and output etc. + * Important methods: update, renderGL + * @author vanitas + * + */ +public class Game{ + long lastFrame, lastFPS; //Values to calibrate the framerate etc. + int fps; + public static final int frameSizeX = 800, frameSizeY = 600; //Resolution of the Window + @SuppressWarnings("rawtypes") + private ArrayList objects; //A ArrayList containing th following Lists + private ArrayList metroids; //A List Containing all the metroids + private ArrayList ships; //A List Containing all the ships etc + private static ArrayList munition; //A List Containing all the active fired projectiles + + private ControlledShip playerShip; //The players ship + + private Menu menu; //The Menu-Display + private boolean menuIsActive; //if menu is active this variable is true + private boolean closeRequested = false; + /** + * Constructor + */ + @SuppressWarnings("rawtypes") + public Game() + { + // + //Initialize ship and Objects (Add Objects here and dont forget to add them to the ArrayLists as well;) + playerShip = new ControlledShip(); + Turret geschuetz = new Turret(playerShip.getX(),playerShip.getY()); + geschuetz.setParent(playerShip); + + //Initialize ArrayLists + objects = new ArrayList(); + metroids = new ArrayList(); + ships = new ArrayList(); + munition = new ArrayList(); + + //Add Objects to Lists + ships.add(playerShip); + ships.add(geschuetz); + + //Pack Lists together + objects.add(metroids); + objects.add(ships); + objects.add(munition); + } + /** + * This method updates all the objects (moves them, captures keyboard and mouse input etc) + * @param delta + */ + public void update(int delta) + { + //Handle Keyboard KeyPresses + //Gas geben ;) + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) //Arrow up + { + playerShip.setVelocity(1f); //Set the velocity to 1 (Power on) + } + //rotation (Arrow right) + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) + { + playerShip.turnRight(delta); + } + //Arrow left + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) + { + playerShip.turnLeft(delta); + } + //When Arrow up is released, turn down the power. + if(!Keyboard.isKeyDown(Keyboard.KEY_UP)) + { + playerShip.setVelocity(0f); + } + //If Spacebar is pressed and shotburnout is over, fire a projectile + if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)) + { + playerShip.fire(delta); + } + if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) + { + menuIsActive = true; + } + //Call an update (movements etc.) for every Object in the game + updateObjects(delta); + updateFPS(); // update FPS Counter + } + /** + * Update (accelerate and move) all the Objects in the ArrayLists + * @param delta + */ + public void updateObjects(float delta) + { + for(int i = 0; i l = objects.get(i); + for(int j = 0; j l = objects.get(i); + for(int j = 0; j 1000) + { + Display.setTitle("The best game in the world. FPS: " + fps); + fps = 0; + lastFPS += 1000; + } + fps++; + } + public ArrayList getObjects() + { + return objects; + } + public void setObjects(ArrayList objects) + { + this.objects = objects; + } + public ArrayList getMetroids() + { + return metroids; + } + public void setMetroids(ArrayList metroids) + { + this.metroids = metroids; + } + public ArrayList getShips() + { + return ships; + } + public void setShips(ArrayList ships) + { + this.ships = ships; + } + public static ArrayList getMunition() + { + return munition; + } + public void setMunition(ArrayList munition) + { + this.munition = munition; + } +} diff --git a/Game/src/Item.java b/Game/src/Item.java new file mode 100644 index 0000000..929b25b --- /dev/null +++ b/Game/src/Item.java @@ -0,0 +1,28 @@ +/** + * TODO: Item wird gedropt und fliegt kurz weiter, verlangsamt aber. + * Wenn der Spieler sich nähert gleitet das Item mit wachsender + * Geschwindigkeit auf den Spieler zu, wird quasi "angezogen" + * @author vanitas, + * + */ +public class Item extends MovingObject +{ + private float friction = 0.95f; + + public Item() + { + this.setShape(new Shape(Shape.S_ITEM)); + } + + /** + * This doesn't accelerate the Item, but it slows it down till it stops. + */ + @Override + public void accelerate() //This Method is overwritten to let the Item + { //glide with decreasing speed, untill it stops + if(this.getSpeedX()>0.001) this.speedX = this.getSpeedX()*friction; + else this.setSpeedX(0f); + if(this.getSpeedY()>0.001) this.speedY = this.getSpeedY()*friction; + else this.setSpeedY(0f); + } +} diff --git a/Game/src/MathShit.java b/Game/src/MathShit.java new file mode 100644 index 0000000..f2ca01f --- /dev/null +++ b/Game/src/MathShit.java @@ -0,0 +1,29 @@ + +public class MathShit +{ + /** + * Calculates the x-component of a vector, rotated around 0|0 by angle + * @param angle angle to rotate, in radians + * @param x old x-component of the vector or point + * @param y old y-component of the vector or point + * @return the new x component + */ + public static float rotateX(double angle, float x, float y) + { + double beta = (2*Math.PI)-angle; + return (float) (Math.cos(beta)*x-Math.sin(beta)*y); + } + + /** + * Calculates the y-component of a vector, rotated around 0|0 by angle + * @param angle angle to rotate, in radians + * @param x old x-component of the vector or point + * @param y old y-component of the vector or point + * @return the new y-component + */ + public static float rotateY(double angle, float x, float y) + { + double beta = (2*Math.PI)-angle; + return (float) (Math.sin(beta)*x+Math.cos(beta)*y); + } +} diff --git a/Game/src/Menu.java b/Game/src/Menu.java new file mode 100644 index 0000000..65913ba --- /dev/null +++ b/Game/src/Menu.java @@ -0,0 +1,7 @@ + +public class Menu{ + public Menu(){ + + } + +} diff --git a/Game/src/Metroid.java b/Game/src/Metroid.java new file mode 100644 index 0000000..4340ee6 --- /dev/null +++ b/Game/src/Metroid.java @@ -0,0 +1,108 @@ +import java.util.ArrayList; + +/** + * A floating, gliding metroid TODO: Maybe add lifepoints, so that multiple hits are needed to destroy this + * @author vanitas + * + */ +public class Metroid extends MovingObject +{ + private int level, //Size of the Metroid (default 3-1) + countBabies; //How many new Metroids spawn, when THIS gets killed? + private float spin; + public Metroid(int level) + { + this.level = level; + this.spin = (float) Math.random(); + this.shape = new Shape(Shape.S_METROID); + this.getShape().setSize(level); + this.x = 400f; + this.y = 150f; + this.speedX = (float) (Math.random()*2f); + this.speedY = (float) (Math.random()*2f); + } + /** + * Creates a Metroid with + * @param level + * @param x + * @param y + * @param speedX + * @param speedY + */ + public Metroid(int level, float x, float y, float speedX, float speedY, float spin) + { + this.level = level; + this.spin = (float) Math.random(); + this.shape = new Shape(Shape.S_METROID); + this.getShape().setSize(level*1.5f); + this.x = x; + this.y = y; + this.speedX = speedX; + this.speedY = speedY; + } + + /** + * This method moves the Metroid according to its speedVector + * @param delta + * @param keepOnScreen if true the method calls keepOnScreen() + */ + @Override + public void move(float delta, boolean keepOnScreen) + { + + this.x += delta*0.1f*this.speedX; + this.y += delta*0.1f*this.speedY; + this.rotation += delta*this.spin*0.2f; + if(keepOnScreen) this.keepOnScreen(); + } + + /** + * this method handles the case that THIS Metroid gets hit by an Object (Normally Ammunition) + * @param o The object that hit the Metroid + */ + @SuppressWarnings("unchecked") + @Override + public void processCollision(MovingObject o) + { + ArrayList m = SpaceSpiel.getMetroids(); + if(this.level>1) + { + for(int i = 0; i<4; i++) + { + m.add(new Metroid(this.level-1, this.getX(),this.getY(),(float) (Math.random()*2f),(float) (Math.random()*2f),(float) Math.random())); + } + } + else + { + //TODO: By chance of 5% or so add some random Items or PowerUps to the game. + // + } + m.remove(this); + } + /** + * An empty method (A Metroid shouldn't accelerate) + * Only here to overwrite the parents method + */ + @Override + public void accelerate() + { + //Has to be empty + } + //Getters and setters + public int getLevel() + { + return this.level; + } + public void setLevel(int level) + { + this.level = level; + } + public float getSpin() + { + return this.spin; + } + public void setSpin(float spin) + { + this.spin = spin; + } +} diff --git a/Game/src/MovingObject.java b/Game/src/MovingObject.java new file mode 100644 index 0000000..4fbd6b8 --- /dev/null +++ b/Game/src/MovingObject.java @@ -0,0 +1,251 @@ +/** + * An Object that moves following physical rules + * @author vanitas + * + */ +public class MovingObject +{ + //Attributes + protected float velocity, //whats the velocity of the object? 0 or 1 + x, //x position of the object + y, //y position of the object + speedX, //x component of the speedvector + speedY, //y component (eg. x=2,y=2 => object is flying to the right corner with a speed of 2.7 + maxSpeed, //Maximal speed of the object + rotation, //totation of the object (0° <=> object points towards the top of the screen) + thrust; //Power of acceleration + protected int team; //Which team is the object in? 0 = nature + protected Shape shape; //Contains the vertices for the shape + + //Constructors (Lol there are none) + + /** + * moves the Object one frame + * @param delta + * @param keepOnScreen + */ + public void move(float delta, boolean keepOnScreen) + { + //Set new x and y locations calculated from old location and + //Speedvector + this.setX(this.getX()+this.getSpeedX()*delta*0.2f); + this.setY(this.getY()+this.getSpeedY()*delta*0.2f); + //Eventually keep the object on the screen if it leaves at the borders + if(keepOnScreen) this.keepOnScreen(); + } + /** + * Rotates the Object to the right + * @param delta + */ + public void turnRight(int delta) + { + this.setRotation(this.getRotation() + 0.35f * delta); + } + /** + * Rotates the Object to the left + * @param delta + */ + public void turnLeft(int delta) + { + this.setRotation(this.getRotation() - 0.35f * delta); + } + /** + * Let this Object follow another Object + * @param x + */ + public void follow(MovingObject x) //TODO Test this + { + float xOther = x.getX(); + float yOther = x.getY(); + float hypot = (float) Math.hypot(Math.abs(this.x-xOther), Math.abs(this.y-yOther)); + //Set Rotation + float rot; + if(this.xthis.getMaxSpeed()) + { + double fac = actualSpeed/this.getMaxSpeed(); + this.speedX = (float) (this.speedX/fac); + this.speedY = (float) (this.speedY/fac); + } + } + /** + * Keep the Object on the screen if it leaves to the borders + */ + public void keepOnScreen() + { + this.x = this.x%SpaceSpiel.frameSizeX; + this.y = this.y%SpaceSpiel.frameSizeY; + if(this.x<0) this.x = SpaceSpiel.frameSizeX+this.x; + if(this.y<0) this.y = SpaceSpiel.frameSizeY+this.y; + } + /** + * This Method fires (In this class its only there, to be overwritten) + * @param delta + */ + public void fire(float delta) + { + //Let me empty + } + + /** + * Checks, if this Object collides with another TODO: This is not accurate, maybe there's a fix for this + * @param otherObject The Object, this Object should check for collision with + * @return the Object if collided, else null + * @author lil, Oooh, vanitas + */ + public MovingObject intersect(MovingObject otherObject) + { + //Extract the shapes of the objects + Shape one = this.getShape(); + Shape other = otherObject.getShape(); + //Go through all the edges of the shape of THIS object + for(int i = 0; icurrent edge of THIS shape, 3-4 => current edge of otherObject's shape) + double x1 = this.getX()+MathShit.rotateX(Math.toRadians(this.getRotation()), one.getX(i), one.getY(i))*one.getSize(); + double x2 = this.getX()+MathShit.rotateX(Math.toRadians(this.getRotation()), one.getX(iinc), one.getY(iinc))*one.getSize(); + double x3 = otherObject.getX()+MathShit.rotateX(Math.toRadians(otherObject.getRotation()), other.getX(j), other.getY(j))*other.getSize(); + double x4 = otherObject.getX()+MathShit.rotateX(Math.toRadians(otherObject.getRotation()), other.getX(jinc), other.getY(jinc))*other.getSize(); + double y1 = this.getY()+MathShit.rotateY(Math.toRadians(this.getRotation()), one.getX(i), one.getY(i))*one.getSize(); + double y2 = this.getY()+MathShit.rotateY(Math.toRadians(this.getRotation()), one.getX(iinc), one.getY(iinc))*one.getSize(); + double y3 = otherObject.getY()+MathShit.rotateY(Math.toRadians(otherObject.getRotation()), other.getX(j), other.getY(j))*other.getSize(); + double y4 = otherObject.getY()+MathShit.rotateY(Math.toRadians(otherObject.getRotation()), other.getX(jinc), other.getY(jinc))*other.getSize(); + // Zaehler + double zx = (x1 * y2 - y1 * x2)*(x3-x4) - (x1 - x2) * (x3 * y4 - y3 * x4); + double zy = (x1 * y2 - y1 * x2)*(y3-y4) - (y1 - y2) * (x3 * y4 - y3 * x4); + + // Nenner + double n = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + // Koordinaten des Schnittpunktes + double x = zx/n; + double y = zy/n; + + // Vielleicht ist bei der Division durch n etwas schief gelaufen + if (Double.isNaN(x)& Double.isNaN(y)) + { + System.out.println("NaN"); + } + // Test ob der Schnittpunkt auf den angebenen Strecken liegt oder außerhalb. + if (Math.abs((x - x1) / (x2 - x1)) > 1 || Math.abs((x - x3) / (x4 - x3)) > 1 || Math.abs((y - y1) / (y2 - y1)) > 1 || Math.abs((y - y3) / (y4 - y3)) > 1 ) + { + //System.out.println("Alles ok"); + } + else return otherObject; + } + } + return null; + } + + /** + * Placeholder for children. Children should overwrite this method to handle the case of a collision + * @param o The Object THIS collided with + */ + public void processCollision(MovingObject o) + { + + } + + //Getters and setters + public float getVelocity() + { + return this.velocity; + } + public void setVelocity(float v) + { + this.velocity = v; + } + public float getX() + { + return this.x; + } + public void setX(float x) + { + this.x = x; + } + public float getY() + { + return y; + } + public void setY(float y) + { + this.y = y; + } + public float getSpeedX() + { + return speedX; + } + public void setSpeedX(float speedX) + { + this.speedX = speedX; + } + public float getSpeedY() + { + return speedY; + } + public void setSpeedY(float speedY) + { + this.speedY = speedY; + } + public float getMaxSpeed() + { + return maxSpeed; + } + public void setMaxSpeed(float maxSpeed) + { + this.maxSpeed = maxSpeed; + } + public float getRotation() + { + return rotation; + } + public void setRotation(float rotation) + { + this.rotation = rotation%360; + } + public float getThrust() + { + return thrust; + } + public void setThrust(float thrust) + { + this.thrust = thrust; + } + public int getTeam() + { + return team; + } + public void setTeam(int team) + { + this.team = team; + } + public Shape getShape() + { + return shape; + } + public void setShape(Shape shape) + { + this.shape = shape; + } +} diff --git a/Game/src/Shape.java b/Game/src/Shape.java new file mode 100644 index 0000000..d842ef3 --- /dev/null +++ b/Game/src/Shape.java @@ -0,0 +1,202 @@ +import java.util.ArrayList; + +/** + * This defines the renderable shape of objects such as triangles, squares, etc. + * The Shape is defined via a list of vertices (x,y coordinates -> x,y) + * SpaceSpiel can read these vertices in the renderObject method and render the object. + * @author vanitas + * + */ +public class Shape +{ + //Lists containing the vertices' x and y coordinates + private ArrayList x; + private ArrayList y; + private float size; + //the color of the shape + private float[] color; + + //Template IDs + public static final int S_SHIP = 0001; + public static final int S_TURRET = 0002; + public static final int S_ITEM = 0003; + public static final int S_METROID = 0004; + public static final int S_BULLET = 0005; + public static final int S_BUTTON = 0006; + public static final int S_MENU = 0007; + + + /** + * Constructor + */ + public Shape() + { + //Initialize + x = new ArrayList(); + y = new ArrayList(); + color = new float[]{1.0f,0.2f,0.2f}; + } + /** + * Second constructor (Creates an Object from a template) + * @param blueprint id of the template to create + */ + public Shape(int blueprint) + { + //Initialize + x = new ArrayList(); + y = new ArrayList(); + //Fill with data + this.createFromBlueprint(blueprint); + } + /** + * Create a shape from a template + * @param b id of the template + */ + public void createFromBlueprint(int b) + { + switch(b) + { + case S_SHIP: + { //Create the shape of a ship + x.add(0f); y.add(20f); //Spitze + x.add(10f); y.add(-10f); //rechts hinten + x.add(-10f); y.add(-10f); //links hinten + this.setColor(1f, 0.2f, 0.2f); + break; + } + case S_TURRET: + { //Create the shape of a Turret + x.add(-1f); y.add(10f); //Spitze + x.add(1f); y.add(10f); + x.add(5f); y.add(-5f); //rechts hinten + x.add(-5f); y.add(-5f); //links hinten + this.setColor(0.2f, 0.2f, 0.2f); + break; + } + case S_BULLET: + { + //Create a bullet + this.add(2.5f, 7.5f); + this.add(-2.5f, 7.5f); + this.add(-2.5f, -7.5f); + this.add(2.5f, -7.5f); + this.setColor(1f, 1f, 0f); + break; + } + case S_MENU: + { + this.add(SpaceSpiel.frameSizeX/2, SpaceSpiel.frameSizeY/2); + this.add(-SpaceSpiel.frameSizeX/2, SpaceSpiel.frameSizeY/2); + this.add(-SpaceSpiel.frameSizeX/2, -SpaceSpiel.frameSizeY/2); + this.add(SpaceSpiel.frameSizeX/2, -SpaceSpiel.frameSizeY/2); + this.setColor(0f, 0f, 0f); + break; + } + case S_BUTTON: //TODO: Mit dem Uhrzeigersinn + { + //create a Button + this.add(100f, 15f); + this.add(-0f, 15f); + this.add(-0f, -15f); + this.add(100f, -15f); + this.setColor(1f, 1f, 1f); + break; + } + case S_METROID: + { + this.add(4f, 7f); + this.add(8f,0f); + this.add(4f,-7f); + this.add(-4f,-7f); + this.add(-8f,0f); + this.add(-4f,7f); + this.setColor(0.15f, 0.15f, 0.15f); + break; + } + default: + this.setColor(0.2f, 0.2f, 0.2f); + //TODO: Add shape of multiple ammunition types and items + } + } + + /** + * Add a new vertex to the shape + * @param nx + * @param ny + */ + public void add(float nx, float ny) + { + this.x.add(nx); + this.y.add(ny); + } + /** + * Modify the vertex on position pos + * @param pos position of the vertex + * @param nx new x value + * @param ny new y value + */ + public void modify(int pos, float nx, float ny) + { + this.x.set(pos, nx); + this.y.set(pos, ny); + } + + /** + * return the x component of a specific vertex + * @param pos position of the vertex in the list + * @return x component + */ + public float getX(int pos) + { + return x.get(pos); + } + /** + * return the y component of a specific vertex + * @param pos position of the vertex in the list + * @return y component + */ + public float getY(int pos) + { + return y.get(pos); + } + /** + * returns the Length of the x list representative for how many vertices are in the list. + * x.size() and y.size() should be equal all the time. + * @return size of the arrays + */ + public int getLength() + { + return x.size(); + } + /** + * set the color of the shape + * @param r red + * @param g green + * @param b blue + */ + public void setColor(float r, float g, float b) + { + color = new float[3]; + color[0]=r; + color[1]=g; + color[2]=b; + } + + /** + * returns the color of the shape + * @return color + */ + public float[] getColor() + { + //System.out.println(""+color[0]+""+color[1]+""+color[2]); + return color; + } + public void setSize(float s) + { + this.size = s; + } + public float getSize() + { + return this.size; + } +} diff --git a/Game/src/Ship.java b/Game/src/Ship.java new file mode 100644 index 0000000..bf64a47 --- /dev/null +++ b/Game/src/Ship.java @@ -0,0 +1,47 @@ +/** + * A Spaceship that can fly and shoot + * @author vanitas + * + */ +public class Ship extends MovingObject +{ + + float firerate; + float burnout = 1000; + public Ship() + { + super(); + this.setShape(new Shape(Shape.S_SHIP)); + this.getShape().setSize(1f); + this.setMaxSpeed(1); + this.setFirerate(10); + } + public void fire(float delta) + { + while(burnout >= firerate){ + float xOfBullet = (float) (this.getX()+Math.sin(Math.toRadians(this.getRotation()))*(this.getShape().getY(0)+7.5f)); + float yOfBullet = (float) (this.getY()+Math.cos(Math.toRadians(this.getRotation()))*(this.getShape().getY(0)+7.5f)); + Ammunition shot = new Ammunition(this.getRotation(), xOfBullet, yOfBullet, false); //TODO: Place bullet in front of the ship when fired + SpaceSpiel.getMunition().add(shot); + burnout = 0; + } + } + + public void setFirerate(float firerateSec){ + this.firerate = 60/firerateSec; + } + @Override + public void accelerate() + { + super.accelerate(); + burnout++; + } + + @Override + public void processCollision(MovingObject o) + { + System.out.println("Verloren du Lappen"); + } + + +} diff --git a/Game/src/SpaceSpiel.java b/Game/src/SpaceSpiel.java new file mode 100644 index 0000000..a389b2b --- /dev/null +++ b/Game/src/SpaceSpiel.java @@ -0,0 +1,380 @@ + +import java.util.ArrayList; + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GL11; +import org.lwjgl.input.Mouse; + + +/** + * This is the main class of the game. This renders the game, handles input and output etc. + * Important methods: update, renderGL + * @author vanitas + * + */ +public class SpaceSpiel +{ + long lastFrame, lastFPS; //Values to calibrate the framerate etc. + int fps; + public static final int frameSizeX = 800, frameSizeY = 600; //Resolution of the Window + @SuppressWarnings("rawtypes") + private ArrayList objects; //A ArrayList containing th following Lists + private static ArrayList metroids; //A List Containing all the metroids + private ArrayList ships; //A List Containing all the ships etc + private static ArrayList munition; //A List Containing all the active fired projectiles + + private ControlledShip playerShip; //The players ship + + //private Menu menu; //The Menu-Display + //private boolean menuIsActive; //if menu is active this variable is true + private boolean closeRequested = false; + //private Button startbutton; + //private Button exitbutton; + /** + * Constructor + */ + @SuppressWarnings("rawtypes") + public SpaceSpiel() + { + //Initialize the menu and the for this needed variables + //menu = new Menu(); + //menuIsActive = false; + //startbutton = new Button(1 , "START"); + //exitbutton = new Button(2, "EXIT"); + + //Initialize ship and Objects (Add Objects here and dont forget to add them to the ArrayLists as well;) + playerShip = new ControlledShip(); + Turret geschuetz = new Turret(playerShip.getX(),playerShip.getY()); + Metroid m1 = new Metroid(3); + Metroid m2 = new Metroid(3); + Metroid m3 = new Metroid(3); + geschuetz.setParent(playerShip); + + //Initialize ArrayLists + objects = new ArrayList(); + metroids = new ArrayList(); + ships = new ArrayList(); + munition = new ArrayList(); + + //Add Objects to Lists + ships.add(playerShip); + ships.add(geschuetz); + metroids.add(m1); + metroids.add(m2); + metroids.add(m3); + + //Pack Lists together + objects.add(metroids); + objects.add(ships); + objects.add(munition); + } + /** + * This method updates all the objects (moves them, captures keyboard and mouse input etc) + * @param delta + */ + public void update(int delta) + { + //Handle Keyboard KeyPresses + //Gas geben ;) + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) //Arrow up + { + playerShip.setVelocity(1f); //Set the velocity to 1 (Power on) + } + //rotation (Arrow right) + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) + { + playerShip.turnRight(delta); + } + //Arrow left + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) + { + playerShip.turnLeft(delta); + } + //When Arrow up is released, turn down the power. + if(!Keyboard.isKeyDown(Keyboard.KEY_UP)) + { + playerShip.setVelocity(0f); + } + if(Keyboard.isKeyDown(Keyboard.KEY_DOWN)) + { + playerShip.setSpeedX(0); + playerShip.setSpeedY(0); + } + if(Keyboard.isKeyDown(Keyboard.KEY_W)) + { + playerShip.setY(playerShip.getY()+1); + } + if(Keyboard.isKeyDown(Keyboard.KEY_A)) + { + playerShip.setX(playerShip.getX()-1); + } + if(Keyboard.isKeyDown(Keyboard.KEY_D)) + { + playerShip.setX(playerShip.getX()+1); + } + if(Keyboard.isKeyDown(Keyboard.KEY_S)) + { + playerShip.setY(playerShip.getY()-1); + } + //If Spacebar is pressed and shotburnout is over, fire a projectile + if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)) + { + playerShip.fire(delta); + } + //if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) + //{ + // menuIsActive = true; + //} + //if(exitbutton.isClicked() == true) + //{ + // closeRequested = true; + //} + //if(startbutton.isClicked() == true) + //{ + // menuIsActive = false; + // startbutton.setClicked(false); + //} + //Call an update (movements etc.) for every Object in the game + updateObjects(delta); + updateFPS(); // update FPS Counter + } + + /** + * Update (accelerate and move) all the Objects in the ArrayLists + * @param delta + */ + public void updateObjects(float delta) + { + for(int i = 0; i l = objects.get(i); + for(int j = 0; j l = objects.get(i); + for(int j = 0; j 1000) + { + Display.setTitle("The best game in the world. FPS: " + fps); + fps = 0; + lastFPS += 1000; + } + fps++; + } + @SuppressWarnings("rawtypes") + public ArrayList getObjects() + { + return objects; + } + @SuppressWarnings("rawtypes") + public void setObjects(ArrayList objects) + { + this.objects = objects; + } + public static ArrayList getMetroids() + { + return metroids; + } + public void setMetroids(ArrayList metroids) + { + this.metroids = metroids; + } + public ArrayList getShips() + { + return ships; + } + public void setShips(ArrayList ships) + { + this.ships = ships; + } + public static ArrayList getMunition() + { + return munition; + } + @SuppressWarnings("static-access") + public void setMunition(ArrayList munition) + { + this.munition = munition; + } +} diff --git a/Game/src/Turret.java b/Game/src/Turret.java new file mode 100644 index 0000000..9ce0596 --- /dev/null +++ b/Game/src/Turret.java @@ -0,0 +1,31 @@ + +public class Turret extends MovingObject +{ + private MovingObject parent; + private Shape shape; + public Turret(float x, float y) + { + super(); + this.x = x; + this.y = y; + this.setShape(new Shape(Shape.S_TURRET)); // stand vorher S_Geschütz + this.getShape().setSize(1f); + } + public void setParent(MovingObject p) + { + this.parent = p; + } + public MovingObject getParent() + { + return this.parent; + } + @Override + public void move(float delta, boolean keepOnScreen) + { + if(this.parent!=null) + { + this.x = parent.getX(); + this.y = parent.getY(); + } + } +} diff --git a/download all.sh b/download all.sh new file mode 100644 index 0000000..a233bbb --- /dev/null +++ b/download all.sh @@ -0,0 +1,2 @@ +cp /home/vanitas/Dropbox/Informatik/Projekte/Game/src /home/vanitas/Projekt/Game/src + diff --git a/etc/lwjgl-2.9.1/build.xml b/etc/lwjgl-2.9.1/build.xml new file mode 100644 index 0000000..5b0af7c --- /dev/null +++ b/etc/lwjgl-2.9.1/build.xml @@ -0,0 +1,670 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Build aborted by user. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lwjgl.java.windows.version = ${lwjgl.java.windows.version} + lwjgl.native.windows.version = ${lwjgl.native.windows.version} + lwjgl.java.linux.version = ${lwjgl.java.linux.version} + lwjgl.native.linux.version = ${lwjgl.native.linux.version} + lwjgl.java.freebsd.version = ${lwjgl.java.linux.version} + lwjgl.native.freebsd.version = ${lwjgl.native.linux.version} + lwjgl.java.macosx.version = ${lwjgl.java.macosx.version} + lwjgl.native.macosx.version = ${lwjgl.native.macosx.version} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lightweight Java Game Toolkit]]> + Copyright © 2002-2009 lwjgl.org. All Rights Reserved.]]> + + + + + + + + + + + + + + + diff --git a/etc/lwjgl-2.9.1/doc/3rdparty/jinput_license.txt b/etc/lwjgl-2.9.1/doc/3rdparty/jinput_license.txt new file mode 100644 index 0000000..cee4669 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/3rdparty/jinput_license.txt @@ -0,0 +1,32 @@ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/doc/3rdparty/jogl_license.txt b/etc/lwjgl-2.9.1/doc/3rdparty/jogl_license.txt new file mode 100644 index 0000000..db9b933 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/3rdparty/jogl_license.txt @@ -0,0 +1,152 @@ +JOGL is released under the BSD license. The full license terms follow: + + Copyright (c) 2003-2009 Sun Microsystems, Inc. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistribution of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistribution in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + Neither the name of Sun Microsystems, Inc. or the names of + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + This software is provided "AS IS," without a warranty of any kind. ALL + EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + You acknowledge that this software is not designed or intended for use + in the design, construction, operation or maintenance of any nuclear + facility. + +The JOGL source tree contains code ported from the OpenGL sample +implementation by Silicon Graphics, Inc. This code is licensed under +the SGI Free Software License B (Sun is redistributing the modified code +under a slightly modified, alternative license, which is described two +paragraphs below after "NOTE:"): + + License Applicability. Except to the extent portions of this file are + made subject to an alternative license as permitted in the SGI Free + Software License B, Version 1.1 (the "License"), the contents of this + file are subject only to the provisions of the License. You may not use + this file except in compliance with the License. You may obtain a copy + of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 + Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: + + http://oss.sgi.com/projects/FreeB + + Note that, as provided in the License, the Software is distributed on an + "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS + DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND + CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A + PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + + NOTE: The Original Code (as defined below) has been licensed to Sun + Microsystems, Inc. ("Sun") under the SGI Free Software License B + (Version 1.1), shown above ("SGI License"). Pursuant to Section + 3.2(3) of the SGI License, Sun is distributing the Covered Code to + you under an alternative license ("Alternative License"). This + Alternative License includes all of the provisions of the SGI License + except that Section 2.2 and 11 are omitted. Any differences between + the Alternative License and the SGI License are offered solely by Sun + and not by SGI. + + Original Code. The Original Code is: OpenGL Sample Implementation, + Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, + Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. + Copyright in any portions created by third parties is as indicated + elsewhere herein. All Rights Reserved. + + Additional Notice Provisions: The application programming interfaces + established by SGI in conjunction with the Original Code are The + OpenGL(R) Graphics System: A Specification (Version 1.2.1), released + April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version + 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X + Window System(R) (Version 1.3), released October 19, 1998. This software + was created using the OpenGL(R) version 1.2.1 Sample Implementation + published by SGI, but has not been independently verified as being + compliant with the OpenGL(R) version 1.2.1 Specification. + + +The JOGL source tree contains code from the LWJGL project which is +similarly covered by the BSD license: + + Copyright (c) 2002-2004 LWJGL Project + 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. + + * Neither the name of 'LWJGL' nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The JOGL source tree also contains a Java port of Brian Paul's Tile +Rendering library, used with permission of the author under the BSD +license instead of the original LGPL: + + Copyright (c) 1997-2005 Brian Paul. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistribution of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistribution in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + Neither the name of Brian Paul or the names of contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + This software is provided "AS IS," without a warranty of any + kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY + EXCLUDED. THE COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT BE + LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, + MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO + EVENT WILL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY + LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + INABILITY TO USE THIS SOFTWARE, EVEN IF THE COPYRIGHT HOLDERS OR + CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/etc/lwjgl-2.9.1/doc/3rdparty/lzma_license.txt b/etc/lwjgl-2.9.1/doc/3rdparty/lzma_license.txt new file mode 100644 index 0000000..d825219 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/3rdparty/lzma_license.txt @@ -0,0 +1,15 @@ +LZMA# SDK is licensed under two licenses: + +1) GNU Lesser General Public License (GNU LGPL) +2) Common Public License (CPL) + +It means that you can select one of these two licenses and +follow rules of that license. + +SPECIAL EXCEPTION +Igor Pavlov, as the author of this code, expressly permits you +to statically or dynamically link your code (or bind by name) +to the files from LZMA# SDK without subjecting your linked +code to the terms of the CPL or GNU LGPL. +Any modifications or additions to files from LZMA# SDK, however, +are subject to the GNU LGPL or CPL terms. \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/doc/3rdparty/openal_license.txt b/etc/lwjgl-2.9.1/doc/3rdparty/openal_license.txt new file mode 100644 index 0000000..339560d --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/3rdparty/openal_license.txt @@ -0,0 +1,437 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/etc/lwjgl-2.9.1/doc/CREDITS b/etc/lwjgl-2.9.1/doc/CREDITS new file mode 100644 index 0000000..d03bbf5 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/CREDITS @@ -0,0 +1,38 @@ +The following people have helped to make this project what it is today: + - Caspian Rychlik-Prince + - Brian Matzon + - Elias Naur + - Ioannis Tsakpinis + - Niels J�rgensen + - Tristan Campbell + - Gregory Pierce + - Luke Holden + - Mark Bernard + - Erik Duijs + - Jos Hirth + - Kevin Glass + - Atsuya Takagi + - kappaOne + - Simon Felix + - Ryan McNally + - Ciardhubh + - Jens von Pilgrim + - Ruben Garat + - Pelle Johnsen + - Jae Kwon + +additional credits goes to: + - Joseph I. Valenzuela [OpenAL stuff] + - Lev Povalahev [OpenGL Extensions] + - Endolf [Nightly builds and JInput] + +The LWJGL project includes files from or depends on the following projects: + - OpenGL, SGI - http://opengl.org/ + - OpenAL, Creative Labs - http://openal.org/ + - jinput, Sun - https://jinput.dev.java.net/ + - lzma, p7zip - http://p7zip.sourceforge.net/ + - JOGL, Sun - http://kenai.com/projects/jogl/pages/Home + +Please see the /doc/3rdparty/ directory for licenses. + +All trademarks and registered trademarks are the property of their respective owners. diff --git a/etc/lwjgl-2.9.1/doc/LICENSE b/etc/lwjgl-2.9.1/doc/LICENSE new file mode 100644 index 0000000..d277220 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/LICENSE @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2002-2008 Lightweight Java Game Library Project + * 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. + * + * * Neither the name of 'Light Weight Java Game Library' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/doc/README b/etc/lwjgl-2.9.1/doc/README new file mode 100644 index 0000000..977ae02 --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/README @@ -0,0 +1,50 @@ +This is the official readme file for lwjgl. + +Unless otherwise stated, all files distributed or in SVN are covered by +the license as stated in the LICENSE file. If you have not received this +file, please download it from the cvs server. + +To run some of the included tests: + Extract the archive, and cd into directory + (please substitute ; and \ according to platform) + + java -cp .;res;jar\lwjgl.jar;jar\lwjgl_test.jar;jar\lwjgl_util.jar;jar\jinput.jar; -Djava.library.path=native\ TEST + (this specifies that the jvm should locate the lwjgl native libs in 'native' directory) + + where TEST is some of the following: + + org.lwjgl.test.WindowCreationTest + org.lwjgl.test.SysTest + org.lwjgl.test.DisplayTest + + org.lwjgl.test.input.MouseCreationTest + org.lwjgl.test.input.MouseTest + org.lwjgl.test.input.HWCursorTest + org.lwjgl.test.input.KeyboardTest + org.lwjgl.test.input.TestControllers + + org.lwjgl.test.openal.ALCTest + org.lwjgl.test.openal.OpenALCreationTest + org.lwjgl.test.openal.MovingSoundTest + org.lwjgl.test.openal.PlayTest + org.lwjgl.test.openal.PlayTestMemory + org.lwjgl.test.openal.SourceLimitTest + org.lwjgl.test.openal.PositionTest + org.lwjgl.test.openal.StressTest + org.lwjgl.test.openal.SourceLimitTest + + org.lwjgl.test.opengl.FullScreenWindowedTest + org.lwjgl.test.opengl.PbufferTest + org.lwjgl.test.opengl.VBOIndexTest + org.lwjgl.test.opengl.VBOTest + + org.lwjgl.test.opengl.pbuffers.PbufferTest + + org.lwjgl.test.opengl.shaders.ShadersTest + +You may also run the Space invaders demo by executing: + java -cp .;res;jar\lwjgl.jar;jar\lwjgl_test.jar;jar\lwjgl_util.jar; -Djava.library.path=native\ org.lwjgl.examples.spaceinvaders.Game + +Project Webpage: www.lwjgl.org +Project Forum: forum.lwjgl.org +Project SVN: https://java-game-lib.svn.sourceforge.net/svnroot/java-game-lib diff --git a/etc/lwjgl-2.9.1/doc/lwjgl_hidden_switches.text b/etc/lwjgl-2.9.1/doc/lwjgl_hidden_switches.text new file mode 100644 index 0000000..976a76d --- /dev/null +++ b/etc/lwjgl-2.9.1/doc/lwjgl_hidden_switches.text @@ -0,0 +1,28 @@ +LWJGL "Hidden" switches: + +org.lwjgl.opengl.Display.noinput +Do not initialize any controls when creating the display + +org.lwjgl.opengl.Display.nomouse +Do not create the mouse when creating the display + +org.lwjgl.opengl.Display.nokeyboard +Do not create the keyboard when creating the display + +org.lwjgl.util.Debug +Whether to output debug info + +org.lwjgl.util.NoChecks +Whether to disable runtime function/buffer checks and state tracking. + +org.lwjgl.opengl.Display.allowSoftwareOpenGL +Whether to allow creation of a software only opengl context + +org.lwjgl.opengl.Window.undecorated +Whether to create an undecorated window (no title bar) + +org.lwjgl.input.Mouse.allowNegativeMouseCoords +Usually mouse is clamped to 0,0 - setting this to true will cause you to get negative values if dragging outside and below or left of window + +org.lwjgl.opengl.Display.enableHighDPI +Enable high DPI mode where available \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/jar/AppleJavaExtensions.jar b/etc/lwjgl-2.9.1/jar/AppleJavaExtensions.jar new file mode 100644 index 0000000000000000000000000000000000000000..160d62b669d18bc8d67a67df9e2d4b1bed8c544c GIT binary patch literal 4189 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%0AFLWcgy*J>J{L`J#FF;L<+a^D49@vzUdS)d@z$ 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

(WeDc5#Q&pXucgG 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lwjgl-debug.jar b/etc/lwjgl-2.9.1/jar/lwjgl-debug.jar new file mode 100644 index 0000000000000000000000000000000000000000..c2dfecb4af9f36d87edcaf6b1cdac394edb662f7 GIT binary patch literal 1030793 zcmb5S1CXTAvNhVaZQHhO+ts#h+wN)Gwr!i!p4RlV%{S+st8@SN-xqI3?1+k}Rr}ld z<*Jn{Q%M#S3CrsZVm85ZGX>1pO>=9^WRR#^9cInRiqIMGST z%}J>PMFW%5Kg4===ESI=%BrZk=F$jX%s#>$!q2*;z{R4meZ-)oxTv7#+{eJ&#h}Or zzOj3C2CJgFsHoPU$wbSjdUbks{^!krfS~_J5MY0A=HP6>_#b!wKg0YR{J$Y=J*+Kk z{~PWfG5-DPKNr&9PyaaSpExUfM>p61hW?)~5BXov4vuE_fd78@|2N#^zr+7$ROtW5 z>3`t>N2~u|7y56}{xhSh%e`k&&_F6I+0bOKpaY ztC}YI_%~&J796NFMZzR1gE$df0u)wadGgH|(LVxcNB06P2e3Ok2ZOl=zKf9c)O;ty zB5QObPJ~-tEAidFT!Y1^9n&%0UTYaWT<4@*kL8{WkIy%97uSyf=I3%ht)Wjp1K-V% z`WK=D4932xPi(@z@OQ5VH%5Y+!y3%Jo5O56&xII=#^U#0&xr`8zCVM*I|1V%*UsOO zkO|J;{D^(?pNM=|zrJ!HPdmR0F%xdX8JRAfo?K!_6&+oYvSoMpCTCT5J|eRTUG7os z{ikM^3HXi%=fS4ZtDV#hsg-tkY_f%-r z+#5L+SqjJ8#8Hv-K~~3h;?A{fV~XG_owPNJz#RVU(h??aA6ggH9wpXgBBVEZIT>~t z7Obf=F6`T5nadU~eK!bs<@D6bmmD2eu!;0CAhm3U9d*qb#$_8{!gQnF0%wcYR!bCg zu3|LFnQax8`ZZoJwb= zzE^3}0=ZY2gB4GhXkx9_)R%3?A}Ry(NdQgQidLa2CnwTQXP%5&3MOmVuAj?sh^``2zl z`)#~X_BKQ9^rT(8+Mo-D1RVb0LQ>gh_l}@H-XKDk%#MJ}+D|Fqsc#BxmlXWWX=shO zji9z1qo2xEn016?vEg z>64QsL)W35_Fwm6Ymj2=5@E#}%hjaWCLbtJ2^N>DsAZ7~9qa)l^96D4W2XM<>Iqo@ zs0{A4>`qqLt`RkFeD|Pld12%X6DZpPL)c2pm5lH?VLp)%65EnBN&W^Pa<&5;oYz_D zjnD*T!}!^=Mj*hCVV97EqBF88$_zrmuqaHW9b78zh$UI>V>0ia5P~&-I&u8;?FM1n zK@HGu_-*=2iXXFGlMrppXgK29(ynNEDRR$G5L5Gm8IspR>^zIX>>O{VzIeSDei7pR z3Fa9}{SyU@R0hH?(6qW6lh`YvIurBMsc~pgNybi3{Q&Q|38f2z1eOVf#Jd*{StbQoVv{MNQ(|h7Rz46Xg32}_b{qu*CF!!`s zhHl{gsV^|Mka!;zgPIEtx9i%AmFzF-g%)&{1MpoLcix27NX^1FlcNQ|>dlkuX2QSW zE#YfB-%>|wosO(s8>nTDTHGA?`R3ztA=l1j`gN>v?D*eLwZacj=?(X zvg}OS@9;+YP&y@WcRGdnv0S!ctXR@jFg&pJ6vkwc z%RA{VQLF6}RG~a?O~j=dQ9CM^Jx7SI)iiY{D`OHp<_)h5s268SWPc4%l|h;>bVNb2 zvWBe97-7ImAR9l&f95dvtYw*Q%>x(H)Q$)j(=>hqroR=Yzva5WH_N`c-M_Em2^zS6 zSb@h&VoN^EG~hkz#FuU3&zebM)?c0oXJ?;lpn0XbxV(HHoB$%SamPBSPsi2UGBL56 ztz$zgj)#l7M{%ur61?WrJagVCD`E|s7Hyg$R8mR_3mrBKVxa7T=@ldLL~xJt#c-1Z zwR#Te;*)LrsIwKDz{$zB6`R7!Y>6iY)MT3U$!s{y{*dV&6KiLh#>j6PC;Mfdwx-xd zQR|8{mGU`M@q13sm}&_`qid|3txugCL^N&h$YlfNg+zSiR1e%g{03(`5SJ?!oYJ{P z*}7rDI70WP?U8AJvvF-VCJcx!vEy0wpkmw`h3>Hkz0iS?K?grn z9sA_r=haEZx0{GRzNE^f(9d)Bes{(hr+DqS^eyqw zkNQa{_FW#*N0}hNBG9`m{f)W!E&uS1^yvrL%b4Kr>icF5slV`UfCdPrk_e-6TZs7k z>jXu^qY|Ge0|i&Y#ZLrpk^}+02C$jQ)WFtw6e1cXX|*C9Fg$Xi3o77A+s+-!MNkMo zl{4e;-nq%TFvFEX88Ev`p*9H!+sk21<9d%K+^C;om*$Y~;mo$eh~RDSm*4+seWCu% z`byl+a0P$^0ktCl0pb3?SU7c8E8Bl}aDM6UE-Pwie{d(da9Qh_hmclA2pkFXuiehUXhWCLdt4NN!U&jvSHX*0gnmJe4LY46q~rb z%h^8H+@~({dE@e5ug@oTK))T;halu+wPH2N&oTk5qC?)9wi-smHnt5LN~R&R;mM&P zTx7-?BLHMcu^xs)cw~oYPuY=elHH`lAy?2{v-x6M&jk2uSt(Lf#`ScfD_g z=RLdIhCg!DYJ1ztFyFyiMlDg(+vr_hDd_>6J91UhNXt6%slvSmW| z1dz|$yWV(bQNUYl7qFRbrYDMKTQ^Ls!)rDCFImi0W<`W#B>s4<5-hA@uQrTRje$0U zFBfzMnvP|_YIbK28D`MSFC|naL0gh7ogJGhlOMg+cyzgnwa!?(cAT57lAD5;kR^wr%PKEr0R_&v4=e#c+}<;+}n8&ZKmk0Fw+HV% z?Q=HwcrhgDV(l!2)8+-kk3CH91z-6dT1N(A;o*Mg@t*nWZ z{5*GV-#S$~4EUYFtXt>oq8TAWMRvETZ-lJvi@_M;OOp6)QzR{m|Ij>(yNTKuqis4U zIR9v`0yXw(h-CBf1z4+5bJ1^C=4JRI?Kue>qPF7nBh8e;jjh4EDt^?iz+69?(vEYQ znyH&(<@P7zQY@*BCAnjIdRp-Sl;x}n*e+@6Hxw+#jlCZu_vLH@un!ooSQROO34?QX z8qtHnXA@$EW9N~y8CMdeN=k7#fvW~gevc{$W_HkzVGlpqzU%!%?7DPo3T@D(Nk{Jk z>q5mU-lNo+Vt(izKX40O2T920DxZN4PApq2dcV;a2S`I*q7*ox)_R{)FR<>qfDT<> z;({kEXkFXd4-~Ua)q!vnC*;LlR^7yMCUc~)yD=Cof?S*+cN2)%-V*<4fKT9#9B=$7 zYI}pEVqxnJeCxFm0UaU`tVaA`B8esphx+6Q&C9GL8rdBh&U65j!4yep4fV)S$SgPE z1g&UHH3dm6$J7xD;6wi%8$|S%5J$=KAP0hKcNAdc+@Ka?3sP zyKb@Mm54Qa*$rcneUJFJq!cb(v_>bO!xlxJa!v9bbcAn!Ld5#Dp6@Cylm zCN|NZycr{YIPzB>6nMvGEl1IaSro_qh+csaz6G&*$YDJ)6NaJ_r~JpTe8(~*W>`(* zS&oVQ$amgQuSF5QQ4xCT5&~FZA0deW;fahs6PlhAt71CCi8i^=kgu4;4&jN>5i@s* zzo#Z5iW1wQy(mL-fWV^sa2J|^Qzn-C0;$JU-Vy&}Ao0)EyHsA~wF(#rXbl7ii0WT- zTg=QH;AZQp>g6JB=V)tYXJ+pTaJ6!<|7RN>rYx_xErgbn!Ic@VLc9_rQ`Oh8@z{8C6b5iv43qYg676>!!XS6-92uahRKzP8&euvItUjx< zttf8+AE4GXFFl@Doq1D;o;9#6_!jgOf6SR=x&4LB35ltLU}_nruG}G+30J}|VC7yC zl{LY`0nM28iBh>Bv#in2<;s`-B=sge@cL-)T|pzOuqyPUo+aMZ_`54X+n3?+XD+B2 zYmuy@3w-vr;vzAj(OsQZ=W9Tc|UyjGUss z$~ipU*Y5yMRSR&2G3e^=euAL~lj?bY!>5;H*n~dhkY>0Diz(3KsJ{IS-dl!RJ_%#G z+P%QKPO5^L-&ztJOoKLNR7N>qkr9EFaOEyJ!fE}e28HPn_RcaFPS#X<{L>G4raZ%P zbr#GSKAd-;=+PPTIopakVTH@YJtuY4b4T*w4vmTAebZ_&0spN||6{P!hGk?x@^?1X z|99?2{xA8KVNn(Tza%?OV_OAR5{VyFgf@Njz*r>sNDInDc4y7WHWt`WC=e8RUo6n% zlqVU&3eZ}8Sx5IycnA6#%tvl^3QQ}lJ~jVUq2{eoElZ3ng3iy%U*4_w{4jIzQ!wBQ zejinfM#4$7bWug|1R-j352^R%leTMyj!jB&yY* z#-tcA;U)_$8>WrqMNe2}kVDjSvjOf}K-7cJX#h!Pi+k|KV5(t6p)(VCj$l5s1Y2fP z+n&I2Jn^>>_8m<4G*ezvZjZf2{9Rd}8*6W#|G7PeY#9~I^idu_R~Amjz|%)U`6Z|g z%e#XbFX6zO&ut{%<>#@6fuc`5;8(^Ldom8`c2aunBc`@8OwY4txTeXbxlCcqkegRt z8#_r7Tb#<+i9-B=G2bHeUbdacm<^D@?E_x9DV}|2#LyzH0aX2JYip4n|FCI2xVVP( z76Y$#BS0#-azk8g&;;I)sPI6x1UsBpEd=o3s!(kr{#3j4Me0_57^NCcbHRxwUK6W{5;frHMJQN% zVboVdDjl@lbb=!GaoT2*-|Qzvc@puU9TDBz+d08-gH8L*;#9p^YWwavI%Nk1ppd`n z;?;A%1FzDZM&Q0!m}znw?omU*XkE6Y6w0RIsxMW2`8ks`;r$(z;OXAGFgy!VnrF)| z^T!8*`I5tKt9#{wLwjFA=R*raL*vC(Qg^zs^*7;~iM{eri2Y!l?YjN)k3m1f>09%D z%0I@FZ53Uze_FOt_fiKTaK?Pv>HbJ>Jx-QAo90uK42vc2SVuy1*mBoF^`JEU%K& zsNQNROqOi8&l!R+X~h~yZ)}`xX_FWSYaUtWDy-`4?J>1>*BIA&Bc2pv<4a6On%qF# z1HI6YsqG$fNO4aHJ36Pp;|c5n`mJhVW5!hx{j=Ur5%7SLqLag{1KcjPOZ>;KB9qb_ zwj;jV|C0KyUS$ilBibID+KAX9rQ_s12KDVnzBpb~;HE=M`pYT}L(amu=Z{hL6~wE#D4U2d7(fX2sR41f=_OihE7}Sm`^xQ#{eoV}7a!*+N3ZGb{p?4|b6n zls&TAHQXKast2^PNlC#2b0%4VvS8nmy;TYI(~qs+-yr{0RQ@qBM$bBw$@yDUut0%; z2>wN6I z=&0%}W8AjtC3V~Y`%)dr5gQAtEaQ4_r$y5@bcELGmI^WaT-e<;)fTN}bt`sq*?-Qd1Xu^b4 zoI{bQpkkI^RDi|kPHaFb`(vd53NP^$Ni~(+heFPTB6!K&Pbe$rQXZ|n8w-~#wepmV z#MGxwAgGz!wCKQfLZBKV&R&So{@S$=eu!p8EzamQ?+3IQyH|e{J&qEwBIR@yM9}=?~&mH|>{&(D+kk z|SFs)B_W)WD`d5ht7^uEgfB;{Gi7108w@1qXZXgT7FW~-kZUvn2yf|jRI5r;&;mC6%~H;p!^Oh>LGV!`k#N3hOxi`-dQ)z7ZV*5jiz z?Mw7w5_rm-JtEPOMUa>Sg*=MM)VYf=#&Z)_+n0b)`tHGtjQf2)G``ay16rjq?r75B zrd!`ezTRo>yzo?4cKGjJyT!y^|?*cs}F1GuwI9d5@tuSk;)CB^_9#`A_HR(PS!tb5xrT=cBxC0z8PpPj(pd<<}7F&%7?`eW#Ha6QZO zP@gj&!2il8C&LrT!@oM=_P_9n<)3`=Q`!E@CnWytY}ECZ^EhYvcBN#sA*EXh^~x$L z5bO#xOG4Ul?M__o-`2g*QvpPMpk(%kL5TasNX_x!#ElJR*O!~ztQO`^r}fu@Kzt+a z@Me1L%7bNbxE)r@Pw8RX7*|@BOmqn!6;5@BE_DwtYHy%(4Tq1PN!Jp6a6jWUM8XrW zX}U#VddC}fa|G@2SyK@X36e7Sh+n4<3Z_?W`f*DS4hItA{m5qoKxNQjsjZ~r&kA{22wp(zz zUd1!N?HjEq_{b|*71#)w=t`0(Z*KyxG{PvXgI0f+>2w8&zuD4da;H2(fqO$+IRrr1 z1c)Dy{(?=N7J%~LR#OU`g)e%u-;b?uF%rS?W&Z^(%@J+{faaQIhhz$0LaU;LGt{l7D% z|C`jX{=3wuSt+6_qw&|%}Upoi_#hS2(YQ#w4u|&jw;<3nmo<$at_LgHlmQ?D#9v4-1U$Ke$j9zz@ z)t+_?FX+a|WZ;F`C26Ue();DJx*80a@kwfV1%p|HlJ{_jZ(8a%$a?;^GR}qz66ci^ z-dY|yWQ2X!zUoPITed(l)Y0ULq^6k&yOgZOd z)L5?P2O!9+l=+t%F^d&7N|?1=LeXYmXiIt^U_&qn;q{p~56jj$IjqkivpE*{bi-ZT zL52`|4z=llFSm~T-sFFaoGFZ*(CyN6q&k1}7TP>?F5ZW_X6ihMEMoG?JFU8e4ac*% zNXa90XE(vb3#o_lqOe=_9w*D3bKYc;+a`D9_5x?cF=s9>#0S9RpRFu}MTXn+k-N^? zF^AfiSZ9t02V3A^G(IHs>&1tg)mU}}WyAf1zYYSt2-2FLy~!FrCba@HiYn&$;JPx> z#`gvY+pss)iXk+?x^$9-`U0wiHCK#awpptqh__D%uN^$z6sB;G!!9T9C7*nk9pJgMK~#BY{}x zZN&~r2*M_L7{%J~GJ)-TyU6--WQfc~+>PkR20@H_hx%q!JIT%rzt3ZukxT|f-YI~h z(4;t`ILMO?vWL8L=OH|qQ_P(Ul|!0Jl#p#)44{l`m_M^H zOf)Vptq3tYky(Kf#~-1O&MUgMU*3)2HAPG`qv{db?M}-{Hcfiv7@aS~H&j+q4eOE- zJ?cgA$68#%6YV*cH3D0=BuDH*zq9%R{nx+9O&Zqr>tFRu`(MvrDIupihHs6P@UU5~5d;t;29`ygC)Lmm7JoCy)ottGbiRtzhcNP(R zSgv^3XGc>n!k?8xB_aU}#ztk@GZ)au(yEY!mI5-7!rLyk+RfN4 zTiF=oR&7g-Vtz=kagA&c6~CfFcBlvGR(QqTaa&bDQ zvC)G)H7v|Z_bF%{zR9ddrc8Ax*k&d0O?4)4uHR~wOQ0OML|N1vCyJjM`KKKYcJjfr-JeMq zvzehM1n3MFzLL$nvWIhXh~lK*X>!~a$u4AnDt>B=PUu{sbSMoN!N%|=4Y>44 zVic{fPfI*73EwJ96mejt^Dtli2^v17z(;oHt0>i%PXOQH{R^>ZMj!8GF{nN?$)%wP zQG5sp!b0({bt4g!<|3x;)e19sut$?HxSnnPxobmT^h7#UP@`fs)eK@M-w>&bF3Q(b8r-V=o$FS-F+=tt`3n?!};>TbfpzM>ER=x>)` zL%}1?_Ne}x``#QwH^E{S`8+s-*$_=f;%1$}(aWCDX>4zB&Bdu?Q&XF~xBpRX4|(3G zApcg|s{e%;9RHITaZb49t^jH?*u)N{VOjEjV+M>2@Ly)oj${8DGqC@`3~S)q0mvJ| z$bO+6X?iH>Q1ba5?&q1TZoluxN8CWko4;efaBcgo2FK|!yA@lW-A2dtA%0l5@C%|y zn{gWM6PbLxiTy~{nRf3%qMIWj34dK$;$liTbkWPd8jSNBv)ZA&7T4P@82E?Lk9i!E0+O%v8bSBM{2DZL_vTvx%h)DK4pKnx?c|l_ zl6>QnOIx7)q9unQp%}e#uMj8UEaz(#uX5*=R-ed+PMO-tXIh8Pmbp<2cUmf+x^(i( zbfss*^VD)t3jebYf(O~$;cyTX;s(kH$U@2f!5P9!z&3pGU2NXLB_1P#=Jc77{cBh$ ze`~Q)d~RL7yc(6E3d+g?lCNa3xuThMqO)!iyC8R|%xZR7Foye1W5PRj2dUE2#=>ZK z3fpV{Jae$H%8UhfghODQmpo1NxUb*_Aa`^c8SYYd zV4pHpDmPsI^Cfzh5^bC@0YYg8glhjT(G6TP;vJ?Aeo#)~hnoi`8}2crtZ8cg*~AfH8~{962uBrMs9 zh>Z~KJu5T3=E=mPft+jlxW+FpJQ`Zwfi>UjH=Ww>kZGa983hm01rE53Z(pyv^D)=6 zX$^EMp@zp%=A+mo+ppAxw>Cz1WdjAvZ)rAYFwjw@EF}?cNeG&2yP?VY5D}9>jz5_H zs;5LWImAJK-6^a*5D@nNIp_FCKm5;7XZfIA(bkjHi;E?TA)C@ir*a}!4tIOhBeyR-GL z?cG!4Il4DVZ#6!z@3UmBCX}30hctPV0481j%_^D>f@V>J|h3XGt4mxk()WpkNQZl8^z1xjS8TU zU0?vz!BZTf;qFGMlINI*NOS!RXLY0?{I%(r?(dor+HA)Je@~u63J8KXKh(=(osafl z?SGcy+JkuQ7>Ev&I}yRH8784+XgV~8&e$*#m`iKefC%eQ8#3ddI=n}LmbGgDo7STG zMcsiX=rD@TQ8SRHp=UO_%Apl&Q`4~){@anixlMQ|jzcR-y3&(zHzPXDQ}COMyyg(S z+Do{1C&H^@q2>-Hm#ED7=PmAme&7oS(+SeI!uIisfkS zj(xK+s)v31A%ei3)hJ}`3sSYh8B2SFY9pKRjB1|8?==y~}5AW!LAVd#_1}p);itf-$)5u57s@F)2m__c%G1E0`e%Zr{cvtwyJ8cf#v7_(g2Qo3?IGJsJERlfuOq!o+ zoT9ZaH(SYw51iiF{s>{JKs7h9m9UsG519N>8Y4>+13NuUgE?o&-S2E|u)NZP^|@Tm zE}t(!7yWf;T~EoTgmmEKRZh1-poGD;wno#(odg<}B@G*cQKKWrqMeYa*HKd8s0|*x zN*415qeq}=L?9xvHnIv86}F2L2Bv;^M`afGs2=T5+B{Xuw7zRy?$f$_dgxNj%B*yH z$I5K5S4Mqhm(AH(9{H#Vu4hj&cJahxlZg=;rLAAe!Hj@-Ml!=b7nl<1Ov|>ZqAsq{ zAPr6D!3)}IVAxxbo|=QPsCiOD84Y13A6rU5pmkVv$L+VB!3*jpc7KNj=C(~rR~L#! zfef4vGU;L{nL3M9wy{Z6WNXk?m<=REto^A?!lI{OEI) zrS`K8(+SoXS0-|D3&v~DBl1ZIQ@c-lBulFnEP0ZE`z6u+IiHmRm3dU3R9oYZkGA`l zVB59P0;(}g&tCgcX<%YfjJ@Byh>TBQ6~tu}4@49uM70^{CZQsnqG=X~T<}vPGS#-erz|KKc_Dy1Z`KzW>G?#^P_=!N_jw4K6u_pD$;~_E^ z0y0N{Bt})ug0IPlTn&4pyDlyflfRlM+}cDkEEQ&*0wys|;4V*aj7}QT0c6QZXTI=qkN?+?P4HR+&3!D zUz8Km4v-dZ97-gigmu#-4i_!XwK+a@XC`izR{9Gz1`{2#wxG&FBsK_KpKNZ(=F^3` zBLnS0`*$VqHA<=U^*)m}9;=itY}HSR)r`x>-(e}WL)&N78j-xCH6&T5dU*`P%v=md zsta@n%PayR^HUv!`6)Mnv5>cku@Sdk*zrRK*t?E$8$3} z4#njZf~sSfH<7W7L)h5rQY= zk=C(Te8C8D$&)wpt1$`VJ4TaY%b_^&hL>6T!t1ABAaaP++1}6%8PH`}lFv+S$J!s% zyRr7v)`BSxu(9V4xlJA`qD9BNXH z@Vd&F6>H^I&~+&C2tJ~hHT5O$h|FHJ(Csz|AP-z6JkbFkB$P>7DcCpWU6ne?6roQ=$@cYK9bZH*W)DmXRF~)u9&`n}`Q}1f= zDE*Yq+W3*bkG8XTl9FPF5l5TakumoYFAE~cX9`dr!+jyg76{wRdVqP?JA7DIc1*gN zX7LCA`+7~V`=`QR*~tuLf1{R^ud;tYe z9VD23FcV}PuuhGm;rWvsDQ?cO`b=TCk~&(X#0nM-AYNxzM)G*Q~c>v>g11P{ZjCjqH$7O+ZD)d}}y1tCjyvRKi$IxssxD6Y>-8R`-t^ zu-we{7H~==`~~qJtUhRs>UbDLtF^Uh|o%;eDZQbjkmY)g1Z9&qA8S$@%=?~ z(`-%ZLLW@7I=qU?oLW`e-B%{}D?fvyDXHW}WT+q}FW%vF8hUzm9P3MEGu)fiEVv|* ztK_vd$uX|2AAxMVxN{9*Ux{x6q98}XNgJ#jV4xnS9Z?h}9ib48DuOtLm;Zp1wkg&5 zhmGK=A*$Au5FM26JduU*Ju;EIvQGRdKoUAnL+ej~Yp@vm?hiU>F%^7oU2oa<=7*LH zzq$&DS?RUrwLsz*{b~F3C3u_?gnvqx!DWqWhIOdv7ojHOt!hY`>m1HsMJWsT86lo0 zINv!@+&A?q`+Q%ga-$r6;`^3o0QEU~P!YJlQmNXy-{Eu=ONtyN&Y_AnDy61IhO&@K zE9RXIn5efNqF`}!2=Uz6-GVzXlU$Zp<`##poibUgb&(Bo<5!A4*n8s2IQ{~o5y*_E>r(xz+bL-l9rLV z;2j>il3#TX`sq5qfaiyZRC?he!Po!OXkn?OZ_>-TJc(a{X{SpVwmlwJVwTB<@~7*F z(I%CdJuhF`-pAb9FYlxcfz@f2X31~%udC@uRNSrZsTK7Yt zQD?@{$MjX9W_XeBfd^vX#_)SG(=#)%#wgevc3($Z@%?jdRT#Zk?Qcx5f;;^11pPl| zWeozX0Ylorg)&lp2|;i3P*B-L2LTu2;gPz-1bk*OZ_!U;j9Ki}XLC2nfqk!OZ&;#O z+B1-5m6es@gtkAs(oXaM1&j0`hq_j<>PToj8I|uV2&~7W)0M9Wa7e?{t4DBt&lFSo zKH^_pBn9u3E6gMNR%J?65K63aoWSfCmy;O<#P1o6enRHU zbzduH$Nd4_)8>i_DiL_QH$S`lA>kekzJx1~F;a*}9?&$Z=?q*CCKAaoy(eYh_IY1I zi%6oQ#K0>;t36xX&m3-oOp*X?Ai+d_Y%j#sZOVQA)?n5y{%y=xi9tAn_L!qY&u8X` z;Mcr?2})E-g-c#$(Fg?i_h{(D^FM#gw|ya(Z90Su0$Q_wn=>#+SDQ_zW0zVerk*(% z$}#n5hc<1GR(G(oGCyOC*ldT8sPvE56ONjU()MOrr8*zRNz7oXULc1@Vvo_*Z`T?l zzdGO$EbpaUgvk@Dr`sKxIpYcvT|W+APlE(ovxaoIkV8F7PH2U;ZC@?dGd%>oR;wK; z!F$%f@k!oHRJkYJVtr7lqe!y*lX}Z0pm}@0dNkKci56yW^$i(({(R2SZzK%Horjr~ z$*dZ<5*4vvx;mSYVrVkYZ`vr4PHDM8{niERqV{F{C>873E4@I~6a7(-EaCy#+fEm* z#7r%dS%Lf8vv&Nb(~UsXs1JUt8nS(Nrx~Z7XtjNU?`6_Cr%R9_Q#?euEfVrw*-f|%#l=&Xm(Z@td_P8_ukQeYrdJ@s)n^S(^PkSc0RbNo5UC+hZ zh$6vgk19rM*Xz@@{ynDLK{#;Z3p>ZA-C(%+VL+(x!8PG)cH>T%jQSA;b|3tnFxJw! zPF8z^LgnsZ#(_9jFp<}1=bJgGRovHOd92{6mo)j?df^gDei2=TmJ~mFT;3f_=!iN2 zrhY>@PxUKqTPxHgY;K<&1LDyB&9e!cUyMtN%JKaz=f#uy8)RwL2|}{(*BRsAu0q)` zCtcG{qY4zN*ym*?gUXRMPyWNqVnoyLO@W+XI$Nd6FPgO=)Pso_4&KjW+sr}L*)4aO zGhaiYggNXaB7Jcf2?YnoDw4F?Q<#tMT;UsLR9p4R$$^s+elohdqPbA`c7;gpYSkb4 zs9NVsiEE#|pZtoj*CX80b#29UE2>ad{c^HkM_(T)C9O4X;-pQiK&bMf;r2y74~92CaQ^xqjBG5Mo+RGb8GTOXzIk{* zqRM~@+|s%Q?;hpi4N(bEJes*TC|x3WF}+L^96i_ejkcpl+BbpDyD_1Wv_j-elKPv7 z=f*cT<4~6$_!_$shqk64qD5_|wKex%?b!Lh$6G*ER$^a@&J{>BTzxknE&a}w0Xf64iG3l`k$N{*hw z{wX85O%dZ`M#EdAZ>w6&%D&u^**(;Z<_AXgcv1BcjDYFC+C4JS@mYuWe5&Kcv4qcP z_GXBPAqzzK^8v7POG+1(o^%i;hyNSc&W-9{GT*joQ5}!$LMk zt^!U>`?%Kex0y<4r&^%C#v#MesM9qNV?o|Uk3_wU*0x-|EP*0zK13mUvX?f#hl}VP z)OKo1dyLt79mJ)fw&l_%_+|++UeITzI@?7MB{6Axs3rK@P0`3e^@&h+m&_76zJYwP z*9qb80C(>LfX*NhHb8xV51e+1;T0EN`y%ft&p#?7@5|3Wusu0k^F&VHN$2cbzw}1D zXy8IXkxvd8qGNl(g097 z6ir?}UKl+RaIEMi2X4eNxUs>Uk=hu0*$cKxY$6LViJr(M_dPNCHR&_GnWCh7!K`Bw zzs4qNI2!Uw-D9!fjoBjxz?io3mW98A2s#ch#J-v@*qS}s0VdLHv> zQnq%%+1_^0r8WJahbG%0J|e-zBu~&W_rTmYh%Lxgk#N!^e;t4$E?m~7lx;*IhE_^S z{;^b7UPewLrI{4=WVy04nVHn`U9Ee>K=PqfCvZ%0LrG{O)@OVwnBb3L-&bVrYEdpXI_SW zLn!HfE~y`a?;`?vw-0=-O~X}$mq`t;iUFB?o%jL~LebU{&=@a3O*)~(4MkN(RM0;3 zT2A~W2M}1HxWtgxVc4F6sYR$70Q8!1Yfm7XeXy>5_#HS4Cs^NDgBJ<`AVEn&-)R3A zb_gbXTqh!q1E!sLmm6Wd$mb)K9s1aPs*=Ha>LNX&)#ng(SKp*~m5C9W>RLxicGdG5Y|}obPtZ){9wItlJh?!taK%{Skw71-^Kt-_favYM zHdX|r5y({poiD=GNC0%A;4SA3qjc*nf$P0`l&_$N8@jH|Nhp#io z?2)n+K2wVHtWAhEp-}&v!mF>?f^0}VjP|CdWNtjfX^JT|(156xHP4j3soo~BATfeP zhC&zcYswT4QNYh*JRO^OB-#G-4>1>opo5}iT|k{c0?BdD(#d?^4xGvKjIzfvRq~PE zJHIOvH5;04WJV*}fCbdKd<48J8|YfJ2Ir11GWn0eU<&|M9;sDc1n-Sqbi;M>Ez0u- z#B^gWTnFgdq1#5_^{_+_1TQlc7*oPX5@d0hEvi+m)s5RrsG|d#-yRb4??R;+Zz(J! z6nfrCB|+dArtHC$3)X(}nb3Ma*%8(*a*h@iBg@fU;CpRa*ia1^UBJPsLUbo`Ay#)` zCfW;wZ+*3Y4AwG9kd>3gr$1%5Klbc1JR5A3e%sjtf>slQ&kH(LeB5aU$h?tXO;ALF zKhcsZ%ykwUQyml3bPtql!eC@f!;G3kls#9?ssf+a&3>3|?gVL&i21}t17 z*?^QRNo+HjaQrAlXS!*}GRdH^EDV~i3OFfl)C)0F1u;zeFeCK`xza->Y=ERDYE&8Diw}=Xk@0WU7f4dB+Hz*w z^0rGn83)>}0usE9Fcf-HQkDkzFXS)j8mkb)K|xrj?R`TkG+hy4rT!;eo;S_HnmrW8 z{GscI$D5eYh+|;F6JKbm>{_yeIvQz@nd}t=SBD|)F8nn|aQEnhHIhR8aqLd?wNpyo zVME6s1v0T*jeZhantEn6@E5ueM8ECZ_GA zWPnY?6j;?|ayCFgA-op;$^o)GEFGsP|5j0*SB+AsC{);+u(+D}J^9Ygr$()Uf9+#4 zJO{(LB6{bMg-Y$n0I8OtO`OcX;aJ6q3*2;CO{!TgVlo}OVI>(-J-yqg*^J||<#?Du z7MRZ@3zm}JV;FoIq{FroQpalNJ)Hzf2Lrb8nkdOWeDublgbSA%P3p71ytq_t@r(CY zGa5^?U+VOi(9{q3geW}<<$(=)=PYyz)wGX%G~2&3;@zUYZ>?h!&NUK` z!E=H;{Y3M-HlYKI%~+a%RcNJ+H*pSrnBwYF%^m^qdbcdj=;{-huSFpS7xjAgW@o){ zPdo`-^qGIoxlA`6%yA?2jRFHs(p~vDK=DP~SbQvHvWgNVZJ96~Tz=*N+3Ef>_zi*Lr7ASdfST1UcpZ%$=5<*VFwCP#*z~ccx*vlNz?J;p#Xtlo{1Qw}g4-TT!xUmVWsJ1~V^%uyN+!5@V_e0Zt%ag&jCH`M1wHl^5guh(^2Un;t$~!d2*kP!#@jJ!h>iWA+dcOfWK1L*+p??=n>el*DFUM_Jc{Y`#?(ikT8QeF(3NI31f0%WUy!^lO9b+^r-0Gp5@2Hq^k|A+vEhzxFl$-mhi} z<<96AdaXt+Mnj8=WMxm`fvIG}3U4c=1lGlCHGBV&@;N)k)+P&PmkP%>&j%=p1*`n0 z8|sy``3)jX`abd-$v1Mi)<91b=_Y?SRGb956Rpb(`}9u`a+5sjW3cSVN?H0HN<&|v zJjJ79(o3e*tl~POhG@O)1K2~S^VE$ zm$d$hHYN^;EvPa~GK@0JK4T7HyVRi_Fw8K|7-pDP%#(~fqdSC0sL37m{&mcwg^7K{ zDyTGOvr+4qG`kIfnLxTgB;}?fyGBcFJaOJg?dX+<=2gzDU7Z>!1SzE1S+2M<>^Q&v z)&tWi3voi8T23^4a3dY`&sGK>RCkP#KB&-ysRtc_p-&8l$|BY5WrlWHK~Q&&^cVNo zDwYRCQe%;N+m{)pjWVt*!*@FUHoYfv_Zeu>F_#kR?)$|0g{Ki{uVhuF<53*Gr(_qo zzBesZBjgq`9(&tQu^PHSaoSyz#^!D5+U*xeyCEabiax^VJKL(Yn!gg>5K+ zs_rN&^kn0JY_=u zy&pP4=~!~w-DI;KA5R1#=)GKf&I8}-AZ#)M;WGhOUhOha?{o3fy8w&3rsN6Yh0?>(m?r8A)%*@TmH@czp|e+-$dxcvEx zReHxnKSKpHIyA1V{9FugPt!&FlN|>uy2aV`JuPwlC$gr!VY$;%qL6Nc2_8GJ;VXCv z=E6a)IKQTTYcpGoT5M4+;#j|6=>UXB!>|yd@1r@!MjF$tZW%_qC062w4BxW1>~L_ z6*@|OeIfb|( zJt3iCY_+*hXWFK^Y`omV0!lE~*n?FaStiCTODBYr`G*lCF;jP|nSzm!IYVzkDI7v$ zqYZCyTau5Tx>MO9Pp2VtnVmCjJjtFU=S zXvZF5^h+^4ptk)U>1hw0f>zOvT}NHJiK*a_Om1_nPb1VLa<0y?s;tlyWj$XBRh5zR zDMTBsuQRm1&zhbPyo$HZ(u;8qhM7yY1EU?+++E}PW$y6@{{K9cZVMPQ9iWH(5WijGVBCU=+KCj*RUhr(n8 z6Z^zkVu+`v=dJfsr$5QKK6z`-%HM_3$wLQbMd|NozYE(+l}FCHVJAtB@@M%$F!1*H zxGXM;RiWEYuKT>HgCFK)N)qN)xI97Kc9q{K#C#mkK2cJz0D(Pr$fFgkk;R4iItZvAoJ|M1zz@1wK|B?;!Eify9T?gM+@$IxrGk2-u$!x zDXsQd3##JlLk+9n-5iZ1O<1GF2TKnE8rZQ5bld5pm$dO8ot2-gn{f4B9zDSt>2*nh zNQLm;ePcfVL*8N8oGq636YgU_?cZ&^WKC`Dojm`iUWohAewhyp3``gd&kfAY4UA3< ztaj&PzVJY$Wineu49stPapR+Kd^T|sr>lCfQ6xXyTF*(&&(Tb;-QG%4%nynin4LIC z!%wl@PtH@#E0#|vD3XvE7?>D1&RkE=D#2OK$kEY?kvIro6yq~{u+zo&ySRGs07(oC z(WV^~#osFfgTNmX0@I%d4NQ$-s=pVEgfk!=x;zwd5P9c+I?(+?-v-Om)%Op&+sRKO z{%Qa1&h|fUOwica)Y;kozsPQ}jPQL5C?PX7R#gx|f6WYTjo1hi5R4G`^Vil(rxwyW zn+NroUjY4*J=!%kcDIr?=#R6P-)}(}gqK5(3uSMR>ChF6+bAG{Zt0+F14fleQ&n+( z=gK#Sa#l)(b;^+y>=udW_&o~OV> z2FjZBz$FXjh7WM=*R#-mWpD!Y^}COfu^3>R7HHaoceiyDLeOc&KL1B=CROne{6i^@ z{WEF)_leQ}<))?NB>#nBO1kz)iU_>FeP}?nQX|7vsFo_5WH;_C7|0}yfC?T8)}Bq< zhDg^p53c6pSWfxRg!8O?PT+6EF^{j17y};-+S}m4k@v$v{sGqvp5&pWSC{hO z0XG6h=^e(rFw#l)ZnFV9`@mJYP|y4&4wR`CV^8hF%-NVCak(YfaVR33I@3fokLr|t zybl%&O0fWoVt(MhQA25Sjg7?qE1{0qiPJ7ULA5znoB+7G;KLhcNVhs5)mj7R9wa6F ziRG-$D8@J?P1*>#YLebDIANDEYemZ3?>~Bbr7l&-^=HVk{28*S{=Y(8$<)lo)Y#>p zJszX-&qWd(?WUWiR=KDE2sBZXsOEK=flRzWAZ7e0X+q1T8-;Z0rdd1cC;0Gr&~VQV zGCUcS7_#rPIOdE^m2GD}JhSuDq0OH2%To0{?C>o!y7N^1BwxIpJCyc>J;k8Q23 z^e_28i_vF&Up*p-?bg{ODtp17=u@_p05Q(!zI8$;*5wE}h~Bu62o3Zh?%^Wv`CW(p6iK9>R|ZT5AXox% z2qhyYh2|R&^6`ab82QJe^UyfPla9ls@d9AJI5UqvrQST* zJXnoyum5|#^$&dZwDAci{t4cRAE=`I--1`z!q7?C)X~+{&e&8=v&vHMfq`P@M;i4);h?oP?SEQ-8rbq2fTax`~-e?w=9V0H4$m5aD3?tMoC!}i_f=8nCS z_tH2WNM@F}kUjv+Y~fY3KSKx6pOCU)rzL?NU?|r_Q*-xOMxc^xCiiLbX+y@(sCA7d zJFnDwb^}j^gKSL`;1JVO!B*jl2OEyj` z#(y`ll?Uu1Tu>s_HktzlBEY~UfD~?@18$(46c%r4)R~}uA315T55pMS_$EQNQ^bQ^ zu0E%igT%3MtkylLD{+%!^?iIxy>ZK%o$&koD&zF@6f;3Sud=f0?DKKCsz<*o*Z%WC zTA#F#jjvQGd8?{K@y!o6g`J-l3(#uerkkY`E+J#Nx%Fd&Fs8R z<*i`#%{t|4*ygiF>X&)*m)=eE62HW4+}(@({F^!DmuTd#ls$2!4~@uQNqfGOU%DEf zVNGAkTHmBYzo;Mhsc4J7QOUl^jlb*WAeN)83_mn9~&C!pR{Q2yMN zOI5*no5)65-f7g`xP+LOH)WawrF<$)04 zP=^Rd#cBKcB*m?R9GHdJ-`>_h)hSu>cOCDqtLRN#Le(i+hA+Q);7%tmQ~PxEW20=1 zipXeD;4LTRG&oR|l%_LI4Shd7mW~m zebbd@I#40SFil85N5pT#^d;N`S=XUD){ z(3D}83KJ9#YskP8&5F*ps7R^~p-0Q{;84+X8 zlMq>26v4rQPnFBXkttDXd*i$r<}hp;9SwTnb9k`%x+WGWxdH~$>e<|&upwvPye@G2 z7UBmy(JiM=gGl#V^IhTA?2?!?>r!@5e1qK@o07~Bn_=g|+E&seUl)6)lgU^HdOQO& zKWZF$4x^5~d`iU*cgwO<7dI$}kfQi6P+Z79am`bU-{u|D-F@-nKsYY!;RS(%bI4{# z``Z1)uAouik47CTMYqK#m~up-fsDzuP5SaU>;U9T&^e^Tk^_jISWI-ESQ}pa!O?Ty zKowQ+L*v3Ike2wYl!*~CNma2kC-M|xvZtG-qvi;u066MQL`>)@-j2KL(6lgYswL=@ zL}R=nJ$0$#06$upF)y8K^S1OM?_8>&!Ew-U$fvw@j@HYr2urW8pr6-8TAA|ej*>oU zEnLU*bC+?y-+?%tzez>W<~s7MfzWgJVqGe;#k7i%!u};(kONKbOjvB&A8(9Ac}`fv zRyd(DWQeN;HW?g#W%vy_C}Xso(Fi?*JVT=RemU8e)W%1HEDQU&I4=5pxWuA|Va{AP z^LNhEc@Q>;5d#+zd>ON(%qhic%;f7U+krNIgr>T8ik~x|9hP&H9&VRxWL7kdkQ10I zLxQB(Lv49{jvmJeTEntMAe?n_fiMfH(`Dk?y`BS2Tp<)GhS0@~#CK)2)k(%nUr# z0%8oEvRYA#;thp3Dqs0+SEuwoMjT`p1(}1+C`oXC>+rLq(r)sw<+O!QIJtwas*h)e zS=%5!$WJ{u(CPv9t#ml-6=KikkX>~D{S{EBO74%{w1{yyE7q@I{6VLHg5X@JLF7|^ zKaNZ(@WNaFVR*(R9SjK);N6!50V56s*)pJt$=2NH^f8yHmwm%<7M50HQ}6dmR_b+= zq&R|CQ3>4$fb*pG%jT^b8Fr%y+Tm1fC~dsS!TXLaT=`wIrIU$=lx*P0ZTJmgWkU^4 zUv-X>lpoWt!uL}tR%MHD~ zTn!^40C^blL}SD9R?>Rr(lBMN&|>P@juvli`gpk029VMcEfhbM{gGDiz8WH0pP+E{ zI3h6=G2phjKOCtehXUpu0Sr?Vt+pcpLBmf+?Q~%b%ylyT!6#uWxz;n*RB1Rn*r4v$ zHZ3HpbUQ*of!5_LmVby>nB=*I2m^wZb({s5dw#nyVsz=#7e~=y=J;sJk__xGr$3>Z z-ohTz*>{3E`Wji&gL)KoQbWUONFBupw; zR}cIttw94^l9}=OxRCbHar4(_rYeNUFs{Xx^xuXb8fVfbJ+Uz*J_Y7`Asbc+1)`@# zH%W@cR9fW+GH~0qiiKqx9nfl2QR!K>*x)0VTDsfuSEe5nz;Hcp&RgR(h|4CrbY=$ z>_q;!;OccDEn7laz z2&|fST!47>fQvvo#%R4G_tUo+;=9mhl9~=Q7frur>+`Iq8!k#7L41Ms16?*^BI%|7 z$d!lTs^m76XV(L;X{e|KMIJj)W{BIGs6Y#9filUrB`E$@IS%GJBXFK4x_@9z;yfa7 zZVaBJWM|S!E#)lWJ0iG`7Cq8bXJVx@$#sbLEDfG?wlg{V&9VvUx*>SfBzp8}P3GJ$ zc;o_^!E9$@W@1^2d{!JZ35}NVyVj(W&P0xLv{OOoC>tB|SE?CjL9T1O=N!@f{Le34 z65Ja>W)%HgWNsOYd=?!fL&wx<18CDYYC*v4E|_{0lRD37T~wrrF+V=%Ns4cNmoNjR z1*L$U?Lf~>l!s}pH#U+vl};=DSDT=F2PiH4Q4+i2&1bNpC4oyXK&1%zN*PW`UaMG6 zg-8{tL(etdt1);{8C7D+y+6l2p35@9s~xE#5rgfN!1d=u1ynH_$F81pyw@<%qYbGN zX~RVtZgDOp;iC?y5_FD39k)bIvjnexgo>ohduPz%DUy;oRlL?gu=jxA8EDkvs#LL* z(YiLA5`A(!mwLdW5%~r>Zn0jIM3>6XCD9!h1dm3L6^SOJVrN|B8|$@Wv(&E?hfhH->sRq} zqJv&O5dNt`R@);O`U0T-lM< z0KPux6A<=!$y|AJPr|OjsFQ`x6^CO0I13!fXY1C0&hQ$lPo%)CG_Di5H<~@AnAQY7 zbJ5NF)Zf+wAu|i2H#rdk&tNO+3p_e-_CQ0x6`i8`4rymtVJaSy2`Wx4r|7zuX{{^U zCsx14{_)U#XNUAswpVH2FPEySGL&G2@~v@!4$`~mhCRBuXZsg{bOJR? zQyhKLmN92PzYUk+-~+IZzhqxa`57$DvOtt0!t*SWRUvBmj{|pn*9g}<9fgpe)9vno zxxgH36XN~5K?5XOPW@@fUo;KdfoePryD~SZxywb^bzB#JH=%E@t&q!b;2zaBr6@;(Y zBC%$o1rErzc_jh`ZaFJ0se;xf*?AD9gVx2iox9>u^4LHkP+g^Q*HHceWO#;IGz_|# z59BY90rJ&|oQMTXyx8fvtCo)Kt6bh+-|y%60Cf8Sp)_=s6uYjdX{tJN`8%+%RJD~J z%rVwfTjM*nI?M5W+*socAE9Dn9k(;Gs4YwweYU9gz!-ypk=#_NAk&#Kq4YrpTa7P| zJ^_@(;TwtcEx48;C8pY3F~X*r`QM?JYrC=m-9CoG0-6t4iFz>WDOGb@sSnGOv|)*a z1HWa=2Och8dT3E}(4%$lducdJ*J*0J{*10k3eotQjeX8O=?o)y110I!3)7)uUU|R* znK;zGdS-*s&>>97SU2B^LulON?&<>|Y;ckM zk)B}bi?!O#<3_#m6)UKukBW+0ReshQ2Cuq-j&VUyson8VUKGlTd%i=O$?@2KiZO(N zy;iiz#dezz*)DMVi$!TihyKBZJk8~pV;*|khMU(e&6G;tV>kz6#+`E6&F9*X2lmjz zrx8$>^!CC;Ao(LmBl~;@oo6P247;NG?=>y%W`Y6*J0ZbF-*qvvc2ZWghX{)gFcyW~ULHk6s6; zc?^Si$?9H$7?e_s8>|RGygz)8h=_nL!Npzz2gH-R&N_YQO|O}1`h|gY^#S%bKsB{{ zFb$a51D;-4MHix_nM7o%UCG6*5oxzn&n%T5u;>}J0(c>AYc1gsioneLgz6ul1C%~_ zi)5us@(4G!NLEdt*4$C@%oIv_{WgJl11!%R6^Jx@s1`E$!G~WDzyAIGZRmhVrT7OE z1{?r@=Ksh0t7_+LXlDAaM5?N`I<_jtW>PQ=CK$!DbODiQCdg0Hn@ZteemE4YoU~8K z`rO0`2`ntbB~hcp=TZKoh~C$UR#(g5RI6s@i^4TeQi=lhZy0CVb#u>oM$gyRC#Jvq zt|dlqb*SH@XzQePYa}SF?Td&Wy6TTf?9yx`s$^&BUVA7B-(Lq{%8GU>d3M&~2C_6) z&&~J=TGTwrE=|-dDkiE%sD9Nl8vnlBb%+jM2AZPSDDP8Sg?JwI7!lmo2C2 z@xVX>mgW+IroE$z<&0*W2EEN0NP6P~8>RMzTFVvfQ1dbGobsD<>1#}VY{+$o$cXdp z^g@*eoiK)i@mkU7SkeWO^mEg5x>L###H~o%1591{(`DpWSOn+$H)jpLl9 zehCAKj}a$nSN&FRw4OrE^LPI+Gbh+wa#MkpOt*18&ZUe+jalmVTW}#alYC#{IyZz6%e9jCBQOUL1X1N_~-Pr^Hx{PrE*jvu8T1gT$euQJH~?KT3B z&)e&I%k z&-9K$c=c65ypw+}|J>6(O+>6*DKd^mOmVR{0q4gQL;08?uiVI|b?qUz{||XO^Vooi!ousE_w)21UfX?SXfZ zzY%YMZGbL2Xo_W;@_dFb@j4kDaUYMydlPUF4DKzrXw0mmzn;`uANBtoal~7%EO38H z%o9Hi_kTy6e?m-%f~+(!BZBXOT}OMZt?l1E-9h*hDlcUaN|fMA1KaD<%%x-&=&{

Ou)$UcZ(N|=LSIwoxuhdx`q~~V$*E5 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

    cni*qZlxm&p(4t*43eB;!WZU) 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

    2bCA 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�=qgCkVnR2#g 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

    ESstz|5S|5@gAEaB*Tb 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%0D46ieB$A-P+*7+6o10g_w?NKg8P6<w=Sp$~%; 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%0D?zq~KthHIPaW!FsE)j#S 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%0DRba5ui>$emLNf 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lwjgl.jar b/etc/lwjgl-2.9.1/jar/lwjgl.jar new file mode 100644 index 0000000000000000000000000000000000000000..77171f71fb071ac42ed0bab51f33870f6b0d5fa2 GIT binary patch literal 1014790 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%0A~= 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%0AheV!EG)6IIm77SH}UM<-Th9dIPumWP9dKw0`D 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%0AOV+|A%g7< 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 R5-F-Kdf@_K8!+fZ{{y&eJFfr$ literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lwjgl_test.jar b/etc/lwjgl-2.9.1/jar/lwjgl_test.jar new file mode 100644 index 0000000000000000000000000000000000000000..09a58e3242db40af9e218379f8bf37d521a168df GIT binary patch literal 283689 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 Rp%DCQ;RoBf1RzaA_&?)}H9G(R literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lwjgl_util.jar b/etc/lwjgl-2.9.1/jar/lwjgl_util.jar new file mode 100644 index 0000000000000000000000000000000000000000..6af44ef28cb91073adcd2c43ebf020237cd4adf4 GIT binary patch literal 173909 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 D7S5{E literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lwjgl_util_applet.jar b/etc/lwjgl-2.9.1/jar/lwjgl_util_applet.jar new file mode 100644 index 0000000000000000000000000000000000000000..f8de204f7dcfb7a9aaedac11876e57e60cf001db GIT binary patch literal 35975 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/jar/lzma.jar b/etc/lwjgl-2.9.1/jar/lzma.jar new file mode 100644 index 0000000000000000000000000000000000000000..d383dc002adf294c72f875a6b22f553b00f04ec1 GIT binary patch literal 5848 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 S0H}{g_oIe@`bdKTfd2#0%V=c) literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/libjinput-linux.so b/etc/lwjgl-2.9.1/native/linux/libjinput-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..3cdc43973943dba06877d6d631a5c721661c79a5 GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/libjinput-linux64.so b/etc/lwjgl-2.9.1/native/linux/libjinput-linux64.so new file mode 100644 index 0000000000000000000000000000000000000000..de1ee5f3cc5fe7f132879ab70b4c1cd0a6ada0f1 GIT binary patch literal 14512 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 T%so-YU4>3-Zz2-)Wd8pKIAX!2 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/liblwjgl.so b/etc/lwjgl-2.9.1/native/linux/liblwjgl.so new file mode 100644 index 0000000000000000000000000000000000000000..182c591e2e2bbd9a7687f0bda253bd95f846b775 GIT binary patch literal 378724 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/liblwjgl64.so b/etc/lwjgl-2.9.1/native/linux/liblwjgl64.so new file mode 100644 index 0000000000000000000000000000000000000000..16b5b50ab6b9af66bae4251fd8a2bd3a389dfb97 GIT binary patch literal 449456 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 aUoYIJqtg1mE2Up&|KF>Gc<=Y~`2PWTjkE{= literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/libopenal.so b/etc/lwjgl-2.9.1/native/linux/libopenal.so new file mode 100644 index 0000000000000000000000000000000000000000..0a3a619b483d1bd64d1b4df0f7bcb27eda2ffd06 GIT binary patch literal 368392 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%0AY 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 WLRNUu!ADxnme+0!kW%G(<o^L@nsUSd literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/linux/libopenal64.so b/etc/lwjgl-2.9.1/native/linux/libopenal64.so new file mode 100644 index 0000000000000000000000000000000000000000..e0693c01a2eeb5807967ae6c6b906f3bb7adfa4a GIT binary patch literal 404085 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 R)yyBc`B76SVDnwk{{dP7jlBQ> literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/macosx/libjinput-osx.jnilib b/etc/lwjgl-2.9.1/native/macosx/libjinput-osx.jnilib new file mode 100644 index 0000000000000000000000000000000000000000..59a3eab5e7b708b47fcaf9d5783b4e2e07df5fff GIT binary patch literal 64608 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/macosx/liblwjgl.jnilib b/etc/lwjgl-2.9.1/native/macosx/liblwjgl.jnilib new file mode 100644 index 0000000000000000000000000000000000000000..3bf68eb30fc8fdde5ed16904b4a4f0f1380699ae GIT binary patch literal 954384 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%0DKYn67Xf<e}S(6Uj@DfTnc<0xD5CP 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%0Djg>4u#0$Q>Bf*Zq`P$Zlvz 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 DGXRh> literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/macosx/openal.dylib b/etc/lwjgl-2.9.1/native/macosx/openal.dylib new file mode 100644 index 0000000000000000000000000000000000000000..3c6d0f7f46f6b9a0af0a126c6420a3ed1e67e584 GIT binary patch literal 731648 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%0D(z<Tj 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/solaris/liblwjgl.so b/etc/lwjgl-2.9.1/native/solaris/liblwjgl.so new file mode 100644 index 0000000000000000000000000000000000000000..102e97f3a2cc9df4cc2cdc09323a7bc26461999d GIT binary patch literal 359332 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%0Dc=|LXw1 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%0D;`@b9$PCOTPq%0D;`@b9$PCOTPq%0D;`@b z{u^B@&TiLE8!p3G*wGTbwy_K6u<3R<K7|;hD^zgK9H+1^LOM=7;@l%n;(sg{YHr2J zyza|+FVIEhlgcl<WO5)dse2W!sE9VM2uy0euDx+hYg1rSWR<ujWZA0buE3;KjoqsP zlNQ#`TfD3dD7a&VQS~zl98OioNUdLl%1I(0&W1%L0Ef6bP!b-KI@<u`W9^gZgnVEU z4vM!TsiT?hH<QmvU=l3be^%(9P2ExaSlNNxig_@}`B!vzw*)42wl;~MbULvcY2vZE z3CvRha{`ud@#ZAt2uy0~ShI$1?#uS?Z9t@5mZu=l*)a;6aj~b^c^L@g;CC)UAp+g^ zNqE!n4~0C$)gR%}-}?|~Cp6*B#y=DuoG)MiF+IX9L3k~d>L9!$3q%ON6F=l1;o$Dl z0Gc{LJTkpipob9ttl*FMQFtFloKEx*-qzE`aTu6Rzr-KkRf=d0!ZBIy@;TTyim(eX zsxR@a>ahrM>`P<*%B~n6pz!On?e!q)jR?P&coVO|c@>0Ws+{~IdK9`4PDh|TRX1Y4 zAwr<YPA?Z}pEU7413ZK>Fh;zQyona!{R;xsiTLis`8*D1;D`JpJd)q15ES0N{~8~l zkc=v6SoQ5Q@OHfqdsq?90Zjc7E&AJnpy&+)hXSgh{}kSx5|8Sei*rsCh$r=@;-3S6 z=;6q3AP+bcK0(SR|0s>ZgYrpun=ixOLWF!0sQe>(g!hzuz5~y#RoJtRpvnS><MjIl z1i~ksxvOdd0`|eu5BWzp6n=o9@OI6d5ZE=-O^>p?Y~bwy-X7pZ-%cswPx0_e{8aR2 zW3S`v1=O<EAEnXXs|eZP4SV2`eyBfH?i&CodSR3sM!8;i#|*qBz*_=5MT2On_;?Ug z^sWZp)joJ<1BuEZ(Jlwxa^N)^at;Dce?^j>_(iy<2F@*3zeHK|OO>fodSlp2PC)sm GqW>QzOhUo{ literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/solaris/liblwjgl64.so b/etc/lwjgl-2.9.1/native/solaris/liblwjgl64.so new file mode 100644 index 0000000000000000000000000000000000000000..0645f99c473d2eb5562df2598d371f011d845a60 GIT binary patch literal 557824 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%0D1YpNC*Sto+n~bKA5a|5RXe8&f`DFUWo|VDx## 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%0AhG{zg#G7cY|nLd{DD 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 F{U1$KiGBb8 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/solaris/libopenal.so b/etc/lwjgl-2.9.1/native/solaris/libopenal.so new file mode 100644 index 0000000000000000000000000000000000000000..be5dbce018c9382062d652f4108a4b9b8a274697 GIT binary patch literal 341608 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 T@^BB|=l}Gx!L5IYe!lp>3~sHO literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/solaris/libopenal64.so b/etc/lwjgl-2.9.1/native/solaris/libopenal64.so new file mode 100644 index 0000000000000000000000000000000000000000..3ef75b5ce1514efc8059fce771ac41acb7effb48 GIT binary patch literal 391368 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/OpenAL32.dll b/etc/lwjgl-2.9.1/native/windows/OpenAL32.dll new file mode 100644 index 0000000000000000000000000000000000000000..1f69e9454b2660a9748907cd0585eda616290dcf GIT binary patch literal 390144 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%0DhwU@wWwq5pE)) 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 He-VM-CI~m( literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/OpenAL64.dll b/etc/lwjgl-2.9.1/native/windows/OpenAL64.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f2a2fe13183024ab0977254a793c6b40221fc1b GIT binary patch literal 382464 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 VD(lzZuO;wn3H(|D|A$K8{{fza?L7bh literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/jinput-dx8.dll b/etc/lwjgl-2.9.1/native/windows/jinput-dx8.dll new file mode 100644 index 0000000000000000000000000000000000000000..6d27ad5eb1ae4caa7f39468895c2b1c3b3ec9b99 GIT binary patch literal 61952 zcmeFae|%KMxj%k3yGa(<a2DA>kN`nfr3P&<prlK5AwP&pU_;1;2npB%u8}Ina{w!W z#FMo-8CGepw%SSyjoz!b?X9;JMXx|YXcmxa0DnZ`qtTnI6F1dRXc8pmeBRHT-6Z&< z-uwD|KCkaTUv$qoGxN+d&&)jY%rnnCGby}nhh&u`$%da{NYY-s>7Q3T|M8<A$z!Lz zJXU&s)L*9WwJiF}^ksoN?@QZIb<Z7DxBoEh2e;pS_dQD5_t&OXsduN{d3RdwlH#-< z-m_-ywMj{%-BHw6{&cDQ{j>8{#(wX=@~<m@fbd;x@5(LW{p`vry!W<E7x9m`U9oaC z!g+HRuDk>9@1M<HIak0PSeYQ+{}#>vd+}a+=MMse`^z=)<w?>ai%t5~*7t6XrFBSg z)5lmwNz!i+6EI`rug2SnUy}$s#dn+}#f#wZTgtGQjfi+8;~z3nzM;1nbaqJ6_5^^w zBS}6={-%Fv7OB(zO^GAo-~3WvHA&K3kn&Ccu2t4<R*<-67al|()s;Gb#J@C2T77NR zn%kAzCF#j4k<f(S4E+8XzY+huDEe9xOxkrV5_<4+;rAMTBmQ}T;o7RT>+ksiij<Ln zx{0zs907z+z%95q=Kl}<zixrr?x)ZryPrQRIWrIGb?#jVu{!rNcoq37jZm)J5ui99 z|I1{gjMWagLN52x);f11VkK7lWSk`VjW)JjWX(LreaVtkdx)^M96NT5<+|;~ex|q` zrM}Q2cPeLwVX(2RC`CJD3xH#se%5ZBVEsWuNoNVH{t$R0Fca~CTs%ts#_?d2GLB6s z_OS<Nqb$U<X@{JvDpnBsV{DPzPU!8(>q{vu@|(ES_*I!r6)i}0Az?=yNG%HNFcF>r z!VlQk&@y+*QXiYI5XMy%0^6};e%3=&?0`%}(eo@IYMI*sJkF)OZO|}$sE{*I08BnV z-xjUQY_y6GB?C!}7J;FZZE-tIG*^|P_9;9>C`9(aYT)qmd4ysD<!1|Kk0gXDhkxIK zFMAl@7J;uD5&sCEamCDL$!X%Ir`DaplAlA?%qAUujh_?06#P>0bK^HNWOMt%xo%qq z8WC?hO&54Odd5jk9hJhj8xl>@m$_#e$uodnez8eAlp$Ia`2CfVk!)|0oGgh7Vm)9g zo3F@^e9kD&RAeWdY4kRd(|{w`q<)vZ##f?!@aZ;^9fV<-d#*3=Jg_X~AEKt(AxCCY z=7|cFcF->ECiImO${YTV#Q3gC$wxG}O|&swiwM_gWGUi5`wFfnqBzmr4xf>nVP>5a zC1VjP5Eu|ySD0B3IwjGlL;cl6yjn@UPrR*K!C}NYYyxZWq6K}Gpp>|qg@<^L5D0EV z`!M@b`XneYX>A&^7;R|LqDo0LU!d(EhKPh2BG$S--ZoB>f=$(vX-xP6sb{EWuY57o zN@ZvwW^+G5Z$T?Pv~DqcT*Rub&_bJ!<=cGxdbGNB$d2B3pz%l3SVEBU`)#2muA-&f zH3VVDaC#59m_1ZFgJ>m*V6-7`3Q`V<l#<ZTXJT9rr!pS=t1_O_{B~3o!*GkyhN8xl zk0@)gjg2b~<f0w{1rG=SF^(Z@+JmR$Ivrh$vFc<?9cYwA?zE!N5?hha!1%77O7#fT zP%i$`fM|jhBT+ANr=d4eOP0znlwQFW+vx447EhzcjHOS2q<lMMj-`mzpChI`&NkZ6 zc?;%ghh}1&qG~CGf!SG+9c7Nhj_<vwtrTsup|&>Ln}mrASyLE9pW=2^S}=&5px<5; z!0d?*N7K1<1prH(W^H6&U>B<5=bv5>RRLm0l;MEL5u<^kv~HIe$)fL&I0Moe_?-Am zLqk_uFv{#SN8|0F`5#T6LK4+=&_!I~f2j$K#d=C#ro{9!Y~EN;mO5Vh#HKadw9jq# zeHyJ>%S+D*z<&S-K9DL}UfT6-a3oLwx8vL3NKFA;&9}jkZU(pw-v&oQ3vjEy4KC4y z^L-l}scXRJ{Wdsgm;{&cZE&MaxU_GBbC__>i{WN{rQecFIO*Hq#+q<Fka?_UsDHnT zj}!pZqvPA)h?4-<_HA$wUj*0mZE%;EaL;`k+;|gi*SEpZa6q{`z6}nF4Z+oX8{7mF zZUf-V)@x?7EuL9l8buQY)T+H>#5*P=ifBMXVai}$8>vZKe100f&}ty_)P#x^B)v;W zTBn5Wv6c8aJ0BC(sgOzECFO;rWZ)2q%?><@X_7%^h+E7(B%DJF)1a+DuYzPRugGi? zI9X|`k1b4D%1T|nrR>lAEJO_?RT?Qg89q{?9tGNBp<pGj0*FC3aIETUFQ430;T0&T z4*z5NU+w>T`n!pK$KU?P^fz<6{9>E@f~ZQ0sLBkpDsHOE?60lLjIXPT=n}1a26D~w zLtAvABT^BVOLEi(`I(x67Qs7>7#!~zB=8_lU6`SI0O)=KIc)ft0oBO<1RhSHvC#}u zP#K3bng)Q)oZ@|Aif645?lTUi#Aay7b3$NBaXUVR6pu$~7fEr1UBji*<fQdm(Bn|g ze1R0SViEu2-^JVk6wV=OPxJpg04)<LdI9zF?|{ZsqbIO-0Iv)=cA{ERzzZxWW_GmF zbE(p(!#vDhUVWuImn}%~<DH7ilfvUzRiPa=R%nOjp)%m)p9rp810;d<ctG_zf!w4b zyfwtL3Z-r~Q;#Fnjnuv1S~2ej>L|6|OeOUq4XM8v!n}i0A2m}6^Ne7VT(_CD>kB2# zAKOa#QxLn1Ylm$5dbcn5S9Nk=7oh$87v}^6mXD;jly4;Heu9PykLpY>;SWK+2VN0* z)`>ihi}GZi%3A48ksrPhQ$LDuX<<j`W(keEhMM(xG^;syID!T9#Q2kgIRHi@r_#`@ zC+;ah0_pFhiKju^5UPe8youmQZ-9nUwA9bvL}v;-fQ+K@nyB1_>d==_WelTgLmKHg zXt`Q~TZ$svNYr3R0~fR>IVfNjxn~mP1XBbUYE+7#p&u*r7~z6aw32YhFG5_PGDPI+ z<`3*+7P&KOKa?<g>PrTqT%<2Nr%%+E^yg?zPA%;8pv8dJC2xO&)-7mihRy+w<%~3< z*+ppmMQrIzs6i#HhueUwln-LwhBjKh3S%Y4U(4LSrTo8;K;`@RsTjye9$e)174c?* z!B}3(U;H|lT({51cM=R5yNLhO*TBRiwfRPQLjOtyiKKtU!f9U$uZf0>OHjj9Qv94~ z%X%@|%s#J_Fy0>Q2A`BzPx-B<qT^`vs)}+NNKns!Tj-na(qdr4@&Oru!vVoTC;-S> z2yP^W(C?9Lrdi<Fz-h2A8hkd^-=eG4(ZDVARQK>8wZRw=aNt2}T0q+{(Av=;Zj|QR zLNfp&!b2m^N#H5N;Itrk7KLVnY&F&<Yg4I@&!85KjwTmI)0kBwid_c8qGrV<OCcY< zOG_)U8lFExtRZFs*(k^|IY{yYaP!c9b2Co`n>Mb{!uB1AnGH&G8ebt-`ciXZQ|@I; zNL&9YsqRHgE@Ddt@ar!^Ez*jpT2V$$6@y1zNr-c_u*=h4^?R^kDzONmrTo@Ei-|*^ z)($yKd9_VYk^$*Zz5-$cD<ibtGI#1y{(U5w(IYB|%K3P~*QB7MsDGgTqkIPhsSV$$ zMbzYozyg6SU4&s^gXv-tdc!zDMSZn@|51J#M#%5G^c(UM*;Kf>-V_Fr*+$#J)EE<) zY33S-_`9}yJDOzJUPM9*_M%;Q6|*PZhwv`(v*+DUQaq%-U~u+|n<PaksWK@T(laqn z%s?NIC=^40bQGkyJY1O=aD$cn-1?ai%e1`jDnjRi5NGI7H<gE;;BWLmUW^o4>YId& zhL5?frlP<*2fzgn_J~*%(iU?39tb3AVi*4@29DrLaOA|mB2n!2Plt<rmn13}A!K`u zGWq!Jl%XB{3sr1NDOZ6uuwG;<5!r+>qN@?vf`8pg%kUHyPJbPfK`L`ubf?y2)9`Ik z&malQwBV7gGVnW@>!9w^yq@MQXV`XkJBmV!zCo`?-KX&aW8@;C)BK!?&mQ{Bb$bEV zVaCoy>?>yMBE)u^u`3aKm_DI#02wy{W&>ca2@n7P@i+i70PwsCup9u?llpdd9bQ<G zE`vmV)Qrn@2SS({iVznFVe}!eya<*<;tS*>6d@F+KPvJ<j&FBAint=^4vSp)z<c#v zywNOM^jF+9^!cQK4Vy?vv0zIJ!0w_2As#9*hKW~dNYpK*>55v7CP)lXC*nwh0t=P$ z50ST+Q=?(1z{HST5_nW}(DU6w`yqCU#3SpBCs6ap0SBqM0#?gk;IsA+)#2ds81IuD z{WAY+-E%AFqS`jtl=w6-0BBqeARmKPMMKzGX+w+HsJeElCR>^!2JT#Q;DU0p8;l%p z(3pnxy;ym%`NOzEg5ArLL<U+l?rclfI*8IrM_|L7l9OApB4MgM*sG{o_Ty76POF+z zY2)XhyOe2b2P8jF#Tv3q&+8;9>i6+%3YLZQ1~A(ioK_xMb*H4>V5s)UXyoj$BfW(T zc5?>eElwjj6@_D+FoEBIsh9Pb<}V-r7)0m^Wju@yZ2>hqh#D0EZEYt}<e5_sYBpU4 zly?jhb2k=vL`<xFq)05Ulh+C?HvWB4Ix|XGw;xEf!4CPyy8%;N%Cgfyh?Y%6Noopz z?ou?uR6dx30f<d2iLb?)tE_A{wE-pzbu601##$rR%qFidlB)Gv)iHivj7pbLZGye3 zC0}cmwU2s+>-x4>VO?A4sK|=nHQM4-lF=&sVU&bCiVT9f9-vmchU%WduN1FUm~kU6 zKfi;(_$7!7OAZhOgIT$0pEj+>w%`fn&djC;Fhv~*sQp}mkf<7~Wv>Rsk`mwbG!T@s z^RTc~&FXtc`@pI=(vR0CYGI4kWl?+C;pPszwV7T{ypC!gTARD#l!UXt1>(^r+$RKw z0#=cs(bgi`k>xr3rPLx@e0(45B2@jv%%-lfD4u^YjqHVLB0q_gNEcuG9WuVoKub41 z39|Uq8Isg^C=OpYT_!AxiF{)!AYbP<Uq#_9Y5cHTd`zsAcp;dP(2p_Vn~<mL8S0nY zkRCabX?ViwtgLK`-&$)V(K{=<Ceh+l<N0ZHT~@VIeSlvBVD3T*d;t+usrARHW&CyQ zI|OKPQ)%H-rV|&Im3jK)I<isvjX5cOlGB*;J9HSo8jxkeG&ix-&+R}|RtBptan53! zp(jLA{Ja^)z_PB-$!H6vNG#<IQvn7xfgCvKppo?)@$$1^Rd$~Jjg{MxMgyo<bz~(I z;d0%dQ8OA|o*pG$8;n!0-Q59`3Yf%R>Mw@YlGjP2O0N4E;1I*BP?{Kna-9~93ZtnB zZqTA)k)x)S`il9V5La3W@wEW(F_Z}ugF5w6QC9Uz!gm?ck;yvUEJzs_10E_rI>Iox zB2!piHw=WMp!;5j0?Nu-*jgS<&urrHsHn**TD8N1?#Lu2Q0=VH$x0lYwiC*zVFWj6 z-D$;G=9IhCG=3$-ZZZ7}OJwihGiQ>_bwTavdIDh#U`Hvdc6u%-(>-U^DZCdwI1+v! zJq91C+>5T<hUW0}Z?fvuorank%Ih%HlyF}60^l-Km#%W3u67tDc4%OFp38GqneA!W za+y)sxjB*Lb=0Rs#vu<{ag?Z})^8~BEYB4go7t3A-dVr$Mnm4&R8W9zqa$W@i-u~l z@=KI`e~7ZKx6GQ@OS8(IsuT5aW|ceCOE7?5Mhb{XWYrGOg-uRA5lGCI=z0W6JP~2k z1C;>vo@(dDYuH?t=k)sgfn%j$u-~C!wL@5?52}keDH__`%ha{J4PW})$Vvvr5rBH$ z0IxA&sS*UAs#QA;^-}&+G}m|eFYv_*2XuSna!*V3W%W}DEQM=`4ojDT9MSMxzdF|B z!_5E!A?;O{p#rCaB;I>wY2{`!)ppN7M>lp@Elxe@G(D5s={e;Mdd_L1XZA5X*KJSk z7q6sl@tSg2yy6du*A-3Tb<HbyJ^4s{4_+)!YU~tmTO-FilxJ@|N8w-x#%MS`1K$>i z$=#IL*ol!Bj&H|vluc?1$DhU*s%L7VdaxZ?cJIX;sRvKv(@362QfvltLTWsJJ@}rs zN#-Il(222XB+n+PkWB!RY6r{?f(a0AZ1x}xdp<MqiZTn!vu7Uh*#6Rl5|r`twe#0h zoe35ERXaa!)7Z+S<!CG0Uk)Lyyd^#trB{wE^BkVsba}JZWG`>wYcWk>ye90O@psAD zg18pGG!`|}jB=Q*?dKmNJ1evo>304gKFhG`eFbkl1M`U(gW%^pSd8RHn*y|l4m!P{ zvyo;-lo40n0(sR)^I&;POeZKMR-aOXI83CefZm$vXLITh)>^TLR73icv2nmiE<l=b z{m|_Hw$|#(@raCD+A9o^V>ofuikOm+i)`8zVr~YF{?g3e15yHz&-?p4)Xt(#4cY!a z7hn2Zv6XCOXyFuo{TvcT5SosBZP2~tgb=|knp;3({*0VqMlqYR2)O<GDR(Km5qrer zwXHUbl2mG(EaiXi#TdF0s!prDc5r#G<lJ&vK(1m5r0)=<YV{c>htog8u5ol;v>UVk zOlXZ{ABrd^EvD^F49q`3E6Ow$LJU!(QKc}Fyf8UK-*^}eZt5F<hb_IV3_3w*wjelb zD)fzT<nGE8J{vQ68SD34P-SkxSc)kGk)q1cybLT`rk4+7O;u-##wg|2%r+ZBomk2* zM~%w(tJt$MbLr)skumy>5zJF|O8T<qv=GF$0PPH7m7$vXLuS>q8zptTk6%WK;0=4_ zINk;2q|CV9NM43Y$5@Ib5pV1!hPdm9%X&C6j+NNceGX_TV6m!ET9eDuTouV|in5^A z?F5Um`PjcAAwQUYze8&sX#PxQuitsZ2EiBFZpp>q)C+sq*qimjf!=1U-%lc;IFvez zjn_-gG5>&G($7lH>E({zgBDe3{@iwp_W4a4t(7<3#%{HFZndim{sWCwqkW!s-z0YQ zWF)jG&enHw`pUhzgQL{TLBRA$k<`#F9YZNk?mdJINKBx_G8-#*uwpw~VS{M27M{~@ zvtdSKcrLZ;#deUzj$c%2dB66b7QOtO93%;zuJ*I?{^kp|%A0i6achO=y^V3~J!@gV znG4xHZz1L_&$~(mD|E1XZJvAWs%O8T`9j)#6WOaLKka*Kx&nF^S#9ccB5GFT($K9P zBK~=kT1pc1-U~8;#m;WF>Dc%b7}?EseX$*l9I-+X(W=iuR(al)>uOL4E9?n5j<YgA z+w}^Yj{J-9wBzYnY*$w|pt<S`<-z89d{84^QBy5T>R5JEH0#L-=ovLhe2do2-J3fq zCGs5s<V3TMfGV>g{4!PS<R_szLH8(#?*TnQ&&?QMc|C?*4xUB&ZXZ-Svb(kufk}^o zq1YS}DgntWNzEU~)&j?Wki01_GTt)NMV2V;Q9io}GA~>OD6{rdJ$0#x7qNo{IVM1X zv*!LBNgbuFwhf9HZL{4_*A_!MZEzTGi6~<Owo+pvDiuUT*_>zuo3mu%_w>V|MdP}Q zLItiOA9v0I)p^h`9EKPXo_K=YXw!aZcZt!_xSeW*d5YroY$6f%pCc{1ci;;mRft$9 zyFKb`*f;NLa`{Z5SsEi_CCGp(Y=d~)ti@9<G!W%#6oaqVWfej;aA-c{jXjnt4Y~Au zWK_bH@R>=25Rx!3OO52^BE<oemlzwJL&Z>SBfr!Z+YS9jeXGrgry^LsQ?nbal^hXh ziB(ht4q)@iJLg_!Y38Yj)!LMUt@HD&<<2HCit93H6odcs`ft;{cHL{k+;xk3uF}RX zh{>n<W7&GYL(CviVo1!83P@W9p`S||AOuPVJfCmMVMo(nZ|-u07CPr^1^tFr-;Lcv zBeY`xFWreZ%spZ6Ko13dwr~x{2L<A3lDk=bm6d?e`s4dSP-uxmFR<zJ?V(%nVb|x| zv^BrV6+-)!UlG4F<mWUT9&D~_LRZx<&QYzSHroV?VMu<`cVfEF&RT{wAg$XW8Uh<- zOvNly?O<=G7eS&;Z2m-MN53S|&cTw1W#i4BGodY618kaJ=!7_zA1(o5y)6)PdHArt z<2fro;=vb0PxE;jWMIE`{-%uyl{b~)ldZCOR@v1YQ@))~yYEsOjr}3`Ba(pIK?3ed z5*L#q)3jy?xZ%Vng*kqNj9X#{HXXta_Rei~{eDv1(_ga`4rtW_lKk+~Xbx6A0CCc6 z*p`GA%^J`QA!Jvv@^hio3wpT|0+RBVJM}WVeyfcn%B^-hJ!N*av|&*qq{w)ZB8fK5 zNV_k!rg}U{k=IAahe@H_9l7lFNSa7<hL(Iuc+?4^5iL65<R=gw5X6N8q1@}Bv+9d1 z1CVbej!?cuUofEOUf16>4^0Opn;aSC(08dF%N^fQouS1R{nmld%FF@uRP&&1F=h`$ zXoI3k6}@=_=ztokvN}M?u>>@ZXUWinGDs83YnV2agjjoz9iC7YiwQ-fe5J85p`g7t z31Pd*4y+_^RajjHbd#Q;0t?TD9B0`5)Rg)IqJ3}0(;l7K(5wkD;hbR8KoFW$2<O)h zfclz~pOJ9R63zM=H7n9k`Hm5Z_uE3zW?ej@S@WE_RnJWs5Xw|+rGqWR-9i8q+98sx z@j~%yo~V7$g9#ekS$wm0KFwcRJw|)YIQgko*l$FVz;@bEBeVD9Cp1kb3Ay(U^nzj= z^ITrifBE2;x3P85;?m3QFqv~tySj}{A;jMR^A2F%QCCD9+5>iJM9v=MoE6PE>Y}uF zs(O$kneX}>3UNEifz6dH7o$jx;NQcRZW+7Psasf%Q=4lj|D{h6MCLe|6Cy|Z+)!L> zyI?%FWk>Gig+%k~>UU_}ZtiJ?3UXOitS)1Xya6V*DB<Q3`Iw~5S4aM$9l4pt<*%ui zL=gjNW!fsp%_9qgM<6!~&#`6aZESQp^qw<O{=;zJ3Z15cEEX1G<Xdc>TkPsej3qIG zs;^|P(*Pd`ZJ7&h)XTdsUs<24<2NX)nXIrI6aVxvk(n4hCfIf{C7RIFCk@KTp^gC% zK&Rhoiz*8JD96rzWYh1rp+NQ{5)5)(h(^W`XWnAh0Z>E$dXYU!SB1%$V+NbSmG$7# z>dR}Y$4KfJ!Fm`qpN;acVJ00IwWU6nlm>t#4KwJd2T11%y<(EOxI-vKCqEr^0|Z&{ zh%!bWtuGo!gC4R_?Xe!GagC_!Fs#qPG4p<leq->6dZ}j$&9i83=vqP_P!qK)D9T*y zh8Ea_6h9V7^GMD$1{M^kAGQf#S$2l-OYbQ5mx`^5S$PAQfA;BXxdE*%Zy>5hV_pm8 z^{i>6d@azY*67gcp&zdTTJ~S%MP$H>+C5T=A%XntK6~aIvc#6Mgw{Mm3g?|emr9`r zV00W*lAwB7U(a;R<%OSsXBRu*L1u=tDV%5T_1f0S!3o3#h0ah3*NX?(3WuJ@^}=rL z!l1GW`^6#K3byDWS19)(m^peFj6~F8F7`G*1_KKUwZQJ?-L?>uA$B6L%zv$>+K?1% z&0S2w(Jqq&zaZgz{ACK~oil6J0>Y`Lkt2{ZwOK#7?}r^28QEJfekCO>KyO}r4H*k) z>rcjNpwhC`NTzt0)iIgydq50qi&@JZ$|V7_MNYEAyvmG5zv=~!FOzh`mq@xwkkrEp z?5JHla=wh!l95&Hkn5J>BZ~G_J_Si#sfZDMQF?&GAOUq_4U`<%D~#mT_^1t2Y^|~S z6G_@cM8CHxx>(_LHet}>$00b3IkZgV78tX|I*uIQ98ti)fG`XYHsntZbR&q>b-)bA zQ&DYEP%@Jord5?Fe?1_MRoZ#=-)Iqrk6)aj4?!*5i6djgax@NQwc0$Yy{ad+?jj>M zG(j0klaq}_H^&*r1&pJrI|id=E238>1?bK9!8S#U=Fy^LiYntzp{D}N;A|A|;=y+l zVYJ>`5cp*g!gnKi?_8vWZSHvl@B;v7*_#P%nKC&*AAD^TFFYwL<DfPtQ!Fj`DpLYI zv@CucRuxq3391^&(9BagSySpT7EN=gK838g4SCMrY{46*L`e>k4rt6-Pw02Ro{KfH zUfqr*{AOcLfFd6dkv+P48jEch_q0!K`1bTwmGV*~WhE$oMc@|WdR~Me>*w?F(i4og zqewj>Hj3<81kjgR)tzd5R$hlPmT*?L>v<iFN?_IPkzWVap!$24QyZ)TtCa=TQ#e53 zB@~XWu3;9(z6cCMGjvf!)H@9IlzN*FU~P`NQ?g=5!oN{M3*V3V$n0@6poIWifKf14 zrG>na`Jc=%fc$(jSd#Vl`DI{9KcC{J=N_2P{d~=}^jspIH-PW4g9FoppI?gaz@nQ# z=~3{xcF5gGj69^tLps^X?viQf)dQZ?FIFQ_83iK-)V+ySpW-2Fn;>^8t^8M5<do5d zdfjX@B192jmn1E_jf`q?-DD)xUKl_t$aVAa9oTzVa{h-41s5NvNB5TUGZ~__!H7wI z`o|MMJ*>Y08^HJP1`PI9TH~L#gU7&2VhE{M26h2Y;DV_1ABHf<nN2?W$FV_1IAFO) znin+A+c?+HFMJoVpL(pVmDZP@gq1(=B#@*Z#&XR~DTiDjVq9h~Q2~d16GbF0vp4WK z;EG}2M_ZyFhDlvv!eAPJ1!xT#3P5YW40OE-6ma6GN?-#pmGX9U0T4y5t2}2UE2t7{ z_q?aLwF`za4gSY@{l3ubF9;tPHXo#w`Hbs}jpPl06w?&i{xVdI+FnUUAejPa_i52~ zS0@Ch$@zD{D5jBV8ZqUtS*MYzACo|HD8T2UElC{6Bo5l>D;}yJ*#OI1u*B24ZD0Xb zO(MIwD{-CtSyRLwdJ6m|Njuib+YqyDp_3kI^vIxxmmWTPtft3?(1992->kOLGUC6Y zXq|*M&;A7K&-^_7bM0f9Uf4ySN81L+wGX$!#N#=tT#|ki{d6D68%!H{cG!EcU6p6e zbEY4}#Fp8_s{5gkoc&j%MXv38A09z^bq_^@;vS0bp`}@g(|S0)Z7Ftv`Bs6;LAXqE zDjfmmTNoDoeJBKSX`MWyIh@xCHk2Zl)7FQ?q-@9rh|KIM^um@PnMi3Dgf=UqW1hAl zKL-kP3~SvfnN7toz3X}BKxgrj%h_RQ7ip4j=aaXkA6KRo?aXYFe?zI|TrcT{9xWWc z5mkab{VV$Ns4H#C*y#BM(JkQ0Cg|k+3Dlu+wUDpTNy3<uid`%=XA5}6cniHaeK&1u z(I&=3m=Gw@cuQ<-*;x%Ofg@M#?*vo&&B+f;gx$^e;7CavkP>(UNy9T23?twT9W9n; z$E*TT^kWbZo1gwiMGt&K(LWd}S~~I%iZ+sKP{D&XY$jpjPSh%ys?2(@yEfUF^9-@{ zS|Sd@F$Pda0Id}*LoG4^E%F>edI%D;YLeIj+)enX#m1uQ^~j_pi4wZ@K+OP`WDu8} zfZN=cS}xJgpF+pezBH!eaQ;d!sz3(dtt468W@EA`0bn#v>JL%t2dI{Y+DTz*5`F82 z)`t$G!*g06x)tG^aDL#Ket7aH@jIdUiTTpl7%-Bz14(R>xe@S{4qiY2Vl+AQ{PpNb z`|ih)72n3j^*o5VduUpMh?RH=YS04mKr7H^pl(n(9GrA1>QX-xBL|Tx_C+yg{sb}v z{u0!}i(|W}Z$pyPE-E$^zjyHtD#z?*?x12<$j|>Q1kgoWsH6OR>-zx8>_tgCP!f6J ziAil63KHemE1kTStkslKX%8%?mR}B!NzfeZmFxOZ50;N@PbJaEXAv@%Khq3dZiZ%? zp=2{O&kQA+A+H%a|DMQ~Ylb3bsK5;UFEg|<o4S$;IYtp^u2URuu>#y0fFg1!s_-bP zfL51l4eBukhW1|*aIBX~&0hKqWkei0S7KY&Bk$#<d=n;wGEX*jm*T25n!taGL%T_$ zU1ja+5gj)bx%_+~;pLB=H4GX7qWkXs7*Q?s?ci(8Z?ep3*@B~$TeWH|mamEqg%RRm zd~Dl0CK)igE6CU>@|m0AQ=qV+D@hgEJc!M)*zgzy#}y-)MiosZ{?e}whsV%WP}YKm zTvve#vpK~3fef@|sqt38P4C91FaQxq5dj*v2slN6cH)h<v}}SvUMi@OhO06`%O*fc zfucb`k^((lb?+t#&`2q}Y1D?}DdYNF3;|IOk=GO)jnOK|b;r=4rnvBtxRmQ?Db0Ta zo-^i9cK$Ss1}1=@ls_iIRH`V62Su33Y80LWD#F-U7KQPw|Dx@6Wo=+}J`E&+@O1#7 zH5+4Mxga){7;%I-mT-J;WCuKHW&x(jG?wlsi^WCm2$+Q;iQJ9&%%+%8mXtW^vcA(8 zF8yVgQm@L2e;#yhoCaaP1`QN?h*mltGtvrME9-&OQ;*U)vZ!)ENWcx|cCO_*5D3>x z$A2GJ%a?FPF}*1;L2MZ6%&a_z^53Ma*~C`4EKoy&U<n-egqj-4dlHPei~8L3N2>Hz zrd9ZP7P<}|9$~qToIV;?PoaJ00z5<YblfeH(dxBHuw=J-<45b8?X6z7)at!rbgTDD z1n0JTXG>a>mnBiY+Gfguy{lvEvZ`N`>qZkh=d}@TgZgc5Xt^z9^FZ|P7l4CX;@Ds~ zuY-npWChW~e~YmrwkiFrup{IM334o2JQ0)@+94>qdIUw<YP(dk+FcVPNrSIjjHYqc zw>$@{P8fL|S=p3-%g#sw6JOfe4k>7C{UOv4X4lReieEcFs1!9=pRp*nK4VwM6dB1+ zqNTu0^O)MfTATahwU4GXf0SUI9VC({Bi2R@)_NR!qw~6<e20&pz!?)FUamWW8X5U^ z6rH2xb=tD3JGT5&<|%fTFw7AMU_UUFF=RwYs99{QiBz@b+iGERi?8fm9vRJA3i{e7 zH)&0ON1qAhw_h_1B?pr5CP>jJZL{?oub_q{#~s4rjlgx+s@m{rAEs(vlq%&0P!t(W zaNz_rvyr1+u*%!-z?UI9+(>>Lb;b&LTvTC;G76ZU7sBDvlwX2++8Uk}`myMaOSNrw zNf{klNC!6;0Rs#XVQ;+X;r^-*p`O3ej^Qpgj%~Grq={|Wj{&G<Z@{MnADBN}3xUn% zkn2-vrh%z5h4wUdp=R^470W_DUw1hg7WQLHLjv5nKB=@VEakNjxEQi!diENue?ZTx zCWhk30zaRF46Hq;=Em$YWmcu7m=}|HF4Ggyql^8;KK^R}n9G!*_0S(-rNH_|3)`$` zYp|93k|8MKgKvZSD~LEryGjbjuL0G>v6)R}*o|s2=1}>(T|m*N1mYu|=AIAq^Ww}V zzn%!!rV>Y(ERquZ36xQ^znEvY>EogG*4%iRie}Hs8~D>@@H5CqRAio!2-V%*kWe4D zKreALOqE|~@#XXHnu|weypc$Yeq}UP8Vw0Xo}=E9FO2-ox>L$^v=^a1TXP{ziLbdZ zO8qr3*;*GE!ifqslk2)bMnl59G{rU#+qe0Vvx_7DDH7U{K(inS#Ks&E=rk-?e`g+v z#O2SgxpAd(o~XSNJIq)}p%{g>5o+K|V}s=-3GSY!Pz_W9bvWJy6U!wxi^AhpE<lBj zsAs4y=tHGM&}at<x6T`-EW~lCY<Yi^55Sl6Tg;W3lGK2mT8CLVBXPK<ktBXq6vUcu zBqFKAk>BM98zXySYn((aMj4!4V-ZPu_zLv9RZEi$OVq;zyHN1b@Rw#yAtnS5rbD|h zm(zP8{{6-EQ(hT^nN=*NcawXbK1V_4dRml3)NO8xYSq;N*sW<HT3j5eKF3F6Ou<YD zuF6KKH{Ev&mRgW4_bp)k%^$~wY%&Dn^*&yQ17w)N;LP-$Xm;yhsh<!Wfi`F&C}>=c zvh+DC@x*wfX-BMS1yk*A0%1fyhRpLAZrDr29%zetE%tcf2BA2@@dP1+>gA?-s`YPH zM_0xzZ={4syorIF{A<zQ<T+tx6$byKh+^S&S<{rUUhlfB6!pCM`Wu_`97=<0Q+l}g zc)!<IT8t&zIpZxXz|bn+_3?kDWeFMwq3OlNF#Y-r^&Fr`XQ0V(fdA<Yf+!zg<pYpn zzav@E5?KlHrPxq`2aV)sD5?j$d39B2!?{zH(Oxw51$y+Rw|adji|3#i41AD{V=>83 zAxBppfKi^ml+T1HK@UU|Xet!jGXA}*VO85tk5V*J>wPjKQ9wq*u+1}Abw(%z{=ET$ zqQ^HvK?sV?Tt6R#YDo&XT$hiwX8x7C*Fz=6hNhhzEzZhP#<KRiPC2w@hxJ|0t5u)g z)#R`q^c=p=o|T2c(oCyUP%xS;x1&L#n=Kb;_+5xs9W<>$2zPxVB48tWk9uYCYTC^# zbm)s$vjUrT9&P}8DL!d63TD}B=y}|F-t%^~`>rDnwsobpCJSfCvqkb0N?u@n9|U<$ zZut;hfVKM8HQ5him9CBo=daO#DpHZXBNis!h%C<jNi1AP;TyC6DHaY=_}c7HEc_sa zr)EDA3qM5RvDrVRa3b(GAZ%=0gMIdsW%|}NkwmIwk#Q0%U#91;29Jx)ebK&q$wm%A zsU|@g^6`416_|DwG|RAmq*H7+Xlwh0Y%4B3u=peIe?U7m-~p>71zVI+eQk~8rxsc5 zr;%zTA0iG@2Qt-uBe@CRnLXxui{7t@F!m?_x0m4Z&SmEHWcGOa)WrQufH^WIcvek> zI?&-9)1!;6iN3e=IaEN!s@VQt5xMF3`2-JEs(ILyaFjjspgNJSeTTe^Mxhb3#f~(Z z;Ao@u8LyJWZxKnCQG5L-q!N^n32-ra2DaWGBaSV$YaN67SUsPRX&s+whvV=~PAKIA z&pLoaoypJ61>UAKxX3#A$Ku-yw+L!It{@1dM8(QGjXwMG9d=|Yjrz6Z+u4nw0*gMD zElx@Azu9vE?l4=Ylw#~Uxa$TnnrK2Q)DEYiRGQoF2MdzYG?|p939MP`m_|-I@y#6x zR@-BwA4KB!rh(hA0h6Y<D&vZai+D8#=H&;W^poCm1-5D$3hnjw$ONpdOW}$rihKI{ zSaDg^18^ua+bKep6rty=S^?(|!5@feJOo)5)xb@!N%NG<pFyqmG&v|r#g&Uf!atD? z4}5ssFhas{Q4h|5qzwf#@Pw?;gER4=2RrB)I!({V+UdFT4SMcrqvyV3c&^+2Sig9M zy2WefVetwc60fJ5#OwET1;mq&1bgsedA3lYEi6hR-%345D}Ft6j?!)(&_kX02n(Vn zlAEO<7JUQ2PE^2jtE7W!rY~hk5Dw;?4dx`73bA3YjN>^;=+*#XxX76j`*@juS;4>i zx?x0{4H^v^jo<rMh+&!$%Z(0Xw^8=;u0PWJMZyh@>t|<L^Bv?x`2+q4Ozt|kq+mUG zq#!`vQe!<yVi|r3OY%ujz6v(LtNq_#@6!`-4}>SaZ2)WY3FzeEbUVK~4e7XnA|D%b z8{$-#R<I!sg;=2N+JV_?qr_IYh1;aw`3|p=pxqBe#BJPc+dPJitB*4*@(WE72h;=@ zIe#kjIa-NXM<uiv2_{?6_Ro0C`we+^1G{E>(1hBJ1~5Ta+V*j5z1F+X;l<?H!`^|a z1l?7gi5goHBIylQ1Ln`yc{TFoAfq~-|KUxbn0vJfU%TgS;%f*Y)T3>0R;(Cez0Gm4 z16ss-=Efy$G+`znH{Vd`IqLI0yXd)3uvhRY`W76b2Z^zwd=V6^7JNp;5O4AI=o9F} zbNE%D!}NEKneWq)1a-A$AMqP$g2BD`&{l8wf@F&^8vZf)4zG$8-gXSDvX^N<(%73! zYmN!*u=c?;*3&!~-~2&>)v-s6+BkN!cfNa@`V)eiL~t&^bxdnMZ;oxT8jHlSgS}pN zjU1$vLuQkwU9Ky~SHpO?1%ra<Knl`m(1X9jv;MKq@T@x_*ZDwI4m4d8a3_r$dHZ-o zHXN<#N~<})d{dIV|DgOrjq@mo?T}fBu-w%&N`9fvo`JYZdo#CH=mNQ?Rj%tqBUC1q zd79-P{~n^%a0j>ifR->?hz1(Ue-tl0+M;Gln{7;^Qx8%bcPYq-QZ=5Y6lmP4%ua7r z+yw=S3jsOkN9w3O1m1NkKD7{i+PZEU`nGgs;=5MF*I?*&xrdVCx>E36^ZC{4OsE-V z=d*1CrZ9oMCv+am<tWC!okU*O$B1EqC+=z*E$=@X%C)zdJkoWHfS;y%NnK6&CcIZ( zjF%D#?{0xtG(p#60waBo#7N<;9|<fsD<w6b2bA2J&(|v{HJ@*igLE*+tPm~Yx{3+R zvtFH$6OD9YAdAlHnu{c}0?w|PL*Hp#Y4~oi&bwZnQuBaiwmLB<mK7}&&H4qFTk|pn zz;y!PX=+(x8~Vk>eVPE)$aQbf`%YM)=zWh|cZlAqT=xpSH_LU;(|fsG_dC2bA%yWd z3|vwu_#9q7`Gtc%z8o70ka-P3;>9xMG8Uo%8QMcE%eTWQ)L_jq3$DZZeLKX<MG%#M z=(+_Z5U2F7kstX4Vp^`-gt4#n7t4>3JEmM$i>JotD^9Ra8GiPH0(iG#JEZ1dT3GNR z33qcmn9b(Z_EA?zp`A1*?3I8|-$}EA9()o{Ih2Q(u$VRykhQB3!9F25GSI|w@Nq<r z=qeq-;be96a1s+E0@Jn{{}MGb7{>&30?!E6q_X9@-($xVcBe7B6-W(CMu=qM85U!P zYSHxoU^I?~e-kvJviGMq%XL=*H&yx<l=#&mlnnXBg#*3-)iV^ND*HlW;`Q-gWFp5Q zGPz6(ivdf8M8-EP9H<w7VF5>xW=4~$u30FE;oMeqcp>{d=*C!i&M~V;94sG@%&As! zJ&}I!c>jn>bX!rX$t_(S_};x?sKP$}*(Knat|J7}zd?TF?<icZ`v6a^f33XzMG=38 z{P1-oiTm$VeyH`|jSb5Fd*t9Rk=84^sYc(^fodwZN4o+QkCd<*h6v_qSkjZpXcFv~ zW|lO?v5pB5xekY@?B=JQFx)C#PgCm(iQ_e!1tL^pBBHNZsv$D}1!P(W*}{HSI?#0z z0d-u>=Xa><OkP4*irkhZ_-bo{IsMcMPHaTVRxjH_Tv^*%4nRLYj!lyWA;il}iC#%( z&ZB&x?;%EI?UB(YYC=#UO4ft*l(KL@4{patbTk@!NG4+#8KMl6^?ZiF5)wIZ+J4UC z=mvhI6GIidDf>t=Xopg3KStFgWqNeXs3}pD#jqL^{1Ya8Sy|0K8s&GWso>!eK)VP? z83OWLqmGOA3aW|GPi$V?6_4)JP1-_FAtvJ1_<gW>LnMH+>lpPm%?vLhQ&>#pSAnW% zZ=2l#0f{cS3y=*0z*f{6d;_R5>Vt3M6&4dcI6>-K2pDu3GRVO~!W_2sHm4~mX0!A* zLk*G-EF6f~Xxuyj<z^wg`@M?w39KJa3<FILp4c{V3k>}Cjq7XIPDp+44p%HX4t9V; z-evu2T;{20`&BzeFvF#qkiUIG1YOJ+EIg(~O_(l-4yk9E;2J~7lVH=f1WHz}!7(D# z4EK0pd;f+EuxE3Ic0NnrDVU?5y}LERDq6FC?BdA2P~O?}*8C`8XoslIu!lN8`963n zk-b)vm7$axLPKWa*=ot~MsB)!oi<le61-kmlg_3KnRL8AGD8Tf;jwE9t4QL_H2{t$ z*uR^wW=Yz<XHXKFd?osjiE)aB*mciBMThCj?5k@cDOiX_1L=`5&%`O?%oK?7He?5^ z#Kf$fzLV;nzLR22K5(cL4WaR2#ev9TShiPSClRX+L#!v*J~8`<#88M>gWryHGqW9T zLgtrEy`;3bGQ&i|Cz%+ueTM-LvV~k(7i`-4eI{BiI%T|=V1%gEeU%BJymOGRI}pf+ z@o=uNjnKkjMwW<F(u_TnXyOkQp5v#n7p3i^+)|mk2Pb($M7{yO6I}pgV!qr%TUOdW z`j)oDXjO>Tv?#<63DF^kwvQA*3HHi8^uhml5YbPIxH2ZDd6>|}lnk3-5)<liLt9rn zYMR-bwWkSrl&RW2dM7H$eELzGLB&5)6ZUuYp_H#tfK7>s<<F`LS^!;(LTLfCZiVDr zTP8Vwj^A1QZn{l!-iqH(@M}hzc114MuF>O}w8A_rR+yE}z%JTJi6;v$TprBr86){H z7Gc=Rh<rEd_5k0f%p=(_wl~R-HnV2(c&M%JpfDC`@SEEK_%FFY^t}bEIvsl-`iJFL zDcKLOh#^B#GweC7p23ZFPrv-&Q{cGT^TeZ7aAF}lx};1f^}`)R`$+Z-R;*I(6|2g- zzKhY<7sdo6smVCBjHAo26jfb)_G!cY*rRJD=MENrnNqbbTNTU+R_kG?&CjgC-kUr0 z6s6-mgWh`)*NLAUfy<A>6rI?RZ>e8sX~>TQ-ui`cTB}tH3+%^+u*0Wv2v$H@wAMH+ z97i<#^AOYy6Gm&b5QR8&jnw*~RN!DJb2EM$@C)F#8o%ZE`S2^ikL5nxspme@i8sfa z<K2ySH{LyX_uzdF?{j$f<K2(<0Nw*38|+n>8GEe#(dJ+VRr+`M?ZxjH;fBF@)sdDR zRO6A~X6>Ufpz)#>L36}lL&_|;7iSGbJHb8N2}xg^eR=@pX54{NjJ|i!(jDut$B6ny z`{caYC+XBDvylV{0^X5}?*M)~@N3AoUVglOp;h}-wBBc;_5L^lHPIG@8Sbl3<FwC2 zFVv5K+%W<UH9!rcefFtU`;2;4evs_yBXR(DCur!#?;L&u_}M_913wpjSK)`YPDNYe zo|A`h+t4Gpf8k*l-ndxnVO)mu2&Ln?rAHii<J!bWaAD5FHoUPlII?fdHu3^r0e;Kz zTTi%SeUooR3ykOs5k_rC^aJV!7&GpozQbsPr*iaC3m4sbQL@xmR1`=F4EZ(3Zd}3n z{x$j)#4_-7&VaEN&@(e9u?-Gwa8U68$87EML71=qw(;7~?2Vz7e{!-haK_c39jnIz zwBf^Y?EGgCy)TIg1A%7{h&;E3)&&@ahf-jprkitZee-Rk;|td&B@^Yr=3>u0%<tZ3 zz$_C;p|e&SoW=$hzY%=`=~^yea5sk@x0gmVe9&;MCHszXZ>n)`igE7@o*V^)O{K(N zTFgG79h%G&<hf`Zhq)C-j8E7Z){GOmXRo0xEu<bnx?y|-NrXlsU&_D%v`Z2H^+LM6 z19lI(Qpvuw$WU;n%k!kOfRcmJJ5EglQlWis;cb$%F3Y0e>=g=`KhN4+JC`m2S3k=< z@zNMH#k#D56#3DE?4WsZLsSCB3{bfC%6eFSalWhAFTZ$iLgtB5tb|j7y&EUffuRD2 z=X}*D^af7;T&NnoKx>-ed8>-kzCP$15~lbN_$mhjO_1QG-}-K9bsz2l8g^FihqL;S zXSyzq>l07_KiqO4nh>g$QUZ2EBS8q6DL#=xs<4N7-OYSjUz^rpiEf&X^lumL?JefT z0G7-X!aq(_o#u!rJiPEmc*I9@h^+?D8TG(@33g)B|CW4v2l%rHN3UmiPy=D?z4Z4( zIX11|R<)^==VC{T^&?#7>A$aFFD-=d5y!&TuqRw4!{R!?>)*#jPR8L0I4Oo$uZXRR z#wxR#FT}yk@^O9$JGf<y<XcSM5-%X6C%|>u&wnct$iEnkQ%0K_u^pF68<d{Y?-7N5 zUI#F+iNMfE&@gJnSEek-F7TD$I`}O)0v$BT?t-zBPdgEtY3;lp4EA-Gn7jhO7Cs20 zu4(!sx?V){(6)JBdszXQ=ir!OgkG$H){jkS3y~1Em4R?$Mis|~4}7Jhw^8OyD)ZTQ zL8*5$I&*@U<l7=R{UY2JqaDO|!DpN2QL%yTcOlzz&<DyIk3mN;DL?}>wjtE`20hy8 zaT<@Poe-%ki8hG*Sw0(l{LkFg>#*YRUX#PqTGfs18f&4w!qa?TJSC$U%dxRcIQStd zrlm41kVdrDyk@#{kh3-IAzv7?ZIP19S}Nnp(wmjb@U!E$CcRnB<>ka4rV}`<tuPAS zj$yZ-NZd`2$ZBKLN_LW$qt)Ql(rRZ3k=s~{#${!m#uJqE0wtCIq3O$Z$3MaK4R*)K zzwIaTcGDv=VL#P*H$5Vw_fxHR(<AB_>f;jX0QCs>erVMl*v)DOv%+g!O@v?W_2}%Z zyiW2P`z;hTz>op|f?XMn%HbA{3pRB!TY{ahH}r+85wCjLk~Ml^TX^A`?Lb2@*P1(E zdf{o7BsRg4SEHe=N3#k~S5IPvr)e{+bfum<4h|WoBd2%(Y8Tei(QA3g&yTQ7Gd8U$ zHcC3mB9rKRPjx%pDgvi-iDxxa7l^cr2^+`qVpJu-(M4al23LGs_Lmq>5=V5R9fnz; zv1d4lb7C0U{M4H!vuoMskOo`79DEoQ1$toaG?Lq(G@8C)SEKWyzG0n6f^QgE4P1!z z@hgA>#|_?~_(nowyoKYnW@M9y?2krXctb!wB_ao+ksl$ltkLG6!^Da!u-!!O<FAQ$ z3Gut>fqmU2SyKp1S?J?4f!>%yA>5fT4FR0b?}v-yOt@mq5MH&DLWTWBm5xwhcTuIq zXS@yM3B5SNqmHUAbV^d16v^66bOCRMkDsQ(0CEL6&ko=tbvMz6M4YKV5KV-0?SM!( z=1?{HzeM99mheB_ry&4F$RTq-L+tefRrLOl$^321sg)Bd^bGT=j`uziOpPmy;O|2h zkJxa-$-As=?xl)t!4j3W)jw?*TR(b1{`X#0tV`6h*nM`^r|=zw=CU%~&dx;kM5iAy z<<Q|)d*&%zWa7H$A`>w|4PRt3nJ>PWkdh%n-lVLy`l*qlaLD$Y6raa6Y$>o-Rc;tv zZ}%<$EmJ{DWYSR3zC?*P3SH`_lsT?G1!OYHgZ+y<N2RZRWrDH1Yco2oeky<Cm0{W+ zjLn%s4{0W4LUA`(v}Oy|WsCbng!-9KSfc*y(HFD4Yzz)=wYF(JM&>~r=EEA=Qmb$_ ze*ihJtLs$U&%!Q`6(C-cp~OZ05}HpJ-P+QdTSD^(hrYfT`WlFS#Z(Ei?_M45yU9fO zaNk`9|3L^O^j$`*?<S$|Xu%SP{%RTSuSvY)KZfhvJhH#w_wLW^^}M!as&+nZE4DYS zs%!T#`20j>h?kxu0+ac#fPt2v(KRT43g#s88p5@X(P1vSo;~ym>I(({)7_KpwP4Hy z*h9}D4iOdbs<@3kwATzxL<lVY^FN_mUZ7lj;SAUv%h*HDUj(pm7~lg~oZ#H}0^#Eo z!|}!Vq>N2w##~_bvWE^Kbj=_hK7Jhl*h9zgeV_)9^e`?}6H#r^&^Upt2_c?<PZ(rF z``<u_C1%%Pr%#!f^*B+b%03>3T5R0F-~S_(8QSU#=h;bpt=-nY7t$AhLn0AX9Rm^| z*<U80tW^WbC2S#FJz~*~6pd2|*mhIHe*P#0#R!Rwp*h<j|H!2R;*R~8stdtjg%>LO zF}2=MfM^;DGz|wrtA@yWz$9xFvqk~62jIRmn&pscM<}%xK?hJ%h2se&Vu#5gGRR4n zG%fV;oJWbY|F6h`f*8h;JILA_Kz=4Ju=eyRGfMTjyqOdx$l=L;PHr){l%x#q)`Lyd zCvX8M`vS=<T!BLwq;z>nsYq{y0`v@2Db}-F?C0ihP%hK9u9u(y{Dh)6tcSj4hdwt6 z$ME21&Tm8x@`FGBGQy-Uh4R-k;hN3wM4>Q?#Aa8raz>f~dJfwTxWT2f<(j7;UVxw5 zl!+QoQXB>1kjP#ejM^=GFA+~0l+~8K<LH~zIMyRpQqbn|Q*piNMDPg?guHl|HRHMk zeXCvH>S+GJIi@+Z)%n}s{`MtuEr+%V;PlrH&=Rb{WvO?1m#BTAho&I7pKK@%E<55D zt9`=t2h&7tcPa$juoFRXX(-5Hl=m4MZAS7N=<NfPk7nHqs8nWCeO)|V?B|8ve6At* zDL`9;6p;qWcWr3rXNZtrI4r+l^&H+bA-&n_3q6`d>6K|q`Lchf!R5%ot`j^O+u=UE z(Gdy`APY+Kp=1K|(OEXW0)svCR59Wai{2|8N-jmFVtzODQteP~6aZH0VF0nuB7kld zKyGTa?RiuTJouEcHH#9aI2*Rd6WYkQ-sU(ZnWEAt3W(~rCs1=m?5%a;L!zqgkNC}2 z3<o=b=hvV(^T>C^H+zg?LUm&)m$fZ)Tbg!Z(k4gEqOmCDIQGCIviA9;O(=FO$~a#0 zNm{)#Vr`YA`JUIS4wAi&%yrxTjm&l6&DF%4kF<a{9niX2zsZ{mHz-rIZQ#v`Y*Qf0 zmJj~fWXpd6a0?C|e1C70Edipdot`<uA>n$Aic8@cMgtd19t;Ze41%9eMv-N^2}oZU zU;-N107~K~#>q7MMIHtRqkyZh)QBGG(YoQ{d8#;6*u(d~2iBi56Dkpm1M1XpJbj`m za3=3G5X~(gQ1WnASG#?~7m<0|;1}v8BSG2$5;>&}4&Vef4q|z2!-<hYlo!URe%jw> ztua?4To5;cU&WDW)m|#x6mV3mSFg5v261^r3x5&4iNpLmK@2K}9r(TNsH|KE=Pt>> zwRTMz***BI`ncBMU(nvg20+#tUE+HUzU3Fg@H^=cEr;{MhzaF!ADsATT+oonM3fk$ zp`28|k1J@=%o7X1;&dOweU7XWE<e<dB5JBX1^U<V6;eNI7+ZHlt~-c;{6ank%aN{s z#`g#`*8mMG>;#&-j%47>YUtlNb&}c{xf&K7jI$Z?3pbKm2%4;;q2>)F+H*ZqfX%Yd z)4%Z(i0u4)a^^jbeuFnQRykOK;M{9xRTm3`v~UjjLP`7%?C(}4=sAv1jx(g62A<p2 zv03xi=^69A-dnKgahAVLTfi@3Sk^4EPO;(o*p0owy_L2RW@8Y9a;CmSlWdLM?!8$( zk9mb(f*e4J+m9kv9cS51k!4D%2S`#yp2?a+JR%2|121%lA)ED&ek%rnD^Np&paH8e zt+2!3)?+jf^y<@`u3clR0?;zKiqVS`DV`jgTvtlnkOra4Q!!@B%)i`1{)sQugEkBY zcH!*P+U2<85E=K<T!6)O2RblFC+L`Z+Mt6|(GfC^<p;9OG2-KW{|aEeB2dh-X;c_* z_vUYilY^fiTW>tg8gM85UkG4y{O9uk73Y3(Y>o41g^*)!^oqBmF&A%I<8^BN@zu_C zY*CJLo$koXK(sdk6An_cNoH3kH7rU=t*<})xrBr+Gl2wfH6&IFNtpWjwhNT@ks(Ix z5ZU9!NFE~mMnU)#8r{Xl+p*Cs=A{e}yAo<nSxe*!@+C^Ey<k?inA<5Ae-2{W+-!*0 z=+FSTj4wC<Aro_6zohaD?nmF1h2zPQ7*t_mAmO!(`t8JiVqZJlb6?+hZDq&u%oBZQ zJb8}EO<r}Hm;%ge$4coRzwKR`5^zs(*PFm1{{dH0ozZatRiA3j?9I<Sh0DosMeC+J zW7o{xYTl@d+p@6E^u&uBU~j+;uxqJ8Fb`1=-vw=Tr1fMKFthSb&-=<aB$pQRW2h!Z zm*;);cK^jUAmO;}`|6^sY;iYhrk|fX1XRQ*RbX~ptw^Uj$O2|oLAc;%;>ei;6pSK0 zt_9hX1e}s!!axospg~%&q0&UH^ZY&_5*Lk(C1=C?o<**%V`xHPfndkfraePZw9y)^ zv>f~=1n4{qwT1lS282*x6%~jo7xQ0=ue=VT?pLU6^k&?f$>+ZsLK}63z7$Uvz0L9S zMK4o6T!a}`u3|X@1u(_Lu~r`jM<@RfsEhfnz=r{X-1p)O##%b@UVuJHK%b!Lhx&kw zbaZ<i{+bp>hlw-o%Qzn<oQB%L-2#~_#*8os!|lF9QfHywv8!@{-CqpFAc}S+(6W9A zI`ntB9hGi;4#c;x>P{%7!2`e$?W>u7UVwQ}^wkNlCXYaf;slDie)vM+pV5Q|=Ymy~ zmlRswY62+%v#%oe3QE3805)3v(F=QL`}zB1u|b1QLvL*Si=V$vVg4iFGSR>sGX52G zIllu@U0c8|$UlLXAv8?PD1>mkG4As_A@qLCs9;W-P=5%!k^BOjXbaCZl(_1aS*EB{ z#Z>^fqojxFhe5dfqHX@=dCsUiHBK9QYv@=4y#K{K8+CkyF%tWBWXt&lXuzr_W+nc= zu-|sT_09Wjwpwi2#P)VZ?zg4Xh`k*brDKohaRhhFz+)MHoADdkL;FYjZG;{BF+;Fl zzuzWk_{ROVD2@v#ljGNcUpszn_#MWt3BSGgVUMO0do=%t`)yPhGpN$3_|3p?9>v7= zbpD_1x9xh6$`$)<K74+|e%n)^1${xlJD$gPJAM)Zu|2Y{-ESl4|K5I^z#GFgv@7+G z_S>Skm!XK2_^rWjJ$?#)TkxyH@8|fTZ~iarw^3otcn;6K_#MXYG{waF=Ko~BO^j;X ze}~Jlp|9W!2c`x5aROYmTRjbe?{x#m57luz2Xm3>A<x3>?Z_>-CO1?#P$UkLBzHEE zRP6`gc=JpPq|PWGpF`7h<aKdEkJ-f8JoBJlC^y4allBEvW}LF2O9LxifexB=Zlqb@ zHG{4}!O1?Ha-u7K`Ma2Wv^0qyz&lDqD|@S}4HAZK)82v!mW~isP3O-60?X{54FQ_7 z_md|`uDBwHacB7X_)x0wm4#VdoEl_f<o%0g*|ZNV>XrN+6G6$B5Uel};2JP?FtWnO z-<b*<51mxE_M$2l1$P^dxHb4$2zH1uJ@2$$(h<3oCk|obvcRtuo)#)&Y>IK9CM@qX zE9v01FF+!bb}#|0A6>=l?YtC|z_rsyE`X`Ou!soGhJj7rGgmw_@XS)3;-pYl0_N9N z^(wv-(=@JVr`dX>X-tRd08K(W5BmX%Yvtk55XMo;Q1lRGg7)#W=8qGs;fCezxKnKx z^gT0xzJBLbc-CBqqtj~^H3O~?eaGp**_C`YN&rO}JmpJ8O*M<^%0W5e)WJBqR!7Ku zz7<+7nu;oXXCf+0tCgKl|5!qAZlbM5uG@hCe-<h>^RCZ4l2zae1yex*yf}O;!I+(> zhtd!<lDolzlzBDa0ViS=dma8Xq7N}fGDkYwDOyV)fXW)2hn!h?PWd6aVqFjBBG?e5 z`oYUIcn8#hhA~XkI<u+f{AfBj7o@@%8b#X--=*XR-|YI5bM=LPr<1LfapchxxmDiZ z?Bn}Ki^?e9V<9Rt{Z(rr6l<^Nu>8=|Kn&QR7x7SCX3;2vGfqFOSN{&1N{%52iA=`H zNE67%lSaUV07Gu(mGSTig6%#OB1HI8k9(+HqPdOa=cvBo0Mtrkz@03jwmuxRIp<?R z>PjY|`OG_6sNuc?FeZv-Az~zJbJiYeAU#OTC2vngy0(w%FUfU(0mBaA1PvpQw&tBn zx(IO_EK1rwLS>P+zm9+rB>aZJ+eP{f{<5rXUYt5zelaui$U1EhP2HT6qX}Z-^gUER zvzw!UOAQgnFHJ=wuk(nOl!E~(M<9)h(y4q0_fh+Fk<R}*c_gq$&_Ojbse#bT66MJc zo(D^IU4?Wuwqd+UW&JW4e^^J)mFISiMMCBgVgax+`11fUt2qiqM}XskM^UFJcNK!W z(vSs*n*}Ga5H*DMH1V30E_fppEI`0h=)5nBJw~a9=&FWG=GS~a8apSVwOXYlugMs& zi<uv_`v{3K9+rWFtlh+t4r5g)I1}+cFc0B1N6BzEFA($+ghjNKr$yfWJrPGmr;D0+ zFeV;c1l(O|NHGTnhP)g+j*4Ybl?o9*TqUAIdz$iprAqniF_CKarTpS0^XISAP^}4? zs8(EM(u#F@ir1@&I>$v{>vX5rTPt{Gkm|SRzhA%aV{|dm0>kyYO~er$BkFe()z6C* zQK2ma68cI-Xq*<DH;fAEo_S_nPzlQ(g0#LSs)9?;sSegwix@BF6E(25nl*R^Vz25z zX0P8LC`p24CDaqacnyUJZ+f%vdG@hp+=WjDo#?=A_q-?9{T!`5)Sav)z10`0n?squ zZU8F|>mKS=&wJZmjX2C%*yMb~tTYF<S$lIpi#{HWHi+DWGD4IUleyE_L*mNFh%pSd zuSH{OPtzy_FVK*=7{9iU;v{vwwokw)*Hp$=WQh@~y7-vi#O7>19-n$f<fiE8orqvr zWL9)s2zl?t-n-zynz@&Xi-FzzRb1f~mN3vIeiENrnmEDjV1kfz!9=T8h{IGB{KF@N zT?RKSw?mis8?9qZ6=E{~xtW)55$JI6gV2bZdB3DV+zkL|5X*+(qU-;oG*7v3N#H-! zAe006(;^cfXh!G;6Na`w`L+Fo1-Be_MkeqxyM|ikJU;cgT4ARV(+G${x`(L>l@RJc zB77C2>VOen0DBDFeyB~bfGdL)12+Ie=StFUcG$!7Qz$7i4gp(ez6(i+!hn@<!LfF` zP0}sHd)}mA$$Z@qDdgKgdu^>lN>wT^Kx$NVAhP)4Bcd&E_W9D-2_$A-27yC{^8Q?l zP3!Pt!)<Td7r5eow->6JztU9!t8SujV2&hsTB~tTvyoCN@fVhhsS;(4X-Txltxm19 z`Sm%J#=mz_LVV?=@JWG(65+)`X@b`saawblcF<OPp3GcZKB*k607M5MO4&iEGf};h z;bJaQXP7OK&QIArt>VU&IDHnfFQ`559faEc+A8vP;gg_k)nwD%eQ;0aAEM!nIaC(^ z$<INj=}$tsvZ$Y@r|PoW!3>nW=~DJuI&p{A42LXYwA#fEsRrE^8LhRZ!C<`%b8>7W zQgEiLdV<!3zskG>z)<LF3ru))Po4t@Mq$*YEW^DeYL1iY)3QZ@DYdH|#x{~7bOi<> znu)F|!yh{kd3_`D7UCui7qC{3kLD3Xe(~#X0LLLiVgmfBl3RZ@)cN3Ri5G=M=VSEX z%2F>?M;N)a!xm^=@r%HiQ3qRck0SFsTFQZ~R{HZNXYtoRE^MS_3w9afblfW@rhhYR z#Wg0i5Ix4Wjg$GCJH;-t*#Cz{c^W%f7=749_S2aG7$15N14De)a+e%@5_GM@-#2;5 zpbwaSug4y~jFQHb7W?^+(P<cS{6U}$OIK4JHsO;=rq$lGL<qkq<hl-jzhovarP42} zh?QPpmJWEi?tTy$we)xW5a0E1Euq@LiiR14aLRR8jDVSh?@*zmsJPS*HL1{5RE%qy zjSbkdA_WZ@UHBs^a<GE36xuznD*JRx<fYif06&t0xk#ZS_jI1mb3uM+72Z^>=YA%t z)wKj+v4kUidc+!Ji&%rWqP!!lHgNXn;V=GKSZ(M|xnUd46~v}rYnma$41Wn_l!2}M zaA|anfrmPr0I;xiJ2GK16@M7jj&~1h>05*N!>pCw*5i?d_+E(^`m;}Pm^|Kf{M7MJ zj<=6FqMqwJ%X$EXBaBFK_I+eMUNzPOxJ~vd*#p>(qZX$lVKV;WT;?f!+41G*dl%;? z-j&!<c9OkA<y7FW@I|dsF4*|UF4fK7ge?^69I+i8G>_A<`-(%@5B?GjNB>NdF|P+0 zc&etlpA1rY=V<c=4B1W^LA48)S5>>>wj9CJy$$!_b{98Hg-j1^wP-K>4jpaTIx&>j zjnivzRP*s3xG4b!Y!-2{p9ss>3oS5yEzmkhEXOxYTNnw~T)0L}&<a!HB3L@5t5!sU zX`y;=r+d=GEtCtyhg*Im3m*`LSJzy~P)3FGTv$y=k=YH2^EN9<^OlP!Y{E*B=}3dD zmmp#Ko$7dit78R}ZQgR#wvdYWcOnN{ZnWjor@G`9UX@>TEbeW#DRz1Pt6En^WHMYx zP@XcY;nkY1+iT8GLi{GH)|I9;AMq5r?wbUn?YKFl>MGUdIl6H=f;Mp_DDD(YS%MpR z(uCR13g=JSSBR{@^#$@D%3aoXa0Z^L&i149ZO_10>=}!it#!mHqiSIX1j}t2g<7U( zsRJ9Y<R4)6?#)ZFn17`Q=Yk6djEIaFEEbo`k2P6aVU$3}qCw;IxfHKh`^pC{>Ofp% z8A*x3WL%Vl`v%F<AlL=#r=dwXE8Y&Fr6vY;VPiUCfuq|Of-$1EJKE9fIxb3vVHXSJ zLMN_{j3k793F2|R;ynrYEyksh_xRKBsGv(D=^n`?h}u?)sBNndb<a949(Vij*ti;x zts9VV2jaHfgSc&*5VvjHhR_Q&z!|$?vXP-o^HxV8M^p9cb09-p&*5M#Pk{UJXLydL zAJsmP>2>k#lk7OIB)<g?H|#a-gKc^t_ncA2r=KA^`&H-)@F{Y$LXMMon{e4Zu4u8I zOh1mx8?Ei>=(HZDcC%_+H_6XF1;9wL=XG^X-#eHx^g>(=XtqQr(hBWXL?CxbCmKCH zuhX}*h||KsECKpKtl4k}L08<_r}4+yKClX;bj1Z#@f_Ww2?r<C@_)DYCGbsE+5fLA zp%jT)wF+p^qD8is{bg-STcp@RprwGw65BwFX;RY{pbkr+Rl!hY6dfE9*#=Q@#1Rp9 zu*j~$$S5Lc5k?+X9Z+N&hW@_izNAURGT@9e|Nm!r>FK@iuIHY6?so2Z_d?-r2vcdE z`vhct=y$eYAjY-AbpG_&I@lU?94Uc*r?s1;Zy#kk*vfz-eQ>~$Hdunt7i((8St{7b zfx4R^4k#VZM<&5@vV;2M4!X)vJ^>q{(n+73G|8Jqb1kmv#Fy$8F|Eghp3o!@B)^K= z4RPT@a_!_-p-X<9tV^ErszS;`)&a7NhNbCsQkM!Ir5#iz*RCxMU>SfN-0FD30hKf; zIWRccG)Uo3VCv-!g@fK2g9$}byPyS$;AnrvtnBz%_a+Y+<QO)5<nR&D8gJfC+cheh z>?SOwJ!I@XpwIgXjRm5(&eEe8BjnzWb$rqj?=jA%vAZy|Q6*rrV*5Pw@8I)7=_Iq! z4vp9@P<6WYhqknx8;AYb(8RPWFsJ<roD>_{{5Xt}488vb>4PPhtYV)D3Yyr6kCzs( z`4SE>nDz%`AUD0}(;$u|RMPfjF?2bTBr_yO!=;7L8$=^ljK5Y|Oe%zOkk}4&^17P7 ztonB!1>ujc&yAlI{FIeP2JAox_MKrM^YnPg5a{bSd_Hv=GXql90>{a3;PhD$M^=o- zSBDe`148Dk*XW!G`2>q|oDl)_+Rv6XH_KY^Xl5w#Rkf00y08~JwWODIb3F<l9KdP5 zNvGLNM@J216DbjX%@Y*Tnb~9}OUIb0lzw1liu4ULQ>8D-G)SMZSC#ZJGt;Dv%uJWw zV`dNOb!PI?%goeC&oQ%;^ei(4>37VuN{_;<U7y)JAycYjPC3$KX7-arX68$7W;&!& zW)?|zGjo_!#LT;;d}fZ3a+p~vS(#ZT>6q!3dN8w6N@J!dbz<fuDTSGnrDT|d0_!fN zGXa!ubsd;e`iWU*l2u~X*<{_ztaHeU4J?G6OV*9dI*+VxGb_y@rB|4BAz7C(>r%2l z&8*AGItSL;^*us!c)3zUeIU`2z_bWaX%z^9Gdyw5Mh@u}!es<=!B=AXe$1s<$|IMk zM5f~S7)wHaFwSjqDoWhC6Lh&oc1f`$6a`)4WS3M+!myyrk%w8{oh%7=2VK6BT~wBY zF+rCPnahMUi@ub(6iaWB3$S5*aB=Vi3!FiXex3GCVv``tuYEtJ!;A50xQ7f{@td3B z4(-#26PeeBm<~(g)2e>JSu^WZ7-2)&s`$R6h+X2WIQ~8)U>puajy1>ldm+-TW@n7Q zYtjL+^Eyds&WiP4563Ib&N#mkTB=yhB^~giwy;@0r{mfkjkRlI8jimY&gaC`hhu>Y zk~s(j5NXfx_i1G-E*%?y2c`cJTsKhqA0YjAYS+a!%?xgFgtc)N6=BFPET(12Nt|tE zrqhS8Wn5ggY9~8Lm|I7}WKl6oPXU{Bq4{|5pf2W^z!JgnShB(l<Y;vpfeFpy9*|&} zHS&aMWGXI?Y(uA~<faDnr_oPByJw_|&fij^lg7q+ef$ShE=)&K<zv1&)V+xJsn+Su zI2&@>L|uJOhQh|h<0Sv9rF`rY1lD8G&}k#C<;C!Fr9;|13$+KQwi`L>H*hHtsg;Q3 z_3;@Fx<7L!Y8QRfP|6bd(Ru9135A1>K?-fA<KssvF1Bw9rTd^0Lnl5p`SF40$WAiy zDYJ4rwJHg&a+KnL3Qq5CW>T6vEV-%TjW}qnKnWQVP8!55aoq{m!x;0hs={Utw7<iP z6S@oXniDi?oFHxMVo8`ujJvVk^&O4&bTW=~Eu4b0weXhnDVoRn)3A<#I!Mcnl5)wU zYuSnim&df)VGeWS#qxKcnK3rB2V}-RQr{O8B+d>kHNuP}^Ux7f=V3I56bcLJ#3aT= zWwai|k>`pKE7>SW(=`#Sv@wC4h<%|DKK1560T$@WJRwz7WLmcRkD;Ameb9YfKTB@P zl$cCh^tp(_Gmcw<#EIkRt5e2tq?y4uPK8QKWE`gob6gs6TnghjWtihsA&z?#k*8*l zZ`A&I*zw~?-)D^Ex=$hWiRQY}hoZR-r_Di+YUEK9?u@ImBS9?3j>?rzJcqn!lVLv! z8_*L?3Ne460PM4XPXn89c$#IatZsHZH<=h->;@L>P`46MECro9Jo+3ga-B!UJVaf) zW$V;j8T})KJ}wJt8*DV!O4kwkN5N;~Hzrb}ftFd*4GwAXgV80x@kBT(9|5!2X?0=j zLUnj^VIeh&_`<@b#1QkHC<bL!@@gJUsF;cPa5=(Jsp|>3Egc%pss^W{A2y9t$hCte zr9eLrt}2@Cu2hiRF!wuZRrtK=P#46r<f=N<eSs2E<4Pd`EgF|f`UpYMv_NyT{G9=P zJR>MI=nz3^H?{%E96R(nVo$Zzo@ksXpmUJBl53?Hq!2ibFDLeHY{RIskx^y#17}g? z1gHYZgSZM*!SMkC=!X6TFQ^4H>6R*#bBxy>Yw8N(phrb703AeXr{77PDLdRfK^?;J zFFPK)1<|Fr<H)S(h7c){m@<g|HB_Jg=yg<VOSDX_Lr92wP}*b@`WlR?3Cw9jy{oaM z%h+FgjxJ*()ZLo>>8#60W7q`mp$+yL>6oISbw~9Ytfgal1LaZ6*5aX)M_Ag^4s%su zfJAM9BlTAKq}evXgJ(BjGbl#X*9y%dAG*SzbN8*HGEY?G`L8Y<f3!(aIR59RxWe(r z&;wBE+SDc|VuWkDMv~A)%iG%0VOVF;0jnrfSnNka+Ei&L_2eo}dZQ&c!iA)@H_Kb# zRp*e%#;qgd{AtqTlsGR{!-y2;PGg@E&`vN;kK!;9AkA}HQ@n!dduUfUa6DL2d3QMY z@fZ#i9i{LaFmtcRtc=~|iT4}A$J>rv3ukQV`q4EUzzMgZRRj;F#8t#%XSU@W63sH2 z*5?RxRxJrWNdSHykZ8c^yi;g>P(V{2xf`YhZ1DK2u<*G)Cx+ri2tF}(gnMhqG)?*% zn)VE=wdLUZkux}3)PQa0MfAej9R?VTtChvz7us9J<+DgH74?NOjH|U#<XHdia3}up zES6w#F}7o|2})a`3I{~JDTsoYB;*UUXQ|^%zQx7$Lk<siP(YkvtYoQ*^$=ZREsim7 zl+*<R(9I1S6DS+Bew;WM9CAWpRP;{Q;QD1zDcnek$Rv48z?SJOsISslnrM+E<NE}P zk+N{qf0G;tLW$K^AXucPGPa|ew$OQs9abkgq`x%DH6>0V{pOh~kbCXPn5kW{J2qLR z{WH3*4o|#482!|s;_+>n0F$OO53EIKtY8b278b>)5=O;{9RoEKp9w=<XnsL;uS3IO zmrh~mkmazE$bkC}nc+?IBjiN#8JsM5czjIj+&Vl!ftucAWFd)Xu*Z;gvcbPab4(uf z2i4Q3Ot^gb`1V^i1=e@vFr~6=@+Ae<4WEk>qT|yVdeTnG1Gw)U>*z7W^Y6?B4y4VA zkFMXKsTCwH<Ksrpn$l>o(U!!Np@HM;zKLaf4{;kzsbWq5It|ISBEGqK8CnE1ClcdG zYr8pRayknZh)<N|@%bPab7|HkO1aaJxV(kYDe;b`1)-KfJ1oTa)j*^HNZdtJBbnvp zZ<lb;<ffW^aoR6xPR9B(pC=7z(S&pRa3yeeoKruw$52PHWRMWcAssouI%^06I$(KG zx3;=NZR0<1P$Z7`q~ja6HjhTc+OgOYN*onv2=zGfvc`|w4fH@}cvJ6UX)>rzs)PyD zOWcG*D!EK#i|c7VJc#W`NlhikhrJ!wlByqdA<&H`a(W&IIY}WDTG1%XI4TST4Nw#D zH(J;pPlx(iWWoqhAHUKh-~w5hpv5T0pT9x);ZRk_RU$!JuEh7{$JW(~y-h<De$0RS z6J|v88$tA@>rGP>{uKIF0`<{5=!H`Vp^1Y}vM~s8eVgh?6Sgr}5i5(OFIXnH28_Py zXqK)*ARHqYgGvx_hQS``Z;#0}v7KfNR3$f2x}nKnDow2G3nXb2Z8wfo)Mv-oXzDi+ zAN5IrnoURzg5Y6Ie%#u(Zi+%dn)zsx?8r=qG@9y(2zwPyMI0YHGxx;Ikta9go}xV? z?dF*yPi)9N$z>rW%%Lh%(Cq4SPdf(Das}z&yG`kfqipy>@1zuRkCGt!uq?=KO6l-= z?&(`{lWTBOE@@mIrY{@NM?_4BseLHA<FLUFaqBv6Zntjup)D8<TU^_OTvx$WZgEMn z*3RqSGQMirTu2W0vGTb#W$|cNXu?#K=4+0!p2E+VCy9DL3ACbZOPc8S1aGxWt##pq zFc%IKV2ZN~li<Qxx!VIAl+yNqbog$3R>3y3$XQc%LSMT>-Dr?Ipx=p1P!H&@KMi!2 z`zCQz?G!1-Ka6NjGYeYw;2sG$<wBW$WA0AsV<F(9N$4(V!3LD_@bJEt<5NdWKf_jE zh4ndx;FPJi^byzt^Wcr55L|ur9E$199z>-HE)LGc*~rKJ_;l+KsYy7bOcV^da}g^u z+V_n^V}P2nxT`+iK+~fG(l-c)85MT64zx-R$W9B4+y-^<&XiH7LJ9#3Huq^*f%lkM zBO4)Y?@X_zDLefsB<5=g#qbfW*mshCTtI9FRcWBp9YHWc1(W&&eFGG{8>QFoM-ULT zsa@@qJ<Vc5pkVtf6zhOA@_VYP+{StrogN_9Sv3N0MoFQC6o<bulsB{N1lG<ND}l=r z8t@v}po&lNQs6=jl$80{w|t8-<<U0m61=;Mb#SO&bWEURC+TAhhfH!A+_L%03q+}u zb`4E^aC~O1Xe^fYpTcA&uuB>N2}7}zv7dUQ8CX))(qVN|5|9!u;q2Q9<xX-)JF2OS zQ#;{{G<NANo9Zm5erm%bNEzGj5TWABVB{VWq2>dHND=B_83pPFlj#UgF_{uWf4vzg zG(hKiA0y-GVs<n|q;@~LNUrHGNWNI=`85KO=ynt3-5)W*)-=hxTG~?+nhVm1_yXc! z2HMcF8GnQHR!ac+<LGrzC<INKw#$kM*4C<x9iZBH1*tZQ8*oS1F~SXU_cq6J5;0v> zgKMREKf@6-6(wUSe>-_<BXjD=12jjwUb+i;;zOTV3dz=z`?-`AK7de?DJ$GXIW>?> ze`s+bCI{^{iv=h-Hi%x&diAc=Dv~SRnsngdHsWoN*4%=XHjWuGAM_=f_fL$C{l>fz zwg%WXm>d1=Y7fQucW5`88^yM?5!vjEJ^p!M-3U4bh;>RdTn&YGJ9<Jk5I7c%!9ZPm z2A{GYt0Bo?4AM9g>+f_dGY5w^Lma&nLC447LZGK94z<xv#nPi>2O)@E(VZsAgn&{% zmOsT((@!7)-89ikk9GJ4Xn*1?MlpG))NdN)Pm^f+bQ!FrER(2u@5RhGSiK!3B?8eL z{^zNY)l5eUfaxL?Sq~xr)KETb2`5YNKY32B?Tb)DF;ICh>V;HP(aIIl)-&XYZm5Ig zYf1WCRe1_CZB~_xEMY=p8nL`qym7fgyn)2e(<VU6VQlho$c=F00`5TXtH43QOqhsq z2D>P9B#*M)CfdR9x5az>@qO5{Ej+$2xNTgTmJ+v%!X4ii_sIx&MGQ~d>iaa0Xb64M zUYZ8A$A=NJFtBS~qXM$Upj;7Zm`NlP+$w%tw^<w%6gD=s+ch-Mux`JyxZSQm(tGqB zJPzzSuHA~$rB2o!X{Jx&Kh|y_&5?Z^zKZvE>Pm+A2^led#q@7bDK-A}I653+$UvXd z_*UJ3Z`%H5-Y?#UFXs=E<g!7;<w4>eI3>bqXVa6TM$0(&!GT{uz0W^n<1`t~UAKX? zkm}{<|4|COyIV$VKFryGQ(tl1cYrSeeIbPz3>XCv0S^Lx5BMWs3qS&#1|;p_xKzNc z06U-<-~mhp%myq3EC;*^*aX-KH~=^WP(Xm20=OB_1CRqK0=NNF0kZ)M0BZo-0p9|+ zFFEc8fDVuYxC<Zx<^z@k)&SN6J_76pd<QrKxB_KT0eS%J00&?!U=m;^U>;yOU=83S z06nQFUn1Z~(54Y^JM7VqFPl>y9FK1le#0q;)Q9<fz>AzR@saR5#p~Xw=xXgF+pqln zc5dP3g&zIwQSaTN-qWMrZ;N`rHR`=<)O%Xg`z=xLH%Gm9iF#K>z5f_nvE--CA7A<2 z#+=;3BG7Y&Z;17i@cZE?{{vC)`=j1}j(R^D_5O9#`@X36#;A9`rusc|zr_VFJT<cP zdjqMHa@;P=z4*8oWwzIsJE>fB_`D^qsw$4F;HtP1&dd2Y7k<6CQqGMZG*|r|vAn{i za`}8-pNiw!CxIvP2No8}F7(P3<_)+b;+4x8Sdf)BAnY>Oz-x8wld?Q2XJw_kyu>M% zdp)W$XO*hLS?W?b;Vz1<ib_!>dR1<(vs5LPxm4MzP~PtHdwfn`wW{1x;`RAlC8E2! zSCYf+a#p!iC0>u{EI~}fh)DgmDpi%gveN5=kIPx18VlqrygnDwfVF~Q(2F4t{0Tp8 z`=p+#tS}mWq+L*$myZm9;#i-z0$G$-shm|+u8Moy)v8jzuiP_E<v~&t2n~cP_mqp} zPIvkJEcv7&3SaIir2@MUQ+1Dj9NtycUcWCA*IueTQH7ut-YQY$F2C1>)TuZ=SC!u_ zs=Q-WB~G`SG6SUur=BI=ipp}gt5lWVyTtA5rW)(_lrWkyJe^^rJXNC4Um~LL_+y?q zZg+vR+{4OF<<?NSJzi1e@_7B@%2ZXA&JvUt!QEbD+lpY3^ioIBtEKENx$*`V$@CV> zfV9_B;_7wr^q_nQH=gpyMoNTVID^ulzeXT`zsGqG&;;j%L#WDJ&Po|uq@yujpo|mC zBO<bT3&%5@H(r%kdVzR)idX3ew@oPbiGHU$TtQTmECa#|ZQ?w%AMN$H&^mjAabT!K zDq;&>Y7@l^m)l$E@=!ad@`4Vft_kHO5n+Qga!sm4y8*`#Wx_3!(OJ#t<42CcFco0C za<R<kLQ4b}+#4PK{B#LMDs_rZpxa)q@`z^18okeTpWjtQ$Pkwg4t6l8K+)x^C`W?= z(@}jByZb%<Dk9)S=fAPZgZ4b5;W_!<<w31^JrypGh%!)EM#FQ4b^6BnDPUEoPI=az z#-bAwsliry%RORCPee&j_vT_8%y9+fB|dMJcdV!?E@!38?%utH9{F;ohwh0>LVM`d zs~2aj^m)hm(3^Rj=#l-Ndp+KX9y{tVNWxs|qq`&}p;M<|W)<S*qR%XKIS3Dz5ASz! zx!hoG0RHE5T26zWJ_ojZ_+b9vY8|$(yQ;6x<>Fu#y2N6q+t2KGMA)<3U=S7=|FFbe z+b;Oh8Fp;qvFFJMdp+zVhocAUo)$aZOcZjT6Jf_87%lFPMc5yYu%~k#&d<iHZY<q& zkKgTv6(3$Ck}OWi#U*lyvC8<|+}s3u^gQRFkm)MHF|3V(GxGdU2lfF}Du#k$OxYMb zm<&};!lOV4t_`P9z);{vuk1;zsd=zwdJQs&d$8ug88s;h3CQ7r2Oa<+c)rF_LzgtB z-zGSQ)*wDIaX4loqAI;+W({I-$fm5UOrdBqsj_lnWo4`MLFC}rJQPEScVeN)Iwub9 zL#kZ9f%l9@d(I0FW?4uNe)-NSF$-hC1XOvYzmmDh?{YF+0Y-c0I9DI<q%3YoVeVk9 zrdLkBT>V^3Y+QUoVjD%<q;|>eujrt>@~W#-uDSNQ)a!5P*s1f4H>tYZd`nu_TW?G6 zc6;|8J$v=$)f%l%Z!iibv&Cw&XJlse$<E2`dq=;#{&(gV3>fGbG`O$`Cz}o%e%FY* zM~)gj#(7UkscY=Gvhwlwx+^^1%KLm(qJP4~N!9oNX7ZG&(@=u{?MKB$|I)e8FWTo^ z@BP5(7y8w4Xa8D<pU#DUqyl#_zsMA3aN%DpcX7W^eAWMU<+IYCU8`mPX%2{)-tvPW z<f5KX4U#z{Cj5(yxwu~_{@JC!RF{9&0w|{x{6aa>TiC87(a$A3(cv$ywBb-nE^L== zbhZw}PSa=9);;jxLo;VR9GG4I$fI+9``F`ipLp_j^Pc+s)AOHM@a)1xi<d0@!?Nd= zKmWpuD_;8J%PU{`)2pjqTmAZ)H{N{f?RVaNZ|%DG8`giYVdJLFTefcd@S~5n@A&g4 zJOA?OXS+V%{l%WWUw+lN@9X^s{`$>9>Cm@L-+lkX-wq%7@u#CdA3J{H<f*@({>Pc- ze|aD{e@A~&1Hpg0{QvFz|7H6Bvw`^h{%j!rZ<oJcKXXNenWPdNSBj^HssN9QEY*0p zf`Z<qrM+Rn<0!xhbpXs=u`Xv*TyB7OLW_MMR=?z2=&FQ>K@O1RALp+UIj+Co&C=+P zwGXA0Rp~1ynMZ-sS5gMEuj?M4AA$$+>+ke1EApZAIiyQza!8BP0eBFvn$n>76qn*~ zg-+4$D}@K8=PPHnqB6g)D(E)URqAmCUy86SBIg3Hhxr!zgQioYxE$hf2+tuLh2h{& z$&!gzxWW@*5EQw>9r*(dU<0Ip8&CwMKp1!feUyR<gC~37fPq7b(zt%~@(Z6;xMtIV zyIJER;;Sr>8G?}b%;B65HY1wJV`tC|y|=p+oid)#d$j+o3;2KC4flrtE)>6^cWeJm zQTgjKTKh-lzqb#kJPEi^`mg13$`J1BBka4P@|k!?I9zRn9Xm#hE|kWyd`|fSATq!0 z5&k=IrCt*t(myhvzn9}ELC9kx{Uggm?gMaQdZd43{1xz98Rfq=B7cgvtfF=N==6_^ z7xrH_v9<rUsPrF&EIAUt==AqaZtWjQABxv!YHR=K^k>zz_K%J~Z}x@#bAQ*`KN`QM zmbCVdPXD*dTKh-i*KxV*Ph~myT$pE~^C?-;I-Tfza$mZzzw%|AW%N1aB0no3<5#SO zyf?yaC)_x=iDU*JGxh;g>q2j>&C7c#zidzCo0#Bgo(Xkua1Ol}cuW0mS3jqx)a}B8 z|IXaO19J1Rf-iN`u*Kz+lW;uGQ|T9lY)J1!jA}V~0~|w&1Qz58jFMwzIRMEPkb*9D zuxng7WO2T1HzeD+5DIYPI61Bykem`IZx(<A4&<^BDM7UCtqw{Rf|3M=$D-JNkTEjB z5%&zU%R-`;SSo%9@I7J?6E5bJa-5gBdMheWsQhvdiq$i|C?p3AN<cX7`G~k7M|=Db z4}{AgMQQG&5)ALyROnmoW@4^u;vuj)ulJ7Fys8`*r19fiJ_n@iK!|&mVH%>^LiQFc zBR4d@SeE0mLcNQ!yIrCy+Xrbs<hg~QIkM*d7Mt&KPB_b%`y4VjB5+i2t|*jhP=>aY z<vG|Tzn-KLN7naHj_VR%=yqYwp^AkctHIJzppSV{d`#qKPJR4PWaa`fT%3i%7K)`Z z({S9;aJu9_0Fp%FgZLtM6#~jKJ`KGEvC@;hMf#_uH%5iEv3XP~5)Zpd^E@R!7s)}f zzZi$WB!vp{?c0&zFy9D;lPH{wRJIrLOOE@DFe99bs&TQDNygg=`FSOAT^83rhBD3# zOJ@s3+JULc;@+c}XM1pWo+rjo?*90p<)yCdGN-S|TR_t8KGkR}>&~4HC|?ve$nWx1 zJ6t}tdxY%_hBW4tV+qfq@{)UlrFenT$d<W0$f;oSfvhyuXlNBh*iFl-V&#O5dkypn z?ixk2PL`*%u(I4EC;V94V9`CqGZDf-?nrDtq{u-5F=}rF%hN$*;s%pFE8D?wS5uw? za|_7+1vnmcTV9$?!eGe%xUY!*ghh*JxR#|NZzE8gCnDa#i0Dg}F%B&(zaMsqeDm2B zkz75TO|CJj6RJVrbwgYWZHv4if^(Uz!-2Z{V)L^LoRxBYBHsSUcle(sTqAgRhRomD zGOk(NQxTXB^o!{J2>;owLJj361^YEBbQYJ*WxKsq!M>Esis|e2SCx@hAOF~~E+1Qa zP@lSB>X&(B-nb8nL@=)lg3!oua{-3|W3IyZcQth2Zi3wRW~|@4V2A`P?1+7GxK#pF zu#X`V{@d|&C<l{{wQ-PJSHuHU0_Ff#BCSe<Sqtcid`kdN0=5IL`<mm103HW?4!C|l z_WS|Q0CobdIDq*aU@l-MK>1g!0|0e^w*fx^c<8p2k$wvo0~uW$7Z1sOB1yQpwp<d| zj!Wj+b60R3Fj=^gyNbISGLmb!Yq{~|G_dq6og@z?qx(B2I7fS2;^^^Y8HbLfYBUQn zI>%p85gZvtqrqbwl81>*fxF09o?zFTsWx0FN?yc>m%}!`MtibK?(<_D`~@-P&L3^O z+>1TiT(Cijm?>Nk=W`*D>+x5}k*hK_{H3B#v1Q@@FNuvdnS))s`>}n9&ZpAl6RUp# z4lEVgM$ExJUZ(bvtDq%5ZCbc~83Kcyo^cUn&|NAW9bUKl7x2Jf4DC=W_ysZ1Maf+U z^^d=x%!r@ur7FWd&jeS#Yl6$2skvn4Ln>5heVL9!rsk5#HpJt+<n|*o`)JRl(=HSf zSl<DqgiD}WOH2_ngi9!AIG(ri5-K^^jYT&13wLIbAxC?tQOo^P)um(_Nm1&pFF(I7 z1u&TPropT?8_asM!K^oC8CdAJ-7a6m3=><&`7ERx-BfRR;$rDm4D{UIap(05#|ZA& zx2#)m&>!Vn?(Lm7Fzje0jTY?h_h(DGFe1T47dP)Pr|j#*oCTT`UZ@MnD>)U-5xo;t zCA6YbrFSjuMmk#IaPo*83U#)Bsl2j_3UF5ZNDdcTvf<MEkLWX^PhQ^H<T=}g2<9v; zm0QNSaFmr<S`rWA;6j6<o-(BG5-w*tWqz*gks0!m+duLOhC2tItQsk-JPfzOYn)4j zhK)SHsw#scEbyDeXnaoo$;p$;7fda^+lW3$l0!;&49Uyk(!1r6y|3Fjj?FoP?`#be zwC6#K%ZVjNL>)Rw?ShI=X|Q-<+O+tQ77l50LE8;FsORGC*0|BY!KD-RK!Pfl2)j&+ zN^cdGC|Kg+aZW17G_SO(m)qqTCzh$Y*i@xV>;V6eV{3kE!N)nt1uZzA&smKC=fbxo zot99M;eveYV)HUpIzNd~eZV)FZ@qH;dpU$#4B%QoY!KptW<1PPKmwpW0D2*q>5@(d zhq*2(b;u^U(L3Q!ex%D1@}qPqE}0zwl!p>PZdU@Z1Ykh!T>#{+2he*~@I5>Dj>QR! zGdSp87&NieVd)QtNqLh{htjD4r~s7!EE%AqDdSJ&Abe^7g!A;EIRhq@r4~T`bpT2S zx-?ujz=GiWBAA5VQUK-m9Du^T4xlo91R(#<0OX$vq7Z#TG^6r|o|vE|WL~QK`Qn`~ zo%4kcxrfY9{QstzAKXtMT4rv-EjTb!U{W1P8#yJ_odYJ(GYuxu{^$lyNj$Y3CYFQT zQkcZUZkX4@%z=3W%w(8YT5>x-z`6Y}SHQdx=4_Z)T5{<yRWJ{)=agMwo@n5dH^UqT za}vycFsoq-Fz<(%4)Zk3G?>jWQ^<^XY6#h1_)vSKc18J8GMhHzJbM7F>?wvE{bC># zzV0JAF10IqeyuvEEA!+W<p2NbJK-6PYbHMV4&_m^4Lq`gQ_lP|r>x;(lyp5Dg(s7) zzzK!>bxh@XA2~nOd7obgpZ|2K=T}~kF**O{`F|SIUoXG&vOtjc&dUO-Uk|7MLdyT2 zvjX)MF|qNArRaFa%&4BxB}l?$U&)q5e~``T&o)w*&t*=nVdip#U$<oU5|!+I*8k~e zWG5V&%%0aSGJIAr{Az^%c=3V7H*kMlEG-^!{`99VVlf6`;x=gasNE`V^zQMyHD`za zWY?FCCpk_%HH4WQBol`=la0)n$PV`$Jt&RMkwN4X!vD#i;PP{s0vAhxkPb*Fyei>w zn!2?-Xa*dO^)rI=n3ec~eg$ATU@2fBU_M|TU=Cm=paviU$^c^kMF0mNAJ7kw1IPqe z0Rlh=-~l}V>3}pqCx8;50B`^bf8rBPc^Du8_5gMQHUZuStO2Y7EC<X5%mlQ>qAJv0 zXpYhgWwBxo<G>MR{|u%DADZ(}8Wfkz==N1pDZ3v&BJ0CA=p(y-;c?{rYw;HX-$npU zheK#Y+Nr(?=(!OAEP%TJG~fLl;5EQbz)yfHQD7c008jx4#WBNgIA9{+Nx&+=Cx9OT zM6BL`0)QKE`S~|f0OP`ZB-w_a%0J0J&40%m)PD8->JQXg)IX{dG#1SuO_|1{c|!Ao zW|ihc&3Bq(8cutgR;{&Y-_UN*?$$2WJ*V5Ndqlrnf0e;vC@};KuNuBE#2LFA3yr@q zE-`L3{$%VZWDEBSj|*=J`-OHUt!aembJLfmr_2k?2Q0T+y;jj$Z+*=AqIIQpv-KnE zX)AC0TLzF);X7d%Dg5<(Hs6nbPJK{q)I6?9(q?JD)-6VkYxG<6*Bfp!@P@vIVTR>~ zKN>zVBp9zX))=o6t`oWlLxc*!FZ@PWCu|hH7Opb&GW9h*W!hk>vdp*KX6<R!T20mr zYpyllT4=q?>a>;tmkHLX)(5SRSbuL_VqI?iqjimSopqaamvyi8d+U$Z6V@}<6kA7I zFI#_Gg{{WcVB2K-)b^$ATiX%aDO-E{b@p5AJ?uKW-JWCbZy#zOWiPWoW?yJuX5Vbz zZa-xIhdnMMIpd~`?2KI*C#Z}();KT{`F8vO&E1-NG?O*cHFGpiX_jeT(KKj2)$G$8 z)O@e`QS*0As`f^0H*GJiL2K3a)fQ--+A^(2J6T(+ovHn;c7b-O_Fa76{}=5y+B<az zLG@dOeBnW1tFXZQy!jRL2j;KM8cVV@#oEJ~V}08CrnSL(*xJr^rR@e=7hAS%vF!!h zJ1EVEw!OB4wjXRKZL#)Ll*VSyvk$U6?Gx;)?G5(t?LVRnu^Fn26&Y`2e44>!a$G*z zWqZCW&+|q6NWPS>;9uhZ#P8;t`82grJy7jbKcHTrenZ`$nWTM4Td$o5OyAJ1)$Y`O zp^eokbXV(c(&=;--9TNj&ZE0uSEHM)ds??h_kwP<ZoO`c?o-_!-67pix>LHV^j-An zdcA&_zC!=F{uBM@`Zz;dLsx?he7D!Y8Iz2CjQx#I8kZSY7}przHGX8=X*^^+Zj2S$ z3TZ+&K`j^syO1N?DGU;Z3u6Qq_+x@FLwHD-Ej%VXDa;oZ3C{^Dz^6NeJ;FZWJK>0M zT8J@SVd`YM+0@%K&@{w!pJ}P-CDR+G!={s_1hd_Ihq=(~HrJRJnV&O%Zssk5Ws+rv z<poQFCElvD_O;HlF0j6DZM4SP+S@wWifp57f3&>;zS(K}%Jx{sl8hHKUddRU@iy^- zgX1Q{NauU;Is8C=Ebrr|@elIv@X6|%)PvOH)z#{$>SxtU)qB;&;1$2-H=03OQ9B(p zeM0+;_Id4xsQs@&t2^~0^}P)yv<j!8%ur+4Y}jG=#&E>2%Xq&qPk2|j&15k-O)IU7 zZ0Q-pGNw@8W1w>YW2AbrwnkeAj+(8Vqn(SoTA+PNyIQ+d`*&@B-89`i-Lq)#D|9P$ ztI+D>Sbg-+^Lm|L&|CGH`W*cu`nmdf`uX~W`b5K(h8_m3K`>YinZP7qc*n5bu*tB^ zu-&lJu*<N=&}g{b$QyM=!Dux;V|?EDnlQ;U#q=oXyUw)HB$%_!@0dR|H=E-v9W7Os zM=cvHJ1k#W4p<IZez2Ue^t4*6GprAxb?#v8^MLh`b(qa*8;7>Y**n>9xAXQ)d#-(? zy~OUbPqIH`ueU#KUuu8VzQ+DOTB9<fXGVW2JI37QFkVuxQopG_rhZHFR}GJLwN-ny zu39$-oVZu#(l6G(q3>a|87CU+jE@-S8~<Q@*|^{MgYks%N};3BOBgK70%dmyS*B5@ zWu~jlYV$JlpU~<)GyiBlWsbF6Z_!u=ScY0gTE<%LwcKx6WZ7c*0wu{s&$H0F%=#y5 z8=KkYL+jgb)7j1FIi}lRv%h8EXul%k%?#Eb)<Av)JQaKg{yM%Buj14A0=|m>EkBQ+ z&oAVc^2_-Z{7QZme}<1&E7ZwqrFw#Tx_Z8PiF!F&;7aul_21P!H9C!;v1&3kIhuZ& ze2qi%d(A@4Qq6MB3XKW<%4qEr?OWP!wM%pg{oDFI`fY}v4FimOgttu(m{*&(ncG`> zST<Y!Vd-Ig-m0|OYz|wot<pBlHrqDOw%qoz?Oodz+h?}Fqc7|T`kU=z?2p?Q+h4SQ zY(HZ+X7nL?&ynT46?}j{u05ljssCPoQhy)#W3FMf;Rl1-Xf)nyoM3#)I8qodSj_{> zW6U$mb3xBF<}Kzu<{!+BmTxVw*0$EGtsSlD*5209=$9*O-Ru^7KYI}<H`acieUW{K zy)1)U2)z(wnaW%EH~5Fuoi#mC>N3r{nvXG#+={j{Tl=PVllC+1U$x(BPia$iH|x6V z47xjYgLT8u8_m-70xzG@-(=`+7;G4AC^h&D1;$E@YzvIv8!e_`raIF*rY)xDft%fu zW684&v=m#)EI(WBvp!?}0ApDq`qTt_2m5VyhrJHG2V_>t^5ii*>}zE?eU7@HI$!Nj z->n{_KA@2_+;+$-;Z1F7CPupT`b~OCuP~$;(hdC#MTSblWKe6KVU=MGYfC2#DaKT^ zqhZEL#(C)bc7ZQb1wj}lOhSuaDy$V61<r&74?~X?#!7w|%HlSNNT<#)8)?lqEH$h^ zdT*nRZbO=T3<nI~8IBrG8{&=0#uSuU#JE~#oN1hGoMW7eT;>}W8kZVZBA;~R)DL-0 z7G|O+og>Ueo(qxdcI$TAE*s5gYmleNPvUF%I({ZUo1eqaJ&SAC@Ne^L`StuJejC4? z-^uUd_wbGU0bata<S>7fKf#~oIdzD$Q`D*IPHL4pO`Wb5)S2oK1&h?f7!^y^m1>nH c?d+v9FuD9(rod$iT&BQf3S6eZ|275w4>oniL;wH) literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/jinput-dx8_64.dll b/etc/lwjgl-2.9.1/native/windows/jinput-dx8_64.dll new file mode 100644 index 0000000000000000000000000000000000000000..67305896d84e73c469afde2b5e7b1627dbed1364 GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/jinput-raw.dll b/etc/lwjgl-2.9.1/native/windows/jinput-raw.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce1d1620172b93610af6667cc37afbb702d2fa10 GIT binary patch literal 59392 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 CLgd{5 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/jinput-raw_64.dll b/etc/lwjgl-2.9.1/native/windows/jinput-raw_64.dll new file mode 100644 index 0000000000000000000000000000000000000000..3d2b3ada929b62584b00510c0d84c34faee944b3 GIT binary patch literal 62464 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 WeJ7W{t#uDd^84p|4g7a$;Qs)yfQ2{! literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/lwjgl.dll b/etc/lwjgl-2.9.1/native/windows/lwjgl.dll new file mode 100644 index 0000000000000000000000000000000000000000..bba9b3dc7fc21876c0398738655801959c4d9337 GIT binary patch literal 298496 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 Us=%!Z+^WE>3f!u||5Jhg27bEeHUIzs literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/native/windows/lwjgl64.dll b/etc/lwjgl-2.9.1/native/windows/lwjgl64.dll new file mode 100644 index 0000000000000000000000000000000000000000..1267747bf7d067a198151c0a6e2ca20dab61c471 GIT binary patch literal 310272 zcmeFad3+qju?N1gED**<0=yu=fd%A5;Z!0AWDLo!y$Z9*3KYyCVuJ+&M}$iu5)rX6 za@HnNh9%-koWRS|%fVA_zl4A=gscy+9ACl&kTDQ(ykvwp#1SKN&F}lI>Y1Hg$%Z8F z_xtPT&&S%S>gww1>gww5>Ykq3FL#9sL!r<_{CC|@s29Kd7nQ$z{xgW={f=0*U+A8F zHXqqrklcLa*-e*yJ<@#5)nB>hqAMef7hQGL)h&^WFO6K&dR64It0M6;=SHr)`jSge zm@;KjxnZ45ADJnB`OMqA|9|+&_S^OWe9%Kr-BuvK8*e)nzb76u<F-SD?u^@hEci{g zo$?Clo-y>#%I{g1H8zo#CwW~>D0In<MWNpeefKO6HxfE3vhRd_LZM$2ghDe|`%tL* z9sDVk$97=#c|s^u6v7|;^L|66MXD^|G(|I+yujweiWz*jAXHyFAvE$*LFgVb^!^P_ z4D}!C0sJirm5BgB+(&rM6o_bx!9O|<`3WtTwzU9X*8}Dhk#%RI2mVDup@tK#x#Xgj zi=dBA)DApD-@)&1@EiCSg?XHyWT6*tL_!@HU5wxAT!x^_oY1U<Qb*J^G!1k=977j9 z;hIaYxVkYEdRCI4<Gnz4?-;t-!2bXL{tq=^bxyhNo{6Dew(#0bn>JZ?(Pe=7DF3X^ z`Q^n{=N09pR%c6j*?Cs#<%ne$BpQbj_K0O~ce^V04uvdx)LOo?C7iSmwCpD=dt=PK zmH4DRFkDzuwZpQ{EKa1S4qNuOM^KPu&o8gE>?_KvExV;WYNggi7Fg~e3*23K_O6)i z1j;+Ryv~9E%eS>0Acc-8u`ym=Z`o%Q+mF|#C#S4bpKC35t&;d?(q3=bH;(RE46S@t zo|f`buj(=TbzhF8U1-@N%0{RlW|YyGMA7M~9rhN~Hw4X^`nI6HfvQRwQeTgC!rmUU zM?IB3W^dJuny0%MoOY|9f4MzMv+|AC9?`j8i`xUfV3utavnKN_x0}w&*Vb;^4@ye} z+E1D+pf@oVi+YROk0jHRJ7_SL{W$a&`8VaO$dzwBK(%xgy0<t7+*Fl`wT~8*+@9$y z+WsT-1GW!L|BCW5+JA&C1<T!je+c=c2fXBba=YmOnUZBo!7XWTPQct&k;Jn5lAV{p z#F^PSb0`!#jp(>Nxa4HZ-s=2%AQY-e&o3{iZG0hNZ*raiES)LSGQ;pm*na^RWw0L@ zShTq((Z}4bYWPWTvFrio63MtWX|phNFN@s^U8Du3m|9o4!0XUf=h@|@$<BCrS+X-( z9%1WNrcQh1Kj3Lmt&(MQ=jh*VU7NK$)4GV(Z6(ujvf4-)Dy+`MsLB6+;JP&aba;5y zL}Y;ZkHp+Ms0NN8(=rncoJ>#oJJOQrqNjzVU)@3n##@pcL=t;T(#~jY;4zv+2$o@^ z42nGu`cKmTj1fALI;~oShVrUg4ss?xMY+!|uT0u&t+dtPJjqs}je0fL_ReQ@uGjZ0 z`zZ@OJH5EP&h3i8cb!_$vQT`*W0t+edFy>vcrR4=8mSGsHu`%ViaQ7uJzOh#qE}I* z4xmEpu_Ry<kqasd?4a1lUVtsTA3T~U=7I}V(0^6FvwivAIE4+8E8h~}&=B91Bs9do zBOk_ttj^vMS7_7~p=qYWw@4`)MLGM52DRzG)SPu^exsQFWrmhYn4V?7QRSx3n;@L~ zp{wPY>kg=bm55Qdz!JrtwX7N~iybs71=8%|THAzITaFFd6#HUy5{m=s7WI4>uxPyQ zS#4+y7-q@x?@0Tglj%U#RnK15=%i~4ti}z_tjB3+wDQ(D(iPDUbL;=yOz9C?{~Ai3 zt-s;wcJ-o=s?6}`z#?vM7Ah7ez02*2V)pY${IpPLc(PXpGsrW^G{41>3>D8;O~4&* zik^F3>}+=O8ha3$wd`FOGh6qCRM28<{(=kFQswDzl0w7R)j@0+FRQm7`HHp;-QLh` zHRxbTGo_BO>8(kqzQOHM{W|Q~Vawio6=sbPcdOfFT5uvNdj%3=^k!SxUiEHQyZA53 zlt|hK*Vvmpb%6p76YbUxO(g9jlJ@3W`(f!tTVw8RgW#UD_qI4f(EVZLRsF0To<N0z zdlG*da%(`n$atGKpQ&;asIfg{HNLTY+mfR!dtYn$hL-)@$61@>E&GdbKn0e&-b$@4 zwPt;=_*t1PkvCM8Gia_wE&m==|0aL@6mzbSIT1QV(G@FbBs2_hQVI9JXpX*of%%60 z4w~ojlS%%%*c2VkGl0<yI|WTYq7H}76%HpJa5zRxZ|;$Bf7}HkUq<maFp-#yY&BIc z*21>cNIuJPz}R-lvTBHj_Jb_{a}s6QDzcP7h)xj#5^NQlS^#TFxED2xHBr+IY|AFv zNkwhrP?8P%#dPw@khS``Lg(d2IgY-Sv`1=}zfyAZ55;Wemp5DKrc&s;%rwTiG51MK zCTW)OnR7~8FHOKFHzO}>0|mn*OdrIEMH#2$$@mX}DPzq2QuFXRmOZC9*$M7*oS3`L zN<EC>y#_WgX9T~4_#MTsW4Vt&hRVdOf0W$xb=P&t8)Hm847JvNggWTzg?&<%7h&f# zIgDMXEX|@pj4ugLhO!v-vevV|Z2NAvQX5>_>^pD##(MkFWIBdoHahY5SR5v}nO5Wc zD#=+Vkm$2?wAE56I$AUA!Zj4Kj{=W&Nl3EJ6x1*>H0b{!5k~+`>EU>+rVRE~8<u5C z?pSTFrd4v%02_d{-g^g{-0kib6ZLI}4{$B0@|2&EAdTTS);ke1URn;Nilc|5)>Zi4 z-luQ%=%vGhI5HkF`P)+xq=l1m8!9#h`ct5^&MDJDBPB|oq;eWR!(2KFaZtD%FqE=b z&@hDTpg`*DmD=hodhGUzAsyJ6D^?}BmgMIG;g3P6l?~1^)&%;N=%=yZG$<t0I@wB3 z`R=DDhK7!L+jTq7UOLe&pjxQEq`iSod2eyb6>Dh_G7jWgMFLc2UQ{tO{T<gO`%Ovv z=|tx|8IhZ-GF7mdrxKlWR^opK|9kMi7ytY4zaRex@P82h9W3*{b@#;3`gnOHf-aZn z{NhT?>nibo#;VW_7@9VKD&vN)yt^P|5EdqlQ8(NOjFraJks{XdPd$4&I(fX@a>Gd^ zFND!fLv`C{Obj`*cDiETca^uJAXr25g0;qf22oNO{IT5Wum7wd=$~Z$Y5GeYmPay* zZBJ5!SZ@V*(vY{f;UE830j3JA$GG9HpHRf`Cs91wIc{g1yNwW(Q~GCWUEPAUoYzK7 z?koJ<XKC(zv$>nb&CO1u+_XBvQv0`=A7OHI0Ng$osTdRY;h=K78-C}fkZwH&0`@x@ zY09d$x#3}=?S0+wOOlRW>Gey~6IDYs=)q+%4tDMM15;hvhv&WGodul}*4CheFjg>3 zj^?Bg^=Ah6@^X0o$Y0-MBsd2)*<4fgO3WUyUrO4~#b^GioE%&B{u7HGK7@!25tCx} zGsH!QC*kMMp$Ev{URJ&mxHu;6O-r}p36thzc|+XZh`w$=2{XAO&QXDXE^)&<sBXLH zt)C$0+2u`fX!Qz?74^rS4Vq);mtR85s<XhBHDwYOBt_9%(73e7IE=3v>w`+HlQ8bt z8!^6AfGFaIJHR@L^+9vOo)<~jmsce0uY>G`*ahN>MWM9ah^&WXBs_=HrPw*Kb1@z+ zeYsf{Bn1ik(F7O$LvGh7M6m1&z;?=B=*$qL5I>f^S%%<I_qGvCd}QXh8S_kxO5$CG z{`pS{{a^7TzIQXL<!6vt>E@gaf7A@Cf*GtmWmusZeh|zM-BX5dXofaF1J<Q`qF<o& z4FP&*PxPlNz2(!R%BSur!!erS6Tu8K_LN~C&9GN6L-m*pjBuM)d$Cel;eYX?t<V8; zMKkXyPoL)5;OB{#+&i+T4EJe<dx9CVw&683rLu1-A3*6<J325_qW2z@+EvyvDYYxo zQj}gaad@9UAy^O^o?yRQvutO}-Vb#j38?g;V<QOE_ux;>GPk5=MEaL=)N8Ig^RDti zuxmM7P^$_+;(T)#W)kdyt1t|OoXY`%%n6VkPqMkWWN`t*@1H2v?bKk<f^#)|3z^|4 zKf@;o9_WJy5}fFP_7l$NsO#GIl#igu<vUx8YL>s)8c~V%C+T)1FW-p;GKDO;V~x`X zgr=7={eB;m3jD$c!%V%?1MMfB?|RRx4rWrj2O_D(dtP-2lP>i@B%SX)uR4rLUjPVC zR3{QRr}~LUG4Xg!v^4PuKk;ZLmTF>D6DI&dRhP`us>Dd~D%7Z;ROPQeIGd^c9*9Mf zvlc+j@>iB%AZ6R#PlDfO2_AQT>;bDj#<bf2LhKn@_;Nq-NG4vZiPf6e<R>1$#PgY` z+ONJ{Is+SFj!#rhq8ZBJRORq-K-HLPd4~3LlI-v2kjhOUXg^rqk7h^cwdD(zU1R#3 z1`?A#EWx9$YK)0GkzI25!jdDFh4{~&`Xep!_ZWmNcda$+uZxETQ?<?cPvWQ^Jm1D= z`=)YC$;9c$EsXBTB;0!iC#EurL^z6MKoGm1B4RvpyH?;KZYRs*7+5FAQo9PS*$dOw z<Zu`>h!c;Wh_npcyK~8_uFDv*eOGxOE3|Z7Gx;otT_~f;g%_APZvOhxA5Bs(V+=!Z z<0TzUYPlTWr2|Up!SWu~HE!#;8b@d875G6JN=ue~8_=rB_ybYg@X8e&GH)vHCJlx< zjDeWC$7KQ+XM_$@Bh2t??RAzckUN(Nf2Wjv(mojL7Q}K9@6gpPmNZz$bdVRcLqQ%W z#UE6^;W$<w(UGmr!^5sS{Aqjb@B#~q@${55k}&vv2R}0MZS~zDsQr<TtLkOriJ2oE zTL=R~#A!y4;dot#@fzdw<<%Ikqa3e2Ept7B1})><0`pG<1#`#icFK*-3A?}6c9K{w z%Xpoz4~N7r94itJ;s@(B5!#Gh3Hxzie4&**qvU_Y50r>>C@}-}T2EvFJ+L}pYnC5q zmLK|A;)vzTgkW6qZz}mBpPV|_1O3HH-{{l(gY~%VPgnA|PmUPZ?uGfJQhz*4JyvuX zuYOfN04;cyx^p1jaY=bBY5!CvXNT>m+Q80MVXscTFk$9R<%6Itxg!&u@ODSCymH?G znXgAXTFOu1vUnkCT!Dm7%LEz^Rro&x|38EOC*l9e_&*c>XW{>;_<tJye-{5|<NqAk z0PTR*o=j~lNA#Thjv@DGwBw5MPr*`-i{qg>-m$p+b8h%+cNB!|QH){-!?xqch#fe` z!LZS<hu(vvTvODUHAO%8x#2UA#bl^58Qy(KGi+ql?v0n9KkMP^$<RyRVbXtT(i>ui z;M0b|Dnr09BN;T!dgS`4VBn?yP}7I6Wa3w1v(`)M43m4YNj(!z>g=9q%dyBAHEG?L z0W8b3lGz0YRcpv2BtLrXthFsnU0_mAG^rC9NW7~YAq+aUcKrBV&Ub8Pfi|9hV|dZ? zZT&HOyX=b?-xkM)MDy|;Esa_C_4;j?mNR_9;9cDAi(`W%61N>EA~BB~|Ag2=)<1cE zsqd5GmueUg-0B?jcjKDk>Y7eKDqPdw@v}$Q1kaY0f+9HG@6taq=85o4Jr{}%Sg%$F zmkT-TJ8T&25^vt;hJU4&g3&tsH7R+k^QfaMUxp-7jHWQIGwq;ID79#6hzsQK)rRuF z^C?qUT8EY#m0C1e39mAQOU5Cr7s99#UTFx=8HcbT)KZaJbX=$vd@FPLetaDArcetA ztCjE$!}onCn_&sRPLQ-&2xlnaPYvN;@(C?awh3jKQvTRb{vw~!L<jsLjOFPM?N7F1 zn^UKKE`=f3e#+j}IvvVn|3T2<0dxZAZy2o+%3sD&bbZlO&~d!CI`1iO$8Xh6nKZ=i z=W-R3fK^z#?u8+=0sk*SNaP9<<F|>wZg?jB29~C>Am#ED%hj4YV1l|h<qjJh4?-a= z*mc97?2;5_xZ+!sD!dt$WqE(zOA19LDllAQjr!v49LrTM_Cb!r8YH2bgRs_LhQ2t; zL%<T_-`v~*5EBD*tzVV%Xo~bm?7BYgty(z>9{CCB9A{LR&Vhk2$I&yAViv6=KLK>8 z#EC-AFiYGXVO{-^1So&tv}Bw;P_s<+vw*(drw6eVp(`>L@h&7Pxz|A{yYM7yvMrrg zl+X9GctvEhI3UClY!G>#^YhS)oIP$PDx??+DY-X;L3|J@s#(7Ch9j20(s~$|A_u|2 zA24%Sc?2Y_`ydM4I<acUaM1&7{5a;XrNDDWR)OCnrZcMB+shp?VxWBsr(Y50d4%LF z`yj$tMa%T6Wclwvw0uX&GM=`vZ!aI^&rRhc_;Egs9Xqqr!tvv1smT`S&KGrjSp*vF z`?}%Z-CBThFqP9u%cwK-vaH39=cIbF3FC%;3aYAY40wkB3y<>9jR%fxmBMPP8$R(C zrf|Qd_0*i)3$wW!z1$b`AsznZ$Jr`doI)el3(_ZE=|Un}w#f~z!J|ZF2sc1M)G%iO z&48mEcak<^9o2Z8kL^G_R^k!<bqgLV@K}f6i1TCU4>Qsla9~p;p{Jm#spP1zSyo<# zbh2RpubB!*U#g%C5ohsRt_%G$Oy6K(S`PvDr>vYem+~Q~w5y>HqqHkTHPGJWc!)vW zOV_b81;#;de>V3#fIq)q`Z9eCT*IN4Lt$0xEZEuzJF{JYs4V6OqQ}?cHpKh8Wxp1; z-$uatfxAe;c}LYY?p&i*QKuNeG}&{n+E%q;A$&!P8@>y&)1%2e#eU6SAI04DSU%9t z6_?z&-ea~3yAtqRS8Jx_zXen?>#Z9Ok6}XtrxO~VuvR}`=(PWl;?W#RmdzI7xxfA8 z>C)g5O_vRqBJ48`H(K^y=&ctZ5#8=Wq2ZRcxAVuXg;t@Qi3aRLfwB*EQ~85<WLp7C zDY1nIr~*(%Ald-;`33<cI^)M9_P#EWdbn8XAG4pV+Tez}zbkcLUdk<)ba)>Wt{uWT z;ji44KRgK|iq=$Zkj=#{*bHjG#$s*bi<bS@r0vvV5q^xfo|NtQ<TL2e>){$v0hHa$ zZAf>myFM}N>BY}NLC!(<aaRY^3-ncrS+&WT17#)Cca^i1u|C1t<nk!iCsxk-1lxZb zbA~HjuNWtdh@wof?4q4bzKvwapPMYtC%ph;t$hxPnliIobbS(jFp)_x#)u;aw=%+L zD2`T&h)_H!6xhxRQcO{bNdXF+(+E<$d9;)=f*<%2;lZN|T1qWi@nHm3y~1ya6tZxl zA5pZ80t48!28%)hSg4vTxKAtC*n^(gN3ck(+GdYBQ(-3<ho><{JwJq#TIdszg>>ri zlA8Wb9SA#rRelrHg@Mmng`q!$@w|&a50<aMj~l)rO+#rp07h~g>Vu^_N_BqzEFJAl zYH(=D>ky{q&{|59U%HM>l3l~g`cmTet9S$v;d|$@=b3+$29EOs^UZlR*@KfkH12U$ za^SDlxCYihwu3nTO>{f5gLfbVT6+`~ywQ08(!flxtqkjfdw;A$mKY@<=`|$vPqV-$ zX!@Il$$CymF~#QoUseDyG&3L1?k6I|fT=eR-%*YMH++q-Kws_SF^BNHY<bO6-d3kV z6om40UMIz*<VfE1T4c^K==}LV=Kc|xY4G%n7uUhr7WxLUR|)GFT>|4chd#&J(X*5+ zJI;6=Avd`jAFkS#NR3W>v!ry&vnU?hz9l!&vnA5jd&%^9a19-pw_*EuXoBUg#zDI@ z5<?|NwDaf9SV`&Z(L`!>aU!(_JIF%?Z<d_D`c13kxXi*>=h9J3@#PnTFMeaALjQ6O z%{zwX9Ygbu(2V5Jyk}_MGc@lB&09G%9~hbs49y26%P)inOU&xOenujF(_B^pm7Mr} z%UxroR!=}eHh<?*$&Mf9?u>n~80RKnbDR~!7+?q9!ATQ%GOdL321{QSpJf+yUE+J0 zL8u0{Os^VE{n@2yec?M|ct^P52ABlQZ)rp<l>24Z?x2wlafzy1%{50znuV@bj5d?O zL3#wwbzG?1&N0wnY?v*im@MLy3TZjzL#KSw3;;Ox6-Q_M6<C{LfgvZj9y2Vg6lh~$ zSYQy5jM#?<nTkIA2RLZ-T~;*rfER~M>>;*x8oQ0oJx33~Sn6a^&kYce8>QPZYiO35 z$c$(brrj1chAzONGucLeSnKnM)CZk)BabdrdX<unUBc~suI{{yoc17cAj<$wNUELM zUt`MG$K`Fo|F90eL-?lf-RS({DRBtbB<((|Xkq&}26zB6L1%N5>6^;iQO9I@nXU}d z;U^DgOKd?yFu{2qiUj2+sT{5ypk5qJuwzr>cA`{#Os*<Nk=HpHO2(kh^9pK6dDRH? zc<JwEKXaG!>@S#6W(9DvQ&g5Go%06RrHyscb7XB2{-Ih<8rI+>WV-0r=m1W~Gayf` zt0t9qKBj0<E9-^L(o8Gd<&?WnP3J@eQLxkAAW0kDekK;vi5|oR6f|#bEl~SdcC6Sc z`Ry7=5GzfT{5F#<KWVSA9|gY`p_?HWW*w*-A6dWBbJdH{g<+Gn^$^gX%JOe`(p&Ay zxr+<eu8M#S1vriNhoYaWE^K+mcss^loxXe72Gmf??2;p*kWx=~yep?WEO$eqaAR`T zvn_ka+84Qz)_qIvEjTsO^2ueHmg&Ogb>~K(L+cu@0l}5s-bj#zb(st$T$rsb^y#$~ z)~(Aq-OaSlz!{3^E!6IltZk(mK7AR7Cchb*J|>Ay*Aru#(X>zMwCBH0pKEV#t%P>Y zMGiMSngW~7q76u4Ib6lm3agFI<ElAnB41GURA?G8ohf%9j~o6i8LTf_M%GkpD(9$( zv=q)a@QiA6>bg?+sG{k@e>)B*^jPUw1AbQm`#E6o*b7t>&n*BoUr~KPH3QWT)OCs) z0IChBL7={;D91`KZHEBBj<oEbNYCxLA5+4R^C$S;&N&!G)-`)xCM%CcdD7xDjXX<7 zl?O$75D8!hk(SDgQKfoSv5;yhJ(>}$>`0-7U`shCF|y58EM+TGY>sS4i)>a<HY!Zp zD|H=PbbD(_>bhwmtY<UB5%)`V!;{_c45}RSj=A+{Emx%PbKXYaEwyN3sIw3`7Wp~m zN{$J^9RF)_JnZF|Q#?+Vt=|e1vdv_<)z30{oGf<*v)pI0Eby}&H%^wzf?0lQvK;4U zsT?QENx>|)m@K<6PD|}^u54`e3xip%GFcw+vrHW)OaIb9_2-%_xA|Gh#>w&@!7SA# zOM{;!GESDS2D5z3WI5i?Qa(<WlY?0%nJn*M-L2KHXx*2s-%{>s%NGa9-<9F2&)F!; z^wt^7l1D$#9;o-Qp}$k<X@f=L3AC&k<A}E+n17?mKhGDhdYmkm2D4;LmI^=1spDk% zbTG@$OqPFOYfJ@;j+4c`AyBbfO_nu&mUwHK^qMK_=UDInW@Iu-TpP@LmC1V}@^;Q) z=gmK#F8#L-4&(tL-OfNtgkgaQ+*ZA8TN0{pj^<__6FcWj1bGtVeky3^ARbAw_pqmi z0jqP)H0L?7jbga1l&sIwAG`WcxCxSh!JT;KZmASj37US^1c}vLPobRqvF;2xzXHF` zImM|(5xT!e4p9auFeR&d!|YjuC!fr?d@d0_k<_9x@_Dr^%ctAWQ>eWHd}NwPd4NCM z;G^I#6Gq@IPfjdRasEK~qg|$w|KASI^5-nctMq=RT*}#H@Z^7j!IM9imZZ<+|5NO4 zcg~s0xxo2i2&ZC__OY8OS2{I-EWR!)Jh|Y+L(UbF@6^<yIOY10sYe8v22DAv_d^Cx zxg3M1T%KMj*NDOA$~9T|V=IK`itFYLB_W&)q~?z|-{K}IUN`bqYzV?35SE@?C?+{{ zBW9JF0kdXM;_N3^l>Yc4mWJ_rNdZRj`|(#0Ty6do0H=bUWit?mb62YqnEv7I2Z?@T ze*W<FW`2(6A6yq$W1974c0K#LDeLRVasL$583F6?LI9XyeU<B&i}m>sNyPdVpqbm0 zx#4pFdHWUqx)#$!EWA(oCJ8yGY{Aju{k)0VI}6|Vt$z*|(V<()Fcla+17XAaSlU~Q zrQ}~4sa^r7rM28DTwg?G4A-ST%fQLrEzVc_rAIRG9=;ngU_W1&$jVMu_&8|p&!L0y ze!K}|j;HZ(8vAEWl^e5n;b?!1>tcH-X20#MdKCQ4mOrOuM`EDA`7rKwZgxJqMJBW+ z=&?Y<9*Ei0K<3-at6`xQLM<{iLAVLw7I72^vt&@1+KSb9Q+bqx>1iD}aJqqALwpVP zJ{Z--p9cPE!vALMD}rA)GGjZ%s=)8t1B~e;8L_PgMV$-@+_*ivw+zXAI@b+9gy=VS zV`1lr^~f1vY!fobi}e%g#y*(@96`MH8w?SUl<${qti}ADHGUB8j5SVf#)?~GDNDf= zi`rKBvE}X(yl}9-<Opm9ytt$a;VCaZSaNS{0-^`#2dgK>I%2LJdvEn9UUqw_0MG|W zeGk9yw+<vyPC@G$Ef|YxO9bWNXUyMBK$=>BfZML6ML?T+F47He03v3;y!!n@#KjTU zNj+CkxVhxFTdl_JbSF>!m@A02j7y`-j5_c1uvK6f%iWTjce3KxZSR)f*A{m1(0ng| zxcv`}3p7507_a+q%szFQ#pjqkO&@Bq4^utNWba|3M=Y4w>d}K@CHJ1atZ?<NgJY|A zh1;JmXn$@(tbK6eq(@_`-<cX~f37$-sXw;*-2-Fo&zHs~J-Yhc17htjL}HV+t#<cs ze<2#1^jNh0@9pj*_?`4*BK2y)&TX-dvrlwOmY>fsF4x8kY9&&y6qGDK38*-##p$o? zU*Q+4e$IQ7*m_}e>yaJ%$rxS|u~(bMzp)itb2pVoK*voq84B!Cba<$~4F>}jBe8;s zP<}g@bn0@NU<W|{ira^&wK2A#NE1~A3-tFkwjKgk1K2-6Y1nag!+YZ)fvxA)y4l(i zs4JI#uLpT*aX?gKsR%{O>#=;(06{$MPmDdXi?L=IN|Dzcji)yLSJq4P!KVA!FvfKi zaGPgAvQ3+iFw}IX=dCww8X67&U=c&u&z*knS0);NuJHHr;NL9FO+O(oeZRc)!}HQV z?x$lvT#GnXQ9iu(QYpfR57TsSJi?2w@X3^eLl@jK2aus>;VX00!SmslDJP>JOj-1O zG-$&4%?A3`KJl%$3a_mt_YOFx|0mvKA2&P^*w1JFs{;9tK{04;yjxj}?Bho_s9#gx zluA`nu~F-vUte3(5%9x+2r4|l<16i75vViOl=U&4p6KIdWWwGCCyM4Jirn;Pkr9jn z6uy36P@X=#NXyU7zi<qHpZ=GcU&f!@Ot&D#7f37ckP@rC#UXJ8^n#}PjgR+QQS0w( z?PvJ};K$t@lmFUAUolzzR7;JUMS)GiuR-~}S+c))+%gqV;!6;{nmpm7BcQ_j3t))? zBB%ig#-yi^Sqe~!TzT#uBag4IIhy3dZ|1=dT%2qF$7;Ij?`EH`!p|zP>JxhWY+m~J z{B*y(DkaHns>6ZIwI83}R{C+;_iISWYu}TU81hhG;MfdZ^3-IL(NBYpb^Adsqu4-u zk;d2mz989?{)dsiTm9dB(Kz-1TM_<vIRx!{IY@lz#s3BD=|*2~M!d1@-<T_(w#SWr zxg`~A&>nZ^!LRx-;zO95^-SX23}@krE;#_=P&rhz#XoJpUTm<O>wg)mRZ?KCU$oHR zIoF>6L5Rm3sOTz#ufy}T=D8lvCz!kqc>borH{tnSDgk+$@%$~|YdY-^&c`M?Qv?4% zY3ZWnimX)Rpdv@GRsdy#A{|A3T`9X1IikoV4Z<^{$WcXJ21=Ar3?xcmK0u`k{S2%D zl__+!rbQH54Q5EI$jMi&(Dh0gHTjf_rO<VnR;SSA3xrF3PCmZ516fi^*{sk^<<gdu z)~-;E%F?0Gw>94ig>F%(TcJYb(xXsX(^e{Uu*%Y#ldn&qJC(9uq0LyPLggcXpn?HK zc7X)Q2$pg{4k~iTg@UY8q@&0im9kxtql)ZQ<Vr<`@B<a_{5yCKDzaFS-%v`PTSq~q ziaZnr0V*^3Kmw>jp(P4cDpaZYsuiOBfikMlsmjI5$ycw?3Z-mN=pFnZpB_pt`l+Th zYub;LOPfMHn%1Gv-%6ysE`?si54fyQ=toM~tx)v^LfNCxFEp)Jp-l>96#5N*z@<;2 zK~3vdXtv5SpwP>j<|wq+fl|VVLM#YeMin|h(?U=d+Tkzrg|b+ogEXy7p@>2eg?PRn zTq+crrfF0;xEzEUVK?Q!wPMwZJOm_Y;wT{Gv$FYs<k4y%>lAq&SOeLu$a+Oi((L_; zY*6I;5EqmoHTEV&hLp0>^dm(UDzZV5?TY*W7FpYw>QH2dB43B<z_Uw{U5dOy^|C^t zS5><`3XLkXQlVAgiK_G}^p>V&6#Cvg(QaQ(z5#_MKtSXhROoi);wbciav4#mOl29( z$yW?<q4~+mMUK+LFDsWaO)J*4h(fbfmI{TYYFf2IM=2Cl$Wks=PFkHp)09iSLLb+B zO$t>i)U40}%B4-A<20=u5E`HtKTvr_(@ee<3Y`K<*wO=E7WH&1@^QFyD62=I6P4LY zg%S$&DRdsQa~;L)A^f)SH(hiO7{syMT4B)bimox#8H4Un^tnKjy3e4y6+O?OM-941 z(M^VT1tK#na;2gv7n#U?4M1}-4oS{3=ng|I@1vxP&IFp72b5|C$1s3{3f7ubN5N;$ zSK<)`y}Y=qizS?Gh>I26g(GNW#hb!R`2-n90(hrk70Jz8so?pBRkea!46CSu)HPXI z3N{&5b-8&P6ui(7H!1iN!>U=q`6jhZ!7261xji>;mx5Ot;uQ+E8CKm2ehsPAdoMu# zIz&Ut9!>rZSQA~w<1|38RJ7N&mO*C}O}R+jX3%|#{tSvFy2qgV75#ZbJz&rSioW4I zt<9i<Q6v6{g0vF~GOFM^Z)$VNai4V29Ftm1mKZmUVoDXH{W5Pv!7~h4q2N}-s!~DA zq*g0<nUN~0;1^74oq}@>Sg+tu4XXwPJ$r0Y@QHI(jAjKrdu&&*-mvOW@G`@yOF{Mr zR$+yLUo=v6E9lwsN(C=4#JvihU|3}o^z5-u!GUv>bH9QYnY@DvUS&W>!8hMfwT~!x zg-IP%aEhs52vKLW0`tO0oe3<hpqN-xp;S|wm<n*jpvx5fUnqg-NU>7$h6vLi!OJ!! z@JbF~CmYuC5*ji|*d|@X_GXDqhILe_J-b_B(3YY<hZ0HMXV7(uroSb6)S&AXz3Xg6 zR~Y#k6wR@LV%HgTv!ahSOzI7~P0>%ku4-&oFbpbcrbEHKOpA0Wc(6(BR*>@z689+h zUxw961rIf;y$T);X-S+>kn<6O{R&Pu;DCY)4XZ%~k1(l@g474|hFBHcC1b#11y3<~ zOBJj#sbvZ#4Opq5?=KZR+~kca=-H>GV6(~Fpy2feY*O%z5jB@~fUu9F=c<s+no9d* zt2E=<NXp)(=vIU7Hs~%zUqf`d=wPF>6^dPn5@-h<1i_<Q(d;Kg_ZoDMqSwq-v}4dK z6-_@u>M~PeM$w+%v<$jW(Y2<?HiPb0H2oHt^ceJjqR%`_E7@<*gNpY3r-Hu!RPay~ zA+5<w0spDsG_Yi9se-=$RM7XI3ciMSH%MHmpzl8weAKXtD(LyKIt3e1CFZSHaGhb* zpx~t@wMoGn4cM;W_YK&gV2{b$rQi=t>Iwx{8E~b78x7d2;7ulPM#0S{wNJsF0IBx@ zfcz~+oPa_PYVx}#x!Rx|Mc0ETshbRXMA5Gs>J<h(s_02mwGl%GUCQ5dQ3=tAb4OTS znc|KB<5+LCiG)WKIRS*EsZh|aQ?OFO$tE?b;2{RI6nqx%-7s&Rf(M(_dIg&es|E#+ zG^x!Bo?yT>1%F~#wJSKoq;@EHy<yb_&{?q^r7m69gXgs-F2%sA#32!^Dfm(#XynJg zHiE<W@hs*u@vNI!j5(>M5hKQ$kZ$6WKT;-MFbTgBk7TL_j#~2x7(bKn)*j-Q6@gN7 z%R3{V9pn3fc<aZ<q>mG?3)JuKGxuD-El3Yk4v*wVnf!R(*Fh49=jF<K)raS|L9*L; z-?d}%Yy9mDAFuJYQS9k)moQy411mWbZ$ng^FG?}qc9Ov|-u4s@PI>V*56^hpQ)g(- zD4suW=oxQ2*E}=c_K?Zjfafn8JmYOkOkT#@7~8AqOsxbdR!|+xkuJJYk%NltQe-=R zKw0{MP_9s9qf$l{*{#UEz#o*&itJJ3`Jm)NSfK?9WfVFGKS=A#N$Xc=s8;d~D8%wW z=_q7kcq0m(h##bl=A?xn1Zs4raw%4b^#f&@LN_QBQD`6KQlXHE#Z@YFnsTXD$i&+$ zg-lGXPN6q(unQ&B=cF|#bh2`3Qpm*V+7$Y}%F?dTW^jQby8(e&haxrJmg-kzmm+s0 zMdi2@o0KaQsqwZ{r6PM2$@0LnL6IvJxl9V0(}ldfiusO^@mi)-MllsA0#IKz9ngS6 zlnKzFLJPI>PEOj0LdPhVQH5^Te8mt3jb!3rr3yurOPNAHRLY1#zxtw-SCNyiS|Jm6 ziz;-ea<LRL@wz&NmME9{oP13R{Z7kkR_HApMne7C6#9*%&1r|oi-g6T4m|cMb_E_E z*2iu<J|#JM{<CPkVprlZso8q*_^4w0@c67g_TzD_W*fkx#`We5;;{(XYH;dPM#flg z35G%(zjU0M$DqHZ>*!a4r)%N=xZlX_c<(;o*Wv4NxCO^BaET!Hi@$(j)*g_%R(SdX zXR!T)9VwpbSo&Hi4k)!uS^C;PCgZm#<?c6JXyFa%1NFE_!uF2}50_bProGJ#wHCEk zhgv4OYldG<&&Dm3*x=kN$ul+jmPJkhII2^DX}0IJAsr7XR6;~=JiH7dddb*7=Kk=7 zK1$(*0hqM|$s9!~@M^+iq43{)7?hv#Goutu-{Pk$e0Ltar*u>PPc#e0Z)Nd-!s`F~ zeE(m*|9JlYvj$s%CO?H8#q777Yw*>?gCX%zJYQ(=^#5Nq&-Hlzjmg^(z&GLfAd{E= z{~FN49T-<{ymPA}OOYQ|Z=5uJ5-6jJG`_k~DVr5(T=qkj@a$Hk@!aQw63mR}W<Eg1 zbALuDjptsVX(1pXU?-S?vRI+ZHLXmc>lBJ8<mPzprJ7c$X;sRlTA@2M%~I&U6{=Hc zgL0`?=$D$-pwQ1w7g?GV`je)$DYRLkc7<+JE*%Ozu4!EgeMPyfP-sZgdK7wFp_K|< z04`8@KOm@}SCJzi0n)hoj3O@wPaut}?^EPXr8KU7K#>J-GVmdE^@EDpTS^gE?<nSd z$v9_(Eu@$SK5ypZK#eM@7>r`Q`-u-q84q469xP=%_(M4!yiC)K2R{o8!OM8?<2229 z@KY2r9=s#RgU{A9<H6&~#dz>DG|hPMdWDP!KTEk74}P|!i3cC5p&;VHxu1#06|lNR z`bZC6Avwi^a~~1}^x$hWTQ45}Q?c~mEA^2cyg;)J;PGC?(u4nAvpLSKIOzqKO;-?b z+1`2pPQ&wmKR}K=|97{KQs=T{Pq6TTAEMv%={$z&k9cq?J0CU6F4+VQOiE{>5_C9p zO6PDKG)^gI@YTS-63;p%&i6<|r^NXdpX>2F)8wU7YBhK|rAJL(Iwj7fjE$Pc<h%%& z3{1u}XaV?eECj|h>UTjCV_27M)DAWa!O}GCZAdds+pUjm+Rd<JV0-ZRW5u#*Kd0H) zwD%~MO>4$<HtpS-jZOQQ60m7Qn$2<U+bB&-tp=J_RPL|m=7Ja)tWTg%@BGYXfyCk@ zaDK+8AD$!h<D7qZ6e<1*0<34y&W|WD_~)*-F4RK3#@F<~`f!V%&m+lOA3mH<kh^~R zQGW8+^;aQCcDw#M_rvoq0?BUIUuTTT@9Xa;v&Yf*%|Px(-?u6KIQqU0DS7(d&o4Ju z-+L(&Pnl!%{n;_;`TEW$$kq3``N?DTJr5+i)%PQ@fNK#c$E=rAAla?H4<A#0R^Q4x z*S>ECayR;3r1azH`y!;|>3d7mlRH=6*D90U>ihF!()08k&L_y#_p^SvUJ+yTbu37B ztM3m!=gGa>{Bw|hxBA{|O!?}+8C=)%JB#<@FkSQy6hwa;;Z>ng{%NLW{R2JMfsE<! zJw=ycrGYHpF<B~sy3r)lrLQv2b$H%pp6SMCBO6)JjsMNyoA7*S$;1%0a4WFg3eQ}u zyROFri4EOKMV2Zu0uG?$UNI=k6nU&tHYhTp$a59hrO0YUUZzNH5+i$5kx%1<5egbn zq@~EOfD$Bi3jIK#CWU^hP_sgRM0QZNDRiHvwJY?s&kC0gg*Iy13Wc6gs9T|LE0-RH zp3}6I3hhuXy$ZdrX?+SESSls-D|C@^8BpjjO&e5bx^i(8I#JU`6^bboLUuIAEag(H zPz}=1*55l#3My6P2q5SzqLgKdoC``I>lDdXl)&s_MYb!lQjxn*EGSnhvRaYzm2yy# zQAOUM1(nLuHf1UDtDuAxR4cMxk=JSVs3IE_NezOsNs&#8Tm(wAShGSuJ5``Ih5l31 zIu!bYLR|`_zzq3TDD<$Vbt|-0x%4PBq-nhhxe8?zx<I+~DO93!_kM*QRW1VxRcV@| zP(q;*g-%v3qY9aIQV7+A$`>h@Vuh~Md}RuKLm~DfQ0}i>Dir#<rd2AmTp>%L?<!QM z(9o!8qFy0e(;5`|86eopjkClUnt^2R$flv)yA|24$Opj;ZL~s>9g6%uxB%Iw$Sy_x z0!U=<S7eVO|3{G_ovW`@WE*&bvQm+~iu{REHYhTq$loZkOOXSL{Iw!8iX2pATr2G; zbT>#)u@Qx$s4bvTg(xSWVq}MsS1MGh(0<CLEGI3Z(4<o&9~TeEcaP?)R%n$%QH6LY z3nf@NX>|%sQ!e!iJ*4@X6k4ZHvqEc>OIuD_yF&b)3QFius892)P-u%n-3r~MTzYcS zRx0Go6fV6AZPR>x3O%h*KOi*Kh$62BGg!|G%{QRPKP%;+LJw-1qmYqhRG|S-%7!=( zK46!oO;5ATBv)?Q7<9X$*N{40R0W14?ojND)w+YVf*{aciv9zLxkc4y(A|o@*PurY zx<}D}$5ACxSC|r4D!SWH*Bf-NqQ8V9DW9B8!EZ*<w;JjWL*1|F+khsu95cc1fTDTc zi}DUC$o@;vQSfdQL2yLDZ=2K*S*MG-3|Oq-WrkI$g5NQzWeVPDz)A&wYQSm*PcwO= z3jWBXS_<B0zy<|rkCduO!6QxHW(C<kOl?zehXK13bPTvc!GD<JP2CFq&7}4y$QTLR zqZc559iqWHqscFu<T9Sk0J=}ntIaVi%b@!e{gk0@Gw1<DUw)F7(PPkqir!?X2Ml^d z(Hji9m?s8M<fx)AG}Q=^I$gwg5mSp5>_ZU*OBGygQX>jJV!#Ros|>431wCC?D|n@0 z70u0Cr{G4zs$Rij!>U0+%1$ww6g<GNYR=8uu3*0*?ojX<bF`{ULH1v=TA|=?KcirG zZr+s&Za2ie3jWTp$|(4lN$pecFEf-?zk-aXv7kW(pEaPP;I|E{5e4Z-NIa_Gb%s?) zPj|5WnOdsg3kEDxaK1UnRc#tJqG*;+%WE=dhOp7VH-fdlX<ex}`ny=~C(NdGRFRAo zvQSIGgN(p+3a&S)^$M06fg1oi^B#a>Sh|ige#RE~KGnd&Z2Wv^-dD1Kr1uS3$l|Rx zYH`;v-XKMoAD?hTM1GrzzgJ~6Qo;3%h4l+=g^@sf69P;O5H!eY!aW<?lR5j#hK%ug zi6by?wfQz8%LKoA%hp#3g;uY9A-5>;Jq*?`*0rp>T~vhZc<#nCNN|&gzC5XG6#(-3 z8&V?f?Rr03YF&LW#$w(_2PNM!thEP%oUIR&gvEHp^TM5g1PQ$61-ODNf<p9BYH0Lh zNgLlu@~(;N_g-kmhmvR;*y~N<^=5oeC-t&O!B+&0?(ilbb!PY)MK%*D)$d>dUdinS zVD-ECoLXlEtMBWZwa?Rcp!R61tiJtr@Z}KBUip;NFF#oG3={IyFYyQ3KpP5|7j8^e zu_y^?8cVvpyj}ClYfqkeGJg|Q(T_wUzb8N)@l?057f%+VGeARNsS2y^S7oIEM3po) zzbf4ZpehIWoLbi;?ekIWHK;$&U_Mk~B3Pcn%>JDBJrntkj(h;Efz=YZ@Y<#1#Os)> z4PU4ADk7p%Rjie-A7k~q(@(e1;|1NIesPl#-|dB!^ZSo_!8sH&NLt<{$L}EEN(_97 z374gvgC^MIeCj@UBD`mguc*TEGrX>cUn#nU_Ri0m@oMx2Ts>Hds|U+)^<X4nFT$(! zFT~~tEY|Zk<J(KX^X%SU&~;#4CU8!FB?m^Rk;qto<(0=*@IXo`Xd3zHwwriN#MtK; zPp2lD*IvB6s4~&`dIB$Vrzigd+Jd^Cbso8tzqrzqdzrB3(d9drd>lH$H<4<OUA++h zy!W>gol}dg!u|33Hr|sRE@*vCg|XN3YkqhM+pC1l&&D|?2;VCZAjahYXm5E(Gz!c0 zKbT4RaMkV=`1B{P`s77Xu>7G!<Mvv-i4GUWZ<tkp3%;C2v34xEfSbd0y!%T&LD!5M zzk>25ad{#xuavtdH=}Vmx6=<H@DnoT3$pS_vPX*JvtF<|KR>z{_f&(M5ph|0JCs5_ zwBZeQ`!T$2uC=<oTs)gr?3_!euq&u5sZ#^%gl`q_6J$C681FJJlzg=n5y6KMs9&y4 zf3Xs<Lzo5Brsq@u9!#X?RO5F5M!f=P@E6B9PJ2ejw&%`9il-(hRnaCrI@_dsXit@k zrreB1MT??ER5sJX=xw|jzzC)aiA#w_jSWUCb&xumtC4JbpKIDXI;Op=!AshEMB95Y z>=NzW#5dQ)N!X*lJ%04|Ua#$ax@m8;9Qd+k-B525FS1knK|d+grtWbJ09t@6fF<B2 zVpLrGnY^{`eDPwngf>&>X4aXOpx1_Z{kIJ*ubqpmq|=}~e*}M_=OM=WTSy0Y6|;x< zrHk~8XCNn<e2eq$MXUv`$>RkFaD+RS94Yto;`+Pfu^YPFHMN~n_er7$H}X=%Vr$k~ zeD8w;AikoCTSxgV1{}iB2}`^1<SW{jf-CLaGQ9-1O9VP|z(cZqBl5i`-U}$-d6F)D zSGh79s<C$^jkr*#lLTY!+Z45t3eGmRcDRqwziT0!_U~Ibi#7e5ojcLEj#Y%FrL%&& z*YT*8W>gy2`QaX1ugcQb<gN5;8oamCIfbm0n~HIJVP5|>jR@m-lv=C|OeMt+m}cM8 zd{f2)jwfU7BQP@TZam4c57m736I=Kw3a)wJC|tF(*4`yPb!fTUTAZ~1mb70T{+QMH zS8MePh48e_ngwiP_`*TwK0M-LU)<tR!%Gx6nkVe1OOA*WU5mRga5*jAz45QAd*@T% z#Rexo=vX}KZL4$6=;FtinH`qBsvEyxh(Yz?MA|CF=qvoJPK+ZN{9iqpmw<3Q(a98h zB)eHc+XjZ`O{T;jM*(J#3`@oRhnNY-G{E?!0m+B^aGhUYNDiBvpW#<NePXW-eEh`9 zxm;M<%j>TkpQSx=d+C@_)}zmz572iaqcmTzFQxQS#=r<+nw|C```$F7y!D9M2jm$$ zKmBn3q2mvn6PA;r71YWo7F*Foj|dv2Ya4Ma!lR?QttZ7GDKHfASyapW{_xzd_&z@O z>2rq98GY{Mv)B#~AmEvH2tGY<prHa7TWVb!KB&#{QRGuWg7P`cMM<O)eE9}}9RwDd zts}+%kxbN&$P{Rvob|!j{`pb$FKX-tf3YeZYM==*YS9XZ0-bqK|E!eQzRm+IPx&jr z0nhzN?!u$7EUFlC>#{O$eh{3WH{K(i&>J#z_UCMz$8L}BQh`ei#tbSIv%h1_eZODm zoQk_b@WD*`ovKX2U8C1*7CxGs^~Cji(^%_<pQgAOWT$0OL{^3Jkyn(7ln~c31H=X$ zvX~*J(yJ#^D$LMIL!xW0!__>meOY^L11}RFe_k&0iF0HwA)nZ-vl{P`y5O$S8h%u8 zBR{yyS>*FzR`m+p8^)RWyo{zDB_%t5WyXE|G!%wR+*K9lrQCXXxtTy>5y8&`nE9jo zu$5Y0JZsqM#B2hirt;uDy5z}P^^>>hXrA};)xj#pbZS-YsfX^XQuKg}Z#agclMH|k zs)8H)+xa>c-KBa>t*g`FDF5p*x$%pDvH4|-S!Jz_c#)wSWf71zVIztxrXhi+JZwha z&`c-s{h#MAB_9pLcYwq&d%I>IvwoIdz#@$=+(Uc;@^pX@3@fO(c07CByZM|ST@ZZ; zf7+uFQTR(e$;<e6iC<J0o<?9%Lmo^2zBVcnI>_s9GW0?xm9<#J;09Rx9em)^`AP?_ z1$#yBCT?l6Y?#Ovx2}!nSHEn{JihnHiJ_J+acR0gzfr(-=@#ec<yfuq%B{n_bF1&+ z8m*k0&e~JhSg?z(Lv}S+%<*I?<=*DdzhZ(2|LD)jIf>zyIfsfNj_2dd{XnVHJ`FC& zvc2_WR1p_^6@E}C*H9x=G#!^7<G%bufWd~vZ2a&7A^!`%xT1Dv1mVGS(Q7<sm&&<w z(dZ|8o);f&ecd_t+pHWf$Za_-Np<w$lfa^n6HuXUaAVL9UkVR?Ntty@+J|}T_S@*O z@=pH_9S_D{)#TT&-xt6%SU>yy{QCVI7}W0<_{p!|ep<g1c@pfS)bH9G_f)^0BmU+3 z)q?T(^*akpgY|p!z5MzWY5gXRQ@?|d8SS^5`jvU#SCG5tUw2l(G?VrTR^wI0I(5h7 z5KURK>`iHrQeM<&zR&U;F*85*$l>@1&9c7$;C*Vh2-y+5HxEMM4k+F>R`1TO#E}rX zU3k=teq$nOzYjCPR~qN@Zt%Kf`r64{?Bk!eeofjXwT*iv8aLsd`UJA#Y})rqO;ATZ zd5;gf;1oAl!o=iD6j&T2Qjbhdq+Tm%UCoQR>ylUrVuaosruQ)jnzT1ccfwcuXmTjM zM81+mHuxa92*0;S;Td5A?ZSNKVCcV>`K{#J-<pr*w$Cr$&2OLkfr0&P!%x2b-H6O+ zpR0G<zr6LK#&_&d`wgtBo!8(XOgF<f<cg)6eM!36r%~5Wf+@S%$EBNL`NVjbjKWgy z@w!?xum*%XSupfRlrX+M{&`w%eGA9bH>~wNbe#I$jLfL-5##kYud3OpO$1*LPS{S| ze%^WiTdeUY9SbfXq$S4G6kAWRW)__Xwk@BMZ=2A}=$k6>Q8VY{CE`e{kxUoLwGBSF z==o5P;4(e^AOI|dhaDra`9o_^ly@Jrl{)R6!*c68_nrLqy$l$%?>F(2-@Xqa^KR;! zo^n1i49)nlD%wg<A)lf0EPNf|sUAGeen?;yIo|rk;!wJ$@t67kjre{wKeXqsr_2Gk zhK@KU1!Kg){*Z(@QDTKGr7@O@e7haL&4D)^zw;*rV@Gh#S6Cg)1;*a5HC7yd{*T#A zZU&uqjLBj6`{5p)sz`yl9Q5WZ?ersK*Mq_OzQHT(+VB_A9A@J;emG@;>||>uD^S3m z<|_gH;g}xy$qB-LhhG!5+z&Y*na=I;aFb5DAxRxl`&3Hc?-I+x!|mRZg}F15PPw^` z=Tz#A65K6UjlX!8##F8wXj8KRJVIHz-{F^!nrQiW7`J@jwR}8$NcnQN9o`)Mu<|io zOt{ZwUEVnMgiog-Dld|cF%RBn2o{_lt9^UxfA8F8{`w!p5*Gj+lg7lCSU$_6!HGem zUscHT+v{k1HaO4T*i*oQOWfS~cd&oK6RHK0CrbGUGjPgh#Ca5o!R|t?T=^PeHAq%z z$fPcTfC$m7ue=~UjzY5KmE7xh*gZJFy!umxW9pyvf2R7zK-;qh+KopTsD+D})xYGs zi`|%m_!m?o$6o-3f70Nv<O{5w@P00Cjul%F12S~GQ-|<}^`iv*MZgn(=d%s?{xqJk z<s+6~A(lVRD$UcUZ(q{%MnchRzJ%Gn!KZ&&zaPoEgumEV8?}-RkbPtUz50zA5VYIm zo2RVzO1a1?lf3}h`ivwR5!N2WhT1DIgOJnq1sDTD@O6x*$n^DCPF5<t@0B2?@)$48 zekUiM^7!Hx<l`gkg4o(xYd?;wcrijYU{=Ou4yt(t!znHP45U9nqsu%0zz%}iH|$3K zfWIMGe)nQ~)tB6>u{v=n8mxj>@jSH@pgkW=AKXkv@1Pq2wgQhFv5jr?;t{=r5h{;A zQMvrt;G9k8^7l&ps6}P6MTsGzJd2#o{K4<v*|AjA#cwH6=yqf`LbEE;rE?6L{HPzM ziu~{wP!83gMfmKz62@}w4sc#*F0_@la0ku(208cFA}Q+tQNEc^(cXQBDnrhAQ!3E6 zLADW3T#fxgrUqag!9rpUtpZz*$3bB6$Z>o?AF058ePnxZbO!<JoY6<tl`RS^wYX9r z=}t!R2ragG+a{2w2^3^(ntz27vt*WGn!ii26v7loAu@`k5T-Z^VTz*=oJtrWy7iGl z4B`<&VEUl(8uJYw-ie&R*WAu#e?!C(`@K3b*Qf%f`3r{bIy~oi(k5{;{s1K-QO=OP zDvGj(zV~%+S(F?9sMGKfJ`CW0MUF31MX=t$1?~tk@B(anMDE6Yu^zCu;$zc?W0l<d zYGKHE;cD0YbcT{O&<8Z3K6U)$@naAly_m5SxtRU;AVyZ__q(C*bL&dsQF;nmrXwd_ zo(TWk<XAdx4tH*u`QB2km4=KK){&k2S+<3rGm7yGZ+HecT5yPGl;JmmUr<G{OMGD^ zw%{sO79=|_g!jsqe4{%Tf^QTl{6thyD&}=MvwoJZBzQM;4_I~`rXp6gdsZYVpR&g> z4)XdUu<|*f$UJW!&X3p8NH`wBbwlEo@-i<}7me9?$K1i{F^(nkgDw67@~gQE$az>m zo`Cm8TF&y1Xd!IgLDSNuWCNFyFGGn~TNm*K6C~4&>4~dRVr32YD7Qj@3i%{=c7=(Y zW_MC|k0nZXF(e7BFMl^BcYS%-EBWionZRIuc@}>1*O%8KGuD^xc=3Zh>*H6jWV4{Y zC|4h6K_B~pZwtaMIzhp{U{Dp$T_vh`X|k$9GzC@slWLgfcO@|iKb~?c*rJ|(yz=sw z^YzgQ4D|71{N(H7T*~w>>Eo_ze0_{#AA5oCp6z4Pm7<hqq=Wxk_Awih1nlEG;26}$ z1H<|H*bWTz@dkeK^>GHp`KbEvqb>L#hBN<bzCO;$wU5u!^);YRxM3G>mZDRPPNF4* zck!nYk?JJIHTH{I=@;yoUdPZ_EwT?EkmMJz@wo+l;M5I&<`8<wF`dO5U1WX%M^IpO zhHphNIBn|Ip^&2MS!N2CykpRzujhU%H}5cqp8g!9^W2So-wRUXGoRZ{Ncy~Bypi8c zWt<X+%c{1~XCp$0PmC0S2Vzdg;UnzT2jEk4q;kV=9}H>r@hv<`M2)VBA-I-5K%NHg zvuA$!TpYU75BEjFd`(ezf&r+8<{>8LQv=?Z8xfYTd}P((?N6Bado*?0xAuXZ;5LmI z&sS}4os9utWC#|Kp0Yo@gEJZJX-1MEqH!?bvdg@$^wn|XsfXM+)U&?mGvLJ9b6}>Q zE4f$QK*_y2XXIR~S)3mf&96mN;={6dfp5x6Fvj<R?I++3BF<CNqhzbXXP&K~U;m@E z{<-661jFd6VQ2(8lIuZgLB&ZoX3Q8y-#&=ef{#w`<iqlvEu~3&Zw>EZCyyh7j`XON zeEttdmB=6CgEzl7GX;Df0?n`;LB_yWSn(-x|0}Gw%6aS5=!EO1LZN?k(9?LraEtTu zLf0KW2Bl({$LPclbywP_PsGm*H+)~X0E$2mGTwOvbTp&$^obNGZ>FDffXdY0ciNaw zK?%NmXjAibS_Ho}@{LU-M81uD6R$rA@}23)x7A5PzE5X{@tt$-ce>$e5XmUT4|=Bj zujQbBxzk^t8t5;8w+CVQJ|c#Fu2Ohq%LpUPSDR57x{c}}j<CJ917<FW*89?Ny0iN4 zMtfVG-&{)X!cPLD7e$6YX&1@^v{!D=p%Ra?=M>{7V$VShK!@iFoaMxagl0i1SuDYt z%iQqO2LMcmmxDLPD1L+W4f0N9Pa>+#@qBs@_BT8W9NO2;0zeME+nEEC-U{re4IP%d z1I6^-01Ey``|~{2ngTZ-=&4lUt9)46TdWYA&|#fp(O^0t>(`PiQ3qUmqaNM4@;gl3 z3avW7n?>_R0)yOs6IwRDoL(<q^r(y3+p&VUsk|E<Az_c=*&JR^*I8EDiaM`h1drou zD(v0p<Q&2IZCTP|$mhhpY6JRp6#wIFm?*qr9F5HLUlzW5i(1gU>1eI^vGdF0$6^^t z4(-Sa=UE9?gx3=0!|&?{dA71G-SAh~SjgA_xiQK0+Je9N_8<5@{2-WF_EY%6Ya_bp zu6TO(VhYtzgJCKhqtko%?SZNdD7RrTNKsT%FZ~xf`z8D?(iOcCKuB&b<geBj&Yh1p z0fQ$#QW<!XPbpmm_;w}%<%XLeHoh2@M4^~h%gVh^G{O%n$<d_n$M)keFp`{!a6l`+ zNj>?0#UP!Dm*7P-Y&Cr&J@MCMXQfY--&!<g<4CRjj5&`XLBK?MY5{0J2j7OVF=s!F z-&e9yYbNshN*%M`)6Xj<@G+&1+3)k~N*%NLktMfdw%hubWZ@R8@UICT<LzOW>DgaD z_2diB34eorbV<Grr7?wY!xVm=2gCB98=jA6d-LjDh0&c4@7*%NUA=R4LCYkoakcfR zlTL;v#7cg<*?f5EqM6*kUAv0P!^R9ew6o-MXqNlg2r>I{dow;fBvBPNJOymocyNX0 zb3+)#VLbd}@lPEiDi%*o)S<<y$$}!D%0E#z{2%zz5sprvAK?3GlW9%(tk6n%*y60H zh9K#?bXk~lAS^oOK$!N&EhS$6H1?O>&&EUnksfrV7`C0fPjtuajTqqIP^DY41NuYE z&?&gQCTr2-%ty}m3j-O-mw5{4;A&3_CJ7VYpUg##**_4UFyk@CED3i&TU;8m_kx=Q zGl8lAsvRgiqR0IMc8Shrt@YMhs18GfZukMDz=hIQ+n?77LD>TFobqYKTz#OPuha4) zD2QLb3%82BAFd;%`C5}4$@fQ2`F^>D?~z}B6pDEKIe+B*9ZP`|h>917a5ys#M^c`} zb?y!LI1HNjiFBS`jGv0m(<dvbQE|S%fPNq(#>;*z`(!*1j+e44$Pp<!UUED?(UWSc zGYwJ=A7&RqZDWTZs#T)X4H}7r0Y~g7-0*p#1<X9i-ySiih-5C}mzdQ9OWZu@kAc6q zP)bC3orO~0Ia=R2T3<8paZ+qWzk>xBHnam8(C-z)yW_)cEi-kdK%L+_+dL_|3NLc$ zfPq#1S~vU$=^_$u)IkGA_jBOj#vpnuUH6t7z6J2A&<%9{ZulN{RCHzzFrd92X-4z< z0~-SRTpz9d>9anJ#83Kwv0rxl2zqs-4EBlN@(K9mm{NiJ-}W_z>a{Q8Vc1=Q)5c%8 zToX?NfH1dgD&_7nvVR~^-8dd}sw#OA0`8L>l|sPI0d6k<kX<<J3{?Q$WSHh2%lGRH z9uik&e?@DJ*{>09m3dUz@E+rTXq?@rL;iYpa86!P1_x7bVa=#mkDwuf-?<qe>joC; zqZi<yO-<sF0~sC}AnU~=nh*h6<3C6y>=E7s4VjSK$i-->=TZ!_cBC3+-FO5ud0m10 znker8kVanerVIc7B;toMAvBvpwo9ab(!8t=9{l!48+)}wo;*7Mh}Ivk<*6^UnW_g5 z%1>G`$WJy|Duu8e1<P&=_gqx{q7l`Y*S@`=GWzn`H{0yN_VrpF3jIh;odIKQYOz_$ zPsS8M%JcTW{>2st4_RM(7EH|t%-jDSy*Iv~%bE=jj_Go&jJ{;v(9yVU84`*nsW>bh z!P~TDmLui&MIAHVc`Z8DNCPVO`z{~A4|5LLfRl<~t4ufIXtBAjMDqPJ`s4hXjfpsY z1!Qi=qc9D=8Y$y1LS+5)A`Pf9=KP#cMq>7#5h-ovY$IYV-`0ZF9S+A~4$B2@m%Pu5 zA#&bYd2<uLrdI0z!H={!cq=M`2f_NE{F<nIw1B7ltyKPkp}R3OC<9ad3gjHupHW}P z4d3ajOC%p(TdH3}FJq)>p@t8k_qQKGSE2dE&uYHF{wVn6?9W3kmg9TWe0%iTkM2Oa zCmRS4x<+B6BP-2L4AC5(kdB+(G7Z{NV1J<GUb9slEEDP82DaJ8%^e~z!mJ5afb>C_ z`i9#=Km~shU-3t%COo|a96FTvDS9iI4M!~ee|Wd&Z!s5;)gWd?`Y~*3P&P#xd|NwI zY;Aqk(qvi&b6Y@j%K|W&!2A(MuV6EnOZ01x{u(AS(!Zcee?QtY0^lHdP_ftp8%JnU zf7D#H;N>5;=HoCxei=XMUs0xxjd;+L>%rmFbGJxT`+_Za&K5cX<c*3VHGCAu2uO_- zj;R@x5OB1nKL*Q(%vvlSRFLt?N8*Q+FYS#<i<zP9Q2^?X_ShzhQ?1j=rBmr%q>;Z} z<<C8??fXZ~uUhx>!_fG3&OI?u3QC~kF|&XR<~(>>Bm63Y{RPRqk~~OnsF;)Z-2Njq z3XBxFshco+%N<Gb)5(>RcqIY^ONa-Y@(xNT{*3dOl~9(r8Xf<kfq<#}>$5RWUP`4} zf_ifVFdm)$P1cDyiLg0e>~Xav@{7Lf)XQ<GsZXXk9H0($7$F*9!xi3W0($z3z$O~( z3CAB^#|E1BKCyG%C%MkYqF4rYJp!?F$ssth8|O5BYJZ|}@-3FTCRzBXHS3ARcqJoa zKY`#r%hIC`@I^Vn$DzMfc;k__0V-n@k>7r(hByBhS0AyG`@Bhn7$Extcwz(-&JD^L z&saW4zs?);{r<z&mhE@n`XNzv=nD)<rswOAj_)xBhcT|hQ}Al*M>!Jv-qsu0sf|61 z?8-0O6glT%@v7gTC5M2=U-u>PPP`oW#g3%E+@19-eR*Z;q{OUstws2v^6)eU&BGSH zUtWv2p}g~_67hZcKqF<3#bzxfP~QkDtM-M8VwRU36E3I^21AfV+n35UqjsJ_L;vh= zbl*bc_cza7ODp)3E3X&AnE#d8vD$lJKVaPRJ{=#2r~jAF`>>)P?Yz(6bdD%F=UHg$ zZL~mi8J%1jD{L0CB(fc<BET^zI8!n9W5$DKXp_u1-xVv?EMw0<jX&QWw{%nZZp)?w z>`xqyyy8Jz0T|+p-<g8(urbcx@T1B2^)Vr@hTYT${u4zphmJ=9%acfsILGXA!;ByF z$0l2z12Xlfr2Jz~hloE8PUpP(^LTNN`bBADw4dXz{g3jpYIN1ynG3jTY2b1EHSd22 z`s)oxtNAvV*Z(4T{qH#M{fZBL|1UE9wE8i1;c#ONdW||&!d1d|-fQECh{~K%1T%jq zUm2a4fByrV1@C{T3EckxR=M{-MET0E#do?J5JnE}&wlj#0P^mCuoyXu%9Rf>Y=ntJ z=9}-AA4TopB`V!YVQeiDxafiQ>yIBYW^f)0D}VuvH-6|So<9r88W{N@6$UJnO+sn- z$vkhI@kr>+dO&k&`I=X9nbpA92{ru*`l$wY!~_}d@q#<FVs<9!mA+FQ-;-#A=JJyf z^50@ee)$5@-UAYHod3uYCUC|s_>cPb{Drrc_!s<N*7^QZ(lEa7k8~_H-`!;A+r}|9 zvGPLYyGZqHyP0sXe)L2B0$PF(;vdI%utDYE*%V8EHtu{1{F~T5{n-Io1{p|M2XvpH zQIa2SByk2<5O8qjK#oTa&YVNzkuBS!j}>_A)<@dh03Ol(c#O~g=e3_dfc%sC!SFCt zfeYF_hC`PJ03e5cnG2hpY`2@&z9C)bbF`qg8eZOofDBYdSKcg>9=U{z!ZWVGH-g*c z7qJ~b*i|`i=p<Y{s1mR~v}a=%{%{P%<n{a<dcS!=SHb+Iy~e~x@bPp?0>xs#$eTi$ zMra1MSg_JyrahW~<v9;<ZouOxa^sPcun~P^J3IQw#vRm0HZB_sv}|132OinDefr48 z&FCZbgA*?y+!IIPa@rU3PM8>6tn$FaO~L^W`fi8%I)Hkb3Qjlb2sxPpvIZp&>&UbL zNn_oZ)-P#2CJi3jj|l8<Wk}weXLk@L=#S_!bpGW9_dJ(5HpsUErNDeOF0QR7<GI8m zD3J6uozT*Xqhv|Zgr$04aQ#U0Sk@M0)$@G>OKQ~xj8v8y#)HPY#ap3VR27XQgzb{f zSb`w)oIUwrT+!}~2NhRF9oV4w2-w~~6+hQ_1Tx74D5w8YJTr6Kjeo;>4il~WVD((t zu^;A6$cRNcBY-|7sk{-F=}aMxGeGKk5A1OM*XQR^2HA<fX8vZMP`WTt4LoF!--%gv za6$<E`udRZNb~{WcH5&pOY;4J*e8um?CGP$^VxCP@GOlj-pyy)D&%2T*ZzWLr(p?S zZFn&eF;);6TjhNR?H~gyR7E{FN!a%(79QF6X^^J03?9W=wLc(HdnC%s>lad9l$;G? zu{poI-523^h+K6sK7#6atuN(&nEt#Go`tb9nfkQrV~+N+{8-yydw7|>J~NgHRW-(4 z(7uBHhh0Yfj}eCUOKbTj`1$@vx_>u{6+a>6gAE<Iwk$fRzucz&StrkN&|gT|ep^rx zW3}$dPwu`K5{YRdVlQMX_Cn*Kg4sZ<&u)!0(5B$uglzrDCPSzOSdqI9*gj$Q|Ke;! z+Pe)UjbzKG?od9*PA6M_w_@412KA8w4(KB*${HXWwNJ6}NR?;wk=8@q0$YK{mHJ4H zkKz$l<G*i_uvgQKVE+a?K$)TROmCuLbOwFNe4|F)Zv#29H#8wbjlG6?k2vd*3rrab z_ULPM-kL*S>(PJWlpwvlPef@0egor}yhcOG17-uXKk9wdp)R8}#@;pm(Y`otc6sHY ze}Ge<yZuw$!~Y%)jEQQ=9b8bJ?sveF5!gadKuj7P3gNCkSwrIV<DqijBnPtW_Ga*! zRXIl^!mIq~1n9sh&<h9zM!_)=0k1u%TmNk!<Y&X=k2NeKX5-ESwFex69D1fY&mQvZ z<(0AN{k8V$p&HMQyz=*G52t7C2WG|mKlAfr{g3z>-p9zsFR>r_JXBb<t!e{yqHu=P zS$GZ%3N@<7!Rc0>V4d=i9!1)GD$gbloyo}~Pb>ZJOFWi>^Vv9($OGn493PRxVR*)| z?Tl#x91^P_KSa54p`Ww&xvrZUb;+6WNyfmP+iHaKKWJTy?Lk`zTsoWLJRjYH8v^jc zkQ+X2h{?QfpcRL{{mkbgGo<|XA63dvsFXh^F9a@{alTFR;fV5!@Cm|8qOpz}UJC@c zoh*lia3J^hB*=1p59P~Ywx0+-95+R*n?-Sl<2dx@l;Oa(m%T;V@%UEEke<)h$a4IJ z$MH)bl>?Csci?_eoWI1aOL;e;!rqs@9HqL!Ap%8L?Qp7ba2z7<gXud{=B=GMzkEi^ zWc;lZekC;nJQp8oDNJpgfG10yCgLeBPsIqWcv%?_3dCFWC7q=&w@U-_*cMK6!Zy5D zfv_l)6o*^lcvqkhZDfvDp;-{6h9d4M?*|R9q3t6r<c5K5sl~zq?YS7I@pyGfIg)5_ z&bwzpJ7OBB5|3h?@}M^2#c*mv?~6IW&=x~kuq_KPe_3z-RvWmIzt9fsO{@;fz!sVu zW<!*v^AcFyEpyfC4z|*maEWNJDd*5RDCZ7j=VoArX#6s{#(o$M1g1+rp8-KmK2+EF z>uku5>;3kJ*gttd#r`E)dl;|iY(=I%W<p#IHN!PJ#0&_V@b?Vy5)x0d(zT_crdV$T z<vPy6$kus1{^R1nG;VSP5|)86<?>40lUvP0lYC`~9$5XMu9Ce*8o>Kn#dvSb?P?bR z_O<L(2cJ?n=;6JnMdyTn@Fy65*wE&ncp6T3)kzTw4hD4VHB~#}w5^gmGT@LG@buQ> zdcx1x3HoXS>?#5$P>x2b028tk6Lz~Ygi<^^f%1d$<4~sx!E^q&qEMvm=8z?#%AXIX z=g60(H}TlO`B6A}9MAJ@8iR%2#Da#x$#}Vxox3u8-_5f3x9l%q`|S*<bCSG<mwj_V z%ZSdE%X&;Ft=g%qu?fTtomYo(>K>YT)N2`MRWU1%e()l!8wYx68oZe2XZNf1TzRs* z`=PxPO?=@6^KhaZz3fS3;^k@0umz7B7T|zzaU?q<UbV>SjIfm2VmCbbMV2QHlYaaH zQ%;eTGlb)<=p6Tyx5+QAQzQ5A;0xpmXL%nU$OgqH?NK-UeZUZyjAj@{51u4$`(9QH zemvsri-Xk(W6%*}&<BUf=SiGlcEfYQ1D<GpsO58VYqYiem6nC#VPmE=9I?jMmp8Xk z*>T)G{9Lc<C?Q1-f1Z0~$BAaZcB+atO*p;%Jf#UcCPSHKz`j}`uJnQ;jRHH-lh*Oh zOsPI^lM{8Sl8uKnZQvVJet*G>m$X#BSBy=^i<?Ntxy$GN3d5w&!*eYp6rQ`c&(~E- zT#u)9)HgTOJ`aR-qH*^I7qkZln`u(lEzWVD;aDX0n{TR8Ua<doc7!wAo1cTmW)+s) z&MqFDAc5W+f6%%y1n7^s7;Y4YzC$esLzC*#;L+h6yfFpulzNY2{EK#Ms^csancM$) zf>}<<>HyuzS6<8V<iR`-dC!%+tdPQ=4ZyO$<W7G~QINjAfL);IERHKxcpGDxj2`}> zSG*Sjn|~3FgIZNipb9VmM472-lQXRpzf0GVhfH`)dj;PIf~$~2=?(f~YrwOhnPguB z`>&%o<IJ{$Yvik075Ht&<_8`lxB^M`<HOE#6f|cG2erqcA89%L^M6o&vlfc?!R*Z_ z+YPtvq1>_d%(KUAzb_!yrcJ9Vp_!qB(8B`q@%@=Pt_tY8`I=e}elcCvI0qgyl88~? z;?j$Q3|>`>#_^|`ucuUULV#h(TaIq$(A*9xzBR*rA-z7>`O_EG*c%{{d2dB#EUSm^ zfO{2z#>&sJ$M3G*`3moSJv3f|6VG>O9&it@b2dSJ$wYRmzB_>-jkSi=+`NMwu;oZ} zzz6Oz<Nv3`gQFSixWi@M-a~U&I{j#W<BKu0fWI3)2Mmz;M<(-C<7N)-w@E&WgEVJ5 zRFlkiaBn#0Dd8z9(4x~YFAudwVScdAt<FMxn%k88kSTe`Q&Mt^Dfz9+@x(T?za=f$ zY()$n(w3S$nLXuMggmBrcMTf0(s^!Qa*^2(754n^Rbk&8my4|Z<Q~)y+&&Bkk4&t@ zM=}D}F>Z8ThqC0Ak5T6&3YJy5&5cjJ2%Y@}^IN`u4pWH4@MaDUW43&X4=qQ@-veW* z(SnwVRXc`{vevIH429Z<55dC(K9u4CP2E1cHy)tUb`0iD86*x=Bq0^q>io}%o(j>r z*xQ5*@}d}5DK;)Yy8=3R1~j~7QfGu)oa>83qbC>^R|$*ZPoP`kZg72{&^aGdW~t|Z za|X%n&CciL7aajSS?^$h0cU|ni|gnqdu@fT-RVcbI&zcM{>@vLyPVHbymWZ|@4UAm z_+r}+j$`?Ft8;*6&{=f<7BGX=mxJ=xLJ2{(I@c(f4nC~<P&ZyTbHm%z(C!2!$oM9p zbG$GNP+kj46%4|jPyX)oi;>Th{|rSf5L8YL#2@<dFF8TvKQBlA?Z+DV%T)e?fc&Rr z<^P?M1*F0|A&~z7mH*hR{1s#5zZaB7ewj~C`H#)i(T0}&-S7{$Lu>1cz6}ijiT81* z&v+WVrynkVBlwHA!3#FvUO6Fw!@<yZc6q5>?4A_=gE-s5k{jYYVR{3c3I4)k;;;Cb ze!S(oq@W<=oQC`hORg5OtA*@pA-h`0Fy?SXYV#t-UVITUH4TSkrxy1^Cpzav%ng+0 zKKW)lHZgAR6Spraj@w_F4F4CgSQYzqJ5d_9ubmpVmrP6AFTo%dAH;9feZAc(#KrfQ zcf?Z972pQtuGA%%FyKPtBj@zs|4N{`k3`TUS@?XiaGO>5=Vaj<HOn@%PRHpr__hc> z(ol@|2@CE&FLY%F#F*>ciKP=F51&T2OxUNETb$<eA9~~~iDO@~R=;0pzhW()I3x)e z#o-&Hu+pja#35+sZ($fgAzpXGm@`~la^J)uK4DsL;HJV*)ehP-)?rv;<0YGZSUnIW z%kM<j2g%4rHl|y$d<)7W<pDyOKC^(NGPl0mc*;LK$sB^Jcf(HtLNN{C@l)ZE&06SZ ztu%E`rt!ft6d?6pf_ihNLWCRsPvMGi%utm`v_A3eiRIR;^(~dDC1s(Os#TbzgwkKA zbi-GY5)wwN&gNqDrRgjdSH5=^9fqgjeb58laIvr}Iz-YI!#g1Z=8&lT{m^d6)PG0G z^6vwhdEwNSPtLq>8oGPq>8CC|wYshbBg?_@nTxB7TT883i>oVJ_et2(Ud8tWS}&t{ zL8~a__fJq0)MM*h%r5~MP5kiB)Mln-iYoDo6TR|UkCnEk9x^C6o}N=swe9{Jj3$V3 z!*>YR`Q`PA&I{Ny=NM*(!N3~OiC72tM%0=0g72><clf8fbTOV<*DN<VbNMWnIkS_V zJeNa55-&sAQ)Yl+)iyUg0|i0!gPq4X0px3qlYp`NoJD{;3+dZs{c7f8+4bdiE46Fz z8;k$M2?Cf~B{jRi_8IhTK&=ty@`FR6`*F!l$eD>%(fux;w(id|ru2dcb3zvX$H$40 zvGTZ?MW2B0Xu&dIqjMc{Q+LC^bWVXF>q8jWL(Yl*qh&ube1J0-RL-G3l3}>~6@i6t z4BktInII6@26L$^)mM9=3S1B&U%B9A%CA@Lu-}9NXFY}){;ajFpK#Wcu-t=KJ+ATp zAL`x&KC1G5_?={C$Pf}wP@(}vq69@F8co%}K*^DboRNt_-O#$wMyXb9Da;5~gv68B z498L0+SayOt=;XS_H7kVF(HtIMK(8-R&i;4#?czLBy5@c{XJ(U35#v-|Gl4k-^+*0 zIp^8e-}Boa&=4>X&B|${TXttUiCL@1X^RBgvRUr^+$^&)SzedooDJ#}7U1&k=_S=h zldxpuTxma!QhU?UQ|;cq=s2s6`P^W&?)FC#{>NVSdhEBxST}8-9rljsWSif?L7IXc zQyA4J>NXNBBT@HxRZC;zq?A!oO0l@ZV7gm-{q~z=Ur+XemTt4EK6;{h>xj?m-!Dhg zlFjMhC$aI;uyu^GvqQMM^J>L`Ih5rVGySsYQN6-ceY=FNNV<Q>aB!Gw5F8a~uvohj zlKX2|huQ{=I~4$X5g7WM*NMV!Ff0tLx(rSqOASE)=fk$&dp#L@QOEx&hV@U6V2D_x zc`G~&TguOXN80F`W-`S6+eo7BKU?O>|LiMz)5XdX!Wr5aAN?1Jyxom_I1`z-ViX0Y z7J*nMitDJ&ijT;_xEaet_x7PE@WVf!)Tw_6)|n{2l0-EL3$hyJxZ={6yujv`%&>+X z-x?X(h%+K5Z0|`&hw<AN_189Sj}7U_rDy4Ix<!f)+sT~RGZdKFRD!dsi>rX`Q$B6y z)QtMo-=(EaVK;M0s`1GhZUF7)9brdN_?JhC3BEdi5(8EBCwbqo@N_|-R{Z`^{qIz( ze4Ew7IkCs97f^C)A~L*41tvkEth%YhNab7H43sXOv7MUShPbq{y?X>!?sph=Yms^l zlj{D|0&hnTq|Wft62+(JrfishE=~F4AEhas3(JjF-zqVz@(qL9(~~^7F}Kra+F`d+ z^2Tkt9YU$dc+iSF3}e;&65Wn3xd}DMf22R5+uj<dg!V?9^``xHui5SKMVxKXqfGb| zwRJOnJv&4Vysk4cc3Zfv?E+^+k+^UY?^50wfo{`lL<_K2_u9L<totM0&Pe43?xfP= zp|`beORZyqa1yai;hZ78LW8;tQFRDBd<}G4AYZ<0@6CJQcYYmqRV+{4DeqTV_MTk} zr!lopuk~iQ;Y~X&BgDP}5aJp-UA%s)%)N$%-<;?_wi8%5Q()mOM`~DDZrOWx-TJJA ze3=k+B4maO7Y~Jd%CBh<p!sA91)BdcU!ZyFCG|cp8qAM%Bkt1?0#2Vk0N->!2K-@L z!NT2a0$9MUtwnQtTGQ!R?k8<l>-wVPN9Sgd!cBwHJFQ{6H!%NV<H_yel{uMzVdJrF z1Xs^L-s*YPelssRBvKBpQe=5MYcUV9cTEkqCWpi(x*vIbc%#E13zsjq;`(l|aC&|0 zQ*r%~-#pw(w}#W5vF<kUe<+FgA8y#~0gf(!vL0^5X94$T6|v5$dG6qE7x{T8{<`?< zjqOO?=h_cgM%!@y$ia`Bg_j-jr8DtV^3f$fy|Jxb^#x^~<RvT%)@{PSjt#@^d>xzt zDD<Pp*$oN*!x9)TY>=<Gf0-NjeK+tvH}DQOaFh=8FLb{=ZYj69Uq`!f3*4`n><9|G z#r;~t(DU^*zSuuWTv`b?07iDiVNJD$sz$}|{L<RCEXSPG77emlBIT^-?eaB>*l4+F ztS%UCtj-N~#)e`$QB!r?@Yp{kW;j4AoNhIjc}N`F$i0|=ytYlLyh&?7Y0|CBa_}Pe z$)q)I1=(ve4_ZS5>mh;_Sot>N&Y!V~^uqW`cWYks9P#QfY?&{giEPfH)b7^Ys4>?e zz*f0)<3Q!s-0oIiw9pOm=@6eRkJh9=Hp_kSMuA*D_|}p<AWNi+rIg1qi3P$=n_eH( zp(~IT^N9osvw?qEePmv<>!+0UbDk84u}MBm&DK&YZtjZ6vT;KBT@u=>*OA#pU~lY2 zDjSo;zfpQ{dCRSaJswb#`F~wOfgYp8mv5AW@~f?e)_T5a#`{)7Qc|p_<~!mPxb;Ph zwxRsZ3UJ`&!|c8!zl6_lk%W~<7^mkY`Qv3#OZYAcR}$_vEZr%gT@u<Gdo<jjq=s-q zuRIJ}8tJawm7Gh5_Mb6W9`>>k*|~!z$V#uz&XJxV%TDGFnj}3zg!%d>DLX+k2PVi) zav;k@vjKAkCJ2Z3GC>f+{Z;&z^ApPNm67P8Vws>4<^mWW%4gt4xYd|}NPKwgB|SZ| zH4f;no}aFCdZ9Z%%!N!#|1`Pt(>iE=BANPRe0ybl8SqFxLw`xWOhQ;m*e(eJreBi3 zm3HYFlIfepL`K|}xf2v1aQMHQpH<9{d(Pp1%HER`TgtKWl;6dJpbv38<x%fq_#}9d zdXI=yQsvDM+Tq6=G*EaH@?V)@{eC)PZ8a3^w5jE`JoOio)Em_VXxpZiMPpQ1jea>A zMC^GOOq4h*?f(R+Zu0jGiE0IFPi^2Vo9OuePAC-PJ>O<H)17hu^L$S%4pMx~uXZ5x z5$b4>x`!;PmTJ^YY1!B8J-M;VR22cMIzi#IXBPF3a+13gXyd6A=M?@%a4{rw#hcel z)JEX^(UsfPY2-^6|5?K98G$tC*wN~=PmpGQ${^W$ys<o5{?ln$DYHgu2F_<8kxI0E z4Wgnh!5H4uCpjH5CKeaa0rIybpQo#gbJQ<wt%x{<U)sc_iBL^>n41dHN@Ir0MRwfW zxJiA5n%zL7@%!ZLkGKxLfYU2c_THS>*^K3x#Nj)LOcrtdA7dyX;*5TOqtvo9%FUr} zDl`28pMHC<H+F7+sUO1{>)CPa`mtM_-NGe-hIjl=kW~mw)|T6<^j5cK46L*nRlkoD z5b>GdHWeV@1LLBZNidonFqe;Hh51$a4Cx7%Q))Kc0i;y&_p}%2p2<I0E-<HZCt4a| zxP8vYfcZ#pBh*tP(>y>jNv=|tm{RAnHiUZmjtpC{E$WBnigJ&Jt5LO*g|HMewnz|t z5|?Ez9HMGtI(UL`dEr+xkK5tRSm#j!BVEOi!HNie5<Qn2`Nr9p_~k4DgNJwATp~mg z*;pXCbWSKEAH#D5a^9-ut4>cF54I(y^<{MuijX{K^b+1i8qrTX-cXdKAG7O-OL)4# zKEe4|B1Yqfv_y`ZV!;4Mg7+Cs@VbPL)60WEqmk9b%XXu&jhAq6>#Z}@oE%0VaXz== z6y6BQCHQPeEa&xgr{m>gPQM7CQI>jdU+kOeRC3u>CmKyZp&)e}U-6RUJ@Q_}J7tZg zED8xZrJ3@Wbol27miGn9YY&Y{GbDYnQI_48j+Lk_ltR(5X=)vBp?GO(A^@YRJx`~a zpdKT%!*e3PsbT67{h{e&m=dLfW?R((X_#Um1*?U3Yq{QIScW1dkYy<NHMq6(P`6E& zpd1=S0?`NKUZCIo92P|j*mo#V9SG(}%RxxITkYNn^FL0QAK1Oa7Y<obNF&-BT2VDg zuaKtLyN@u9^IO`i`%Nd*>eKa%R}W3mI|U3U;eYxO$U59uwSeRyAJH_}(n0YLW#dQa zcozoaAMMM7(%jykCSIb>BLbqZjxgDczDQzb5jZ+}Gifu9&n%aLqFJ5LH_(%-<WLbG zHy%bA?Cp0V(j@0tv3II4SHdIKz6Lu*{=zl__HAA}0NmU*LrHv#eCYKMW!dBE_|POH zW7ps2cLBaMMMpV>+Za#vhhT;oqZ{TbNo3Qrc48e;-9jmo7LA1Ty_gWK0=0pKt2+p- z!r_+T3uW^vE<sKU6*Ggpz=@Td1)k*h%H_j-zw1<aw}KlMOwd3i!_3};C`u&%RF^B| zwsCdn8}mOHU{5oLKo9Lppj0Rwoq<x0VZR}G9LDY<=eBIl<lvkcc;!}QPnp|JqnuZx zCG_;mysNnv$Z;19NW(9X024BqPQNZQlPG+Ohgw3%sOn0--{6c<Ka?XiG1}2drrgaV z1<UHt4%k!1bTB7T)E)|t=1uJ;Bb6D#Mp}={qug|HA7p=)dSgTd=15;fj#Ct3W4O+Q zGu-KFe8D@fg`C}bJk>dj=W=_>8hG+KM&mwu*5Ut?eDD@(9`_4go8WEAo@TK$Qj>a2 zNC^NJC08)uM&m<n<h2s{JssIAk);u*TPqfc&IR99mi-}(Lh@z>`{oy@FH6#id9mEo zKPBKQ%Q4i&I{OYaRi5#@G-pVmA>~eTBlzrH$7ea85m-z9NKi$o=o9HNz)3$jcQX|N z(4`@%CT3%vEXPFQEFS6^5fUYeZ*haJk)YoZw7jP2ooK#0Fr&wF^fbK_JE_C}$Y0&@ zFgY~>%149=qpE-mJmELDvLt1_%o6~$h(%r9&oyNqF;PrYPVxr8k}&>+W1ajmAFOY8 z-K$wbjv=Z?e6*UaD#ZEuoHOz~eQ4&H`941Lyw!5UH<<480{Ko9-pevmdt7?%<evc% z+#Qx#51=q&npo=IWF1MIT|g3NcjeBo(;f^&hou2zEk*X;W9EOvk72*aDnN6E(OG&C zP_dU4vbaC!W`bDJh4z$jNH~f53Q-MdSwcqRPk6TyQx+3rK0AUUU@cA+)XUkz-BjwC z3-ux{who5*(*u&P_-e_w!bc&M>)ZWbV*G(8KYC7AcqT>ttyA~*9Fnct%ZRC)KCi&; zJe{(Dl<H@-ybBYpck-?0Ggv)vJyl!+6UF~zp;PcuU2vr8byN2nVpA=Sd`??`O3`Go z$l~6&rPeVy?9D^FHBXY(LHmkBwOVh>MNX(apnmvy$xYqp;`R<!+KQr5?I2J^+4!lN zmEsaDUHtvkv|39}qG!>cbo4Z<Zl~pCA|tN{)L&_G*tz6&$j<A^N@--I%+elTS*>5u zIrWhWKIh&oE~lx!5L(VLcf#*sSVYi!OlJQ1WU@!wQ>u{c<-|s;lzCRaWDmGZ`Jc#+ z(p)Wg6%R6D1HSs$vv(7q77ACA;eoya_VbdbF=&lty32GBt^}Wb9t7FUqQTb%SJyhX z1!|oW!p^s<YRlj4Hhptz<rdBN@b#R*mC%l~IwSGwtrNd!+*Phu;WY)$wBAT?mvQHB zXtOhIpS;^Y<=wtrE`Iy2yajWjBLTmH7h2ph?d^~j8qJNwEm>eT+~KKPaLX<@+4hvL zwF*4O6>Q-(yr~;Qdd`nnMO_R!UZAHF?9A|)E~ifl+oE33Gje{lbFr_st`^V+DiwCl zA0PI<0yo@pk+o9Jy=NHJmr0yPDBo5T{NjSIC%?#qqdYq|?A%sbiS#Z#@$_3Su@cu5 zIWs<u1mB$hMYnqk&ar~K=NDMP-UWGPca5(!c7`4FM2FI=U~hD63daoyGwInA$QXx& z7>8PKhne0g*M(Bk>GL1g4Hhi6I&%v#&jr@OPAB_e2_g{IODQL>n(1R;JJkt#s~C+x zVkp!iB`cz(0^V}WNBfUbbKQ_R60%TNmiBLW%<JiyR)Ui~PpmGI7&l)e5p}&`d-6U{ ztbC;)IqHX_8QHjRAB!i(p*xLrfgk<2cZHxe@o8m9JX0gXPQkv8X=Re3V_HBSR(uAj zhBeG6$%R-LSZl6y2bEs|j_&2)9R3wrtYxhFYDobo`2t9z4XS1g5Us8x{V%ZQx-x+2 zSpMpYvQQPgpkFRTO^X1ob4txi^+DV4{&E^8>xo&tdKHK4s@VjD5?}2UBJK>j#Ki^p zV+{v8VgaFKZWqWO_YZ}X<Z6|8;rpV2<@XFDVQ|NSX*JEa2g3HSwAnswXnsxn_5uQ` z_?Vc_&m;+%Nk}AYx6OvCYa5(-ew$PHGXmx!hAjK4(HNF(Aw&Xo8;wD}B8eM(R$WEd z``ObTAn?QzBT}Mea>0#8B0;-3E9Oyx?t`@do5$()Q$X}arl!yFPa)d$u8sS@z)Lvc zxD9`Gfq6*7&HB2k`op&zDM(*`pXaZ0{O^kDZ@L4DtTAOcqj&I`%A+xF^I|$_Gx)}m zC6@igbo3^E`=Zyg@I5)vYvd7#flwWhMz0YlN;|`mx_8lF6nTqjzcZ%xrgvu7ddrYB z4WR>N=CT@(i77@P%#;<adKlV6ZJ6ffgmw>=6{Pemy~JRoJHoPQ+5^G8i|?#)C>0{* z4eO?zvn}uFu(a3?rlSS?_C<%(&j{3~mbOm|G?*afn*O$1KU>kwrmhLTYlP4!Yo~>R zPzfBrK!&tNqsnJw8h)-7uQZ-)!F_j3N~=x{wR^oWAFt>L&&ag(_)J^<>1hS2BGyyt zbV+M<c)>K%a^<{0l(g5ldluhL;XSJa?SJtpAum&2(u?Y}ELpaGDcc_CbUTvGI;}o^ zt;pU$Wd`BU;I7wFgyjU~W>|zb-;oJVjkcE-c<`{BxTq*yd<~@wPHT6}b|)1;G#@W6 z!_;5i6xcA9{ox<Ua&fWl9gCkBjCE_;4nlaGTJo`^mXmCN7m#5COl9#(XT6Sj9NSsj z0L2TZ0954sX?TB^pZM#_=INant=w*|5QoU>m+!(h0np8}60WJSg&183-w0@=CD3_h zy7<~BrTGt(1!QAF{#SEufy}AIqkMCG1*J_@B#|gq%^XpE)2xNra!(^4<NJ$6CM+Bm z7zkl<r%FXzPti8fT5!uB`2MZlp6)lq+q`3Zo)(@_f_3_Op6TLO|0>9lh}vJ_P3pIp zPhJ6%1+dQo2`g85rc2UxLRU#CdRetd@`klCGJ|FEgLyF=fe=82-H7ARGS^DlAFCA; z$VazF!Ivz<g)GjUJ6xwb5m+jv>8+`8S|LI?=L>AWKI6bN@NSggz%s`S<;_`o9^~Ty z-TYVE%@Qht`EjRA)gMonUIXu)<t=<$aj3Osb_Q=V0yHu%SZ;7z^k}CZM9kCV_dMwJ z!~*J$S&{_lrT^WZl49btKoqM2gm=w4S>dY>kZh>B#?r-8(zK#(T|#cG*w$%s+ozS} zqynE9-^~5QSc)PX*zq7ehU~qw8F0T<R*B;u^<65f)OxeRqZG32Rhjx5GFp<0w26_Z z(=a@{cw7>4x_HQ%o6X-$CG1FiorHt0#Y|;?$l1U1;AJmIaH*O`!YX&uqL9LZYNr48 z!_vL|a-i%7i!|*m>F#MI)i6SeKJG&)hm(kAZd5-*Bn;Yn`}dh*AkKIZ^pB0ywUF@L zkNV`s0uy<JXb#lg)B>PvT>tP|AL3So?j%`D60^G+HGxwk_wkZ@q*gXqBN_&PSXay7 zzE;VFK0$rdR8Mh?eqLV|f<As;UreVXc_w|)gR&?3RQ0kmOy^@!f7Lp$ArmQ8-1Q!0 zPI}L1d~b+!@d4K?^l1_H1N+S2$8xLs<8<G+yOR`&nq8A;FFevRR<AqHSbcY3>&6_9 z{ic!f;(F4mTVvHB)*sPH)P4C~M78emQQ=k21~Ulv?KYZ&7~W`X4rE@=$iAeqQLklR z9?rh}h-&TKIY!fDUaG0s?!C^qcM1F2XsoB1cCTqPiYm3;JI!d^Dzn*JV>F(wL#7*z z<MhkL(Oc}^*+%0#`s>Q*F?R1)jK*U9RcAE*hHOa-d@PJ#tgyW<5Du=1o?$t&d3h~* zl4-1ZXPEJvXTgy_2Byp;m#2Kqw%+8C<d7kqnGEn|Iipvykdq&Q>Y6=kE9hLzPuBN` zg`KNCHNhU!Y1cefBZPo<U4S%2q%j&tQ6TkXi$*j(dXel1XJhhXsye8wft=CPYK*69 zd#yy)b_k#SwN9IQccz|qlRk{5(Am=7)KMJPy?lk_tJyU>wK%?7_)ON)Wa8#YTy_0A zbXYf4*D(2+c+>gBNK9a`&DBhTCwY?|_v?+ji^*sAer?GXyZ1(;@gw5w-ftL<083uJ z2}P@4=0&f!dlwjupRxDs-k8gfwR;yCO)pW<ijzr{x;WhlrZpV(55$hNJocegzR}vY zJ9PphBO`Lnay=rc{B&oiYIrn&#8Q%dRK5{F5lT9`bwv~<BW|o<`Dkr0bESmUG`@4& z9N(<=P+6qHOw9TioTWB(v8kCB5*Lz8LsL`2&K-LC)nZ6DwhlEIjf>dzX7}3CsDEz! z+*EG--0YYpZ<d*6sLYl5R04#zWThDM^W;&mAip-Vno_6h`Ia(9P*Qa?uhw|3rZ;sA z^T(q|hYhK%<K0)|)Syy9n!?)PnmYpFo*mM*fLn0BE_lAT#%W=C?g*Hx_1q2vH|wbh zeo|vx^hpR-?;KH)VeXz|P%JIH*uWrJI6*Sgo6X>crGCnemWpVkCCr}f`3OQcabAVp zJ8_BE^ma6Rt@Oqe8lR222=h6xpLBVfm2Q*zhXQd!hCPz1Wr+=~4^|kB`0xf|Yy{^E zwR<a)Lg>bhsIK4twV0V{<itz^&4#{T5WD0QGqL(=$yK*SC7C2S)$b=lj>|l_I!;e& zh`Cyl%BJMddWRJt;|LJgZ`HvibB);5B`1-Iqa6R0s6c~Fh`JPl8D2Fm@mnd>c_Acr zq3Nxrv#+wH;oW)yqoYH?E{G$i@aGh*3UoP;dz#d)Y|*VB73{?r$theYDc&0=HDy!O z2Ped2UfyRdqW-s0EtsqqjSNp{BEGwfrWrCuGMQ(}zy%iM$qJm18b(-7v`9Y6HN_Ce zf-*In(A=m_Qkqgsqj1J9kwgE6@+cQ=^blVV8!n8A>IjB|FF#SLcCZ3<fDAxHLSIoO zz#@_cqQ~&-J0L@a`VAQ<I#k&*5l9w|1$&o#%W_gU$bi5WKq5;9yzXJf$6O)1J&gn5 zb-C($kg4vDh@IuQRu(|@=t*M9d_$%QXjPJ3{fIhr(mk=?=;o)!>IY{MV^f_P+1~{* zIa4>d$tkCr^|W}Dv^qMXKaF(rBZ{R&Ij?1j2y_Oc=~O>|Ss(k^lgz@v>T%*lHJ;sg z6^HIc?{Vnr^Gr@aPP(SD-Q0ju<$9J86u|X=VE??6jQd52?(Q-{Lc}uX&c6xf^*~uE zEd=`$Y^9$`iE1YcBpjW@?+wv%es7Kz^1CqhLs=8UQuo$Ry&07xPEkG!QuP3eqU1t0 z5-+7mu3<?p6FBj{G5MU>i29{DUx4(oJGfngpyWkFPp;JAXZ44FY9z6#OHaPeXhexV zJsFUDvOEE_W8?{BJw~33j7CGAoOgLV<%GIQFIx=ppV#M=DzHGax`XZ5l`v4uAA?`L z?0F>zDFa2Tt0(=-Xv~%Uc|d|OgfJ7y9|Ozj?WwVmHBL-#O8}CQ_>tgYPEYb)p3@Qq zPs)KEN<^)#$vbq+$H`bW<7hJj9hr2N#U)1KN}?DX6v!Z32}u;xOa4U2+A0Z>liaMO zQInd-M$hE8JbEI(6QW1)TVXVnxFrOVMy9Cb5cee~xnDTXjBQ@>6M3^Y<tE?bMTTRZ z{LGf0OXSC@ao(a2@;WowP8xOAKV+F@l~9E}pOvV7iY&ak>MxoIOfG~z?dMN-pI1_i z{(w-l-!2kFAni$=WS<vEFDkU0+-6`#uJL3mdg80stGA#Mpkrgcq25$(8rn}|%uU;u zL^6D%!E{EcYe4V3R=q6gQWH#EdZXfoqqIF0A#2mlrSA&806}tq%hi5bbil!=md=2a zN>g`h5j{jqv><FR(oN18o;sISR4%K9HW9joYL2HGE4_}I&|Dt*4s}+Y3XIXwPfS&E zA0Z9E2kBuOApJQ!4RCbR|9u)jg#80FKo=A*OVgzRmcIS@c=J>eejeT|G{7-nWhPp< z85*GApMz<DpP;w`4Y2S#LIboPKm)w}kN-#mw2-8q25A2;X@LLr*5~(S!AGCp7x2yG z3=knbDE|cw;3Mt7rvYB%KsbN~c=GN*#iqeDKr23jTZ9zwLIyl}-_V)Fw!Y_MFI{Et z3AlhOLk}#YI!zD!nDN#x)!CPQ*{FWP;E8O=uV}*mZ|H&Fv8X?n9_Zsd{BP-j8)SF< zPw9bILYedUf0G`-V$r1+2Izt31Vi}$gdVuC@juf8&;36}58P~KhtO!e`TtOQU=Q?w z#wNipH9fEwdSGt|WN6Ok(E}J0Z28ahK>NY;z-rEb{|$P;Z6x%7ZlKwa{soIj=z-_5 z^uVh^P9KgQcutaL=z$km0f(apLZiqGI{Y8$0fg#@&;z}i9{4Urt9>J-oGi9~5IyiU zN%7hNDGs3r>MHc2;gI@&jUMRi5gsiB!XSDe&<novdGx@K$nZa+2kxxS?uh?L4}6C@ zID^dKA@o2yV{-^SFxyT3@92Ry!L%sx5PIOd8+7=;p$DeEelR^y0zDv<%ustzp3!tK zgY{oh2iI-=&(y&b@X{Nir}LYo4w?lC9hPbk>HuYKmpVv(lMST_1g?T~352V8`8Nc@ z7l}R`fpC(9Lm&v6CIrIK@`OM*LY@!^L*xm8&<CC-1VT4Y!E_HM5K<^B9gaX4^BD;5 zzatR(khL>4$z}?s+nPXdnJP8GJx1a#f@_?<<Px3`2+z3$!eR)7n{~{d<aODMhY|>3 zqW&F$aEhDt-w+6SZV7>8pGySzlApORIm!3sMH2{bxk0(fS9y`aIV^$D=Mo5iC5;;X zs&x8r1i}jlP5KFhD>Z>|IGkRb8hvCx&+lec&?)Omn>CJ~=>O9Xyq;T2MP=r?pNS~+ zAq6oS3Xc9E;ij|Kn7%)_KZX`eKdKMMUE|&m5psuU#s=>oJ<3w4@MDmDhLe`JxH1V9 zn<^NfuKLu8{z|F(M5#LY;NYr{b*naw>HEy!z8IMYDu-*KjUfg5rv+Ny@N?VHtyRi& z8?*zG=T+&Z{=T0fGBR56$NO|EaKKWhTk*5Z0Q`V(5D{AOsTuq<hSPz6+lq`FPV0BM zs-%_Oi3@Yo*EwpIC$8~|bRam|^Mu!P$BmJ?w~<P`|FG9{fjxN_wm=s+1-rV<5<6O? z?qP^T<~StX4jou#?;WxDOcFmQiAe?f63eO|qbLE>=utQDO|^TS);RtN-!ts8w>{}L zsV;S|tBw6Gd<9`VXc1480Tk7eL-d6mv!s#%d$r6vIX5=7$1D-QzR`1>iRHHyHKmtK zP#%ae%efe9=?+*UtIzj%kdhnDw35b_+YEcx{`j<#RGvMfq!iM|a%L3Sbpc(iIB|*N zp(rzD2g;R1t2R%a&8eF@O?@5U0e8+X!o%Z@RdpptEWqQ<Ms*j&7F8~t?(x8FY#F4S zBEuaJ^)>9wuPZCb$oaAV42j>1cibtE{x7dglM2T3mUM8+w-H4GDyTG4_aTG()ra&< zC{Oh3n3E|;YdbmzZL-zul;y;qC-F{!(o=M{Y4@RPqbAZ=k+Y0LjvJ!#vedCPP2I7h zNtDYxj&h?-Bh*71$8(AKK7?Wv{~iT@K*8w_X^>{rxYH!O5h<H2pUQMa#pwciwGjuy zU_EE9$XBOM=2F7oH8-FOUy8=YZ*N2Uup31N=Wq7yfgC)|)wOH+dAc0}svZ$<yGQ^M z1&Bn4sawmmy37QEAG@7kR8J602X`!P(+V2y)X|<QX-{=#-&u7XmbWErm#r0P_0Imb z9KcIJB0ZX>ScwUjNx{xu%Q;t^9vy2h4dkGcCGM0q!EzJ0^o2IomwhtTcVLvge=)|W zS_8B|_h3l6_!p9pwpqcyFJ=QBjsc)0ME*w?QI~hU<<PzKxX_Qu#(rR(pnK_#)1_KT zrtVeE-$s8ZeK$}KhQspL(&@y7qt%=pSskkG7iHD&wY=ax6J}9x*j~J!jp4(t?)H`A zSwqUf3@`)L3^n%!W>(uYGb&eV#=V+Ls^xCJ*co~nWL0~{YPm2fKpR!n8lZgnK-TV5 zQ8<3per@i)QH>&&byzr`>eIzhhQZy=a9|FYl&f7E0L^ug8*~#>9$qLTvD30Azkz|D z5(x>SXvEON)f3dl2)!||F&V2O8DbdQ0mSspv>Jt~TfQfizWYOwACI1mXi~)SvjwJu zyUr1(0kf6iNH!S077mDJdZMO<45Nzt6aWiFqL9IZi^&^IbAJhi%6losGotV&ej4Ee z&OsLc>@r}%iGq6R2E_gENZLf^({5oJ{oj%x$G<_B;ty(JR@S1xKbg=D|B(c8+k8uh zzkoNkmSh;dz^xX+ufH(!J}+H-BAtu-7n9E2iPxMgVto8&5Y7l3`*RW47xH0Gxr{`f zSiYO?9MYwW_x%7#zEq_p`Q3cM%ayig^|h--+zirOs{Xhuoi<hvQ*YJ?kiQ=GaJtQS zlJ9AHDSRYx>vY_r7>ev|xfUZ+x=f_&<LLrknwABchmmQSxA~}LTbCh6X~S0Uqbf!l zP9TXZGO}hiX*HSzT9<X8{t46{T87A-#?&<K6kC%9x8R~>xuHorqEa>qh>LY)N{>!W z4V!#@v~Y3_!ZWFv3IUogAdNvX6YcFUBCsr{${Q2W&azw*Vsh9lX+N$<tIKoP*6F*d za^@Om_&XoMoNkDQHrx-FX*b3ojOlAQ|HN_#Z7^Ib${=on-5{zArIGltDg0PKji_fB zG`Tk%;q$QqDn*F`gemzKpd`qmFop43mi$1Ths9YqIb_?g6yLHk;s>$%O<0{Za4ze1 zsE=P46zqdA*w94Pum#wkxccY;oGk7t@v3Pg3ss><Aswb=S-yW;@>wRZHu#T)XRB%C ze)?z@$f4PN{n_DgvR^W@nR<?!$j#v2jf>jsmZ6w62X`$r)ZWdMb0Xy=qjb}9{-D{! zp{hS<Ax88Z`wq{9u=829abLUT?P=O+8V{}G!tm%Qfwm`+F<eJ2FGmv9IhGgr+pc>k zxxkiUdF^=|2$$zj?UG}cotM+B7bD(m*Br1K^RxA#W{Ki$9!R8dU#sPP&GKRvx;Jd^ zqh%YpetdG+2)(E-r&=?(E;?eM?^^p=y|t4rBxdB+1oub1?OwF4YKrQsDx#N%oEo1v zIl3*+?Ag&iEoTD0j;>pL?20i>saa-^YTe^^*0icI-mRXCb8p)IK*+m>1o<TR8b*OS zL2iEn?@imgNf7c(^L6`!Ab2^^5%m-Gwd%8S%oS{HkD353)jxv+Q&5Q(2JR1BO{|;H z#9F}eygj3drF|e&Uwj#Qv01>0zm#tPY%0Nz5qw(?4n}r>j*5e|XJqb0Br;n-DEhOT z)L&S?;G^hOo%B58aFAYAC|;`GV|+|!ZBhe8%*bB0><wuP?SWC1E#k|LIeS4Izm;#T zY-#E?9&+DwObA0HqAJ%*I8)Q%Qt;kR71wYl>c<Qyb(VnK9kfh5m2K6}_CbJKEXTGW zQ5^5WZS|z+s<6W6i6CnwM&lWvCtgX!;o~5>-~b&=_L#=XUEL6Lgk_JJ+~32cV$Y?S z0rMHy8Xk2g{jI6&HiQ2%jmW>k!M@lel@IoAG7JA4SUj@t5SOTp9NeKQklRD{9e4)< zz1P`y8#f+y-%0kn`?DXk?-Dh`Le1xjvyI@ZY`JDBLT|a-*mA-sTA7A(Y_+N{SYunQ zU@IPX^yE(K!=|4FeR*!kd0w`L5o(i`j@M#hwN*$!*!yEBTsPZjd?8l=`~b*Et|6d) zY3_vB5ZQ_84g`hEDZ4$dV%7CLowlAGqt@5IxvRc)QS(Junq8EuzBNVq+8!<H*_nx& z*Bl5n&-3a!l5?br737tF_2H%(Pc&1u%()b9J}rZ9Jx%BMXFve8hMLEqBjB`V>+0E& zEuw4bvD>NHeruQg-m6kt?D$agwYi#oW_Nh4v27>^)E=8Q8{X|>5>kQo>A7cu-Fczk zBTkPnCxY+A{58!-r?B!C6k*UYXEq-ZZo1lI+$GHlXBtg|g6}P<lp4%so5EvTq>dNV zT+`b&7v+Lmy>q>5=9>1}ea$!+P(Er%KR>r7_|_er^1B$d>4P$24SnlbR$_X(zG`mN zUte{8jNvM=(w!-mTzhoHvOxXriLt!;HItf)QbYS%n*%9tUo}(r-jWkTfaGPeE1bV8 zwVLIZ8AHpvmk!n>uB@o3IvSwYXZE~0s-<j~Zyv335QDcSztHfeESqromPPsP({u3u z(2<)O#@hsW!-0a;uv^Gb#9j>l;!119mY$2>{?$*{mRj272KozYSaVY??^ZM6JIcCo zdkNdIIgbwGi7Jdv!4Q1-T(|giYsIivelc%K{wu$bjJVBc-81B%yui$ZGv+TYw>0<^ zvud|Sfd2tC0!XvD%-oHks!PhOW+T*md5(L~XAiDJpyuK9R|mri*O!kbpl6!S6}UKn zi{M^`<DSPmYMnRJ+@z+|oL2xkz|1Q3aR+ZFKusmCJ>W=Ie|=fFBk&9kfeL2`It95_ zss5@n0|XM+9GH2L&MY8h%K>L`YyC52^(;#CJA!|Yjl`13o?JG;s@o{w*W1zV%c*D& z;mJ$~XE(12B=&ihma<&b?==INEsIZD&R+F2i-%p!<fQ`Px=@+V^7b};u;kmMwGs<+ z)a{a9+~;oA$?qn);6I!{wu`)hc{S&m1R<NfZCcOHYy)FMoi^w1L1onL;Kb0!{uxqM z9o{_qkNqi9TwU8Lz41W|Mn98IgR<dqTO*VMGbx0^9N~h1JxAq8TdeJ>W(p4`bN1Qq zF9Ngv{nz>rKGGlV;Iri5Lz8)vdiskp59!#6Y69rT;SRo!Aiy~IQa53L9>q14d+HVG zQ?Fv+)Ds{5U#MI!M_Wb6+s<%TOwfqP7WE7CW`wOEr`$L><yx3LHz9PCrbx1<Td7Cg z0%#UEJVy?;U8|%~YZtkvn%IVAeI?gZ27P^QZhv3hLmqtiV~#V8-wmAcc!5z{0nW1I z#;Wr`F%Ir3=B9b{)M-n$O3Co1xEks@QKT``oAfa*%S(EnI1clTJyG`YE1dTFEC&<` z6}bwgs_y6zPihI{5ki*@vziB5?cRNhgTZxooZGlQT9Bn0dYU<;GG~5&Deh><TH~xQ z%~96^R}P07tQ(9PWRj21k-$>*(@)(I)TqJFR`SuXR)$LkQJg_zA8gvYuaAD6-<s%k z{LU2}D9|LicVdoP$fHa{O5(l}E#ue3xaWWr<N3NlS10<*sY#y~J0EU8{>eWluLZ}H z`4ts)v0Ij8*a}`(Rw2rLQia@#QmVonh9u)|8{s3k^mSsi{dKSBInm4$?RoYUm=U@a zSh?CC=EPD1bTx%TT0i(5ED|f%^Y(pt(_sxd40?yU$2*00QlPy%9W6{3Urvl&IFA6S zczp69^mGr@^>?jh6aELkClxn5O#L0E*o=ER8anxvxAq26P@mS`&?67%?rI7ou^gu> z3;9tSKh&%RTSB^QPmUY<S87{XAo0J~@$siy_>g^igzWEmQi!dC97i6i;6ykaZjRf? zdtl%D$1GjkOt+lEpWKKsR&Toa+pyp=j1#cH9PL0t{Vpl_g-0B%bPB&oQtdb5hva09 z6DocqL?4^{5|;5Bk*7X=T+|qZoqVJ&7bLWw<(RSQ6elT}3IhqNNc|DUO1}!Zw&gEp zpk$JZ+({M#=5UqRA^X*Rln-Cia=-3!zh=8%i`=gp+^?^@U-R6rtK6?e?$?F-%c*D7 z+<+-=z{3)d@NWU#!P^$qjU(KhjguMC<(A{f9BBna$vC>p&Ot?nEH|UzCIAbl&>0<~ zK6s4OZpMGTpPj~cKF~#Er!iVC=g^0xQrDEfL8ovyB>W3*p&-oCj<Bbqg)b?@%U@<% zAE7LPG51is46HWPI*^y^6t)8SWdWCouMh)1b)!tTJ`bE7;uLUe6ID{ma^{b9tsM|% z=B8;aEU?p3ngcvX_)dC?r&2=Pf1{KOQ`{QlW26DeM`oRz=@d?vGe`W3e1jTTB*%;N zj=MJiU+Lm6Nv-ZWaV^gBltTn8tV|QKw%LPumlgJuGvnZ3F~3?iT3S824fY#y4Z3!$ zsPSMq>zO<S19dc)Hma9#++`)M^5$p;$-9Z^Ij*Dpx=!`VKc%HuJ^NQuf-LM7N{jJc zk1gQ!lKXyg*9WI0=H*1ES#|%?c8eGwss|)%JWuk>kBH<2Th&f=<WahhhnloLDB=yf zBLKJ8^6sGY*dx?5OlqZ)7yc-*<MzT6WH?TSNp^O#%Ni2_jg}6;xNsTI@K8j$Q<z6y z^%FPa9?6)@VMITdhjJN!44&T2Wpl6r#YV-nuNN%#EjVCi2RIQG<LEyx63-3WYXg-Z z)CW(D4ToU;p!&%Z<$O!GIVv^LOrwy?377|)OK@7_$x4aYtX{&1nxQ!A-~_~0H^NnJ z`XKhl>iWLY=n#H~#(pk^3~ir|YMij8D!UmGqw#H8Q6EIzx;{8G<|k|FBOShx@LFum z1L64OGHITf9-=3ra(zmYrCaNRS4An~#Mn8F8)BnjV;_OxV@^G8HT<l^)G%=(35|VU zi_^6&nHr8iB<hF4x{5wXlaY0#WO+m{0u2aEE{#r~JTy9u0Xf%L-Kl!dk<m%hi<amS z`jFP0myDTlNDU*30cn#kJqGEv<P`$b+<LT41yRWngh^NYu;<H239fM9^om?T7JtA0 zMnE3cy<out_gMPp+~qF)do`{)rK$m8SjP4nyrbQJ>Yc==i|=os&CckNq_*Ny_QYg) z<KjkEo>$E8U~*U*w}4-)ccgo`KPxy^9a^*&*n$2x#tMG4;3}&wBI2pt=>@Ye^!Nx9 zqWP>xd}<;9%2-xcMH0TQfpRro?B1BEzDB8<2}o0>(iD>^ZwbXmpTWB}r;|~bDeGJM zt__?H;8P5uJ*u6;TDpt~2?>gsh?Ze9uqk#H{xj;O!#l#kwb6nO|2WdfqE4NVF8(7i zPT?_xi0MISbG&evyo+hcDw2eQe~T5Ti_h)PuU!)zCC81k7t@5Xxa9Tr@p5vkC;Rd* z5o%S*PX(+rYa3{PTjll;UVHIaK<IdhDoq#fSwbmw$_%~_=N+iAM=bfAE@|YM14T$a zT>w`d-3%9AFq?GoYVw*~-j0B7vwGrp!qoT_V396<X{j`=J+&aXIXaZy8%+_Jsp1Ev zGCcxD<0Jw?Ri#*ur(1Z&dNa?i@-|HR>$;@OTXbW3X^bEb6nq^8Bt7IrhhF%|0JN1) zNP~&9bm0J0JyBetEVDI7NR1nqvTAJ@d;ku1vas6|Q%ZRp-d6`DX-P5AtRD|SDwW3M zkbJ#7{!_j+;z>gC9;DX_qVMch$7^kpoq9ytjK*bpLYp6E#v^t9);R)sw@sWBJxX}l z_L?HAbr<9voT9DsVR_+bH2b;0M=HFKz7WPwZR0eGi8$v4YH^6#cn%-<ZS%(pBk?N( zW}<puQml>$%86<F*JE_0zyB?jTJirS59b1(y*pquDcz3Z3ADp0Ea%tsZm4xOgo4}d zI5ph*CgipKFiFhxnlR2mYvWht^g4y<Yf0_j&#xEyVcX)@8YbQ2@w7NkKTgtEL5D3* zo4?ep4U@oEux)h18YJwi4U;h5?+@er_M|Rsn1m~>{xFVXPij)bq{N`GJ0<L-hDrAh z3ImPvq>gNu1cuuZ%XjNQI^=P_FD=m4HQ36>b-S=YmchZ#Ok58{@@?=3_gt$OB)SLY z3DP3?_6qSHAkGn4fX9(IBUaWIE69Ai?)JfVcg|)OHBn$ach)0sO!#p*<Ba6D!0Mqk z|5~C`w~8DB$^1pP6DMmfT^!*x#73#y3Es1K;C-?rA$3(YvXTHH=&K@l@m?XDES)A~ zER43wOm&gq8*mVJMB<|_q_%L+3%o_7S!AmgKu)JzScZV}2JNRIZe<7+X9GeMbsp%I zGoyq}+1+|4lFrpnikxyN<ETaU;4@!f6?L~_7^EK2aiH{`)LWHlapX8MetV$1wa93U z6DVex_M3fBJMkGM$p4A6cYSDg=Ar@cJMA>!3}yV59ql?Ah#sMG+^;#}WMCLDAu&uV z4+Plr>K|t!)t{!d4U9%sgvS9ny|}3SrXmZcEL7r5D@%6<Kg6NHl93R)WIyjDQuU@T zx7U}_g5*@j%kE1@$J%{;LMCnoY@tGZ$sK@Sd?Rba$Mu+j7pzI;fmj}QCEk?HKxy=t z%I(f(Jip|sQ!3~c2qx~n1TjT<VOa<lV>zj#MQX!r!L1;vvrcu4ld6OJjiz;^lxwnC zU4jjR^HdA46734T#4>(lG!~e+phRu^o0QxMpiuupshWkeaS0O`_dg>KkV=071q%3f zW5qy~LPUm@fjj+j>q|t#!NsvYQVW=-<=|*G1*kt!rrgHl6y7YK4@ng+l)m$RJ!ie) z@_muSH}O}nKVaM`+fsZ62)|b!73&sUqP<sH!8Mj~-c~q^0;7gYnxE2gRwk~qN3lnC zT8Ya_t>DY^&zHER(kooOO|)7uEJz#&`=e7G;r1`Z1aM)JN_R<jiJcKppXhggr;d7E zic>58DoxeYT4n?R_ehcluoHK`Dm^!%0MfIA3pJpM86csFoz|7LS8{2<#6Z-G@X)HW zCR^T4tgt3(NACrzhUH4^tP(J@Puey`>deUq5X6tFx0TCut4ClaH+#qhiHN792JGc{ z?gxkjx6jXa%z$@Igi$cebSsKC<7<K&=f5R2;CEG5?bZ)0!6PfiK<7Ov3i|7_dMqc_ zmbYSAEFsM-Q9<Gjr@9PbRnJy?SIz<OhBDOUdd`}+%5*{D`O@1`9`)5TWNAuY1!l2) zw^5Y(17tZ%=ZQrEnZ(ywyzr0m9xwcp`*_TKJkCR!%CdNn*JQKK*MFagsn?U1d{%RN zqNvEstL%2R+3)2VjYC=b`sEQCq+jZ@FU$3d*Jy+QC(0MCwci^OJ<Z0+;<f6!KMQ0L z8JBee2<3pRMxBJ1NGPXml#G&!SK8<l?t`qzTB*%TK1x2~dPH%-DeO8Rj#EhDUU1_! z4US92)P2%7JT{1egVb^pwP2wBur$Qkz-e501s*N0@L}4;S=WE~u7PZxuMYTJ;Fn~% z!cF`Nu5C^$OO2u0h+A#V;A+*m(B^oyVpHX4gsz*~Y9T}N%|xwN{eY#t3EVt@Uc*;j zXSdpW1JR@Hy~Coz?Y+KeL4=jgF#tC;g)hm~a&kwQ18D1C%e#l<v7<uHlaKS>ahLqw z&0or|vq<Dbr*PJ6PU~&jF3}(6-P<XLyH&SAYrx#~Fc~<!Is+c}4jZSiltif))VE*> zh?5PPCr&oku#uk&kU028tkC(P)Fr;)UrPDqdc>E4Z$$H@-FUC`#g2@`bz4cA7mDlF zxs3j5#G{Br7w~+$-;zzQzj)!<x3Uyjpi>Tb!V8376V<1qAf%~LQ;w0-ewaSp@!La` z+}_7|TxtR&vb?%}d`x7n8K78=RDdfy@c6IpgIfWlg6N(&`fs5BM$=XqheYAhdLdi3 zQL4LCjK;fVnIwuYBLdjPy#*2{9@G}-_0y@Uh4Yap9;Xv*X4g3s$UP3a4E*c3(f`uu zvP4I9^sSlbTsQi${^+Z9^yQi8w_$kTbB1h}5-uP@E*84cO`R^T$RvA)WTZKTG+gN8 z_)FzQcyY(@f?iIEWCkUv15t=xBQW@9k^@{WD*LEQ-K*=_CAwErrItzQm*s(k-?dLP zHS<opDHIk{DOSv%QH+^>kyLrz=$GWgh8U|pC{BHmQok#u2De1dQs+uFBpEN4RA{Ch z2XNtSnfN2sF`0Nd>fIzx;S6F`-+OLG)Cr&0cMrU*Q)r;bfjUnP)J05pwM(L2dyVV6 zsscyX0vrp4j}Q>YoTr7Fb5s``3e9pq3|sy2XN0XzQD}wKPsI5WrrnnPUQX;|%D`~0 zc{u77%RD&6)^4OB&pCvNPD!*uwECWuuF;`~QR@0D@Kp1x5Mb<(YZ8y3LGrUbR!TI( zyFPl1H19}>^oN><rc{4Jr~jLV<_&5n9`Et$5QY?vm6*%CVQBv5+;DmgtvfA@Hbm^b z6z*{j2*<3B3!#SSs|enas=YPM`BZE)&E?3@MIp-$4M&7tJu`KGJ9q7@{6kipeG5qj zjx^o|{AY98iA3^udF&uOcrRZj)L!HE=(WGi!=Lktbf5mWB>c3;bp_vGIYl^!2Kx&{ zyc?{Z?cvI8;ju476?b~}l5ZBAn(0>SdquoY<o%4y`w6@s;|Aw9cE?si<maG9#BZPe z-LHT5>EFHjcaQ$vt$%wn>*Fws<AvXU{^IyP0-o&RkP8R&Ixw4a@Q>cV5Z;riJ%V+x zObXKL;IB;d202%OUrp;5mD;;=mlWE&y|JSm|NYmoH_vqZ%X!8Nm&w;ybrD$)UYi+r zIYl&q^C}D4GP5vf{2Sii;p0@PY^g<jAQZpcv@u@YQwN}GSSxWEYy_9*A;Pr&9%|(! zA<`9vJ6cQq-yfL@xCPH$K9E?DKsU4W!`|H&D^$OJG)otxzC_PX4;J=*%j;QilGdy& z_RJS>(mEKe=8g<wbtnJ{P@OtaeU0pg_EX3VH6C7%#%z(c*yA3gR5=e0LsuuRKwgtv zE$l*I0$c(Z{@-~>)Iq>K?<g`8Glqb+wT0qW`}hm+S1|XJ-$TuRbr!8F-@nW^Ml6ch z^8b=eo=A+Qq*cPGS>~Il_jqRe17|7@LmSd2s3?8kTEqMGerbjOl?y1k5~Y^LvUxg$ zd!u|p7tF*z+$|mti(goiM&lHo^pco)&ABi^(rbck^FM=}xD0_B-t!WR%PvcuVmx_y z4wneFgo0}p9&MI`BesBl`sRrr%0HK?AOB27u_Jd`9tw0XIOi8=r$z#uMIKe*oX=fW z8)Xq#3EIOzX84pYckLLw^N^w1LptZO0@79KbhM1FRY;=o!jwbY)&?(#lU40H_3&9h zoDa-m>Wf-3xgI4~B=LZ5frZ*EHaOj0Gyv*{7A<QWA>Ka3_k=e$dSw03QVF5B<^~z5 zR9?G&!m(^+h;WdGJKa=H?77rb*n||tKs*GTDz$q@E(}m!;=IyS0g7EC7al=biSu?H zR1R8c>DJ&2^I;v`?amO=+Y=w;aHV}RhhQcpU?!ztCPFLA9BUDedh;KQHNLX7d!eSn z%P#SH1VdcWB71|w!nt4ME~#(0B9)&aqg`$}54o}!8O`A6V=pF4NEn~Tb=h8hC%FHW z3uU8Zgff0L`-f7A|D!Jv8vl;Y?D*f-U(9D0f;Y`HaO*f%G;_7Ls2QayUr1+{Isz>e z($dxG%&3&IHD*Hw+T%teya8YAi;e5>AHh3=43hHj*Wq=8P<o;l>(*q{5mPnx-u<y7 zJN)n5oK3lel&Kf(z5BSq8o6g_hrcru=T!SrPaj5!Q-e*EOf|10bK4qlq?&&IZhB_7 z$kKB@*78$CbG?v|g~Ai`@59A=39A8}>JQko&PK~gh0&*ZMw&gb3daMynBGlc@B6|< zuy_0CCmYggzqqpz52OwHUTveXm*mD%i2NSA5zG}{*}DYD=F=7}f6fH9>%a?-6IWvb zRn)|v;^TdZFMdryXd>{`xJ&pB!c;z~>Z-Dnq7$lS=S0UFPgWUES~<bp3yaH9#JJ?# z(KM(&-xv127%txw`;3O=R+YqFuoCAVzp{@4>H~qWcdd?dF7!1df60tQ$8&i?^f)_N z7%hT{irRQvYSaoJFgtbB3i0ogDp=tI?N0eu4CgC;enBWc7bT<kH32KJqzEv#atK8O z-;%p{P8@yCO@hrn1@l2@oR<k>yA1T~+Mlpo5;xz%$c}bqG7H`h%vBWZsZE4FfavKo zt4gA0R$Y-3J<WJ>IQQh_1h*~}hZ$#$2AwdyFPecI39a>R!jU<H-<n%BGPWhmVP5O~ zTW$G^v8Nfhh7YB0($Z*|{h=>fVt-f|Ef8a!QBS*ld)n>W({A6M)_uFC0M<cKII;Kx zpYD|LRGt92x#CKDO|FdF2eLR8?{OJ-aL7aj<LV#F24E9QR|Ox;UVPTiyPpTN&gvMl z04to`CZ<j*@RnrkQbjB_%lVmXIz*bQ`NGLpaGK9(yqC4GvXo`0IyXp~9Z2`Y`=a>M zwVWTi+q9D#pe0GMteGGTYaBtUfEG0<5;v9U#P>*IEs{meMt?vtZs*VlGwDaD+24b| zh>yf^&&fFw*Np*I<aFQFNxod8Nr>%k|Bj2;jz*Jsw{bziX<Gp|&NN@#|D_w*Ces3O zf31Egi2E&hd4+Sn6usMyU-fZcg8vR2er+(G3e6~*YsMR`Ic+|d>?=*Z<tA;|BOBn3 zV@S3vH1fFfnj3Rke%+twO)*JnNDJ_|V-${amNkx)vr|%S{SB$K$x7;VcKFG_H^7!$ z9Pbp4;zRoBSM$EhIL1d0)v?};Ho@06)A@37KyeZy@N8HT{|ygIF#oDauPPtOG7M7w zN+#z+l$~A1rsk&!H%M$?w9p2ZhfMK!d&&>k2OeDBG7)L@5x*V&r3BGhmwhHYk*v*! z2K4=U>aPmDavQYZF9cl(wnlG(3od>JCHyOPl_z!;!uC=fupVlCqF7G+Xt^v9NA#`K z!c$~<I3)+Bhz&|n=%$cD)zyQ-XX$slLg#FWPM6Bgqo^tgXh;eWQ4`$s7D3O|6JV8Z zQ6t^3nUajpeD_m|QGNI7hRv3!gnuRrNYnsE*(>J|A}#*`%u=e51ZtZkPTW3QyV)Z7 zw`xf~ae5cBC&v)XIbV9~SHF{V_R?NC37v}qgJSO0F&(8Ew~`yH^tmOBPxo|6euD&? zHn9^p(Hdj`WK@0b3D@8b>cF=<gahB%fpOC(%-ODsASmLFh_rNOmnfwb32{Y|TrLG# zL>oC$xDsw4tff>_NZ9{0NUyu>dKrrx&4-Zt8t!LcOfKf_3gvLT4{Bs6hebK4k?!|E zBi-+TM#}f#MxJ<RBSSe{hIUXRb=bj;4CORSD?zTMovuy<e0%AZDdRsm;tYo?3AM!a zSBOM^!U@1VbkQ+kKE|;LOnVa3&7}Te1}uT#R(9ha4f)zKj7DK7XLKz-_?s-69a)^` ztK`6Qeir9BLOrkJ?{8tCQsu5%&m$WJ@kuxmhB4c3=&HJmYAMD|&>$c*i?v(=y56r? zlkE>IMv;4zs$W9{Ya{~{7$!|~H61^X3r(*W=c&))E6g+4QwCoVxG(H*xBc02z<sXz zAC?5r@=ryZqs6k<=U5X9$3vyT9d=>H+>mfUz-WLpb1?aUizHg8uUf&EVn;=S>ux>5 z3O*mrji16LAitF1;LB?dO>-9$1G4niGW8V@&qFLcM0{APPK4wJ2l%GtxK6HQM5@(& zgo+5L+MIaP2&3tFN;RHxol$95-gASkw??esXKd8q{#y&t3l?emW;Ks<MSb#sz)x^- zk5arko@xwGX3I{&wkkV<11IPlxi(bFnnqa*C#%1ZM^m)}oLcUz*Nu%qwd%r*MoZ82 zK!Ms-RPzvQ@uEXIyiA~5D;O9HQzmz2#&#w7vIIb<G?OO&2mLUe89pIHs-&8V2$6bE zYOAWs?Hoc#r(qqZi%aK#)~$;kJ<-i)G#Szi>iiy81>KV_uKEf{Z|}E_rXH!}(D9im z=gSM6+@I6I`yf{{9sJtC?RIajd>^<5is(^qa>i&Hy&vxwZ1bF9L2^*BQn>$8?1tW~ zb(C5~4KReGzS?*U&Tx0^R5gwE97-b#!(91Dt(9++NrqHzK7i=im%Df)zhz6&H$Po$ z<ti}jOk9&=+ABobma}A(=G%$)EiG+QZ;b=9mUO8j!%n^IE{S7<S@x~~;5bmdtX%Y7 zRy(d|DeUMc#QgT=+!T5<`^#fP+<2-tnlC0dmE%@ZJXA|FjC-f@Cf6{GCv`<MU_O&i z+f!Bb!9~%+`rvE{5l(XIB=eafc}gFOVkMF~cBG_2L1cD}R@?*xZ_BN9mP;Eew}a7| zJ)ef0PH8Se8Q%qFcZ)AN6eIrU?PNu2l-biFOD%d@qUIq9oIG-&mpj7j*7e}l3y!uo z2Ta_ppBVE6H{5!hz1b(6_)%#7RCl)rVk7wq8#S+2rc+m##$)@uyEDV^-DhRnlExPs z&2LU@lGASQ%8drVgaAhi8M4^PY`d{44le56k|XJ0hHpuy3agj3m*sZvI5yq$hIhZ7 zYPs2$1i8`No;UhcsRt}OxTWa${w2|`o*wGA_Bupqe!$cybKR=uJ5{#SaA&C_&do|i z$-o~(VvpWlqHq-C7eIf#n$^E%1s4){R^gf<$%%57P}=A1!aE~K?}9S*hx-q=EVUNs zEx!?zJax5YJhpoU6TqRKwv14(z|Zuqg(ZN~)gV*c%nD>m7q7WmQnbV-*i%lwREVIF zqD)x-kTyQuD1`E#JG@eG>QVUse#nQ5^4VH3N8@g~y$rE{Uf7vqRlc<F1o#yLkSfDN z+w|*ndRRy5d~KmUNu7Y83Eaf#RZp=M1ks%KD*$7sT3#kxn%nfmf!fR%uTdMd@-FFm z-FS~(SK<*@W3E))^?|H;1)8a*8$@ep6Fmo&_(2Q3EK~D;lto|<-qxy;hB4nK(Xi_1 z5c?}7o>Yk%vP?4(HY#rP=1MVXpG}Zku?Ub|-6ZC0@Ga&mDvkw0tiFg2mG1%t4^@E@ zxh$ztVk$qV#PbCLkhd`X1*}%r&^EdL>|F>*(1_US>OHs+Cse66VMd6##394j#3%__ z`4_T8oV{{|OTu4p4G4Q{9}e2z9fK7-HzQ)1UVBq|wz({7R8{A8S8we@-7Z%v-Q~oF zg1z@_{cTQkx!D~u5VIE|X5XmA?56?^=&Q&ggjFV97X@FrTI}L|T_n#7)EkYj3AHr? zK8vvXaGVE%&?3tt;lGoV6R#K{jo@Yh!?>?4UHt1ST)x{c$;Db4iXI?$9q_?@97NI0 z2r69ck=d9&8jTBy5$W0NXA3D)5;xf_XfZyXxoj8)XZ5>rls=(^nh1LdZ?E^YW4mz- zM$M(>vd}S+=1AGqroQB$IaGF)X<tW_H1n!dSX}LW8Fe5a>=$5WSmkYD?^@Ifa*TVn zNFAK?AvY^jr20E6Q>z@@Dse#L<Fc1iz)>KjdM2CTQc0jWfbv`6;aJCVklF?8hs?~W ziN*DJzl;-%PXP((;<slr+)75;RWsA}*>aWvBF?=^I#__z8o!>p{W79xIN+~5Got5F zt+UrG-{)OiRz30NvWRiFs7UI8!_$G$_?XnjF@vmLO090bS=_u7{_V?hYYWAO5;drj z72vXs;gRCg#fvg!|C6j3HAHe2-;PVyYAj!_X9*#_kcAXG#&`-Fv2IMd^5@bOyys%U z%0V$G$vMVTGDbxw!W#*a#Argn$OAWlmT_sw^K;n&A@$J-ndsOeOu?wgX*0{$Vt;Df znZt3<Hpizat67vcnsCIu0$|0>N{!#<Y47zLP1p0HzW;sM-a{#0{gzkmWZSV1=Q&=T zHQjN66ZuT8DKH`zI3eCTLU}V8I**i|`c=C4KADCcsUPa^pR<ggMgc|Eu-+dm_zkQ{ zx$ftEy&OeQsh8?Lf)f`P%4)5)5`QTxMF4|y`E_m&7M!#UCE4`4$@#Hi%}1N~b&&rs zQ(HmGcx~97J_?)atr}hm`X$*zPJ5`lg(g(d1hGV{)_suKvaG~?I!$(WaewpWvbCaT zGylZ8C0ONM7A8uT6>K-|78Mw0-748h*<rm9h?e{#;pyTB$nNY&KFo*As?qdfwr3~O zGo9=6`gSIMi&^sPa%Bm`jJffnO}iZ~k^HslzqxUQbbL1K?vrk=JA5~1A@To@-F)XV z7lK?sqd&K+uW^zd)YYld)is3c*}9M^H}$1;vU}$N^Rg3l`T?COfVu$dkzTCPf0?Ur zxl{JHK;8Ms&8~xA>+W>f<@3rrHRE6Q_oWOq+Ac}>pg%5OQ@MRxFUV5=)VRC;gG*$d zyJXwf(>U?z(!WKmy3I^;fh>g@2OX)x3UmRoV89BMx4XM^`=xr~hj~$F3I)5DKAQ@p zi=QXZ*}<oAZzs#&+3)ri_+X+Ab>|QnjmL<PBJ}B^S5=L^Rz6+4G*cwZ9IJ9?@?H{R zzoCmv-YLaxR5!!bNG{pU*_80#fBB#@p*lLute;#q3a{(LDj(@O<SJ;7=8M>+xK<~; ze7~HZcbCaoD15_lO@aeFP}VHp4Qu7_>{m&E077;rG5{^-5rNs@D~&3+jtxZu&QW2g zAE*8dPXpzcDi!A?qcq1UDeJj19el&M`{%p`M{l_dBGUc=@7#ID*(rx+Br#<Z!S+AL zST}Xgp5gd<jMb5ffc<7ptXy45ag<uwU#h-{ZQxW^pFOD0<J2t-&p%4B#gGEJLlyW= z8D8V8<?1RTUgXF@8?IPE5M|+%N0$tqLi{BFK~RuWbUf9q?N4@ab$7Yd3Hoz`uyp1L zD$+k_nt#HWmB?^uQ+Lowt8TZQ?u#9zzR_Q*AP}!I2;fJ}f0BWj@+3&0VLze=<_!zW zUp+A6{ujaa+YHRk*<r``DFaiY2WFf)p}#QqXc;slZ$01+$+y8Mw~rCODrD^rp+6Wc zCn!jeR^zyft0q8z^3%m5E|!H0KD-nBpjiDQAs}3>=8>7ojcGET&hSE)k5#|wk2s|6 zxo+JuK6CWYV9<s>nIn$5mgN9?%}Fh>Ztgn{2T|Xu8Xo(!YIsDv@yqqv8Qz6G<@<<> zP}hDnRs<3^HOSCB<(qBq@}({l$br{%br<!>t}V?Hct;BaDAjy?Ce&LZJA8*If@tCn z=i0~3Htn~4hY`}aIy0JiBDA)adCg<eq^g-}G!?n*-UVOPD3HC%r6^0J!kJpC$k==j zl^h){Dkpaetwxg<p~A-LKqKxHUZwG*uPUjSVj6Kn#&&d0h6TV~5pU|rr_5}Z&T&2z zykKVQejKhp`Mi4V1C2P1sc!y5Sv`rXo1ZCb;Mv|-b|(+dD$We<Xi-D%PN#LdT#kn% zt0#tJlA31HFF>U<5-jBIvU;A5$;DqDLV%E36uO*15>+q}aN_~2!bNvxX$K=S)eAsb z0iS09qXc_<(seBpEi|6IyA0iCPwTG0u-5*5VzSuJWO3OPtc`i-n`=Jxub_)OF(Y9< zC&Ejw-CF9jrt+9%v2P-w%cn-y7*Vsd#_`{LS_ZEdTSR=2zyxHnP^sFgZb7=E?*fyd zn<I{Rsx(H(546j58nug*-N1H1(O)^jg(fR|`4zNIqoWx`>2c$0u^|159YYsp>!})G z>o{vt7t5ta6Z_+2&fNP;R`|%A`a*YGPVCL@w%lm3n+D~=fi$Vrhsg-B#I!6DsC@5I z7b-t2eQj7<&qM2D3tSmA1~-&{?ikz%4gTMc!FR?VI0h&FA20^alFuCjmqxF3<i2xF z^p01>@eD8VU~mKwdkMl5i(y&L!YF<LmOxVrian-rQ46{U_oKqQut2?l_NnH7rJiZe z!4H#}1Fca%3E{SBtmZ!TH7Wnf3W^Y?;VovmlQNdR(eCjqDkjz0i@AQK-Gg;{XMNSg z=x2S{PMsMWVx~=BYNVBzk)!^$lkOxghTp$Y+o!+J6w8bsOhaQov6#D0ji<iEMR!;F zR(P2Fxi!w3xuLOJpA&Zob4`3Um<`za7*L<<oqS?Co~B{-sCz(ZM~^|nZP*GA=G=2b z-j>ujb440OxzuR1c4LKb2!@&`gni}-LsOTn$jKx^>fCC!zCEn<&0(#o*o+S~hqVoB zGgj>yW5!M2{8LN^dUcl1yWMF;FL&71gm0)B&p`<vY#~0&C-oSs-Ws#umAN&;wo0Fn z5YUUcHSt*i4b$Ng_wU?4kMCc#^Tf#s2PMOux!Rfy%&kpbid%XZE;h6*;tE_kad-%- zG&3Cc8c&(ncg%!~PfjFw(*kM@${YfWFM(!^Psg2msO(E{e&cz@bL_hKbf5Au{tV8c z)`0ikM@{jCEF};la8lWS#$v)U`wl-X`f{k`ufHQQn*-%#)p7+kj7&}>6M-rX@A?5* z+3MqkYi~9#_KuE?f!M-{8)wsCF8<hdkvPyKzvdMI5YRt3ke|;$&J+woWO~&A0B4(f zIkK3EtxwJe@MhX0ESFLaOA|H;K)Q<KZ?>F9B265wc7x-&hqwjSk-8iz9{aFR*<`t@ zLzFoeg<YU8$&X4G51pYA+o5oR`pB9>M1%kf{juVcMG}UkfM_<M(PZ7Ues=wJfxv$0 zT$Rjw#)t?R#D9x7j#l5M4vja?I-s2zJ8}`nU$MIJwHXoo=*PStfH;1i;KLz~r>PSt z4@_=PV}JKWa61S~dImaG56QO}u;0U49)vj_*^fDj3<=ej)Y0nk{*u%>UgI#mHSSoV zPyUY7sp?NUSbe8I;lapbI8&tz)?u+nSN4?l-#mq(c3yR_k<@x|a+4U#r4UP$K<2v0 z)KPq(U^T6j06F^I>&7rV!K<Vg6WH27g4H3`*|C$<zijET9DxJFkYNr!hLA)L#*wJ$ z!>T-r28c28#nWXWx%bmGy#HIjNZ|i<CNgBM8y1eXx)Q*tTDOv$*5$9%9QxIKcKbU> zmK(j+0>Kb^Jzd-(Wy!7;9TO2|sFxPW;Btoy<yNA%2Tmg7T!r8r#o#xZNn<4%bpaX) zNf-Y-Qwq$RpYgg<PHQz&?@sW?O9!dz&q2w90^?WDwBoVZR{V}RU=C-M3H-q|LrqD@ zDV~F%U2ZOhMyYjPjl^rYce)0|@#FZV0I^p?iEpGs!B=7zp*^r06uHKEUhBxA+ok0% zEU0vG(fO=TES+kcmqPIgM^IwwSopiNjSA8h>$7)J$Oye0iWh&xSH!s*ecsx6q2QJ! zXPeIYu<%=+udb?!=7+uOf?HxAA$G-=P<g9ajz6>3JMu%={fFYU^HQ7%o$(rSzHBsJ zMXPC=(ReX0HNlsRrg{l+e$`BGxH%*EZY+;G3`5QwU(bVb_;D*0S{cV?BuBK|ek)*l zUrHCxt^s=1^@f6&_DrS>>*+3F3;zsr_22&vjDOYxQnTdCE-O6T(*t11ogbNzh)gXC z2cKVfI;W+9j=(~!SwZM_b*V2-q7?YA=<!v<1veW10bbdWw`mgxQIUFlo=keLtQR!n zff*gFY!bDQNCqZ?S2K;h(%jIXaeh1`iv;&kjdG=rbE$`;0~r{=*QpKEI9oJZ-6jzL z5)&>n*kv@Hpv$~eE~I)Ze?ib`s%Iq3Ac$)oF{HScL(D^dL2xanW|3PCH?!%bmoBcP zyyQ-uscXrctTdoo55X)J^ErA5PCaA@f)g`CzzH7??uc?3y6*l_>WOcPmSzhw;czfJ z0&T2_OR>L2@F0o5(cd8&0tbp-UL`B-*VEh)h)#7oLUZUo#u1yv?p;pOU~6nx|FEPA zv%S)tVK~#ppHKw$ABh=Vp^0b4{Oav*Fd2!9GG8z8#f25mGd7T*5$D}dut%(3Sw{0l zgyOM)^Q<f{d|Y5H?R6IUxXw!b;VhXqCC7)b(wCDt;@q)Frco4yCi7jnGm@yC=WKPh z&=I#cYCYM+z5v6h^)l@Y05@P!V1JTy@w)S5X?C*seWBpSSe~;tSwwNXyGwJ)S1}wy zYkSwiE5u#}PM0jzg<r4|SFj>qU6?<xmM#13F4m`d<XoAUw{b%tYjbCGTxMd5REZ3Q ztDo<#OPQ5gpUCTdl{-^*ZCxt^&RH=gD(X=v*1D}`vc&XayqM~`^K=Bwj@S4gt$hg6 zPIo7Z5%4ihG9}I{Cf?5EI8tp`_BnSDu?q|bKQy7<?A(l3({JJUJ;BYLsY`M*L^?0) z!6b7pB7op0qAIjm6_X<pd|U1<+lP%lN?2Y(1huIxu_~WeXD^U00uLSFp#wZjTwj{y zT@2ilD*PUo2+jy<1@Xc;0ivR!1jRL$tzZ#^;2X8@6o@`k2B4b8RT23(fxK2|z|K2< zeKhDM>R~>`HS){Em#T|UVgvDUDd7PMQE<L_sG=63ii$d_sG<S~*ye*_d$quJ)O4=~ zzQ-(JJALwBc6=7L2SQF^^R$f3ROQZErz_;_!I2)WqGTaWVKQiV@wf}!_MjX&sTz3D z77fIw%p_mxoOH2=S)>?~PZxr34#f*A`3eO$8;vKq>(FQv<u72l(IocBPV9!@Cox=@ z)p(qFzMiWWF>kYLo%Um~qLeiP%++he`%1ca*Hl^DyF$UYU1(%JE6{ey4c3Yb{9P(8 zEUy60!h*}J?6b3gCci(Gp+WA(FUYdqB_J1d+r94nfBhhL%1tiFrGw~Bju()Nw+B4- zN=k=Gsdd)M+TK#@ZBf<VlI5+N?J_s$_jR&s^=Wr1t)`gbh*LW!<N(H4%M9P%FVguP zE+jbxxZ-?WQ(XcrLeBN`sEdBaSdwzO&KYswIEl94TyS^+A#&sPrMQ(VV~S+t02%`j zLET3xIXh^<D-nQ)Q$r(kI#U_~-pRsB7ssSEfR??oEw-q>8wISf2?DYSD)jlo!f{wQ z4htu7ebL}eAQQwaW%j_F{yl){6vRodDiASbb}c`kZ|jsjP%V3)N)|qmg5B`Sk>c`2 z+#6+`mv#Hp>F}KUSpWlk1;Gj#si?N;nIp@7lL$~7cd@YaCEr5tI^lpio&Jact{UgQ zl&Is}mr`|<`!ZhTyDt?gN52eHyKm5$s#TZ!VySoCmznBy_hq(v$$golHn}f1s5bYd zO09BV=BX##mqqHg`o*cItLg#wU8Y+t|G(IK6Zoi#w9&h|J3z?R9Y`Qykw&7RC`O15 z5}ipyM-xpT15q3u$AqK<k&v`WH;ak{0!V10$T*5S<1%iHqJjdVc92zE!r}<x5^zfh zYCu#3G~fR@OVSBA`hNHRzW2W0oxs1VPMunwdTKp&>YSt7WzNwsSGQ}Ez3IArnYfqe z_9w-jr`x65Xvo#=(!Vrh==Px4FV^i_#Gb6%>%^X<+jomSLATe7JxaGXh+XOSX0acc zC`t$%6?=njmo=}34|RLE*z0t=3^WZJbh~VCYgnz@onl|E+qJEZ%XE9PxZkDQhl_oI zZch{YExKJ60UNx!JxA<?V%MkXQr5naZROlGBQ^RAE|%G&_IoV^Uky%;?yb9=qq{h8 ziPc?twZ^2?8EMpQab+gpv3Z~t*`Xq>9yoFNLU;K@cNv7shq}w#x(hu?^bXzS72Rbx zE?ab$r*xMzTwc>%?$KSi?-jjLcaf*6%<NH{JN|_{zcZLex!(M~wu`U#Ld(d7aa~8O z_g}?gG0zu`&-kIX3%T)svAFH=smp8Px)#me-(oMCee9@x8W*S*UK@|f*85-2Tx&jV zm1WzJQPqqDwc(k=)@ROp!?(G~p3ys)QMJ28UZKpJ8yE9{)j%Gq8elwN)mt90GVFYr z!xyPPY!$}CRsngc*$AxXq@Db{Y9hS+bjd;-&wp7)ghlwzAqSZ)TX6G#ogLVcS=(sy z_seG9YuC?5>F522GKji&P^4OnC#&yw<R>GQ7_QCW0qcxZcSN{93oGUAj&S%d!Agm` zBNF^W$ec5?Wvl<~Og?*TB;vc@49|<6$vdaN=5&{)DmiQ=5EYwY-;!b9%H&;7y+Z-D z<xhn6XK01gRtS>UetL0{5lU=4ne~mP%q};}Y+r|h+8$C+e2E^}sv5%E3T$eulo!Qj z6jyCil&Hqk`fo3*1rm(hXzTgf{VQ1{$zxHUTUOFp%S!PmuG8H$*IQh(k4q;oO<Sd5 zSkU%bvU)$G@nPy6w_;eHN~`@@*5Kc1xawcV+BzCJEp5R{ZLglJuvg=k750S~d?Ms> zOH+4ol^zjSImy7sTP8?b)@WoupPUQ0;<O>d#dW-#k};!(8=Cq+aU=Kam__#B-R0U| z#kMtMM#*0Gm+?4Y<0(cGnL_1d1}29*&C`CZ=toAy6fU}DjmY;WrcPIIk40PPs%l|- zO4{7j(gph?Qh)UK{XQ+v;_KPa3GdoA3g*ZSN10~JAbc9}92C1OB#jwv-cH(xO~0MQ zc_-(yc+U~bO?;J`docZ&dF>q`3mj2zW^-d}<R*7wxNJ;`VsgEZDXOefu{svAq$Fc9 z`z?J*P9}o-eMriaJ8Q<>#}q<ot4NVp+U`DXB@_B0(%sln`~Hzs?Nw4l+9J}YnYAal z`*`kXoLd)>+@GtE+mCx$XJZv<C5EwxCexs{<&%b~vvqm%k-dnVvWP?s`u)d9+~i|B zEFZ-*+}Ik0zHGD)&)O}=>3R}>Y(3v`)u_9kgs3A=rU#SgQj@huJoM+BoU)^fxq<I= zEaCFP`b<YdL_W8z3KD)et}QgP7{me+Yo$hSjPfQ?>SuJ93A6V4?VPGh&ODv9lp++I z<||?e$T@(M^1x$M!}9}0W6?3X3)kvvM1|T)k}S)*wHBgp&1s3xyHL9|G*9Y$)g{~e zvkGLNCv~0oKXHn=w0~yR8EbIIWiT!hk$E>?Zq;k=!(u7uq+L6-4kmZW7ihxFMp}6d zmX8&L!XzgPz=j|hOiNqh-^3S9w0jYYlW9${n>(eGAgx?AeWk5jOH0g=)!zR47&S@X z*WA9t$dR4R%rcM3%q#UhUpIC(^MzTyw%JeH&|D<@n~icQX<O0D;l>uyBxeS;H+(!x z-?f}9yO#OJi0lQnztp9u+9rEywU_Q9pn3O56YyF4OLlEZyrFS>OA8xu<~|_mM&M+3 zpjvJ|^0H6Mt;w#`L$?g(5lgmF@!I>p1z7-D+ZCT$CqjckSGNo^0;X>CcgrZ4ErByq zo685K4KK6!P7i1fnjrSMDJ=PD{gZL0u5kbk4QpAhFm5BBEU(<g{z)qMM!l?bIe0E! z_Bd){pna~=kR^~2))M~}*ZkyXo`sm39;1JzAvMmG6;`}3=QeJ>I(ewJA~pKa3wfw^ zGHsmAX3t>fB0@Tk+LlgoJDgSLpJ-=tQ~NT$-I37ZORKtM9Frl7|14%w34G1c7loeu zz1JL(<f7JmCq}0=-($$qW>C`&kz`aw*<|ZxkA}Bd0??az!+xw)PDKv&ZiwwqEcnW^ zg|eP1%_6?xHQi6c-L1izu0!<mQ==O$K=iXR3b;8C-He?#Ls#uLUbC|U(Zg!LcRP@r zWt1=nU-j`BF=b(%yh1C5+7LZcP8rWYx9+d*@LZSN2FMDS{n}JgHZ~7j5%7Jkzd@wx zmSIuKKdfd<*M`H~DqXA}bDJt_m_z&SN<-k)mKI(ivtz)q7Wc3yeVKPNcNBRGhU1Dr z*5`7`pXg|b?}7qlZ9%(5BM-N5*C$P$Ldp<D@e~qcj;4XHQ%<D;VsY@8{25zhA&4>2 zp?w=bHi_#mTj54e#IU`t*ZYzCz)|h7hnflt4;NR8gR3(yx16O_c4xq4o&8M<7p7FX zB>T&j+IojnzS%97U`vbtTpr<N<>#V5&vo(!0vo&Jj@oWH)Hqy*KdG58=oKq*HlBeK zSNy;0i@3C3XS$49Y$1QUrFxzA>USBHlbMmZ1D|3W&MNJ_t^x1!v4lXKYrtj~-&q*E zKD*$sd+_d&fvlBIxBbyQ`aKI5F9->2%r02Jv;K#=k@MV$k~p#^taHZFrmmV`k*$I? zmAGoSa~OEnj5<ivgV(#b@e=sg;4Rq&TSf-li<~?6*F-sZD+}AWD_EZUf{jTdtFsn4 zGYjf6Qg_}mkjrh_xBD(9vbuSLwmUUg-pQT1N%vgMiHyPjn!%!u2)46+WPkTcUTDF~ zqzGSi%*I1<HCcB#_3u4o$v&#g+Ink45~GU5Y_<Iyh>z^U!*%Nicj|(fdUR%wR&Ani zU7>H$$MeOxJFY{$gZ0mSOZU#+p^q{G?0|QobuNwdMcj<=!1{X`eOO3)BSfo`b-rJ* zg%@S+{M0?T-u1)Ik%8Q~JiHoMzw-ds{I1CDt^sdQFXW1IWHqO<Y@5s%&AWE)V`6T* z<t=nCed?gsrKIIeHZmQlxAJ!A%+xKnga@qED77i9`p=6{%sV{%9+r{1ZRV#`he5r0 z$zkBjkiy=r74~thu)jqlv#|HstL`Uukx2^sjo(n%rAA@1hI?{(OKI0p+LXi2eSvKw zYvRIr(^4l_>h=mNuiBCl&%Mhm@ubvkKBxGVjl?14Ek4cS{!kaKwYW$9N^xIsJ$-wp z!M%7Vo>^8c3^Q+-qDrkd%ZJ@IuAQH21@xX)Kvb>J659AHCA7^fAxcJn)6j1yoHqiW zG)`np3v`;FXj8gash5;uw=a4@t6U=D>rSkL*K76DzP2RE*^g&@sZ`SPMP|0_(F}fg zkDLuYYRXO#4xobZf}hCkhUjLcGAmhY<;pDJF#&3>R=KpV07%W+!YjzBS(a+|I<01{ zqh|5Ri$-eJ@tL0nqBke7mKf-?3nTEc+g2-I_!EaWaImjsuG>#^I$*QgwpmxdsQNfB zHrgqzfo0WDeJ`Rx7$R$JVn?gYdb>mBMKp|eTs!x(U`~U`EYS8)|CeOW2<V>~a1Xwu z2SU0QzU!inKaf<3;Jt%q@LTDQ4Dw#Yp5!dj%{`{0Y5pkY07>rZkzv)=rtqqxyq3pZ zZIwGkJg2OEt<89G{Qps7z!l`+KV!ft#{lQGA!9(l9{L#28}t9iW5C7n|JRNI=l@B@ zfIr0j4;TaP<8sy<1Lk1=A20^&?WT<Z4H)glfcJ6uKYk228zFyj42YGS{a43;tiXqv z)z>B%Z%Waw1ZE$UI|D3MOt;b{>(6p6!zC;5Sdy&2%Zu;iCOF&dWFDE36*!h%Gj3@S zgZstYb;2pd9cbc+i|20xO|Xqyr0j;N&yySRZ66HgQoz^@^9a|x+{wNqTyBi*=6zSZ zhCGVbkcVF!;S0Ms+TSVLR@>CzTIj&!wJY{J&R|k$pBu)nJFqo%n|<!x2&Qf9au42O zpDRxZX%=~;N3+}^meeiwd9{Se3h*Foqez;Zdfb10Q&(bk4L(HVmB*5OhnxCU9=m8( zzp9qR3VY>&WS8wn*Me@@w(WS)MZnk04=axi_MKOG>|Ed3mB&WeZy!UFmB-R=?N)iL zz<#?+JM!4?kQ)=)dqo<5&sA{t;Mz5jNYZ#d2S~AkiFsp_vo*Qsv+G(@YvRQxMtURa zW`4+y@+4MDr2x1@8sV_dyO}uFu%@N7w+h#ceD~t;Y2CHmIr`cFi8XHJQomzJzhe!T zT}t=V_yj)4k9}TG6r;PbN2XD}g@Ay>iiAYmMT@xUnU0a!=gvS3bYY*{PqUn>e|}pO z`EuiaV$lS%&oAKY$$?pdlfb?qqR5^i$6R(OwX|hGUR|v%ld?nUVpU0I-JI84v<laF zfy8hiSu4!SV_ogH9UyPIT8@)C)x%ZQ*x5dJ8O~+}@s(32d~U5`$XzW~cUUod0^3Co z@O>GnTF-NkU30Z2Tnxh5=iP%#6?MC1jochTH;pCSRn)4|p{CBQ6~p&k<$?1nkA>TB zyF>()m4wD}Qw`H1bcbtk(3JiNr?r<#Hp<RxR7ILUUmQMlw<sl!bp5;A(rlDZforK( z{TSh!(l~-cHW@V)^Mf2s`6AS295G!lQnd~>ohDW5!kVmqvc$T+rX-_o_D?x+O3jMa z<#mnNIrAglC;Ug;n(X+s-*Fq^+fE*AoTevYlt^_KcWRS;?j)*RRZGHD-k+5udbzmM zEfFqj?E?KMd+_$x6L6*ea=Ux}d3eT2zH&@Uv$fzXhr@gM4$HR4yo?%SL;U*<L%UN1 ze@;r7Y5n0N+t+Tnvu|6TBsT_eP4;&gygVs^13eS=J6`8%clJ*!cyiOe=uzw$H5Ysq zO`lcub)HCh6HYUuaXim%Q$Ktp&O|fZ-$`nY=HqI7ypE)mt~Ii>;d+J06{~wyn{sP^ zvT*}PR>0F(B^xfUagx>AjHRyEq#E*-;xxVna69kDA6kB9M!+g_S8gI$ct5&a_Ij(i zjl?|M%NNn;Ti#&xqTK%S<q?55<R-!mY&dQ#at)C8oaGd`hw-tv0kzn3i_!;t?XC$6 z$9{DYd(rGwchM}dZDkc*8tB@ekeBbqt+(HHlXm<%t1xmrtt(+BHBJ@pywU1R(w<b5 zZev$*b3cxIkn=*ngWo(q&oBNt>4rwx$5zDNj08ju@!9pFYr_0t7xnTzr+tT*)eOm6 zuDj+cwgl}QRTIXgMQ&0GyM%7N(iJ!{y2clkmsN99_<*0;5Z##v<auCouiO6ImVoQT z$eMG)Qyb(0x>1%vKCUi4;ZEJ_vlUs+mv17ZWb(9JX4N-V_u!9lm;3oCv(~r=|BD+{ zR=4d7(wh}<vw!w#`36(YYHJXQ+5GHUCtIP5+^KKenl2m7`jxXK3+=fA+tY13Y7g{F zw{7KOxVEt$;`SzQ8zR@cBezQc${|<ezgjwsoLRNvHmh8`%qWo!-9<m_w!d6QBJ0!U z@(d>HE*~3FuXk;4lt|g6y}hY+Uq5%`ZrAn$?#Qhy>xkq;ON{<4Sd(RlBn`?SnR_<f ziMX~Xa+5qZnxo~Usgtad=g7T<G`&7is;ZK5-ZahO;yZjTY?o&TN~J~lufyk9X*_!E z<m=vk7fx4^&R97(Q!3Oo99>254Sso)&zE$K6lha7?Hh!odQDRozD9`UDovYBcKv89 z{gz(kso{DPpeof?43H?tvblVtWTQyr&LhcOqNeV`gr-EkV){|<;DF7YRAtL7oF*Yb z9u(5@=B+uw6jmxAWtT_MO<<w2h=$PQ3hXT6^KZuk+q86fBjvWDz)o$)ytaU)siCPi zZicredz<|gIubfw?p72<G8(WIJ&pE+;c!)FSY6fAS=?Qev<y#jn_+FXtgb(hB=;cL zTrP8(wyR%l@0C9Hah!7QbIXs`(7BKO<r%C&#_DCo)+{%70eHn5&GsGFrcq1Z;^$uZ zxlexXm!AjZ=Rx^-NPZrcpJnp%clmkbI6sg6!6;HTy}D{f_2a`HMFW09<8E0vVT+eL zDNF7SCD-IcQ?|UyYQZ>blWoB$D@P~%=cmi}FTNsQ>8ZQy^FG6Z`#W~``c0$4k}0bJ z?giJ1Z})<NPK|xoJX|ENh+l_4xz|{UkKRm)_||3WF5UxYU%T(L@~-T=jb?eciLca> zU{9%p^5)|h{P?fnWCPphnqno`CE~<w)lP5Y#2&h^wLS3K5cv$_2jBQ;_buJRBxl3j zg)J?sW#Yj$v8JJft7#W*=hMFs?k|MfG|JXFJ@8@Uc!pED&dtnFq_s`0ZA@?lf>KG# zYa7CO+4<*Pm>|C@siYSN9oamq9GAhnXY-1<iFgwkF68}^bmtkbNjExqNA}2?Mb@aV z)*XCZy3yJnc@X4vd24lw>xU0SsdG2W5E4Vg2g8Z@hYut!?ZmU3kgxmssNr6hycD-K zmlZA<GqQ+axX6@-9_(}FO_)6N!g!Hcb56C~a=Ds8!>`I&zUO&j20vLwm60QzkwgDn zvNm{_-wr2$If%?nT7qBu%h?gqLT_@tE~A$H<sYestVMlTH0&t0&63SLEI*5-P<|%4 zYofwM2SX{=&GxE)O4sjV4_(!xVw3%Kx7~|PQv-+ZPK%IW(;FYqJ#Ns(lj(FS+hjbE zekMMhAKo6g%O9!f^`^#Iy5G0_eaK0uSKepn3G;X6SNWcF1&+w5U+Cgl-P98`VHdi& z-_KY=7yols%@hi;Fv^=g;P|kw=rz;XNBnYBk~{Do<B2Pfc0yl}4P!mlmd;D>s&g1m z-t&bOrCSox2Y;JcwSnQ}E2}&8yIJh1M{zVMmwfLzXm#1XB|UvOnIt8bXAUP@P-6>P zpgG+-QXft(pua-GI&(A$2Hs^bsR{c7*?LzWOYlwmM7z0Y7hB$}4HCnwBJnaKPwVo{ zvE)tnTslV|6Z*Y+#Ec~kL|NZ&`!|dvkw>+Gq&9Q#PKt;qiOtUrOk#HNPP#ba3KsE* zkk$`tqU+;Fp57f%klLuhXVhiXII4{rx#VyH``X!`%zAc`Rzwpx7$_Cz1}R)=;hT-& z;sz<Mw&CIibGRsy;bM|`G~rcklB6{+tpS<U<?ZqzGM)`}1$OZm2ScdD??ZmCu|{bQ z64NEVw5DrChzXLxsgfrzVGA+KwMbf9RgpV#3vy>A-PE+D=!Z|V#5%^Or`VdDEAUMg z!_9DMqVtLvgyddX4lXH8U0dTNwdo9Y(%>6-BO#NlIp1ql*S5{IM&@?uffLdP*k4|x zZ7z}6^XPRB6%BY>?1fC&nu`W7Hqx+|upQDG7k62!{wC3+zHP5sBo?hz&CzYG4QjrY z5=}=YXur~+@^rs%`3D8`y(^)OD$ae;V@Y%A4g3*eLu}=HfccnAJ`1U-!}g{JK4-En zZHrN#=UVlhGi>9P_SGbf%l>i<Yuhqa8+k%zoyIMzTCH)hfK21sN#k-`dZn|0n>QaY zg{E<RI*a>nbfW2ln`mG1$^aK%7fwB>^{lh1MA5V`M*h|o_FB6JR^PAOXka_iZ9#3i zwxhLyxoz)A1FMzBM4ixD0}YJWS{oQ%exZS-+m7oEEJ%xL-@qD}0Jb(TVv`1joayY_ zmIlTbnp+zfXN?A?RUaP5K)Y0wjWRdm{hiXvj%lrI99cD5nas&rTbVW|Gg?{dCasZ` zB>kI4h9IqtOz+gm{=4OUm}GrSi=viytoTh?S{q`HCO4Zx+L7L3q&2lx_$H^s(=i6U z>FAk5_7vu#ZZ=6sSC!>EZK;jtIgZTg!BAC_l)TzW^{UB;=CSd{hk3GJN_YBd9vGsQ z(+X~qN$vF1=9=l>+Q&4z*um$Tec)#rn2Y-+>zRy8F*o$13*}}7GiJ7%4L<JQPb(GK zwT?pC`Sh8oGVa=6+QFGy&m%Cm0Jk5YucW7>pG+UTlQ}q1L~h5!tWVkpt|{en<2Q%# zy|Jvo`}W%#5RR1f%QEV|HpsHcuevk0lZm?eQtp1X%4OT3OBPtqDMaN24jHsN3CA@> zqg+$CYj{*Na;rOazueiaujuRIK_Q;4;;t~4INK_0OmE$RS{{0}(VsGCbAva9r(c@6 zY1~YsvTbwQ7U^%53v3uw6DMC?p#{<OE+n<UJ6x@FB_-G3Ch0pPYxNA$Pt-OfxEB;A z-5i$83-_~aJIUm&5t`B)6If-)MllPm{9b&)Eu~G-JRp0KKgzYqnv7Fc>iZR6%TE`= z(Ug0qt6uK2ce*MM*myV4diR2HHlj`llV|cnX3w{b)Mw8}$^I#3&m@uT4>zJeEYUv` zQd9VDv{6~6vIRtYFBr>-XMJr<so5zYQvjz+TNqm#=3vJjZ#iaj(rBz~zw0FX(Rkw# zI|3T+rxTP-GJ|AJ|AkAoWXQvDX;+4BUYLDQwma!hp9MMvzmkOHi8DUTuxf==gg}4Z zPRDlnzz@|k`I-q&odpiKd5oPmwWq$xtB53#nky4{F9Q<DLo^Q)s%mBe@4fw-7W0)% zG~aHC|IV(Tt~5^jZ`z!$ZF1seaxK0*`d=Qby8S5$Qt)o;69cn&`>Fl5ziJU>b!~mN zpyZdHEhq~kygXZAJTh~!@yN_*c^Jm}FbhS~Elqc)2YAcF8^(iM?=o{RpBOkA!y?Af zc|rR;mQ`h4^><tXH9S2+N>uwAM$Bd<Pd@PWB8R+zLY~UmlU1O-y>VN%E!gl}nyewE z^NiP9?W1SKmhYz$eflsa`KW0tdCE@x!N-GMa!sLqCq{mfY1e~z-W369AM)%CcUN2D zzaXd<?oK>s2EK2s#&lmaQ~A$n3mOtkdm7Dn_U36VSA=GRa>4uB#>j?ltRM17Qznih zPZ@!(73x|`{0(~A`n$fbyGT|ef6!h6$k#A=Qo+FsaCk^-_C=x@o~KB~hkUXtkew{g zFqHg(!x~RU+a=_++BKwn`EX=Jqvd(Mp0g3Bke6ZcGl&=OF!QHcMTegu3fn3lT;!Pr zO_)~^CZoF3kmJ<UDn8*XZG>kRqWfwN?6HfIjex$+E%B4ZC*LDFCO$(?jFl5r+BcZE zTGaP)@dA`9iOET8d*wiDYje1&oUC!?g~?AidfzRNSTw#qI*r!0!#>wd^>Dq)4+*hK zb1j!4QAu(^GAcaXwwG&>KqPN_W|q@6u-#n~$90bk+Vsut$Q?W#&mv1)*K}4x0&jAl z^^|*=IJ+bF1em%<*3rF13=39wcUO-Kb5~!>EMvWNpUg72eeSNdv1zcsY=jxc`w}_B zI4ft~t{xS}uCgv%7+cszi2&?gP2!oE+D4~LxVQwBShk8^9s|81j9xd)ZJ8X-SVsTO zkh9f7uyNtip$3BKwjjMY57TcaMJATj<HFM^JHpvt%T_K~a*ImhIYoMEZTj<GwJn_( z>A+o@V6`0u>x{(6m1+B`Y7;N%TF)|R)y?6`e;&#rpMmu}yT9Kdi+@nN&k<S2Q$|#F z!W7w#qKfKBUTNUlZeLpvZZE%(caQRXUme3vptjm3<G_J_k?cNb=(k4ZPAG%YD6;*? z;#VXO|JU1zr{c|`>YF2^b96}Oxb<SGvC?J8<czApjxb&Y({hHB7a6vk@g_GOTFzL< zZ`-Exw*BVR8b?-jT#~%LBRpFkALLUVS%d4c?IU-3vI2e1pkJh=@2u!i#2iR9XV=`X zcxuYE$tJG;=Bxl=NnG~3I@pJnCiO5mgU#POEz~eV`ktx{$=AK1xl=!Jx9})`AiSaT z9oji($hoRlD@jf9bTc=ERKq%H<zy$shu-`jJ^4gNK{l~-@fUx(gO%Vw+?x&Ydg26c z%Xq68dPLWpBBDU_(k3fo(tT*GW9qz%MKzq!8pw#ZEmC=NWJ9Oc^Q|Wu@-H*9(k6>$ zYxRO&hHafKd*y=myJ`dc3rSoQS~b(Fw2xyw&SPUIE0yn&%pT4I@<HBD_lEwWopy@T zM881~+U|rV^B>!vFbXiOVaD)wX^A_Jqcz<A{wbVu8m6^(mg3eoH6E5H!L*V@LI3&t zAEbfG?`3@8Rd9y+7sE8O5UX1%&EuiQd8c7IO#g;?;5$9OU4|Jn%oT=tpJ6UA%uCJi zMgoP$_3&d2bEILOW0-vmGr}-`KBoIWXqdYVbCY4dWSEZ`=2FAF-7x1E<~4?yW|(Ii zW-r53hFSNco?iGN-F(P6o@<!X4RexV{>3nJ3^UCzlMS<vVOkCI>!W(S9~kC3!(3*V ziwtwRVdfd;Xv0i1%pr#9G|Z`nzUCU{U55FzVXigIHx2U(L!KT+K94r*avd<t4-9jQ zVMZ9~9Q#4{_qAcZWW=-D@b`sL-bW0xv*E9sVV-7~7aHbh!~C;hmK$cJVJ<PuCk^u@ z!`xt)yA8A6FwJ_LV&v;m!@R~YmmB6%!<=iF<%Vg7KgX!Qrx|9HVIDi8=l`H#?l#N~ zhPm1>pES&+hB?<TeTG?Nm{%F*<%XGJm}eShH^V&ft&y%_eqfkshFmL+<Hrnhv0>g~ zm^T>aHHPUn%rgzMhhbU`v-z-|-hRV;(=b;U=97lG#4sxj(`T4PhIy4?x(#!<VV-T6 z35Ge=$j4s{bCO|hGUPGK<wK*K4jbm19m;K;QSTly%x4YL4F5}J{nxTEq|}znESl-O zRyRBP&wEjK-|&s@zvKCnj$3A37V36G{xsi^!jclxE$)aO&*D*fyryZMA5~VKKE2qN zQ(ji!si;tDimFfrs!WwD5C4X!LRG>)`geb+uXu{b=_xNSD|adt&21z3%gq`yZk+C_ zIgQI4eObt%a*xS&WsYuh8GB*!u$1TsSE)1K>n$lR$oCbOl{zQoS2(BS7kZrexchvb zDPEt`SLQ4!%P(~LCV8BroM!qZ#S_Z&%V#)?OAE@%%RL3Yk{LrHa!Ne;6&`0nS*b6- zfRKa;iG5&&v%>H7mX&kHlRw2-L<Xjmm3xQ->l96bA!dF=zG2Z3=Q>?&V)%(Wdt7D~ z2_RxodD#?_D6VkkS5$bWOemS*EcBNbmrit+64g`@17F3Z#lGVFlH!}R=p%B)e{pG{ zWY|MU=LG*mj-4~g{N<st4smAsoOqp5R^fA&6i@aLyJV-_Q{gZ1Im?Qi1^Fc<k{Fs2 zna(XJo8m1l@f11-omWs&ewMSyUs|B)RFgBmO{mfeU%9`)N9OsjophI!Wak%`YI&D@ z50!kEmie5X(lY<VNzMvyegXN#dr29|wo_QBzRvHUuhzVK^uimPtLxi038BkM3p_)9 zyFNnGNtSd*5u3=^mPn!aLH?n`<-ET%e*&UXd)j<BCwcO{dQ9T)cmF1z(~3g^YGv0J z?!sRTSK%xCH{mXja9%$(ZfbG4&!1n?R!CBsS^^>$?cx{oe|=f0hgNzXl?TJ=lPtE% zb^b*Xt}WkXUQemCg^DutQ0SRjTwwT>_DVYE8+!6g_tJi-Iij7m7An4Uf0~~Bq-^+` zLKQ6bO)B@$Dyb2ZL&HeCzpNi4P+`6=Ul&_Xgx_erDugswturY1-01gIh;UN-#~Pgv zh3fN^PbsFMQ5mHUNHg%4`YS}K)AIi}b_L`oS<~w&+k>Z+k}NBo;wkkR`4Rt`UQg*i zzkH%!JXf^lUi@qAt%y#}Ck@(LR$S_9?WrUh>Ha)g?dB4@xS+hOqO8d0ysB8s?Wn<n zTlJEqcZ#Ca2-?DsAw$%~-tw}E<@9!?`SjZU(#fS|(@J?6hpEbR>Bsv=M9}ezw-HVW z%-<kYs{C4?f0lk+>MtqLt=chfeeNs^n+|2`tU6mAVd?4Vo#gL=WR;^u;2fTFb(e7U zyX55YIqZmYI^|kjh38Gm<B#_=dZ+Ujjt|vEg@<E=^G^=7zs{AF^DAdpl7MY~<@`C7 zah*Dm!n}F&xbRI*uFR=ifbT&Ahv$s1Bs_`a<SZbdb5P}iN<t};nKWrqczBoTUhg!o z_oVpq)`e-~uX@!m2_t`=!O6+Vm~wqBJ2B0_z8tga+WL2QhvOQKP1(iM?H!KUU)t{c z;tt0wc(yywef)OEEDpCjzRY8e)#DjX%BGF;X`Ph9{mKeY`Iree(55rn1~!)=Ip?$T zD|{}-hN+&MGOypOpTJ#r)1y<_%mVT!dPbH_*F#=8E`98<p+nqRS-O9V)fU#NbC>Y0 z5s^{RF?L66x9)NAJ$fc2_UhfI?`i#<{ZAi|bjFzj2c32H;B(F$a$fTJLx-hYaN+NU zUo;~1;!A%2hcws7QSS6hFU!ch{EDpX(PMJ{ICfkv8*Q%s(>2%r`MSScpO-(OpwLq^ zaZ>ROlS`(QmU(Y1ukiV&PMbdCrkih>dFw1AH~%qA4LDWDe}ibl`oE56PIa6?Oa6EN z=Bktbwf8?;wf(cG-}WywhB>P3pH=;~e`a{6sfPcH&67)Y(*M^rz%sk_pZ-<tU;i~r zP|P`&wtrU3Z~JG4KRNgRRhM6D0g_T2|I8HSsLk#$z9atYIo5r2^#9v(+vdxm+U&Yb zK9Sk>S2=r5)!cdWZ(C5kFtDiR_B$5ex#X{R{q631mfm~c{SQ3&(8J6A{>Y<`J^qg; zo_y-*XO{o-+2>X~|H6waSH1M|>NRU$S@-H|uLo<_zp-KCrp;TnzPatKx8HfUZu^d% zyWacP`@8piu=m4{KK`VB-~LZO`}~V98yXKZ9sKI+Z<-Gs{`Sas-~Vv*$79D&@CE|) zzdAtt@&NFg28jRe{Qq~S|G%vNUmKu*`Mfqj|99s<BV)vrDI;VhL;ow}?;K|~e@?N? z;7>b|oqb+m;d%N&4*Nk}Ab)O80oU}Na{WlD(PdNH9gpD(T27Dicv+^<J-Yl8{S`i? zF87yckzdX=lZ1D9%Zp|0Bs;&nV3HBxrJf1peikr{Lv?w6sdh-Zl9nQViCYn;#0RB> zpCNHcJc{rVMvcq&`O6DA!QZ9j#fFXbm`VQfiq<2g#(N4&Js}RcTvo~H?6OkL*Eqjn z=KCZb2`^z3{=|>sygGltA4j`JE6mK%ykb`~-I_U0a~B!#hj&5|m^g?E32{eOL`HHl zKt9M0xgvAqk*tzq$vA(b#*7|wWp0vK|Lvb8E?mVGLT(oom(p3q4Rv@e_Rh*)*hSen zwhxW;_9q5sccmu4>fILAzmrvU+7RB(O^+v%cp`|WtBM=z(84tn<{X}SIU?aA!W7S$ zsZNERRH(Zp&MN+sEs0i@I5a-l(j!du7~0Jnn}^#K;p&RqaO8<Vp03J1R+r~&9(<V! z8G8(QawAncw?1L2&#ow?QX*76x9Otr>ofg!aI<s`Q(eb)3fjEZJjtu-rPMXBQv9=@ zyU%A~DsERNWQbM~xlyVU;Y0mcV!~9+*ofxvU}vv|S4Q+9k6|N~vP6Zcs1%2a+7a%x zBt)o$!Z?+X+g&B3bW;gC;_A8u(RKew)j#E4)!%Zv>eZZ3-=i)rsO6lCKTDq|)u*tV z>XRF*`Vdc_B?-+v>dkNwgzKgHA8sE?PbZ3WB1wld$LjtiUn_<vbr5d(fP95pRd}JJ zots6<CnZ)z>>wYfN2t>+!&L9)#QL6f@xkuiZh5gej^xDiqgB7cvsAy_L8@QMK-JIU zRBcjmy?BUk?vhsG8C_NPl+#srOD`2w7ZD8icFF5Zp5%Ox^A?^#yo5S7JhwAxhO3C7 zowfQ>cM;dyyk*(B*O1ZIUxm6Q^3IB`meZ6qS&yrpxcYbNth(*$qN1tC>a)(Op77_S zDpe?PNL}sVW{K#eBIa}shIwr{5>J0-$;!u-_$9P2c)$$T!A;js7m-z~Cw2J!8s0Mf z(_TW|ES;^Y^H8hTBD&rYmaH8wu_jvr(JJs+f~v|*RMS)XtJBa?&*u2L?!j2EBM;ql zwWzLAe<G|Z!g8fWH?KF2|74g04D%ah3A3oMNATY(LiO^+s$P_9uUxz8l@g<Rz0f15 zw@un*F6|Osn{Cs18|xRa_(Sw0Wxp$uwi%&9-7Ve2RrlOz$}&oIA8W6V4n}${ykfe` z9MaSJjws@#-BZ`%%JnwyV7JjoXlRW$T6OY8sZe)4UOVx|sP5%jym`9(k;qRzkhK@G z_8QwGD0R1ap;G4scmnPtQ&!?EjB4j@=@G7aq}WxDvE7;-^)bOHZ)A?8f0XK9*j@Ff z4fUrD^<UDrxp#eHUC&^=o{#<HL-K?EB%M4K5blA;BppYXa_ov#;XX$@cS~%zilq(5 zE{SfAtnV6>nk`|2EM}Y`kLi6(SPZdez(I*itA`OMyB&#a7tZ1cR}OUT7~0lqB(9u$ zsh5ykZ^T7iYv+cay1%mqL_Yp3=}UUl-%vM8e7K4)?5g5(F;lvz_@S{uy|0g^Z;ev+ zC3@ew_z9)H1ji?4T2ZQ<8)+?jQmMlb>ZhF>epWn%JWsdx)6NY)LCzoV;3w2gt0#rj z5vhaa_ByTpNxOQ1cBIum>NNR@BR?{BiLRQT<z@cxfXL6W*rT4~ff()B%9s$|-c59M zDmQc$8kg37$I_m)emzP>EumlUC;ed({ow%m!_(;x`?Tv1b^S7K5x+ThRlcOuT@c!D zgt{5&B#Z2M8<biEq2(Uxrj@CWGNtc}XAGAzm2kn0O8o$#bs^ME>oew1_oeR`sn>ny zR{8^2CUs2f54zIE80SOW^>!OcyNyuYhZ_BX#Iau5kyUlE#Om!yj>UaHrrr-~`El-{ zK74?H`;5Ak8>2$q^!&t<9|v{RuHs*yj&_wke~{MaTY5*T-i5zYy>l;Ay;Ckwy)DT~ zAK~;oct2KZ=qL3362G+HBgrcKv-4D_y9Isub`4Q6#Mvd-$s3lZj{}L!Ke|{3YhzTJ z1-Z5HFiJ%%VLZG&T-}~4^CHTTx+e1?OM*ouNIrW+(C;Lw9y_#tr!FcO;q96io)g<Q zLiP1UtG@J8ebHCnvHDoL7`+g^+VGW9cYICRz9dIVb(Qw%i_qIB^(B66Y|!+3<&R4B zIYxhiUnizs_qleapO2#tjeCK)L}G+W^hK&f`p-oA&qU%#92+0Bgj-bjNW$2|kX@hC z#mc;<(9XOfM)fIg8^O)=x*(y$Vo`;LY+AW6K4|jkvejGI@a8OxRnA<8auScTyiaql z`h>b3!8otQ(OEfsUFgd&helC`R@HTAr{u2AXyx3HsGPn8!uBLw59PFUQ;E$z>*MPf ziwxc5(I=OHXeK-YQ!5MR3d|Gq`mj!~4+-JStAM(nKw1ey<GhJyMXH`Dg{r6J8s%t? zsc-8^^*O^9E4t8hg^mcDNZ3TeGWQI|irln&2YGaijcV2Z&ND3P3SNyq-_S>_gx?U= zrth)w&E4x`>qLH{S9c7wsQ2Ju!~a#-55v2m`t(u8%z@%bTiR``R{rhWwD?2^@1JE+ zJ<qnN1~Yt=RYgf#>r35Y%<oHk=}TScOF8sif;O46CHCp8qVc26bn>jpGWYTlmlkFN zVHnrig`os=z1Y!940?%1FXV9vaV0Wm+Hc0B>oJeG68m;mF^Ah)k(owpNO_q$DIZ}` zGa>9{y}mEOz6O$vW22wQiR~Un|I$VJ7q1z%2VYxogBkWu*cU@<SWOR+=z(@d-S12J z^&P6WH@y#zr0#PK!S#clNAgCyOl0noh<jo=?L?DVpNm?0hO3^`gPysV$kKCYcdu6F zw9iD`wYD`hzP@{1TN@pcVNu_}B}RU_O8-Z@GwbxrnHF^b@;EPM$Man;x2R|k?T8uM zGXfbLq;FR}%eyzn*6ZV+8Q+I|E~G5WqGpGtH=!-PX3n+1gPa#r>!+wAJ*Xo+%DdG& z>a;nM6r<61->(vrx~Oi2D^<6Y7gaaQ3KdC((aMw?IeM9D^Ixr8M9xR9w5a3ox*<bi zKbgO<o>$)1>LmPd{OWB6eTV9BY<z1SkG;mCwt*Q}tTAqw`Mv)y7WF*rHqx@lyq~nX zy%6J#&Wp<Vg|?twzqFR^*v{Tqtsm5{CC#|M^jOp(!OX{b)TNXgZGA08wo~;X@}W^< zoX&~u9l@9sqk5-AtKMUo$!oPjue+k7KBX3w4P963^*%PXGxNtN6+2dDGZA^F4Cj?u zR0TK<e_H(I%yXn(GJlopvP7<Hqf_Ek^x@84(d%?6J2~%@IgCXm_6k#xhq<x|ZSUIk zyixzlBfY;S?^V++sv1mr^>KZbN<23@y`L|RymqHfc2nI)#k{~(Z++*wu%I<ZuP0ZF zJX(6Ov^R&c?}+qr&3M58`kH=>H@&HQJ%@EGk7<sokEr8{*$5}~Ll0*sT#T~6Ks$}G zs+ge><e%%Hp`DZU^TbIVmh-V%8;wSmDAjYUw8S=@-@nkJ_$+6uE)%=c7T4=ClB6+y zGH%kx#SuPkiNlMtK4<A>$ilc_j+fe8hPI{GVcI`^cOreaF>bWh;VbU2sLAj<vkc>y zo0hk$LCJ}OrO$DyL`x6Ve#W57w+uOSKmGo_AITFkNj(@OVFpH~Cyt7v$Jee)>Wp4F z*(@8$U}FDp)s6nK8~tOqp)qw_BjrhW2j`@AF5YNiJ`$#a&%*(Ws)zr|U)@RmFL#a4 zy<TpMj?X<sM8glZ#ee1@`t+bhE&IC7Z5?h$*IU$dW51$A5yc*~x(&z{;_sI4ENb{0 z^bJjIVROGHFU0p`h}&Y^6mCmH;(G_TX5!lt;%_%@PW=7S-+%V$>bm*QK3!c8|JkRj z>)}89bag%a-?mTpON+51M%xIb)ah1^Wf!cgu#nA`6|Blwv)F%SY^`!}C&+SXxyNH} zwR*sMSxMQ1{E{n6Whb0ce>0A=w4<9PwyQkl6>M%zpFUn)kv?{GdKUX=w4J$ymT42& zc{$lL%Fh<oQf`x6D=uzNiO1&|#U@tIblm<TZbV~vYIVQ9y}Nsq`jfbfVq0EF=mNu6 zXqG04+qg;j<>aEmSE0t_q>sL=RjMe3z<>06%4b}aU*h+WV<o$aE@gA6krUZg<l<`a zWY=-UHxb~f^s(bI$Bfo8Il?;DGm%t0<)cd2Cp%uLJr>a?xv3~CAFuXmN11F>9Ix)? zu3M45|478e?=oE2u39$3*p(Etj+<0A%{Wjw#I5c4CGV4zo^k!0=$iMj6yCu7INfC| z+o95#boP<*#{cPR6uVF-dfdeo-je(o<2*jud{;qk>s5NGf6B@3Hf!6SsPXDDHL9en z!ZWI**gK&tzr2tcmc-n8>}HFjQr)d%*o4{YsMcCCD_V~()ixcwrsfxy$UaV`@{K%* zHZs{GEZdq{4K#J2t4xiNbPQ2)*@~^yQ%a=G_Z3VsoYCAz*4*;^(uxx5g5ju?)0*S) zOm6eD(n_{<_2g332sKaQ)?Kp7N+;&{D4}$6T1@TCEgM%r#V=)Dug#aJRSlG5a^sm; zUdC-iJv?^@aHaSr`^vnAle$#m@){XYm6HBR;b!Ts1%BGzb8QmllyUr^sS8n&n#kGG z!nXV@Z}Z(M{d95D6Vzg`i&T1sG}))NomXDXF4eR(xVlmNkDEaSo|5hHl@}Kv#bnK2 zzLz_%Xn%}Z3rCqQ{}SC7OwKN2!+82sY1qRgmMc6nWS1U6<j7SqqqLyS>3d6dzV|A9 zTQIJa#V%`Z*_EZm1?(bMJFvSd3W|%>a3dzI(izbid-JqDrAlPWDW2{r(W{qI+eK#u z<;4>`q0Xx$9=EnB7`ZD{0_~xU3LWa_r8Ym8<xiQCKQ?~~Q}G)m1wCYl>mZ}<jx6>~ z$;Ve6sY*AdZ$xD2+BomdG<^(fa~Vf1qK8!KA?vtl`QDNKq9XcCb(uTU=qe|o<B4s3 zQu=h->Dl6@HA3{Iu8|{YY#hjGm-{MLju~9trsSc8^wPo{PkC`!p<1XNqXDe}&DV}b z(odBd=f`J`&d%2QuTf*NN9DHmjYk;^*sAR+p|j^+t8Hw4F-1JRfK33J{Qt0Ku!ma4 z2UZv~yY6)_eTsB}<va{P_}2V>ZO!uJPxYMS{*)GWtVa+1oRkA~SjLE4ZQFGw{f*0V zX-Ne|q4m;wJsnj>DU~u-mC_48t;K<dkX@kMAJSY$X@i7Pk84LpAIqa@q?27%=r8eP z5KW1PT6kXAxDpTh5IS2z9}l@dY&==<$e5shFJs&|U!fjEsqflik@KV3cT8zLWE<;a zketS5Rl4CLHssO+jH1h+m)j$u#DDG#uSZ?1$C=MAd9Oa&1daOCQB|p7x#muA88fsI z`<W1ZnT}auSC-P@lPS_S%8TSE6r~1)A<ZwIuCr!VxIH|lG0{_=!<0bU^TU!GqqXXp zQfjHVWtEjp_Iocip1q*ZWrxR|a>nQ#%;EceYJ@cH9NF!S5NpU^=y95qE-KMW_YZQU zRjZ?-IoZK$%vXLdXN>xorOiyz+xDc7qr=h$wOY~0$tP6yFN7Gc7KDv2F7z-)mgkmb z%YOfnGw8YAICVVKlW{h!dD4E0WLV?j4y|Cx*$q;bxy1#Ojgnq|a_LZ=$7v<5^|R6@ zT@_kgkl}5uHPd{Crei~Kl@^Zk7MJP~U#G>JBh^LairqCTN2xf8cT9S=*gv2o(Pwet zC{aASoAvRIB9TWV#K%2a9QrX0fmS>U{rW2=i8N-nqz+0Mh>KZx>KVPQG5g_dt`djV zO?dRGtLm*;qv+lB(x5FQ+FCW5TV|?R?GN>ZM$_~*ASEbmf^ehSyWq#I&q9o*w^(nL zMt)rC{*c^^@%y}fpXBkrcD}}|2&w%c?e`|5UzQA#Xvp8QjdzTd!<D&KWx@QIZ3{y9 z35%-iXH`c>TGfg^-1F_rT!Rfl&FQS$FUMnd)@h&;w>(%3$&m9$&LNR=G~>k>{ImBe z$g#pbNDmjhfzxG}S8!f<n|S=3zma%pxAlz0bzU@ueFgT#v)gbk;ym}=oww`M*KiDJ z91C)81;-2pD$fXK+JkclQ>FV+#G@7<2RNz;JD+@jll=!`I-u@B;+WeWCvnu_mdy7@ zRuF$4@rYSZyx#jbH;*_sx4B6ig2*I@AJZ;o=sC%oxCMDtqnPG#8hL33aa%?@W}N?3 zQ}Voc8*w0?$RT-f@&H36dK2Wl=+E&GCTXd~<nK=WVg~Ui=}S2ACwg)IRkv4SN?i3z zI1i>=5|`N1(2oP0kPK4Zl}{kYUF2&iaS>+@q(P;;b_ch5_7>!^f1!@JB~3F<Ny{u_ z(bF>HoTRT{8Tm`YtXxCfFY7p7)lKJH$N-BuFXS!L5x-viXnHZsWt#}I7B|cwe!Xw# z<?4Od2=@y5Sgohy*rJD*^dv2bCvQFB31`MBX_$6NOE6`Wd`McY@@~-6Fl92siD||o zrb+Sx*r5(`9z;K2#xHp^btk5jt$8fxv^<Ku*d=~54Uyl8U(-#_JCIA<ByI=!7gPMD zi9gXhh)ij?OL^qs9+Y@7C2w-h!8x&O>0qxX?}8?a_`yy5nEn>m>M}as)XikW%ri_y zdHfn8LnxA#V7gU4O1j`BEpZq5#5Cm)Q}QIb5_ipylvl{H)Qi@-fuD}YdDM9!8GkwA zm-vKb*o9^TCt(HAm7Le=1?iaOAZCulZ-jR~hMdSP{ufh6>*PG9<YC2j<feR*@gsVz z<2X-r&v}Q$&9Q`&I5k-?&HRZeZW6avR)#;Zhx!S%i+?E>ajOLFT!&-HkJblKS6cIi zUFuKX-*rrPF-^D7bVLS)Um-|3LTDJVFEfy~Y3fqa6&VF_%b{&cyVl$=%{0U<G@o*Q z8G5V((TDhx@M4Ot#Wd@T=vq53y1-p@EvCabZbo(!EnVDYPn5*1rTGZ@0kJQ`eFb*M zqk8;l^j&6MHS?E4A0(LW=5alK1xZ`*zE2v&BXUSx&ZGUB{eV{YaWi$Or7h|I0$P0d z7x_hp;!pYpGc7UAdbybVn{_g@K1yB85nUPeQR-ry_=OedI1RMADgMNcel#6(Ea}NP zsne&DQSw($7{}v!T@yJazd0KTLz;4I)&+@Eka!m3U(QJxoAFB;5}y`_p-ahMC~_`{ zex)CCU^mY-Q}^Xu9r1Q-hh`e4ZbXJq{Ybi^BU3*Tujr_mxYR$0?+Ijtyr;?6Qyf2u zf5t{lZgeB@1w-;7a>zN!x9C^S%dxn3tV_wX9l>-rj}`s})7`9V=6TcIJU0EWpnghu zNEwJJ<!~xDk>}qb<D{Gy{f7E$M%GZ|d`CjhoAx071nGMO)7>;B4s*;i-A-ki{>1OE z#VO&%f3nmS{L466iG4BUp_K*o@Kkl$bTj>lU$btQb;~rR?wEN>M)#7YxQXd7jyt;N z;4UQNM=<*j2_tm$FZJh_$~%v?D)WRDk~h+I7^Go_9xtXWCGL8|l=>mZrfKHEG$pLW zA@O;o4vTEa5o)Fxafn}WH_dwX49c;D4K*t%3pti}L(N~CQ^<KK1Bw5Cr|u+9sY4=5 zYrg5X#ctLu>96a_ryNTkYPN+ujs@+Qc%(lP%y8!U<k!#x<D#@f(T5pc(l+av<V(&8 zq8rm){D^E4m)HgI8|uHcObmY#)=XPWNl#4iryUbsOi9Z;FJZ)=m|9&6F(obSykUx6 z!is6q?$~JGQZIv~Bba&6(xom*ILV6x-Q;jwiC?jcKS9okACbxI*TpXGBA=-PiSJaH z{v<BBrjUME#?IhI-M@^N62FWGVoF;UQ)}bmX5>M_NxJRQHsp{rOvIllm$;ourjBmX zA8BET&pc<w;UJDQ$*Z9ck?r3R>R0NTjCX?c;iim|hh@YmnE8=(<-Cktg49(xmb6YP z8{D0Szh>-$#AC|n;8^;S74&N&kC+mdmM-y$J&pKR5Qo?W$**Rb`84z{{>=QEenrQE z$S8S~c+x=Pa2WAPT9PNzujoMH36&uyB#&kqVoDhE*es7znWmqUOyV`?c+J>P8P>?3 zsWa1$$S3KW$7Y_zJSh+4N&HE^#gsXp=tKNU9HtCr9Cbn5!6D}BdY#W9Ob&Jjcss-= z;mkNhuF!g5rYY%)9wl8<=8mSwt%WyCDJ$_WZelmnFw4p`L+h-#i99RtFJUBXj+nGp zk;REUD988_f9AZrqq})*h86!(eiBCFG0kKnPiA_ie>1#UZeG%q{F?e$Y#euVH^*#q z%<6dFl-E3;BY7cjD=^c<{%`VY$|8BG$8QjMgk;*1V9qHdZ=t&BC{srn%y4FTn&o7g z=Cy`7mzKU$yADH-a{VRO%R%JP(j;v&9#gk@_;+w#^e_1nGqjG0-OSrB=|RE?5|_+< z%(f_Lns!OooKKoEh-vD>TvO5F!Cg!_XVy8>pXn~~ikplh=C!QmMxM2JF};Re+|4va z2GeeuX53;fBM)*tD&;6?i7EOKzou-`Ugg-VZ~t$ud(Co_{=zJ~&}$&M{`sYA#Afny zDoovoTr$p@GMnx)=aD?haWZx}Zz5@#WhJKg5kmU`O&6jMNHfgPFcP=KCvH+_%(&IY zHoKIS=`N-zn}pS5V~jM@G5yIrLHx<FsdMoo$0CcEa^93%OJ8&#au}xg*UlTJ*d?r( zChd-mvB8|joAb%gwNY84kg&3bA+k$aLXNmS*fs}saxB!5cR^$|<rmo{4l%t(IEhR1 z!y1OHT}XVQPtC1EJ|(P)#BnN2+2ow5zm8_8{>(VMM!h%vhWe2-|K0Hlkr{r;{H3sx zmYg$9DHE}qc@)!>FVvs7r=c%F=8I;ZW%@Nu(S?kAru=68mi8!q>WuiMAJxK;wwRKa zUqk$fOlBH6GQNU5vt`OH@yl3Z9!nUhV`g8~Y9eQlyhz>`<6rV4<)P&Zw@}kuAO5B5 zKXcvqm#zcN_2f#)C+Vb#&O^-Kay|H4{D`h4zfz`>e<!+;{E5DP>otIcmvK$P%e9Ea z<&?N!8OMTFcZ@tpU6A;ty@_ARo9I>C(_ryC^o92$7vok?@{c^ycEyyndo4ZuNxPSO zKcW|LGm-ixYq64s%$3Bw4*yaQWX|p6ydd{n1PPymtfC9CYw1XzfFEh=5=O%2?bc-$ zxwU#O>B>5KNZL|wWXzSk)DwOM=Yy~e<UW(6A$qFEuIYeylO?~9XApY7#GF%z`S0$P zNW3DGAa+fM%oA2nKZUe++hmqJ)^Tjg?W}9Fi<=pb$SE?4Dek7cVoIA3>Ihp2Qic-F zjMFs5UF@c*>6i4)W79O<&2VChn`uf~a%`HSXE`=ar>sSCY?`LbrfJp#)08=p#BG|% zl&u__W*+fXf^!GDByE`o$oSt3a!!zQ%M82t4Yi*XhPWku6A5eT)~pleIn7<_iGk=< z?b7vYn&Kw@%rKHq6RrLdHis~+=R@qt)Mp7ReN&F1*JR|;^lQW^=aY9*cSTO>kHjPK zin$DTv1|TC2c#u-$9w3>IA@xgAJQ;o6}dGz|3!YF4on$Mvzd6j0y2nhq|92w8Ff+o z%6W<3EMsw#`lM*H4rCU0Gh8L^ramQ%V5TRg8HdDaV(M5-@e`Vs$YtKckoy=~Kk*3p z!QPstkykSxW;tte8~O`fdoksZwfi7_M?I#5k+yHjXZn$26VZ>@O;hT$9Gj-pX*o7c z(S_EIkU?ZI^CzaDl`ZGY{?06SQ*UCPG-s!euQYTd=OvBbGM_frjHO*^^Ih^Q<s|w1 zudtXru7EnI2ge>gZ<?%<UkH_7;ud{{x;Z{3&3eLqhJWmf_mKx!f!i|3!Cr~ELd;c| z|0Mjgr1u=@zKH*4h!b<!6~wa~_m#MFt{IZ$7{3k&ZkS5+%lRDa%Pu26&gT$c-3Qd+ z6{O4gG>(IWUCgnA;}!T<*yUOHH2klScyZ6c?&Msugo8BfUIBR=95*9xJ>+~!`2E-+ z4;--KBf{;)&xe@U>%lAFw-QW!D0JfZ0(sbzvki7b*p*f_81i8$Y=y9^tZEn(!+o$3 z4nx23R+R}A@Hp&&u&b>q8U742;bGVc-$C-9tm-eY2sXes(CZrFh1C#oEuWQvd*LnU z^k=I|g&W~1*axxKS=C6G0!v{ld<SR!#j37^*{~e;LC@>0YBbD)SKu(5m1k9Xun5*b zBRKP|Y7ESWRq!d;Cy);K;4#<<Kf(D0R#gapgN<+iVhXJ)4W__S*Z|+a0FPB&2Mb^& zG(tj=Ri#4(JPtd6&B$s9TnkHJ0~~@rlh6lDgU4VySc~xsS3?y%4<A9-8>}h?@}UM^ zfkx;%*{c2s^I;Vnh5;p3H6G@|3-B4lOtGpgxEWT$XVAUWs;+=Juo=DwXBqxr8ax3X z0`Cw~NpLAtz=Kc+oo}?N5ilKIf*;_ba&!t$!6(qY0{LJOY=RgcX~H~M3qQgLzg67? ztKoY{nQB!tU=wtiW>q<GAAAZ!rgIK9K?__kgZc%_;SdbHiS!`|Q8!!FHSj2W0~g*x zUSU0`nUp_N!%paZD|H$kfqgJ=mQ|I*lkgFAuO$C44W5Dz!7-aU3Co}X2G6l7FRX^| zU_=$^!Dfh<YgM`M5PS+l=UG)HY=_h4Th(M(4V`YYs!>n{Z-RXR;oyGw9L}jm-%tx( z7h2U=_$#~zJp<$y?u0F1U1U`kLj|ma!*E^=^&9Sk9nkG|+6Md$K8D0Qtm+1M8X95X zVyp7Na%h4fccO1t2Kyjs3C9qG?teuea6jya0e4YfVHtc3eg8%qfcs!K^t>CL!=rEj z&b!B|royXWT}s~ri(x%{4`<wKRae1ccoVGmkw5Ukv(Nwo?x#({Qg{a}4_MVDFaw@} z1~}tE`YE^<-iP>yC|j5TtKbmydl<dI0;q+faQ-r@x*it7tMC;J_&a%mr{OqcJwl%d z`yuI3bPfN2{czf2ln>km??BAsR&_bdhxPC?jQ9sSfEVCvIQt2!DuPGgW9aoHI)Ekc z4s>~n`T{q>i*Oi*K23dsze7DZpRuZOPz~$g1YEq_s&0iK9EEfKiQeEo*bVW|5(bvQ z4v2k@b`0}jGpH3-<$}4e0Xjc#RlkSnupH_k?gh#aDq#(L3+KK_{emZ<0s5_^uY<*~ z1=K3~5GaEu;B)Br5_*ICVK2nLOxZvUybWQi$q(ELLHG$SSwmZe=ivY(t)=YXZg>Ye zy@DU`!E*Q%dat8B!9u8oA0hcwtC|E4!}}2b8hU{{;a!M&oxT<xg(gT2k}kXgKf%Sd zRy7OOfn`1YJ=_Vqq5m7i4bQ`IxNHOG;3F8gk#-BOK&MUQAD)A+;oQwuRRSyE2)MV< zuft0C1_o?JCJ4am@GT5_lk$ZnupN4ABTl#*c0s~h)GN3Pc0lyo$O={P8vF<;?@%uA zG<*)Hze}936m~-QI@&)hgxBE+oVA^{27iSu@Drr$V9bXX;cGa5C*=Su;Rp=dMc)h0 z!?%#~9=d=R;1Hzz3;(bRnqkoU^t<pJG{d0X%mLt0_ze2*v8n=i9KM9JKVU3}m!Jjy zu$MXt8zB5c`XpEZEs*{Za}IbFeuN7?Ms|1>nqc53#0?L_Ug%j*{eU}Q8+6%6`-EBW z3Va1g`)Nxs7hZv*aKWeaqwr7o3eNtF`U+3OS8(R%^d;~Zd;<Nyu&Ppc5q^d%zN9SS zQy9`feSocy*l1M~;brJ_fbxNdp$RT%B5$w_dLATxcoEcBv@du7njraWtMbFE(CHhi z%7#1PJ?PU+{^4o(4n`azU$6zb9i~pf!>}LD`<A{9UV~0YhzIV1dKmH@{V!~SuHRGl zU?FUQ?mr+m+yi@{_fhH{JPe;g@{i0#VG}rx(VxIFXo6wK=^J4eoOyyY;7#cLlT}TC z$KiVz@iYG575Eu0Z$Y2%F$`2T-gs|Qt3X-!G93IB_Cjx~P36JE@F|>Sv#Byz4vlbL zm`(ZN1^5Qe>10zA;ZfKR{X5&#_3$8k0{!_2eLg$^-@v(iJH7;-hDI33d!vfrG58ev zN7z&z{2e}nGa_wj5<CS5VQ7?1&45?I8f{aTLIAcye2h(93lGERaF!j}VFet4i}?!P zLU<3Hu{JdsR)VFQO^tyE;UJ9YZd28;8wSPM)O6SiiSagd1FQqp!=^5WC*TD9zNbyi zhBu&df=y*Y4ZI885^X9M?tu^Bv|i*99)-_g5bsNz49~$KNa6jIQ(+C9fV95I1G}K# zY3Ku9grDKEem1oPK7uoyHsyiG;Y%3U-=>P;DQJS^(}@?>z)z4iz^3NHR)|WnsXxM9 zum}2_LAk-B&;%ErN&a9fBo4Hx3GgEP45J63JNN<yoMlsgfu-<1^f=q5#=%|iKJ*z( z{eZ{dL+Ei1^$%`>H4t+yWdV1>9_TxSwBQ*y1iw4are?xxppwZ0{0;Vj^L+FQkHeR6 z?ogZZ!78u}BVM>2-h!|co|%PNuo4bHzYA>YN>~U%_znhNh)!V{?1i4cLr<^>HiK=r zO<e-h;YIic&c4W|3gKb+0D6od4Aj6@2v4PczyjC^EpYM0lm)y6k(b!i6|fMtLiq0~ zXSfZvLF^x>Pw*go3WL(9m+%xc!kI404jzP$!8wvLfd}CONEn5lU>WR(0dDFEyabkX zn@WfIum!qaiY%}Q-U0h%<OS}5PoQsxP5l`jg58jiX;at1eXs}mU5+kb8GHnBR}dbS zz;@`CWmDtfKKKMq%cc#(eXs}ON88j`2*4Kj8B)fOUw8=iK#v@o%7Qtt8oq|4KN1ft zfvwO2Bgdjc*Z>XS7>657fji+9sE01O^mA|(+zOAtHaG%(ucW?$7w(32uphc!MHsje zZiYwTP52)AkEe~mG<XcQgXL<QIv=ivIq)334=ph0Pxyyf@FZ-96L8iw=mKWKW3U6P z*V4{mJj{THVJmzKeg90ofik!Ug3t&(uCu9BxE|)fKVU0-1@V93987>k@Dl8Ui0hFT z{sdL99NvQyFd&b<5T?Q-@D7}Sv+~Iw%!8HiF~m%u&B7#D0_)%la1_w*LLn@Mjc^Rk zF0`p@U?w~c??D$2x`tf11^xls;W(UGM16%D;ci$5UqH-6o4Nq<U?Hr8y<nNd7z3Fw z1@443un)QxlV|u7%z>w2C!ByYZ?LHxm<kWV255qAlNk%31Qx?u_!MGFY-%_Z!tJmY zK7*Jk=o==%Vpt9PA*K{}xB-?x5E>w+%%=VTli(f*!j};1#Xor94p;-9LiCOFnUD_) z;YIiutmWhZE{6)Z7hZ?Yplb#Cg=?S+{t53x3k>qne&Hr~6yAdG;50vV4gBypY=gs) zFco>h1B>7V*aIza<}~_bxCtJGci<QdoX(g5m9QK>fX*{$_i!D|hkwE@I1Z=ZMEQXi z?t$0fbBMi}w4n&@hD~r3`rkr-0n_0humi$oq9-VUhhZ0Vxs`qy%He6KhlE+QO_&dB zp&15L(pNw=tb+rPFq^pv_}~$!gP-A?In*bZ1JA<85LHDwPzZ})Ei^#Sx%9>0gGXTp zSmseD!2|chM)(F2=iAgMm;(1e5E`M|ZPZ7&0q%xZ;R~=Ypznin_&d~rs;13C4oroI zU<-T;NegMqFc((9Ug#2FJ_gspUGN$lfzuaJM_>-T0Q(`jhCIRza2ITZX6Su8eqjNu zh6YHugFXT#!kw@V8lcx=$_;LT$KY-F4o<rhT|*h%13_qj*d;b~5ln!E@FMJmu)o^W zFqi;$!dhs6_`A>vl)(eA6~2c7e?uoQ6PCjs=zKSEfCuh{H{m#(a}WA}+u?OM0%t9y ze!yIK89s-&dr1qt@Ho5!$KcHS=;L7)JPCUs@_uv&1yBv^;2TJKfHn#>5QJ~xtOpqj zU_PvbeGu~y`h+>~95g`e!=w*Bcosf@$YsoBpa_=0>(B%Vf2W^-+h7%Z27Ml(ZbBI> zh4s(`@sCp9U=rL78{r5fJx0D@Hmrbph<Tj!padR(ZSW%u`UiP{+u$Ym0(v|_8;4ur zS*VA&Cy@*0z-nlMzE4qBPzfvHLx_2rz7Y!HUZ{hZXK2T;05-ru=(`*lVK)2|K7_D; zqEi?Tvtbo9g5z1z1|K{C8{sSH@f__CroaR6Hnc#>3hF*Q1Uujuoc%m=6bQgNI0$`T z;3ML2D?9<);RFnMkv<&mg!OP32CQTZg!%A1d<5aENDHoq0K5eIA?_vQf(m#9c7Ww& z`Vz>4#jplGg{alc_u+b|hBfdNoW6$s8Y<x_sE63KHsywCupH{4*DK7C;1+lRzJasX zQCDFhyaM0DIj^EusD{<>CB(mmUZE16gzfMnoc=oQPyzSD2KW||g3P&KF06ttAikFV z0H(n+@DbS8(-%MqEQ4Lp^$o^km;_5;12jYL4WtEgU=<vMz8fhQm;q10ZV2DRm;n>v zZrB9h!@$k7cbE^W;B$!Ef}X$!kHanq+e#k-1+WCx!(kZkCiM{J!1J&V9NTEa;Dx`# z`w;yWZ4hR{D)<Tpyv_ImcfwY%yhFaB3?7G%ApTwQ0`p)Ed=A~}h#w}yeNYEK!@1k3 zqp%QG!<P`hgS@~rSPpw2d?&huiSRgl4g+^F4}(|X7+mrmV?8W~-C+9{^&0*J3*aUA z5_-H(TZfxrIeY+)-J}VA_$Taxm_770P!3PRKIr!WZ31qCwa^Snd&vVVf*^bkLq4RR zgJtk0`~U+!qVIqOunL->|HsTHVJ18a_0a7T^bQs92<(8LU{F0{B+P{s@CkI=$Giw` zhUM@rr0l0W;3@b5F8P%D1K+^qpHXjM19bhI@eb~UJ#g9=)Kz#6zJrUuBwlz0j>GR8 zNE@~Qi#2Kl_~AMD4B`*aR^V^29U_~^2iyv);2;b+NSVP4upeT-B3>wgd*BUdhT&h+ zMqwjFd_#W+&%z<NpqX-pAgDuJXTu!W0G$t0wh(}KAog2if_vd(h(AKzgaxnx)OY9y zro&2ThI7A15AYb&L*F0JJKP0z5Pg(1VJbWW`yl>DbPKa!6*R(W$CzhAHM|OkVc>Db zZ&(Dcz(E*rg1!sxge`Csl7C|U0C&MAI0}P)Mh;j2ufY*GyTzvRU@6o=xC&Eg;D=Rk z6fU%csj2@Dd*2;cNmceeeMYgNf{2O%K^8<{lYj~+>?T_R+1;3Ip{VgDxk)a2b8omM zyTOKF?_$A@BG^T2*t;MW5XFuKd+%Kozuze{b7t<$IcMhP`{Vt-H+r~xW}fHwlvC#P zgK#av-w}o_$G8~bD+q_#jxmYwQiK~34s;x29N`j#4<P&nVZG}Zb%d)Beu!|W=NM-r zT#9fr!rgqw*otro!p9N*g>YQp7&U~qAl!y<2<}(ej_^E$>kw{7I0<Lg?nSr?;WmUr z4{(fK2$vyz6(PVG`y&WXM0gLvZxBwrD|iszjqp2!qjB%b;}Bkl@NI;9;#}Wxgy$gK zgm5RE|9%ES7vY@<KSns>K=2@3f$&3wL+|MrXCXWV;TnXWAsmA9r?(*NM|eNN9SCRM z+cBPra2<kw5aI~WL-;bnfd@OrV-Vhq@Mnb6@8cLRMEC*1QHMCjEW*_YzeQMoU+9By zEy8~hHsQS9XCT~wVBOC#9*M9Y;d+F7<E-C#gliD22f#LjOA&5GIQ%fjSU`9?!k-XM zd7xwLL--iN?Fgq1IL3ttA4j+YVeD|ncrL;%2=_n2G0s7FEy6bt4tkJdJRad42!BC% z<dM(`;bw$Gj&d+o=NNB8_zS{m4|a^FBiw{=$kE_Kcq_u65KdbMK7^YQ?sW`gAY6{{ zON8T&b&O?%k0MwPfh`D^A>4{^&~c8j8{sm9TM!O@sAEhaya?e&gaeL;{s_-T_&fpz zij7kcItW)I`~u;K6Ojf8FGsi;;m+$FV-(@Z2p>fFGs57YW3&<8h45>Hqlb_-2$v(= zig2G{$VGS|!WR+zlaL1yo`rA=!XYOk?;yMh;YSF^Jj^jJKzKXCZxK#-IN}KJMED89 zagTtG2p>iGC&JJvj?qMT8^X^Jjy%;d<`Aw%_!Gk5X-HFq%MortupbGZBGeHsN4Ocm zeH3&;SV4F<!mkhxIvsf!;VB3oMED)Tk!Lu@9)#y0d<@}_2*+=5jA?|IB77F%c7$U# zI>xyOmm*w;a67`WBaShH@Ct<M5dMa6<fvmj7U3lb*CG4^VcjO+A-ovj284ej9J?8K z2+u>f8NuCxyoj)Z@Ck%F5Y}&XjPns*f$%wme<P67hp~FX0EgijxXISIlW}L`0OKyk zT@9QDjq`~QG;rcH?g~7}IM}!k&RM%Ju3);Kaew0h#$m<-jRE6u;|SwH#*xNR#)B~n zvCcTgIM#TGah&l`+`4{(aiX!_7&L}(e%eXK$;QKQ9{D4TQ;buM({Sm}qm0v0Z*DL) z8Y9N2vB}tMY%#VPW5$`rS;n}r&Dd`2!0|edHYSZJW2dpp*lp}F&Nj|5&Na?69%DS# zc$_h9JRYYG&KR@CoKZFAjRl;eSToKy_TuK>CCrC3aqj*FxC6dzbWl6582fN;_o{KB z@dV?E#*>UE8&5GVGM;K&Y+PbI&3L-;4C9$ND(BfaM(4R${`-961;z_;G|Y>QOO2Np zFEw6<^Bph4ku9$@UWEf#UW2pzUWbLyug8MmD~vZ9R~lDgyZW1rx8O9xw;69Y-eJ7c zxY~FZmQ}smc#rX3<9+xtT#Ln7A2dE>eAxJi@loSr#>b6M7@ssgWqjKBjPY4)oVecj zoN<HkdE*Pl7mY6&HySq?U&c9fUopOF+=AtqUpKyi1&H4=zHNNRxYhWs@jc`F#t)3! zj2{|5GJb6Q#Q3T4GvnvRFN|LrzcPMp{KojL@jK)9xD)D+#-EHo8-FqWYW&UkJHAc- zH2!7WZv5N$k8y|bUnIYYn<{M_v+bH5F60St3DTX-1I)XacQx;3-rc;1d7ybu^Iqn? z&4bK?&HLc$jr*F1n)fsBZ$7|0%zU6ZU><HBVLr$_(mcw1uz9q(&OF9E)_jP0ocU1m zc=H7FM0344Xbzdf=1Jzs=EKZ~n~yM0F;6v5GaqR_$~@gX!`xtQG)K%)bCbE*++uDu z$ILU$v&?aGo4MWGVNRHjHYd#~b0_X&+HLMJ&o<97&o$38A7eh&e4IILKHjXDGv=&0 zXI9O5bHQ9RYv%dpUbAj4nGLgPE}IvaEwgQQ%&xg&?lbqBtLBB~6U--?PcoluKE=EU zH-27hUSdAYe7gAz^O@$e%x9a=F`sKb&wRf50`rCDi_90BmzpmzUuwS0e7Sj<`3m!u z=BvzCo3AlnYrf9B+<d+H2J;H@jpmi+Rpy(_H=A!U-)g?ie7pG$^PT3^=DW;m%y*mb zG2d&x&wRgmt@#1-gXV|K51St`KWcu={J8lE^ONSM%uk!2F+XcwXI^i9&b-0=y!i$5 zi{_Wi8_k={FPk@;UopRG-eP{u{JQxK^PA?k%x|0DF>f`$YktrCzWD?5HuHz(kIWyN zKQVu5{>=Qj`3v)x=C90Oo4+xCYyQssz4-_8kLI7uKbwCs|7!lt{JZ%N^PlFw%-hX> zoBuKIF#n6fZ(5dRTaM*gp5<GCbtmi2)&bUCth-uwv+i!)!#dEqr*$vu-qu0Z!Pb4O zL#+E+hg$cu?r%N7I?Q^YHDDcX9brAlI?_7Ida!l0waz-mI@WrKb)5B3>v-z~>qKk4 zHE0c4!`4aG$=1WHhg*-ZPO(n4PO~0qJ<2-WI>XvvZL~(LQEQX6+1g@lwZ^P7t+T9g zYn!#*+F?ytkG3YQDQl;-%i3-2vCg*6vCg&5vmRqT)_R;ZZ9U$qSTokFHD^_=d27L1 z#NxE`t-V&=TCy5e(^|GJuv%8z>R4TC#oA}>w^pqSttVJdw4P)=*?Nj~k@ZyTV(Sv? zY1Y%NXIRg)o@G7TdXDv6EK7R6^#bdK){CqcTbEidv0iGu%zC+X8J7IK5=(ksZN0{N zt@S$Va_jZh8>}m=H(FO(S6Oee-fX?adaLy|>+RM%tan;hTko>2vEFUH$9k{zKI{F~ zwblo$4_Y6xK5Tu&`l$6W>*LlZtWR2>vOaBn#`>&voprtSIqL@N^VS!vFIr!+ZnSQ) zzHHrWeZ~5!b&K^i>+9AxtZ!Q1vc7G7$GX+}uJt|Z`_>Pv+pHg2KeB#o{lxmI^)u_| z)-SAITEDV>ZT-gjt@S(W_tqb*KU#mX{%rll`m6Of>+jY-tbbbnvTnEjZT-i(!@|U| zZQ7P?+m7wpp6%O#eJA_Q_5t=??7P}`v+r)-!#>cyr+qK`-u6NE!S;RZL+tz7huZhE z?{7cAKFofgJzyVhA7MYpKGHtQez1MCz0N+yKGuGSeVqMJ`*`~V`$T)aJ!lWv!}dw` z$@arAwe|@66#G>BH2abEqwLe|GwcoaMtj5_wKv(D?Jf3Jd(1x5KFc1rx7pk69rlF% zXnWG0vUl3M?A`Vr`)vCh`&|1x`!V)o?Z?^E_T%k}J!8+>b9U99w-@Y1yJnwn@3rgp zlHIVI_Og9}-Ll(u$L`uI_C9;Ry=q@*Kf!*Y{UrOz_EYSO?5Eln+n3l+v!8B1!+xgy zEc@B^bL{8Z&$FLzzrcQ>{UZCt_NDeq?3davvtMpsX1~IIrTr@V)%I)b*V?bMFSlQB zzrnu3exrS*eU<$t`_1-S?6=x)v)^vN!+xiIwf!#p8vEV$d+hhx@3Y@;Uu%EB{-FIK z`@{A}?2p<Xvp;Ts!v3WFDf`p*XY9|~*V)(GpR;eUKW~4*{-XUQ`$qdF`^)yt_E+q$ z+PBzWv%ik6^*8Nr+26LmW8Z3j*Z!XUeftOYZT1iCAK5>)e`5dC{+a!A`xo{v?O)ly zwtr*)*8ZLSd;1UeAMHQcf42W(|JDAR{dfBx_CM`^*|*#Ow*O<_VWacnn2zPxj^ntF z=lD+G+{wAKbAWRf=dRA(oVz>sa1M0t>D<e?w{wtluyY^h5a+(mq0arB`#TSC4s#yp z3^<27M>r31j&zQ49_$?LtaFZWj&&a59OpdLIo>(JIni0~3_3&3uyc}gvhy(K;m#wR zQ=C(s)0{^-k8)0T&Tuw38=Vnn)Y;^0cD6WMoiXQ3=PYO3+2(9_b~qExqn$}-%Gv4c za&|j=oU@&CoO7M?oX0qibspzTJCAoN&Wtnb%sEwO-dS)KotksLv)8FROHRXSI?K)l zPRnUK9jEK8IQyLa&Z={v^91LK&Xb%cJ5O;ga-Qm3>|EkJ&3U@>4Ck57vz%u;&vBmX zJkNQ)^8)9E&WoHEJC`~yabD`Y%z3$Unez(gmCmc2S39q9UhBNhx!ifZ^9JV%=Z(&l z&Q;EvoHsjfao*~@&3U`?4(FZD)y}(|Yn*pG?{VJiyw7>RbFK3M=Y!6NoDVx6aX#vN z%=x(U3Fni}r<_kapK(6xT<2Wxe9pPS`MmQ5=ZnsloEx2+oG&{!J700W>fGXd&H1|X z4d<KAx14V~-*IkrzUzF?`M&c5=Qihu&X1fQJ3n!L>io?4x$_I>m(H)8Upv2Xe(U_s z`MvW8=a0^xoIg8%asKN3&H20Y59goGznt5he>?wi?r{F=7_RABuI)Om>w2#52JW5Q zJG%$CcX99P-p#$cdk^<O_nz*(+<UtRxd*%VaSw6t>mKUf&%M9<0QWHWf$o5NxO;^A zAooc3DEGnc(e66;824EBA?|VRL*3)u6WkNs_3ofM<PN(hxhK01b06+L!ac=3)jiF9 zr28oMboUH*gS*ikaYx-v?q+w3yVV_Y&vegn$K7r2c6Wz6;Xc}(bf?^%?k;z?yT?7- zJ;y!QJ<olN`&jpJ?zH=Ox8lyYv$)!{>dw0h?xI_B&v*B_b$7{axJ`H2y})g`ZMWlg z-4%DAyWd@PFLa;aKGA)W`(*bi?nUlX-HY8z+^4xucc0-t(|wlvZ1*|tbKU2;&v#$o zzR-P<`(pP}_a*L2-Iuv9cQ12a;l9#+mHTS<HSTNO*SVLwuXo?zUg5scz0$qPeUtlU z_bu*Q-M6`Kci-W@)4ke#mwS!-ZudRzd)@cB?{}|tKj41Q{gC@%_ap8{-H*8+cR%5N z(*2bCY4<bkXWi@E>)p?}H@Kg7zu<n+{gQj5dz1TR_h$Di?pNJg+^@M`cfa9&)BTqF zZTCCwt?qZ-@44T1f8gHc{?PrA`(yVf?oZvHxj%P*;r`P7mHTV=H|}rU-?_hc|KR@7 z{geA=_b={W-M_hicmLu3)BTrwyZdkVKkgmwe_g{fJ<GE_$8$Z;^S!{klXqwD0Pil| zUA?<`clYk$9q8TDyO(!w?;!7B?>^ok-hI78z599h_a5LK<~`6G@DBHm@E+tH=^f=g z*gM)==N;o6>pjFf&U>hLymx|kqPN}~^oG1)?<DVJ?_u7<y+?Sbc&B=&d5`oS<(=-G z;cf6XdL!Pbx5?Y=ZSl5xW8RtGS>Cv}&D-wn@Fu)Rdz0Rjx6|9@?e_L~XM5*(=X&RP zkMSPsJ<gl<9`9AW8E@8`^Qzvwx8N;$HSc_HuUGe$yoT5Gmc0wSme=+=Ue{ak_Idlg zRqsOY3EmUECwWiyp5k5PJ=MF|yTp5%_jK<W-ZQ;tdC&Hq<2~1Vp7(t31>Ot27kMxC zF7;mGz0`Y|_j2zt?-kxFy;pg!_Fm(?)_a|Ix%YbS4c-;r8@(&NtGqXPZ}#5ez14f0 z_jd0c-aEaky?1%nc<=V!<Gt5=pZ9+6TJHni2fYt@AND@teboDy_i^tN-Y30Jd7t(^ z<9*h<&b!|GoOgrwdG8C}7rifeH+naDU-oYHzT$n=yT$vO_jT_Z-Z#B(dEfTF<K60g z*ZZFLeeVa}ZQc*PA9+9ae&YSq`<eH1?-$-Ly<d61_I~62*883Jd+!h4AH6?$fA;?3 z{nh)M_jm6f-aoy6dAEE2_WtAD;r-V$eABml+jo4|_k7<E{5$z~_7Cvy;@{Q3n}2uz z9{z#;J^g$6_x2C+5BBflAL8HFKh(dUe}Df0{$c(D{Q>`Q{|Ns<{*nGs{)7Fa{dN8^ z{;~c;{NwzG`p5ex_$T`7{Xu`oANEi3Pxc??Kiq$We~N#qf13YD|55(w{u%xTf1^L* zkNTVZ&HfgDt3T$S>7V6~``i5O{tkb_f3!d8Px(9jUH)!=kAJp*j(@Iyp8pvCvHs)y zY5(zl#h>wK{W-tt&-)AhqF?jR_xJjBf5~t7O@G<Hz;F3&zvFlP6@Q<<-(U4F^q=5A z(SMTvWdAAtMgCL$i~URdr}<C!pW#2#f0qAj|2h71{pb15_g~<@(0`HtV*gVACH_nO zm-#REFY{mFztVq||7!m={%if$`Iq~z_ut@O;lI(p(!a`olmBM_E&f~mxA|}P-{HU0 zzuJG7e~tfc|2_VD{rCCr_pkLo;D6BnkpE%-BmPJIkNF?>KjDAU|CIk}|1<t){p<Ye z{m=O~_@DQ`;D6Eol7FLrlmBJ^X8$YxSN&W3ulZm1zu|w=|Cax4|2zJz{&)TF`QP_{ z;NRx|(EpMDWB(`qPyL_yKlgv(|I+`J|7-s@{%`%?`M>x7;Q!J8lmBP`FaBTszxjXn z|Kb1B|CfKe|8M_4{vG~*eIvjvxq%%xfg5;%9|Xajf;$HX1a}GU8r&_odvK57z~G+2 zy@GoO2L%TQ_X!RO?i(B$+%LF)@POd3;DNzFaCmS;@Sxzx;Hcoi!O_9G;F#dp;32_r z!9#=NgA;-igZ05+Fcb_2Cj}=54+|b1JR&$HI5jvecx3RX;Pl{(U_-Dm7zsv$O~K}1 zORzN<3(gGA3dVzN!S-NBFcCaDm<*<Zox!ePcd#coJ2)peH#jeNOz_y?alv%(_@ENZ z1hc_hPz~mTg<vtL1?LBQgL<$OG=gTZ99$5zf_Bgey1`1YFW4Wf1{VfT2%Z=`DR^@5 zl;EP^slmm;CBf5zrw7jno*6tVcy{od;JLx`g69V>2woVxD0p#jY4DQZrNPUBmj{;x zuLxclyefEg@S5PY!Rvy{gVzUd2(Ad;7+e`#6}%~UbMThnt-;%Zw+HVC-WgmSyeqgS zcz5ug;Jv~7g7*j41|JAM7<?%BaPX1fqru05j|ZO!J{f!}_;m1@;IqMX!S%uCf*XR* z2VV%j7<?(XF}NxCa&U9-mEfzvEy34<uLs`<z8QQg_;&D};MU-~!S{mtzVjFAClAwe z-p|}VHoc=kZl*BUKgoq2BvM(aOgCE#)0B9codLb8Q>(Y97pff=-N3I3k<eaPZ8aJ3 ziD^jOc~QXu+qh$3Y-zb(UBda|6>^$9!G|jR&W$2m{8(yo8HYAoo1E#7L(bC-?B<4c zuXZ&Y%1zFjZ{qlE9CO~Rx3yUt8|u|oN1q($X-Ai46yl<%`=?T+i8}%+_2~`c>rb2} zHf)EpSE^H;?o5vXA}M%A>4gR?72AVpMKXz}n%x%8q*oDdsWvoWL8*z!$Z#loH$1pp zr3K^I)wn>9XT7%jMhdukWW7G_bc5exke9^MjqqxNTnciazeXO|wE1jpBN%OzVK#L4 z*Xp%OYjqQDwV3Tp)tjB%43T1G9J<svupKuEsHu^MO6deXU4=j@(`FXsZ(?G66Tb{$ zyt#m@Hx|NM6WY^_SzM&Bz%O=b<KmglT(#ArELp{_1YEP*Svxp-YXKBiB5oNcw=Tg{ zVj*g^E#uq+^r8Ub5t(^7rhi*?iCw5d^L2N&(`*r_>^CxXMo|5287I7~2yJdPm$r<v zN+?H%Y?evfz*B9_&>LF{G48~TL%2U@aI_59keX`~tH(CXUeLuwN?XR6-!kiX<e%6$ z&c|<-(&wYe$%N1=C^BlCgd9rGouFVK$+WRstIy#wlZ94gN#e0MMU`n8lk#h0=(j=( zo9Eghv?PPkt6lQ_5-T*egv&XkIU_|Y%?~l{S=CmfTGvvWk+#PgMSRX__tZLz8*2?z z`C6iSxH3P~JoCiH^so&TmBv2!<+uv#$b^;Daac>qDcnzmmZgH07x0ahR;#8<JknfV z)hbXNJf`2-q?uVyC&E^Sd?)W)=t;p<G(~Iyc>$faRa$#>y}EsLl3c;3RVuk-S!=xr z$7HoKSHxUGU%=j-mG)jex9@7;VzlT3uE(>dQX?1S(M#lHpDt1>a1YUoxr!J}8FVb( zjP6o<QK2}!ElEK``g822GWyBU`1(-}dLO19F}t2_Y*ghl;Br!OYn1%c1X`L7dKyqt zRMGQj`!^OedG>dz4RTdz*b>eeSRh?Z;d21RX!7X^VP&TX?Ve_9?-tzbNN-|OJ1NTI zdNL+(MJ2g1Oe?V>Vy)!jUr5??(o}{uunH5azJ^F5t_*=zeFQ<xKV^D~Om&x+o2^cj z)m!Y|M^(<}?OU-NDv~zhVE59>3kxTvr9cl?t4`;zQ5MsK=C0Qx)@wveRy!4P@f^Kx zQK#V?GUz#vfb02=P-?o4km`GmQ0qF5(CYaOJyoXdhE~r|W2#zX1F&%MGA^Q1HR?1! zl<VW>^Hg_6^_3K;ceShRE1aK+D0NT!k6tpHTUJD#xS^uYBYf;NnBaVxsYWXG`V20p zRoId}s-Vvt`HWmsi`#s2y)f8262Uvh5+0h8EORKc>0mFhqz=xYruQ|fl%aR3DjHG@ zn^JPEX=f3gdtB4XN`}l)iR{Z-E-G@KBYAg+NF!y1T>P!DhcjXv4}%XFx|9?_YL!5* z;{;C5`U}O?+E&9z2)Wyu4~VJUKw57(%`1E`!*+$jB>;(PFZrjLdIb0I?$yhi{JX|d zRG|d>l4y~l1W#bNu`{nOv{YeM<%Z5sR=s3~YHPF2XTfsSmJQR>W~_9Wo>M@SZmW1& zXH1{K@@kOG=1tGh$(=3r=1iqNS)I=_Mr46Xd>|}D(&W;rgj15@@o=5t@K7OY8uUzY zD@MPi+&Y8ZX@IDd#>3VjiKffMet$t$y%LaeH!rqDL^Wn<wXVuSo6g?J%I@Y`oAmXv zs&vrg_$7-wQF#<)B~3S`kCZd6ZksdbV-|~O9oFEfnm8ZltgVw<#%bn{jiymH`_Nu( z%z`Axa>^{3K9O>cjf@hJW3zKxP$kAaPAL;whzq3KOXs7&$EtojjXJ|p_UK-6UP%xI z($8`L7BD}yZIsT(vwNGT8w;3z#`HX&6ASYtsIuIp<loe&%;0wClH6krw1zuHxZyof zeKJ=jmEEfBV{MN1#yTdLi23v%n=a_mwGm^OblP8?>knkAx?CY`h`zwcN2zasBASem z>*DLx$_g&BXRAe!KNsp)Ceo?y-_XI0?=urHYpDvdn$$tGQ9BA(Lw`(>kwU#tj~;Gl zwJKPW!e6Z=(8eA4c{UOs3Qp)08XUgtL#qrZnO@uBP)usGB_Kp6_Am0dE!Coj5hx|N z#@d8QDrutHBI9V4#%y(46AN3&)G&%o6;tcv6@OL&f|)8{$Suy+V^d>JKq#RF{3ZaD zQGrzbu_H#BT~d-pE1gOyZ8ES(mtd{1rcjU@@>(+6(V15E?=JeyTO*|?RvDG1&`6)n zaJ(FgjZ956+cmPRj@FiBXaj5RYHd1WIKLuIwJCfi+EqRxLCO^VIfdedIcoN*FgIEF zPyhk50<*RHj^!%8R<MBfW9O>$t2h<D+g+)5<@E#mLZAhO^%^^??RK?}b`Yy1q9~br zsE}19Qj;{1wl(Ku8j<BLycVY48d|I3Ya~9)UBW_IIC%hcQn4=-&dk?Q7FHtqi1npJ zgi_p|&B!p-_$x)DZKW9z7n|s#(V|Rj0gOHuStv%7Euh_4yP#$$>;*Yc9?G!j8ei|W z7g_U`CN2F;(-AhI;g+`;EX??Ho;3wRpJBRwxyom}DZDZ<nA#KF)<Tu^3Wz%Ri14RT zQ*xyYP71m_#IDA2sGkyq*VK`3VGJHczU8G_ZBH6Uj4PGk?QznGW=^1~Tx-k;FUo<i z=9mDZE;|BotPF~t@Vq3*SX;m-Vo#JhG}8(odU-a@K)fqFixRt5N+$uSh&p`GXwwS5 z#pKgUn;N5NWS~@WNZLQs)F~5=_1xDAElNJB7sH<GM?KU&qHgQg6l{JCH5*(@%?9O~ zO>V?$z_~iwT)Yb5RV<w**;*m5HcW2J>lEj4bF6;(`Mhmu7%{oWyS0;tSBly)hK(<1 zOEV27tL@qxw!jnzN%*5I%(lwjs-VsGW@C+z`hiJU)~8Adtg=e+nrT;~Mn)W1!jYse znrL}Ag|krKn)Cn^Rv}Ri)|c@{FM>h|+GdPD=%kWiEkb!Zq}gbkj)O=mp-eW6h8N~! z4H!PYTS!$jS<12TDayE6P|UMvK{B~f+p&nJBJMKI8f%wGQhbF=aM1;-+I)Qcf_%!z z&?L`!{Atb{5b3;3ZX5~cfEM`XlPOI6kSU;%@#>1I>L0<-cZ(?*=Y0B5(1K)1xe7Wc zJh|jR&3coovl;tE=@9xz9ivJk<b^bIlj-$tr@9*(f=C0A4X|O$Ch;g5jmwqJ>>{U$ z-bn#<=8I(cR>se^c$O8<CyWXRN0~`a7)iNR6Gq_-OHFQq3Z^7GnI!5{0|KEfoo1of z7NyNdpAMNfphJpeMkt*8;g5?0@R2XfAFU}w{uIsR#?55XYleQMwl^^mR+(KSd#PzB z4B3fR4+4$wEs&OQfu#pFA5#jsrP{>wTx*q$#SW9y5~T1Jn$+i72pGwg_baqe#w)8; zc}121!y9(7kLA`ZcbO|TFP}`kk!%;PpObr2#l6xG`(R(f2j}_{KGc`+q5gyq_a%I| zKjGUdnE%?}r~5d_{yrTM!mNo&Yog20+IVJY|C*SzHXv(b(y%hIN$;NSz((tnw9(MY z+ezAA`NJ=H9I}s5nx~)$N?sU0s&403^sS+yBF>sFXJe&V?~>U_w$Fck?mDE&jR{}$ z@M&9_;>_M2%z79yiG!oXB}VSaTo)>n8FLnPY{XjAOw7nZF{iH3<<&A}fpZnf+k_?3 zvtZWA;ML3oX#P?A^fgUzME=w)SJ}*(MT;`0T%?r&vKTe9dXlx2xsk>Zx4ykwu^A!v zV1u601!W@!efuJoNI(6=?B&(BZCef7e)sDpAfwi|iqV%aDaEL759`L_d&vr~u3;%Q zO$#H(Yl$h~Y7Be}xkwA0vJ?=JvRJdG>fw@liZ9NL(x3Kqqje);C!Q_tr0d<J-LP;~ zWg)me^oz#`)=0xVK)H_L00mv|O8VmBIQ(dBrPfvq<gxz2M5SKsbm-{aNVnC($OC`E zUQ0dSgTNjjL9lM2i48o89=IOA%ndSx?u>l2T*_PPgSV~VjaTrIWMdPVBh3{olUtAv ze9$7&VFwTq)(x}d3^<*Emoz8Nr6VKOrTHly1dlYEtvSq=%LX~qvXi{?eelW$7Ugo= z<>g`yzO=oVaxc%@hrNS+*gMpRy+eK2JJg50Lw(pg+=soxeb_tPhrPpcdw0yvV)Y)n zz1Z{LS|xP{U0_dR(hS+l$fiLFXAR3AWtq8`7pv*Zh{XJ9IeBPvQ+aI4O;M-!s+(l* zmgX<aIM!CXiGE;{ZJy*Kc}`5y(iT|q5muMW5|@v4)2xIEd>++hVVQ_C$#an)2>GBm zOL&6Grp8L-tvPMmkOjC%kze08G5>gTwo>m)gCs&39r#8F&2)`*S7cxziN@MIqMH*k zysM~x1!<Yg+G(4`ttd3?oE?(sGntEuPNryKyVLA_iZ5z=O1yrC<i69$jg!rpZoAXK z5=7#2WXLV8%JO1uwoSXWQ}loiX-?|_z~MI-J*OjTg&CKYTVw;u92&l4s8-%s&yt)0 zAnV;^K|}*qY#^hs4ZZxuG>FDF3Q89Fib=$(AVq!M>nHFivSTKXqMpm(p~GYaUBO0U zz*Ni+6Se)-dKtq)MpXl**Sv^R(WTAcY}Qv7nvJPWZ5d}<7IaW*G^uayVty`Jx&^jk z^7tCg!g-wY70&0JuW(-He8qCnB#xzQ&}<}c<t1}al1t`JHhMyqVerXO6t2WGY35<e zH(2k0eqq@98}^_WCqH$DAr@q9Rk59)e-ul}rU0Tb#S~zz@iLM}ah}}lVi`_+%h~V~ z&sN1WCfszXRCSICm*+0gHDOCaW9L8?8`&&P&Vi7%p|kjyno;{-QED|16y-Myfjwg< z8W%QzrxR)Pk@@qo{3Q(6tFU?u7LKthrfhjPr8qMWYhx3GJ=$_3*UKB>`E2sGe=eVV z$SI$#oH)hkXP&shqM3#}bFiFsgGGxL7pEBO%(HH&q;*5(tQ#t6onmA&&${7~)+q)< zbH$akj!g!Y&1j6fY(g^b;*M(f(`LZI3$?kp*`cf<(YzYRspnmEd&h7hRCkU|8M2cs zS!(d-YYUZmL~&e)W~;>-G<2D>#vlXHJ{t$kjI{>Q$e-D|u%mS5`m#scnC0H1Lne^& zXyh){I%IjeJdrcl$=M-E2<h@>^ri?$ddCbNYwYw%Fh@JKd!OoPK-%?W)CWx-G6WSy z<3XVHqf%dRsUe>nM%L5O1sYr%eJIRY=rgo7`cRlY^}(81I&Rm0k|mJVNUQ!6F4Sr* z(k{g6Klu_!#eIc3I4nGIp(|13@^CaX;=2Rsf`T?ZdWlp8yg>4ogQLQ0or*;Vbf_d~ zuX^i83+U9#KG+}okb=EcX|$J{?J8>t5%J_k%bm%`@}5zOm|&0uNj;Whh%2a09-gVu zZIS#TS!N}^AKx)QkHvUWuQK|L;Zcx6RGNPUI%3A2YHeY$Lnmhy>!}osvYejDs#rjk z$)gy?%;ZsY5i)rc?Wjy1#VB?rk7^ZJHd7hxx?1Y7rZ&kJWZyhHI8$p(hAA4eXC3fD zGPy?9j6pJvbt#NN#`5SwG-ga8`Gl9A0aMBa;AUQ77`%wdhc?n~Okrqc|JZ*iZmoil z%dM5^Vs6oN#S*@>(Fs<aIyFbCeAHGZbx^)WOUhbaVZ|ysnbe{33M<Byq*BX!czAnv zrchaAda$CTSjr$%SuxHeWi4;5{^vD2E64n@uPnQj8b^B4?>g%5<~~Fec{ztko{Mvs z<U@uzOmeSgGbyrr4pSMMhRWC^T^_n~jGQIF#u;cz3DFHZ$MUva>>Lx%%_J#I_{3+0 znd#U?X#~y~W=*N)jg=*G_{!2Ueu(P$Frj}#9*9#`{X*aiRS2SA71I0)`8dsBfedcN zMSMejd9e~c-m$!1s(wh9%Rbm2`%po4y2LlBR8a&}QGEf>#a1CgasQ>*i~29cUeteV z6gkwMrD{P3V!?A?{8;gt<Zl;LV4^}#@1y%P3bL|g6j*Rnln>|DCJGX^&XUba9Vrgv zuqkp@?~*zw^{6O2Jr_#ElmbjNcH%%INUhQ;e`0$SoiE8(lk%}OP92=5O;5=t_VRy< zr|y)5*s&bKO96O`jr7=<pNJN8`yGoGXWrbZR<&K8DIOmlK?8J%WFHI-1VxpfhaehJ zQV9{Fq!#p$EfkzMg-Ytu3sgp<v9@Sa@s!zK-Pa$$u4OW1*&jx)D|8HD2jIr(z}rYX z`=sCMrBa$pj;WVmS(rIWYM715#%g7WR*2$`K?cZP7DL%iZu&q)M_`9$`rw`GgI8Xm zi^fsQ6FSQ)bvdv6+ug&<9?;Qa>^&){bdtHC)}kutoT_VJA)h38ODWC3uy&`s+)|$A zxv~#?F;G)lXLMuB^Y&pcMrumS#ZXOo-ahQbX2*QFdv;EBTk|+W4nx9wr`hFpY^`Tr z$34kW2iu0m+!(GRD#F$vmr!QkO^ekk;l*dVcQ&S37Wlc6Ax{1UY#~K>g`#jeX80=q zl9Z4_#+<wGHNmWNt00WT^ck7PAO~6TMRfcl$YZQCFookq^C#L=7^;c7Z2p7-a^Ylt zk9IYQ?zFz9F*Q?oEnL`GkNDFs)KFrlA%YPfsv+36l!!UhLCQ#G=5funcsm3EAVrTI z<57m2l_U-R(du$%aU(9on!^e8Z8}>kJd%nYr8mcs4P?~~v$)5Fe(6b8q_g;ZYQH$b z$YOPNZ~AymwoR=B7(1kaHt9yI^A${ImjL1Gm#UFvd<o3jLgkKnLrkWx<24<j$EjYj zg$8Ay)=Dqg3WkDuQK&W0D_mD2TiT(oS^{kiwOgA64Yi|aYpC7YBx|T$zbVVBoi!++ zJxG1{OvLIhHG7cONUQ!*QPgUUQZURA{S{5FSOTnnkA-k+l9UOswbN})5;WAUY?>~w zCcaGN(lP~7&gn5oXj8w+gg9%ZPq_qJUKPt;S(`+Rvi4*ZwVdu^{wFmur(f@;v?=3U zzPgKz+R<k27`uBK>K8Pu7phhogpCf-rafCIvKC0iG1#)TwQx=kQVHKA7SWL*=CZEo z0V?hp;VwqnjbR;dwhp0i&cQTbc(p;igrbB_SupLsa3--Wotah~26M9HM%!xmb=X!T zizdqB@X}r$Mpz#o>O`B6WmJ-275=<qDlhKkiM4c}ilv~+=r!8xV#tYCiITexplN3B z6{azW+VuKz?DX25z7(Jc<>kkPDq7)FD`!fW>BuZa-w1u`fWj%e!9kLqp%p;r(+VK; zX+`<s8(I+}lqnn`2D#QMKC!G%rzFAp^iPyy$JPu8$C{L?mO^JmD)s572&bez!dH7O zq1b7@<y<7FgqE@Vk~2vGO%JQ0mBjB#S`$P0`70Q@7LMsFo4=^8*@$H`T0UgS3NIh9 zWEK_yF`0^O%%w_{2-8m?n8c@`+M1y^YxSE$_!`>2zSkV1^cOqT>?zobLyIK^Q0CLX zA(EAO$?TGeRWiXjR+P+T%WV%%+0vQ@>d!}!T_xQkbi2oJD*FP??k(GH?S(4$Q4nzY zEf~E}B~-#<Q(Ezq?G+~ZOLmyq{@2YdoO#(@DqeXqcCvMLjNC<C>#X*J5pA87T&R}! zxsEl7Q0Dv5r7smqOD1i*NdM9*BvAU&r7smqOWx7yEH=v~-bAy+$Oy|l6W#V=S+SE% zGP7UWUyQx9$EMJPEH9jLmzGWQYrP-iBZM+Kkh?AL?JHf2a(=pBfqxfD<biCI!VR9V zZ$}0;%4<<_SVRzBVoX`&F7q|y9wfsl<t;Bc7!&GFMq>IBUZ&9{2=Bw~C5M1Q;iXpq z^a7O5^i+p3^JxhkC_sNYl$riY=umC~IE0AW-lh5!y(p!66g@C~6pYBAeu_r~(nleQ zG5V;X#9n^+$|9VxEi(rlrcDB)be0cM`YCw{jJ`GLr~HMQlq-TlhpgPFp#T6)`oI`z zF0ZmSO@BDTjA(xums%#E@$rT-`8NluOa{z>DwBh9po$mq93XPb{F;H$%jQd>WsVZd zE-{Ck%sEMFXbxJ53RVJF;^QMjTT|u6hD&^r^0fop8mre`WBp3CC-Mz$;~d(x%*pMw z_8<WJHo5HV1a+HOaq~m`N;)h9i8dzK8H3@KkpEY}i-Yo-h3|`5U!o33Bb3NzDToq9 zDUHy-5@iZ>N{dn%I*BpZcY@&X>wa^^VBZOXv)B7pqW=ULT!RD|>N`Pjo_N2$80tGg za9n)fO7x!~Lu-&A!+j@6sZV3Fn3idsq!Ic~5PU%UP1ADU;G`vNn12nb9S*dA4GK&M zwFXJepw>*Mq5W&-siFOAX5QKXt(|$pB{Kr%oA@ag{cXAAeetq$Ae_DQ7;q1N;SnGa zq0BHq4}V`8lo>q`H7Gas#1Wz~%2K1hJs_n%V`-EU-?1Ku65o(CMu~4o4@7x2#J*GU zj~Q1a9G)yQY?cL4HlK%j^ikLn5dG@WN0AHlC|By}nQgR}UAFcV76Z{!7&K0Q$Q(@* za5l{?R5#Zv3u^$ixw$~6w$}iPu0>n}oN)SLt@L8YC9Q#CQ`Olfjs|J1u2njs#IBW* zJa^D`!q^(vD&nmfoDNWY(Cr{OxP!WSTcy31uXL5ytSM%`QLqdv+qqVT6YE+xHk<Wo zrNOxspOlo&VCO3$OR<l&ndUeyXs)_nwdM!1$LLX*v(-7`ZL%qj9di;rRysVQ3<3Bl zzwPM7+CWG@A<$bqnwTD*LX1f~RO*qS4$VnC1cXeFur?*U;lFhj4TZGXd_^V77szDE zk~iRlS-p*Qb_WUh6&_1HE6@pp$;4E#$<%xMj4miUeUadi<8lOP<p4ybiX+hTb_5+X zj@l8ZV^gA|e#8B$^6jM(4AGtvAOf<8RNONH5O1j}8o2^P>=)r7M^Q9U1qK<4qJf!- zf;Cmb^Af%Vfaue52yE-Gddsh%YU~JnZG`8=H!umz2~g3jsK=@pxXr{GYYUHyXS%Vr zs7Y~tky~eKZA-PeRPD4@+1cE~v_6mbwelP*RYMCwxmG|6MZHKM1BQ>7#)&GoX1SYY zpx<Wx5Gzq5Amu#o7CBaOpPUYwkVyQ?u|QVj5Fm1)w8}7nofV@#xcMZeYBUBeNJ<r( z>8b%CIdd`5;iRi#+&(EXW|B9FGr2GWRv<yRDCM+SrYOwq6c?qO5Xuy#n)t|LD&oLI z9$8<+v=nD~p@kfplv*rbCU_N-ze(SwI7{1FET1N&_F=1HUR7eNYCcuQT0UJ17MFyd zhG$Brj$*b`VykM|m5jArUSHhySD-FRx~Y8XC?`{8*5ca0vMTHJl_jEMc3GF1c0%Kk z4$?+TJ(8+Ffvr>>Y~|vOIl@i{sW8sGlN=jdin$agS{+n!|IAS%OtHWt!}f#{5ssp% zPZKI4W-UT;phNUXJ|LlHm*+sVK3AH1aU1|EFC+<5kEDs190w-c$tOcI{jtl(Z<4Yy zq|1G$WbgK;eOw0f&jV2D5M#*7ad=2IYZ0^VC(TOi^3Je}Av+{27h(kWLEtK!#R?8= z=nH69y9f%EN9Wneo@vtItdayKy%YLWrvu59?giOaU23*gH&$A$TD2w5pzH>q5sYEC zc2*W>7E3<TVc)s0IaQmZ`m+QHZxd3jbLU2~`L=je0gpAN;5aiMLMN(IGiW_ICU5&n zSry;XUS8CTco<b^s?M1jK-D<xMd(j{f?FxPwp49Bx?63n5|_hv`frwawUdYC)$vXV zb63sX!d>0-xW;93wK_Lb!4(Un#8ek*xIZiPMw)GVs3{Ig9?NwbD{c9wUBRz0_oYB! z6A`lNEE8Z;gWX#$x~RA#NOn%U6Bie)s?OBuVIp4bdB~CE1E6B#Ho6QQdWp}+6-N(= zv=N5*aD2V|>nqac0myT^8ey<s6$bnE!ce~|4E3#oV#kr%jl+Gb5Vu3}+cIiBViZ|x zhT*V}cT|Ik52a;RBn<1V@!G;-+@dbbj@6<#l}9*wtT00K@hi-UZx7~1`r_|&TjU0p zJ{%zWw2%dC?yfw0txfuo{8~8SOyELF@S}Gt<POPBc@Tb)3d@(p6xiQsRc7gdtIY-u z|0%?b)Sp^inrYT`J_&K50h{RdqRd!%vBDh2S8(Xm<f8N#fS!d~o}IT}3j@$eknnob zvPL98${CV?C~FKa0cFkL?BxvL%zdiPtNvoih;=j7R>^WR*5-=yRX~Lb-4t1Rw89EN zQN~1q7h|TKUR=doifgbG*HAI8eYFcOR1EBi)eiXp^JIv>{i+s3T#fXw7HKwcX2qy+ zj<#A2rXEEVV}?1h6eEN=T#BLP94^%$dLCOj9aZDsX=!^}HJsg!C5{@Ia!-{s>d@(; zc?{J=bw7KgpV2fR)EO=pL^AleWqkd5qBgEK>n`OKhlqw=bKh;us_0r(v=vEP4+}lo z7;b8GlpMIvfG<&0kkUZ}6%7UmxCTnf4o>CQBFgoD=pK5fAGu6V0Y`2?9Iv%iJ_*U% zDmXGCs6(TZ#PPVC4kEoqPlu3?GAc=H%M<lVqpG57)|;)N87-<gEvk7fs;-vEVLd7> z#fG&M8`e{d)Mh$%hJ8#OT3*8yAXOG4a){1EZGW|{%=jQgDd#)jlq$r;gQI%H;U<;! z1?koJ-Fls@7E`Ffx~!zCP`QFphLx@o7WZLl)Kj!{Yh)TqN5?@`f>|G0k4oqrs~Dp7 z@fw6|+*pG!TrgjNRGGEO{I*usjtP~R;kF}%o*|iDflX1Xm1vN`5tRy*NIzXMMy^Dh z)A*2XTB%?$K(jTsUWpe`s_NYcb5I*|PzQ5cwY|7rWi_-Ubb}gnG`V#EDWM86oXpWG zM4M}kT6<BUBfUsUMblhRxenVW=2z4(H4PFaOsm=GXjI<(cy5J6jE(8k?;z8x+%feM z4$UY<lMzU*1{XltJw__$fN)c*)l@Y{LB<Av)GCH!J!(oivaZYp5KRed8m8c|_BlN= z9kD>u6Us*T^&lCo4le!fKnES%m{wWy!=E8FrlZxVBoG(EZWqCBuV`WO+iEnFZq`>9 znvJPWZFyPwnIj%a(Cg^Jjv7;If?9wc6s=3ClO(`I{i2i88Kq7RVw9TFX$xM<B1);_ zPsmT-KB6Tc$)u@&G$p3#nTTGAzqO_uIvK-s8rcf3>LQSew1uI9mFgVZOseol553au z(JogNa$BR(Hr7TGk|87o7_H2=HRq~zRU1K|RMjOhsj9^wP-=l{DXGjxRH~M0${aRc zYgF~>HA1<kHrG)#=}6*|bvdep6Yd|;AZ5oSsT$j4fgYn&IvSLu*eFFW)Mj_61_<$4 zRrW0ijY=udDEkwHMgwO{tETSn0E^OT;_2u{@HF(}Z5)O7!;vUufd~mzWg?<e6;_ss zNWG#`5mz8EVpZNG%h?&F%H7+m`!s4uc7ld-7?hK#wBuw-)v%<mQXf+JnW5>8H6&=2 z9~pYhj3P}YD(&{p#a6SspsK6F)~GUr#e_-?LsE5fSfJELRW^hpRE<_JrKKyHRS6$c zs?wfPvc-hemKJPCtc84Tv#FY=qWNyBcA={5@@Be5Dd&`Ixu`1lB^v*Qh}F5Exy)|; zR>Cf`aW-9QRxznjH9naWty&Y4r*J=S!KqrN<OU}_JyS>Tsni9zo?Rf+Fl@5Y#%F7y z*;alBV@g&2k117|KcXB`Rpl|Iwsd8M9$^k^OIOZa#h6OlqkGsDNlq?or}d92&&7nw zGB;VB?I?`~jndhmQ5#AwBh{#o_|0W1chLLIREn{C$P`fQx-lhDt=(3R{!LZuaD~<w zGF{d}dv_|yY%7e$tQMb&)|l7gl*-mWsyV&sg@{m<A|au&qKOD~5tWrkh&ZH+sH_k| zL}h&t66!S@Q`E|040<whrpQN}O4U7JWUA84sWiaI_?ucYol!c-1eu1Jgi22{4Ko3z z9BF`NdQ<f=p-!SwOy!Jwh&ec_gBcCbY4|aw)$nFStl`s`Rs&djsRA4k)9Uylq}Fk9 zOshsF`<Cbhl&X9m5~|XIt>9BunVd`$O_fdzO<AjQGCiTn#u!6WR=k`{Pw23orFwNU zlgw$ASz&jrx^KDJlB|d0hfdNJJYgOi8qLo*l)mSr!J_ms#i@j_Qc<cB6Y5}UTPT#} zA!)rf#8!BAYAa!%EZ-NDmUkY}VAbYmE-hodXPX|upseSakPH@?e{z^)6;m!t2|2P< z&XJ>$DkGv3!jzXSIO`P^a}~2H<SXXDn5&$$Vr~qjX?POzt_f$-OsL4`nLJ9n$SeaL zvs!Mpu|~Yps_mDw-e`hlut@4<%0kAA3rfjg(UC%~VpjHGBAsIDLfC^U7t!NhLQP~- z2)&xfzP}mNh4hwvW_z(^og7L%RawFkg7DI={On0jDWogP=_v_1gqtqt(j)S8Xh}yo zJZD2eA0ADs{PeSf75UNS8Xx}zy(D)e=p<=J>1ZyB&k<7CMzxF@+A8c6wWL{2RY{Ud z+E-cBD)8iKEwWi4ik>1@c{@d}a!iU`wj4b}8=h4ZNtKkrd1O^Jm9z&tL7Mv%W40+u zm9;UZDorCwSp}7pE*p1AQA(trL>hc_rwl#vBj2@*Fgi~|McAF6ueQi>oLYqVcx%wI zwd-s+P%>;wHD$EKrkZTQ3#G;KVIAW!bfG63gnEL}s9=au#UdLUp}NK_$~9?8dOa5d zp1Oh`{UWJbLUe&#I**y4SDHE2R*m{nys@@U!eQ}(78<=QL_s-tBJCk{I+fW)wv{qB zgELZc_!FD6B71Df!L%xdI)?bdFSPQ@%Y=~TY^~0Zs#4&yv$6Q8SX#7NcCrGe2g_(R zVYNNYuZv(q3e4qn{hGo?(ga|Mo?oXhFY_}Q=(bILd=x2mfR<wBlF5ju`4PAZ<q0{> zi`6;iPL&Oep;epF%#EPuX*$-JZ;m$?)CzHWNg0n!WjbpkGxDisw<XyTl>*mMgZo<F zC7eMrEFNjWNp;i^b1rYT<X6CvfGn>3?HQSDk`=v~^g4EnYAKB$YwJ}UV{NTU0}BxM z>H!wWQ6lM(q7?86L9M<M^RO`4s9EPnla8A7JR?e$7BWpDI#u2a3G-W*NkC;T;DC}I zeF6~IS1OVr1k}_JcLnPKN}ApY4RKeeCZMK<IP6&uP%^rZ&=A*cY65C%h;x?p0NH4m zb{aBrZHF>)4eQ!fy^3OYrCyuEky@J6LK{J{-j^kXSW_xXXM$Muu@{LYqiVfsD2reM zxriE){%x-s%5o;EF;qm2;q8*4hh9Y_Lwgy-`NIMk#6`4LjeqpQt4BWu>7gFHrsRc^ z+;^K_inAD`C9Ri%-aTAI0=;3l2*WVB{<j!|%;+K7?W5x)IG$?`ix!)W3cmm=SBk*I z7Oo1XoT`|jffnfo2`(WbmhY{Psc|V!;<ghFZG?M#G^oXkcQnX(Id0)>7Zr8#<}w9! z_H|w=raDI6<zwm0lk^A_)^(iE|2+26=I6^ETFKY6hgLTH!imXoC}cgGN?X=J7m_@` zmSV_^K}>Z$4k6){4D3t@mFldMuBMtRT8=SFShN(=J?j{KTCVa_h;_=R;C0cTicBkT zVP=eMhm%YVvoz~vk<9Pru}CIq^H}J;RSI)3ges_~${L^+U8O-@Am0I8xT8&}cets( zHoaa|&M~$EBa2kTj3c~Lkd6E-;m|Cd@ne=8K;RqY^%NBST1X1pr>rW6PzTvH0>&}x zY6mA6)Ri6)K~{!|2WaD%J#zH5S{82?X-N?qqgsX}7}O%7U9&2uCNAAm*qFRwPf0A4 z8wG7N=&n=eiMfp5)2D#X;Gh$_Z8~eNU{2&9WtK}&tCJ}&v#Dw&p4HZORmmF@stOCI z#GO_Ohs1=MkhuRz50YFIrALWNi?j(<kcpDDUWJ>YE(WgDI*G1!M}mH^knXYpELQy| z!HelmZsSv=Py$}EIyFNX+0a%Nc`@BJvSC7Z+)-A<RLPpy4Bcg8WLe~rjhtEJI4-r2 z?!`Pw?iMQsUrc?~7)OT1>OqbnIs`$^3uN6j)nquMj~53;ccJH7P9+eI@Hn`>cqGeJ zm~Lp*uvtZ3b#JUUXZK3CCQA5ZDN5~1ODiF$ts_J<W(*tL_AC4iy*LY~YqOG-9?W{| zI9<Zn%}N!g&2}m+G=<eN@cCD)31HZw?qt$m+P-A#)ay00-S<>#ovBsHS+GNFkvjIm z;YuqFLLm>5!6R0$<vTK30v~4Fm`Rokd)T7<9`hFvn!&9lowhD}HP?`w!>N?Ix!Rc3 zNe7|-iYz2OpoXO|GBe9)QFn-3o}{n@OuRpL^02%|M-xmW*MJt9)RNKENPUt!WyPGT zfH_=sCdM?2c*UQ>32dpXVql93M@sN*V1j81^pIz0RG&v(sOcKttb40zom9<VcR3Vs zGPCoK&|{QzBy&RAV5f)?og`lfgwp1El1>H4mjltBTT9YSqNo^-;dZMjqu~`rJ<ov? zOW&kLFN1;Jbe5l!LJqEbRK%qN1-VSpHdr2)tOV!r$VxNiL1|{`rZAlr9h4-xdtgG^ z$)&hG^r}phWRP}wGX%){HW>`+@|09a-T}!Fpe|oY0rGY^6~NEWQL7#ks=Q8@Uyd}p z<j6Qh4k(`UdpOkDKFyLp70W8e9(t9*X$DFEocg?nUMZkDiwQ=IPe%2z%C9{PDiH;W zp-8F?t1f&ItVX$uXw~^vB-PedUC<&}jWQ;VB8=8nYO+HvSQZpHG%Ch4xysH2y*g#m z<b~kXDU^WMs1p<P>Xb^8>uEos>lQ+&390J}(lFD6)HQ!XnoWn}l?=4<Ry8*{Jvy{K z1KYV36X(fV$ev$cW-w_Hi;FC^8B~O<N!nv^ev^}FFOC?^)mk{bM&YAg21)-jmJxP% zk$AdN(kxnXdK{o(P7e=e0;`q$lh~M5;T{~l?1)Z4j~G?jpzF&ovhL2{#6R4^RFw{6 zF}*Ul_&`rz%#t!6$>mE8r#h8|st&zaoOS3i2+I9Hovuh)I3i}?E>JF*k8I%#F@mht zOLIw<r!!I<0i2%URampF#(R-uRkv)UjtQ8kbY>T$KAWT?l|`<qYbGk)cD1Mh7{Kf< z73Si}AX$>i42bCRKTQcj$>P!!ohG1UnP>tK_Y^Bqnwuh7!I=QWt;2eNe5qtX^8MNh zhf6UFDpU|33o(mXfQ6XF7>be?RcKh>rE%@kmR3J>%7cF^=<SxOMc>1egAC?z%8A-? zwT=%=epaF!bO9l~6e+)-%COm{J+=jf%aG(#29B>TCJaOaR`T}+<%=0o7{QuKDZ?cn zW2#(y6BON|r?Mp`SGEsQ@G8fmB~egyd<fYUC(_||=1<Vl>r3=Vxgy9%=>99b4&;>H zs$F!EMkzj7Q-L~@eEE4Us?OHhSoyq}ob4=W+J<amcWhi%ZBT}26PRY{DdMis=1L1E zxsxNs74GHq(RZ*Qxhg-W;8mG4O<oYbps~sfky1ypet_k<9{OVX%NiFn<0SE=AG9p` zV&0c+E66fevVtd@yr6RmdS5z%k)@EVC6?h$Y5OCKzL@uAdo(h&FP8UZi;yzm3wmEV z*pnqd)@;r2rnIq@MPJPOvRyuz+86V_Y+Y0)d_nKa$Hg+-qtV9C=aTgj^SR`$Ss7nR zc}25K)GsL|uW0qaq!lgooJ-!7$n~Xsb6QqL4CR&crF?H&zPxhMik4w!8@AIa+i%Iw zaKu+CpD22DxoHPJrM$^1F1Kp)o)JGeC4cgg`F{!xUrgm_byhg7UQZ=Stort|cDPmt zVOO-XnGPVTI%KK+&6-W{L<3(oszehkMXfS6L9T2Brl<>nE892;aCIG)AXk3EQ`Cht zSFM(1xi=v}y;_zt@xykt@_cwQFVFO<W<{D@Vl!Q~MTS=Bx-Cq_N>|biQ*v=u1?xPq zUT=;pN(|Q+=6B{I?s&H3{{p{k>P4;rOUSjbr58y{tDa%%(5Lz9)#4=SVP-Q!x)2zL z2oF+fF4boFsuQ+kQr2gsE(J5arx3fg$wn|7#HGq}+p0^=*6PMe3n$1)J`WTf*^+Nt zlI*%<j)+MmyDihCl3kX=beRb$AUsLw$$R-(oRSMWm!;?KF>rwzL#R3oSZGg+s~-7i zb*8(3d#c-*=o+ci>ob+vy$S;oEVyR5)vOobK#s!!9V&)edzno8kQPF>BN@u29>w8f zA~otk#l$S-64nSuvrCdb6Xiip7Oj^Z$;FZn44HBy1t1iZDl)P)k&!HRbl`Yprm9L3 zD8`5<IxS6l-o~VQ%~xin^P-^<oCh;z^x!c1iBhCJG)r-*r#f@Qg^cCI$|sp~M9Qi* z$}-l##qjhv8&-R26zMdJUdfKRgdC{wear(HW!O-|%1`uWSv8hJs^spB4i8;&DYh=O zN_h^K?1M{_DdLM;BgN#U`IHj%%Wk29JJDRGRn``)H^{#sl_d+g<4v2G^@sSUmu`U~ zA42JTKJ_e8oaKD^=47Uk_{FA4(w6TrPIKw)8;H0_`<Aqi6~#ns)9V>6a;Ro-sFy^B zvBDhV1vt0?ss)q7^ju>?%u=sSTEh8$N>eKmJ0cf*8j^l<M9<gw>X0HYk@VFe6`ONP zdfMny?VM-sqpdmUp{Vbubs?>?dc<KW9hf%VAlDb{Sgtm<jE~o5TC#b}h-Fu!UYuzG zjT)RxPtIZ5FgFK}=DR2q1fnV~KquS(raIl3T!zU_+cu4!L%%#btF0x>#&()5a_VpD z(H2ISm;cyXb_~Y0N^5VGVu*1$z}WVko5pd90?#r;fjBleN?+&5&R`{bt~gRbPI@Xb zXO)ZHzMB-yI?^Kga-r2j+rd<OTvJi&{dk5v+jr+!(=Tl9S5FtX=QGN!>|5h}U=5vx ze1YaFEzMgi#Qhp-C3$(QKW<(LmH`=S3)-WZUYo<V*kV>-1t6<gnf!7f+bVmjf+pLW zI8~^OGAW$$APJlLQYV2_PNC%RKJzo#^j0jP@=#Wa!SIC{Wwq#Gmx>qHv2U1Lq2r09 zLZg?i@Bt#3`cnS5-!Fl{CoFm9AQfL-s5N@t6h*<p>tYyuXoqM(4pg88hW7>~vgryg z)@q|Gq9{A&VOsRXTtQBThHYna?NY3?B`D>@CVF0Gh^FML#iJ5UH=$RJi*=f<HsK*L ze6ZWv45-CH&rXSta>cwXXC?(^^4E&;lhzVO)95TgQQgaH9dQ=W7tSiDEEpqs1^g?r z$<^GyT(8a6IznfWWC)TzqzS~jk8;7;2<#h6_PL{7Ro!2e<={=(5Xi;i(OHtrNzXZ; znZHU-o}f`#hKT4l*BZ6<B8}?6V+E!@Hhf5lrT&jJ!9i%`um&A1rZ}(;?M@sXq6Egl ze)MF%R&xPs4te_XuOAuJn~SpGoUDkV&!LMW%~2URnaT{y@{~5nyv&Vc3FZv#unNT? zyyuKKO3a|VPn$t05wWG(#469$Dz}h!W%<8ZuX>yu10w@i?uxv~bv%lTp`&!e*8RRA zunxTp1{qYY_p3+>q>w6E?ijA=o0836z!#YS-F`Lb*9Yw}tYPcR3qUBNL@F&yBt;KG zaXZowC6c2TqF*)2B}q~bokU?n(cvvuyn{gw@R4VSOg4I!h&CTD3gKFHd6#U<a#s-9 z%c`$#idWGUl*;YL-of(r64tWzVjZ=#>npRD@|G1mR9-G&EiJYWd$H=dyx`&T_7c{z z_M#RpoxYS;UvQa%EASK-RLHbYQn57TT!jj!z*E?!V#P6(RLZ781&~WBR`NooGU-&X ztZ`9=3YoxDIGu_Wt5A|Eowj08S3IgjE;$%llzcvW$%nPc!#j?(8EDT1y>51Gb~(1e za%}oeNGPfA40cYGzL@0Ay!w2_-4}A`doJWCu9d#OSm#q;Cq}QY5u-1v4;yh@ubs!3 z6vkE57RFW7BF0tDuJ-yxSuK^Q3q;G>gC+TfO7aaC<=a!OEi86q$+ly5w%#QhcInX| zWN3xnV3d3;sVI|#@mOHuIqp|31c3>M1pjIwZj2TtxQj~1P)>q>RoY)qlJY^k<U@IH zJxNOd#@fke66>P@9yV{nmRu1G-t}USBdWH1Kq{isMUz`r6izxiiStz!*{C1ZZV?N~ z%o2Gh^-d4ZO0~7QR>#0tXE9n-UK*h=BbIhF_g4E89%B>{&yQe$*|MV8<79I7L2({j zHq*hPXf(3GUo2J0II6%bEqWQ+a^|HaEORJmC}(Z9N->UB+KY4>Op!$4#*SAT3&rv= zXWWJn?Ak1ysVpIuahLH@RIp2>ZNyzFai^9mv#0?|*o)>{+3d(zi|I=jpf5M;<VMh< zMF{6yfTf6y;Aqww*uWCjZl##Z)h%LyEh3ij6)&rduV_JKT&Vx)$^f!5u&A!3$~X~= z9wBmGQE^-9tILap3pbHRISUnR!WETE+0+~%OniouoU(SboK-e2qu?wol;4X@Gs2Gf zd9vm+e`R5&aN+ju;;gNL^%v0q%V)65sPJbkVl7izSglvcK2is5s5cu6L~s$#(4qab z%~BX8#K-ktsm38!AVw*oLbUa<sOwlKk8nwgd~JWVPImFo8ih2V>D7}HiN`X16NI#j zk$56wCAng1xmD{_DIbYOm5sFAOBtobzJ-<Cjm~bY6K(G5)apboSw&1Aj8<205sXaX z4DL-09H!X9$6SDr`a1)IAB9fW!E1^qilenhg(~JMCIpEIHeE-FOsetJJYk9+VM;}g zLRZa?b}Mz#cq!l*k^QXds&uha`d%MmZ2B2pG9{Ityc;MBL&_d4^x4n~uZeF@suvLR z&O8xEGBJ<pNlKi(C(p2vcBI$G7A0vjgsWdr_bI+^S*xAoE$f&gI{!`2cCyo?kh3PM z7j&_5D@+m%Cro06Z5yY>;p04m(;QoEy4gF7(Q`GTs!rNl$_7HwUkfafb3&Z42KFjT z{MVz1$h@Q5>4Q7=L|OSUf~-=Lnh-(AzC4-;g_Xd<$4Y-GA>;^}l94&Zau-R|TqtRA z%yf+a#j?oSsFlJhrB|=Z`_oN=C)JOwsbM3lq+;SJkQ$*?eRp$E#?Yo%sJ2RS)5WH1 zpvYL8frRy^q?BjbG1e9oDTzTg)-WaXHp67;5o7eBgkVa4ng~E8)#0BpK2=WgNWp~Z z1&~#ISuQOvTi}!lMPHTdn&n$<NZCq0kyy+Lh4sUno$gy16t8p(mmrr$OKkM+2aOoJ zw)$lwma#NKT6=2~h%((;sq5Tnvy3#Jqi*)*YITkrBU2b9@8XZ*KxE5MTG7HNXsq{u z$eQgv#MCtz_ahY6B>R?v!Z4`ivhFP?f<p>0I|ynw_Ls{$Bt8Bh%ybgG=S@)+NPc4< zBXSBsd2ZzxWsj!RhDf?<5IK__lkh#yi<*FDVPDAr{vI7lrYN8|Ct0{n4h1M`OphjP z%}JrMM!ziSBG2`b0r6!gtyX1~CMM0`^*XVn%1$AZSd+y}2mjJ9iej{?<%AcP+rhBH z3~%I~JUmmwF%oQC42N`8_p^i;SB#HwsajB~hO`Vzd^f&c-r5pr)8>iqD2}ZCBNEGj z6z#uaKx?9sVhOOeMykd7`ao;tBjqxFZIu*DiVNYaNutqJ#Oewov$ToYjw_cVi`3Gr ztyrR52xm=vq*}_XuhE*-N9@EUWxBCe3+a2+s&niELz@(IPbNQ2N7bre*5x44)j|C! zvuSRjy18Ci=no}at=%6AS{FQPl9VEMxs-MB7}>VnpE7LCb$=Mib=du3p@U7Aw)cl3 z7M8U`;)j-%O)aLBraF8Wg%qSs`>V4!F_b@1N*6eh(|9Zz#+2?3XBx@@q(jG90B8!& z?q$cfOUFF3c-b@7Wa9@-s|!m~e-Wav@gj3!!$sy|mZuX<x{IEP5sdEPmaWlIa<_3W zK#@F`mfpq<0Y&(Q>{5hHboP4Lp#wbzCpZhaD#5AlkqJp8at@Z(cCfUzgQc|{Dy{8M zX>Er}Yg??~h^aDMTHE3B+IDBkW_eyY_RTIiD2{n2Clj~V7po;iSGU&}t09uS?LxIn zf){s?lyz7e_jZ-%?L%kW7ExL*?lLLQ+lS5tzaWV;D){wC^2&84>%B%Q%VY+kXW18j zu3Y^^*IK1OlB>TGNYbhyLmv!3?iEFp(ub}j>l=k%b5k0Jb_vN5b0UH)I|}ZgycnSt zS+RHs*MRfs+x!)|B1=9DpVlj&4o191=mMN%a9Oa8*&#300y(iE6G2|Kbr9rjR5?N+ zUeWvljuY9K*ED-IDb*!7g`6nCk+@?I@^N!td&8ccTgFE!I61#PQLVPfZL8Cbu|}=K z&Y;XWyOuMPbLudMJ+`!5uaZ;2=oH2DLbbDXbfhfjmhs6_ybX4ja2c_UQLLY9HS_MK zl^WX^YmanWEf`-)GFi6K4?nLBIRsCSQkvkTxT$@WWilev!V!<<FaW@6!n{+cxi87J zBK68@GRLX%3}>3I%$?tDcNo%Sb+)r<zg*dnZ?;}TGVN?m&0-Fyq0O@l=i-huP5NeI z1=Bk_o9saDNgS!K$w;rY9-D1yDmGW0XC6R9cveru9LwbeWHfofDB=N>{tYXYTD>w; zuX4|CYeKZ1j^G}l$wU%XpM{k`L0nPREfwrj(N8U?she8~X|=t#(_CihrLEa$y&i7p z(B{FQUUdPtQ8eZX3Y%KRg5V{-yHZ;m6EaS=&U7>j2;9NA^b?rZ>_svmXDQ-@@FP%& zXA1^4XXyL_n%9+?TD{i6&V4=qHNcE+0y)P(lOe3^Szn<TlWuk;XM-chvig}6Tx~J! z#mcfSH9j`HKcWdw7-%&-(QL!V+AafM!J^#&3#+^fWjJu{taa+z4%k=29bCoT%tj@f z-F9`;in7hY;intBmglhMLeJIMf`rL4dTE(1LuYeywyT-z+c=Q6R3!z*64gz_g?yuJ z4wIw*VQnuq_vus{*zPmathDB)QSvvmadQP8V7G-TWkj}898_o#K{yh6cdgaI<|fFK zyDd^~XLCb)ww8Cx8*@)vpvFAytg?EE=xc3`uzjaoA6^~DElaw7l3xq6v&ml<#L($l z^a$o{r-Guw<>=$hwxa#hBanX{For-E*=}w%m&%!ox{Ncj883wiVYd;@YUE{|eq)?E zBa6)@ZuBL)GTDTrrY!RD+&ZUd_{L%g^}a^lWu821MdYY7v^8QoOIoYb>@Xr8r5#~X zcK%=a8(U~J$tJmh3SAsCaMau>;XmuxOE%E1U05CHG@AqMCERpr7|qtg3H5#FFVs&M z-*e`caWbxH)SC;&y7BWXE0q)KmBzveBa4;R6xqCnv&>IDX1B5Km@^aaF}4DU<c(pR zhQrr8j}md`mzr}!Cv4ufV|3I0+3GTF6BtH}KG|(_YD-n|C2&%DrQWLF$M{S;lD_MX zId3ERC4URm&c@Xant=Q-rpLCR9rJ8e%BEHe{Ym;4zZdY%+nBJK5XO4*wJC5Y5wdRV z80OJNt$6~G%wC^L!SNqfCgT_3^X=VwePFg;!TnP7ZyW9bC&@e4!ZlK@f%fXsOp^$R z<;Lkq7{qi8)9GA1hyB=~x>BoSXV2WmW)oLoGzdMlGpQqa4Bus|U%?hr+_=@KuQG!u zG5!<l!)KcIv?|NXxX70O5&2{TcK9UeAKFr<zF7{Nk(_TcdaTts<lq5xpy=kvfqis< zj5+DfAwDYgS*+?5Ypj8J#=GvQxnm4cb;gxh;*~K5kV<`dv4UUn?>Xe!MgDK}z8bSA zBjh>xW0xtkqxdX2n26nzKvOKF!v^o^N_YP>>x9JgmDyRmnOR;27L`lmOgc#?vi-B# zGz{`@@;8sW$~wpZ)62wrdC#YDj?Lcc9Ox;=<d!JkBVCTC<^A|3Zb@6HAJ5yK$D=lA z?we}PclK3URd$0Kkr(@W9&R4kFu8GHnfPsBp59`N`UU@wysoB4b9!+AqmBdAso*^h zzOUCwmL~fpNWxM);tS#x>XV$bAo``#qhCMA_Ri8TUcy?)!>!Ntxq(Kr0|QtNOHyDY z0GSuJZ=lgXKr_R@a;rL9qrFG)C*IR!mb~Z2i4+Nb=0ldH1R~<IqUlTvLzt+<JY-DV zyFtz*Alb+eyUo=6c6WKXiS^O+Eumn4vHxg(N#qsXv?u8v`x!f*=io^?fK9T;Tz6?{ zl^1%$*p4q5(}XBLuxHEoH1g;)l{?MyD9uATbW8DtC`|thy6wBC1+wYcCMsUs6rD?- zmOo9)ES$#G+c}m{kG<yZ%d%(F**lXAtZ*y&h#vFtWf#+JQVnF-N9ZsvK8Fhe$s_@0 zH=&HGUR$gBC{Abg1xzKcQ2+4vtZG8-PZTEA2G1JYfz!scQ8)G(=Nk+7oi=8TrqM7u zM%CDl|B`s!s2FYhZyL`l#uDC;zp{MscaGJkCx}A@z+E?nKeQ5h+eO**o5`3Usa5CL z$POA$w2?x}^uF3$^c`BHhi|fPMp#eIx2hKqTgYEr4$(*s!3GH0z`CRAbH^Od$XGdR z9Nihf2YCP$8V1}4Mn?`8_{j^>sH;`#sPo9-CIbs(5S9U?<OuJNHy#5Ln!X|aEF1of z)PZW`Th?YOQNSL5@-{yX@2G}@aPVnQyDQd%e8|Yom4Q0uNamZQSrY0&D=z+)wVVcy zYO{~mESV(Tv>#u0Qd6g|_C!6iYkYhFrGvd6XwxPySmXSgjmuJbXz=(s(%MeaSLOzI zZm#pYN|DAmOM!OJ!j9b}`*cg5Lvc<#I)buH-AHiqp7ZW!k_Ys8&w2kisSxP%p3~(6 zNos0W-gBa7+!SLy+1d)XgxgW{{k(!-eBaZxC88lW@3}ZoA^JP-d8)h5SYm&N!vN89 z(llk?bmj~C0`$4hh1o!SE28ulX9>mU@OSSk=I6}kbn26Re=*WZW>6!mX}YT3LmuZN zT?L*;nY_&BEdTQ<Qs#noBoTb7_sQinYy}KiM??R>uX<0?kxtb|i)X+IzP#r&Uvo>i z)}gdG-%H*{xQUfN972?v^FC=$f+#YZ=&wtcyM~B35ICy$)F0wnhm;>x?|FI2Mu2?j z`>+AX3J}^g3uF$$Fv90cn8%-<W!V^SD`E3BdY@_#hR?+YrP%VK?<Fm|h@UAG=^^3~ zzlL<_h8THH8h~vSax^{Z-H0JQ8m63_b_9gh8^ep=^L8D`XFC|t!R$vUucv`X!0{K# zRlOJO;Jr@KJ&_!=EbvXH7T_xy>6hEECi0;_`cCAiwdobIBq!7h&uM&mmQS$Z1@Z;z zndk%FW@8;uwO8_eRPE&O$M55IK-B(Nq_-gxrSX^XespZ(KpP2y40^nQlY2Hb$W%Nd zPsA}cLTj(^myo2$d*Z-DOEd-);~`G?%kUE9z)Qx#Kh|a%(jt?N1B-SE!e5bm-7#ap zi`hvW{7A2O;3*vsal+peIq(wf9FK34f<X)~jsu4@p~*NL{iXczYlbJp89%+$gRpTt z76-;=@+|x%|E72`c~6|-jW)YHiPLdljdD!-OYvfIh9|@m_N|2aaRU%vH+Ck?G~usk zFJ33?C2_%C677kHIN@(>FC`c3WpUBI7@rwH;vr7>E7(f`(s70tkG-bj@SiYZ%||+^ zob2ZmKZaxa3vq@Y4*;j*ls|sW_=Py=k>SJs0zXTT`8D%--Z*XE^Bj2SkqOV!lQaQ# z<C5TNPdrNwDJXf*nf(zQw?B@<{&6xqi&N`rfFbe{@vsjU{-$07FF`KylkQwkeBIb) zp5NJT%umS$JQf%9ndkX46iDM?z6^f_Jf1%j<f1-9M1p`%<Irz2(JcIp@#t$oKNbf+ zD!5Qajo>BX$nU-NSxnB-Lx?B&=Tms|QC$|+X$f&KC>>AXQJ?U15%i?4>?!MnE{V6& z6Q}r%sb;q|OUFOb@i1M&UxFu)Q#>)A;2-4mTS$O-mOsPSp}t}qc<iX2SVclc{Mz$8 z)G_>JcuBG}TN(!{(!Z?dVHpa4HSx#VO!p8sio+L)Z#lz@UQ>Ef&j{?qZWg7bo%$h) zLoeEb34a-0^qS)(;}IS!t}#C1z@dda{1x#yIntluh4C1VWmPc_9Qv^ge-n5-XGeHE z9`Uo{8tcd7L^oRCsdY?eF&^S^@<`t>4t$iO*eB^Y@M#4Q{-(%Td5YPIei0t=Njgq& zHsg8tn<5wSs7n+4@JTujoP<wBJmSK19Q;h%2`o2ec!_vecEaBjdE`IN9;XLAH)^FP z9^!<*5ncsLwje(pkMzTZ(95EJJRahNzac+=9pQ!X2ye1V<}Zm$=wH_J5HtKGgdu*& zo{mR2#37(h$5F<26P)lj<mcoOei)DWiGxHu77ua4-w2Prj`4Ur!Xpk5_2cmnC;ScZ z`0EHSj7NCPA+fzY9^!<*As&An;e~PF;e$d3kFoNT>6eIyX%YUW$bpw2C;G$>qVEsK z&-?zw;<NDB2SlJD=?OVK&qE!<UqY8AOUKhVJ>Q>Lby{bT%tY!AnyK{g!xdCS9in#> zM;c{*f0#&04*etYke|IKr_eLJM4Z$|f_g;PM7&Z@kOMy%r|H*W&&Ve(9VfPv23hz^ zl3O6B=_kfT{<uD7_#{qndg|l&wTKti$E?1@=vtRAF5&q$^Et7fBv$wvmWLEO<YclF z`+Hxoe4Y6mauRKTEOwZ!mba^MfoNf*N9uWKSNI#sOOZwL($8~n!(tHIpJb%(Av2K| zM7xsYvAyZ%kdFZv4A#w7$>MH0cSLZqo`-c>_{-!a+0$?Yr@4&nV6DxS*-p61iQ%W8 zuVY;*BmCv~39>X?jK8~znXy`jFR{yd9^!_-3H&5G(u=E|dJf#Mw==}cXChAWAIX5> zZ;Bka336V(!)LV>q7(Up9HD>1o`>~n_)F;0Wa&6?SUI8EQrtwG>KRw3Om88cVvq7M zhl}$kS3Q!4IIt6CpXtlQhn9x;VI2HI?L+mA;=s#jk4LWwJoHP(BfPl%%m}pG&k6Df zUuZvbfh_4FdFYa6+n*qh@K_I4us81CFb2d)TJgFxN}<qRP9EWf@kpOI{kcJmf?zUK z>b{KhPmo9WLi%(4QugPje}X*16VgBNL4*E@IP^`_d8yaHOOW$&6w6HDLFIHBiTuQ( zbX??Lqwi^?Fv$Z6e7Sx!%Lw|>IQXZQaVYSPd6Y9Oa8Ad=x-a}qk;C2uJK>*&g3*X& zI==4Aa6mM<m@`~(s(PP-hx~-NP<}Mv%;iUM;E$0?Cj4dm(QA$u#|b}K48i6KslOBP zb!TGHG5*5e6gj~Y*{Oabbu3xufCOKR1BbOS`ETkq!4t_D9-YJDQ@pHLW<FncCQ~;2 zC8Pu|gFW{-(YJSEo%to}IqVrDa>Cynb|No}o!UV*(qKbT!a$-&`Z;9m=CbH7`F92x zd7S&4;3EGfr^P{^_nfXdM;6Fo%Y7c=vGoh>FndLE($8UAI-e0W(`2E%p65i~RJV<s zJlEsL^z$4)rpZD-W<DqK_(Gf>dFkgl^3r6Xyv*m^pV3T5Iu04>d<g$V<lJv@obYGO zSmZq?Wr`Hs@HdB@$jO2Y(><ODq1HzEF7cemAjX8hgcP{Mo@k;Y9VdG8B^bT+5u2_~ zJSX+z7}-z3e{<N0+$>mX4}Z~HUom-!=SZKPdM|@ake6T=<zb^*3p4rbPp~_Bo|E6W zx{NHgi^UT-7#T{()0iSZ8AwXUMSkq@uZKH6vYsQISv!vZ63YZUkv;c0a52uap}QYj zjBz^rCX64=cBbmh4&4nv^I7iuu>TPLGWogW)bR>&#D6&etSc*fziy0|W&XQH`mph- z92Y?!>HE+(;je-m=_G|C{>dj`;~CQT>v$tQ{FT8m|K-Dx_t0moo#7kuj{M2qBfT=m z&9dO~!~j2ooX$UHK8M|jzE2K2(jk+b*pu}FEo}BDdk@(e{n%`{JTck$bbd4gh|H5F z`?{I9=z!!s&ylCFm-Rxm?FD(Zd^!(;?^lLttlLS_BlkVzv+p7QB`G8!rwOQfpD&NO zMD{-0A35rC59jK`-{;DsqpZCC&hj7L6aQ?6)#0zqKO8RCf8qOleH8vd9w_1;mc#PX zGkj0=X|T^)JTDT*!+JUVCH@x3sl8%6fye6Gm;v$hH%J4IRj{#2G#^4v&+|~n@Ry}m zk}S=Z#$jJknlBQJ<T=R)yM<p(e6(9>tAUWS`ku%0>UV)0{!OqGe)c*p-%%X;CF*Xb zU-X*FPq7PlQU2o$dHF4Roy3dF8zbNuKGGL)=$A3Bm>`F}$#~44(l56>aDJ{&gcs{a z+WRy?hzo(Ah?6v?eFXlSdd<pr%%0?jj07Iyz)O77L_DHWIxg}P7pCJxzs-0a{tEom z<LP*UKcye310?#<Dni5~`ck|GcJE*xYg}K%@v!WLzl2{Pr}m2R1YT5MaJ;<wA{Lj0 z$I7ih1GS0XJ<mfO!(T#|CQHZDI6d`6tU67j-M}PiMSjU&8ZR9O{#ct~P<k<*S6>L^ zz)!FfyV>iwzKG(`E2F-MUUPku@feTf2I^N%kXK(suakI;J=TxrUI7nr=$BDnFg#8U zdz0}<KmLIe<LSIk6pHw{KIu64Q9p1Sn7xTON!y<KA|?lZf}E9~5DzjF_=u-<6#0pY z>A1*Ge3Fh6{Wjxy_$%;J7pCJ0{*->X^#xCYlzub?lKcN=>nDti^Kq>aEUYJ6#GxF~ zuXnX?<^cs^L1K&X!}F5F^9h<5tD|yo=EIJe^U+<W17BS-D;mpO$HzQ1a4=lDfNi(E zyhQIbf8Kcu8Gc}gU7b~JH835#?mVfvMwQ(GA)Lby*+~ziinW6;*{}yuuSdTOJ#cPB zqcbl8fG;CGsO!`A&SLw}0#AlEj(DWU+2PTKiHY$|z*)ee*N6b`J9Eu$Cw!UtzS?RD z@8f+IKpN;QRtL_+$*I`Dito>SWj5SiA?(Kp>E>`@BH2&e?uvvl9%iv|JOKbR36p-p zaVppvGFqMKF0fmMLvJ0qm2L`Yk@7V*)|-dJ?5aoyg1>E4g)f0u<Da#4lH&Jhjzqv; zQT@k_J;s^F7Gs>T3;xeM#{+apdNxzYj;}dwV9-d$hm~<0R>{u?O`i1;r*E`xC$TRF zn=Ua&fn!B+E*a;f7Q}pPXH$CLdd~Y<Hen#{2O>MtI5&Sg!1t#SL7OHgcTAo#5W`_Z z6e^}_NR!(BF8EbbFTT~3CyT&O$_0Ok9pSz2IX)}k12c4`oM;z+A6d*0Vnb%gxen|w z2Z1JjpX47{7w%YN&%>Q$$8g1BJ{)gI+{0&PdiAFM?(uZIf1K2l{BW7p>cC!pHdOpR z$|s@8R0MyIwMmR=07vs;n}x8C9tlUzUgBIaUf%QhDh?i`6;1;uzN}RFo^x(c%rB?g ziR?mZwWE(}A5B=<`2u7LV#7ENhKioY{=)$?Y+pJE_`Y=P&&QED^e-Q8M1==}UcB3` zcP=s+H2rTFH^qnd5D0SqY2mrZl0z0fCiEoy@8AD=;D0?(-UEYI{NSOle28J(_}GE3 z&VTK{|Lwj4XU8Cff22$vj1ZPLoB!Lv?;!{-!d($OggYVl2zNmU_%C@z;^dSL^6mhH z@EyS=yyW-p2t)>{D#)_~5$?$Yd44zod43WCiErR>@?j(K2?WA3i9qP4`0pP468v)z zh-|VDle}L-7(l?3qj7(P76Q?g*g@zoLLfRnmH%FhU-JGE1oHlA2n6TF2*)72j>q4C zU!u>I2t?kS5eVG}5Qu&^A&~dqL?G`Efm4WoLZ5|I<(z5KdX><UzlVR3#fk68U%=x; zC-V2LFR=GSXYzLjkB4{xj}slp-?u)`=!uWX-!(jbFBUZ};&GD3<ZmmF-<L&=0Uke; z$A57H!@D1kU&G_Xx8(0xJboC98jC#sKpr=Ee1OMq_#DGKoX2mzp2d&g@e_G`KaUUa zIA5k}+=It2<nIk0|2L2S<2r`-UmpKO82>N(yC`&I$lvGhZ9Khh=D%q;GxZ=HPrdH> zR`yF@l)tDxMe)=0>3CZH|F7}-3d_f9^-FR;spCmq{d$BoE(So9{oNz?k8us;{>f1P z=e(=T%;LU@g~i(Wd+SS$=JExtcBi|tZ~rQ<#x`sm8Qrvb%hs_o&l=yheaFP3C#QDq z+P&xObLhH(|2cNbG|kNd{8N^j1qNiO|6||%56=>>zmoM2P0OK8mn%`ZJpSU<ix1}s z@}?iKf4t!;_WRV!Z=;{+GoE}A{e27QKlR4%ym5fjr+=P$2YYe`|9!tE{RU2dE$F{| z#ZRs{)c8N`oeOYORi1}$j}g#8ZJaO$M5dJhQ3JGy5)7DDK!WmUUPI&|%}e788x0x| zv3ZCn0U7~8o;R34On0DBkcbTQKmuV5&_FPem#qW|!(*Gr3P_Os{(Vl^9d~Q1+^O2F ztuj@g-;cxpo<8@Sb8p{nC_J{jYWculc5htoe?oTjh+aJK_B!y)0h=-8zzYXj|L6LB z6-UCC4da0c>c}a3)cyHq?yFMV@fSz@Z@sUDKl#Vc>Ax6;@qhjMG7taVTv!YK>+ySb ztNFE-DSP*8`&4~IpLb2)HNURemn?tur>37tdcAbB5iVE#9n!AQF4GQamui=22ek{e z1KOsxS9^+frgnz5Tl*#LbnOw^F6}|uY1)0Yo!Z^BQ?(u1cI|lWM%p#~$Le3#)sE4= z^tGCgh;~>zq+Oz2q+O_OYJ0VBiuuR&_UiSj`FAaA=HJlkzILlx&wti$>z|taB>O^M zvu1zPeBQeL`ZCVyYuDs+r+i*>fIJ|1@I<a@`FtcdHXFPR9zIY?Uy-xwdUy8G|DYdj z|C1kQr+@DFke)y5Dm8!deD@#6@ylP!eM)|6e7)BEo#T2gx$)ogPj#+m$Ktxzvvcch z*K_=Z+iSAt!v%k=$+nG~8mJtzdB>eI+epqnUApVeE&F;nY>}nw-1p}d6fb$+5gL58 z>9K}0dp0;Z*)jUV@_8L^y>Z69tCu=1Z#Fxfo_PDLiIcu?Y;M1Q#qMie|CG69pW~Hn z;j9y$9bGoe$$M<$J1_QY-fqT4cX<5c8xPMsa(T&>lN0iLb<F<Z^`oWd?rk+?VzW*O z);sbqt+F01F8Zm{$(3d2FP{AF$#L^`cOF@~efF&@R+$Zse*DBOBk!m?X5!Q_ukT3h zp7wa<$~o<lA1eIxbf4}kj}7inJUDs!(hmk)8@wWtZ436z&1ySz&(-MzrdKo_{NCk* z&*jg%biVoK<t2j;dq#EJv1q>S{onO=6*V2h`5HS*cb2N3D=DKp++6;#TmEw?Wx$B! zZ+p&|KkD|$|C+LOU*gCH->2QNe$UyI&}~hobh)#Ozj)=D6vv9spMPofjelu7^<>I} z9X38b?%4jho4-DuvgPX4T|=kTd!y7>nbNA;!0);jZJImphaD*&6!l3S(`jeyriH6h zjy$(vZoAF}jo0j+n-bq-+xHtcBtI~8`nZ&#{ht2ogf)G}-~Q#0l=3sJX4KmB!8`S@ zbV`X&$vx37xB1`S&bu$=Eq`|9#u4M62p#VC=<qjdl{V@7#^h_WCw7?q(<2SW4R6}< zfuO(r-S6#5n$%@}p>ef5`OvhqI(M$AIy!a54awW4bbh?{=O2w}d$8pr4~}lMx5>fQ zXS#X^v|I7+reOaAxsz5bU)TEk^iS)p?7ghh)9bB?O}kdMc(_f^KC5=U*mTy@F*(5_ zTi&`-wXN~e<I@K8pWS}5bMifLJ)Rml?CRuMt82}Dt6pV`Bg=N}Er~h2q9XdyMfP%I z<~bSUAz8jJm=Eiq49-J6E?7JCfS2Xs<)`MjN67Ns(Hrm~tc87W4y@F+g6{B=KCZCJ z@aRazum7>}l$!<a3X9>zf8Yxn$u|53Od)&lYKS{(F#@;|U*be-aAznBTMQ@OsM~}1 zm~OZ61<x=jq#tn^<dDTDU@kd=6JrhI0$IEe4w1zsl#<0qp<3#3R(->W`Gzs$M7|)C zY{!`(<MiONJD4-t!?-Rt&J42nK5&u6uR|(X{0+1ri%&s3IfDD}C6t`63(o{OUoXB0 zGCxK`)*9AQFCKZPVR*^nSHMGd<HmeBCG`&cEV${%jpyhbz+LZB{d@425aie(p2nss zC7ZbCpE&jibB^;s&eyOR#!pZ|jd8bOJlUN01hNyaO5pqtuy(jfB7YW3w&QzS@ctqh zf6SXwbbawD7*D%+VJrTOpDfOYG;#nZKFFBlSls&|)`{%Gx3)Em60#M43034EZjz+V z-Hx}mQ}Y?ZE!pt4gO;d$<ho>W5ma+*7$+w4|5Tt|+yk6sasBqJ7ukmUgN)yW-+~1v z*aJ8SvR+09<^&c~FAl&ovbY#B$RT_NO3C85N7=Vzabw6M+wdrmKHYdW$U2(%z7*Q2 zvEywzhwx+`!lQczS9WG^Qxm}rpHS^~JXmKhUera+m5Jv(#WB>IcoWELdAb?Ka*#fQ z_(zEDf$n@?4U)as2T~uvJ9UoW-}g}MHryU!4pD;-gUnkP|E#mo(=cox?IC;;q)+(* zyb;K;cHAGN#)T*7?7^naL3{wB$M#}ALF%12G>mnpAO5j*qd7>s8!yp0jBAfj?RMNl zXE*lh9K=nYH;h;r53T^Y)`Bk>#@C}5EA7r#3}cO(>zW+GCm}kX(fmF{=K=2m8AAkH zUsc(G2ZGeQaTZ9u?KQ)A6r$&jJvs;QS0MFaTn$q1&ER?jsSn|Z&ekz}Z$FW}PK^t{ z3sMun^(V2<<+bo;ko^<Hv6Hzr>EDLug4CF}4CL4_9x{dd5;ZPd3{n%q+umXACF7W> zs@{s*>g>Ryb@t$f?;1v583XPOUb1*KWRk__Af0SX<2?#;$W9#do?-aOR{S_rk;Tg( zL>5;=kZioq7(vGGz*SI9djz+d&X^BdqW*v!PZsZmSh6jPF@hZH!oC@7Q`!T#9HMiA zZ=b3A#~C_%ux%FatI`i%t8)-v06Et1^81iMjT=8RTg{;h&xah^#pfZ5EFSs+_fo0H z`$6VEjAQ4hK5h6_kahInVx7Zy!CZBJHt|J}>)n{gpO=B`Z4WL7X%FK*AF6g2UJudx z18zE>=K|g@#HnzK@rZMvf-L?7O332NP)Ifwa9xA+<HAQl_CN%8`AD@p@nW!3BQAn? zUQ2ugV##6LcA=_w<M|--Y2phY=WZ-AjAkJ14*V`iyBDw1?LmB8=Lo)Mv8uP@F%X?Y zT&!~l_gtd(zZ37)IgD#9RmZyU9Gy*k0ixqs#``45c-&&0O&kHK5!W|WjSV|>_TUXV z2k|+bjcl$RkYinV4n*exZ`V15YcDs9LCl-DHKdZoE=VGa-vv1~fN%X+?JFxDtFs4h z1$nIyzAHy%CmsuOtOwte%ljQQRy-5dlD)VHqVFjyc+HjE$9P=_eiLLrc=2(tert)k zSss@MHR4CXBlUPbNWF>Afz*pze8Ou{Bkl}2WG7w;QXjyz^Hsh038<h({0x+kU3fi6 zeGp#(>0kVqkNXBS;^*KL*^Rv*_v8S++s|I5-h&@5U~gA32D}>N`U>FAtGFjq<HS2a zo&zKJM_5d|xbA9hd1P@9$RLZyfQu}i3Qn>(2OMNafcpeQ->-3}HT)j!PQ39mo>9ml z{KvIwJZ>BSSyS;5kaG{?vFo^(Qt!cUey*-l51tG1JR{x?5o*NeAxyTf=ko?c_ax2& z*&AM5soR}}%n8W7D}bv(>Wwd0XIM-2;v*pKVcc?q%67aE<X97*(e2hRc_afFzYAwW z^t^C6$QZ)7)kfV99t$zld+-L3^9th||Dx)x_#vGg*sZgPPlNRD+{B!K^l#$RkanCk z#kXx%<FVqdAT>_>zRq5JLr`C9c#6(mycMKAgk%1yau|2mqR$;~2ibce{Nz@(mrVQ> zM32Qc6sc^*eL&9Fg|k5JvEp^mh%7z}b;(9C&p#mZ>BNN~a~{MOLGCBwd$zGRs1ZA% zlhot+AoFA5?GPOg{=;_FZo^KHb~m1{v#o?{1f<=GUj;cw502fT_Mr{;29tL2YM4eA zAB0SD82|onsvkQZsIv<%)Y-(}fs8YPTYsgp15ei3#M>b{eq66q*We70b`M^oa~SvA zsrIl7&jqOo<NJ20`M2YKAnh*f)mi+|Zmw0v<G?$ih#bPPAw6%{1F{z4UAjGl8}HFI zxGzZm5!`UE%62?VXEzRloV&Q?KGmlk&(=ABe+H?MFB>|7WG9}Zvx#f(SI1iMNRS#g zJ_>RzNATFM)%${pcY%y8gn!mq{zA!%Am`=ApMvxg#?30!KD6Wh5S=$XRp&6i^&8c0 z!`1@^3(I>D{sK<Xk2nN}$YT3J=9C)o=|hHLBS&!jVf|WoILO{};{uRtCxE{Oxh}%E z))AGh_<4}~yc@Uvmd}{<DSj+$7~RO?{?MN6!eb%2xA8Ka1330O)sGE#f#@}eXMv2_ zi&udh8^GltHP-LBE@8a%kM~1g<}-}DA640jM?v&;aW!O7Z>{9{1f<=LZ~1|G-oLE) zcgLAqYV3Fe$ooqKkE>GIgI9nYTZEHO@O)0a1GhZI9*|@4%Mi=DyK%GA>KqgBXJ^<O z)U3tjAnO~(TmD6zR}nr5(*G&^R7ACR!((+GkN1Mql;JBnSK}dPRlN(p1ybX|ea@*d zR9-X;+htWFPWp*?VLak7AZwb5hhJfizPA`7@aAgPksQQFK*pSKm1irE{>AA!i&ufH zQ2<v%Uyc<w{8`mE!d*dXy5V<po`#p|T!>G?AdWqSn_g4%pMcACuE4`A79*V+4?Ygk zXBECB#$qg>-HQ8wjB^m42~y+557e?4ernp_8*5vP5^^2f0V>E2+~Q{0Q>-ao1hO9% z<GmpBa0pxKT8wzwWAJ+*`!EYXbc=eeBz#w##ppzh4L=7mhIIS|*lFL0A8EiiD=bEP z{Aj$YcVItAySP<Tj-%d=*Xdj+ZpIwYF8&T=9V_wu&DCoqVq1d6$fG6^e-2gTLY#cB z>c1~;e;;c_yVwJAzT&^#&ze_Sj8gnmBF}48tQ|g~b4&}KFCqG#i`VmItDX8nT*Mc) z-N@q8ZP-)f2>$G0`X;Z%3)?cE<i$9g#NHu`$Fx)PoQW5M+$Y6*LB@6gH+V#?ZzH@5 zN;o!z`zEUzaVE%|iwoK_&SSg=J_FJo!J|8<oPj@nRIOtUe$B!4L45{(;W66DFX6@= zITx}Gr-6(|?A3WL9@bgS?Fc+kGOslSw|&B5j6X)dxVVeOm_{zaH>avG)W!9>a;~(; z;`>344dAm-O8W(T$CF$i<T%_0q{fB!bYqQv;P>#|-C0j^JdW$hbwCzpgREB$9_v&& zsTZGPLE8Pe8f2ead(%H;a%=`Z3etWGPw1o0(SwKgV@;_Ufo*?g{A6(eWY373Kh3>_ z_5^Gj$TcK2I2C04;w^*J9*%j&VhjXXqd|BN)IH9xaf2bM&qjE-&f{^`Q1&=AViRPX z;(JCg546YQz98-58%DBjw8!8XI(u=gXE_hr>)>Z!W{t?{_@hzmS@L4M`W3D-as~dg zTa70TmyBlJIA3uD<h;b^UbPrD+ArWAUsL%K-jkumP=@ozFxS-hF@IOgaF8?cd64(1 zI&WBvB_R9F#O0ZcllBUH|5!CwiTG8JbIic?$MHFanmF9=ZN^Sc!)Ks~9Ki!7aV&Wd zJ_gm~D!g|J=S4qdxY0YD7g@Xpq&;C8_tN)hBe%g3kg<vDOlK`<7pH)%qXYNN;`M14 z7tdf`$ss&`Ci6@d8?)5-#Vf#+8oX~FCYRyzMJiX|Jvpp}wBzIeulaY@8_$A7vKQC? zj5cyS9s+Vdap6TEYqS_|SVtQ*Vcha__A`CjaVq#(Yw-xEu2i0?vv`@#;$oe5<0_rS zG3(W_;=6Q?#~pMQ_tM#gC+aL-0x|~iX5B8X&{=#|XYoyis$Oi<S=?4<u@mH6e*5{A zGZ19Yb4Wt2JvS-WnVXht=H}%Fas&QCKMxquzb78Z=i3!C#^5p2sAI;N31*U+YNna# zW~MpKTwvyzg=UFaVOE)!%sSa|*$LT6*{RuS+3DGt*%jI0Y<o^pjw2^E$C;Cs<H||T zapz>_gz`e4q~&MkFUT*<ugH({*?mbqhcDIV^tpWLzD%FT=k+b{nZ7(<z*p!C`bvBu zUxhF1tMWyBmwbl5j^FB!^V|Fhe!D-(@9?Mko&Gex%b)Id`!oF>|1`hXzrb($^Zarq zL4S!q<gf6D{g?dKg17=(K|+DOAgRDnkXqm@NGnJ$aIQ*QWdzju2D5+V9R61R+YJ0R M1Ha9{|HB#hH(Cer!T<mO literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/platform_build/JLzma.jar b/etc/lwjgl-2.9.1/platform_build/JLzma.jar new file mode 100644 index 0000000000000000000000000000000000000000..c12c85b98cfb55bed7796c929f92a7f1c03fc8a9 GIT binary patch literal 35773 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/platform_build/Pack200Task.jar b/etc/lwjgl-2.9.1/platform_build/Pack200Task.jar new file mode 100644 index 0000000000000000000000000000000000000000..80422e416a2b38a34cb80b1bcd57a7fe235b7cc7 GIT binary patch literal 6969 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 WQv_b0)&KyE>ksYi>j~-2um1!556qwd literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/platform_build/bsd_ant/build.xml b/etc/lwjgl-2.9.1/platform_build/bsd_ant/build.xml new file mode 100644 index 0000000..eb53f8e --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/bsd_ant/build.xml @@ -0,0 +1,127 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, bsd" basedir="../../bin/lwjgl" default="compile"> + <property name="native" location="../../src/native"/> + <property name="libname32" value="liblwjgl.so"/> + <property name="libname64" value="liblwjgl64.so"/> + <property name="libs32" value="-L/usr/local/lib -lm -lX11 -lXext -lXcursor -lXrandr -pthread -L${java.home}/lib/i386 -ljawt" /> + <property name="libs64" value="-L/usr/local/lib -lm -lX11 -lXext -lXcursor -lXrandr -lXxf86vm -pthread -L${java.home}/lib/amd64 -ljawt" /> + <property name="cflags32" value="-O2 -Wall -c -fPIC -std=c99 -Wunused"/> + + <target name="clean"> + <delete> + <fileset dir="x32"/> + <fileset dir="x64"/> + <fileset dir="." includes="*.o"/> + <fileset dir="." includes="*.so"/> + </delete> + </target> + + <target name="compile"> + <exec executable="uname" outputproperty="hwplatform"> + <arg value="-m"/> + </exec> + <condition property="xf86vm_lib" value="-lXxf86vm" else="-Wl,-static,-lXxf86vm,-call_shared"> + <os name="SunOS" /> + </condition> + <condition property="cflags_pthread" value="-pthreads" else="-pthread"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags32" value="" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags64" value="-m64" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <and> + <os name="SunOS" /> + </and> + </condition> + <condition property="cflags64" value="-O2 -m64 -Wall -c -fPIC -std=c99 -Wunused" else="-O2 -Wall -c -fPIC -std=c99 -Wunused"> + <os name="SunOS" /> + </condition> + + <property name="linker_flags32" value="${version_script_flags32} -shared -O2 -Wall -o ${libname32} ${libs32} ${xf86vm_lib}"/> + <property name="linker_flags64" value="${version_script_flags64} -shared -O2 -Wall -o ${libname64} ${libs64} ${xf86vm_lib}"/> + + <condition property="build.32bit.only"> + <and> + <os name="FreeBSD"/> + <equals arg1="${hwplatform}" arg2="i386"/> + </and> + </condition> + + <!-- On freebsd, the 64 bit jre doesn't have the 32 bit libs --> + <condition property="build.64bit.only"> + <and> + <os name="FreeBSD"/> + <equals arg1="${hwplatform}" arg2="amd64"/> + </and> + </condition> + + <antcall target="compile32"/> + <antcall target="compile64"/> + </target> + + <target name="compile32" unless="build.64bit.only"> + <mkdir dir="x32"/> + <apply dir="x32" executable="cc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags32} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/freebsd"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/freebsd"/> + <arg value="-I/usr/local/include"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengl"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengl"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengl" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengl" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="cc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags32}"/> + <fileset dir="x32" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname32}"/> + </apply> + </target> + + <target name="compile64" unless="build.32bit.only"> + <mkdir dir="x64"/> + <apply dir="x64" executable="cc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags64} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/freebsd"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/freebsd"/> + <arg value="-I/usr/local/include"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengl"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengl"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengl" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengl" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="cc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags64}"/> + <fileset dir="x64" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname64}"/> + </apply> + </target> +</project> diff --git a/etc/lwjgl-2.9.1/platform_build/build-applet.xml b/etc/lwjgl-2.9.1/platform_build/build-applet.xml new file mode 100644 index 0000000..a4cef1e --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/build-applet.xml @@ -0,0 +1,158 @@ +<project name="applet"> + + <!-- Create our packer task --> + <taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="platform_build/Pack200Task.jar"/> + + <target name="applet"> + <antcall target="-applet"> + <param name="keystore" value="applet/lwjglkeystore"/> + <param name="alias" value="lwjgl"/> + <param name="password" value="123456"/> + </antcall> + </target> + + <target name="applet-release"> + <input message="Please enter the keystore" addproperty="keystore.location" defaultvalue="applet/lwjglkeystore"/> + <input message="Please enter the keystore alias" addproperty="keystore.alias" defaultvalue="lwjgl"/> + <input message="Please type the password for the keystore" addproperty="sign.pwd" defaultvalue="123456"/> + + <antcall target="-applet"> + <!-- + <param name="keystore" value="signing/matzon_java_code_signing.keystore"/> + <param name="alias" value="oddlabs_java_code_signing"/> + <param name="password" value="${sign.pwd}"/> + --> + <param name="keystore" value="${keystore.location}"/> + <param name="alias" value="${keystore.alias}"/> + <param name="password" value="${sign.pwd}"/> + </antcall> + </target> + + <target name="-applet"> + + <!-- Create lwjgl_applet.jar --> + <jar destfile="applet/basic/lwjgl_applet.jar" taskname="lwjgl_applet.jar"> + <fileset refid="lwjgl_applet.fileset" /> + </jar> + + <!-- create each of the native jars --> + <jar destfile="applet/basic/windows_natives.jar" taskname="windows_natives.jar"> + <fileset dir="${lwjgl.lib}/windows"> + <patternset refid="lwjgl-windows.fileset"/> + </fileset> + </jar> + <signjar jar="applet/basic/windows_natives.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + + <jar destfile="applet/basic/linux_natives.jar" taskname="linux_natives.jar"> + <fileset dir="${lwjgl.lib}/linux"> + <patternset refid="lwjgl-linux.fileset"/> + </fileset> + </jar> + <signjar jar="applet/basic/linux_natives.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + + <jar destfile="applet/basic/macosx_natives.jar" taskname="macosx_natives.jar"> + <fileset dir="${lwjgl.lib}/macosx"> + <patternset refid="lwjgl-macosx.fileset"/> + </fileset> + </jar> + <signjar jar="applet/basic/macosx_natives.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + + <jar destfile="applet/basic/solaris_natives.jar" taskname="solaris_natives.jar"> + <fileset dir="${lwjgl.lib}/solaris"> + <patternset refid="lwjgl-solaris.fileset"/> + </fileset> + </jar> + <signjar jar="applet/basic/solaris_natives.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + + <copy file="${lwjgl.lib}/lwjgl.jar" todir="applet/basic" overwrite="true"/> + <copy file="${lwjgl.lib}/lwjgl-debug.jar" todir="applet/basic" overwrite="true"/> + <copy file="${lwjgl.lib}/lwjgl_util_applet.jar" todir="applet/basic" overwrite="true"/> + <copy file="${lwjgl.lib}/lwjgl_util.jar" todir="applet/basic" overwrite="true"/> + <copy file="${lwjgl.lib}/jinput.jar" todir="applet/basic" overwrite="true"/> + + <input + message="Press Return key to continue..." + /> + + <copy file="${lwjgl.lib}/lzma.jar" todir="applet/advance" overwrite="true"/> + + <signjar jar="applet/basic/lwjgl_util_applet.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <input + message="Press Return key to continue..." + /> + <signjar jar="applet/advance/lzma.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <input + message="Press Return key to continue..." + /> + <copy file="applet/basic/lwjgl_util_applet.jar" todir="applet/advance" overwrite="true"/> + + <!-- LZMA only, for 1.4 only clients --> + <!--antcall target="compress-resource"> + <param name="input" value="applet/basic/lwjgl.jar"/> + <param name="output" value="applet/advance/lwjgl.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/lwjgl-debug.jar"/> + <param name="output" value="applet/advance/lwjgl-debug.jar.lzma"/> + </antcall> + + <antcall target="compress-resource"> + <param name="input" value="applet/basic/lwjgl_util.jar"/> + <param name="output" value="applet/advance/lwjgl_util.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/jinput.jar"/> + <param name="output" value="applet/advance/jinput.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/lwjgl_applet.jar"/> + <param name="output" value="applet/advance/lwjgl_applet.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/windows_natives.jar"/> + <param name="output" value="applet/advance/windows_natives.jar.lzma"/> + </antcall --> + + <antcall target="compress-sign-class"> + <param name="dir" value="applet/basic/"/> + <param name="outputdir" value="applet/advance/"/> + <param name="jarfile" value="lwjgl"/> + </antcall> + <antcall target="compress-sign-class"> + <param name="dir" value="applet/basic/"/> + <param name="outputdir" value="applet/advance/"/> + <param name="jarfile" value="lwjgl-debug"/> + </antcall> + <antcall target="compress-sign-class"> + <param name="dir" value="applet/basic/"/> + <param name="outputdir" value="applet/advance/"/> + <param name="jarfile" value="lwjgl_util"/> + </antcall> + <antcall target="compress-sign-class"> + <param name="dir" value="applet/basic/"/> + <param name="outputdir" value="applet/advance/"/> + <param name="jarfile" value="jinput"/> + </antcall> + <antcall target="compress-sign-class"> + <param name="dir" value="applet/basic/"/> + <param name="outputdir" value="applet/advance/"/> + <param name="jarfile" value="lwjgl_applet"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/windows_natives.jar"/> + <param name="output" value="applet/advance/windows_natives.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/macosx_natives.jar"/> + <param name="output" value="applet/advance/macosx_natives.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/linux_natives.jar"/> + <param name="output" value="applet/advance/linux_natives.jar.lzma"/> + </antcall> + <antcall target="compress-resource"> + <param name="input" value="applet/basic/solaris_natives.jar"/> + <param name="output" value="applet/advance/solaris_natives.jar.lzma"/> + </antcall> + </target> +</project> \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/platform_build/build-definitions.xml b/etc/lwjgl-2.9.1/platform_build/build-definitions.xml new file mode 100644 index 0000000..718aa96 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/build-definitions.xml @@ -0,0 +1,203 @@ +<project name="definitions"> + <!-- ================================================================== --> + <!-- Global properties for build --> + <!-- ================================================================== --> + <property name="lwjgl.src" location="src" /> + <property name="lwjgl.src.native" location="${lwjgl.src}/native" /> + <property name="lwjgl.src.headers" location="${lwjgl.src.native}/common" /> + <property name="lwjgl.src.templates" location="${lwjgl.src}/templates" /> + <property name="lwjgl.bin" location="bin" /> + <property name="lwjgl.lib" location="libs" /> + <property name="lwjgl.dist" location="dist" /> + <property name="lwjgl.docs" location="doc" /> + <property name="lwjgl.temp" location="temp" /> + <property name="lwjgl.res" location="res" /> + <property name="lwjgl.version" value="2.9.1" /> + <property name="lwjgl.web" location="www" /> + + <property name="lwjgl.src.templates.al" location="${lwjgl.src.templates}/org/lwjgl/openal"/> + <property name="lwjgl.src.templates.gl" location="${lwjgl.src.templates}/org/lwjgl/opengl"/> + <property name="lwjgl.src.templates.gles" location="${lwjgl.src.templates}/org/lwjgl/opengles"/> + <property name="lwjgl.src.templates.cl" location="${lwjgl.src.templates}/org/lwjgl/opencl"/> + + <property name="openal-template-pattern" value="AL*.java,EFX*.java"/> + <property name="opengl-template-pattern" value="GL*.java,ARB*.java,EXT*.java,KHR*.java,AMD*.java,APPLE*.java,ATI*.java,NV*.java,NVX*.java,HP*.java,IBM*.java,SUN*.java,SGIS*.java,GREMEDY*.java,INTEL*.java"/> + <property name="opengles-template-pattern" value="GLES*.java,ARB*.java,EXT*.java,KHR*.java,AMD*.java,ANGLE*.java,APPLE*.java,ARM*.java,DMP*.java,IMG*.java,NV*.java,OES*.java,QCOM*.java,VIV*.java"/> + <property name="opencl-template-pattern-extensions" value="KHR*.java,EXT*.java,APPLE*.java,AMD*.java,INTEL*.java,NV*.java"/> + <property name="opencl-template-pattern" value="CL*.java,${opencl-template-pattern-extensions}"/> + + <!-- ================================================================== --> + <!-- Filesets used for targets --> + <!-- ================================================================== --> + + <!-- Files to include in the lwjgl.jar file --> + <fileset id="lwjgl.fileset" dir="${lwjgl.bin}"> + <patternset id="lwjgl.package.pattern"> + <include name="org/**/*" /> + <exclude name="org/lwjgl/opengles/**"/> + <exclude name="org/lwjgl/d3d/**" /> + <exclude name="org/lwjgl/test/**" /> + <exclude name="org/lwjgl/util/**" /> + <exclude name="org/lwjgl/examples/**" /> + </patternset> + </fileset> + <fileset id="lwjgl.fileset.dependencies" dir="${lwjgl.bin}"> + <patternset id="lwjgl.package.dependencies.pattern"> + <include name="org/lwjgl/opengles/ContextAttribs*.*"/> + </patternset> + </fileset> + + <!-- Files to include in the lwjgl_util_applet.jar file --> + <fileset id="lwjgl_util_applet.fileset" dir="${lwjgl.bin}"> + <patternset id="lwjgl_util_applet.package.pattern"> + <exclude name="**.*"/> + <include name="org/lwjgl/util/applet/**"/> + </patternset> + </fileset> + + <!-- Files to include in the lwjgl_test.jar file --> + <fileset id="lwjgl_test.fileset" dir="${lwjgl.bin}"> + <exclude name="**.*" /> + <include name="org/lwjgl/test/**" /> + <exclude name="org/lwjgl/test/opengles/**"/> + <include name="org/lwjgl/examples/**" /> + </fileset> + + <!-- More files to include in the lwjgl_test.jar file --> + <fileset id="lwjgl_test_extra.fileset" dir="${lwjgl.src}/java"> + <exclude name="**.*" /> + <include name="org/lwjgl/test/opengl/shaders/*.fp" /> + <include name="org/lwjgl/test/opengl/shaders/*.vp" /> + <include name="org/lwjgl/test/opengl/shaders/*.vsh" /> + <include name="org/lwjgl/test/opengl/shaders/*.fsh" /> + <include name="org/lwjgl/test/opencl/gl/*.cl" /> + </fileset> + + <!-- Files to include in the lwjgl_test.jar file for the ES build --> + <fileset id="lwjgl_test_es.fileset" dir="${lwjgl.bin}"> + <exclude name="**.*"/> + <include name="org/lwjgl/test/**"/> + <exclude name="org/lwjgl/test/opengl/**"/> + <exclude name="org/lwjgl/test/*.*"/> + </fileset> + + <!-- Files to include in the lwjgl_util.jar file --> + <fileset id="lwjgl_util.fileset" dir="${lwjgl.bin}"> + <patternset id="lwjgl_util.package.pattern"> + <exclude name="**.*" /> + <exclude name="org/lwjgl/util/generator/**" /> + <exclude name="org/lwjgl/util/applet/**" /> + <include name="org/lwjgl/util/**" /> + </patternset> + </fileset> + + + <!-- Files to include in the lwjgl_applet.jar file --> + <fileset id="lwjgl_applet.fileset" dir="${lwjgl.bin}"> + <exclude name="**.*"/> + <include name="org/lwjgl/test/applet/**"/> + <include name="org/lwjgl/test/opengl/awt/AWTGearsCanvas.class"/> + </fileset> + + <!-- Files to make Javadoc from --> + <fileset id="lwjgl.javadoc.fileset" dir="${lwjgl.src}"> + <include name="**/*.java" /> + <exclude name="native/**" /> + <exclude name="templates/**" /> + <exclude name="java/org/lwjgl/test/**" /> + <exclude name="java/org/lwjgl/examples/**" /> + <exclude name="java/org/lwjgl/util/generator/**" /> + </fileset> + + <!-- Files to include in doc package --> + <patternset id="lwjgl-docs.fileset"> + <include name="CREDITS" /> + <include name="LICENSE" /> + <include name="README" /> + <include name="lwjgl_hidden_switches.text" /> + <include name="3rdparty/*" /> + </patternset> + + <!-- Files to include in windows package --> + <patternset id="lwjgl-windows.fileset"> + <patternset id="lwjgl-windows-lwjgl.fileset"> + <include name="lwjgl.dll" /> + <include name="lwjgl64.dll" /> + <include name="OpenAL32.dll" /> + <include name="OpenAL64.dll" /> + </patternset> + <patternset id="lwjgl-windows-jinput.fileset"> + <include name="jinput-dx8*.dll" /> + <include name="jinput-raw*.dll" /> + </patternset> + </patternset> + + <!-- Files to include in linux, glibc2.3 package --> + <patternset id="lwjgl-linux.fileset"> + <patternset id="lwjgl-linux-lwjgl.fileset"> + <include name="liblwjgl*.so" /> + <include name="libopenal*.so" /> + </patternset> + <patternset id="lwjgl-linux-jinput.fileset"> + <include name="libjinput-linux.so" /> + <include name="libjinput-linux64.so" /> + </patternset> + </patternset> + + <!-- Files to include in mac os x package --> + <patternset id="lwjgl-macosx.fileset"> + <patternset id="lwjgl-macosx-lwjgl.fileset"> + <include name="liblwjgl.jnilib" /> + <include name="openal.dylib" /> + </patternset> + <patternset id="lwjgl-macosx-jinput.fileset"> + <include name="libjinput-osx.jnilib" /> + <include name="libjinput-osx-legacy.jnilib" /> + </patternset> + </patternset> + + <!-- Files to include in solaris package --> + <patternset id="lwjgl-solaris.fileset"> + <include name="liblwjgl*.so" /> + <include name="libopenal*.so" /> + </patternset> + + <!-- Files to include in source distribution --> + <fileset id="lwjgl.source.fileset" dir="."> + <include name="build.xml" /> + <include name="src/**" /> + <include name="platform_build/**/*" /> + </fileset> + + <!-- files in the base package --> + <patternset id="lwjgl_base"> + <include name="**" /> + <exclude name="res/ILtest.*" /> + <exclude name="res/Missing_you.mod" /> + <exclude name="res/phero*.*" /> + </patternset> + + <!-- files in the optional package --> + <patternset id="lwjgl_optional"> + <include name="res/**" /> + <exclude name="res/logo/**" /> + <exclude name="res/spaceinvaders/**" /> + <exclude name="res/*.wav" /> + <exclude name="res/*.xpm" /> + <include name="doc/CREDITS" /> + <include name="doc/LICENSE" /> + <include name="doc/README" /> + </patternset> + + <!-- files in the lwjgl_applet package --> + <patternset id="lwjgl_applet"> + <include name="applet/**" /> + <exclude name="applet/appletviewer.policy" /> + <exclude name="applet/lwjglkeystore" /> + </patternset> + + <uptodate property="lwjgl.main.built" targetfile="${lwjgl.lib}/windows/lwjgl.dll" > + <srcfiles dir= "${lwjgl.src.native}/common" includes="*.c*"/> + <srcfiles dir= "${lwjgl.src.native}/windows" includes="*.c"/> + </uptodate> +</project> diff --git a/etc/lwjgl-2.9.1/platform_build/build-generator.xml b/etc/lwjgl-2.9.1/platform_build/build-generator.xml new file mode 100644 index 0000000..e288ad3 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/build-generator.xml @@ -0,0 +1,340 @@ +<project name="generator"> + + <import file="build-definitions.xml"/> + + <!-- clean the generated files --> + <target name="clean-generated" description="Deletes the generated java source"> + <delete quiet="true" failonerror="false"> + <fileset dir="${lwjgl.src}/generated" includes="**"/> + </delete> + </target> + + <target name="clean-generated-native" description="Deletes the generated native source" depends="clean-generated"> + <delete quiet="false" failonerror="false"> + <fileset dir="${lwjgl.src.native}/generated" includes="**"/> + </delete> + </target> + + <!-- Compiles the Java generator source code --> + <target name="generators" description="Compiles the native method generators"> + <javac debug="yes" srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/util/generator/**.java" source="1.5" target="1.5" taskname="generator"> + <include name="org/lwjgl/util/generator/openal/**.java"/> + <include name="org/lwjgl/util/generator/opengl/**.java"/> + <include name="org/lwjgl/util/generator/opengles/**.java"/> + <include name="org/lwjgl/util/generator/opencl/**.java"/> + <compilerarg value="-Xlint:none"/> + </javac> + <!-- Compile helper classes used by the templates --> + <javac debug="yes" srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" source="1.5" target="1.5" taskname="generator"> + <include name="org/lwjgl/PointerWrapper.java"/> + <include name="org/lwjgl/PointerBuffer.java"/> + <!-- OpenGL --> + <include name="org/lwjgl/opengl/GLSync.java"/> + <include name="org/lwjgl/opengl/AMDDebugOutputCallback.java"/> + <include name="org/lwjgl/opengl/ARBDebugOutputCallback.java"/> + <include name="org/lwjgl/opengl/KHRDebugCallback.java"/> + <!-- OpenGL ES --> + <include name="org/lwjgl/opengles/EGLImageOES.java"/> + <include name="org/lwjgl/opengles/KHRDebugCallback.java"/> + <!-- OpenCL --> + <include name="org/lwjgl/opencl/CLPlatform.java"/> + <include name="org/lwjgl/opencl/CLDevice.java"/> + <include name="org/lwjgl/opencl/CLContext.java"/> + <include name="org/lwjgl/opencl/CLCommandQueue.java"/> + <include name="org/lwjgl/opencl/CLMem.java"/> + <include name="org/lwjgl/opencl/CL*Callback.java"/> + <include name="org/lwjgl/opencl/CLNativeKernel.java"/> + <include name="org/lwjgl/opencl/CLFunctionAddress.java"/> + </javac> + </target> + + <!-- Proxy target to generate it all --> + <target name="generate-all" depends="generate-openal, generate-opengl, generate-opengl-capabilities, generate-opengl-references, generate-opengles, generate-opengles-capabilities, generate-opencl, generate-opencl-capabilities" description="Generates java and native source"/> + + <target name="generate-debug" depends="generate-openal-debug, generate-opengl-debug, generate-opengl-capabilities-debug, generate-opengl-references, generate-opengles-debug, generate-opengles-capabilities-debug, generate-opencl-debug, generate-opencl-capabilities-debug" description="Generates java and native source with debug functionality"/> + + <!-- ******************************************************************************** + ********************************************************************************* + OPENAL + ********************************************************************************* + **************************************************************************** --> + + <!-- Generate OpenAL --> + <target name="generate-openal" depends="generators" description="Generates java and native source for AL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.al}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/openal"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Atypemap=org.lwjgl.util.generator.openal.ALTypeMap"/> + <fileset dir="${lwjgl.src.templates.al}" includes="${openal-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenAL [DEBUG] --> + <target name="generate-openal-debug" depends="generators" description="Generates java and native source for AL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.al}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/openal"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Atypemap=org.lwjgl.util.generator.openal.ALTypeMap"/> + <arg value="-Ageneratechecks"/> + <fileset dir="${lwjgl.src.templates.al}" includes="${openal-template-pattern}"/> + </apply> + </target> + + <!-- ******************************************************************************** + ********************************************************************************* + OPENGL + ********************************************************************************* + **************************************************************************** --> + + <!-- Generate OpenGL --> + <target name="generate-opengl" depends="generators" description="Generates java and native source for GL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opengl"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Acontextspecific"/> + <arg value="-Atypemap=org.lwjgl.util.generator.opengl.GLTypeMap"/> + <fileset dir="${lwjgl.src.templates.gl}" includes="${opengl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL [DEBUG] --> + <target name="generate-opengl-debug" depends="generators" description="Generates debug java and native source for GL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opengl"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Ageneratechecks"/> + <arg value="-Acontextspecific"/> + <arg value="-Atypemap=org.lwjgl.util.generator.opengl.GLTypeMap"/> + <fileset dir="${lwjgl.src.templates.gl}" includes="${opengl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL references --> + <target name="generate-opengl-references" depends="generators" description="Generates java and native source for GL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opengl.GLReferencesGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <fileset dir="${lwjgl.src.templates.gl}" includes="${opengl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL context capabilities --> + <target name="generate-opengl-capabilities" depends="generators" description="Generates java and native source for GL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opengl.GLGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-Acontextspecific"/> + <fileset dir="${lwjgl.src.templates.gl}" includes="${opengl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL context capabilities [DEBUG] --> + <target name="generate-opengl-capabilities-debug" depends="generators" description="Generates debug java and native source for GL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opengl.GLGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-Ageneratechecks"/> + <arg value="-Acontextspecific"/> + <fileset dir="${lwjgl.src.templates.gl}" includes="${opengl-template-pattern}"/> + </apply> + </target> + + <!-- ******************************************************************************** + ********************************************************************************* + OPENGL ES + ********************************************************************************* + **************************************************************************** --> + + <!-- Generate OpenGL ES --> + <target name="generate-opengles" depends="generators" description="Generates java and native source for GL ES"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gles}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opengles"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <!--<arg value="-Acontextspecific"/>--> + <arg value="-Atypemap=org.lwjgl.util.generator.opengl.GLESTypeMap"/> + <fileset dir="${lwjgl.src.templates.gles}" includes="${opengles-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL ES [DEBUG] --> + <target name="generate-opengles-debug" depends="generators" description="Generates debug java and native source for GL ES"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gles}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opengles"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Ageneratechecks"/> + <!--<arg value="-Acontextspecific"/>--> + <arg value="-Atypemap=org.lwjgl.util.generator.opengl.GLESTypeMap"/> + <fileset dir="${lwjgl.src.templates.gles}" includes="${opengles-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL ES context capabilities --> + <target name="generate-opengles-capabilities" depends="generators" description="Generates java and native source for GL ES"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gles}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opengl.GLESGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <!--<arg value="-Acontextspecific"/>--> + <fileset dir="${lwjgl.src.templates.gles}" includes="${opengles-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenGL ES context capabilities [DEBUG] --> + <target name="generate-opengles-capabilities-debug" depends="generators" description="Generates debug java and native source for GL ES"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.gles}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opengl.GLESGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-Ageneratechecks"/> + <!--<arg value="-Acontextspecific"/>--> + <fileset dir="${lwjgl.src.templates.gles}" includes="${opengles-template-pattern}"/> + </apply> + </target> + + <!-- ******************************************************************************** + ********************************************************************************* + OPENCL + ********************************************************************************* + **************************************************************************** --> + + <!-- Generate OpenCL --> + <target name="generate-opencl" depends="generators" description="Generates java and native source for CL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.cl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opencl"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Acontextspecific"/> + <arg value="-Atypemap=org.lwjgl.util.generator.opencl.CLTypeMap"/> + <fileset dir="${lwjgl.src.templates.cl}" includes="${opencl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenCL [DEBUG] --> + <target name="generate-opencl-debug" depends="generators" description="Generates debug java and native source for CL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.cl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.GeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-d"/> + <arg path="${lwjgl.src.native}/generated/opencl"/> + <arg value="-Abinpath=${lwjgl.bin}"/> + <arg value="-Ageneratechecks"/> + <arg value="-Acontextspecific"/> + <arg value="-Atypemap=org.lwjgl.util.generator.opencl.CLTypeMap"/> + <fileset dir="${lwjgl.src.templates.cl}" includes="${opencl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenCL capabilities --> + <target name="generate-opencl-capabilities" depends="generators" description="Generates capabilities for CL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.cl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opencl.CLGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-Acontextspecific"/> + <fileset dir="${lwjgl.src.templates.cl}" includes="${opencl-template-pattern}"/> + </apply> + </target> + + <!-- Generate OpenCL capabilities [DEBUG] --> + <target name="generate-opencl-capabilities-debug" depends="generators" description="Generates debug capabilities for CL"> + <apply executable="apt" parallel="true" dir="${lwjgl.src.templates.cl}" relative="true"> + <arg value="-nocompile"/> + <arg value="-factory"/> + <arg value="org.lwjgl.util.generator.opencl.CLGeneratorProcessorFactory"/> + <arg value="-cp"/> + <arg path="${lwjgl.src}/java:${lwjgl.src.templates}:${lwjgl.bin}:${java.class.path}"/> + <arg value="-s"/> + <arg path="${lwjgl.src}/generated"/> + <arg value="-Ageneratechecks"/> + <arg value="-Acontextspecific"/> + <fileset dir="${lwjgl.src.templates.cl}" includes="${opencl-template-pattern}"/> + </apply> + </target> +</project> diff --git a/etc/lwjgl-2.9.1/platform_build/build-maven.xml b/etc/lwjgl-2.9.1/platform_build/build-maven.xml new file mode 100644 index 0000000..c3f869b --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/build-maven.xml @@ -0,0 +1,211 @@ +<project name="maven"> + <property name="lwjgl.src.java" location="${lwjgl.src}/java" /> + <property name="lwjgl.src.generated" location="${lwjgl.src}/generated" /> + <property name="lwjgl.maven" location="maven" /> + <property name="lwjgl.dstMaven" location="${lwjgl.temp}/maven" /> + <property name="lwjgl.src.java" location="${lwjgl.src}/java" /> + <property name="jinput.version" value="2.0.5" /> + + <fileset id="lwjgl-sources.manual.fileset" dir="${lwjgl.src.java}"> + <patternset refid="lwjgl.package.pattern" /> + <patternset refid="lwjgl.package.dependencies.pattern"/> + </fileset> + + <fileset id="lwjgl-sources.generated.fileset" dir="${lwjgl.src.generated}"> + <include name="**/*" /> + </fileset> + <fileset id="lwjgl_util_applet-sources.fileset" dir="${lwjgl.src.java}"> + <patternset refid="lwjgl_util_applet.package.pattern" /> + </fileset> + + <fileset id="lwjgl_util-sources.fileset" dir="${lwjgl.src.java}"> + <patternset refid="lwjgl_util.package.pattern" /> + </fileset> + + <target name="-fixmavenversion"> + <script language="javascript"> + <![CDATA[ + importPackage(java.lang); + var originalVersion = project.getProperty("lwjgl.version"); + System.out.println("LWJGL Version: " + originalVersion); + var mavenVersion = originalVersion; + if(originalVersion.match(/^[0-9]+\.[0-9]+$/)){ + System.out.println("Fixing LWJGL Maven version (Maven version should be x.y.z)"); + mavenVersion = originalVersion + ".0"; + } + if(!mavenVersion.match(/^.*-SNAPSHOT$/)){ + var forceSnapshot = project.getProperty("snapshot") + if(forceSnapshot!=null && forceSnapshot!="false"){ + System.out.println("Forcing Maven Version to Snapshot"); + mavenVersion = mavenVersion + "-SNAPSHOT"; + } + } + + project.setNewProperty("lwjgl-maven-version",mavenVersion); + System.out.println("LWJGL Maven Version: " + project.getProperty("lwjgl-maven-version")); + ]]> + </script> + </target> + + <target name="-checkjinputversion"> + <script language="javascript" classpath="${lwjgl.lib}/jinput.jar"> + <![CDATA[ + importPackage(java.lang); + var version = net.java.games.input.Version.getVersion() + project.setNewProperty("jinputversion",version); + var declaredJinputVersion = project.getProperty("jinput.version"); + System.out.println("JINPUT Version: " + version + " - DeclaredVersion: " + declaredJinputVersion); + + if(declaredJinputVersion.equals(version)){ + System.out.println("JINPUT Version Matches"); + project.setNewProperty("jinputversionmatches", true); + } else { + System.out.println("JINPUT Version don't match"); + } + ]]> + </script> + <condition property="failjinputcheck"> + <and> + <not><isset property="jinputversionmatches" /></not> + <not><isset property="overridejinput" /></not> + </and> + </condition> + <fail if="failjinputcheck" message="Jinput version in project (${jinputversion}) is different from the declared jinput version for maven (${jinput.version}) add -Doverridejinput=true as a command line option to avoid this check" /> + </target> + + <target name="maven-full"> + <antcall target="clean-java" /> + <antcall target="-initialize" /> + + <antcall target="generate-all" /> + <antcall target="compile" /> + <antcall target="-createjars" /> + <antcall target="maven"/> + </target> + + <target name="maven" depends="-fixmavenversion, -checkjinputversion"> <!-- Added as dependency because using antcall creates a new project scope --> + <delete dir="${lwjgl.dstMaven}" quiet="true" failonerror="false" taskname="cleaning maven dist" /> + <mkdir dir="${lwjgl.dstMaven}" taskname="initialiazing temp maven folder" /> + <antcall target="-copylwjgljars" /> + <antcall target="-createmavensourcejars" /> + <antcall target="-createmavenjavadocs" /> + <antcall target="-createmavennativejars" /> + <antcall target="-copymavenpoms"/> + <antcall target="-copymavendeploybuild"/> + <antcall target="-copymaventdist"/> + </target> + + + + + + + + + <target name="-copylwjgljars"> + <copy todir="${lwjgl.dstMaven}"> + <fileset dir="${lwjgl.temp}/jar/"> + <patternset> + <include name="lwjgl.jar" /> + <include name="lwjgl_util.jar" /> + <include name="lwjgl_util_applet.jar" /> + </patternset> + </fileset> + </copy> + </target> + + <!-- Packages the java files --> + <target name="-createmavensourcejars"> + + <jar destfile="${lwjgl.dstMaven}/lwjgl-sources.jar" taskname="lwjgl-sources.jar"> + <fileset refid="lwjgl-sources.manual.fileset" /> + <fileset refid="lwjgl-sources.generated.fileset" /> + </jar> + + <jar destfile="${lwjgl.dstMaven}/lwjgl_util_applet-sources.jar" taskname="lwjgl_util_applet-sources.jar"> + <fileset refid="lwjgl_util_applet-sources.fileset" /> + </jar> + + <jar destfile="${lwjgl.dstMaven}/lwjgl_util-sources.jar" taskname="lwjgl_util-sources.jar"> + <fileset refid="lwjgl_util-sources.fileset" /> + </jar> + </target> + + <target name="-createmavenjavadocs"> + <!-- Creates the Javadoc --> + + <javadoc destdir="${lwjgl.dstMaven}/lwjgl-javadoc" classpath="${lwjgl.lib}/jinput.jar" author="true" version="true" use="true" source="1.5" windowtitle="LWJGL API" useexternalfile="true"> + <fileset refid="lwjgl-sources.manual.fileset"/> + <fileset refid="lwjgl-sources.generated.fileset"/> + <doctitle><![CDATA[<h1>Lightweight Java Game Toolkit</h1>]]></doctitle> + <bottom><![CDATA[<i>Copyright &#169; 2002-2010 lwjgl.org. All Rights Reserved.</i>]]></bottom> + </javadoc> + <jar destfile="${lwjgl.dstMaven}/lwjgl-javadoc.jar" taskname="lwjgl-javadoc.jar"> + <fileset dir="${lwjgl.dstMaven}/lwjgl-javadoc" /> + </jar> + + <javadoc destdir="${lwjgl.dstMaven}/lwjgl_util-javadoc" classpath="${lwjgl.lib}/jinput.jar:${lwjgl.lib}/lwjgl.jar" author="true" version="true" use="true" source="1.5" windowtitle="LWJGL UTIL API" useexternalfile="true"> + <fileset refid="lwjgl_util-sources.fileset"/> + <doctitle><![CDATA[<h1>Lightweight Java Game Toolkit</h1>]]></doctitle> + <bottom><![CDATA[<i>Copyright &#169; 2002-2010 lwjgl.org. All Rights Reserved.</i>]]></bottom> + </javadoc> + <jar destfile="${lwjgl.dstMaven}/lwjgl_util-javadoc.jar" taskname="lwjgl_util-javadoc.jar"> + <fileset dir="${lwjgl.dstMaven}/lwjgl_util-javadoc" /> + </jar> + + <javadoc destdir="${lwjgl.dstMaven}/lwjgl_util_applet-javadoc" classpath="${lwjgl.lib}/jinput.jar:${lwjgl.lib}/lwjgl.jar" author="true" version="true" use="true" source="1.5" windowtitle="LWJGL UTIL API" useexternalfile="true"> + <fileset refid="lwjgl_util_applet-sources.fileset"/> + <doctitle><![CDATA[<h1>Lightweight Java Game Toolkit</h1>]]></doctitle> + <bottom><![CDATA[<i>Copyright &#169; 2002-2010 lwjgl.org. All Rights Reserved.</i>]]></bottom> + </javadoc> + <jar destfile="${lwjgl.dstMaven}/lwjgl_util_applet-javadoc.jar" taskname="lwjgl_util_applet-javadoc.jar"> + <fileset dir="${lwjgl.dstMaven}/lwjgl_util_applet-javadoc" /> + </jar> + + <delete dir="${lwjgl.dstMaven}/lwjgl-javadoc" quiet="true" failonerror="false" taskname="cleaning maven javadoc temps lwjgl" /> + <delete dir="${lwjgl.dstMaven}/lwjgl_util-javadoc" quiet="true" failonerror="false" taskname="cleaning maven javadoc temps lwjgl_util" /> + <delete dir="${lwjgl.dstMaven}/lwjgl_util_applet-javadoc" quiet="true" failonerror="false" taskname="cleaning maven javadoc temps lwjgl_util_applet" /> + </target> + + <target name="-createmavennativejars"> + <jar destfile="${lwjgl.dstMaven}/lwjgl-platform-natives-windows.jar" taskname="lwjgl-platform-natives-windows.jar"> + <fileset dir="${lwjgl.lib}/windows"> + <patternset refid="lwjgl-windows-lwjgl.fileset"/> + </fileset> + </jar> + <jar destfile="${lwjgl.dstMaven}/lwjgl-platform-natives-linux.jar" taskname="lwjgl-platform-natives-linux.jar"> + <fileset dir="${lwjgl.lib}/linux"> + <patternset refid="lwjgl-linux-lwjgl.fileset"/> + </fileset> + </jar> + <jar destfile="${lwjgl.dstMaven}/lwjgl-platform-natives-osx.jar" taskname="lwjgl-platform-natives-osx.jar"> + <fileset dir="${lwjgl.lib}/macosx"> + <patternset refid="lwjgl-macosx-lwjgl.fileset"/> + </fileset> + </jar> + </target> + + <target name="-copymavenpoms"> + <copy todir="${lwjgl.dstMaven}"> + <fileset dir="${lwjgl.maven}"> + <include name="*.pom" /> + </fileset> + <filterset> + <filter token="VERSION" value="${lwjgl-maven-version}"/> + <filter token="JINPUTVERSION" value="${jinput.version}"/> + </filterset> + </copy> + </target> + + <target name="-copymavendeploybuild"> + <copy todir="${lwjgl.dstMaven}"> + <fileset dir="${lwjgl.maven}"> + <include name="build.xml" /> + </fileset> + </copy> + </target> + + <target name="-copymaventdist"> + <zip destfile="${lwjgl.dist}/lwjgl-maven-${lwjgl.version}.zip" basedir="${lwjgl.temp}" includes="maven/**" /> + </target> +</project> \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/platform_build/build-webstart.xml b/etc/lwjgl-2.9.1/platform_build/build-webstart.xml new file mode 100644 index 0000000..cbc1f50 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/build-webstart.xml @@ -0,0 +1,181 @@ +<project name="webstart"> + <target name="webstart_demo" depends="jars"> + <antcall target="-webstart_demo"> + <param name="keystore" value="applet/lwjglkeystore"/> + <param name="alias" value="lwjgl"/> + <param name="password" value="123456"/> + </antcall> + </target> + + <target name="webstart_demo-release"> + <input message="Please type the password for the keystore" addproperty="sign.pwd"/> + + <antcall target="-webstart_demo"> + <param name="keystore" value="signing/lwjgl.jks"/> + <param name="alias" value="lwjgl"/> + <param name="password" value="${sign.pwd}"/> + </antcall> + </target> + + <!-- Create webstart demo and extension from release files --> + <target name="-webstart_demo" description="Using released files, creates the necessary files used for jnlp demos"> + + <!-- delete existing temp --> + <delete dir="${lwjgl.temp}"/> + + <!-- unzip release to temp dir --> + <unzip src="${lwjgl.dist}/lwjgl-${lwjgl.version}.zip" dest="${lwjgl.temp}/webstart/temp" overwrite="true"/> + + <!-- DEMO SECTION --> + <move file="${lwjgl.temp}/webstart/temp/lwjgl-${lwjgl.version}/jar/lwjgl_test.jar" tofile="${lwjgl.temp}/webstart/lwjgl_test.jar"/> + <jar destfile="${lwjgl.temp}/webstart/lwjgl_test.jar" update="true"> + <manifest> + <attribute name="Sealed" value="true"/> + </manifest> + </jar> + <jar destfile="${lwjgl.temp}/webstart/media.jar" basedir="${lwjgl.res}"> + <manifest> + <attribute name="Sealed" value="true"/> + </manifest> + </jar> + + <!-- EXTENSION SECTION --> + <move todir="${lwjgl.temp}/webstart/${lwjgl.version}/" flatten="true"> + <fileset dir="${lwjgl.temp}/webstart/temp"> + <include name="**/jinput.jar"/> + <include name="**/lwjgl*.jar"/> + <exclude name="**/lwjgl_util_applet.jar"/> + <exclude name="**/lwjgl-debug.jar"/> + </fileset> + </move> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/lwjgl.jar" update="true"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/jinput.jar" update="true"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/lwjgl_util.jar" update="true"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <!-- create native jars --> + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/native_windows.jar" basedir="${lwjgl.temp}/webstart/temp/lwjgl-${lwjgl.version}/native/windows"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/native_linux.jar" basedir="${lwjgl.temp}/webstart/temp/lwjgl-${lwjgl.version}/native/linux"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/native_macosx.jar" basedir="${lwjgl.temp}/webstart/temp/lwjgl-${lwjgl.version}/native/macosx"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <jar destfile="${lwjgl.temp}/webstart/${lwjgl.version}/native_solaris.jar" basedir="${lwjgl.temp}/webstart/temp/lwjgl-${lwjgl.version}/native/solaris"> + <manifest> + <attribute name="Specification-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Specification-Version" value="${lwjgl.version}"/> + <attribute name="Specification-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Title" value="LWJGL ${lwjgl.version}"/> + <attribute name="Implementation-Version" value="${lwjgl.version}"/> + <attribute name="Implementation-Vendor" value="lwjgl.org"/> + <attribute name="Implementation-Vendor-Id" value="org.lwjgl"/> + <attribute name="Extension-Name" value="org.lwjgl"/> + <attribute name="Sealed" value="true"/> + <attribute name="Trusted-Library" value="true"/> + </manifest> + </jar> + + <!-- sign 'em --> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/lwjgl.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/lwjgl_util.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/jinput.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/native_solaris.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/native_linux.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/native_macosx.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + <signjar jar="${lwjgl.temp}/webstart/${lwjgl.version}/native_windows.jar" alias="${alias}" keystore="${keystore}" storepass="${password}"/> + + <!-- copy over extension jnlp file --> + <copy todir="${lwjgl.temp}/webstart/${lwjgl.version}"> + <fileset dir="${lwjgl.web}/webstart"> + <include name="extension.jnlp"/> + </fileset> + <filterset> + <filter token="LWJGL_VERSION" value="${lwjgl.version}"/> + </filterset> + </copy> + + <!-- nuke extracted dir --> + <delete dir="${lwjgl.temp}/webstart/temp"/> + + </target> +</project> \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/platform_build/linux_ant/build.xml b/etc/lwjgl-2.9.1/platform_build/linux_ant/build.xml new file mode 100644 index 0000000..da13433 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/linux_ant/build.xml @@ -0,0 +1,126 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, linux" basedir="../../bin/lwjgl" default="compile"> + <property name="native" location="../../src/native"/> + <property name="libname32" value="liblwjgl.so"/> + <property name="libname64" value="liblwjgl64.so"/> + <property name="libs32" value="-L/usr/X11R6/lib -L/usr/X11/lib -lm -lX11 -lXext -lXcursor -lXrandr -lXxf86vm -lpthread -L${java.home}/lib/i386 -ljawt" /> + <property name="libs64" value="-L/usr/X11R6/lib64 -L/usr/X11/lib64 -lm -lX11 -lXext -lXcursor -lXrandr -lXxf86vm -lpthread -L${java.home}/lib/amd64 -ljawt" /> + <property name="cflags32" value="-O2 -Wall -c -fPIC -std=c99 -Wunused"/> + + <target name="clean"> + <delete> + <fileset dir="x32"/> + <fileset dir="x64"/> + <fileset dir="." includes="*.o"/> + <fileset dir="." includes="*.so"/> + </delete> + </target> + + <target name="compile"> + <exec executable="uname" outputproperty="hwplatform"> + <arg value="-m"/> + </exec> + <condition property="cflags_pthread" value="-pthreads" else="-pthread"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags32" value="" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags64" value="-m64" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <and> + <os name="SunOS" /> + </and> + </condition> + <condition property="cflags64" value="-O2 -m64 -Wall -c -fPIC -std=c99 -Wunused" else="-O2 -Wall -c -fPIC -std=c99 -Wunused"> + <os name="SunOS" /> + </condition> + + <property name="linker_flags32" value="${version_script_flags32} -shared -O2 -Wall -o ${libname32} ${libs32}"/> + <property name="linker_flags64" value="${version_script_flags64} -shared -O2 -Wall -o ${libname64} ${libs64}"/> + + <condition property="build.32bit.only"> + <not> + <or> + <equals arg1="${hwplatform}" arg2="x86_64"/> + <equals arg1="${hwplatform}" arg2="i86pc"/> + </or> + </not> + </condition> + + <!-- On linux, the 64 bit jre doesn't have the 32 bit libs --> + <condition property="build.64bit.only"> + <and> + <os name="Linux"/> + <equals arg1="${hwplatform}" arg2="x86_64"/> + </and> + </condition> + + <antcall target="compile32"/> + <antcall target="compile64"/> + </target> + + <target name="compile32" unless="build.64bit.only"> + <mkdir dir="x32"/> + <apply dir="x32" executable="gcc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags32} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/linux"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/linux"/> + <arg value="-I${java.home}/../include/solaris"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengl"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengl"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengl" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengl" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="gcc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags32}"/> + <fileset dir="x32" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname32}"/> + </apply> + </target> + + <target name="compile64" unless="build.32bit.only"> + <mkdir dir="x64"/> + <apply dir="x64" executable="gcc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags64} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/linux"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/linux"/> + <arg value="-I${java.home}/../include/solaris"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengl"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengl"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengl" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengl" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="gcc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags64}"/> + <fileset dir="x64" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname64}"/> + </apply> + </target> +</project> diff --git a/etc/lwjgl-2.9.1/platform_build/linux_ant/build_es.xml b/etc/lwjgl-2.9.1/platform_build/linux_ant/build_es.xml new file mode 100644 index 0000000..a62cb13 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/linux_ant/build_es.xml @@ -0,0 +1,129 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, linux" basedir="../../bin/lwjgles" default="compile"> + <property name="native" location="../../src/native"/> + <property name="libname32" value="liblwjgl.so"/> + <property name="libname64" value="liblwjgl64.so"/> + <property name="libs32" value="-L/home/spasi/lwjgl/libs/linux -lEGL -L/usr/X11R6/lib -L/usr/X11/lib -lm -lX11 -lXext -lXcursor -lXrandr -lpthread -L${java.home}/lib/i386 -ljawt" /> + <property name="libs64" value="-L${lib_folder}/x64 -lEGL -L/usr/X11R6/lib64 -L/usr/X11/lib64 -lm -lX11 -lXext -lXcursor -lXrandr -lXxf86vm -lpthread -L${java.home}/lib/amd64 -ljawt" /> + <property name="cflags32" value="-O2 -Wall -c -fPIC -std=c99 -Wunused"/> + + <target name="clean"> + <delete> + <fileset dir="x32"/> + <fileset dir="x64"/> + <fileset dir="." includes="*.o"/> + <fileset dir="." includes="*.so"/> + </delete> + </target> + + <target name="compile"> + <exec executable="uname" outputproperty="hwplatform"> + <arg value="-m"/> + </exec> + <condition property="xf86vm_lib" value="-lXxf86vm" else="-Wl,-static,-lXxf86vm,-call_shared"> + <os name="SunOS" /> + </condition> + <condition property="cflags_pthread" value="-pthreads" else="-pthread"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags32" value="" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <os name="SunOS" /> + </condition> + <condition property="version_script_flags64" value="-m64" else="-Wl,--version-script='${native}/linux/lwjgl.map'"> + <and> + <os name="SunOS" /> + </and> + </condition> + <condition property="cflags64" value="-O2 -m64 -Wall -c -fPIC -std=c99 -Wunused" else="-O2 -Wall -c -fPIC -std=c99 -Wunused"> + <os name="SunOS" /> + </condition> + + <property name="linker_flags32" value="${version_script_flags32} -shared -O2 -Wall -o ${libname32} ${libs32} ${xf86vm_lib}"/> + <property name="linker_flags64" value="${version_script_flags64} -shared -O2 -Wall -o ${libname64} ${libs64} ${xf86vm_lib}"/> + + <condition property="build.32bit.only"> + <not> + <or> + <equals arg1="${hwplatform}" arg2="x86_64"/> + <equals arg1="${hwplatform}" arg2="i86pc"/> + </or> + </not> + </condition> + + <!-- On linux, the 64 bit jre doesn't have the 32 bit libs --> + <condition property="build.64bit.only"> + <and> + <os name="Linux"/> + <equals arg1="${hwplatform}" arg2="x86_64"/> + </and> + </condition> + + <antcall target="compile32"/> + <antcall target="compile64"/> + </target> + + <target name="compile32" unless="build.64bit.only"> + <mkdir dir="x32"/> + <apply dir="x32" executable="gcc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags32} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/linux"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/linux"/> + <arg value="-I${java.home}/../include/solaris"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengles"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengles"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengles" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengles" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengles" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="gcc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags32}"/> + <fileset dir="x32" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname32}"/> + </apply> + </target> + + <target name="compile64" unless="build.32bit.only"> + <mkdir dir="x64"/> + <apply dir="x64" executable="gcc" skipemptyfilesets="true" failonerror="true"> + <arg line="${cflags64} ${cflags_pthread}"/> + <arg value="-I${java.home}/include"/> + <arg value="-I${java.home}/include/linux"/> + <arg value="-I${java.home}/../include"/> + <arg value="-I${java.home}/../include/linux"/> + <arg value="-I${java.home}/../include/solaris"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/common/opengles"/> + <arg value="-I${native}/linux"/> + <arg value="-I${native}/linux/opengles"/> + <mapper type="glob" from="*.c" to="*.o"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengles" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengles" includes="*.c"/> + <fileset dir="${native}/linux" includes="*.c"/> + <fileset dir="${native}/linux/opengles" includes="*.c"/> + </apply> + <apply dir="." parallel="true" executable="gcc" failonerror="true"> + <srcfile/> + <arg line="${linker_flags64}"/> + <fileset dir="x64" includes="*.o"/> + </apply> + <apply dir="." parallel="true" executable="strip" failonerror="true"> + <fileset file="${libname64}"/> + </apply> + </target> +</project> diff --git a/etc/lwjgl-2.9.1/platform_build/macosx_ant/build-symbol-list b/etc/lwjgl-2.9.1/platform_build/macosx_ant/build-symbol-list new file mode 100644 index 0000000..410c262 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/macosx_ant/build-symbol-list @@ -0,0 +1,4 @@ +#!/bin/sh + +nm -g "$1"/*.o | grep "Java_" | cut -d ' ' -f3 | cut -c 1- +nm -g "$1"/*.o | grep "JNI_" | cut -d ' ' -f3 | cut -c 1- diff --git a/etc/lwjgl-2.9.1/platform_build/macosx_ant/build.xml b/etc/lwjgl-2.9.1/platform_build/macosx_ant/build.xml new file mode 100644 index 0000000..d5b5deb --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/macosx_ant/build.xml @@ -0,0 +1 @@ + <project name="OS X Native code" basedir="../../bin/lwjgl" default="nativelibrary"> <property name="native" location="../../src/native"/> <target name="init"> <mkdir dir="i386"/> <mkdir dir="x86_64"/> <property environment="env" /> <!-- Check which gcc we have, newer releasse of Mac OS do not have gcc-4.2 installed by defaault --> <available file="gcc" filepath="${env.PATH}" property="gcc.name" value="gcc"/> <available file="gcc-4.2" filepath="${env.PATH}" property="gcc42.name" value="gcc-4.2"/> <condition property="gcc" value="${gcc42.name}" else="${gcc.name}"> <isset property="gcc42.name" /> </condition> <!-- Ask Xcode for correct path to XCode tools --> <!-- Will fail if XCode Command Line Tools are not installed on 10.7+ (Lion) --> <exec executable="xcode-select" outputproperty="developer_path" errorproperty="xcode-select.error" failonerror="false" failifexecutionfails="false"> <arg value="-print-path" /> </exec> <!-- Default to /Developer if xcode-select fails --> <condition property="developer_path" value="/Developer"> <isset property="xcode-select.error" /> </condition> <!-- Detect Mac OS X 10.7 SDK in new Xcode path for for Mac OS 10.7+ --> <condition property="sdk-10.7" value="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk"> <available file="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk" type="dir"/> </condition> <condition property="javavm-10.7" value="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk"> <available file="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers" type="dir"/> </condition> <!-- Detect Mac OS X 10.6 SDK copied into new Xcode path for Mac OS 10.7+ --> <condition property="sdk-10.6" value="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk"> <available file="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk" type="dir"/> </condition> <condition property="javavm-10.6" value="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk"> <available file="${developer_path}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers" type="dir"/> </condition> <!-- Detect Mac OS X 10.6 SDK in old XCode location for Mac OS 10.6 --> <condition property="old.sdk-10.6" value="${developer_path}/SDKs/MacOSx10.6.sdk"> <available file="${developer_path}/SDKs/MacOSx10.6.sdk" type="dir"/> </condition> <condition property="old.javavm-10.6" value=""> <available file="/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers" type="dir"/> </condition> <!-- Use old JavaVM.framework location if nothing else is available --> <condition property="javavmroot" value="${old.javavm-10.6}"> <and> <isset property="old.javavm-10.6" /> <not> <or> <isset property="javavm-10.6" /> <isset property="javavm-10.7" /> </or> </not> </and> </condition> <!-- Use JavaVM.framework from 10.6 in new Xcode path if available --> <condition property="javavmroot" value="${javavm-10.6}"> <isset property="javavm-10.6" /> </condition> <!-- Use JavaVM.framework from 10.7 in new Xcode path if available and 10.6 isn't also there --> <condition property="javavmroot" value="${javavm-10.7}"> <and> <isset property="javavm-10.7" /> <not> <isset property="javavm-10.6" /> </not> </and> </condition> <!-- Use MacOS SDK 10.6 from /Developer if nothing else is available --> <condition property="sdkroot" value="${old.sdk-10.6}"> <and> <isset property="old.sdk-10.6" /> <not> <or> <isset property="sdk-10.6" /> <isset property="sdk-10.7" /> </or> </not> </and> </condition> <!-- Use MacOS SDK 10.6 from new Xcode location if available --> <condition property="sdkroot" value="${sdk-10.6}"> <isset property="sdk-10.6" /> </condition> <!-- Use MacOS SDK 10.7 in new Xcode path if available and 10.6 SDK isn't also there --> <condition property="sdkroot" value="${sdk-10.7}"> <and> <isset property="sdk-10.7" /> <not> <isset property="sdk-10.6" /> </not> </and> </condition> </target> <target name="clean"> <delete failonerror="false"> <fileset dir="i386"/> <fileset dir="x86_64"/> <fileset dir="." includes="liblwjgl.jnilib"/> <fileset dir="." includes="lwjgl.symbols"/> </delete> </target> <target name="compile" depends="init"> <apply dir="${dstdir}" executable="${compiler}" os="Mac OS X" skipemptyfilesets="true" failonerror="true" dest="${dstdir}"> <arg line="${cflags} -ObjC -O2 -Wall -Wunused -c -fPIC -I${javavmroot}/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers -I${native}/common -I${native}/common/opengl -I${native}/macosx"/> <!-- Map from *.m and *.c to .o --> <mapper type="regexp" from="^(.*)\.(c|m)" to="\1.o"/> <fileset dir="${native}/macosx" includes="*.m"/> <fileset dir="${native}/macosx" includes="*.c"/> <fileset dir="${native}/common" includes="*.c"/> <fileset dir="${native}/common/opengl" includes="*.c"/> <fileset dir="${native}/generated/openal" includes="*.c"/> <fileset dir="${native}/generated/opencl" includes="*.c"/> <fileset dir="${native}/generated/opengl" includes="*.c"/> </apply> </target> <target name="link" depends="init"> <apply dir="${objdir}" parallel="true" executable="${linker}" os="Mac OS X" failonerror="true" skipemptyfilesets="true"> <arg line="${linkerflags} -exported_symbols_list ../lwjgl.symbols -dynamiclib -o ${libname} -framework Foundation -weak_framework AppKit -framework Carbon -framework OpenGL -framework QuartzCore -L${java.home}/../Libraries -ljawt"/> <fileset dir="${objdir}" includes="*.o"/> </apply> <apply dir="${objdir}" executable="strip" os="Mac OS X" failonerror="true"> <arg line="-S -X"/> <fileset dir="." file="${libname}"/> </apply> </target> <target name="nativelibrary" depends="init"> <echo message=" GCC: ${gcc}"/> <echo message=" Mac OS SDK: ${sdkroot}"/> <echo message="JavaVM.framework: ${javavmroot}"/> <property name="universal_sdkroot" location="${sdkroot}"/> <property name="x86_64_sdkroot" location="${sdkroot}"/> <property name="universal_flags" value="-isysroot ${universal_sdkroot}"/> <antcall target="compile"> <param name="dstdir" location="i386"/> <param name="compiler" value="${gcc}"/> <param name="sdkroot" location="${universal_sdkroot}"/> <param name="cflags" value="${universal_flags} -arch i386 -mmacosx-version-min=10.5"/> </antcall> <antcall target="compile"> <param name="dstdir" location="x86_64"/> <param name="compiler" value="${gcc}"/> <param name="sdkroot" location="${universal_sdkroot}"/> <param name="cflags" value="-isysroot ${x86_64_sdkroot} -arch x86_64 -mmacosx-version-min=10.5"/> </antcall> <exec vmlauncher="true" executable="sh" output="lwjgl.symbols" failonerror="true"> <arg path="../../platform_build/macosx_ant/build-symbol-list"/> <arg path="i386"/> </exec> <antcall target="link"> <param name="objdir" location="i386"/> <param name="libname" value="liblwjgl-i386.jnilib"/> <param name="linker" value="${gcc}"/> <param name="linkerflags" value="${universal_flags} -arch i386 -mmacosx-version-min=10.5"/> </antcall> <antcall target="link"> <param name="objdir" location="x86_64"/> <param name="libname" value="liblwjgl-i86_64.jnilib"/> <param name="linker" value="${gcc}"/> <param name="linkerflags" value="-isysroot ${x86_64_sdkroot} -arch x86_64 -mmacosx-version-min=10.5"/> </antcall> <apply dir="." parallel="true" executable="lipo" os="Mac OS X" failonerror="true" skipemptyfilesets="true" > <arg value="-create"/> <srcfile/> <arg value="-output"/> <arg path="liblwjgl.jnilib"/> <fileset file="i386/liblwjgl-i386.jnilib"/> <fileset file="x86_64/liblwjgl-i86_64.jnilib"/> </apply> </target> </project> \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/platform_build/mingw_ant/build.xml b/etc/lwjgl-2.9.1/platform_build/mingw_ant/build.xml new file mode 100644 index 0000000..ed8db17 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/mingw_ant/build.xml @@ -0,0 +1,68 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, native code" basedir="../../bin/lwjgl" default="compile"> + <property name="native" location="../../src/native"/> + <property environment="env"/> + <property name="mingwprefix" location="x86_64-pc-mingw32-"/> + <property name="mingwhome" location="c:/MinGW64"/> + <property name="strip" location="${mingwhome}/${mingwprefix}strip"/> + <property name="gcc" location="${mingwhome}/${mingwprefix}gcc"/> + <property name="dlltool" location="${mingwhome}/${mingwprefix}dlltool"/> + <property name="dllname" value="lwjgl64.dll"/> + + <target name="compile_dir"> + <apply dir="." failonerror="true" executable="${gcc}" dest="." skipemptyfilesets="true"> + <arg line="-c -Wall -O2 -std=gnu99 -D_JNI_IMPLEMENTATION_"/> + <arg value="-I${dxhome}/include"/> + <arg value="-I${alhome}/include"/> + <arg value="-I${jdkhome}/include"/> + <arg value="-I${jdkhome}/include/win32"/> + <arg value="-I${native}/common"/> + <arg value="-I${native}/windows"/> + <srcfile/> + <fileset dir="${native}/windows" includes="*.c"/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <mapper type="glob" from="*.c" to="*.o"/> + </apply> + </target> + + <target name="link"> + <echo file="jawt.def"> + EXPORTS + JAWT_GetAWT + </echo> + <exec dir="." executable="${dlltool}" failonerror="true"> + <arg line="--def jawt.def --kill-at --dllname jawt.dll --output-lib libjawt.a"/> + </exec> + <apply dir="." parallel="true" executable="${gcc}" failonerror="true"> + <arg value="-Wl,--kill-at"/> + <arg line="-shared -o ${dllname}"/> + <srcfile/> + <arg line="libjawt.a"/> + <arg value="-L${java.home}/../lib"/> + <arg value="-L${alhome}/libs"/> + <arg line="${libs}"/> + <fileset dir="." includes="*.o"/> + </apply> + </target> + + <target name="clean"> + <delete> + <fileset dir="." includes="*.o"/> + <fileset dir="." includes="*.dll"/> + </delete> + </target> + + <target name="compile"> + <property name="libs" value="-lkernel32 -lole32 -lopengl32 -lversion -luser32 -lgdi32 -ladvapi32 -lwinmm"/> + <antcall target="compile_dir"/> + <antcall target="link"/> + <apply dir="." executable="${strip}"> + <fileset file="${dllname}"/> + </apply> + </target> +</project> + diff --git a/etc/lwjgl-2.9.1/platform_build/windows_ant/build.xml b/etc/lwjgl-2.9.1/platform_build/windows_ant/build.xml new file mode 100644 index 0000000..907ed19 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/windows_ant/build.xml @@ -0,0 +1,66 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, native code" basedir="../../bin/lwjgl" default="compile"> + <property name="native" location="../../src/native"/> + <property environment="env"/> + <property name="sdkhome" location="${env.MSSDK}"/> + + <target name="compile_dir"> + <apply dir="." failonerror="true" executable="cl" dest="." skipemptyfilesets="true" parallel="true"> + <arg line="/c /W2 /EHsc /Ox /Gy /MT /MP /nologo"/> + <arg value="/I${sdkhome}\include"/> + <arg value="/I${java.home}\..\include"/> + <arg value="/I${java.home}\..\include\win32"/> + <arg value="/I${native}\common"/> + <arg value="/I${native}\common\opengl"/> + <arg value="/I${native}\windows"/> + <arg value="/I${native}\windows\opengl"/> + <srcfile/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengl" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengl" includes="*.c"/> + <fileset dir="${native}/windows" includes="*.c"/> + <fileset dir="${native}/windows/opengl" includes="*.c"/> + <mapper type="glob" from="*.c" to="*.obj"/> + </apply> + </target> + + <target name="link"> + <apply dir="." parallel="true" executable="cl" failonerror="true"> + <arg line="/LD /nologo"/> + <srcfile/> + <arg line="/Fe${dllname} /link"/> + <arg value="/LIBPATH:${java.home}\..\lib"/> + <arg value="/LIBPATH:${sdkhomelib}"/> + <arg value="/OPT:REF"/> + <arg value="/OPT:ICF"/> + <arg line="/DLL /DELAYLOAD:jawt.dll ${libs}"/> + <fileset dir="." includes="*.obj"/> + </apply> + </target> + + <target name="clean"> + <delete> + <fileset dir="." includes="*.obj"/> + <fileset dir="." includes="*.dll"/> + <fileset dir="." includes="*.exp"/> + <fileset dir="." includes="*.lib"/> + </delete> + </target> + + <target name="compile"> + <condition property="sdkhomelib" value="${sdkhome}\lib" else="${sdkhome}\lib\x64"> + <equals arg1="${os.arch}" arg2="x86"/> + </condition> + <condition property="dllname" value="lwjgl.dll" else="lwjgl64.dll"> + <equals arg1="${os.arch}" arg2="x86"/> + </condition> + <echo message="${sdkhomelib}"/> + <property name="libs" value="Kernel32.lib ole32.lib OpenGL32.Lib Version.lib user32.lib Gdi32.lib Advapi32.lib jawt.lib delayimp.lib winmm.lib Comctl32.lib"/> + <antcall target="compile_dir"/> + <antcall target="link"/> + </target> +</project> + diff --git a/etc/lwjgl-2.9.1/platform_build/windows_ant/build_es.xml b/etc/lwjgl-2.9.1/platform_build/windows_ant/build_es.xml new file mode 100644 index 0000000..67c2b98 --- /dev/null +++ b/etc/lwjgl-2.9.1/platform_build/windows_ant/build_es.xml @@ -0,0 +1,67 @@ +<?xml version="1.0"?> + +<project name="lwjgl native code, native code" basedir="../../bin/lwjgles" default="compile"> + <property name="native" location="../../src/native"/> + <property environment="env"/> + <property name="sdkhome" location="${env.MSSDK}"/> + + <target name="compile_dir"> + <apply dir="." failonerror="true" executable="cl" dest="." skipemptyfilesets="true" parallel="true"> + <arg line="/c /W2 /EHsc /Ox /Gy /MT /MP /nologo"/> + <arg value="/I${sdkhome}\include"/> + <arg value="/I${java.home}\..\include"/> + <arg value="/I${java.home}\..\include\win32"/> + <arg value="/I${native}\common"/> + <arg value="/I${native}\common\opengles"/> + <arg value="/I${native}\windows"/> + <arg value="/I${native}\windows\opengles"/> + <srcfile/> + <fileset dir="${native}/common" includes="*.c"/> + <fileset dir="${native}/common/opengles" includes="*.c"/> + <fileset dir="${native}/generated/openal" includes="*.c"/> + <fileset dir="${native}/generated/opencl" includes="*.c"/> + <fileset dir="${native}/generated/opengles" includes="*.c"/> + <fileset dir="${native}/windows" includes="*.c"/> + <fileset dir="${native}/windows/opengles" includes="*.c"/> + <mapper type="glob" from="*.c" to="*.obj"/> + </apply> + </target> + + <target name="link"> + <apply dir="." parallel="true" executable="cl" failonerror="true"> + <arg line="/LD /nologo"/> + <srcfile/> + <arg line="/Fe${dllname} /link"/> + <arg value="/LIBPATH:${java.home}\..\lib"/> + <arg value="/LIBPATH:${sdkhomelib}"/> + <arg value="/LIBPATH:..\..\libs\windows"/> + <arg value="/OPT:REF"/> + <arg value="/OPT:ICF"/> + <arg line="/DLL /DELAYLOAD:jawt.dll ${libs}"/> + <fileset dir="." includes="*.obj"/> + </apply> + </target> + + <target name="clean"> + <delete> + <fileset dir="." includes="*.obj"/> + <fileset dir="." includes="*.dll"/> + <fileset dir="." includes="*.exp"/> + <fileset dir="." includes="*.lib"/> + </delete> + </target> + + <target name="compile"> + <condition property="sdkhomelib" value="${sdkhome}\lib" else="${sdkhome}\lib\x64"> + <equals arg1="${os.arch}" arg2="x86"/> + </condition> + <condition property="dllname" value="lwjgl.dll" else="lwjgl64.dll"> + <equals arg1="${os.arch}" arg2="x86"/> + </condition> + <echo message="${sdkhomelib}"/> + <property name="libs" value="Kernel32.lib ole32.lib libEGL.lib Version.lib user32.lib Gdi32.lib Advapi32.lib jawt.lib delayimp.lib winmm.lib Comctl32.lib"/> + <antcall target="compile_dir"/> + <antcall target="link"/> + </target> +</project> + diff --git a/etc/lwjgl-2.9.1/res/Footsteps.wav b/etc/lwjgl-2.9.1/res/Footsteps.wav new file mode 100644 index 0000000000000000000000000000000000000000..074c9366d3186a8d7c14686be82765ff21fd1972 GIT binary patch literal 282748 zcmYJ62Y3|K_x@*QOL|X$5FnxV-bJMd2qFrI3Mi<cporKjprWE;7eqnD28xKiD=19_ zQ3UBlq_;pqdfDBX`M;l;-}m{m&xYNZJGY#B%6rba_wJ~ng9qO?B4}LO|C&LQ@3^lZ z-7pMOuYsQ$#<OEg!!pv1n{T@BCQD_4Muw4M)G_KANqW`SJI(vV)ifilzqv-1?xq_# zx@+m3ZY1k3*RqX7BUL5hbuH5fsD-+^mZIk~yjtoS1u9inWwX^nLp_zF>sh*+t>@xY zdxHK34ciUqbE@vqeu7szQ+1~4F1017mQ=636r-_Pic?GUJ5zTvygIV=H`6PT?X^?K zXr^`>87*}!U$thc&*`e8p=zU@bhVeEKILh2^;9lHSKH}s13gto-<#-frh1>{^@(vN z>r;|?W_bOAV)QIs6iHMK>FQC6;kwms9j_;uD&1J^LXU>JVye$j*3$oJMvWUX9M{qq z5=6TM)fv*=m|N~vxy(q7YZ}%16fh#XQmVI#7`6HvRJkP87FIo$dhNLJs*k@sm!KyT zRb!m`o~Cbc>UD;`XL;8Wyw(G%Dd<tYp6X`|X<q4oN@uCnkV;jmZ?&%NhK(xMQD4sM zdz|`L<;L8zx?bbDx>BkCYu!q{=vkboKnuL+kL$+i4MnPTzs4=mbEoyW#x2r_B6^qW zO1WO9=D%9)6zQI+5rp-<P~QXUO}y#~s~$(xh*u9P^<=HurgdAbnz|o^IC`$yh0dv> zrC&Otu_WnEqUwWI&>4=i-6TDq;L!~}2zfQb56o(Ys8XWxa2A}MqB_gnsCr=NNoo#h ztc<YMo2`giO;RmzhU2Dsvy-gvLG{{Dj{_=KuAW3yjyh_**{oGP%pjvp(paDzRAC-z zi}sm`c)g;!O1~LxKz)d5<j^LfQV~(OTvw=#vAC))MfVc)nf^pnl9{Vj9SL3?%!R9O zNh($0&5;VKjT#p|s?|MPb7N~J4An%hLTa~0ZN<Fys&$V!K#TB~xvz4|R98^XS80YQ zQRJR+&$-3!DX%OXa9p!ruB*kmUaB(O<?~r_MxmZ6*55Mk|C73VS`>$`BJM%mKdC$A z`d*=Tp;wxx3-xq~d%``Ux~uemiSC|JIclqQ&+9K-hWv1aR?lgajNkU=pi*?BL`46e zQyHI6%T!-fSE}`f|D$T@wC<l$$r{yOtIw1u)fh|Mqu!H8-D4_qLM5a6L{Aw>RQ=wk zZwFPTNbmFN=XsSmp}W;ypDb^#%XGEOqmHefIl6a7Pg4t&gi6(V{=8R%BO1^LS}0Q; zmgWX7DAs-C5z1C;bi7M6BeWCKy(;f1<g85nLJE=S1aTXhw^n7DU!)K{m8yP01IJAk z4+L~4L)>Vpysi6`hvN)MP?Bnh7kBvFfX?Dc$E!c8zQTcVDqks?3yPOqeMjHNR4OXY zvBa_HIAp6v<rzP-UatP2V|dwara0@oHv+U$nMyhuu_Mkjq??#Ucndy<?yjzcBvWvv zqf#}x4>vKN^g2%cjp~}E-Y4sO*kDd5jlQMT1kF1VNFOV_zB%4?bZ1EA!=9vA9%YhM zig{;d3<K&?drT5oq5pk78ufUy*z04!>l3<_nKnIZ7|}O0rlp!Q)k3y<hIP%<|7o%z z*ctRbn!16kN(1$cdz1>whULh{<Vjy)*|3?}suerU6WJ=mjArSTujf)#j(I~*)>BRC z|7Z0YtA<9pf;P)mi5#z7j@rpkuacx0sflmNstMadjVZdCuNvy8y$t=I>-8{Owl7cD zTj)itjlFhKMZLrBc6Xz@*8R=h?`9cy8jl)XRmTzcQTIakad(7K*Zj+D5cnrpFYd*} z<g~n;!wohzf4xJ89wRP#Y(U#V+XpSV<nex|E^O0tbeF1*k9Yj4<EHk(R<rYy>i&{C zF0iOP{n(1#hqpfY*SDMZ{dMz>ZTsv40}f>U_tL2$Wt%I%IsfaaZl{V$CYrBh-r4Y* zf(1=lG<&KbyKd*?1;((7N6uVu;E|0*-#xkFijOZ_e&VwxKP+AM%-`+z%{}^FVat;1 zO3$7@QPQNQZD?fXpuBGjy0jSC{;qDn_5Qv0rp}9--&6mQ)a`D=vI%F$72jR;a4g<V zj6LK28s91F_Bz*Qo=rQJ@l9ISxJ|~7&V{k*6@yPr-FwlN37dc2{QSn>*1D^nS$V_i z$nSS-`FPvn?N96;@?V{^36ZCRqZ0CyXJi)V{nqr_R!_I7-|mujd)wU5YH^d*^@G{R zlg|bgxwpE{)%<W~)1K6gJ6E0m>Hbw;|5mlV{P4MxXO52D)8X&#e+PHA-M{5fb>TpF zORm|)yg28ghkO3mBfam+%lnPVykX*v^T$4N`RR*Cb?emTjfN*uORVw6;PAJ}I};DN z>nj?Te;K{qTviiz(%jp5ck;ibM>?OpqHtT$f%9({KY6<U;m7wsvG11ykN!JgZ;QVl zSZl1DwffNJy1Tpn7dTbFv}5fH#=oJeQ2#*KyxkpT7uA{-zZa*J%&lr-98G*Cb7@YK zI^Wk_lNV@od0s`%wb`R{m*y{Sn$&V(n|kdNI&JRStLruGQkvIoa(UxX1uYBeG%jd7 zuTgGZi~3{oe$0(!zMj}6)ZJR{tcaYiZd5ZT(m6V``gCbt>4wVv(L3Dv?t^ycnu#Ux zr~4ntI@oLfQ+v1Ut=P9_?;G2{|Ksru8Gru0chTvNRr?&<DvH~ga&zWYb>6BsC--db zU-i;+Hl@CkFgc+~`gaX3Z}m?*qus>TzqB~r?DZxc8@^lTc=nchzt#V!&Qs}T;!5NF z^4m|mxxe+U^*bKik+bu{J+B>{aboD%F=y{QS#tQy!D0W}`}_Ud=<xH$s!lXI^VRvg zYu_~!LwAHHBo*cCY|_8Yg)KjBxIO!xjJGn{r`T3pq+3;&>cnWstu#WxElH=czs@Uc z_-@`)xzYL~8ZBseL*47r;u2EBYl81uh3;#{U7;@$f=O2=R>d6*H3^p{uFa^)=$=qx zZ>?-oW|UoD_GamZl1s|UD?f>BaDNM)Oc;>zYf?tIabQ<yWn4wDl`-GB)_gwnWkTQ7 zUo#Kp%&q%w-6h#Q)1OQJJTaJDFZI6UcSCo@p0Dg&kzV_fdwF0=Xsu?lQT+CVwB*y7 z<qh9%{#f%L8Xirn2{_KB?hxyx(AM}zk{YJ{QztEdcaw1ArVU=LSDBrj+Boilz#w;2 z<b}#!#g`v@V*mYnNBz6_Sk;;Fh4#^zdxBef{84|~;D3KPzU9=jXTCmr=G?5JO~orp z?<&8m{GRfs%HA(2DeiS{*Qpne&p$Erbjs<xlbugpTl{eCOM%t#+vA^!e<106T2A)O z^>P}vDEK1(#`*)&<HL*G{<UwHeN%M#=|_*9IlAfOvNO|8jXBbP|K#0`_ng`L*uL@m zj~{sRVEK{H&g?1urTX$%nK3PRIy^M7IL)g2Qr@@qU(2pYj>dfv+7NsrkZE0Ou5-sn zW|lo%w54ciNm<!z<=JIb=MNXZTeR@(H-#t8-d41(cwT8j)%@7_VC$rbY17glODPXE zi8d^`{M3M>xkpwXHV<EPX#Am^BYlofIMci&qo&kt7jnYShv$ZGiJy>Ip4dLAJZWvp z&U7cEXKHe|Q7pZ@{<#)sZaSM)a(%_Z>Z@xf*Cy3|6uH;!7yc)CSmygV4RYqEA4`Y@ zrW^m+7e@cB`LXJBd3tHP^HYj5&rd5YFP~rWc;%tUtHFgS&t+^(KbbrvzD4+^xSJC9 zrrer7F5^^so3!~!8F3Q=gU#QJT<dITYI3*iirkO$hSYCZ_tC7Y)2mXtCzZyn4;RM2 zkbGy_kc`TV|I)5aZl82>%57<VQr}2i8*<&$NK)m*a<gWZxjFID^vM}5(kc`4<D$X$ zLR}L^CeKb<65lVOW9p>r)wvJky;1MWtXI=kB&Q|Lh+7}*XO4=!Ts5z3Rr&VX9mYT5 zXHxd$6g7A!|7?T&y7MwdrIaLgNS>7bT-N)U<5NG5|0-Y`cNmWwgN;GP1?CuQr4_I; zjc1(w&S`g<vC8})@J6^^(x++F87nf@r{0tBcp&07b~`v<M82)~viR@9ZiQRUwk*26 zD68njqF2thEk9gy+;}_jova1*UaYq$XHLcwDSZ;(j(ab3Yw$pzL*PfV$hk85NzH>b z|JL3aNr{9aLu>!3T2e8n;+l#%<<Zj8l6%YMRc~-+g-#_5O=_EXS^TiLKf)J>{;_%* zciCyt`)jYNIal>U<%Wtz6;G9KDsNHIt-Mj`N5yl_jXZbF`9W2ajSmt(%6KO`zRsq) z_vSv4`%Rt9%+FK8iMip?=8#yUn%c@HRhy~{YqvySiH(Sji?y-8bLP3boZYdHBNJ*L zt(_U&?~Jy#2Ybi$N_;-~r<75t_ohCSGBjy<e1q`Pz*6(D5jB4gejMK-B`4#D%pMsX zQ@=~vnYcCS!IU>r$`fA>wQygnt*%^FF|Ojiiq@4|tNPT|kA3Ah?lfb%nGxI(_iW-d zN&AwLQtM}qs*_W1d!75TK1_Qn`CP)Qapj@sL*qkrf?FgFFSuWsp9J&6uZGfsv#dO` zzVWf!+il^FcV`(r0)^od(n|LwJ{rFw)WX{79Efd;&37V3sr5l1A@Hbq(0#$V*M1=O zVsve!v}Sl^yOKI*UpRI7scvTvl%A<s>h!Q)2}G<@<`HvEpnrH++_F%dwaob|_D^i0 zbAj=vd5!geIoEA$KOb3Gv$Fb+>VK>MsCu{Jy0THF!Lo}gmQ~HH`K)$)<a}gAv^+AS zc0qOhs+%gWuY9j^TV+U~zS`bwt_wQhh4HT@{FN{zp)h`2d}`cX!TLs*=mXUoD#uo} ztmzSH673lY)f86zQ5rZuwrE|^<nyOWJ}hll=9K+fe!Tpx^7Qg+%AP8{xb$@Cy0Xn> z$4dK_wkVrd@p|=-wKqr7Bkdx?qB~<h*w5L`^qOo>wTIYk?b-GlPIn{KIuLj)v@^UU zu1DPUp%K>iPQz$}n#8Jg6$2{jRrIXrR@tjMTKjfviqpb<%YDz7WQ`6U4~61d#=jST zOWe@lB;$DO&&a9TmunVPzFxY#Xn0}!Q-#N;AK!3d&gs7ACYD@Nv8{Siq%8VpEY)sd z|6p%%?l#`FJ`QGv-wuBq{y{n?7JScq+&);lzIs&k*VP3zBWw0l-&@tV@|TLIEB92b zt!`dZP*Yo7w`Nbx1(8U!gR|1e3Va=WB{VbCKKPA!vD?SF)-AA}4t0$0n2?p=#=n$s zI&p6D!jyR_UnRev)Hmtlq?eK>ru>{TH|5#nm5GnUKNr3!)FQMq)K&j?44ikD$MPc+ zYZg`iReiqZ+sI3?Vtbjh+_}|x&-uU|Vm1wY6%2;X2M(E^xP6^Q&V}y7MmzInbE27O zjx=^S-^6Z@45@jls!`>DijEcERKzNm)l82qF}?|w$8AdZA@PT#<H;vd+N6G(@?-LA z;=&sero=Cdn-iWA+8q2gxIcJV=*`eGq3qD^U}f-)(Cy*6abx0I$2}gN5t<gP2}}+? z9Xc958#gSzIxamf8hSUl$Xe%4iRIVcRCPzi*z)@2H<o{0{zCcJWq+2QC>>J1uX0SS zVGlQsSbqdB3(t<*7k@`$Y0~cG^~uFak0qXu9}~ANG&=aZb*Y(T9C3cJe~HD%GGnu2 zH`_NmUEG)DCnTDitv;ddacAP1$6Xa#68O-XWbLp%3EUIh6&w_tY8`Vgu?wP&Bf}%3 zqF=`j*>Udm#$NNIz}=y(;b-E;#$6L$68y+IY|M4vb|yNDoUU$9W2<>6P!xJB?vD7a z@yp|HjPDv>5qE3c-0+If#^Bb#+txtyfcuV<?KE^Qa{hHPjfv*#){wycf$o9fR+hQi z{m{`IJ1;mz(me~LW52W>4AcaA1v>?!f&T)l0}lq)Sli9j#w+f#&N=(6eTQ>}JJ;xK ztq+V5Mf--QY0TFIzO>S<+s)^UN8CT09!{e3iL=1H$#`GB!3cM{^NPJbRzLPrv~P4> z<d(?Qky()~k-MY4W8>@wZe8=R^?2}u&^_UTxGizr<Cnzmi~l|Tqxin@%i}7;6`{q! zGHZdk*_bMS@NV~UXS)4itX-@q`cL$)XtP*%d#lsem}TB%xz>U}m*D*1Tfy<c!-3}m zoz$oEW|4fYd^gScB~}^<)qYUDt!j4F`l?ygt7`6zTpcU5OPufACB`%6L)NQ-@xgb3 z4+T30s{?-pE({E`hL}^0H{GdDlD#tej-+s9ZAI;($Q#iQV(09;-MvP>)h%#1&?eY5 zxF;|nkP+Br&9nMjTg-0e>xw*;%F9`1bT-GD8Rk1iH>0`nm~plFjWsB^HPkJxbNsCM z{P+oR{lY1s<AMFwNpq|5fxF7daQ?9CIH#R-V}f~wwbUAJ%{KosE|qs$UmjC)^G~yr zwZs}2NDVFy{uCT7%u;I&wVpJ;H_o~3-KCnx*PZ`_(6+c^joro|^A_`NbCJ2z>}qYa zJ_;-hW{1*33xi(<%B_p6MUu1!&G%GiyfxB#TTbmgf%gJ01X>0jvR0TObC=Q4{MH<5 z?X#{8d=)qqSQY3Sc*QzyE;T<fx0v6UcbYZE0Hcw+(S9oSX4HyKihNQ#vi8B+Ea~HQ z(f+aLV!y=_?J0J-J=OW%DRWZYj`H-*h%Zd@G4mhuCo{!7;tq3OkL`(EQQNuZ#_B^= zUsa`4|5sgF(>^jK`b6wjJ8F-1zIL+QJKUe#3ydT)(JHo{4jc^Z3p^VrwJx+Kn7xe@ zH_Mr1SHw2NR>}i=%q~%TUpSvT{hj;lYhoj#^CG#CJ+;r&cBuWNW<<?>HJxkwM_!EX zjYaJQ_jAQ0K6g{xTO7-2qi3#hf0lpxhP%hvVt)~PINBysQM0l7MAf5JpH|JNo?UZG zZE@}8kq;yFqo<>#vA)hHZWHr)Yf)fKurT;Q$PV2So)^A2JW956oi)-t?SAQeXE(7+ zV+X~l$Lxj9W$v5qYqFg!+|AAyr_jFN?r3M*7wG>j_65$*&Nw&Q_|v$<EYv*TDDBYO z%CyePGyc+CZZ0&R*Xv{R4f9sBvsqw{Hh(soT9;V;tbtaFwbgvZyjS<vnfcc9)+g3O zRs-uLv(OkKAG^@K*BCB-8WKnht_?O1-5>fYv^+E?bZe+@C?T{xI4-z3kP^7fI%+;? z4pQCC%@X5nql2-_{ax{tH;qTk!Il+xH_#;bUN9&0YUpez6pn??hkgu=3atrt4&E79 zWUVq|#`WUDHHubUrWxL0F1Mxx)(5K8W{=>rK`ZoJs5;aqY=xJHdW6;o9}Tt+mIpRS zQhNnXS+`ps2+uSzCc7J)E1VMhYx{Eh+gQWcyy)oY1<}UQCegvsanUED3!^XU^=S0& z=<sM<v@mi!QYZR$^tRXld!W<Y-RVAQxW>)m=~pC$-y5xs{q9FXFdw;l-E^b9astKf zW_O)pbLVvJa`$_u*6wG|j_r)zrgoM@hsVle3++tjdGXKf&N{m+);!iLdT*qn_H1px z$o9ybXqVVmF*kOF{fd3m9xATRb01MmBh9$T=&ra(q5G-3$bHd$$erkRacd=sFFIYs zNuBJsRZ~(dH+E5MVr)>XGCDcBCvs&ZtXHGR#K;qo*^$R0A4ig+bE5^ZXVt<OdxzcI znI(?=+PU9p?5tHkkH?;g<;Q-D&Wt`BT@&pX`!zP%K5h4K<~vo+G{qXPG(I=VjG!4Y zHW?2o@^ak$Lw&1pdmGOhtBo_pNn@??v$4ZSGj9~<bhXx5vjX|S6T#;~iQ?I&;qOC< zp^m|e0(sVc<0JP8=Vg0WY(VUw==(r)eDwb4#^^<{I6K+t=T0}CHE*^O18)Qpq%l_q z>x4#z9t%AcdN?#ZbTW8v@Kj(-;72RRdRRJSsCeR_dU2Z(GFO?8TSEhJ!Iy*o2Frsx zgO3DrgF6CyRm=3?_Fz$PV{k?=J-9OPNT6+Ci}isuRWk6b^^UdGidszr!=;-(2z;UU z#6XQT%$j9xGI|<6xOYpQK9#n8T`{Cb%r)j8=3C}Kv&>j7`?K6QXj~x;H^5qL^$NTk zC=GN7_Li+}87vKa8@M8{&Z=k4F>}n{jUSAi#&OZ6tJ%&BNE<(^=+!#+2DePSFjd&3 z%&ygptaI*BtZuo{QgRrlKHO+sEZsfZY-_GJrYPdI-M!vj?Ofs<wC4&5zF>c47u#Vc z$+7KU>}hsSyEe8d_MK+<=2(~5pV48_^^vKv_R}M!k$0k32s^j3ud|2QqwEWXC7Y`J zID4^h-6}mj&mJpHay)i8mS;a=SJ~a1p-y`z&8f8i6xtkNkG3DR57|SUcf^(NI#)Yk zXQ7>JzYuE@I~-jbofYjK4Mz`(hs|i6Xw&E=(HYU7qE*pGv2L;Uv9@{*j@=o1IkqIW zAT~etfplp=61du~>r8S!bJjbDoFmRoXP5J(^OmsN*P_EO&I;#AXPh&@x!ifyG2Lf0 z1CxwbjSm#t>t?KX?{qtfc1N63&QWKTv(&lEY38i9Z?)^%M`NpFAM5p5>}To4s#tyL zz%KSAdxrg%y;Y-qT`0PX-A-4>2vzSE-SeH+PM*`!DR7!P_4OX<Jm>u8B)HSuRc@|v zi!{`7wS1{@z`fZ$C+ThH9I)T8Z?Xs37unbAQ>}fCv%|U0-R+Jx{xv3<znfvJr}eaW z!nS$@1_nk2dIlN=imkV#OE;KV=5XV2_dREqdhu?oS1dW!A@+4_j(wMNzk9V|nGcvt z%(ddOugtmT3~}6D=H=!E(#MJB8RM8yXcX&pz}Rm5YP>93^pRdT?yh&=ai5bFyTWbi zo_98hhOasII9EwKn9f%FBfY-VJetmICs(%nWuvco(7e#P$697>vi`A-SpQmISue?E z7n^UJS4hIw8NV3&jSRDsd5w9M*~9E*wl`ZU*f-LgXC5`XSl3(ki8n8_s?9f5-ZJ+X z{~4*~Mbhs-nukrpO15%kAL{FGJ1aw_R-4zErunHcU7mLv#dL}4<{52`-qPuh8B2}B zMy}epO?vfDGhOwzwL;df=5)1OEUojjag%YGG+=vq?qiH;#>2)8W3G3#zpMy3sDIoa z-KDa8kGL1R3GPa9Lmwg1pmWyVZvSR~W3RLSu#bqR-*jTmMCs7a-EZ6v-C6FF?sU!R zt?oE?tb2*u#x>m)&T!f4mG+bNOZFFbjXl}f;AHFGcz1$(oe)L?H&La+ZmJuvcZIm` zALm2oVM#=PXQ0!|$x^Gk#c6ZxmnEIG_KnUq`5hlCd)i03s-s5!r);$1FK!3<xw&pD zca%Fq8vSK=wW9r*Mn8@3XQRkyBZ|#5Uo;n+8_g=Svvq^@inZAK$a-A1Y`E3NYHXF8 zADENPi-rFJW?0<O!fd2DYHa4~^I6%~0g8%$t9qxngWYyQZ#^{9r`#3t6NVTc8t05G z^Ac(5hs;;SX$NK1uT$L%g#Nx$D^FWjS&gi{(mdVFpNwI~F?Y7x-7Rr`bv_UVTp-!} z%K6)=aVng!n<2Duqeghx?QSeIP8mJa?+=CSJ{A9tH`B~j#uFZw{^mX}?bXd~DIRUD zQ9q+OIH$a3vSR)x+?BGJ@94c-8KJ($IOA%~bU))lql-ADgE7!}$@oe7Gu_NItBg|d z{~lwnWFcK>Vzham`HU#hM|g3y#yv+|cAYU+&yN(pv^QFb=Bx#X)2H4V%PrERcZq|p z_3q~@UvW})Y_WRxs`%muA;D$RF8zhtc1qX1=G-e=J;AwBQtwJzd?r0Iz|Iq@YH820 z_u6eW_n$iFoJQh~*WF#p)f9;G*QyUUs1KLRat~8aZZNJfuGA<R8XMia#6Mq)LobzX zyFgr%Fa3Q=JUZLHRy7w$GhZOxGSB|pK4}M?p3V$srRu-fohw|?PTa9fHpev@YOb4W zt}XMZ@wG8oIg-W7bR2LVkp8L_7A&{poMflDdOc7U{xkVsy~TIM?l9v!qk%AXrmWwm z)(PvBq<^zC)1%fc;<0hUdQB`-GrwHAXM|+(0`o#?fNRAot<4JQg?XZBzGQBj`>Xql zuxz<JhmIaq9}@LzjBe&@(h&LLpRwZ9aaJpNZWYoA8>Q3MOS*qB7pUfb(q{=~wNY)H zFm@UL=>3QBk@2nZqp?v}PDsO*8)uDL<EZq?->P@7z9mZkOflaVS}iqAtEpt5r`~m} zQuDO5&WrLFT1#8}EI($NX12RDO&{s(tBo6_FCI1?Fdi}9QU6cL%elgQ+WcEus+D}3 zE37N6A<{RkR96q_v@z=SbZfLVK;M&8_wVK$QQ(wp{UBqf`+!?tUer^v*u$N%&fT(B z`<;l>M6xwey5tM-a|h!-wGuCcFjJECiMh;^gcZ`0Pnc81qdD?*Z&!Y6r8`qPWrTZ~ zbjx*;%-i+%Mrp4m(kfM&txBh!+gEyGq44Bh)f+E4X(`USQyl)AvClYUY&KRIOC%RB z8w+Hgem2(Y`lrThjryE;<pSxcT|)eyIB!c{U)Ad!=Ox*-FP%RnwcW+x9|?UIyZMr~ z8ziBx8n5WJz_?$%n<j1@YBW_ZYm|rn%6&}zyU@*XPdaOaRz8&dpXbbR9+6#MBu((W zG+e|f5SE!K3HU>~$$aAq$=H4B*{jAZ)!so8e%k$09J5wh?vQe-N5so(q>Em6U(##7 zKCN=Ub>Eh@n(1C6UDerb?)Gu7bZ=As?n!BisiM_r_2MD-Gxex}<a?I*<qP8zNy7`q zy+Q_4WFxLLdMImH<NoW_z0_UeZdLx(lBMY)jdF`|vvBKd<9R*zv-s^#QS1-dxecP^ zNh4+?h}(ym6U0YT%pqn+vyORAc4>|AqIhS7(My@eTJ?ON5dJQCaVunTK9IinUTy7D zD~0l8SksfPtZkL%>zKxP)XOcis)$VYIpt#0C8wRG6(*_I^Nkf6!vaz1ercl_qWhIb zCzahV`!rqlsK4gFvn=`zqQM(#X}j{!{iNMisjq{~+s#MK*UgvB>&?FEYkgUP0_oaJ z>HZ4g^M#^D2SqdvN-G~%_BctamRc%C&`_-p6&;>5zL#`$(`a9m-}jcR%=_lM^0|LB zKa-R$mFB+R?5|o68DDA+XBfj}wJl?dc;OYz&~R~S(9P1{q3Y>kjXqO$e4ct%Xw;Lm zTx^apC#h$nMbWlq8}WR|bS1$R#(DV(MUuhe@)I^ou2-rbKWQHRk!N9=t%Qy#9WVQ} zOD(@G>U^xxoRyw$CJl6pH2u>;##_v-X0@4Rbre##Pzbr9G}hl5!)#%vtIeTmzk`rV zuBee@MvWZR*iMo+S$^#;`g@}}PNjw@a`LeGoJRk;Xz;3#%d7HySD4#O$82o%wJx<T zusU0|dD7gc_{Ltn|C09FD2ZMwjW9t-sJ&Wgu6nOD?=WYnme2I`T9qs^ldbO3DU+<5 zgp(#p4_;vP(v>{*vPAXm(d!Gf`>u4tlX`Z9a8pOKiJ}#z^votvWTE77nlV9`=PKEd z>6(ErMUPU^FQ~Bu%%HS>rd|o6RJp9d-?9MjOWtnK+z#}7#m3^Ja_Q*L<eg3z&YA5# zEpGiuT*-<J)`#UA7pV5T#oga%Ca|Wv<e?ljj%bFe<)<_ko@i}06;B1^t?x1ZQVUPZ z&Ri-TR7alZdHGz0TI-Ol)op!@i<ND^Sl5FdpTqm7)Ye)3f5hD*Nm(YIep-6uLFvhH zvi+9|GX#X9%AND_E{mj*qRw%70EeVa-W2Y?MfSG8P`TwaaB}o+Aavf->ELt~uDeWL z!BpAL`<-W;CuDu6IU{8AqV|4!js1zeP_ISycS3!u?1RGle+vQrF7*3{Uc2m4`;=_> z7JGxeTxEW+e-bLJw6kR=d&;XCshG(fs`(-36=#|AgY&zy+F9#-Bn)uBbG__n52usU z(dn*F16019*Qbu^&t1-3>BY^?8I2-N7NW7+P=6b_ZQTMz2b;Nd-83yUOOysJaC=GT zKPGuz?fxf?5Yf64*IQH7M6%gb5sJoI>CixWBvaJP)C!H}!Yn;CtE2UrCQb3M^w%5G z0v}4(e<QE*S84stdTr9{Pg&2kipy=6WNp@`Eyh+|*`wFLvZt<Li+@}rA}QUiCzl$} z$eP?JTRF}cFa0@HnX#vh*Nnx|OFN_y<IFr^j9%h``r?7ZlG5+h>JoWFFAB5IHtsQQ z6+es@f8L{hEs<7TD{H+=@9oC#YX2|wY=>n1l&tv~c@z62<=fQqQE7o>NoPl)`%A_9 zeT4>ENkR+6(WWf;X0<;@dAbSWwc*lu{lr<kN6G>ZmW~{1jFM!GRm($ky_fi}zI1Mx zkmF8whqUB2tpoX6$mFnA^dxBwNWS!cj;tqZ$d2lT9r{#w6@TekS>Il=l^4hk5Aif^ zf1%|e(rXiBZ6?YyxK6L(`hJ=G%`R?NmAS+nBrM!X$i2OrCp*<#UcnXaWX<XeLa=Yk zo;|F3N9k%SA>B0D^BU)*xcjv8m%PMe&HrNAz|F=6Ym4$;9pV<pT^hF~oE>fy$_+MB z)O?d7s*}CfW#(WrT@t=ft6loZuUr%`LR$kL8CS}Nr(1`@A0?(Iy&Lzk^{sP>yxMD= zL2lSQ8u&4MS^Vty6>;x|zX{a~{T%EYd@^v8HP*~C);rJGU&TtIZKAQr^ytNk1{lJY zi<KFgDqmuaQR+luClvX)UyG%h3t4EDp?Li_;n3d|F}~OAXSKA7jeniPu`!BzUKM#n zafN@Q8)8ExQ?EJ~NGF)m%T2Ai=6JWI+ImMaHpu=cR#&g}u@~)`_Div6qv_GK=<LY+ z+KQTJ&6~A7B1<AQktNY7v8M7+$B9bI<ey$AE!)z(*y!W_;5?>y-O*Te^mQ$oO0io= zTNv(V&Jd@SGer`5LinbwGsT`18yj5}`81NL=+&<1kXR(P*`Dtds=lp?4Nnqs{z<Yj z%s481GEjV5skv+6Jfaxf>{v?drD$7a_{`|EXpdNqU1&cmq_bSnwONwvhn$(tFlnNH zq*1o2kFRM=Pb(gnE&ca`q^gH__e)`}#_lG?2=}<(8slX}%7mb^%rVAlA)BejjphxC z=6@R~4E&=w_lm%^fn(NlRtu|0R^><eUq32F-ctF5-sVL{J@-GmN^!g{u^Gy{t+9tm zC$<-7?GR@BLNSgyc9wM91ETkSce3QEtME#HbFQLEW5v5~$`-#WX<IL8E|!-m-jLtY zPZ5C>+3p6Ct>)$^+35cyJty4nBnc<o9*U|I2vH1@=l`KfWGL$Jk9k5dh)VNLD;Rht za5m6BI5oIDXa^^Reh<Y$+e1@Bi-PY5W?Fp}A)h0uxI@^WTIg?*WT}_*TLam!sL{YY zEv!*Ts|D*yW}g+chAaDaldMZv_T?sd{Bz_ltTlu3Y45k*R5b2E>sz&WdEl17jf$HT z1a?~w3zwJ3;yz_;b>CGy=9n>07Pg;o`_0y!*1f{)b*#^1fgh6{UnC6B-m}X0m<_FS z*5`rrU`b$ppj#kbF~6q*I|9c7-v?R;9#@2-Mlr@L%|@zXg1Z9GDZ_H7wM^*gA!(lb zq~(5)28$PE2g=L(Ti=&SvxQ{~ACpE-l$O3yxNw2+;{j>cQh6un$}Dq<Fx>C%{X(ll zG#^j6&&vPq@20!QC27w()18-vpFfthSSlMc-}B3^ayPi`rHj|d|Cy$Be%FiVn>xqs zGJB+A51r+gu92O{@K(P4ElWOF{=wJIWO<G2?Dy@Z_6LgI9Z{sAu4H0{u>SYX7Da%T zDgM*dDVHZ`$ZFjsv_8jqL+$?R#n|ptHe$bY#<g}N_G4^W?C)5veWz^V4!g0eT@!KI zBhq*W<u6Q<<$K-vNpX&|vTrAxJ*s=RKE)K9ZYNDRT)NP3|I*bm=Ssz<e-t`iE8k*< zeEcHG-Zni~;=~Kh-yvLnu{^v2p{`xRQV$86JtJGk%GGkw;41g9toaamR*z}iu5*dd z{+-gc$AkzzP;T*h*~#x@!9voA6^g}n6SY^%9yV88?k#ESVdD0-Zb;sBv7(2+${xp@ z8x-w|$PVmr?~@hYDtiCtG?Z5V(EUWdRZsUnMe~Mvlzc+k=@Yx!9;L`%GimS3G`bYY z^tICG3+0_PaDR4g5I*=+8vIU;a=*B}wY2gWS<f-@EyfwQ30F^$R1KE*G*`B8rMTlt zc|Kdz+G6=ywbDUjjEO4S&$vX^{AJn28<bBuBmeaW>E8*`BZ+$D$r47z3-iTkF9>yg zt(sQLmX{e#gsWdyY<+{dS$KV{nQDF|Pb(sC<ZgF>^jTeDj+X8~*`FVT@dnC5J|S*? zNVa{FT766!VYVoKgS??!y}GD(cN!0>PX*G3zpIwL8dDP?`58h1?+JN-A&js>R@^b# zN@rXxOC2YQzpR>OslI{Y^q}##M)#IhT_(v|-z_QmNw$BJ^v@C5aVYSrYWiG0)>fhT zfN*QAu)r2w`9so_tmwjEdE-Nc1ac&KTlK_p)pCPu{e`mqV?@az@|f@!|C64o)E<c5 zimf~=>Ks&kr&Y)AYV#h^GbCSUjk`&a&~38*TK*_q^qV}h^Xge^tuM9Yz0cLWwigO( zCiK}*$gGQdi#yN#TAt_6@)Um%Pb?Hdy;i(BNEH28Na1fG=yw&T`bv8B8gWBiz1xd3 znhFVYms}4O*IlB&7r5Dq1+I1$OR8TNm+f*&<q?mU9$c$_tQL3wCVax)gEaYNtt88h z<&&{apM4Rv8sDcX`-1%8Pc?#CjkA;RInk?nTBYo`jfAnMX{4JCL%8W8MMCPzN7^DD zc~J8;TD*6^W)}1|LtF^e`ioMdHA_Ug-j<*Fxn|}kMJCp2Ru?Nqa;u)ZUzA*_x%yAY zY^z>tRO)3tai#ibDA(|nJm?n`Rb47OQK>jjL&;jckUo)tOmVg;WYs{NlqO$ery_VC z2<NZYC>x45`U|D?(c0r;an(Q43A;R0woX+3Rb|;@k*;U!h<gvohn}hULaik4CE42r ziY;zXWWP*kx=1m`IB62%uXk&%K2kmVHLJgCRvz>a+RgHgpO%(=Q2J%8u+@c{pT3&E z>xAGY>F*VaB8=6&dGeswYd()j+gR!``(5I+ALD@MoxG`99#RW;OSYd87rdkL)7_g? zTU*Ihf>2z#G)s+><i@#<`gK}bEm_xmM1P6e7_S(`b>fJ&ZXIz+y11*gGJyA}$3KcA zi=>4TG|va6kM^hshT;?jihs8h1uT6|7XLb;(;9K(`=ZAxam;r0wp3KVSUT=K<10n4 z=4zh%Np4vc&1!mft@wL;BB~!fx>5YIR3ms_HEq`pjUGbF!=#(WNouYWKMj|pwA9?4 zR>_~l;qw%GS+37DZgWK?u9u#;Puk)-m20P7Wr<63^r^Ap7Q_<v3T0QQ#X91EZmRbZ z$$T&IXh-=iL!|pAilgQjPl+o(5sr9U9C@>R%#NDp<{DvB$@B<~;A!cPr;V9j%x0uG zrK{wjnK+4ESM?OPyG|a(Txp+Q<&TyamBI{hreQk55^aQ!u9VL(NE$L;zVbHN<hRAk zGu84?^`MpdVu_Nch4O2~hxOzc)Dg!vRjpmT{6T?6m8574`;&6S<^A;3P$83nl9o0a zX-|D4T02D)yI4=K3cgl!Jt4l?uGu@LS_@^Z*l&}d8rmp&c9~)=<0PHaBstfMDkJn{ z7mc`{*7~2*Y;V)wQ>x>b=6;o8rpqN&ugNFBOIBsNtk5j2T6j)#@tGoh2c+eyRd-BY zAv<|8)%%9h1uZ;@%TZq{G|%j?$kwRX1IKFnn53y%yuuzIe-A;Kq~u#k<6_ClVzswe zI(oiZ^}l~2S=cI_LrwV_^HrLQhZVnhU(|d<He;%&(o?eze|FGJH&FYz>IZB3>uIKl zBn=Rc3=!QfR*81%OG{C!tGJ;+vQ;5^ZIj;nQ?C;m5izeedbL)KEmWTUYwVHB6<1_w z#uB6jV~SH96^(xvmH&~hEZ2yVRI-_B@8Z?Zo;h~hrKu;0(mg49#p_D4$Ei>xM{}F2 z{uStIBlWhSSEi17&5lD}`KqzGxV5$VK3e0xMV9PEdDO2d_K8nBL!-Y*JkV3mn9>eg zWl`2>);22Yw@I36hpupKr+Rrr^AzXB^LlCItyOPFQGv15SO4IfGb*!Nbl52EzedmP z6z?!wd7k{bn#=9dhQtxyQGDbR$^8mx+HK;3oqF<!D0f=(SR{`nMRhh2<)Co~@oG0w zvy-Trr}lC+Iy9NTkLQF?)^73ILG|?y_54@W`nj~i&x%feqt_2=bC<Z0T__Div8Jl2 zi|Xs($sm$ipgC$O`n3@KlEht=;w+g1&6B^Evz~a&(KR$dk?NrgJM+lH#l(YH26o4s z)+kP>|0ne6wC*J6`7E{5RF<ui`rTSBH&;syH80E&d&StB6jhuvB)Vp6%<a^VHX0|< zkrc09_IH)2zA}yBj5M4j38<$RyCZ$An4;E`J-WoH&QekFPto8TY2t;_cMByEE2Ulc zs$WHF&k_|{sh##7DjO)9)mxti3Rhhs9_c5YIY9ppkX&CS$sR1;7%a<ni?q~uN&J1{ zm`9|6?w0INmKGx4Ggx}Aoo4DnX@(o5@21E`Kd7?PC1n#8*O;m+x2lF)b$6H~rj;mB zpx(2?E+(o%y#$RmRWylL1PD27=TV`hJ~3bD|2$ErMpP&g9ioyjv|PTfHxw<>b&owU z?Cy(+=l&B%9FSD~t#SV;u2`p;*{1ga@dBI-ziro@EqbjNr+g>Pu|#xwO<eheUU$iU zPLp+;B8+~6wAP)nm9rG@ctHP8(YNtJK%->s2Fm_jA}n;dJitD(#bafmZ<Tg?R_|AZ zBtX)yNfUkS>7(~G8*|+S?i^{qN9Awa>0T}0XNoNOqq1NRsrLD@Wgn^ZH`19O>e)HU z1>CCFO{#gK>b_UFVWxWbq&(aA)!z?PdV$)RsrII-pLgr;{VFw8?|b#!gKA@fMlxPc zPuBY$je-8WuQt9@E8j~yf32~9pq8IguV>2ldQLfs7ghh$s`pLxV}W}8jIKYeJBw82 zNsVEq{*uXfS9PtBgduI83O%iq)c+&;gWwW8jt4z;5r;L>Oyz5y5+t|9;(0ih-M;n3 z4c(=E#^^O#d~%2Q>K^H+Ir5^XNjE(qetJOHX2{AuCcc}YdrwGfFB7gitQcRCnXFh{ ziadiF;p|=V8$K5XpQU=>wrhl|Z<LLmA^ZE5(B%7ieJX_iz5J?QWN%jr>u(Z9{7dik zy1raBzoVAss?Eu2^*-e&CaI>W;^&!q&o`bEf_z>W|7F$qfUZmtU*i#7ulU?JJ#(w< z3V2|VUJK;Sys2@#s`u0C_1(IAjpVGSXwq4_v!BpP56PdRKAvT{RMIp+)aWg3fsA6G zn|oSsh$4Z*G@jc<o7*%R@C5X@*Q3TGUOaM=>PBWS)iX^bU+llllAdJmFgvZ;$DASE z*<5XR7Funm`RF7`Y@$1vlA55b*m-F*b_uiNI$!ttsxO1pPxQhNN%u%)7f0wXQOYjT zY%Mj4-s*o($^HP<IYe5ev%dG$_x{o;{qzi)rlq8pox;4zrRUj)dO-GWpCaak`dlu# zX73{V_-Z^fz+TgGVS++Q=--mx?`1Vs>+^2+FTHn5C$f7Kea5rJihUl@`!7lPO7ZoN z?t9|tk0l)|#NR)A{>VB>I+|dk%HT0=)Av2HzWdZZ-qvw_+NPQ}t7luq#rtIaj_NA= zY}x6GeJ=4L{JUk{*2;R}2R^U&3zC<ml7eq#d$y?k?Rs{no<5}V?0aO4WC;G$bL(ZB z)_Jn`wVwD<eO;~hdbNm7+NSpQ>Ul8xL0OXB(%I~%Ez;|p+Gl?)dll=*j^Q!27xnvy z(ie%N@PE3C@_l5-nn;VXcO82AJ8x~R$KafS9L;JgmFOhB$zS}NRw@m*aMl2JB~4rc z`T<L(OG?4&w3;A$RpjM4*p19S;&XZ(QXdb=!tT|ZEC`uF_7Stcl-;P6-d{&De^7MU zt#XI-cdIPgNtLSBb?{K4^go)vlU^;=|E7B3Gomx<sz;oskgw|vyuSsWY;;iBp5nre z8huxd8%)w!qiP__-at=qN&!75kKEjQzPb3Yg;#SsS(bcVZJ`lot8{|KZtBhceny(7 zQtke)X6V{Ql1k*go9c#E+2Ujn06W;(8SJC8x*A0@^`eJ24lGx9jiI@o0O{A47R*z5 z+Je&TDP=b)cgTgbP>-;Ut<*PgU}LYP49yvPLpdb@E0?S5Ez}b**d>xMB(9IzX(Ku% zs_sk=SFpQ2CjMh5ZmsYIdr_0rI<uRtKCqjgy|l;G_y2^T4rq1`X@0ir?<rk9BCchp zGrOW4d9L6e_E6VI9`H8KNOty$Uw@T6ZI#@Ce7AaaAekU}AE$sw9MyAPuOhYeugdKf zrySDLyH%c@-i0bn55YSjjRDRo(*2#X-fJa^;K}Wt?4MQNKz;1v=41o*S^N8h*~yHA zf~d}^hn%la<@uoay?Bf1qCO{Cq<Hl3+rpPD7Zup|4<fG=z1YpnsSgF>9}pS76iCCD zj0|1nJPq<Ju4W&;P10TbmR!vX$fdPrv#nZVHXG_ib_<*y(D=y9<f(LBmBR<j^R#Gd z?{mJMXyMH>{u)sdPK=;mY5H8|eY5l|919nN;yP&V(Y>9d1Mmjhs>as3+sxzL&boe~ z5Zpj%?dxTq#>g5@l>VNePeWuWdh69oJk&|N)Lp#YOSSaY6XaoUltr5;-{30YKAycz z<wwiL4A<YjD&1Wg2PtADK9bZ>9LV~%o@%*|CzoCIt(&-$XcW7u(Jx_*KVG~62eL|l zD1pECIa3rO2iRDYZ>mxSdIo*PGss(}uCh}*N9FyqL>j10W*4bNR^T8!1Lmrpp3hT{ znyZg(B>#9~9YrmWe-}@J8fk7b#cR;HMwSL-SthPOEsV{Mc>hEJ_Mdb92K(&U(_iXo zIB?|eUd(NkwE5TK&keFDJ0uTV#MyhK*@~pY9hJrB<a7n}C0@aCar_y5JEjtx*>GB) z(2ym<!DZrU+5;Wg|Hq5$wD(VlU{5@jIZtC`y!jeo6Mbh7I@}x<H4{ZyQ*zC|f6hY* zi>7d3V^IK)wS{;jPqcx{a`ZoI(Rh}BS{@{7LeF?zuOnWn>+x7;QLvGy*Ft}Dym>}* zCF|*IZ&tF@Mr%>Flenj+5Xdm`+ohi6zfyeCO*}9_{Ln`&6GH*f;BB!ot(WxIB`OWF z7$S5tP=5#LH9|P3pYC6*C)n}cOr`TRYv2m-lAj;$sur19&YH>AsF2C}8U=bksQwum z1JOGC_uigexJcaHMs>nhL=KX?NPMw$-+$6J|7kA%)4US7@K627k_<xMBxx{C&w;j< z@N0#nk`pC37lAVoII+MKCs&JS@PaGlop6!_=ee9$t^0*3c8EuIi$69BA^#!X*(^>0 ziTtUS_lbA#V9}v_g%LK&-^K&y{|%lF+$Jr!S!H(UK6(*ty<fdOr2Z0Z#OvInTJUbR z=<_kX@j^@0KBqviLI)ko87Q^7iWdpDmv}tK$sBmRRo-|wm8D7}@bwHHRs+ofCl)jk z<v<mj9s{3-J-&%(?3`!9N+9MSS+ogy{KRP)=fv^b^};(psn=HZnM`$|YzS*AD8Z>6 zcm;)e7wcQ0dQ<Av%BdHej)2_P6QBK0(_mA5l)$+_L`cx=VCDwm2j5=z^SG{`=6sm^ z*U{2qK29GbT?Puj#>=h`lRg_O9oJ7+t`r|$A?-L)Wp7Za+vUNImEIdCA7Fz1j!-#x zbcDy<m#O9pRR=M?5z>WM2q~i*;rb!^G*VnVSUh`)-k0l*UhO099;kc6RSM1@tWsmW z(pRc?qjhDFN{m!}Lsf?RL%mN|sSLV%f_gSdZ*=omVR8D3Chj5rM$du)unPsE4)zBO z)6#pjk!*HTFM4{{h-<fyWTk6%InRlcdEzz4poB!taE>>V$dN1ClcM<rLx4W9msm_< zHHW+zJEgxRnnk!B^v)SHobytn?^P<r44)B49?<n|dX95unBQ}%C!okBC$gMSN#qHR zfG>ERkS;FP^We#I`dg_w3q4KA`7)e;!+AA_^xi4n-z^^7BFRDmwhB)p8^^utL_P3G z%O%-ZQKSLMC1ytp=;%}8NZR169GIGOv#>>+4#i0)&?O{G%=sjEDxB@ZnJJuxLTOH- zBEnZ!T$<>8Mi$ca8Ci;WevE(C3@785x(c;9gNVA(Rq>vM;k1-e^#TtW$w5v^^aPrP zXbJkCwy=rWUfrfvCLIwi4(O>;ZzM-N`3F})Q4kGh;b2)3)hA9a!V?4K+LBZ55Ygfu zcd?zE_J!25Iwx0uv-FwM#In_HOng9OjF=baI)Ns!zm%`1cVpQOECY8<mE?q&O7$FU zRxFy+o_`7#-X6M%vxx8#Ds-Lr;bG|tVuAPy=()XmV>!X8r&YdCZ+yd2@ziO}^1pf? z(|ec41N-%9ujccRW}P#9@F6+5iME335!}nV7_56tC5WwYwhUCJUm;Nyi|e2DgvSN9 zaPHAraVDn?6{*w-@hSQWy@|%x1|xj}Yg@7@DVkNriC=kAec=ou#*W;$dWL)8Am+4I z^;LQ_#fLqqkr3D9ge1IM&anZH!X+WS>xrs{{)WYiV4XUmHYX3|iq4$k#yoPKS*E@v z>n|tagmo=N&*c4|9tDXKuQgN$o)@PMF=jZNbEoh%@PI&Q5sis6fGq8}IOO$+*xM;l z0E7<4hBlmV#d%wBKF=X3M1cIr16~qn3IxSDIq(Ltx;o;s6!i+Lf*t}tgZA)F7-^2` zE6`n{{=D<0=ekI@5x;1zD;>ORjrDY<xDI(u)hIGF1~4S&*=6b;r|ZF?pdcc>oVf#1 z1Vx4Px4!NYkwtdl;sVt|Ts@%wK}Jv<Ebe;r#=C%P;`AIR!m+QTk)FZh>?CQy`)sZH z=q+!2Sp0_is)blE`M-SOP;eV@{zjgs2p+))%vF2%2>uB{#6x+3vU0o;l7}G55B6t` z7v~7!h2UXv5?zhBjCd;i$UJfOQ-wZNX*ReXQP0t%rF!GD9@o9&D#Lkk*k7)r*U~gQ z$Sigoxx~vqFJ7({51=oJ*PK*2<OY-pFV+!_;5^Q4<9t2vG|!^RkE%7!9Ru;Ahv8DN ztbg_yr#;!K8?ATPllJ3k@2J}1v@hZxAcC`M&DVs*>Q%M+gUvw(kE-sYx=-YRD}J1& zR5hY^LDHNI7n0;NYNGha87HI_N-}-fM8<sI6YWe)KT)$lESXdKkcwi}#@Sv-FPa4D zK>HE1CVrhP?rNf0VeIse|DiW|2lQ~cuFwmj`5EF7_$paX`=>%>N;){XDyVkR^7xf- z0jQ_FIH|d~rK$dQ64(2le@E3p&L>|y0UFBHr{>-#vS-coxs9$6DQKlqt#zMV22urr zBi@21>z_%9KZ~3-QCaG0=+&Dk4og>0II9fWq<W(wkC?0)SZNq9ZiNQ*^d=jH#;*}C zfRj1Di&$T|sDW1Gls{|-R0AVsc#?;WB~nbLiugpDcmm%S{|<c@RGnxiq!g{yz-tA~ zz$oA&v<#8t25JKYj#ebQf>%y%kgOX$v(%%IO43u`qe4@0`d>hI7-2;Ak)1hME?b=A z%hefi3|v(zegVIN{)svGw#(26OT{B-e7s0BCF|ZxJR46f$P{`K#7qVX-wpb+Mjm8^ zp32jA_z#SZg~tYQ7A8mx4+Pzotrqauh(16+;&OP-j0R2SpRb5+g(o>7F+n|nlAL8$ ztM5<%odAl9NLtRRci1<uRJEu`Z^0qVF3};L4~aTess${8ua4aUJCWN$^6|xqWM%0I z{}eO-EK~e|EcFbVf@kU|GYvvQ8<T;nr>DRhc^X$;eP;A2;vIA=cm$uDK5(L*f8HZ@ zk9wdGo;cCa3eCqM^#-(rPtD18H7XHOSyq~$74hNFq~I-Pnp5?#;&?4_ven=t`swFX z(ZKKzF-LfTy8N^8sE--(?Eq)YWvNy?&XDBH_rv|{A?q8MUCxOl`p#T(W+u;2Us&Iu zNmxB`J)MY6AxcN&%;zU?8yJFEysz8AnP^EoO->F3Nuc+^$LvQZih-6vE2Hsz3UHz+ zeSj~q(a@wsJP8jllbrYmie<*xv4O1yk0O(B1!n@H$LJRb2WrtD-}Cj))QspUL;c}A zNHizsa-yk;V)$05Q1|gbX`4D}1ucutL!Q7uMA?xqyl*@MV)~pq2_GP9oZJatkWI#- zfyL41)zZ)S2SmCVJ$>QLiGqGi1D;0y{IQ^mImHmo#JQ7TYx+&hgmIAvfm)2n_i#Cf z6B^JL=nsM;QVbSO5}zb_GK@w|)@M9lI0{t7si$}WN#YN3zQp~A+b8QOa`otU&Id#j zpmXbrFNlHVdQTFk0TmF1=ZxPx-3QrF8o6S|v`j=VsE&_Dzp>zGLii55MQp<NUAT%3 zWcC>cIG$djPZHHaR5r|SnY=P10nho;!^)eG*AHZ#_KAU0g7bWd6d=i17tR1CM(?ki z@UsZ@)$1HxZ7fU1S_sYrCL;vmtFQ8`aX`MvJ2aMDVW}Lgxxog4?8wnmj?%1}0c8@~ zx1^U2h#QEtm5L9r{mdL(ip3&Qf&Rd!IxjxMZ{)O3>^Qu_xt~Y}^6EbW->?>itPL_k z^aRPmd-5faI6u3KQq@B=WwzRYyIIo&azZ0RPtGUCcL0l{N#Vsbl|>Vzcr?R%0tcZ5 z;6BO_iA&eKI$G0=w#m|Xv1I5AuoYO8JejY-{0I|s39i8tp^hZ4H|R<D5$^C~$YIGP zV@2Nae((Z)eTs$2@@9+~Oc%|uGvHQyI#4=V@qZZz(0U`y2-vx)K9jK^vjMv1jAqt7 zF+12gG#-eRybUpNA{4{{$#&$49)39x0hWfp%(kU^^7W~n>TIkhIP(&uL(Qxrgq!eb ze2fpRvG=L^&NE;utPpaRs9Nbe_|%Vb`Z|>v2YF$qm_x?d%qxeT#9QK2Y&>K%N=X0v z=oU?i)Zl3_FL9zH`n^Wf#J}SVT&xDVnR4h<G%AvaMEaf?wiDfkH6YdsR%9l8o5z{V z_-vfEOdEK3P>T8YPjV*Wh`$H64d|&V$v<<CeV~7EB=Jfj?r=17jvYaFp&Pk|?}v{| z3=fS0$^#dGZO8+o{WuGkwKzzPf6lOfO0mBR51vCN{FZG!b5{M}d}r`4x`-2}@wYP7 zUc6=?Q+$Gd2hv0CSnYu<!{1<;y1Ir&L|5P`HI$ZUCaGsXGugisT|pBvzaS`P7W)pb zWoWe6WTIKj99r4e&3H4uKH!Ns)d6;bvUr_!^_MolR%zn0Y*7Kd#yTf_XmAl65>z>4 zqJh^o+6bKo9!0OglSI_fPFZRJJ;h1r<d4Yh`LY5=2Vv*y88ltKo<sK$Z32Jf=*1be zd`3Pf0WOD^o9mi?Vmsqvl=aj%s7lrk?$1#PKOTb|u<sIl$u(vlFNJzQHvWmYATMMS zy~=ez51FWXkP9CzgG536L<f;Ea5;J-SM3p959&LoVdE2!$K@aB!9VXBjfVxodcc=( zw5jz;tN`ZRcB1K=5q(bg;8M=qCSvBFr;NQJCmWM?C!0*PjNHaK@%wST$cp=`072eG zsuhornGb6Wpg4MkrGi?>HJMuKz*>UA$d;sv3Rpo-uZPE=6%iwPgqH#*R7=xS2Hs=^ z89El)(^Fbt{=om7;0=1k8t?=XiQE%MMY8Z3d2`OVe=fZ5k%E@+k$lS)k|sg2c@lZ> zBQa<i@G;&8D__w+*aM$#Xb-p^t>w=UtBuLqGh_H&$RklCFjS64jrWE|Pw==Eej%ex zBp7QR)^o^M6ZwzL#3jDOWUJ?BOwcy*xzlR(h_qV|>F5@UXkVxJbT?74Ky}bNVv|wz zwOH-<R0O-LBH)eH2G$!5&e`OwX#@3FsUF`$@U!xr)h-x;2o`xUUPNzegbU~mqr_K% z_lO|D!^}1Q5m{BflV`^=Q6pM3Q)A*AJLHgHB(t%nUBL0^8-GnMJ_>K{@+@lsz$(}< z&<PoS-$y2|hAnF;F5>iOWGYuwBR)lTmb_I5y~%g^c{ub6n2*&s#Ffa%@LLM#1H4GI z3_QpzU>A|&m`;L;^Eee$LC@=|4@fg7Tr-2%2eQoIO7IjuIkdonVjWrQP@pzw*U#(_ zb0P!KO+Blx7(+At1#vRtP>1{ej!dqhf62v>2PBKfxH{=CD?q8GrPpSGK0#krtwIyH z0)3aEZ|&4Gtax3ol^oUC*qafg0lmUAa63^jR;@B0d75W@U*wJzt^Sy@L?yoa@d7j) z{Uq{^w$0VwCVG<SHGh4K301Ku=v1_yzrLi6#_jJ-pl9fEkdXgOfha<bDc2hZksVHB zfdg1Q+Eky2_mJ1-Q(OHd&jP=YdugWYP#-Us_#HL@ADMo@k!TSl0Cdf$S!3br2K)s$ z4@<^sXJ&=91<h2K9}DEy7eF>>WON)^?0nJJpFy;^&+Dvdp%45T2&;~<esC4PJ;Lf3 z>>WrSjLyj6D|~r;VC*1TjkpYvA~HhQA2JUil>oP~_Bcm(_?-xRTeK?q40I!_KbRS` zBc24v9$6()2Db6X3mPRBf<EO5JQ`39`z%-q?*HZkUa>2EiT}&#^!!!?)&#9VY?=r^ zc?3`tXoR})afoW-&-uTtfL}xmhb#;y_WS4uZOC_Dj}Ys2J$;4uO3Z_mUwkIEkLQWL z1%rVr{ojuOf3dy=osA73GLN1m;tdL9e11d&`$l^KWnPK+<HKgE3@DLb=Rn`W9r%vW zAw{2vM3KoyYd~)-0(z3z4-o{gqW?<**i`6=-e-jiH4xw7_cF+C@S7B19{Pyy>POtL zz+9yaSd!lh!6U)S_`f{Dd=ir*<Bi{rPs6ytbgYMFUkh0>{3Y-pc8D@WV(=}YmX8kb z;Qd)6rsl^8i0QIkhv+Ijz+1)B@@v75CMWG@i11g*D-iu5mQCBBXnZF>mh9)Wz$|bo z{K6CDpIBKB<^@Cexi2ETAbV&C?k2j!_^`}APZ6<&f_^-~$AQG>S!dx#&WI%7e`EQX zr9{mx{R97E??Dlu06&XDNf5ZHo)N?GS9UO3GGdGyiV<7zk%_;SfT#+ygdgkY3h5`` z!1F%-@bmB$dcIUwu)0JmYQ@!XJ1Cr}1mos6NN5+I1L;O)LC}755Nkx_8IGz_t0^85 z0m~!d&;kD<S>xp!b>Z=_vJY>XIEpWsV77>6HLAJy<6pj~!Y^3(zdS=k9-PEV1kee; zq=3D_dXu#RvHAL)eWzH*|HT==L+CE@E<{i|$QF~qsVCjbT0ZPKn!Kqb32P7Up_?11 zPVhae1+W+BGcqV-WmpwU1P1RDD}<!@7#lrA^ab6?4hL2$5pBg+1^1G}V{V8uqs8&G zkX~emF<|TcEBq=5c#~+R&lPYB@p2;Rj0sEO^DZbDOpolLb9|oTlh1o-O*}x>s?i_l zhsL1~#M$`W8MIKjv?X~He$k{vI19|_|5}W{+Jh`T9KtFLB$D4<;TthHwBIQ`g;!VV zNh#Uc^NP@s0Vj(>-KEOBkcA~%zek_WC>wiBFEY}89-H5gIjz#iRez;4^1u4d>O$~4 zF+U=({tDOg>M1csq}%sED^%i)O8P4Tiqtlle0ZDH1_5y=oQxbmQ9N+8h$-5|>o1&6 zh8qdw*R)baE$9dSVRpg58KNQHIk*dL5U(<Lj$u9T>r40?|1#k599%-|9mGYX1lp4s zXH6d%23{d@K?IBc!8}CwX^~6>PZ23Yn<IZ*2Uq%jUL)1eL1>!z2>7L)N@WRQvHyXU zPN1#ELLKZ;0++VZ|LiMag&W`6=w5rtLkI80E()Gy_abY!dI-05*0s*M+fW$BM=Nc0 z1sum-n*zP)G5go@R5Pm)$!fMzX}?_`4>#2_ZG|`d9AsmSp^j>!&&VlWJ{TCR0G(OY z+d!ZFxF#r_ojqtIRxu*2Ir^KU+CWvTItLpz)TajeOzhC#E!RXffZM<oAkpUf&RSWb zR2|eJ2#`!yn!dNyH@{S_M((fjW#uzDS*V0p?ynAnj;tdC<u?@dz_7FqEzlCI!ezzp z|9+c=7(X-VM*!#{xSRD6j1Oc*mX;N6L^@e%P4+Hdf5Eg+4D=34NACvy?<#u5--%RT zPl5u_ON<9>M;^~#fkoZ<dLBLmiQ`j{7esra18IXffF@u~`iUOoD)CmZDA5Vxyl4@u zKd3CEvOe-+l}H`wf3zEa(K*;f&>2y1@D11pON}1D%3;gM50F2=?(yPxvG6*vQCJRk zRk6+k8-+ct^mIy*cMTg}sS>QELo0&yuqF7pI$=ZCK|w_9%cW;n%j5sXRf*~#hR-iw z;YqUAh^#JaD_K2p)Vs<WnzOpc={@+GWzr~Q99WZlMl}%QVr|hul{u^WOVsi?PX`fC z1`n`?kGl9(tP}clQmvv*&+A*IT05&+OH~hbk>5sl`s+N1B!D9MHM%OVPS!p-dgA}< zN7hkb1wdx(lZ8%<9h#5{p<Z(5eyo59H)}~iUs!uS1(l^i?-%NNje3Q4$5$q6$x0XU zTV#`n#9*_~j(&C|q9^dviEe-s=(j(Q{)`4>Lx`YaYkU*|Prw`CPjV1^LyuvDI1Py? z6PguE3%{{C6hwjNN?aFSMEmiZO5}9$Gbx)Xj%^@0Y@zGKAh<(57%%C6xD?4FKT0hH zx<joXcYa$DUdKaZr3cXmqQUr2XlDEr?x1st-VlYwL(cXngZ?Kb$v6UDJ^pX}Q6oMS zHTf;&s64AlD4D8$5!oT;K(w4FB-tQh4j^iDACVG}yN|1Cb#fGzgt!D*UFL$Q0X<<> zK=(uy(V%EA@{7LLMGYV{;%>y1$UOMJC+X)H$o7DqL8qWR5Hd)DJOp_IB0<<FRwj@& zL9#)W<T>z7{7fI75Eu@u48|v_4HvV@9V_VP6#Z-x`T(2@#;H_IXb;AQzv<_&@oI^; zuwTKCSg;0$4168+5F5})eM49A3s=6^8~8t};Fm&2+C?+6rq@S9%(HJdvB>0y@OSVl zz&^>kMqU?wWd&5Ze4Y%I;1~bE`1qyJk@a^VaJ&P!pK&6AWJnl4I*XMX%o9Eco&as& z1A^sQtLI1WeeH<<V+$k04QM+uddLgf&|edP$AzB>vH<~t&GEB9&#VHWMLvV<iP@9+ zX6=pdTTvH&Oq{N859)*W*j<C?gnsmY%dSjU@XGK&@P^R|c(6!0Sud~<zljHmtB~eG zr=VxpgN2t{;^`SbKZuWww#V1;v(RUykI=KwjVLVZcG3NyO<F~B)2^Rs#0MaD0H<&c z1U-gs{yGahv}DZ!Gw0)E5JHy5jW5c4<CWqs@INz6MuV%oh+>2#-*5`+KUj<4?{X*G zLdKZY49q)Rj<*9o^feqS1jw$y4UFQn#)FoI`p}tp0dqv(m_IyzG$vRZOZY!zj{Fmy z#PdV)e7@kx5<QRKOIC+|@%xZOIhaE@kg?#~qmAJ56wh`OS79YH8V?F&sSY$CE79Os zbf1q+iE!ghAmij?(Q@c1bdj%rl68e^{_o4d#pETpLd=-fsgb^*@2MHC_17!VUq4$3 zHpoy3q?X^MMYr$_oPow8vdFm5{pb;LRs4!ABP3>r=EkQbYQkTzwx9jP8bJZ(6P*Sf z{D?jATz+Sjx%gi+6e@EaIfMG>8L%1iNR}Oq0ADi$L`(7Sh~&b*<YnOz*1gv%j>_C- z%Qqk@;mbO_P5cV}@gp_9ts?6KAL2b=JBS#hswe0-<PQz*=MnJy=s(dka4p<Ij@Ms9 z>c?`ZpH(fytkIijMtX>?LvwJ2*eojmh_s>M(cu2NV%FsnNA>X=aYy`)1}cRlWatw% z3mfPA^H>=)AoRhnhWdDz=wLDeK5~an<Uh#pV!>ID!?_jkB#0huPCS=&^{hN3qD&@= zm6X`$c6ti5OspN`&Pp@B6BSL9bdtTsE1>USQ#>Dh_U3Alh-JR|-cnu(@p@zdWJ~;! zPtcA$7IzZWZ}2M~7igF=_#E_`oiO<HscHxML9a&o3r)b=&GjM{?VrB@nkNnn^1y0C zPmne-R%{vT$QT*88#_$i4iC-u=7_&SO<DzKP|C*~x%$i+P~y_mORwk;8LUj*BbLgZ zN<2LL5+B+48BXS$SS-DPPw_iJRYVbdX}|_z1K>I=u`i$gt`2zI_n}#%Q!Y*xlS!t* zk#HMU28#i9N2gH}5<<2CP3^}(z(^nuWD9$QK8q7IQa!qnq2vj25k7Ka@07oPk%%(0 zibuw8Qu}(%U%3hj!rr5w>gY~be?dKAT_G-w=7N6ABeTYe0K66S95TyV8EA<XCo_e{ zVZS620@cti8jdJKwg&D8Bf;_hdKq*8`@istd@nRl9$rJ0;XApJRw_yVICla333j9p ztXN<lDgGOI99G=whYaP@As_Yio!|FFYRIbKvqDFxK-Pd0OhB~FRh}#s7?+X2d2kMq zdQOx9Ba)dRM*?M-XXFOTQa7kQQS*nMt*g=ViTq)$hvVS{R<og1u|CWzf7$6v4Ax)y zMZA%i@p;|DDiSv#e#>57Q}z!(4&MV#^UviZYe)nZTZF~%PiX*EVLd=gL|L$?=s=JZ zmYGZ`Xoyy^Z~i(9tS4IAx4>v2d|u*^#OdL15CJ#|?!ab(di+Q_HTWx=;C%ca(1pJe zkyQrZ89WzqqSOG6g`@Fh;Cf^T{Nk@XBO=X;1^g+p03aP!r?HZlxHZvhcD!N}=r!`g zcXpNXX7!ih(F-lk&RW*tu&T)at!*%nPZwMF@CS*Vk-6k|lvytdE)U4^fM%IBdV|#> zk_WnApA0j?uPcMJ@ZHF9SLhpSkSXD#x>|iFa>gD9AF+Yw@J{*VZq{_;T_XR?Hy$9m z0^7zoL2TqgPN`o|6weeI;5&kN@O_EOSE?R=*E#E;=ryzgQ(`ZfwIuO|pZNgqVAEL- z%YH|EVj}dconsXVHJ54s2KdxRNMKP`)`CR*ePYCcSr5tlv%dh3n*0m7oGSI!-xcJ? zDj6v=#VT&{D92R_TCo0&Uq@%$j2aZ-b3V8o1P(8851)rsVaywIp$XUDD%Aqs1z|H1 zdPb~(I`M><6;Ljt#Y1MzCX|MIC=Hfotu1&G^p39MO@GLu;CUf|WF3%He%%{P4L@*) zs01a67cfTjHfI*GtAxl5SlY+p#N5g15W6JX1LjZ%b(OprSp~9ea4Itn_kq#jHnI(T zBkxLV04YOe(fnvXd=F&WUnfDXi3}IsEHQArZ{!?{2I2u_fI6rFbcYQCn-U|#3ZNI! z4`^&OV5;<;k7}@YlmYencH2kB=o0iNnFCwi5q6nfNMI3kH98kvO?D9*k8f3={|lts zS-tLSe9orebOTPGXsy);tUUv%^pN%?FYND#ZRFi2JMXWhFVJ_+o?>SPb+wTOC&EZ1 zlwa>)k6l|`XJ<d_-iW~Q4NnA|M1C9uL_`BL#a-+H_=1%@*pF5kLsKt@%$hFN;P@Ug zYutVRAHS1$U_;NUk&`BBh=&WFAWKL*mC^W__a>?X+smpP^7J4i)*nG7kP>%5tKbno zYvM;1zz(2KY6SmN#$TOPU$kYVB36Nj2~@}H04=77cZfu=P6)4{sY<cV#9zUJ56nB{ z-393~e^@gtApSg<2|Jc9s=+nnHOce)_#c}`rW+hZ`%Uyjx>}<j^bG{W>JdM4NpuBF zYw8}^6SBJgS{-mW_6nZ#TLd+MVE(t`h|_1FC*A`y2z{6}W`SP?2eB}IRz$(6*aSY) zUwDq382KE~1agB%1ZrfZEKvs9!}8*HU{i_Ppf`~0Q<7r-kz3_HybcwiC(mFF={Y_K zbfaJORWs|@!REwsKrK)tQ)4Ec#tac%Bbo$l;VV~~0l5L8gHA!toO8vP@fpa=v+AXZ z%ClyM>(oI^8<ZQTYph6S_UI$r!WuQhYn$wupDzKIv0l#idl@?;VXpAA7!5Wb57S?P zNS=kf3VM*d79J@PB+vtq9jFGvNcPI1QNVSKkgL>B-Ov*bW=8;-RWv-5hj#4rLqCzP z#Q*jC53NCwP@7sAliyP?C-#|qB=bs)ljs6b7xXHY0N)P_jn$zHd4H@>vDyeI>k5v* zN^pt*_LyB$euNcl?&|6Z{qIL-i9w&0Mn=P*Q$CC{_COO@adPKqZ6Yk79?${&j%{H# z2C)h(8L@J*uh7@`zu{2UszPbTLm!ESf|L9>5%DHsBpKd!Bo9h}39%%gL410jSA8r+ zQ~<jJh5h&;Hk_V=J6TOY{0ezv6)aMM<wbs&E$Tw1D`j(N2QQlyTTm5AXVsa%4-pw6 zen%<rC-Dvb(JvwyoK6QNpd>rSuyV*6G6?SAX>y>{Pu!EbL7R9oNCbQM=nreAu(r^| z$F9T{+3|<RLuT6cI1&vAT7Y9%14!HoeqkL5oX(1CxR?FTSZyf8HE77}gIBQ9U_5`G z;MYWrfYym{AT8hoB4}m00xuFf`+r2;3B2ud^*{d4XYaGmaOcszT=R4hLP?2GrZQBb zd_$qRWJpBGJS2rCG87sqDk?=1ArgwrG7r~u-QnCb?!7;s|9YPFyO00fk8{sHdw+)a zu!h%qt@VC?NGZ9<tO;xZv1V={nLU|Zs0vT%9xG8^u9{D_16SxQl?7RYkT}rsGNq!% zT+;#F$co63Kt<L$K!lKp>SC24#===pp59okMBgACx@rvuv})!cCV7cu7qxOleA<lp zlYcdyR#%V|yb09rJqd<+lY?^)I0Tx3q_LGROth?y-_W-af;hzv7+PbY0w3xpnPj06 z^NuOUN0CQ0)a{V)tTf^u$cgbbYte{_erk(%*crHwH>MjhVDvC;J><l~V6908+yX`U z+?}vyDjFbM->|DzNn%9UT|S04#o_QZVk7Jie}>C*1kOnW2usicUQz^zk<cgJPu_!v z&=z<|zCun_^<q}iSvexBA_FK&6;H}{^SFu2M4tR@GJ4uTXZQj?e0B0ttYWTsl%33s zF4hG{sKsKywc;2r(Y~lq><=YCiCI~?R=nqxA%z9eYwhPbbA+@4-=?Mbh{TM^%cxwX z*ZdLxl&cxxIXNik)L4qL{mp7%v&7je+rt`RlVJjD)uA4K-_dfi>Frr9t;S10nr1h5 zh9XUDlY6);`zg1J`N6hjjR`gjqvsQdha~Z>yg4S$^)nMp6173)C^p8*WjWuh=(Jmv zjIwn<s$h6)^NL}^6Uf1D7GsMo+#p)uTlm;`%9lgz_T42@&LJ(BL1RBR?g;N$@$CLq zOT$NaMmt4ieP8l&iA{6OqCRKkA^g{f>zX6=4eZXU(O>A%_4U{tMFF^B^$?gD4B-0l z9kz|cCPv;MK8MSp6zD?)Ar4q0#tPQa1EZ|<xdtHFLD2v<g~UKHkRa(a?s&t2iF0L~ z*ai}5US*P?tK2~d7KBo#ha^J<nTb$?XI+Bcu+Fk_yq)=ipJblIGGv2&BnxnzSXsmi z-_RekonDHhPm8}uKAw#fI!o?~v|5)!wlkwjQp}7On+74Kov}iI&0#eh?Og3}Ej8La zjXnMF<!m)8%2U8G+QPS}rDyecZitQ#fvH3VFj(#mVV$AOId8%PS;NP3X4EWy!VAbm z%k1d27!&`(U$Ex<o&UwZtSApCGR~}}>*AEGwBq;Wz~KQnM{Y%1v%-q^#-qq+@*wgt z;s`y)PT}<vNkSozWHpg-HTv|=+&Bt9FM5X><>}nZ2tX@5I2*_FLLT`~ZdDdQjBQrk z4ReLN!nw%^KsWBBFC-g=AW1BO-5I9DC**B3X2)^tIEl*j4y1}z;IGsPLzg69rdxYh zQDbJt*$c8t9!LRJK%U3S`(zIB#Po;Xa~FPvEW*>|jEsp*5|xW7$f>KtOEd$j!VBOC zWjo<v_vf2kF*z_hKd4r~YC)H326KlMObb3zRWl|92R9n{0y=<7$)#E5V{vqF1w@}& zS=fRkkRlusMot|9-%UQrfGd$Tqu?5S!4PV#SPFvi9b|%qA$7P9Rf=#cr0QPwR#9nz zC&7+mc9zG{q%Lb6p~18WvW3uQ)@i7}(^jLAJ8h9JEG(o<M|o$lB!5Ah<>{~lsnc=< z>>G{cwMbv@gndy_O`};&o}LZE3a}z9s@xc9$;uwAH_IqTfg3T4tc3`+702^%v_dp3 z4or{5pE-U`SYC0Fvw2A#NnM6-)Y8Kg^CoO+t`u^1GCA@hJbl`C5uz*)WTUp;&I2me zARM_WHCzx2+$AF;mc^U<#+lFw-=w-szj$YUP%Dg~eV<$>>#W#gIDnm$`%-t{JZJLR zu42`s^`kTZhM@UIm~Qd&@@Mo$9Tgsl9fx1Uu(Eh&B(H2G5i4v?jlW33_cEQvSrqFt zS_%odoAHGYj4OWy&A7TsKrMzq-~(A}=lbE7^u$%@ukp<Y6n?^|XpeiEDUrEZH4gA& zo=v|~^7u+p2X)H9u!ZD?#q_D8SR396pTHvUs!*99`s8lv!&Ho<$DJR#K*HqX>99{% z#_pNp#dBHRtS{!<F6vl1S23HU4&E@%@CQ_B?##znSVq;A@(^N6F{+pho|a{x4>Ct| z!}YXNZ&<^5@eQdllK$o|MWgmKXX9BReb;K7gb`qc)zh16R?%z9#C726JQgNrwdYQZ z0W5FET$xpcX6O%p?v=WyZKThfs?>w<d3&rF`5{eE3WSFtB_XT?4p*+<+Gn!riFMkj zZRw?1%d8V&->unX4Ouvq+V)K68&oOq+1PoRAhuhrEKe)07mxW{#jpH_Yzcer+GV`Y ztby9?<Z(o9EH%skJE^<TXMeSVm$pL$B$1f~<Kud4sw#`z<A}Yri)dD0zyapld}hpx z7tb9<GJ@A?W34A_JU_}C&|_C-(d9DJo4cR!!yCDh$VOjsU4`+8lPCU%i?ER6!Gd6J z+#P;N4=<0;W4dq7K-v#;Ob%1_;RbPz`EnFw$AcOtT$3xPHd+vWX`x*L*cfu43Yq7k z*^sa}k#Ens3Jis{GH|w4ln{liQ5`GxFsQD=BC<xfQBq))_uRM(L_r2&4;n7gBE!xS ziINx0C>B0#3qPOn9sS20<EWtsxP$$rj}S#hQ{phO*BWtON4gt7#J;eE{(_BJVv!1O zf^QU^sa~~yOze^?Eolz)&8Dv&{b2)~sU`x?DDuj6r~2+bY+vq2Fn8katbo|V80oP) zYm0t3PEBmqtr$0U5Xw$_o>hEsyL*vp?KiHpUH&~eX`ix>)}gYvxT)l@ShJM4teP?Z zSWS|X=+hjC8jQW)xl)Q>VU6gi>)Bl(V}CMFujny!2(xB&J9(jXG)vtKMks4ltRu%- zj!#%fDAf*CtOXX3_Q7tDn|*lT9@yO{BqzUhS1cS}63T;U*m+h1TRSa&!$Y}a3bf6l zW(GNX>OP5&%><dJ;Ute-lTf3;I;MQ`nC{LdLO$XveWVExkyTN2T|PQFbUufb^|$$^ zHDWT^CwYoo=?>Mx=9$kDd(%_>gE#Ty+M~7XYF0~OL(D8m(vn2%Vn^}(q_DyKEvrqg z_yv9wvM>W#lfie=Ml6nf1+qu3Dmtd++QC}7uTjANIfw6&1JN`1lHCv~B^QeqWCIe- zvT}}5xy3KCXt*i;6#>c9`<{izAL8wx*ufY@-{-y%P`$bIDSmCGrR6J)lbUTYfH{Jp zjTVa~u3>?V55(>o8E5bk<SscN^OJc_mXPm(TliZ?Lo(*gIp)Q9%YyjHs;i8-F^)#e z|9p@2;@MVqH|NhYAdIP1$?yV8z@KP4?@WtQKHQOvX$K$bo@N`bh5La@a1vQrZ?^Gj z<Q2xW3Kc@lN~A=nq?|Qk53SLVk+F)1MPpxCPcjLS!fJ3<qFM66PUdP6nLID8_Zj4| zGWyawGNj!QAIX~$h{`qL3jCm#wi*dm*A<L|xPYfnO#?BiSs~$gq+|f0%KX-f6n%q! zS$-|BPaaML$H$_|C#u{sR=7od!?oo)7~F&WV{&57G!wbEN3NpC$Q<I)8uOiODOn=H zG8lFa$es4m+md(RXJ(nLU{yqPbjE5rR);jJtTwNFIkuIBhVsPg?6GLp2t$#yge6G! z6DlNe#*8$wQnDV7)(du$cQgw;s8&11XtN2dsHhLtk&&R;d2gI3raj|TI)N8a(W)N9 zI=`&`%^i_&Bq|M5aEW1ajf6D}>Iy`!_Ug4BK!u9Tzw^b&c8-SPRGr92@Cb4cc0-U` zP^-Wvs0((6jQa8zHDd>D(p7AgDi=|^ku{Q&0@d*+=7J>h3bau5fU2RqCfk4$$lQq0 zUN&(Ck7LI@mAH1Y5?lMuP6zTE-ervh?p^-GN|LO7P-T)eH@T)lFXh<Oq!>jkzwc!i z^v?5yoeM##!N4pSd9k~3fCTkKE7fest!b5(XJ&*4hU#*KX70wBl9f2sH9C>A_4I?x z&!{}JUb7Wr>65ItQzhhc86?b?+>ch0S;u(wOmJBITk;X=P;gy&q)d_855LW|{Ee)i z(J>0}aGoh*u(zWl@eqqA#u_>x2l6^}0f)k0WDD?I7#rivp6eHH<6f|VNFvu}Tg8&| z%D42#cOnW^L%hrDafY+-d^{j2paamge2GuV4G+L-Ylr{SXPGCmf$z&*a5EOAk>n+3 zf#-9!USu4qdW<CEb~7G>Lsd2;W`GBC%>ZAFU4TYK*J5-?56ho*qO2mDZv`5=iDg+B zXXnZbb$l!zMCv+L|J#F<^|dNR?J0X|&7T-hO^j$yyZ8(IgGd%4g>M`;IX)5l=h{9P zz?IZPu&XLt<khufT8vZTao$BexU<!$$^_tNv<oAzUHae$bFN3Omg~D<ceNn7s+MoE zrjAF$)%a#*Rf?-v<F;nhrr1Zo9$ac_#Oin%zC>LKwkUH5S@mL#t#->ySZ9_|gAw2v zAbJc@uE*g^pe(ryyFu|D=~c2V=?`FL^J~`z(R0oM@1=&5FT$GHUBMmIy~u6B82X+& zhZ#GTT<`2jn0p_{T#L)$k3`>@5s)j#9IP2v$)2$Hx%&YY0e3^5$eJhzVv!MpDa0qZ z5K;zlxF4UOUWrHH^>`N<cM$}fk54t9qBA;T9Z1$)(wdCM#lDWi*FeuOU_Q@<?<5sD zA7&n#B@;oy@j(#U<j}4<?g+!N?(nI-#8$37g-6VfPw^C_3>GD=SxYPWa;6L_PwpQN z3p1?<OCz3v!1+r4muIG@o@)ndYD-4l>;wy!RgUZ~z8%YM#R`vsS>R*DzIbX8Go~fE z8d#b&$@tais%J9W89j&$u{Qj29aU<^7J7zLVSSk0IO0*XA6mv8@cg-_fqtbIgAaH? zewL@iXS2mBI{25D!w2vpGUxac+_4pj);K>Kw)mwu&zfabruJpzvFy}lC7x;!mYsd{ zgf{17ZKqx7WZTpBs~}AOWvo<X^5{OnHACHLVU3#Ac{1d@3J(fJh?8(ad^xX!*G{Z% zx45hb=bvP}RRkJac;6loEI99~f2uM>U_6k1WTmRHfn!u%iZRn;^M0B0u|NBG)U~K< zwEEE6N_*a_VdU}Qkz}2+R#io_I90?+C-jLw(Ni{0tmlRG&UIem6!}GS3_1ES_q+i9 zPIQe`!AZcV&>wAu*I9iQfNby?^oUI;LZWb}^dT7*EPQ5-@iEXg#-7CG-aM%rtPI;L zQr0dyB4$)sN$*K9O?G#@1`dJ!(RQ@~J{K8_iX4e)u=^KX#@6E}*i~#Zy_gf%z{#lR z(>r<L=EQX{OY#deJtGY^8=hygu%NsPbdQI%J_2HQWHQohCmuOR0WYDY^v3sM6Yps$ z&C1A?wY7H<%cLKZ<NoT<upJrM!pV@gYy&J!mqlW9S(QIt#kX4OICIGkn0potuV!}L z+nQ++IjkzKgU}PhXS9v8(>DL}alAhEPCrD;ut(;*ST8o$U0LmnaLf1&zu;!bAKa7Z z)*huYKX5GchDTKigO{dj@=PLaD?s^fxTYCL+XYNLid+%44|AF8&eZ*gWA#^j;i_U3 zvPd_rw9;-e&oZ-GneR|L?LHWG%o!b_3#@_o2{%m!vFpZ7Tm<1KZt_H98AEX`BqVYX zx4;<5LBS)UF`9%cQwM^}&yk}$Mk(1w(x7E@3btnjTt%Oft#mw2lbjnnBMI^0KD1vP zmeIfQrIE5C?#L^!0VKg3X66rXK-1x$96z!`Z^S1?3a?_fOOb#PaUJ82n@fwYGR^$c zPI3k1!5lDO%6Vc5aeeNB1<lY8TB#Cvi_p9LPBn(=1J4@bk$Wd*MDN)VI4omN$Xx`1 z^?+eSa(3xZAth$Z)eN5Bz+%GJ`P>xyZ#);Dq}8>@on1UcZ)*Il6nHp1(xN!V-WV^% zH9fh@H`b>wio2+sg81#+@p61_)xcOBsaA1uta!IF{`L6#x%l4-_uNB0pKb6=R9snY zZ?&ksJUj{5-K;KnK8}AXc7XE?4z>6Bxm`e>jjMVVt7kH}vcDgn`2UGG+H)M#yQ?(g z1wDCVS?tG-&(tqIQUw6)kZWgSs-oi32+1R>`{U6v+b&*VE%^=61@t0w1|d6wMQ82s zI}l0ka0XM_;Yv=^zPxIaSjn|x-qf#TWROo;QpEy4`+jB|4Y_*W5Sy$*9HO<~zun&K z@@8)i>y1dv263!v@L5syZ3UdlZx|XXSLL#CNRo`{mhtzRaUM)<uZXOIab&KW^AurE z!xLZF31hXmUbY?&uI^=4<XYWL4ZFz0UKO50B8Ln+<K5PbcdElZtpEm3l$*PtW`>zR z@=TKC`)M5;<Vg|mvKqGZs6OY<_&Yn|z?r<3NI;c7tKdic$8I@7?t!Ip2Uq2vc?w({ zUu4X2u9<b_-{_jw$~LG@!>P#_rZ-|$?FWl>5~<*!)``1Mi}yUHiXhK76pI)mPs)<X zwtI%%@sp|Z?9uh&7*#{F;=O8mwNvh7k6Sz0k(u0?WI>!KuPtgZM{*ff`C;U+Vwrtr z6<3WJ+9Iy8FrEaoYwU}-ZJf7S^wpCKc*YIlIYXWozellS?1;F*#Ate+i@dq#M_6rU zcRg3JJBjKt{Z5~UmmLg0rSCG*c2B_uiXpX@*CgRsD;AkYF;nXQAY7gX*0ho*t8&y4 zdrk`s$4=qS@C{}#S321_OTDF>AuE+^m8zX~SOpr%w&Nl4nS6MxwBXT%xR#!)W6TN- z70<7Q-M~cH(Pw#F9jE0lQ33l06~p3ob!S&pfXdS)k7D(@-8R&QJ`+Fe7Ob7mO|c%x zlRMciYt-#PWCtYAyI|uS{an~D&p2lxU1==7wd)W@WiVQ2Ee;$!8pp6l_VicLi;aSM z?Ix|Fg(ZI_KFht-^}=2v&^!$8&iV8r7W9R<qMb^t`4JPm8dlOsu=@Gr3agx~8dD3N z?3aF84`#n5`z7hmYtbgpdxy-e|1xebhb?8tUkH1vKXxp6B96@GCwYF2C(wCf)1vt9 z$%$uRxTpIqp0LlVYV{w(=pB!cd#ew|{XFx<bDT!woq4x9&RFm@;yY*HymE(9ySape zoA5onA1+c9AOf&!lR32x0;7e$)IQO#IVPK;99WE88e8~Mri&l2c8R><Dy=8L5{rN^ zc;o{n$dzB(Cz{EqnkHb+WIYn+$=70n;Y3&=b2>By?>jy2lNng3A4(AY!)UUVI3pGf zidj9Z28)Z^QNf9mhizF|S%D41n(#jMrDW5r7G)_{3yYF`k!akL`PeYEjGo|S2PnJz zcqTo|;0btk5%n}(b_-)=cP3Bx^4v-L8f_7O<?c)y#W9<PZ+T06`sR4I(ZsXwtc3EU z(5)wqbdKk(ZV*TL?Fo>cj<_&>HjnStiO)BkxT<wgcDb|?mWO*&+}-=!<MhoFeX?50 zUG)Pyvv$1m99BCpVV?YW&gCXyvqUkuo4u&aPRV>K>y;xV(n*hEb*w0jr^+Zrb~h2G z=uT{uD@XVwUP{zOR-jbTg&Y$91xdnta=Wk}>}uv6hh>oq!o80MhH$KEM5_ca%A!*C zGS}aV_EwF*c|viW>Ot8r_DP%p@j3?EkImFh$Rz72+*2(%egZ3wmlq|%JglU5V)m7M zOSZ?6;(F&;RSFG}Z58R(0m=!Bi0K8bl0kzpX`I!A$sSvM<oRWGB7xaqVmTJEmgBTC z??QjA?Gd%$=;iomla|pHRs8&c&ys<bui-zkZVz5_9M55eihtVT3i;G5ZIaor_5hcj zjI-S{p!dabEj}n2`&?;*E4O<IHVNYOyfdo~AWgf`c{+=gH!PPYfbkozOxQ-&o3CKG zS!{dUdGZ{7r88kytu^Hh*(zC=yfbU%8*C4MpkmP8Q{)SFXR&ZVR;{u<xEV*VXUXF5 zC0fn5sKRx${i3|mI^`3KJY5gpZ;W!66eETgAUDQbJ&&4McFcH+C7>sHF_}VgrVfVO zshlG1cE6Y(e`7x~x2X0g83c^6`V5+hcd)MmRAW!GjpHwjH(O-y1njS!#@Gba+OXAT z@q1y|lLhf(ud^+~c5D__1ZsIpT$Ro7Od%^U?M=6SJnwU}xS!`1Z4x$#P05|s){D=u z+xAViYaQ#szTws(C+x4i)Z{sH?WeVt_zs*lyq}p*40B>mtW54;4R2-LN!D4Z1;OVe z$19JiURpe?!WMHwTd}i7m_%bTX_j~mUx2}o`4w-n9pc|rOxDER`65gYo8q_nC%lBL zmpl)?0b6Rv9;}%it&=^V{pQ~lXvQ1Snv5LbJ(>8#UoaF6=OxKu>JTiIoL;W1l5=DA zSQe;{9$5>Q{x0Km)@y3C46<Y&SpjWMmYjuhg#WXKeSVycMaD$okz^~x(b#UIAOm1$ z4|x#Y5r@O;*^2{5D{Atc3Q9Hj&NTA8B-@V@B7tVz9Es!H#gUoGQL|xvgB&h~+dj!6 zKJ#xk4jflzC~`kPl}F^m-VIjEW=#@5o6ifCGocTByZjFMlMRRU?Ep>2WL-$7Z>+f> zvwXAF7a|35i}tJg;Fsj;F&S7DJXF?WsiQH@SWMB7dLW#Io~dMDJy+JQ#UCLzDk+kM z^+bkTNza=l->ce8-oVN<-hf4h74h57wUZ}*lvbFpvYH%!gk$0v$exON`}xW4!Bbix zM@!-$cy<4|&pzuclE4~6%kVz?j4AglCiUI;2mBbEmpe6MrAOm4Y<FH0yMcXRXP*ws z>(kfb2yuYOf``Bnu+wa;C<H3Zwejq;yTP9%+W*>teUb^*HVD>=GptW~R@Z?!qkGXm z2$8h&OQH!ZA1@^<sgeqtX5B1yM*Jfq$s6-q<|Q?cCOg;P7(rOn+{iS;r1Z%C67DHi z?*8)fW|T)2XLxFncuP<8-F(pQNfV>b-iS5mq~oyd=2RWdU|0!$nrC4xa{mlyCAD3a zLVtbk9d?vOGy6V=WB8(#jA_>Suy}f>@6#rFE~k@B0BLn~qo;TLQeyCALS3zYB8Q+| zIZ8$wGFK^O{U$rAmQ`=YVtvY_7$Kv}s=9JkWngQe5J+xD9H$xqyUdoDA(<p{FMoqi zWmD({-0r=s-PF)_{l#Od`bq8w^N_5jI!L<7Lb2nrV{(-;W_aPmqjCwD25er|HS!BQ zEKSiWed8Nc@ftVnV?B*d)~>*rj=>buAzs25lPCUz{K|vN1F+?KXTC{#j<!+M6Ic>+ ztapx)wIS))-Rvg}KzfagImC*IcC<NP=EYcwp<Gjh&rd<Td{rXGtT$Hw?K{W#XY_bK zJKbSfu?nd(<ch5ltBKi@$JY|_@6$5Qhw$`8jfxSFCDR&nm|7!yXiRxWe65TDEDiI> zhk7SAlRcJ=5eH;6z}sg<u1u+s<i%I!dHD?7Nmk+V-E6j9rF<hll2!SThB_<$hi~KS z$dv3*R!`+Fz9f@0Vh1tjS=XL1g&nF$8_!CzAT#oX`{Jv}ESWNA(6xvM_JF+gPPUme z$&xsi2R4^vQY{0y!fTqvtXIN)^CTGysgHn7tZwwZHej)`HWHT!H~P#mxO28(?*G$e z%)7Y6NQ*Ui5An1}nyn+(q&9bPNuR^kux4bNl(Sj6e+z5u9R>ue!(KzhuT0qRM8EJb zt4U5sClsCbgRSJ1$O*qgT2wOT9_f5u`U1I3{5o5o6^pER=5pjU$rlMFz2ZaTZf%s2 zWOJs(UF4bQ4gJRjkaeH2=&G-ci0n51PJ=~qso^SaoRPb`WX6=9^3C$_iQ7rF>&yFi zc@H6K6MK=_$h<23re{9I>tQ0z2R4@kcpBy!@g4_ZF2&NWk&NH8n0MGorXqLyfTFVQ zgv}F2Lu$GD#y%d2#&Sgu*3}hBlh}ZEv5G2ZRIG?4RB}UQq-#O6OYR*4X79w!X`e`> zUim*WhFQZcS19KT^I=)CwoboP9Op_L*&Y2!{gn;N3PH0;a*c-A$NE(xYL3jUl_PwJ zv6DTb2ffiovrV`79II^S$9$#Lk&$&py2q-q-sI37NIILrYUrUI0%)E3O&Lv^1LJBB zw7XiIFEgzz(15G~f51QJ86T5+mumtOBieP({CMJ6_6QyppQy;s3U={Jt|poky;1wX zW{KK7A&ZXNIXBk^XFMc6VzV40w}1gR<2Z0RD;U-+%2<f>)H{i^X2;+7a(l93v{izN z5A%3e6)(D)d__iJxyFe^v72O(<Yi@+evw8iedJwek^WAOD~ZEYo@l+i1$pMjjJp0~ z*F=CUU|L+`%qKga4rdOWu96lrMyqK!`898(lXsH^Wp8*$7?_-7w9b#I5QJaSD?_Wx z1A{`7Rt?&{H1}0*2fGS=vTG11Jck#s=d{08Vp|pu524D@4)(HWGGES19E-12_4rC$ z!4oX)E@GcBmdr{W97g5>aTb_x6`;viV7=8}u%)lX9pL)hcZ!Gg!ZTnthT}T9s!?49 zUI^09)s$8`+E-fi>8@<<zyxZBJ)q=7X{;=ais#7ZUqT=dN=6-3d<qfLIQBZDNgj*N ziJ18W*o;Rb?X*J0gX%674y1q=79~PsEU(%Ct8Qdn`C9p|tN~EFz`v#z$bTeW;|=BP zWQcfT85vUT>Lg2!OAc(!_}=P5)omg&Jb;V{y=MJH%<PVu30Y&_P~CwFF8+tT)*tpn zET=!@HKmQcfcSW1Yi}@<nb%^?A<3*G!@8wyk)4|v8bgZd0&Tzy+bMz^XXSwFkZqRJ z$feaWrnJKfJxAa#waX7)0xD*YjiET6tV44wWcqNG0#LaT=OdwUXp@{cLd~bjovcWO z?nGlGBXc8UjQ7U#t$fNc<`M3<0>KXPP=Ywkb>YjG<80{G7?E5WrUlwcFY$^iqJ>%l z_rVuh1e>TU79WUQSXEl@9e<j!iwKQmnnivYA~0K8>Dq~49Iv+-!D$bPPoCG&iAHig zuSm{uW>g=rMC1T=)efU1vUZ#m7+4&u%wV@%)8K!{L0eF%o{}&aP<;(9h4(X0YI1z% zC6>X=C8mP_;6k6sMXRHLSW|ykMf`+ZH+;y4Co0a0rmU!;1@aZN!(G@)e!@9qEwN+b zVrv;@PH3JLy4q-+jg?(l$vG|jK&}zSG15deMP!u5TD_iCRIZjaq-0x$7hfcUN~_^t zpL%`)%)$<c^;}I2Ep*M^yOzDR_;S0^VeM#MuCd7Hdl(@&fL`YAWpDys1>$D=X)xIr z6{|}lx#XTlARpNH#qqmQ*cIAp0hSaO%(k<*(5)xP%94rLW$Q2>S<S8X@5QjnFzaja z!~Q#iC$Rs&3T&1&*>g<16%8z}XicTz()bn^?<lqQsy8qkthBsbX4-Hxi{cJ^$}9iR z`*??mP?zX_xNA>E<Qw=C6^K}AIlr+9|6|ukdrzr%d@-(vQ-3bb)dxMxTwwYm`G(Bn z6$QS=m}NZ%Uqtu)^Q<nq<gWM_@q@TmZDKOx_QTRA`!Odkp-Laul>UZJ(pwmc1>~FM zVeE9so{585tTLD@8b$y4rQsMg{2ARBjb?2Dt#oBav5M@QPg2LRA|f<MJZ%81$&)~` z;_a+upy50jG~rA&Q(Bihi6>@+K-dXZf|i?A*pxIo3!{-Maj~qtB5X+OaS<dkGdtu` ztS;-L_s|RLhbe%0@~*wn`;=EUUGB%ci=wT{l841Qn+LMVw<oK!IF9hQr!GPh`Lqc9 z7^#K{NO<nnK;G2AX6D3N2OOWcYAECcN?_;Q!-_zk;}py-q#-x$7}28{f_##xBne_k zvA!`%4l6w-y=9@3U%?jG&4K1(qS#Qg;$DeA%!U<zbePN;*R<*Q8FTFiJ5RdI>`LB7 zR!{bL&V)Qc<a~2q*dzB=!wF4h9HzoporRd6Kj*n~=L7Zss=cwqxgHf0t#UN0X+%+& zVhG1hmr$;{Bh~jRR_u$wrmD(WFOIP%u_xQW*eZqOJya?A#`9gQ_sZO{D~ZHB8PL;q zvQ9-52f2$I-PL<OK`vyS=s#a#1q9pcN;qw62iR}^0<uye2yv@Ql5bHPr?M0(k;COx z((B}2iXu+WBE-Vkdl1HB?-T3r2D!fyOP)RlQl~X+F<vBBj3pmorKB09vB~uDmslYB zFgC$rVpHfz`eXWnndBEp5nI8+sb}V)X*L$aJC-)BhO@+gYylJ^X7nAMXOnq)Jg}XM z*%MMp9_Zq<u+LeOm}n4o;$`SO?}DSuEMBg-A&KdC;I*uD&sD#T7)#tg)JyBN2xIA9 zbRo0Bu!M?X+K@H@gTSWna`26IIEEL&A7%Cm=5q`bD?U#)2olW<cp_5QNpA{y&yAyG z(9I8YEB3XrLA)*YS~WfuTd}YtOa>0xhOI?p_Kv{7$usiu>>mvwW$I%+^+OaZ%B2(d z1g()#(mU80qluehJ@tl_mQ&F_5kayHWC)TH(V07}R-$Fs<MGwK(OkJASV4RAo#gqR zG_D%s<9=8S%v!E|&2~UUxjzWxW$k13U38k6FB(8&vVM(CfL~~dno@j=RY(is2S=Eh zSJndyXV-eMG8Co<t_soP36mofKbeP&hRKA_A$^r^b|mE~eNJY{t|$U_bta7K9c{@` z<H2|azLzz{Ghs2XB+2s9#jHZcOvxpsH}b!@$&naEeIUDVFb_>T$e^p{s*u#zY(M0_ zvVs`jmOQc<(^i=btb3wv`=UYk$y=Hyaif--x8!Tg7@5er1@fIfH``_`tyHsqfn{Ln zX{c%*7K65A%x{$p?@6yoeEJ|5N}tj`85fc{J;uyvYA>&~lIP;D%nJtBIP)azh_l5k zVnu9{tSoPtF-Jzwq)E?IM!RBK5B^OoAd8PLF|%sgjgJ_|Xv<U64O!G=l<A~9(|ppO zjMqwpq%s!%S-E$K`(xMn_sqAb@K=2Tdz(AQLOHo_l^s7;GAk^s=U}j@DzD{H^jD-v zdttYHHVxJ`S9EAKiOgN;MS1xwDt$Lk5LWIlC8HqorsBgI6R0zp7C0JC&xlg{t;U30 zoSW++?W8T9%yqBhfpU`NfHt64SRNvJBklsRCU0Wq5<$S@DF-YpG^MJHcYtc+p!i3= zjDa7xU$jfQ@gy=`!*O)(Zl$#>va!nD+hG(r5$G6p5efKlwd9qcZ`o5%T2xVo&(SBW zcu(ZZR7qQdW%TW(2J<B*B-PfiifEuRF}?fYgS0rAaHAs^$9A%`uFMK#){buQWbm(O zm{wrq$h9mLzf9^<x~5McVAhp~VW~vSd@f0a2Gb(I*|-&U$8K3rZLS}~`>M!uMcS7V zjgx`Dw1ySU{bpEhc@Nf5)C>>gGxVSi451^eT4$+T8Ak+Fu(npdXH3i{^9#5{wv|^C zud={=5*zNf`ZRU^p1H?+=bnOAp?E?MTkjY+i_XAvxq^m|)Gj$x91|^8drPuC69kgf z6V^V*llNzvV0c#7Uzx8qR_4LqX>lL|qc=OoE!Py<FG`LP-=w-t%xl%6F~EHBYT7J| zK(ASNF*h&6FY#1bD$hjvjjFNby?8AcmXGklzGZ$&hE>nt1vBK@<_4pdtA$v`<TS+N z^ohOWg_DsoHtarLod0)SF%8QL6X-Kd;xG86MBQdHt*fyUK|vkP_S_G13j@I4$u!to z!8_|tj0+!@t54u@ejSRzbgMdtOmKyIZWqoqCPq`P3`>#>VP<d=Y3MtDX;frYj03(< z+yI4TZ}r3R=E>NwdQe|_d6gl#7Y~n^BV<hvnYHsJ+r>BVCG03k;d5vr?8@Tu^|TiD zgumHtwuepNTd=@Z+mJ3bWNerxB{?3t))sg#y($|(8pTZ5a$cGZb~mrAqjgRGj8#{| zmb(hD+ic3~VbfSWEI9U0mEWuJm%0qx0xPWA372A}Vpis{a%?WNE*@1Kt$!lVjA*ka z%F%f&CXt<W4OQeX#JyN`bul7VEP>jqtWoEU{IH4;I%{mrBL-Wpkv}n-Y&M)O!nHaJ z!<W1e?Su2h*f<9alKrR?ONgg2FYd|HXT_gA5wWNuWg2Eh=<CrUl^hrgBV|8nek?0q zFhG7t0n5x|%A(6BVn1O$Y!&vFr7;Kmr*F-hx%Zp*@>xdVu(>R~xE#K4z81k&$!X?J zQ}9hjIwB6zCf<fU+|x5Uo#R@3pzq>l(Mn@%-gEZ~{!HFN<Znl8j6?FscJSyeUW(Dd zp=q~#zxXV9X-JC~GAr(a(a{ecf|Vx6swtsP)xS7DSzMfrNHK9B9FtLD@=1JrUPWYT zRQNNq&Hu^bv3RN;crO}A*TfGnv~OYi%&oJO5RHE{&PZg9f*D`QZR9SMGon?=K+zR5 zMgwIN%!O+hRlR5Dtj6>79GJ)$vmN%gmS0XzUVmrAd+5xFn1B4axneb09~v$;GK*L! z;|8I^2kZuWmaA=DUEA3YJ-5QnNShN@!I?aIRu&oYWaP1O@DA((^=L26z}>rw{ieu; z{*hHPO?TL%<f#$`K^Sb9Rwe%rg|djbmzpsW6{Q#B)6JS67FWhzzDJbBVrM-F?;-Oe zu42(~G^`tG;TK?O{5rdB&t3iyr_5)r5ogG)Is-!j72`fcyRe81QttN56X86vYKS+@ zoPMspF~hm{7vH8um?IcHx%6CzDG$moW5an@PiznuVs|h#iE405ye|pln_v#BiyVbN z=k>7a&Jj(jOcC#{6Yp}Zr6Xt#?}A6?bF(@GE+gZ-k~4Wub1^$+O^f8UpcONpQ5Jr{ zOtD!xhb#pAAueNU$OwFznnaqi;(?bVPZ`U@M6`@OV_W#9lvFZ9^4UswAT3<Rhw6ZQ zis>_dax2=#7m_$w63?qecIp-N;RyM<%*vBWl?QAezeH;2;z}FCBC;548?S=3OhlcP z@a)=3pQ17an~KF;66aax#CAE4A7H6jS*)sff+eJ>a#Z3E+<Nj;Mvoqgn6yA9H7ykD zz!GSYUeod1gKcEO66czf-2Dq*g;A!NqEeO|`(%v7xKNr|GIRdIM<uUgPR${0gsN~T z;#X@Gd}pUE+^JTOjI4cNU&%FmBThDMiG}bb<dfeZY3fDX9k#RrnZ=Rght6bzvnGT_ zLrttKZG^xfHkeFx0i>ob0UDFR%_?8Jh0F?l$eb@mDxY<&e!{UUS29~ePEX)Dl@a!1 zh56|WtVNFKjn>dTy<`U<Ix9ZNBMu911Y^OyG}ALMcr@Qazfh~SDzpl&PQAtUK&Z|( zM!7oGm7UElv0}Kk#Iep*mj-FGHRg#PX(L@=3B@VR=u4t*tQ&R~YX^(70=z-iGC}LO zBl2mqGk<0t^e`oi=OSgIKGnW7(x}kn)PHx@4l!9;1>dT{G1H{R9mFi+LCg&s#xAfx zJToqo&oqZ@0YA6a#Pzh#oM)@8E!CgI{c?MFYL*LHUo-B*^69O9<}NuZ%-IEY4FAab zVcgk05`~%eKg;bJ#+<)(O)-SJJ+?Aq4)3(aY<b?1QI?C%6~t=P)1s3gu}xNwIoElx zysNV3GW?EWdC3N=s&0l%7zt61nh5uClpF((%)db${x-Vl|MW%PHmkK<X`L8ZN0@W+ z<F}(pLS7G&VGHmy$s;C8F^XoNm6dr{#moNakN@eStQgCaJSpo!Vnr`(YDVtv%WLN| z7)hKlCr26AL-A&wB&VMs^T`;glOQdwMf+Jsm;p``&!(j|BCts2Y1HpPTw2AF;q2i( z_Lkk_Au`Tktx2bQq?KpcSw?XH+rBvd7jcLOpmDZ3F|e#|q8XSz;{m<}>*H9=OGf%W zof>~ZX&4o@k|j=FkN2TT#)KUn4vPVYi#Lo09LfV4B{+^uW<^>e#vDa+YNm{%bB!eH z2(yaZ=#^P_6}o0U1v}un+5s_Q0&z~}7+WK@g07sAPotvY7@gd&(thZC0)`u7I4Az+ zzj9w9vy-z4Gl(|GAP=0307)^so?pve$ak`c{>M7NV*a+CgOy_;#j+_$xEK}@-of}_ z8a*>M^ZW7{TFn~qFRC=j3JdD9xzW>%hco(N4QN5ujffV_R7wULX?Emod0Mii&V`K7 zi^MgwK%~MFiV@Z3lPOw4SF|Wm3Ok+l0BXyu0$!H2#<Sqk@VEJNUigqLp;asb9zdVd zkEoVPnNJjpWwt9Rxm4r0M!aLIdFAv}nF%2eq9gT=5EbcQ0di(&hk4A%fgen{f%vt9 zEN9f?I`}MBp511TVRbXD2c%q!Sz-*-NXUxs;b>!!bIj7>?DWp3w4F8>2bdO0Nc8F( zt)t8A7YoR)U}ublYA4=Fo{5|pUp<9Ha?JS!`AqxzEQq7E&Q;|B97!*<&8Xr!GFNFQ z9oR6fnps!(m6<zMkaf~xUWx6quP3Xgx&=bXYBIGoYfhZ04Qet;vokPDS@+7G!zHq@ ztToS~4VWx#H~LstQq2cJJ$$8pz$q*JKdsiP=EN8~8V8MMN)PLMSC!4wdv=lSXDi@p z$B|iaiV-2_nfud12*o$*t<&D9bvF~{K65S@IJ@Dne$cVlEw4(~STK=-Susbe#dkTo z_-^09lDG=h!WlteN0P<P>MK4e^RHreSlM1V))b_Lr*9cAz;D<Smfm~uiEp%oPm8y4 z4;an3@HbF2+lVza8e};PV?+ch8Q};_BlKd{X&Fv}&4EkOVvu_kgsB@CKyyih5)F_u zSU}vTjtZvqd~3VKkPB$l6OG*m_Ta7I1Aa77fR$&g0bPK8Jwuu$ST7{X6CA8BgTz!U z+9hAV;3;{2GE7q0O_4sWkOTEzHI^8ebU~lKnG~oRGES)@opzNF6+@v~wrTW7<i^Ib zTWmHjWG8PkE_#G1vK|;N6I;{2<U?5+R+z2gS=iF_cYG#0%%&QPWL2O9Gbk5HTKTYK zI<*6D&%f(A?#P-iYhvW@SZ}!^JH4xAVoy}qTJeh!lq1P?b*ftA2h)1fGgl%RvMAUa zScFvKF&r&&B)8Z{tli2iBD?NWoT(U(Usvk{!Dx?Y6i!jSvXW)Rs`CEqEJn;~w~S21 zdaN>E@0loh4f$}MM=KMnLvq^0r~5<<na@OnTF3*IL);3hX_G#TPV_f@fLMYj6vOey z;(Ah_8m!JR;|dl!*K)!!EVeyGpniUX-zTGFjt#>@(0x+RJD5B825xa}vZ7CB5@)co z4urMB>EXUG&n#4;xwLC$gOB6W#P|>guR^CuEBT_)tcxfjGq}lvImU>RNJu{0sv;&i zemhIb`Qs?as+JiM$J#M-qv(yS2n?RQjmiaj#4m~vcsl-^j*DBZiB*ZePE_gG^}wC& z^P^tV?nHDKMoJFGm3d%Q!>*%;W+J0#wnpq?^u^qC0cwS)j0WUtG}D915oDyzo1_+z z5OM{HC0gTq>Aq{(y$6n`(R$>?o~j>$WHJJBHCbnN)lAz%$@R4qCSY6ill?FT`k=2O zqKw|uUXd2@E!=~BHU8usCUP{d#y5&5^;+C322@3nyFr*Mqmld?OPl!}yw}QEas{gx z%%mzSYr3?L71U3eGVHo5uJq=(3O-iFlGsqKFnPqkW`xD77?H$`ydrF6_oR%Oc{VzY zj}h5r9OVp5v$pUy#!K`}2DKyOKDHruWi!9dgi4L8{pB;eB-YR-s2Db8F^!$r6KbOa zkd+>&5b!Raox=a|V@Ar%i&TxFJeG=G^Pu&xiCs@TS=V|QI1cKuGY8EViTKOtV^jG( z_Ma5%lZ-EvVAT!Z>YAj|^%F(Q+t5VuD5i|n!|SUBm5GucQAwzZHfzA`;E+#pvb!D( z0RuQv&RhiOXgQrSFp0Gp>TFq0`-?fsd%H`RP4BI-H2ZvcGHb>LYT%*Z2R6}KefWuO z&+&m+M2=7@JS2+Zg^~xi2FNI}wfYTX!$&-t5y7UUJ@aWIjr0{Px5`gUq218r`^4mY znwn5?Cw!Ej<<3rQHAWNm;WtzZs6DnC#QGKcZi-5+GS=tx0M76}p905Q*ttoTkB`fm z1pPId<WL>8ES3>)T~>jldT&jMngqL>LS8(a`Qg`iAIvH*YIfwZ?B#E+jJ{0Dc+?)J zKUQsR%?jDD=aP(B){y!hzY4?2tH_nRrur2Xsd9d<$or8SXiXferJiBRzsoqP@YV{e z1)H(69A=hRmf_=}d33BS{uV+Q3-9fS#1rNc-XMjl6KPdSpo}9KvO>-n&;-)Sm(mN` zX+H@*npbQ@UyP+bxGOe*gvhn1d%?oe@MOnHBncreJOMvzE?MWa`78qM;z!&^3yOFT zw_+YxBbh1ffKpO+;U0b?H3^0kncEYB&lNkSt=BWMYlbmJ;*P{f(2n-QJ6LuoNiHk( zj>IPO1Hp(CRBEdnmj7KEqX^xbYf=qoiMQ<WX)m#?1u~P`uC3ZJC1xONJ?WiM5Y>{B z%*M(!!aYy~+ee19Dr>)zJ5eQ>84q3$9#MILk-)Q>AF~8Ev(+@#PMAD5@0!t|971}; z^jmN%-|cMP6Y{}Xqy^wZ@gwAgttSB_#(HIA1<#nLjAvPUTnk&|7^u#5Sr0p1@SAKr zT*U6GICd}JYvZKwjN(WhUYpozk)3ZdF95UY4{30QHBTf4u8?!}L@A&0m5@8M3&F7- z;%K;$k1-?0(3Kzz$CD=Vpl(5ahK)7*W|<t3<&`=qj)T(Nmu8z!y2fj;N{(iA*iQB; z<zCh~B@jMj`;CrIl2ywrNXoVG*KU1*vdN<?2K>U4iIH+-)rn&cjRl*{)~21rm88$W z2xv)SGUrVT+0!=?hxy}yNOJDGDxSei$%h(ep3>3U%uB)mu1&XbGi*olIw^-@EqgK0 zYjG(Il#CxX4*r4)%xwB|>{nLgWK@M)a3(ZHS|J8_L*<fnrE)YPP`_abTn71-BY+x= zC*O{TgC*d`M3~78lRjv`mF=NUoBTzZAUt-4T<AMYo9rL`z*i*01y}I5d2e;HS%D*Z zq=Dj5+=qATO|;vdjhT-XH><yg0dqfoJ+rD%4hX)-AzE7~53qS0xpwSbB*Sa}7SEow z)5`|&&T|9pa^wkxVqzL3<DgF8=!n8a>aL&J9pfsCVIL*2I}E8tpC+ysbE&uXr+0R) zZOXM<xyQ|VaU?V<W8zBiAM6bkyMi`ggJ`=PLb7941K0^k-9H{s+w8lqUw9|={_@Cc zPW+X5Gkw+nZ0mx!0u0Kg$z+HoM1Ah%m8_n-X@!b443}7kO*5jH2q@3k!~c2;<tMVm zeTesrCA3fWR<3@Qy<w~PD(lx=FD1-ws-z%yU?o#x9a1COBGoLmmawQ~jGVH`$yTyv zv>#7lpCYo7t;6TYgOf(*ksHxLMh3<<|H6id{4(Akc}7R<#<sA>xCqz86R;|5GBgbf zB|~e!`IR06J`ykFGgfE;L`j~>I`)e%a2MBRM<K|0@xv}*oYU^7U%)%_`g{>9iwni$ z&^Y+Q=s*|F(IWQV$g-(v@o@q;QD_Vb;R$JPA}ZD-vm^eO*LXE-uf5U|U9z95utb|` zz0}|29v-Y7kI%QkFp#Tz@XqXP=GE1Ru&g``Pr0&^nYGsjJK3|i&?4LGIM$F=bp*`9 zk7OnvN`sqN;zX7#H|(q>Y_F&xt9|Sh=>;po&&EXcjJ<FmB2VOl*P%c&oAcI;NQ52d zxA-Ef*7O+aaaUMGosOATMF3@)-<(IW6Tj;C<Pu2`i=2|g!(mwb#V5J~i^=c!jj>3d zCoU5|r+>?NR)6Yh>@=ySv*sIK5R+l1NlHe;^aEGq?_}Hf4R=T{=U6R)#LY6DBV%L< z=7W>Pl;*-!_+=gpbIi~4WXWCeT<pD(aizq}7-3Q%cK}oJWo8*h#4FpMo17$XYc7&Y zaxdOQd-P7vFeT~dNv?=YHbuL%z$e!1h*bGgx{%DS*&r=>FIS`iq`-bM7%3hetKok$ zm(nE?a(!|)J$lN&Yi%?#{ugiAWibwj7U&5^nbfHqA?IQb&mkhkc)*kwc+__*bF5Ge zZGm64lLll3AL((|l~HNVJ1Yr6WDKUq*ea5rh?&NV2Srz+1+tyFuB_fLF3<^$g*8|J z_9^2im73x@c-)9-C+!j=CDw-3eC8~6#5_UU#>E<4cQHO@IrT@LO&(z7KAh?UjGwrN zwi-LvAO)(<w48Lp2)SYe8w64C0c4vrxG#L=I6A=k<6AIWWDwF8t>~|oLcnxayEBiP znlF2ioTL1S{maNbWSWwTeGu8Riblc}X;Ws>MY=25NL*&JI&3cK!&|8e;VZ~&{)W_B z;UU=zt<EeA8Osc=9D`^ibANPz*UUZ`5&GbHMl@P~&A8E}5%4(=$!exOqs_h}Wh?<( zqKcXYq)p_|h>%#V#fssWjTUc0$MrjrzKVT4(?jD1r>J>16L`p61&9~nAyp5!pJVxY z@rU_Szak34Fl!e%^^Wf9uO7l}{4dN4U9p955?_yBRG|%>C312sgyOkM%?YoKMO6C% zA;NKqA=wBSbG0G%i*Sr6EcbDdy>V@vx%S!1SM3QDj@#8!zvWBpx2_fTO~LRc<4b1k z?+)?7F2)CE2?au6S(BtH(H^<5oAVaNyY)jNR-4$##a`}tmfcxcbkBNH(Fga!Kvw=I zL!8)C{0CRj2{rjujU9zlp%`OEKGZa3{s*Jae<XS^`;b`?cQNW&mqqIQg;yoLDr#um z+7rK3!pQ1pB~dbg*grckPL2MgXELt%T;55`Wn}Fi3W3{qeS<*b_Ek5R8$~be7z%aT zqsH^gt*nJ&Wx-V3<Y?Ooj^A_5p16`;%AAX1$bly`U@yfKnF}^rB+Ipon0?`4`FU|i z=or41(aL<-+-OC%mE7g*>a7-uD73<Jtl;v66X)A^M`frHg6MJ|9`Xed!h7~ckhR0M z+MRCw_?`XA`@`}wC31AK1(2#IXG7bv-lQBR$Agnae%<_#Wq4c5ou74PdSdN|d6hGi zt1*kTK|LCe!EzWwxIrWW>5KK8%f7nu>T%3U*)eYLxU<rdxsrLtn~1+eo4LzF>a!NR zW3G9Dj<tSX%$b<M^;Nbc?`@n?M%f^?B3mq~@ybkKa_(B`%ASA%wTPg^Fj-~D+Cl&P zxLPjO6jrgSNCeF$i(_ek6|c~@tFaF(7(Gde(kH8+lP_nHoSA!0xQbq|_}Yyh(Fb#a z{WC&ZVdYKEp%$_0bHg@gPvwBq_VcVb^F)yRnpwqU^Nf0l0hR6H7c=|q99$`DnwiwB z5a*ZpH)m(1Dux!{3(GkR`oP}8>yQLKHfvoWAUutnDMSntSkZ5X2X+1SPUhjEYR@5A zxvOC^tjXAq1fOel#>?R+pkL?*UdO+};K|o(ft3-wEtcBz5j=5ACLmWy@<Etdh|B$; zFsn9l9felqxfmA+I(OyQ6Fe}K<@(rr?Z>Udr&@1>>=}w5H-g${*HT9qQ!S9WwaNp| z@;Ow2<AUPUd1)6c0bM~Z&~h{}j`7Yv_z8Z5CY_rYgI9DtSz`z^t0t0_rx!BH7)jUi z^e;#@_i=FFWS26o$X!T`hpcg~6;y$bU(KwzzFSdfzZ2sj+nUd=G<rFzMjwhJA4Vge znhC?<X32*g`^B5)AUS*Y$T(6iSzMO2QLYK=<7>qW&^~MjJwk-$Toh^#3LLs|$J|>z zqi=rfs)fs!Q?d5b{{GfKkYsno_ld+@!A>WRu}U(ZTR=-vQjHlTp7XRM?o1=}E+bXC zL>64xylS%^!*Gu9iIJ7hAaUjl28IOTR>)O*XsrBy&Y*dPlt{~zh#H|;c3&J$%b+At zh{#8*s6Ij50&79gMvdmvJ7|zZth9>uLWRe$W;9ywvete@v;wc_dR7e?XPmgJW=3dA z+>@-T7!#powFN|%xf$6EIbCfh?}?es9+UuIYQLya-GclWtEdHfhGV87$s(I^p2pe` zqbFWq6ZKqOO12ro#>}dTH-4(b#qF$=aiw>nY!XN^<!;Qq*iFw^F>`Iaq0^jAXgueQ zp79Jug+@X#b|-_P`zCC#SQXk$2FF;NOOcp(3ns*>LK-{*B<mPawdbQler&%wJ+T+B zg(q`8qw9Gm5WP7N3%H`S=+JIvP|YiSG<Gylob4|fpS+FH78k;Es^K8-%nhrh@EppF zl8vwoi5wuCv~s^=?_AkPKzgJB=9VA9m&lmeqf6e6%($LtK;N_+Ba3T=x9v;<C*kxU z)%BwmXp?wS#Jh`k#8YhE5zm*{CjQ@QV()m*dB~^ZtRC%E<7BTABbV3aPx)DGAr)+h zkuXpEIhlv%jF8F^ZDBXmlt6)eHuMCAWi$x=sL{@PEO$z2<kkI!y>tw286Uc8;I?E+ zalCdzw7a2w=ixBVzg}<R`4$^SAJ>eYs@?E@(}}yR6TfH1anPo$IRu(nbo?B|O?R`( zF_A<v8P*hMgoq1YH~It5iRZ8}*x`H%sagmOsdy>n5N^^JW0Sl&JZqH1a3WwbODgH2 zJHtrik^CD~zrDn4w3;laOcIIWW62-su)>~Rrxe3rETK9K`#olsK%d}pGowFZIw&&h zUbCVDx=gvt%p}`^ztQ5XBs5B-Sii)jB2gAfTj>l9C$ntAN=;?E=s0i2lC$e}@?sl# zl{hu}fl(;q9dF<obTGXSM9d4aTPs;KF(Mn5c1fEvF4tBvNBYbNInMt{rS-$cA2!!_ zBSj9ThvcXkk?Dbpoy*FIn^`r8i9b=x;F%NpA?Hi~l3}FrnQbx?{Dl5#mq?yR<H@lk zIV$>;oU(}Ce2JH}4bJ=juf~qjGZ=yQ%v}<+OWcorf{F6!YpNt!8#_I~E-;w$k}Jd^ zkXyfb6&4D!0;|G2$;3h3n17$BU@-?NCCQ@lfz}R<OyFJ-KYOblSRO+ZD>g~_hM4(9 zT1_71(~P9?<d1kmY@9qiZwkT5rKh#$(P3GZA6nN|t)Ur-=#3Zo({J$%KOr7SzLV^x zMZ{w0l~J}%8M4<0R!Am}#bRspMb3mLB=KrCjTwCuCzw_KC*@w8;+Q${x%g3>L`ShD z^i*WdqhwZ*zQdvPn8vADPQO9|&5#&y%7h%s>R2bj-q2PI0MDKEz52|KWK{|uK^w`9 zj4D~qINMC*&ep7q=rB1Q);n3KeEtFL5F?5zwSc`JkJ-%}v>XGJ!Iop%T#NM3J=gO} z6ohpkReTY=LI;hQzOqqf25wUQ$9C|T+N5&IxtZzAs8Dpt@+Y%yUfEi<3J1b&LUMGT zb=3wVsBMmu^G>U%9im?zj5Os~(r`1*+R;OJ#r;SEUddg}7rm9kz>I1?rZ}xKua~$? zG|Jk$zfUq7Kq3>3xhB7d!GQwpm!S1}LAq!fWXbYDwCtAOETYvQuHx@bNR6Yk01Kv7 zw8lSin%U3#aM&SNd$6aDGfMQ$EJAH8H7Ud=ikuRKvm+2WOf8O5T?4hjCgK3IhK0qe zl4&-O#JjtlVYDYP9SIPhWZqfa;W>3|rT1FGPqF6^ISZ=w`X*W=C3M(W<dIoz7k^CL z!HAl((HLuE=B_kS^|gqRv<%1p>>O{L7J`Pr*STIGvj8kBTf#<@QWjk6;B<D=+97_+ z7&x1}(gP8ic{V3n&T^1VGA(L=TWJyw#rj6y)3D?s$uTTz4pr>YQWz)MArgwqOU4v) zD36}lT#i}IHfu{tSOK$Z&*f~N`_p7LlJ@c1Dot2)_1-iA^1*PCOKo8%T%X5-p6MD- zDT|%?S*#Cl%hn}Bg`Lbw%e*(N=(DU8)n@#enwj*y>%{wf%A@t0m{9gjUced(eU<%& zPgXu*%u_pM`#o3Do*vj$R>70xafSFwPlmz1;%hgE@6?%Uqa3)AOZL}MMxHgr3K}1+ zGX83z6L;ax7EJUBB870g%wtxyV$jrz8ee|F46)0Jj_rNy8`g)Vz@yVzpYRcExohRP zuu^c~s&T!nz;-si3{RbF`!bV4ZqkqNgZyY_LXsiM*dwdu?a6^@5m~<xl8R5EZ(;@2 zafx8YBSS2H@C|*3Dc~5fnW){f)796>C)v@#eO`{UT~~iXB|_6Pcj2hy5L`|Dq-T@i zKv)<On8=7fXFK!*69J>Jm29ZWLZ7mXA|C#gx4`vu!-FQKQXL2@YA?Gl>JS-=RgDRc zMlX{Uk=u2DBbG59b}4fs`kssm-C%hj5-}~$<_c;bt)$Zr*JDH32t1moRd(4iKF3C2 z2jrjF8RsWk;A+Xlm;v|ER^!Xsuva)#R@q44x?sCxPK>Jd!^Tjj5o6C;T4R9q!Sg|h z7z_-HHm1$WeLL)OYrk3fbZg#NZ#%ho9-1?k$DS)s$BwZ}qTOThEVh5gcWV~=6o(g| zDRz&jaAxs*{rCFw^-y(4wS6^O%_{aSPioxOIIQux#=gz{T2J=w+<Rj4jPk0+?^~Pp zkM^C`y0tvMd-mw~^8O`jzH!^&HN6Kd+-Q&eKlAP5>yxfL?ut)8@qq)kyJnLo*7*CJ zx6Bxv(VcnwtVMIaFz=bUuTI&h`=M9A{@9`a+Ub_f|8)6pPriD=?;icr<2SGJ_kY~F z@2!vB+H>34cO3lB*YExC1C59N^6>7Dz4yt_K6lBYUoP$)zOvkU`tA!hTkmZfUa-OR zb^o{E?zvx?`QB*{P5%5qv#;CSt~j@|=lI_3Q|te=HlH$Y`Uz9d>tCz6M|I=a<Q4yU z{pJ_zXV!e?z0be&%2k6?>Yjo1ryn-6XV$8-HkkR7srUE&zC63L`e-%yz|tGv`1s;$ zUO(aWV;5hwWX|B8qx0$~TANJ1diuR{{yKkn-jy>yFmPPs&hFR8uO01-u4q3|+|V<x zwOivG-Or6K9Q?n<Pb~W4i+8>9t)WYLcAItYg6-Dcd#x*0ZOr&)^M^zKTJ*6e4!VEm zyLbG@uKzgj?$z#ZKRWcxZ(lxq>B}QusdnsnuK%?uyUaX)?l0yax9a%3PtVzA`t$wo zZ9LqWGWM~N7e?+GyQ8yl`Mutar@S)b+}X2cEt>pB<KD3=28WjpELr|)<Hc`1bH~#c zKi7TnnHOJv_R0Tk`1o4?+x+?8F76+lUfkU}deSY^rp-EY_5-v2HDmI$>n2^(SGV?W z?bNeTW9wr7VyyA@z7I^EIc@V9Pt81W*4Z<UnLcCM<I|3vx!v3kt$Oi-C9A!4-ijHs z2gZsG$A35UvB9a!-@a_aW!o)(`_Sd%XO%bi{c_T~2L94>a{al^KAl6WW@B0JkyD<Z ze%18PPOYa*oq6W`FRi`*23u{g)7rPqKXum9>2IGoW6qMfADsK~S$~@L^~qlvIJE!# z-c_4NS6hz#XmHu$CtiNbOFO;%wx#!Xem&{DxtlGxd%^beH=OyezFq32V?P_&dgQE; zn?`@tKCGVE_*iqVo-ecp`d;c^WAdrfuAcM28aHgX`liQhy5B}mtaIP0+srt(_uTs7 z&c4;_<)uB>wcgxY^<L9|{iIJ%Id$rHrad=(`plDO&YF2>7~VB!oIT?YGv>_r)YPZ@ zf7)|jfV{W#oj+;r)Oy;LGk?BHwfgq!oWAyrt35jNXZ^Fvfp-7Mfy0-Ke!hKjXLx+^ z$h(GL8F{h2U-7P<H+uinw^83Odl&TH*>h!iZ~K>nkG*=v^B;KX*vH=bV9$Rx{r6uU z_|2miJbB_XYd(MYOK*Plti|tJa^8}Ym#nt*>1Fo~UbEu06`KzoFnrC(_lLJz{?Kb@ zzIgkyH$3~T=jXq8_KSaf@wr78F5YGM<?7!(pYGkK=i|kS_UdE58vASalEzpwFvjS& zmt6hI&5KsNa_5pgM(34h_PrAB{J<ICpZ=z)cMROydPn06^$y*?wY%*ts#)b<8}D!I zP@GonT<u!@qC2hoNaxR;N86i@tv7V-vSmvTUvXgj(#EsBd-UDk{CM}~;r6oTk_%ru z^`*tnZ1UvE|GV(%;-v%L*nQ-}`u^6Q15+lwum6^wy^H<Zdkmkx{L*EY4qh>GfBWvL zx45f%NBiWFw+%f!c-!)AmM>m@_t4wN8`THP|FpK9ywi+h=NvQdd-I>2SI@m{_8~LB zGVR*~Q+h5f`s*j6^x}}>$oiq;p5Du+Uo&sXYCFu|Y}U0?=1;m|VDo_sdY@`;+jDr| zCkGDc9jxCycKeF&4Ss#_h~*nE`~I@Gtk`?>$<7_+c<a@^5BHzm|JS}FTemdlw_X~! ze#TStZd_xPwP&rl&T5a(TQL8B^BeOoo3sD)_YbVmTsv&;KY9lHFYWtpanjhAhK?Be z&d58*U+SDw&nUl8%&j}sO~p>l*{vg5$F!d8>zOhzW6`WT=3YJjj`{toJTi06v<s*H zamMYl@0@e*+<R6zdfwD|=gi$_*6ve(*#Bbd;MQ=@CmI`f_aC0U^sLv*#Sbj~?~2aw zvXL7{2gmkmpV`@?x~3Q|mz6&)4y$f#cSlzl`RveN2De?d{gT(0KELAl(euXtJpR<k zi_7<2{MVPKzjW1$M=tv8t0ynse#x0j*BGpZtM+T<rG1x7+G1eq))tLN%1`&a*0;^% zuTI@?+Ral=82D9d_r{0o!S-3ByAEHlV%O!rUo!iRXWrOx@X+zk7gL&>H)l87&1pT| z#z~F!o1Nw>jnR6&?wi`@k4+xEV7MIm+2B>nH(vg`<vXv~bm&bhrYt*R@%^v8dGVUd zJ~6ca=mTR%1sr~&xT<+@?{@~Cn)2uA&(G|cv*p~c&%SBuZ+cE|?=`gg;P(dKI<(K| zNc$bt&#Ecahq^Cy`nuoh?$W)uebLy(qnnJa)n2Fjx9S_kw;GQ%?`yu?xVv#i&j<T{ zJaF}-UrqY%z{!1YYW=XeU-Po&>dh0%v+EyK*HydJ`_}!{Hti3M+&OsOvdfn~w{*Sb zPp)`ubW(Rk@r&j^dtUF^w)Ml-%{}idcWXbi;yX*XU%KyLbM&Iltor&0Oom3c9sS7o zk=2RKclIAM`IsrYOunyw&EEI+^z}U2)8E_QcW}J6?mu?Yty3PEy5rPs1Kd2=e6oJA zdrtN1qHONpdbsbWlm0yQiW#@hT7S;6IdfOpVBXgA7R}v%_TY?XroVs2Ju|PKb>YlC zrX4)#+kLC{{<>#UW5eoeV`~o`zwA42ti5>A;=!e#8`^*DU+qo1@2Y-P-&F41^ZVXg z`wyP9+vHs)|6tPeNz*2s5U*VZj_O<3`*f?_`)qu7$)v*uruA>rzuu(%r|duVqAAx+ zy0d>)-=|x1nz6rh_ptHa(P_hHub95#Geh@{%pE_o-Pbv`^NH?ocm3{V?V<5Y+naRn zt{x8$e@j(%|JR<^dAR$LV%^38jltr=YWL2~<6DmJKE8Z>tIjIbVZ}j>MU5lMQ>s(j zKOfs}Y+&r?BkdJamfyT|-Q|mi9vHu({$=yw-Wdb?Oj>91tCK%6WyX|wlMfx(zHjT+ zmzyKyam8n<2Rqkve%gJ1bzk?|&Oz-*$F3MHMvoX-cX<63FE3lX<hyS?u=s_=8!fqa z+0>!mjqEXY+W7J99XgkE2HWS1zk940>yG`PeQBrJeRKEQ-TkXQ1CyLo-`zc<{hhJ9 zM_wH|WW~0FzgfQO;9)B+7~X8`vi9=shl^Vpul3Ze%UU1mS=8uj{HQ#s{8YJi`Ss$? zy0^ZiyLacS?T6cUb}sDR*FCv=O0;WXoN;RFV|~~3UD5kS&z;TRHFxOwV(Y-ZO9ytJ z{J+V^PX5uPy9c%$xUqk;{>}S--MX&%lk&{sy5gC#-8iuMyT-!uWA(1p{OauL!}aOK zPK~2__U+xR@11>j_O^Oo?m4!(R%19KfMe@>;+PL~|JeCq=kCtmI!AS0Z(q~y?Yz)= zQ#DpUSuSio*1WknxjDJ9cX3_!wDH47wjbJV#T6?a8hUp4OC$3}<__;QG;8Sip%aFm z85tg1*txWNuJ~bS$N4?)X`R&iSnGnGbDM7tUD=`a_uk+1eYx*5y}#*srLj->NZj}A zYP<U6Vy(t6n}a>yY@OHoX6v=^h8Og|ebUpDKRNZ5X#+FXo%!U<Yi3?I<4e;&IPK1< z4^Q27TL1J}GoF~S#mu#5&Ybz+jOL6VOgnta-v^%Voz-)Gxl8@_?swW}j1P}pJhs<Z z&)C$l)yLi#y=(OQqi-9%bmX4ljfej=bkoq1q4kG%8s2%hF?{#X=+IfiZyovf$N{7O z82$I?)}wPrZXLR5#kMOxvtrKBy2E>pd~)=Wu}`)~JKgSBca!ep?T?I48=D>WZjIru z4V^f&+3-h4ZWz5~?2_@F+e7W^I&bTq*nNL@?au1suZ`?Be8<q{!<UXcKQ_B_c6Ubg zNcX<ZTiPEUyEr`VfkQuCF*5k;!B+>*Sn<B0JL5Xf4nGjqb=R?N#%>+`#OSQiMI)ml zUmAVa*ec`y8NaIigU(CcFV=S#*Odzc!|v0V-gv0|efh2OqVkq<t;Sy(dp9p>Ueo+) zbBE^C<}VsU<?F>Y^;OkS_p9BoUY*T5TXe4LoZr1PbokC<ad~Cq>BhGjgXO{H-y@Q| zzWzfzmtM8$7wf-Pv#ak$ALdnWsc$O|Z(JXi_K4>D8_yKS*L~F=JLj~Y9KU~j_x8G- zO}eXA_gC+%-xsgF>O<>q*0<DK7QZiED2^>Isee+v*gdKHjqbDE<ExqVN9*hB4-{LM zJ2pPtJT-94lf94k9npV6|3CT;>Aj(6<L0)Fzm=aa7Z(qQwEnGgUVF>-H{0LqywW|q zo?af&_-^x4J^$)i)bm15qjh!bnBKMeZtweg|5pbNnsoQ1J0=}CY01Eq1K%7tao{%t z{gXa4>6??TpY-cV3n#5L@KE2iy^C94X>HQFy63^>LlN2?P+k-JD!#S;X4PBW(!HhI z39UV|I=?!-`en6Sy-o4S^4pEGo7?sLtmhv+-|l&$d1vFQ@~VhiUaH?+)Wr+s#f|?p zzS#Iexot5}Kigf=*}L;t`>ghi_POJ$jQ?_M%dy{%Hb;*iS$*WC;ai8lJG}ky(?b^y zoj>&K&|$+1N1CJ8j(%xuyYWZHcW58h{zUuT?OE;1#t$1mYy8#mAG8ndY}K6<t!ULn zeO<L`_1W$Nor5}W?d;jvw{uG8wa!`HL#qwzU&k7|cC_X{_5Jl<<7cm8QaM^a);J@y z>*D5m%`Z2eF5gxDrPw!O^XDQ8+c0ut?=1ExK39Cb*db!PztpGH$JYnc8`gJM`&Aco zpY6P(^Gy4?_C4)YLq5LNU0D6J`d{@>_2=rh)ve*CH?5DT@2K}Frj_@UpKsjWIJxms z`N^_VJXSnj+*bUk_*CSxmen`cN7u9JuT({Ke|LKInd;`a!VT3)RaqU?eY$gS=e?ct zI_t(**VQxi)x}537s>-0CpHdgENI+Uo>=ZyE+`)<J|C6OU#<76KUbezA6I{-{zUz~ zh%EnB98o@9zFOW^{;WK`+%BYb!{W;NUG?nx?e&fISBuY<Uu=A^xoJ<U^;qlV-n)Cp zLpHYSJEZUEz9aiS+V`%$xAkq_w^QF?eYf<j(*K42Yx@7we_sEB{*(J2?A@;Sr>#9( zBRyC49NV)=&)=FKZ!T|~)7ZT6T=}>1SLGkeC(Bl2hsFtwrHw<IPc={Ic`72Kty=GF z9n`wK^+;<)>#o+3t?gS|v{q|v9@ja%^}W{bTer6EYyGM9<G@;5w9f7Mar3~&BgIbj zUEQlXW9@6(e{E0gd_4$-v$}6|cdrhv-cdc?eOLF)&L7)F`>64S<Fm)#J%0Xp(LSkt zd;9VBZS8Z~liR0^4~>0eZ2z$jkDWAj``GO9lg1wyzbB5GJ^rJycaA+cdgy3p<kXQl zBhL<ZhEE&$;^^<jHf{g8Go{+9ekS7Lm+OP;vL3JY4PN8A;-d0<jdPnH?|HUoTI=zi zFZR3~)?)AG`<tJPpZU%6!e;DO-W=omm-?*wg!=OOzBmg{y0rdh#L>@JhgGYE*6daN zv6>TJu2~#k+*`a+JX{=F{Hg8+62GiF+WAapY5S7);q6`9Q`(P=pB%lqb?nPy9~t}R z*ov{U#z)4h@k_>6AOFMHL1P~syK(IQ#^2fAvvXMY3)SxRHTCaf-q)-js{T-28nQR1 zK0BiPU5XC}4|YL)e>J^2r2AOsC!NbXcXYPw{;9iF_0ekEurX(L_w0VWdvEu1)d%VW zL$)?<{I{`t^QX;cnhSak?)gQ}>a7!7H@04F4YmH=`a$cxt>vNHC-;25=jfiV#>{`I zXUCp7J^yL$(|jy!>VL~0l$Vz;mAf{6-<Z=pxcQ^zz0IomzMk*&{JG~pJr4%ndZTBp z)()*Nwtn8aDXw>4%=PD68?=7XvtCHh2b<l-w;NkE?kT@hezW{V`DnRn;|q=7G@fd7 z!rJ~e-dE+f%ejG=-yS;iL~uj<7MB%w70(qt<)pH=>?>C-*9>hqy?n5o(|AW?!_bex z@~7o{%DaMf`*{7QYUApr?m-dn+}Sy`vq9(H_Qmb5wZGl|M|=IwNu580h8-W)cGnoY zL&HX#Q@mDeQhu=9wXBO9iW4G3uBLHeFe4u;jwya#TvMD>>=w50%&^_7#Qb%uCDjX6 zRjpnxtPiR$3N~fO(C!n9^NJr97Z=|t4l6!Ue7U$WSd^)a7aNy0*X=p0=kcBmLh^sp z8g9+%-LQB2-Y@nZ(Yr_QlGb*uvtvxRXkOpgv2k1ZzVe0OWL~citCv?ls`jsT2+Q;1 zYN$H6{$tGW&c(Z;caMe4?OLx^H|loPt`=8MMlUW4=4OrR`R=*h4|G@SmLXk1i*#S_ z+|~Jh=hI;q_w1a|xv?|e*{yp_;PW%O2XwdTZq(hWdwO?8_qb|)uz-InPAE4ItM%sQ zK`}dXn}3MexjCeKy!dxmuxE;H*z{%bdZhSA@vq|buyQ+=hm{wW50}mGuhSdL%a_YL z%A3Q(K3qOq_B1wXyrr>CW8=mejTwz~8t-l#-S~0inMT#<ZBB1K+Bmzhb>rdkbLCpm z-}_?pw<s?thsybl(ek(DdgaCObo%E)r;O`$#e(wF<uzexeo}t7Jg)qD`RkCnwHiB5 zuv6PL<~JsVoqe)gQ8pTD#r@W5yilH2wu^&{o9Z>{--d<VzWPE~*$wL3>-QDE4r*+A zyp|TX##|j)yf@|=2QRC(eesdvsN(dPy>|z{EK9mc)JwcSyut5^SBjbCymGa2VL7Xu z9g??2$lihFXUgLPlO7qPv`K7l@=A=#`q8I9m&4^cjrAInLx%rR{;>RVNafV>sp3x| zA73m!7>wKdLz*@V?squ6(r@c4!h-A?^L=bJwYsZ&e$3$&-CMhZ-3_WkV^;U8K2W_c z^!F3hH>w+}m#TM!_Rov9zgoPzJU8z3dW_nRjoo5A$7AGwQhvN#zkICtN%8&S(&9J8 zABwY!ZHrgxGs25K7ctt&;la<XepUUu>Qw93d(`{X`-g`+AP~tZA;(wL*VezOPY*x# zfqLtDe!Xt}-um$R7vVksS>GA{^hfn&p#vv}{C%}PDvsHxo>9LT-tTAC4+9rmRoz!j z2@Uyv{bb-HPZQZZdU;53d3e8ev01rGjMs7HSId*jQ{wjl<qqYH@`2*q;?p733xdJ^ zSAAvN;ZJe)>%nurBR<_U#((SLZ82sCgjRgHIITD}=IrCeN8@#Jy#HnN?>}J?X2-m2 z9lEny`SzHbSK{+S!Zr`a*nXkjyWXnaDP9KzUOTQnHG2BK`c0udZ>o2zPmG?8)vFY5 z4PBoR9{<s>tJg+l<fg@OVF&ukjbkkP%G--?7hfno6jHHsSfSI4>%-Gt8CKz};>_ZV zkdC8@??n$67vshK#b1h>!cKjq*e}}r&ElWM-0~CU8KEU7gbehT|17R3E(!Z^adCC% z(F^hVYw_J^>l($qG0NYse_sDLc<SBah#QJ~!qz<#9^<#s(@#Zz4=fIfzVBb`RqPnA z{lYRG9anoO?mAF5L%s$=rvDoE+$(hF?eVj9$o7%Zz9WO@-6cj-4YX>HHDX*ZFJ3Gb zhFsoS4wh>-wrsq&v2SCK#>X0;Y8=z}Ok;z_<DrG$Esu&L4h!i%viyGNSAS!RIBw^# zw6jCQ?kuk;zff*pZdk4x8nGnqd`9&6%@b8PGeUc|D0YgLyeslGFV*M9=nq#91kPDp z^@YX!SpB8IzvtFp582u&yx7v}Zy`Z9M(lrMNYDe-U4f{siPy!|h1Ipy9f6x)s@|w( z*Q>^yEv)y9S^Gucnft>!OfI%8_AI^@Hsbl1tp%ZlJCy$yuf0MJ)+?u!L&blKn~Oik zn4b|AdAqQkuhb6&)BWrE>iUL|wu@rS&kkumCw%k?(W=9uZO4X`oLqk+zWHr^cl}5_ zd+p`m&To!;o)rk;LxG3a4XK}5PYLVtrh0>T*IPeT{kl4)I-uI4+9Gs#QuyD=)#lX) ztE0j@-xfW3v1-;+qwQPQZw@TBW1P2PJy1UqxbLFs%hjG$Pjyek#JhCYh@`<?otrw> zcCLy@`^L`e;io><y}Y}uyM7>wE2@XX>pWeJR0H+&kl>BuI%~)MmsYm~Cf~jq>)sGC z#3|i#x<BpyJ@EQJy7zRi?4HowD=dApJJMO+S);pO_tNg`-8JH#M}{T1sJgnkr+PKC zcB}AXN7u*1&k^zZZ2h$u<txGhM<yU-|MbwlcSkMMQ2k(x#iGbgER50IG4x^U(DO#j z@xSYP>w7|TTVXTz3r#&PUSBNsj<dFkW9`agm4tnJtfv^P9}a8$xB9L?UV~xHwhrz3 zQt^#=oe=VRNL+XOkR+Kr^>nXBtaMiW!Fq03u-ig5{!rZ+lGGb0dS<*fjMqEE79CxG zD`xDW$bra6Js+t5Z*h+&BDeFF(3BgB(PHzk5POD?-#vZ~ERQZPDgRxr9x{D!<Fmn+ zY}J_BxVyYEe8<7%K_NpQ3Hd**Jiojt(EOq}ZpYA(QyRZ$+!S8yzkzv94PJGX#;fJ^ z<=4s&m-EZz#Z#fPw}!1SVm}Pq@bRz=mxs6HJBNxzA&a+!MgDPdN^wN!@vfnt2Nqu~ zeh}8`=CI~37I((6zbY;&&IxVbG%`4kgyj7%M)ltMwvgGshs6H1{#AWJ$nHh){-430 zs2OO)cy1o!_5RSmohPpP&RC_P-dxr3{SmERTmP)SFy#Ep^&$1n^@6$;D7O*TedBu5 z`aSh7VIkiWqq}!_gB`=7ZyX5ct@YdDug`{lo)8xQj}edlHD>sUu#fk}?|WiCu8V8_ zEdKv_=*f5Muf%a@hd!SfamaV;UxsE~6YcwRyt_BDPIW}OyG4(W3S0TL2|b(@-u*9e z-9N@Lw@=8;lQGNo|C$xEwQtD4ufkj29rpCzn7KcOMg2kO@MXod#V=y~t`EESjX-3d z3aj>}7^y9z%FhasfryG83d`_~K;Rz?i8wG?bV>b>7{#%O*#8^S@sqGSpO0wiBf&8q z7?IIiLw0)VWz{p)_2IoPs?MrTsg4W1_-@#qA5_POR-GAM`J17|zo~AomR9p({En>8 zuP=?B{W)yHO(DVehs3qQ+q^q^cwEfwS<%v~!bAKoY*JlJ56e6!@amH2%g@9A9~aVn zU_=2QjdA!?V3dQxjvpMa&xeejAC~H0an_0nS^0bP^P<qZeIg>=CgRb}qo=D!Zt$t- z#ff2u-W>8jHLU0QVFk7fJ21JfszqTdp9nkqL|B|<VJDuc?hX5SN%ZPd@j9&fT=k`h zG>;4{@xE%4usZjLH8`sK*@y`~)%{9Xjvsgb)qSwLygRvCtJ*58nZ93JJrekH-H?$( zW1hbqvChw8et#dM2^HKN{l7JyNcnPDg}Y)rep;Vb|1j+7IrVqKe*8Y>_VJikwG?WN zUkZtQE|A2ZLXN*5*5>d)AN#~y>=x4Z(fU(ig-;9l`A&H0Z^U&@4=Z$7*xUo+-kXKZ ztwQUcn|KXHv^^01;LYI;K2U!$EcOxgr{njh1C@L(V)k?5+Q)>yKRVibamfCK(XLD4 z%BRJVM}?jLzlfdR5u?|NNbSGjcTTImS6vVo`nT23<L4LEP2q7K4R3ULpqi>$r}%n# zL%Dr%O!%PfdN!Q8^D3t;_|R&r%)YJv&ibA0Y3<Ke`}I6J>9Xm4GY^}7&6JN1Jkk1C zbF1bft-}XelYcPqZ0qpGmBlvYq0OO)pARb=op%p!wEUH&|6TUn;Q7P%jrB*#-=e-l zC!aLspvj-<?`a*_IJ@Xp4|UEN`_a(m%gd#wym8O#>%2Dd>e_Gocf~!O2b(+e-yhkL zv-|FB9oKVSvo06Zzi3Y%dvN5Ik*|&(HFos)FWY-{KT!RtduIFG(YeFtta$(6Ny|@P z{=nd=!@G>XwfbjqO!;C+->Jn|u{<R3EA?BeCp+7<*B@JF<mBPsjC^=(^7yyL{xY)u z&~?ifE&cq`KQ3Es#UaDr9XV-awUIB4>^yd2=brlP@Umys3%jq3zdXA4$R;C?j{aZ! zBi+ArukWnZK5gu*(RYnLG5VhI!#i8oca$G&Ue$c6u|xT}`V-;%w<vFH-qN#Q^M!h? z&i_Z$eZc!&mgnO?-*YlpvLS2;5D1Vk!UhKhl&OF?5R0p&ii%om>mL2#sH3&cwpPW~ z0oE#xY89-wa4VpIU<e3dgq1KtASCCU|MmV{J+FVx>zsVYXFQ+hxyN;1_x(K2+rkTe z^3fMQx_s^8wFf=&$u+Ydxp3{59(&UI-KKss_QUaSCHHgqtQSwL99<JFc;)DTiK}M4 zW%ksp6KBnvwMU}RUrsz};{D;9J}`Fa)Z7g}TzCGu1J_?MdC&A~MoY%uIR2u<5hsjJ z82j((L&vTheSBj3+1t$d=Q$V6*?!LRXJ0<+RkL22X!h(`o6Wjm;^B$EnRWQ=^X6=| z(HA#<{w7y#{LYQGo4e(lugw1a?A_*UJ?A^KH=aFr)~fNp82|M6<6$@c7`|)WtnbeG z`P}U`x^wRCbMK#h%dFSW`pK;C&VKux-^{sv&IxmGntQ}X*UVivXUUvb&%R*R|Bhcg z_Q=$0rgogZcI<DGMOnYm`#1T@CZF2)=^LFj_j_|bKj)`&zCGtlv)?tbeC&#_kC#o| zG4|Ps3+8OP@w`nJZMMZ`6Pup1@&C+y=A6?Lhwn1`OS5OsxqSA=X3d|NJAUbC?)ZDg zugcGd!(rW(2xigPQKL7Gzj@*t6Gu!0$&KC>=4V|bdD+zKqJ!_B{<o?3Ozs{m@T{qg zqAM>9m%Ki?n#<R}<?-Xzz2>nK!})%6-KQR3w*KA?n}+><)7T3VS8qr>_ujGRP2IEp z&UK@8FJ5=z<HxMuB)H^|$*U*dF!gw1(zB-TnYwZEZ#SH`e%<5q*5AMW#L4wjr^eT< zjLmxW^hc-OK6&Pblh-eMe7p7cu75n7?1zHwz8lMW?9}%YfBs;@pM?Q=|N3**pTGWV z>z^L3V#mpYlO5P?a*xSHlgCZIKFq}flN(RnooMLUlb3DSYr`Mbe|7yu;SkSQ|M=sd zdHnAlzvS_K*MEQg>o&Y}^2|gtKbn4WShn568~i9g?;AZUnES-U1$QNS__yh=PQ5Nn z^P`VH|M8bUeq7G^>EtL_=3VjHYsa=8Ee#8C^Jt6l2S=9&?=A|Ken*hUtAp&m7+dhq z(_bFDarFK1Cr<1+@%HhLkKR7^x#``fZ;F-Oa{BH>m%p0)*Km3Br$0LO*yyH2xSt#U z^5~aANb}<JP97~DpB#V1#3v?RGcjx8;_?3+pB_JK;*P|u=O+hxQV`>ZVy7pjpBVf3 z!?BIWUo!E@Sr^Z~V9xm5rE?b~yL{d3pUnDy6T6ImW9)+I7f*dRvEicdJy~OA^sCX* zppb8m?=bP@i9^ECJag86PyEC9y0MQ<e?FOleS(hHjNLZ6a{QkrPMh_)Fc3>-eQM(B z@ykZ%j6FDYZ+L=*VF8vU`oD7O;o!=z#ycDsp6z>6U!VT{*iEDT!*RW6^xbeu$HgOm zC{fniM-L2f?M{j5PY8SS)A2jQ@c#YyG2{1zS$}6@x>qEsJ0|$*#X0uXd40<0^wFnt zr7OmFoY-&T$K%J2|0Z$8KjpKF!}(m2Sn!O|GZPhlVf33|tewW+J-#-5bJ)aa;-AL% zO-s*B#QmLEt6PTnb(2I9TTX8t*6YJlPn+647<<Xon}Y>6pFU=K?)2-XzBBoR$=7Yz zVZ-(tUbkU>B<I^xrv$;DG4{K$Ge%z@U7cw8eyC__m&oP*dHPc(KQVd#<YB?-&kA~e z#?(IqTfaILH18O@GPZHnXmR47za5<&PUx*;%QHS7p4wyTfypNX8=MwQ^U6fnFB`iy zaln>SyG@?GVb%ISB@6WY4PV}{b20*7oxE)FCyC+D4nur$JlWsGgWa7zzHDmO;I~l_ z?^OKJUAgNWLF!lKsxM3oy)wuCcQE&niAawMYJMch>#uX?d5JTg93Oei^kYFKzmI-= zbi-L2&e`zA4aZDgKl$fr_c4*xPb6B|A=u)biM_rbWb>Y>?WV4t{IBp_n@*jSIOCO5 zyG{K=n4vFjcwe$|S8iCnVJaH8|KwBR|38%L92AW3(y4_(1@E5x^yK$5`R#&8#zoUd zC))kq*vrSR3D$Ve)Wp>9CRa=z5wCe@P~OU*AG=1)4sJUyaqSh+r>&Bu`&_c!qw%{U z7fVK$2k#!8i14rh=f5j>_@s>g_T$eV|I+w%<Lk$_nYd^ClDykxeBJ2o{7fY({e5`B zBSu#R6)g?Adtx|~7e@}CF!skh<$39gU8fHXWAVpuo)-sK&mJ8X#Qyfk(f6Xi|CEvY z?bu(W>h8uMjn4#0d@0EF@L;nmg2JvD`$^9EL|BL26AgYVlJ)6)yD+%@_OXSdqZ7^k zI%sTV(9SlolHZ=XF&UZX1xa3+s_%0W34LwsN8ur_8M}3C+tCGK=MPR?ur%3{FQpCN z2m)UfJ-#~e$5<*A56nnBEv-KyuTC27|5zA-^<k5K6{#G>I(>1pesoA;i+#g}y(%2h zUSn^`Xx|vV>W--`g27)KH1nn)u3O^CK9j!PCY;3fqqP~2PX<fACV2XFd6H8To2|_; zD<fG4rk_q9J0t&Z8s_xIV6Hi7!OIhqy(?P$)<g*llR5fqkkxkKZhjg3Gd1<hAf#ns zU6v=NczpVR9R2<r{lfInO}Y1927w(H**hvx!3%=!Zk;|b-~W1Sb^3ixdh@-h(fm=6 z*yZ8r_fG7)UvT5Er=A)V_RaL!8Dk$DVxSdi{ZGP)UX+a2^CK-|(dwTCKmIKK>B=C- zi_+u!Oy3y~@rz)*&4c;g81!~YKEE_Lb5-!=l^KO?roS-t#Hp#t|DF8E<X=yonV9+b z$rn$4bn=?XouU~R=f10hd>@V`-IuHUG1lSzQ^&<pY&vy(^me1^7X=UgOCp=O)1S*H zn?;)U4H~{MKW~ivJ8$ZPx&KB%h?k~6%;$J8y?SlX{)>VYf0sDm4T%UY3+wva@Ce6; z7rr?R%$FjY`y>wgPNJZXB{sM+XWW-w-zQlA|0Qzy*YG)SON6^?7-TbRr>FPJh`l!b z_Nt7={K(q%@m<RjRUe%*-jI>{yRbrE4lg=2w$td?@MZ^O#Fr)d`CKG#Z1mKyNgvG5 z`J<PNUK$4S^`rO3_WoIp+%DYs?xRC;#EZku{PpPBVQ8KjnSOST`g|<l?D12Aj^2~s z=Y-{%GyXt0+lNM5NBRy3yE8vb>aOE^<oC$%iLXwEhqwB#@qZcrNUZ#8gQ`vp+j?s< zKJOg;&FBqj!KI0ySC94y_juO$x#45qJ^tV0KO6t~_>ac_cl>kXA07XX@sE#xV*FFN z<6kDiK5=~S@x#VX%Dw+OxuTEc%9o6PA^z*Xa>QH5&&;>?MSI^DJ-8sA;Umc_txQ(n zu<*$96Pu3`Yu_^ZNv!ybM!UwR|1|vO#}fzsb+q!7unX31H>1If3-#%0?spHXtG;$s zEYxqq;JhPI-?54M4v3D;o8D-8A}q|@X<YubiIo13_+q=TG^ZpUIV9Tg(A3S*j;r%~ z@6_Fi{%(sjU6Ikp=sX;&AWGgZcIeo!x97(GUXU30qR8`#+-)ND!d4sDG*bTcSfH2Y zsCm=VVO<}X8pVh0I(_i;(wu)<<b40>T@sCNln7^!T<!EkFrSV-EX#8&i2XQo;L*hN z`z1TMf23-M_>LPQW&fG@==|xYqz&8UXI}L48Hv#TGtv3&k-yf9k~TH!Rw`YV9(Z@W z&cBA^{c&v6s;ob8bhP{fVNq8EPwX33`{1zL_l8e<eHevJ5>MY58~gicyq!+Bi5+`W zWd8f%F7M6H+E}A`k<F(h*LXncGRDKV-I2Kc2k{r5&FK6?<o-Pwp*N+@^!&*Co8y@- zj@_6J+kaO4>Kntrd^ee&<)iy!?|(M>@37bZ8m{yoM;FB|{$qUa%Yx$f46}Jxu6sj% zZVcOdRWxButmpyx?!`IcC1GmLP44EbXuvDO*<6t8zI*hZ;JNokJ6@XB?KYY{x;4zq zPr}k(5xaZa*qvh=#^!{5UYO^7YJLvL>lNW<-VjSU3Y+zVAqstKM)bXjML(4>T{XRD z;`Y}EUw$RF_eXik|A{^R`{28CV&P7XEq+_9>qqmfZ_FnPQ}262xRH0pf*%yVaNCT} zQHeR<7vH}udBPpy3(t<#I4c>4S0!)s*<A6~v}mWa<lu0sJBKS?6He&HwE3!7nBS(= zSA`W=KepLuLG=8X==2uxj$aAKc697YXAqiqa!5G0x5avVCC_?8uJBMYHaCTvzBO05 zdF+<4YjdSPhL?8D-)1bXiub%cPyVTl)p_w8yQZ$;;jkz_i5z_)Y|g($qW?Y8cvURd zPVwL8WE4LZ{^fnS%bU{nbAt_!j#O?Rtn$a`*mnk7{)_y*JiT^HBylW^pOsT~jUJlg zwKCfAhuAxO_nV^^FNk-2UYMy1bFa_lu3sM__74q``p-d5??^9Rn3i0avG{a6ImY4F zk>Ahfo99Gh)<t)}n@Ih`vHo8Rf4pjH`>>fOX6!x?M(~3<^8>lhInlOLqFoE~vv+<D zj`kiFKK7XDlY-0+$<J=_J_qDyaXvjD-yf5aTasfI4IInC`Q-4RFh208a2DqdT*wE~ z=1&HZyfYr<8S#;a<&2}kEIcPaZ%Ere5SIHt(&~SSKf%J`nO`2ic45xBBu{c(c3iwA zx@9HX_4!q|ZcfU)^w@!6w$IM^zHF${J||Y-v~a15(wnVLzdy%6n)A)vS((1SHrM-B zbo=cC2lA{~mUEK*_)vV;)j4L9_?e}#CC?2$d_hL;_3`oN<<$!_qBy40B8z8-lX^+M zfh*3>xSl%X4a^`lYIlUWxg~n=NGc7?tvw^S<K5BpE5g(LDL*$v&VCxpadABS$0AK{ z$sJystG_&2bzbiAqWr!*GXJ97^+iEvugbS?NK4+4tj-&wTc_uKM+6rf5zBLEewIe7 zPRp~uJ$T{ogE!tC9PzHS>?LXG)ARk7VUbrw7OsrceLc_p(e(8PBP0J9uIGwq@DIZI z-INyJn7q;t)7$?N?R#ZL?wBy=+r`?>iuGTexNCO)-#NB-v%Fdp2JQYJuPc*L{aSv$ z9L#WGJpP9wU*DSg-!N-;O+7R<XL_&5%07{V<CDL5TBK_4SnxTi9(XjKVtG8q&-3%k zT;r!<<}c6h6?ymDeD<gKkPW%#wz=azu?zA5Tjkzb@r3Yso5nNjFkssQbIpSyb5D*` z9hC^+S;@p56I=iE$k^i8`i;~6)j>Hc!`|PVpLOw2YlD0q$lnAk@ie>Snx2i1+cszH z8yP<^a{27&+M6SX7e+!~o}cH$MxC1HaF-|LnGViz`{(u1xzCgG`k-h4y*NCdoD$~X zuYwi-Eq3hd`T1V>-CN=v%q(~$KF^E>Gdj%?wWg98FpJ`wt(b(*Ul<1S@Qm!zjN!9m zsm_Tso*h}ZAky-|*q~3xrd}Gp_tG$---=iIpID|Z<=r>Kg?=+Rv(Luzd@etq41WJa zUgL<b3z~i?K4p{9R>3|C;)nK#C)+X>^s(^no5hauRd>Y}-Wq$lBELV+&rfpo{|HO} z_DIwlB7fxY9g)a)<hp+sOa5<RYu)X=d3SzVdvap3L*juC50iaHWbn1|Y;Via?@G(x z5-ELQJoWMUc5#rnC*Ld2i<Lhi=RPyKdvboOVK2!4XXf{me77_neZOHQ)Lz52PfL{W z<Q#cwjz1-LdP?qfW~}m)g0N}*^^xTtMY6vUP5)Rd=;tE$mqqV?6-)Am*yx+`>erF@ zWy!0M{TqgS&Gk9rhdJ(x(Sm=^c^}Hp-^T)dBvSC^M5ce0Sl}<h3cWTq^JPK%=SCh* zjy#a;Cr1XJ7P&hq5^{2+@c8^aDesrYz8o{y!oz}W_6`O)B%eMl-<^;+^#yr#ZvH<b z_~ga0@h{8ob93caB$jdikEbo4&+qpWL4GSy!X?A||4i$?5UIL6Uf|oqbN(vGe_8CK zxh~zi-CSC0Hkc!A_u)J9vpi3FZ@kI_v7Tn+ntf&G74zuU=JUHFq1VJ?T#??nK8(Q4 zkyo=}R^^)33EDM%Z{>gm8L@>K4fOy|NF~oBIp)^X_1qH+YZmbiId13J-~Hq9o|92J zBeMJ4*iM%6DUpr^u}M}tFtc`c{HS?RX3g!C*!PG?!P$v>&W`PSM!f#1LrnYhA;10P zoV_%*?%9!|=f^_6BDV20iR)gFtDhZ7czUGd@JP!sIp@sb{n^8HUXi2Tnh4`fk>Gbk z2LCqaIPVqtd0EbVa@u)lZ1sZtSk23Gbqy5lT$J3&GjhMvBh9iAug?Fcrj<vg@Agdl ztx$h$Wa_8!>EDf&rRg{1cXh_X9KOYQszpKA)=V?2$SU6Y-~Q27*fI02YbTgRXpVCC zX*HY7j4m^%%pa4fvg(Re<yYm}=9!vxWtNw}W2uIDAkp9b!6nujx-a;8MdbVXjE(jz z&+FxRMG{u#|7H2+nn?du(TSVm8-AOX^AW!YrnzCzl^b)!_3@a?a-Cap)YW-+W1jPS zk-d*6`|z1$c-|ZQ@qu{o3*%4!E}r9kgU|j<Y~MxEoR7xSyfcXZuVO#{GF}CWc~NY$ zT*k4{n3H3rPl{!IR(_tJBVL|}@`Bjg^OJ-7+i2Wda_(Q|-D`4|pL1iA|2(?*&it^h z7e`ya8HxQxTJ^K&`}d;pY9szVcmGH<NKWGud3|xv#aHq_{rPmX=8{;1FQ)yUjeY)X zKL4+r;rE}TZI|ZgOLGK-_OtZKkMsBPT>0|!$z{`D%d>wbzZb`%Tof(5Bv+=P{}uiG z&wT%#Xyk7a3H&-JU`6^F9=Lnx?>nO(%hQ9m<mdMpixoNIzI^vUB*L6kvr(;!)?Jad zkA_)yZGOJ7j-6S=WW~HmYkce(DL*pWaC&}EiVQD}Og=xde_B2{EkDnV20SBZ;kl97 zbD}YS7EO3v<o|8agO9{}ToRl8+5G?E{JcLX^~15{?+n7YFqZx;`TNe`i1);%zdM%u zt%-d8F4}WpzIk2Vzdf(tHbg0Jj0T<;efYE7`@G!o&xZTZ-an6yJ};ViYTELQwDpMS z*q*Tn_GGe>hcyMPRBGkAEe73C3t`o~BXgAOw>43=NN(1up=Mf|BW>SpD@9rN!^~W> ziLG&9MUm~JBUas67Y%qYy?T54+g!snd2incGq}xOwr+^oyk;r--^|gq(WsRf5%JqC z@enJb5w{QH<68Gcs~*VT2cru&M>nnyr}2wu%8w%<@Y7|H5K?kwbZJ@iME-YKetsM6 z`dvQzZEWfHA`w4~TwNXs{c2?KtC6HjBR7{0QuXUt+-q{&ukv$k^z3`F>XoR^=l@Sf zS})4q@YQ+sg~-`g^Yg=;`Tbn^7isS=a)uUtZ}{}mwCG#8$JcX@ucc)_P8)8{5B#wz zQI!?8pbxW5&9QuV@D0oIytn6=d-J)qrL4xsF6|pMeNaYbNo?yOv1H96TS;cG{BAYa z$N90LN5=XdAMd_2@^)qr@#&Gv=j8`FJvKkbg{eI%SF!ftf{gJoIrE@+?89@;Ns-)R zV^fdI?<oTwV9ojXC+0d&$&YHDvm#yRMxtL8x%%_`oSFK8=S9}eiL8<OXT{SzH)w#| zpBw)`8ebI)U#<v>eqG+bV!-ro4l+3}p5WE_<osOgHSss6<@edS#_4JOnL+I@$@^!; zgPoHjUzy+Ya=mBfo1@bz&wD~7_VBzqHm{G%@6q}8thD;*Jj2n$`vdc==6751(Mrc= zK3n^ub5_l!Hp|`GKUOp_>)f1w{XZVI>%NQ`54<dLbYuR%D-zAyS`Ye>$gVYLR!6$c zt~K*l6nRhn-jUBlOZVichce>!_b}RaVm9~K8cA#Osg-db%CT#5Co^iT{M@w!x&n+< zcdY4WwMV{Yb@UICcqCHthqP^F?st1WyCqk=J#Df_jY<o%z|Ew`ELp{eo?AJ=j%75` z3QcC*T9a-=WY9iaRsk@Vx8ItpeP@ofOV0gi8J}leJuAamC5L~r#>04ic|`ND=Y+k| za}VU(HTi38@4NEdeYwKA^vQk0&&uJ>tJD7F(ei8aBr6B2d~>AVlVQLfOix*jqN}G^ z%>atBmhQdzj)lPF-;gs_<hm^UEkg@fD7y<yrwZ5pUsgUbre-x;yQOQjSyRB83f85y zQlr0CrK&}=0*^H};3GRt?GY`r%H&Sbzyl&p>WL1IhAfTN96Q*4mG~#-v!&6c<MUhT zJ7$pLrIA9_cu&u#r{>$k@^eV8aZv2>u6eaju6RhK_>g?QAjce?|6Tdi$o;7~i%y-G zAM0YBoI4*AO*}k*PlzTT5X^L7ULQLge`@sb8Tozga9_y%l$?9oU<c035vSxxZ9FdL zK<-Z;@ZDL_($k}>FBr7=nYsG0xzoM_cSkF_Hl`I0_RaHa=b<^5zdL!*(G$}W&wXfc zzZI<Pn_XO~zjla)(N_nit^4G)sA})w>Idd%>k3(Efv>Upt+fyK&F72LH;1GZOJbwc z=|P5e4z$9G^;md}?)w9^LS9z)?0#_8Y<e(qVs80kgDl+<8N4g<@rQW)yCOTw2Rpnx za<nRPb9ZEt9NrS^e_d?<Z-Tvk6>I(DWVfz}75{wD#5ZHfzmfkh`@d-Y>R5W7hmZI{ z5a;(}=l>)A;q&?ZN-FmLJ)Yt-`Tvsqemmadi{XO45kK?I0lQoh<nrl!$CG?1XMQKY zU(dBwsQfTK?AP&b*F`I!!)s%8u8KGMU4DO=cKs|z{VYE}NJY!fhEIN<qyCWZZ_AT- zx)p=AcBM<ZTVfu}w}(^LMUSlCVigl>`&iG{PSRG?<wvX))OBGOMiyafvTxiLXFT|p zrwlTAVkGIvjJ`Q2&x|ZAjXa$e`8p|bdgj2Nhz4GoS1`zn^81R&*YooJ?7^ZxCs^g| z9C>EsQ&jST{G2tsdR9Eai{lCYBHy2%-}7>|2tge!|MJvG-Eq0k6Qd=EM+3yT$K~$N zO>0EEC+8?JEZ=uVB>ZV<;R*Tl_?&S<&O0K<y2c545}x9W{GOV29G|NkH%R^wdD;Ub zccSBi(+hh>B6rV^m`kLrCwzWr-p$WnJ!W+fYwX%br)%t5A%q38E}WH3tmeV$G)joU z9jxL5kyF<Hp24Et6$@r{3;gwcvC3;QqSkv^nPV}LtlSOpLn|U3zt4!@nlZmQc<2xL zy(!-=&-?2m<Jd3p#<e-_hJ1Hxey`3MR}XR|inuAVeq+wKF6X!k%(Xn%`9q}Y=aDNY z>VF0lePyJZjFZhDL^FOdy!&}x{dkbrU*^@7d39ybzwa)~|33%{x;lFFi(Eww=JNcC zgxul!NHt`)A}zZv?Yc4l-=3COAKv<*`loAJio>kzV!bsh@mPsa>}6dbE6Gl04LPeD zcLhN#hLyI(c-Fd>T_NMVpLMbA>B6GJ0$3jL^Zpr|B^g1O%I{&h#@?||R&BBBG!AJ0 z{4U6t!dxOq)^<r`|EW1c#l61^bKZ`Lx9y>Fcy!{>ygqU`=IN2pLnBwmN9vA@jfAoA zC`S%=JuXK-IkL1gN1PN{tz4FWVf9ZRWL>;{d?f$rg9P&ei_-=u?!+8%LS+4!c~2{j z%vGM8S3J()dB1Od_DP>uIg#!5UWC0{e(g=OFy9`Mzq_aPxCQnbAEEDLqO8GcT_LNV z!1h+4g4X$B`vqF#6IL)j_JlKnRsoq88x2W_n5-c)%DMIAu4&Z|aRC0!x|~)G;jvxC zIyUZT^&o5Xh|1RoWpqWZu3+V8$XKM-Rn)o;q%~#d#RpjJX<hUNT7XIJ&960UXD3%e zzpU|QRakAco|09R=7s@T8Le9$>AWp}Z;gihE>e3-{@xg=U7jCE>z2svisAiT(Xy+f zDZj}P*G10B^^b;gt{grQ<3oZE=lEOmzw=keKHr$v@XnpN3d;>wuE^*2<nPL%y?6y^ zsu<KdD)xY)A6+xW3bl4;u%=6Q($I5qhnr?(ttD;^GMLfoa8?|{VOUX4FI$O>er+4M z?K<byUZN@1RI~EWyy0vs1MQa2>_${C!Nx5Z<e+Ql?~yB8VG@T0BUr=GIz>37`MH~Q zFZUZHZlAoWKk>@ms8+1Ao05I5t$_%glhws(m8{_bk;^6dY|mV8mt18*#@fnBBJ!Pv z?{*uo5B$%v^F#aR^S$zSaoWwN?U`%aGidKYGodWeQs$}WM=Y>#xZ2)nuUH-rW~C!5 zc|s&s$=@?)+TF<dhiby18<|^AO-ESsuKYuia6tCsV6W`aWz{C@!doj0uIxHF);@l0 zz^>3YEQ_<V3fbz6zdC5~ft8USj$dH$?}|i<eOJYXVx6pQZ1peqv2GlzXjLfIQgmSr zB1jwu2?g*lWCnjF2I$H>cr0sa<0T(RJ46olY+RjJA`v)R)Q{t$Pu(+fJZD>{h}Qop z=ROcwUK?4yEoX`i?C7&PuW<#B=e_;-?#ui8bL{<j3eRzCo`GJ#D)yDUFUROb?3xuL zwQNnEqC4}f&NX~zeP(Q%RhX^QZY3;?{mzk=UGmHO?wsHK@{1+y8eDt>%eNro3C(yV zcHTcyVO_4h^6egxBp#mCw|f99zA&hBNq+W;on9Pkdhp;a4vds7%C9wP56{m&`G3*y z$uY6OR<AucM;|s|6PW+FoGl_fe2~zC^2w8O_d|33k@-DtK-y2q|4#~X5+C4^;C|<x zlvhv8tEc7lQN!=i`Rv)T_9w<Oz%$VO$peDIvz`<W!B6lhOY?hh?sHIDb?~4WeA3bR zZt4Hs{ouT7HTuFl*@1bEo$@qxh&U*HLUZZR;-QBy4?f*__})AR(r?$PT_XS16tfBx zPq02wly%FjZ`ECl$fofm*E|PVvKo}w*?OTQ-9M}MiSI<jVn%VAXc#N9Dt46Bykn4K zaq>gMQDnl50{6hQlOIv-hDh4|kv`G_O<9?0X5CYgqy-o#D+g{!OGs2(#5dfNqu~%5 z&>c{%%xKLymcbgl-51*4Qugj(G2GpHiB_kx%3I?|>%ze&*fy)xS?ShFm)#Z9x}PkL zy*;c)*OlS+&XJHLi);-|>lCsb7z%4Ex;LK9il$l#7uf^AKAQGg#W0ArVMVB4U$G_f zuB^xUe9j9&W4scE4HGSbzCEAaH+;`$txi9%0JFjwSW(qzunooy8?ZX}u?zaW`KcFW zeXK2}FY)AXg4O%*s#vV{k!(fRuhk<w$gYtzPj7Dvk%<269zb@1v+kU=P<PJN^>zDH zOtNQsZogbx55Xo@Pwl>%*38s%?qhx8uElHBalB9W9l}{y6L(FX`@TE_i`4bzR;91- z!Ez#9OB176?17K7N}=^ONrioz`C9A@>$>ZpF`K1jb|7JcU{3t1)${nrK9d=o?3B1- zr#y+3fEVTYcaH55PgpawQG<P@x?bEw?q+U+9ey#dq?(*s2a*MbYj93Q6U!4jbX@Pv zcPlbdcjb3g@W%3>?qwNyudWROfokMMA(5;ulb&F~>uZd&QNBIL^HVnuuOXyca^}^8 z4AGhU^LgW#WqDP8=bp3*d-kW??~g;f9>_PW{@uA2Hq2fPB2#Pp-I_Muo!{GXtvhqn z^89@`@AwSduO~1fld%@+($?i@Toa2?IbW5dF>gF1Bt;KA$-_Cvul*x<BwX1&d0M^* z7yDq&yFTAJTdn|~c6+{U)QpY7&sx8b#NV4%-<dO44AO#0BQMqvwci78{%Ed4vaEK@ z29dN!qDkbf``mRUPWS=0$0qoM|0Y9aCvoU_!pHNxGKgIb6^gSeG5KL1#`8IrgP#=< zmD#hWu>OUcMg2Izu7a%>?5u&+<5&4p{2yMBov^Z^6$5GULpcVQrq|b}6%XVG1|etq z*h=|W(7SRBKC|mMifH+FqqZjh>#^H2n)l{C`$E20oE159O-3CG>gs~(Kd;Z{Hzgu8 z-X!^k9D$p04R;U)vsLSI4|s)@e=s8|ek7@+h%Pwp?#Lehao6zuZMh#Ux2MOWxwd(` zB2qH?ryP&BT@^VcRnCW-jJSLGRy@$y6=U?f{9H4j{=4((t+~(bIbPf75w=*=aO)8L zio<UY)?bm<lI^?mPT#H`WOr>^B^uH0#vOeYtPN?=2Hs0#Y$e#P+|N37Phy@|9&>fB zaBH4*W#oV))Yr1Sl{PEBim7&rC${s!9q9$TyNL(*F5X!_nzey#t!vBH!LvM%PweN= z6{M|KUDl3w+dlYdek>P+jn#z2c8WC<7sJ+UdgEzx->kR4d%WVp0XyxGbN0)RDjlo; z%k&-})FM_rIPZ@QViKe7oxi?Yk}JU{av_WIdXHco_p$G)zYv~?e7_vK|8U&VX_FX# zVcv-=MEwhL?vmgh@x6F>zu4d<!9>vB;#}#Vd~RRY-SdrV@V#><%;SFXKYI>OgNsx* zvS-c~^UTjHEBAX=I25nR1MxpRJ$@3iW~W@Mk>e@$&RzHjyCcl3&?=86R>n=st%-}R z<I3*O$!8+8uFp>U)lGJX9r+~jo3*%&nAk*4Z>M}BKHe(N=}KJ}oFr%=f3$0U`#*%j zBWbk=h!1m|2#+W0O2Yf()9rFKd)MxjqZXuBR3+?_tB8*9ynMO+4|qEj5O$C>=B%5Q zkGD*3@!$1=c73w`Io7x<q2ukXFDvdRzglknT^@4B^a%`sweQ;7uE!6PPS4~HFvX_B z=vaAIbgQ>vdtMhmB;ph0VXWun6>PEB(E1&7gy-2a&xW7hd3YxR+%w1Fi1r^o5kKHk zNHPpvensA8*SubsYtxcl@<0689g0Ppuz(hdKDw)$z1BRvClIq+H`z+dK5Naw=DCg? z6EGfKqu46w?19~XumM)g@7k<vxOHM%PYfmMbz^C5?8d3xHQL(CB$Cg8P9Uu!G-wNR zFe~RlJ>3P+`E~|?WbJ&WFZUW+?76(R3VPSRb_ZD)BO`(&k>r{;kz?!L49y?m@*8`? zoFYuwV|I~M#TJ<#42AKEGgwqM*eW)%Mf^8h!mH!;VY=35l>c@;xwAWBeQz8Pi8ypk z&QW~?m)M6&=E}OXa&~+nj_RSovOW;|EMw=KyYji{gMX)i;&&_PdP?;l@?<<R{)q+W zFN<^5rv=`NbokE)(@JX^TVY%j%+u>1J1b1*$eHzVS!}PzbFVwoB6$ryL1f=(yS_~< zuSdmX?I(4t(3U6R+2MD44!H-6K4U4cL-0F%y!~K7SOM`8zR1Y3apY0tXWtH-jXDBW zUo_1Nkb?R7mMz>epF94593y&UcNYzo9dF*<2)D~OJLGt~pxB$i4}U?n<_-FYFPfKg z56N{{czVgx%+LSk825*zVkt#M^oIn}Ji9lt6x}<M?;4BbT3H`|s0}a|o)O+wDby#W z2iDD2ha{fmPrKU%?4?g=8=q*;3Oz>`-51kucUX~zeIxi&7!D4^$iZ~3U{5fplHD#V zX}pXkTvG|M9<+S0kyAS%W2?SPwZOVa&dPiy*25LrnXJ5FcWcuZ*7DBMT+uvry6)03 z7fWuQGmJNRC0%-morRBJYB3|3+bEw{#aTp6cI;Uy!wl!TCWe)aKa`^%%Tb~~jLv=e zjK*1CTHkp#alJL^JrVB6{;#ygsAw5`VI^@fJk4Tr^eq%>P3~>d-g-B7vf}`G+rOjh z-;0G=LKR`nm-`F7ii5@bxG`<T3RuBgEK#0I3m~k!^NFL^=7%jA57z3+)b{Rz%W+b2 zH84G9?4dkuE5c;V;VRLCythaMztElG^jEXu-QkHGv3A%$+Wk;kI5wshKm~%G;;`eG zjUqKWAIWywa|>$VC&;Y57x5G150bFAC$5w?mBY4%zX%$mZuM{)0@2}zcgPjHvjfi~ z{t&s4Tr$O{lH2aTB8C{{J>N7tceU!eC|`t)jV4zz>97hNU|q!j+J$Yz33Z=wqeu?y zw}FYVhXfC4OzgpIZx=qxs{f*GzD}!Q5o_P`)SiD{Y|M-og3x3!<%x0Du!3Biygf#x zd#GZvo-n-U$yoqAG@e+-ZvR{xLbaQy$er!kYUoY7lfpe+HJ`83dyociXcrnkaJ1bv zc)GbcMz)o7t2|hn-edWBF}vB$P2@)U`PPln=d^Tf#@%z;<)r(F=tuI)<KO}4pOxh& zll{{7#!iicinSesIpCgRhTYOGXw;4;n+%_+g7Lij<Twa=|D2^lbV;o1Zux(4o_gVM z7KDUrhf;URlVh-Os7Hm}#Hb&XZ*l2e%c2Yi9E@=xhx%bEGe?X*-d>yROirqdqU?}Y zq!4z)sH@CmJMk)V683G~Irk798wacx?8kEBNQ@B=B#X6Io<M}LAU?)UuiCYDUhO?x zd51g)#t7=_x-N@z)`9s}RYLa|Q;nduLw{h3?aehm@3t6X0vK1$Onzc<?qQz?jI&>B z711}IuoBDr!G@w92$x4)kYBM5{<L}r#nMN$x~hoy2AXQj@PT%KnKit#qlAb7Q@DNl z0AA*gcNt`@PfgqHDb>2Z?#4lO9cu@eGL!mn(_Cqv^z&x<e24VFOlE`cotLZgf%HL4 zz=v)f`E7*I9qM>QSB1Kbv{6(sD@wF)7@ue#O6_M;9fPAC<vM(#opbEn;kZ$(9e;>T zg;>QeunC*od|*x*Ua^y~qiCSJN9sR6-95t&6<)hv_cI}bY@GXGQ`_q>w*4;bY%Ah$ z)_9&-j9@2hI2-%gDo<#(J9NmAHeT8*N839ELk{0;l~>(48QQ1y>R&`s`p$kPFp8R& z-SXNoWZoVt`d2jTcomr2<v21A{d5lxqiRnS`}P&Dh~&r>joL0pve(cFonn(j8}_r9 z8I$g<jWgC0P@etddS5Y`S|^c)SVMea&s`%=V&+HwNeLV0y7*Vt)Q=1v%LQBUMfwcS z>L?MUJ%`0VA~h1_iA8LrW+LszlS5hJnc7mj>FOE1OjlSE2#b!f>D>z$+bYwkm3ph3 z@BDmfXCS#txVbx(lQKIo*=fkmV6JDiHdb%5G3%|mSN)S1i6*jH<2k~p@KvO#vRL1W zMNvDh*LY9YCfW2Ceq#6WDaJ#7iZ|1LVl&@&#}pn-Zk<Qf3#5o1u$ShY;b7zzNF<y= zk6F=e@}A8ky^icIigvxTdz?OFG03$3f@<L@k%9<OJPpl3qgzCmaF)&HL5953gV8~# zaCY=kw9y?r-5>KPd)UauF70ModB>aKHt`bVOT4gUj-z+*0RN|6gKvk1p)E*K9ICHr zX7kT>9b@@ugVyRflEX5ZZRXmT0R5nEw#m`k<U4m4l{Ul87FF+^p^6fMf;Hs{>aRT^ zltKE*@7%P|tN_{pgJI9$WwBH(GyJLTb~S9wYUD7wxK#)jW|HUPr^nL!qg-1Y(i)2H zRo&`JNY=d?5zkA1kQ!DI)58vveSJa4=z@9(<EqUfZ+^mf^CtR>Cdi~?h3!-fS8Ek) z4Szz^<~)&wEptB@bxp>)a~-r?#Hg*%`kb^LQpf+op(0uJoA&Z!*<lzF3f58nLF|hI z?mofzN@%~k9^;MG!eWIno}z45^cjxWifMn!r!chmMGW8yGgrAi_Yr-pPTbzzq2W>c zT9J8Jcr4GYt;U^vL8I7UIRfp+r;#{waO^!J&kl=q?`UkR=VLWi{vSVJZjL7swTKn$ z+~w%|!WMX5Ifb&(xCi%Ind8J^%}ik5#ZZ`boPmfzj!{P6Eam%iq-+Bwd3~-5af|E3 z9iD+6;vbr|&<;{21M%=6qx#8s>PdOJwo;5Q<0+47ucR5oXuoAr%R1BiM{|G7x%h-E zPo#d?r=&!luz9czL%Zd4NV^D8Z{YI$lSg<g9$xlTY@-eM3u7qnkGW8#tKJvyF6$u5 zA$hb>zLG~5H;FRj6MWvdXl?F_{ni!?{%tu*lq!-lF8m#vCjaX*(JaXoE0JEdh0PG- zna9&e0;U%8cK>8N2Rp$klaj4+7VT6EEyl;1_+0%GJWuBQ@10ue@#r2;)*XtqsP@rS zaRM;Aw&4jL&J`heak6Ze9hJJ*oXAd`Yduf#o|uW95z#enmmBA2nqSrqF*#lpzbU3- z6Phb5&#VP1gm}rVb1h5{e##Tze#8?-lZ@(3k?uozg<Y^3A#E_4qK)o{%0BX6qBm!; zT<{#rCQE>)W<gY&LjZi$X89FS$vde2VyQ(3?aTIi?VVi>&Aw@tL7j}<G1>FS;$?Yf zp1?JmRptAjkJ@tkcw&E4<;ZTZ#ASlnOCFI|g)wS5A!!zqjfGht2~iP-*5@!ZPhKP@ z?%6k06s=?0Igt_+j_sCX5C@1Bb`KM^WQd+b2m9q4E%og#`CgTv3X;7OI~|#CTGOls zd{I6zA6-?3+7dYtHHfWDT$Fn+$kFgUmROW}&~RnZjl9e5!=3PDqB(eT-^4K8%T8sV z*a)JR$!G<jnS-kQR6t_q)V7LW#5Y>HC|5o>ciA^toJBcOhDD}DHCFRBo=oKI`Nf7J z4zZTldC&ABjHOx<Cpc3vyI)!%n;@=IFC)4Xo#XXnUR2pE$sPB}y${UYm*iaWsQ6N= z)M3g1`NcMh`5|)=mS=#p^um_;o-T<EMXQjjOoDg}Q(1llf-}zi2g%?uoCQ~q71&*! zBb*JZi$k|g4;1P1CSotK9MtWudV$~e&ht0omFK}$sCJu)6KD&b9sem})G{1}wy2t9 zk?hDPB6d9}PV}x{x6Bcck~{B~V|jgy7*5KpG)#c@Lpb!s5zqtXLpBAEBKERpuD^Y1 zcfhL9<z^pT6&_Qw0HM(Q7>3w`M+X~%PZ;GhdpNen6CT6)uvl8re1m(#_&7Cj0LFiI z+95`R^YsmFWijxikh@s((R_mEfL}cse5@7)aw%WXmcv#>o;(!a$9D4~qQoLvnQqum z^$RW!{<v+hdJpF=xHeoQyeG>I*G%V#$MUTFQnSo=4|U3SW)HgOL<+7;E&oNSd@$0p z!WDiq75jJPOckdx7%(*pddFZxaf31jyfyRzhxk@z;o<ZLK4cXCz~}O$YC8Bttgbai z)5PJEmB}~XF`VZaagBe<HDpE9(7_IvSlRX4a(|iaJ94fSfmAq5<r6%qr`Mu~^2+_; z47CtY9p?G&{9ctS@<ot=%(o|kU)%*p*?b1JdBboe&jjP}?Di3qV;BpfxI6Fo8hH$; zWL+W#5jJM5*$7!2GNt7_A5L~USAxx(A<{#3Ufnn-n`bPFp%?N{;yUsMAIZGvQ*#XY zQ`rw_z?I2wXAYS~M2<;X?L0P#H!a8MIIKT!4$DL3Vt2c2l3<#xDz<FM=CMC=b1a8k z8|GlUJTHVG*M|#ejD{`3M!3=zv0!3X-jJVRyLeD+BY!Be@y#}|WqQp0@sRAS_-%{a z-*xb1=4*Ec^__D+vHX^?mh2Wbkf#!*vMhVVs^YI)qt=19X5-{^aF$q3SL+;{o$?6= zwi%0AIj<NB=P0_Qv(?N+sbbtS*DR~NAg}ZUOG9tvby>zT4)wP<+eWIquU_NN=jFT^ zuk5+lJzj;?#jt1{`>5iX{cOdUcWOaN6?DS7_+itGicxO1)g8rAve<paPI>M!4qK-M z&eqrF)$=aeEj!Fp*(H{(wr8$3vDusEQ#onTK0L<4@-dYyv54A13_S_+9O4!72O0VX zUV^h!tE;jz7gQxBj0KU;AT_#({n|9L3H8BZY))R}Y%!WWN7)g$QXNq7C2olR(N=oQ z(v5<)%|Dmbkyj8IxcZFWfH92*&p{T+H@>!cn8xpHC#)@x#uv*Ud)8t<D;Z!Oc-o0r zVy$#OCeTa)wRBK8-vD(Np^>1?a`gDn@2z2R4<1*WNF$Hoe4lTXYpb}%#gNOMZ#3a^ z9F@vJy#p(dS&XrYZH$yLtpD6ReJT4*2C>cJYOUi9cZ)34S3e=IpfGxXEi*sRUdFBG zF!JUu*iV`5P^(cNOVf+dx62XQ%-7QlF+GMu=FQn`m@ETt*tkN!LeCJdan@5L$oSKO zW?nYSQ^~cGENq%9dm69gS5-EcdxUc<ejq{m1Ix$r_ZdjIybSNm+K?3a1)~pnzykOe zR!eReqakNVit*R<PM^4fx*?y?hiX4wx%?nhV3&6_lo&SOsFT;Xm`HcRo9YWZ*2eh` z`mrPYp7~_gv<Y*=ikQ<=<_iXuhcE&#{WdwPRUWh!j>XSI(OajV^}9Q>xv(K`?t7o$ z8hx^Jj*vC8A`H2mNSkFA#581yjg%!~MfKPYL)-O&SO{`#W(JbO9pf#{JMcuC=DMsK zjbKmNYt<P%q)|141INZjxgvCJb{Upi&V%&wl31FFoKZ9-axoUN%jSZZtu#L)As%Mi zW#(AsX0~=6{MXvp9e1N4b8>g%CC}CT+^pQ!oT4qp%D#ANEjT1s!%xDNs-M{3?uxAH zYlomIxMSxWw<s-I7VMyI${Gq-i)MG>N2rZPkith}72vOq3tihN*Wr(OZxJi}Nxx|l z?8I`>9raFP_f0agYX;kZ>B2|b$C|c`!c0JgR)dmbf)C9vR`I`m?y@2^A@^r*4PK-3 znD||lQ4b8*MfJ*z4L34S1#P2Y)neQi+~Zk%hZT7!?=V$Ud43gzTf~=C$Fvpx#~{ub z?m^>Qdudj6=VGx;vg!C{d1$gh`{)<l<*`_OJTfm!TPM;caT!Ly+zJu;uIXV`c=N~v z`Q0k*kOwaQV6Ds_5?^l{tc)RJF-aW@?(F7bWHwpO&NXUIL2WdPY?ZiObF?|86FG*4 zvKQ{pYRKw02h>ae`@wozSHhFmHexHy(8qdct+5vkv0qRZ?8hUSyP-0KuB&Mu<=Cf= znek>+)xC+TND7`>CW?%T_~l^aMa`@@F0ajmm1SgyHyboUo`DVL39t%Qiqb<WQ(!mN zl^s<<YYh;3(6|O>(1%6{dkf=1@*A=m-NLl<zIa`;yY2~^zB6(TV__6|8oG|RA=UG8 zH@H|2>2vnQtOj$>uz4~CI6XCHDp*#h2KD!m5<A?pReD~fhAg063ix)GgO1txOMFE} zi%=kMBdA_Og~m3C$>)sSm6>hVq@HS4TBAO4_Z$tkZ%B;B_R8^WlfK3@o6UAzqM%3P z^~pb5YNSM6Fg_c~>R`o1@~|-8Ok~ebZJguDrIG0QtamF6o6i<Qs|PiUWpTbcAXoQv zq-KwNVx|fo%#Q3BtA`E2hd^(%TJ4<KMf#@P1FODu&ZRB*BlrTV#m?j7X&cLdE5&(> z+^~>$<}bU8XO#_50ijkNsuFeGo7c{O&(`J~b-uW084T8KL;A`39{1*G_3-%TyEC>b z*i@vodd+-X47iGY>(ktk_o}9EPvx39;eSkJ^z}LG&Pc<(8Kvck53Mai!mJl`eZE(R zY!>kH%;^33@cNcqiA}gY6>nxIS_kLW{Faekl~<~+RdnB(BYdt#8*A+;JX_b8x+71E zlegxA6*5#?tJ60BSpCvH`M>L6=`Uwt)>Z3^ip8Lq;oH+@b@q4WQ*$s}tK6dseO2Eg zLzY@>{b2f21Zu{Ks&hx;(fzE8+_mD)oXIk&5NFxUErwoaNo6pmGCP&kffxCcdM-W$ zJIVUb8T6ZV6dRUBP6MJ({3<_0GezGp8y<z#+bD9^suo#nc^Gk(YTe0b3^tRD(F~Hy z+e6GU;5d@jvcL&^6dQ+;5>eoe_KN(fbz^BDTkO_?yxT5O9dsx@QR8AJoLYgs!=<$@ z8KyC}3$m4iR=>I^I?>99{i0Dj<(*X-)S{}1;MrYU^eD&e3Sy$2@+t0ck6iD7+;{PC z1om*Rw85-QbKwrk6|5g-&KQQXv*PRqa$r7nzpe%`f2g{^Hy)O6_8<OY{tk>?J}SRv z%^eU%)XYvR@Yz@En7lqNce2lxD;|{p56-+fpC6VdTa@<gKitPEIe1L#znIr;g~p@v z{gPq+oeFSPNWJ+%IZEw_I_%C3m1|Z<zHdI8KitPk9eQYSt`EKKkY3<J;Y!HVN;+m$ zW2aR0?wcc98Dma3o>fHQSXNOrxF|#&0voBKS8RbD-6O~Nf4Bb|c`?4aL<|Ae89pVi zkTP_Mk8oAz@Jjqdv+}LxB;(_`287AJc`wJ#-}uMBia9om6hbV#gV`jqv+7ry5rQvR zzE+UR>#zsS68Wt8GkS*uQqd|4hSic;a3+RG{zLx9(VdaTlXa~;Sq8Ic)<mbobD~+E zg?`X=9Gx0EdAN142wE$j%Q}d$MZC><$_S0}Wb_;#i8oZ2D8{zNlt{05SO!pZDjy|! zRpY6J&ETol)OXHf=gmliTE&jIBRItom@oCh5SUe+#)n**h+Czwcw5Fr{C)q>7wQV- z-`EcA(|?#v=uhpXT1GvL7lY2U!2BP~sk{g_R)vi5G{&ryys>viUM$vli*&(EohOfz zVC%#OVjrJ2nsf}SBBCpYqer!^XXs5e1U#44ks){*c2l|6j2Szqy;_6Ez)C~zvTz~^ z-<dz+PL2>kd6uczMp7%%<^LV$7*PxcnjM7k<nSRRC<31a>G(#>h4mL3ih{6CtqY;0 z(4WYXMsJqC?3mRB&Eobs)YsKL=#or{D9-vdvK(wL9PJ&eAU0GD1XbeE%B6`YF@ddy zYsN!9$Xs-@4a{aY+ql^pm1?po2jnc(%-*YuR^wu}x!h0ZshF#<XWp~R<`uJWX2s0U zU+p<GSF!G{`6)-{9C;EJlwD?tUD>@_i)Nif^IewYY`Gsf9;@nfMom}eVU4ZtWBvyJ z!m6=$=4p7RHCD}7kk59Ht*XUTL#Y;!ebTcsG`r_jGfd_K;bB;`RuPgubMuV}{*Uyv zQj2vodPbo=4e#RsWIS4pCQ4CN#qP?ah_XdsnBa16GP$HkWZgWjzYx3cMYxz<xpWeU zal#;DhDjzJ5Z$pB@(56y><2C#_QkNZ8bIXQ$_Q9U4L9!C>&`mBz%{3-&V@EKH$hKE z(O}kymiQ;n4Bz-fT&vba%*U!=rs;`@2;THh6hFiNJ(i<z+A=A$PxY{Pimk$}vDECI zTra(XN}(SN4F<+FF*eW*hR+kQF`nJpxGE!DO`O+f##PE^h`d;45xgE^#V|T>vv$(> z&4(v|bYLZx)QlAt8&(np<3X)&A$G@csU_fxFiWl5^N!`iDVhi6>aMR(T2=H=d=55~ zcavXtB|HOP!)mMCX!e6oGFE(0y_-slW;!5a_wS566%AHJkn`xO3ox+NMAUxB=CJS0 zyEtZMt~I}CY{UShMO}&961joCTN|O)gvW#M`CQo^6)<u$W=--It(G8xB9GSEm`@@< zr444pm_y&St{w{JR$;)~T1`ZT#+r+c_LtO>SA8S@!;_l3x-xw$W3_VlL<Hyw+)quq zCnbaG$C{zyo5VH#k>iImel$&$90|to7{N-ZJWZov5=Uy;aq%Y|g|<aqJjrA@IqOlu zDlE7<M9~@!f=>{q;U1tRpTk<NgfGRnWBkf7vLCda*4KyeEAEbG#3<4|ep1vfbFp>g zi6ts0ZS+{3&fXw}^kpKN#Cy^k8VQ@t&Yfgd%Li;7{lGkn8)Q)33AV>uYk{Y4jzcT> zGO@4kJqgJc>+{68INxKhXpYvyZ`BH3*HN&NT$yYF{q1Z9$jMlBmXDkPJSD;>XCwq3 zc_d>uYv7%%kYLQQ3Us3RK9Wg~Wd5vFsMbq%PsJ8_B(ZQF*?^l!orp|riRvJ@M%3o+ zI4OEa=SUB1<Dc~{>2a-!HnPfo)n93?Ym!%MqWA=pBJ0Suww{ViLZ<YJ-MlxS%W8<x z$gbHL<e9u<z#!Bf!2;0;HrQ45uW?q(COe9UF_t`nSL|c!7a_4$>%&Xd4l2UrPgqh| z3of$qF!_5R&kV<qa@iX>NB%$+GD%Q5X>46hk2yz1uDGkbI!n#!lMgu~co4ecP0MVN zZ_FC61>cK2W%|7G99kvcVbu<pi>HNp=H?vn2tE>{C(?t298bH{^lTFUOP+aF@ury6 zd$O-;MmEIU*Un8Wm(^+<T1kJ!)_Pbyjg`>U@ppBE&d+LPgFGvI>KXAg?kH=4siB{= zw3;CUfM;d@c^8_C_pWzw6{}K-vFRdD%D2j}@QJS9*`vmmA7riAIDM`vRW1cTzzfcx zR+v~-6kEU-JFgYI?kkV4(#%RGG9xf9R-pA!a>8m#jD}hbPvJ>rnu>AwOV4E8P7)!S z)I+#lPpxmv|7Dqs9!V=+=SLmmiNsmFto+)Hbdo)2nXPT?RFp2mW*sRy>l|m`F4#Yx z<E`;&tqhS}-E8<VA5Lb3WEc^4k{%mh&kU=ZQzX)5w^WzlOXa!rnmE+?EGx;B(c;x* zLg^K}PhLqRds-RxSA0W@s+aUZ``BlG#>^p~i0j}UpSu#>cJ;Q-yaPIDggW<zesl$6 zdSeV!uC$g%4ZA8K&&fi|k(4XfQ+n2sJ&U#&IeJA}%m3=1S{JWy*F2Xe&^D~BtKjiH zH~-+dp;FRi+#y_fCYgKHbo8Pb7x@=gX^oJXTr+k2q7&$tMQ~j?O!14W(0{&%=8Bj+ zDej;e?|C|FY^J8zJR+41&3noAh#t)yVNq07iN4qZSu?p<aZ_hRn1MM{X$|M;b**<d zxm;raGw4@(Nsel1Rbi@jmr=9_jb4&fZNFhL%#Adz<X<$+^09bu2y{r7$-Ep9X%Nek zI9}AzY(GB%1G5040w`3^H%l)fpzA!X{1*9jHwZKv&ix-Mos8G_^de)jLO#hoO=i7! z${FzMw)u?RqKWX27LrMp9A+jRP`)SPY2Y8%)HC7}u>yZ8Ti=|&bNB$>gidahey4%z zNwf!3VIGG}8eC3;$OPNUx;WE_l$E53>Mi6d<^Sxy?z7$V9(&1J`JVqGRkBy&Xflbt z-zlG~xD%nv5y*QQEtw#^7kkm1H~R;}kqCXsqtPNyLFV<kR+0`aaAfU<=bm9X^f6nk zx3LAHyDic;Mp9iBd(;deey1^0XT{QHxj{#%9?$~gqKeq+VsL{Njs@xR%a|rUAKvM# zfL0irv1D~5lBMQ>e268<Mm>!yRl?M7iwJN<ICYqay%uG`FY3w5n5ox-TUO@`kp~3k zDxIyN6>yP?Y?anHa50Hb%*nMri>iDr?W$0s8&z9kN=zB=C!=9b3>4%{n5=bZa1!hY z4MJdzQ28|2aV)cDFkh`N(KG5XASqSc#e<NUh*JiXEfyCVC-Eap=qNr$3(YaLqK`IA zr|n`%ahr&koQp_BqehCx=wCitRh)_jBd&5AQ$~wB&qi*XY#D9q@Ub-HNbQyHSQ9yP zRl{@we{R;2qi{R0Jt<b1L>E*TkYbfSn0(*z!;t?>U2$s^%2HHM;2su$&eOg6X!hLv zB*;tL(1^lc(K4LSdFS{rZKl_(I&8@|;_V;?)iaH5@PBH}R8K-m<^XwCnR0hkqf@V; z>VTD3pCvoU;=mE&Y{$VFo>A*|%;#NQkRH$`W2j!eo)G4O<vkyMl0K0w-qac9GO}bC z1v*Wp#gVKT#4jEYr>H&@zsq((`~BP;CG(S<0nK9{S!+7O_Nrur<m8k^8{%zo4K1zx z$3mJp1?{t<Bw2+)5kHB99r2LR5`3sP<VrmsJ4ND*bMrZT727kzr^7Gi7Rartll8Q< zLNGa;M@n3?JQK-*u;rzBAJ$N9fL>>>$$RY>Mp4GQc!5u$W&8*%CBF+p%TBX-YS-m4 zjd$w^x5^l*`w>5~?kuU*Q$*J)>>&R#Y;Zj<&uh~R-;gaHoc(6q#nj?xc#mxH-|kC> z^c*h$8<5nZR{fyIMJb*M$}+QAeCxBVBO7cFKWVHWG}eKKh5%<)DG^zgL54ip3sI2q z!hfq0px>~k=mn;P&`CTTgcI{hgspE$c(qP6rbnSfNUd1Yx+eVBc9Duc2Tv?UgCl4X zOjg{ct;N?68)QzaT3zGZUUQqA$5N4zA_sEXsK9+O>{<wwXq{HdVH<Dq$*<5QHUgH{ z<B*a%=*D(4)v;^_OY5(8ST}#;j2xV4MD<O*9sO1Z&^8)1BTKI9Y3XolyhJl>gV~M{ z3JXBjSynx+UB(iU*LEXo6yP%bTa;y9yZG8TW8QcUo>6@xW=lk-;@6BIR<WbZcd#5} zUu?o-&dgxK*3w<lK!eB@3kU;MXN@xiqW9rHXS5gDAr`-pD=gOt#aM_|*ami0>z(8J zo1{0J>Gi2uIgMdlQEpmJ*y!VjCetP{T5HPrNyvcA>SJ+$YZ`AH0xO`-+0)a1afwV^ zGbym57P7timb{u#=&tM_EJglD!@0OFvI(tr)~YdPdCa(m>!5b^N-T#JisUgI0snVC zskzDhRwPl|g)gX05NptouK8K!Znv}$uEm#WFWF=@c?A+8rqwDQM$61<?aT@q<qlAw z+_kmmWpz{zi2{rP3#YBPGtr>F6Gy_P{IY1RehxZprHmdTqii3R!f~QjHjMUoety&U zo|a6LZoXL6jULe^V}{$QrWsYz)*d5gq=TL`2KSdt!b*L9Xpkq`G}?nNe>@hCeI^5B zq7knOS^S@VVp~aT$3V<XyB6gAL|W@?@}S)t<!MA-Vz(k`Qmp35*{w~-mikpe0IfIj zg95~5)=v<{^A{|1(J#AAz8Xz7UZ+P^fvdf76%xZ1&8!8^!?B(9Uu2C2wGK#Kp~$Jd z0*|Q%#*(s5TA)wL2$Ph`qw&$#xU5!ct3TD-m?8bk6S8VpB2wjvNV;?AH%p|=j#4EA z+q1CZ0qlf$y$l5#U%3#6XoFG2do)*E77&JkMf@wPQd|#ZV;Nv*n7@@La1DFU@<F^% zj_fh}f#+*{pw>&2x^d2DwdF60dPRKfBJ?Hy4YSMg@P}%{A)ZFc;uf(i4deUZYB8a2 z_4e9aUG!lLTT?oj_BOZ60<o}sF*IJDSacz-Eu!*to!?=GtH?)g37^`S1hSH+aA!HE zsl+4RKb+59)5sft786g?oD@wGU9ugb2R?^96*n4XEFMW}#g^B#w#Jnv@I??T`C>DR zlz3D1<LrV6+gSOmbE)7?{1!~tIrz@ilkBOZiVN6gqr#{44EOdVthj4?Un@gqSZmK= zB-GsXY55JK&}f#8$1$<n&Zwk`YC5}<cCjbz86FwpX&bbMJ+0*VpEtrZk#kwH8TO4N zlO5Mrb*X<K2Q8~dgRsgELe)I1cuVd~4XO+zj$YQsOeXxfdCF=QWDLZjB1q#cQuVVT zIW74fJp4m>ZPhhZTvnttyI7V=u23bQl~cvV-FHZ(oAp@T<*^(sv!<HDnrN~RuA)6w zVS*XNzveDAcJ!HewW|+UWr|%9Q+IW&hjO&}!gx%w=c&kL<KoV3<uTYN`lNS_xBo@L z5QouGM~ojW%Hf0g9#)0_5rN_oFdyu8ISOd7-l|okB(*3Ua_&liW#F)8>b77=3=*!Z zvsKgss2ox^fLmwHyIP{vC-=%{YRJrgWJlEt<5*hjuO?M4zI9vb48*AHp!}JN=RMM9 z%ww5MH4rQ)R$eq<&7aPk6gQCi#uelee<YgJme%dJLJjIH^5s4G6E>GWqTS{DAb0VP z?^t+k+97=-uctrsA)F$*;P=^WET&pszHrC9#;$sLk*cS0Pt}{awz8_C_i}0F28$N? zB=I`tQar77_JOR0meJ#vWdP`>)hggg$dBf;!>#|TRbxjwPYptM47>uNl3r3YV_jvW zH_Lr$?;uh~*CVohEPeTDoI9^Wqv@``78kiH`~;yxi$&9TC-xMswvU|39GFbh0HwOF zTod^ffw9i!%0OtXb*NqGe0%MIBjFlMnfvk|`UoarU)e0ZjD2RmD;Kb%xQC`dC~S?p z!U>I}v9_!(Bvuq_tc@Ff6KaI->J8ihR)N*<jpA39l+3l_hX#oX*}l!w*0!%0la+*} zAcgux_idD^2lRb&933HclUHvY2Bx+?LmzIIKG0fEEt+9P^#%(I?f45Pw2pz*RkP;0 z?!<$z4lsrmv_h1A(*V86e)AhV6&8V~(z|?_o+T;lIostKAx-$uxL_T%5gzopv!Mv1 z;<=#=IHQpTzsF;EHi$${tW~TeeNN<9)FO^y3DsjbvvP`gYqm#AWq6z;CSgIF2e*b! zwFQ#aax#h^t=AIqvJIrWGo5&P$BKE_6uJqQdTyFblla4~+|X!LRl43M%W#5z@r~75 zj8c25vsbjebL8BGJa*Lz(xLxqnP5#n+M@T{%bv=62$l@;^bnsXfS}+;a&AAq#s>A= ztf}$Ai*y{c5jJK4AZ^%3`+VR0p`L^}`XscE#?S{*v<iRv$l{P^HV0Y}I~z;Bmw)8n z$|0`}(sRW%!Pj>5#kYx@abN66*J)Xu@g9q}=lkI@s~wVG*Cq>O7iME!)IN!<dE_$Q zw7Jqm!en;ny_%t|^Es>27{(RbYEnZIi*Z<9_8iu46sF(gpy^p-v(B%>`RjL4sb|N> zVn`t{*44<-&hnRLeASK^Q~E(S<ePAOBozxlK1EG!9XTxP0q2SY*-if(4QV!-ArG{Y zEQlui8aGsnAm)O!8si!*Enx9*ZF+&MVT?#6uh*(5USlRss+Funv_^uK(`-l@8mBu} z&*}_OIRg=fYS_-Ogjulyj-L#EYfcx=!?LUAz)uw6Ksj<^<VW>{EO+Za<PI<vViRle zh;CF&h(<c+LI2dt=|wpLd$sT%kY4?%n%366I@=Bs59FGyX?r|(D9R+YaGiU#zPIn8 zPFPQjg%uW)s9{ohVy3%&F0C|rZ{{3yeO<G@)DYjBCtQ;sSg_SBo=p|khWzzp>a5J9 zG5<i#nl^Ra9%vRDt?iEmeOmvNW<k!L3^JficpHBqP@nPv`bGu@epsC|tR6s~S~=rW zu^bdl0#x9+q9{ovmdMeSc_S9i@tr@SU+`P>t8ImP#fkh4?Q|?n^H1+t55eawUo{c- zBuO%7`0W|Kfxi(4iNR|n>ybL6lkeqU*j0#5wgYymAIA=}+_13>IkeVQ#PJdCAWsO< zn%~npSx?4Zo2|gZv+nA1MeVN6uG0VVTJ(f3;TN=m1*tFPU1>IJ4(s^ek<GZPBVpgQ zmYw#R<<KUUMi2N4?-q0JnR~E2><@mt9!!0UPhClFviWCRl$P^Vy{bq6{?|u)4w`Mw zu{=wwg?qGPT4Uq>X06G>;&JBZO0qX{KKen%R1dOl>>1m|^B7TmW4wy5#)iIuCiQHy zuA=Drw4z-;lie*lzr!GV{Hhf=<dm9~YHx{DwZzr<CwrUVcw_*|j_NnPuaX60+{zx9 zg;lg}3QOme@sa~E22eOwn-%xVqcmpMhmdR8X!aHUAhj$DuSAn@8`{K1*QUcM<wjiF z8RUU%ve2S)oG0nj8)QwUi=;uxd;=+&o%jihrq_8~XV1?WqH=bhR<Nn!eRrt!FPdiI zTe-1QzH?_Wg|_I?=GZq$zd>p4t#6H=nl9r3z06b}%Hg$YiLMy|*4ndUzu<#nevD~j z1IOthUd>!Vcnt#x`_?1+#(S|-xk}QnC)M=ut7S1rSMeq8!M%8<879JU5Q$L~E0QHq zk*G`cmb{a=6(>wbt-gRYG#V_6d%($BQfVfe?nFv98lI9Kt14r|ARswkUdmkAogxE` zH~FjWhTfBX+&nl%yg*8wDPCb8^fF&4L&*9S9Xo?Iks=tzXci-|#JneIgzK~$*XnbT zF^N<`L1$|zi_z%(Oh4mutCb|3hp+q@A#$!a+*5W|o=a=HUZ<Yzx6lRe!g9lkMqcaj z4$UukRh#E-qBUL#Pl3T`3!t{vhve(Dz0$)s@y`B|;a(e3p(#)l#7n2UK2I|pEG^Un zzre7@pJeL?v767!oK??8`My#^&skFb!w;L$Sdm4CaLcl|K5qyWi+PKJ`6)fr^?#rt ze$IMDdeGYL@=c^mWF;R-EAhdtR3Tk#ls4Crz@x4@vm!#X4md`iIKO#cJU1`KruFz% zA<7%jXws(|m!!}UEw1*!bFHC)gE6wLJ2o<`AU`I$z>$gw_%k+ujMc8|eSJU^8@cEK zwvtS4NPJZv$A7yDO(C@+A+kqH>%qtdO(VH*yHTB)Q%f5i<(lOjAPUmRvx-7tYyDiF zS#-^(s@$Og`pHNdFXQSSM%zCqoVIx~tcEHNjEVPj3O1&NFgV175rCFRC%i-FG2EoO z=!T?XhKt8ZDK^k`tbMMR+9q~RyR8aaq$3{iT)b#k`X%$5#9A3QPt(dw7955*qQ*x& zqW5@UnIpZ7$-);IQ%@%{u=W*c5i!-0lUUXdF4p60i4moj{8$-Fy;{pe*Re-t8;h&V z^unl;57^M^l`I@z?@34kRvs2LD}nyEveDRC2@)r=F0Ii{vAldiJ#}m1#EA67-cd%I z-76k60-lUTSe0HCQ{j#HLA5K+(+gHJ%x&|Y4B*X;0q?9bir?|{eMb3WzHl;pv3U=w zp40@vs^lDB4B=vpjJ>v-A;+rC%&e^(K)o0m$93N?vg`RVcPt=VU8$VOq+)LLx?Zu` zlhMHEvck@7tsz-7)@G2?WRlE_i}s-n<LDgv%X1sKS~yqG3)phC>iWp_jTNibS^cb5 z5jqrMY(*mDiMvHzSPOFDj;$+`;}O?8$F30KC>G4Rpq{p?nKlz78Wi{AZW@DNxAA?V zAa^qos?nNZGInJtjg(#{m(9lTHa@|+^l0p%-u8?}i6&c#k%W^BT1sO`CEaHG%bJKk zAv4leMCb_Lu_GjtB`}_w=1A28<&M}0@+w=v=4lV_s5iByEToadKlz@t(P|MXWQ<k7 z0W}UF7mydelZE67XJ+%0IiA|xdJob=v$S;Mw4*#59W|DXoZL<S>O~r4l-hr!o{s51 z_*K+Oo?TIYI<uL3@?oV>t9w8>_yw86QI3PXWHxx;N-LD&_@WpRUEagBT$60TwDM4n zp>O&NAJfQ)Rpyb{BQ-r(bv9n+wcKKRfi3na7N(qAku?3_6In*qm=)yZ$#rMgiB9X+ zpbgR76EcD_9qcGMaSeQ<wzN0p)kOySU!=xHn+Z)f`7ORyEG4#Mi6L$N(Wv|DNS@f( zL5Skn?gzyx;e(5ONn4-G95!dTDt&`6JXdr1UBAt>v_;%1W_1tV-I+5|)#y=w>nk>2 zM50Z453lT*Nw)E!2QU-X-FTA@-hu3Srn0r#!w2y2#>#pG`qy)aiquciI2e}2hMP$# zuS9QE#`?xHwGv5`qrYHxGxl1uPmaq)L!7RLb%94+vtEf#i5qGW)LoYQfTejR`82h3 z-CN2UFP%L@-{}C{AS=kev(@aQ^>Ebu$U3uuwV<AoY<Lp-OLo|Jw%#i`t6swMu^w7a zV%)*Av9Ka)k_26~js((US;)3g)8iz~`A{gmsrHagT2W68fAB?+o4)ipscZy59!YVr zy@;;plg-gW$I(=N+H0+$GuloQV3VR$HV`916Iz9(5(ARhKKF*H-HZRloXCS!->g>A z@rJ_bx+mw8NVIFJh-vjTd``CMf_g#Bi>gC<LK9(L*4#0w{OPmYr89g#gAt4Ntz_sf z^uUwtIJ`1TmuEG4><acokKr%Kcd@DpG<PW8h9NLQe66|_oC2(^KE+e$2jAP(MGnxr zuJCW1X+o>PjV~@k4W)jSE0X23x`Odi8PxhNa|w;PdOjlpXYP`=so2%KjhM^B&_TMX z%Ek(5R@hJtCSSE>q=Vlg1J!SqqIL}yB#&4ul5Jd755nFev(B+7?h*_79wSq{+C2~S zs<^xsg-<9OMrQTouK87g@2)sE@t08)fteGDn_?^Vd!L`xSDUZaihgJ<-_dGETEsSD z@iCcR7qu7p8)=r8F40b(k~x@2cEPjJc5>_!as`32lH^x}QLTg;TY=@7s#k0|CPB1E zk2>E0CTB%OQjXX*t)p3Vx&7|i?$??`7L_L9G^(l2ch%a8T0arV=CLES(d?mqg5-E2 znNTR59b?<r1n86B7cKL+wLW?RVs>7!lCz=PW`y;P3UsqBb7-#3j=HNW>U*pcyeztD z{Hq27Ze{)0dy<8xFP{%x;DWVD+u$(w*Vggi1kc14cW$?uBW+=gRaa~Xvu&05?n!0M zS?e=d{no5aXk4YGdBU(LrrZict+~gudnFcVy%S_<B@3(PY?5m_hmGf}RBkjL@meK` zmP52w{qPLht1tZ(tH3wjL2xjiKH<qAVfNqC!jSboyc1ka!iq=LSjrAGTIMtO9v+0f zF>AA{R6t&|n)grzqG$OltMS8U-n+W<>@uu&rCGGDD@5j1y+GBCQ&lxN-#gDqy5uDA zHAc=8%D?dsdgrmh$3e61q-KgIH$Hrye1U7Rk6Yvjb+B-o%5YC5=7ciX13s%YUgaBj zDmYx+%5sn&KW41*jXskHl2!2ho=c3$%RwdN+1<6}?tI=FTz}2`fHKIC-hp)G2(5jG zH?<F%<HT`}YdhcycQh-!Pb<#VgN`#=?deu9&<1^HtvnH})<EF2s1+ErjfH7#mFFNM zWFH1>o*f<$|Hy@i0o5i!;ms7eV`Ya0YpwCx#8G-lmWWO`QshZ*MMaeoveESv*hM)h zQJY#KHlbt2LeNeTj4NonF((yiU`8I7LGxK|2+X{fqOY#a2(5V%NEhN}JNf<Qinq<3 zaJ0q)TBI}jX0tq>r`2DzjoL_J<ZSU#Y$7HI1J7%gW740M6FaQ2<Kza~FskIp3VZCi z>?&KWMYu_0!UlQ{@iGp`%CLNj8Vp{~6`>qY!Vdb>yh6UO2wl$9s!04jhS<7_-R+3) z!!2XHwca{X&T_VuHC-Qn#gdkD#=!9}u54x@Pvf)Jits<`nt3!HLOWp-eZw0zU)*Q! ztOeKJI{oTCVnlZ@>*k4D+oC4c=jxW(cG&}XM=yHn+3~fwK9$>WCp=xQ)jS7zfzE)f zmlliZCy17RFbewKzgDjm<!%}|q9K*u&V^x5c?Baw!qpUrwaBlzRD33^E+XW;@yXt^ zys#->$%py2wpqjl7t6coHGQXV*+p7Ps>?w+t}zot2LJI{o<!w-y{mB&fA}6kqq(FS zr)ngO8^qXZU8s-dh|`^eiJ>2`9_bUg;1@_h`Cz!PBSqp!o)LrTj9Oztk`JrurRLJy z0X8HLyh*FPF~CNV6q)Vr`JuB}d2KaZvm`J@<XP*XKNy>ZZMD4om$sROLk9JnW1Z>R zD&1jw>mys$%jcU$##Lpj)+0YEoZ<KKwPtUUt>#O`3&z7WE6c9qwV63qv(?_}h-are zTO@<!^R7m#vR;HB2c@3R)vN#jaYK<}T{swfLe|ZW^F+?D`?GJXmP$8a^K#+z->R6M zpYIrBN&+BwxLLG8C)-MR9vWwzy27usRWtTnh*6ZH|1l11jK5pQ#x%O3y<Rn&Nq59a zG^bS&`Woiz3Nkz_`zm8g!}y7E@g$9=wQ3rR!Df*?I#>iRnwgoSLr2>?&?Vh5`@{N| zWJ;^Fovx5i(j{L3+rro|ILT&1)od9RcN91Iw0utIzOX{<kKI~fZnlIash3zk*ll(n zN@Aa?!)zP>TupRm_!kofm5T&LZpNV+tB3eyS2njxOhPY35uSk7YD42r{0OON46W_n z@hz-wwTBElSC+st7-ey<{xOH7KFJIdPlr=ct12$k=VsEeHGEDZU)N~+9Lb96F?=H} z&}*)vjg>h)Eo#sv&!R0Xvq;kz7*%7=dR1aDQEZ!UurB%?%JdxganU!7&W_0W@Q|>+ z>;fAjjx4^19=jtU&doWkxo7iOSQrJ%XH1P4oC1x(x_o)plVZtL!$1_66tAtw(%HJL z^6HFPTyHCNU;t}4sfsR!fiB^62ndS|r&(nVI|uWdSqblnBe27yM!kv}Z>)=oesyZl zP%FHl9@%QBPv(WhiDBSh&k7M?M6I_eR)zUsVK!OIut2;K_85Y97c7hK^euGLxea(! z_st>0zgCy?eyw0LYpijLDkQ&JBd5@rWco;}id0>RC)7vsy;c~sLX2m}o?ErbNIaNP z=$ar#pxIR@N~|V^@a&ip9;isJHiFf`6Oez_fu7fXV3w_lK%QAu_LQYBmTFZWnXGjA zpC;=;F@RdI);O3eLV{-E7dq`5BjKFpk;yqJ6C03hISD+Nb&2RrYnyO+&8YHxo<r+I zQ6$^-8q=3^Q_qGikgJ=C9m>+NA?oNl(^}3<WU9s0i)K)?!h1|TTMl)ScY516ea6nw z19qYrGUEyB$aRV^$&#Ir%~5v+F%cYW1tZ)dhPC;l#(i+Nd=MG)oa(iFCjM)LQBD>b zXFv5F>jK%5YPxR~0NMk?Kq2LN=#@S(h9W!Min<uyN>qpc!AX&CJ#9=J3vD){@hqaD zB5&>CBRoIbAwJem@*3{qS}=~@CBN>-^YBgVlpf}bj8x-d7Sfr<jE^VNdcQ3$8Y7=7 zUNA&H@4VsvAF)8sEH|&g7qhljcvjyJo5+6i-eleWpKvg%%f`}WSQ}%6mxV{Q+&#6w z@}qzFcu&VGm}^W*SxkB)(q+S0a$dKwg-D_?4o~E%Ai&N>gwilzwfp3gKZTk6#l!K( z&VohEQGg1d6jv~gd?THPi+DlavQkQaMXT%qne0<~?YWwf!cSuXXel<Ir&i%d<K+3| zQ^_uF0W;)XkMfQWv)`Ka6lR4Z_Zhp^wNzQ)#@_T8cGnWIDXtpNLprg8dJRSwgOX)_ ztWgMgVOeN-c>z7!>It#4{57qsykXWnk1N7Ts;%AEm2vUp+%xI9W)xJhnaRSwl}j(S z*XtdDVg>koPTFp?yXqI;+KNPyLaX5@lBwc?PU;;};R={d$BP+QU3Gbw?cIiNp|zQ{ zy~!u^PGZQ7R%o9}dsS>|N61)5A37o}cISfP*lVbt#;EYXKi9s~30#0y_>Mi&64KzR zT5gnJRKCN`-bR5%uo4%$QJ*D$$}{RIvjsdoJk~mZ&V}T$*+Szfwr77xAoN4hNNt%# zHdO>j7jf_WFHZsQb|v)YLVU{JG!y7*Vu-R!+72Z_QAWKUgq}dItt5s4U|%xF3Y#^< z##h$ydPS!2A`C_@=?T`7^~ap>OOBE;q<dsw^T<Oh9>m{tL!UrFT5OF*a!;?|3;s`^ zH^O(PqEvD$zBJyovPO<~W`ngF!mPLITn2JsucIPc-rFm+bz&l~YX{jBk&K@5J^Q8Y zjq>ywzMYKDWL?PH6B0LRr?|hXZHNf%uF<t<J9|n?cx@bcqh2lM<&CX4t4zA}^2Mw6 zKeDfbo`pW-7T{DeED9vSa4-Bpf}rKD-cX6gnurAHCj3oe#jj8_=_rOFQQ|k(lL28J zYXkT|S2j<BT-1_ku^pFL2dkJDah1_!L5(?G<`v;)JOspIM`JdKU2WD4`lU}s%Rjc9 zU*-|n50;D{bv6Hrue~e&aa1jx*bRf~j@U9!=T{cE^OVW3^Vk<S8kW`Xm18K$zQ*t{ zZ-D`I^<qvH>2$eVFpCVwm(hkeTaRPUPmH{_s^-9_s&iM(?mDW~AscvJ#-Sbpe!<}5 zXp43{pY@Sh!?IE^1^wso^%w6!e(1NOMFGuA@&&vHP4?XCDcym!>3K#(<mMW5#Q!{# zF_-<=F2_Pg^72+gD%#h6F#;ThS>heEh3&%$vj8|M{sO{pFO=spMv#m+vNL@6T<me} zeG!j7<hNL2d^(MT8(HfjN%omPw+=>UVY16Swg^|$Pg<LKWZ{d(;T!Mtmv)$cCZg{T zY=Q}6Q$2@1hHdmXNru<_WzDSp3Y+o+dbza%GCHCky$prv0}Q!w(ZBV>s&b&~&TT4J zK+am*!cu90(bFQ4uIuQ3PiAEe)~oe@deQwGpKO?x>6DQxZffjW`-H8aS+fUkhYv7v zvd*j~DKHMk7)o@<VieDVK_nZHt$&_dBxmjQbVI(=YX4}U$d)X+PHlg6m8=+9{tl9Y zPQ=xEyeLry%$Ym~O(3776?(zru;x%DE6d_&ubrXP-ovDr157F_tw+cr8zZJOnrdk< zUtZzUtTy3FyeAvLrt(WzY8Ks@ERXtbvZimepZvIczc(uK&~h^{a`$L}*xjM6)!&}D zY&Cy^5r=wNbSxaq-ik`?HX2*ULshnTx3X#Vb36b%3$u9MMwse*WFUOv=~epaDgR(E z%=;)PpS={d>LpAU9#5}#4v5?bOpBfJ^z6@MdPaXgAyTM+*iPP<B`~&l5~##zV!Vty zKLX>?3B6St!QS&gWm}4Hw6B(nbh*C!lJUkjTEn};p2mkf@?Yjk!h4gEdc9kTcD6q6 z%3`FRhN`xrSGArbp0%fA+5)4fx}0Ik?b#%P^hBOT`}IWmU@g=4Sk`)P`YMhue&|X$ zB7@ow9uh-sHmSH!|H6%YBAdphkXx)BiO|n9gl0R#`JRnepil1Axo`Shf0pAEXBlbN za38v@H|s0dJ<q`-GzxR3*1&^w-#yuV)^Kf}xqcQxa~<{d#iF&5+Qojd<g`Lo2wH-1 z8l&NY)t@wKBb~mp2bq~M>OSOvAnbk94_1`7VioP#CjaBhyNbN^JnV(FZ9dy0N4jIH z*dTa4$dk`Y3#^eTx8$>~PP<3G!E%q~tk%ki2du7zqqY-~xYIbR`RXc%{1|@&2huWn zsonTpeMz(QufF7w^n~8R2-xR{74cdXhdorfPp6*PZn(33-c-X_Gt9S*L)Z{GE>W#l zED07KreX*6emS9HZDXhUqPChx5{Iy_Y=>Q$=ul<JCo~@JC%y2YaaVos7~{@H!WorO z@*uZLQnA9$a6j6FJJl2HSG~CNNw9vP!@LN2&}y1n#6o}gci-7J7cy{7*1!C}h?9jN z;n1hiEi&Ob;czuZjhS4v-T-cfUd!&X!z3FTCMocbZ?GS8Gde{Me4$aaQUEK8SAipF zkCoRvcgGRN=Of*P_23!cX7-dFn8}xTay`HsKq0E4plHuvjR=|omB@S0L)X`@xI8N^ zkR$ryd-szogo(=5kY;_w(~)Ss;7qch*Hk^R657X>c^()8qUAs36xgsCuWHQs3P_*l zGbZpgwwerR7e+#r3#$UrvBTw>S#=tqeWG_VsLzcFE8>6Xj_34F^wQWHLL}Q--ti)T zWeh4SB#Yl@JdN8KPycudw!Bz?*YOLz;{s($aK`o!;H~m;{EhjnyoIOcw{Q=TH(aha z%4fhVuzam2uT~~cMTXVH`3*hS`8oQ}c`T-WV~N$A&?oV$=Z6g7K()=JMGuzeP+7n~ zX@}p3^Q*?Y>jt<6MC7kLe_1^BypS%`A)+zPt=g)W#R(WQZO|^)YNdqurMOLHNRgFM zX8{^1vHq^k5@>Iq6S5?C^{*t(7>X_RjCr7HPCb`=daD;(D@VFnNbv&=b4@F&I<uA5 zM%p(!<~{!jp<98CJV3hqSFs}vfiuM7+Q`C^Q+`$t6mRfydJHRVELbV4f|`MgX|Q@K zo7nhGUqNv_pA5U2E6doBG*Stfvmx%u;%yQsn2|fu<Qd$bWUw>FoTf}f3n6N}qG+}C z^)!ubVnw}boW@$PlKPWfR#D_>$*t=-UM&qN<#nMfk*xXo)}w{L*9=UF+7*!{UH3F3 z#~QF^7K^`(JFceDG+ofg^h*mw1g#KeFW6%!-4kG7Tv1NNGw5{~*cBd4f3TlkvuR{r z=9NWZuZ#$<4+FEm#vl7YhM^oe0?!R;mrF6iWC5FkFJv*)V8ZIogwI7jT1mQU8Oz_0 zP4|I?SQfn{LrtFWM?UB0_#ZRs>p$hnF{ChEGyE(7TtTYw*n9;a%uZQV+9+a&)GR>U ztu2QUL=j>}zDEn&N^A+qwx=eKr?+_%ez7P*OY2!NI`j_%$cCGT${t$FSqou$9+rnO zPYbUOKX!du_!EvdexA=0LzOg$rD@#Oy7c04h~4MB4oUTldS0KH+v|QjXf3-D)}|s@ z94X%gx4=bu7q&L?p4`!5cM^hcZoPZ4fT|%<z%!CTegp4AlK2aVLr?gYuYhEVdr7kF zj;F&rvW55uIY2%D*TeQTQ;I|6!&nTKRILn)YnFz4dFJ{6Pbep&CHjsXVvS&}MwCS? zI3ceZsnJ}|rH@#=dN94GKS+`1sEyLYdd5iVSK5GskYSW<z~#Z*VmVi5%~Z(L4v6J& zd0kng-m-Wbs-SC)V)(+w$1JW9ktx6fvKnjvWLJAvn@3k<NgPXln|*O-nJ{>RCD88q zIUAlW%JT$%t^3~n9-tkcZ9DW2Dc>!}W7W&HdwTkzAB;VmN#nbgWpP90t-OZp5)9#Z zz2FFJ2&r#2aXeSyQQ!|4k1b(IWIos;sId%&*pDXYXE;^7=LkAdoM&8XWsMM7Y|R#l zfWR9IZ3tE>7R3gL&dCs7nx67mbi}{<%0>r$4#%hm_dM7Ro?R9I+O=wr^Jc|PbhYbp zi4oVxHU7&wsbrYEY8l2~uh4D2X~s6wee%IC)n-Esq~1NTC)xxxXcfCC$52EDsj0Q$ z-}I|zA(#9j>7k8yceP%a3(~}HmVptsz{es2Po$^FFx#nCjs$nrPi)Mtxh~COeKCAS zqkYI)kTIyqSe0v`=X93t6%S)iJgaerwTv;Fp+{MI)<IwDXK`6Gmlz+KRBxa%i=IOA zqAqg5I=g}$8KE3@o(G~Et(Pj>2!E>=V<qImT)#D2p1$#*abhLd5hzUiNuvLGb({;i zHYRKrJNUpb9xy0-MXLB$XYqHqKXPE)F>H9WN*jAZPC64;C5E$#a9K|htre~Wuj^s= zb-w;CD?`6{`Qp8D_GE#c&`vr-Gx_%B*DwQkd+3x0fDqixJ@O`+(|yNaar>kB#~-N- zx4yedY-`kvg4y&@YuuqJNKWN2)<tCNA3Ux4Lte<4tMYl7d9}9YB>5J$;|<i{@(wU7 z`A~}vf0KPkl80zc&ee+EwM8YRUscM+O1rcf=BkfSaa=^t4{4=*n9-z7WEPL40@NqI zb3NFv{)N`5w^37Fz8#h{)@9gxZQhGtVprfRUde1hBZ5ulznW*o4$yn@%ojoUEP%7< zY3(&RW|{dhc8JWjE)%|Tj1jb=6<OnrAe(tZt9W%+^_QL)ZIVC_?Pujmw6Q!`JvmKf zFZnpyDf(&@U5rvTi9KX9csY8>+dz-*(W*QdD$?xko{-*&3b8t#8rQ{Z@DD03e2aI* zfJ5A6Q+N|?<fS}oy%1alPug*s$HOH<nmmvD&qVzqe`C|^98EHEjyKkP6BJx@Pt!aF z?Gl%(KR31=3n)fzpM*Gzma)KmiMas!t`@|#F?GK6ny++K-@|iS>@`hp%{4X~TSHz& z#D0rQ;9y9$@s_GQ(U%@nX9~Syd*m|r8W^-aa=eNNksDr}t=u%+n_gFwZ9M_j3I8Ye zXaz?sN+Uv1kh(tO>O3_S{0EDzy=)|;?72uYTWjo$1XSt!;?W`~+(&tG*4v2goNI5H zwRUi@Mq4IS>}e$zd<(x~9UuF9cAqI+<JLhX^9Iy{VeBrRvY!|ntV{8k)~JqgHpwFI zJO>G=ACNCI=Ts!%7@xACwA_;y$MgB}MdpaqQ?rYZC94B(!dEOcR9()-71&?@AcUea z^Q-Y}YzuvJE-Wm*Y^DVYA{D$rJ>~yL)S1BBRDN%K59i#OYo6zs44KD}DJo=&GAooJ zNt6spL@A{~Bvh0_sffrJGGt0f=6UAgj%V0=|G&@KzdrxFKl|LX_u0d{-*>HNJ!`FZ zzptcMXyv1YBuci;pD#ycm#hl6)dDJ=Y>p&Zi&&#LxwwG*Wwn`}PiQ7)C^n_*N?V0Z ziM%JHtb^X%R-8ejZ%G1$*7~pU#iTLnbEvm2WE13<`)@lbN+TQ<3M;FsQmgdR6yFX= zlJy>m5YW#u`5LB3f%;k~CL`@sltZl~Nt2b*e;<M6^9UD}L68kphDxQ^6YEb`l|4{S zS~a7-fnrUnac#-N5Rz+lUfDNUH?@^~Wxu}F^HQF)tc1!UOQMlnd^@I+Wyi{>p7I*a zSyJL#FCl~S#$sDOyBG6P?W@IQrNwz=!6hq_6LDNUx2%DB%!$eAjyhjYp}smgU$v#@ z*OQ3z$p@Dt$g1caFMU(p$}3O_<mvxcAF{a`gF@1#D3-Q-{q^m;juiUnEqjeyttf=> zU2>)vj9NoA?dy;7P`+=X5=f%dA4ga9d+F**9;KG|BOFl4d@G~*pVXq_r+#01;hxy7 zv{gtWWE86q-&dJ*U)6|OSC}LwDRhvwNl$fkf1C`-ieK+)f1$O{u6%DvPoS8NYM=<` ziW&SDu@<lP|8x!YJCwCkFIY*fVrhO{QmrL4mISH3#R<ev^q!Phh)_=0C@hq1RjbKj ziXjSngsZ+yR1GO6E`BU2(Ow^&{I>^W)x}$dq{`bD0H=lE%ABY_lv+tXsiG0`Qsvpn zZu>oIGy<`r*|I}I2i38n3BrDrOR_2ptkx8Z5H3jqgoKLf$P)bb4uCQy>hbLNG!bUX zuE+{YD)hdO+ELj|)tO@9@*9%>mkIInGLlsF?~)BsFGP6{iUH|~G^(+9j4~&hZ!kZ0 zpeQAjN1^;mvDg)5N7Sob*1_*trh3!Wh1lAo=!~9DH6z}mCoj%^jd-HBCM03Pebt@# zx9U!~B`;g$l08))c-4tK71f8Lp1$?cFM2{*JUy>$sCrP!W=lGi8}suAe(xOZ^WO;( zYtggGs!8%yX61-{4?{Lq{9Be@Tt<?kHu2?LQF`TN<X4CjsKsUb#m#&@Qfxw4tQz;T zIO0#TVd@9r_ui1Ci<ihJmT&EkrlM%77=gHqpN~>2`;j+sIA5OiKDS085T@v<H6FKk z;C~iF@f{(okHcz5)vNE{h_9+vm8n!rSkI_yh^NR;6npXITv#MDR2{2U3sWvxO|__E zVv=%kFWGLjjN07yx>bw5UnH9*9oJpd#(EN=tmHwKLb$F{D<3M$B>fZ03P+?3I!6pk zc>!4)dHup$VU_<(zP*?H>rP^yDxp7Gik`;T9*rfVH_U~cim^+>EAlDtS<x?f#?n8@ zg`PtCBfnh73SWJnS=Uu<sZDh!--`Nu0)0%Ew8)yNwteJRizzRn_SP}~@h(Z0tdIP1 z`B1`hVWaXqvS)r|QC7qs!@}ou%0uZ|^035AbXCcUtcrBQ&vGk<t(x<>zO+j%EM6xK z_7_<{aYt#H>Ri@dTtsmfJ)xp*V)~L?y@{!ksLb+p{4tRIXOt|+R;%vSzUo~eOC&^A zJ?R<!e!Kr!X+5nxGO;UJ9382$%KGb@{ARVW{8XP?XncDeDVE^BEvut_-`mfOsb*Cd z>P4U!y;@$V^B>a?PU*XHYHDGjlS(UTkbEouE16Vm+>f2>Y@vW`kLpj`sv*C8;({u# zA06?vK>DXUN(Q9;$~K4(NPho|6D#kaeJX+PHL49{33Merp&x;iUWjk#IW*>k<Wd@w z3p7@HiJ?nggi#S<(&8-gF#P^ol5**-kWzNRk9+E#V(8Ko-%F8|(lZJ9{miMnK<R=s zOmRo$N_C#{`f6DrvT{i(z0g(qA%s=!>3RIV9r~_6%@!v{>c5LE>nuj5+4g+S=SP#& z>s9Tix>dRL28l3P@}u_&)ZfTw$v#I?Mo{&syU54!F+zys+iU5$+D!GMqof!9`$Uo| zmE3PpwZH#ngtmq8eoRPm<$FN#Dix2{eI!|uWuHUnoli-zN-j;zk47r?p)KWHgc;IK zwY-o^pVD#hMwLhYi0{jYg@|Fv8<&MsOhl3-uAp})rBNEGLDC>ukp@c|<PS+A#b0EX z)S}wbRekoYXtpe&G+lO1y<{b2k_*`@)vq|2-W&1rR{khXK87hfr!xEfmnE@!H(c>} z@iRa7DlC#*s#KC2zYnKsSpCpdTf%$Ei?m4hl4eVuRC0~+qVK9hMF54k(jG~bR@qoT zz96nH`>UDNWa*1g1~C?~6)_?|o*{&nd}~|r3o#BwGGqfJhrYL|n7N)sGYx7~6J=MF z5%AyW_Vq)EpqRSeEEJYY_I-{c$@jB4z89z5pKPs<m_Gjb7E>%i$Lcs?y59>|bs>wV z$eP{}kTuKTII&hghpU{0>P=pd#(@y_2q$IxRHr_&i^;1FrK`eZwYiw3V#b<{R;{8k zNpt;v$ns6ZsZ`(o7+q>FlPA>E>I`vEKjxvRmGaVhcHKqVBReI0(U#&4!Zk&|6nT~A z`Xg^B*Dgz;HucA{leQ^lB{`E%sMxk7U2k9dbt!w|$L@S-Q@Q*eLFzj#HYe0m>-yv5 zDJm?xB$V=5tKtyKbE{{Po?FaMZ@f!3%CN?hTk)gG{wO+nTD`5J9^<9?UzmuDAInmd zPAwgXU0EEl2-j3hQTm|Rk8FgWD^;9KParf^|0`|lXvIY2Cn)-&a;Qg@YE-o^P1E>@ zdb>x~RI((A)tf(>T|?-uxVWFkR4e+}@4tm94pxye$Vw^SsW_rIw))q|6Oq1@rMHzo zu9l)vWjRueTTi8a>hjh8n{`UkuXwsYr=sF7it~sO_@m$`IwjB5@1da9_oc(PtwJ2h zqR*F9=R#s}Ch4kTQqns4EJ9ATif`HczBS@cvadR(6!(!wAheQok-SKjW#`nALOMmI zRbKT!5C>4-(f?<Z(lW6(ouxRS&h$N7SxH49d>)|;jj%*<V8u=3tBPexx1@o7Ts{Gh zT+wIYy?B`P!XL9-@fv096#?-xB4YiLX0Z@OQdB<0!^KYZDHgAp_5294tg5hC8lZV^ z6ycB^Q7!5%FXf?BQ{n^CcGa(NOVM4uxvJ8LT}fl~jOy2}7=yG&EKmNh#zT>|seV*; z)tw*l(nvCX-xalpMy2;Twm6A6q*mS4rex|*uW`%tF05uS5T8>IdhOR)Dv2VrVqE?k zfr`zjUz7f8_8|4xQM5^!1;y@l_J41ZDvINCJpZjd)sApO_td+!4o9jqdV^Lm5A_nd z%QwHjh5!2vj#GQ-ol}*@f2T`z>Sq*$lxiE@T{COR0^g$SHvA(>Rzq*<>b{Ce+-Lh1 z5i-5Ss=1T?8xKF7{WmyL+ZmMX4&U@Hf@T5s$N9g<H<elMQEFZ#c`h3NN0|?Q6d;Y{ zc9ZjO$L^(>ofPl!N8|VVkmy}ZWoi6Os$Zk(l_ELP2>y!7={~xKqS}gN>YX+*P>o-z zci(iDj!_+pcj-wa8Im<cJk(c3E$lNYovF4|EvuaJUzPt;%}K_6X}`iXR5FbisxgH0 zbmH!6QJ-szsrivMNr&1%Q6j|?6@l|d<rg1Otw?iRYWaSw9>i_LBcx4g8!-X3mm)yE z_oPuu#T$gwva-@=t-i+~8zfIf{*!!YMN1^3LJWCcvhRx7ON#s+rM`D8%@O7(uPXMZ zyUN1p{eC}_=;x+|af%W9*VDX{I?K0Z;uZ1-b+$$&*LQiydQx4<&-{p;`L<K+L}>RP zhD-Oww}p3Ntcw2_V6#dkFI>?TaW}=6#KBc!p}5dmdhdH1vh{vMONi({oj8&#kI$pk zH&i@UcaW9w@mmo<@m0x@@I`g2sD;>$tg7!vD#EI|5kvRUQBh`pd<501&uL|aeEzSe zR=+agl^B(5l<$p;P5bW-s72(th}nxp_<0zWO<S@BvS0GdN?^Cd?X+LaO!ci2$_Li@ zvd@YTsl>uE)wue`OO8}0@}pGaI@6D;`)@n>tXcIVBvwAA5XTB}<-e$RlWz@VnPhR4 zb@RPuNrK)NP+f>`>8)JxAH~*Wb@XJ?8~F>W5!Je)R;p{&hHx|F{pqdte)Tqbzq6k9 z9yQ)I9wV++pSD=dp4W|6%?{RlyKQh-{NCh=`5G51UH(q>jtwR^zutE1V@o@A>1=d5 z+~LF4k2HI}Zm816qA971?AJ1LuFO8u{7lVrZBPGowDaL($5x*?ck%3%rZ+#k+cZ7x z-n(hL?o7J-e&!32*6w&~UgBT5_vQbqXuDz!3+_xEl(5g+n$!QDcP;09sWUB3KXa<` ziEjV)IeF>K)bp1vwz@L*+V3|@-Tf`&=d9zIzhxZD>KjcrABbz3&^>8c?rZrD<qzh2 zCC{kTx~Xe(mq}h1$Z_jLD@59bs%AOqPi7T!>IU9Tx|q9Co}PJ=^EFBxl=!Ya-RYb2 zc-FeiUKxMgUz+yCb??IAlbw%LIe2Pcm3<2iHavdzT<OcRFWo->>$w-szk2bHD>H6% zN;{J^#!I(L**(my_NwIH3(PHgrO@cq4-yUrdInC~<GfH-V%p%FZLeRv{N?#(r@lG< z{Hb!6SKruv>&Bh&=~JUK<ICr<3Z5*IUdpPNS|zT^&I-%RJYKqIxzSZWc(88WRdvSK z8CG{=y}I=q)*W9XcZEqsx99Dg@=369wEEox7Z)CX<bb&=@W=SQHx86MXdl>m@ahrc z^!CfEZVb6`^6IyjPMmLe{_4eU*IV5#e!Jz(S+}OAcX4_Lze{)}enN0!@XJ6YZ&vo( z>D|(kGx}$Klle<}x%&mv+hmt^--_#!>+d{$^4}@6v-qg8&r~d2F|ORTQjZtkS17LF zslxS31j>9`?yvG^D(tDaxx(<WYfFtNRlW3_(p5{JD!H(Dfx`DwhsQtReH>mNDj$9> z{BpQ%xPG`q_=}vw8Oe9s+$wyd=Z(j27P$Gs^|!B_xv=r<rqfBMZk;%CV&tjG=SSZ7 zH+@d1LHJ_!^O>Kg&%O6hTJoKBcYeS7XZpG9hoc*e7vpZ`x?XT!$uSkzR{x=PlREip zy;kkHN)5|DUuIv)vBl>X*_i*=l$F6F#uWFC^RnB)y%s$d4rH&qxAs=X_4?N<Uwi5D z;`5EpbUIbz)c(_B&aJ=n_l=qNLRl-qW!-I7m-x35vlFW)@5x=Hz_~)l3k=JXnUb9x z$d!~DN<EfZGw-1ScF`Nf$Cubsd};}&WPGU^CE|*`R_LdEkEBjZIgvOcZm!kY{Vh@| zx;wff(jZ(sJTc-#z6}-6Je+pwW}cg`-FoEqwA*v<6uS3l=Em@NV`p$$;@qS<Nq3Sf z=NX%?NS>tRJ@GjS4<&C%x*9(_SS&a(ZfC;2qz)<1<r<LtlhhCL49xRf?&PG?fm+rW zyIZh_o#+jXR&aX+79`ckwItW<)O-1|3xx7jNZAo6V8sUx#8r;39QR#tU|h+>gUOSV z@5C1fOtY?;?-^<Cr_R9Wi_r$&ZmWm=l~*t_F6Ts6sm!hE^X?bEXQushYwE3occOQH zxmW-G*7Tv7Lo$C%KX&i8H1pP}EAL$xb$-gl@>d#MeeO!|a=pt%ue80~<<i(Ir*AH} zS2x4VIF#Na^RMiL@H^4T#?oNx<YIZc<b5agX71g&JLdW#c|l^s_)CG>)+<i$%%(S= zzR>A(t5Zu)nWw9rdE{)%v+tk1cs}z|n=2!(jJa0(cH#5`Id$AE_R9(RlBXuWk=!e# zVy+>%N~G+Mf6-Wz(>o(~#vfU$BD0OkR-9Sc``URlx-k@&xh(CeTWfD@xOV7DuPcvV zd+gRLcUz`U&q&MoHS@Qu+1X8Vnuo50&qsELH)N+~<i7W9+TFXCGq!}kHzy|S%#}M& z@zku8YRSzLuf}b(uXu~1M{<tePq;PV>XTPqyt?vw!P^z@U(0#Ghy;4a?FclsY|}F? z7+1WLPN&GGQ0dU#oR*<C!!Jc^c`4Q`d%m5^K4z9S_PSrW@gVdt%L&#`T%Ht{^h5l? z!28xM;~VdyyT|>`UEp?ezlydC9mzbGekr|s=FIFH;mXFY;Ebf{xhLi=iA%O2c|?5k z;DERlN$XSV<X=)?T!Fa!h4OAlot)YtbwaL2Ntc6(=9=j8(3d&ygb%pS+ONi)h`$j3 zaa@N$SF@?RIbwy|=S<8hnU#`rFtXh!6E`JkMy~Ctlk--}->cvkg=!c4GtbA#LlW-C z4@j60Up<(|-fcY)OiP%baxOJB|HXnM3qM`BR-vK=-p%`5YQNmMau?3EIqCQK8o?cQ znte3*O+v}!Iw>zD=TF=l{MpKFRxvkOR|A{levbb<J{&h7Zb)3E_+#-u#~%vjw?fX% z@c7W1p<3ZZ;acHRq2!z~*}b!W%zh$gT<AhLAzILB;g0aWHl8)xnq!R_-gDkZ#ulq( zux@<u#MhFW=Xx~PnUtSXK1um8rE;#1a&1rfKB-s2pK*W3{T;t8VQ)fQ!m7C0!Sca5 zfxXtN-k!*+oT*t8GL5Wj*`I|=I`6q}xXqo1Bg1mu&s?8AB)xUU(aaV($0N3pWv`9z zo4h3V{yeAhI(gUSc|G^wl#<Ek67wXi2$r%>8RNa)u;F)&3g%(+8!K%02=?I~L+v`& z6Xrl;tasNf@3k>nS!SSha9>=v#1~V-xvS(kooeMyOIjR%Ik3P^2&@e5i?5ehJF#NI z+PHzi7XzgOJMBAGZ}XO0FPawmHs^tyCE2aA&t+c;U5W1X=9_b^UA7b4l~6pneahjK zg}LVCZlAg}cXrCrq!Nke<2T2-ffZI4<1;tvTyYDS{p`HK%wWa1w}LGKm#rFBU+WwD zi(tR_CllUHcs!v+!tjKN2@fUY#Qz@uUHoV98{*q0%t;I<-Aev5c}P;vgb8uof*S+n z0zX)*jmz$2XKFMlIxNyDoEkcly*_JKX1~l<nawlb$ZVGNYj(l#{%E{c-uTEEZjP{* z#MMb!k&-9Zd&%huZ^i8jEVe(f%9sgg&b#4g&cW<cS>ep8na49GWuDAxol`B;H&ih6 zRnD%Q?V;w8-O;eK(7oZl@2xaiTKNJCgOlR=#l0Dv5!h(|VYN0-xCbI7L+@o*%r2Py zW7dYu)fuHT>SkQbIFz{~YisuXoPR<?!zaV}BbUOV(D0nmSy}15?sZL@cxURJTxl<+ zwMzTzPM<sXZqL2_;q78~CZ`>~cR8bCPT|NDr-L`u7->EOhRzMV72Fu?99$h}5?End zcAA;b*y_9;$rC;m$_oD+t%i0Ua`(EOyqN@j>)CJG`>dm8FSCpJoY}}sHlHvLnDwoR z)_&_*J1%g`{>j>I%yP#^$Av%6X`4MSs|HWsI%{9nGui3cTXPDB4@3qznN9;|X(SrT zq!xySR)=Rs2e@x~e|c|vdA(2FF77*E#dL3<_lsB4>+8Pf?2KNH6pd^MpA9ERwuHBb zrsq7Ly)SEB*4J56vf5_t%uLGsF{4f9xvXnBZumy@Yxfi5hSe%qB)(Td-Nd_z8<W;2 z-%Lr)JuLUiT-{UtNg9}VApUmni0zsM%}2~MbCmU%HO73%Xy~nVr@4LH$K0OoEAAg| z9<P#D#T&*bvCkWztv8sbY8<YSGd*i==A6u~S(CEO(A{tur>eKySYsBmc9?n0d){yE zC(ifLyODm8JdtR)Ok{B6gUHs%jmX2%RnbPyL1&PA)9vBS_5S9q&}POfMqaZeI<qf0 zFTP>ofuu$$Q*zD8T`n~)wRG;2DGQQEC4G>Xns_6jUE)89PbIBNI*`;jsTH!{I_`%+ zKYN1psX5YE<h~PqC!8zPI;V9`e5hi0Riv+T(JgQMW*jiyGX@(YjBkxv<~OEoHMjbp z74@yM))ljx*~4h(RdpY7&P1<7P3J<iDU2`}ZXGHV>J!QdZ3urI`8@gpZPncU-tFpD zH=@QYbC2nm4XrKKM7vwyNMLuMc;Kj2*&O6ecS4c0aKG@=;W^=7!^gw7k;-%72O{$# zM)dh;9s&c!@np6c3(RHKKD$8h-(c~$CUH;1HHdpZ_-)`LyQ6i~=<DTmk3`QzMn%R) zjzoG#^E*qNzV2POlvl(%;m&m{xSO1&&W>oU=x328k!#`Y;q&3fk)I-8M1OI9cE9l+ zG+r}4F`hJ<7|o5wMhm`uVr(~xn2XK2*56hk`?~dk)yB$W{bW`*cNmk5p2nki0o%L= z-f;I#XFXitWb^~)dG}v8&HdeN?;dtub&5ODXgFHg>Fum^`h#%HI&7w!N33@CNPCFg z!)|9cuzTC9ZIhZv2IC&LTiHYHDRvF}W$T3bf|<|!9Pj9g_pSG?_q<on``aDh-g4GD z_ng<=n%=8k3-7YK1MRxvUU%=i0nc$ib$@ZLM<0yNitG!=g-3@fhaL>I42=p+3JnSU z5qc;5S>$Lm+0Bjbv&VSDEN2a{9<t7uP0TLF3&?LPw}HFL9q08k3Y*WHtxN~`YGO_^ zcbOZ^*UbjzT_j?nG0*q~9A9p>vrbrLDDxP5t^Hu&^T5SGiD0|nwBVKCgt&t7^Wq;$ zD4$p%>0VOj<hscRk{(a`GjT#<gT&tw{)t}^Hz_zZ5FaQU7!|k`=pWo2%oEo(u4vrz z!Qp`hc7m11e9YMHP4QmBiyC2+H#5vM>w-Nma3>Ii({%`b7(5ef6gNF?eOx3iJ8pkm zpSb109f93;oc)zG$ZBF`o9)bJjJLd>K!X-;XZJJrk{jpM^#*t!dmFr+-c|3Sx7%Cl zjYdPSxcA&%UU4JAJa4{bZM5cCwXBcLtHw0r0sOf?y&+zjJK8Pco^`%<dO2~<i0JxA z7+%^rv?8ZYPLZ7AIc0LH=RA>fCnqaZ9z8AYtZ~jd`<;)S4o(%Pt}~IXVs3)Fp6`94 zuSKqgCx)+vMuxI-mgdaQIh!*xG(7x5WKy)h^8oGmC7xn_voI3UGf+3UFxWr1CvX8= ztzkW7t}&j#%l*gu$?NWw^MYP+?{V(~ZxeO&JI^xC>*<yCesn9luQ-#UZ%6(Nw+|<T zFN6+;wuHV3O+yAIgyw`!hiZpk3V$2E6|NQ;hJI~}q()zh-i|)$eD9>VL)~RaZ@d@h zZGlg1bLu(a=<4YF=rhrWqkZ^alIL3Jj`Z3a#lY=0;PxGBxP8X15U3P5YqtSWu9-8< z+2(a~m=$M_wZDbIJ#Uw>=UIv9c>yErhMii@^62#Fq3EN|-%cC%U3aGYl-tm)$oi#Q z#G6g@Wq>i&SYxD^@0g{n<yHy%C40Ml$G&QBw%@ZKwa;2ZtPAEyGi>ZLE*b&zS#yVZ z&%9=?G6$Ir&8lV%ma_bM)cAqxj5fYEikp9$ldU3@CVyZ;U`b$kV1D40K(|2kz!h}w z3;Siei(S=Du&-LbTH~xr)=BeybB_5f*xt#SY<*<Sv_@I2tdP0Q{M39I$*OFYG*is` z-2JF=!;p^D;-00<2e4>W%sOTzGq)Krem9mGpQ0-t8Jmnuql8)8tYDTiGmM{&cE*0M zvv&wxE{#-u>eO+zL_0*?$o|M5kyDYlXs77t=&R9D(e}|&(Gt<N(Xr9((K^mjr=`2i zt>L{xRN*gdTWjwvcNKV+FS;l)4%Ax|*%H|qIT?vY8gTxB=rc}^Gr~RWX1b2+x=CII zuew*qYm7~7<PG*FdJDWCyhYf|_TInf$PDLFbV>A!=*{RHry*x`^1dX#(TmzkFh`k7 z%%8x)abQ6XnE0OYg3-ZvkZ8)^-aPc9gVz!ydfa=+tLCM6dA#AwBs!H^8Hv@{X>Kwn zV<~46FB#;m;fYr|gPg~lHcnUPS)OUX6LKDMUv%fW>)h4ud+rdos+;0oc7AXsIsKg> z&OB$AbJr=v-ePW1q@<ZU&Ryf0+-;(FkSI&YyWk!0zV=plU!mLYaPI-EFM=KKdEa@< zDc^K&CCqb}ao?D3R=3iuN%l3nZD2-VU0`)!YM>~5tG#_6{_!51Zx1Nf-Yjp{GaoV^ zHcOjX#s=d}?5t&M^j`DYdQGUUXNlhgjIqW&<56>|>6%bf>o4;QbCx+B$)86pHN~gd zhV@ure2xt@%|ggaE^{wes%Y$^G+(2yj#tN+X`~q)%r$0t>nrO)q%&8bd*FwF6X*fH zod}w7r-SbXO9W>HJTxG~8f&Fdqp9XsM9fxt4`b67xi4U6%DIWu%RscpaVL8xy|P9( zu<LK5g}D-DwcN^Y_p`^_GwgTKo{#J`_BQ(;`+|MK{>7edSF`t9<E_%x8uM}Ux-p*k z)@9ISjkljCeArll6_{e?m?N!!VQwSsiS`HfO#3r?fxU?3MZ2>7r}eyb)_l_3WYjVC zfI!{6M?t0}FUP&?{^M?T$GY9!LhdeSmQ&x!jGm6}MUwxB-i<!sjBpk^H<9S!cy9Z! z((zsyuPSoX7AdXZ-FCOQYw`Iuf!lZ83+~VEt8RHL>c`G#XR`CHbH}Oajsn$}xu1X_ zPa_$-oo<fpd>0*t)|4R#eJAp3<kd)rNQFq*NUg{taDulZlOh8n{UcAZydC*FQXpDC z+C2JDv<1laX7tx+R`e-nfpf+w;6C8?0F#DbOMiBMbf>!Y-Am4DBykS9`jhjgbJE#F zDVme4I2fH9eK|S+jqMhl8a*6sK-qHB7T;3-o$h{0Zh_LZusqeNm47JlAo$_aTze92 z*Uhcz2Jt@fxv6eGTG4hx=xi~!CBN?Axr?AtPkUp%S6H9-#-M3K@#eaFUA->+Qpw9i z0y^>R_neE4>r`_;0K5BO-SQZ{!9Ld*V(vGqfMEYxrR-6({B64~sMkNxC(tNx-(CmP z2-sg*&8%DI0`qAQECJLiY!)}Gfntf~S>tQi-$>&FW3zD{ye|sEH84Av{lMAh(CH7& z@63PTbLFk3){|CmYoPTsT%r=vREhtOScBQFW}P=b0Ufs(6O2|y4Mv=(K<=`<(TFQA zHO_(&EzBX{{01`%S^dPiYn8VLA?;)MY=SjEYAvx|u|`-EtY?w5q1I@y_?;LcziAD# zdca6q!oE9k#3vm2mvz<3Ww*9F+b`Ik*k55acG|zfO@6TtVLjplxdM0j_L`mB9&g=; zT^%<DlDU{cT}G+z-R@R*y?YMc-URG8?v*p%Fjf<rkT>28e`TmS5p5W44#2N&PCYyX zPQ;mOjaPZHuy@4!0{QRbwV|yWdJnLaM-%dS3CQwpJd&OuUkJ3@>Kt))I-B8eOZk4; ziFa$eFS+xPl{;=hwC5>wsE%iQf4Kdzl?&kzLFZo7g#$Nn#yWGIEu4Sf3B!mDB&HC^ zJsc@Wck_D>A{T8adnr;cSKI^0?ri*!K5j4f5o~Kyw+YsLs`~@{G}{exw-fFPcY@p3 zt>L=PIp<dx>MvmJ1t+iD8_B=mmf?ESydS-DU_lMo@Pt@xBw)kp^5iA)R<7YAd~3|c z8VrIBKS6xEJIg~x8>6-HG*-Ny(cY*;<ot-Y-dpT_h}SY59{Z;E2LH!`(&J&UZ+f4C z(}zH4<tLOKR+d3|(1J#7khi<h2dtgK-A8lHwpg9YT(dst^qA3uyFP;?J;8C6iT+>m z)_OD1n0nMjil-D*$W8GQsgY{bY-_Kh_XxOIn>IOuy&2{<qW<nV|2S8`lMr=!$2kvI zJM8Sn`Yd<W(LN{H_M9^AL)6q)?rpc0H_}_>{X=P$;Z7iTdY0ud7WsQ`3EX8iR-z+q z@4DCAGw$Ei;vF~Y7WImHl|i@S*v1Un<`QcL`%Rc-8dp8TR*-YD++(!cUQln9`-}T4 zUc^3d<ZqTV?02%4-zz}b&x0%<(58jmEaw;;N@c$3q=Q@SXz#Vy`+6Y7QY5&%(H}cx zn)S`D=2K|+6J}$x2+Z~;YAw-N;Wa0AHs5XQCcDR+-$AaA!0A~a+k4I@$ihXZpxY72 zJ?IwpdchMu<{5Y5cV^N9tqra5q46<H;4OUH?%1`m_(IBDo+Q_?g}Z-(eI5&cf6bdf z+pj}EGRUvg=gyzNfX*BF(EOS3GS{qy{*JchSqstNRn{-odj2o5rsHWo1rtxSEGyIe z+x*Mi2n%_~eAOIdjxYzCuYf_L(8g!c$F4kAJ$P3mkgFWruLja-!@+FRLPO)tGDvJq zma=9sGuzl@tT(<g7QxIupe&!VzQ^}9)XFZjJqO&(4TEdVl}BRHzcYV<34RNTy=_i1 zUjz3hnN#`xwz&{S^f~KilxrzR%r!p-6DOLTz`Og{&eyQR)yM_iiuDXsKbds$q3X9< zgkBqupffYL^GxzWvyD}FR6C4g#!2HUd@=~qHsd<|c(M+ZyQmp5{xVh??;GQ|W=S%+ z2fX>{&ZBs?SKXi7kKMuUgKm<0!#P2#Wjk?h8TV0e;Y%bZH!}YgZ1Duy`exXLsXXs| zT5T%#ABYa+HTHUw(2xtr+lL_0X!m)RaqjDE{o&?9ny2G2UGpl!TE|d^o3va-IMN97 z1M^q&gc&kTnDK4%thw1-ZO)+1o~7iEz>-Uu`C+?18nf_~#~>vmjUiw{FZA_gq-P2> z|GRM=Zr;o6YraH%z5&8Mhc$Q{Ic<&1Hh^u`qRooJ9`n(fh0MZymcsikNt>SG%F~RF z)MNz4@;%t{n%Bc?hVDHGw;q8u{);D3lP4Z$yo1E;GR_&<MnSU#EW8kY?Dv%7F*4<= zkkdx^I~UyL?kw!?O!o_T%SCK&O*rQ3)ZA5iYuDpCuOjc8xXv%2-g;VW3GMb0Pcq3E zMoqQ{Bde0NEek^Fov*quqK7%Jh0&R3eir<if{g9NW4KHkhmo@oHCZ1k(iO(|fw=-3 zxXav*#omop>|}cZ`q9^HgESYxGT$(c8wZh*pN%h#w~e77Y;Gj$Ajmow&3u=V3Qb?8 z7UmHxI8Le62S9z<^rz9j{fur+qk+*7WUWKyIhS$V`-Zc6U^S|GxnXTV?>?AyotFRA zUFpujUc89++|qs6tpWothm<`AcbV^Q;Fyv`bYFpWZ}HA^FZKJaYSc1XQWFEH^BL66 zd(_#Z=s+5LcO@vWn6iCD%Pgh6wsBSfS#D0v&cstXj4WI=vW#1B;`4Y_Y4G){EEi$2 zyN%Ci!>6dze6-kM?>E@~`!J#&SW3q|>;8o$Tjef+tL+9$vxxXK#lxA;kqO4*#IN3_ z<>nb*P;;NeWbp;|R-x}o1V3dfW%<&Z<xNFqdd4ioBcR<-SivIhbA{(BLW@3vjp>Xf z>OgrPpiLW47TKSnJmcraT0GHn#J6lDt2{D#-`L9i26A4Kand`646VeDeoNMO1K&4z zyIA&vlo#poq5gx_sk3L0k7>x%GGj5=u?+t98~Pzcx(FherfVdbN!Z*9=tN@}NGFh? zE&gsD?pOlUD}$z#W4kqM<pK2bVan0MykXw5YT)s<3dSdIEwH0#R+0XNis#Fnnv%PG z?$p#VxvnJ*NLUm%BJObT)8IeBqw%?tS|$%j`7pUl;>5TXacxri6xfvipJ2u8nVD0( zTzS&VEv`DP(AE2`PtUmgfcH>=rA3P7OUtz>Z}-9*3(e2dD!G2*{P>l@260Q{&j+@9 zGa>_XdS~CxzL8Tm^j-FI*(D>pjm>68_}`3vnN>p_BUM9nh=D#49cw;}FE)=H+Mv+# zjEk9D!pEEv?nnnO!fbDx3Ju5{mp#;-ZNF__LVKRD%bJxUYjVB~kBrugZV3NL{AEk% znp426=B*61%2<7`N&0~7+|e}pkbD_VOW$zs$&8LUNuj<O58e6b_U!aAp^w5-bE27x zGv;RG%G#eZI(pWtV!r3S9SLP!%={!&6C2zj@_lB(dkfQ2?hnoWE*f#JhO*QDxwj`H zl#?B49PJvKpII*b!o45vRZg#;xiD*P)~$?k>4WcIx#!&7e)snMe%Y%clbzR`zD{+x zLnHHJGW>-D&pKtY=cQLnFP5<-<5v22_pYXGNSk-J!ToWWFNM3IT?@jMv(IK7%h?-x zBxiBvi1erL_f8*~btm*@WPNy3Xh1j;*&f{#o#o^*Hd`I-cg$R{qMBA}Fem=+giUcN zWKy=<uUKupH=>6l|3t^S^I<4&8b6u&0v+Nr689ucPP`UZBT&$KnFwm0V6phA@ulP2 z#LtLt9@oo$+c*Rd+~7WfbgGZ|CVbo(ZlCDd(7V}ZvP$Jl3^#DT^s<fpAkJ|w0ZaU< z@g+R+Q?q?wAyNNk_7b~M;0ya}lPG}GBHAn3+vx!ddD*yUF1FTM)yQ$B2jb#>h`*Is zGI>POx`ZY1>GAav$P@>&ZP)%QI3~VHycxG5cq*=2!lZ;T@fYI`$43$eru?4k=iE=F zc1iu3*!!B4P061owM<+R|7);m-~;=-{Y2nVqK@@~d4sp@GuAb0r@hjyZvAH5rjCZ; z+1Iq%7$16X8|$nZ!J_fg;~T`iWe1FxoCDEO?mTlT-IN9-1QIJG{+%!&A$LN}gr5^u zCcGGbD)?|P5NvFJ=(UVqjVyDQnZH<dtt~ut0@2co)&TsIMb>2W>}PYi^}5~C&NR1T z8FN|v11004!Ty1*R+uR7Su<>Iu_^_|1aAf(3N{V|0xJV=1P2Ev2HFPVxW@*2w(+qu zAZj}^++4;x=1F1zC9UShdZMsHiB~Uz3)TQ*KSYxI#CXc{V9{OjZ!bhX4)=&;Mc*P4 z@{Lm}x+^?6)F|iG>`B>qa(d_3In&938KJ94dKIz<6C*XrB}|Q!j;@Kez~lJR{oLyS z{<rb&J5M@=oL{4rq9gE;=S7x9FFJ?aA$XX-z<Ad<<B3@AiVlh%i{ylp!;gh7<*d)? z8k!Z}5Sc@C>W#?daCUf6WI%LnbW*fcw14#V=*Z~O=#6L^|HnmUha;h)1pM+u18Bo^ zJon;GljuG&mOXP)LVLoKqElel7oDas(B4j5ba{AA=$X(P;dRk0ceGIwyVxBrvA`^9 zWm>_&TY-Ca$m(SUttBx}br-SPm#jOcMdYTfP1F{w=<EINzJ=}H=B1hgt*!QLa#L>w z2L@jVP6{>+z7&{cKWv}2F9#L{mj?F-dfBI85q}v2%>cgSGgeLOw)s5_rUNXorg_wa zJ_fo5#s}^OP6ao{#l@$`^^SWa7`AU&?THh8Xl^xMz^@Kjr_C?%YNr}4&3Nk%{7=gs zWsNc$8@0V1ZgcNvW4YBmP&OC})DP6R^I4~iV_4fJ*p|19qULZj#kyz7I~`<Cw-%bm zV%9KhJZ1Lb_S><1gUlAzS>o((Te+;Mp#CItJ#4F%b<R3z9|;T%jtagUoFCl8GtLT( zw2N3*uu%1|NGr|#*5~%C_Cjkb)&P!b<=EANMdJ3wCB|QfD;H-4f3`1L8_=3Uc0s$O zU4dA@YU?%YGwVE&(nD69Rnq*(=mdY*ip2_h^|0<c;gVPIPJVG0y8YaA=Orh}IZiaE z46R!pUu86Y(Fmg=OlB#Jr6W(e5Bu2x=9p}Jk9XY3+XsKR<6Lv<xWBoN(LeBI^ro{> z)jNxiJ3snWbOmus+ZpaS<WXkg`_%H5VJTO0Zdo#W#fYH~CTh6RnMRJ{1YX4p)MOoe zy51aTai=M;?y1HfMk02xB_7XcBDR}hsZp|IBdl4(5K^tZWTE1T8;mBKm1I3<E~Q84 zpI%!d!TbT8-2)pt4^uwmeNKEd6>hT6XkZ>PJ6f+>&k=Wi0SkN{4mcWr^K-9+_m%r3 z5tuDbPp6VIg$Vvm_o%y+r)!6OzeW@?0}pCEPo3Y5IJH38K6v7fxzpVocOrKv=XE0A z*MxZJ31_{#!COK^#4<mGM_u$b!(Lu9?!qf38Ec6myoA5MkqFh-&L7Tt=PTzsJk-tj zYSo<G(T#NQYejru@&CN|6HawXGKxN=d5m9(ti4J8;R7P?=c7C5SF<mAm0aR1{N0ws zs+zgKJ1w1Z#AAPTO5qb1bng>y9S*PR>V1Z%v6J?{Np5}(9A_c1j&fkf2e7q}aS9gw zIb3B4e6J-QcwTDqTiDYBc;Jm_l?Gl#cx5fVH79Ph-z!0+;16QqMc^if;7%UbALg~f z3m${_vXtoFRA(kJh-&UGYDa!%H8d*^a@5bei9Cz}6=zZ3Nyxz`&NL8Z7SWK$>HYB| zwbO}TULmHQk6P+Ve0c~S?Rw_}j=b(X3YvcHzR#}(+`G;V_P@vzpN;N}?uzD67mpK@ zegVnq%l`qK+15#Pwnvvm*HKrAl&hHg5&n8xA|f4;w|Gjt1!mlbWhlPalVq7{qYtZ` zQC#&8qKV_8KM@VA<P3CPCeqo_8N(fqIJfcCUvzSjkKPbH8@)_aC&g(-tF5Q?e{h~5 zTa?Gi4I<ZYo?}mA_c^yNk?`4+>II%-A<G;vxtEjTd=h;+S~hwzGClH8#E4Xj{27@a zeaq>IO|Ay_ZA7#o!OJEBdzx5JGFxr&#itV0nnu)RqPGyv{w{pKulu1>k*if9pWd3! z>OA=(r0OH&@fN7QH=69UbNX@r_Cz}yIE^T6Yv(CvD3SRJ&erIZXzOUjXiD^A<S?C( zA170kNX@-UeJvqQy59MXm}x(!s&g#*R`j`OkLU<88Ox%DocD=(jRQk=yVbF7*XU{4 z7+>iLH1{`TYCF=^nU*hytc}Od+J$`eC&F-^$ih7qz3=7s)Xd>r8zw))IE{|Jgikt@ zoaKYW0$SpM)`JZXGT&uy1#=^e{}lI{hVO9}IqZ&C@FF@q48$03%)y_FC*S$Id6zuW z$=DJ$D-$`rZ1uBO*?-&T?3-kuZu9MXdyD<AeU!-Jx5UEx*&Xfjb}|vgiu^BQ-?R2u zJFS)0Qfsxfz<SsEl&Hpf>$a5_biKg-G2|x8fI(3*Tg}N-zQw+ut;OUX#$bV-;`1G% zm?6s}5_-Zq#b-ggIdS*tL`2)$`M63R`)PZzec1lXUSYpO=Bkxli5`>5_Fb&RF(SQ* zWR(|E&P+Sq{+*cr({?>O+d4xj=2-oR)ON&behG^yZFje4+52pVfW*yMEVwH9uN9zV zGnVGo!&YspkQJ~@vKvjT&Q^bxE@Z*#Sr1s{_{BAots+)+BEL^t9k5LYurZ^Fz@(Z% zV#lf2&=N#ZYGSK%lUX=n$kOgJ{xvf2_#2o#sO^`{7qMm^lQUUFEag+!)MoP-nZwiO zI^ryC;8*3y<_+SP4dx$Yo5$kMM2ON%L@qRjKsMvB$=j}jG`Psdb>b@;L8dyMqWrQi zK&FlOmB;ZQkK;$(Bd%i+|M{CJ%PC`>@j960;sO4Q5BxQL>}-6~mE=}8VM~^>E<sOb z6G`h!9H14pt3Pp)@3>D1yfu1zaOdWD_RkYX7-V#z6j@;9LM+vA*0=e#jBEW0ivP<0 z&75}`G}gG<r9eu(&8A+^mAOhYJjtGv`B|h~SDTBM6Cmc1VqPFp^McWpC(=7v8uy?) zz9+q;@IGr2_qa<`?JPDok*l=lDjJ9U9`7*R!n4#n3#r5;`Xl92k@A=DNBdxjpW?sz zqr6NsX$viK-H6~{UI*LP;3vP%Z{vx~|4S6CC|dL!`LL<9Q!m=1iTNmTx6$T!vp?F^ z+U#f!B-*9S;3}eEli?<c+EgG)BhUR3*WQ80un)xF!*(iOYfqwgZ^E!faJ|}QUL+$o zJRv{voYMHO)wn}#WJ9^Pj!4H`^DXYwiAYj6^m;aTS!-^=LSHd&Atn2XHf@gGdk69| z-<*J?H0279!x=wBV)h|NSIkT1IgUPSUW5S@L`n-;#jSYqXuFZPH+YtjJX?1ptppLF zKZz*40`in6l6itwTS#twx;Ki5d@t--W1<7EfSWhq8KtRbjU}^&xItgy$yL3=UTNaX z?b&*mSW+0={Tm+eH*wyO8(}?8T=rx4HTPw*J|AJPwqXAqHv#)t9c=D{bhW`+mLq3S zfhcitBE5yNqIFrD!f@Imf7QH_-aYcabBMn*CKi*6ywNc%&O&V9E7*uHop0EVIC<P! zMEmQIS*k{4zZH?22IL6Z6Ul8&e7GJ<Ww(Tz7cP;<jdL@dt60b5M1OyDJ_GyT2EC_X zS%*90hyzb@-eJ!?uKYci{ywPwhm!z%nandR$DS_38o!DC>j<Z*hsV&KSWzb|VHvLO z(DNq*)4ND~`Yw^=5=4)xQ>G$rN$hvn$zX4kSo=n2kMl1v%R-d-5t!0^_Zy-)%g8{? zW}U<OE}Z@iB6F|16Z!v^JA+<U!^tbQ=8koF&IibB^v3c}Cu)^IJH3eJZX}~{4js^& z9eQ`P1g)x8)BC!0u{9mgs=;X7i(vme<GcUqK?!1u6_Ccfrb%vN1NgCmc-sLi(r)7l zGMs66u*5L&scj(IN#b$WiC2Y)Rb>&aN@L$z5a)Z&S<AWG;I^xgsV}(08|Ysjmab@E zTY4BZB@+H1_){MQOEzwR4abO9oyWEnLA$%6wKIrTt>E0b#Dn&rN1M3r6t2*bbLzv1 z^oEMwpwOFXH^G2wAk1m9;dy!gqc+!W0!DRUd7AjL;@gX1YM&GJo=bm(*Lm)zK#UgP zkKS$8TR$56?KE+zRUqLE`o;8*@wf6sh94lR+MN7;Gqj)ySoj1vkj36!G{L4;n_^4* zQm#&Xt3YY)dPj*#&WHIvi{3oSnH9*dHHlrLDH2_dTu4!`pl2e@>Ga9T!}pT(!l}jj zILnhTm9cP?=h3?-(243^4VEJ0b4<@7qmx8#?6!N7eAyauI5SyhlVyGdIh;v`W(6{E z&P_xk+j8f+UOO_%%7~RCTUv?hJRH-fo|NoWBBdV^`CCq8ZaJ9$9Zx-s+*>s?FPVE4 zq}-J`zPmRWB-lkA2dS-A)PFC0w0>Bjm%+-hV1FOB+reO}fWPsy<$gSqz1|)${}()$ zANZ6_IY{J0*dd#xw{Z2wPkAhtW^>iMw?dR+u$&fL@g>^myV&vrEjNw!8V)kOVvIrp zCSVap5H0M;(lsV2!-<W~Awv2I%e>g}Gh%JNl=faqyU*o!#rsEr?-TfZ9e?5-IF>Br zYUJtww((F*nm1t;mmwodjOFC@7RJt+#Jz^|tTVXsBKB{?f~SJkjlk)OXi8C{)8*+A zQ!|F#mD!U*?}wXsEq?s=G?srKk<3jz&tmR70sGS#4Qz?TJc<=<i-bN&O%7n4fbDsm zI(>`C)qI{|4o~nI>k{%cKM*@#hc^9;R(#7dy^RbH<jlvY|G}(XiN?0V^Q}((mW?q2 zWuyL~-v7Y9FJfJc&%MjrLHitFJxnW|r60`(`oVmLER04bIw7Scyi|Ht#d%r0z@I{Y z(kkR|%OMLDVAai$&jCpGWTNd;SSDiW-yq{SmsZ}xvY)%HgG0<ik~(1zsv&u$y<$kC zdNw@7`Hi?kZT1yK$|TQs(E*q2AHc$P5c!USx!-edxmRNrMA^U{<fXTO{NKkS+^fm= z>_*D>yMGcN+QY9K+4`H~j=87U-p2NNj$KPUZ$CEZnrrbCCGi2(zoH~-6P~FWC25US zY3$WU!>VD2YEah7EQPrLeWLryQC?uZNjyD(?$jo)(gpwLDf%G{B-ii;T>3*8)0_Ae zuVN*KfC~M{KfFm~{%g3;YJBRG)bz0!vR#CeoCX>GWuMrIxKKQKT;)lsz?~ZLSq*7u zid;NGoAyN(-a=m1fw7m6xCAmlHmICI=Hw!5ZVy;{3mpE3-;csw{(!-61ADjd?I7&# zcnq_ZIrs|(c$A(7ca3XEWd@P-+{kD-n92iW1s?|QE8{U#MV?#2UmhV=(iXna9u88U zz4hR)H8`>++~PsLRVDiVK#Zx><J>-QhfXXl*jo@iC<wnKj7hBCrT1DCW|a)Ti5PKk zVvD|%8Dt3Z^Zynl+Dmy?$85zHJm*TZYav@J(Xb!*{E_cpA^-2939q8FL$L_GK<sX? z#TL|0D|Dw#OpBU;^%byfm1Cb}v2?{*^`@WRk-f@t8A(4ytzUyNYp>p>)O(Z~l^_k) ze4X}CmSVX#2R-PC<km)3@`AG=`k>rI5AuN0C5XUO1&=#`tg;6!Sz91O4<SPh*<T67 zEb8ULt4so`^CI8*`3%ytA_Hl@0|#>Gb&$oH!RIA>)1!FpKhhsz73+Ge{wg9%Kap+T zgB*v^Jt1&4B(fp*t%&62<GQ+XF8EOyvUAOl-Ma9mhbU2R?8P8r49}3o8HQfI%Jx8_ zLw(^^U6IS)*fZ(s`{c@Iq4DZ3wwNbgitc~G-r1Znn6sba={xg`-B~(w-Cq2Elq>Y$ z{QlI<KqP!D_ZW+ukLQYGkouST9K)U&Tv@reW!S%i_!Vi`M}MU9isX!{V703u->qX3 zE_=}&pHw|29t8oP0>j3`65axnzhU_rtX+TvECl-&fOWIL!#DYy32R@(-f!9eHCVk2 zg#Qsq+KWD%fq`5{&aZ>K=h(iCl>Lj2oJV6W^6LrqYR^d!{~W&_G>))+fUNTcG~)_> z(J{2;99x&rpi}tN(!30Eap_2`JcPT3flqRgWB-MbY(>{LbH+imZV%{uiX*Qh`8nvA zf%K=utb_C+%5P^lXER#)yYVa0v(>Px?^(o-zTi3Mvn~ef=OXdriF%F0;yi~Pd@+_e z?uTs{NG)|?k=(b#cJzeX^h6KZ^1mfqN8cJ!yEV`U%@U&V9yGR5F;J!o@w6JOI;suU zrzOX>;Y!`H<I3xG0CU=~wBq`0+25J}9cdx)s0WFAKFF18(q2tC;u-X?KX#`LS82jE zOLKjHt_97Lk%7LQMdO5g!oEX9&ko0yo!Fl3SfJIgfvwn!?~%O^kfI4l(P)-2d{@7i zH<8{q*!Mj9Uc{FiiDdRg?gk>m&mm=F@IprLIfb(q5<&b7IbHyJ`5HN1iFNxE3$&Hx zS0ZuW@VSLM{stHM4GyvyUi=&Te&N5LgWL{N`IDpnAw#>15{s)W=bFpWkM&$>8<Kno zgt!f})VsZU$60S}Ycv9R;2KX?C~_6{n9kFuu?ko8&ag%l(C8!ncr?N&F&<gxa&R4u zf*}U0k#RIDfX1~cLrXP@>4&U&KU#mJF&Ukhg5<vg;~LNQ2-wJAIMPTM&4)<K`yl2L zG~!F-XbIT)6YDy3<0qu-^Vrr(@N@~R;Ws$QZ^-O!tj1r+_P^+h7TZk6{90z1ZyE3w zart}n6}XBdXOnd;KxVZfo@q5c>#{UqsRQDd!giFxTS$QK(5oLmAd52`t`d(WC<imD zg}taif4a(?U7I5-vR7H$5Jv^*TWZB(B_?}ZBb9ey3|5Eh1kFrz?JAaQAEjMK*%y#a zf1Br>iZu{_68Gx?>luJ1h)q4tb|aRCU`!oqu?C+ST|_gZ-la`0v8bogC0g?sc37>y z6K1ppiCIHiuR(TJz=RhgmEy#|A`?4V&ft?=r9HEVMQbDxjmn`n;WaL$MrXW>T~S~9 zOIVn{xW2A_8hdku^>4OM^8a6C>;S*)K@aw^bq;Ae&h{bBImsTyF#cuFX)M%bc=k#5 zAK}>JNahY?@E0WcJIeI~CH$QK-|%e-%TIh?LG)%ZC0>B-lKxCUXGX)%UP5n%#&qZf z_Pv1)&ETkc^fmj6Bj<3v1#AhezharsZ(niURcPgUwB!#;aGbK-BL9CMxwesFjWnRK z<206uMn%%w@){FNGc>C%awEkh!Ge}xe2f3_+b2Pop~!JB)+cG9r(%fnELQvpaO4@b z2J(9^*5_zfG2c<J`_XK@%=RQ0|I`>Ko(dukWf{%#3g2Jia|Ak|bNj^D!C;Ob3Q9iB zwtC}r2cw3tH4Oah$1l%t{1Eg;+ap-Crw@1U{y$6=mdPt_4o0@XQmMa#qEbDPuznmR z%<Inedcn*Fv*)Q8^X|kkdRwL)=e9!*yYXum&gsRo_F}6m(y8a}%bA^7T7aKgIv~H& z?>-#ei6i?_;uk2*M0}E|$oUlTe+tVeJoLdF(T8KYbBB81ZGCKMaj--qCi~;fsdtNu zZ*>FY(Fh)rzq71|k;v1?&`#QND{{6OS^ACk-3<<_l~*I@t63J%SM4*_cd_4-vF4+| z*?zErXR-bLu>DWM0tSM?PlLP9vgnuRIp*0ITj&5kc!IoGSD3>S9Qh=l!@%l6Fpu7B z4`*u}Sp5o!Jrm9_1&%chiJXN*PG|oDq;3i5{R7gxm~X4W>EDt0-AJ~N<m-@1Vfk{7 zT*DKrru2G_^&Gbutx~U&J)EUy`h|UK(Bq99wTjQp==m0|y%9~)b06T?4b+VMApN4A zG+%M21(aw8R^>H5=fLadQL;s7#X_{~`xv9qc{{lJI_mQX*V#kO?q!kHkOkR?R_~?0 zPov9e^vO?0d+uN#G}eh`doYMh`ZGuRW9eu_kD^3oO4FJZX<11{59CVT?Qq&(y~f5P z4bzba{eK^Mc!z#G(^%%g6XwAfJ_q}?{0K%ai?L=g=M^CTcWkePW&DC)umjfd7aoBa z$Wd60qQ58D-U}Bwh|jQz$fxpH-@&RD;}_4tmMnscd>!+^70vmXtL(#eY~UVW@#|+~ z<KMv}{tWgtAFq3HjEjBEFFIE2MofMMdsW8wDD`Yg{RU4lji;D|{=SR`kLBAGo=z6- zJ)T$W?{%JER&EGK3`P3o>H8Yk8~u>KE57&y%cC*&*am%Vk58cfu=PQIah<B*P(|Vj zC9tR(X-Q*-X$)YEQK1nsXcXc-5nAU0mf#TU9@=kBj46DH9rzY0T0yJ-NL%|-_cgM& zIEIpM6WM+jG@Tq{D$|kX$@qV-!&zQuc^Rx7jjlY0#E%1s2f>-U#F(_ag+}-l4Tz{T zfnT@AcW4yzh&%C1CytTs42NO&<eXk;Rv*rOhCM^L+DLS5Y)m)bAcyrClKBx5`Z?Mn zd-XZr=f}9v0zTIv?TX@WL?d=1l}CBXTcCo*Ueb6Znma?$z)DD8Wvpabm|ZobP<_*@ zA&2#0eU)H*;_Hq1Ul-hI8^iO)$Y@(?U2IeQQCs4T?K!eNDAj@1>B7-%VxOJar&xV$ z5V94RRhdPj>S`=7jS*jp`&FTxDig7&%6+TE?xd@==PX(E$3fCA{8zk5h^iRJ)8Mdh ze+b-Y1oAThDH@MgFd3^b6=|A=9O-i=pW1$%ZyzG7AE7@VBem+Ws|etHBzz9Pe8iqv zNb;-5-b7??8rPl7Ri8&bUt)U-$15r`4(S|^U3!LlzZgSoG3O_E{ub0nYb37?t7@w} z&sBj>&DX6l-!$S%5>YXY)g%UT8k9JR#2o;IgdD<-Kaj%T+5c}0QxrMdhzzcxC0DSn zr;XL7i(t4v{f`N(j7jDK+J6~s{wb(6lVu$5|I9!h-v?cVuoID-iJ<MP$muvF_8t7Z z_gFvS3}M?mWJxiM_xWYk|BzW{P6P+Xu{{-O|A6h;{63ZQr{htM<G1mwFCmv=8LzST zb<Td9W8MQtKaSmD4(ENuT|VaXW9~79Bc^fu81!Qt=a1&Bx6zl0{GZ0LGq4Y{I8)X^ zkxA)}tW1A2U<?*yFy{=9ohx?pCOvxJ<*fHP?;Wo5My$+la^+X41+9us&ES}~sIz(0 z)weO$zXvvd1pM9suRBVOi;w+{b|^-pD8VsWNuxgb<1ERG5+g53yVgfPYVyBYj2$#X zL+aD+4}wBXk^45FQpXsp>4J1V4NeVas~fWNB)>j|6h95ND`KhbCLG<0?H=qOgiJrm z+8rh#zpFJ8)d6km$aSAUm+Ek2HOf$(r3Sjv0F9}N&X#7?3<?^nT60!t6ex{BD1MfL zZfQ)ta$un5K`l;ct8so^mg+o3-Pm)~<6AARR-5aV=9=|cE3u~`+AV2r6Jsl4Dy_hQ zn*83F(g+>uafJuCe=W)-i5Gs<rS#3wT>btqzcl8`!W8*B)u=^{JgD*f{4t3Ad7d<i zoO~%oWi&s4W~Y-Ebqmh@FAVesyk#HyvWGT1PV1aTZ;sGL$7#0{Ec^NP51MnBR^3HA z?!;UBjWf2RKWnl7TUq7L{eULv^J}C)vF>H8V$7c-8%y|<4t$G_&0~83va&43h1YWY z&zvVLT>-wXWba&#SRCU8I!;`AAzNbS%Aqd7hI|kHZlDy(dv3>~?4<PKAcv8*ZG0Z! zyGne7C)`E(Z}6-adFso2Ug!H=822fj@m!37%b&Q&6CGq*o`n3DQ#`ZYF%ZMMz~?nQ zhSMA+zrkPrjn$uGjJop0m~Sd3e~+zOc&+{%F#fn|Y4|o8xnCprsSPx?o5s@92vN$h zl;l%0iE8Y2&D)_-6(vu__@yi;r-)@k?C;|-i55E^8S`3S<Z~2=IR<>54!XVpo=$)T zDE9sah&vP3Fdc621^6p0UIuqq8T+rOj$$G|@av}>r#SsQ{6F!L`Rrd9<0jv5{1VuQ z;{A#feh7X~0J*1u*kj-hquH8737+G=&x7MbU=c&m%Ry*eU$m_|de(|^*Nrj$4lxGN z0PU)dbT>g_m6dM5Z}nr_4UpakdD_zaUIB?#d{J37jkj8f&s6F{zE5@PrV786<iAD? z);OvrzLUm;)65jvw1&pl)A*$tr_P@#P4%tuO!cP`#l#G=IZERLX47IBv|EV(8tYDD z^J#3nEPS#sEvXR~qeziP;k(0;xA}Gf`8ma%F2-_VN05d~F<Ci|934dN4k9mm(VoB1 z5JfknDeB|44qV*GxAn2ljmYpe_Wi=TjXmqogC)rKVx<04<bE-FvyeSYVj8ss`Co-r z{mj*T{;@2^s^_3LVkL`N=c6g#pl^%$+<=CzLMMJfS2n{`c5n|d@`G%xMr+hR{51UK z2-1HDNxsH2T;j<t@$8!EN%LxG)&tG?l+JgJz?VfWt8a`(h*SJG6TYnxIyGvj{8fLf zJB@s%QFrx*l}2XP%mPA9jp!?eSe91PSex>$gsGYzTBC_-o&b$pDevDO@mTGpF<LbS zn#Rf2sKCm%YF1`>$Qq|jBjzh^r07mj<VVpmu^vB4(G=-w1ah_qW!uB16#EzR>4Kf; zg+-8$sQ1bGVG|yU?Ry^IpihhiJ&9eBzdIOC(ichZi+n3CG!$unmUUvxiynzSj>78| zYZ(iR5uY9chw9CBeU{aYyZQ)Um$E5uDjw+b=W;xGQJz50CErDJmiRN_T0Fa=UH8G2 zyR?Ro>jv$U!S-qXD|&GZ2|EHVYXrF8!9wBj_iU{~!uB8?zr~RHr`Z4P{JN22Ht@NP z@7p-zC-78b$Nh;kY-ZWRukzwHAR9-Jl<lnYz!YWtllw^0_w)S#-%iE2)kQuJQ=)%j zJbx?SPqF?J!`?%jy`KB*<9d6LxXs-Ccm8kXx_@yM$=)HD*-?(u?`t`31NK86vt;}` zB>TG<8(W0!_zpez3d`{YvaL9h{ONCy__^rH+*q7N4Cxar&2;uke?EX0E#Ui?oc#r> zqM@=(@;c{ozBEPG_>%hCK-o4^*8P-Fc{b_sPSE}UB~`rXUrKq5=e$I%-$Flb{Lh+d ztW^ui(>Tu>Q&>?(jR0H`36(UK1JlZaTFMz#$8yWQi*qzU0%{-^jbp6j@fag-$}cTI z#7=CrMqXv_A4iHhA)P&AY(`NLMJhV8)fuc+bVFWRPp;A!Y3t0@JG0e}eeICwZfr^3 zA7x9-rxwS_nmiQqHuSb^GwxA~UlrMI%RSqn1Ks%Fo&R0AN^6#uEbUmD^I!4p&RnHc z?6>YQDSrkX=|^c4ZyL;ZMTmN#0evWKPxPfXXFSc-6c6glFT>G~G5r1%R^(}Z?Z@?c z!^Iwt>1eZ<)zDi_in=%Bxx|&4Q+Hzi;#u-NmEjih3u}bhiUn(KHUAC4dmz<q5G|ec zEUk7P={-mb$_rIA+K)|ch{>k<P8~o_*CYAT5yc<YfSQYtzU45KbumWsO-$ati=pfa zep!jke2<js*iFczB6{0moJ5Rf2dm;M(x!v_KaBh+R)07q>;EG4(j+17QDo~ZTW7H) zr#MQB`dNsLDPDOC1UQZ6-)HYlj>(K!DVL{H%+%)`!iPIN<$bQFkz$qk)F`tzV)CkU zZ*cTAKE=S#Al2t%-!Jgp#}pl@Yuu#Xl*P*chwgBddu(a!UX47f8S@lr$)KJ!ZoVRx z^1d`@fJO@yW-D%)0G?~K?W%mH(q0;S^TGe=KtuFF?6`WYT@?jvh%U4M5nCW%4QXZR zfPCRr{O^DiDkj($8R`lWD{3<gDH;g+K8p+qsh>mQ2D4`*>vJ(&euKTwAYVe{u^jUp z=scM1XZR*;?#Gs7PQBDRq8sw6m9vq3Xcd$2M%=#zC2WLd)S+yZW7Z@$PgEHR6zk51 z#ZnGbR!hArWVZ^&>O-Fz3t4kDgsIbvn6D$Yr?Hg%G5<B|vp<%uMs$@GRo@tmA02^j z+~!P4wLk8#KOVb$5Lvxa)MGwMp&5ph?a<hy!XJ%Rs}Vvqf@uj_M&pxfgjs)lb${G; zjpeF0_5AU6?^3o)NLCvE_2!-;Y0{YM?7hr#8d<%J1Re$v_aNJf#3>HA3EdHo_#N5) zjc>bIwxR{f<ov>~@~dTA#Lw5TCI4Ux>u;R1l~oA)C)eA}_528*EZ9LLav$=46tq2# z1}MgNhSI2X_o)}n<fsv#HHVHrx^93c(c9e0{P=U!6^VIQdP}<k^41uHZ4~pH8Y69W zVjkCnv2Rt`+koxH$YCAiO_{oOAY?b>;8CPNxj*@v!a2#s<48awju-j~iQ4nKV$LmN zh};R>QiioN=PL8skZY^wl~A@Z=hb6d_pi#`>VjP@Vv_X;*OML4F~V&f`4Hzc<H#12 zUJ<t@$b2_`(`OgBweF$Zq4I{E`L8}Lk0Hg6v8O*r4S<I~gFo;p^8Y$KL@|}uVxP|= z@z2NN@-M}7WHfs68tV(hZ^pr5UXMi!6@hsLZa*3xqxk)+{1;O9=c>cdz(HK4AKylR z;PSt_g6&UGzK3I4+cJjF>M5)GE{9G?QxqR8z<-TaFRrdJ@=L_@NAo;rrWcKpF0J@) zbnlzUA_K^>Ttz0OK{t@kOUUM3(C-$X>Y**PI~zk#;iIyGcaV=OeAhVC(k0DXs?ohQ zvxkYSc>I>eQ5yf+pVv(zSl>gYG^>L6tVZyaAK{NGE-yfDQ-`?jCCYFeY`jJ(R2Jpk zZ?LVLfINasN^&Ju=IcnYP+Pv_Y2;eI^8t9%zL@<{bbKd!_Mtu7`4kJ=g&zD7vqzga z^3T}1ll^<p5c#x!vL5G1aVh1oq#@GC1F`tZG3w+5_r5`G=-K`oTU=w4%QkB48qJy@ zjL_KK{_GLTifa7+qO?(QFr^Y2Q9XurzPvU@{v^%K_}>Z{ZAmLX$SOpXPxmnL-wX-u zNXx7LU+b7miaRLF&6sT*=VxIW$F9+wPmOn0H@4M+GsVLn<GeO#K`r*yW~q*Llt*$Z z!``bREsF9L=YKh{wlv2nj$az7$;YR%;hLF5XrR%!)vrw~TBG}Gz5y*7>00up*};6z zLJV8uLCaQY(QFDy+$F$X%_~`wPt6EYg)-#hn?{)yh897BHJd{|P*w6<if{5w%d*d( zD<Kd2HFJb~7tNZiT%A7(xnknVPKcq%a{BF{NI(|yb(>ZbN4ZY>Nve+g&pQ7@s~)3` z4<SX0RVb5rgqHscDG(xyqpySCZ-Fz*oBRQZ`iW%?dw+tjtdDV)<?R0n{<|KwqMYU` z*zb2>v3dq5GxZx-y_#!n2g`-+KgB#o-<J?W*OkR-g#3Gv!ee~y;!cW|h!e{`oI>^$ zHBxr<2Bj8zIfd@t#zVQn(}`J#ciiXcG;+N>$xQZ0lh5-hJ=e1<l5&dW66Ywhqm2Ju zev>zPiS2uQYLtDSd*A23d~U^RE^xJLY~AA;y4p2r_C8x0bzkG_JF$BS3xq0Zl;KkB zsFVCE1ju4bSG~<|4*%utr^iOb_h(sfc}GaIkQIx`TuItqb8O^}$ww)qR52RG3d<lT zl2G*ztc|=X4%iS)D2*0XV^1Tnu^rYxeb3tQ*$xd8noHZ-p%3bH(uO_F(Vebnk}{)@ za;$ovG>>UYbFNVzZK;J$)Z=RPxPB$p+LWL=GFlV8(On-vTjd2yld2=B(gMYnG#<P^ z@1J;w#$(s4P?}FkW9KUZqS5;0(dbXJi3;yR)QjeW(R@l8vs^PR`167OH(P^dLlCBl z-{?%)Yqhc%kmm8yTr--TL9^DVUzo;%_vf6~2qzln+@DLvj|eEDBXkPHw6R3Ya%l8@ z%{HX**)``$Zhq6;0@5lm0mUjZX>rY2pgALi>e4RBoN!TmSQ#2|ZLweZa$@0!W0I>p zqvD|ZL2Bi56f5}ytq{A}gS-og53pZeudr8g|0h>C%oWtXQ_TJ%*A~`GKNbHu6T8=0 zEPyZDm(l*aluq?4YbVR(&laK4<26%}+DLQo6-JhXJbomj5?hsMYk86n#@e`gtX=EV z&VHZ92l-YTd1{6{JcNV@YaixYL-1Cfo?^$fkvsL-(7tL&ZZV{_9@i;`<Wxqcnj$&! zM=NocN-RQR*@d!vD(Y5|wJL2=mT#JCSpQ42suxH#7G;=Jic);9!~S~gugR}sS}N%S zd`hmHbAK_bR>*sEev=M}@hciHZ&z%p4KgpT(*fO3v{U_%d%)PA=GR_q^@5S9pFj_M zfWB}e<*wubsBb_Q_DW|SVNvw|5p0btnC>TCRIhl|n`%NDs+?JM>a`(dmcCTu$rO8) zjnO<$ifd`MCs`BCiJ&}yxVU^D%_Sk8t{GS~YlYBBT;z5PO>Q6&8jIxy+ZXudHrt9I zo(JpYwaIt8&7yfg?z4zR+~O*-2Vx$YJHtk@#qa$+nhC>aNm=}=U*d_#sjsDGU#Q5j znj1@VwTSs^CQi*nD8{TA6*cRCY+Nz+Xr@uk_~p;0qd1x*PqST!Ve82>bBfBKnSr%e zoJl-Pv;K-9iTkLenk&U&>mu@gi$yj}eOk`PFkR?>opaM;l7E?}zQxux>cfvQW^pym zuPaT^b?<V&{M=jRQdZxeWmFMdMGa;3HItDtGh&r`bF&OvMPnAb8gipvz73JR`utaK zk;jmz+Tg2XO>)<o{~9@}JyOt$&nEoZf~!2lH$Nw%K6qk7K7VP7Y$#r%9#4|y2RW}< z>_~YI!ucBPk*?_|aVT*X`G|@?Dn?O``j#GRW-#?i^I3)7%+k9Rnq^J?on}SU%oM2{ zS)RS>#iluvG@GE9jF_~d-}0-ad74X7vCbmwDb0Sxp2V-^^C|PJxj-uNso7aoZ<=pa z^O}jP_^}g3X4St%?*xdUXjTlxR5c^BW@6RMDZWRqnFod7exyYVG9KB`Od*<$LkwQO zXCuL~u<EO&XtCl3V%y4{D4V2rN3Ma4C%{AD=1CA(k&*pusRz~;FjgL>kk^j|?gV$m zj@QFiw()-}zwM79@hZGZF&42PWpsD)?Fj!Bd)&*nLm;vu@B99DP30mFP=*7PK);?v zR)yD>ShJAOt4OQzK0bGl_THj=m-$6nn}g(MvdY^OqtmB2wLEFXz-56#93@0Bv83|g z1B?=;yux+P%Asa7JCyn{>Ma;~G|^aA;YRE{&Hj_dv3}0M<DOz7=h!E05rfiPLMrn) z%Bxa}1D)cV{$E1(u5wLzJhH;_ew1O-OydEtK>S}^NIw66R#I&!WcY7xL$L$NkK#01 z%d_}eAS+NAeNg1`LH^69Yrt>9cV$R@=A+-Mf&9gh_9`rj_DEZ5#qiYE1sz+BbBm)f zm61GI59NL}N0{bL6F*SoR2c#>d(9D}dC`P%Vq1zY3GpPUcX&o+A!PG4tBS0?<^j@d zPO3fSJjD&<4GED|Gq<S)NuW5VSfbdXIHqPJ(tp*Z{6is<yuGurwo_kQ^<&W-kN-#1 zeSq0nR%-*^eM%<Dq$eaH4G6u6a5x~MQtW^tMLeJ=h=5{4#R7<3L=*+F9041mqN1W6 z!J`xf6h#CT=?Nu;kYtkSyZ-Cm>&*3MuF353mA9<*tY?+?{jeHO%JD>-#N3g%ljn`Y zU#Lb7v;=ONb?b;RUeCkvd~}Q|pC4+rH^g1d4n)sqZt-D7;Mjqo_<mEgdMsM<bX@1@ zXz`}t754|LP%XJOB$Qtu-^42rnZGZj_;2w_j#l)Bp4}g8#s9QUz2rZ;ul^aju_iu| z@4Y{Ii`m~5pJDI(>Sy9OzP2$UgE%~H?CDXs945zJbb={*f{|wp!vaqR#aul77E&*d zA08FFo)xm=*|^I>GGHW&n$iZ_7KZ%bv2f9I=fu_)#c_N%QphWVjH-=xig)}%8TDmx z2eQjYTM{kGCpoero>*?&#VXYj=hJ4*b|=<?v)d3&_3+elT;Z4~8WeUXQpa9;5+6+T zq(2e3neqGlXzA*>|E}?OakR|Ois*s0cGwe5SQ%QgPqbEkQ~Xm#N=$0cu2tG2{;FYF z6<5LDA-3o2?H%_p1}mdydv<kirx-hVP`z9n81AWn{n6We{`JBbec$n5J^#v+5%c+M zq*uNUO7OTw<NZ_d7dneIW~_kZt80Wzuxw+@^>cCTmUuTD@6t2kr}=p*WJQ*HYka;b zr0||DQhC2IekZ%y!e4`|w4oB7f}CtCd?-&@r)!?mNaATzEn3UYsC(6JIBS<LPg!Gw zJpI+P$UFzpbLZ@AH!a3MHWxSZRBTUa;>F-FBA<=$-7=n<D3Q-#h2f>hr;UYlix+u@ z+eBy*WDrj>CM+24vMG+Cee_ZP{g3Mzv-R;?3d|Xc&yA#W^2u?~$(XSU^g$m<BDO3( z>?w`B74Zd;0_&3OJz@5((%d)XU!H&8nA_cBHunr};{ARh3-jW*-Qy^1TaC=~;{Vn0 z?nUv+USZY|Slxt$929>sBbmm%;*+Hz&nvq!?eEHvrJds!i=tgPhTQs&@org+p?oSy zD#U2pmkcvl5^^O{=Vxww(-TKv#h%QCPgdh@bK{tNo|$ay<}MOuZN6t$<&zKd33Fy0 ze()GYZb-8^Oy&V6aXWaTmJqsDqh<2Po({`u(fD2C&f241Tz+|V^nr&yGsbgyv};xO z+#Tcf^mvWEduo_^oqQ^qXL7=07RHm22fJ;`I$zJVvj&0WjfY;S0TxH}xmdY8h$q%r ziNNw;xoUwQ3+c#}8S=EMYcO3A3Ax+HLv!$Ap6cfK9gc5A;qe2$w~7OwJ`oyHk572X z#z@RU{F1ziI8Mghc<TCUv^;IGCq{t=88a0VbY*Gu6*qL0?=!#d>1gR+FOK7A4LQIr zJ^xdd(ku0{(9ToSW_QtN&p3{p7&Ujn8RX#oza+-i)6bIC%IdF*UtS5>GPZ0wp6My+ z^c@@RjbB`ZZ^Gvncfp9U0oUSHV!v}jlJ|=FCbMckAg##8?s0Dzi{bCl_3N-<6^~XX zWCfLKvP0sN)G&T0PuGf@gM$Ab5Z@dg$KoS+&aT~GxGn=k3)6>Q9oOeq@D62N(j(w| z>=tK=plTh)k6qJqPi*$AcWdD=8c$kedGh&>*oo&OlSxr3RTkJk`-R0|*w6!y@vM7K zMC3b;ghat566LvvB4yS`K=-xre=VfbryIL+qF%#ww!}3?x>73+OtZz_6L&Mx!&;j` zYlO{&XZG<+=$aW4p)eCHEKb6{cz$BL%X&%Z<MAmO#c)O5$TEGgQb()~r`ZsQJ|3-C zNkiJ7jk6vLKJskn2xdl)@UnGbJ^m6us;wRfW|C_?RMd#5KNEWPP>ct!+PV;T8jf%7 z?~cW2oIMnpcVB!Xf5ZdlhlsuK&}owAr&fYR=2N=|qpxz9wdftr;o0W(us2I%w#hf{ zK}S6EaG#jv#a+Z^dqj(I65M1kBymYx8LwC#Qej<;rw^`*E0TYRMNZVJ@cBfpNx5fw zvvu1-Hd-;7@Q_!}w}^$hG1Aimh43uCg=b{uQ{1sITn6Wdk79ZKaWA;ccV>$`O*f-# zo@WW`MeeHcEuW4SvXtT*>?moqW*ifd#g%28ib7#M;_-WTd%Z`zgCR>pBUZ<#;2!wW zinzMJ3*&Ro1YR0H;t;(tHoL_SmIs-!dp1TJjVdP7j`_*@UH*>9BP6!UOa7T}gioxC z-iiy*nFoV;KuFJ8l>>P=<`zGJr1CW4=dy~=g*HrtM6B;h23gA};FEDjEE?n98n3p8 zmNdIpu!eOa&T~(gyE%@)57_%B;=5L~Xj@$W@p#Qf)ME4}!=BOg$&f0uf`{<F=mbt< zt(rN-2yhoR1UupHiAeH9_;zBFxc>do6CSGX{u$n^EPx0(Nul{0;{K0DkMIzAeH_JJ zpAUtGtnKQRNT-!4cgETOj8C>je=}?Lbc{%PyVgmIOFbB8K^6KY<G?<tb4;IUP4tt6 z8jt%K&u!6vu`vEjC-z%j8vPO-Umh5#B70S6&a#-*RUzLi0*kSD*>e2MbHZ6Dm@C#H ziY`kC*YO|B<$#bE&zzPM+BeQ3$t)S|oE>r`^1UjqH9xNWy!hd5t_&M+U>Cm+iX%ku z_?_&+@@Rqmyj5HEgaop7?q?@4SLQM75?9JS6KM4Qq30qsE4zQiN(VzLR>#$LjZei* zR>WNojd!fo(ym9mL-$)=^3L6MtPW<Tiq}54&yPsdk#RNgBDvwc;_vR!n&r`M7S}GX zhs0Hv$JruC>>4|>JldJ9-MOnLkY=Z@UU>%hoH%A>Xb*2m9*RxO$n4UPN7y1K1?4>f z){1~y$YL$-%ZCsRl!+p_V(-Ox{*T>!JRO%*VzDzqTDQixo`fw92z&bD&V6w;5d_+8 zE@wn5S4Vpw!Y*+~S+X6vvmlBucLqs4>wH?Y$hu5OqFR{`cwoF+6lZw7L(JDc@w0z? zw`cTUrKmos`Z1bh!-yUl$E@mFdHW&n)IClfQ3O{U+RnK<#XD;uj3jy3KaN*ZYc~v> zM7^yltvNBOQ?YD06Im2?UX91}_`5Pbfn5ALb*Wb4^4aFZ-(BJ=JIAc4<=Z9hvU7Z^ zI$OjobBW}7#~3xeGb;3AVccO!T-|-Ke>LL!#jlEPb?74X2X(K2-H2%BY7Uu9zt*+V zI!}R@@liq87uVh^KARtB@F{kSYh?tUJna=Dc4&NtFOd=~j|AEagatE?7|TFh!IkEB z?`V!ay<PPWzsXaf*96+YAQ?6|gl%kyPsLQku?t~WM+05t<mBhsY-pzD!@dlvI%N1@ z+cSYUj=8IgV9;rOTuD`v=rGPKqyKdLJ`%rJvui_ml>m6NcJKh9C(l-Hr4h%fXd$ne zm6vzj5_gAr;u;&{E~0CX#I+xZPoIm{KGBVUz&<&}XX4C<yRV*&BUC<$SUwgJMAhX` z7b?qrLTFigEQMuxFrqJ+^IzM&yUZv&e<qH5EWT&uV5lFXq}SS|-UdTrJ7{GhE^pa* zusp56WQ>JBhMTD!UlcNon}`yVd}wFB`GzY(ru=<jc!w{H&*TRaWv#P#Nl4iKT`42g zxn3bNLvU$%Tv>!&6oQ9GE9?LPl~vs>jU!ffWms*;vXF4T2tBXHF?87zs`>Qdq;~tA zj6TUsV3ROren=JHjz`{(=#h$qzL-h*NNkv2#?!|$S<g~jK^}mI!*lG3yF){J6IJ4R z*bLT!$#`9jWBCayqL*}e|LD;`^dD#EAM%L@<9wC&Vo73BkYGtjKD@+HR2!>k<}J;R zBbLW!#b})!7jVvY;3f9f4!q<i%4Nu4RO9(Jth+r(WOv59ayc4Or$*8IV*I%ql4#?D z@mWSm#M&MWDX@}kD2`BzCz@{chMH_%q0iOg@dbDX*wDsk0Z$PlTo>1O9xjSyt7;LM z91Sm4O+CLug+gM8$P#~DH3N*3H->!dpvap@7(W1`gqpb8?3ihBf_dFBUldnb6{DsS z0&`R&E)uS7eepku7CYq2${bC`mGoU~3F95?+8a-wPp=5xU>inBk7d6g3tlDWo4v;l zw?*Gz05(QC%s@5H?nKYE);h#uw27SYJLiWCK)a0k;SXXmtK#oq^qgJLXW7>sVz%{M zJ+IZ*7`zyQsEz6~vY{ScUAj+-aV`{PQ+U5tutQfY-Fp%^5I+l}b)w0lz%xU(tq7?{ zG*Way97(V6MA3UuGcjrT2U>#_7eiarFJw;LiV`tCsA1(RtB+yEO}g_n8CP&6@~XaX zdyJj77UO$tT8)s|;%%_)_$k}3zjLCER<H06^-Gk9*OayC*gbrx#y5WCLTCa>**WwC zZ;{tu(Y+FF7eST1H};-$FFr>5W%YTPw5%G};3=u|$Fk)h3vmvvY^<lpD>Z<yq%T@W z`&cFN(hj+QGRDPsqSRvMY=GT6WptkE_K}xGTS>3EVbN3#i|yHWBC{eR;UAhAdZcE` zlitZDAFLE-kYKaN2hF=ok9WAGRr*$y*p&inf@z*MFQTayNghG|n7{2FM#G(D(=cJ& zsV~MpW6!<aF;l?__n{lCv95yG#@iU|_FT4Byh<dX689>{xXCT#ljr&VEMzM_AvusH zIuvIoTEQ~^`10f+|JQ$PPcEe|uxLxn01uU9$(cBApnDbV$jk=$!v@K;)eN$R1JO60 zC$>U@Fz){NWO>Mmm47mjSxw`K_IhO8JoP4Pi}j)>&Yl-Xio#Xne``P-W#&6E-|c7@ z6p;NQ%X*8~Zi*Qik5B3$0~_KyvLMF;Im{8%7027uMIJGWZC#tq%aOUBii~fJ*Rq@P zcD%{0!C}-mZHV_|7W%sq@2?S`h{2cRXMVJ#8MY1P>L;||;j`WRV)X+!uc!}B2Q{FC zYGUIc-kC8rE3ENFnTX!#wJ10btP;J<%IkS?FQW_XWhYs{{A<p(#_X|B@>`wg$F}GN z`OS!u$Ozsh_Kgi?K8)9mamk&jVSqH=55+jrFnHAyGAHIw28_b?u1;=`v6dAkAL3eR zkE_uGt98w`9EDe6TY4_5!@F7Xe<Q(H%)HU^7?mZ#KScfPZ?s$dzdAn4iYt1O-s7@( zB`=UQ&I`NfO~=?QaY*=VoO|MKE4rgcGwECA-bFO$bmdcJVP+narQjQE*+85Nzr;zz z`EgA%Sc=~0p)0t<jQE~byYEy6Q{^CD4fO`1&-@_QlD8R%-l!VP{QRnD506f7GFv7l zH`pD89pe*G7~a<IF(!ONR$DDPG+q+-#N7S*oK(SAdH-ykqew<GFg~pneUx<(t-urX zM3g<Ny<n}1|1BXQTjFmmumY-LH>@q$6OX`frZ6Yhi^-#sr;*SuOk6Bblwc(KE<X;* zRErhkbNEYwXp@`+y>5mM!4F3oBXQ)O_{%o39CAf7<9quWnvbl1R~M!y@YQ@dM&&2X zbA`0kg*d9WJ0peoOeLJ7VKbZ+b7L`aR~9OF4}$0Jj*S^Fxg-(LfoLz3OkEUzbsk%x zN5#+&6*cmWqCWB=u00r67yGk%jbw;|;bRNpQ+*L*;5(~5HRrj11>9$M*-BL}qTzC( z<N;?9h4$n-D~@Ky-@W41^7xhY*(biY?v9pa=7-&05!y62zR&8{C0#rgb635M#k-bo z7sPQ{MS>Z^Z?WJd@ro9+Y?+_I0|%oWER~#qte0OEDPEC#>mz6uOxz**XMQkj`X@%Z zAX>jLzNJTcoQOfcGUquhz7@HlBe=wZxSpAFpZ@qEP3#D}!4?^HtUax$nWMFAzbl!i zTKt7gK9Lpnzibrlg9Q!68U67Z^5PpZ%4{5u21jSz>s_=HS;hhM20}pTdN5OXfc1&t z;_l_ZX1hygzLZ8`BDe+qMW1k9*(X(ta=3UQtW68Yiq8nynuw!uIQPLO?BA@;vKsxh zzTT+wmW+KX+AIQ;(S108NsvI2z`C$MOJjxxx>Ca<AZH>+Sn=X`w`0hG7=$R7?{<pU zP-tfS6>)Qw<?)kw^1k@qxQdR`$SEt{7w5<*q{YJ+j6LoEd5Up=GmjI|*{lYEU(kTA zSoPsOM#!TS*MkT&j|^cZ_<<~iI4s?jYnJy{nZP!+Vw^|~6l5pl_OW}_01%kH5cz=& z`3Wm!tnhi(iC3FZa9I)3i0xo|i@NvIkJMF?POF`%k6zOm@=7|5Ft0Tw*0*wvs{ee( zjzeL18xI2w94>`DCk^7$>I-GI?VhzgB()HJf+HNw!plv|R?3rLfLR?wPH=19qhnnQ z&b!a%z$=_Voeh6W#C^&`uogNiA9)_hmmy^_+Drz0W=!Zm9>&6BJhHatfj;x()CH%v z0Y@QvEAAq@q3W9jkqZ>@;lCy$QE4OIWA_NWPS0{jrtvO=+a9b8PkB80|6IgVa`hWl zqk7yYINUSwt!&V6yizC5>vUCqIzG5QzEO3a)r~zNGh#<7(cMe@$r&;>Y?jIrz8F?O zD)q@KFIEGR`yBF^W%5ho<<aprJs%G#WE*jByV&tB$Ps*S9Wy);_cnLp2v(akq90np zuJZlVJ!#uW_&?Upu+uUjn48>yC>l>?V|<b;4a~PV8{ZihWZQjWp91+7NR+WXE8=A- zw!|GUN3+42i?XqLFvVU!*nWCUY@Z&H16~TLH^0f+_1Q>3UHqL##M<KkYB%WZL`3w| zgJ&HJ4wW$@u_4$F16b?rU0l_g%#xC4zi^d3#x*jNBum4KhO;Eu|G27qLu7N0y^t*V z9<w1AB(v^ZHX~V^8K&1}5VjV(T5RUib4+UnBUml`P1||2B6QONS8_D)Ijf-tVl2c| zvJS4+#R<~n4(y$CAx%c>lQFU{nX!c6{8PUwWYt0#e-V86huQE>NMAcfbyoMtvFJ-) zf#&K_N+kOTeN+3z>fOc68B1AV9C%7f&7Z6CYRoSih+Vs4?qFx;SZLRGELOE3{)YtR z?l?d_89*^-<AXC`N@C}tG8hreWeL~;RvKS5Dv77;tWRddk5R$}NnHM~+LdH#hjVhD zb`iaWaRfeubF*Hm88DlS^pGI>Y!0B3{_}=gVRO}B<8azT#^JO1caQWSGXBU0i!Z5& z!{%55(J|+UgskYkGP^PiGR)e9oAGpw2OH#<q=@t8S|~oDV;6UOh6S;|{2bq;kHWUF zWwS!+X{b3O1ICQ*INv=mv}*TyDi*{aWRh7WIa|>S(v;(~B&2~v)`R_u+3JUD;x+8D z<9TyxYm8PiB+&V|6x(jxe9Oi`fAT|WFl9*LDAFR%DMEk|^Q@+Kd53W`8l*%ei@CI` z1U=*7iCmg>Y(wkil+}uhP0Ee&A+2=7UF1BBfUNzp;41UNrxev5?D7^diClNV%EK=i zBj1q?I*h5aar2|a*r&?0WKnnmOUTC)2{Q{>kz{O)J|;+7NhY~e`<~3kIe4*{t+CM4 zc`=Uu_Q&U#jvT5Onz=QDS!dZ7ukbkNLKE>BJ{&1u95aHu;dRDlLHvl3I|lDI8h-f> z`~V}WmP+*3F^jsb)GvHo%--GTN_sH7t*q3Ag&7qRFH8^2Y(oQ>&A#g!T*r3%g2SW* zWD{jKGLFOUv7xH?;JM0LHL_SaStBd7lT7ifti6zvobt|-OJpp|?6Edvf~@k^XrUF- znVHOpwNJ#TRAAzRvt!)om3S3DOmtWk+0yP6oU3AbMVw_;RI6d4GOi@vr+p#qEIJ*5 zA`sn3=!f_mJKqV-q&GhAgjQK)uif|+Pk16M5uV^kNSyvGFPS76BeIj+VL^P0Px7$g zj{B0G^m*`pnr`gHUes{OD9Uk=vPIo-Qgtd$2M1}HZ>(w8e|EYz&R7_KAuXxQm0Qpj zOZVO4I9}WQVB*P&tt;^TlISNaWtZqJj$l;uI{hS(vs~d#ns`}Qs%Ryj1{RS3K701e z$mIwbQRu-oswH7pS+IJHBWdi3`J=OBeL>(Y4Y0;S%!Gd{29ptyL}YqqmL135kPdps zqWcB{(GQ>O7$d?rkT*)L6@f9jGPO9bu_3*@UvXmd!)}Op8ed$3Pm;Egx56id+qei0 zDH|d#3tib*u?PGZZ^Bh@7_mp36sOM$cx)Yqac#b(|9zAB#ZH`00*xyV5~s^5_koxP z(g>x=8?D8}%fSlit{srPV%bUTP%uYaG*?{nR58h+V56njlh1BU*r<wOIa}+v<&0H= zZRlRx>O46wk##XjEZoWqD=_4UpABv*Pn`8AR+T;&pUN$(k+BDtT<yj#|CLi+8^5Yw zRLH2z^#8x($KGFg&0H_7ZccW<>QUKhIq9r+-w-)pS6Ux!;V)>DI^lJ3jjR{uE2v;o z8N?fF#2sbBjRkK?q*Psz{gilNBF7jeF7B_IE;(K?V^yTqtE(iH1Ku3(_<B}u$N+io zDE!s>DYe!<x8guM<b*_Lvwn(o-q3C7*0?KQD6`7$E04S(uIdQ+`do!*rYB=$j6YAn zGoSc_WJ*<@8bbLLUQ))+pN-e@klHPiZf%P!3=f5@h<&Igk;Sqr7dghVt(O?<qBhQ2 zj9Nk#LL`M3U__lwF6p|;Z|BK7^oRT!llUT})A4Xs=GR|(Kx^QSHn}PmOoxn`wp0Q| z_%FB#{VB#-+GG`g)~KGuZPHTkH00NKt+=4}$OYyOGqRg_i))Bkx+W&#NM51(N;cmo z7#GW+MIrz&&vRLFXAWoKdblITg%?0O*~ta*9c#kgLno{EAPk=8JD7t@&WST%GHwF* zcoxpbfiPyV;Dv#6^1s$uz%ATI?wmaod4cs<3>GQwz&F7$*cI$jB_NKA)8Ydeg~Mg_ z4%?j`=q9(7mEr0o)v6>55s%KjQe@w)^jAHgDra#-Chc>$W1zC?0#zw{#E&(2D#Fw> z?AZM)2Ve&cbyv%yDrUE+nNksC<)$O8zEee`Hh!P@T$PJT9nnu!HO_Z6wG8Ta)QqW1 zR9i1Ql{>58>(JUriB}mvYmK!YS27RD1lc$IKCL_{$UXnqCvw3%N-v2u#t$5c{j%g_ z7gl4%j)dya-3Xc|NX~kspA4sY+U{a*WE9g6rZ?%exB~wqbCoirqSgFd(l5FpMr1XU zco4kKDt5Rarl5w92C9_xiM@$nw0#q?G8TY-LT52aN3DzRWY1JfstZzW3m+jP3~_&W z*a*+bjt4TfMuoP~Ym%lXv{|+nJFtV3j13=Obz8DoaXUWTyqHh5Z)8|?f*KFjIoIK2 zR9qbknIP#{|B8?owJ#*j8cJMuNzD6>-5*yng8lKGXeS<yQPK*LJhD#;=wY@+#FDn~ zp=h@%0y>HpWY#9DXRuNcQA~j+%SUk~dZbQ3Wt%=?sM^5mwVqO*2d|=e^gksqB@H(t zcZnm|3Wk!Xz^le*uu_q2XS(mA7<*jC>-2gsV!w_hSvZVc4sbkG3(!hLU4O`1D`eEW z`O&(ZFGwi2i=)fj=V}~?O2Wk=cz`ko`s+Q9LClxG0JF`eaZl!&yGX+uNCAm_Yqv)_ zs?tpb@viZmdGvQt{A7&}OjG%1rMf7#5r-%X0}I5XRYuw;RRt4-Q3q&6?XH0a&axs6 zM%eAuJ7dTX-zlz>><z0|(I7HG_EdBjOO>s;CQF;3@$&y`1<5n|i=(fkm^|l7Abi_h za8Z5CYHPl&5rN}IEG2-AnHERqiWe0u<i^<X#`$P`F`gXX)TpJrupd*E6)YHzHy*6m zxSN^Lm?b|fCw|9o&_{nULDrl$i-GaRamF~bJF^+jw3Z8RhfJ&-YstS+pP?!PqTz<q z!XD$2d^kr~;ljrkxARY|4j<JH_sey*V&0GnCxlWei1J8zYB4)V0z1XDAPSc2nlf&Q zGUCV?i_Cjw6^XhXs0&HOb$F4ofzBlJ_=XtAMEq)DuAvh#lxfGNv{U3<<+art>9^&& zTZpUrNnC7Zc({6`=0fB-*Wt>XTWzPpQ4Ioi=ato-7@U#W)a|iVcFycXe;lFu0K1ZJ zH6GY#u7bc|pXlPP6%p#v*Ti>rE5dfC_@C7knaRh4H^=W#{I8BuZKt*U>*J~_An+wT z6Q4J0tOo0mb0OnvZ6NO~eGd6h43(8|w`7iHT&&FensXB6Y8lfOW5f7zHzv^m_u*Zb zOCAkx#uZgi<hAfh$B2`w+E68jWAgK~$M~cViLaHrJS?p;TZmzkdH2QB+zF1`yA;o2 zp;Tt@Tt!cyC49jF@HQDR)q!FN*c6*WixUT|Ale~NL{3(<vUQza`CT2y%EPi{d&N;Q zsrCuLL+sZsXS*P-1npQe-X#2z&z0r3-=RFL_cH(a94;{nmC0GJM&6(#PRJkS(TWK8 z75TtNA;);=2?SG*gr)K-)3byQEShm}h8UYyGC?q%J@DHTbAxqzEf>dfVZyjj#=Y?z zekvOy%EwO^-GTo&wwR3-!?N{QtGt<5ny9TawLzR&B+)(1E2I$zNp_5#W8Rrln&Rl` z{o<mk2XJ|@Z!1v67@R>)AeVXtnJ_$FTna;>Q6ewyrk<Fbs2_tw{efaMIW7^`)mMB4 z#}n7i9+FD4kfVe{!ehK5k(o7D=hhpaCbP$;9q<2)&cS^gQ;rZb&q$+Ok}4sQLVQ0x z0-W9T*>QGXWRFEG#@R;Ixj3pj$f}D%vFm13OT?$Lnnhk4o5|V<Ttel9S<f04a>Is@ z8cf#JlmD1+72@`;p+RPk6sQN78**KZ`(j2I7pY#^J<2W?X-C~vE)|FIzjI|=Md!sE zeJ=OG+G+#Vga4_PA?fqt-r}s}Co6-o3&)U65hjs8Jd<~ARh_FOrxxu{3o8=E2gGgR zzuATRkN~?g%RcAV;pAjWZ3=xN={O9ZQOs5=#HLtd^^f|jeR_h$VSv_>;EHTLzk{wi z9(NIkO<rJihe%WQ6VJ_9vltfa*)e)=Co=MYuRx7tomO7(?wmU>M%=muI}6#tOw>#C zTiu9N8pbu(C6J%o)n`te1Nm^mjBH_2YDO?AwQ2fe?9Ge2_zof_n{ii1kZasi?m}&( zRr9<tNGc}nJFCHRU8+4?tVzgtx_092dL+_@w_EoQgRyZOO-viZ=W&uY)!WvjBt!CK zHoM#y9kOF4%oHg%4qjouvIG1&<4)q$k7Ht_**RuY1p{<j5}%R(DXx#X(J;);`E($w z_vEVRfBwQ^T-doOuPH6`EHS}(GEuxgSS$C*k9HOonQ;KR0B^Gn0d}%qGJlSzmk`Ij zdF-l5Suu0LuZKDG24<v0^2OCwsq`>cWY(DC)3_<yMemKR?~P6FE`xW{O>?f|&AAz$ zPz&KaR}$rLp7SAvds`($78b{S)vf6TUALMhGk7!tCTKGq$5_dmD`yYIk8w7iItShu z%fYxt?rS4HZ=T4vYC3(<Dj5?aMNUW!Jk_3*ck-j(dLt@Bx5$f8)JxtNe6#O79Ebbj z>iSMA_%b4>a1bVn_rTw&tThC{=gk@)DD$OkEbC|OB-}UaY_wVQ95fjvXSxo4BoZ|k zD8vK6Ls_Y6e4pMTrf<%8X+DAeIeQtAhkaVh(q<b;VAi6s7}z||jfGFo#Q2ar5}o#0 zAB-W1Gos>1=8O;H8x}5gNdAuBXtv;~<3zRLq!p=T+`4s)TjUHU6SL!gcqh8eM&q8? zrV0`H6ZH{Z<<1V|fo}0O)bBxKBP`;VnGg2ge6f`@kc}`>c}HyB-PM$vjf_cP7Z`=( zMdmO@Ger)Jka`9E!&XETYtb)fH>0A}3SNE`wtyqsH2`~6)9xDlES%Z(u?m$HxCVR0 zixQu~!tIKMwTlJwE$n<Fc8p<*)~J&a(YGdCJYF>ihDSOu=b7EBTZNsG)7*cLe`0q7 zl9V;}nQhP-?ZN<fcj8j|$J#?BBat2{yAEq|KL-2;w=?pP2uI6)nse>I>6~jGRLA&M z)R$ew?6k-g?5IG-MWU@USLLE-7#pt7i?Y`e?q+p7Z-Q5mj1Gs}7H8{It`x!M_^vsg zR^?_Di233<Sex=(wAyZkp1`M0I_HI_WiEL^d=5;({HgR-JtF$8%9#wp0RErxB)Mwx zv{%H-@#ZLZL{!J8{z+d{a9LBEQUCO~#v)f?w-(VeQFs+co1#b7#M|{pC6l%CG8T5F zT^FD6gT&md4dx@t3*f9G`J(;WYqtqG7&YBS)VQ|dNP9k~l*w%HxqRcku9bdf#_vT2 z`PV$roC7gMJX!^$`Wb60c*yQSVvVf~K}x17Ss7x_k*CYNGvg`8WZY=8eX!iq^;O%e zdQ#Ej7&X{DdsXZ_eY)wWc6ZJ*7nWF<D_g8|fzBDvp9mkH{|P5$(UQNa(vmrVl~$z4 z6tX&)3r5YZu$Cfo7_7ZR)bip=Y?+LooltN(mK5hu`v?iedf+*ZwsTw~D}3!8#Kz!% zR@dWPSe|&$R2~tM=Gs$Nl$*745bgn0MfG`_S}BT|>_~g@DJxK+bXMbvg<(0Oi#V5O zrns~G=fdbS3niY<cEWPj0@AxvUtCSU64$4!xY4j$SB0;AIB^5k3=0;wQlHFsQ|kut zF&ethuV$HHi~FeaWfx?OVXL|abqBaF9N+=?R3;KP&WI#D&*-7}fJhYtp=svY-R=Bo zE^&V-E|%*XJ|1+#;`yyGNE8Vcix!E!WBMWi>YUWaXG~0N%c`Wz=HUCZ8Q!rp+T|D1 zr{Q8o^q#kzv3MS(R*`jhN(1;9&?OPrE9-}{-pZ_GjggUaHhWHr%}!7BRt6dKfXOM} z_+M5Xkpt|MoyM>;r=$LiRIt?KL{HVrd&kndR(kH<yN~z1aaHGM{T*LD`5&f{(KB9> zDle#NuUC<9XQ@?G5zThO1T$p(R4W?;zP+kw^ObsOf0SIEu8-!3tl$J@jJ+fW8MiTx z;s{w^MzY)oQ^wK7X4od}wjP3}SWiT6?V5<y=%fDeH`zB5X2dcQO`35fbr|#(19!Eo zV4NK-N&Ud|%vO4tVqj*_8Dt6aTdT;AWL=YixF#t{*~$H`jCJxx(nY>73$;LGl*f=O z5Y^^o+>(t^BaHWuPZd#^7q;Y1WLU&lzgcivi$k);7z-W^H<DSW|2gHW&>ko!8tizL z*)%*^i?M;2<cSUUsvPr89^?Sb72RYTL}b}aGVEyx+M6+8wik;_U6Ah~J<ywO>8GBG zJEgv2XVXGLjCCXacRg$)^G2eB+qyc0Z&{s_nJ}zWE9tuW8q9M_YO+>dZ^)(3<(Dvb zHlGZOJ()S}q@kh`qEF=*k;DYm|MH*o8)Ky>kSJFL&;<XCoObaeMHsMobsty)4|O8W zHR9yU3~51ne7K}n{ehB@945lqm2oW+n|`-w5f9dGU;GsnUc9bd<2P-QxPTS9teV(~ z+y>sB>pL>`!b7lkl9&s8X4&8~jfd292{yA_vOat|*3Ouwm86qtHxoTnt@+k`rGH_} z`8;!CJe=hni6@<qoJ}^ig=hn9BxkOuIu_p24SrWzD(jFl*XDiVAD>NC4S$8kW+cj3 zO+~9@wMEOUfKJ486;^L{v;dO1CMyPe&92$OTvSLJ2VNB~!Z^_hSdzX5nUu4@XVQ;> zUKlqFQ0)QB$r`r8J8-rgH|T6VP=!ph6WEb;wj^>i{ue=~VGsqU6p6z*p{i=lT>qXs zGG?W0M))RTZx+ay&q0F<d_7vD-k4OwZ&(CtWkbwJ-c6iVtul;CW<a{<#7LM4V*@G3 zeY?X)m&v7Fjwks>gD>d_Rw`{``bW;T^Ov?e%ZRbE&Nnh*Y<M4r=*qrVZy~dkpTQLN zCRv6Gbh2R_WR9?VmW;%CR+$_?=C<fpwwrf|^TB9rLBFycxHB7$t;!kXGvjzE#zxOb ztMQYkm<Ve|W?>rdL_Whjx`uho7_-^7lc;KP{V|W^+X?^`DsoG*EXFuj2FZ-MCNBkt zF&?}KyFT%E%#xPm4$!PhvLWN;D(cj;(#7~2CoSi9B;KW!bDpcq53rH6$EX??^T<;8 zOx)F&Xkk9l4Wg^Fb1oh6R|Hf$$aqiSLvn4FL6pxET61-k_=ad0{dS%#9!?;-CElSn zho;F9q|Hj1Q@igua#sGBJ-iE7B*VC<qhXWzgcvvj`On=u%{?7~1@a2y4>rMhQalj% z#jP@v=UnzjkFgsJjD&e7yMPT~Gv*pHr6loc(*}_I^yaZgEvf{nVr(Kk#-b<i7BWI? znjl8P&WY5)`t)3|2|W<mFg`Sbmz}I9qlJ3rTrw+XqmOi%20{{}sl7Q~8O`R0i@K<{ zpo^K?(BqM?WGb)7n;BxMlCjXx%&3T^(A7qqn|m9JrmI3SI<w<{J<}#yWv>plK>P<< z<IeWE%bgpw7B7SPu$Mj4SJ<1e+>D*$cYZ|$jfyCu97#qyGXlxxkTg{W;>RqjXestA z8peXLS}dFK^_lT9T69TF3zE>>^k~FH#i4v_46V_mD}F^mlWXDH><;VZjw0Ju(qY&v ztXfo2ak#{ekXDr#>}bXtwahyiJT}@{e#J1eUMm@!8UwB5fjZayox3DjggYBa*vG!= z3wb3Ubj0_(Gdmu@aGnsX#R=1!lDiUnF#>obM1(&x;wV~zv$;~{{@uYysjG8bvhv&= z*&YPsC%G(?Q@Kk5a8z1F(^bl0IrP!!=Q><7%#P7&-WZv{9m$25Hi?n3u_^_MU=q0o z!b%g|hQ*iH<nfVl7@<y$S4N666D<EsNA%75P0~NJi?q;tcJvBErMcESWc9m#rl&|p z;UbHw^~Q^y<43MzbaKZB?bA<80r$%YFpc)!tdm#slm4y#(g3{22#}eqMJA0|`ID=n zNs{w1_GI~v<Mq=Jc2=yKS7`OQ><M0m9r6Cm24<_R#+eUJYguJ^2C{+W<cRlnr9IiN zQKrw>NcxLx3p*gLNK;_Z)IJdUj(5>rXSybQfG+x-_y(1&Jiw~d4*E_6T~!iEz(?V1 z#$`yp5fc-k1CYUP&5L8!U}$DV=>ZmFmT^Z>0|?6MI13^thvUbmcch&VN1Z+9<Su48 zku{|W>XQNzFB$+tj4@8-nj}eU@>`g<G_FK4_~6UpwW<c*qF(BkF*4uc?kd7DeWQ^v z7!e$wt5IV)<;5}zKx@)Avwu9?WRluzbs`H52iOaYg-qa~$!6I*9!hdFz8BrnZ=d4+ zv<2rk1J?Y_j$WsaViZYC+9^I3#zLww5!yKwNwr@J{Wp*FvL4sL@A*?WkeM_3c%skg z6}G`sH<Rw;dp|fY&XRtXEAk-HazX-jh$S@g>Q7({=A6tL_vX)vAY!cfPhXu29Y{Vd zEaqY?upQsPN~6H;@r~S<b{iip=0DLovyv5mSh3@2u*@KvDcg||Du|7Zn@z{$P7UVY zwa5hhB#~@64+U3pm3rV{`gqChNrrF8TY6z)Kl((z=63s^Q7VY*3cMxxZkofExI)eY z40JUzV6L>E29ZXRl(oUoQjDKHW{WXoxsS}Z7)i6A)gz)~SslXW8@tpzkr~#~{lw?Y zfRSVw+#7G;6Oac?1UuH>WaEy)l>35%SmWtC5+i~Dud!DvM`Q`a<<z&TBE#tI>Z3l5 zHziNvjNGALriPWnyGe6KZg>}2DMr%ibw&o=#o1N{=RM_F$X`}5@dWjSjKGE5@5NvJ zoXRJWD_Im{ZT8@i|1sFi4Xc(hlRPP_V-l%ESJ_tc>BksCb4U)C@L1N;nOG|XV1ew5 zpl+ldv(G-!uFTDnQ#^-da6I2H{ax~lnb8lpLdvl?^`;nr+^857mYS>{<Cgt(?L{Gt zc9E+EcDXkER$Z%IWWny@vbAg&Or8}jXRXPc9*I>Y<1_Nfp=ho;jkE#!X52`eUK(#U zz7=cV;6?Iw<EFk<Z`q)fCZi4Ye2Z7pG9%F!G48bK$wAp>GD<g$MUE#dN<WT|L{8+t z97nEkNO+Dj&W?BH*craZLA8{HWpiDJwv!G0&@Q88M9nBhktha-;1Pe6A4=cI8HPmi zWKw)?d_<h!taVW7dyyeEFKoW!=0pp~zo;ZnC~YwebzL)(cE;@T|Di+TA+$CcDY<e9 zcpE7<J8(N|SdA!&lNp$bK+8!O6%iU0LL^NT$4t}lj10Lu302XCu^StA&pXlxR?L30 zY8H3|zF}3gBhO7eAtx-q7*{3!$1gLIq%U?#XUEj)Vo}=WmDn-%#Y0Q)k}R-RICrkO zP<<leoU07;cr`U5c04_CI<l?eKwQrHI<+!*8%cC$Tqr%fWCW}}IdUIIC8MKj_!|y^ zDX>3Sz8_2%S9B*h!h+%VX2<{9!NVpsBomh<b)*c#G17S+&CBdDTMvENRLDVo;El`( zR43<<0xBAHsBJd`bHHwh#n37vNoUBB`PUxo)&K69{yT}(t6b-q<E(w8js$tl(`J8D z4h91I;T6xBtz)y<3tT2G0&jp{u5B!omO2W$VyJ$!RYg6CA@9a9b1lY6#Ec$Hu_!!+ z=93@&kOjnT;3OP?TFGMk&EE09k~KP()bg!;3)wSjgD<KQGHPNGv_AU{7etg<9+9EU zMzKPqKQjd8R=-qtvTD#G*Ls>){bCvEm3eTa`)IXM;~|kD7_O&jeW6zJSiBxG@n_(Q zv34H&;vFfWHLmJ7SIbI35=xuMs`FJ&RAcON9Ly-BlMRMm+Nd@5)0R=ds&c0#R*xj7 zM2lvaN%vukAfwR|eIlV5<<x6!N-u~nPZnSauiR6#$QbR@R=vpeNsHr}IJs(Fd9FgV z7Y^i_1XWEi%JUVHx5J8JyvM@zhE1hYTI?9etjBmWM#(qKcmp|Rr^HnBLR88AKgoT~ zB}p>h`k;CQ2V{91P5R6rc_fRp(|7dM@iIqg)8wm23U4-Jb-Z7E5t627Mico-qTJ@o ztg&}SO!X6d7I(AXwAmKF$Sf~hHOl&u7Jwb1ky=C6nz61#Oaso7S_tZDG|O1KS7N#U zNrL0Gjx4hG*rpztsoXJ=Pm3AY!9Wfirpif+185!T&IpOS+Sve$$jrKV%iXd>RII6Y zmijUkXnZa!yLXP`VYk^f=XSdi$AN4r>EItWEA!?v`p;uY3#r{=QF@SG4@*wsWx6sK z#tVVMG(&Wn$BaGFE&tPEu@`eqa`@B9Eks&anv4Rce!8mBCUw|7>45=sR*j$8!UNeq z*HfQm2C`a-=JQWT1iO<QoQ#Qml3d6`QmfGe`>yg}<!_-QUIO=7#$vSF8VhV&%@al} zR&Rx<cUcXhZX{O=Lo2M`6|fb5>Cfi)K4lhX$5irrlBLxupy>Tr9L=LOQZkOb8$HKg zNU64yD_q6u0sX{rAtpp6XPN!8UnALuS?cacwXB8Fq#t~KQtfEGWr~FvHNL%hmb=Zh zBap-Vr2k@WVXnMW`dXMYtV$h8E6od$_s%@93^j&q=ENXLMdsmfX}rk%z%MovO2BxT z#<a%dh-Rc_TO|lT$R+lR1IvbCWvMaV^FLMAieh3Hyi%+!`Bz4mU=A6{7_b;WDaQj~ z1&e0XurSyT!Hhp1%J!svr)Oe@d?lF|`yt48WnM()g>7fKX<1Li>5K|)V_x8kTuep* z?aY%u<a$QvL3(T?fECWV?2IyGOc3fAJ9C7I@I2C<z-O{<G-<WyIGjyhZhW;>Ccr#G zMXVfa&_5E9IxDXOlQC`o_+i>jk8@>0`V&UOnmSUbrO?snIfIqS8ccX5BgyNMcO*4p z1~63&THHaLNZi2ZtdVo%7Fc|ho5^c4yGzD!Np%wBSftqw-maPvY{-S#T2BD=;2<AP zHIo`AIw$_kuE0WPiDE%$x?*lfI95z5;36JPu3(tfWL+&OQo*bTA`$MPy`tw?L#=-> z7^7EjZ08MjLd&c%P%E`OUaQZhV|+=`6YK0qx3PehG+1PqrC1tQFj6Gky~%IxXqb6j z85nodR{zX-#(S~i<d33y<U?CnUHF)G8rnhK{=ge@!6zqeG?kx~wvF`DehBRov3v0< z(g4Z*gR|rqBUhc5@+7KD|5E-*VzN!6ucg^H@l*`g{fq&QBO=MZ()HwPMg?Z26-k}W zl@9WIBpu$-xRhy_3CU$-p_2@?T2<&sf_<Zx;_0(O$1x#n)s?LB!aew?yk9Xx8LRY` zGv4Z|Jn3u$IT7m<v&dQjR!fBdeS*&<p2UepK;Vojz-iv7xgj?+!Tjm{|Ig>RFDpT_ z?D7e_Jd2hUbe5L#qchWoC6WgbZ?8ldcone69Mf(+)pom*(0?c+1}kDlv)#{l*rO{Y zB<J58>JcxH?&GxHnRO@)Q}OhyLP@p+N$4yuj5UD!S-T=)U>xvvS|=apb!N^o_sCZ> za=3wSd8>Gj_yA19M_?iuB#Z33x;ZRIv_gi&nW}H)g<z#|(_-0pQZ2Kdc_DX8W+N7B zROJ!9^3*t$2IRw@H!v25VW-R|xy0)eJJJJIv%jKyMF^%shSk=WL=g-creIfegH&KY zUdvk2HFHZZ(r?3SXo8W(yTnjbmySf+)Ym%?lMuJFVocmm9jsbcm9F;0R^=wbj?E0m z`Q(;VX5QU(jEuZF?MQ#iys9pCKRw5!SQz{!V_As-V%QMK*odr>9{DV@PsZFOqaJJ@ zjL8V2Y_ltsLKhs#?i-Ip;9Q+0cbWN1{0G(>NoY)B%sp9P^H~&HghP=KyIrwZIfi6b zjD}s5C*>i)S2{;_SZ}LZT$^_31?(|v{0BJ_HYL~EU?qHVc^(qXKXVQ1p4bNbd|uSh zvM;+tOH$i;yDS=8sKu^;)6i#au!k1kfb~hPOH;fyCiGK$6lc-nTy0@594lnuujlS% zEjmA2r2^c`sz$pkm<LjgyWt@ak@m3-u5WJq4_WDov)ykXX30pa(^u0B$0uXXGrFyk zI<b6Pd_NYiRi3B`fyDO6QX%e{C#qSz_dH5_qN^{n^SeqA`fP17uB_65yjpW0hiBhz z$WHD=zxBob4cN@au1wp@!5FCPv(CUCK34CxgV9^z>=|nqy0N1fYR~mVwKtD}HmTpB zBibm-tUBC}K06LywgZidd;Kw5+UOS+V0YFAuphXa9a0@(1ldD*?Vf0x>OuM;qG_Dz zZdy+$%347yPmEw$T#W`973(vs=GYeBd5(bGLe43xrk38gS-D_TJ#~*Zvfr!)iP5@Z zjK2}E^E{iK8FiTjwgm@eD^<)x0{zxP_z4SgS0-bL6<FzF)qvcM)dqZcULt&FYtr*7 zcOwUmGGn=4t2UAXbLuJ9vLX6ve^}9bIE7!}+U^O{-Ax-H8g65>cxcd!#A`jNW6!Mh z*2au6XAUG+>#+3l4`zgQBvDq4dqRcwS;@lA8%L}{8zFG^)bU1FEYGf0YDII`Q5u3< z(Us(w`RrshVMb!Ct3z>6oaM?swGWZL>IKWoZ{#alOJvmP8BE61SfuzU{<mV-z9|_& z&vDiht2WdG@E!G%O(D^&p0UL5lZCi4bcSQ}Tm(bzD*fxM_M!J|Io8VlLMbd-oFsSS zlL3%@k@Xb?htKxZ5k+JFVIXejDE6G6Cd$D>5c3i%rUy_ISFm<6vo_fI()bPnt5D+e zVU!}>_#tK`*1NR(=~QGHu47bUTJEIXd{On<c(Ga)yNu)6B4ap(I6p4W%Y^Y_^`7Vn z#d95~2#%Py=(cLl1@SFBca`*MjEp#~T{U36QMQ6mi}|#f*K!S>4jTv8;ePHGnKp^d z64Bt<L1_^cqrz8pq*^^$6;TtPxtim1jL4k#ES%PmMX_=*U$)sOz#l8;*|&@bW=xPp z79-Lk(F&0=wpngnOX)uO^qQ<dmE=FZan0nS@XvQfm&XnFurw6_BvMPvbUq8hDEZY} zRX(^9p1{_Tes!Sw^Z)zEZ}SWtcFUD`!WlPW$Jum|Y-h?2!dzUC<mrzib7vAVN#-(Y zOe*<Ccq&G~Z!}(bH0hrkE0)!Lh&^NsF~{CKiR0R*(u|VA1<`U@K>mY%J1aFv#TRxh z{zb1?2>i+plBB{YnrpEnUI$6m@{DZ3R~T-#vtE#7;cGlZ-lY4OYaC2veM-FRT5&6O z@99D`UPKX7^$D%eE)qb3<v*diyW5?XrYARPcJuKtKl`a##cGc1Yp%GJ_s=Lx)|%-n zRCA6NkQQ@e{=_|e=QXJ^KiC=+=Zj)^dPKTu5|nZ_{pQu1Z8M-R=D{fBw<&Yb%RE8~ zQ6d_Yc*AR>eO6`jH0eHn8fK9Zu{Tj6DCLu^T@puzKlVa|qvlo{>9$$q36NHPvKE>_ z{mvM>nOqRprA3fY9!USpH}90cg4<;UD2`;d;imYwswBM3yg~+J;cl)*kI6jr&8UsI zA}!49xly89WM8k{-TqPhB(0~-$z$<*KB3%-E0cNgeq#WS%>fP3Cz=fPa&}T{d}^lb zq6|%0A99%Ii{tS2w8IVywA`p0WtxvMnn`_zJtRw10OIKhwBvQrPcusH`E~HvT50x4 zbVj5FzlK4g-;mB2Wv)PG)E!~D^=o9o%730KdH1<{k(BIf%0Cv0)94>hB2m@28!_=} zW1bj{TeJ5VMn=`3EKAJ)HAZF-o4}SxKt|!n9Z5)SWcSEBln|dZ5~4W#-{i%)f(i4+ z)y+6e$o)i&X0j!kt;z&0iSvpAxLUHesTIGhjeX-?2_M1@wFM)irTK&DshZOYt6SMB zJ~198UY@MRj*l3KeG##2wLI=>1*@tUnNF-OcR_Jy%$~$y)W*%(xt9)(=YDoL$+c0r z&%7&&?rU2zKP*V=^Z<rnG;{^(KvDQf-#qc&N@j=(<$RYuqzd^QW#bHweeNDS6c*J? zV^i$3UT5Z$ei>QlW(19pd;*(kPH8n}CFa7qkqS|-i~z_8=r25>>7?4)MOZ>kM33N* zHf7JCtk?@=Cpj`XbUKf~ZJjMHPIE+1U=Pm|3U=Zd=5&vZHAecA{Dr4L;z*?0RdUHw z$CZsS8$B(!FNsPfDz=7Si+0=fpGU?6;a@nyx^RAoch(|^x04*4*O(XuV~h*a6i1N? z_w<eb=@e^`b4e1!=2;Ex7R!M5yay5clp)8`Sd{^;4C|7^=%JpAXOOn!@uVfaA9_UY z%_M)hKl}nL%DifYk#TpsmGNq5F&U>B);8Nc)Xsy(MZeSQ=2K!o#)_QsPmH`s3P~rm zUXO&0P2Gf&atyQ}V^8#u?co7JU87>g*-jSOH@IDnDP6&yM6}hpKvXu8eS(uLMb`Gh zXB?S@aSd{n%ms6Goxy0C*o<BLU7bZFtqY=c{*p2_M+OthCXdJ(6d7$y3tLw;n=y3j zk#qk_@p94UsrWjsA}eI|n7>|O7*+<$b9<r^?naXR<Sw3U3)_aRRwIVOlB=1}2Gs}l zcFyXZ+_@uL0S_<))>X8Ab&LqxXPht!Rx|sCKVT*74$mFx;}CQ=*$CV<7UsY)*oJ%v zR>R7QxR@#IP0kEvV1f9gNO&tyJ=vtZVKR}d-Y0b|cV;j>jX_*r)|h374c0>>S~%7m zr(GhUu8(Wv3Ia9ixeEjx=OJ1n!DF;4R@<M8|9RD^zqxCg=edZs(-z0`+vPmrpC}KF zXFKvrS?@@<MS*g)l9*y<LTQ2ah!`3_?~I7HvZUma-qUS5Xy%Ng$e=kkCXkE-=lrp! ziDK+BtyY(Z4JGr@E2ER~ax;Q?k`LG7RkBZH35&xNto_YZL{=j~6k{!ZZ$C1e1Bb%S z*gt3v$@$NsCfE*skW4Ns&GZbj^jEerpJ7SnAsqQnE0z1n<i1I=O5~ECn!8QWQ4C#u zmI^gYNIa4?z*nqD(IawiAATM*-Iu{&Dd>mZCB{PvvOkrP!D&S~#0jj)VWq94(0?)k zNyYZWwb*%)2G-p1?jZgT$8&v|SQkVW3rd#j46LabSAogt<v35S9_sQ~NwD^58>F-% zSG){Lip;<!@ezKUoCfPhnpjtJ&Y!@O_`Uo_76NMUw#;!YWZBi7NxIbnh;iGgkY!?< zJS7^Yi!+Hmv0|Qjg;iMbhV8&@yA0|vOM~rby=V#>k~NIDn@@8e4x_6*WDHk?uP_1g z$FJFR(qs%Ee_HAE%5fO`MPaQZA1mO|i*aW*h9=SX`SA%3z;lA%^o$pz_lY@18<P=j zG-gI6t9XnrwjyInGLmyc8xrptnZ@AkrmsO4RF-4T<baexO%?_6if&J#zy4*7h`W(e zK9D_ZT@My}JrK6RN(31cD~H5XL}Fl~ToSp?6`ihaO|e}o%5eldT@-y+&q>?W%@`+` ztJ2mdMh<@XJZ+{bhg|WTRSG2BIpU4U2r)YvV9an{J~hu4jzFRu9a2kM`GG8iHkvUA z!TRwrwZyZg^*eLU?qr0>jq9*0#?LsK|Ex6f3ho$xnNCM!O=iZ;;N27|PVGd@i-AaT zqgic+<?wh!5$HLI!8l1UL`=4(_sO>KSR4f-7jMR0=oyv`6U-)C#y6k`#t+Y8|FLi~ zjA4=+tRM3r5h=YGYD!^Gj1{!b){scdQ<j8u>9c=yihh`1IaYcBRb@ZPH;#rICF*3} zUo4TPYYn@Ft?3)ymaGb<Wv)!*mHzNIL~(O3c$#9r0DAzq154>zMgxz7OJt(2YYoM_ z*ikquLayyJS_UCk;meQY&O#VyW|&!?^rvA5*(XKT(Hgsqc4g#;9hE82Cy1GhGUd`- zVY57@+`AtRcwLWNg*NAYH0l>wc&$!P#eH(`DsgEDfVHPrmk~S}fl}~VtW}%nB7I^f z%((H_3Uber!QFF4J!2NH^lUpiWjyRZp1eP6NyMTZmz)X4ns@gy%gLNsfQ-Q#H*8zP z#CMJ}tK#Fb{qAS2tQi`K@2p%VryHZkBpvEm>+ET5?vIo6JTgzfKfyiBp%th(?kqIx z#*@Ohus6~GVT}c?^q##I{V?Y=loZoG`YWR&K2G1gXV+n}RZP%S#x;3~RkIi(W-NwF zuP{!?O0HD|U_@dTJ`-!iSa@-+fOCjhkuI(CowkTIdxxE<mdtfs8H0g6Fj4eH<U{r| zql)(O&)u#eowlo{5&gE?V(ubjH^!-IRr~}h!}q1Z#kEPK#V1SRI7lushSQ7cXSUq_ z{i2kvXg^Mj3-4dpy@Gvi#g0^2*eNepu^Kh8Nu!N3!>#mhSOR<a7#(XvR9CQK>=OUN z>el3uP%|^rqQ0)k(-->`&o!?60kbZT>@LpWf%rz86r%A1@{F0$QZqp!RAC!0<3R>^ z7w%@a3k(g1BOy><{@6V6d3Y@<(P>lWK3t7wlCjCO-sy3Op^{d7!kC$>L=(2g^>OrE z>ENnjzt&pf(q@sKvd=6%FU9@sc&9dxlxkZ>+N@*HFZXq3?wKi`l{^$nXLD3)VWm7f zXe^$V7F&d#FC-pE){SoZk>*eTGSW%*F>1JI+{_GHA-jX$m?7sb487+S>5;pz`*hF9 znH7~`+KCOAIg+Dt*6ix9ypC)=?PkZ*MjInKL4H|F^PPI*4(hV$2*w8Yteec%v(>zk ztnf;Pp{l_i%$N;(E%q)RLo=YA-AY~651Dn1)K|Vs>N1;`?8B-k>!RjFzs*EiU7xWE zED`QZ8!}!D$I^3Qm+i=7ws|4xX+a3rhKY$Na1BoAky#>1$r;T<`cY&txd7XX6Nr7y zi*YcU&=C&0N45oX;al)H{S`qW*HF#OiEEH5ZAuG}*)HSY%IVW)49Z?`uEekKRB+yy zkzgq>a=slF%5%X_R7W|UZ8C;zmOepuSfRI>8}JGA%gC9TVqfVmx#n%BCeQ_FO47&y zG=+F-gy><SGi>Fh$ri$jTw#Q_VY74_`-8LmHApI2L0Ub>4IjiF-4TBjgAgOfZ^ZEY z&*xA7S#&C+U2HL{#g@=y<B_>-^A5k%sN*KaohPhsMp%{>$|V}${VEfkgE{M$Y?1wW z#06Ebs8OdgS|^u8e%UkQkQMa26JwRR8WIJW*d-D{o**U6!2a#Kt6k(k=GMrHP{CvE zCL#30$iV{qN-t@Zna&l<q8K=k5fD8{uTm@mBa(+o>2NOjvQ{1wfj0R(FEI_6!j9ku z@kQK~Y_g6<-40tgE)J+(LdH6IaatcW5O{`6O~%7XxF`u}<OS0<^5~atxC8C7=R<NS zy)hRgm^O+_z)LY3oSLS?LUBd8RXRuOvbq`yXFN>?C-0Q`RJxRYzL>MoA!V3T?t8#P z!?eU<+!Zep`(q!V4III;{LOZY#?rskKx1Lo4pAP*sEgKPn8TOP>LmV;vC7#o{`>>$ zAYGk2uyFh^Ys9f=TC9)m;@aXpG}mi=lCdUL?rJ@l=oRLcQD(B>M~lP+NE9xLWkIQd zZZy~R*&x>;Y4)%s34B|A##Hr8j-Xl5V(U2Z(!4{w3^XR47_}(0AKyX-2$Zc-C4{?g zk0V@nB-*X5JPkXuiW>XgieR3TG4gyVSr12Jy?SZfU3EC5z?H@1jFEZ8UBztll@yUa z^1=%+OBu^h;jR)(c0}yM*vc@e4UUuJJQyL4Cx!t@VXu4m-`wa0?ewiSYm;k`XgWsn z-I;&F;}I>)_=!rda(740)DzX3d={AkRWHWYGZaV>FO45XCS+rbZt`?-S1~HNG!mf7 zDD5Hb&AKvLW){){&@EmxS;%|<&MY2f-f0tgP2FITyteYeIas)StIudiYBG6c$)K0N z<dDS5FwtdES&=uZ93Z)SsR4s*B-PO@E~(Eux-Q)&t1ymElm7+rzqP;OE82;<Kugh4 zae9_l4Gw)!TVuC$b{ZZmkN@RI@f^FfV>Tj4IBD8G>{vV!s^PQhZQ+ddNBJCFF?jh` z_xFt%PELnu;4dOau7^QcvnE!jm1?__KYRWuW(Z^0K(-GXCo%H7+M0}&1(I37{OFEW z;AU7OYpCri<BgEkvRC*%{AWc)S@2X>b+5F$b}hxOpc>YV|H(4Q{jzrOUVE*f&6NY} zKmS8KLGRpu%6ez@XJQE^peJU-N-tOO^rf_t>^3%_hQM9;MXZW-YqE7REmjcZ$}l;3 zegj0pMYAT}d$ti1RgWUCM>;%XN|lsn@pvZ|%uga$Mgref<pPJ;NBrL^gY+U*yBL8L z@r`3ss&E+6h=KEQ$SG!Ee3I`#z^r66zO+V#Elnf&V%o_9*f()%EjM5Id9nm^B%5Pg z$tf#FN@)+=p`YUW?3a<pS7`)`44br%Jn*CJ*DA{9nL8Mo)?gTBlVr1}#zOT0JkR=k z5{-q~KM?NW=X#jgbfb&cyOVgIPg8@mo9tr|ESJ_}(lQws1q^^mvI|;o$DzzqkQLbD zUseIJV=Og|&V08uxUz(z9PmWk*e9$OjBxH0{=qd-7q*<_V_dGDbp~WjyUNjCPus-} zFj}z$SITh^y<j^rXF0p6c&`>`Jl>tvt&<0ABQwwB$k>RO<qCb4Mw_uoOfmQ9!3k)E zwnA&NpMC&_hka?kk%6~4{&<GFT33Mc8D&;_d0Yek(N7*4X*Jhmko4lku15dxZ<<01 zc%iToT9T7RAyuS|*PZW;O+KT`>Z9D@o+Q}?SrlPm+|!yRJ`5egb@iT9(?oinatRZs zq)ZR9Du^^qJ*|x-W6k<5kDB@oP0X0=5-B$(b}-D{o#32%TH$H8u&meW4IEe&=j0kv zeZ_N@hNp|AFO6$p_xZdA_)JQyBNk0CE2My@C@%unrhJ-=0I>D0nbC6WDWjV#Yi8qd z7?u<kkU!Skew8?eF=C%Z8+ccuFJ7?_aG3>xCTjcX5UyqZcnEYFql9zDBxB{Q$dt!O zFJL?lD)Z|M**`s=dQyTsAM8<;xMO^;;tA@IByA;SV%VxsT_IbKPvs8MYJ;_lt{Pcd z2!Y5BJSDBzK5hkJd`FY;b-I$?i@$s+<0#tzbLb-6cPBPwDgu$RLpzdPr?&=|rnCc7 zSs4D4zH1RXLT@~o4_aqDCwmxQM@x*8>*C?*gX7P*vi`#>BZFa(Rk;9qg=?4}G7c@s zDSY=2R%3(dt;>OBoKnWncjh>)H0jHANn{zukrzBEeITsRxVbil<_O>Lu9C5-v*w@q z&Y4EU3_=-rnDrh|2(yC@sw$^=xx4|C7Qb~@z97WKghjdKwB?OO6L4?bjISaBj~$zD zIOGbd%jJdeXe$G<Hazph?u&C~oS8ge<Cz~}$3($d1bi5yr}t2et?;}y+?XGv*O`A8 z@pC_{+Nfj2dcdb5QRWhIlQg=kBGXLq*fKt(4_?tt`AwN35@Y@xLyJi(`AI&jW#&hW ziOqAjR&acX2W81Y<}_KntWG!XV(?^~71Lg}nqJUadIg;`!pz@y2WXotjW31qYJH+N zJ)t9PGP%W1Xb22}-|6|=^GzHb_Y-fY`}sX=_a3u$4M(}2A6J6@*ob46$7i%d93G>j z?a5{_mOKY?i{`j5hRKF%6G`->A8S$JFU-WR^%16PuW0E`@d-<$<^Y?XAD`fgER-v1 zA7o@tdqcBTdH9w^!z!)r#{<QmVXAe3?9t9$Y{U3PURBlD7r>7E?qqNNJYUc9IaMqc zu4zo!7^{%XYO-V_gCVlVd>69-HLQGcR~Cz<N$aOgdJ1!Lr1IG0;>pih53GnJ;KTG* z^ve!3Y$Uq`Yg9(i1uaeQA$<^|H8Vy_yj<j#EwBchf1({`j3i;)+N}R<hx`Q;$7V?g zpGM!!ARA(ySrzBFqkF<@d06pboEw*$;)m&z7%#JmU%89>iK$`atdD-cPrbwi#GiZP z8b%M(5D&|23{52cj`P>LHZeVtpe-0u#&6}4$O^wt-`H!{*Ef6&hcWul$(?0;*}y5( zmklGQ>>e(ymGY?czS+?>yn_AJhm7OGb^IFd!V74>_zBj>B4S)@I4#5RGqb1f?rIFR zz%iNSf@-;<#vB_ZD1&pd5}3U>1vzjf7-DYW45`7?p*!T#E?HPMA8NpQIObTaTHOXb z#=fn5gR0ig;HU7K1#tz)p7pHmmt5Pv6p#^G8xNSIlEnyQMigda0C<D*vTATDo@A_e zJ;sCOGJ|@VQ3Io!=)y9S1;^735&?rqB#9P{&plj{7dN^!2ildMWZD3p5spu?l2tel zqKPfwTKwV6x8N|Ck2_|4qtVt5^I)d%byirfu@UXZqait|kU`@`>XY%pP|ciIIoIOb z<d$X0d}ziuStBDRw#24GT}<E1V;b784av&LsMskPCr@H4{2S6L2E_}}gN!mImk~qL zChceO;1>zwH(L9r@|4_KU+5V;;!mDD>RBu-oxFmIpRqWS40v*ps${c^TWk$mZ=|er zWP3CB>?-o@a?N&NB_X&z3n_0+(&Q`h2z|#EMx(#%zlsId$#|W$f@VkbP#<v+Y!a{5 zD|0RCN9xp7d**RoUBB=!);*avofYF!fvToMi#@4Td@&`JM!1#;HtwMk7`vg}>@|<p zsI%PUIU}NEnVh7Y>K*OGxFIOH#Y1Qk&s|H|NKb0X9E<1+JE8JZ<r?Jh6w%z-$a9es zbKx%(7b8e)xAIoRiF8fv^iS5Zp47ehTC@u$vsN%e3q&wP1_t9ks*Bi{^!doI{x}x; zi9$hrtenTkwu=X4W>?lWtr}#Y0sUc@$gmdjT-XWLK35R4;#rrc$MiP$K+fDFPn2G! z#N$y~Ny4VM5)QCm;fTVU3g;CrD14#t<-+BK_r#U{r*m{?W#@>_>pKfNceFp>{&0JG z%;2)Z`JHRqN43vy_jX>}`E&dF)-la(^|ce1jUF-lmeKngfA3kh=;XcreApk4eejgW zPXGNG#nV=tbi^^8BPs_yw^#pepWOAB-J5%?+VhUx8aq9`<R!BnDg9{pi_gsX_xyWa zbL;k-Z@PK?Z_oVwWw)Mj+gZ22^tNyQ?<xPY%P)?&v3%pPKU;OvrT_El|Lwi~zPnDp z_wWCB|05@@-EZCDo8C9{=h1!Zo0>;;t}hnLU#%?b-FM*JnOkS=F}FSM^o6fla`*C+ zcl!4(@80$2yRKjTrJZkGe$=AZ4SuwDpYkgTU+tVz{8M%2w37z+p0|48j~9M+{*|-7 z-hXRpVdKJ)owk-X?XdAJ8_(YK>MdW{w*Tm@6NlF~j(=)+?bg3;{?g{7x16wbc<9#Q zea2or{@ICjlXo>9YdzV1XM1VuxaOOiCpVWhZkTx0*h@wa89%?dQ~8p<?K4iEGi&~z z=B=5v@3b?@4>tZecI(Jf!$*v)8~ww?9<2*Y$Mw9i|IGtSXWTpEx#=I7HqvuKWvDRR z{OrVGBYSN7-PR+wZrif^mXB=y)#l>XwL^=Czcu=`@f#)%oOu1%;*l3^yZ^b5tbgs3 zUwpjy*shOmefY_TmOXO#nh&kNX3N`0o|t$~^K+dWOMBP;(f8wNTl#18|Df;NeY^Cn zt-Y+gqVTEKbM@Nfit*o%o-+26$^UKNTwdP$(P=l$STlIptR=I4HS?7-ZlC^&8GoAb zhM6y)_1!sdpZ9_JFJ1871@D`G=G^ZL{&w1ip6}OAsU1^&TlwXs^UF_G&+Iv~=YXCA zYWtS2YBwei8~^UutH%FpeE#^+lmBY%Q+h{bb@lVL*Y%F~{<3#zZ?$)O&*yty({oJE zjJ^v7j-9#l;Jq_9%)DXngM*XPckO#^<;3zYD@RoCuCA$-`wp0X@2q)qFPd}V?7z+0 zZ`KQD_Vs_G{Nwg{%{yBU7O$^7TiLt%v7TcFZl3k%yuJlroxk^jV;6pX;X@1Vop<$| zt#kf3f7eC-vvA@3f!XV(?>KG$-d1^j;m_?=g?E(psJy9iUvWu$aqEMfS;Yt1FRRx_ zzc+m4@M)v(o~SmCYWB5u>CCN6oA&Y9>lfCSE?RZc>MM8MvidWtuiNFTE9*PlJ?qiF zcUIn5+@tWTK=FeMXLe3)U)g@Nb4ls0YO#0EzR&iJ_TE~%qWr_cDea@0ADA2*`OdRr zYrp;Yo1eIC%?sAPYwfnR$3Hds%%K|xpL_n6eTQz@zWdmTlPel?8~aS&KYGgck8SPS z{OGfLZ>(+@UAN|$!=HKgGY79fZ`0zTE4N=T{L0ad<NsA(*?eR3>c;OIw>0l<ex&)a z)<K<5bUxjFb?D&q=CanIolg`8%FD_ZmOfB=O=)f6?)LqyW$m5XXScr9Ji0aB`9tZ# z%8P2}^uDzJhH1Z<c4+@Dy+5lSUEWsgE9}-ROnheaQ==aq-*fW1iOr*5-u}?mKW)Bv z)0*{%K7HrfIcp0~-tbiOnRjk@+p{m&^vJUhZ2ZB7Pi^?*v&U>cdh6eY4&L_qp|iIh zyY;xCH*WvL$bn<0jQ?=_cVq7y`Qi53@b076jNdXjuQAdbD!#Pu%$cXpo;l~ZxgTBl z`la7me%;DHtlWLYp*wzJ(TnGtF#Y!4@!Af3drrH(_x93TTEA@U(_UL1?tMl7SNhiV zey;bgJuk1lyId~3wKcCkYjow-2R8m`-J%VfH=jFv`^Y<o_uKx9;R7fC(AmFyRe57& zYwv|K&YIJl``g)@W{wXYGynL-hwgCboLi=SzV@T?(dD04Zw^`gbnzRlzqLM6{7&_u z+CM5UEZx!hbgQS;ZXa13E&QalaB{cNlZW>l**5;6_8V(=4-{u!IpYsA-ZSgH^FO!v z)jM9j<B}cEUplyW)q<DL{ra4j&%I{uv$LM=e`RG|>6hhSl|J72RO7c3myF*xws7>M z?Pm`?HuRa{8RNg1+_}DG{M*B0Ti-RbV6?w}OLKecfM8m|sye@GeW-nH;l#oXje|#j zz4ew&XKp-u{m-60`N{Qb?|$;9PgS1Txc=LlF5B{hp|iKm**16k>qc*w{Cw*Jg@Mxd zN`2**mCvm_-gEE3y9alkb>GbCGY+19(e!htUpCM;?V8?!>ZyfW8eg3F!uV?@el_`U zqtu?+UQ@qg^!jZ-8aitG2S#2ncFXw7>ThT-FFja3tbAATtA*=3$A_Wcxv_L&&B!aZ zpD?s^%cq`Ow)v8+dv0$J-!SsP$c<y4X>2L&(LXq&J^kW=A51%a+ViFj_kXhgyuK@Y z&Z+KQeyX@b>5ruqrCkeeZ~v|}yM0yrSM3*dmK853-&uLMGN*D{>C=&6YlKC4S^LP= zVa@k7w$)cOMw|C{mX^j#|1NDTT~YZ%&+q$}#kJqxe_HRV>aybbt#36Rt)Dr0*VyGF z2aUXI^v&aQC-<&zu3yx6Z*xnl)t=LNpnX7Ru=vyRS=EOtZ!GQA`C#*o#!p+{DjZOH zq<CB5;ljz~8+xvqR-S&)z|3ifPrGv9bJMSwe(&@j&-mAj&cOctpYOe@ci;Y%123HZ z+Uai?_)-7TzH0C1YbRFvOSctP7T;Q0Ub(rpZ~v9k-#2*G?0x5MoI7vs1G8Q><I?_5 z_g4E})&Hvg`+AS9?Ofiaa8>*1_9LA?c0SM=o;+&&*JJ05x5ocCe%|=a6VEj6?evx( zuPms&rsuCcpX-^{^RwEewXy0aD&H%8r*vxdw7!Q1j-FW`{OauX+{%K-=f7j_J%e+n zzoCCs-_k(rzxT|qo=`fYaB%0!u(hW*U)%Uy{ptFnjb*LT*6&-FHecD;T0gq+So6J| zkCx7@p4{{L-b(^y2Wxkg?rq;uzij;VW2cYbF<EJz(E3ZOuYGCztj^hmR^imbHSMp5 zt@=rQygt|%pPVt#KelG%>XFxvY#Dy}$Tef1tADZmg5q~eCza2r{GxVS-@OB4Gj5uB z+RX3GxMKQo1MB(^?fZ4l(X|6AcNV_T9G>|1*cZosGrnT-#r1#GpPhXE`0c|Zfe7_2 z|K9quZSNf3e`MuIb>y^>!O^#ko;v!)(f5r#H-5q7b@j!KcQtNpe7SK^{f3DTjNd-~ z!pSeye^K8!dGh2{lULWzZBA<+*M52HlIAa(r?*P&GupScukFk%-d$Q&IjnMgd93(o z@SK6dPQ`zg-cZ@O`m*YmD_<)AuyjW0^QEts4ln(s_{P#e<@eRE)vm6cU%R!ozGvV5 z1Ewz?e8KFVIbWOoky*ntPoMFnfe-he)m!c<*Zx`gZ25zwHO2X*x0lP+d#Z1&t}7o> z+NpR#aaQ@v>hV4M_b%?es;5~yw)W%d^y-n7Z<j|(i%TCaE-rqo@a4`++b?aspf%L` zZ2QFaPOUu~pPSrya!LKnMzisg#*_7zM4z6Syl=8le^>q5`uX*rPrhp6vt##;{KxQd z+dsDblHnzzv&YY$e6aCwYq!o(h5d`aEiNuSR9aa%uKL#6yL!&<UDbC|-yeF9?>V*l zuCTb((mAEOOIMX9ifanjbWRIwf3`W+{B>(MFytkrAC&)Hd9wO+ZLi*6_q}P_jOmxp zxOV1IgCm2F&e}Hn&N&O_Zkn@l&K<M%8QeJIKWFST<JB{cpHZFhmx1g1U*Ef|w!Csg zX<O%t*6oeG>VKR#bNu;ZhmKx9vSQ@T!yn%Mj%}9=?J@N6q4#h5?DjVeKQjE4;U8?j zY1_!qwL>Qj%^E5XZP@zBt>atH-E!oXtF|1w^*uv(Z98VTfAog26%*f?e0$^g)|U3B z$OnC(b5wiZ)~}kkH8(e_t#!>Co2NFPYP_ehw*Kn+4U_GO6DN8nUNNzK;>(l!)qh-X z*LQF1-x#mAChwToYvLsnS4~_#v2x<9@z;(WHoE`Fk;Cte7VNj}{-NuKZWx-q?Q`2E zwjHwln(g}xKQnyg$bO@DjecXSI`O;7a^riA=Ncbs{=9Wg=cHm!`IVIyRUfTRRBx^B zT76yRvhvdM>hh<{3n~{^K33UK9xlx*y`xwv{v=rN+X^2joEbd$Yn?~h`?mkt`bulx z)=!)BoB!Pyt?ygEZSp&l>nG2zKUaUUK2hJNaZ2M0A<Zvot`5C?Py4?1($49f*LC_k zKWe|D{r>jl?ccX2+V2mq>4@O)@92EHeRFGRYi{eUt#7q1Zq=JFYksD2Z~eIXUiJ6Z zC+jyhe%gGtHQ4z@=Wm_sI$!AA-T7wWvEs?)n<{r#hiVV>ytVhn-V=Mz>)EY#Mdj(z z*1}Eg3z{FQKRxl(_&MX}hV?B@oHg-}iT6*QR{u$3W$TLe?VZaDrxtfF{jIcD`KIzC zm9Nw;?me#m&S~ckTsm;#z_fuYrv0w}^1fqxFYfuz;Br^@Jl-=e<o)rU`91S$)2eeS z2bIq&-CR7cczJP6@sZ*=F+M*i9A3D#v%K@0K$P#aOPy;w#}tMNyGOCXxiMbX1@Cx6 z>#){Ityi_CwXSRK(ELhccH^e{mqWkrkI~vCM(cvcd5!;QY^>iMm~n6Yvid>w2PR)S z`GtuekKa1>=;#5Xe;v7S<fxGskDM{`)sdl*^G6RKTRQ&O_**A_Hqn}R=j4v{LSshr zrL7OPf86;~;q%3x72i;76gC(3E?!qWqV#C#(DI7%FG_os9x8sX__5*#<LA@G|1N&H z__pHN#lIC#D%HxrD4$hX6ioBn+TUwW)IL{xZSAnyuC)cVHPs8NmFl^bHRTTlTezV7 z{qoi21Irhct}EV9xT`b0b547x_4Zb=by;&sb6w+s#+{AtH_mJ<Zp?4Iym4(~S@Yk` zU$%bIzO=J%;m3s;#djCC2V#A@d}8Gfm14D1SyKIEwO&0Z?)SFZqS`~%tE#(IPph0; zeobkh_;hEaJuQ&rhUT#`Vh1$8+1#mhUF#q5`|;MBV=PZ>y{z@7)(x#g!}Gd6o_PDm z&Ko*Coqx9<Y|rjo)!C)+^TM>^>xw582Z~>g_~meC_riY{CJN6h9$q}CxL0xKVkeF` zv+$O}V})yq?=2l$-m`K*_4&0&Yt7ofYTpZ#yrcF|ZDH7_-FiRW`=j3P_g>cft={{B zw?Ezc!`@f-KH76uPfyREYM0ecs7<eZvHI7_o#lH<lf{dQZz_JW_{ZX8ahKA}(#DXF zdhy7Rv`>~_UYS>Yq<UKITea(IudF>@J)=6ay1vq1T~Xb;dPw!q>bcb`s$Z|3SKXm{ zXXVS4vn#t*t}SmU?NmBGF!dLm=h}z1Z)}|qTC!jCf2j3}_M6*#w#Q;L-X7y{Wb3u9 zvs!PA??#$WH}7bEsJXqdZ{uzCFHIIEFPzwMqBya5;{6lj6Q7vut$(QA*SNGXulcdS zo$bxu;CZ9XHO+^bPd2wS7q(v1y0rB~YtQ!a?f+_@+CHiMiuTU!CGGj`|7c&<-Yv%P zHO14y3NEOeU%4gP{<7-j)n8YisvcCkzE%qTSXVo@wy<`0^@8fb)$z(ND(|WERK8I@ zvAlo$>{I^F@^R&3%FD}Fm!6JUxGC(_^_@dH54XP=i13B>Z`vd6!#k&T4hS#$dF`uP zi(21p9^RbOT-H3g`Ge-VW~2G1=3&h*G&a-^u772+XYywgUz!-2_|)WE>gP314g9>I zbzAGvkdI%sE^nRPdTETv<*hZX9ow%AyLoQ=+V&sYe`^1*{gw9Fakn$u2e)@<|F!kK z))lRrTL;E>uL^V-?Hp2gN8$U0CorAjkHYR;So(Eovb4H<XfVsO%7>IUmd-6LER7cT zEPb@}Z0QB%x0OE_I`O*b*?8$srQei(TY93jxcr*(h2_tczY_l+TP~HaDZQa|aOo}a zeaLlX$I!7IY6ph|>{DA^+oQI7ZL<2E>i*U1EBjS$E5E$FKJ4`orTL{z#orY#DZaS4 zweY3FfrW=VU+-Mf`BB7%-ck5lVMXyhVHN)wvi0ZU4~yp(4=6rf_;5t&AMHF7D=?2N ze5UZn!c&F8;_k&Gix(8XSo})yr^W9VFD@Qf{7Yc??h%oZb$>3d_q@*E+HY$AqjgN{ z;pT^%Cp3?09@qS2^Zw@Ut@B%7Ykj+Qb?e&JcjE8&TEA)C6H@o$h;w|ueMkFm?SHkm z#?Qv~KiX?U|Nb-3{glo{ou79ekI0mmlqk-!!rp~FA`hY#WLe?A3O5uM7Qa?}QE6T2 zit_Tx2P)sK{G{@m$~~1kEB~rYR1T}&SgqAguD!GN$=Wvp5k6FVbM2s7Z*92xVD(qk zi>f<UKUlf4d|m0U#RbL73Ws#_68{-7nrjL_C|p!HD(*5Ik;O;i_lX#Xe|B!|e6e$Q zr`EZ-eNKC?_V(7}A=h`de%-n$<l<YcpTw&zt={&E_6ypFgl?^BFKj>Cy0P`m)@S3} z^{rR7pKM>$*}w2~;f&%vfm$<5(@Krvlg0arcNU*2PAeT-x~a6Fd}V|i53anfa!{pM zxwU+G`TX+5<?G6SE<ag*uKf4%H_LA+zp(uLkeyS@$Cr02KNUX8YfA&Adx{?~o?bko z_|@V~alKOMfYQmOi%Op;ol=@x`bW&v)x}$in~OV@jx4>g^uE%iA#(?YJX}|Ne{p5; zp29~8uP*Ex`{K-u{yrDI{B`G-@&A_2e-u7c_+4Q*tj>Fi-z~0-Htt&5Jy_Z7;Bl<g zfyK$fp9|L(&Mlk}^RgnMT&mKxb^aP?c}izd=fU=G+mE&fJFn`T)_H&D<DIiR2L%HE zEO20l_A{+bF<P?%1zsDv^x5`L+JA4i0}o!`xw3OlL@)O*ysmIs;he&|3m+?7T=;z9 z_n||DVzIb6B=L&ENiq9dIuFF0{3Cugb)&yqBPzPC^XJb0cD~#BX6GB7YdW{Y+=-0O zDLfJHPwLF-+}Hk5`;ySs;{$_6V^+>>?H>5{Z1aKUBk}WGb9U>1*2%5+w>}*|Uk^)g zPw?Wy14(*1ABkx3YYJBuZY@j}UQm2*$o?hqb7}nkwD@50nc`TC@6*LU6t4)ZesghE zabw}e;5YrjT^Dw)YA<MC8`gSbpw6YC6<0OC-Mp!Jd)%=ddU0^z?ZqJ{{|arG-(DQY zPQ<HcTN_%H_T2XB_6hA{+D8UEe_#78?N7CT(7wI>Nc)NQ|D)+X;N>dHHh}N$y-7%+ zgbwMw5_+hHfb=3#<&!4G3Wy+}C<2O71O%~Al@8Jrr3#4jUPCXT6G8~-{ocF#J^wQ% z``eq{v**m2GxL_`E%VO2<~pryTR(68wDs+b>oKigw64j1?i<(6jP_YS8sjg~#b?%! zsP9@IS07v-Ro^6^ev%`9%B)|UJ|0=0R9~b1TJ6$s(eU_)KX2XEI;Zu!)^V*L=ULBf zo!`17uNzvI=5=dkWJYUXZI{}QBg_6%d$@LI?a#IEglZ;bo<?Ra!~?CL5Yy_)+5gOy zw}xAOoSq%q`eCTySD}DY)AHG^qeBlnw)RYqFK<22dOdTuG;u5b+yS+(gyQ~FTUZ-Y z-!ByXkNUmg?%&kEk)FODU3*yM`}AD%tJW^9K9T9aZyw(~viZlzkH<0|tF+c^jSkf< zYIbXlYV8wxdnjJ_-71gk&6$lGLP-bLCZ~=0tq(#ux1^81ZJpTqPV4KfEnC~PcFK6} zmX-&%>aG7af09uj*6h_>p*ga7X!94Ln-7|`)|j;W!;JYE>HE#Cx5FbM>MDrelVe*a z-TIy8f0}p2l6s^0UbAoL{m}IG($?*{-}{lIM+EggQkzz5)mEslRPPx?)miJPtyW(- zGjvdp)1ShrH`H&7MEEq4p%GhTmB#wvy5WtL8eaxiT^%%VNPWwC_sHk#!*^T7cl|`` ztk!<54MS%=T8(&;N47?^Hfasd2z4}H$k_Za{I+d#Y;$0=`<CIiiNV?v@_9fc)u7PV zrp>QKCvVf-Ikwd|nkO_bY))zRj21m9sCd<k-v!YRD+S$rwZ41(*!orVYwFL{r>Ac{ z@~SnK)fd;_jXZm#{`Y8(tJD8KMmzjDH1_lQ1);+0B9ShvA6?(N-Z%Et-@?z^);6ha z5$^t8TE4aRLTzrXPkl^%=la2sGAHHSzt*qKReub!`(Ayg`iAu(^>y;RJ?g_l$zQ2& z7rGsjBYlH}XVqQ}KVDJ$b?w{nt?wHj`|7pNA`c#q{JJ+%Xl9}!BWl}a)PGVtxw175 z&GT%ZV?AomXViABq|q_W4Vyii^CQb&?fN9PMLk?MJ{<Sm=4lzdH-f#lX`K*WxHFV@ zPwT$W&E>6&^186~$4Hv%f)uX|=X|5JL2Ge%^N!}#%}XO=e%m~&`L}$3y16vyv0tca zU}$qhYyH;7x$mUt$w{rrx$4{DiOVCY-Vfevg%37M4}Vm<toB@d2<z3qA1;2lJ|z<7 z<>==>WbQW%&AeRuN6z?J?fc=#VWEH*TQ|1O49?lJwR3B|(DLD}pR|6He%=y3{Aajv zT5yQHU1zqY<W7HR9o5>aHLkUKY^QnANpCdoZ{F6tJ$U9%&C4R|ye@2BneXQ|f7Sd^ zbFb$1p_4}Q^RB15{uy+0PNdaIUB`Bv*mYXI-4hx4X;)_?`RM4xiIJ8EMLYhg`Pb%k z;eu(+H4@)AF1@)q_inFkR6D$OR_(Fcg3NjU(ERB7$o$`@-W7E5eC^HJN41&Zh^}zQ znEKc2dxzeRiZnek*y(5WQ$tOEsb3zM`{Vl8>g#75;v1<Q7#`?ZdnX)re#Uaw)(+vq z4KfNFv?hl8_RO=M*}A&*kId4o>BDa`U$^GlWBLE?Xo~A|{F)%4zhqR-3q_n2iFIh} zplJE8<oXRWmOF*Fj){alJv09MNUz`IX^zQQe=TQhm*3aRNRAA*^>1w!I@vTb<SV&m z-^h`z^LP7du193fowrJ>TWfA}aU@ARN6jlD&ChNAGH+vbcW}?U%`ci=kzV66k3SA| z-O+j}^Cn|XK5NO~n-wJTPV0?~=3A+9(1^wz8QuNu@Bj+`MI`hQwVlIXTO|*9KqT`D z;fR-7PlO-t%adOnI=-m&=ZwV5(UvRZ$~|+%1+~9Ki{B9I<?s3X_u4(twl4;!yk2`H z`u)G*(m&PCh@RLZdVZJ4=&z>rQNesOTK|m<JtJehb*pFO?pw|0o6ki4-5%uqa<ij3 zGGlT`M(*_7_sWWIXoMqM`-cnat<RfNGYU6EwjLCHyjyd-Xu5Ai$6XNqxx4vF=yH0q z9(lH2#`=Wx`OV1MLFw;_wZGQ>U3;qbPHlSagIY7_WZP(q@6^wUWV$7|<nhR-N9wQE zABz6CJM!wH`YDksM@1KYGnDkToO@Jc$b`t1;i0{GwfDknkETU>?XEogUu&1-bxinh zgK*bM!821@4`%GnjIKB|z3JZiB>Lu#<|RQbXE%QnEp%0EfXg$VH;3P!%j?x>fj2S| zPlT_o$!}*ymK+|NVdu!%-6CoCYwpq9I0$i%MEUm0(;pvx!FyN7Zn>!Whw$Dlx%S}- zJ8c=N{&VEnwCJ)Snb{-5_vfdN|Ek@eKHnc3_#e^9*F>-UEI97?+DVzCooZVKlZ#Y} zC(GxO7q~1qX+h-7{h5gi!wF~P^|K)Cv-9_aNc*3JvcKK>Zm9p@d^#?(dR%n%4-$ji zCR{Zx(rcB>@r>~FTj|?Fkr6*lRBpfEx37fnCp9NWyX@8cUXEUzS-mgM|88?pbM0I? zDO|8;klp`<E54FXyN9>>wN_|#Hot5>8R>IzuGu}Pd844R3C+zz30vp;?y(ks9RB!w zXyMD|pm6gKA}Q}|JsEobIJjY9MnrX$v9)a?{SS*iIV*H}O-AIuktHu?KJTpET)VDz zPDW<`aKzw@!Qu*S%uc*qw0O;+)_uY^*N2*B)z%12d_5BP`}Gr}iN7EHb4+y7_w)Ct z(AGuu-$gH9AKi3w@bsmTLl@?CPR{*Sd;$~e>qdvqtG!WsHr#Sm?s;;BkG86fuZ_-q z`bFoAjcngMcU(8I_BSK3FUj~H9bVWpl6a*chdDu+-CHk&COW##Xuj84y*{_LQtOt^ zXFI;roYw8xzTX}A#_*j6@3ZP2ZNKQez4lD+%h$ZF-#cqxzUn!B4_<3Q|GoM@xW=O^ zJ>2_eeQsLm%9Xy+d%Yglw~uZAL)$;<OS`UE@`rg>etGGPPo@w1Z1}X<pS?A6{QT9I zKG=0dZOz89jb%xne1F+{OWQhcZ~dk5LEC@ZzN`;xPF(izlJ70MuIriFdyT`}7B#-w z_O)*PSNL_$`8{rEf3p7DXw_wra~DQ-J>6QdF`&I$`=_<OUH5e~JGbw;f7vCA7c6{c z;namA7Ctq9#rf0czrASLvb~yHwoc02e%Kt>I<xDxrQcup{dvEc`@?zT7JR&L+M>RT zw^($^f-7?5*}2coJ8QlO?n4XyzM$XyP3L_0<-#v}&3Sq5&hs9MH?n=s4zn+t_0Fuu zoI~awHgDYg)8?-=ziaN=@s*xD_p^D=EWBaq3-Q+ert_c6o>)3`*`SW89UFEI?Yz9> z*`@s#_gXl5LC*zk3+B&XG=JXwQx|-F;Ta1bS#a_E`utnw@3-)_MJF#lF#go{mu=j! za>u_qZtPmtTC2WOZF=*Yu}DYOo~&J7+q<@V?X%ihjd$B8^w@HRhkD!>t8%X%C#-PQ z3YYcRq5BElmbBm1{%HGV-J0Fj?(x$V*6MXc@2=i^^f{wXW5uUe{O?LvuKfHehp+mp z)dsG%Zr|UnbaJ2Zy|?JKd(Ssk*sJI9y$<PpdhgA9AJBVN?}PgMxz81Sp6IjNim$HN zwc=$f?zrN@K7Z;nw9l=*r}t{D@MyQS8>hF1wHDO&Z2NcnmF=IjUD9@Z`@P*C==qaA zi&vbn;=lWh?tNa*fh#=L{q}DAc5CatLyuQ`?9}6lZr7(*pLTz6g-3c$>-kB~gL?Jr zeR=Qg5~KWk&z`;R>2+-Hb^F}iXN?s<=(Am)r+eSr`?20X?0t5xyLw*I^H04t>~rjj zC$4y6pB;N&*z2TTXY}gX>*5tgcYmtw2aWml4<luvyN-A#*N^w$y2dAsw#L!5iLHNy zbI)(C-y9Pu+02~xYdsiLeMAt&51UVQz0|pJ=SH2s?)+Eh(VdTV4D7gi*?G%uP2A<s zj<(J}bY9oFR%iE)zRPZ3`ufsKmz~$KUVKXz$BVFg*Qn-!t&?i6MFTBt{;2DqB)@#W z^XhnV+heak9WEN(+$Ir?tviQwPVW3hygTc5Ue)nxDB+JwE?+!k@#>5BUwq!;R~LO_ z;py|YpSRV#;qzZx@W!HZmR!8FbLotwD=(Y2?Cj2cn~%0e)oy6L+}tU0=sQ8jOS{gF zC;4lgLpm;7y5W+o7x!QM#Nq`@j#)OZV|Wnb@0-`OHm^UO*yQJJPqekSzta9@w{5#$ z-))oj?>647-P7vbI<5I=tjweGv`2Iu*X$LXeoExrHO;@aKCSg=yxcgct=ZPMedYGO zLOJ8(m3X*)qxRR@rnDtK+qPLecbB(!wLRGQb^W^dJ`Rk|`$nYBuJI5*8vJ%~JSXS2 zCI&N3s67`P^V49B;gRwa>K8Q*YWsG)1ixw<-M(M9bGm=G$EiJ5?GbNCx98f=YX4dL zcJVLV-?+5?>)M0SFw<HG#wvNT{@2DXkpNG%ZPYfXv08mX?JuqG1xw9}PX118t=*e5 zyS^6B>@6L`J9g_>A#tM~tv%uuzCBj<snHj=giCtXJL{c|m)rJlzdHW9o7#WVKDzyc zwx2gPs9)P!*mYXx799sJ`)uhYOV3<-%F^#HoxF6^(j%5OmOZ!ZvW_h~&+5FO^VrPV z*v^TaCv;xk`Jc|$Iv?+Rrt|L3D>{!)EaRHaA;Fu!Z?*?>)m#5*{;N4YHrTDflZzwu zPl|mvrgm=Y=EM>vbUoR5W#>=B`3pOG#0T|4=XVmRf4LdHiMHw1d^4DJY_qL-TVf8s z@7$`hcju~|<2r|Tex>twvCH4jdroJ+cmY0*zi-$0;BSn6?$zwpwX|b=$79RhSvINT zqK<!doY=8o*?!AjU3$*azb`#-*-jm+cmA^TiOxw~D>sKGljp|p#Fx?1>(|bYWp+#W z;N)QAZzs>^w&v<VpC{M4RbIixiHc2bT+`SvKAyAM7bn)%(SAYuxb~;pPH5Yp?X|`q z<Lle4u}5U}?Tu#|H^&F_qtL>XXwj=<zdhdd^R8OguAO&w?3B34)ypO>dtvFF;hXiA z9kA@EWoP8bsE(E6XIL{f$@deX{&zfaM|Yjvbw$@r@mW2RnB}jVI|Uo;9`tx-X7aVz zqa*68)ZeLH8w+#&=&ttKr_s25g8@g?Z>s+-9`Lt=H1?_eG-&blTHknrX2;|IOk+&j zZt>{%Yn##NXzbVaQrpD#@3kM$zC!!?ZELsP+t{#iUj4;T>4QP)hevnx&WL;~o}ks^ zb3VH3h0X(#VewAKiyfbI9ND>Itg(B-=`SUo^JRR1XU9_7Gx+QB#B0`xSLlISV&1`e zZ^aTF(zu{e&p54J-M4?+p>5x6`=GH)<K6uJOnqwnR-eQt_H_M@SfrC;KW$atBUbdk z>pkKLyQgtiBE%OoZfU&I_-A}$AJzA&KNZ}3dTU7NYj|+&gkbh(gYkYJU)GG~TCuD* z3wqrq{W&hE2~Ik;b$t9=TgJlcXg(EW^ki`D>`1(Rv7wKReep=^h1hnh20i~S`11OA zPEM<RGw5=Qcu!7<Ewo0^>4SNWC6T35^68==jsw$=qw?w5`hdofng4ql&ovrtn}?fE zXgfX8v|q+|d_bOgLF4c78z0v=H_vf<e1X4=XYa7aS0aHwuKzc4b#>b67r*%a@$G#Y z)G@6!JQ!(*`WN+68}k~I+74?wsqK`sxldcKwrd)L8h6+Cseci?v@o{LPC<O#GfV5o zbN0*Nm7C)sdNvmIKC!tQ!O`c{pRCWQH|vAqfjlmEzNzti+T1d&-QCu${p;;#w%^$P z=k}A^f0)nPwhwRryzT6^zHL8A#OUyNKAsDu-C299*1f(#JRiFTdHpgmrbc7;#+jLs zn;XAr9G^Mt-FTsXe*H)BZ2mNUghpf69KR#crvYudw;kU0gSNqKFEoA--~U<lE$VC5 z2gRGYR{gUeu*2f#868Vyzl`v&<8^o?vTcJPwLgYpI_fLME4o%=Qe*#&)**T7$MZC= zg`!uk-Bd}tzM1>Zq^YhQDbpu*%2n~2%<H-&{{K~@w{GjaG?MA=&M!KLb!`%_-lV)I z=e=du#IC_z<MQ`_u2bXReyHo^`0<7{4-4Pl5nXt3^SJnhm!zGIyB_a6DKcl%#34@Z zyruJ>o%eM<+xcqer=9IxYsDiurfYoH=3TpW9h~UiE?q}N`#jL~WY<ew|LVFp-sH!+ zK92A7?XG9yzdSu>t(oZNN0D#$#?O90=LVhIcV5`pJC=D@*CEa8n{Bb4&W`6|TB5^~ zGaA1Nm!BM8$*5R{_s13+A1}ZPvEJ(Oo^=ZnU9a-iUK1O$GqIV?<1IO&c3$m{NZ3)C zrDNiiJF9+nX5+y6<XBI$LJOBAI&g5Pd$)}C_cPjO=E$v?-G}qKD%5^W?VrKL&Dy}& z^cyEqwsrhSN5w<*e!V^Z=%0snFG+;rhw)f%7q9ey#+-OOZVoLx5g&QCMm-qg{qV*8 zLEgv2g4-wD`{P)2-wMTS7%4S4*n7|5@Vk>*yF*&JD6QQXj`>~VPw}Te)p)k?X=8fh z%e*=oecRS;8_~8}XuVt8tVCPhZafjGdv@dKP};_!gYJ!9`MX}|;`Cg7edC7s(2oe6 zted#otoqF8wUraA8Q$0^5_pZqqSymRhU#X;+IT3OePeX+HnA7&WwK`Q{;0eMMlad} z<K1|U{t!EuHMMDLwNTg8Scq@N4=^=R>vduw@sXUF*AbEG>ts$=Z|#w@uZgE(T2^hZ zo3=(o4!<8e^jpap{US4aOzg>ZD-Y$6c=sm8_Bti@bUny$i)iefA}@E%z52Bl#v;8f zmgUKjw%f<LS||3!oZyzvx?bqIE%fyJ#AEL6dNcm!mqKMv=JP*t?Au-Ybsdzb*Xg0X zIbAzPcRZ7}H%O~ThN5;z`=io!w?yvWiNElP=CkqZpBYPb=lF_xCGIi3t0O+4iLvSF zJJGmDn;$m^#NIhQnr~*-MvSk##~X)BcZxs%$aogE&!=q@ZQ42>!VNNhD`qTb#Mkj! z^uQ+>!)ZZzYesJVsN(4E(Nf#SN3>h$X{XTUHu<|vJW503PpT&}(H@&@c;#bSFaM9p zrxoHwY()}`h|KxF`niz?*F`Jb5!$)0eov&?BcZyR;(xuierxQze?%7FoxeB5D|=}? z=fBARm*v|{@iW|-xqm2BIX^T!ArX<z`rP_w_2<*Zl*rakB4yr>JYSH{Q{%OLDlJ|W zt~so}eKgRJdS^UWf2tjujI>F4nhjzZZdlti<6-?zGyco#W04;k?^FNCp9!Id;o;A& zW`YIHl``hT!lM%_zu|SU<sWH18Xw>7@#<V0?00bV(oQ-1-Jr_@Gx{qwMW`N0Cf<t8 zU4r4>i&i=;I%!JK$(r%q9~z(0jqyh>sI3#uoK)W>@x9H%S3~Q)>MMr3>KU&^@z8z| z-`rjCw4N0FIX05x)A+uh2rXU`dHJo-=?`-6)8ps9GS>OjYQ4gc$ltAMdu3+75u0g; z%<RN?|2EDOc8d@Hqt<hI&d)Qa)8oTZ7o#IH%~SPMWYtaa$emYd)%_!lcr!0+Jsb+? z6$&}Jc5dyK$djky1${gk<gdx4J|q45dF{9Hi~Kgy=hVo!lk@%LNTY*mUyr3aAtSp= zJRz?qi{g}cq$bCgut_A}=;-WG@x*SJQRd%RqtzBU*bF~zQt{8;q4Wdugx`x-<b=%0 zQMq>SAcG~*^Ebz5^UaLuW{DE?&uc{f9~%$Grj>u^(D33PlDBbZxaPCW+j{YP9Gqy) zrO}{o=QTZkJ+(={%ou!-WB0}%d3v7o>*3j*(wCv>S>O0udZkyZW$qWnGx&D=E}sQg z=;4xhrMsoC?TO+~i${@H@$;OuAn&<V9QD(9cHa!=KNS!36TvR`=k-!NQ?E2Xjm&u} z{Q6`#a$4GLt6~O|^JGURLUU25<AL<aniC!pS^QQ++4*XN%pf1eX5mlO3Ob`D?uwuC zr}2^Ql+j!xJ?@jfZyG7_!{p6gn3;U^e_r3;hR)uIcXzFD;@3iF-wcZUzx>@lk*Rg- ztJN381M_11S@#EZUXa)6;g5qtKVx(6QoYrh&NbrE?3cUm9j$bBbjz)wgU4zwRev9j z=kof{!cUTWw`Z;#pSa%#;g2gqp~+v&NWB*Xw;+DWo_XToiREma_o%#hZwJK(v!t1n zsAesn#zy-7ENJtw;NJN`oSTN0_lRs7A0M0*s*5s0{|&YOIX;|2LnBAVlXGx*^3c%A zX&H}G<6k=`&wqYq{EkGh7YF|hOB-8-4@4j)XC&84TWbVqy_46=iB;Xvx;C2ntWfBQ z!HwTZo5zG#wY^{d?h)VF?s@MOUOP0u{v>DpD8C&XbjH`bUU1qvd9Kwm1FKZ?U^e=P zjt1ljCx^23%2mgue>|{zX14c<cY51!!cKWl4(<IQcm00a{aGmS?Bqm=0E*&W6Zvv& zwAa;n*0VCJKgd}!ul_In*)`t6{nCR&B6s$wJcd6Day%<EaZ9}H4}{V`313?m(=YOT z?MS;FgME(<201^{<jSCg|0EvvRPElp{u9sL^})zL4_YNB?C7y_t{R{5Ix-x7L89_^ z#=rJaZAN7KT9H!Q*S{Mi^5^=Mk;jiGd*Q>#-KmvLFeQ=L2O_&KPki>2ob|1s{z1_T z^Fn3s$EW>x+Igh%`o59K!;)HCC~$Ccc(%@YJ4d5z5md2xqPYE{GrAIXo*AqA?O1aE z%ImiD_3lvJ3$-bEzm@)c5Ib*CWatMu@=;#T1#fEqiO9@5(rX^|M|1S0y#Esle<t7V zjlKF<T6`d9+!!zAHNi^f25Ipd9$fiwcZ+7Ue~TTeW=8jYocFA}txj5&HAAW_jtqZn z6fLrT-rMCpDO5EfSE&wSE$HfzeEk#O-6&kUQTS$j-lKEfx{1=Nn`jl6b-}6-Sj|?d zc{C%H-cKZ5#NfA)!zX3FzZz6ACiJvsWYTI;qKgvO>WDOIMIN<<($<My+8~tl)leE* z+dH2oMNf^(Rl_42)=TVbXkO#<ZDd;M9_h8Dl2xBJUyo#ZF&Q(@Hy;d^_&7W|zuBj? zZfJLOICorH-6j;eQ>5`$k)xZ0o=4|3pt@tf(EcuY?UQ>R6i(ki9C3L5|86AE0qMoT zK~yKke)(Cr@}zt^HB$JvaOT;G%bp)fKP55mQ}X*S!fnUpte@n(b3(s2$LIfIbeZ}_ zs|Cl6&1~!v>fIu`dTd6@TJz5ni<uT(`e8Wu*}R{Lw0pAk?{M<Xt-nS#Tp3I!lK#8= zy*P5{vK$pn|3{?eqq*+2=mC3}_7AO(%KVJW+>OjksQakqlND++(>iTCCG!tSnt%11 ztm3mGOU=VU>EF0qFE?gXUc)l$!}E7cj*ZHUZ<rTswM}HtzIlH=@uF`=x*iuPdQ$A3 z<HK{OCJyxDAgdE|^q6Sv{Uc*1C*H7gXlkp-zujU}?H!GJa(<;-PmZQNE4mlLzcyTP zV=&om(ad+&t_~glKGONLNa7<RHNTSHj0j!QCsz4e-B?yBs_9|9lsb<6BMq&SwCA@~ ze(xu~^-8eco7IzlTIG1yBhmWGvPOG+o^XTcBF{Q0UfG?~=gE;AlOv}mS97&fB30X^ z2Rr8Pj`_S}aLC@_t|JmFI5NJCALe;H?QzjIzs^XUl_<)!;n#nLU++om;NHlm8}s^8 zp7FxGF36{IgE9UPDRoKh;^a<TQ=ReG{C{rF`DI4&w6wi%?y^Jfxm9Llt8m`N>7|+7 zH1n}VVlxx-5|0qOu-lDw*47r6NR9f!svFOaj+vIZe=l_QS@6=oLseqU;*=MKT91rY z*g71xNqDb+cyhJ;KQLNgQqcLH;Q^AKO>ugt`s~oO=;k?*;b-K?&vX6ZdF>Mp*&}?l zSGa4}$n(k32s;E1ZI@Ocq*39q!FjD4o*fzP9h~>L@Z{!sZC#zaSv(&*<lCh1yO`_t ziCu0JOr;-_^4pgAZF1V)I9F{Mz8{x!wumekn6_3+`)h=g2ewv@eCU_|$3{8~%NZMm z)4!hnd@FiY=Fn;3+!ND#`6K7&`|qQhZ-}?^uIQ%gGcNxOPyI7-|7R+?c|LSAEj%Mm zDpvGPJTUK8)bxHnzY~snJ;&e4_}Wi$cD0gH^+44^$0TmbcH1JaO>4V`YWBz*=WG}H z`et6ohIS519Q&xy&(YzRlVVk$7Rh~TsOS&TX@5#I_0~k?ZVwIJURj3!jvlx>8sX8r zpN@a+nOKaEMLWEk*Nf2?pVzYdr_wM}qapnMaNhStE8H3_c~x5ZbL}^wzLVo|J3bkv z$A)gV3&Pnda)0CWc0}@wN-ZtxFjWm07^)f_?${)JH$J@KDGmu&f34z$jlwxzxKCXy zYf`N-T@ndn6|^<0R#%pqS1Ke}RXHf_P00N=NgMkI)gO>CAU#e=KGucd`m4h`w+4^@ zHc^s`a_p?i({Ox7>6<xw=k#KaiZ?fneaBm{OIp}7vgnY!4$TvNH)kH3zsF}xf1GO% z%kg8wt3QZFJfxCG2gUcaUq0=ZCm)~QtXD~bQUk|oTk?^noKgL651UdWyzJnzAm10} zmpM7-{k&dDhRB=YtN(@?9u9Xs84UJx5Z`^FjVY1+Q$j&+=Jia@dpf^9n9r}~_=oxS zcCLRr)U%*!ZDIajluuUPObxxg7Axk-P@}8<lmDO0r}uIc#gX1~(^G5H%P6a7VohmB z@;}NflK!ghs+pjQnA)Qw@>wQZsq?xx5`m6>CwF@<t-cqW1szzYY=!r*T;DGgym=^O zi^%@3X1sR}HSd}4+hry;%~8@FVjvs0kG$G3=S;{Ilk<0YMpyN+!RbYN?rd%DfLsf; zPR`kT{*M#B9WC;!$j<YE=gy7H|9xJ6%=?sZ#4j^@c;w)myLaxQ7c9U{^DJZXTq-q{ zT5hFIjP=aw4XE~HZ^q%d<FH6hecUOOyI1<XV<>0KaN`!C!i}mkhU8oo6UsVXSO!m9 z18&FIxtXnZt66(3<Ns{t;*q@Xt7hcse19dMUdSj;%WF=?bb7{cTE=op=KA$q_fjb1 z@yy|akuSGK`d%L`er0s{<<agJBvX+@Jv-9rtb98ydj9-K=D$?uTot^0OXSnNxr2K? z8=81Al=NcSeLeJWZ;n14uh5fuJ(OP`4IRFi^B%}KFXhfJ=kpt}lg+X0Q+@k5R3<}n zTHaQ%t3HpK)xen(YWyr(^3#gKzs$Ka@}81s`6OfTe%>GDw@-3xUUmG_(Djpfy8CkH zr}JcY$5y+svO#W*pZB^T{=Zcy=CU09Yrg$Gzx^Z6c1xcBFZq05`u?9By)B;}j345G zydF*8pGj+Y=cPQ=tKpGH@@!r&qzBV77w_eH-b`O!&pEH;nLOWX>CqeMn>}tn%=5Gd zTiMM*O%Royhle7!h}76VGGo`!0ok)}XmF2E#J+hQl=pV|jWpRew1U$258WLYY4U%O z9fw7Vd^>-C5GnJ6pcj(nlq!$nckxwT8<}-W<n#TJxQ|EvJ{t5sHQ6PfM>@}mRDL&h z>pSr_yj-F8J9FOck@7c0=U<zvFUzMZL-FT_?$3$bJ1Y|VPmzUJrPWLF%eDFRuUzq9 zkUwkZo=O+o60Af!TpzS?ORl)6y7E`))fv$uCq&MlQh8F3&tF*T!nFB|{QZ42!IeQC z=SLej^Vi|CpXL7_=g5V*<Dc`}6=~C_D{}0L^x@o~m2>lwA9Q?L{!y|ej?8!*73A~X zjL0z=vv24B!!wSDXS9yY`~Nb+yH^-ya`<grr0wu<BHrCJbFoqWZk_jL8THATnemaw zyjUCL(}>`>Q8{OmaId=IDy^vNVQ*Kp2j)fo&5V?k@AhJ(?ei67-5q{-D718MVm((? zS$6m3Gs=3RqO5yEYyS#mJ&?0y;E6@tl23PrO798n-W4nL+EC_odCNV$Bs_X$IPi)f z{d4n8#@<;$PV#~;4;TL<6nuBy59aku`teBk?cLDj6BVaElB190_xnQEx8<6@Rha(o zX-^*0mGQP+8UzB*pBKJAHOS<o*y6_qo%}R5#8I)ceLgYobMos&v7Kck-;fucx*<Kh zHavB8<j2KT9?p3|XkNz$v7L~=$K*4Q!Y}gu=V|5W^!?oQ`=+#VN$z`VdVWv(_&|F3 zczREpO${&2%xhNk!tA_Qc6P_JbCW7tYMZIWp}LW3MJgbuusA&PRq7?#Nte%h<Dk>6 zB6GLQ%x+t8)!xwz`-UP8h$KHGpALyU$94OJ1NRM|p_={k>puCrSI#*gzl#PO9zNV9 z=j>7a0t0LndZCGS46kmVdu*Q92BD?RqE}c}BSKZ|7?iX{KEcbpCcB2K>48c4L|<(k zs{%fo6sjAO9&eZyhU62E%CI0f|Eo2ls*|cUsyC=Q;|Ps9B5%(>tkQBY_}JicSB?m^ zkI4TjTa3sV<ElFhON%Tsm7Kb&Drt1_@=9VV-Oh_N{xUCngQ&})E*QOTuQs(&RMAjR zL&Y9iPt9w!dKc%KcO&&?#NL?_DfvP;f=0M2GkjO5@1{`99TlzrE8lO<+~1Y=zbg8F zAoPD%Uianv`@$Kw=I^5wUHm&&KT^^64dJK1<z4s#_5U$EaZxOTOY`Z{P}3iyx2_6R z-;x%t4QJ4Cxa;<`OoKg`yF66gffjoyI_C38@#)bfABN5r<u$wdrlv7X12uh?=b4cw z`!G*9E7D!<HT$wdUn-d_$+@a?&rVw^sX;^bbWtT&Js;yocBqn7D($J<St{L^nN-21 z)b~?)Lv<UqlGHX-_oGzcQDaPfBD+4Q(4!g%bi8)v)V>YFGs9a~(rm+u5+_CCZ5^80 zGW0Y#)U|!|$u4<qmiONIwtXmh*U<9UL%m<ir=4>azxJg30;g=7_W?Pwcg~v_Ewxwv zKfL0QBf=GA?6>kdJl7r(4YYrLrNd~ky}~WKhq8ChowvzrQrg=%eHmX-<jC}MKsaPX zs0k*Tkk^P{v+<$Hap~uTaKom-`x~X_5Ec)`#^Gfi+mZRkLg=5D`jK`YQvs7~UNiF8 zK9MT_tDsbiXa1AS)BFl$*h76*UY}HGb#^|fXE!(J&CjgC)bPf~IX<JpOtkyQ!J-fc z9X~ZX{)5oNTY14B&qmL)yFQG>nwm4<the*&lbkg(EiH(gQpu0E5Vld*MqMkkp}G^Q zv0Ksn{AM?=W%++W{_o7S=x|y-e;lfuTJ^`@mvX<igDl=k&)&}6^=xWB!5Hu7_mA^! zdS1};hk2$Cb1t9G>p6dF&Uimhq3`(f<6QSyMr1}t14>~leVIOenq%{F|1WZMVcJ6V z3-WDFj_RZ8=see|SE=O6rc$L&tsHaEFEd=KTiRQK+_6)I9dL{H9pYE-3>qS*)Jx;< z8C%V`ncg%rEU%EH+$=LbF>_BkZju)~KR&;Y$??&-Zer*KhTkM~F+RN*nWOr^<7Dp| z(o!uts9N<KRfJWmv$|*XP!u2T`e|#+ylD<r<mmiQ=a>EIVE0ljQe`OhpGrkSRfpIn z!*ZTFas2oLs@|-hevtU1tN!Zkgq+2*!{Y{JY>?L$d8&=m^Km(EV6GjVcfZ`%&hAj6 zN^mNIk`qJnN!303Gm!8ys0XACR?pV?pY6C=#sQD<kd4i+gL4)eR|Pc|2(GY0c&S6C z-c_j!$7)lfY<aazdqg!Wsix)<ui&iE0gG^MXz0DXA#}&cJqTCaXI3a^R%NFw$gfr| zi5jz4Xm72|4Mn5sSvfv4ls7%}Ju`H#4QJYoRCVD}y<A<^vX6)=<LVgM#iM^lywuND z`AN;<;_Fpk$sSj#OsObYDtRpk7ogi26)jKCy}!ua^@CO98Rq5NlDt_Up9I6}(>wVD zzvE~&^;>y@=fdGn1=~HHPmfi)<Dm*yJsC~H8iuYOu56rV^7n)A5DS)N@@3jwoL24H zWxVv}%j$Wjr8i=P_-%GZ&;C^`e!ZEKUM&r$EzR%tB3Ai}ZZ0}OtyT6UeLo@ZF_~}t zFg`Oco-;n*Y5yVNzF`$DjL83_XW11AO+W%`hWb$N@O+w(7I=yVRdlspsBwJG;=dge z8XKMex5~GTb9B>C^@ib@@zrZwt{#(5TU7TPmtP7sLO>{ez5mfCE-hR<Ax9?U_%`{S z{k>UUTjmJty?u1h4$&rG{U53lJr|>6FGF6t=FDv>J;ejMeTAI1P0vV*?ece%v^hNY z(N8*Wld9z*`HmZh<$ruWEF;151D8!mzc<YHGG-g**qEF-G%wswR*)0wOR~oyE|#eo znUOh}mANeXpWK|0&#3B)9Ob>R(=<HP3MG7$?~tsy{WO1PR+{A9$mh2soyla@>vMUt z-f0!yn&+cqUW}#iSbkyMKObs)Dd#+uPcP>C%enreoX0wSJKv#|DQW-3N=H1IHrcN% z4xgV*yHBL8$MbqPM;=Mb==Pqp{zA@qI@i7&x_>Rd@zTB!Z80VEOjpo<)6(ZR@_H>? zLGQeq^WMyFG}3!%eM;{3di7~qsQ$ye`T4~JKF+zX=8DhKhV_lK>gO3RJjNGX#!h|N zc^MfR*?yLGTbQ4#>G9baH=2=@Sd{T!9KI-f*7?6Z^CUW?%C!pE{D7stnXLE$ncWQ{ zLD$XSvHzRVVU^TJeGtXyik?ve><#^h5v(67mBnC1;K1k|tGp)We7u2MHqIHY**NE- z99I4Ixx#sqat=?_rlGi<Ld}~6<9{V*4$fH<bDkQggYtJ``ok|}_3t`)(}!O8P$hSj z^VPIhx6qnlx>U7J^%7Mm<sD@W&_s3(Q@ylQLWL7)YE_BtYp-J9w2Yuyf_4Wbg`j)m zy<7@^kuw%nQkn;~)G%~CO;@TaLcAnD9w6OBlV@fQ<>K+je3lpNPrlE|C%6OJ_$a@N zDmj9-UJs?dnqzN<a!Jc+Id4ji!BuaDe&5Ww?}VOS3XMJ&`r?H_^El#}(CovZSM>jM zDEjIA|8hmo_vh^Y<~u%mB2xMB+y}y+lGmF#_E1`QDc4(V^m6(%HJ@LvdiP2w_4OQg z|2Oh}EARJm&CHxt{7q=uS|#$^D9y=V2#t;Oc{tsuWI=DVQmF^2+F*P1C*7xd-r{&N z*-I$0GctjFK(Cd$%Bt}55|!DpBaqp%--imyEG@du&Kzo5(uuU3nT5pcc|AW!vU|=~ ziM2iS!*Wom(Y2+5pgNy+Lh+5owoa~I?$Lmb)T-rWRljy{=v(#H!TCNUG(R}UtW_6_ zqf5l9MuaccOFL_ZtJFz^OosoDH^zrIHm<&-^&vT9bbcF})<)zEp9e*sh;)rfD?@WO zKg-bcsn`Y9;94Ee@==W!DzYCL`=?L7ms*M|SM&{G+l$B8tE4$Il9|<NFB+9M)q%Ft z3=9OhLJp1?Pcp?W?J&O=TLFzbLU+&mAII>!tH3!sN69Gq8BYE(|99rQm<v2&uNr&e zsP72ns}E`ykR<X~E!A_h>=je?AXal*9a2vqN?~SUGm$~QB@$4!h-d~1(=WSP!)B_u z+kXZwSN+p7umnB}#lm0Y?VQjrON3p@AB>h!GVd_Y@QiTbC;85k&+;LmXN3zs$nPvD zZL)n;23?rnX69Zq)8|&c87p`Ob`#x$8^v7owd|@>c7$r?Y*k3rt5vxZSCqZE)r>VC zo?FaNrAcU%Wud~XTJ>gHU1aFnJ^>^m8f887t7upR6<#iOa;Z?fN~neJXIOQ%-N4qa zs7r>y<h*%I*2<flg}zbtz?>t_B>s&4VSv#&j(YjzCxmhb=LnAygtTSe(ALCI@7SQ4 zjq{g<vQ_?C8?{w_;nRV~i`Ib4_=Ru={UI(_^v{UgTW?m4CK;EflP@?lEkJgBksIYN zkI=~czj=kJ_>zX@?&H&E+yUqJPkW_0^pLc*PFj;w!GeM8a1&dlRPr{Ks*JOc`eo$t ze#wzi&)J?Ov<*2#Zn0reWvS?nO3h)}E4%EggyY&mjbb*lLJj<)C;`7L4E4<p#lq(( z29KfXvezxNi<;QL_Oupvnq3|FygF-6=!g9vj=ngwIx}2{&!A$NBq*?0rznzL&yHZV z;$G+QNufbCVLgdm0NNrk^k{ZI^J1x~%dh2Lq(kW)`GBgSa63Tp=&)k&B^~HR9-w=A zwKI1zGJIhjmCPu7uNuGcBhQ!bvRe;FyHDBU!2Y<t+qV~=u)Ru!aN3?USF>If+rFU# z)+Smd3D?P|74wP2#2;`1S}>#hBm6_FMbh#Qxq@XdD%Xz+Ee_3JD3|AO&3qo5{~eWw zgVu4%=)CORL(0qRDDh<cV&7C!8xQplJq`|!qGVA%J)vLNt*Xn~&qu{~_8YuoFF|O{ zF4%foDzz8Xp>lMQ1iZeb?r`y<kpZkA9xymZEoFF*4~>?UMPerm6>*It=~1fu+ZTog zfSbJBPmTgl8VXSDR;_3>AlFDWXFH**X$=jPdf@7-s|Q`r?5v)5N2rHgur%7&&I726 z#<x?0N(!VhPGHxus?~LdxcH@bcX(;0My|e}7jMqzk;L!i3>buTo?XdfmSXY6lD{RN zgmuVYG`-@C_d@Zcx`>!FaDltwM;@Me;RBjvNp*k7u2`e9(=u*UDOycsd{BH=-NU(j zJw}+8L7gQ6%~Lc#znKwKOUE|TGHH%()sDswb_-JB8vokK9#^uU@F07*?DXJl6|#*Z zZ>b9FxXUhcbT0lY_05;&Q}II=j#YaaI#tix9MK>=s1Oz|ft<{#r&UQ=o#nxqb5Y=t z`3z005_(3dd`U3**zgFf!dm8SLF;e}DNCCSh&)C&Ea-xT_`AHJBU~V^4GG!B23O%N zn4MPf%}x%qm5R(T7rjOcwyOAGp;EN3k~~`P$mpoq&etY}2t$?~z@1AD%iV%zU>q?K zGNm9-XSQeLjet2U`-m8EWA9v%EG>${yT);qv1#HJ(vH!U!6g2|9|O_YBZ-$tU3-<p z{i1TczUZTV*we#&_X-D)v+i#P4t2xD&7hgSnRPF_rIO#M4Z`{&b1$!fWcPV#{<0;| z8L6&1xZg>2{Ix8{yl}u5X$S73V?3>WQfLL-2N^<8{Pxb)Gd4U<wXce&TN(<3Q0(#t zVaX#wtDds#*iv@YV_l)CQh(fD7WP{3SLJQCnjOtl2Iq+^d;F>ZuD*QP8^bu*A%}HE zzN-a}uI=%qWtG2q=<M;v`=D(*big<KgXozjhop6$2$;X<j*k_pq6^9%(_|!1E1kgq zYPXQGYZM8r78M$W5sFlo4GlYpJmDFUqT=0!D@3DEFAgd32YQ62LH$F+BfKYch<&aH zr&T&Y`@?f}LH}cO1$|TOVC&vR0PG+#An*P`L2B=;oWD4W{Xt7We(r2kaTy=(>iI?= z%CK-R+N$s!kF2p7nByf<!gjWUn@Z|sS8qLo`)Eo$&I%upCnQ7Ej;F8e+hVTl@W;NA z=OW|Jjs|e3d+@TBh#Wb@+f5UZLwv4mITB7r3@yd>u=j_(4D3^4-&Qr``{y%>)jK_2 zBeZAN4f*OcxVFlkXmpky$(Y2)`oc!nBQxI>PDM#})hv1qjiG0@kLVJ4s~0q$-5&JM znPtZ`cd`Et#4e9ayJb%})>N<X2AgV0xSQM}!Bj4=R|Bb`J=n4A&*$lIfPD>RwXBd? zG8eEepA5{x%3LXb;Zt;0@QwY@P!1}$3nA(1cT~z#KO)zXu%kn71=ozr|D^Pg+@m0S zwk67dL)fijs(YX`9#Tl2=Tx34PwKjr{O9dKor5asACS-P$VXVBvEs`3WMF<rcM#C( z)pvNuPCRJEPC76K{<7Dl-7Ly(Kh9Y_*Qmu|2X6Dr_QtD5s_ZcADq6!68?Dlsv&wEQ zP~Y&hPKU7M#b6-0wbE|!gz^4ET8@z#g=6hrNH4-nunb-1>f%eX8v<%Z!S)6s<>()} z*&Z(KxtBc#>3#HJ*YD+fb~Pha(FYVO_lcH=C+v<Pu2nF#T~q0FyFWn0_KKwq_~+rN zS)nV|04%~vC~|yRb<{eAMU~WcH3@A;4HSqb*}!%!kqM4NNpF3FF8trD_T!=zWI)@a z!#-Ry^Ucl@q`Up5;P%<Mt6U_SMeoRd2&$Q1>=JB8T$xLBhu9rES#)7>&VufE5*FtB z=eds8jpvB(cWE>h>_o>|NAPLBiARVHF3K4YTe^}_poySKJ9(A8GK>)~0gOZc*=d7L zwdXYp&B&MCv&#+=_OmGa2C@0p2nE{JVYSc%+nG%b9T&Qj$5L`5Ww41m+Y=muCOgGd zMGNH2xjSiL?+FryRHO5ZsnM2YNq^ZJQA`F3lQ#f|kTHItqu@k4i}6I2{eQF|SJS?K zuxObd`EzUJv%AveeIn8H!QAQ%#6#w^rMDz4xr58>Th%YmY(ES&(@9uSBDBGl*Dm`? zALKpQ3kgS*=pGp_@`jpVt>U9uGv}cYaa-Oux!Xm?&dvP6_4-D3(*$L=p@OyeH1yVP zx@OI8ajLA99r}uYub?AbWo)!VBZyE#&pcL;5b9uWvo~0i_H<(j!z^}CDF_aBlqF+K zNphG5wHpO8r|2L%Nbya<4UQR~GW+~3bP8(|vP5-$*Y~pbm>o~-T!Lq49J@l1HTIz- zTdcmYw<Al;j-8~JedA@`^3<b^A`kg1WW1Jp&;&hmUcnmBgV<`(ucEreZW9UR2NFXj ze@EtgGTGi@Yllup=lh_XO>#maW#=C~>zB{)PC*Mp(gKTDd<T{*Qc`9Cdzy7Xzt|%N z&61HuQ15vo;Sqbr6zl{k;gVwa$}uh|3<{*<*~Qu?%V9P9g>}nuZIj}#4q8_g3#M?* zO8@Ic*-MPQQhc{|hbaip%%UvugJSE-FtKZ6*^vf!m^-uvlUp6bCM(zkvZ+@y%u<k_ zP;_{)?ATO%CnynR@#)#yNp=N<UwlFKIp-f@9n{kgJjWJiJ)m(YO7vFCv;s@Uo?mE} zjONY6MS6-d$_|8d3tlJHcmeI7gWHN%+tsW>PsYxGwhF>xtMZVSor3TbjK=qfm-vHl zAln|rvt8|f#OokJ!pkmGb8()9ytPZM9`MNGNYAi1E#O#~pHG0V0*b<4#Zt55&T@Z( zt8tDoC^CRvrE~cncyge4G>g89=LT&Ji`<1ncuwG4-b(1ub<V;^z4IMrTQ~P0jm<bZ zWo6(D{W1O|o2Mle*uzkxUXhe-=?(2~jO_V?FX;^)q=E(^U2?(>aH!WA+9!W$Uih%| ztL#=JB89(56LJO;Dti{;EAp5gDOlcG89ptX%q}T53be$ESu1y@TSTq#2hJ$F9NH_j z<UYY7berck62*41_b$JuT~j>^8>Q@-Mkm-OxNx$kpa*FaJ5lk(i8|7{{2T01yuf46 znnllalld;YyhGo9lf%HnL6@ThG~pk67^RZ;Bq>fb6YJz{ALv@1a6s<K!eDpXH<KJ7 zJ5(NBtLm>&mpy|c$uBVw@&R7dp8a==-WBn|<7kjRF38<Zs;!_OasvHZi-k{oLi@0v zxgy^k<q;EeES5o^^puA13=pj`XyiV{Z-(=5G_ERo)_uy3-w>xg+-U(8h#i(a3yQ$$ z_=K%jY-tqdS=gnX27dL8zogiO^n^VR2jzd+ASj7%-yFlTFfP4=JBEaQNM?34J{g>A z*ir7Fcc@>64O*a`$W+f!q`YxLLlA<oF(>%fJ<2|f%dcxsn{*l;@np1x5g?VzevoF1 z7DmCmmgWx<D{)(B1{L7oA}5MIDAqZwCI^Aeg2`FwxL<$iV0Pm2{UP;C%l5CNJK$a4 za8=p0udKdc`-%wQ2)r&|%GlVMoO~v`;R$vEj|90(+W3oawB^al)n)H9z7w8o-ix&& zBO7TMXOun2*c^JUSH{qI8lkf5Bgw06vrkKT4w|lLWUB{Rl4zRe*ch&rr$(P5H?AX{ zicBDR*j(}fa8`MtJv&453yjIHq+3~wVl13PR>23f@LCxgdWPg81H8+A+xm=t(G+U% z%{-zKSXXuun&zb}JMz+(c3Q;kxYt~H-ol+-nIU)=E`s7qyo|4OrEr`0344QnEy&Mb zs89S+PT{=B7S_h{h`eY7tA)plG@@~>8?ly$oh3d=qn9iSw$I#HB-3;Dm(lGw*lH90 zF?$c<HF{G{6~EsK)xF7C`yH1EG_6B^LT{oeJi&H`UYO@E`jPI$pST7xK<!#3Tf|0< zA`12FWX!T?b8|&knGts~y7&zp<B^gFhBxFLi-NmGt2}S$t{_qp2erYA<vuhVYGL<6 zxmpxQq-DhxiXIk`SUFTMJXe_+cyCB(&UvnYB1h$OvD=FsjapC`&LSn{85K{kTq}CJ zcrS`1bB(NZoGL!f>jqJhRmI<eM`$xBr`S97JRfO^3sI_gN8!*Sw^&RtoIOXyn`j>h z!1ZK@F_qaZi$;uU#ZZ;GrL*|i+24MF4fsLX+~$)$K|Sb-b&f7up{V)!Wo|y9*9AE) zMmIOdt=o|iXw{ndf($sTcf^}zj#&TuNq&(j_+^fZsayS3V$`4K{2BR8)M82H&y^b@ zF8ywG)+cF)H7(=%gG5bUPlS6~+LUART5^`Gu$71Oa=yKlE9Aq<+7R3RFn1Cq`6U0d z!L=kuQQj{P1dIN&iq>bR&*CNapp=n^o4V&|Wy&nc3x}2L!4jFQWqhqn5SiyI76;^4 zW}Vv`7AN9k`X63`lITy|K*oxS&=}AvZi3a!dbyS@y&S)H4@NbgWD2d}I(~ZBL4Z)) zs%h1{la}@;Ua8WU#m=%rGrF~}GnyM1>g$)^`=y=!q4C0X=(S)2s7EhLzCTTk;|hXe zcjG)7gWMaIHx1lOZ6-RE->m54l7)-9_1TWj<Oe)Nrb6jPz)=yjGF~iAvW3K2Sji^+ zVC9N9piD9zT8F;iG8xqTLM0>Ld8Ji;3T=B5Xbc(=@h*I&RXfDfeFc5-H}ETw)-<EB z)>hdSoP;q`=7v=ZbM*?xs5-E2j^b(aXO!_gpC0K$>#m(^24}qJ!-D)F*fDvpnd5zP zwn#poHdI1emFv}Ag1*_a;#V+-k(F7@-^t=Of7YDSt>h)^oxhWBl5cRm%rUvPdOpKQ z&^PT?{L8#N1Jh2KP4^+o<eFO7O=iN;Bq`bz$sL_LiX8C9dR90>j>N$9WzDqBk86Di zTbDn+WCx9nEyKQnTi7_HpneU{OV;v$$WKvb_6r`-e@|*8-4A_{+m5rIQ5ZC3Y(+d| zeXo^kAvw>$>%~J$%F9?9lW~x9(K9X5Cid>u2YxZJ1`!*aQ!p0FFq?EwiOlm`K?}u# zXKAp#;j`uV4%H0FHKHR%08%z{XoZAlP1A$p@)@<TVT*=D1>`>7H-g<NnsGN;tVoF- z=^uo&T%r_9v^_l}N%YNp@v5wve#sp~H=Z79!j<S*tbbUJX&163^*sa6nf&&WKM!BC zH^?ph)VkftdB0JYXm~-3q$H|lEyCWYsd!vb(wJ(#jgPr9QgmtYsX)XKX0e?M57KUB z=GixPHTLXYGE`PdUwh>!l*N<AiYd|=)|rvx?0#s%tNdT0+9euSFbFFReq)z;KKN2Z zpLNIcuqYCTeBcMLIz)yagh$@mqn?+tnZ1O04cgONkq}WsxS7=LmVUxJMwP|P+qiOi z3`v!pn2oYAC3SE+Twi>ZaLj_}i{e8S;k3%iifYuyE?bggMvRZXcVv&uKw5yrgyj2# zGt6W?e|gB*TTsZL{LXjCURfnQrh&+89%3j;e(Y-bEA}R1glD3E?gQ_zeMnAz(1NjC z%jPNm3|PZ=9s>3#YNnM|jx1$kl08O+-<jV4Wfgfu%C3^*We!+&e3O0BQzJrZ56P9{ zR`SB^t3h8`yTPvpXOWs>czh}7Ok9zE>sdWLEGG+VRGw*MejSy#&-(eR?#9?$&(kgb zNKVVEAwyV~W{xL@Jdy{nQ9j|u9_bI=hQH->$q}bZMU`k-zDL~eOmi_hPX~daW9R_o zLSU$^XL`Xpz`ZP1qioFS`$qLN<bf3pg;Lp8#S4Od*<$o1M95FKFqos<fnKGV`09G( zd4{G(WD7}0ntMtuv%%VO&(0vT#j!_7KJ!;%4K%b-;dAn2sGp~eCF<$5&i;`z#`g8e z{Q2Dx_Mlp2EDKbG3arvZopd=5&6xB>`<_ML^>buepifEH60zc;=Wi`E!pcLNVrk;a zP>%o61iw_DNO^0@P!@hJ89($4y92(bDM)VFODJZIoGlk>cok2?FX&=uzKzIxc-mk) zz~3|>p68cB$@DGF?>HUoE;6k2R%8xM>MMFH5jQ?(a|lTl|B2iaEiBg&jjFYBPtvU9 z#gLt3D4wSW`&HCSw_6eCiO{0hCn<sEcwc0evO`@19TZuF^URnY;BYf#cE~iI0}{R~ z^J5;?PMahoIR;DAtE2MWU|e>=oJgQAA|Kn6vugDuO94Vcv$6@TCY_gaSdX5X1v)2Z z%GMy?VP{f8b$_vCb^_~G-fi)(Swm6sZsh@WM$S*omGX|rMBX@=d$76KWJk_`>1p9c z?AGGL70;WRR>;7j5jyjvIESZ^?Zbjykd~lz-VpOF7pbg1VAFh2-4S<|j74i+<yN_x zyp@q?9VyEKE`?65rK2ra5sRa(`sO_22HWu^^FE80`rm3NcvW7E{I;Uy$Xr=8Y(NM? z_SxFG0`7$`a3}3EC*#bEU)qKBpj&zZkMX(Db$q^_8;&S`lfju)6ho7ic{WeQi$@yZ z8njaKL~$rf8@hs1SR8&q5o}<7)sBoc9M9`1%EEq_QQ4UK!=J7%IKzzb9?)0COG@66 z&GJ$`v%DuhZiqq-D1R&~*UXoEmm;0;p%*Hr4@!PP$#i$Dpj}vy9Y(&(M3Naq(z7gh zc3Ht_0Gg2hP$bUknK8Sku|}3<4!iR94B`bV<Qe#MXh+e=f-Q#SiFj3bQkH9W_YgBH zQ30M0S)HPaaOS$XQd`R^4=kHXRIlXa@gqY!xCHfi6;F-|ETVlq(iahp9(gj<#0$|L zU(u)ewIkdl0^&HCjjCBQee;c$AW!L8Q6O<1Ik?89mR_MQ78^uf{51vH7Qbhs%2LO@ zP-M^ekF2Ye`DdhL!lMuf-AuAf<$AM8%Z$kJvrdX`9FlBlzP_&L0Qe8`F5aP%y+US@ z*fK%1T6lv0&RoiTAd8Dnr>x^trAiJp$v!ln<Qxsi8AYQ(P%1fCT}dLZljr9_6|uuP z-7+q`OJV>t7`clsM<ug+T&_U<Rw>I3v3{ZCiO?7<58foc9hyjn2%RDeePoV9I3zV} z47Y4r-QSax*b$vWma}`-$Y-m%$LE_2B`ajDBvKhbwr<gUR<o6L(S8}6)kan^?N*x{ zYiE-j;dg>@$c+utG8xn>Pck7#c%C6ix)W-p3kpUdb3_42x03BVr}E{<o+~<CB*AKU z^6;a0J<z1wh|Zwq_aphN7g`VwKy$Q1S-nMe@{z7kNms|jP8{i(BM|v=ze};m#lIV& z%IRqxUbZf5M%62nR^r^Oen^~bm6^eN^hM5_op!rIpT+x$SNM5k(#}ecKgtTBC&L}q zD}9_k&#1gZcnjv@A(CrI11ycMz%R9`BC>X5fYUa300-i3J}r4GsGmp68Vq?Md=}2N zI!Z<+KBEQYy3lsZB4_$nV{9b5M^?^_)U)<Q)Px^j1hn|<(I8%x%OK8C?BF%iCa*C| z%`B2CumV3v@hp;iFu9rLKPUU)G-F6NllLsgL7^X(w&)=~gv?iuMFf%31rR6n3x7hM z`ap}aDhGsm`i82t0MYP6ERWc@H>uA4L;JiT&?AcwN`gL%Hw<=JCGD1++kyF3Jn}Fn zS*j)WMX8Okex3r~7fzm#Z#WJPavpE6Y({8MyL6-c-HG8N>oMd}S^vTISv%kR<w-<l zt*xr%e``qSzU&;HtJJuY=ZFWb{~H%hGZrJ$FPyqwewQ^rtg;rMvLap9$k74Sok=R$ z#beSQSzwhs>{(Vot()T{2!Dur2n9_#SIrt2)7r%`8TXZ{YbI3VI55|+=SiFrFDB*s z<;ktT(jOGV)?klYBhN-+Q}R9Y|A`aJ&Mdj0?0Qc+G)GYv#7ak?tKxftRQRLIDp~On zIegGIX(Bg(Od&<d6H#7R%B-yxzLKkiCRG$ify-msBK@nSUFbyIu}~glL4NY;kaos| zR)#RyGbll8uJX+AiT3epi9q{IpPJE9BLd2yKWJ4s2hcH|hN+fTx{{VHK5z(!{X)aj zfyFOLi;0<{SXdE?<TqRrzAyNJWRP#nm);Rg$fAKgagw}lm;+K0)q&IeBi~3KzGKpX zoL~vl?J%QEwK@4L!@1P<;$ycCe^Kr<Gm@sP(juFd<S3s!&o&JW7h8=$mMyL%QCV?2 zJ5o@cEq#3_ZNQPT{H+B0I9Gp`wm;1=@=V=UE5)n^lg;LCZ^aW|{PuHmo}6u7cI(Eh zz|+sNUUz!FTSq`!kX0ly^sEX-z4l4&;#~JK2Y#Df-FHsTH!5T@IZ3|D%p*UocZ2k4 z6sv|y2A*if;*209(vk5O^_QgutuOmu`yKh;Y9pEFYOL`zu^;Fm>+<T6!7>M76Lto9 zPR?5gLB6vR)XSsYd|wv*P;y-8Av#I)fQPVm^aGql%E4S>Q1UX-FljqJzmVEIN7fkd zOIks|!@u1BhJV;=CE^c_%ar1yg1*JMyXQK-+~WI}g<j;h2p&|6_t7v(X?>#o#^6qr z$6qa9j2)%T;=wT=v^U*g1t32qBml9MTt9vu8k_f={=ij3(`y-PR;;3bBj7GH1TG{E zpjUU1zi4EfDUP(P>J!Xi4seEfHjdU+;z1lDe{@-9oA#B@vNZIET8(+H^sXQPIil=5 zlu>X-ThK6Wu{x5SB==}e`UmghGupM}a-hYov{yWKIEQxy*U*7voQzP}pAh==j2RCO z?GIg(d1yv<FYRko*xq{GGZJrLzL{+q(4xL132n#UW|h#?oV8u*98AjSsnWPdY7%ai z-^jXF?xqSdiAm<jH|SAQU#~}W5nqOtwKRxb2PReZ;>P8wkJGnRQ$68Fsjkqd-IwZq z|H$(lpZadQ<(fCsd)~7hgBC|evyG0#mvtldc|`5>^z50`FMBVNNM)0aLeF2cwoIj; zmGX<<znL+dm$~bn-*&Ff*eG{VQBo8I2k<9$hF7QOEbAe^n|fRFGTPGO(W&HiQ2N%t zqO6spQB^x%JHPCcDtD?mj>^pUjLzLRx~zLV4dT`7<#^vz_)%S;M}FHVeVCJx8<v%s zgDXkBMvm^7E0#n$&5KRdt@e86On%^c`P^&`$$5}?d+zl0tkd5jdX@hM56OHTm1lT4 z6{yG+noef$;(W65WNDrYsveawhOtNFS!l;0S)s|ZBf9xo)}p_gE38X_n`FC)g4l18 zMrMnvXtQSRt(^H@&YGU}xNqc|`Pn&jNXEu$+QE5>$<g_>?0or3)fcN+#k$m)uo~Cu zFe~gIOkbzuGa7^eS>rMicz`#~UC2<L7Bz()Pc1mK^=@LOujFbHn}-EDF7dck!jEF7 zvTo&TjZdFta81uz`495T!pMCq>!()z=AUuQNb~jJEAj>^x58&iVzTdt&t_-lNHLfK zk|KTjq^A(L3~CY`8r9d&GZw0-lvSMUjFOcEm9ZwQI$pl24aR;Y_fSF9$~jeDriJ>T zWVRi|AiI{wfR=bG_i?v{>Hp{9Z?<6ZtdUhLJu;9~;7^dXKD!!KUJsU@=$YT-M?-(O zMzm*e?xdQCUsznw4V=xRtZudX5LRER%ch!&)tD@QK1hgwbg@Q5yiDCT>uq2*_M&*8 z$P#SCB4A;%6Rl!kC9Iq?R9sQ<RMiUjd3f4nDY9JHX6xjx6C+L5&y_6cA(d|A1!SAE zs>~Op!3)SQYK^nr^6T&k%4V{v3^rj;$c1OYu@Y6|kl(IqY+0F3D~q?Qg4s7`&d6x1 zWhJwP1f7%b>YuQZ=H@D&Me$XneYK*lcSEBur=~-xOa4|WIH-~`HNV?yTbvdSk|Cgu zPN~T0>UYwH6_%{J5A#`_hWB&Dr}_JFDF3bS=c~Eu<Iv4JY0nz?w?oBh_q>{R)LU`A z`~&~XBAA|5c(!0IYZ~6q{|oc?jr8T!s^2f=dLBcv2>MbD2##pxFH2JXg7tLJjXVju z1)f_eBTAdN6aQyNMZxq11Pf8q*z8ywg}3E@(2#O%cwhM0<XVfQh*XK$49*;*))I@c zHVftAB32hK2-}8sLS6i2=wkiQDPOv)#hBG4hVVsn#SQrp)X3qV@VnJ9te%l+$C@{J zcztswj|bn&_{jE&q5I9#_69j)e6CT!AN`@wb#k>BibxCY;;T`;kX^`nEELCs!M=f+ zpmjVYVj>!;hTO#Tn$<KcXR%qxW9xu%tkuoF^M><sLPt=B$Sw^!C})Y`SoOn;BBq2R zaX|5l8#h)ad#7ZvvC73tc(RP9_$P~)wB(C-$DtWRQRk8|=6O6{iD~m%Lu^L9#Ii(b z>7CIz&lt#3vLZts0fZoOW;WTXMrcf)d0hTyJ!(U)q#XGbGYZxf$vMZNqGQD?wsJK> zEI6F6H-pkH`^G**J47zX4YgC&VVR$Cxt^?MFY6Pl*$C=6w4?IJn4C2t*KHB1*)p<c zO#bc>=_4bPt*wf|j_LoG;ouK~&UQ-6+h+FVnToZIjs7IRhNj<Qdit_aRVQtF_;pe4 z@s-Rg3)YS;yW~uDpbrXa84&G=-iM~W$)PSXnC-~};hE9%$~i~QlR0L?lCPbuVX0;K zjr6l;_WhaJ5((s25Q~M*Hp{Hy)VI@Hm890FO$+z(tE%WAOG9qoin)fxyELEpRQa+t zh-QakYT4IncF@Hpxj&E3d%>TguX7_yRGMthwfqMI(;Ms4WF38wJHp9xqXnOiyjdsX zx<N*;)JU@i)~a$5+ENuyL}^&Ysvb1rsXZy*6Ztkf*u)j&&+56tYDQjX6>G%NSmpe0 z*1<va>H^M8e<x(z__tQdoz<1=h|GN^eNlhAZ^q=qNUzUx9Ypg^CB3XNR~>3m#+VHx z-pqH)Bik?IKu)rV`2+c;XXM<Ea}8UfE!xJqU3YBD7!;XE+LFdFL}z-xdgj##^B%L* zaBYb@Ss%;>RLO+C(l0qs))ceU;3f8-byI9WYanPV)~4(Y`~>CW;Ial;oF6B%>&YD6 zkwN)H9-C)&Bs+~KgLPwFFsqm??3q++D^YmZK}<=u6u-JP?ZrA@m^qrCYxRrGARCky zprA>XynQ(66m<Z;2!0`*^`@RSX&wH5mOPEmek$3T`~xgKHWq1PrLgP=Rxs<O+^J}E z+)svyg77Nv&-3%G5n90s!_#9H9QjT1%Rh#PU|=3KaaUgPQkh3Chgu`Pt(SAl%35oc ztvux48W~!LbBCsH&<yVwK9z|p4}^S@i9=SCZbin?4dURv^8d(O@3?gkqjOYd3fVtC zt%^umE3r!2S3{ro-Rerag{&VQ<Rj!qWB<|w?9-8vA!>W6slsb0r<bM8A0?+iY;|ak zdII!70+Y`6yjU+%KpimkSB7L%+N$4poNyM)tK@65{rG$6V$o%CU%Xo0sVZewC(Bfp zKSgGUmWWW{jS_Pz`4;?MdH_v}JMm7*P!la{hC-kL`6GDO3N_v(D}U`u!YXGYvb~q* z1B;-sz}0Xl`8HM)vaE4W!E`V$d;pcuYtSIXArB5R;aiaL!dD=&S=LdqZ%ed_?M}j^ z(ey#APDK{BGhV={Y<Qk6c3sJP)K75&dR49miP|gQOYB?piq$Opo19)AQBYTgZB;UT zcsE3?3-|J~$T%w16ZC@jVs3iPB9)iyrGKP~OsQqzJ>JQZnQYATlfOq)f={S;{r!dM zir=5_qGZgHV)&6CgSP+%E`N=;IyF4~kaAf^N^ih};@SS^-C)<TYIr~Ar8lHHso;3| z%$w)_P$J}4vL<ET8gIX-vk6bKm1QoKdzSi>ABJXBmgEmB-bj%Y@tRV1M;+PE(pP@I z+4-azE-fVXJu|JT2qoiI#DqO3D#I_R0_e<KqyD{$`6|76X^&h}OO1U&QmO^V-c(Up z<;^#Ppr_}GkMjN?(qF~exAT_G%Wj+=Z2exYC1K?jkfmxV$^@44Wj|jTy)$zrJNm=4 zqOKLh{$74@zGx20o0VhM=CYl|_05UuDr&#UM=rIT*^{%Y_S9<85?>_$kv91$r{;W5 z?Ai6hxO|?LjU3xkt(UTg1<GgFny=y^LSuM|1eb9}rt?1WQ=v04av36!mbg4$H+$NO z6>$^(Lb3!(<iCK-OI->6pOO#4<`rEm=$u@Gb7ew7xqOYHl-g4hh~I-Hse+a2ZepeV zBh5-|LhG<7?<8NqsGt*TXGrW-EA&QYYhN!)w9%?h@!Ii~q|>JA&sL6jmsL8Yw{ocD z$;emKBiRW&B{D_GQfvL!$zA+!HU3%^=A;L-!;``qfKRP;CjC`(ur5xnB+WpQxfjb> zG|1SnBuea5eyNpJv@+x_3PSp=k!$H6QD5JkA%Aa;oF{VSd@{4hC|HayMjk!yBD{u* zWT<$-D!i#|1Q~d0nY1b%g=+Y4V4)HhL;>y$CGmyG?v%qq=c*z>;#xN?I*evM%U#s9 zkWu1{q8sErp(@q``yTG2r9|rGPId)f(WJ&<WagBINTiIMl|MkI^E}9mg`8wSxGV1i z-xUw1fBehjK7UN3nr+x$_AVLDTH~vx(|BJ{1s`qkce`3OFSE}_(<}e;Y=}eA$)ZU7 z-ux%{09v5eWKgSq!Pb)t#k(L{5Bu<ysBK%a!sHq7>3H$s@yhbndCKM4+O!nEv^#iy zcXKaThITEnBHlRBBZyVy4!Wv%^+-~@tR1M(Xh4zjb^N9e;zLH>{FKaFSw?aujElKl zBi~R8jU>yCW-U2C#*xmG0jZC220j0(m9}$d`n%K?w*rv8&j+bSnktDfFAWYsqa)D{ zPi3VJ-6EO~fw*6}zX~}b(Q-?zIVzfvt;nXC721Xb+R_p{A>z>^bV%cr>?`?=Y&^ap zISrl@)fscK10yJ=0h!R{GCV{JAP5$S>;mxyC<X`0krm^x(jQf#3v?o{i1j1$uAozL zhgAiWF1LHdT&*gC(BOBGN-MWylAuHMTB3yz4b0{&*nq!4CKf3x3yK6Gr&$y8@*Jfu zE6G^$S#gIvzLH}lyT4E&nXPh|7$_TqZ-qzA`ZhFdKO#N|S)_Qaco4`#d8r}_Y*%zn z253$86GU6q&1%z&bi?iX?~bB9`XI}v)It-_*L%;c=ARr)Ha%Ll+Q~iGx9kTfjMuef zenEwN*sKN_pQ1@c*08P$eX^%WA8XqRPSZ1dY<}F)obalY75ebE%Fw(wELH0Y_=oJm z0@w3C@;uXHb^@4?_g8X6P3MjBnHP0~{8dSm_Sz^{s2Hy%<A%ADUB2W3@e|1XEj}y~ zfZf3EuxFhSFh=52avfyg;biy_MYAf)SjY>f%~_WCnST?aQC(C0%@6bWi|`FhB%(Sy z=s^~Vn5+8GDnGv$S<l}+D=3JaXN8nXZ;pSIcI-RwW{#?h`(;}DAZMwu`*Hra+wMC# z1FrGeo`UaG9{efsi@qD=^>h_?u%C+BxX;Efd2e;}u~d8hZ;n2n>ba_xt6|Q*e=NU0 z7_X}Ro9v+ULXN2r{b<g3G_U8<#=Uvl<>{Hc#0y?bpP;nY)2Fv`)vNidR<u|Q?8eUu zPpPD<3iSJV5`KBvFe*5{m*+2)@T}_MdG$<cMVB2LR9}T+Ws-_PsJU419gL>}uS(m_ zvVxI+RlXXXODEHfG_#l{{UXxL&K0*5iG?D0qRAsOX)gIu$yyQ&C6|?T)^(BOvgO%c zBsFPXbf1;ytYYUwa4LMr8X%?F%TNXhR<thN$I6GKWKs-D|K!#=R&p2oj)VESia(J? zmifYauW|~HBiSx?EJj?cQaKr@w^*sPZNE@3tzX)vfpIyRO4}P5<AP6%L@uipik2gp z<y(sT(0EqWkSX*d8N|wyoyu#$;^g%w9U%?gY~Hv2k?~q4xji=-Pum#3b#pH5OM8)z z5TtB5o>9j<ArFLoedOlQ=VZDuGsa>kyb1-8@=nmz)-FLa{KYJKYoSVQG00|geks1| zQPtS`1w!<8o;_yykogD)Re#AK9`646e|TDul`|nyMP)!coAP^>Og!zAM7#m^E0yC{ zYMjZ)v%`aG$l6vDT>M8xO`b)Sr({ftsg8{&LtJ!Xu27eJ!<?@gA<sIgr#3kcyZXsv z)82;F|7E8j9u_|9A{9waIX^J_nA}fByET5U;}hW{=9{-iP{~}fXN2)!O_XSsaUpe4 z6dB4BLSONtlicXa4gqq{L>JY4S*MyE`qE64S`ugmvJsbuC`B|O5omyZ=U0V1O4U{N zFUsnX%nNoHPG;*_UCN$STb7-QV@tfL?4qK2U#V`$&&ckclQYF>#AtXDt%3Gebd&8Y zHd87*^W7C0J~J|iH<Mq{o+uyXT$Y~i#h#m*Ge!IDn<DPRzGK6dyND(7y|CROBpJ3{ zky<Js$&Vmw<i_%xTVJhuG`-Qv)5%eku|kf?+mR(hqFJX}<d<>6jiek7gv{`woS5QQ z;YDbsZ>rIfe|(}m2)r<*<&r-H<@E}ustsPMUO@Vg6(5T1KH87fQq~H<U67~sBJ!W` zv6Tt(Va+1x1fQ8xdErnKY{p{cTa`Ux6^#6A^(;g@{10X0Za7e626`t)NDAwP<fgkL zOM=9Oj^zH4LL>{+$6sGoR+7NbnEM+a{uh|4<cPx}Bo4F#*Rcf(<|Co45hR(&Du_~* z5UV!TEg`#kM~kh%pH#E~WTwWHKC?+wJSiEKEEx!t4Ci4NPlET^t~h#l#Y;GkFH!~p zKPJ4&mX{mId(JNi-QgwvNK(;vIt7NZininwvs2VTD3*_y5lf0ZBq#gkQ;~^s9ZGFP zvVycC``CM8FZu(O;(xyvspzxpys|dNRRhvL5j}r-0pO?&)5efoE1CqS$&VZuStBkk zzmTLXD{I!tue_e(kY$|gBd<mz{H#i&cvD&935R);8|v1h92Nm9t=P3}WWGDd48O1| ztT|x!@NHTrp_VKw1mDYKLf2x{#sA1tD&tO0nbk{p1s&mGyoKB5q@^CQ*404u>RH)L zxRwW$XN|03pTiDCrttxgeR7rxpYlDi1f5TFx(it+ySn5VXoF=2MZlQ&pUiL%USF1$ zJK=4fH?l(J6>lO7Og~5nvY~hp#1>@SxhD%we%F%7lnhuUGvFmX;)i7u;VXVomKZyT zc4yh+3)U+?6>ls{sAQFq?07`X!S(p8WOmZ^D2Lx&t8JNek^+Z|5Q(LbBeaw=$ph5N z#wu%2Wvg0?OP}Ctd%(jDe7w9ltPxUy?MP<eTKEXZvX^l-4}#U(rQ!q>gl6O(dKwmU zsa?UQqJ>Bvz8G&Y9%nAdtcqjF1%&kZ>5I4C$f=3!O48XZ*sIWt$p7Krk(Xv>?2NG} z$9T%&deJ%gk+J|j43-uHgl+AZ!Qbe(U1W*{Agaf=%&X{k9!6OYe3G;gy`=?}KHQI2 zlAe+yC;#H39F?t5c7?TrojcGv(6}tP;#2hvHOT>@Z)qt{#g5^f62mKc%oy-Hl<HYD zb>SG+I$wxPLYSDAr`wD-da_ENP05eMf<ifvBb;kZEqkl@LwH(BjS#$oHbs17IF8JF z?Z^*4JQ)IHC_g5&2K$h|@D3a*$|93_Y(Ci=NDdCvWgR$tX7?hyZ;gxe5fKt)Dtozn zHJ?R>2L^4epEm8`MebR%J|dsh3@x$aQE5~3)P7v*&%%n%g6EtC@A0IPc%oXQtNq4g zPgwCTrbT{}>O4<uc%DmG3r-{b$;FbZ#`fo9l^e>&XQ!iV2n@D^$i(@|`6YTq*Fn_9 z10Zi(#xjo~3#U{$D;__n3!-oiZkLB8rXsdVO2S?$bF&`g=*pHQiAvO=M0`|WKn-FU zA_Uf2kX>KqT-LF=Gtd{5B^oTQ!S^oqU9c7!wwDE)kEMvVOT`TydoO$_x&jm8Hu=zA z)*s36EH$h3RWyd@on$O>6QAR3UJ5e2tYl<0LLVrXM3(Q#5-JvwI)^kz&%9Ly6H|o= zO4fHlPvoH0d!qenBbNGRtTqyk|6Ycy*%Sj*#fF_&s>VPb(3LZIGDV<@Jt#8<dMWk| ztq(7$nu`)xQ1U47jCB?00rf*3kd=zaJo)Q{-cS<Hn9Rz8{GG=$&&$ty>@(~DDTw5% zRKi2UgCk}P=|B?&>%byn0Q{{aG6cY4;N#_2(-*7N#oJs#TJztDW%C5Fo?%QhTGkn} zT-kPfz<g0<wJWM7*Ks;5sWtv9Euv6S`BHC=ZwjJB?OKLxX(SrLc&dHJHlanziZ}VU zJXs`@v4wr{6Me=XL@&a+j`^h?j#<90x?m5wiLZ#1QoYJrYLbudm%S>3%Neq?U~ZN? z>sTLYR{CC@&{AQGwB#q`q2n!fy|KfuXp8)_4i}n+b_y~@r@RTWxr~Z&b+tMUBqywl zifBzTLuRi?4qB1b<Oqu7GldJq`+36EsWXy1%IY2QB&?dd!r{e_C&P%IEvrJxnm$Oa zcr?rvUy9jdU+}0c_f^Y>w)?DTulxri2Ak6z5Lg*0nJj!c#$V<pj#G(4pUcRKRj^yk zpm9fK?2b}7i6<R}k!5f^jiN^ofpx014yv&37}77k5$)qfqsVK*H~M+x2ak5Q*i`)K zaG_Zu=h|a`7JoQdDw|whIPYMQgvAo0|J05pUtlv>)Cy#omk=k^RWK$>^~|KP(V#0! zti@gkW>?lM3yTdz50g!$ekCji(^{G0Y0)&AbI(G<OM=--?pld6pmuXe%E*H?S8!KZ zG0V2o2bR_Hu_ncgxb`6}_8U(;)aN(jZ*;}8=@GQ*ZLI<hMhocLDB}z0pddT*f(J_u zJ+45_P`NSjw4S2aaOlan6l%wn?pU6a4G7!XQ-XaiDuZ(&Y5!<A&&7LJDp&B`iRP$d zO$V4eD2Hc(P0mN5A{%YBAX<hF6Y*l9m$fsZ-~0+<;;`M!XbM<rS&mGrG!Yx3_%e$p zfJV}WKIySlH$0uzp_IKocpS(a+~8S@Kb}n>20_L+!bc5-(q82ZnLq4Z_PllVW&F)Q z>M*{n9V3bF<b%*kMzG9{mPDV)9Q0}q`281zhD+27&NF8a^pbFK$y>IUg)7l-;X(7s z3uJ{iN^?&%uSOePf#XSSa-h^!(@VAh^y3P+MV%h;Y8Hf5U-Cfc8Ca)Jv=&`!RZZzP z?Lpg;i?oz{C^}f)QOOFi9$roJlI>k0EUoDK0XdI<q^z+n>(}Mc<ApK`c!sZ-byhS0 z{J~-{D=-N!6V8T^P#s#5{|q^c$eB}=VZK$4hFz>cDz(yBr+iiDYkH2tPmb{w*)g=x zMXBWH8%seO=xSj;qoxI+H`Ue_1@rT>TLmlQ!wLhmDLNtBS~i9q!q^m_#Fi+v(LSiK z7yE?w%Px1a*6gNgwUw)7ahDw&#XF|uGc0KDOPLjT!_{yb|2<2EeIhFle`rZ|MahVp zo2Rmpr(};$&o}sy{adV7E0W6YZsfdGCMp7;OW%2>&>@cyxgn-lq#Vsk$KY`qmYk4J z#3tm$BBRt%DyvwFx2e!4yo*EVOVKlELwy`a$VnPZ{1A$B7x@DPud`G|lZxL2+Fv_Z zMjNsxL@l8|7P8nKdqBjCkBAS%%GDB|V$aBkV9i)V>O9DT#XxJzdw_-bl5mpjR=H|) zvP^B*s>HK!P^r1*ue+jUUUxCSQriVT@wMS**oYp0LP=h^fi#1$#c`}MJTI4^<Tm1R zRtKy?KNig)zXc)^6TtC)@sIso{^19*rbrMnjGW~w^^cS(dS6A}5`QMK=`r$N&INfy zm%9^dhF`gOlW9hLx?G--pROP+p$0mQHd-mY^1RkxlAKTgNo!r4r>D(n4c9{+?kt;6 zy-GXw(89|tD=nxmqiz|A<18r4Z1X3|lQiRgGs~=0h`Cs)#n;CVSL%p6v#g<(8zU1^ z%#wx6g5;^^X=6$9$*DC_>I%rvR_}+OjV*~TP~)okBwmDW<gl0Z)6SF4PwJrxwlXXT z#gEKiG$+Oc8HovKRnI+x3{T%>Z?Z471f#2AB%dBl$jpHzOI!<XXYZ8Uc!)vt24BcC z_diQQgi7v*tBoWdtNqL1aMaB{vGTiU5Iiaq7CI#D)tM+rhCPL2(KJfZN15REzBE@I znLjIVY59W5?O|9nvCIbkGIYegR2c-_K@<=m%u=$p%)VBkRy0RP%ajzcLqYH)UT_WM zf&=AHlvVvuX^A*nai(q^YUW=nR7zL#m!bDXX-~h|=kQtCO{VzP)gXbMVHvBZ^i6Nk zE`)~1^k1tyZw3G2alENo7+enRx<4F%uevHs0JWC*ezA2SCsqnQZxv^sj0J5^8sZo^ z4*dP@&Ps-|+?798{)jOkW#~@!o?hsgtI<!%cheKtjP)W9uB?wmk+3?7AiZIPKA|tN z!(7tsC0bf!y;(;A1yMpXB!uiL(#K4p77~ZWVbs*;p*Q&lcv|`R(1@p?p;;LIL52{R z+;T^JH=9<H@nVu}5Ce&a`kaX#SdjjrAU+keSLRwTOVmtsMgO7PVtbOdFjYZpB4qHr z=Rs5MV>F$^vkAKtn-s1q-dg@lpY_J`wg(lvw_ZWJ&Z1X~RiS@&9#XrlNa(e4B|kAe ziu=W4OFWjYFv_^i{Hq0SywMg5svy21IUS{W@UpAR>UrZrv$DiWHV|)#PwYi{9Y-4z z-)R~5Lxn}3z?|$N|HE6J5|5#Yay~wST#XjaAioQT>vOTcp$RpP*$vKN_wgDnm;Ph{ zRA-&{avyTR-@Kc6QcQvGQ_q|UJ*uVygIoXaN$3%FFHXi4W^y@gn1iz85_D<&ilj19 zMZV}YE~K|`Sh0BEc}U39YroW%(|6VsibuEgd?F9DWc2}hz@1PmZbXNyR&-WYKD)B$ zS{NMHsX1j7_`dipp#HMfw5+t0Enl)9_+%h2G)hLId&rtxM?uRY09u9nc_*!6XT7ot zNOf2rhttp{AHCR}D@K>;5d=hHpg>d%6`DgMhbBo@GLemMwGj$pmGGhzc?0vv0W4k; zl!bCtW+aVxOGORU>_u_L$^ZD3JV#5Y6h&)?v>_*0#jX)ag|IvooZvTT5l$c-VOM>G zHGDQh#>umgNGyy}bwxaw@0FEbcK@|+h3JnM5+u#4;CbM86}jTChq2MKV>FvO3i#Q1 z;u<PkSsyRUTs)bb!Y(N}f$k@IOj?%J|7z>9Y1F2K*2x*#hKw}JcC;o<Nn)H`YFXeb zw2pFcV7JP*qiV6I#u0dgyrNyLagwP<ZkXNT_haMn#nFqX0Y8`vlEApi9<i#T_yypu zGOKcTTnC+N56wW@{Of2-8?u4rmZCXvN^9Dk$D;+6$utqg8kmTI810xGg~R1lk4#(6 z<;&-fg~Zm%c_O7^pw{U*S3a^8jYF%uu?z50$$C+3O3n&Y<i(~yp>!i&;c2r@y4byV zL|g<Pp{rtn8x=H5BjFl$M#&3=&GDN4tDtE23pq#yGw~@y5d3$d4UiuV$|oofi3N_2 zSwHL`GlCaoctd#5g6nXZI&|w+=d!Ov_s}rkA<lPQ@gYF~a67u78^~HdqT(YZ(Yhl0 z@QbJ;%n!%oY6xOErtcli`DtXcNT(GaBp<}mEjS5=v&IT{(xapw41;gcCBF%|#jb!{ z)WM;7=_}(xcNDGV8uNi8iwt8mS>H+z7HiOm(@%b9*YT5)V&;?0gc?gd%z|Q!D2yvp zhD>sIG|j3r19H0Mtjp?hC;opUWG=Mtde|53l995!3j!B)fXn4AixK^QQTO(uRT;%` zd{P<@UBswh6M}Qm0Rm$JLFd+VY#<aG|A8n8X-Ej_&-J1U5h4{lp$N7<`^#n;Qs;g5 ze)e-%hu`|G^*sCQxmuJ!>g230k7PRW%lq=antNb*O#L_WFK@?_75ifD#r>;&l3yd2 zcJVr!q8*^(4RTZU)TQ~(o+otz_!-y1?{+7qZ!5-!?5k?Pz;{wVcGAi^ec#A<W@Cns zSd?NixX^6z$@o0$#w+u%Woy(NujiEU!uDP9lcG(3lMS2#2Jh@h2wX}g<no~~8QT1z z`h7N)y@ZaQFVFIOwFEvTajsW|#AEuwl$;u_P);7Frw#~nrxxkMSWLFs2_<%b;Ayaa z|IFv|W9(;{H0RS-7b(+>X~dbh%BN1{dpuWrOR$_QJnE#L6SGV7-)RGj#73*!#sFcF zoNr@{>Q=)f`jk~?z4<6(@Ll<C^M#ERA+gy!CL5~~99GKri-@4R)`kazl(Z!dr$hM$ zI!^DkFV-;2#p`8qcvapKp7BQ5uJLb}0FGk6d16sJ8^Vs$9yXGtk^h0>SsGj-&k%P= zS7klqu=wM=Jgcc{KwL$KX(LTD6ZR%Jql~_@1SC>4!`AZrY8g~vvkJV2tIIDHjrfyv zLn~^=%?@+}bNOHY)jzQudP=wSfVSdMvNP_fW!4|gsBVE3pcy<RTj!K5)$cxIpIBq~ z9?lUnX8)iH)(^8{Zs0R*z<sQkwe>q&NaC%)n^_~@nOT?{%5jZ88-aDUu30^wm_2J` z{k34cR!Mw8^6CYoiwP20IlVy4L623;!6@V|Yh6CZ2xuGK>)b9;XOZ^YxU4GQ!HVMv z$qLV+N1p3*b0bz^W37&iw;Fdg8j^_5f!=rk9?;6NQ27DYnM9F?{<g0lTEK^iHqAHY z(E9c+RdEJ+Tk(ka&)S+*`71Wh$t><MS0Q-oFGkiHmPEFM?vYcGSFEM)X<qZoPIj(= zYxr^dp2)pbC5J3ET~Z?keexN&Ok9erF8sk}W2u}!33;d_z*^EY$g27_8A85adw3#e zkT^3>Rv24JXM4}P*-zFnNb=dn1nY`UWPXfJ>%5u$5>~|iV)JRGR_+zM;M?+gBB!m9 z8+e-?F~9t?`K+bh{6Yq6J$^_Fc*%0V;t@;{duD#<u-W8Y_0MiHa~xA7Ca{|1pWRR^ z1flXS>L^J!)>EWT{_zT|oam7kVHb<t<zz^?cdqj>m?bQ?-I~0X+#nu;ZhLRMY{B!z z;?n~DL#4aF+fC33age{t8NS5{;GU~JK1d8G))VWCFZ7wm!K{l5)H11~aJp7M?QY`P z*aDsk+SgwvXUTu1quvP5|Hx$M2h?RO@?QLnj0Ij_6_M<Kh(TUMT|Xbm7xQ2=TQ)^s zWY|~(?QG7zSZGf5toT6eBl=mRRq=!qc+_HegCObeEIoQ+&T$&835}uAd<kU78ju0V z3zzQ)M~Ed`ZJbOYTL~r5MqZJZSZ%OcM0=>>?Z`IPhb=M3WE+R5ee=X>@qzxc+YeGF zk#W*`3;o*JOh?#0d%;9VY&~f<Dl5r$6f4DUIN6TPl`+Es8i#0}#SvR~Uu+Vb%uBHK zF$&r@*K|)kqTO1&Gs%U>NikeSvaEu$??{GO(HBw)@5o7!5jzpdojj0Lt||ux^5!6C z2&&8R-XIm#YIU4gC_6>I<gir1k#8B*N7IJPsT0MW6(O7CyoD-%NSAv&gWNg25SD_) z%Dda!;XFY-@yw?qUHZGSdNdH46R(Pb-A7K<XRBng6W{(#7(<+_vQ!IC=3BN$48rTk z<9(QCJMr36v}!LKU9{eO9GlRY5vmu|4ag%|O-Q!$TuEf8r^r-{2tD*h64n^5VS(9A z(XJn|CIS)3cIE&~!Dfr{#I`EVWCGN-iP7W)?8bub&kcHK@70#6H4|InU+k#RjyO{W zOWlunILq!&{SXt1|5$ej%V>&R#c%2lcnkYv+RYhO5*LVWiX-Hi_#RhkOBR5qVP`{V z5RQm+b9%~>%eEO=zS_PypSp{eHZw9|q9NCmeGrj08hC*x7w5`n@hoxm{5>g;*~jPc z%j^$iM90Zor<37`**_MYoNbJx&=$xZSA$8E31-#2_nGyz|A_p^ymxXtd**7EjZOA1 zTCPff^s%2<8;lK%o(1@5WQ*k^zpN}P6{Cx@EQ`i!`3+tcJ;x}~=Elb^@Ol^*C^{C} zIK|Ck3ZELYH(Ht%jJ)-QP)G(lCYFZwNZ^T?b<rFS%v@VjXad7vrddo;9LZBT58;TE zS>o16k4Ya-u7XkhzStGoP!UF|?K{MV$c5VVM55Z2PWDNVeeR-O=o=m(0p4o^dyo>+ zN{&_D)FUz@y0zyXE(!s9hEa$jT$#?X&oBlwAu359U_E?^c%BA#VwZLxIDC#7Di-L( znb-rnB*Kp7U0w#h5$U^HWK%t~Of9?Y>S71J+)A2TpJ}B?z^OT(%^IlTf}}#^@H1xK zYQf$1PGdvJ7EiCQbObtw>tt8ONc5b&!k&{Nh+Z$)Gl<qT*d;N7UeHW>U^hIUr;;M> z&($=L*W)9zSz0&0_UF<+ULI!G#^<v}WY9e%T>X~TJh^HQvr8Jwl2{MuP%mL%>+Sn= zoxHizSlIx0Pc0njv;Wij8n^tpdK7C+(#$s*RXL~b7DkINbK*9f5aZ1f<HMmymb|#F z$ce8vYu<Z8Zd4k+o9r5!?m8=FY~sE0UgE1zg0YI&NSamVIYgl1l^E%)8FVA}O76wO zp5xy%g!X!Kt6q_3d1}2jU-VO)<m_7Z7QW!a#YTGXUcQQ^idL$cwT7%04kpfA<XIK~ zZh?)9#9)q4KTK^U#XvZ7IT0BO(rq2!YW*pe_X#9p^<v?y1#ijL!H=E+wL;V|pLQWy z9G@r>|7cw7v{CT;Y%qR=)%2bNoHxWd%`W)IJ`%e(pf;8iCV+l0>z>7{Lq1x7IPfc- z81j0M3M-C{x7!Tv2rt1#(2KvdpiL34szJL}?9Z@=O;7x!k$TV>JrKjE(-$)bw~+yu zqrLJN(MAJjz!Y$q@5MLRc^C%<<r`!Pw2$*~mZ7~RYAtCTJPu!1o5auYF_3H=mpf%2 zJRK|Lyuvjb;jD`)B4r6lii#fpW0mk1uo7Lt$yzU;%ionn&8ms2_?2VXW96)@zQbfj zkC~DeVO#LUM$ax`26#BvvXxq4r+fz4mo0Qofti=p#mjl4i+(|V`o*K-DX<dc$a8q< z{H8O*%yXGKEJm4M@0#hY8gz-pG|T>%53v$*X+DJo`xfdK70@cOjeDV&Voi3RhT?5# zA@0WPd$PDEZ4=!=C*4igd246t^XzLJYF1!*yDO}-bs>G?G~@J1vgd@!c1*+S<-vVp z<w;CfAStz`a!ux18|(obM2<)i9l`6_gOr4_@SjW%o0qcB@#@etpOD9aE7&RAp;@q( zk4=H3oRneK^pkC<j#I1?lE(J15yr09qGE4Aa$WU}W>956e`>AFr}|panrr0M**M;D zYyQS&@&p(?-`hzJ4XOb?Go$HV8l;xlJhM6?N<Ia4x64J$R-fz#fa&={o?3J%vjXq% z;1D{_h5f|UoE$WRx8R#&rdW2~Q-wB6R0WY!_uviuKMVpxK=v!^u6C&Rq={qC4{B1U z294n-A^h6qjc_}jtw*pEmdB|-dZMn0yz!7QcUdDgyBrd)qrOZ%nwgc2;4ixmKgI9K zG1)=s6i;Wqcy@1&)H`vJdLFAP!&J6~bdX!@KFu)GJPUTk=VE?rHSJ>?{L3|b3@u6{ z;fFNP46~l3$P=nZgX`gJdO#{f#VlSnh9oBQG>_)62Q0d5_^XL==@P9{k7?gbJP$5| zToo}CUuPrZEpR?GTpzJG_SlF6*e2H7zxj1O%)eITQN&8V^szGxAlpXi`q%<dd|re0 z^&C;IIc0JA=vZ{~2xpKvYzKX^)>V7sB*`AkELS7?f~}zpdBS2i*om~^1<PwCL*xer z!cUfwgkQz2GNd#^))P0Xa;zxTovP<Z9DJ@$3QD**cQ}IzXAkwm?WB<AsS0wv^HuP) zWm1i1dq#=xSCMH1#hr18eviq~0^Sm~guC#SojgR|<qz~5b|sCTO_t$FaRKBajwbyi z9lF&r6eC)v@ji7n`uVZxWSs=^Ti9IdYYlh-=P87S#abUvricB+mZ&5qA9#sQ$mZi& zU`T}*hac=yaN5$_@ycWm?$CmsLs5JIFD?q@A6=u$vJ-=Neioec^NKP9D$n)IQ+c!a z4IaffaG+vJc3t$x%ZNE3H{Y?h<O+6W7eylw0X=pa4G#w=&@ISFZ}gTO)>lX*RP${9 z=6`60>=b6Rw+eWJh<bL>tiHk&5ILFPHDso-fqH{iXTjw!U=VfyFHfE!Psp1^mir-J z{1T}kTO`BC$Vg0xn3Po}U-8;(WK!T91yVyIAX_@7DqVemPk60tC%Y?R^mGWOt7#1l zO^!U12XmEv_pS(bTXvYGfwX-`Cds02AcZ0fXAD6DY>t`$vPw#=jXTAF`pBM|mEKUY zIX$*+^xZSmy6{lu(Y3`YEVp)fKx-}<vx>c`)vBl-k^6uuoNVA!zA~v~7hmUGORO@v z#E?VMI1&7x6Bn?8vY+rgDS*Y*u*j1-XF(nL%0Xv8;ZOM1n*rHnXVjBgXZgoiyC42% z`%lm5v}`&|Opodd)*B+k%&@jFByWK2v3hVLdycJ^A$BKQ4iVAR-m;1DuHr@v0fo{_ zSN=CwLDqJVU^&&|IOpc&aOh@24?8JeY+{$>`>CwAH{Ct}%&7e;e3EuO-H4p!A|udw zV8)8GWJx^BIE)ka^NuYVLhEQDKLIac_i33?VKr%<`Y-6)_~A>w#uc)Xv=tKUfAxSo zH*YJlf@4LB+F@^aOfj0PtE}sM3oH~{WgV@a-$=tWGImh>X8!fCY&}d?T!pU@&qDNY zD73DZwA|RmiDev(uzJd4i^qEx2e|{s9m`AeAYhUXksFOVDl#rRZu}%4Vub_Si373v zfl1jTH4M-QMBq74zDP^Fp;c0+2j)~;WY)V;x|(0`JKfhGcF#)iAmSvfi~1IGPww?i zRKdPfEf0@EqSg+-Y26?p^8!`C>b{4;V0#P_`&_jE_6s5?x2dwO+B~+Am0{i44=6or z!0z*vVL`SE$JB|!_=daytHZa8jPegWVYW*=rQV+XX6cMTZ6O;AKSLyZu~D+y_$0gq z`>9Hx{`v+dF0#Vc^+qggW&S6e#5y}OLzOlR<WxS~7@q<qvwKFbmR)~D=CHhZfQ0H3 zW`(`R2Eqk)V%ZD8;<oDzzwI}BDd8u$!VKtr*gD>p?GI^bQ>M~9V^cfdj=%BdLkvEy z({FZ>J24$^Y6f8|-(ttr8Nl+emMR@yjE^es%YQUC5DnC%9o6>ORj7^3@nU!^QeiHw z7ql(=)abM#f>EW3<HBB9v8sD;n`Q-C$d@>+pa1bDTKKJ#w%TRF1Jd8EkpS=V;7yz@ zF3uI{k{q#0Y%Ctp9AmZMR&yGrbFP5C$Hl>C?H}R0tTeXGz5V!93=zu9vl)T4!YGkJ zh*%~byFhwys%!uaQEQ?-Rx11w&cF?d<JcYf1hz-qQWc9Q@{_Eq&&?cLVJ6gts{O;0 zCF3|lGDI?H2#mv9m%qlangzKKSh|P{_l|8-(Fixg%ifT%J)f#a>ntrZ>)vxy59W*- zr*=ae-cp29Bth+I5@UY3wC|cu!4bi!jj)?Uu15w*outf;R>&;5v11$;=}LG?i}rfk z-_e@~)RjPma!q#n>HDd<dd1LcE<LS1_V!Y#R4@il_2!7s5leuVmC-G#pi`o3T)SP) z=F(19`6qJPX=LWsQ+-GJRh70I#;Vg6h#h9dkh0mB9u<?;9LC3MkaxI14_FFOy8R>O zfmfnMyaWryPmyitoLsWLw8RRFal@-D7Cx%#R~o=C7$5t@PQZgcx4tCLI6{B=0N=Tu z#e{y1@xsz)&(UlBa-CQP7wuVOmNv=^@u2#^OW^fkY;mL?zK-`L+oBN&UnI?wvv`;t z_>c#JQTTlM32&0&QDeBYrZNu`ZB`*XQqI@W4ZX+u=?9IXaUpUZ2M3&=GfqBA&oNL& z;*LBh8*T;o$l^z<#=`M!EW2LBPSFavAGKjLRWwmO09>I>%v@EVT}Qs0NStR9jgnMz zu2r7Pb6P+CUQeLO@(!VQYb<_owJ6id@c@mgC-WcJDd>X_7Jrl%)_>9{lBmi7!$=;A zjrcac+<LTkr1R6wlsi-fXn_>4Y}$D-YhLUJ?~1#`qp+8^JE??(VsO`Ri%g|I)j`6P z)qTJ?Wj|#?;WU57y@X1ttWjlNCKlp_#GEOjPdFEHNH0hj#?$P}8Nn~Ef${iva)XJ6 z*jQvd3B1W(d%qv<9g-r?^+6s1Cc}b?37~0NS|iX?I2>k%<Dbo)c5;hXegA5a<&c{= zwirwATp@~gK9%T4?Ft+RV?v~IgRVZiVW&9%1R;}W$c{|W{C1qFJ|V*-S}h|jAtmIh z$`wdUgcw5{*8|hZUlk4ep8euQRnz&8tg=PqM9xdxFAr%SCSN8ZGLPokj8*X@hLdA) z4w62p<-v{1LmRWY6udp#z_y4R_)pLC3@o0pu~MuYKgR0Vo5toDAOEcftO;C7KkS); zisYTyK=wQj%Y*QhWwK}s6pr`xG?K&ribf#jFu$xN)GUT0JDy`@#C&B(NEKFFq$Msb zp1~1fn(>e3gT9g{d`UR3-KnfQcE`F}OWr#!)926yk6;`)HrfYA(^2iR>#P6<f+o6J z6wmKtp=5{PGhS0GW|{Tle`thfg>~U<vmrVX1;8n0f*qBoz(x9@=j6$_*z$0_cFV4L zI$I76Syh$==gOk<0qqUp#hjjslYF=ES?oDqX;$73Q`5=AEHF>VbHT-I9465!LNCsg zF<Y<_tEE-Z12llAfM%gM`5GRLRm{t{&a+&rk0b-DXJ2=fE&K%(jKA|lGY%P9sm4`R z6_m^N*Eb$lUcl2xR2JBi@kCIm2*9oatAyQGYiYcAaQKS#U)e;hss3l(-AOw5tll~2 z9ZcTbOXteik^+^LtaG(ESl3JQWU~kJT%5k+G1!N4YdjliVTCZ(<i?EZiHJr!`Wq@> z_04Ral&<k5)}D8PGQ>I1Gn;D`_*OAM*@-Y+tT3Dilfj72eKXol>T;GjZ4dY9HI(b@ zS2+>LTqGqwZ%j}deJ2~`L9o7hW8HXWz2LoJT`Q`G@E%JG6K~H9mPyoSmJnm+3?<on zaRk1*I`Cr&gNPwRk*wCtCmW=8#HwjYykjJO!vpFow2aplk3oLwaLGftAG!<WtG^<X za2VgMHkU=_(V<V;%N|&fH_N_U^T!s^6`D==NkmqeRfpj1Bg824{ScANsr)c|+iBwP zhG*eFcrKY*e6LUVJzfqErAiL>(hf;_OXGQcENy<#r}7gdP*mfzhW2~0G*B&z&IYMP zu{L_Ro^>cshh1Wsempq5w?BP2xU+xv;QOC$s&o8qZ}0k*-D_8N_vZ6kcWy)9Hy#`v o?fmfb-$xIAx&Qmd!QuWrV>x{I*B`&`>_7bTxBEL+zun#V9}01)82|tP literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/appletlogo.gif b/etc/lwjgl-2.9.1/res/appletlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..283e15e39581a73d3f5f7ea5d6f28a8cfae166a5 GIT binary patch literal 3474 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 AGynhq literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/appletprogress.gif b/etc/lwjgl-2.9.1/res/appletprogress.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ed42c66b00208982665467b6ee778360091e078 GIT binary patch literal 7468 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 H;O>6`{6vji literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/ball.png b/etc/lwjgl-2.9.1/res/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..53aa8574bf22c33b33dc1a21291466e4f1489646 GIT binary patch literal 4817 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/ball_sm.png b/etc/lwjgl-2.9.1/res/ball_sm.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9db45a65351889f48e6bea6963b5232eed56ed GIT binary patch literal 1802 zcmaJ?Yfw^Y7{=`?6Xk7f(^^k>sT_p^3Mh#NqDTp{h(TH=!a+#k5F7)WQnOY|D|2d_ zE>@eSuG40tnWAa#bhT{FwXDo6&B`uj+C{B2_RwbSk9E(?Ip1ZT=Xsy^{oZfRHUXc5 z!#ZIx7z~aZ#ulQZjpdy_75%!rF-y^54iX|kB4Gt$km?`|Qx3;N09P$dfP|1#p0f4| z6oA1@0#qUiBH@M8Ww4qcwO|NFwH9S#FabeEtyGo>AwWEopwck#ug)~!0hOGA7gKm3 zPa6y=RblIOP~>{PNVYyv<}b$w1p)y^Ix3)s5Gi0(Cu#I_BLn|gmyXUY+eAF@8G<A- z@c)>S@B~0Gtb+gw0rZxER1lz&2qYh08ja=!kU<hi1j$4a*_%Y8`;h4%2z+_)Xf&N% zK^L+^zr;dU47?ISv~(iTU@#C2J_J~oKqUG5`&%@~WN#GVtxwS)Qlqy<?>er)hV(L> zN{gsq4Pa4}#>2@71CKiWCk3_ktE@)<rA%nSh(@WFNFsoil*WNP-v2|@>aS=$B80yA z{ZC=NC`Ahqg^(Uj*2&O=Q@C0}Y3ac_NQ%HZ5ez4dS5csZ5m>K;wLowr1rVz=a@e5% zjOOv^T#X))YGe?X&A_94f=VT)Q^8OQ$Yl9Y$Rs9-6axB@StJ&V>FZ0PQT>=?@;H|b z%aYZQ1{vqdzj1vh<XRd*twkfVA)RU+BoEcWYT$Fibk)RONE7OP;mRlWLY|OIM9mN_ z$NH~h9^XQH$1?rewCLh%+d~?(*L7%9$J4wS=v_(YvY8^|-SFKp%DGW<FEyC=cigX5 z5V;4Al^(Ql$1#iAOjLE7<58x2ic-+BYqHChz!AZ~MR5)*q&)8X_R5q+1wRXm9CB=u zmTiqIpI=m&sZc+!YIi&M=Y2)OI>Ke2Z5h4ledf{LkEss~za4kCdgVvpL<r9>ZKrpM z+a)m~zJXfGebu=cmq-y;D3Z?~;*ab}Y|pk1t$a7HsBTJrq2`Tp+15i&?S;I#9nP`{ zkIjNRw`O=vYjkw>ODlX7yK-T~iH;#_mqNP>c8hGSk9H3zuVpPO;VcflKPPqnIdaxd zom;xWebnKbgAzf3Sjb#cs=7W_RotL7jTT&O+%wd-9Vqxqd}K%8+#g4~^j+_J@`cl` zMCV)4ngEZnMBAId>=S#l`P`0;XM_<`p=X@pm<<DA)#SjD)>BJ9&hN*an)fpQVy$0a z=5S;6j&yt5lO{r}5*wEm;7drFMLxpX4ZqCEtJ&Mr{Gs*MvHH=)`S)DXA6_=+zR*f) zyWG8Sr$f2Bl|p`I(I%1J=Je7{PC<3E9A7=*YYv;Drn$BCycm3PEd6aACfXhg@#k4h zAw@au>Yz}b)jX=eR@csqTFv~UmlNC?C+S}&s)&oT%RaoMoHso^e8$UE$`vZj?`oP| z#&#RrN6>ud(*FG%Q;mq-xWL+W@^OA6(ZmV_n&Ou$Y^;~KS(SP=^}I=Q9{jazpr+4* zoJ+UqT#U`5y}dW-d4g^1N{0&E)CP%yp5MQR_vzgjrS@!W%uqJcjF6TuaxnIm@i!o^ z-9+0q9d{}Y8r!ndG=+a4JL(3jYR$t~Zb?$9=RT!_;E`&D;A-8vr%%sB48LoA+%#K2 za2$!OuNQebc4uz(OHJN6df*zw_2AuT*_(8+<rD2`_j#}DgwAF`t$7aU0X63{XlsZ2 zzdLL04{!-9QBfK)7FYKlZGc@wQIB~MZb~r+yQ*{JzIy+xYt=3hHDwGgL+uUXT%EG} zOm8345@rR)HurqEHlrYKVQ6lB7Q1f6)<-Mtu;CpSe_5S+?in#~wC#8C1Ci*2+Yc8) z$QjC2xtXrzk-;Y$7;8t`q<imnP7+r(+o^rS?T5|L7p{wmCOxezyv@^jfkT`4HI`*w zl`v?pjK);S<_)|LmX%BN^t_~H>lv|4y~}f)->*2|QsU07RXEiuZx1DZ;-p()qGo2E Ux?Q|<m*wxo4dJuPSaBJD0}(CEUH||9 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/center.wav b/etc/lwjgl-2.9.1/res/center.wav new file mode 100644 index 0000000000000000000000000000000000000000..29e6dded5f797c68c90a209d83897e57592db409 GIT binary patch literal 55188 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 b{=#O-F7l|!_9~fuH@GSr`${P5Y0Cc}0(-C+ literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/ding.wav b/etc/lwjgl-2.9.1/res/ding.wav new file mode 100644 index 0000000000000000000000000000000000000000..fdb625aa703d1457f8b8e5979159c53f12e09953 GIT binary patch literal 40474 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 Uee>2%=>1Vb@AiGWCG;fvZ<veDNB{r; literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/left.wav b/etc/lwjgl-2.9.1/res/left.wav new file mode 100644 index 0000000000000000000000000000000000000000..87635a595d5672653ca58ddd0c188e4e30e40f31 GIT binary patch literal 55188 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 BX!ZaA literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.ai b/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.ai new file mode 100644 index 0000000..b41ed08 --- /dev/null +++ b/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.ai @@ -0,0 +1,1086 @@ +%PDF-1.4 %âãÏÓ +1 0 obj<</Metadata 232 0 R/Pages 2 0 R/Type/Catalog>> endobj 2 0 obj<</Count 1/Type/Pages/Kids[5 0 R]>> endobj 5 0 obj<</Parent 2 0 R/Contents 226 0 R/BleedBox[0.0 0.0 612.0 792.0]/PieceInfo<</Illustrator 214 0 R>>/ArtBox[40.3667 286.146 522.334 477.897]/MediaBox[0.0 0.0 612.0 792.0]/Thumb 231 0 R/TrimBox[0.0 0.0 612.0 792.0]/Resources<</Font<</T1_0 224 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0<</Color[-1.0 20224.0 -1.0]/Visible true/Editable true/Dimmed false/Preview true/Printed true/Title(Layer 6)>>/MC1<</Color[-1.0 20224.0 20224.0]/Visible true/Editable true/Dimmed false/Preview true/Printed true/Title(Layer 2)>>/MC2<</Color[20224.0 20224.0 -1.0]/Visible true/Editable true/Dimmed false/Preview true/Printed true/Title(Layer 4)>>/MC3<</Color[20224.0 -1.0 20224.0]/Visible true/Editable true/Dimmed false/Preview true/Printed true/Title(Layer 3)>>>>/ExtGState<</GS0 221 0 R>>>>/Type/Page/LastModified(D:20050904082821-06'00')>> endobj 214 0 obj<</Private 215 0 R/LastModified(D:20050904082821-06'00')>> endobj 215 0 obj<</RoundtripVersion 12/ContainerVersion 9/CreatorVersion 12/AIMetaData 216 0 R/AIPrivateData1 217 0 R/AIPrivateData2 218 0 R/AIPrivateData3 219 0 R/AIPrivateData4 220 0 R/NumBlock 4/RoundtripStreamType 1>> endobj 216 0 obj<</Length 944>>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 12.0 +%%AI8_CreatorVersion: 12.0.0 +%%For: (Glen Moyes) (Glen Moyes Studios) +%%Title: (lwjgl_logo.ai) +%%CreationDate: 9/4/2005 8:28 AM +%%BoundingBox: 31 281 575 478 +%%HiResBoundingBox: 31.6665 281.667 574.9473 477.897 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 8.0 +%AI12_BuildNumber: 198 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKCustomColor: 1 1 1 1 ([Registration]) +%AI3_TemplateBox: 306.5 395.5 306.5 395.5 +%AI3_TileBox: 1.00781 0.000061 611.9998 792 +%AI3_DocumentPreview: None +%AI5_ArtSize: 612 792 +%AI5_RulerUnits: 2 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 4 +%AI9_OpenToView: -176 819 1 988 914 18 1 1 8 81 0 0 1 1 1 0 1 +%AI5_OpenViewLayers: 7777 +%%PageOrigin:1 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 217 0 obj<</Length 7795>>stream +%%BoundingBox: 31 281 575 478 +%%HiResBoundingBox: 31.6665 281.667 574.9473 477.897 +%AI7_Thumbnail: 128 48 8 +%%BeginData: 7644 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FD97FFA97E85365A5A8584FD76FF846114140E3614140E3636A9FD +%73FF7E360E140E140E140E140E140E84FD71FFA8AFA9FFA9AFA8AF858514 +%3614361485FD6EFFA8272727522752527D52A8FF840E3614140E85FD6DFF +%5227F8272727F8FD0427FFFF5A0E36143614FD6CFFA852F827F827F827F8 +%27F852A8FFA8140E360E145AFD10FFAF7DA87DA8FFFF7DA87DA8FD0CFF7D +%A87DA8A8FD06FFA87DA87DA8A8FD05FFA87D527D7DA8FD06FF7DA87DA8FD +%1DFF7EFF2727202727272027272752FFFFFF843614361436A9FD0FFF5227 +%20277DFFFF52272727FD0BFF7DFD0427FD07FF5227212752FD04FFA85227 +%F8272127F87DFD04FF5227F82752FD1CFF5A847D27F827F827F827F827F8 +%7DFD04FF143614360E85FD0EFFA827F82727FFFFFF2727F852FD0BFF52F8 +%27F87DFD06FFA827F827F87DFFFFFF7DF827F8272727F827F87DFFFFA827 +%F827F8A8FD1BFFA814A97DF8272727F8272727F827A8FD04FF5A14361414 +%36FD0EFFA8F827277DFFFFFF27F82752FD0AFFA82727F827A9FD06FFA820 +%27F827A8FFFFA82027F8277DFF52FD0427FFFFA8F8272027A8FD1BFF5A0E +%FF2727F827F827F827F82727FD05FF36140E360E14A8FD0DFF5227F8277D +%FFFFFF2727F852FD0AFF5227F82752FD07FF5227F82727FFFFA8F827F827 +%7DFFFF7DF827F828A8FF5227F82752FD1BFFA90E61A92720272727202727 +%27207DFD04FFA9361436143614A9FD0DFF27202727FFFFFFA827202753FD +%09FFA827272720FD08FF522127F87DFFFF5227272752FFFFFF5227272752 +%FFFF52F827217DFD1BFF36145AA8F827F827F827F827F8277DFD04FF850E +%360E3614145AFD0CFFA8F827F852FFFFFFA8F827F87DFD09FF7DF827F852 +%FD07FFA8F827F827A8FFA827F827F8A8FFFFFF27F827F87DFFA8F827F827 +%A8FD1AFF841414A952272727F8272727F82727A9FD04FF5A361436143614 +%85FD0CFF522727277DFFFFFFA82727277DFD09FF2727F8277EFD07FF7D27 +%F82752FFFF7D2027F852FFFFFFA82027F827A8FF59FD0427FD16FF7D7DA8 +%FFFFA95A5AA97DF827F827F827F827F852FD04FFA9360E360E140E145AFD +%0BFFA827F82727FD04FFA8F827F87DFD08FF7D27F82727FD08FF52F827F8 +%7DFFFFF827F8277DFFFFFF5927272752FFFF52F827F87DFD15FF7E272027 +%527D7EFFFFFFA87D522720272727202752FD04FFAF1436143614361461FD +%0BFFA820272752FD04FF7D2727277DFD08FF52272720A8FD08FF2127F827 +%A8FF7DFD0427FD0AFFA8F8272727A8FD15FF7DF827F827F827277DFD04FF +%A8A852522727F8A8FD04FF7E140E3614360E145AFD0BFF5227F8277DFD04 +%FF7DF827F87DFD07FFA8F827F827A8FD07FF5927F82727FFFF52F827F852 +%FD0AFF7D27F82727FD16FFFD0427F8272727F8FFFFFF7DA8FD04FFA8A8FD +%05FF611436143614361461FD0BFF522727F8FD05FF7D27F827A8FFFD04A8 +%FFFF5227F82753FD08FF52F827207DFFFF2727F8277DFD0AFF522027F87D +%FD15FFA827F827F827F827F827A8FF2727F827527DA8FD06FFAF0D140E14 +%0E360E145AFD0AFFA8F827F852FD05FF7DF827F8A8FF28F827F8A8A827F8 +%27F8A8FD08FFF827F8277DFF7D27F827F8FFFFFFFD05A8FFFFA8F827F827 +%7DFD15FFA8202727272027272752FFA827202727272027277D7DFFFFFFA9 +%A98585363614140E85FD0AFF7D2727277DFD05FF7D272027AF7D20272727 +%A8A827272053FD08FF7D27202727FFFF7D2127F852FFFF52272127F827A8 +%FF7DFD0427FD16FF5227F827F827F827F87DFFA8F827F827F827F827F827 +%52FD07FFA8A95A367EFD0AFF52F827F8A8FD05FF7DF82727A82727F827F8 +%A82727F8277DFF7D7D7D7EA8FFFF52F827F87DFFFF2727F82752FFA827F8 +%27F82727FFFF52F827F852FD16FF522727F8272727F827A8FF52272727F8 +%272727F8272752FFFFFF7D527DA8FD0FFF2727F852FD06FF52FD0727F827 +%5227F82727FFA8272027F8FFFFFF272721277DFFFF27F82720A8FFFFA853 +%F827207DFFFF2727F8277DFD15FFA9F827F827F827F827F8FFFF52F827F8 +%27F827F827F82752FFFF7DF827F82727527DA8FD0AFF5327F82752FD06FF +%52F827F827F827F827F827F827F87DFF7DF827F852FFFF7D27F82727FFFF +%A8F827F827A8FFFFFF2727F8277DFF7D27F827F8A8FD15FFA82727272027 +%27272052FFFFFD0427202727272027277DFFFF5227202727272027275252 +%A8FD07FF52272720A8FD06FF5227272720272727202727272027FFFF5227 +%27277DFFFF7DF827217DFFFFA827F82727FFFFFFA827F82727FFFF7D2127 +%F852FD17FF5227F827F827F82752FF7D27F827F827F827F827F827A8FFA8 +%27F827F827F827F827F827F8A8FD05FFA8F827F827FD07FF52F827F827F8 +%7D5227F827F82752FFA827F827F8A8FFFF2727F8277DFFFFA8F827F827FF +%FFFF7DF827F87DFFFF2727F82752FD18FFA87D2727F82727A8FF7D2727F8 +%272727F8FD0427FFFFA8F8272727F8272727F827272752FD05FF7D27F827 +%7DFD07FF2727F8272752FF7D2727F82727A8FFA82027F827FFFF7DFD0427 +%FFFFFF7E27202727FFFFA8202721277DFF7D27F82720A8FD1BFF5227F827 +%A8FF2727F827F827F827F827F852FFFF5327F827F827F827F827F827F87D +%FD05FF52F827F8FD047DA87DA8A827F827F827A8FF5227F827F852FFFFA8 +%27F827F87D7D27F827F87DFFFFFFA8F827F827527D2727F82727FFFF59F8 +%27F8277D7E7D7E7D7D7DA8FD15FFA87D7DFFA82727272027272720272727 +%7DFFFF52202727272027272720272727A8FD05FF27272027272720272727 +%7DFF2727202753FFFF7D27272027A8FFFFFF5227F8272127F8272152FD05 +%FF7D21272127212721272153FFFF272720272727F8272127F8277DFD1AFF +%2727F827F827F827F827F8A8FFFF2727F827F827F827F827F82727FD05FF +%7D27F827F827F827F827F8FFA827F82727FFFFFF5227F82727FD05FF5227 +%F827F827277DFD06FFA852F827F827F827F8277DFF7D27F827F827F827F8 +%27F827F8FD1BFFA8FD0427F8272727F827FFFF7E272727F8272727F82727 +%27F87DFD06FFFD09A8A9FFFFA8A8A8FD05FFA8A8A8FD07FFA8A87DA8A8FD +%0AFFA87DA8A8A9A8A8A8FFFFFF84FD0BA8FD1DFF7D52F827F827F82727FF +%FF7DF827F827F827F827F827F8277DFD61FF6184FD06FFA852272727207D +%FFFF52272727202727272027272720A8FD06FFA8FD0FFFA8FFFFFFA8FD21 +%FFAFFD24FF5A145AAFFD06FFA87D2127A8FFA827F827F827F827F827F827 +%F827A8FFFFFFA87DFFA87DFFFFFF52FFA9FD08FF7DFFFFA852FFFFA8FFFF +%7DA9FD09FF7D7D7DFD0BFF7DFF7E7D52FD23FFAF14141485FD08FFA8FFFF +%FF2727F8272727F8272727F82752FD04FFA852FF7DFF7D847D527D5252A8 +%7DA87D7D7EFF7D847DA827A87D4BFFFF52A87DA87DA87DA87DFFA8527DA8 +%A8FD057DA8AF7DFF8452FFA87D527D7D7DA97DA87D7D7DA884FD19FF5A0E +%140D367EFD09FFA827F827F827F827F827F827F87DFD04FF527DA8525252 +%277D522727A8FD0427F87D5227FD0752FF7DFD055227525252FF527D7D52 +%7D27272752287D2727A87D7DFF52525227277DFD04527D5227A8FD19FF85 +%141436141436A9FD08FFA85220272727202727272027A8FD04FF52527D7D +%7D277D7D7E527DA852527D7D52A87D5252597D7D7D53A8A8537D5252FF27 +%A87D527DFF7E5252845252527E7D7D84527DFF527D527D7D7D527EA85252 +%7D7DFF2784FD1BFF5A140E3614140E5AA8FD08FFA82827F827F827F82727 +%FD05FFA8A8A8FF5252A8FFFFFFA8FD05FFA8FFA87D27A8AFFFFFFFA8FFA8 +%FFA8FD05FFA8FFFFFFA8FFFFFFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFFF +%FFA8FFA8FF7D7DFD1DFF3614143614360E365AFD09FF84592727F8272752 +%FD18FFA8FD2EFFA8FD1FFF36140E360E360E141484A8FD08FFA85227F827 +%7DFD68FF5A361436143614360E3784FD09FFA87D7DFD6AFF845A14140E14 +%14365AA9FD79FFA9AFA8AFFDFCFFFDFCFFFDF0FFFF +%%EndData + +endstream endobj 218 0 obj<</Length 65536>>stream +%AI12_CompressedDataxœì½ks%·‘ ú½#ú?ð~˜;vÅ.< ð˜òœÕ m9lywbCAuSR¯ùв»åÕþú›o ªpH¶š{l²ìO$‰|ãïþŸßþþ³£7·__~§ƒ—/þîïvw—ïoï~u@àƒÏ¯®>¼{‡ _üî—ÎNØêèóò•´ü—Ë»wooo~Eã¿žá÷ñW—7¿¾ýñòÝ/û¿ÿáÍÛÛw¿Ä–_¾}u m¯þô¿¾½úêêöÛÛË·¿´q@¿'ï¡A}_ùiJåW¾ý[ß~¸yóöæÛãÛÿó«ƒà|qiNq.øçÿñöw—ïVmsÎ Â/34Ž‡5ξ1–:ã·Nn_¸¾¼yÿÛ»Û×—ïÞín¯nïÞýê`÷ã ÿâ[øËÅÁ¿_^]ÝþéàøêâõûïœÝÞ¼‡¶Gwo/®>ûüýÅÕÛ׿þü·ƒ_ÿÀ7Ÿß^½á?ôßûÍåå›Ë7ùí£ÏÓWgo¯.××ï +aþèsç¿:þðöêÍo>\} «àj!xøŠ¦ò‡w0˜þNðù«Ï¯ôûË÷ïMð~ZÀݯÿýŸw°î·×Ôº‘çÿñ»ËoßAÀÚüÏ_Jß_^^ Åhžòa:5á¿íwm +c¦fîpšfX2 øÉî ;wXk-sõÒ¸­Æåo/ÿô«ƒßÜÞ\ÊäîÞÿþíÿ…Édçí+é«ß}¸º¼ûÃÍ[Ä%Ã*Oý×·o.¯F_?»º ÓãÚ¿ÒâË‹»o/ßÝ^}xO^&ý ÷üâÇK$(/ùâûË›/oÿ…†ù™›óAqú«¥T\!–ƒ¢orô6'=â×ñËÚí ?¸¿…Õùâîí·oo~ådhóWÿx÷öM[²ÙC·ôu}XºÿWý¿Œæüþý%îV%—ݯ»ÅŸý{|ëéÍ›Ýí5¢þm5XôØ°Aå¯íý ºøðýËÿñòE¨¯þ÷‡Û÷—ï Ç«Ëƒš_}{wñÃ%p‡òêôÃÝí S×âë‹w—¯¾åy{ÃÐ7_3 öØÛïß½…׿zsñí·—wòøû«×oï€.¾¹ºü?¯¾¿¼{ÿÝí‡w7o^ýþõÅÝíÍ«oþ©ï«ËoÞ¿úâôÀÅÄ}#�ú£ß¥ß½·WRSýÀúú@ß¿º¼ysñî»W—×ôŸ÷°µ._ù¿¹¼¾¸ƒÝÿêÝê¥üåÛËWonµ½{÷öÀ¥úêßß¼½¼ƒ¿;xõîû‹×€Ž_½þpwwyóúGø_}}wûÇË›¯/`[º\^iûW¯o¿ÿQú¼{óÍåõÛ›·7ðõÙ¿ü¿}}qusûþÕw?~ÿÝåÍ«;Ú›ðÅ7¯®/^ã°�­°H¯¾&ßüðîÕû?ݾû�H{{{÷êýww——öéâõ‡÷—¯®?�¥†W{óÖŸz{}ùæíÕÕôûϾº¾x÷úèüãÿþpqßÁ_¿»¸ú†ß!ÀwÀü«#¢èêˆßxÔ­æã÷Èf„xutúj'CxuJ_uJ_†^N»¯ŸÚ÷>çVŸó+>ïÚ|nmNß÷ê7ôBèæ þÂü…/º/|Ácú¾wýáêýÛï¯~|õÅ»+¤‰?è„þÀ_þC÷å?Ø·þÿøåw·w@-—À´o€ÔÞ½ºà_è|.ºo_ð«/¬“ BÇÅå«×ŠŽKþú%÷~Ù¾ ]]Ú÷Þr«·Üêm÷Š·ÖæÐqÃ/¼åæ·:¦Ûî ·Òľ÷æíoÀÈøÀ_ýÀoú°ÏûÎüç÷„ŒüòÅ—§Ì Ó?}õå;àüÃ_£9½y}‹ú¯¾Zž”›ƒó?^­Z¼Z}ùþ—ÿßKêxšö}ðå݇Ë/üþò#³9¢G‡6 i}µý&£‘LÖFÆ£ø +†õ[ Œ÷´×ó=ý­|õÛ«ðǼ»ýðýç7ßܾ|ñ –è~{ñþ;]€¯¡\Æ0þxÀ_èùÛòØ÷¿| Ë/ï€jax_|ý¿._¿‡ï  ýöûoß_>¦«ßâñtwóÅ óîûï¾¼½½²¡Jù“ŽsþÎ_ÌK¬ñèðÇ¿ÜÎwpöÂ>þþ; ÆAÿƒ¿Û‹ö|÷1¯…ã±>zãòOö²í7þ2ÞƒˆþæíÍø +~ÃÜíõ÷¨‘üþ»‹ïŒ-Ϻ–ÿÉå7 ówkKÐÓ›.¯n¿¿lpƒÀIsð¯wß? +9?^}{õöÝuÃI±ßÓˆšwÝpè#ü÷üï£véÕÅÍÅÝýÁFCœé·ÀíVÜŠ`­Û„|³çŒŸ}v?Ïtáàø¦oòwxîÞ¼í”4½ÿ~ð¯ßÁ +üÀWð–!·?8~C¢ðß¿|qvvvzvr¶;;>;:«gål>Ëgé,ž…3æΦӳÓÓÓ“ÓÝéñéÑi=-§ói>M§ñ4œúSw:œœžœœìNŽOŽNê èr'óI>I'ñ$œøw2íÎv§»“Ýnw¼;ÚÕ]ÙÍ»¼K»¸ ;¿s»éøìøôøäxw|||t\Ëñ|œÓq<Çþ؃Fqtvtztr´;:>::ªGåh>ÊGé(…#䎦zVOëIÝÕãz„úYk®©Æª¯®N嬜–“²+Ç娀ºóòE™K.©Ä +èÚešÏæÓùdÞÍÇóÑ\çªMžAûžÃìg7Où,Ÿæ“¼ËÇù(×\òŒzzŽ9dŸ]†1¦³tšNÒ.§£TS=?§”b +É'—¦xOãIÜÅãxk,qŽ9¦cˆ>º8…³pNÂ.‡£PŒ1Ì!‡bÁÐIü™?õ'~çý‘¯¾øÙgŸ|ôÁ{ïüäÎÜ©;q;wìŽ\uÅÍ.»ä¢ Î;ç`Œ,ç 2O€´ ¦=å †6Aç“CÕñ ÑÁß}u|Gä1™æ™ð?�GÕë«øø¶t ‚žVm»?`ë㓶”ˆ÷öîö{å‘–å7èmîÈŽhgÄ#êùˆ~\�\\\\\ +Z Z\\\\\˜£—/`qpypp‰x‘p™p¡p©`±h¹pÁpÉpÑpÙxá`éà™iñpù,d¤EÄeÄ…„¥¤ÅäåÄÅ%ÅEÅeÅ…Å¥ÅÅÅåÅæ%ÆE†eö°L°Ô¸Ø¸Ü¸à¸ä¸è¸ì¸ð¼ô¸ø¸üH�HHŽ–ð&e¹U–›Å¶ m–~»,7 m™—/lÓ,·Írã,·ŽlÙ:ËÍ3ÃÚöh¹…–›h¹úD[I7­D¿™–Ûi¹¡–[j§xC†ô”ìX‘bø‰ØÑËNŸ„¡É¤añãØ‘âè¯=ëŸiù�£Z>§«úFÖ?»Ís¼zŽVO]>ÐcY=óêÉ«'­ž¸| Gd­ËǯžÍÔù‡ðæ„þæðQß<®{`*Ð#OéÌžSyNäÙÑsLÏ=Uv0ÒÛL4‡T‡tÐïhÜÓŽÐs†Th;g÷ˆgýsdO•§ÈüY?²…cbÄÈN‘%Ò²ŸÑ~Å‹{–w-î[Þ¹ºwa÷‚ á»l{Xg�âÍø)›gîEh’‡Ž<6 G‘<‰IŽˆøŒžS˜XdB¡ Å&œXtRáIÅ' �'G#!Jg@\®=2Ù<yõ¤î5§Ó‰O(}¼Ur^/ЋÏ,>µÚ¹e'ý<:½Öû¸PmClŒC D‡Høƒô‰”Z‰r‘Hšq!ÆψúñU8IØ1ݹx È>ÕiØ„Š@‰¶À 4SzŽaQžN΀Æà8õ%xÑ Ø¯° +øÓŸÜfÙbëvz|ìÊÁjX×Ãœaµ`åw@§»3  4€jL`úª_Eü ža '…G4âñzLxFŒ#îahE­®®®%¢pöeg`EÈ•ðKȽ¯!§CÄ# + ñN䦸Õë"#‡®M ÍØ¡óõ8y”ûÆé†ãœ‰~QdÝIÒnÜJxªƒlEÌ_‹_$¡�ˆ, +—e4”ÕPB8&ù 7$Ês ?€ ˆÅãkñË‘¤ $0” +Q:D)Ù.ûŽ¶4J“ UÒQ€Ä‹ÃŗƳ†³IÅ#”MQFEYÙnè”cuM çŠïD˜.†åá÷Œ0ë³¼ò ›Ç„GÂ"¯4`(öfÂÛ‘aì”påK°” ?Œc `E0â€!ÅD%ìtþ4wO³Ž4ç™f«3ÅyžÑžÕ›h¯ÝÑÙrDû÷èíQG»3ÚpCÏ U`ÙÇÀ‘µžÎgpL; …€KˆÍ I¨ŽH²:ëd­3 RÜ&õ$2”}kãí†ó%Æ—ø^b»Çµ`Zð X&^«x^b¹ÇñÆ_Âî·@•n—˜]âµÃê£+|Î$³7|.±Ùãr‰Ç%kÏ1á]rÌ%¿nÙá\ÖRòœõ³–¦ÂFÞŠÆ£ÖÏZzS¶| É„uð¬åɣĩ<±{ Gå’Ëg-á +]?[4Gý,åíÍù¹Ö)å|^ê“M›œ‡Ú¤Jê0V’ÇUê>óB1©9‰™!˜Ì;)¨ÁCtæû4Œ‡M0VôNöfÑclöø{äúk#ÌÇé<ëÑ,sÿXöŒd¸ÆÏ£~{í‘ßXÉ[jUa» +[VضÂÖ¶¯ kìfia[ [[ÈÞØf=ž¬.¤ƒªÝ…-/l{aíž-0lƒ "p:µÄˆÎ¼‡Îo¶È°MF­2Gb™aÛL%)«…†VXm4AÄXX2èщÒv&öšS±Ù°Õ†í6l¹aÛM]HÖ½ÄLƒÖõ]i"MQ+i!fI`=äxa³Q‹Ù@nU»‚ZØv³´Þ,í7jc`+ƒÚĆgC=Ò‰žx*Zá±YŠé€Íš£¶¶>¨ýhhHíqqeÕQ[ÄN¨¡šõ­Ùv¼ÙÝÔævlzÙÊý©hÒ,&èOµø€,²2AªÅ䥕 úS->Æ{ö[]Äö2|¶ö9  Çѹ¸==6yÊžSy{zí4ckMg³é$}¶’ÆØ~3¶â¸ÿDSúá‹u0º‰"Êœ …ËÂÀhþ˜Ædv? ¹`ðTž"¶Ï5zlÇ7,©ëôá¶Üg þ*þ§�Žp )¡‡Õ…|0÷?ò q1´mÎñG„8öS�œßïB¡Õñ?‰ãû|Ìv_¸©Ì¶o®Ø Ì)`»Td±|?¡‡š~¤{äwoo¾¾ýúGôW˜pîý{OàÓë*°Û'ðéõ ŽÃ'ðéõ Øíøôz†JÐ'ûôzq’…‹Oõéõ%âJ¤dÞ!`Ç3k³ÀŸüHcvû“èñ {[õ¸ï¸øÈz|¢žöô¸vCü„gëÌ`ZXÈô§eñÔ{ž£{žc} ÇãÕ³»ç9¹ç‘èqûs¶ÿ(̦8ó Ñ Ïö>$ºBqø¤{ž¼÷®=Î{žrÏSûÇìôW=ÖZlë‘öªÇZ«@’}¤½ê±Ö*`ÿ´W=ÆZ…v{8“k¹/ÛîáP…1Âñz¤~"µƒc7Àñ›àži'ÑÞÁ}pF´ë‰ÚÑ®4 íÌ| {¤æÇ=bOÏŽþ,LøÏuô|Ò»eÛ÷1ÕûŸ5{ÞǶ?ñÙôxßññ¨züØïÜwœÁ=>Ðâcé±üÔÇXvxÚç/¼G²ãÑAõ¤Ï_^º¾Ÿ¢}t¯—/>Eûé^/_|Šö5Ò½^¾øík¤{½|ñ)Ú×H÷zùâS´¯©Xõ§z×RH_ŸèE\Ke Ø~¢q-•ôõ‰^ĵTöòÅ>¹ì§Je }í‘Ë–ÊLêzœ‡±–h–¥’ç:k*ô8²±Ž¬±÷x,ÞË‘ÿòaoæг¹°7?àé\={~:¨àl¢{è?­øò)"ÖÇhÞÃç^Áò>]}ï=Þ«ÝüÏÇÚúgÄž÷ù÷=k'Á(àóÓž±…íimv?Ÿ…í‰,mPî~‚ª›û©,á*‹üõD–p•ÅàÀ{"K¸Êb =‘%\e1 +i{K¸Êb =‘%\íà¸{Ôî¼Øþì“›f*AP +9–@.SwÑÊwo;öÕ9§®«YÛ”¾«{›IOS%wß\"½ DâðZôt_3éɧDM"½°®M⢧ûšqO<g/aS›ø¢îk&=9G¸ÌSY5YttO«ô‘}ywû=–!8øý‡›w—ïÑW¶A§I}fÇëÞ·mR¢×2næeäÆ*j£ÙHÃŒÝÆÐã2bãÁx*qû±ûh}4J[6Õn‘Mu.Õ6›ªåS”²ŠíÙÙ£±=Ýãšsw>rl®EUŸésЪ{øVîù„Ç=Ð#j!÷¤ûèqÿ_óOy Ç|þé™$æ±B<~~¢)÷ÑÒÌÇú4?Nj»Wjș㠒ýÏ&¸ä§vªë„87ãÜOâÜŒ0ÿÉ!ÎÍ8AЄ87ãIi÷8ö'VJ¦Úg{4+Ù#Ñ“§áxê표ԩ¡GŽÏ:“§i\ú³³çXž#{ÖÉL€.Êå¥0iS< öø.•ÉiBS—Ôt&²ò©¥7qŠ“þhØ‘=Užb2˜Æ¤;lìS™¯²êÆà5*íìx¤Ún¹ˆOÏÉæY'ÐyËrZ?Gƒ§nž²| GÇ^?yð¤Á32jÌò#{Éèg>´ç<6’pC8Œ |lôà2�âï)Ϥt’PË` ëüEÍ`”ìä¥\dyæ׺––ÒRFZæœo%$Ê®ÉýÚÇ=›4´È??Ä:/âœ_¾XE9k&zŸ‹~ºÊG_f¤/sÒ“dþ-óý–™~÷dùu4k4)N¥Fg]vÐJËêÕÕnƒòÏù<ÿùù<c‰výȉû,ñæý´˜# ¤§µÀÌ °>­†Ò +ŸÔãaŒû-0‹­¥)¡-!tž–é -t” +š, ”µ> ô¤K_ܦ€J¢ª¦vÉŸ–úI±•ÛÔϹKl\¦}žu ŽË„OI÷¤² ƒtORœlã–ô˜iž‹$OI[vT¦¡O[nIËFÞ+sÅ cœuZ©Æ–�éÃ9É?ð§á ͇ÀÅÓ÷¶{È”ÒavåQæ i*!Ù4îèZ´vĺ·¡ïjî£ôÁÞ®"½u_þù# I¸¹¹¸¾|sð­€Ð’´=‡_?‡_?‡_züD§ÐG8‡>­ÇŸ%Þñ'dv>êù/Õã“ý||>ë_BëœÚçøûçøûçøûçøûGDË?ùyôg9…ÿ\²Ç'ÉXÿÀ¡>á?áÿe„Ì?}¡!óOßãsþß@þO í|àytvêCð—ÕãŸE»ÜÔ'|ΰxΰhÏÃ2ëÃÒòs†…>ÏÏ›añ÷OlIûy-’Ÿöü%ŸæŸ"à ¿ûÏ©3Ï©3Ï©3Ï©3ÿ9©3dr{dþ̲íþ$š®Ýƒ™4˶ûÓi8Såq95˶ÿåkÖ±nP迉x>;žÏŽç³ãoóìx6Ù<›lžM6Ï&›g“ͳÉæÙdóŸj²yYxÔó²ðs<}¡Ï! Ï! Ï! ¡=þY$ç°ïç°ïç°ïç°ïç°ïGš±ŸÊ0þIæúqØ÷s:çs:çs:'=ŸÈI>‰£|L? }N眞Ó9·Wü=‰þ)c~Žˆ…Ÿ%²âgˆ�yº•OŠ‰ðã ¿(:ú÷ÃÐ*ísŽÕŠ¡bqOÅ¢±£tŸza +ÆË c¬dìs˜vj†1Ï'pþö +;?J]Aå“]¿¨.ÙMµ¬gŸµgál¥å|÷„î‰ÝhE æî™»glf»×–¯}®©±Ò¿QêWu¸Z%®V‹«Qx£ƒF tNUúU ‹r@•ª•·B@DM™nô¾¢xª(ë:iju£”F+Z½ŬÍ< QxŸ0<6SÅaç>‘x,?x‹:ಌǢñ¾HN8Öµþ3© a¼ÅP‘§P,¦‰MU=õ÷%›‰¬ÿéwÖÊÉf¦¼}©¶ŸçAÁÐAÑPèqY:tY>Ôw<§/ÌØq(¨Î¸Ýç-ëÒV¦­M[¦Æµ5ZÐ-¬È±U,œå>v5µ+õ¶õj+ÖÖlEÁ° ¥Ö`±ƒ¼zŽ%[ÔRSôÈP¼©Öñ|>?ŸÏÏçóóùü|>?ŸÏÏçó_ØùLæx€ TÔç#þR®#¥ÿᶚT‘f´ +$jQ`j˜ËáTj]vjË}ÞÿîkðùÑcÕö×ÄxýGŒ÷ñXýtcÊØ–B¦¿¼¿eZ×~¨ô² ðâû囇‚Ï7.[8/–RνnÛåt^¾¸GÖy¨"ô Ý*¦²|µ|#œDŸú¾uU}RèûÖ] ²à#Cßr£yvö ¼Õh³Qg£Ï&{+… +Ê­J§M +/]qä-Œ¼¡ÕF­J¯p’ h¶4ÙüA‰‹h·Ié~%5ZjÔ¤ôÔ(ªÑQÕ†ó#ËA+50 ³ÿY +##‡*3ýæ/ŸÌ»æ1óš1=.v†àd‰´ruâ› d¹ú +ÖãÖnYÚ®hŠâBd^-¡2e?5•±éÙÁ’!¬Y˜)[�–°/#æŒA7×3æž1÷Œ¹ÿ˜ëñâÀ>úPÇ» tužû^õ½¼1ãþž¡­]ë”â‹*ÅadÆaTÇz·x¢m4‘Ľ|AESDQEÝå†'tÓ1ÅÙ5‡…"fŠ6Êrå!_{HÐF éãÏún$}î å <Ì'}ߣ®í3ÞŸñþŒ÷g¼ÿ¬x_Æ0®¥ýô™zÇÂr³· ›€2†ï,þÙÆúìoc7´tÿw.ÀßÓò’–a þ>Y–ìÿ›ÞžŸ¬¸Õ±âVQq fv:t›ºÃv©µ?Êk¶MèìJ¢¥Oô‹¨MíKí‚"½ž´°4±®>¸œˆÈ&BŠíÉ4wGw“öþò]÷›H¬d=^…ËJæ‘èôÇr¯£Ü6Ù™ÎWy¸ ,Åâ£Ï}ÆèßF‡ÚóÚÿ7®ˆáŸåº±ÕŸðš³üA¼çë­ÍÞÃȧC_¦zÿ¤>õPJix(xeMÜ8Bžò"̽ +s˜µöòŃ.QÐÊÚÑÙ3€—ä¥ECmÍ1Á® u‡Ôr´¨‹¡‘ï~Q¥aY8l™Á‚زú Õ‘yùÂjɬ«Â,ë»,«µ,rÞÅ!ÀN+†iÕøQá´Š£àÈnU<F´“ûõŽE +Ú¸™ ¬°ƒÑŸ O´'É“í™í)ƒû 1üàI]>Çî‘NŸ­5„?ºÂ&èW¹OòHUô^É^l-yMOe2Ð¥Q±ÆE0Ë…¼³©Už#yŽÇ˜ënÉî®ðîbä~m+5¤KÌ׺ùÆnØJ/_›+“«‹¾ó›o�?"Ç×19¿vä�;!'˜„F-‚¡$�êå ~jáN-À©5µÜd [j¡Jš$9¾”ß«9»-·’[ kÇ<er¯AÍÅF–Vµ¶îdò§ls]X]•#5×ÚîJ‡)󧇺ç@í¬¯#^EÜŠ‚NVîÓ¥ukÝW=Œvì®ÜS{ï•k2c>ÄA€?K¿Ø¨‹¨ù¹”¼6*‡ÓœëA ‡¸+ú³ñ–MgôAoÙÁ÷fwˆ¬q¥8îm†=á1ŽY#£ Ñß>òxþ—··W—ïN¼ÄS¹û„=ö·êÏ:ƒ~Ðs¶[=Ç«çHèQ¯›g”¬>Jn_$ÂCüÛ8~œrïIÖ÷…5zFE†±Zý=Žb¸ö?WBëã‹z}lá°G•Wz‚rKO_é)zü)Å‘ž¾ÜÒsŸÜã?(OcÆœJyQ1Þ’ŒCxÝÕ²'uï]P9+‹™L’F,RcO)¥þD”cJ­?"á¥P‚ýL …Ÿœ€(AÉöAÄ!Œ&Jº?£ÄûS§v”€LIøG”ˆ©ø…ÒñgJÉǤ|| G” X¾`Qdk’ì…Mó&IŠ;>æŸ#y*=d­†ã¦‹Z|Ljöq’'Ê£r·G%{©QyÔ@ç˲áNìÙÙcC8êj÷”î¥zœÉ@ß?iñÄÅV_?УÛ<ƒêœÛÞY¾|Aÿ=¹÷Ù=ø·z<¾ç9úøzäßžìzÜ÷S~Ú=þÄoþ×îQÔþûŠ üôÒ‰"˜ŸäùYË…ý¹Š{ýu•GhÏ“—xîñ¹ÇÇ÷hrÊh(Í$“4FrÊ_(y¡¼…’JX(Y¡<Å¥ŠPrâ"E(!q¢D2PòDZœHKia¢V.²•$Z$êÊ?ï =¦LäÞ<&ÎdzùÂr™úl¦–ÏÔ2š´d¤f{-³g(³ ógÈÄùMœCÃ9NœEÓòh™—²jRƒ5 lG"ÜQ—Q3SV¤æÕh^˜d×3>³›5Yøã\›*ÆËYrn0ësØHË6IÎÀÁ‡™,+ק’sB¹T;ʧ:–ÌÎΩ”¡CÏËb`Îò$yÔ ­vPµ·ŸÆ;¥3´4•©{ZQõeñõ…(¸¯šéyLù±ñ9}ÿ½"OPF³;Ÿú´yB~ñt}ý|=®Jj6`[ y^=yó¤õcYyýVß<nó˜wzåîYþÞâÙþ˜Í_¹yýäÒºKŽ‰¹CÈý¼§°î ö ëræçØ%b1[”ÜjV€"®Î°×€·ÉœŠ@-�ªÿ7Í?JI>Ïš¾hù'rú‹FÏz|>Y‘>ÏZºêÓ3Q‹(ëɨåúÚù¸~ƒU×5ïVÝYk—œ8ã̹Õ[êÔ:µ¼ ÉœXAÝV’­¯AìGâÐÝ©3¥‹CXg ÕÎ}ÒE"¼|±[_æ íËq»7ÛŒÊCo‚Õ–K ¦øØŸWûx@çÒ=Ô{c?‰]l™ˆZY‰û¡zìòSÆþTqc¼¾ÈÒŒ]ž‡øØbdË@·8!¬ÀVXâe‹™-n¶Ì´Ã`k› ­Úâh‹¥MJ=`k„©-®6Øú+Tû?9ìùÆrSþþŠÎÈ ³¨ñW'.VŸKôsç±¼·™”Ô£z€‡©f×|›Ãz‹ï«éÝ×Lœ°p– ³6&m’Ýa +%äx,{î=±¶GqF-EFM“Õ-œ§Cïcßßýí,‡³K´ÏÉÍwu÷Çtîþëwoß_þ÷ƒã«‹×D÷îâsŸy®Îq„<A­`t¸Åáck¿|ñÐ-[+˜²Á>éìXsILþ´³c}r�wüijc}rÐ]ŸÓ:¶Â ”—Øõºíc“’òÕono~{÷öæýÛ›o?û¬'ñþ//_üæ{ú[à¿ýöâýûË» þ£ÿûáîòàwÐæÿñÀ{ؘôO*òŽñÔÉPÿíGþüOðûÿèŸâÁ¯þãNo^"üß~‡o}]ÛGêõ?ZÿÝGjr¾ü.}¼á÷ýNÖŸÀê¦5Òpþ™8èáœþ¯“vL¯¥>¦’‚?Œqª¤îé·×Ô|LÕ1$v_ŠÚ5ÃO¹@7.èWæ¬ÝÑoÔN_EêS¿ÕH ßÙ(®è#õÞÚƼ²�õÖÒFL}t#!`úG¿ÕZ¯FLÿ´‡i9ⶊíË:›‰~).CHŸ–ƒn4Ò°§¯"cvêÝ:|·$ºkû¨ËLß[L¿CÍ´A›|k5ú¨ ­ßj$ÐÈCßFú¾~«q5îFôQÛÆmÃÞŒZ¿¬_Y- ý¦k½˜ê + Ñ ô[m€«A7 +áöÓrÐÛ—um”ú­Á2î§å¸;B(ëq7Ôê·Zë6î¶$×öQ—›iŽdËsÊA–ÃYrƒÒ µiD¢o#ý£ßj­WãnDBuÅmÜ6ìͨuÐÆD–«²dýTWhX ˆ¡ßj\ º ·Ÿ–ƒn{¬NéÙHÏ|V4»ä ¥#’ÕFÓ·µ5Ðoµ1¶qÿáå‹S9^áH–Ãu|Þî.®o?|suñ-…vŸH@˜üouÆúGŸ±ØÃ5ÿÑYIÚ¯Žsú‹œ¤_H‚ öÎwÕÁ=£÷ô†ëEg­ÿî¥m$ßH ©Uòtjó<¿Ä²c¬­kù,ÝÆ|8—à×íUíÛý ×ýv\©¼ré**Åït0ç sò1ΆV=Ö ÷‡¥¸ Ÿ2¦Š^~9ŒO @R‡>­>„Ã2;Ç2b”/6C³Üæ³w‡S²äRñ¦]Oeý &žS´/ vY˜f íÃ䧴ù˜§bóCÕÃyò°š& Ó[ÆÀÝ”å% +›§”óÌ ã&_~„b½ Jañ0N1À@fÐ96 V+ó:.‚~‰vBÀfÎÁm>&@ÞdèeX=t jèZÂçàJ´Ï@ ;:1fa|J0úYÛ7™@§°þìsÿNʸ`1ãÔÏ‹©P¦š½K)l?÷T b:) ‡o?w ¥0]L­mgû¹' +Ñø|jL›Ï º3 “&ü4µ²ùØÓ¶ux,ÈŸû-d@ÙdÍ)m>÷›Ta²ueëGÇTÑBÏEªwÈ=—Ô«dþૈ‹DØsR&"Ÿ°d€¶‚æ|{±ý�fœ 6qðyÁL(è‚·‚î7Ÿ87 ¯ Ð +–äÝ|¤•rP /FÚ¿n?÷4d@"4j4cÂõçžX &`¥æÍçÅ®0 lˆ¬Özó¹ß +4f‡Ÿ/uûyÁ](ì@VY¹…|Tæ’*Gj§“~†æÑ»Še©ë†Ra‰õs·ÙÁ¸™*У&™ n²õgè(S¿¤@`ì“Ç9Mxè­?ÂTKÌ+$"qŠh˜ iûäB7É{ 8ÁûfCõó¼þæC_Œ¥+0€ä§T¦‘³ß|öØ–O +̘AÂ3¨xì­?=eG +¡ ØÍÉ ÀÃwý9“åKt‡ÁCÏ€²9f·ù<!ädØ&X8¬s9ÐUŽ¼eô£°ã³|„äø?no.|}{ý5 +ŽíŠèµ�E9xiv +D[&Ø.°>yNŤIwpôýH”{HªÔþ´ÿkQÜ/=ïòf®†³.¾~ã<áA‰ygoÉQ²óx2òä¬pºP§Ì#T p÷ ѹ,0°SX8I£lLÜÖ7n×NaÚáâËÀ]˜½LdõêsÓ ^ݽ?yûúýÛÛ›‹»~E° àèîîB~ÿEýåÁ«ß¿¿{{óíÁGÀÿ{ð‹ß_^ý‹÷ØÓÅû jûKþ[ÿEðêó›÷Ûï�ðòîó“wý÷ú¿yñõÕ%ŽHÿ†ÿ0ò•Rx-¨jHdË­ž®ÑÁOljc;ÐB™ Ø[ UÎAÂnžŠ[b1Â~™‰ÀБ}õí¦.— †tB6ëWÿ9– <õèfÕíð¨}�¼6Εi1ò‰Ô”s‘#ç#oݹ¤e;…QwÎ-¿Œ› *½/ßû·ºPîr~µØ“¶â°ß=ÇåPØ‚°mú-°~õ_ÉøÒGtd´A?QZœ DcPLÕ©\"¨KYÍL±lÃý¤¼ü + +ž%ÉŠ­ßøWBöçø ýTž0|†¡‰/ùò@ÍÁväx–Y¥l-¨].¾óaYXþòÝ{ä>£T=ñ…yì+H¹o@ÒÊÙzüù…Ó•´l¨@ê2§Å·AYp^—iýî¿5ÂO0|¨Ô]/þ AÏÕ-±‡PÄ6Ê2ò¢¡µËþÛ ý†&=­Þý·Gùȃãšò¸ èP‘Ô%éÃZÐ×-¸ }ý:Ñ~PÇôêík´hËÅ»%í+pAÒ†}$~'lh9ÆP–-ˆ}6yH¾NÔ_U Z½ý¯„úº¤Ÿ;©Ö…¨|¼d#w5gdàêþÁ~ÑRÚåâë3þQÉ}õî¿’-ð“Å}´¢³÷Ñ*4ÇùÕ–²ý¢!go].×�U§´ø-ÿ&w‚`[A +7ËC¿ÔÒ³h©À‰ë×{aýö¿ÕÍ 6˜ÅfPà‚ÆýfP[Ï¢¡$n‹Ðo†õËÿ*6ÃG†ÿéÃÍ·W—8ìï/)Šo9�D;rŒ§u�ßム¸9i #sõw¿:ed³ýzÓ½P‚øÍÿÜÑ…9ÞpÈ×Ò+üz…¿JÈpØcrÐŽêCßûC#VzÝ¢±ƒ_üòàßþõ#ñýëË7oá×»‹›Ë‹›ƒ/ß^1ÒG`´ñD`+ƒ¤ƒG·—G›A"_àj-o’_õzÝÁ¤k“¢º×-`úÝóAmá46DF÷Çn/#C˜S‹º„µaºX)æg6Æw—À0µ² Jë„–˜BÐ èö@ß­á€Ú+‹‹M•a¥¬{/¾¶^)®C‹Û€à8˜Qì‰÷¼h8$Ÿ‹¯dDªaÒ3=°TKßð+ ¼Ôˆöí@GFw¯ic\¾ai?2–HÈÈSé:E£ ¨plvo÷°vœ§Ð†Yf2qeçV@|™½dæ<¯½ ùõ!×{Q7êuôvòEÏI`z¤à”a éËa¤×¨òM_ HÃeûšé �ÉüýºìÈ˸z²°zâlH’ŪG‚}3BÙõ} ´:‚ ñ½�~ÓïÙ×=l³1c�í©öM¿²¼×=lH…’æªÇÕœÚ~Yì¡Å~2‚möÚjÿ}¬7÷·?Þ]\¿}C'‡ýÎé>ã.ë&Öþ'ÅRg<hí¶ÿ¨æîa< FÎQd=, ~Α=Ô¥"WâàÁíåW]Û+C†VCŒt¦ÛfX…?vÃÝÓ;ü¥{Í¢_ 4ô| ¦ç·L˜NõÇ%ªöã]t+!#�/:PäÐ;ØP\Îö>l 1ó�ý””Â;¾ûðî;ë뿹üÓ|‚sÿ—/AèǤ”ûÓËð—~qÇôÆÔöÙ\`°Hê!fõâŒ?›ç„æµ:øùîðh* —. öíØøÏ·ëÞž@EßîÕ-hY:WhÈ ]c&ÇÜlÆ$½�œÖa¤>üâ3Œ šæš›¦ð‹ãã£×¯?\ÿîöý6^Êòø +ô=Ó„ü!œ¹N` µ0¼ÄšuHcht +˜7Æú° L3œÜ2TFU¹$¡ö0%8lx²¡Ì‚—Êߟт/H©  ©vŠ¬'Ç಼lš‚ôPüd#˜µ‡ ŠXw1J“ ×Wj`N&F‘^­_“` º°1ÌÒ8Lq ÅSÐåèZ+¼?ýÒÂ(0 ±êbiK0„‰W+Tw ëuðm]}žeðÞâí¬Œ:âÆH ÌÁKÙ…p0Ãîg˜æ,” +K»G§ ÔÈU¢r:’Îx•c2` I§3Ù*ÝFXs¢Ô)òy:|ãÓ¯]:Œ.+Þ`$:) ûsB¥0膥h\Åù$À<¹,À�ÂïN;H! ¼bÖ€öštB)h«!<ýÒåC¦Ô½÷ZáSž…uLer2ž’u/V]ºýÓ$[øAôÚØͳ"*ëÜu#ë¶JJ26ŠÑ•Æ[»x¶�ý줥‡74ò)Ew‰K™1`7ê.™½�S™…*FEÛ¦˜„I�…ÚYÃ@UŒá˜¶À@øUÆ–3†C ?ý"î'Õ�´*ðŒQq•ÛÈ@W«ï€6}`²Š«¬9³1”ÿ$RÅ%RFVÂä—!w¿:D;º1‚\¹O +³kðU?OÏ;@{.Æžðà¼Vx4ñ))´=Q –Ð�ÁL2G;¹g Gk¬Ži}.ÊP&f«$J±•ÖCE;(K³ÑsaÓï=:f4t Ó„†s{ú•.xDÈØ=ž×¯NÎüU1UÎÎ)°ðÚûÅypóžeš»vë†CxòYb<¹¼‚Žh™dÕÅ’FÎy2Úñvl ¯jnÈ’Çípô YËä3•fP. Š¹4…G&ZS8{P9²"¤6c„5ÛRÑzˆFQµ2CÁwe/4 ²fh=”) ±§IHªÓ®2°XB”¨%ȺV8@ÚF§â/ɼFÁzÞ,ðFô¡pÊã7Nsaø(컚Pêéd·!û’e~ +fHI”¼$¯ªQ鳆Üõ`’|Ò Z­1&Le]ºÁŽ B;¥•(gˆ¸"04V3Kªú9è¶LJ 9O^ ×™^(™8Kà!š¤^:ð²›'gÃ9pö…›©€ÙcÉ!ã©šf…p7«l‘X¾Éy`<[0ïÑý(˜hüØiÓƒšÂ@ŸT)¡L +b†o»âKë!ûIà¶Ga4³“wšYµÊ“Xy°s°ðxóºwq·Jc9OàuiŽ¬8v&ש[`ƒ Ãt®(Á ¨í—XKûz‰ÜÒ1kæQQ~ ·¼ÅsâüE&ܼ6…ê”Õ‰Ô‘Q”‹½6,½fe=X©D;€Žçb,‰iKÚG•òbV:îv9å_+Êyúmä1ƒV5ö¶‹dÙ…ÅF¥–`*b]iÍ©F¿D·­ËhP瘫 =‚§Ÿ#ˆ ÖÈBzU.<§ëëƒ3 +¡™û($±RÂÕÚêñæÛÄ×#xú9bvœŠdÁûÐ& ‡PÏ ÎÞNaÒýÏÍjû4Ù¶)¦æ“8|ã“OªP°‰0gbu× ƒXUˆÊà,‹4‹JŒ“HÙwÇ1¯©rªé“Jºµ³»ŠX À¦½t Ž¥ö¬'\©Ú8©P¯’ Z½|tªz¥ÔÁØ€½dxP‰%Î20œPÒÝجOȃLŒ!#¤46ei.L€ÄH~Zã¤<ßMW¬3# Ê4ŽÓDt=×^«lx˜kÇ)ësáqÅ$ÀÉ©°QÌ ²UÕ1rfhöhR”¶µyNœÅ-Qç–]XámªvO.Ù9Z;=ˆê™‘>[c£�¨œ�™Xi‡d†ÇÀR"&GV=\)}S^•UE‰Î»ÖÃdZJMü2ÌÍrf`Ë<,PžB’W%á ÇÇzT8mÜN±ê„qÍƈ=Û4¬‡8[Ïkß3{uc±PfIæ–øgãr¹šý¬ÊYÍRÝ,Ø2*ñº)¤ÖC2é^© {jø¬SV`D_9sÏj¶^€ÃÊëÈÈÂÝ‚J¤"](A1Í*6L&Õ(ëy› 5älÆ,dFz OÈP õµÁΘÌf‡¥ï”¢„áϨ)­NÕ–¬j_̳m!Üz*VÖüæþpÅ% +pìˆÄh{È×” &í¡[!ÑÔæÄöo~ª©ÖªàI#o•ÉesS8æE�!.ÈH÷œ§f·½Mûz¶QížU€ÕÉ«ðƒö{é ' +icFÒÙÜoKb9^%»`LáÖ8EkœË¤Bÿ\g6͵?ë ä ÇŠ `Ó¤ëÐ:mf +—ƒ«lciô$@Wõ\ò9+przÜU3¼$Ý>!±²Lœ÷ÌhDÓsÐ}]ÃlG ÇÍ‚_’±Ï•ý»Æ"ñÜa`[L[ù�‰Æ s¡;‚l’ï›{(A5MÅoÁȯ³kÆ$€ç¢”DŠ*̓Ƨ‡Ñ�oáþT5Èsâ:±´¯JÌ0p’fÊœh±ñlj´/z×Ö­èÖ[‰äé…žõ,¯¬Ç§çCEŽï Êîäe–¨3oe;ësP/fU45Ék0+ž£j¤*šœY›'ñî!P8¦:…} õŸ'§+)=ò¥* *h‰ƒ•èçÚiêê¿¥�£ˆœ¸ÿ ´€;¿ª8OIÍ(Œ™Q™ÎfµÂå’”Ñ Å¶‚E{” gæ?eêdQx‘͸¬"&ꥻ=#{r» ¼"DÕõQв¹»jùì”#ת +1¸ûÏ„f«%“Ÿ�ÍVKä?ÂÓ¯p4i9l[a¬:Š’¡ z¶£ëp³™ì9£ƒI;QP‚ðú:ƒ­Ûå~¦Ö˜)±ŽkÕ"–âàA Â`mDgZ‚šN¶ý<9ÙÕ؉Á¤ñPk0KidkÕÀ Ü@4Š’†z-éhæ©ÎlÆ‘7n'5â‘KŒ[† ‚(¹õ òP<”�<OœžÄ‹e®[ÿh^ž‚J˜nûØ ³$h®a¥€”IÆ{ÜMÖƒ·�‹P»HÚf¸¨�ÌI‡”EHAaQ¥/]ë!ÕIÕN瀶QŒƒhf—“9[¯â�–²¹ï¿U…X€»¢“«¢D,Ê£6 êŽYz-j‹"• + (hóU{pªÜ©p +-ç¢<”ŒCÒl¼I âSˆj[hÆY„|�6vŠ]1©™t“,�µe–“Š¹Šc›BÓî<kiüý2ëAMj“¢+Û�LšG´›¬@ö Co'j)¡esÙ¢³ÁëÊ—Iµ8©¬gõè{Öì™ÔCŒ¯;Æ̇¿«T×ÑNRS+}ç +oÒ»QeéÆ–ÅÀ^°Z„ 9é¥çÂZ³4.6k¬¾¨ìµV )³ˆ3»õ˜ªÚ«&¬"Ä›6‹9]lû;ÛÌFj@ÄÆ&zÍbÒ¯×Gj b=„ „9e– ++ÖéR3yRAµô](?ît³É;¤³ÊÀLûÔcZVó5,g‘\5­˜_ìkòÊÖÔ@:ˆDY0³CuÖ3ÚL£0K?é"©ªzS=Ûü¥oAsž#Ε‘OæÕ6Ž‹Q@uîH“M¢šÐw¿Óšç†Ž\ë9;ååªNU4šè¤ÕšV1ŽH@¨šïô虜rÀ á7{Õ ,#ÖƒËEƒUÄ| À¶F*Q1¤DW³˜©ÚÎÞi€˜·ðHlbº˜—½ À!´8š‰³8^±�IÕð¤}z¹cîŒL0]“;öó‹f¢'5"SE¼aÏO>øºˆÓÈœ6Äðt=U®³ÅŸ  ˆ r�¯L°Ã 6J³‚Ö¹ É¡³\z˜´eßÃŒÅÄÌYζ·Z8å“TÔ$�¦jáZÍCð¶új$¨Û“ÂhQQ¤¤ZsgYa‰¡‚zô„°1ÔÎqÝ™¿±3‹{¶ –iâ„ÉbV6î¡…÷‰Hسz¿%b•z³oTµÍ¦±I7n-®6:¯†™$öCxWµ0‹&7x6 ¼úÔk5ËNœgª­eƒêuŽ#R‹ùˆD 3N.1m`Y…à:YÞ‚¢.&Õ¥™Í1P-‘Ù¡õ †:WQ¡ÔÆI(¯<ÚjFÊ“šg‹éãƒwÏĆҋӓájàlr=×Ò�qR:mr¿šj¶è³Èá¶W`—jÇ(ÍŸ+|*ꄪzæd¶ŠpË2!ö,§Sèû�§°SáGð éáÈ”N(„³DFC6GóM¼¹§¢ƒhµ’d6ò˾|?uØô�6g•Õ#À`º8^ãØ ±”-.Ge±ÒžŠlˬ¦]xø–{>½ª˜˜¬#äp­ðl§°oA@8Y¯fn2µœïéç窚¬±*Wqm¨Å9¡YµNãøÅpÕ¦‡°¢>²Z¦žRŒSu E23@[þÕžúÀÄ<Ùé]Ñ·pm¼Á"ÒIù:W¸R4Êüµ‡ÛI8)ësXSQmë)¸ƒáŸ~Rh²™—´«eRÂcN¥Ì´«„ÆE®ËË@…ÿ4ç"r×dÇ”¶ØØÿÃ9õ ‚*áò}”øÌ9f”€ÞlZ‡@8À£¾)Ûb'„’ÞÌ@:…] +ÓF \‡ê«õÐY9j8XÃD[ ñéWjF‡˜*úŠE‰„v²Ûò&?!pöʲZø7ÂIFnœ´3IL“Xs5‘âgß× ßDŒÂ©œ"6xFseµª˜•Az�øջ̜{hÊuÕó½pÄ è²õPÅî)§¯K-&`æ™9Pk³¢Ñ_DxÄŸ¼‹Ë~ x'9s¶\綗[ì*ñj¶ð'oÑòÏfÝIdNÀ4D´ JÔ»™aŠƒ)U•8%¦�tHóža/ ÉùVÌ$g=T3¦fiܦ&m$m…[N]Ù<•Òâ]XÈûñØ\Û$9JF§1N¤0ßÄJÅMéÏ‚àÄZ Ϙs„@„é"ý'3< |Qí**¸+ºJ¡(®°˜&ÈŒøÚyÞ8¬*{ŸÆV<ÚPœ…àò>r¨Ç332Z�nè·´tj.+iÒQËysœ4‚ïJ³’åì‹NÚOò\: Ÿ{0 €ãÁ±¥æ¦&Æð5„·šJc*]ÌFÀÀšñr5–Ð,°‘Lìt\~^øãlJ™Ô¤oâ3TÕ8p5šQ¤xÙÁLY‰ÂéÕ‹'`™\°u‹Ì$¨š›˜¤‡[Fx?‰É<ã)ªäCdË+¯1Y‘£¥e‘ ;äyrÁñ¶~Ÿô\õyÎT77f»#€ 7H|�$˜CäÚª@œ›”ăl,Å2C¥ÏY­@µhHjë¡­Cf«5bGŽbeG~V¡ž6gP%O ÔxšW”î²YAa (bí”A”<™*•noÉI*¦91 õ“2@ è£ãÅt,²}´Êl”ˆyn‡oRB«rÂLˆ"˹äŒÀ2eÌöÔ&;·rgÎ"Uå\ásө퉫”,[úÉoЉƒºƒ\˜´õæ¡<cÝj "Ú÷šÖº09"«s…§© +fíÄYÈ#ݸ!¢RñºzSGÂ¥³ôÂÉyé¡É,⌡;ËŒõͬta^ï8Oê±ÐuF±©—íd–Ù´ÅI›¶XRBFb×Ó vÙŒ?‘YصÁÅç5t…–;©ÕC™æ^Èv„EM¦n%Ü6šŒ°ÓOsï¬>�+óÕ×'1…l-×–DG ÏÌ!Zã`­")Œøÿ/äF‹0]ªgúÉd*G!÷ýF…ÀUcÕ9ún«’ÂJ“Á’¥s%¯^§BúHzrD‘¤¨ýÇð4Ç…Wç\ám³ÓIx>îæ©íÅãf¢¨®'Aç>æîÜàf¬p.³H„™ªÞ²ÇcÓí“#8DSÔ='^+|–<]ŽB<7°eÍ•Ïi�‚Ȧ^:aÛŽŸ|ì©…¡Ò¹yè‹”^©ÇP(Y5¼”™âu)&Û¶0E‚7ÑeÒ£SS-JQj:* •t‰�˜²)Ÿ‘mÖqiU.Á`¸kâèR8 +‰ì‡‰ŠX—’ÅÈDv¯ìtÒù¾AP³0sÀáHU‘4j¡$±ýŠH‰Eߤ‡JŠšóµûrš”?ˆŸ�~Öø}ÊG çûЉÉT‡„vwòHêÛ+TPX ¡°h’¦Þœo®^P¦€)x;®XÚ� fõD.•ƒÀbÉ(ȸԃp ¢FŸ”ˆž§iµÀ�,’V-|Á i”E®ª(ÇÖÈ%/ÀÙø–‹QbKf‰”Lm7–°íMâÒ´(8`ÑÁ¨ÓhÙn‘Í ö}À‡PAäôUöùR3#qaâ›Í²Ñ"ašC$ŽRà=Cg&"¢‘$YdhV#†õª Füi…ªÚ뾡­n=�í“Úè8ÅVÜ)nFit²…�Ê+ê±QÑ€ÊÌ%O A]žLh )åWynbJÁkÈrÔcˆ¥Î°0`þw€·‚M–ÅméûšÌX8&Î&"SØq©¶³X™b Õ|TÊ\%¶RÂV­oqLÞ±xÅ5õÐM(,fˆÎ"€ƒ)ó¡WmÕMÈbh$:·€dɸaîjX$1‰„– 2¾|=›Ÿ#Rü¯b©ëCâÉèd“Ô¸¨‰%аÕà̈b—+H¡¬ºù%–žzh‘\XI õ0)%¿ªߥ²9éÀ›Ñ<pl–tà;EÓ{V(ƒëì…U¶z˜º°JòHJX$N•Dq¾0Ù™*{€Ú’’Ì¥C·0N¹&`²EM7x6•e("6ÖÔúÀž`y]V+}7†f©£1›E(J"·ÔWò®§�õÁüÆ°/¼§Fg³ó•-‚¼ø~6CaÏfí`K­O¦3DSÃñÞ Ÿl1ŠW;«æØ"¬˜-€üʬßùê}êÅBVÌ获j)ZÌž|¢Ø‚šîL[Æ\òl8À ›‰_RmØè´‹b'%5Ψ!“P¦<*‰½ËÝ[é Ò¬À¤úbJ§+QR/Ù+P£ÑZ±\QMx–¬§óÖ³†r5³t©;aÞe ïssOV,E5b¡²¥?±ÕŒ{H¹ë¡¼`<„‘k1R¡Ä'¡yÛ¡’·D=CË CxšÍe">,ÜûÞŒ¤2à€g›RO¶`´-Wžj™0Pc%­6nç+,ŽáÞ[îg! ¤‹—³¶5<§ŒJ¡Û\-ËÌRë¦É:30FÍ%rÉwœu*þ“¿Y¾¦SNhS í";öfS·’ì—@uÆû%Bu¬ãHÇ-»ÍÒœžµ©ÒF@KßdtÚÏÍ÷ðP5»R§�Œ–µ6å¤=ÌA}ù›�á–ˆ&ñÆLiÒÄrŽDån³M[–žª-²W­.39uËQ(ßöâù6K;Ö›†¦"5ˆ�S67Á4¨�áT +³"$ضÙ%6•:ðÖ«Èw¡t㢅·ºÌ•"”Z™c1"…û°™BcSxíF¶ø,çRc­M¡æqå².¦ +¡àg)áŠF¼m5hš YXX\s§6ueá+‘H�jÜYq&ö a†Vx%?ovP)žˆÀXÍ.E_ñøàή±õ0;×o¬s•ÀÝlÕX¼¨ 8"‹TçøjÔ4¨SÒ(Mh…)"çÜ4œYC}f!Ò‘ôD "ET UïÔû˜­¢GÐŒßB7çªCÒÕ hq”@n=¨9,pH5)“•\EdÏœ,ìÓ‚¼ðf…N¤¥lî¨gR’˜yŒrvj]RbMXœ›b"TšÏzæp»ˆ·½³~Ù1«Ex[•=R¹ÒÌ#0Ì3Øò®"RS –yk]¯òIÃï*S7†"[ˆ"jòSTB¨²²g¡¬,×X€8¨òDÕÃLê.âëÅÚ™&VNMÝL®/v׎d´H¤bü/¨M£xÓnSU«ÈÒõä¦. £®”'îêk…«ÝÅ[ñn†k–*Ù¡68ˆ*z8Ê9ÑúdQzâdÙ¾ñç˜ÔjmRI#ͽnÅÌ«e•B¹wwá_ÔAní|ŒJƒ%…Ðmð-þžØz™Èåļ6¡³âŸ"…a¥;o‰ÓJåsç…-p6eKëãp¯VTAÜøÛ!<½vî‚\sótà„‚2*âúf ­ÍÁm‘¤ƒ~ž|Af<â4 K[ñHgÏuiLÖ¨s…k oÔBh ±ÝS^Â|Q×ê !|Njš¤½‹ÀÈÑÛ”ì>jn^bÑ}§C˜Ìö\EèÊÅB^AXdÖ—³ ž±'s‹Ï\=ƒç–[L*'I}à7'±cJ9ÏBe·Ô’[$wFY‰ lç +Ÿ2wâ}…À>h[ò +DK‚5Ë !ð¬6©Ôu쬠D4‰"àG­±x\Ô¨¼NʘӨ£Her­çÉìUAä<,*˜5ì#p1ª+>ò“žžµçY‚!ñJxK¡”º«lÖÛÜ¢ +¨°¡úäD)ÂR…E1Åt’ªEîE6K¨¦€cÌÔlmÕ}'eKhcíLiXO°hc©(„@MNjXÆò›!èÙ=[DUWã3&ek-ïA%XliRb« ‚ok,C—¸«s(u—xÞv²aA푺s…kjH2›&¢ÌÒ̤#/qVb° oZ ëYƒxÁjcŸT”‚wYr{‡`¤‡ ò§º_r«µâª…oQXi#`spG+ÎK»Àªáh +•'4ó²c{ +lDš=3ÙÖ…¥Ñ¢ö<;ök`ÞÊérú½Ë"D)(ÓÆÖ +«è2åVJ‹[±N›]3òÀl !(¹«%{KˆšQ†@µX`Z]á ™êóßÙíZÝI„ϵÈ6„õÌ«ù–3’äm™ÙþŸCW]);Í%ni™3Ul,ûzh\Ã;MÿAx«ŸEæ&æâ-PU³VrîB ½;±SÒƒKW�Η^”r0�¤iOÅw=Xœ"f;¬v$5$#ÿ&@3¬†¹‡õ¤L@×,™\8¿gq5Õ[hA:(| +2÷›,ôkeye«Š¼MâA1äŒ9È�ÍN,•áj"›®Ê�ŽkìÊÑαXˆÉUñdN¢ÎÞÊäDÞ�z„ O–ˆ5Bœžc¥²‘Lž\LÃ" “zJ*ž× +ÏN³¤(È÷ÜÚ‹%5j%¾‚•ž‚"IMØXJ<©w4Î-ïS\×"ýXc=kèM–¨êBù Nš„KÀ¤[øs:ÎîÉX&K¡OœªÁ,ÎÒÌ’&çP8uâ“J€I[Òué2M,+§‡lp~ˆµ§¦"=¨hnžêÄ>%éa¶¦¤…«¨ug¢VW*ssDŽ!–ZùƒÔ«“X„Ë©lÌ¥|hÁ%r$YHíœÌ{GÂg®ÅňEÀ„Í&> øUM «-.áS)[ñ<›1;2;2x¨Æd¬à$á£èÎ×(H¬&6æd1Ãв2\åFdýV)]Ž$¬òbŒÃæ l*¨”¾¤€5¸"KÐ9–„ Ñ2wð/ÚVÓf¢Þ|‚@@£‡°ø‡õk²†—t‡VÚ‘$¥¤e¬¨§-Y±S;™0T³á—É +G.Ž€@o‘󉉆M}hU}®õð’V()d3ÂW¥´y!‹…n„Ð\lªÐòëÄÔX$EȵH¯-Ü­/àŽUŸÅŒ”?foCh®¿F˜d6QUG¥?² f™ƒÔQ\^ßcÐ"/Y±gG¦úI·<çéÙš³z‡‰ŠeWSw +ÞÔÁFfd`"'öˆÝÃÕ°ãI™·0 €iËd6ÑÒÂüSŸ(°ÙÓÚþðòEÕ/ñ>L¼êôæÍòf¨ÇÝ×7Fñå½ã{£@ßåéöÊq½EOvf8DN[HÉÍ Úz:o·Eñ èÎ(LãÀ +ñª.ºUÌÃðÊèxkågäîU7‰u­ná®xŇ +J·¬IñU¬äeäŠÄ¶µƒ×j K˜œ5FB¯Ôƒ6æ­$@4 Oæ|kðÔJ!~Ç6 ´á&6ÿ¡ÈÉbÝ74«Üì£ö@‘o¯Õ*2%:¬ðº%ɱÏQewºƒÉ«­$Î$%ädI;˜4l&GÊågä‘rChˆ©ÝSmkôZ½wâêÃ;Ä Ž¡ ÌÖR3zÀ5'RaÄædq�I{¦«‡èضƒ@I ôvß…"r×ÑOì/ÞMß­½Ô>C©ã¢­8euo¨ç5m^$¼„×½á}ÖHv ŠBCŒƒÖh-Ð6"ýƨmñZ @—ˆ¼Œn±<àÂÈÀªV^FA±½L§ÐJ_µ&´,ù¡&IH2je^T–¤ôŽjº7Xâ${möGkÑiÁ3ö-¼¨êZ`v m1:‘Z¹Ý02Ç\ü¼ZeÅz•uÖëUîßV �“ט®åʵE^q—õDÚÍKý¬ƒº‚:ô$[º.ÉMf›Vá¾­s[¢h„²XÏ9ùÍ2£ÆØ-s1 +,¶x¹9³/T“ÅÝÐr¿HÙj™.Kén*L<)P"% h4<£ã80X³-1Þ”ÍgXUX]€Îæ&À׺»½­q£T‡-ÜGÖG±°!“¨W‰.I-Y*aG” ëÛ…odS‚ ̈Le2i›c¸öí¹ánåí¾ðƒ†Š!­ ©r é}´1†¸Ü‹øÑm–s°ÊÝr”1ï1ª=,¿«Òš,²Q¶Â7{@¢ñöì—}{k¸ Ç[v´¿‡œ`Ë66ìı{-žÌÎbÏs´×nÌR„ÈS(DaKãbbBìûl[ohf9cžy¼ +\“I×… iìCtÜÀõÎø-—XÓIã(õt«¹]úŽÔŒ÷KÓe²JQöµ¦”Ž­ ¹å£8«PÕþ†#Þ7½ÇqÖ×ÀÙC¼}ïAÛ-¾_pÐF)Þ(»‘T7‰Žþ*ïoÙX«ú˜:ªö:Ó¥£Û‘9 o³3’…©d«D4·hW¼H†zQ¯j~Òb܈{¦¶ÌSÛÚ÷)ä$ÈÖ´‰AhÂJ›¥Ì}Hbç ›(¥KìÈé6a[‡í¢ÝwHn÷÷f‰Ûþq}fÈŽ†ŒkËå6kÜcbH&#zÚG{CB’ô•ûð>\¡ÍjnyÁ؇ tÈj‡|yßÙ“j·Æ ²¶5î7€#ýféNÅÎÊ2Þn2ûó×6̃}\i&0ë6*í µz—°tå›ÀƒVÙ&%UÖ»iÖ6ª´Q Xz!/¤.$‚Ý—à,R±[̺H"îwx˜çR„¶kAð‚mØoÖíþnÍ‘«<›V´år{8â{ùì–)˜uCÄN†µü†´:¤ê!*÷á}¸B›Õ,rw yþèp#û5ßY½óÜ»Þ0UËà*Ÿ/¶€a±]Bû»½%óXïBía±eGª/šf]ÑܤÙ2“ÙòQø¡U{[³ý¡½¶ÈEY{i•fb»¸$ý5TJ(èëvÄÙɬšÉA¬³Ôzcºc—€ØÁú++§ÌVõÂI5n4rPà†Lj¯úöüD³hkÙ¾]øuq #ëÊÍ5EMQÒvõž7\ IøÇøöˆáû0ÕWÈÄi03Rkæ€êŽLê€á—iÏ©^»k]–´æ&‹ŒPjM†ãT®3Œå ýÀ˜Õs5ÜClîE}èØKÜÈb=–£^¯36¶;�– íJU£Wu�ƒ·>2·k÷˜ƒ==¾©4mw$Eº}íìZì¹^>ï7¨*ëË­¼æ¸í½e,tð}¾„õv¡oŸ«áYËè8ÎúŒò“Zc=½ÝóÅ0[Èh£’¦Mb¢pÙmX†Îÿ1G¬p˜ ¾7ò­=<nȇœsËf7ø–d³(Uï•Ã¨V†AÜìw–é…v¯¨e!cÛò©vÑ(ZödHaCdîÃ|H?æ­üfz9M¢l[Óo5^ÈÊ°’ÒµP‡à;Š’¤†ÍÆt\¦Ðré�ßÊò‹ÚsbÏ«3'Ið–‚(@“aÖecÔ³­¨ÒÌ÷£ ϧý;[ÜJ˜ßolY‹˜8mAhqÖmÙùÑÒÂri‹›òÔ-£‘ÎeYV^¦„$­#ßùÝbUÙfá “ã­9ó¤ÉÍñ§'asvìØüA‹ïw¾£‰YúBCzM./)D'°qUÉ„IÏ +_𢛃Ř‘×ܨkŒ)÷²jMvÝ,û½ÜhƒŠ_µ¡m„ß=K1ZµÑên)a@!Ïoè™úp÷9|‡Þá‘yè4\R‰[$¨n|‘[ÇåÀ¡Ù‘ÿÔÆD9 à½7c‰Æ¹^ Å1[(¼D×3Y*TVa‰ª}xeÑw«¸ TIYušl¿õ@š¶SéX–g±­º¤Êe@‚’H#!0öiƒ ¶¥ñ=3rÚ ñ^·ÑzÂ×ÛM,"qÆG«“¬à\·ŒÙŒ@Ýp?#B4äèÜFHØ"l³1cÆå5E)ÿÈ2‚”üÂNªÉJv©7ˆ%,‹Pf>‚”G«‡ÛÇ ‡|s/“qä!ïÞ2úÁÐÑÙ¬Gô?Ú*û#ÄrA¦½æ^ôìpÒ’¶Èµ¤îò¾°‘eˆ ×—]£Tõ*v+Ù…Fe]” ßÚ³Š‡Éœô° žÉþÙRÃ×WŠÆ|sC„d¢}Ö#`ƒtì;™©N{^ì+D„ª÷æüH‘Ù±�~fô`mx§žQû8­Å}ךJtÖML˜«…Åh\M?“Ôn0 ¶AÛod SE#-=kÅ‚[N•ÆåÜ/#l‚ƒº˜˜u$Ñ0æèžø¤ QÉw8â}³Û"á>|m"™Æ1O£�©ý6¶¢»ˆ˜ºÙØä>–„áœãƒÃWs§Ô«f#ßÔ‹¸ÞðÍÕmŠìvÐܧqwðÊ*¥EØ·8=ZZÌR±½²ˆošì0ïb¡f[¶5¥/[[©®,'Ô35QÝw·Q +Üì+™³¹ƒusΦ[si Þêöüjáî=æ73Y‹uƒ#hŒÌ!âG+´]ÍMlÈ"šjp6 MÛÆ6yDZ–«Ü…n‚¼¶a›U^PðTÆD5¢ÀotIWLß< Ûbx–ì;x†§Ôð<Û~›­» ïáþrŠ=\eȆ¼j¸?ön¦Ñ¶ÛîÑͪ.NüáÁ:>‚Gçõ7OZž$´Ëê±N±ùâ;PF8ô¼ÿêØ}ù§„X“9.šjízß'5G¼¼ÝkÒ·”2ŠÅŒièþâ´·X¹¤æN™Nâ>p¢Wç,Ó¹hÆBrvDŠZ¸ÉýÄ¿s2¾íЙµJRwTG»B¸;Ô±n"^^J�hWd· ‡' åÏ\.¨‹NÆíÀ×*-£“|i© CÂÃdb¤4^g;Ø"~¿Ì6�îuœ¬�TÇ?©´¸XîGžìe=[GŸ §¯¤b,sÔj=x.ˆË*Ï&Æ£'²Ï•+˲d Ÿ«¼-iü7(Õì‘Ùq& ~-Ù1$˜¤=‹‰vm)Å÷¥"‹,é=9Z5¤¶ËHɾ8 ÛõAݶFt@I9ß5Þï“þéϨUÌr+O<×þÍí"= ä,>œr«÷Š,“o.ÂÔÓÉr °to&ÝSUg®Å†|”3¶(NKvRÔ¤@³,H=ƒ®qCr k¸\Æ.pß¼“Ý:aÔ§çi+2·X»OôÚ‹áx@Y#ÜìNEìî· 5^ÒÑLöM{Œ 528îÂÇ›a´m†{l¯1RY†Å¦¤·<öa±‰™5©“¥Ü1ÀîN¤”´9ËJVßáZž!j6)E)Éë‚’«×(îÇh}£íFÇ‹ˆ±-}¯qÜöBÛ4=&6h»W¹ÞnHÃò`÷÷ù†)ì”)¬°®=–j¸¨£©ì›÷ã˜ÅëG ó!vµŸñ†n¡{¦@ÛÐupîZ®C&`T ”‘# ïª~I¹sŒÜi5»°ÆWòÀø#,‹@,6Gd–»ÿ–¨X6uð>B±£Ù ØQw7ͤïå››c|s°Ë†ûq³ywÚà +u¶©x®Èh&û¦=FЙ/B%ÇŒaÄB†üfŸßµjÝ9³YìZ…U©= +•4š<o=tæÈäôz”ɪ5w³XÄ.(«…Æ¡-Ÿ¯ßCÒ ^]9b¦ ×2ã›ïîåX›½p½gÞ]m¸Í;‡£[Ïd0Á.>n¼ÏF;r;äÝ}!ë³ÅÅV.ÜfQþzÅÞ&¦«#\+Ãâ6Ñ‘!s±É®B@§TÆàkˆ^ÙÚ5ne=кêV\¦V¾§NúŠ)Þ€—¢‰!*YiÄÉ Û9ïî Ûòõ̆¯lƒsV¨›à´çXuʶpÛ)>f­¼·ÙQ›ïöoàÉ +’æÎp+yô¹iÝÝ=»­¸iv±¢V7ÄêªU‚R$˜W‹du§¯?¿7”hC£·êÙŠ¤RqŽv‘ô½Åp%4m9·V¢|K~çªEkngµéÆT½o ìÙ/£µšóþ…Ä"„‘jº-"`(¨Ÿ¨±s*b2ß¾Ú¹©Gkw"Íü¥ŽÝgRžÂ‰ÿqC †Äq9òçY5_Œ$ŒNâ&èbG³‰ä2‹a%´häDeZ1d!ê)%zü"î¢30thl¦ˆW°°[2²±g,¼ÑªúwnжÄ}TŠ-ñÒ»í.Ë®qò†á.üz½n÷Ô­QÑìVk¬°»] Y¡5ËVhkúɆ†å"¹>—|`/Ú—F'Z¼Ñ©[é!M ègï8›œDÑNùÌìõb Ü•ÇÏf*Á"ÉjШZÀ“ÚÚõŽ¨órQalœ´Š¢˜wæœÆœË­Ï«ˆˆÄ•Ü$|Âi ãFigÑSe‹AYP°6íIÝ8x¿/¸[ ëp“²AˆȡåÌB'*—„ÃÁ(ç±òÐX—º$õ�­Öá^Qƒ²kµõÃù”&­A!%Ë�¨×Ýì[5¬8Æâ]6$Õy"%0K 8‰[¶“eÄŸ‘ËB +<Å`•q&-´ƒ•|,A ”cÝîÜòA¼^õ±t`VIkqÑ]Ä›zΊmq­—× ƒ³ÖÜ@ê~Ô!GçňGíãgCη—MyêûnXõ€…¯$“-]6Àž½2ØVÃý7ܬß|ü‘<X‹½ë¶]â!)léFèisNÛæÜêã㟬0,MRŒµíF¼6jÝðÚ1W±Ž½|fÄ‘¶ì˼’«j;q»Gû~/2”ëò©}2¡•ã]FM¥¨W²C‹"q#˜vÊ…]“³KâÐÅõPÑ…†UãŠRG6É"0d-fŸºtàªw)à0D#h&°eÄUú⟥+Šù¬—k”;Çhç¥JcýPh²Ò\]–äÀEÒÈ%ÆnŸ½þ³¨åð»p›v[E刅qƒøûí¢—Ÿ­ÓÖ?8ô$nݎ͹\?춋=$‹áTöÍ{Œ¡{йõ]Ž¼œC—è~˨SŽN~{“àRÐz©ääO:-•`“(`Ìj&fc‹Ð´ëb‘MK’�cÐ�½ryž´Ö#qj"ÎZ56•¾ŽaŽjÖ¦˜hÕzYƒ¥ì²Y«7ŸfDÓüŸ³ÝåÜ<¥$²öîQ<È@P§à§N±Öxë°QàfßÍ܃ êºyç&¨ÏÃÖbL6+w¯Ì·™ÉÚAÜO{„ =È#~¸D›õ´u^9Žm^æ¡?zì»ú¹Çñw¹ÌÍã;ö oÉ›eô®õ±žVFT5$ÁoVÞ–UHÒè6Û“i§›wµ%Ï>Ü¿Ã>â +C2ä5CòÞ·Æ»f³Å6k’VÃÁ¹9:a‡Çñ* èÃ^YnàkÁ:×jVHV—´ âAÛx»JQʿωµŽ£¥¤å<±`e¢œTØÅøë9iÙ]1¡aìW²Â½’®‹ÖŠ8w'£ÜüŠg+̽E 6Î!£P13êUo¹ÕŠÇø (ú×d9¹ k|W“I=ß$ŠºÓ¬§¶ãKóÌc{­ø”»²°:‡\ã‰^¹!ÙáÕ�|Rm0¿_Ä ¾<’’Ú•]b±�?‹ï<äÒ]'á]¸Æ°“' +Ó#+“\Œ)à; sì)S1aÏÓS©CX"Au£Zá°VEY§ÁCžF„%¾&ö[U¦[n, [ÎÞÒ2“¾ÏBUì¹2‘LäZáÀ|œ.ÿ¤ý¥žv¦ra +ÌB—¢‡íTç“Ë ‘VœEÁcnv(âÖh <½9ÄÙÕy†°|yÎ[ a`øWh¶ký– ²šô}‡îv­Š†„1$¡½Y,Ê +u6“!ž‡+²É=Ó hƒMÛ +û6¶1É~´Gö©m3 P'õÉQ;ÅÀ‡?݉QìSê%¨‹yl©è\߸¥¸inéx·gÈç÷IèÉrö'¾�úZ%÷â(Uø¦U&»JZjAðÐîÊ¥I•ëÕ¬ƒ_Î:¨…œŠWs¦6â¬Uf;àû<†{×oÓ‹E ^9Üf&d´Zo ÇŒ6c¾ÇgXô– +,=a¶VÔ«P>UÕçBÖ šœEÊYÍ«$L[^F—Òë)Í| |k­{ÕÙ5Gw(T»ql=à{=Û^ÌÉ2xåxl«yØüVôió[Sòà7»c·g¼÷í=Œà[´ÐòÕ®F‹Ù®{q­B ž³êD¥ Ô(¶ªåôPÖEdÐÔ‚Nd5¼Ž1ð]Î*ácäÄ<V¬”¹õ¼óù}ûM/FŸƒW¢ˆª7Ùಞ[«Îë™Û SÑû”ȇ»aMˆ»=#>ŒÃ~!kãªÈý–˱¥îJ.‹V[ÔË0½•ûG{¢Üz0õù‰Û7>ä¨_uc¼3ö·Iéè‚]-¿D?^Üòq¼c1ë…‚F¥CzÞÒnϘ÷/�Jß<,ÆÜkµžË¨³¸É¸±Ü-€LA$y +T˜$½ûÎW~‘ƒ0©S}æ"šQîxa ÒØéÐîYÃz¸æó%c]«jÂ÷œâÝ€…M Ø8«œ’¹’Çl{x¥oaö+ÃÊ™nøN›U®Z.V‚š]Ù,^wóVIv¡»30ö3½Äe…ø{ªÛ©\Ž6ÓÞ‡Ÿ%2 É+Ò<T?Šê>­ö~¸ÇòF³¶±­°¾BFßÉý‹Úmïi‚„(þŒÂšª]bùæ2öLZcfÄÑ¥®šNN³©(]èeÂËÅr¤×?QI ÖýÝ^Ú¶ )YÝ“TúFµkõ­cŒk0=£C ›{ðEƒžô€éŽ.ª¶•õª”ÆØ«ÞÏám‘–ToÎñÕ÷Nóh7tâÝ,¬ã£å&YÕ„óM|豆#ß6 ‘ž?ÃÕ¸O•ëð†•À¬Z- q qþÍaíèœDs¢8ÒïY;õFD³hb´“&ºBՋʆ{Lö´L˜¯‘ŽÍ\» +”™“sÅ"Ï>ä§CλMoy:r–Ìód÷íá.¥O0lt¥j£k§B°¨äÙn×ÚrMã¦+z3B¯ ¶ÈÕzžªHQñvÍóÕmèÌ I1/HÃ+ã²ñãý˜w;ñvFŽ°$—”?îŒ N㌜/©Œa‰.ud5|x\ÁHÍx­%ï)´D~CÑv¥†k:"€oîß}CTå>®µaqCf¸sÙ솼 ÙÅ€±ì¡¢‘è…zOÐrDÔ•ÅfÉ=Fè˜Újè€N”ª¾=9c±8}L +”í”ņ/–#Œì%S@/iœÛm[+üªv]k  @ZÈÞ®V_Xs=ßuÞÛ}£Æ¬ŒÄQw5Y”³Z”%D˜lÏêÃßg§žYÉDZžõB@uØí ¶ˆ-Þw÷J^Óúõžåk&÷Ñ;‡£Û;•‘}~%1¶û Â3¹ÎÄ1øE¬Íù-í¹ÂÕp?Ûe·xy''ßaá ,÷ ÍÌ$6–ÆÒÝŠ×[«íÑ5 æ ;EgŽ.&6ZF +fÀÕ‡Ô§%Ÿ”./×ßmf}Ÿµ Ù”äÙ¾ëózìn°‘•~=ɸ[ÔYÏC<‹ƒ„îPe¾·òNÙò–XôÑ€mŒøˆíö’ù+°g­† ;¤‚1½lˆËƶb^Ƥ¶œnÌG ôIëx¿®G0®DàÆu‚Ý¥3²Ý@O2¸‚ΨXM†vÑôÔ}QËp‚œl„ÓÃoTGì!À<éT}BÏ"ˆÆäÈ ¸`³ýh29‹=úÊ«=_™+=q% Žõö©9r¢cc¯»ÒTÅÄpŒüÑ„”y²(Ê ¯Ýômom¸¡ a’ÍvÒ+çé!+†+—Yb j‰?ª˜XjýÌ1W{:ïg[8*j–ªb6]¹lo?ÀËÓù½%–«mº”kF¼‰ÌåW{:·÷F´Ôòàfg™ A€a)ïÌ9.°Z¡´·ÑEŒ’æ;ûjÛåÕo£<}Ò6ÒÛi¦3³12ѧPú{—ŸW"võD6;&�3ñ–Û8¹Þ¨@ÎÉ€'`šõ˜%U˜WUá–l)9$ª¢1–M¡·PÝûM;ˆPðÞ‹je¥É‰*n±b…÷Âa¤ª¶Øƒj0Q®õ¦× ,ÕQXÄл×JœÔƒ³Ðë‘`5}øÅ›�³Åƒi¨;ŒÊÅö3^ ܬøtÍ-Âýd!ÎuB±2Tœàd†o¢u^Ž®‹ëãôAÐÐ? 90ƒÀÀª1rO:œuÄÒ%F‰ª JÓ$I#€Ï‚¦|Þï@—}æÁÉ¡ËDˆxÚzžÅ"“8¡z#YW,´@"Ô˜‘Æ d‹æ_¤H�‚Æ$º�éöaê$K©ñ'ŸCG‹äúbUÌoA¦°<>̦’ ¡fÔ‘˜¤–M8†.‚‹Ë³!|ž£zßX(Â×QúºpêX£Ð„Ý<€±C´p8 X+2Rxf™/ÅÞâ á¦J±ú8•žGÃ(jÀyÄiÖëjÔ”I}X€n£)ðbPF o´qWnö–ÍRS‘¹©€“ñ)ÊVöQ7ê›tï8ö�½kt]>M¯Så€|§4M©LzPÃN"I  Ã@šq Z……‚Ž'}D‡ŠJL-ÈÁ”<½äYQà0õ¹SEK¨’χF¡”Épf t +§Àr“Žç‡vÑbÒoäðò®¨éTxs¤&’ÍrŽâÛìö­YxŽ ‹X¾6)™îôÆ9èåÍXÜ’‡ë·¯®° š9òíϨúø\”צvQm;ÇÛZ‹÷#_ɼ.øçxðƒnuŠl§QR\3Ssž&×PUH_ÆÄÑ“õ2òè‡2ÿ ‹è0 ± 3…rõˆÞJxïvÀÚj˜Ó2ÍVl–*6F ›ÀtˆL‚bøL}êºÌäÂÙhÒQ`½*^F½d' âwhãÆXã}F] f1^ñáRÐ%ØÆ&È"QE”ͼð-Cgð¼$2ŒÄŒäíŽk,4I’|t…m2 '‚Ñ +“9j`»Ø?Œ‡Oj‚ö9ž]¬L…�ŽúÚ¤5+¥> îðÊòÐ’ÙWBÆ‘¬¸œÇ°OÌ?Œx°Jú–ö‰ [±À>gÅÀ\A"ž1û¶ ý$î„S?9Š6â))VRï8B‚69‹~÷¸#(ù­\$î‡ÞÓ”Õ ¹Åƒ±—Õx†È[DžÃK6HÌEæÁj%¬P,dØÁ}/YÇéˆlÜ“Ø_k>PÎrWa˜¯Å¢#ÛÀ{Üa !RæðàÉv³³D— 5?ºÞ@yõ�ôæguRŸæ°V˜õ ZH/"¬9,Gz-òas¶hhÂË?Hvx'BÐP~Gb;~ÅMœëÎÀÊىШÔ^€aŽºPvŽ;ôO0QGܤ5<p%Äú"™'ÌW³’äœIÂØè)ÌS2�¼3ËÒCÑ+uèÅü6L}%ÍÄá9ÆóÚ Áð3%VàO팟 ËPÊá°Þ‹´�$¡™ú‰Š=Qí šEe]åµv TyÌtÅ#_=ϸ \)oæÙ¡ÅRû&¯a~ø^ñ8ªK¯›$4Ž$Õ9éüJ×Ãœ‰‚“Ó1w`d©zˆ††!,ûCÕáÑØ0dJ–›9T[†‡ú�“ñßÉiøŠ FžÜ³¤A#:ù*¬¹¢ƒƒ&k*±Ì *Já,�ÎxÎRsŘ+2ác̳†x9,Ú•¹‡YXÎÔ×®P–ilpœñ€cЛ·EÃú,Ÿ4_Û¬x^„(X1MtSÁbæÐسéâÝó@/…‡I–Iô¿Üà±£â¦c¯\÷…&Ä+‰ æÿƒ"Û +# tCâ…wKR�E½ÿ Kë—–CÛ‚bv|jþ ›Xàp:Ó)ËL +§x@î2L¦ç¶>ˆŒ@…&$EÏ£E9h^È&PxÌŒg£ã,ÊŠ«‡I‡$oH H�ýûƒƒØ&·…mš€™BæT>[ÄÖƒ›µ%œü´±•«7×w{|ÛÙ½Ðò—šüRË_Z�VZþ§-þpssq}ùæÀ¹µÁ¢«öùh˨xdÀª‚І6¶‰­5pŽjðó%<ãíAJ"týìƒ÷ýÜ´¯¬ ÷`¨Þ°ªx­8�Ž¡Ò°} N…Ñ©-,3A¨4·Â¤:€¡—RÒN_Jc”¯ƒöãÈuˆ ˜QT$`ŠÖAäËLv¬s…gd5üBJ +ºÂid‰*&&ÖuB’Ç4ƘñFŸ,å¢>2Îl“€Ò^¤äcT` e`Ž\ÛFzN„#„ãqÉÀ€5æè'íV»¤Þ$Á¥[bÖòuF©LÅh +6;äGˆ¸Bc,ºž¢<L•F'ÖŒvGº) 0![% 1Y)Òð W½Ve ÝÂÇ²dû×:†„Ê&Á+ +8W'Ý’;Ž@öœAi=Á„à᜹ˆ xÆDî ž™—zŽÏÒÖ±zÈ@W‰Z ŠêÙ Ðبgâbèø‘ÑéŽA8j'Qó\áKº1¼Òð†65‚‘¥›+A@ ØYÇ\1žV:Hsµ½PY¢ã‡% Üܳ“'ykÜ3ÍzvèD"ø\™Þå �@Õ› 8¡šOÀ ´ +íeå,îÇs…;§í¹ô:-ZÏH寘=/uåCÑz¦ÛÎà˜ÈòÀmœÑ ‹qŠ +äÉUôì{›ˆ…ÐY£ømè<$ ™PT%Àœ$Ž‘Ç:'£5 +ª —â <‚‰vhõ-œà‰‘V=A=W8°/é$)ƒÆ(×0CÝÇÀêb×sI^á†*(@,õVªvëxÀrÃœõ0¡9àÁ v0ž¶xõ¢‘2瘈%¬‚nE4V8U +Ðó¢áÎÊe2o¯ŠqSj{Ñ"U´W£ëTÅŒ€æ#@`qA Ás¾.[«C ÚoŠ¢&OÄÙ«ÔÌh+<3Ò1ôdÒå$Å[Æ[ƒl�7ïÂW•µyÝœc¶1é6¥ªÀØ&ÌÝPDcûÿ¹{›V[¶%;¬oÐxƒd|Jó{δ[Ò®ænÙÈ –Ç”bK J ÿ{gÄ#f®•¹n•¬[Ï`.TñâäŽ5?cÆ÷è¬Ésb±’Tuxý’VÝ ~ÅœÞÔÜÕ¯w™ÁDO—9!;?­Jôtî±Iù¡M6‹`vŽHGNœ[£EäÄuª•Øù6ôš™ƒ¬òxmˆ§ÞuÒ{×ßwÝ•–ûfàx\-!tâytyUz뇈.vÙLå|ã<ØÒ +ŸÏ” +ïO+Cojæ!±î'9Ç­0OÛÔÏr›R§ÎCÄi“„,L/8Ø qúi-.®¹$µ}œ´§jEi˜­Rx/¤EG(”W×Ç溇XYcðì–é_z†<ðˆWÄ$8dzž^–û·u k�¡¯“ô¦Ä4[>D‡õœ³¹0¸´‰ÉÎòÊóýX Ã;ïÄ£ø‘º Íf’ÃiÄÇ-²}L|[jÃôŒØ´šh€˜NoÙ†ÿ‡ŠhïtîÂ^´†­_„ß±:å딩>åŸPZ{ã-8Lv€Ør¢ ;×|JEÎ’~~_Bö|Cϼ#1I ð�™.\%#RcsX”«'}ÖBÉ|¾±EÂËúRÕ¬;ŸÛøÓŒLŒ!7q¨|ÊN_ø +ÜÖÈ�+Î[ìâҢƒ ÏTá*râ¾nŽ}kê©gš$6O8çÖ](œôS¨7~\ñ­sªÖßÄcBw>§ºØðÒ9äMÄT`rhq*Nâ°Ç�¿u,~YG»r‹ª:´ž“ØíädÝiàÄs9 A‘ƒmN§>çÄÙŽÒ¹hž6ñ¸’{‘g‘ Þ¸ÓÝ;ãG×Á‰#U^ÞºL£Á—)TÎAq :^;×.¹#Þž¯HâTkÑõw”dr°{t ‹‡8qL êZ9¾ ¹ÑŠ�g¼)6»<5C£¹›ïiö +¦QzS!~D¯|Å’v,ÿ)h¦ S0ýŒƒ˜qð­)æó;à÷ÇÂqp@œÃ€©¢ÞD܉9œÄ…ô/»=É4‘Ê1d¦‘ò{ áê³›‘¥öãì®G£ä%Ãc±+Ó©Þ˜¤ô`‹SËUÏV;D<ª¤òœ—£Q»>î.`p¸J#qÚ§“A¾œŒTWsûòcˆ-{÷FŽ ~\D€â%­Í'Ìõ¼ß–a¯= +Ø­²á'î¬4'ÎèÐ)ï÷px ‡V•qX½í f +q{ÙŠ–Ó›+Á 0 +ˆç/K—1wgLð¨™ôêÊ19ÔœâxÚEuCùð–Ík¡·kMM«£ó¼l Að³ª@ÿÚW$RŠNœÃ‚Bu²bK\‡™˜¸ŽŸëan ]à5¤c ]›ÛVlEĺ‡ãNt\ U¤&·GéaretM±§q ixþ,„EÚóFüGwq$4—….ƒ`¤&qjæü{•‘˜°ò ΨPP¼­Ó‘žá~2Osqb¸O*’ŠèáÄpª-rž¦FuþÜ©’ËQ5°EÛy £e¡¤Oó½èCFlP±ïë»/ˆEuj`=ÓAëôÒ+ïõh§È:‚ë²[ ™ßÑ3MûT÷ñ÷Áäß +\‰®h—LâiÒÐk»p†hŠÍ+@‰U:åwÙ´Þ(W¢SÙÖ‘sUD×2—áªäÈÏu X÷*ÊÑùf œåÄãHœúØú +ÉH³ sË[=h4ÌÒª Þ'KODOÜ[¡É:].¿sâ¦?“¹bbÚëuÀ¶†@_ùÂ!wÉtbíˆ}îó/ë°—(…nÀò#z­•tøJèõßN\“\ +£cZLè`Éé% qXÓFäCf†’K—e¥á%ÄSÖÛ¯Ù¨AÌ fÇ@ã§9üŽéhï°{[ ¬èE5ÍÔô sÏÔ¡'Ïg %¼B~‰5%c ÒZ§÷tÐü.ÚÁ“IJ‡j¿·¡Å¨Ç°Ä"c® ÂOЫ?ÂF/8·NŒÈu#×î¬ïs):3–nßÝ 5¨O~}$…12t#Bù4¢—”<-Î’5'À ZÌ;üÝÒµ‘¾gÓ“M +6]úµ•U®ÉÓÑe3t+Õ¯d|ð¤[mëjäàýŒ8ô’¬‰;N#ü¼¥] –ÙiA&,ÜÜ~tsÑáíô9M|¯÷qÀqæ0DâìòRœÄó¶J/3z‘?�©?à€wÇ•¢%îí‚®e²/8´Yä¶= tlÀv=!‰ + 6#ÖII;åéÃ,è12/D1I¨óÐ:Ðk`WÖ ýàÀxq^Ð.'“È kó½°¦°ü2[´¶ì­XGx~I|? ,.ÓR<ʉ‹Þ¾ŒZ}ÆŒƒ¹[¾tÎꄹkU{“ßÒüq…h蜵¬!¸+*ÈGkù©M¿ÖW’yàI'ÑT§ÁÁæ^%ôæ¶[2<bߛ޸Bpe‚I.2Q̃"7ßþʸ-휌W«Ž™3¬$˜`Žû0òe;ƒŸ{Ô'œÅºK>8¸÷Ë’NS˜ûÖdNçÒb1 ®ˆ¶ŒÄ£êX·+êðÛ5÷êÈ•@°pΘÑÓ¶[¬NB8È|úklÎ)¼tÓÒ¿µ£§#OÅÀÇç²ó A¿'áµåš­bX—Ü5ÐW¦Pq¯MLg?\G}ÓËÒóbÌl,ЭëÇ_ŒÁØŽA7ëìè²NOṫ;I+ÃT»¢$š¤¡>1u}ŒCxô3çÄÖú’Wü>†«]Û§=QÓTjå`YÂéݽl4*ÍÛˆå¯H–Ý Z¹Ú”°ºç©{PŽ\ÝoæÄ­R¾ ẓçI’2¶˜b‡CL£‚y:ßZ’„¬Ñ)‚w©ÐÓbÌC4ÉòÛ/îÁô'Z2lÕRYf(TˆÅn$Ò0‘4bNzjJß6ñ óÞázh¼¸™?¦Wâm�{lV¸�ïÐØ)Ï ©…Ò�gø?í\S-÷ÚL}éIX_âÐÄ×tÒïME`tëzF„ÅaDêÓ÷‘]}êòÔ#ïAÔåì^uÿ¦×ðAœ™øÝô°Ÿâ¡¶Tìp˜ëý¿ýà‹å„ie‘§ÑisÛní ŒhVµ £x?­BŽô5S¨2Y&‰‡+Š>nU®1o{�b:âT‡{Õk{o©F$ùøm¼NŸé5ÞEÇü2‚„X3Nÿ¡á"!ÄÞ¢Ö³ˆ-‘x±îP*(zÝ’3[$#?Y‰ùþÃCÕÍÔò¥§ÓRó~kyW µ…Ž™Y‹¨w«\´ž2B‡°z:v’Sök°rÍV“ÚtÛá½ù#ÖíT¸R¹ÜìN«£ÓõpUMÍoKÕ€™c†{ßšð´Ø MºéÑ‘/÷8†=¼¤@§9tó‡âF·ð;ˆÛíå$.Å^¢38 =äžèŽŸÛnésán[ õAq2äÕ4UÃòvç#ëp¾Í"&hý  X�þψã“Ëe/ÏI<-6˜ŸFì2VÕKuë<}£êxXWJX"f,6®F1zèuâiB2`ª´'~AW¾XÖ|’XãòL„F=@I9†VðäÇÊ"SÔp߮Ÿ‡‘+ƒX•Âv츱…Ê¡=,ϽG¶jßVUÄëØVddHyU-å©d()n ;ùeß]?±jÌèbÁ:yÂæ4 õrÿT¼´,âó:‚/í|‚çÂ;wÞìîÊõ‘Ö‡FÆQ7‡¾”¹ ÷µÕïÌÂd„Ú!Í­P&GÚB/ÇæÐ%öð‚RÑxúŽÆÕ¹ß}´[¤¬ è'ÈÜ=0!ç9€”BhÍHKfŽƒ˜cë!Ò;RCHŒ¦go“ÃNˆ(¡uŒkì¨4âÊ!¢cŒ?LaOκ¹Àlµ*ª¥ ÈÈáe,ÈBûŽïy â+ßø|_~¢ Ë͈]ìËO(ƒÅuóͪő6ÝæûŸø ëñ·‚§eDL«;n­ÎEņXsô¡;Š´q³rYMô6x‚Z‡¿Á~nè#+âi _—áé‰4Ãÿ({xt®ºèg~|*8ƒÄ#µ¬Ã².ÃSbÍ †ƒF¾5¼ÉË4ÖÒ!²öG¤¹h‚Ë¢"‹«±zê®s)Fbt&ºXc]hæ=BOF¤ß̈S“gtZu~Àq¬L3E,žaq«;ª$P ùjaœE÷D-~[×Ì@ДÊÔÑì˜ß# inæÃoNm^QkôÚŵ•º6y'û†ˆrúNP’îh?WB×`ÈѾ„CðÐñ6ç±D§Öpq&;‰ÎzoŸùå©t]8œ–h½á÷vô•j Ê8@<ŽËÛ ì!™ô©oÏ…Æ{xŽŠ%\ÇnpÉ!/Öb5#ÆÀtK3K+—aGBˆ²´·ˆ)~ žÊom½Â[æË„¹lÐÕ OþBD9Ø`öá¡Oç@yÎäȆC£‚('ßÏA\¢Ìãg‘}žû;ø¶’Ip sVÔknGѼcê…^ŠWÔ&‚aŒt‰èypDíÑKPÀ*oéݲ½+ú¶NºcF‚ŠC™¶fq‰9ö=Š‘eæ;²‚#ã“Ý ÿ$þÂín +ÔÎüè26ìµµäþý÷…•B]휨؆sµó2k¬ìýûýb-¦§ˆØ#ýtÏDszÚJØ¢‚itXlºY£O»¤ßø_âkÕÄIŠ8Är»wzfnRÈáÈàoA\¸j­êØ}Ӌݶ.D‡>®0†<Æþsæ|Ã~É¢ÁÓ¹Â/çÀE8#gýûÃ÷ßV5NE‰@¡ÕÑ÷ò•'ÈóKyÖøD™n ¹êÕ/ýý–·èKáÕ:¥‹1}Àu–oî@òèDPêB×+Ãb–ŠcZxw]ȯlöä-f¥XVŸS檕Q1 ®†Êksô•UJNTL½"Œñ%iÓ$vmƒÇhÇ° F\¼{˜æGä™àRï°ÿ¾E—uÓa—?³ÙóÏç?yø=wÌÿˆ Q·v³¦åy.ïI4ïÆQ@ôÆœ¿¥–vÒ–ÖÃ-C#ÊàD_Ôâ*!0½õ·8/&ãX¿4?,ÓÒ)2 ~ëQá>cû² NÆéÅ3PŒ~.ŒÆÀB›ZÇý»¯CìáÀÆkÕ#Jl�ªÔjóiHÓÞ^6Ïéub£%¹ð¤~‰CFÕeÊàA°âyÅdp'²ÐÆœ¾9Rý¬‡v$cÌ™i^ÈÇ·\†è qæ®M²v©ñª)»ÊúÐHYá$3H†¨Ö5׬Yèªñ (Ôm?G -²@l¼œê'ƒóù.ûÑ"ji=L(2¢«éØÎcìu¹gîBÈ¥v„ðˆì{‰g‹Q©ØŠ­y( +ÓŽ0¥LƒÀaµúÄ4¹8}{§ì8Ðç¤,]°¥£ÍRkj¿§«yâÕw–¦>û¶M`]AÎ0"Œ¨_3# ×3Wä@†J“<åÒêñä83Û$ùê fXdˆT¨r/8ñ±Œ¯!7–¥¸´²y†N5”&a[ЛM™q›Ù›ñ¼¨*§Õ/šO¶¿szfFŒmî«6¢’rÞ–p_bS‚;ÕÞ™’$©÷ø6!½¿EOmñ{/ÇùþÀçû"«áÀV8qlQííœZ¸Iz¥šjD¯A„ÊfÄ‘Zl_eÈ×è +yC›4¡¹ÈiáÏÂA5gû¬»#ÎP[*pëZ£ž&M œX” •ã)/µrda:5zØ|RÖ½ý¿ô6<1„ó-\\K²ãkå.ÉéuVU«ð²Š[CM, œ‰‰DGi›Ñ}ä]Š¹iÙÕÍx%Ì•®…vÐ*óù(ûåoĉdïX ©ô[h¹X™‰æÎõ]#º›Déy4«ãµDž¢sÝ›èî4¢·Üà:xLÞ×!‡Zy_Ÿ8™õ«¨ aûgÓ³jÆxƒŒ¸¦œ·>Öz(ƈmhéêq© óâÍoÑKx€ …¯ù±Díql[ò&×zUJ‘ÿï mšªû ]”0ëÞ¿TrÚù4Ö+¦5ÒãâP‹±„Q ›Ç‹ ^ý,ç~pÇ;$ÎRh˜+gÑëºØà.È)Ò«LþâE.ãÖ"ÛËla–”èæÙôYžPë,Èb ³8"Çàþ} ëÐW¥5 ïüˆ^Û¤ª×é±íK/zÄZáãkÄÙÂÙß*û®êMªBæΟTéP!ãÄ“9N¡Ó‡»0\³d∠,wL‰#÷Yìœ]H×ãÿ}%z-±b&®4‘’\Œžxô¥¿ßζó€O~ÜÂÅ,Ÿ¯Å§,£_BÃ’ à §ôë:Ê2Ð]A²ìp©j/—‡®ÎÚЉØkP€P,«JÝÕ=V ¿$z”ô9'11 ¨ÁQ”yÞñÞ±E~¸Å&ð²¬#q;ÄVÄÔÍ#ÁÜu+0Yò±&ø ½í÷T¤/=,VwÒ#hÂ44+G8Fa¢–UêÙL.÷Žáš^5"Xn^þÍ?KúŠ¸ÑQÒbtFþŒ* ̃G¯©U—e†û£f“Qq¢å:o³”hïZy•{ ß­ÙSNn=«õ¡Ý`ª!œo¾Ãzñèû@ÄöA§­dg´I‰–ç ƒºyKýr%ʬSãÉ´{’Eô‡‹Ä$5Ü¡@‚ë°Ýˆ¼F‹œÒ™ºöÀV8n™´NÇÅvQ|Ï‹ä”7ß‚îÿº?y."–a†Ñé¹…[¡Ê€µŸ³ ¿[ ùXæçã c㥠È>CCÔÃ}1Í°h<%%¦°ýí95­í›l ±W½{±*',Í›O¾)oðb.}<ô䣈õ`ÀøHe¨=¢?„¦ù:w¿ -é-b+¾lçÿf' +K@<ða-ÕFgòƒ—LðÇJDÖ²Òg½íoå�&ÕÕ*=çu„ê$³rÎÆÔ¾­©Kå+QßœkJr×”Q.˜(d›T4†õÝçS ³áD¯c9$äÞlèçPg"=ÃcXË%([{Äm !ÿÝÍü-Î*4i‘wb=o¦"Ü¢ÜY16E‡Ìywƒ³ÕÓ(±n^3djäVws…k –h­Ñ7¡G†íñq‰oóï+öbyD4¡šÖ&÷£ò;+[/ó@°÷$öHñø/q`1… W»’§m0Ô±1ÌÊ÷"ŠðÝ_þ¥KÔ#�Š–wNd.º$BÜoáÖá*³–,}Ï^?¢cOÎRÈfÅÊDZ_JØ‘Vütâ±ÝJfA¹âhíØ +”æ|L-ôz§OÚ³w(²UV*xj!›j·Ím`9Æð6‹¯‹f©‰dþÐ,ó‚û;‡ÝØ +»QÖˆcñË«fYä:°®¸=T@(þñ„êˆBÐM3Ú`üÔÍÝTÈv%rè#8¼ÍâK��þßÄ°‚ŽÁ÷ÁSD—u¢;ì÷‡ï¿/\³¸Ž´CÈp·Qð >¨æ uÒôx[/ˆëéåó2}ãßSÌMø€ð8ù‚Ž•8äsÆSS zúhê†(½«ŒÛSL¿?ð\,Ó–‹y Ó誯ëȧù’“ÊÓÒÎV¿óÙftŽÅ‚.L?Açƒ_¢<ÛˆU)Lrÿ×Hmù.±Vر ß%~(rzÂ×utU‰3îµåè,‘1°5÷ï_&Êž1,o‰ªR°EaZMQvÙ¢ˈ%²5ƺÌTe—Lªâôß2²ênwÑ®å«5‡+ÝŒþ®•Ú +¢Þç+•g$òZélDs(Ma¤Ê·T;F”­/{l˜›+,£C36Ž’ÜÕ¥c1^N"rkì·JDÖm1efö5–Æ宜(KD§×#7)ª¦ˆÖzCšÊøm5r-ªŒxõ¬…""ÊF\x§sƒÃ“uá9±äÏM&¾ÚßÏQô÷K°äé€ Ûß3}©òØ°hu$½š¶|IÖy¯M”fêšä"6Ið4þÌØIôÙòIšŠåã—$53Û‰9ñHÑj¥· ƒ#Ì»U>íøPƒ'•-[Ù©ªú¶ó¿í,5%%+Q#ÛeËTgóŒ4«ì Z^(ÃÁ€Ye-‹‹2ŠåiÉ‹¤'óZÄì·8ŒC¥/7+žî[Ã8…ÑŠFå”1õ>8ÂYfƒ4Y;Vr¿h_—$2Ì[é‰7á’”"Ð#ܼŒ©Ð+O‡«¼¹Íܘá’t»ØéJtu¸  ¸7—oÞ +°Í[È°ÇPõ1t>'ÒïtŸEL°LÆWP|>ºbÑ"—¡ß¾ßâ8ü›æIkᣫòh8}E­)¾‡\d:‹C{RKîĊˆo¿¸7®2}ÝþÉ ~6½ÐwI"¬MñÛÚOEax Y,R=2$ß"S{ï?öuY”Ê¡×Ç8FÁ8 +²oö»N'ÿÅ×mŠnâÇžGÍ /ià;ùØ4 &0ÄÈ”©ÊLM«™êζ +GýX¤«ñÝÈðM†r}v᫲Íê‹ú¬§4pf¹QE7ñ¶<ûùó¤MVn®*=Á$1«Î‰²äbûç¡(ÝØ\Ï+ž×ÏóVWÑ­øh‘êžûÅsðÆ'~"ªù˜Ô®~D÷1§{߆ïø>ZyFK†'>×YèUtÞ·®aÇ+ ·[Ç¿½Ñœf&…ví¥]ª/ð\¢ïß_6¯„æá—`UCÉpÇzìsÆŒ^â:Üù쟨 +Z/†å~DïÈá5:kÄí㦺‰Âࢗ”˜‹/ÅB#I-v”+ÃÕêlQAuÃõøÊJŒXñ†uÚÈ/:Ge\jÄ ¨[A¡c)EhȈ]JGe¢ü} _×½ž¡=ì@³é$Uõµz?Lÿ B ù�mïòç¡|TzTr”JšîõÏ+ho¿ÿuÙXé·DkÞµ­e§<Þ¿¿Cþ‰—ö•r9Ñh¡eê܈«ìºct0_vÐÛÑ$ 7|à¿ïe ñ\¯­?ªJ¥¦7¦$.t—;QîÎ;ȉîÚΰ"ÇIÏá¨+«³x³u9ÈÞ†pµÂPtëN™Hr{¦†O&†p-±tèmFd8»FièÓpBA§iQ3»Zúë3¦8¼á:¸å6Ñ´.ʳôËÒ%¼™-2HÝì†C¥)“Û&^1ñvÍŒvo& +W[¤þ:ƒÂ_˹É,~Â×ecõB¿Ô]š;’jÚ „ˆ%1‰²±vĽœ‹ù’~šbx=8«~¶7?·’ÎËۮÃõa̽ d /D/'òßHdèr"!¿8ñBÌkåØóÕG÷9û'G|Þ¾•TÉÊ…fõHŸwú® +¹ó¹þÄl¿§y_îSbFªg‚«9«F›ËO¼ñ‰Ÿ(G(|q¨Ñט1 ¼(5±—¯'#YF<ŠÆ¿{z}6~,ï³ý½~3’úïcøº(rX1j¼©»ï¹rë[ikº„KÀˆ£u®çžP9*•úSžjØ–…̆IÙ4ºÁÙv"ý÷±]B–òLÛ +¬ÂÓcû3!=6·àŽrÈ“¢@ÞÅÊ”*ãœéPAîcv©Û·1ìá%©bÓLq®¼å¨ê.ì{V„Üè¯|¾Ÿ€�°X/=ðÏÿÿý³ÿa\¾ù3zðÿ÷ao¾Â ”…žÍÜ€M* Ž<ÒHõÿý?#4 «öϽ¾ÿ±¤�•ôÞ�'µáîGto¢ úAh©ŽŽxNì™xLôZoâoýq#^?^ÙqB®l'Ô=†¯ÿ–yÝf@7²ùd­Ú§iÒ‡èð¯æú ž€+sòÌ‘gý$¢c$"”_fObÌ~Æùúñô©³xHâ†Ð5ùÛ¢Ä +<¬à‡µ~Þ˜Ç]ü°ßo«Æ8©NSKû¾„\Ù*\xë€TYÕâŸ×î0ºÖ±¦Æ¯{²±{oóuü"þŽ•˜ÒõãeI–KlÅdÈÂ8¾ …]\Û÷%ÿã‡íyÜÈO»þxDÓûªieÛ©fieoKK[|l­„ΗVã÷âkŸnÇt¿ƒÏp`”I¯æ/b«ùÞZo™êÛ’“KîåL¯Ÿ«ë8¡W¶V •0f7ŒbÉø¿9æ�¾oQÐöóqç?“Ç3õxúnë¬Íèóœß¿ÿ°¸Ü KŽsD­iúùì ØINì˜U&ˆC_F7=ÿÅ\0[C÷[¿'ß4¯Ý^o+@âo­atÒåcKÅì•s„ªt÷2G@ãô5»† d¿Á@.'6Æè«@·ã°·ývvžOÙ§#ùx~Oúmç´½Óé˳ú²†ñ@<,øÓÎ|ÚÅ„ÜÇ÷(Û/àÇšsöüYËÊd³Õ¯dGˆ ë8£:âšµ¢0XuŒ«™?çŠÿë$HŒƒ@D±ëÇ¢ýd h&¯[tÀ¶×1Xi88û€‹6Ýcï˜Z[íÏÒù{< §Ù·ËXÞ·+oûéÓ²<.àçÕvL!È�¨ÈˆNLÄ +´ô{. €6¿ö‰ñ;>ˆôÅ7�x]Þ»ðí}&-d­µ±}ýÔª½ñ\1-닲­v¾ Õê,r^¯“ú´×ãù=·¿3”­÷]âTB·¼/Æãª}\alÁ«e­/åºõrlm/pËb¬p²ÏëÇÈ£¯lŸ—øq7ž¶ía‡ÿî¢Ê7Ãÿu¼³çP¬gÑ¿V¸mÅãûûÐVݯït�þ@’¥G• +ë~ÀM a +èé—YèùÊö6æ¯Gmûíg¶Qñ4¦‡Ñߦºµâä⸀µ¥ñŸN¯{ Üib«ëm HŒ%pdì×›´g›u*ËÆP.ÇòmiBã}\LJÚž›¾}[‚ŸÐ˜ºcâ™ßÉb{¡Õº/ã¤gvcÁÉ„vR\rýyci€?ÿòq•² w§žZÂúRXr·%‹¥yXßÇø´m{üxnëö¤rß17¯4AwOê·d%¡A+CÊ[}µL»“ÞØ͇åQ0'“èeÑIü­%;UûòöqA ü•m†s‘cÈc¿d^ƒróm“¶™pßÑǽÿtPOÕãù»­ó“Ê}[Ü©Óü­Ž©ú;€B Wµªu¾Ë¢uB¬Ji²æÕÐKsNúD ÆO Ù:ÌUŸßV€ÄØ5Onxý8 t×Ùóú^èc èÀà¬G ÐzÉ™+»—™½}8‹Ûy¸ìûíð<³Ogòñ�?õÛÖ=éÜ·Eü ;ü¾âO{ói#Mµ™>ÐfˆTÀÕ5[?×2°ÀÁÖ—ê$ Îȧ´¬bÓÿ¼.*«Öµ4ø­2@™‰qêLãíc‹‚;¤ó•­¥Ù¹áuIþBl׎ÐílZFñ§ƒôxêžÏçÓa¾iÜ·™Æf=,Ëã>.õXà“\Îg8Þ ›wÕ¤Þg¬žÕÄÇV xZ,UxY^¨â¿6{=^ç)b¼oÄq¾~\Qøʶļ^ÇP¨ý:`o¿545š¶ûñh<¢§wÕ¹o“ 'ñÊ<®Ý§…ÀÕ<éð¨PÔ Ý[2Ú‹+b,4_˜ëǽ®^Ù~ZèÇ]yÜ¿§Í¾(ß–óÚ|à3³4|÷ž‰„H!¤gµRuw`…Ò Wøc‡—ãûˆª5!­$ž2ZÄŽC2T{üz¬åÄðšÐ͇áÖÒ㘔ïZpÍ[&aZµJJÛð]pTK>8žBgÏœr-É£jº§ŸŽé?ŒóÃŒ>Mÿq­Wõm bl§Ð5k÷±™ÖÛú¼©B@ŸVç/ÚËŠ=(Ý÷ŸˆeåC3¼*Eþ-K}š@ãîI_öhv¿Ïfwfδ¡ãŒ/&YeåJYoU^I–³çF‚xŠwnYžaÜ·2Æö¸ï·óq_–Ï x_èÛŠ=¨Û÷Éÿˆþ°RkzÛ€˜üÑ\ˆYëJ+�ûÖ²ö Û?£}ZÐçQüÈV4eÁÊz£rg‚’y'†õaôíû·WvÍÅâäF\H‡«`'¶¾Žµ+5Á9w^›\SlØmƒƒþpÏÍÓ!{W·ïûýa×붸_Zšcº=Ö/ùp¾:ÉÊmA/erÉ’U゘›Ö1JpùqìmžHo?1V?>ئֈiä¨ÒØM“K“1+PJþÊ +h…ƒÇž¬$[S]·Öfò ΣA·¯èØêDä¥8qùíBåpiÜOC,Îýè<²§ù®lßçÿ{s_¬Çeý´©tï[Ÿãe5ÇZ…D±~Ýß#Žmó$Ô.žtKbHú˜. o‰Ú±²V<ã ëŠ;åѳ £§O~}krƃc@’–”•ÄŽ +bážnÖ8/˘à‰h]çˆ ¥çàñÈ<œ­Çsø®lߦù³×é¶$ïy¥Í._¢Ó·ëý<HÓ®:Ž«§Ãb·GßódØ¥{Ž¼îË©ß—Q¸Òå¤>X;Öܪ*‡5Q†‹ u$Ö:-K¸�U=ŽÀ:oº¶ç­¯ÂKƒ€³¤¶ò‡[ýx.OÐÃi»¨Ú·þh‰VãqÝ>¬qCÖ ›3¢ÈÍÒɱ£G(¹­£~*õ¸ˆw>²0ºD;ñT®ÿx•·äiï¶ù¢f[ìµú“pI7‚°H+ɳn—d¢uŸ}o(!RÛÛÝ ŸOãU1E"P+ý½´Õ‰Þú·Fâ.)XÔöº‚8¦_{»1îÃû˜ÔlƒüAl®OŠ¼ë‡o"Øéq�e‚ÜïxÝs9@TÔùñ׿Eê㤞Wàq¹>,ìÛ.plÖ›Â_}{÷â©š–ÞØhþ*ÔîXVf$@ŸVíAÙ¾ý +WÖ€ä\ôúmÕÍ ¤¼½ùœè¥hÎcÀN4h \çæõ'ʘl]ít¤pŸDëóQé˜hY´ Aiku iÚ÷­üÖYxØ÷çr_–køaµ_×ìAÛ¾/`,¬ãR8Ý{ÊrøÖu §`í<I§ËbŸl™ëÄ’\€s:+fAµoMÚ™ 3£àק Lƒàè…óJÙLÐÿ}ej.’‘†T‘´ä=þ¾E{.·í|Ü÷O‡äé@}8yo«üàÚ¾/̆ù°ŠÖûms¾´´Ò´öHFþ=-_r @Kê ˆtùObƒ8ÓÜœGóŒ4kI–º8´.µœä¸òǺËÑvš/uVRïwiDïÏGW?‡F´v&“¾³£„c÷~öìîgçñ”=Éweù>ýÌÃl×åÃ"ZHÏxE+>#š»Ômjï*X×e®ÍéUÛÚÜøÝ:à[szøÛÚÛ8Éc)ɤ9z”,ž1á÷Xûá-ŸèÇ;”Õcàß•_FƒS§{#{øñèE6nM¤sõÀ¶%…»ó¾½ßÚÃYx:5Gì]¾¯À–ða¹žÖõÓXeßHÛEz½F—´ôˆ‘v% ©A‹s¨Ãʼný<M;só3YË`¯ÏÛ%ÐfëZ&%Â`t`˜ûÔ'`½[,9W\—`Y#þ¾¡øBœP Qdàêìö‡àñÄ<ž­§ƒxÑ£ï³üýiEÞ×íÓ +7�Áù—“n®ác±dèKÃ,s¹y¯ÅpW«÷Ãs°. wvzYȬòã–<nÞÓN_ôè?n拵)|O5wzÖÛý§?2ÿ?”nþÝ9xգ͞Ó¬0»”µÈïË|Á“èIž ö8T^W¹ý¾†ù…Ç“où}mùœxj»âàE?8–!Dî£þÇOñ$þÛó{Èÿ¸eØX„´cU‡Ô¦œ«Ü—iºáo¾†ºä9]Ù}knˆ]½¬ÞœÑé •FñÂY2%ô‰__òëšíhÅÓú>îħm{ÜãÇÓð¶j_ŽõÛ†Ó±§ƒ!$¯Ö ?íÁˆU'xª™ÀkÁÀ aí &brV46¤S{e·§ã´÷ˆ Ù_mÁW "Ó·,Æ:j8¼nkñ†Ç zÚÉç]<"ÓÛ²=y×okk»¦$÷uü쉾ÖÅéè¬ê X#ÒÊ)ŠLåNšzÔ§Ô}s`7 r€.;±u?¡ð¤µB}´\¢O •þm6—Ê·èo;ôÇí|ØøO§äÑz8|·U~Ð÷ï+³½¯÷e|ZïÛÞ|É5FÒé`u:èÞôµý7iñã"’½QEB-)8ÈIHÇðs¿â¹‹G¼p¬…FYØ…²“a*‘ðØò蛣»^‘Ðíðl ‹Ú¶ðÔÕ8jNj¨Ýı q ]`ɥ…o:yÆD¿@`=´M8”§÷é¨?øÜß&ü¸÷U|^ïO›ãPR´bNI+߶²^†õ +”g4 +‡L Lì2¥ŒU@h>«>k>c¨Š–”R"ÿ¤Ÿ‚‡k˜xÌã4Ý4°Ü¾FµEü%pH£¬Ý17Tñ7Æ!˜`3´$Ÿ¦§‹þ'äñ8=»§3úàv›ixt–åq?­ö0eTÇj§)Þeð\©‚ÁˆÝæ¦óöñ…ŽNyN—qÑíùxÑìîíÔ©âz"s8ÞéEè%Âx&à*´4ŒÎIJËÐ6@8?tv™2ù¬+aoÜCôäýà 8ÎÑýÐ]}ï·Yþˆþ°$‹÷i¥íuìž:â,0ÛÕÜ‘ˆQiðU‹Ðý/â†ÕÈ€Xc"'.F¯?®ôã¶<nàÓn_ì†eý¾š¿˜ÀËü=på³fÄ£°v p˜¬A]>Š7yEíD$ƒ,ë x0ÄYr8WQ‚Îðˆ/Ùì‰NakÞGûû®ßåGîíZ•–¬Ôwè`¤Iz§ËÅб»ˆ²à {)íàRJ¶ˆíô´pl E•k£Ãóñ‹aÉØÒÅap_ÄX™ÇÜ›ûÒüÁ:>-øÛ²=¨ã÷5¼D5Š² +ê×L8±0/ƒê±!øhÖz¡¯tF-GG€#Â2§Äô²T@dê²¹šFS¬cਛa~ˆû’‹þ¸?;ù¸ígäÓiz[¶'÷ûm Ãýî0\)×(眧d]•ô>šD-@fMŽhRJ®RŒÎ¶”NdPÀœ!)ôq¯˜CÌÎ ¡<‰µyÊÝ() R‘ Ö^‚T=eù@9ÎÃûùq?vþÓ1ùp¦Nßm™Ÿüï·µ Ï ÷ýuzÛ5– 8Tt8w%Ÿb¸ý…dÄaª\‹¶“1¦\º÷¶Æ$¢èúºŸ†éåï’ÕCîÔÇûVDéqßvøÓqx<;§ì¶l_ÎóÛü(æq_®§u½o—ܹ§!&¹xD±Åp$Ÿ&žõõ .Z¨clŸº¦²U×æ\¦NÝ%â(³È)`®"îÅ[Îï€VÇ‹h~“¥À€7!óð¾å«£ûö$â6ˆ/YÅyCný,°Ýœèq¬o><ª¨‚õ/­ûÛÁ yñpÊÏãÓá}W’o+ð£r_­Çuý¸ íÛq<©šH™Å;‚Ø`ýŒ‚–"áTWæE…‘ˆ1dÄÍíãÕ™u2Â7iG¨Rá%ódS~Ü÷qÊi|^�PTÞÀùvH†£ÉˆØ3iª’ýƒSðpd>®ÛA¼úÔoüýa5×íÓ"w3GL]…ùbÇ`qFvÖÒ¼Y¿#ô‘&Sa˜«ã蛉ó£ä?Zâ‡Íø´m·=>—èú¯¶Lû^lÔ#³Îp·wÍâ^§›þËýýžåïSþ&Z¦MȆ Ý´=T¨×&ôŒëD‹kŒ–_?n‡ô¾ÍõB{Á…¾‡»¹^&v_™«U:2”*«ŸÞ%½ÐÊÌ-Â5_<JÇ~)¬=CÏÚ#d¹Ôh_ÙÄf4À,j î@XÇB€+Š8–rÎÍðcι¥É¸Nç�\vP a³iá}uAØ™H§@8¯œ˜LÇû*ðdý›—ÓõZêô¼nOìò£¾Oñq1>®ÜÓ2?oÈãÞ=oóãø°nqºKA[œã *vj F¾öÎÌÈ05==êÀÃm8¢À¹j8F×Q*¡}·æ—Wâ0¶­dr°iT:?bA,grñ/¥ªŽ)ßâÚÍa,w·ñ㢣t(¡«‘áÓ:<ž¯×ꬷߌV1|œÊ§y?.Òãr~ZûÇzÜÒ§y\¤Çå|ZûWùÅÚ&G4ÌQÅ6‚YƒXÄ/(±Ãªµ‹ÊY™ä¸èãسdo/0Õ›FK2#FnëÛÉJ'Óµ M‹º€“ð‹õ™ÞëÇ´‡ãPí5Û+S)┯šév‹m±$§JŸ—öêmö ‹3u›éÏÿ_fúß¿ã÷Fuÿ/ÏÝúÎý×ÿÖîs瀋àѽ]pRÇÀäm¥ó…þýJ·Ï®}¿òùD¿òAoº-ŽÐ¤Îÿ;Õ6€w$¯îd/N‡,c¯À,Ú9ÿòNék,Õß°Î@Å4˜Õ ¾t¥GkÓÝX’?@„ë´ Ú —" @E%€Y]#Rì¸m­;¢¬z– ÿÞÊYGàPI¿‘ñTõ&ˆm˜aŠ6 È·  P>ÄÊS·Õ;&“£Öª_ú¼b±[’àP»Po„mÄF˜= Ëâùäèzl` ‹l4¡²¦2Åè]’±¶]XŽ•ðÜ ¿ÅÀCû¾:§Õ'pɬG€fz¢8Z°š¾«yºEOzâ-¦ýàÇ#£;³+µ‰ý?½Õ&qê\ºàÉøe­ˆ-XîgÖ´´5è=G3ˆƒ ,è?ò¨‚¤´H‡“ØÑ‘ÝÚnžöøþóQ›€˜�,ìãçëiUx­ sj´;;[ý˜óBŒ½‘ Yr¿�úëhdÞ¾7/¡Nz‚Úˆ¼D?·ÜÃA¥îÐ;`Áp/P¾3«kñ¨@Iñ÷禢zÀˆ&%Õ´XÅn§ô`#ý£þtÁ c[õšItw8:$_Ðr ±÷P;åàÓÑ—” ˆoŒ´ÄŸÑ›j`Û‘·bx"&Në`~*ÉíŽ+[¦n;ÑŸ#ZÁwY"–àЀÊQUŒ4°ÑNZDBÇuânl™‰]½•„%tëv°;ó"`¤‡ÎÁR÷¦ó„yò‘K°+ÇWBËßEGvK6@D,Ĺ¾\Ø;;ÁU£×ÄIô.Īö†N+C"Á…;t!'o¼Wø1Ðý€Û±%‡¡~J‚€° •j|<0^˵+B™"Ô[ëýKHð8*À‹¬ÿìXÜïêfÄL ]ï~0䤧8 †Ü=kÛŸÏ *s­Q=ŒY*ÃXÐrœÞ3°’œe +û€GÌAŽNô\�‡£®D†§ÄgN‡•0¡…=«EhfNŒ½TCóŒçè[ôóV' ö!6>>N™ûÖâQNÈì +ÎT¹ @ÑwØó@ôÒ,sˆÜ#p;vÎÄ û¥¼«bÉÌË9�ðjH½´L\Ž¡·C-®É×ÓõI øx7¬’’ˆ‚°[˜pµuu>î[0Ï]goã¼îTïmCÄ6/ñ¨M pÄ6†1‹ˆ+ëÚw^°¤=#¹9è«Äö @í…êÌß’™Gª¤/¼àVžuÞU=-Qvfn„øRæXzTõzn’±§NľҒzÖµñózÛ·êA½¨0X· J^¯&”to ƒ³`+ÎU°V‰ˆ2]`“+"÷-›’8%!Áâ·4ÊR3qc—Z[—Àx®!zjh›á‚ö›HË0ô1sÆø1T‹­>[ÿðRLiMö‹ Ͻ—F´<OlñÔü:ˆ#ÊmÎðjÈ8À@e­¤ãoØ:x½ªÄ€)Œ<‘•0P&ã…1[·Š-÷¸c/*!»í´´Ø‹ƒÎ�¹Á{MÇh:¢©ó­¿(¤†%%"M :Y*Œ%“¿¼Ë–“ápÒŽM L¿(’Ç8¨�ê°?%ã\‚Ê7t�°( ±@ÊþþŠ â?WÁÁtË‚.ó éÙÜH/ ã"fbªÙ»U*?ö-ó±)UF{·fín…Ôu ÑÅ1¼™H©ýÿç¿üWÿåïÿö?üþûÿðŸÿÓ¿û/ÿ÷_þ£ýó_†KrÂù_üå_þïÿ_þÃú÷ùçÿú_ÿ«ß¿ÿëÏÿöŸÿþßÙÇÿâ/ÿ³}ú¿Úÿ‘çã­CíÞ˜bÓ`Ê áYâðßfì" ëÀ¶™ ¦®ùÖYæ >vï24íÈí`ƒ›„Ÿów^V!(R#Úx8,ž¾xÞûþܵ2ïÇ/ y[¯¿Gü˲É*•3+×l’1(ÓʽçX¤9=¥)„t‹é'$€—1ÿ¹f3:tý]³Ãⳟ;Š æì‹ &7ïö`>àSò˜Ü™lð‚YNC¸èRÑU‰mÎWâú  Îu0©SêDцÁ$àysZK¾¢�Æ“ˆo{ñûOÝrœëJ´î -Û=†€× ä2³qÀó&ÚèQêÕI°$:Â8&¸ýR/·jØÁ½5a ñ¥*KPóŽâ˜´ÝÅ:ˆ!D6¼¢¥êÀ*z…-Œ;Q™Sئ'ÝbN÷Ú7Œ/¼uöei$úfý‡óNz…­âßü˜ò­8ÎÙÕ}D‘žÐZõeÆÖ¶ Øj²+&2–¼—ªWÍ-ËÂ_sý ûÃ…t,ú.!5’°ž¦ÿßÚä™3Ç0'°CŒHǶ‹pÌ]wú‡1’šÆ!/T¦‚ÝÔŸ+¦xˆFæf ü˜sU{^œ~ç;ÛÊà½)�ßsÇ”g¿8Îõ'*µiw€ïµCLúKÔíß"ܵc£š†Øôºï/·_[—Ìê­öm÷¹ÑRæàÇ®ø\1uYÀ1ƒ€ ?†“»´3ñ'ƒE½ðûñ¢ÌRá,¸2¨Ó)èÍÍ3éÚp‚t!yºRÃ%L‚SYŠµº 8ª°@½Tü] ;P_ÚÛºösŽ¹ ›ÓÎ@\U¢d»³üc/q¨’€i…íz?Gºxõt×Hs‚‹ê'ŽJktñõ mh,d„ÓIËg:ø„;ÍÊ/|ry.:<+¥˜yØÊ:‰ÃÙ�ñ·8´îY®À$±Œƒ$®&ÏáËRÁ2>àÍ žYL  nF”o<Ù]F9£ªÿ·Ö‡š¼ÑpuâÖBÒž´ +ˆ-ƒÎQ?З¾­tY \èܶ꓾¸ÛVü黽z€u�•üHI\4b:óx\PžÜ'ˆ}ÝýÀV¹'B}é9öô ÿ8I0´ÀVêèe‹ûºjžÞ\« :ˆÞ€Ò‰}bù_ˆ¥„:¶Ë¡^9´) î‹ÌX7¯;—Ãí´fÐñyÏš:ä¤Ðì«KÙÜö‘ÑŒí +Ÿh¶"µW62õY¬‚p‰KXc +Tõ:µsÂÑ©ÀãÊçðCt>æGë$¢V‡ÄEÉéÅáºñDwÂضZõ"d Á\ ÕðÎÙejSßÒ.·8„úŒæX~lä*ézæ“RXÊïÄzHü—ÚDì„ê*?ÉB‚_]o¿0®+r’~¹%e¾ºÝó[zt« ÌÁkx¾½Ò_í§‹kNÊ.‡U LîqçÛ|X@,ñ˜oüênÃTWÃR7Û„ŽR:%@7;ƒîÄ!”öäžË“hFö$‡pyŸôEG©ßl_†–L ¨í“Z§‡ë€*²P3÷;‹Dë^ðD€È/]â¿D'ÍÅÓy‹- POº'­€˜Ç¢?È^ ºÛdÁúhuVíؼ&£vÃWyÉß¼×ÙwÞÞIÏ2 ŽÆæ<¶\¬ +ÈQsSæÉ+í”èæµ÷@ò*BUçÃÂëk²‘1¥›týsøÿ7Økõ!þ߆¾fË ð*å9n’ÝH³´YÞ€þ™Àb/\ßÁØì¿ìQîóo=ÍXNîµþÝ2Ig³Z#6Ï}0âÁêôŽ¸‚sQª¥3öäW#dGqd‚Wyféã¾TÁ™Y‚—ûGô‰:+#Ûù¥Å‰õøãѱÜÙ~3£ÁB1ïšs5·PF"ç}{t]Y†½4×eíØfÔK +¢‰¹ù=—ÅZ_@Î1b­‹‚ó‰óõG'ZcÏ—ºL££¨Óª<¼îôU:ö½ÕØ|à³qõ’š–¬Š—$à¢Ø¼É ÕvN$«RìI8Š’íj„i[QIxg¼3«˜hYÂk$à o£ÓÕðî$óqg†Í¨26‘ÿ‡ÓÚ#‡È'4¶Cê>†Xus8wáÎ%Kcþ½ `Yà ÝÈv¨×Ž>ÓYHbĦLØ7¾ñ“Ö³{êÎÊ€k +ø9½Âz¹ÛDm4;r²­|Ší ¬ ˆRVh5×¥Wëâ>u‹1Zïü5ˆì§!ÄèLóG½ÙQåÉh‚Pêè" ',v=é‹eÃFD |cÂBï;ç¯Ë!zRþl2Ø à†“8|g¬ø¤ µ5§T›tÀÄq÷0èy¦Ué"Š‚¶¦ÆÓT¯çqűn æ¡/µw®ú :§=±`Ú tY£ºÔ˪èV”Žµ%ÌßĨÊkK%È«�HšLš˜¬ê>¶½Ð˜ÜÅb}lJ¤ Oƶº›:Õñ¾eм칫‹~E«s3™Åó`—Z”M£÷*6µ<¸áõ¤®«…¡neÒ‰áñòqŽþö—/w2£·&É¢¹Xzs~`ûAÜ°…šK–Xz83¡¶Ÿfñu‘À„:°ƒ6£¢'µ(2:Ëh]Øf~ŒÌ'ž'è¸Ü‰Á×Þà¯+Ù éÜñ¾Ôíÿm ÿ°hšÐ¸!@Õºbª1“MóhjÁ‘³„²ºÁóãØ•!ÉtÚ’–qbþ@2•Í:Aÿþ½Puñ ±šcíVÁe u¢çt}Åßs»ÊùcÓ+‡Œ:mÜc³'²\·�Þ$4>ö—7úndô™x™ÕMÕˆ=ˆ(»3Žß´îŠH£>ÿéØ:”Ñ‹ÀXQ¿&ÊVì1c½’/Î¥7»E_ì—?×™ñßZzYËrÀWÔ²üò:±Ô³îùÜ¥¥Em.¼+áR¼EøÐSŒn‚yuÊŸ©Ü�§³9õdó¯¨MmèëQÁ1.tt™¥þAgÛ;㓦J ÙÄÆ^)¶÷0~æjàè¢+ª‰Å¥gîØ…™]E…&ö.EßÖ×¥s ®R}òì0\àÈs©ö _k("íËuv £•hÑnŸ£µªÿ›³ZQêˆÅÈÚ^Ééô8 i mì]†âÇçÂu+:Úà‰s9-k¶‰¥ÝPöP;“LìÉfËhåu¥y—1w +</ n ¬Ž†¤êëÙaƒåð‘ˆÎ&.ðV¿ŒáÀºø;+uaàz!ïЬAˆcwm6ϯq°¢Â_×bl[Ø—–çÚÛæÀ>öÆ¡eÙ$N¯,Uq¹2m¬Ð¸dæÏ  fK¸£ŒŸ�IÆ·M|}ƒ†ˆ§MAeèÒ;Ütjô!õe‡º±¢«¤µóeI©/è9bÕùÒ]@§o¡6D¶Ž™õr„Dœ¨âh2ík°ûL™°*t%jñÙά>‰M«WB@p^´W’éX”´Fé}&ÑÓìhÂ溰ÿ =´=8a§š\í“zØê.Ó÷£@âBÓ%‡½ÎüÒ}~–¤bÖÞûfË΢®öµË[ÃF1ÅÑf‹ÞD¶Fl¯n³¥o¥¶{#ªðŒ—Ujg)[-ª]ÌCþá–WÌ2œ‹Û¢E¾ûGx™øº´ë`%çêQt¹ +z8±±˜Úö�íUÍ•®Lsm€çØX�W±zThšùmÙû 4K —o™¸FuF~Pmꌘ`Œõhžê°q&©Ëeh0Ö¾¾ß~…—g{©1!¨–çìÆß³£ìjûdUš[v7ß{Óž*lëÊ4÷Ìxÿlmè”XQß»”îÄZt<etsèb¬|ok³–ÆCm-r¬½©!ò\àñ0ò¥% +K²ìzZš<…ié<z­Lµ¯ÜvÛ¸t™Hõ +"èh’^8<sá až¯U± FQÊÏ—8T´ErU'[¬]ZKؘ©,LÕ9ÚY¶´ØOº’è… +â$H—³÷>´3žGèkEFÛ­ì}H}jÒKcð¦E¸ólL1 e,”æ†î@<»‹™:Ð@F75óCM0r‘#ÁÁk‚Ã(rÙ f̈¨ãµ‹GŸˆi�0×KSTs(à}^»ÞT†¸ý‰Qº) ‰¾ŒV§ ò^™#ÌôO¨lçI$‡´¡L¡âþdÉèS0ÅõI&¢éˆ}NS4rç5¶„‚|Q·[çÐb6L`ÊÀð0ZMB_—¿OMÞÏASQfî¦gÚþ‚›œ±ºû­+(k�ñgB¢so–Zæ6 ÛÍ°±‹V—ý±æ–Èu·í/ÂP¶Û°_¦UÝvö6@î4yª‰*h,�X »‡º°/¾i;_b°à¡p'âR—ëËÚ¬¬Þí×L86ø!„å•£–õú€Úkã]%úas{˜GërPÕêÄû+Èà•®flóËzk‘Þ PÏÉl¬eI«u RÄ% ݵ™®„mG§Áë9þŽú@æt°—+†±µd:¤xúÁwpF~E@ 2&Œ!¼t¯p•_ZŸ—à<ª8+àà +RýüÞJî·~Èaƃa×-Pó1è)ˆÐ¯q|JWè.mÕ¬¿ÕjúXí˜G8³ía\jèÌ6† :4 Ù.×·è,Pve×Ã:‹ !ÓÚ°t#€˜mëĶ /ËdínMX wI¨¿¹üñ– ½±F[lÛ.Ÿ7lê£) ÂÓÆÎY‰®x#zxÚ´k p/·gŠtK} Ždpà“g/»mצ¨ ŽÍã€~fm‚ºÎ™úýbÏy˜¼ë9çðªdt^ñ5Tp¶u1§ùâú¸¡*O u:#Z›…”æAg횊=m×ðqyá2;Y焸EêUnõccP[iûé7Kz‚£o€H4{ÍG@ç1¨•ø3è_J4q÷*ñ{ü¤âjõuÑ漩ÉöÚæÂ0…*¾iL% lvåÄaHWñ"ji”)oÀß)(7wz�=o·“eú24`½o%ÇÇÑÄÙ_mj,¡pl V¿sš§ê`?/Žæ&åòÖ[œCÏ7ª¨0¹´yäƒf8²ÔXº#B‡ÛÁd3<ˆ­Ü }Äõ¶¤âŠŽ.}°Ó{aåäIÊnÚ XÎ;%£¬•ˆ¹Y¹©¸ t”Ƽ æ€.—رÓ}àOºL„‚tIrè¡-Piê/šÉ¶&ŒÃT ïà;ieî€K¸nECƒT^ΰ&¬[.l7ý‡fA0וÕ'¤…¶\òÅ[ò®˜ï°É!Óh.Zw¢Ûí-ic'díx¶íD†§ÎdWW�+U¯®÷.—‰Ê<£îú“<ôýå¤a%|CS’Â-bg‚$Ð,;»Ç¸p î¶_«%akßg½Êþ®ƒÈ¦Ó~7ýœ<Þõo®#«SG2[<;ø&†´*®½ Êdð1å²5]¡ÆM§wpNº¹_à·¾ WÐÙ Ó¦Ð0ûÿДíö‰Á¶ž$Š:vÙu+¹ßˆ®a"è¸Î3…r/ÿRŸ Dv=ó[</ÐËŠ?ˆ»à èl –·Îû¶›‹[p»In¨?šµÉ2^ +¡)ÿ âÅ(§I¿ÝPÅ}ÚhKa°SÞ)®±-»ž/¢;…Ø)᣽Çÿ/y“¢Çš£+Bæç—ðúŠïå|·c#¬Û¯‡øü—°¥±×@˜°p|ìž:ÿ8V}SZ�[×Z­Ø¤:æáòˆÊMË < FŽ£¢þ­´JW† ±´QNûΞ_�‘@ÙÚfXb.Ù�i1gœÏÇ MFìÄ2¼¡²7Bvíš‘«@a3hR’poÚTkz×Åqˆ­Mü +;®‡sÁ>Î+bïFWtG¿Ðé]¸§tKó.5µ>®­Pp?ñ”Ûs…(Æ›ÔYàKiÞE½i.r¿4O²¡€Mú¹´½4-8;þÊz3*&A¾;‘ˆ„òy‚HÐcÔÂూáD@fM¤ó~®Ù«Å|+<5äЂƒ{ ²I½«jÌ}ÚÝR6T±5§þâJ³QôÐpÕ4ܺŽËóœw¿î¤ÉÝÝÁ˜Ý¥=ÂÀÍhêºêžrv²®Jô?víZ—Ó5ÒŽ}·w6C¾þònî Ô‹èäl*„8+æaeÀEVia/c+^]R´<€R˜ò…=dðs@ÖXe·ÊK¨wÅ0Ò y²È®pt¸ÀÁX!Á +ý®Ö¾hûðØê•äéó¶_âÀ¦è+3ÇÚ‰û¸/f5ñ)õ +ª»Â2¶çh%Û‚aÝ™`v²‹3ÞÀ=k€ÚÇJs2_§8l¶qT¢ž úK82%áÍ”(ͽû(ˆÇ¥ðRL"0›¼.àЀùÏ㺡TLk=Â&´ÙQL8ÃeHI>Lmçí˜tDº“ž‹Sv“¸ÀóÜ°CŸÓÝg%ýIúD«Bˆ;&­]ЮپÛVÂZgÉ%i3EŽöjÙÑxÃÎsÎœ=pI\‰J=ÃQ+ã|—9O¥¸YÙj)•ßºF'^—´Žy™Ü¸ +;ƒå–9ÈîKˆ§Óɇâ:59„{dž6g¿±À¬¬¯!«?ÕË#à„Úb߶Ç _"¤)㜕ǦÃÕÚå·pi­Â£³/W ¬÷*Ø‚&¶T-ñ¤Òcˆ/GX]—øIµØÛ$w(Ñ>¹^–ì$–#Üâ PÌ¥9bÉR ¿¿ùd [éÑùˆÔu  ˆ«K²>5SI·kŸÇ¤üd Ú0ŒähR‰¦Û ‘g¸SèïêFX&5)]ÔÀi›†0gm¢+ˆCÜ—x©1à:²ûgul.¯ Ä*0ÛÉæ°æÕ²°‡{‰Ëô=hT|ÂËñ?{‘JQÖ%Kû"¢¬¦0‹¨•úX— &$ê·¢ÐÆéÔÇLø±¡]™’©6¹CéR“‹èAüyY™tïðé蹕ù=QŽDb&íSWÝ)èlkÄU´`>±us÷vü‡ó• ¼èe„“ùq„~„öY P¥è]ØæNa¢¥x=í,üÌ‘µñ6müØ~ûøPNÉ¢˜6¶Ý¶CóÐxi»“b´ÍÉeŽ¸Üôs4«-¯¥'müÎr/;íÊv®ë´» Ðv{%é`Óßh¹*³é îë’Søpü�gæáp%­hdò‘yöýq]3J® äõ›[ +à³ó$3Åó\CzŸfÈÂÇž! y´¸í&—=¸ ÎÌã§Æk˜hð³Yüt&Ë,ÒZóå¹`J°Ñ×6⑘ ”BÚÓ>´¡œ.ècÙˆ(…?B£Jð´@Œ;b“·¼²ò‚’)XµêÆš?6 <c.¦Âïˆf:)JÁª;ùm…g%½ðÉLØ÷íäq®Bã*UYß‚®5¥v§‚~Eã:”Ì*PÓG¡[fE‡’˜èä®àÀ ‹"CÚy‡™k'ê‡y½Çn;¥j+¼áè/ÚÊ#C¯¨žð"X’€mß6<¦n€ÝÍðX"JT[ÛÆÈ ö÷18ÐêydáÿkQaœ[øïÌ.Bt;j ÜtÔ2xf@䶢üiK# Ô7ðFØG ¿·†þÿNtοÃ$M±­loæd$Ð)ï¼…ÃÚÆlY2aøÍ8òÊ´1kéÞ¤É!QûàpúpÐò4ëø¸åÄÅÑÂâgIŒïiœ7ÇKLÊÉΑÚi^Š#ÒåÚFéD +ø‡Rÿ?µÌc*•®CëV÷/.õØžÄe1Š è`4""¾Ç¥¢@•BV×<eˆ¢q'—ßSÃIÏÊÖÚœ5Þ¦6 À߉³†€e¢Çýõðˆ{qÂ#šä㲞—üöýH¸3æ[ô#VB‰l;uèùx@üT#²¯B ·ì,ª‡pÅì×ÕCn;±APÌGÎG{„êbnì¤%;Zt–ò3®Ñwã@M´‡¥aþÿ¤í\ªªhø—e» ,ȃÞý.Ŷ7½Åw¤*Ÿï( c˜k­¹N´'º!²Iƒðo½g]³©;[W`¸å÷MB7é@Ȧmp¨áKO ub߉K=кgÛ°%œ¨$P µ5¥A_\\F_‰éâ:Š~¨b´¿9",—raJx.—¿W8Ȳ�Š‚€ )‚³ÃíÅ_BØR æ.›Û#°«½ô1݇vš6íµø*MÂ+DóÌâ–CEY(Ùá[û5&>ã€^`À +ÄÊCÓÙÊ؉„Õs(Ÿk¶¾õGŒ’V‹ó²Ä‡'­¨Óê8àñ9“Þ|…  ZÇöQx,Pô—Çȉâç»™{#]ÎjäÑdåWxvU%`ÊiÃeçx:’]"Á3å¹BSi ™s¶Ó oö¨ +…[ý¶XFQ Ø~‘K'VÕPmµ„‡ZXÑ,—úg0�s’˜ù é <S–“z‡åsLÑåÝUÉVs'´ú—‰·ûò&[ú'-Ïѹô÷-Æ ñÛÐ,Rh/‡…™ó¢ðë®/°V‘ñjέ;zŸðHœª7S˜<j®ØEÚÐ<â)(Ð!ødkˬ‰™"í¿]Kôf’=çCŽü`ƒKB‹‰Ÿ'm€RUõ ƒÕ>33™¿mì.ð hjdÌÎð¢õVntÅ}I§2ó*nç’ß{-Αyþ6®kªd±l‚]È°´é~¹¯:eˆ)K(;w궣êóª|漋u”gÓÜêÊyðW±u%™Qa1´¨¯­[#‘_M&ËÆs432¡Î4#“¢e™¦°ÖÅÿH™”lr€{Öˆ*ç½íë +b©,FÃ؇Ñ&]‘ž¾«µS.aš;Ÿ¨\µ<©È¶uçîèû'Æ.U3:ão¨ ¿å[}àÿýrÔF$g˜Ú˜m7Lï¡A¨Ö®�Citž$ ¯” ”nå@ûÆ•Ž¿ûB’¤!¯ÐYjbd„zHËÇr—Ì$b‡œU%wúpèdj}þf|Ã+ìL +cÓ5É Î +¶rÙCMS÷Š8üpyY/yg3”ƒÅäpKRC¬ßíëlçê— =ÖINû9N}DÚÅÊÛxI2'¬Ötò™üôÖ¿-Ã×¥Xx„QâJQ Ëd\Gä´Y€#ëžÏmAÜø\&èÝ´ÆŠ6â@D™>ŽSxTYT(’u/Ô¡ƒ®©KÎÑóù¨öq1••hY +)Çt¶úúR2<ƒÃ–/‘Ht›E¬¡u~¢;ÑWóGŠ³hoBQy…w–¨"¦Ñ›µ.ÊMr«ÙjÏý ºnÔD‹ºý=¢æ·ìp/Úðjx©¤9ÝæÓ´…æGŠçͬv„ÏmwÚTÂ{Ѻy´¡-DØå•tÆWT&µq‰hÉ l4OIÜAÕk·”øÙµ~÷Y¼LUá öðÜR·Š2­énê."þ^-éíÕÕ“ãùé!/–’© ¤qõ¯Î‡)t[MÁÊO5°ðÛ©%¯Ãúú0·×Ř-y_«˜ûz­ó©5o— #é~¸;ÞÔ m÷4˜WÁp–œqVJDr1T·1ï­¬z‡íŸF ²µªZwt”KÚƒ#cCƒ[ÃAù¢Ñ¶ö‰ó—8´8WVœWxQ"«^ +Nå5~äüwZ¹Ž&ôô¸zÌ5>–׎49ç¾PS`È.-ã¾q¾®á‹á¦H¬![̹“ªšrÆæŠèŒi¿ž°×8ÎM¸t~$„¾½ºá@¼ áõ}¯QʧhÊèòëHº£–š•7Ž#ø7>ßE¸/Å7ý!ÿ]þê–ë·èlâ4©"|àóz-O£åHäè¡S!ÍöYŽ|&zµb5²ù<»ëC¡r›4KÊ=D¢X~ŒÇ2ÙÕxs¨JÕƒ¹F– q‘ ói ²ÿ‰p(ñÓk§ÆìØN.°UŸT}¬jù¥ —ýÅâºÆLAÑEŒ ÌŠœËYì–W¤c]3wZÓCçÊ¿Z óû<åÐ1›í’˜Òs‹ˆt$èx|«°³v^OCL‚™cŠm±Ž—�/=À5ârªmßËà .$×½Tï­Ç1ü]\`V¾%ÄGDW¡iBœ“D&¤PI[x›¢¹;³­Ö® V}Ì°¶t©¥µx8¢‚ƒô†#|7ös^=vÚÞ§1°@ßfÁTtc;”  FY÷ux•O[Ðy»›X¦.]ÒkòË%/ðHbçJS¤t5øØäHŠJ„UöÔ@å"MeÚ½ãÕqq2ò”!fFåË8GŽqö¿Ø£RÙbq-oúŸMO*Arí;ž©2”Dv1Èù\Í:‹h7Oý8ð kTÉåh\Ñ‹A¥)Ó‘¥½žÞIµc]³Ö—Ò@Z9”÷θ¶D"ºa8Ò%k]I;Î~®ªœã +ÓÛÅÁ1£÷†Ž¥»ûAtØ#LYYë–†yCÇX›A/Ñì.mFQ^¥÷˜`MH•)ìôrßøÍÓ5/Üç�’ª¥ò¦Oú òîÆug³,GJ{®¼~aìâ°Š¾5OQ5ÌŽq\òSÓεá­©®%g«*!-ýªénCù7E™¡•¢kPê¥tõ–ÎÈt°RÆ»òà-Zeª~™íwlÔ)´eóMêç?ÜkG3ò>¬Wqd&s20ä‘?ˆS¯`Ž!_òBY^ë÷>¯ºŒÒ?TižöøW©Æ”óZHæ­AlëЂÕ(ã¾1Ž£ÒDÜý~ÈÕc#ŒŠÇKˆÞ0»¡Ç|éóÆçú-Êœ= ?¡Ú0ö{!1«™¢‘þtåFK3‡¼«ÛÙ:ÒŸgåHÊ{à=ttf åÆe’Š‹ÚYb\4g`6¥×œêZ´£(äÝ5h5=0ʃyßóÚŒÁS/Q1Þ¢vifqð¼S,}d_Øâ äí±¢Ý[ûxŽxù–QÏdfÏdnZ3<£ÕÆëNî«m¢QÚŠÇOD¯M)lÔóL ¼$‘ò®˜F‚…û%¥ªCÚ5Þ±â"gb~€Sñ¢†Ç¡ç-ˆ3;fêÅQ™)ÄC—ž tŸ­/${8-„¨|å]PqSE*×.PKqk¥òs Ñt²lÀ´dö³-tcˆrxY)s]š1xú$gÕô—ø»AS¸Ds‘è|å:AÓBQzÚ îÿ`qÔ§"CU ±õDâíö5OTßæqÙU©&Ör½†jÀ•Üú¸¿ñíçIbº-}è©õk‘y¾GSj¥JÌí׋R›ý�ƵQ¯5Ѩ'5OHôP­ètåy×Jï{UfÒuwËwÊ‚žQ@â©ÖI-&T•ž"œ;“Ô“”-ªó¬OûT^¶‡¥#TxêyJ ®l´—¢Ñn€<s4ÛH0îÈÙ®¢Œ E<ŒCS‹-9¡î³»£$o¬·c‚Ñ`X¹¨}E›Ùsˆl‰Ò£ïŽýÀÕû¯rö9{÷+<QWø>‚íüŸª¤}ux½È³è^VYL`DtNh. î~}F›ÚÑhIã‹›vnËT[èZ×f ÷èçÌjΫrÊU cl³¶Ê#{)Ú¬Õ6^ÇàžŒ^þIœÛ;´<QÍ®°üŠ:¸ûBîà@Ó hÿ´ß“Ñ.YëžhM/*Tøƒ±Â…ã³uå% ç5ÀâMC²8B+f‹÷‰çÐt£ÑÝÜ!Y£çð쯬æ'‹­š&ñ§Ð Í_®}Þ€¥p–-°2}Ò¡ò‹ `”ØïOÉfÀ ;;Û-Úº°ýâî +þChZc Êþ8c©óÎœ‘ÒþB Ø[ü\Q“DsWFW-„'ȯMÛŽ7í¸£íùŠüµÑÙ5@›$®ªÖ†j<•”žð¹_š(ýô8Ò¹,n årŽ¨X»aXó)ëÔx·>ž&ù¶~ð/râ4•ÇˆûµÐò"Bº¬±³Ó¾µð1T†ã%Y<V´]\ІLjº‹ôÍWaؽÖäAåÀ…ôDßDƒFäÁ‹¼Œ¸cj³,šÕF ÷m½~‡.©<É2u&ÆØèÈ¢ÅìÛÚáOqGž¯¤Àk’}¬¤—gØûÏ],kÏæ^ÑN:,kÅ£ ü-ºo¤ÿÞ5EÁ;#à®Á~àãÿ?ý›‹!:àe‡y1DGøK¤ÈÎÈ +öŽ\|¸?ôaÛÍC[ ú:fÙŒê$wÀ~GTe½4³ïqT­h7«™…jR<˜*Ú‡f%rRžz¨J×c°{Èm�{l=ª.­_Ð8�=ÐÕˆ÷±÷|ù˜ÄP˜¿kô¡O£.6ú/ôè§A¼š¯#‹çéRS”a¨DËéU³òsâiËŒœÔGÚ#$Öºk?VcÓ ·ÚãbM­Rgvy{­ìêGô +çš;Spn¬|gÊ ¬üš².Ž¢™bMìã-!ÊÐÇ»ÙÔµZèu ¿/«×£…·;ŽÕ£G[eœ¿XA&×KíþhxE³ #Ke^0HªP8ncØybùâ +öHÔètƒº”U½ÇX‰-§|þ·úxW9Gésº¸4`PÖtéÒ±Âò³ßJê´8yŒ}в +9o£u¶²Í¦±y{„ëXEtÄVJÔû§H2bU5gÞv¿1ˆ"B¹fj‰ž)„ø}_—ÑÇ®jåB`Zeê8TŸËdâjŠUÛ±T¾î¼{¶ÌŠá­a¶ï?‰òñ$t�ù4<~¼{W²#² 8j[Uõ4‹QJRí½çÈŠüƒ7£|̉lRàž"H6'&I mXaQWsßóoÑYæe]J/•êÑ*ïzû·±ía—hñeÝö"�Ý +<’Ì'0džœaz‰üKõ9ñ“ðr`-X$õûÃ/† µ²£¨Áñ¤ƒÑßÊ¢LIu|#z<q©•µŒž{AÓׇ_܃©—§m^Rjtýª-Dž„äYÝù0]œ‰DÔóÞ¯Mˆ×mDŠ’uýSçý9w�ªG\¬¾ÖÞØìièSPr¸“ šºAyÕwd³ì.$ÞþþûŸmÎÕhuW^ðkt‹%£\]¼tjŒr“îJ‹l²ÝýBE–ê²L¡‰û¶´CÙÇ?Í€Äò”h9jË^boǯN¤£"½ý}Ìþ¤7ÎøÑ7(²?–¬ÿ÷Á’˜ÎAá 3Ô‘,…™'ú‚þýJÞ¾ÖÏ…Íò•ËÚ}ƒ)s >oª\ÓÊ·ËNÎÃW aT-|H¼11WûHBõóü*‡*­ò ¯ ¶¢òî$f4.´¦:š7‰Àç½ÕíÞÛ‘C†uÒ;#ïÀðË…DÄ +üËåÐœçèNt¬Íø“FG)…@ÏCrž)s/]W-U¤ïÆŸ¯s¦‚¦¯D«ê ëfÀ|ÆÁ͇ßÿŒ ‚žfêÐÉãe5×ÉŽã€ÇûK¸¼)¡íˆëpØØ”‘¼â;æ…�AûzÛÈDß4vÝkלié@G4b¢ñvG‚îô02ÏÊv¶µ%×Û–‚8Ëâ—‘‹êôu4ÒÑȉŽ0F·œX�y.âï×cêØ)�0Æ£‹-zC;Ññy6‘c(†vhèæļ’01í8uì®Nw)èîµx!R(\æ´ÅŸ+B±õ§¸šm”v'ÖÒ`jì…÷qìhæ:˜Ñª€°G#±ÏÚ…yžæ…ÃÑ }*7pµ´å ¢›v ¢€¦¥ïè GNDîvµî•ƒ™ÕÍÁ9“-W"‘ºë&8TsšW(•À¶,ÐN@L¨édú¼gFQòëljŽñ¶–ÌÔææŠ@®W ÄNk™ï8Ýîöt¾ÓŠÈ CT`ÜÈs® xX‹À¬.¿ÂŽû9†0J“׳QÕqÃAt9 V¨91™‡/ù2˜²ó’äƒàÅf˜'±Wqb_Dš“ƒ§]d‚‡Z Èž:[&4­÷º:‰iäÀ 5O9 ød/v¶%ác«ä˜¤­ØÞ V1„Ë·Þ¤ÇMØìƒ=¹+õXµ\.[ !9’wpñ4 ˆn»7FFrX@~p˜‰Dm2¡”Ñ)ÔöÃ|1 Zö.f‘ÃVû Tlûí2ÎÄ?\NôD ÿÒëOÉÁ¶°V<,…ÌéŠ×ÆÉÍÌ1 àŽÛU#웃N¿p0koD­ƒÑ×Þ }ܸÃ:ð}Ö“‹ƒJU——edy ŽðiØ€~|˜k}v¼ùÍlb#¼äÙéÃ\œX,؉±p/¿u1,œžÍJp]d^ØÎ  lOI™ ö™ëå0pqìé;æÛ"L¶Q9 “ÑKL8ù#fP ™1ì›n¯Y’n ºŒ!Ð+‹PË=lÞV|ÀÞn =ºÛï?þµ>‚§®ÿXÜßD¥ö?ó·^tÜWÑÒ^RÞŠc¶ŠsÂÜÏLÍ4^v§W6nxâóýçO"cW5ðóÃÌ*ß=¯1 Xú# žMoÖýúñ@E¥j ÷ÑÆ=°HE•’Šöïø—ȈžÖjD ¬ŒzaK†Õ1ßî A—ÛGÛÍjLŸN¡E5&ÄÌ>Å–<\‰®¸<®Ã×_ñmUtzÁÿÈÕñÕm åˆS´¿v×ä &ê"x‚!ñ2J)¶>Ê +kÿõóë0o\þìašVnÝfö©‰qvÇn7ºW;ÇåsŸ•Ó½Ã÷>ÿ#Ý¿ì ªFZ¸Fïß—3HœÁŸ½õƒ/0ߺŸwÃŒwÿûþ}WÇ'>úšÆ{`RGÑaÜ¥Vø~»åûN¿ŒôÎç¯&’ Ë-ÿi¯m€H^ÖØ¥–Wº,'´rþv 47×›f³PœŽ•Nôèü•u¶‡©IP˜Ž#8XÔI5Ê`ËV}S¸ ‹mÉéàYÂ_š›è—áZ›ú:^•£û*ürv€±÷-�}oOÅû÷:×|þÜóîÒøFr¡ã°Ì¢ ô#ðþ1ŠœØ9ƶ#Nw}jIJÒz;A=<1m·D}âð-º˜l]Ú>G—´îûìþÔC€±Ï2®zýècæ|™Ó·è¥hDhÊäÄÃq^'d¨éz3¿ÄaÓ/ëç^ˆocûÓg?Ãé÷zzfø-/ýúq×mùsñ:‚Nÿ^CbÚûǨxß=K³³(ã+òN~Þí¬Šf. ¶92ˆ^ôþþå¡Þ5 ¯Ñ.ô‘õ>†?w–ÐÃê‘/Æwhò‰Ê(¿8ÃWûªñÐ/üuç€ ÁÏi”ÛÕ‰|ß¾—–22ÇågD_c^‡ó}§{ƒøï;ŸOtñù³O£lórÚØuF™òy÷xñF®Á…j͸D}ePP%öôcÿè³S¼qX…ëÉ“ì~DŸmÕWOWèäN-”†:±åF×``Jœt‹~Írq%’H/ œŽ'Ѫª;ÝuzuÒÏ›==È€Û9‰%~–ê¼Hëˆ0­‰AdPPFåto ã´5f¹8›A,]>ZÏÀ‡i[¬™Ö £ Í'ÑåÇ‹û\7+ƒ† žf !/ 'b¸îvbS~ÚÃmã<;Ò.8qÆÇ‚SX.lpeüCîXlª˜„uÇ“osK…1‚•áx-†7 _*óT±ÞãnÈÚd±BE¸t'#èN–8ãDO‘|<M57ž ·ú{S•·÷cêŸëDPaø›øJœ%ï÷ãó_ÍÊ8 —rÕû¤,É'À²Æ¿?VØljQÞdNÊ@•*9TÊ¡ýí$ÐÓþj*þ›ÇýPæ•Ó®üÁB/nôËFËïé +¯±€ãv*ìÔ"žÆ©>á¯&_öî:{Gê—I}øþÏ~kGßÂ`DU:£I$C2¢åˆ#KÁ~Í$SÖ×ù1›ø;½{Gÿ¸·ƒ£}¨¹V“L 1emV§u ½%‡3ðòÜ×qåݯÞ'‘Çâƒ3øàX« ŠÕ4²†Ø 4ó%$¦òìØ•-}e(p5ý±àÇÁ³ê- ÈÀÐxðæ)ÌëDÙ×Çø¾ºç¥kë2Æ8}©õ¹%Ç÷‡ÏÿtlÿðËáó�s>.¸‡¥cHfN# þÄùO_L¯Ù¦î4Õ®Ïé#†3.cwtÞ÷h§)Â÷¢'zàsÏòKŽ§†"2öuò·¡ýÙ“¦jÍz ÚcòÚ™{|þT„ü^ /¶i¯Åx’½Žú$ÎÈ…>­±Nqçý+Oyâ]VHô¼7#nr&1:jô‰ìq§{õ;ˆë±Øfˆž´O^/DÞZÏΘùW$Tïæ. º@�±g}éŪÁÁ[ãûÏy2ˆ³ºÌðäÏ<þò:ZÉÁ<÷.R^ìà·³VÒ¦5õÑ{@:Ñ[gÇ2«f8é9¢–]‘Šáºˆ-y³^Ïz±ó ½ -¡Àç[CkH|ñºÍµ6½T?´Qv‰á ÿEoÈ�å¾³[˜kŠ8¸üeW˜½›$»•vgkEn+ió—õÃk¹ÊÜ8‚A<쵌î^×Åô’Öˆæï“bÍ<g +‹Y})¼~fijÃr„œèkN÷6ZN/–Ï¢7úÚ¿@+~Iq º•Õxž€WЬÁ³vîù(þ¥š“Ø6$øËÇû<t„ÏR@øîõ\{ŸÜqáÀ£mM’7Îú�ëãTá·1¬SàYQéEÑ>££´Ú‰ç“_ADÞØf7¿¬µ„ôÁÎ1JwWÚ”ÑÈý$&lËI,’M>£Í~Pƒ]DâÖ¬(È6¢_¸FhkÖq· pÑRÆ°ä£ÊV³¡”:�B–ž3;¯û"mµ×Íl&€ù÷úTÙÃáMê_®ŸM`‡ñ›LE+`ãi4¼¼^.“= ÿ¨ÚµÅÏ×<¯çcm ²3 ‹è‹±ˆL%Ëy¥Øñ¾”£QUÎÁnó¢0óøîoq˜ÐØNq˜¹†Ö%³½‰Hë-è>##F—ˆë‚›œð©[=觉ÜÂ60™>ëÚû¨÷«`mÿ +>îD#|lßHÁ>¹ó®¾Á:5%Øo=N(="6]«ëŠã¬\®Šî@F´äbϔӔh^Q ìeìªxE›:ýð{8`¼ †5v1×Ë36á:[o õú¶Y‚Qáëè@,œÅ0ñ[@ìÈg[ìÆ⩼“è¯=9˜ã³(�Uò¥é‡ÚÃb}¼J y~k<ät p;Û±^4|Y{¡o) Ê®ëpqDy H–A¼<wú’c¥Ä”­ÃzáЉ(R•þle µ\§(;é¦GVzÑè-këBõ…Ö¡+_³ N—IJäÚ¬—êýc#øÓÎs±ÝO¡p^éhsáÄÑ=Ó „á“ô®Í¸«V: 1¼×÷ñ¢i ÓÛ%ò\©‘V®Ã«—PYÍ:>x­ýçÄ9!Ejä¿X³{¤ÊRþÖjVF¼ý:Ñ‹CA\eH.,8ã0µ’{~Uo­¾·‰­$Ë}ÿŠž[jk9â?^Ž½.è‹ 5b—ÂÎ'Ãt·Å 9&Ç—\èc)¢àÝ¿CÞvyT^Xí7}ZnË’Z±ÔËm³ôKío¨$¼Oö¯çaR„"ŽÍReBŽ¨¢A˜¢U*󃞌Èx×V–Woœè¿.qWQF[s•Ô~Q{"OµW}ŒF’H^-îåQkî_—ŒÖÐÃc ¥Cœè•á£Ü¤ÿ Z‰Ôs^‰uÔˆòÖ”ÜÁÚÖÅvÎb²Õ­íAt<Ç¡ÌX: ¯HioëVôñD½û;‘Yʯ–‘û.E—µ}ÛŽdØ#]–: + wª5ˆ9 ¤¨ªòõäðo#±‘Y££*©5S],;Ó5Æ/YøúëeA¯¿u9…[Õ|Ïw¼÷¡ƒÇýò¢ù× °ÒÈ6ï)Ú}!nszg~ ©û-ÁzxwÊv¼/G,ïãõ>X5˜©Þ_oÔ›š5å1Óçí¥qKlyĽBº\rÝÅ9# íu2”"®²âoc`àHh˜š›LøX¹ÅqQ.: Ë—upgÁ·èŽAàô¡‰„ð¾RCÄš;ÝÞ '83Ã_g48'Äæ¼—glÓþ8Kl]‰ÊÚ0z$î¿:,CÿÁu5pìLÒ‹À—%M +NšÃ0waáÒj÷î¾ñ6Ø—ž}NŒÍtùXøk<JÑà.‹L ¥,‹·Ìƒ_º—üñ·7á¯ûìKk©Þ+åç]�ùûNîÂ&|ãò‰N6vââQJÝŽWÁ@}ò]�)Ãy´x±îº¼ +¯|ÿz!È}F(|cJz<^d:߉Ä×ÉSh¼—Ó\Åz¼Ÿä¤{v WëåãƒþÛ탸ÏâŸ"ç%i=®ët{f†òã÷ÿ[ú1®º+õó.@Õ¤óE4o÷°}iÍ›oÏƬ//Äþ¸ìçóm Mµ—ú”ùó@ÏQ!&âeMöyzq€Ù™F°ïºV׃~¹*ocøÓOää|gc–ƒî´—1JmÊlýýöeKõŠvQo¶4x!ŠçëQÔËqÐAþúŸ?MáŸàÚ¾©9qm¥X]À¬Þè^þ}çó‰.>ÅkÞÊèeüçýús°ïj\¾«ejïÆÙëÇ•Ñ»í*¾áOß«Öw¥Êß&oøô:Æ+1 øúE|™„ÙËâ½á¯)ÌtI9͸æûFû¤Þrßbuw>zÙ‡µáÓ/»ɯð*å²xߢgDÍÞè7>ÿz\:ŠÌªc\.Ý+¡ÄÅ0vb÷‹εŒk³? +Óm']LŸÛþìk3ÿöÞl¹®ãH}w„þ/ŽPG\À5­' ²úú6=„åöqlj +E´1ð€ %ùëoåXµÖÚ›Ø@iÜv·I& +µª²²²rN Æ„4B +¿8–³œ(%P²=V_¨ÃOz Œ M "–cí`âÍ\H¹[;Èœ±Z£÷3…-ûÑøÄH†œ%»)’xµ¶Ì”I¬àxÚÊÚï ²é ü5°:çüFÃquƒ»®rá6´…%±y1#b§à®ã±kï^š NHlCЀ`‘·¨'­5ž¨¢•<ÄD£F{å`b¢+Ð×2¦’kÒH*è¨ aª*C8‡)Œç<¤*UŠÀš2SC#Èvè)‡ +ƒ½Ü[€Æ¹Œ·ÏQ]É©¹kq~Özi…¢/gB�úu¶ ³ñÎÈTNÍÐNÉ”|Ç`E@÷϶Œÿ%Å#~ ±h^ +ûrOÂ:àVße´‰B‹•hÚÓ«"ðP5p¼}Zê žƒ>¦P¿Ã²‘ZíÑý«Ï¾ÇnMyeµâ¸€aU+5#)ØR´ÐÀ‡adÖض‘ÁeÄS¡¥Ï&»HÔfiz ¹m¤ÎÐ9LÖ ››NŠÁíòd ;О´X�]áÕrÌ¡2ë‚kMP6…3óXß )¡ïÌš˜§xœŒ­v¾ßrÔÕ"š]Øä ELl÷0˜üƒðN=92æ[ó;lVáj¨„âžrÛ½¤K-nÛcKàÞµ“WÿRàÖÐÃß"í…(%ÍD„ÌYïm¯¹³ôð3,>÷ß¿˜ yÖç¦*+pøz¦ædVMdý϶Ìóè2¸ÊÚòåK•©cö³•ÎÆIÁÚ4Ïc?^¡ìBý$/ç¯Ãç7Tqý~M|›r:†?›óƒ~ó/n¸¥¥×¿Y¬ùCÙÒ™ÿ¹xYôº ›8+—ã]úè¯ÕüÈä½)TXh"àçØŸÇ XÎüØk‡�Å(|{X{WD†eNLÙK §iàéžúyL&‘ÖÉ2$&o¹¶¯|òÃ5^]Ä’Ž÷ã=‡b…|^œÇä1‘ó˜ +$ý}œù’D„WÈÍ…¨LÜ€÷É´qЃkû�7)§ê‡µÏóf¬k¿ Žóür3,xëÀ†.ž«ñ ’Bk»0 ß¹ïrž_RE:Åò$Há’XÐ:•úçðé4¿Ü)88'=æRÀ\ŒröFŒÃÑm½ÎêÐcuÙD-î™jA‚:Õs×?/h +žäÅÄË;Q4JNí Dß«™SpÆø*J îC¯PÚ€d½•I6ÎüèÑ¡¦ a ±àRà+•¤MÑ©$ Ôw¦¨˜Ä5· ˆ]:èKÔðtu@X…å„Ð`46h|)ÚD[× æ¸p×DÇÕ…cô^Je`) ê(! +ÐÃx”£GÝj\-Äã"îÛ~±|éáÊÚ€˜\ÅkðÐÝ0A3¯¤ÁøN«øÏÐøئ&0ä¤íölïÅâI’bŸí œ¥ð-,E¯3»r¨1t:ñ‚Œ?Vã)àì½=)Ê/EÍ£ìr Tóm +hƒPGκè`ù½u¼,,Lª3°¿4Aÿ˜4³§LMΈÉ)ˆ…àÕÞ3¬ +þ{7ÃBån ›ðø¨'5«å /JÃÂXƒ»ýùü³ß¤Ç-þ]Vü;ˆ&ªÔ·5´£áF¹:íLKàg30¾-ÚTgÙïÓ\m.üÝ&‡^¶ŽÛawÉK`§·ÔW‹¢fi=T©¡£Á¶w<ÒJ46±pÍõ÷¥¯V¡/U0ŸP&ûŽÎêׄvj¦êÖ‚ß°‡w2nh@RrJ;óƒ¶p+m:a½okƒ{još³ÔX•MZêªgìˆ#IO$xMÜK:K;l³VHÚ±‹W&(±,Æú"ý¤lÔ%̶ðèHrTR„»I»¨Ñ¬+—†ØPúÙJ#-ÊŸA I†±á}’PßE—N¥QhÚœ�­L;] ô´QZ:!d#‡5|`´B.ßf¸X܇h +¥xä9,aÉ +·•zBë*}°~Ý»PÌM¥ù<¨+‘á€Sn£V„ŽføqŒÑ†Ô\/Š}R/ü¹“YÆlE±W|P ¾€™÷M%®‘-¶c ž„Ø£Ûõ«‚j1õç€Rë tÒ¦“êf 0P#QlY¬í­¡qA1Ò:ØS_C¨âe¥Ùq{ðé²5AÄX&iã5Ýl–ÖÜlJúYi䪯d±Ê°G*ÏäL°[5„¨1sû,0°7ã?£OrT‘îu¨¡ÖFP 9˺ÐOË÷=Þ„ÚÖN0zi®›Š¼^AÑTyNœ·Òº>±¿ÁÁ\.]P-&)"9�« t.Hß-mið¾nU +Ÿ35r§$Ìp¢Ç«HSTÄ|>t…Å’•´/c¤&n"¦G¦V@¤‹iî*ô®€rôÌÄ«%ŒB¸¿ç^™ð¿i,„x'y¨é)�¹cs¿}‚Ÿ´W&öcfŒ‚€¥ÝiÀ~`�ÄDWn%ŠX ­Øt­KFÏ$hË"ÝkÈx.Ôš‰g0²ã¦ç>ƒcŽ-™mæ-—ˆ gÜ…F¯k�ù=ó\ðŽmV©ùÞ¬€sEÊ$|8.$‡pnQpê2•1SºÍRñ”wî2VÏ'€¢Èoܤ¢xÊÒMÛé Òãx†*kpQFLdËЀ™àÚ$–šÒ–½Ì€¥t6ááÑù}"µ›N½·†ƒÒ»Ü»Ê[ãk¹ÇSHFî½q¸Ù3t? Âï-¶ÐVºZƒ[G­DÑÔgÙrÕFSfàÇ>—é‘·ÐNfÀJ8�äâô”f$—+æ»Å0[ÏÀƒ´ŽÚ`ͪ?㉭YH®·U>Gm¥,Q&¿ì«3¸^ªÎE®¶éÀª Ê~s,D5 }S­WúìxÁ¾ö5d¥cnmÅ N °·;o-ÉàL’ WU2—z§‘^Ú6SeZš3Wá-©Ö;L¾Ç¯¡K@ïtl©Ã¨ Ô|€éQÛŸZð¨Ê ÒÑÎÆáÖQÞ£—[çª +’0Ø ™ÙcýÜà¶5DŘ4õÄ­Õ<#ÈwƒQ‚äþx:ÞÎ2 $-Õ*hiB8¼Ù®ÒÕH…¬5ÑJªéW2ÑûÛA@4Ió |4‰øRéNe,J@û²¼T Œç«�ß‘LÝ:y í_IÖ5´ !‹�Lå6ˆÖ:ª; +´¨ÌÌÀ( +Eþš®‰\Ýg`Ù fL…ÊÑð²¨ë"�£<~šà†ð¨ø¥~S È1$šsf[I cy=é ö"H—åºnÃ(ï@îê OºgÈ-J»àîãÎPŒ}<­—ÁX8’ž»¡Bt°t€—Nš;¤…åç, éOM[tpfí¦}Õ‡vŠŒ.†¥IªhIxPåŽAÄ™Üj´!'}Ç +6,wãƶcAð[ÐF °öÎÕ‡±ì’VZA8>dÇ2K<kVsR&3Ä;–°áÔ6žï‚ÞM932ûo¼¤ÉÔ»ÔaæX¤‹¹ ÍB±ÈÜÑtLf1J¤*W cŠû}Skµ†C(û‘X=_ÁR­¢÷“fÜ“ +á”°Ù€z]ࢶ1vèVŽ\™f€²S¤Þ@U#îÓ¥â`Ïz{ÆÚClûÄpcš +<W4iÀBebHɶ¹€~̯5[O “%Ðç¥ã,¶—¥ ‰FúlĤj'd»&Ïý¨©„9~uÒɲós«R×óú<“ðBªœ%É-;}P*וÃéÒ,FÞ?ø +,5_¦6œ°¢ÌͶ©&vÚ–ÔNG$,*E¿TŠN¼Ý =FP"¹yÁS}Êtaˆ²¨‰šQ’MÂUòŸÐ * BGo²˜ïv äñ„üNé‚íEoƬÅêûåÇš\,KÂÕ Y¢COºK•T zÄ 6›4"§ÚZø&",1¯³¤¼ÖƧÏÛô²¼€®_>ól¬¡þZ…RŸê[â<÷B­–zsÃãÇ]„!_+ð¬ ÙÒ…òLE½È”äY +3žå¦¬Îð¬P˜Sz_W©1MÒ‰Î@õqÇ%déé(,hËBµ¼[]ŒÒµQ²?‹·¼cãUKÙ‹uˆ5°CÒ"tm™EA­¤«z¢Ý¸PÅ0âû&À[ÙS +±aè±IÆgXWW»øá„å¤KÐw6çXf1ìD:2d\# jÉpÔÄ3 îF@f·šü„@f·`¶ª*ŒAõy(xÃ5#ƒ³ ÜvWT?�&åp|:C¨‚#Ö³:´uwÜ�Þ@ ¢t—GÁþTfØ0xË´ÛÖ°qÁ·¶æáxmêJHm1”aéC´ âˆ/æ±XE—©T'A€$îW½®†kÏÐy!Qñfš™»LcÎT”<õ¼7]‡"‰Uí£haçµ™Ä3dÕ*5ë& ¸3j¯¥‹pÎ+—èBä5$ª•·¥’żäû !ŠšÆÎ5ØE¶¢q£Q™÷k-ËÄ”:&S•7°Èi‚V(öŒ uÜþ.ƒ½ÁGäˆnT†D¶b½äª6ž6jz2)ý¦ùj¯<B3¨HW ÑÈá&»Ì;ƒšïaù2K¾Ý¿ŠÏ‹ÉÃÕÕ»B‹zóÀÁÂÒÔôäEµDÈ•óV–›Ú&š6Š—ª«wM¨FÞ4 ð`"Pþ<ÛÅ;ýøÇïÏà†ÏÝõïç«$L]Š„jÉ'‰Ýí%sA:yÖqhc3îvļ¨.¿s9ÿåͳo[È|ÍíÜìÁó*ö1~‹AãÚ±“¯[N¼ Þ§x1_c¤5иC°­ÛºÜá6xŸâÅDœGÁ†¿Åí6QOA(‰îè•*Å@ià5êžÇdšSÓѼFÇ8i>Ï‹@ë1˜ì(^—”8g…-á´“ =»ÅÒDQÊÄÛIªY¡K-5D j:§2ƒ°…¨»ƒÏ‘^¨À4Ò•àU"-̨çi çµµùRaE,E!Å'·”DßJ$*À®ŠÕˆ=Ex5 U}Ô‹WkCIÄ æÅóž|Ó n¹Ú$% ü¶dž¤cíÏìRŽŒ>.ú±‹Û59*uÍ{À%$0UWÞʦ‡¨]¡+‚&ðY\Ëòƾ‘@Â�Á¶Oj²Ws[ª$JÓΪ“h«\iÜ¡„¢½þHÖýÕ„8«‚ªLb•Òd$ÛZÊÔsŒ8E|ßR&÷ Ñ?6ºÆB*¥cË #ob¹O ÉýN@ö2Ãj%„gê5ªµ€†ë‰ -×øÇSÇç4Fu/0ؼ† àºXxËhÝÁicá­5 +ðŽq®µ]ÃX˜î¹èà,l‘kEa„xjXuƒî Q+D +Ô.»ŒfôäF –%C|„À#±Æd~‰±Ž3Xc |©ñ^n1Ix‘=†´ZðÂë üéù—Ïù(·˜Ö°$êÓ%³Å›P‹<b•,²ˆdÊßmóp +:ýÈ{Î|¶¬Êä@R ŒÌjiHi<g¥Ìi¦´$”–„M!¥™È&d±LitpÙ—Ž)ÍÖ>ƒME)ZªË”Fbqû‚ðIòŽë˜µ'4iÃ5ÐíDBc¤›”ÎbN(†æpÆ ƒ 99x9†@Ú q¤,õ؇Ë=(B{ñ c,…h96…Èݲ㾄Œ¿{¥âO9 ÅaPý_Un ¨Ñ~�nœƒÿ8Æüø¸m EÛ–h8CŸ— Å!иfØ@¸^øNA¿vº’ª‘V¼;ê¤áT«E[\>X$Ñ\@ +ÿh":?Tì0P‘ ÷ *êzÆÚ¯8ÔAu®CŠb ‰?Ö]e›[dÀzàºɈ2b¾K.öT … è;•dgèUV]™5<[»™L·ˆóß2[«,ÔC̶_lÄãß1‹Dès4cQƒ€i­^šÎNÛʉ‡hË«´aï¨{}¶¿Zzè '7‚ïÉ1ØàAB>c•‡¢Ý+`7`íeNq0;‘¡x:‡yðM£ê¸ÃÏ!™ºéžC÷îÆ‚þ0Ñ3<blÐÆ!é5`¡'ÍGyNp±F²à)u±1WˆJ"óˆ¡Da—Äj”U$ðY•êä’„#¤@­VÚ´…Ò©V“YAŽ …¼{{²x#¢Ç®2ëXòÈrc$:<dã&"Ü\„ œ ç A9ìé†òâ0 @p4"Ê"„úÄ@Ts8¶P „ÔÄ„rKЧ/™EƒÊtÓzx}l|Á1ÐØg.¯Œ c¶ ƒó»ˆAHžsAx†,¶?Ç°ö¿ÀàP)ØĈš ©¹5cµ|þ¼ïÕ8ŽšFƒZÙ†!Ÿ4Þ�H¿>b! +uR…*¿RÀµBÂsƒny  Àµ8>ø,@ôÒ6î†02˜ÙÈ + TÉ`›!ñ›¢%€{”ê6²Ó¶†ï·éøæàw¸º=øüË?Xspz}ùêúÍÕóƒ×/O^\^??›åL ƒoXo™ƒƒ‰-ðhlVmÐ4Y|œÛý)û<lN@>DÅ7Ù³»¢0œ°]¯DÇAÒ;õA¥CbdÑ4õ�Ažm¾Q$‚"µø5špÄp’#Ÿ ßUU•äö°¯©Ç½„D‚è!ÚžØ+å ä|! F#~Þ…N!(‚¥ÛÖÌT“MŽôL!£$Á>õPyÀªQÁgêgˆLÒBÿBw°bnNíh =„× wSÑÿ, ?Œm®}J¸¨¤×ádÖÕ#[9ˆL�øñµNÂ|$7°Q2εÏѯ{ꊎØù+ÇÇÆÊyŒTÐåÅHJ p’ŒOA;¼îüûpE‰ bH,9ÇëGpõQ*´a#ÛqC_¬AÄa€Ó:C•ÈRĵ© ûþò�N·Ì…Èð` ‰Î0¦_Šw&Úà òKÌQqÈ.\@µ =<:ýu–±IÊJ­ødWjÚ@Lb†…¥WNÅW‡­×kºH>ò*×Â.QŠ®ea›c论œ±n8¾¢ƒ@_ËéÖȪxŽ@ð{|÷ññ`g_ÿPÈ\„EŒH 6$NÒÂiMÄ8Ã{IIÜ^hpâ(3˜Á °k 3,ôäÌT +Mcròq*m\5²„œ-5 ªu ÄI:C"ÿ.JžÇ²*-œ€HI(&`{§‚vXÂH–xhåJ¬ÀêÚÈVAb>˜ãÀvÉ™Õô¹D¢[Dô³YDYÕUNÐÁF¢í…n±}Ø&b>ÝBäBÿð +S,W€¢J‰jà“ }^! %l_qÏM¯%ú)(î ¢ÊÁö¢þ,,àÒà\â…„fÑðÑxFãÜCD‰ +\¸]°Cÿòxš’Še€`+y9ÖžöWµu+=® ˜c¡oY} 72zð‡Y‰ðFÃ[kÆÃä—2¤èÅX! 5uµW”Z=¢<U)4y—@9«FÆn¡øF@9Eå#Ê%ôvq§[·ŽîÑ”X³!ÙÎ|ùj«:›É4²Q©…¾2¤ƒA¿zI¼À ÕK§{6€ø—ŸmžS[Z#ª·¦é±ðƒ3µY°x©±8etì³]²½X¶²¡º&nè¶I‰½L$â+[¢‘«Î¹ØáΉ#åL…#Q¾"²ÂW%ž¯Pi5²OI6ö7(oØžtiŒ<tÁ _K-jm­T¤e3T/žE‚…ÜZ°\Èx†C w/ÄLífa`– +¯U>‹n%§ÿÅ.�î\x›tËzx›²Â»Ò§Zl€hÛÅ2Í—ò Gzp†.@2Äc‹ õä¾|>Ä@.u†'=¬@—ýbËWuA S¢ØvëÁ~¬' S±âBlb‚ x_ôdš\•£0T¾˜Q>˜ñêú¾À¾HûS!”ü¸Ø²He jÃ×.Pˆ¥Œ^²~oÁ4*ÛãR”(%bð5c +„Lä¶m4 +Oj÷¶($îVÐá¤'n²~!VîF…lÐÆ÷®‡{Ý}í +—ˆ$Š?ÅšØɃ^…ãSøÁt€> ˜ígr:á²Éúú骡7ÁUƒ}ÛêüÃqy øœƒ µJT»ƒœ­0zF}àˆ%T4•x‰Bà�©‡×–/$6¬Zj‡§B9pðÆž£Ü_Ì/W8³ñ^'ÁO䤙p‰gÃhæù†îuËý*Ú2Qò H*ÏKdOGÚï)°ôoÉ>‡ÎLT K”®ÚYó3n=ŒEMÙJ IYRãeäÓÅtÆPɉÌ-BW®Ke�´Îö„+Že¼×ßq< É<4›:Ï‹TöGiSx^™mʲaˆåë¼ =ÛÚÑY7ì +<_q± r²ƒ5zº›ÚK@Oày|(*3 d¸Åá²û³Ÿ ¿b¹9ˆÀ¢ê˜€Ÿ KíbÈg$J˜Ù\>‘å?[0ØG“ÖÁçPØͼ¸`øÜåü òfF‘m ~{÷ЋÉJæÓlþضumÜÇ‹i‘9|$Ù +§œU@íp`® dò0f.¿.ó<Û2?¯bŽ= caÌÁîpˆá3QãŠv¶Áežg[柦À[Íc~ˆØ:€I�’p ýŠ3`#xãÚ8«¸>‡ï#hˆ.OÓN3B‡ ;púõ–Ú'í{šo_}ºý'Pê¥t!S÷ ðÉná}á ÂÈšÍ5†ü SÔXn°;Yè÷=Ó*p¶†¬ÓŽ[[àát{±ÐÙE©¨ÛºÏ“ªZ_€“åuø°—>í°ë¾†)Š §Rˆe68ˆ?N«ÀÙ:|X°N;nm‡ ("B¾œ/NC�úÒ:yÀ yðNÞäJÞÃ畼§˜ìC;ʇ9;pº€VÛgÕ]ͶºéA|üÇÑÍÇÑŽáv{"ó]1EÞ�9ý—„Šq⯽ÐÎßjÛbþ셵騭ü»M÷í#bÈ´ +3 •„¡ð  ¶¼„>&é FAÞAnt*°¡p d€€¤gÓy¶ÁÇy®ø$¿^ šã÷ó{sÚÞY´`rFpàÉŸ4JÊû£’ÈM²x| =Šs“ ÏÅ7é(SÖGˆ’ï²F;C…ºD^¦˜§ÙMŽÄü}¨Õˆ1.ROCbz;úð²Ñ¼B¨³—PYm3;çÄ1å* +e®''p’#‹rŽŠ%°«l1ž=ÂÇî*ë*Û—«ç8‰D%¶È ßâÀG‡Î&›¥ ¸GØÇ ¹K•âÍÀ—iP„i!/‚C  ¤2 +•ñ'f(Ã]‚*Œ¨Bž3Õy l8A¸$‰B@HE]IóR4€VSí¼—„G_4@ÆGI&gŸ#›~[Žµ¨MC9Âî#†/S^ð\ƒÑ.^«qeX±q~é{€Çábë`3.À›#4)qBàrVC.x(t&p¾Ö!¹S)/"°Í†¨—… øq(¢’€«Š 8jàhû@å`¼èÄ�q&A&cG{%·1(ŽÓàá[”³8çÂÈ7鋆¿F(!A>‘Òã7]î6ÁWÀ¾Æ/p~A¿Û $[X•.D3ã2ªè@C×û¯«$CDP%7 +ü5Ò9D R¤ðŸ!Ž‚]­z‡Áî‘xcQAƒá7"݃%BMZ ÐÝÌD“¼5"' ,bßÊ`Ž`Ä𺛀ç˜HÚÉUüÍÖ|ŠC¬~Þ.ÌÎ5jÁ3 ñs\¼K–<ZèJ —ÎKL-¤'­hçÀúŸÙ…œ3¹í!~Ë£…ÂA(Œd:ðÐ#HÇSH[»™8e¡óI r!jX-„O•Â.M TÌs`xaL¨'-ŤCk +Ã×ÊT“(¹’ +"N§Ã B¶)ä>½•ëœ¬ò@Îm„À²êØÉ9Ó`à|9 +œÓb©–‘Š5›éX?ÿjò-Ù|uqvõ¼I/ÿðµŒùÏ­cþöó«e@¤äÈÜÂ[Ѿn¬·@8SÜ‹\6§æ' ­q΢nOÕÌ)…ŠŽÑÖøb¾4Ž¢çà!fæ“Q„ +y=$'a-zÛ^F Ìž‚P<D)¢ñÙs¿¦c¡EŽj‡w–jáó^0gÐ÷ì+(˜K1Ðø(™Î.È VjŠ:8[6òøYga²`ˆy±˜šêÙI@~jü`w€x’O?9ºgÀœ*;àõ·”9@' oЩÜ'áNYSá’1ÛKôÒ°½i#ru,°†ðÄ*&”ç¥Ø™ÆϽñŒ”Fn]sÅ£_Æ›#Ù­¨\¸B6P~@)h¼³sš> +o/*©¬PjLÀèwáLb +‘'£ùQù&$"S®pbl;“Œ““^zì–ű³=;‡DÎòÁixŒA)�s°ÊjáËÈ[ëÐ#Æ\£8J‚ÛQ*ß4ëô:d<¨§‘¨Ä†v¡]r™ ðwC·Ø€ þŸÂ“0ÇüK¹u…²w€›Gý4WJƒK)»×Ð ¼Ìçä0ì¿’Ø'!ó“’*K´\+ €˜WB—YCÛ�¯œ†‘D™² ™½?âœtˆÐ¥ìH¸Á=¹è”ân}¢,"™�È1‰ž¨Ð—3‰„f<*¼ØƒÀŸu0…ŒÁ­KSDyè‹<c^¾†ú²Æ¦e¾ø™^ž £â·¼¥Ê Uî"Šu‚j-30”¯Há„®*ߧ‹¡Xàë×_„Êb ]0®Y…�a•¤Cïèo*¡ÊÎŒSAåg9­xš 'uÀ¡m«œ(Zî-'ù,QÕkEZœn‘£6OEÖ—@†åh*PIˆM@ì~5†¹2H5Æù~q ÝQ,µb5Ê‹<®X B`ξ·©]“NûÌ»ÚťʔF1úXì%ËÂb´tý `—\ÜÆ+̇ôƒ¡tÊ⚣Œh'O_lC +EÛý(äÌ1]˜Ç8Ãv}ÎMˆ€Ë2k-úì5Ü$ëD'…d…y`\|¯m¼ O¾õ²çHÖ¨8“U7Sd&ÆMøõW*snÌ`…Jó@æ­TrÇyŠ®ç­ÅÌʵçAÄ‚ÇZYYQÒ´o57J…Nt4¬ØŽ˜> ¹wòEƒZ†•Mj:€`=ßaÔIõºTX,¼$0P°¼³YM3j8ÝB%ïÊ¿~ÁòËÇ,ÇêâÀð9Öí4zB)zùx•»ÇÙ(a4¤¢6‡'MîBѦróp´A]ÈCg8Ä †yçó{. +O% §r@Ü>”ë~+†9auÝŽ-0ƒ£KkƒÅ¤…y°¥’o<8P>)^W©o�•ä(º€@‘<4}Zó0s’¨Ïš”ëRÕ\e·§ºŽRE5æ6"NELQÈÔ(éçí–Ã}$¢ìÕÚEå +Àä!R¹£¥ø[õYôhæb~.Ú=@E a=à” 'ôÀˆÅ¦ä +V‡ƒUËq–S„JJ +çH]H©b&‡*ViHº” „…5 ‰ùí’ž^˵kÞŠ¡®ñsOðÂaùðP¡ÃuõÞŠE­RR»©Z#É«mÒZˆQå-Ò®¡>Ç‚HF5kIS×™9îÒÃ6 ÃC츮1ëÁ„Œ¶?Ç)jY/Èòp—~€F@Ó€ö¤<&v$àÓ¤Ú‚  —T†¤®öÙY/s Ê?¶©&‡Ë«e1Ð}%³%2X• ¢¤³b ¸+6WF‹ +endstream endobj 219 0 obj<</Length 65536>>stream +!T`U KÊLÑäíÅÄoëçêq?`Ä+]Îaöªhµý" I/óv,•.§±N/2ˆãTW�¶)Òtâ +‘”Øn»#-²�4 Ž“Jç¨×çÓ;?Å2ç¢>ÆÀä9Ïo¸'Á깞�“TvŒlÌÊ×Á\P%tƒÉG2! Q2kœ —œ&›¬t×D«*뵘„e%+È’ žWÈuy+“pmt`}â‰Rcä!à‚ÝÂù +VóÏÁ”à±h#šÜŠZ«ä3:È&çÔ Åšþe.%—ɪPçìÞJÖ‹œ»:9#<穲A8P?Xz¨Åö4Ÿø¹”ѪëIf¸«©X¡zæo„*$‘“R«<•´ðA86Åt’ÉCÿ³:¦HQ“ze5ÆSE‰w}ÑŠž×o‹PÊͳ/ÐtC-p¾h83SLL™êqá’ñ^¿•}§dX3–\ß%’ÿllÕ³}4Te0b†[©>âYŠl²8jPAÁ1‰=UÅlÌBCžãôŽ·ú²wu… +Ê\9sÊCx4[L’ÔÕz-aà ’ Y¨}>ûÈ6ç5¤² ­å]Ž‡YlýqþfuÇ"Bïâ‡.²êËÐ#híx ÝE¶á¢§¾;NÁ„CõA=Y 4•Ü#æá’$ïœó“@Uóˆ•�Ï,j@ãZ*~¨*ë¤âd"V.,PÄþ˜Ëpª••T"xC£‘Âoœ3eN8_’“8kÄP‚µ¦=± €]ÇN’· ¬ÆX1 ²ê‚é$Z5,«d.Œ½Ž7$¦ÊÙ–&© Pˆb¢¥ö5ê�çFäÛQ%ã žßÞù1rv,Ü7 +Éñ!½(Ýž>%"xW`$PSfÖž +ž,pTÖ#=*É·h78m¹÷Žçf}@DÖ.ò]ƒÝ—ËqºJŹQ Ùˆª¾'ꎓÀÀÄg5ƒ>ÇF©@QÙ1i5õ%ˆœé>«\Ž0 *81’(ÏV¥:G7Ô•Ý”•ù»{+ï;²áO9;³§O ;¯Wtm¹�pk(ëu©>72 ‚¨Ë Ô0椰1¸p¡‚�-g«¶‰§±]BßMЪ•Ž‹ùÚ8™ ³½"‡•’ëè>æºýF¼™¶‡-Á TyÃBDxj”y +\!ƱcŠnT‡u¾’ +ëP_-L�”ÓA3`õ¯RɈ¡ýœïIöRÛ?I먜¸F’s±^¨“Ë›…²õTë^46Ý@y*O¯ǘ¤õX¼«H`l$ïN¯Ì¶<Â÷÷ðT)`g¼''Hë6T­ÙÄâ?T×IYÚr4\Iý5Ê@Sª Xg¡*r’¥Þ(ЃÔØw&ÛŒÀ<ç¤VV÷Tƒ™å(ƒB)´‡dÓaó.—ÄS—­ ’¡Ë­½Ÿdø)bfG®ô‰¡æ ?DBØ"ì®Ò6›“z ¸c0¬…_Î@ÛvHú“—fo[Àš(5™óYï?Ô´‰`,†h*r”´ ã³"âÒPëVõó¬M ~!Ú<ñlGÒ8ª¥2'p˜ŸB& *fÒtÿåw%­­ìõŒ±“u\©ãŠ%ØVDC¹ž�1~ñ… ðÉ<‹ÄB,—c`  VÔµä +Ä£eÃ6/E‡b8|¬›åá!ôa Ï^Ð%óhí…àL]À£‘â_R*Q£wc±Î»Ð‹_\¡#¿Õ•bÿ‚*nØl뾘g zï¢ÌD …Ò“tˆJ0‘InJ|¹×PŸÀ¥îü@“¯Ý…+¼ŠT–zBŠPí…îã”ä¤ ÄZL±DÓ‡àf‹ÜÍûq³˜µÏ”·P“k‡ï‚ÈÌi †9H~ûÙ–YïÇÔR”ÊÓÕ pK­ ô0‚Ѷ²žÅÉh “³®S+ª,¿{%a;Â:Í…õÒ¸›ÃëGxŸ|>Å=ïZG¼\æ^Ñ‚[)L.96;§J f,#YÜ\ou淔ʹ€÷ùßͦ²¨‰£à´;÷A›1`ýÂødž_æþ-2ƒë +&»ñ +:?¿SÈ´:ÍrNº€“2_ãMÜJ×I +;'h=’ô˜ +ç2\ãùp¼Ü´[湓TmV§ž’¤Ÿõw¸ƒø Ñ%ôpàwKÉÆÇp*PšA7w:ϸŠhÛ3ö13y8ÑÌ%‰0P˳ªŸ<;Å"HÇöGâ©Ÿmùä³Vv(>b‡§<Ùý+n,0íæ4×Í~…ò yxH¯«,™ûa+ˆÊ½• X‚;³w£_ª~Ôë/ß@[•.‡5¿ˆÁueIpa9·H2 4:)Ú:yð¯Kwö$‘Xí·9X˜Ž…Îñ7‘;²@pŠ`oâÂÞË kÝC¹¢´È¿T8•(ƒªQI[.%#ÕdðÙ<ÏôŽšÁ¡»;].á˜ÙB̨R¤ ¼Ç‘’�H¥x,œ+“éMfÞ:m/ãcÁ¶'8—2%iP5È^¹Œ+¡'hœI†¾é>zƒ–Ù掇}sŽ$|=úóM%)äWô£ÜÍJÆ?Û2Ï’oõrC% ˆdZ¨€Nkäz8X[_ûï ¦°Ü^éH³! $hªà” ÞøñŽg‹‡ÞHLÌ È¡a’*¬�›LÅ|ÆÃtR2s‹HZ•ÆÞ½*´ÒtV£ŸãŽ.ü9ËÅvè!áœA¨´c´„D +’f“r>ÎKT9Ò§«bï$t +'ÿ±HÄ|õÆÁ‘ê–â`)Æ #¼2ûŠñ IR¬ o›ˆS–p”Š£´jÚפÄëv,o0F[OW¹>P´ã&¤€›ð’÷-YÙ†5@õUB"´z0^ú]ÉHO)@Ç¢‰ +~N@î…åØ(Š#{EŽ£h¼c±t¸ôHÉ^Ëmzá¶Y“õ¡¤iÖ¦ÕAròÇ «¢ôä(á¤'a{iì3çùŒ±Ï f6B9¨:7ðñ¸±a;ÔØ­±ÎfÐz™Ð¡(ûl&Í„¾`|”P§9ks;ªØˆ~²”–ÃD¢1M‡æ³F:6  M-—- +õQo e‹ð T±¤-Ÿ¤K›`·Á0¡Ø@tÛ [¬Õ8Å,Hoâ‰gèí+= ´¥l¥™¨v䪒q¹ŠÖ|ÿP¬:Gi²ÎÎ.‘¤q©™tO¯Nú±ñŽ±!¯t`”§aò)Œ Ö ¨÷V"©€Ð”1îØ'7“*à÷äß·’g +M×8{Xm”‹�|$JÉÁá6‡ÊÒéK‚# ÝdòÒ{Ñ)¸,Z vÁÖ-È×¼v?�Rbø +\Þ§ÓT‘íiòÃç,Qï!õH´R™Oò(É0n–¬”èå" +œ×JIëÙðî#õ”Oõ¨¿« Šñó̃î%v€£ /êXÏab++VøKllLS2††ŠÜ×°“ +”î"ЛÃG!%{'í8>�#ÙYÌôY£Å÷§ÔYQ•œâé ØK7ñ ‰{ƒ‚·“Pæûõ**öxªU£¬ˆ\xbåÚ˜ì"^kì@…_ÊÀÃ’ðÚx½ó8( +Ëý£�¶JÏRv½Šä¥ì”s„Ro¯'­C'b°tbI"ÿé£ÂÒ:ˆÜ. +ôÒk`ù¢?2RW7ÒbªRI¼ÃÜôžabÓ`qéL-!×â3Æ¢0ôÀË–'@8ÔQEæÌàã Ey¡(%¤`éÃê—KP)E&¦YEkÉÚ]&©cKˆ_%%.¶•²*)بPjåã­› +Ç…*8t¹2@ᾧ½ë¥7PìÀªâ5Á¥®Ñb7PÀ›¢ &>Tû–)™à˜q k`ò•N§‡"÷û¶Ý;ÝØØá!ÖXUòجju…"sËØ9ÐCà™Î kózn¼täáiù8“ÛE03ýÂOh6—¹[x¯áX£ôŸtÉçnHæ +Yg‚‰RšUØp8’C²¡2:dz> “¼œ|«Ð£¡wWàN?‡=c™áÅòá´* ð`oÝŶøA£·@¶tkÃXG:>Ì1 Tꤌ¸uÕΖª$§à£ªWÞJƒ‚+‹D“†‰i“u7.aóà ³n[H:ADk)Û&°\!Ÿ«L°°XÂrðÆi·®*ôUB¥ˆp!‡é¡×€gr^àée7¾&R4›R‘aßkòÃYó.ÌfŠ¸˜çæãé•iØê€nr[ªÎlÇû&DYûméÀ4®m¸œ¹ÏÐ/aé—0ŒÂ,ŒTö*3‡ñzË´ý¶,¹Æñ3ªÖǵ&ö^:ÙJsÄ&P$iÓ¶>+ÜÚm­ÞÒ€AeZÍeY{˜±¯C.ÚàÅPþ„Úí›L[û4ªb18¢T7:w*‹\ ­a‚Cw1¹#†V8NúhÇîìËÚ +„ºçª' Si°ïèèÅÜúU°ê<V»+B¦-}Ú¹h#làIÝ“ÃXìp>‰NY”‘?œ5CÑsË=ü…Ž¶ØÄ&«^n!ôãI^sëWýØÃhÀ%ôÃËYP©›‚W<šÚÓ+˜º‡MÁ‹¹õ«+S¤ŠyÖôuSt™`åÕàö2½Ñ“2ý\NÂàªç:‚!>“ÚØdʿؼ]£ñÃIAþù¥Þ&³zä }ÕL•cê_]Ì-§m­èéa£6ðÀÞGÁéIU™êP2+*ÁÍÅGŸ$?F™»!úCÊŽÕ&:}ÅUÉ]‡MAéZ h +zLn3Ø6]ƒ´¤+±JÀi¼•ÖÈJÀ&©+qzYõ+ÕòYOFû*Ô ±9::èæ'l#:½xa¸J±Óú¸Àõ²Ü°C´Ávp_ hnYÚôÛ»8b!Ʀ±H[ìvŸõÆHß>< +ý¬)r¦àª­œj_;4÷ÅÒ­tÌA:9mø¨é´£ †ÈTTJïèòš6sZreµžDôr+iÊéTŠoTö-ÔVV”U…`C†ëÇÃ,$±‡I™/"jsîe@†‚ªº•#ØåuxVf?¾[1ͳp­%=~§ÃQìÓ=I†8ð(¿ô4MÿªtÕżË-8ï,=ˆô걂ÔJ÷»âÆg°ßC¨L¦IG/ä11=»á5Z|².¸ôl AĈ€ç§zdOPN®³'½½ +L¢è‚8ü"¢âÀB‹h…vBÍ• +¼ Í O°>ƒƒØäÅÕS%a„W0©+|¾S¹,›ºùAO>nUU.K÷®±£!qù?¦¯Æ,)*�mþ©tºãúW{8 y9I@�¥¿O³øj>ªb8SOôKù0×,Gëµ~Š/ÓP#R‚‡ÂçYà> ¨/SSÖiªÔ~„KÙ׉ «_J½eà áK¥Ú%|l‘g’¼u“»j +õf§«]õ£Ö +: íu"›P¼œH£=¨Ç}±‘Šãú +!›ý)èÍYÊp€óñc9¾s`Ôîï\ûÃı7vüÓŽK*øÑë@IbVv c׊�”j&Ä`c<áaã! ³`lðÔå²*q0qäAÃèÁëÛSm£ ÅÖo:|xg‡mO›ÒÅ8"cÚ¿̲´mh<տ䜜ûdü¨|mƒ[2>*ƒel£÷c(ìÁ™€'k¾x/Ý5ô»?]_ýåæüêöüê‡ÃC†£N;þä³ßüéþÌúá·ÿoÎ/ÚTŸýæwúwÈøÝ?þøìO×ÏÏà@ð&ðÓåÅUûá!ü¨È˜'°ùÇoO.ÞÐÏíÁïþpu;ýé­ÔIüÝ—77'?/¿|ö·77ß¿¹8»:=û…¾ÿEqúòüâùÍ¥Aünš@1Y&Móîå}~{×NúRÝ£.uÖÈææüû7·g¯q`ûIŸvÜÐ÷'¯Ï¾¹9û¿oÚr¾sg湦=ÍV?ßÜÕ›Ë?ŸÞž¼…_¸cgnMÛ×=ßÓëÛóÛÓ—;¿ØaSW×ßâè5ím²þùænÎ^¿¹¸Ýé‚­iO²ìÿçÝãæ»}qv|}ùêúõùíšYÞõ«³›“Ûë;_…ÏϯÖt&}Ùs´o]gßÊ·×onNÏþãæäÕËóÓ5íêüjÓ~¶1¯õÞ\óÝ×å>ôJ2Ì]ßÞÍ ¯¿ÿŸ³ÓÛ¯®ß\=o£¾ºþiM8šld~è;¼Õ¿]Óf6¼ÎÛ½Ö-ü´ÜÂçÏo·½®}Ö¬k#¼êùf^žÿðòîÇwm»‘e/Øâó;·òå¾ûòâÕË“ïìš6 ¿ƒ5þîë³_ìU¹®Ê½¸9i‚øÅŸ®Ï_?AenUdÿxº\XÓ¶öºÜÇ%™îu¹½.·×åöºÜ^—Ûër¶±6íg¯ËÍu¹UI¿.÷'o^¿>?¹úêâÍ/µ‚û¼¯oŸ}ööœ‹™}L +Âtå÷”¢¿ß~:¿¶}?y ïòšvÄÒÚûé~ñâõÙ§÷+^›Éë÷ñð±ÙÚîË&]àùÝráªÙó ráó»Ãuíá§{Üòo_¾¹8¹yÂKÛǯóPÿåúüêöÙ.b߯Èoî&éÃ&“³&š¸—ºsW¶‹ Ï¿îÞ…[ÛaüëC™^¿¹yqrzöíéÉÅÝnUAMW~Oòuãa~³mÜþyüçýõíÏ;PÚ¿)‡§××7ÿþãËíæ_I{ùyÕ½æ'ñ÷?½º¾:»Úűª]-–¿mƒÇ×W¯oOvÙà÷×WÿÞBÏÞÝñ+¸;>If¾ÂÝÜ×u³ZÛÆNœ§ÌNnÎo_^žÝ®ËEø`Npq~û—“ó­ÏÓÇÆ +žœ/w•¼Í-÷òÏmVšÁÁ·¦MÀz{Ø&‚­uvÃüÇ%hÂz{¸ûZ¬k÷yÿxvóÃ/õ0nú4ü{Åïò¼~>‡{¹žÈ‰¬Q˜Øí<áK»Ïò¾o·®Œû™»W¶‰ûÇ÷„umäñ=+ÛÍÃâ{¾:{{vñíË“ç×?î36Yf¸¾yõòúâú‡;ùÕÇ Ì??¿8Y—™üÁŠüªìEO6ºç}™Òºöð|u<?swì´=ZUýYõû Ú{6¶n6¶ªÄ…°±u]üû1¯UÅžy=™`ÑïW%›?$ŠdMû¸ï%_Õalºå;„¹®+Fôç{\î}Jü‡>–ÇI‰_ÕSòx)ñ« +XܧÄßÁ³WE„y@×õøÜó]Õiì`j\>>_Ÿ¿~uqrzvyvuûÇ“W+~v½!ÛÜàûòè7d‡(–•]‘M,»\ôUÕ&QùõNÉ «ÚÆëÍY ?¿<¹º:»øöìâìt[Ø—kÚÔrõóýýô¾ûûëšö·\ý{?9Ç®ðÇ“6îNçñÚžËwíbEªÎ®o窔釼«bt÷•.Wu›\ÈÝʘ9ÿ,þj']Ó†esïÍß~…²“œ\_nw­·¾8¿¸ØÁ˜tvö¯U™‘hÙó×qÂ¥ßÕ}w1’_eo³],¨úæúòã +Í¥Ï÷q{ýqÙÃ`½ó=4±ùô×wGŒ~~q~uv²ªÙ¾ôù¦žßÍ+?Ûžš_ÇÖÿfƒprzúæòÍ;|ó£‰òjUÜm\úb[ÏŸŸßž¿½{S7ghMZÕ¾tí¤âÛ“›¬.~<ùyU´§+Ÿoé{hès·@¶ªÍðšï–³î#j¼Wñ¯U=`SükU¯ÙC4ºu)C÷ÔèVu÷ò<•H”ÓUÝõO<e]‡qßH”²¦Mì#Qžp$ÊSí´·®J?ûX”;¸öª\»xBWöüÜó ]ÕiìcQðLVå†zÚ7d‡X”•]‘{Æ¢¬‹¨î‹²*qy‹²EYïsó)Æ¢œ®Êà÷·s]üúžÒåªNã1cQì>å×gpŸ¸—ætUöœ‡ðºu±‰{òºUƽ4é}‰¹‡4[ìäš'±2§é'|k¬lñ8!# ðdߟ”öv¸²:s÷lÙ³ª=Ü¿„¡]×aìKŠÝðß___|µº˜÷}ýÂ}á¯wSȧÓ}Ç¢S«²÷í^rê^BãNœík¤ÙïV…—=_Ûóµ=_{/¾–Ö´ñµUáeÏ×ÖÅ×În®·š}ölm lmUbÉØÚïd÷ÒÚž«í¹Ú¯Mö{a푹ڪÐòñsµ§^²ª†ExɯvÆ£þnU8Ú_£5^£¼&Yé5ZŽ>ökôDÊ^Ýœ]^o-´²¢²W;ÆÛÚû…36¶ÿ5íÿ¿ho~Ñ~p°¦]!¶(ïEäÿ×­ˆYcm¯ëI½~¥Ö´³‡Õ“²ëªƒ³/(µ‘î JýúÓ,(5;Wg'·_ïÀίžŸ½8¿:_—CrXÿÝì^Ãø•5Œ{UëZYGó}3Ï•̽’BŽ¯/_]¿ÞÎÔÖÀ�vö@l%Á•¹vÍ�“³ùó›mƒ?6°º;sϪ+ö¹O œÜœß¾¼<»]×Á<*7XU¶ëCRCWÊáÆV(àl¨*óÏmþšAƒ[Ó&`½‹=l»k݃ݰ‡mA5+Mn‡õ.öp÷ÕX×îóHîó§œ?½Ö'lŸ7º†¼ÑÝœ¥9ÿéìâ/'?·.ÚP~æ.ÇÏÐÅÂÄU½TÃÒï¸{ÿïÞÿ+›ÙÑÿ‹Ô`g¾Xåï}¾wnî©õÚû|÷>ß½Ïwïó]lgïóÝû|ßópö>ßéVVk½—þ¹¶ƒ¹gIý/Þ¼>{…iÚ6özÙ^/£íü|vqqýã?Üœ]}ÑHýì‹ö�žÿpýÅÛó닳Û/nΞq}srµÕ ú+l|O¡ú÷šö·×Ú¶hmûÖ¯{­m¯µíµ¶§¯µ}}ÞÎ÷êöÙ.E™éì¢}g'•-­Êä;¬{Áéþu~ùf—"šeU;ÒeßMj÷RÏßܼhlýÛzú¬ªTótå÷TÏŸ“µ¦}=õ˜Ì»UóÊ&Ÿ0Ôn7gUîÉÂò:!ÿøú +ªkg‹ÅÏw·“n8W£×´ÃùÞ[�ùöÕÙiÓnö6£½Íh!lƒ…ˆlFl@BÓÑÞf´·}€ímF{›ÑÞf´·ímFOÃf´ƒfwñŽ-¬F¯ÛÛ¾Ö²£5Ù¾ìÓ3~½fUpe){OÜ�&XÿýO¯šÌ·‹…e]”·Xþ¶ înBZÓY.¾Á÷4"5½yMû{°éI¥˜?±BO¥¯tGO4¯üæO´ØÄÅùí_Nη¾Â;Xq¹–û1„5:;?á"«rgÞ³ÈĺÎá~E&Öµ‡ýãø´ÇUÝú¼Žk|ìïû0®VðÿtÇuía_i{ØW`zôwù=Xýªha_}éc¬¾´á¬Æ#»¯¾ôkW_zšåVEøûrÓ­¬ÖR~qçÏ/^¼>[sìÎŽäuû�psö|uGóÄžßÙ[x]Í-a½‹=l“¢Öº‡ŸöÊÍcóš®ãºù̽ž€'r2k÷¿íUÏèGP=¿}yòüúÇUVýÝkh«ÒÐVÕÐ}¯¡mz žÆó¼×ÐVNlk»7÷ÔÐÊšöpO m]{Økh{ m¯¡í5´½†¶“†v÷uhão×´ ÔÝoÔÚ6ñÓr?ž?ß%%3˜Um„W=ßÌ˳]²“?·~]»‘e?ÈŽ±*7âÇoÇøÛ››ïß\œ]m-±¯Môtj½_™žïO^Ÿ}ssöß4êØö­±JÏ‹›ëË»£+V•èKkžïäöz‡}¬ª¬x¾‹O¶jÒ¾hÒåû¢I[6õMú¤* ÝGþ uß›7'§·'º>_WncŸvR(k¹bµõlñó½]½¹üs;Š·;DÏ®«Ǹðù¦^ßžßž¾üÛùÅ»ººþG¯io“õo`ª»¸zNW¥w>Àµsº®@€Mùjw›Öu÷ê&õ¤2V?–Â.»Üu‘Ö'YùdïPx`È×íÉÊ’Ç÷†Ò_„aï¤-ÜÞµ“XW0OTYXUÈ^W¸û‚­iOƒ¶°—QWr&’Q×F`{)u/¥¾_Ø˺îô²®-Ü?äŬk# yYÙnòÒuŽï¶ÕÚÙksŸ¸6÷´}?«ÊO~<unUÛÚ«s—´½WçöêÜ^Û«s{unËföêÜz6²Wç6ªs«rS|üêÜS¬Æ°*a_a“¨³Þ¼Ï÷åNk;š{…TíËJ¬üÖ¬ŽÊîwY®ßEg«©ã»¯`ø‘ÔÇøæâúúN¢[?×zWÆu1ªâ‹×¶—MüõíÏ;´Ò}ÔEí'ÿýû‹“Ó~q@ ëW'§ç·?ÿûʌ켫÷¾E{ãæ¯`ÜüÔšõñ‰{šn×}BÛ�íÀÆ_cɈãÕÒ}”›¯©uá3n(üëØY¾>Ç.ÍÏv1ÞýŠ|vÒÀÆÌëJõØðÄŸ]´µìV»sUلúç[:ù×ùå›] Ù~U6R]öÝ÷^–Á77/NNϾ==ÙA¤[b¦+¿§€°Â¾¬{3Ç +e¤ƒÚíæ¬*÷u²ð…åƒ|}…/îǵ³Åâç»»`)æð]tßÜ/WVöa¾þ÷–æ¾å~›{qîŹ5QÈ^šÛKsŸª4·ÒfÂO\¢¬ÿþ§W×Wg»ˆ «b2ËåoÛàÇ)-W¿Šö&üÆ„ÿôxúJwôi_?eNprs~ûòòleY̤'úš6õÉDôíÀÖh¾ÛäÇûç¶ðƒ!6M›€õ.ö°MÔ\©0 +ë]ìa[ŠñZÏÁoØÃÝ×b]{Ø?ŽûÇñ#x׸û¾‹«•û?Ý·q]{¸ßÛ¸®÷ý~oãºöpŸ·qßkðÝž´»YýÚ#ïKÿɬø~Úû꾄χ>ÜÇ(áód+²®Ë{¶¯áóî}ÝÉ,>6lµæþ{4.®oþxÒÆÝ™î·vV~ù®]¬ˆ‰ïxmþ£-äõ;¢X>¶[³N6°É’ Ùá:0üßMSÈšv+;{o6±/òñÁÚG(ò±VÍqÿÖ~ö”jdüyÕfŠÛZ·´é‘Ú¡ÄÄáªÔ¿{Ö˜8\›¾W‘‰'å4|b±up6píÿ¶²: àb«Tîë1\÷[s¿»§(LÛuµŠ}qzä «JW�sX+¿»§ñê’þvsrõúůUó›7W§]ñEÞÉzv{òýº^ŒÍÆ3\æßw3иƒUù &KoZ"û=‘­ŽÈŽò9XÕ–Lf_íÉl}df?jfö­Q ü£½ýߜ߬êÌŸ¨·7}¬ä<ÅôAæõ'tuÖÊ –Z¸ÊÔ¨}Œè£³¢ |·öQãïÃÐð„¿¼¸XRvovÄì{ ÑÞíºzÕÜ« ÒÚ6qÿ>Hq]y`¤•íæa}þ×õõónNÖ%ʾG¤ß~ùk¾ûýÕsm†„° ïþt}õ—¶%,„rÈð¯Î~8¿òÙoþôJæÁ~ûóå÷×äþ?;øÛÉÕÿö™9øò³ß˜ƒüøÙoÞ ÿgþ ÿCÿý'üU¾þñ3üëÿkûŸûñ üñàÿsð¼Mõ¿~ö›Ã\j9r>„ƒ«9²Å¥ƒK‚ç£T=ÀK=rÅøl±�,G&ùˆÀtdcu42“Ni†x|Ž4³s™Ç#›K®?ÓàtäBE¸=ÊÉdÜæ3×ÖæŠÆ°}$×âJ2mÁÑþ\i ö¾�ܶü\¿zK@=N›a²`Ú¶gíÁ1ÎjLðxTc²08å£ ì®º£]E`<JÎ$ÞZv‘×üQÎvÑV“+®7¹£jqÖ+>U[x`tF'°GÕÙ@ð¦%�Ð!0ÅìeZŸ}d káÜQqÁ<”v‚´.ç ŽG בƄJÀÒ0CÎÕ<ÕÊkˆG&Ð`wdjMŒ#Ž4 7íÇ4CnÿJ¸†\�Õ8CömfÈ ¥6ü7mßÎÀ é¹Ò±ù£d+ÐYn_3qÖPCDæpTŒ)BgmbŸ`sm®†²Â¤S-ÛÒ’I‰¯XüVÛ™ÓåvBmàFÙ•ÇzãaÇ´£R: Ö0z½urb"äð½•ÁÙÉࢷ¥fëè„m"šn—ÍÖTxÖPô +5LñÉÇ£è‰"ÛÖ™kø÷p3«i•‰Êì‘«‘÷VM£ÔL3›¶K¼�$Ò`k£c -íÞá´¾}Ffh8hðv*Á&þ\D¿õÈÃ\4C»ý@íH%ð mw|[Ú‡õ<¸í§07â9 o%½Ñ„a ÆdŒì +€mC C� GÙáP3vÖîö‹ÆŒkÐnk[{û£a;µ?¶þ©ß¨%²®Vb„�ϼ'ã‚l´-ÝÑ—KF‚©Æ·½eK@Ÿ³,Ý6Š }6æè6µsup}.º0äNOt-hŸÈ¡èTñ·ÐŽ0¹a )9¦ ä‘|¬îÌÏ0A¨AfðG!ef ƸÊ4àjÂììÁF$ +ú°‡ö‡oü¢á=4Lè/ iÒù7Mju)ðšó_›œåËYC,LíÂÈÓb$L×¢<W¬�ŒÜ˜&s˜†S6–‡ÀƘŒ÷™ßø‡ð³v´ÙáÑÂůåÆ”½’jx„ 0a˜vHÂRÛ)×Zii.¥ÄÜåTù1 ú0øK�ó(þ\cÊÕy>®vpð-frm53Ê&àùÂSv™†Æs}EÒ�¦Üèè€Xr H²ð·äa€ß«–­klÃ+ñïP»•M`ÕÎ;y£Z}ˆGçÓÖPÒ@þMÓ6üň„Ô¾Ú.œï¼Z^Ø&?WÇw¯B䂧G"Dý}WBfŽj]fžì‹a¤‡¬Àd ¿ºøΓéàÛnr¥cÃB!`c¨´††…†âEÁÄÂ7"ªY&üWµÊ“_/¸Ôw‰å†&@D!ã-¿(ÊD˜(±È3#œ%zÞ0˯~“xpc2…üÞ6¬T^)ÃKd,z›ås•Ø<�sÖ ’cò¬ÂýJj²a¨üÒKO`»:Ù¢Óˆ.ZÊ2¼, c’i|! +¯‘Œ±‰9ZÎF^Öék{,p±±P½K<¶D¶ê Ëj¡öèÓF£Âšå]‘£‘V.Ì$Û÷•ä©[Wˆ>‹´€ö,ºÏ@Ç©¨}¡mœSb1à €$—á@|â{^>p/-¬Id¹DÙÄäô Û%¨$£[}CàÐí¢qÃœ…ÂH¼†]Ølbr…P'Ì`ÛE²L&[ÏÀT KN¾ ï²má;ÒДÝ%ºL ‘ô¼°-“gmr¶íÔˆ@0C"¯r>>yÚ ÇÛ0^úð&¼°$Ý€ÙU¾hí¯²‰,‚8¼]>O•ßèè’,A¤ë¦ƒ4^,x ‘¯oµ¥Dˆø” ZÅËÂì@¼¬$æ5YIS ¥è­ngU<œ¼\M;ʬ•Pø52ÅZ¦1 )=@uQÙÑÒP¥¡÷¬Qi(¸á +âB­,’4±‰•@Tz,<ÐBzi‡J<�ä”H”S¢—;¥@x,l86©’&n»Î¼G· +žlòµm¤IŠ!Èœ¹¿$Môe‰P¸#ò +üØðN#føí†áXԎƃ*ƒ'ОHuQ gkï©7ŒE䮬-¶GÛà ®ðkĘð Ë,¿=¬…Ÿiž¤½v¾B ®c15ÙI/eajL®Ê5™½§(VMºöEä°—Ê´bt„Ì&ÔÈ35ÈMrDíé· Æ&§õ‡ÎG’§¢H¹ „…Q¡n¬½Ò ™"Þ´€>A(jRI£?G¤êÛ È¤Ú~õôvKùÛÁ™À�•O}­7c€±Qxwìgò5Â{gX ¹ó·ßýî˛۩Ñç·ß}~ØnŽm7lŒýê«/OOß\þõú¶Çgþö;0î|§k™(Šç&<«ôA44…X"ÁL1Ñó:ÑM!·¼Á»Û(¢½ €‘FHuŒgëX�³¦„Žçœê@¬JzR&#4²FÝô+ÖÌ›B¤gÝø)çí92Mã·³:?Þ„†;ÝdöwE´9øAÑj+K_M F²þF°&¦Óu²±‰§—‚G·§È‘Uxt²# +òΈîéˆã·ÏànUQe)ng½¸]C›3ÍÐng ©¢½Ž3ÀÛˆ| 谸š¡(ì€æ@À2?KF)ô’è‹`SiÚ?NDC’k¡…Ô:C,gè¦�Uù‰ÈHhkOX`ŠlHN´¬¦p•A`" À.]&‘“˜-Li2¡çCŠ¾vÎÑÆÒ ¨®¤›ZækƒÕ¢Iȵʕ°V5ÖÆÓ3â¼Á½M¬u3²èe@Åœn˜Ñ¸ØÏ€Í{ ÄùKbÝ�NÒì`šÜ‚íꮕ÷ì“Ø&<n +ÞO™’TéG­U7Ðn‰'xõV¬éÿB‹Æežk²bÔnòpdŠ¢™ŒDgóoyv )dQµ£í¨ÖÀ¯Ž±¬V)†®Uc0DH.+í=¥©wÉd~ï‚1¢ ÃKZEE‘“SÝMùN,÷ÐGñ`Jûº¼Åmf–Ê‚˜£@Ù삃%³Ó†5ÐJÿë³ßÔƒÏÿíàÿ âÞ˜ƒ/o:3É »šBoa[‘ðîlõj·ébežÎ³ñE£n2ŸZœÊrE­UtnÜ.šsqø xµd&¨&&2sy4nþ_*0x45C„ý`yãnbhµÓïƒrUËK(oDÀ±Èm "„€~Õ^ŸK1YëXÓtôÊ‚yƒ¨p[Äâ½åŒDåhßôA ÑMa&-Ï+â¯108^B)ÄŸÁ0P\¡™†H(Aóv’=›’ù±j8–ÛWÐöå|fý7Ò½Ú€ÂOaB¢Él$Ñ ­‡¥ã©aÖpF Óð ÐË™DðÁÃÕ^Ý1¡S¥Ž‹^ÈPü$VÕ­qˆ§BÇln‡pL[~ýr·ªf¸qÖóýݦaƒàßFO اô¬ ³Ëö¸ äk™1 ‡bijÖ0ä–”äc.Õ8Åíò T^bøRh¼‚U‡ 1´“,¾ò`´zN€ü àî ¡¤vO™<cb¤é PH 7ÃàvZÞòmq|+†­jŽYuWø\l®žTøŽ!ªRîYœàÀ*ï79NNi€We�ÀÄRfbGùi±¿€0¥/_Mœ•<™]A'®*ZðöÝbÅì!†½LöÚ±³¨XOI°®ƒi9“i ¯Aé’ábÛL º•5qº*ÖE5éƒûÖ†i—x8åwøeÕ%³íÀ«¦7€™:'o–Ð[!¯ S¬e�*£tNQÜ€‰Ìéô– t0"&³‚“4…4]‚�K¼Þqð¸a™v…ÓM"€Ù@gM¤0] íű r_ +ÜæÂÖjñ6δ.O0ËU”à2hÒÝ2žI*EµJƒ)·š ¾ÝM0rl’¤Èhíxf»°O&û¶ÿh„R›ZÇFÂÜ1¦ÁŒ<¤¤öoþœO(Úµ»Ê[‹$Ú fXú!&áFðt³u?«fijÌÌÐHWûÍ.n0â2¦m“ïäO4´¢Ø­ +¶ÁÈŽ,W‚±FüÞªþšÁ •ø� »pÁã\é>ÇÊíg£8†­X…(œ 5‹žË~/C~_Iâ2ú>b_ÙÁ’+qÒ¶ãĽÝ^€l/ihÀ‹s*‚p%±í¼dÔ£�9ôÈ>“9ß©„Ó®õî:øDî·ª9±çR¶‹²0Ok˜´pp[¬F�Ör2á× ‰ºÁ ˜ ï¬äʃÉÛ¦ŠHSïô· ÝDBv|`M$O ÀŽbü}r ÒÁ®¯DS¬ÜZçxÄœ·|ç*kÏ9¨åÙ›òX×�+º‹räˆbùÈ}ð Éð‘;ˆoé¦}"G¸Lp”„výЕ[‹¾9ÜZˆ…°Œ†¢–ª�ë£Ðòìï š†êhw6ÜŒüwÇ¿oþ2ϧ{lGDm ’zó=$WmŒúíwø?$yüö;Œ–jÅþ8�´ j + ›â¦�‘S¿ýîmµíÅ'YnÅ ¼Œ‰ª­Ã`°ÿ™”៧ü»`zÉÓqh2.Œó °’å— ˜²¸´hÂdÊ‘P ÿ”ë‡q}#}¾ÉŽñ—·SИ°÷íË“Wg_]œ]=ÿËÉíË?|Í´óùnó7 êk£¾|ölã¸?ž@Èë¯Î^\ßœMÉOtz¼nz¾"šV‘ÐÈz¹ø ÆF±ò†˜Â64´†’ÿ»º0�§èýJa:¼€"/Î1™¸e:GÿI"'Ó81˜Õ›æ˜&ëP ž­,{>l½O¼ÄÇGüå/uÄ_¾¸=»™Ÿ0²å"ñ @´ ˆïûü¶ß#9¿ç÷¿å¸ã÷¿á¸ß+½Ý|ÖMo·jrª¡”1ø•¶”Éö–ëàÚá /[¾Í O$?¤DBÃ!ºs@C€z’MhÈ“Á`äÍևɴPÖ fb†×".qŽÊR¸‚®@`ýTSŠ“¡}[}Ê% +X±‹B˜!°£T(Ô—\ᩨ(½QYî€3•ˆÂ,-?Ô`à̃²ƒxuTÚ§€²µõ3<NBhÖ&eå8Y�ƒ}´Ö>°ï©Ï·Ü¿bÏAá{-5ÇžQ"À…~9ƒƒvSYRn+"Ý9œ—Ãwõ-öP&GüEBšè&Ó@Yƒbám·¡f‰­£i+-'KXG`ta2´ïk˜s‰E¡ e†ÂN’…Ý%žA8¿œÁ‡Ð ÔsQgNŽƒ¸0¢ @ ÍIíY}0zë´PÖÐ]E‡ÁÌ2-8É+ã@× ÀŽD\ð8¸om˜v‰Á¢W¦'H &.X­Õx”`;Jx.è}A‚Y&óò³GË=Ãzp“G½F‡¢ë*¡·N§`òùîæ"8DîJx¬L +(IÎÚɨø£ÅŽƒû®†i—(PüÅ<G`¿Ú‚@°LvHY¹œÁÁôÀÑù°¨‚ZznHi‡(«âÃ�Ôxœ†¥8 ŽkFëÓ@YcQá+$!Â2- Fp kP`Ç".xÜ·6L»Äƒb±ýg†E›ò‹!‹±ÒA¤Çå :uŠò˜ »  S4—A€ŠEãÉN¢ƒÁaZK“i ¬±¨pôÒIê´ |º©¸É¨X¤ƒûÖ†i—xP,“4Åbç‘‹9V> Û½œÁ›:`b’G%$ôx9‹ „HüÊ@ƢƒöÁ軯bœäi ¬A±(–ÿÜp5Æ·DFL£p7Yƒ;qÁãྵaÚ%‹íËS,úêê ‹Iý!í±Wéå 6ZŽÍl‹Š–,[àªâwŵ‡7¦ÈX´ä_™ ®`¦§¹OÛ²žAá5KHŸcYdÕ5(P±H ÷­ Ó.ñ X”N±¸¯UF7A±‰;° 0ŽHªVè0kŽaŠÀ¦~N‡bl=Á2ã�âkHÃ!÷®s&Lé`Ù^¾¯ÀŽ½fƒûž†i—Pì-žeÈþšc0HÃäŽ=²ÊóšjVKp‘ãw¶æÈ(�Ï ñÓÁpuØWߧ€¼†ÅCpáìð‚®…q +ìHăûÖ†i—xP$Ú0{T†Çºc±-Œw€q›—s¸¥@VZT +ÌÌðô¨@\/9 ¨XtM1 †X¨àãtÚÈkP,2Âé@=§M%I²vÇ.xÜ·6L»Äƒ`ÑV3{Tš<>×ó šK€Àÿs9CŒV7ãÐÉ`ÁÑ9‹oC€´‚Žò< f§ÂtÚHKPE›ÁcÌ™^:+ 9ãØqˆë÷ Ó.° (Liþ¢ty§£0Ä(á±88ä3FyQ2[ù›°PÈOPÀãdÃ�T¢_l2¢^EÓôi ¯AÕE†WŒ&$Ò´€Œ× @E"-xÜ·6L»Äƒb1¸ù‹ù®s,b:EÀ#u9‡;±¯Áš(D$ƒô/I¿lƒ`£·<ŠšZΓ)~P)Z ¬ä%×I!š¹Ä& P`G`ª³Á}WôK(/r—…ñ—+È£—s¸#]”Ö$N0`$$Wµ×³ ¨(äô¾a0„Åk˜°L;�y *¥3 —‰Ez™ð +YSu +T$Ò‚ÇÁ}kôK<ÊfvCWó\ßkŠ·‘ ´C]Îà¨Kqð‡—°ˆ0Uv)¦A€ŒÅ,‘"Ã`H™5ÖN§í@YƒbQà©DnNë9åY× ÀŽEö!ôÁÖû´K<(³©»c1RJ¾yCdA1SÐIl`Ü*¡E¢ÀïM€ŠCÃó>à }œNÛ´Õs +¢G Ò¤P- ‹·EV ÀŽA\î8xØnŸvŽÅ_È3ó¡k—~¿’*S�†"_Îà`ÛL^Ñap Enƒ ˜¢WÈLm_D}0Ä:ÊdïÓv ¬A…t§~meZ@‹>NÖ @Å!-x<l9|†Å¢ó3 â µ!®Y¢ SL¾o2JpÅXT‘Ô<ÏBc¥Ð…1!Ä'”ÉPˆw#CÙ0gÊT¾x"§Þ8+8ì*çåé +ØQXb˜öÛ§]"átsHÞÂYz¸ÅU:ßËQzø`7é~'é¸àû¹H×é ý/©cÄËÙþ|þÙo’¸L?ÿòùõ÷gð©œìõ¿áà¦$ÿã/m’�yÙ.´§ÆèŠ æÿ“¿¶`6™/¿jÿ¾k¿n6ýÇÑÁnü©ù†ÿ³á׃[/æ«oæ¿ +«â_ß°g3¸„ßIòXã‚bÍ b4/Ž~ Šw A²0† ØêÄb!!¡@,*H0†q0¿7}.qѤD“¤ÊíaÆ&vé X…„îh4›§bÒYí!„ õ[bÇm YkÝ€˜¿jÎi½BVkÜNœŒÙÂo5¶Tºå¾½_ˆž@‰½œfCyàÕJ^õD¾ó΂ųiv÷ä<ø®aµ1új夼D ‚UÁi…š½äÕ‹m¨H:(Æ÷'®PÝ! +Éj.‘J "$Ád+YÓ% ¿ï ˆA™ÏHj—÷œB‡Þr­#È„JP“)R"Du°pödUI*ÕïD1ˆ·—Ú<Bp×#qß\¿~}ðÿCÛÉ5\YûÞU®öÑ‹†ân´jÜ |V&0õ‰ÄÀJ)jÕ¬Ó†×@*Hv¥ÕEªµ’1ıÓÅ™'ØoDÂgo¸†$×N¥žÒ»ˆœò*΀ÎËevTyƒ>—½ˆrXif8}¨8{–O½×ÔzÉð ¨ë¤u‘Ã)hˆIL7CLj€ €1ÐX¼ëo·œÆ…¤pÀjå:öt$0ƘÊfLL¢}[#!ê•Ó2÷t?Å…ªÄ/fN¾>Œ”$ E,eK!01ÐÕ¢‰‘VXtÑà€ÒãÖ“&ŒÁ&ÀŒ›^iภ„C* ÙóÆÑ6¢át z:æÚidÞ—"_¥à¤P*:B´†B¸i+F“(ð¸»ù.Kñ0Dž ôÖ€ÕÒsÕ®¢E@ ×±^|ÒÈS +GÅ”w‘¨9K€Xû€Y­_éCo ~ ¨Ø„)ì:ÁìM¢YΨüÞ©”Év" ~s±^€ãçU*H¡)ML !ª‡6ZE”M´±^T•˜N0=ˆÓ-¤g ”~]Ù‡})¿’yV¥ +¨. ¿_ eLȮڜUÓ)dúPÖP†ÚVóéò,{IT‡€pŽ…ä¢WMSŽÂUgtÂLâ úÚÍ^ÀtrÌy{ [–\ë$IŸ <œnÁ¢®öâDš‚Öâc8]æŒ@9/ÌÜ•‘qàªAÎk6Øky=™v±†Ó-këËŽ’ÚE!ØáRx ãj(FVZª¢y R! Mn$P=öZ�^ªó0˜(ÆxÃwÍ\@.—UÐ –ûuÞq©©40FE-ÊDè>V;³—´¹«+±|’*~Zààt n:ÚœšíøŽ#s—ô­â¸Z¥U%²‰a¶ˆz^“ÔzBskß6‘?p9Ÿ­ÞªÈæa–ÔŠXFˆ÷Õ  ‚=DÏEgN­rÄ®X]‘wÜÅÁ0(FSÌ£×¹cSp»€R©4‹Ðß8΀"jìÿGœE"CÛˆÈÓ-qo\âLu §Ó§-®EíâYJäAV#¾J€ŠìEq�N +gÞgX8 ++ŠXVgkgï€Ñ;ò&aΟ¤úC!v˜à*”bÝ@õïF÷uFNϵhé)Ÿ8ã]¨Š8¬=Ið¨¶G¾x�<؈ÄÓ-Èí{U-ÒP5‚àFÌo®d©¤âOf‰-Ƀ&6BV7#§jE( aFoo‘¸¤¸°a™g)šiŽ®—#6”æh¯@g´Ú©VËÀ'‡”fȲÑbƒõÁQQËÊ)›Ý+Fi_X°«�øÂõnDâéäv¼'¶�Ì¥Úu††.–•1”¥,GþXþ44 ÑÍóZð�I›ÎÄôÞ© 5ò·BÚR1tCk@‡ ú¬GŠ§áG¹£ÙˆõÕðU„Ò‘aXãmãŽO·`b”:%?¶PÕÀK!O5A^¯BH®®¡¹´{TJ…Ú5Z¨Ò YS÷YmñrQŒÌåqÁ¸Ì¨tM•>ås‰BZ y†Ò%_§¥;+˜ò%“«æÕCQ‘™bjbUi†Ó-èé2_W¹ÜXxü ¤}–Akw”“o‘/+FQÝ cy‡P3 ¸ð&R„÷Ûª I¬²Ó€ûé3$b‹òB&¢×(ÍÆd j†u÷$ÖQé(A&u"Š”‰†ýr‰¡%N· §ã ‚´¶dí©¬ìYðd™¢{Âek ÅOTrârŠú€óÌ@WŠ`ŽukÈÖçb…ONyÀ–\Šzæâ€fá–ÒtÉÇ,%+¸Ð¸‡: 9~Ȥª–X©Ì–¥hܧ[ðÓQ)«Q„¥.å®ñ›ÔÅrÖ™«œß)¥¨áZgAÑ \ÃïGËÌéÈù0ˆ%£ÎyRñ`†á5qšÁëÕz)ú"E³ 6*YO(26ê4Cê'ðÖæÀÕϵe,UP%<HÀ›ÃwG½�%.§š•J6™äɵ‘§[Üe”@4*ô׊ñÉÊ\¿sÀ ûßÑØÄ$CY\’asŸƒP Ç–;!gÝfˆådq‰n& 6R $ºq&®#ƒO~â2aC€«¹Wö$Z¿ë:{âZ¼dœqʳ’Šm(dé¤Èô<žnÁïäâ +ÖW­Œ– d…_Â…p_KE²éXÅtdé²Ëqª…p©ÑÆ,�ë\)æ ¼|Š:æ¹ô¤ïw̨ɾ%‚¯ëÂÚ»*J””Xu1÷°T+EnE—™cát3r:Ú¬N]éyPnÑmåüA3«GR›Þ'^Xg²�5"”Ëoƒ’äx¹JùKNáݦámáìjÐDCU¿W•©P¬]Þd‰^7˜šp<c4Ž‚6ä`Ý#Ìn†€Ó-ˆ¹X” x\Ëø7'—g¯·Å!ˆ¤@Qsþ#™ÒÝZÅïn&‡beÕp3 ­.E#gcȦ\GŒ<¬÷A#@ŽËÀ:qˆ>+Q‚Lµ zlêFáH+ë–(tN«‘õd± ÆÞÚcªÃpnX\ìÍ.\µÌ”^³õ!ö¨JE$±­T/n,8Læ”h’ „I£©žŒßhQ`1 +ò,¸5BÖ �Ìr/1 +@×ÀHCmÞ‰6/Žúø€q»½Ù=rÅÒ=ÇÏI¬’ê$fM¢6²¬|$-HO ihQØB„5_éR@ÖH’L–jæXžH­±M5Œ$Ç{ ä®RTëq«Óƒ-QGKæ±h]íYg+–KãÁ¬WÁ3Z轔Ǫp£ægdmÉ‹îÈÅÁ°”,ƒr$5µ'°D­axÓ—ºm 0,§Ä ŸF&ß'@c=‚5¿¨‰×v+s/ iÇš% —÷êV’—>Võ#‹“!‘ÍŒLjV TC*ȇݭâ%±ÉAJóÂn‹x)ü$ªT*Û•nߪrÑ*ÛJhÚÕñ�…u’X Ñ@N,(“§ª}™ Ñ£¡*)d’á(&Òé†Éj³ji"”’Ëz4d¼‹Ef3y†¤–)iQܦ£–¡?EA“¦D¤Gîjƒ%ÀÅÅ®Y3´Ij‡‘±ÛLA5œ€™X T »iV+{_ÙÙãcM…Ë"häò` ÈEã5YL4ÉÅH1õ†=½ çHÞHhù\¬D{Ik±HÂa u¢«ZNüÄ¢ý,ÃIÇŒL§µP[¦èÓ +žÃiÊ©·à1†¶\Èí@Àê);SY]Š»T^¸Ë>d|†]¸ 6¥³„ÐÛÁÉÂåxkчb§’gzÌ܉-U’ù Çòº“Àp˘Qy¨œö€¶xÞY¦OÅÀO T’<a8DœQ)í„}3f¿ß¸Eȃ2…̇ì8®Š„â„R K2ÜW¥R™—î©âêƒYoO®Jä‰_ˆ\¥Š7Æ™ ÎaûUŠ¯¢&V¿¾0²J}gÔŽÕá3S9f†°Œf©b7xŠœŒø£Ñ[»`œ½¤…†T¥¸ #¡£¢¢Ê0kw¶aE©*6¯XDL4Lá^KæÃH/t€X<L•s,s³å{ZØ¥¥¿ žW)ª&jSDëµZBÌjj’ÔÕ,â—/n/‰Ø T´ŸXû¥s€QׄóØA'Îh£‚aZ׫=µ·yZñ RZ¶ýñ´Ü]©jJ#ÖK²ìnidcûuÀŽ$òp¸eI ö^˜{)öpƒ-PŸ½ôª!M­²ű™]—¤G†±ÿA®ò¬¢#ØEZnq!õFÎ"é–;ðá°ï,èEÑ/KåZ©t\H´PLz²t‚Þ$k€’ßRûÔsà:ŽèCÑh'‰ÌvvZ0Õ%ÆR`ªÀI’,œ·üá†IýZ8ñÀˆ„ƒYS÷ZË$kŸ+GÁù‹ l¯2WÄD]Æš]Ô‡ lˆÖ ¯´ó¨d¦}y’»0¿T»´q@2 7¼¢ÇÍ<6JE5)yiµj>ÖÚ³¬Š#ñw+ {>»­ËkU¦éBÀ(&ìÝÖg0ž©Wò|AóWÊAÿä…ATQ·ÒE‰ÊF7¿S’�ŠTSkl”–ö¢ f&ck^Á±Iå*Q…Öi B“¥„³êb$ËN…ÄÀJÇ>°¤k‚”t«¥ùÁ6ÈÔl¤÷¨vÜ\²]ÉŒƒ^¬Ê³¢žƒëB}…&€J^œ âÔÆPy‘À¥fbÊbѬìö M@Û ›yiØ …€˜2LZ°’£)MüêèdH‘Ê«!+¬R™�òC9)†7ÙTmd‘’休£|NÐTšƒfMŒÝ0Ær”uûà¤!OÎRv‹ÞržnaZ +=ApHjôÊA²<”®¤¥Î¢ÝÐ%ωÏßú*ƒ¹V1Z+âŸ5¼À;uBì"¶Åàœ1æŽ/`µa#�Sa›nêR –²­œÙeµ‘†äæsXÎ×K~ן5<¸#NÒÒ7…Üd‘ÏB"‘,6ØûËh+ØW†NÂÇréhŒdǧªç'œd»Ø^ˆ&à2ØÀf÷îQë?°¾Þa+©µpÀ90˜jƒ,s0?×ÄX`Û3@ùf1KèêªtÖK9jç­˜ìµ"]x*À¥,u†YTÄ¿y)ðÊV!,a­28TO™«ª¨IB™papLA Í@ŽQ™ÔB¥›‚¹GVÞ, @#"òP/eJ}e¢Ç;g4‡ÃQWÊÔ[7–¾ª:…Æ[†«'=RB|Ž•]ŒM3\žÇ7dÇTªöŸ2Å ¢Q‡‘ G]“†ÝÂj{YÞªA )«»3PcÒ[c–#F—³YƒæPz¯ŒFR‡6 0˜z¸aˆ7/ “‚‹3`ïB²Õ‹¡� >¦‡÷e¤ý$é渪ÒÛO‚:æxµè  ÷Rï$ €Ý¹)˜!…QgàNX`™¾feV(jI.zñÉ¥è}ß„D9 +¿ä¯E5+ `Û^få@@Æ ¼iŽ{OhŸV¬àê¤×KÅXàUžk‚®ÉÄíYp¡+^ªäî—(‚˜gb/ËœÇÝ+ØçúCÕi)þ=¶cHî¹nbI»‚iHhM+Â\'æÑIªlHuÎz:yhm±ôàGŸâ ´™`÷‡°Pb ÜéMThêÂ'µ( …–|É<ØZ)¢Î=R©.Xewõ´^ûÅ°Äv–®—™,ªèà…AØ’i³ +ìב[ZµËL-ÃÈŠt‘W¨JÛªúaÜSŒô:@5ës‰D÷»bR— a¡xòΰ£ÞìLⶸ“;oà–T™D$OÃKnYÒ°­i”–:¡gÁ6kHM±\nüédׅε%+AU‘§ ?øX.–ôë¬Â ‰~­XÒ´ž”X)5–QD:’Zj¤®“£¨h•“ðÒ¯ÕjU�,Þ•¥c( x'4KŽ€Fî Š,š]»ÑÛI¦@Å ›žÉÃädÔÀ¨/ÁH#4ˆîéŠX¥Ã®lÜæ²ÊËÆ€Þl*ÅÔ ƒ ÎrÛø½4{D*˜ +LC) ÄÛH¤4þnà²nhøè_çž¿ÜáSdHÀBc±t“åûs÷.*¨>8±‚q®"Ø®­ä2çÊÀ¦m4ù¾~¬^+…g$³¿ dlWöI³¡¨ð6F=õ΂U +o£‡MÞµgCHŽÓ&^´Ù~0ˇ…Z ðœÌ@2³FJÑÏIÔú]Ô:/r ºãºPc†-/Qª;‚AÏ %瞈 +ßeoD ~ytìòÝ9¢­zz†ò`k¹ÉM–\ÖªÅülïs™Õæ¨?”n¢‰’Ö&tƒ-¹¹²“^ƒQB@ô±~8lýA¾ §x”~”9˜v™$ ãÕIH™˜Ô(Z^¤šH Œ^œXFÕX½R•k³Ó´®J;'•å‚¨<€Éž/'Ã)­a¤Ÿm!W'v�œ¹[Oß•µõõc%“JÕF3Pk +LÀMŒMƒß8/"´ÉÔím(&s4Sb«*&ià‚•a¬xAUµ‡’aݤédK-ØÈ—&âxÐg¦%Ã(IQ|iû.‚¥ÚIx)KMÔ.Ërɨڛlc¦%¿àžë»”$ñ]›ÈCqqºa‡=A^)«ÕQ`Z~άƘTì‘ã èÿö޵Ƕë¸ýn@ÿá| hz¾ÉVœë¤H±¯Œ ¨-ûšG4*¾þ÷wWÕUsíÝG"y¨À€"¦T\=÷z֬Ǩ1†OBˇթé¾tÁ&S^;»qQäi­1O7ÐqƒMqy‰BRÅÆsàw)=¢§À¢Lc‰]Z†ya§ï‹Ðÿ ™õ~atW\I �ê¶í¦*×ùC™BNE”_Ý™# §ˆZ¯¬0&ù.–/;ào†½5îEØ¿eîM¨Áš4$ÑÊ+Ôqµz$VðKªP¨¯©Jpo>ÕÉç…—A3B_!ç1ù2¸Üyy ¨$-&£ póhÓæËòîµ {6¡jA00}<EZUðù™Ï’¤«›ûºn*”64F¥Jµ*÷ªôéç芄>®Ü‡EÆì\w[N¤–ÀàŠŸÆn#Q…¨†ì3ÝåÀrwɯêQÏ8<ÃäÌhk„;´(´Šá‘ cphÜZ§žjÎÓ•lçð+@ÝAÇY|û±j Þr¡‹I¥%8!Å'N>žB&?¨â韩ðÆ ’ ü®s*c‘,�>jƒÒû2ʤ~0¢'Íïb§’’6³Í_.õêé�½Í‘F“JìdE¤+X†â3Ÿ'Q…ŽÇ̱øŠ°kf¤~Õ©Ô ëúÌÖb®Ø’«ÇÑ-(a ö8L³ú×d¶ñ,„°øôlqÎ(NG¤&}+n@© +-·Q÷‰JH‘PÙ¶$¬p;»ev¾_ãvaCŽBlÿ¨ªµEСގì)Ì6ƒ¸% Z‚ï(�‘P‘,_jË6Þnî +­)iL ÿvs;†.¸ù$ûpðfݺÛj�ð{³ÐÑ(Ój¯ŒpmŠ4Ê:ÌÁ×±¢ï&htŒ`Lïý-Gr))ŠùÀ=ŽóÈÿâ90™ÉŠ)0ÛÚ‹1ËtÚf9ukOÉÞü‚;£óMHRuÙlFÌ̓¡ÒÇÍÀlºŒã4y„Ú=æìÖtˆeåfDATp«µ N´îtÁ½TBÊL¼Þdå½#‘o~³¯s°”ªD5íhf "¨„EÒ` \þ´T%ð.5WæSê†æ$!RÑ nªE{ÁÈâ-¶ó`…A" Ÿ»Eãš½éæ+X}B[;Ý4G5 Îv&væµ€Å`…jóÇ6(?o«c­‚<rT"$U•~ž¥„½y â3¶Û9ýÕ”€#§08rN|†ŒÞ &ç2Ô‡qY?ÎWP5EK¾*.³×ä¤Jü½ÜÇã“*N› eÿÎÑš±Ýˆ-B®ÌÊóòxÊ<À;·¨…ÂaÜŒ éo+”ŽWwÍÌ '¢yg° õêñ â"šqù]PK[ ×%M1¼cÅ|Œí |«Wàg™j%#eÉ›@E ³§Í. dך? ßø”LârÒU÷#µ�ý§Pa¯ôŒ™rÊšW'ÎVpxçöZgGê®tðº¤êƒD­4GÃÍ¥m†ˆv°EÛ4‚?#Ù0ñ²‰µL:EZ–`ýv3£¹¼=¹ž ×;N÷,ÈúÌüfP¼ty«žWb³lœÁÒ#ƒi…}k"ˆTþ‹ÍZhHÌ3µƒ{⸒&ODV”i·!Ùñ4#)é�¾[Â1FÐœ dÙ”%v|æ}(o•þÀêDê°`¦RaóÖ]Ù߸h©Ðoÿ"X?<bá;‰B¯L¿¤ÌÙ>] .ˆg˜wuD›Â?–Uù8_¡³¬ŽD8™WÁ0J>Æ´:€/Újóû€áˆ>ÕHõÔ ƒ\*¶QP=‹Á¹Nx<þ§Piu lvþPà%&¶2ë²%†©ÇpѤD¤ìŽãœª‹Ñ0—Šó^¶Dº3sY€›ugàôãåÍÉÑŽÞEe!_¯Áê�2zsìKœJÓ•ºUÖTFˆ íSQ•R!)ø +´S ±À§ýì“Fòq²LK!”1œÌ&kk¢¥8 `R†<_a!ÌJ€É H«Ïˆ1óµ½Åï~ƒøHÝt‡ÿÜâ´z’Dô‚3´\æQ0&£æ`‰CĪÁ° G¯1/ðÈ~Dµü€¥i™ª¦n~…p°ÚWˆz×qh? +ÞMo9Òr&©ZÔ|té{r¼ÑÀ,–¯>]pEÒ µá|,™{m%\ò’ú“Y${^m,è™+¬Ê‚"*¢K ¬»´”;µ¨9p Zá5@LÐRU¾„LÌ ^§ñ8ÜI&œOÌ >)­O‚N ᬛð eÙ©F¬0)»*e˜Òï`& Î⃽]íßLW‘Ÿ¤…ÒÂ:˜ÏEo‚°øŸ=©|�ÈP [¨Š¦1Ê­¿Rܾτéò÷£“ f8a'[fšÛÒŽ³}´èuÙDEftÌô\½MÊHlÒpXýÞWàPÌð=Q.Ë&cxy6@aJͯ–€£!z=X¸däõ "'‘U Z—f âÈ@†ƒ.“ȲÒ9#˜XWV>–ÚãuLv{Uï÷X¡9ÊtyøI¦W¥lðs@‰^!0‰2ÂÔ—ïÌŠ²T€þQÑøFF¦jôT»[ <È׬ÎZ–OÅ‘ ­úmßÍ„ ¼bлU–üø"¶›ðÊKn�tý€†j Âä\%Ÿ‰€=ÊÜ0ò�YÁ¾k¹ˆm¾I—]ä¦â>ËÕŒoÖŒWTOÓt…¡…“1Ã7|Å£~@§ýP–³bòøìîÓr=Õ¢mb 7�‹µ‡–L WW9%ÜÜQ°y¨ á‡¦¡Ì—4/(úN-÷£ù~bâ˜^Û–£% ®¹¢ø|SÎÀ%îý¹+.1b@ ¬9o+šX +f¹X§“Õ|rø =š jôÎŒ|èÖNØ}²Z‹5Õ×f2!ê³]ë¨]òI ¨ž¬Tê1 |Ÿ¬2l¡—Š\­”ÀªNó; b Ü΋&<›V±“CÉÚ`³ž¤‰tÈDKÉÓõáICúdåò bƒ"‰‚„“üü`ýWA+VIWký]À:0òyïF J=‚îòˆÃhSMÆî�Îÿx$í £õÁ¦¶õb” Å-›§ýZ†^ѲEÏ«vB¾Ö< \ÓÞùT»ã¾߈HDj\ï—È5÷󲕤˜Jõ‹0mçÎLQËŠnŠ,Ža’Žwô£bz×ݸ­}©¿e_ª¤9ðC™¥CU˜lŒvèŒoÞxf·\RõrÞ"±„kÕ±;ÌA×bƒ01ÁVh¾“ç@ÿ4ã²ÝòÀÞlƽÅ]ÀË»Z`Á*·eÎ&¡,ÛºûýØäTã Î!z5ú('¹8Õ·=s…Þ¼WRjÄó’Ï·ñùBð^ÆsÓŽ ÆVÈš(În,ðz€Wß�LÒ”³Éïç<Š¥ý€laÈ£8’ZZÙ¡gcgyc§3xÔ&98/\üÎ$â6eAL]1} é0½¼u8‘q54zÞhÿ?“‚]ÐHZß‘ì[Ô0ù.LâRéA£aÒ{ïÀ£Ö(sœ“mj¦2ì‘hä Ͷ|/:ðNê$sÒl`lÉI2­Et¹H¯|Í1x#Eüøøq<ӣÒuo˜’óbD[o:·Åt©Äe‰ +W´žé œímøJ�Ë•K1{º7Ö3µ¼õÖŠ9œö#——:°2ÆŠDàRó¯£ÍÌ-\jÖ^BÿÒ¥ä\J +¡á¤þŠD`ë‰Ð§êºl`H3êLŠéV>Æì‰OÞ5I¥ÂävºÂƒ”·yšœdÓ:=ì£T"ݬÜNôvð8íÆð ¢€²$Ò8¬,¯ÝAÙŽ‘3νJWÆxYÖ¦è+ö»8«Žê0›Ó6¢v.]Xº°�»?óÏQd–bQ5ÃØ\,«ê…+ðºº5H㬣&.Œ²ÊMÈ<[çe¶7Òƒ[j,tÝËÁ[ˆû¶F3Æ|Ý1[­ {QzÌÒ~Öó‚©.$3DH6(ä‚v=‡aç(+•«càE`ŠD®8H¢»? +å D'oD!=|c4"wwrå¥*ºæq Ü0…ýÈ6°­*T”e:aÇžÁ°# üBÚòUIg1sùµ<I‘†4Ù”ržÑ¿ç£ì>©¿cÞÍåF=ñMÅ¿©fàElc`ZzËÅ,óéâçP·o¤™zE«m˜³Ê7j=¤9ØØBÅÑ3l¹bä› +îª|”}ƒ!Í]A'DY=èfïv:PìyïCÛ1•ly>‡‚`õçxÇ’ -ƒµuÿ²…G¢¢ Á:µî0 DBSåh¬q"ë÷‹1¤6Ŧ,ã3#øè¤X_•Bå JáG|<£ºý£˜gE\Ö/”;‰A#%ËøX½‡¶ðÉZÑ¢Y>1ŒnÔŒÈ`Ž^ø”EBFØ©i|Rv0ß(aÚò›ÃÛ»­‚÷ÚUÈvО´š ¯‚]O!©¦ÃååÑâ0]ÅNÖF]d9à]s?¿ˆ=8üM¤¤‚*~mn£ÆIìI0ãˆÍ¢•AœA"øÑ™¢ š^Á @6yŒ£À$Fì.Ÿmã +ÚƒáH¯ÌÁ$£9ݨXrð[;0 %âz¼ ƒ{î¾JmZ½nnt¤Gõž¡‰}à°îåYb@9Ža5Û>ZÑìõòŒ˜½’˜ÐÈŒµä$€FR!mÒéœÅRT—Ê Ù§íÖñs¸Esô]8º㫇4ýöÊþÑ·<ìR“Y„.°±\¬mötÖf®´âÊ'‡(jK<˜ÈÎàX|C‹/ˆk/ÄBáúá„— H©$–ÄO +vŸvLX—5x cË‹Ç¢S3ˆš»®s§Ì+‰ +ˆAÁFhÜ2ñ 3²Ç»m÷q,sœ¹¼wLÆ{V7æSùBì¶ãÄ–K.cøV©±\ƒ·ê“iï™+â$'b7f#�Ž­Ø›ø¾ÜÆâåúC,sLVnN)Cœg:§£WvHH +Z©â¹D´ž”•}-v=߯PX•Ð†;P]èÛ$Ñ`xŸÏ¼RŠ$6ì·,ÌW/fD=tkg?&9¥2™Éžê¼ÌI¬ðÚ™NŒ˜u_a7ŽÄïMâQ\•Ö¼óÎu—XÓcóñWÄ‘ñJ©ÇèÄ)ïè¶m¤Qã5#ŸÃãJÕ؈�sÔQ¥boš6¦áÏ…4$Û±»Ò‡>¹¢2d‰z;ˆ<*çA5‚u2цI¢ÄÆz´h¶aìì +oVw£iw(Àl$;t +ÂÅ:ŠØ€ÁNÈô‹¯¥#¥61#IçºÏ0HaV7Ä÷G`èï`v^2‹íÉãB±CÞæõ–ésDÔÆÀo¡ªÑŒ9ºùö½HÜ šƒƒ¥pËšò·ø”¶æQž0t¸qÉÛ™<ñ±èˆ+Õ[%L4‚À]ª,=¼œb¹Òæ2r8á€îãlçÛ.(>ˆ÷aÑ+ºÏÒø(¬o6/ÈšèFÂäÁñǬÓ|'ù3±·®Äx}xšÏ«‹ɃŒ?ôX�;¥ Ïüµ¶˜©Ï鄸ÑÔä»­Ì<({I"²‚.*Ø +•V…®èb“:·u/%%¥I§8€8¹Dªè^Q€~ä§i2öÑžæÐOÚÎGÇLƒÅà†)L©Å¶éØ·­ùÔ$S ‡Z’ULž¹É8½ìÐ+Õ ‹J ì¨ûÉT“À*øµAWû“MZy•£ªT}¿Î­‰GæÆ‘»&©á©’D?ÞvÄÉ\Bù±xN +|Þt¡ZµÃ;áœÂ+ŽÌÛñÊÙ<:N9ò¶úPtÂ<_I##eÛëa¸+Z`´7&¾Èìßút8À ñ¥ž){aT(“æ±È{<°ìïm‹—#;ÜK¾óM!ò§ó÷9oQŸ.Ï;A>9ä„Ç7§¹‰Aa±%;åÕÌN/ Ë÷�~-ûXòo4y®9 º’‰Ð9˜€|*Ûõ3”‘¥a u:3"R`àÁQ”‰”ý +Or“EÆ#ZRóòEgúµ9â¡%nŠÊ˜„›“8ÿ.ÆLK‰ãÜJ�b¯’ÐÕX‹DŒx¥Ûè=4pø!±“ãÇ BåÕˆQ�,CP^3$ʦ&{9(–ð*„+ýœX³Ýõ•+�÷6«Ç^²¬U5²TxÙ(f1â_5S¹}TÊu¦Î)áÒ"R ÔJžÄÉÉ›î‚1ÝIJ .2–OIÇ«®íæÐq*„¨ ÓÉžÔ^>1ÛAò,v¢Î¦åÂ_C¦go…H=9TƒAB¦”Ò D9zp.–5ŽÿÄDËè†òèäN£{Q¢`+ ³+QÙ/LGr ˜B÷ÙÀE®À®|P™sE¼š"-b’£p¼p}pYf$Ž¬Á-éú¢ÝÙz'cnA¿¸Ö%Éb¦‰a8š�3HŠ^óAb9@ŒÑB.ÆŸ«(³~ð‰ð–O62´—hŒ$ú. Ò”`VN0$Îÿe-àŽ•w&ešuò–hŽ[ê#/îJÞƒ.~q›Ô¤j4Àø ©¤ç…oõ$¥V;¾Ù¢fÌå·ö|µŒ´ýïÿ•unÇ?Øö)Qʘ¼3�?L(¤F'<2• ‘1ìTx‹EB†Â­F ¹=d@èÅ9YÁÔ . —Œ5gÒûË`ÐãØÓº‰Á˜;Ö#O›™²ö–Aêç´Øús“zr%€$ï[¦·Ïجm!¸ +[м:ì•ÚÒçÛ½CYH£¦o/9™P탦çDš5.ò²$‡L7›µ{æ +3/.‰›ŽDÀI˜ª'±µ'À ±p”Ñ›&3‘ì|$l!9nBAˆá”ì›R<TÄ1ÏÀœ¥œ•:ÌTz@Êaï#»”ÌÝN4 ßæW"'­ÿú :£·m(ɧ·�(7@"ý‡æ“(wøŠ(GÓM+]ï£î¥ ƒû¨ùOwå$1zFÛËÝÑú(;cŒÈr‡û葈ú›1û +�ñhõ°²e Ð’¼îtÜÎëµÈÛø§4ûön:Çt›a1̘*Ù*{må\Á!8³rTXo=Ø;³D¯H$Á t$ë\¾;ñólŽ§$iÆ2`O>Îàôî“b,Þ=ôSè>ü«ý3_€e›+‰‡³G®£MM”+ºaôlè(–B? +=ºf•ÓûRЯó‚Ήßa°:Úped=©ìÞh§3îc=>$ª´CÍÝü"Ø~lgÅD%%™ÿ» +‚Lr³©¹Ð4ˆ)w•Û-g#¸ÒŽäF«÷.Mœb˜þz!ºh~Šy`Áç[löç Š7¥Yï³?K$7%®Íë–%˜bš©Šõî0)òKÊv½ 5"Å£à–§…{s•r`7NŠ? +Œ˜É‡‰Þ‰ô¸Ggù+BòíœwÚ—ð†ø°ùAY¡‚ã¡8¾¢e­7£‡ŸC‡ÖÝöù…CÇj³PÏ~•6Ô}1U¹RiV-÷Œž>Lª¨qºß² ‘Ç@ D q€+(º %Kx}¹d%Àå½$à8>w¦¤:Š·°ª2R˜¸ø¦ßFBbøK îµ\ªøÛ,çïÔ§Ò÷{-,·hwÕß®ê4DãKSž}§»sWœ}š½xÒ©¸%VAχY²Ñóí% ¸ºìîöANkPà¥TÁÜ$™0,-¶OXm&™í6Â;ey¤à†}ãà[H.‚Æ¥# +0dNÐF¼“@™K6 åe Ô¸tÔ{’À-­;ê_9Ç] )¨:T‚„UŸ´¿�×ÖÉ@¢Õ*ngÇV»¶ƒlšO—…,Éïš©ùÒNº’‘ ž7þIÄÒ”.Öl|æÍèPŸÐÈ‹Î1C%á]ØN®À‰Ôªó>Ï`;üaúà&™þ:ªZÊDïg:ÆÙd¼3급Z¡á<¸Á— ÿZî‚_A1#Ñ‚+t:–W—Ý?6rƒå!ÀôúpÀ”RÁ_'MɽJȯ€÷åI"猖ðà]8¸Ý×$.\¥^6Q˜ÐÑÒa&†ªàpE};‡ EÉmÄmŽ$`ݬ}f öÊÝ¡ä¶N'Å·„.™Ñ5… ;§48%lÆnÄžÚö M¶NOq¤ÀíÎ:‘¬âiF’$+¼r~g;”dº7ˆ¶½¸Wã2¦‚Xa±êKrl¥´§�YBø çðn¯AŽ«€ì„°ʧ’ì}:ûêÞó™ÔÜø!(:”` €.OŸcÜa†ä‰€ãN8¤@ÉÞ +ѨJàM‡¹Žöo?TÚ*ïds¤x‹« >Œ£Ò½nñ¹}Í ,I÷Àý4oÒvËÅ +AËãð ãªÒ\á)`П%Y^ì†rÌP{[ï£W§±-=yÀ‚‰}·kc¿»úôow¶hI^}“i±ÍifÏMƱV‚ÄÌŽâ­åÒg®€=N >("³·N@žëéŒ,ô0Šil.›U<8ûc[|ÑË1ö~Ë)k�3P^ ˆæ²Þ€ž›à’ê è2Nè5sWŒómAË“]V±YõÎñ­sÿ"Æ[YØjv¸Vv`o7î©gb*úA-’—%š53`ôDDQõ&�#quh¿Ôr‰­®=#í’æCß#šžÛ–Å:pfä—uv;á ‡àÜ>ôYMpF|­•uЃ~\Þî곊^€\H³I$3[îm#$ÕuŠø¦J¾å%ñíÍcJLϘ}J8� Øš«ÏÂÍÅb®æBN¯@§UM©ÉËòg&“I¯iµÀÅX(¾ÑŽ¦gDAªZ?Ga¼PËY¨¿`xØ?\Œ¥yxϼT‘LO*]Y¡qŽlÊÌ,b§¼ÓõæËe¤}ú¨Pqݱ9TÓ‡r§û‘ziaOv_ä +i$ò€nkN'ä®Fý+$–{œi"æMšU$Ìæuá?œ®}¦•Iä†ç4/ìÝ„ÿoû@DÐÅu'œ‘¦ZwÑ'8ˆ1.…·Á ˆÞLgCp¯+Ýô¬{LF)S±QH~¤rŽ÷\ø-¼EíPAÄD[ õøÔêq a€B6B³[ÝM—â“’>6ÇÄ4Õ]Žœl?ÀÛç‘(³THZ¹|îSG};GŸú¡£=úÙ®#¢=ïظÜhöj#Àé€&oåSÝ Ó­¿HäDÍûìC;zFãžÑtÊéà:2TÚ7ú’øcã¤^—3ÃÈÒnlLã0¸LtdÊ/“ù=lŽA‡ß>ixTWž\5ƒ-NzÂâA¨˜H p€›Åî"ÏT2–_³¡mÙ/bY—ýÍ3W@ñR j@ŸTé…¨îfw ¬CÊçP˜J«<öd«ORq|ƒF¡É„¦Ÿýe²J 6žNˆ(ËXcºxtu’™™r†Žœ!ìbG8/ªAVç0×8ìÏY5Ç]†ä+™XlmñçcªKULr>$F*íäÌ ”n‘Ð4ht7\q2$çØP.”þ) Çö§ÖŒe𙘰ãÌê’hoBõ>¸´ø­â3‹Qb;ª¬Åɤ?Š÷!;¼Rðè&Þ"±æÈ +±O +k¤îS$§¸GÀ|:D<¤Ææ·Š.Ó‰,§“•I··ûë�ÆpiM.VÂæ˜@£bVå¤tÂÉGäôÙ£_FÃʬÍù a°”BzüÕáP“ý˜±ØB{šN-eÝœÑ}°DuÐI/p¨Ói ËŸKãE%y/“ ;p)¾isÉfþ›U«ž¬ˆ‚v¼°ýˆIFps»¸D¯ef;‚èÉç%­g3B£Lº+NÇ.|Å$ö°Ÿ´ˆ]I¸ @òµ…M‰æ!Àû(¡{—A +ë:µjLÇD7ªÎ6‚•hS1>ª6l�²±¨„†A¹†óÙêÁ•²Cx8jÄ ²L€Æ{éà÷ŽÏW£Å2Ê”Ýhn%ï8%P¢ª9êàôyXƒE»£¥µXnëж)T@›Þ×=Q ù�Ö¶¹õeC‹¼¼*ySx{馋 TF724•âÊ:ÄŽ}³qHtã`¶;¾ ž +%‚ ô�¥-1ÛJK§4$ }¨ºˆKßNr€·tÖ +Ôhý7Ù†€Ìe‘á\;ä唧±‘Éx¿ßõ·OÉ—äÞ„ą̈ËíM!¥NØ̆Ów‡‚Äö|8“òòH<YÛUõÈØ’OŒlGsŠ1 ê:°ñ*ðÁ¡9…árQ§hJ/ŸHVÖõ‹ +>Ë\Ãv ò- å, +eÉf×ݹ,$lA'Îe²¢3²ZMI P 艵`ÆÈs$W¹Ã�SðNJ�ï2qù +!,£ò>koø=íxÜ*æ× ÅðÊ° *š¬µ?¨|ëÄHe… Ê«xŠ&±%ÒûrµGšÙK"j&xW*4,’ì”"¤ÕI0{K¾›EË—s­‘K~ÊK Ý©ðÈÁ£,’<_¶­Äè´{c9½ò2zC¡ªj®›˜Ö’(±]²9ˆÌÖ™àBÝO¾R …¨ps‚®~SMŸ)ShÁb:Õ}d©8çå´2¿'dÝÑɯ^Žn†iBÿî¡ÆÑ!†IŽ±az:–H;ûê;ÏíÁV |,ÍUh|ÝdnQ£­0!ô+,âw=‘pÔÏT¢fç¡lôךh>{rŸms.B9ì3ï-+2’;öÈ‹Q3Ó`‚†ÓQÁÙ™>¦' ÑAdésàHmÞœ×0¶E{õ1ü2š=:v‡ÌD}ïÝYÜøǪ†²#Ùëö8£ùÞ–);j’MT‰+¡ƒDЮpz¶ MH°Ú Ñ˜ë*€žL\g|ÒªŽZ€‚£µ„‡(Û$'@×þ|dž¥´ƒÞ¶¿DñcikzñÉG±ÎzÒvð‚v³ØÍsûl.ªxYyCßô­¯¿Oåæ?üÐ*7ïDžFmäÿiúŸí8i†äQcÍ«˜‡Ç]„’éÄJå~'ÅK)>óá�œ¥ÉÅåGæê,')ÖƒÈûÃc #A[•0‘O€Œ}ۆɞ´ANt!ðÝÏl“k!Çñ"s°Š:;_;‡J‹½ïÏìrØ «1ŒØvŠ÷ ¦·*³5?|oÏÝ0:шªÐl¾Gj!±¬ªNÍyÝÇq_œ±Þ¨–Øû±óÙ¡7×™á!^°¢+ÚL|ÉN´æƒ §°¡ƒê=Ød·ØŒP)nÈW ûjr ŸlƒÕÜœËMž|QÅ\^ŸQoïÉÄÞÝ;¢DE:Û´¾·Yȃ›½�®ñ™½R¾I^E–¾ öå+ +’Ÿ#ÉñöÝSÂf$*±œ]\•jçM£è÷tÒÏïpJµ+‚2ÑjHÖ·®A*ÙükLù8ã…lÈí“Å6V™‹×K$9A-6õj”ÐÊF¾`Fü&«*`#*üPu2ß·^n¨ËÚ/8Ø),]5|’^@…ܽ­»g§OUZàf<(鎒4¥ò”¿n5V £Rv gY?¢œáŠ + ³úHT£,‹Ô}‰BµA\dJ¡DݨÍ2÷IÇü–n…Žp;‹ºå%lô| Š®£¹*®F û<Ž¸ ÅN&©|0J*±mH¥ì +o>|+s¬d5I‚4„ðŠÆ{ ^ëÌŒ¡LĬ€ž°§*Cb^hƒ…Eß`~ÚïYÄ1#†˜Á:ð°Ï½zFt Óĉ½ƒâî?3:!]ì2±»÷¾_Z4'ß3†AU#`à` +t œÔõ±KÝÇÆX và†£6}u¹®êé¿\?ãïíóÊßùä “£]¹L#µÀ§ÑØbIŽ~m’Bb³Åg»Ü++HÖ…7\^uÙ¡ñ¬îÜAÏáóà:6»¢\yG!ŸxI¬$F Ì–Ïi€ïì!i#x˜M6ExË+\s^Xo9Fee Ž¬Óñx7ÁQ"ƒ²p%¹‚àƒ,üOÀ£,ßÊÉ1Ò!ß¼"yÙr1R'Yd%CÊ›úön¨Ó¶E?6gRüB„Õ¾ø•¸9ê\%ëM;Š¢Ö0ŽRl¢õ’Nß%m%£w(Hv¤­¾UôYhïeŠnkbŽ‚A¾Ô’ŵŦ÷ V ‚úåŒþ‚ýHÇÎJ…àbØ-ìÙ‘¶äܬ KîY£÷Câù¤øe‡PB7ß›ÏöO=èQvРly{»sú‡1Šì–hê¬Ó¡‹½-¼é ›ÔŸ«œõÆ’“ª7lÇ +¸dÙ¾}ô œy)0%k'ÕÝt¼ý<pÙÉe›{<ÌeÉS[ÓÞ›ØõSP$'½†4}B‡£¡2ߢ15츙UÌÇ5V,:5Ðr±±UEbù'r#ÌfÃp×€[ãˆã¶[„] D_p¯>ðQ‘=œL—™p_mÔÐI2o°€…Z÷EÃ&KGH€ ¾/2!J|mÖpr¢XQ4²~Ž6]ƒqp1"“ç¨Ô±/N›ïysŸ‹Q„Po_ªü·Ü&7ÆÉqyݤ ìsFÜ`‡òê„΄—öi“ÆËžÐSzfΉðvƒ`{ ‹þË™4”ß•v!}g$Õï2R@n—\Ö³1#0Ùò-ìv ÷ ã¢Ãvi5I D+±ËÒåÒv º6‘Û¼µ*ô”)³#¾Õ^‚¯À¸7d”£·½sst9ñU1g$v“ÓTÇ6¸£g¥»¶¦ídÙKt“èc.ÂtQr—(yɼ(úˆ]\TûÀ¸ÚÅ> EŠ–O¦ È‚À'ƒí_ç̼^lT g“`jŸ[3AË‹ŒRp.lþ'€˜Kä)¶„òÏô#üÞ¶#ñes6ìÌ™zWcŠÕv³s~ûÄÙ: ¦ýN*ê+ßÒå-ò¦*qÉá²yogêùÜ\½!BM—íõ4 |« K5Öóµþå5kú¶Ñ6›1yíÙûQ>]Çt¯)ö,|(`,×ÝÙ¿Þ†9X®‘7töcoÅH“ìˆQT­¦ã³n`Õ´u°úå—ÐC*sø3ô¬•éÜÂ/0ÖDÑp‡Â’ÉÄÿ$Ç£`ðÞçs@¶B¤j+Àsù ÞOX™Ž¾–¬09/·ŸêŽ-$ÑÆ!ÈæwbŒøD>l¡ÂŸÖÉž‡ró8Èè¢_´ÒùJ¯†øQ]ãEÕ˜y�š57+ò)ÀŠ= Ÿ‰Š ,Ss¿³‹¤ûbã ~.Ƕ¸l`N`&Ö†ºöèщgc¥¦ —õÐú44&'ë5·v§ÇèÒÃ.çÛ¢p|Ýoò?3•@Ä-^t1WÔIF&Ô‚¯à¥3‚ú–Ï91«ôÈv %êœÎ7é%d‹íê+^.H7& …~#]@Ä;0áŠ`’õD!ŠŸ24ç(þ¡EB2ŠÅ¸vPáå¤+ÛN¥&o5"*Ã~å  ^6W5@ÏíWkco¡áX[Ã_4@#ñ•ï =àÁÈÝ–DšWãØ(H„\–¾OÖ¢ÓrÏtau£»Ð—l²PŽæ¼€Éºˆ¸"jgtâÄc"e–²AgȤÚÔÞ쀑tJ2¡¸‰ŠÒ²ŠùêkAEÑ�DÕÜ¢£RàÂ^œm;hÒ9Û†yõ¦…£ihËŠÃíœwk^^ÓZ\Ä5ˆš#¡u¥£ æô¨÷ßÓïí•|úÃ÷JÞI_ñ÷*tŠ¥19ã÷l +S€D*fù +øa 5ƒm±² Wç1„€AâQ#¯ä¹ÕÉÁuà$# ÒY�öÀø?*á6:âˆo®Ç8ee=Æɲ)S÷©(l)“±S'tJ¥© {S6Bá#†Ç–-Î-.V–DˆØ}²å®9d>¿s3Ò0íƒ CÓfgâŒ4”õkìG;´ž’["÷TNÔŒ¨7¦°]ÑŠnÕ;N¬Yw+QØh\Îüï®k-gÛ|«WŽPž[Æ,¾¤ +…@ÇåÈŒ šÑŠzeŒÕfk-£œGaØE?>é”2úEe껸ÎédX01؄нÚ.¼¯˜"›#ˆ:+wõ‰ D¨6.••d€¢ÎÉvƘ [RüfÀòI1úWÖ°S Þlx§ÓµòúV„¸~—çF]ڰ±—wJû½÷v +óðNAGW_•®;úóCDi÷®ê$…j>¯ %&VèU×q˜¹÷Ñ.”ǃ§Á§ '*�Pî þv /ý½ÕœBKëÝ�»ì¥�Þ+ƒ>±Çœ§ääèò º•l ü;tä5H(ð(Ú+÷~©QAÓ±rûø²5žžÎž»´\â(Ÿ{Å'E¾bÛOV¤†ûU’ƒúCQôЂ{/P’6ãUÎFÖ#3%”­GUÚÒ0‰ñSaãŸ%–êåÉåÈiRt¨µæ겚KS ïý:õÒô#t<æ¬gÁåáakõvãhOP‰rÿx{féç@Ua‹˜O´÷Í@!MšN¬¥BÏ„`k„/ÏWf›:Ó@l~³œûÉt™ÁzBàMR>´ÇTéX«Ëy~¼7ïx*hâmïÕ{?_—I0ùù¢Fš\ƒS²a—êRULq1µ1†µ­Ü±³ó|µuKæ´r¨ËLÉæÒtÃe DÆöä£!xê³ÍC§.íÆþ Òzíœ9·?$Yõ®E~jþq‘"@­@Ü(…¼ÇdžÛ×GT–7ËN¸·ú¹;÷<yª² ŒGO¯^öRå +¶pO‚"Ó/ÇŸr(en÷hÉ´° >ª„*ˆ§[ŠÊ®è* U$ÜÏ!3w/dmïíߊ +¶ªXgUÈŒ‚(d…S£qNjÄR€þÓƒ®QAb̾ }ÛÁ(“Ãò© "•'†êúLÍÎ êsДÃ=eÝgeqnÛÐÜÖ¹#wçb@â™Ýah¯Ï<t +ñ‡¯ò9¾ašâŒ†C†½gŒM∱£]V\gIï +•óʾpÔd‚”‡´P|K”RÄÉÄŽª ÿøÒn}â–¬Úª›ÿt—0€8§~Ü+‚t‚»E¥¡S½»°‡»ð{›ç8±ù[b~30¿ŠýýÕþl¼ûÉŸ¿ûÅÿ£G¼}.XaóÀú×9}þ~ó«ŸÿÛû_~ý Ÿ}ùëú M?ù_~ñÛ?ÿQz÷©üÒ/þõGö;ý¿¿øüïÿû€œÞý§Ûûo¶}×ÞýÍ»ÿþ?Ò»_Ýþú?“÷k«fT¾Jìsö)ˆ‘=D†Ý‚Š;{X'nÛ™ó´“j­r¡v�[ôëx¡‚ ë‚ÙSÆ‚Q0ZØ7#š J+oMÎK%•CÚ ÄIÌ'–½|Èɉ핒éŒx:%]ÉOLßµ¬ôÌ"b‡"8^¼6´Ø²qBäá Swz! J†^]–N¼‰i×á×PoÑ»ƒô®(Á†lÙÈ“¹íp/¬·†$íâhbáT”ª;ò˜í’n of‚yt‚Tî ]ÇôJÅWÀ$Gë�KEƒ ‡é³C3XÆ´š:fLb@L€pȯ #¼êH|â D¸âßÒ¼ž­rW‡|»“Samó¦.´T º’e³ýê5½<½æ™ ÿB;prRM%’\2¬B¨/ô³Ð/«É³×CKhŽ&ÛœÕ-|z0†¡¾l­ÃgúcÈh*-‹åå %N®ðÝîåÀ~´ê±¶vIrdÆæÅ=ýdþ8ƒ­a$T9öv?Í° $³·°)=‹ZMÎHž5Ù'ZÞK)RF8ž=8Ÿ|È:QüwÙÜY »côIN8©æl°‘Ó½("yTq–™1ð¢ÍäÅ5ªº&CqzJ`ž3ÁjD69µÅ±aA¥æé£*P=3¦UÁj¢Dd“$UON!¿^"¼½'@ +(hãŃÛʺ°“™%çÔV¾0#ý’"·(Peöf†æí$$â!«Ïî=9èY£=âð-íá³;Qù¬¬j<fI.>e_+¡pjgm–E½MÐÂ>MSñëHÍt)ìl]=Â6º›~3òý)'û…¨kΉ\ù®^X–»}ûL +€ÝØÒJÎ0Vb»¥ÑÚðþ0AÙ+'\ŠÏ^ MygðÍžË:êw)Zo2@`óä8Ç©q\™e*1"a†ºÃ +˜9HþD„€o6ç6;õd‘tÖ9 ÄýÌ–&…¤!š7ûI,C,ÎÉoèÎÙ›¤}:îY +ëú²ð íìjÉØXqa›ÿ’TzC¤VZ—ìµïâlFÞk‘@Æ i³'«1ÃÈ.n\ÓDÿ[gŸÙ+Ó�Ë Q2ñB»rŒ"€Z®ŠÛˆ«‚‘­9¸Ê¥Öì•RšHæ{ûm2ýmNΆ$ávXÿ•¤`8>†óhBÜS»aìÖo%Þž64NÇÅu¬´ˆ³‡ _v«RÀX)ºº†jÉ þdyo'ØÒêx +ãP›æZÏì5‘ÔÓ´B^hÆ>%izÉ.t^ŒÂÒ»S*u'¤ùéwÌ#›³ùzÛG%oÚöû®S¬F6ÚñJ ããªEvpÅÎ ¶u•L«lç}˜XGµóÅßV»íÒåBÚ(…‰ÏêÐU—Þ #§íßñ*kO~0¹™t× »©NðN• ä™~ +.tcXñ…vtÙÅâËq<éõÔMÌnyø.BÍÙdGDÔ¡sTMÐeœ"˺ïªQw9wSÝö iK‡ ²ÎîªQGX¡ÚÉ®‹ Ýæ8×PÖm÷?Öåûú¹W:+{†`ζ¿{3ƒÐEW_³ç!´õ[Ë…dϬÎVVÐ/ã™Í§¤U#9ÕD~aIÚfyõœ!Ä){Úô i³y]A‹¾+6S†¾¤Q—ñD½ºÄ‘*ø¨I› ¾/‚Ø{r +Ø[dƒƒ‰™ØlâéµuÇ9obG’`î¼Ð¾Gif')ŽŠÀÚ-–)O†ÝÎ`Zèéµò=ÌêPŒ„n°ü5œôK——DŒ*(â•î®E›¡ã}Ùã,e®Ïfg7sæÞž&v4¥‰Ü8R¸Ç€ˆƒÒªâ;ð>p6Sªr©óÈ䟡“žÇ…»×†ØƒLkÄ!Æc^\™^SÔ¯GÙ6_!÷R]ª—¦ç¶BQ&w6¹R~VÑ;dЕdž«’;C‡ÀÖ¶Sh¾«êÁ‰·G±}/´[ã@/ÚS“\í]/N fCXÕŒ3†“M ì=¬¥{»~´TÔb@6Hf€Ìm¡¶"vV¬”!À.Ny‰HHfl£ú[Ë{—JF“õàf,“/´6EÞv‚ µçPñ ’RÛ–ñ½YàŒ¼{4= ÷_£È»T‚"÷ñ˜œdW _ÇKt*6ì>”Õ�ìc +´°ŠÒë®çÊ[Áö�yV6l…ý€*`•4T[µŸ¼H��®l „¿ê + ˜xŽª/¥îm+I%·Ÿ®8ýÚ ãªnýR0˜ôª îkøð¢öñçŠòf€ƒJ´Ô‚¬Î `@YD±ÇzF²Õv@ß�¦ÖM1ñܦw2em™òG¨í«îÄ2Ò£ æDYÙ° Ò§D^90aBªhàKÎ(zöÅÑHIʤҼ<Ô„Lk— –ê ¨]‹5Ò°B÷ŸƒˆÆ íÀß—º®Ñ\k-’¼š¶˜*|õ:'nOòCºÈøµdëÛOêc®á%?Î1.“ õzfp O´æ$ÑueN']Z®_¶¬‡•R(OƒÕÓXÀ›Ðš®Ô¬=œyHIqÚb8o†väHó9Ññ—«ðx\+9~ã©ùÞl·xa˜Ü…ÍõGuŠzÌÖ<½UIþ}¥ø¿< ïþò¿|ýÍϾ|ýú·¿úòWV`º’¡íÊ%Î ÿ„õö¢ËDÈÍ~»[R=lïþòg_~ñÕß|ñÍoÿéÿ“?÷“çOÿú?þö‹_ýÓ—¿ùæ¿ýÃ׿}oÿŽåûw?ùôW_ÿòËÏ?ýëýùíì~þÍ¿}õåçqJ÷ð¥¬EýÏ~ù£?+ï~ò·¿ùÍïoçùk,ÿ®ü¹œ`ðBz÷t 2¥ÞqóUV‹·ÿÿÙ¯eÏ>;Zùݧÿ"ÿÿ§Ü¤oÙ*fµôž¤mCZ猠ß[gnçͤW§2ÁMI©ÒYA"­Âe<kÕ¯Ž~Î$ÿª*l*‰cVC0„ &笸2H;xá-"#—Pl“‚`3&¹»¯v×ów¸ëßõÍ‘'ÓÞ ç0„ËCbØ*ЗÛ5‘{Ê$ß¿íF²÷×dš¿¸=¢š¤³%!LP* òð·«ÑíîÝÏ^¿÷Ï~ö-öö²LËW­v'^ø3âäUü?Ÿæ>Í¿ø`ÛîÿÜt=Äǯþ=kÌ.âmgò!Ïó†—zÓýß÷è(ßt©oúž7½Ô›ÎìMÏ÷'´ûI—‚/‘rmýÁÍï§ì‘Ü¢?TÏoïÊ{fN˜Y¤ìí‡Cf°²&2Ç1Á}e +ù' U÷$Þ*1|d�l©<ÄÀ£‚Y72?"$CÈÚ•¿œ]ÁÌJ½%óýÞäoÈÛI©9Zm7xãúÿà†÷p£¿Ï~WR„*?{«‹ŠYÜN³È©5ö[·cdÉné«ìweMä_·>QY¿Ç?^Y ;å Þbxç{þîgßöwç-éòU6$Óü“Üñ¾ëçø§´á}ç{óÆ~W«Õý¡Üñžö46ø«uþûݪØÚfà±°giõ¼ö;ª Ì`JÜÎ.©ƒ‘ äÕǬµ +L§¿©,¾•ZÁ–gñZVÈVfñ W§ø6îy}“ÒU«Çûð§¶çeÅ~Uy“tüûÛnz]J lÍ“Œ"ZrŽ9 2[ठKvîÅa•«@CDo9ÌŽÍB£P‡´jFu´¤° ƒÓ+§‰3|åÙÑceP^”fm±i:Pþõœ©’\Ì( Ò29óá>|‹íïþžŸýï)Ëû<n¡®NþùgòO T3IÁÒH˜åP|ƒlO¥ ú3Ö$ ÷[løø·£H}Vê¹e@-Kv¡ï÷«Ÿ}Û_5æÒÉ¢ÓB’ù'¸÷}ÇÏòOkóû®7ça÷Û$Ï\ËtaÞ³o JiÀbZQ;©±É™ ùïÕbñ|L(³Z#°Lå´èd¯‘8NîÈnt°¯,a…ÕI`x™î˜-n®332­Þ(^DB$´j•b ;åî>|ëÝï»?ÜcçXβq»¾r M®EE€ýgšfZ@JààéV‰Â­+ÝSðTpŸŸvç­€Á®Ë:Š|µ(ÐGÙ¬3G×Óšh*PB•Á¤´ÒŒM_"¯b€(½äABЇûðwŽ&|»|ó—hÜ¿ùOUµÝÛ;þ³üðÖðŸvG–†<½ÚP¯n +y ú³¼ã?ßøÃ.[¨vW*:jº%|ŸŸüìÛýäΓPC•°ù;ïßýEý–¾ô»/ü·Vþ‡Õÿ__|óú÷ÿù7_ÿó—oÀë“êáÆAŒüî?p/tüo`îõ½%®cy¨¿=nqùí|~þǼ֗úõ?~óËß}õË7.3†ìòÍß<½§ Y¢ºÅû{ûp@‹Œ¼öÆÁKpIio¶z_YzãàXVKŠûθŒ áõþŽÌXv»Nòq0>Ó»I4wجª5—EÄgaV<~îb<Îí°Ç…ËÆ%çp¹?oËÆm?ŒxFç ÃÓ®Ìe…¼¬—»s€ñᎃcYã·û›£ͧmߺ®šl0âz +0:Ržö—û×'9Þˆø¹ÃxžÚaŽË8V >NárwÞ>8–›þø™ÏÎpBw3`�» +`•Þ?Úskrä8cñ>µ*š§z6^šA¶awØøØk^Ѻ‡ ZÆÏ]ŒznþÝÙ_îíÍT¸¯?×>¦á8µvŒ†WbæšyÕ±BÜžã§îåóîñ‹>{Øs±»¶üî_ÌŠ/y²Ù Ä”¯!¤0H¥Ñ£ß}‰ »ßýÕv¾.¢ò¼œkçÏ]Œë¼ùWó˽ùæÊ"lÚhüõÌ`t°¯váeÇ"Ç ŠŸ{¸™ÏoßãD0ò5ÔtûçooÿK˜„+_§$[9‹%É2“¸ïnUei†<³ÑKS‚)¨~1u…vÖ¨âT”¸@�EBãhîU ©â|wbÌÓ‚ëv»!…š/Ùî™*ÍÈÒ´YT�â“a,[GdŒ +NØtZª K| ÚRX+ ’˦jv•…¹‘†Ñ2 +3‡1ìNû°»ƒÅø±È êØø9¥ûㄯž›Ýn¯Õ8®ååÎ×-±R2ÐtÜ ™i½ÜßLãž×¯âgÞÊ%¡ŠœTÏÓ¡5;iQ…Ïÿåj·W…gvËÇùJFM\˜¿~žìö"J·DÉXê«·’Ö‡j\Ù7Ô„Ãâfì&žæµ¾]¤('öů¶B=eä AÚ¬­ Y_ÝϤT¯ËDL3c3]‘7?"Û•¿Àˆá¶Gdž«šïY¼¥Ìòþt‘ è.Un“+]`±-_Îد¬b6ú<Xˆë5Ï9—•â´MQ_t#ÏíiûïäÿÑ¥HmçCNåÇŸÛmÚÙžµLi'œµ#b܆ÕMÎËØ{¬ÀZÐÆdSÏ\bøM_ÆÿÌ7BKàØ?jýîÁ}RF�„òã9N°4Ï–¼p%{ à´fc„£ò­ϸ­“‚ÃZì/ñoº9L›Ÿd0œ>7n0¹öÓÈÅÅÏŒ:ŽÃÅ•ƒja\ÈzÂãò‹ªŒÒëq~¾øä}á5½<ü›ãˆ¾¥Â²Ï›%FKîîíTÎv}:§§¤>ÇCW™>Ýp²¶†tI{9Þ‹—ÇS­Úf?9§µ«ý} ­9¾¯\b€ëB¾ä1gë·ë7_\÷E�ЕÏÂÑaÂQº†b®2edw’rÓ6>mÛ×’ÏB|F_Cª«]ßBs­×—!‰ôæ—¦k|xÊÿ³xÊÿÇŸ[ðýãÏ×Å;l#-T˜,sYá”ÿ²p^CÆ¡Þ?þ›dL«fĤ»À…IÎ4¸5Óø/*hÒÏÃ7¾UYØg …a¡úÀ†y~»ÿ=2ì Zr6ä~qbêÃXMýx øo ·ŒÝ +¸pÀûÃBààÆãRF4ŽÃ…‰´qÜ€tªsÐ:yáUÞÒÛÌÎýü¸ÏÍ…Ëx•~h&¼®õ/Ú°´t–b<ªÕbÌw¡ïT›ys·úè½êC;ÕÇïS¿K}húèêCûÓGïNÚ›>~gúø}éC»ÒGïI¿#}ü~ôñ»Ñÿ¾½h)ï2¿ ÛÐ’Ž×…–èë¥ÃÛȼåöŽY=éZ.<ÉWûÆt¶ò†úUG¡ð:û*Ö \Ò8ò-FÊo)窯�ÊSæ|w7i}gwv‰;U͵(ÃJo±püƒo{0Zßc’IÉ+½+÷«ÇJÛV{ã (Þ â©3&ßm¾2½¯¯ U.{ãóêÙÑ8´ìeØ$æ6zo•Í!í:y³*‰¦§>ë[LaX™ÓNyÓètŽ¢Õ l5bŸ)sp®{a«“rk ¦bÙ[š¾£$i„›úvSæJ¾E “<ÂSsøpçÉ(É©Öl.Â5‚;CZU¶›è"'b.ÛÍáL4S .JƼC<T85 +ºMô«N¸ÞX}=X©-5WÆ b/¸3ÚZæÈÔtLJó^1‚„x›Hšûkåu†½ºNø¤ŽSLOWΚÆ1ï+ô¼€l-)¶ 0| ³ÕçÕññöìDyÊÝ¿±Ë‘Ÿaºl/¥Ì!²¥}ÖØná¸2TêŇô ½=:–g+ÇIX•Õ-™ÀXR—:¼ läÎÜpotÛѬ¯œÆܘ£5ݲâC·`¼XÖ½ö\~õ…šÃŸe*P’þWŒÅ¥‰ÛÁÀ 2Li(³e-„L Å:RNªÑ`͈±B7ÎN›E‡ÈÙ€ë«9[¢“תT…k;â´Ó·G#sC™œÞðVjáS`x骪¬—ÆÈöqzãeä­K£÷FE)=ÅpÔLjÜÆAµ>Ü—è7çÞ¨Õ\hçÀîÍëÂÆ{ÅOpK]±Àôð2cΤ3špF¹g¦J¦!¤‘BìçvêÊà¤L]áÀh·&'– +†ry#J®p÷NQ—(à#O§»KÒÑB3¶ses²™MP è$u„S m<̾BWÃ]RaA w0L‡h‡fhQu¹®v¸¤Fð–œ(˜<B =‰‹A…ŒF_AåÎ,­Þ³¶J{UV+1¬©M«|z¤R¨»dîDÆž?vÕý3£¢?`,G™|übߎA\®ø1ÀGßr8¤nIþ±èi:ú2D…—'oç¸a/N +œÐöAi%Oâ=Ö§}›V(_ƒr·ï¥ûQ +3 b$…Ôë\A©`×9S%ECZ /ÅÄíP£¹¡ 6x1hfuØFhÈ”"¶¦ÃøV?ˆÐ¨s²EÅë‹Gg•\‹õànDNf<°¯ *úÁ)7ý0U ÉÀíy0“SnýŽo¹Íˆš´‘ËG¯ÕÓ4Ó¿“Ь•R·~Xjlýàê,ú^«½»Æ‹1þªãY΢fÊ�Í‹¶BÙÔ!’XW½‘ÆlÉ5¤p“6¼Q 1=ùŽÓFYƒd‚âÊFI"A¨vR3Uïä¡–Àg¨öä¹™êêÙ‚OU£ÑºÈ½s¬`ü–'ŸQErײ»ŠQoë ¶ƒ:]™Ø3vB°ÈhYª™±ð›u×e›ŽÖ™(÷%¶ÕÞ\Èt09 …´7?4eŽ +o„TyS0ÜQé88mÜn/o¡?«+ÜHƒçr/¡à[®2¼¥¿–KQפVþ &Òt¾Ž™\`²8ñk9ü‘é,‰“$…?ܹ´6Ã¥5@.%�¯›¦ˆ48Úb¬¶ +å±Ë>Ø·—#ù]#k‘ÎMØÔù‹·ˆ-R%%› ^RÊà'ëu¯$0ªÈ<Äxö"…]_3I!à¡‚€Bñbº ©H´-¼ïÊ÷ì+(ÀÓìúÙd÷S¤(äV6IöŨ¿¯@ jÐZHuD£iý@ Á&ÚÖY ÒÜ%£$g×Ò?÷AAð+[ ß6—”i¹bµ ófD<}lvÆõA# +mÛ -RuŠµGx¤eÏœ",{›àôé¸CRBåe¼7ƒ¡I.Þš^*ccÑ{+(Ûp'+Ãåßždö˜±í^˜P¸V_AYPô¹×ÊS«¡ 免<dq5vånÂ7è°UÆqb +Å“FѾПRæætx“dT˜b'GÊt¢„솖ÜF¦1)Ø®TöÓ•~:òˆdˆxh…šŸº‹Dâ½(xé‚ŒBAJZÇšqÕ»Mgä™+håÉìäG‰, +ù¬GÏÞ¨*l]Ò>Í£W¸£al½vá²¼§›iÐeñQ“CD}$*-€^Po~ÏáªA#”9zsÈè(®ØGKnñ C´Ðä+ ,k!e´9bø—9(üú²x´»Ý¢×`Ð.ƒ!šÁÉ)5E²¥÷V0åíCe¢›RSŸnl ÆÒŽsPWh‰X³Wd/ ÷qƒT¿åÜò1¡‚’]dìv?àzêØœt¾%$4Úeìëb÷Fˆ­M¥(Á­¯¨evž¤h=õ‰Ã?Å”;<UÙH=.¡ÊˆîŒËPÚ9JÍbÞÀòuHƒ¶à ÓÛð&¨­eW¡œØè¬H¢(´II”ƒGN23SÞ ýWÑáp)ó¡ +''‹À¸ûžJØš É}Õ]•æk2ƒ3Bs Zg>øöÚ®`?¼5¨ÔK¡’ ßc9Ò½˜Ö»-ÌzaÊ¡¤Ïfœ3áÈ<Žèø¶•\´Y¿ä Û$®Ò¢$l§/ªNÆÝžìö:#9Ý!;pçXo4ÌI§ë”ÌÓ5ä¾Å†ÉÜEUì®|.` c¦Ï_Î=0x6²‹o©äB3�+…öÄÔØ)ª3 +Ô8úáº3ÊÅžÓöÖ¥¤5y!àqôV6jb º‹Ç•‚ÈZÆ58ØŒ{²¸À›²5DAª+㮄äpÚԢ«˜²ì×6Ëæ4R¶XîXa¢D¢ÜTv ¤jƒäZ,Cη,wsw„À@#Õ¨dC¬)9ñ‚úg3ŽyŒ½Ž¶öÜ"–ŠFÓ«σwH÷»‚’ÐXíÀwÏ1qpÞƒRϪ¬'Vw ë˜2IÉU,á;t4Z‚?Z¨úI¶d+hèZ}àöªó wÒtn]Ü=aÆÌLZçŽ�I'l@vR·÷9°mpXªÌŽ1WMWS(¬’n¨Ï¸C"õA·€ÁnC3•(•¼-ÌfuÆH,¶3<ŠGª‹öB3ʽwÎ¥ŠQsr3:ã´–l&Üײ@kJt¶½./s¥³~ÃùR lÔ(.Un½?Õ/Ç ‘ª9&ŠšKMÜR¨’{Es˜rŽ-‹ºÔ£ §dmw †”U—”*Ù¯¤–üžf@Õ•VbÑû$“O]¡ü#‘š©%)‡näkÓ¤j;· #aü×u®M-i£"¸oáH¬0j¡™âÌûäÍ5UE3Ê„N¤y–‚9[¸ç&¾2ˆB¾²ëÃi;í*´@lóÊñÉÝv…C©Ùª³’À h*΀šM½æXaÀ%¹ª$‹. ¬€ +GÎ�\*oº·sÁd(©Ñ <Mš®c¦A¤U3Jàî‰0JQ,”v1ž>u>ä Ü¢›ÓÙ1 ý%óŠ 4Ä8y»„3å"3‘µÁ †¸yƒ‰ÂR¨ÙIÕ2þ^G€c¯ƒÚ§«Ï�R!A"i3Õjß·¤$V˜­âÉ—=(qÛÙC³í"®l¿Ãž°»$U‹¶ ‘%øq{Ó-FÚV·KªozwñvµƒÛGd£<ÄI&y.„}² 3Éê”ü€U$|±~“Ò1�¬áÓÝ'Òc*^kK+ V +K³Ð-²å Óî“wi¬&E;‰`oÑdÊ0Öæ€Ø«9<’¹¤a2ò·ÏÛ}RwµjÐr»Sâ†ÊÄf´W¶«2±“Ç2<ì'ýTíSÿÓ8¥¾M•MÛD.V»Û QvqwJETáÇÂ` ýâ nW Ó–îŸtû ÄéÝ8ĵX³Èª\¦f4ezÍ òéÕÌË«^M6÷DÞáŽFaÆãSãêç +£#3ak]™:c´ e“m>i²¤Èq굞2V§÷˜ÔɃ6-ѺOº½6,C‘D/±®# $WoÃ~*«¿Å7Üà!Ý©>©²»O7#5³Ÿ¤¨û$­»èsWEL¦&˜kE|áÜÁ2šMnNÐ-Çe$“wUc)Ç +i›“îk ÛšYR[ž¶Í©ÒDšËå£ñ¿œ@œè$ÿR¤Š²¦ªu¥ü8•+ÔUÙ4Nö„FO÷ìw¢+i¶³íŸ‘LÝ>ÁTè|êLði«ÒÖM²D^•>Ί J¾˜0“––ê•îìÜþ²A¹CSÒ:Ä4»*‚tt£Ëᑦy$©&ÝÞ‰rz$ˆŠ?KÃ9N:çÛÄÞ|ßH/$ˉ 4ñâ@¢œ+öUQ”¾E³›aœ½’•ü*ÆÚÀΕý—Ód(x%Ä`v¾*d/ã ˆQs[‡ `Ú^âô1‰ ì  O1ã“0‚­9ˆ.ù +cv¸¶a6$e~«¤ì4&K(&àÌ!Ï”óm…Œåd^1„”ù)GMzÈÿ*æ t„Þü‘uaÔs4€MœÆ¼É<ÈùÒà±®¡+e—‰ÈK#SóGu,üÔÜÇ;l]õˆàlWwd×p°ÝÞ;ëÿÉ`ͱB¢E.˜é¯†'F¤Þœæ^ŒÀC@Ë]3Ýl Ó0–ÞXr*±Âd½iø£;‡¶ëåI­ØÛgÖ›‹mÍŽLîD}J•N[\:5¯îWí«�O"0ú¶Ë€X©–ÝAU#_§¶iꆟéOXî—&JÅ®h8$ƒ hšá]êºuCfFÀ‹šÏ‘{.T5vA¼T—Œ¸YŒQÌÔ) 2ÈtßDò+ðN>:—ðHÝpHBjù‰lqî„=©ƒeYqRîJô8+t–ÄN‡ˆ²r'Ù_¤+bŸEé²ý ׶bŸá”àÄØ=ÊÖ(m“Éz;È@YÌùÄð+ú²Í•áլ͊Ÿ +SøÁšY™a»mrûÕ>ƒ/` +_jG5UŒ;&Òpc½j’Æ +­ BT[Nû?BK²×†Ió€WÞH´ÄÖzÒ–úà9Y¹À\Ï-Þ0 +€+$€5;Y…x5ê™^×.Hδ íï°‰Ã'® +$±vOÕ->+÷H ¢š¼Åä -¡-™Æ¼Y&×>¼A¶0å_ñý”9^F*@Ú&2b¢9›ÖÀ9QŒǪŠ˜ÑÇ33»}Lß)Xvpþ‹²mV/±Y=Nµu‚N|B&Âì(DhÍi‚#õŸà&~iãìÔåT`¯è~+r`áV=œ'Ô–¬S7.¸òyD«8’éZ£öÒRiƒ¶U—{ŒáÚ}DÍÂ_뜯¼s-‡;2’þ£‹’Ìአi ,{Û¿YØn`*žD>yÕL…çç¬Ì2ÇȺ0ØÛÁ’0®›V–N&žcÆƦdÙ§ÿý-•'oLuùôÛv„ygw“â„fVôÈ$ê$â]Ú^üHñy Ô«s_ÎûÔ­›iq_ξ¦~‡³Ûm0 ©±…ìðÆ*ž´25™˜Å°ò±y_ja,cwpw¤ZÉ° WMÇ1KrŠ>íl¨;9¨¥ø´ió”À[2šW.d$™™Y˜·vrˆ/∕:¤ ‡”¨KÙ8Á½:k 8$’0k?k#zt“b;‡yûuzí'š +A‡X šF=›È¨GYºeB´ãaƹ‰íRöÐñ-Ó@æÙ=€ö§2õšCš#c¼AhRS¸ï*<Ô’¦«j'ÿ B™:¾*O}¥¼X2ù„2õÁï5*ã%Oè…9¬qB%IóŽVOš’°rJ…¢äUæ;X×”ÊÀÓbJ÷Hô4HœÅrðç†Pßy—Ã%I¥ž¤õF—$Ê= 4J³ì.‰ãGû†–…Tš1= Òåàλ…†’¶.�9y©äl_•ÓdÙQÜ#ÝÖ@Í»%5&²q’”r²# ËéX¹_.éB©nÅ©"9ËËý\™­=lËóQ·§�‚£FÕ…¢1CPhaZ6†¢ÏëOcá3Dt¨ÄƒSyû˜sºý]·Âø¶ˆÂš5gÄu$Äþäy5’<H—öl p<O{ú +LÙ ¯•êTŽœ6ªFŸ-AÛÉç(Œºá´ëäþEüê¡ÍÍ·fVÖmP\¹‡}ÅäÞ+’áG®Å>;®qWIûÈöL“SKJÁˆ7çl71Š•z(ÂÇqM¥Bªå,uuÊ/n—š@ëþÊ·Ã •ÖUÅ"XÚ®#8¼,ÇŠ³φ¿JǘƒËÎ$Ä2ïvDdoð,Û0)±§ô +ª˜*:€Ëzä»ÐñUc9ò4 +Vn{Qí5ÔÝÅ~m,âáîJx¡aÓÓM†ØÚ8§×d„`â’ä‚2بfÄ #l"‘ÑHd/ÍÔ +Ï¡b¦“f¦ÇªmrYÍuPLkXÒ±˜õ°0°4jP­„ÊëÝܸ¡V5ûQ /œ;(ôa­²MªÅf©fX}Ç_£ª+/ZÞ \ÚnÉ‘`*€h¶µÎñÇ›5.Ô¡«Ö1=¢ ˜‰a¶ƒâq5Ççlß°jÅÛ!(‚û(n\.È õ!-Éj@“‡a69˜zi 1uOT '‚K'Æ7{hü®�'ªNZS•¬P¶Wߊ3 9T7Õ5¸.ÛÑ©PŠ3;¡ŒÅ»P©sO¤ÿÙÜ8Wh NK˜‘Õõd²Äv¶ú^c¥®*Ò©]‰Iš*ÌëFIH�¬íP sgD¸4 +³Ã)MÁY%£5gƒ jŒ^ÿ°ÿ¥öÙ|z-çÁ(`z¯ß0XJ7=æ:÷“8BU8#;‰1yš·[a +C©:YB—Z @)æºx•ÞèαÞÈ�HÚ`k2ó}p¬m+"K|ÄôšÜþ ­3>ÀE=#Q­ŒÏÆ&ü1E.þ¬6T}6yie€¹`/aâ,ÆÁIïcbi”b G&I2Ú;ð¾è0 Û‡·ƒilx[+Lg�P©r¥Ó'0f†¬ºèQLÇØk±ïœOŒ„ëè\ðTõÀtJåvaÿW„¡9 =Iöàº-Íšlú=ëÐÌ«ßÈeqܲ=7KMÕM„Ö£6·Õ¨í÷J·D©^Ã9Hmx%6H¤;çf1h±ý-L‡_#•’y%”­µú¯42¼’@÷Ü)Íe$xVf¼åwðØ£L&oVÂ[¾ç8ê>V]T;ÑÑú_+÷wJÛPäùˆr†Sº½È€Lƒ&JÞkVÉ]O·wJu’¢£xß‘êøÒp€¶0õåã�Dv›Ó3‹_ƒ…•Š=‚¦‰#•Z>\Rf™Š=Ùéìó²óh¨€Ï×IÓ·ƒ{-ÎÕX´Ð¥=æît]F‘'ÆKÕÒ¹Âr¨É˜HxþÅ;ï.É:kêRΧC¢‹¯Æêì¤+‘GíG¡Ëª¶É+I–ï3jÈ•e0™Ú`xS¸ƒÌKû0ÆMõôhe£¯º’—®´†´Lû³xé©rÚcJBjé)Ö91ÖÞm<Ñ6VP¹(Þ™U‰u£ÎI ‰}ºCÖ̈¨ ­G +àÆÀ‰œ‚Á Ea"ŸRR+ü:©I*î· ø£6ÊáJëì¸ÍDnîíBÔã$e·¯�Y–êVâÜ&OkvÜué¢Õ”öf¥€DÛ²°ðG8X†¼�›ÒB”ÄXU[­¢•�Ôp‡´küÈ«Lճೊ7ÅíÕ¾e$K¡Gš­Æz¨£¤ê¼‹Å  Qö™ =·Å®~tM÷¬Ýx7ï†ÌN]“¯`ãÂÚªer+O3cb€¤ä‚Iš”R×Q$w(Íà¿bGWV\’T +ÕHEqIÝ"”zô›%x‚lÕT)“ä[¬’ dD—.ií.búü›ºgxOB™F]/Æ$òN.ÀVT6}g >¸ë>¸–ÃÙ¼ˆz%™ë<9hÛÂŒàuewGµLx§-6‘¯Æµu@éV +ÚfÔ¼‚ƒfàÌU/g#‰=ät +±Ub <eu?-î}Bjx³Íò+úM â맥øoÄ¡H1Ž â ýBÜ™èD¾=5e?¸#☸9pä‘26ŒHŸBÍ«\†S_Hì òÉimÈW¿Ö‘—ž"ƒpLÝC©¤î2˜§¡)];wêX醽:ѱÛ&É?0€j”Šœ¿Â+‹ýøÞLÃA‹\™%ÝÔ*’Ñ è€éM`æ¯_vÅÍdǺZPf÷{¦K²äÏI£bW/U7q¬Ðœ­T~®evà–'l݉؎á%±™V›»q <¹0›­À'éìâ‘ni÷ßT£Sï«tÖF=0Ó¢qœ@Uzá¿è· Ü«ü(ÞæÏ®¢§ÙÉñ,;õ8–OôÞÒ2©t‡3Úߌû˜1²£ûqA#CÚ뉱ûà[dá‘Ž±Õzίe”Vg Õ´÷´/”zÐgÆ/€xo`ÐŒ¹Ñ-ƒåÆä%vÌ-«˜d‡qŸ»ÂüŒ×IRÍ"z‚IÅ$T2Ð�D›Œ˜÷Qþ/V$¼Þ A­/2ñSÍ^2Ä7ûð(†«RïCØNC‘ÁH¼¶¯ÐöïSKrÈùºK!jì—ÐéwÕ' o;"¤\ŽqXÓÂÐO¿xÍHS4YÚ…¤†ÖŒ±PÊY$7ÛY:&xƒÙ®N<±*Ü_ËG|¤[š}ØM]\g ƒrÖ`Ø‘ñ1ùVöCŒ6Ki 8êæé°xªMÖAÁDl7.]ÅÁ³‚ÙNñÑí}à +ùhõKÑ5Ã+,&ïtS6š Å¦£¥%gËRÁ(6�5$½ÿâþ‚÷¶Ût©»ÆLÝŠ€pHJí¤Ó»ŽêÒ~ lœÀô ºîc„Û‹RgÞ'KƒZ Ž™~-ÊIS~3VoýëÍ7c;ªÙ–¹«aµ`ÛêÂ)8òåÁ³„;Z†:Òÿ"üÃeCH(–"Ø20qŠMìÚðÎ'R³ãJžöì~n7´DÙ!@<M~âm ¬Ÿ^û2º•~K6?ß<\©ÖH³Ï‰±•~cÁéxS½t-•ŸF× C#jÔV{¬àD“€ÿ™ Õ \X@1šØ¶¿}š†Ú§Ýƒ&FõÐâ/ÍϸýË^wŒaLâÃA�£2Õ1øû´½GµŒ8ÏÝ'KÁNc/ÔÚ¡Q>¾Ô}“æBþú³˜ºÂqú´2•ù!›xÔBýÜ9ü‘õ©Ê…_üêä„Z•Ó˜ÏFç/Àj™ —!O¤9—yÙ,á­u¬`¤Öñ9« wªíú‚i„è+�ú'õ$ÂFo§ž-6š¢À{“ñÚcÈ4\‘ +Dé ºiØŽ=]ÖƧÍxã©„¢Â—OîZ=AÅü)Åø]:R5¥©2{uXxE]fí„ë7ã<üµîs°Ï^I&Ê�×®Þ«_9œ‘aŽ”�éö‘TlÉôK§fßÓ æ Kök X-åGmeë«qŸÑû2oåXh("ñ%‰Ùôí L8ÑJH¤ð4¢sV@ƒ~'’F6î¦Zb€qe¼Û}{T¢ôiúqœƒ*…ìfâgºçÄ£qX¿¶J±Q¹ÍkiØWè`3î¦Zç¾±aw‰^)\p*’Zaoª“¦ÕžEMr$o/«É(@=Ïsj´wGÜÎÞp9ŒH6>ûîe…³ÅŸ›ÿ\MÑ`#_ +ñ¬â’Æd;í#42Ê+¹ ^nmdt—´¼Í¾ ùW ~íþ`!±ª7…±XL\C\ "`ÔšLx”ÆÍ…jÛêfX ÷‰ÿj㋶¿qž©ØW’Y=LB®OÜÇä:°‘Ï@œHÌ4>СMÃ$ø4¼$¦Y±mk³*Àkpò—NÃgW¦“hL½âôB+&;PSŠÚ®éWî< âаž†ÕrdÈUµcÌD»%î—9§zïZwd<µEþ¥žSk ‘…¶ª$ºsD`â>e0XT—1þ¨Žô«mÅl‹öyð‡Ur†u¡»š@ç+ÆÍú+ªÄ¼Ð +ÑÄRÆ,¦^Ï\i¬6 à+�ss=ì•gu%YrsO+]Ì:œêê~ŠäYšÆV¢‘q%£k¨eÙêXñª Dêö^˜Q‹ÕæŠû£€2ÒÒ!ýìÑÝY÷®¨â‰ßÓ´ŽÝ+ß p©I¾—D"XÑÇÁ—qf nfåKÓtŒþ¨±RD6"òó"”.Ãý‘†wzxù$C("e¾Nv€pR* úì(L„ïÞ`'ébu1)›¯EÏ©ÿD­Ã*öÕ+¦ ½ÑÙpÛðìÅB¨X¡’5€HxqµÀm#qÃÍ™“»±tÉÂ%eKu–· 4‡ËfŒa‡3›¬K-yØ÷höæ«Š«ó¦S~IŒ©ð #õTJ æ´oό˵üXYYö„Oj =FÝÈíõƒ«Æ÷y>µÔ>(á€gû àpµù»¬o ×ûÞÒ Wû÷nÀSüÙ»g#Úð¿O²áo)µ]j!©Ð²K$›Œé;ùówºÐÿüs=øörýâ¿Þ‘äõæ{sÊÉÿ³RKÏúŸùÓ[´uùO«ñßožÞúOÁ¡ùÍ›þ +ÿ‘?/w«—ÇÃWúì¯nÁøåOå¬ðëo\3…+\/š·—èP¥xR²ô²fÓGêÊ&û¤¥üï +H¯ÉÇlÅ'{ƒÄ^: )¬ŒbltÔ¹;{N¥:--ú +äÄÁœîØ'Ä´½¦ p¡ +Ôlñ UZöæÛ×ë,„Þná{-l,ir·Š•Í‰íîpftzo<¦ÁoãïýDïøæsG>^ôÏ>ûôõõwïöõ7_ÈÁ×·Ü~ÂfŸ(^þ=í3¹ôGr„–‰Óß•¼C ¥<ëƒëÒLħžl¤â 4G$ñœB˜ªÎx~“•»ÑdÛñ5HÿsB |ê›NAïb¨Ã1á9ÔIîÂï½Ñ4ÞâÄômïó´ïIæ÷o¾øê˧¿úòýío ýŠª{6Ac™Y3É'íû¨ËÈöMZZÙðâô;³rüÂÛ¼7V3žß'ú~~p4J§‘Câ¹_Xa?¬Ò­á«+{Ý«u…Óžy°J7>\ÙýMø}ïMz÷—ý›oÞýDžÝ»×¯ßÿË׿ûͯÞýOÙŠÞ½ÿúW_>|œ:–Ð1&"e}çÐg£)Ñ‘àù  –EâßK3ÎëMÛ„¹³[p±ñϳÿù8ÿ<û¡Ë-‡KÖ;Û+_Y5â¡tãä4mÃýòç’0´y=tÝjê›WÛ3Ÿìã¡åá‚vªo]»˜ïoÓÛ¶vwçñ^µ‡‡´¥Z‚‡¼Ý6î<þ|ø¡ÃnkoüùÛ¿® Ø»“?–¬w¿Žk/oœèÛ6^{ºþ¹bÝô­EmfëœßL_bì >φ¢ñgWkÇ +ï7“îãüÐ)Œ4Yâ%·g+‘÷íп¿{O`þêÎ<¤ïXÞ]mv»þ×ý¡ãx)·uÁGwvgISŒ;’ÆxÓmrá<Ø·¯zÚæù¥„yöbÔ)Ãt·À´à~¹? yœÙ +(k“j»Ãè ”·.o¬ZÞ>â'«-¦‹qÈÜÀƒñ€õc;òAî+Ú|Â`m—@#V¶·–ã΃ëqÃ#8zó!¸yæGLjwëßèÖ¯fWði¹ÎظÆ:Y%’aªþŽ?—@ }ËÌÓż¢|O±'ñåy|;LþL"Ý´Û´lWÿF‚¸ø·æßÞ +ý¶-¼Ìñç DuH-¹²õÅ¡ÙízÃÉ)õçáþ(š<Fþî\ì´sÿÅãºï¸Îï,iNÞÖKŠ0´(`¬;³Øšg’0{›íNöÒ4èèc&Äø"}r5"/oܼ— +äéÕØÌèÚK\¯ìá&ü Ö(öVƒÑ sÞ#ì;d…#zQWc³žïWá@«!Ž‚.ƒöá#çe…j5x+r-+öv9ï1ú½Z uݬ¼Üõθý.+ûÖ"Ó–Áp”îXh÷FÔïú[KS–ÓàÔu; ¯Â#ÒxÍe +³:_q²¦IV¯06#ðòª4íŹßcr¤d—âÖÆà +2ì×Cå¦l²m5(“Cã+ïCkýþàþIÙ«RÐ4φ©[e®u?°a{pD’ÅËÖëß7„[ QòÆÌÅϺq¾†ÑkâÚ±»ÜKXB3ŒÙ8†*BÆs{ñdSïåΦe¸ šƒ·™TŸFEÞ4#Íþ2Û,áåàD 1ˆÆu–Â>SÐ…§C$±½q×›+l³ÃÍN»3É1Tɺ"nó¿/oZßZ³~àhŠ+gU¿.W4pãÃM¨~Çæ´>£DšÍÂ¥ žËdãÂè~)?<0t¡Ëbòè0.k\ø»²Pd?,·ÉRŽ«1Ÿ´)‡=ÂA™}Ÿ1:2ˆÏq#Ρc\ôrpÇΨð{ÜÉØ­9|¬cã{_–\¨ÑÃ8M¥÷~™Y’ÚòÉ…¹{øvo|å>µŽmuŽ7÷Ê‘ÓYdKVñúÙcÅë?K9ì?½+ïþõGOD±AA/Ög>Í~Û0Œ9ä– +þüYÈû¯_üÓíRúÅ/ß(ãÅ÷Oúw.Ú)§áNŠö÷WmD<©ý ½GÆ.‡‘¤c0z÷ÝØe´8œMÐUBkÌ°Ng¿ØÍ>@+-‡^ŽL‡Ô‰™Ã>\ˆŒ8µ|ªG§±€XìË{djlœÒÀ@¸T3TóÅŠèc³B¢w+ìÑóç¶^lâ7tpY¶-Ä©íËý£R;j5<Jç‘ú�økÛTÍ�VÐÑ‘«MK`…°û`•cPè0j·:ŒÏ\v”W.'¦â+y\o¯w·aq¦c‹ÂÈ /à2a’­êNA¼Ø¾ ”jU¹:Ëã>NHˆØãQ*RÛcÓ^qp*8óÝÁô\®Æ~PÅœ+tòË7RM꺼:ª÷ít5W»܈ä.Bæ3u +¶W§@(rþ½Ðä\Œ(. ƬwŸF€Nãõ‚ÿÀÁ0êoù +ݤæfl:J}¡Óéqbñ]^oÙÕþæÁo‹“{ˆ«F[À9´uuÞ_ó�&\®ájëØG[=¹e¶+ Ì¡p÷ôA£rx70ì…r ÀX Kçus‘b§l,}ée0ÚÏW¿ëë~ c= ¤e³M„ïøµl,¹×’ÑÄû)xÑÆʇ2‰×IY¥…3Rn\ÿ\Ù¯Åp·ë`åqNÇ—Çx9˜OLÐÛ-µcª¥FÇF“µ8žÆîty='öŠ0FHoBiŠ·±¼hTc¬»¬Ð]G²êÀOöexÙÓáÝîºê|qdN²ò· Ÿö7–á®… Ðd´!Š ¨™áŸ-Ì-n8gÉ †ù|J a…mó¦§Ûc+ÊBÊš À]7>ßÝÇãà±]ñb¼[ÖÏ!ì„ÕFhåý³Éqûl2?$©²žçp•>Ä^2 +•cžà´ƒ¾ô°UëRÿ/&ð’›°eöM e×….¥|8«¬c¿½Þ évìاq–èÞ¨H6ù@`ÿêÞ¦Õ¯XÀÌ»¶ÃnY•Œ£4>óuÓQðëÁ “‹Q(Î{y\á´£*uØ–¹ dX•ìcšê8…ã`ÿ:ŽU“1ŒßEOÇ÷)´¹@­oçã‰ïPé<ãu-à¿uûå–F¿5w+œvÅU~uwq;Ô/?G\F\1|½s(]ž+'”KÚ_W.Ž:–½‹`—÷º2ÉŽK;Vð'Ï##½®ìæ&P¤Ä›*H•åxEíקÒã]—æÈ®âCBVpq'ZŒtT`¡Ï½AØðf.öfŠgøÇ?f¾ú/_þöÝË¿ùæËßþæmè ':û-\KïT@Z³ñòÝ“XL,Ý2rèJ½÷0 ë•ßvÂCÛCCŠ›qÛÔ•…ˆÙ ä\Áû…9k¾:š©t¾Ä/ZßöÑ~9“¯P ù-xÁyݼ=p¦?þ\¾úî!mÅ £ìû‡3C DvÅ¢!ø(>®pRþïWûs Ö§Î*Ä‘;WÒãÄš‡‘§À5âßl׉…MÇš ÇÿÆŸÇÉžGÆeÅšoÜ]ãÃÀ«Ï~(˜çO>}yyó¸¿ùâ›×üo_öå?|ýÛ»¢Ò?7q<WmXÇSÍø©5¨)»øC=þEqd :­©:–Q ?é˜56xy[ÅeëÄÊy¸à¢.ŇÑN×ð!ƒÛÍæc]a’í>Î8F®g}×w,üp7þÀÃýÁ0¼èá~ú7GuÿlÕ%î{¤ëéÉ®>ìü¤¿“÷zóÓÿ¨ÿã?ûúè?þ“ÿwúÁdz²Sízê²f¥ÆÍ=h8Ñ7í–°¡4$»?à„a”ée×Có M_µÁr4Ø G£¿ )Õ}9XjoLÑ}ÙÃxžÂaŽÓUÏ {¼ ¯�ÃédùÄyë +uÜ•9ê}ôÄÈ.N%œ¾Q%?ÒÅF©i¥a‘ˆÛøªr78"ì§àF/ C~#ÖJ$„·}ÙÃx9‡Ãçë«žöxîo�ÅääO®îj#)Ž%¿Ýëa·x˜EçìJaT2(Ÿ û,.ËŽæD q4:\-™o¬åV¯Ì`ÙÃx9‡Ã~œp,{\Úã}¸¿yF1<e^÷¼yÈQ%ë~OK_Ÿ’Î]ܨë×Í£R)¥#G}?K,+1#Ê£q4Fà™î–òs2bÑXö0^Îá°'Ë—öxîn^ÚÚ';ož}F’UTñHý@³¥Ve H+ëj̧ +pØ¥ƒÛP«Žî”q4zÕ(dŽƒÕ©Úë粇ñr§=N8–+{¸ ÷7NÞ6P¨ç}CMNÀÁË™@¤á6J=ì–gš ¼© 1c:gêÂ.J ÕkLXv@§érã"Þ¤D+Z³Œƒ·òvYö0^Îá´Ç Dzǥ=Þ‡û{'dé“.]Èóæ™*ŠŽžT²^*8¥´Ãþ¤eFP pFñ0Êfäà…°«œ{"Ë!ª_.o`ç@£w+‹uâ`i×°MàËÆË9œö8áXö¸´ÇûpóšÎ46qÇÍ*ªRÆô,y˜fØ-À(i£¦7AÞF­»{£ö°—ìŠeWˆ9ÎÆW6 Šµâàâ±ìi<Ïá°'Ë—öxîož‰‰”à¾Ü<̦Šiòåæekª‡!FÛ(¾R78ŒZ–ðmò°C<÷²ì˜Îç@#n^1θËÁÂáÑS¹.{/çöã„cÙãÒïÃýͳظÊöwÞ¼œQ½Toá7ïdîÃnÛ$è'å-uO'”ô^¹UÓ^,V¸,;¦©Z_ÎF\z>PK<XÉcJ».{/çöã„cÙãÒïÃëuù¾ˆðÂÇ>º|ðñŃ.üû,üñ…Ó§ÔAázýW®×?•³úð ð_üŽ%”sÞPpWU÷xÍ o9ÓCíÄ‚i Ø„¨…{dÖÂne!òöÝYð—ÆÚ¨Ÿs­˜ƒà¨  À/l‘B{†êf—¶¤z_DIl²BÄWÕã\ƒµ†õ2¾"Ì í`l;Ø0»ô•;ZŸ» pž’?ETú7ÃKûç…i-µ7§£M圳åŸË÷à8gÕbsñä.ó9 îm/œ\y$Ýì`»‘†T£ŠïóTî–Fà:z­F¦¦4z"šò¨^)B4Pî f”ÚôJ%-Á†ô©*±UµŽ}µÁÊ¥ü<¾ðX µ�o7Té#l ôrfv¸ø0:Þgï”æΩV‹—ò§³oã…}¡çíÈ?gˆÀ×±ê¦6ýw Lçêà˜öDPÞkV5׊g·pݸٯ‡nÞ T ™Ýyç³bA…]/Ûµ7TŠu„@øtþž“¤zç¢]³¼=5qq‘`{aØF=ÉnTÑ–c¦Mè`®Ö<ÿÞê>„åU@)áùQ섬´úHnêï¹ß„®œrè¾0l"¢–f¡]0àä"‚°‰â¯ þ³ÈZd ,¾DËÑDš6Š«hó…öÍQæB*©cÁj#µ36^´²49¶LuÈ—©]òB#שߤŸ‘«õF¥ókÛ´™ŽT‰g® !Œ~ªê±ræÇ#m±*VfËKNbTÈ>k;ìŠw9ÎXäÖW”Ñ>¡Ñ(R¸–æTƒya4}¡ªß*¿aç&UHc+Ò8±a÷ýᄇAÂðè +dÙº6Ñ:!^$[ŒÊeYõIõÔ%­”ùæí“ +ú›¢Ê¶¬i²Ékµ³ÁÙ—¡1þŽIò^qü΀c¦#>U©¿ct G+>T¼¯zÿ?{oivˆ©»G"Åa‘²H‹–eÅ$ +…­�$þ}ÁVÈ{a +@¡€DfÈB"3+—n6sÇ#ʦlA‰‹)‰#Rô˜’EÙ1vŒ-Ù¾é0ã¹ÚÇñEáƒ}GXöÈï[Þûÿ\ªºª› ’Eàýo_¾}‘t«I²Wä+1((ñ9¶ #É°Ciöv çÙìù(caÒ)lA.dëЖ»EiQBBNEìpTc†Ž4^Yœ\‘Ƥ”<€¾™›uIØô½+ûÀœsT®¹2ƒëI©¢J0l)Â×Â<" =52”§bOÇQî"vÖ[†`‚ +AO°§ÂxM(†ã삇ò/‚<Hÿ}Yc°ØsÆÐ9ë8º5¸Ê‘n+™a Šµ"e˜¯‹ø9-ù3y2½#³T ©81˜jD_f=m'£v‰s‚ŒNÁ¡ÜßÒÛS™hrx¢rS—Áëe¨&“bK…Q)"ŸÉ‡PU§LÏ`½t˜Ñ9Hš?¸çÆ"à +Wº%Êl½. iã\ª(Ò±B9q(ÖRÇRÁ0õ¤ntãÊ I¼IP¨)¯_t5¹\F@“‰6©²Îq}ŠÀ@…A ”‡™<7s ÃÍ÷¥è§u<²× “bz@H¶+ ÕtÇàAe&I}  êÜWVÔ&°GrËf5“3²¡£Í½2³R�eÉd«l¿€öY]©F`bòÒ9œ˜.´ô8 ƒrˆEìµT†í¤üf¶!Ø!M`ac˸ïPni’ 昜h°LX`ß—pØ ÇçQú;eÜÌ$X*:’n0M™ +N动@—&“šm)¤¯SxM¬ì8ÊqCy¢•¨éºj‡u%B¡ä Œf§'!ªP›O9l"DÇa^pʧ»#7wšæ â31Ù†<<Ÿ‰NéHÉ2Ðâp*¶2[s)3ªÂŒšn3ïQªdèÁòe—â+á[2oU)›nJ1¿Š£¾Lm M[Á`ÎðP©Å|rã¤GÆY!_­­ž£'Ëš¶@í ô@\ <˜Ë•|ÓìmæÊ 0™ózS)“µƒ~È{”2b©Ìha“ ¼Ð³Ñç-Gj7!Q…E¾±˜T@UÖ i_+p™,”º#Žö¦€«KþnnHÜæÊ›†!¤=•›„ÍûMŒ&•øARZfúÀ•'…Œ¹}ÊßBÑv(Ç7;–³dÉßLêAN™ß¥í‚R¾Ë€¾ÁŒOMW%£®ÐT¡o«Øº´#GRCqO”V¬éRÜ-ÃØ•Ž +ý øª§ £ •ÔwÄ…`V�Wb/v•Äȹ®¬@Qò¾äMÇ&•\‰³©PRÝ5ˆ•hsr¶Š•ˆ¹,‘r}™cK×\ ÃPŽÒ€NøÙJ÷åRxÚsË’É”[‚Îüøš¥œlþ˜3V‚c<ceɇpÙ+™€ Þ«çÉ@÷†+¥´$•T=()-Á! +Öl{2ìo[qÓ<ŠÍbîðìM=4{v7³èé^µ–a¦²{èÇ€vì�F�žc† +•”ÚଢAe?Hwjª4.¡B1n°|.vJ?èU\"ê:˜ª‹,çT­Ì |ðÛ¶u/�üŸ«‡ÔÊäÍÑ-’Ò\Ô)d“åôj= +@ج +!l`Ê*wƒÄÁ’Äpúº-!¸¼*6A´@”Âå.FŠ§ñ ›ãÿKGo�=¦ÎÛˆLMsaóÜT¹`¨Ñ’gÓV„ÒˆûÅ܃Áéß›*K¹©[UØ2‡ Ü£TÓTèiº\š«m¡âö!Èd*·)ÿÏŠìYOƒ¾LÓ"ãØ~wZ ›æ”‡šý³›¯DÛýÉv2v~M†Ï[ùr!ÓÕMWÜ;°0"˜'Äoè¶Æ‚èàî±üã^©r¶«Ñ”·-ú6³|6Ç+ �fo†B¤C•U¼Éæ>ù㎓¼nKµ¸4t÷(ð0b@¥v=I5” ëº:Ë× WiæM N\N,­Þ‚±æ2™ ˆ=tƒ©™À¢„³hrÈ(e;©ŒóçÀˆˆHŸD@rО ÝÌ ê=d<“‰/®§‹„ååå0s<dèÇ•K`9 <_"wq4¶'¯gbƒ¥d�„ü •F‘Æ›ŒO@„`J L¦NT„Î&Ibe`Ó®Ø]C—)…uß’Q¬õ¶e¾DCIÏ ÒŠd%²éßàpnw—óΦ$Àr ôBÙ MgŸeT“E�Çê´IŠÆ½rŽf¶ºÉJ1»nÉô?–D©¶<h¨DC‹ 4‹ +N,3¢A˜MwÁÌX,à¶%Ôq¥Þ¡Ì4ÇÅÕ93¢ NœCõ¾´ 1…l÷üPxcÏqd"S-À™6…„ø$“e!þV'A20 $ÎÔµ+­Ý(=Ž +ÚÂÙb,Ò~d•zƒÓƒ¸K*ÈI€…™ôdŠ,ÔýX’B¥æp…½ŠIÍâp +o«R,d_G¹¹ê,}±xžœr&¥îRË]_féÂ̱j t0¯LQ娼d> £¸óöùáÔ E!F/ž0†9Ω ú¥y™”]B7)ûG° 6æk™µoËÛD€ÁAé¶ÚºMˆ<ß p˜aÐpå>§B‰øáuùR?Ä)œuTì‡04é6Ý l¿â×1»´Ê>Så³i,/�sN"&Öý ¡dÛEäjh¤& šÆö1+’¡‘Ǻ¢THäåºÎâe]†(C%Û8Š‘ù:èIù’”u1Æ”«ØÊ:èj\*Ô9§¼cv8ez¨;�Ò|ÂNz®&EÙLÆ‹ÂPĪ[:SQjÂðt©bìèr6Ê  Pc1*žÎw•‰ ®öøžJÁ-H*,¯?b +îÁŠ)Íà(éßÁ’é4eè)YåkLH¢‡§²µt™™WÒ³ N1eš:iß mtføÚQÞö&¥9E¡"2®Ò˜©pM]ÚÃÈìß°î 4/‚lf¶džzp‰s-™¯‡už`-ĹÕõpªp¸:¾Œ»Á©|““¼‘úÏ–®æ‚«f ¥«\Ñ°g¾„è>ã ŸãÆc!kÒ0ZµÊ'b…\öAv'c™™LøB!«}¢?ø(mÙ*¨Ô6ÐíE´$Í…L….]Ê\FGÁ*>ü¯aƒ9­ °ŒÈh) jnƒRXMsBÞB– +¾àA²7é¿È÷v¸:[p…‚øBôP‡‰ ÓV‘Æö�‚Ê$ÔD“Qçê„TFíst]Õš’ðTê(”úOÈÄá(>SE±8Êc)Ý2¦*>)g¯êKWšúÒvÈã´Gˆþ]v§¶dLZHU%%L!¢ ­‰~Si81@‡ë±)‡ïhRPlk>›$!G²xÛ’.ï”a¤]|ê*?HCâZ¬£4=+¼D¼s–H î,Å.‡Øf2ν+)@LXHó=)CD +]yðÒ@ÆeúÒ‹Ã2¥™ «œ4@Íô{Qƒ%NŒ.}JÙÇ£H(§.÷¡$62¥ VÊ7¹L<.6âqTª žâ£TP”ë2r -ÒÆy2[!:X8R¦S²€ËŽÔyJ{\È‹¥³á#¬Ë2 ¶ÜE÷ ÊD¿p!kAlf©±eÙ Åœ¤aêìVâû†Æ ;•U,]¦ý†ÂPˆfMž$ú[êF[†DZAµïqž Ô–ÚÊŸB¢hRCKº/ ‡¬‘ºÚ’3 Ýì컊R%çÖ×kO†¬q2‚ÖÛ +“¸{ô¬ ›æš”‹ÝpYN…S°Y,Š$€·)(Ä|y +×ù>Jëí dm§X/6¬$ÕDlÜ�¬-æ~€b™ .¢DzÕ8'd‹ÑðAM7Ìјˆh¡dõ¬�°Udq_ÙÛf›³¬ãz¾Ë3“™Ä€=Ö\9À“àQÚiÌ)iñí ¦å© UPH¬¼(4Ô&Àí&¾£˜‡«Mš�˜AP8Jê° ‹2´Š¼"ŒlÑcÃcK™z`ó+´ËMx)€¨ñ�°èÁ’ݲPõàêÒÉsÈ1 "]ÈÓA¡g³Þ]âÛˆrÝôX_æ0ˆY¨b¸²u èY‚–Ñg­‚Ô=Û�Ÿ}Yšö-õðÞB¦’Ö9ù?²¬E—æp”/`)Ghh“÷$Ød¬û›äH’”Ç\†A +#%=µÌmè¤'ñ9ž#3à²øXgC[àpÿC²O$mu[½£RxDc`oz¤’B91ø}ðöe ”;Mq|6iȘŒæpe>‘òŠæv5åý–¦”�ìq‚€ÎQŠ@²gk,0íRz ¾@îXÄfu¥?€$ÿ|É°ÅSi Êôeìmva9 e �Ý’kH*Ø°tV0:N(Ù¬k©4ßPˆL'Æ!£P ;=ƒ-®0ÇfVêS}Wã¨@2F&•ÙÔµT–Uéè0 ßWV’ýLƒ—.û梦ŨՑºO¡ °º¶ü`lFä.zÖ{óc1eŠ7TzóE·Iû§ˆ$Α +öžÛrÀR<<C¢VP +’) çÄRûÀ !¶ƒTÈ«È`´Êvc2`ls0z,®$º²šÛ2I¯È<AKxê)µð$ŽÍÐ;lùOA<ìP*xqE0M8‚ô J¨(–;€oikåH÷3ˆPa*÷P—€·£…"Ýa^Q—¶]'{Ùq+ºtV©ØXj‹¡`“]‡óib¹Ë°H—F®ð§b\`˜L@*(±+_U àÊ‚Aãq¤Ú[I­L# œÄIh~ç)#^^ˆÜ|.0�û€FPh`G¶.ÙúÐ,ŸÜ’<•™ÉE6“k"jËÊ9È8¨f Ò‚`É6«Ý ý¢ÐÔdKäÕ”¨N0*ª¬+Ÿ4Ä TO<²x*a¡«¢Q[º'“ßê¦Ë& 2;xÉÒˆh©€Kà�j;lo*//Åãb©« ö™ØeRQÌC˜Pb.S欘Ës`N +eŠnœh,ò …ç s6Xöú n1/6ʤP$–†LîƒÇtBéz “e›»Ÿ%Šƒ„¶ì‚®dO¦zàì· Ä“þÕ>ƒBwlïÕ†0Å*Ò¡x-6¸Ñ¹M¡ZPݧ³ŠÉ'KÑ4Øž�Å?ŽLñëKÁ!dÅf€ïù*X#~¢ÎÁÆÇ’¾²š„î,É# ÝMeˆjº”]€È7›@¹D©2l<b]öëQši²)‘´”ºPY\lC%G»:Ù'úeŠÐÆÜ¡ÁB˜PÇRx~ dÄhkŠEC44¶9ëºêC¹›Cç + í7eÊãÎ¥,k8ay)<‰ÜÂ"m×RAûðê@w”Ñ {{êH„ºxTSwdäACsX±eë$XgX`°¯ZŠ¡òíêÒPÓ`“v ÅTº|ÜbpÖSÛœ*Qnçq ‘[ž.³ÚìÕWŽf¦ƒxÝ¥ðªG&bÕ=’-¹dhš’¾úÒ6Q^sSñ“ÇéךC…` ??ˆƒhðÝb‰MùAìCOPÇ<-¼ŽXÝPqE¡åyLºZ¬Ã¤.@.«ñþ¦2Š *a•/12n i‚ìðÝ·¤?,fÌa+gH`è0ÐF“.´Σâ±öK®„ÙH/@^`„G–€ä P4À N(BÇH$�žv¬wê‘QZ‘(‘…– +˜©‡ï {Í8¾"7z,E‘©¡ 4‡kZáiHŸ,]†ó…Bk‘£>²á£B–Ä,¡>Xhì·ã6k.€ýfH‡ý¢ý­-ðqÓÄð† #¤5@$¢œm=ÈÉå *”t¯<Y›2 �c4ä)aˆÍd ÝQ×4þáÝ æá‹!µ8,¸„2]_€†c.AdIrö±ƒ$À "0ÕÙï,²‡BÐõ&‚>4_.ÒbžŒ@˜ÒƒdeFBx +‘ ̓ï£m¢´…ËÈLжˆn BR„Âñ!)Ú A4é’†Ö¤ik•Ð6¬"… ¦yMÊ>D W´ÔËrˆÃp×O1ôž¡ϲÓ/Ë㘤2Ãì6#iØ ©sLžä7¡+Û’úmcnzÈÊH_!ÍçMƨáÐ<#|Á¤¦ÅTiQ€�s™¤šCŠB!' d r-6˜É#­$bat%Ò[ûÒäCÙ›H—é:EU Ë•7è»"‡$e˜©Fž´‹><×à‰Wš÷¡ºš©¹[Þt¢úîNóÝ™â»3½wgjïî´ÞÝ)½;Óyw§òîNãÝ»;}÷ÑQwM´fz¦abœi¦…›«D˜âÜM¢ù¤0JJ 6~6kŠúBÃ&"èxE5:ŽÂ4Wy6«üÑñ78Ïgí¾ÅÁoQ{(MV4ÏReÛ‰j +”[&›èx2œ ðò¾LQÁæi؃Ԁ‡”x?l6–Âà|™Hz])“ÁªÅ*V£)k<ê²p<2Cc¸ßÚdÛ °Š" ØÝ…Òüø¤Çeëw_fˆgÿ(°<w=iÙ8A^"•¬²«"…,(”Oòòì’ŒKÙÒ8šÔC¸!e ønê,Òcñ!9t9R'-í=J5Et£§‡zà Û@·Z*õÇ‹µ(9êLyZaÁÀ›¤t¦J5^ý”æ@)—ƒý#Ñ’M +4%kqIÀ% ¬$@—lLó¡:ŽÎ‡Ik(4ü¼ÇðP6jkò18q8*9») +±‡@/fË0Ä6ȧ” A,(“Ô†¯h@äÿŒ;4)7R™ç 2yGVV™ºÁúÕcÀ®Y‰AmI“+³tÆ~bg%BÓÙ NÁõ”™ ”3Ñ+pš´‘Ð¥.ëê D‡¶M´MÐ#—M7z23�uCJ¢Q_¢:ðL‹i‡ jÃd­tõ¥lÌ–òJ…€ùÞ¹º´çÃHØžrÁQQ¬ÓÆLyȨ̂Hîdÿ£o°¦As•/§ƒSžmDˆAzH0ÔáðW`ÞAz.?íÝæ‘žµí°aXPî¸ÊC’ÌÇ‘æ8—X(Ã>øAö/Ï“öîZ@q`jkÏ’ +"å­# „@©Öòbȶw·åp’>5I»ÏXÆö ]{‘_3V[b…•Hïƒr°LVα<BÀˆÇšzB@–#ƒì¸@£5ðPX‰ �š¨IÚ ¤¾>›&š®!™©‚âÀ€�±ÿ(õ]I”“[6  Î^ƒ…h ‚ÕPø.ÍvØ_Ã1$³% )ƒœ–PÑ+0öt·<¤ÚS/ìø8Õ.ÈÜ5“Í£Ñß]¡%Ç IeqÈ&ô4åДүÑCb’#Ay– +“êiÊ­ ²ÇÒ¼RZUxtQ¨PÏŒ~L/H¡ç“1¡+©á‡¼Ð[JhìfåC.#©´º uñLÆJR²‚ªK*í}M’•ùÐÚ@Šè¡„”úÛJ5ë¤t6$ʲ$^s=Éyc BÕZ†b¹Ô!n%©…¡l‡@¢n: ¤QI—=Pz,"Å9(ì™%ÑÇõƒóaêZ£õªë`‘@ +Ð’ãË+îÁ–¸Ê·¥äM¹‹ … ñ ®?`(–fy”³‚ð’¸þûàaÇì‹4¨Ã°„D88"[N …CÔd4ØIƒ*C!š+"1Àù/Pµ#ù*t#T=X¤/ŒÃ‰-}M:àÑ[z[!Ú{‡z0ØDJ`ä×mûdôÕ4G Yoƒ+1Ý>'H3�˜˜¬ÑP…ÅŒ³0m‚B-AÌQ™ê�¼g³«¢4ØÀ)hlã†æòjÌó¡èD¹ni¾t“g|8K»ÁoAVaˆ1Aï +🣩Lr¶##æè2ŽL[ᑯh eåPÖèt¡ê"�c9¦y‘'2¥/ šB3@àBY‰íÀ×QgO;å +ñA(tOx'èí’�5qÜ'°Ê0]™â7vÏ?j['<¡ 6£f¥¡²øÐu“b·+Yn*?(&` ®e+±¹&ådž/½¨Œ �­Á¡¬ÇR‚(Š§«Puù¼d4}T=hl í.ÚÒb +Ý ØjEH›2£1´êÁrl圩862Ô!̤„Pix„™l&È‘Ä»XÙ”üMá5€ó}Y¨éÒEEl +­8d‹‰¡#|Éžajjd¢d½»(Ž¯Í}z–àÈá3ñ¡©øž² ß—vXâMÚAÒ- ÖhÊÊì¨ÊRÝšìýkÐ�n¥WhÉ—…é ES²À#Ø!Y±-•�ŒÁ(ÍŸm)7[t\ ±-Ü;[vÀ˜w Täƒ Öc`Œ(¥8^¼#‰-¥ÀF§<·FWw!HÈ^6˶݀ÂB.Â&²Baº#…³lýjkÁVv3PÓ ®‚¥Ð»¦°(zFÛŒëäsI¼€‹À„¶ +˜šË¼’-µSžLyÌ¡¯Hd¶!Û®x¾â¶¿q¤Ý-ÆI–Ç‚|Ø]Ÿù^Ç´ÃxÑ0¸Þ•¬Lœísz�)‹btß–&+Ž#{æ0¸&‘i·±gK(äO~,hDâ;Š]±HW¥ºU=0I˜ÄóežpW…¥À‰qÆFŽ€§ÎÂñ4ŽÒ`êàØÞ [˜©‘<ч+´ÙÒwNÆéQA©"!È�±à6©ˆ,·8:™Ç¶£X(ýÛ¤ZÊ‘-Äq¹Šl7 ¡K&%Juw™dQáS䬠Ïf¤„j"Z…M¬ƒ�üŽn)˜IžÄ6Þé„• ©—rã&‹NÀ*È+_Ér":ÛH†Ð‚ŒÌ!‘Hx åĶ)g2Ïdr=]rF¦éKÏË•hÉð,éÏb ê ÈÕ”b(p¦‘®~ž¡¼µm¢r–<¼ÀzÝt0&…r‘щØ×ggA:j´‡¨^¡.CQ¢¤_I9–R´8Sz=€@î o#²:ì`‰ú8=0×bÀ´>;8lµøÊ·Ù PZúèärx¥ÙaœÃÆru©“V»ããB²ûBte†`²a¹l®ç9ª² ¶™æ•¾;ž2òRÚÐC¸ ïm+Ðji +B…’”¨Ð7 ® œê�‰°þQ–4ÛòYR‹Za[ÚÔIsAž¶BM–6¨¢£ «94µ ¶Ôq&þ(Ô%÷S(·”ªÍ2\CrF¶òõ£@ý6gZS˜I eFB2º&hÌ=Ép™À€[…ÎLBY H€;y\…ð ²ÆgiK\Þ,½Ñ(/½MŽÀ\¦ÛL$ø’~ƒŠŒjBdŽGa×°\jj°½Ëæ�*:Ú¹s®‚§è*†hɶÔT)ú àfé×HQ à*¢ 'hÎg;p£ô”—ø<¹ªÄ̹ÛÓC\ +™’QÈßW“õ8§Œô+£zó9€i +Ýúa™åÀa€Žq̓4› h8æ²$Ÿ{RG¢é:ò.:D˜'›ôÂv¹`,ÕGPhsr •É[ùêƒ^ËaE–êD f¢³=�WËSKaW}²Ù :0<¶Ö‘ÆÔp—mO:ÚhCsH&gÑ ' ÆOâ$i‘M’¶À8H)´E˜´y´$Ǽ™„c&sˆ|Bd™trC‘«K’Ã#Ò•–›2p'9s†Q +[Ò[¤)ƒÁñšÌéJíO—Fu #»d›¤^¦B曑’"-´[ +ÌxÑrÓf«%¥°“R¨å_�¡É´Åg{—€Ùá`T.ÆÒa,C’0`6Ù-çéMÐ`l àLMéJeH_%®ô8O$9¢èZh ìG‰¸ÊWÆ5šµ +zÒïÅ÷B|/ûúaÜc% ÕT”4T—Ò|›gâùli•dùý°¸À£çX’œGB"`:u¢¦ å8Å•\26ÕùR!Øñzš2„Ñœ-‘¨¯4C®aKCv‹^ÂbeűË="%Sb°@ƒJjQª°¦ô^¤ÄîõJ\Aì’'1K]³Ú!`Ä.°b%d‘m¨¼¶ K&€jãK4‚<Vþƒ«¢!šœ�ØûìfQ,¨ÜdTÃ6áX(íûîH?P"…vsøt›0.¯‹8ð’Ô`8é}Ê„jvBR&°dšR¶¸Ä1£ ÂZ±Uzy<•GÚ•1MB¨F k|á|4²‚ç@É eÚ8—n+zÄá‚ØPXKêW´DLckôJ…Ç|+¹ÀP1:ð^q¡k±>‚ƒøa™Ï’ =ˆÃæ(6Ù¥›Q9>I\éxÂÕ4“íB1;hÐÜu-)‹4‹%ÒÊVî=ÅPC´Dnk­XÉP|R'KVêäv¬L¾¼+wpV.¿ƒ+múìWeñË[¯2Àºƒí*—¿¼å*—ßÁnUnúË[­Jºå¥mVÍÜÁb•*ßÅ^•i™—·VeÊéåmU¹ø–ªT~;U^ñ¬Té:ÝÅF•Ëï`¡Êåw°Oýè¬S?‚|0öëÌ£ò»\“¦õfÕ= Ûãz ‘„¸:zkH¼Ívçå¹aÐ ÐàGr0HC¨[×QckPO8@*ÁMæDÄ‘“PøÏ"¦5àÈ\ö&&•ó" í4ÈØ&5D�°L“Í- Ê¡¨IÈ‘Y‹›lö6Æà8VØBLgÇÖÔ¡ŸãH“ÏaØ\ +ä¦VÁðüü<OÚÕrT\Ì`"½C=“‚ŽÛ„•tKæç�¿oµd¸qiôç’ +#ò(ñÎÌdoG¤Cl[ÒåZÙ9øÒt +ódFGÕÑ&ŠØÌt!©¨/3Ö¹d› XßSÊ_œïXlZ¢Ò"B8"2ƒÔU<wÐÆy>‡%´\=7AfRRjÈ$Œ,jqM‚Kã.…îÓdà–€¿|—!¼ÊGãJƒ4X±UpNN|!Œì îqD¦yyk‰Ùž¾ÜZF´À„ įði:í'ML'åFYáB BØÄ\`&ÞW™´¹”zœ"1rŽ øMƯЈ`Á(žŠ0é†ÆœÕB$Гôië*K£O®´PH a–Y”j”¯‘®.ó×r¬ÜrSŠQC\&Ç`#QßádGXY +[C+9c(Š†O¬ –ëÒèRò(©ÔQÊ‘±A$éZ!¶”‚Á€ÃQÔ=Fß`?n•QA¦yÖC¡–ˆùRIAا×ó¤5(„Î`½¶¯¤˜oCÅ©u¸+å e§B¿~’‰€<žæ€¹Qˆ……”À¡€ø¶T¨c*ßeÌZ¼G0NÛeã`ËðB<]º}[¶Œ"€Ra/”Ô È° zi»*€!­]‚pÀ(ÈÇÁ×Áw$ÃŒA(ƒ4»@fQÌ 7Ê;NÉyf|J–@s¥ðŠ6…¬l[ mpQæ 6)ÙÈÆZr(†”—Y|VB¾l†Àj‹Ñ€(2¦Wµ‚U>;…ì9”Ë[¶‚勇sHåÆ+3d!ʳò28˜ÓP‚gAþ‡Ï”*]"Ç0Ü'ˆ.R!ˆ\˜ìÕ +ò:ìñ¢\HL&ÑÄF¬h UÙŒ"ÀÄÔ’×<¥$Å‹Lžçf°“2ŽbQÖƒû&;{�¶”1½ˆÏH؃€ÚÖ“2T—Í*0àªÎF(RŽ[ây’¾ð•z ”lŸå¸õ�³Y9LQÞ'Ìf”Dˆ2†X}4š®)ÝWÒo1öLAEI¿ 2¤Hȉ¹±`fÕ•/q0>ž-m‰e¤d›„WêJsš-Ý L1}ü[g;}*$©(ňôCº +à ÑfðH¨PÓpo &é R€bp¿Kœ,©ü5 73²À-…ád|xv‰ä=rt +”j&¹‘¸”Fƒ<©10U êRôpª‚5[­1v@ÀàÈxÄøºU¶z¶¬�‰›@@ÂtOæ4‘0Ìêa°µ6ÆeÜd“ý9%*J‚Œe€ñ*dŽ ]†ghäê!:„r]SŽX$^õX¤ÅÄÐ8qWØ„Ú’¹éÈMJrä¾Ç¡hP²Á„!EUÙŒ£…è ›Då·†·ð•!;2ÏkË>fe:Ç—ê- ›¦Á3XÄ0R®ÜbÒ.¡‰#kÂ!ã-Å9!-¤%]âH¶ÆµT”6+°Ûµ¥ +WæŽâ�qúŒá$ÎAõ´É=`¨Z*¤—s0ÝEÍúm ³Æöµ c3¸®TÁP¾t,н К`0åK¢ ŒÁ†ÊÒ¨&?â$½âtfzÈ‚™I9°OÖÙ¬Y +Xä˜Npl·òMùRÀÁJÇ“Ö:° ì>áÐ,¹ H ûM IU ‹­™«#k(‚`dR.I¶ÇR(ÑoJׄ˜‡}*=I[»Òè ûš�Xr}é}i!+'ŽŠƒåì Á!=f;Ë•HÕbÊ€Y¬„¤nØw 0p­*¨ì:ʬe²½b|dNÞ 6W¦5”Ë ül¥U`Ü!t¥V2–—í„’F>Ro+³€’QÆ8\QA”ÅáŒÍ 3J€hLDIP¬Üü ?l¿îÚ²gMŸ{Ò>Eú 07#ÚÉšMŸE¬Æ ,)N³CДj’ $† 0ê>$þC¿H¹C9Šui?‰l§\¯0¿ÀÞE>_Ì^d +ÕH,›Í×j2 pšÎ7�b´ÿtQlr[¯gÃH\#2 *KPnû’nv OÅV¸ã‘”™ ™{p•Ë9£/ƒô`úJzJj´P™œu¬Ê‰.r¼P +LMDsM5^Ã2"ᙩB†xr%ªœ³õÉe‡: ö'-\Æ3KtÙã¼FÀ•ýœ€ËP’''î‡}œ.ó“ü;^•ÍL­ž¯Š«2Ä'ó÷>wÈÇM¡Gɬ/r±¬ˆxeâœ/ºV"ªFÿz …ÄJ¡¶%þò½5™©g&#¾i÷>÷dñs?wûŸ¿lùßÛúÓ:Ï·yÞ×ÍõmšóMçú6Ìù¶s}Ós~Ùù¾©9:ß×ûóé|_ïÏÏÊ|ßäÏÇi®òçã4Wøù8Í~>ïëý¹ \{Skú¸ÍùUÍ÷£šó§ó}ûçùºçûé\ß¾¹~Ô?¯c__×ßÄ\_vÎor®/3ç7=×ÛÌù6}}\æ{Ûµ½®9¿Loû|ï²ÎW=çWu§îÒÿ'a¾ÝÆ~s}UsþË[öõ¦çžÇ§ó}½ó}s~•sý¤Ï÷¶s~wòe×y—yÞfwçeöç6ó¸éÏ«¾o¯ên½é9¿êŸÓ\_çœ_÷ÏÇi®¯rÎõÏÇež~Þš9¾#~nXó½ÏÜ»÷™÷nRûÝÏ|iÀó¾ô™w¯¯ú÷û¿ù›‰ûŸïº |¦oç?ýoÿÕ¿úïþ³ƒáÏ_Óó;_˜þ­¿þ›óoþæùÞ~ßgzÏùÝ/-ÿð_ÿ?ÿößþ¿ÿç¿ø§¿pMÝ/¯ÿäoþ¿¿û»¿ûÛýÇË¿Ü{·ª+æð¿ÿíßÝhbmÿÉ¿ü¿þöÿ¾ÉÚÄžþàý?þ·~ƒ=û¹w?­þóñ£ròú³ø¹Ÿû{¿º÷ÇÿUÍüò ÎXìÄÚ÷~pô~áFwçKK¿÷ãË¡ÏÞ¤î;_˜ùúŸ}æšý⺟zþ'¿¿üå¿÷.ýô¼öïýêÎüááà¯|~ù ¿Ðc‘bqðÿèéÚcøY]°ÿ½ËÇüý—?úÞw¾-~~ÿ·/õÏ÷¨ûÅÙßþëù_ÿáõuÅËü¥±Ò_ü³ÿðpíº9¼û™_þCã‡øGGC¿rÍÚÞû|_ìà0qø½ïïýÚÏ÷Þ³÷>?üäûm|ûOž_srï}~äé7ÿì?H.ýÖŸ}ö—Þ{7øiíýÝÏ?ýæO¾UxÔ7~ù_üçOø4àçK_h¾vï|æþ“oþäwÆ¿ô¹ç?ý Ú:‘Å©ÈßW~ïKñ¯ÿÙ·ŽFî½÷Þ—–¾óW?¥ þö·¿óï|÷÷ÿ£íð‹z糃ç?üÑåø½÷ÄUs?øö÷¿Ku¿óÝ?øÁÿéŸÿfüKï…ºM~ã/¾‘ü²(yç~Õ]”ã¯?¹¨–ÿÑùÃóAµ1ï|fàüŸþ„ïø»¿ð…_æUý»¿f>-í=ýŸ~#©:WüõƒÍ¯Ðßï¼#7ë½/zþNa¹ô£PÇâv}ÿ¯¾1ûÅÖ}çž÷ÿô·Ö6;Ôñ»_~üýŸÛ‹žÉ¦_ø!vü×ýîŽ~ýçÛóçýè¾³>”þÆO¿‘ú•_üìÏ¿ÓýùŠ~/ü{Ë¿6|þ£?¹r¾,n(?߶ù¾ûE,ÿw¾œüÆ?ûïžLÜ{çõãïm|¥0½÷•ïþøùàgqðü'ÿóóG¿ñè—ÞÅçûƒöÅaß]ˆð›?ýÉïUí{ïð¦ýNêËÍ¿'ÆÆ©½ó™Èã«Üšû«ð¢äýúÿ§xBUï_þè‡gâÞ¼û¹ÿ`äþWèE È»ÿ­¿ø=¸gêÜß»7rô­?û:]›wáá½wé\õß…ûûåÏBÑ;ï¾÷Ù/ýîO¾ùä>_ÇÐRð ýä÷.SC_ùâgþ³_üÊPòò[?ùæÓŽ�*ÿî_üéï7g‡~}hfãù7~ôgß|:ÒÀCåoýÿÓOÿÉ7ŠG—_ÿÞÿü‡_2Ü ˆG¿ÿõòÓÿñ¯~òƒÿù¿÷õ³x_w´!€ÉôfñßÿþwÿëÏ7fz“ï~F¬iféñã¥éÁ¯|ñ’öê _ðY¹›=«¿Óø ¤J9°Ï¾÷¹' l).J¤xZº `È=ÚB-`ê +òÁ=ò‚ÑÀ3Œ"}@̱+é2ÃY_ÀmRÕ¥÷;FbÃrô,J//7å²ÏSQºÛS¦'ŒWIDùV³cO ÜÀÓ¤™A$*vª´)ý·r(’妘‹'c Ûä î¢äæ”)GeŸ“Um +€ÔÔg¨' Ke¹5LKº¦r¯ºFn8M3…ʉgªZWÐmû&°?#n&ÓÕA®ÇacÜ v<xPóA:ä•I^ÆìOA]¼æBˆfàKÿ²p¹8Ò:­ sÁËH©G\3C…A(@\�ƒÊÃ@w­ænC…á9„Ë=•€<´\ySúhºÒ½\ pDï[g¿-2±XªG†Á;'’-_UÊR.Rƒ(0‘«r®%úKÓ»<nÈÐ7Éå÷J:Ùeˆãrºï-nDç<ÕÝ^¥L)Ýþ.)±q§—‰_:¾MúÒéuã~Ñ …=Z£ÿS¯rùò;•Ù¡Û_jë—Û¿U™ÿú¯•º¸Û{•Û~—;p|J{H[ªÞ­<ìö—K_îöv¡»¾^™ƒô.ïWæݾà æ;y÷7<p¬^±JóÞöŽiÑ^2ÏcØðN©”¹Êç"®Ýñ]¿¼« "õãÇåÒzµPªJçããa·°ð—{Ÿ{\Áo}[/6Ä¿k§ÏóÙºŠF¯6j‘ÕL)sž¯FÖª¹|uäºúšÈ‹…ój¦rQÈrÕír¹81#•zdöz¢CÕ‘È8ônà@ƒt1StjÐTU¤¨K}¬½Ÿ)^ßÀ€Pµ¥sê£C ÃVó¿n>ÔÇDÄÖä +dƒ­l¦.¯¦Žãb#K™ÈJ>sªF}´UÞÌä +qy·ê™j¯NW™ïi:Ÿï9tñCˆeÕŠùÖŠÔG¸úbé2²UÁ¯½z…jÉj¹"êPXSÜïµÅ: Õ]Ï—²uhëðZ™j¶œé]7’näòjðÙõ’â‰yöîl>SÌ|õCY‡úè\s+[-‹°šÈn¦ZÈœóâXKçõ Ùz÷‰ú(uèA¼âñzy\ü_$™©]P±U¯–/óÍí¡%õÑÚ~-sÙ^µm·ËÅKùZïXéú‰b¦V+dƒm¿n[™«r¦$-Ê F¬¨м Õ~ ,…žüiD&$¦z¼”ˆ.Þ+Äf`¼cˆ³ á& ÛòÅstLÔÿ£Õº6zå›àËDŽ!“ ø„¡ñ]ƒ>ô^ÿí×ÒôR{¯Æ¢å +|ú!…åj8ƒ›º)È6X­B !ŠÆÕˆá îÀ¸- !$þá‰UÂÿ Ö«^‚+T¼ªÇùÔZ ׂÿ™ˆð B{¯E|ü¯ö:f&ÁXÏÝvy‚gÇ7ÐÛ>øu‚¶ÕgF»ìXHiJ»ìÀ¹xz`ëÇ|={‚Û-‹±iWi¢ÜsŸ2ZÿÇ‹!f‰>àòêÐ¥x7=ŒçZf«ô Þ©Ü^ÞWƒ~ér©\ôë'úªAR7AT ’(ü ¦í 0‚ÿ55üŸ¹Á”_vø€�¢ñÅ‹w#– ÿ…Q_çØaRŠ¯E,±fþ÷ºÇ(Q¹õ¶.´ñz‡ÈB^¬ÜÑd¼ñ_í5ŽÐÔ<văÍ×% ½Ñº_õ+éDMÁô$±Ç� "!€9‘ÿ!¸…o^FÙ½ÓÖu› +SŠ­31Â3DjB¼ébB@â¶ÎÆÿè÷…ˆãÖ‰èúG?â!äLÂôÛ˜MwV Ó Ð= +(ˆy›Y¾êGÙÀ‡)ùÖƒo"‹ºãy¨/!ž¬õ¼l¤“€\m¦¬,ß‚L\xŒLó1euÇÃìµänœYÏ�Êj¢ëG dÄæ :|7ÛîëÑR¯% +æ±ãó±&ZKìÐÑaPZnÁiHžB×€õÒë=ÅÓ–zˆßã84^_'âM×à¶ðFü¸Ù‚ˆƒî½£Û+ø–ßÈÏfp|òºM<oûÁÉ y=@ȧo’nÕ?,æk÷>7±\*P¿@:¬©Ú¨× +¹¼|v‚EëIíD,[/¼ŸWÕ',ÒMŠÀXL%Q(E¨ +å:c› î#{yûf7-ž�4ÔFüZ¼¦IX0,–_®oæ³åjN2|…x"mZÒ}Ãðb9,™ŠÜû\dXuŒrq1¥¸¸¢‘áZ>õ~¾´–ËaùTç™M&Ö3ÕzÇUb‚ƒ;-{Ö©Ýp]¡õ=tŸxïUÐì½ ÿ(®U¹òõ+£ŠÁÒ”B^oWÈëb©ºXªÑa©˜i¢ùC]ßâ°åR®Q¨w[á-6ì•{sFWyì¢Mê«ùlæB±‹v +•Ka(´U¸ª(z‚úK>ÁuEê=ç/6ò‘ùrùí†oæ©Ü|kßÀÓøH@ým/Wü4@ñ 8¥œ<¯fr…¼¸y6PBUâ°B~zHÆ y÷,?éc)8­Úþø9t¿*äÑ{‰‚Éldë"“+@YsB›8úÍ*⑽Q3åsnêab»P/Þà +2p3Ÿë¸(W¿6ÒTò~¾Zģ́ÅR®¹Êi±Q¥*š&Ër™ê¥lF%åJ&+KhÓ*™Bõw”vˆ¤l‰rµ”¯ÖÚ÷¨és÷]jéå¦û¤Ûr5p§µ7I)Üô…¼F”‘ÈPíLå-"`ßu™‰=>š6Gž‘#ÏH7"¯ƒÊyóÄœºÚÛBͽn”u|ýÚÊ'à,”Kù³å«ÓÈV¡xùö€œWÄ3†[;;«åë˜@¯¿…>vÇnM=Ü· +SŸÕå[²äªX¸aÀDÀóR½òVÂ$ÈE+þ±zÃàN×öeÓ[³r‹ #4bäCºTHàéø7@Eo>¿µB§�äŒ0º ¬44Ã~á(Rùä +¦¼×ý?œe'nR7FPö%ÈFê– æ%>Ø>¿9>ò“ˆö×/2¥z¦v•9/WÁ²ömAûŸ +‡>Fü•È”v 墠¬RæQ”dC*þ?ˆ\§=jAV·× �^÷›×õÚ²¯J;ÂÀ+£9Ä ûÀnBÚ6Rå}¼/ÍëÄOa$"E$Ÿ’¯’Ø0"bîÄêþò§ÔÀ§ÔÀG +âuÉÚCRp׆ot÷†ÿѼÿ×ýäíO‰×@ ã­ÂúÉÌU¹qVÌœçßjIÏÏ ºoÔê…,˜¿=¸þA«·GW÷ZEÁ¬×hÔ‹…R`ðørª–NnªÝ¸¥‰ÁùܶÆð¡§Yµ¼é´L©a©¾–oÖ¹äꙢls�7®ir¡XVdNkåb£žW_T§bu_{YHò©zõgÒne«…ÓÓ⇑tæƒ×lßøs³Ûž›®uzotIjW ?½%ðà=ÌG2âzlÏ\¶/ ‹»/‹[ÝØ(IηPiZ¤2æ²;sQ›L){Ñ\R¨É%4——õ›ñ±â™ÉVGsÁÂ@§Ôœj ¹éŠ!­×‰!?bB ‡jÜ}ktÂkÕ ƒ$#–íY&»f½I/ƒŸAÄS( +ÐÙ`§ü‘"ž…)é+‚­×„øi]~—ŠÝ7¢½Ax7^%ôŠ=à´[ûR0,ìÈá!6Ép²P«3ÒŸXob~íôù¦èf2ÒÔ亞»—‰9 ó&Ý’Âø$œ`¯ã³>=¾·÷ø¢>X”A¸;©'Û_YÝ4Í^Gê~Rôm"h>å’?"b¥|VWªVÜlÞ©ä§È7ÃEøŽìƒohs먄Â7é«ükÔHý69r¢HWóùˆ@/õ2ÈIZrøkw,ÜÜÇÙÍS²©jV#dV¸ð}ÈxZ¨PïTSçšM}TÓ°pa§>ÍN5MªéQÛÕU¿¹Zçj˜~T·L#ü…;÷Mñ&t=ôEïÚ¦}ꢰ}êPØ6uQØ>u(|ÿa}+–ËTÄ_Ç<ÛãùÓâfû]˜Ï4j#/6ªQïô¬óehªö"½ó2­Çb¿‹\¦žÙ’²Ë‰xA¶m%=;)úÈaÿ}âçþÔâó‹Ë¯Å¼ìÎ}{#‘Í@aß?œ…½À®Þ ¹F³{ýšãŸAò¤ž©Fâ*øð|D‚”- 5:;TtA +~¦¯ÝÁ&Vºù N ’¾RË÷d dˆ±ŠŒ`¥*Þ+äXÈ/]›x"­ò…ó‹zs·›ùbÐ>\ªìËb’m~Dž;ÑH¹Ç¬`‘«ôÈö£‘Á¿Ò'°]Í”jgåêUmüIe²=TÛ¡.nú +ÍS—m9$R­ùJ^•ßÏ/¯×;ñ”W‰r¥¯I}4–V +¥õr¡¤^�+†Í•¯$B +iªë™zþ8™?ÄP­ã7 +ˆÊߢb.›)Š©¦3YA?‘òJkù¶ž¯fó­Áo+…R¾s»=zÜíÜc5VëIÇÒý[“–ëÒ%êãÅr¦q¹ÞÈ^Š_Uî÷„kÊžnìàé™QMÓÊèø,Ø“›-åµðQCs6PoâåSøð)|ø>Ü +>|z×Õ]wz]v=ªY®ÑãÆëÝï{(ÈÎ-.¼Þýº·vøºïûëA"Žƒ—íSìñ‰}QfOôµ€_û‡||qÈë‘7raÛ +£.ÿ«C ;(œ-sÞ¾&Q9Èœw_W¸ ëda­ŠÛ,¬ÕýŸ~Ô:ÏcA±�¥Bî<›qŸHÍËϸt6œ1ïSµñϬÚøm´Õx£H¢ŒÖUI÷¤ªŠŠ@ê*¬¤¢õÑõ1H_°¬e‹Õ¦ùgkÕì›Ó¼ÑZŒ7 Ey¦Q¬Ý,â4Ón7 +:ÙQEÐ55ÆëO•r¡hýׇý_½`„h6ë§4�ügøpS|¯ ~ vàÎéI –Û\|ïsëÙ¦¥ ï]êù¦r¼wbßøn®õð‹§ D:}uð«Óå«…_­._ üj´}Õ%ù<¼)nÔê H öáß }íè]à»ö@„ꊢ}ñO¨¦ÍªßK´ï“õlèÒ÷ˆV4†¬i¨ èÑP=FeÄU¨5/ÂR$1ãµL0êD´ÖùɺŽÖ4Ã(&¬jš¡¬i5Ï1jD´Ö)ʪ†žd í¦CmäEØÅÕpw¸…¦T„YreQº:cºÑ`šjw‚yr][Ã] +¦ UõP]#è×€~u#Ú|@r;×~ž—§Ó|àfû‰«ê0ÑÖc7ZÏ]ÕÆm:z½ýìUm˜l󀺾Z‡hâmðƒí¥ ;-û«ªãœWgœðã4¬æMV pëÄGU›gݲѪ>N\¬6´ÙxweåØ×Õ<ÞÝæ[š¬¬âhÍ·54=YÅj¹¦¡É*FhËÕ‘ïç‹E¸C€¡ùŒ;|j‡ÏMÇØôãæ ðc˜‘à¯sT„æÊA7˜r¼ü<ÁÊ”c¸xmÏÚ4Í3Q®T$òíÑWkj +!kNº¦­¬×uaá�d×ôªÚ4—mAŸA®«ÈV£$øþkûi­O ¯æsb£ªâYæ3¥È¶ �k7 +œÐ±!÷¹þa5sUÈÝ°#U›[ß.Tg¨:·_j”΋èZ^¨Üt1-m¸'za›‚p¸a7áÜÇ-ãQ„ëSëñ€–QËír­¢¥‰Z»×}é^Køf¤{­®]÷ZŒïµu¾Jr¯ƒµõ½Îù“îµ…‰¼×:¢Ô£Å½d’']£”³ºú99ñm¨p t¢…ª–kµÈB¦ž½ ¬Ç‚â­a¶Á<eƒÅO`Ä´U絬€Ñi£—sxUœÞx:•¡îˆŠMfNél"+båù*íoþE£\ÈŒ ¬Ìç‹Ù ÁâDbÙ,¯äÜÅ‚›fÞcøJ$ËÙÆU¾TOfêQ~<! €T‡?C<Y]y ƈø×pŽ«‡ ¶¾zU,‰ãðHEµ8î\áýŒØ[®á3#þ^ÿ°"?OÄpé<«|=C†wŸ…þÒ³xŸ3(nåA9ò–Ìäí˜ÈG½SA-ñ‹¹j¾$kµÞèPÕL]Ìà´Qgq.|ë´¨ÉZXZx3oà¬o±¶–‰C³Úäû×Ïwx°T;gW›êR7<uã K°”N„o¸Ê¬À%å«·{Íöº©/7Šåìe>wƒM+ ¼þ¶î–\DÇW›©ŠÇúWrí"O1$*èoëBËyýwã6ïéí‡7ß±–m¨}ðf±i­XÈ~²P)®h«Ü¨fóqPq½Å‹k™ù‡×ÏÔðô(æâ%-Å[õ>ì‚9¯_• ‹rì·rU_í¼ªț㺕ٖgöV®ìåÒ¶º öJ¹nyºïD 30ây«Öw¸Ö´-ð´\$ÚJþ¬¾V-œC8¬k—*õ€oÕÛ×ñv¡nß>)˜ûÕ"­W·Œ¼¤ù¢Æu=²^Í×òÕ÷ó‘íüWë‘T®PÏœŠ…ºÖŽm›6ï~lÑdªõÓr¦š‹dËÅr5¢GªŠø½¶*ØXÊU؆exÝ+¡~¯­î÷ÚIœ·êÚŽOÛo ÔC#ÖJFIöC1x!QA�Žµ¦í•{)ÔÊÅL=/ºÌ#™ß»öeIpåF]ô^nT‚º<QUÉÌMÞ¨€Ô9ÏGÖËÕÀ ̱aÚkzEt¹™©ÕóÕÂ×PƒÙÌ£AZ¡,7P·›­æk×6麇í«ô#3Ö +Wb&ÔIÛµ–§(:’ý¸òr•B´µïL±Pk-»ÊÔ.åf(ë¹J&— žGl1kÔËj +<‚v¡qZîQRu:ˆ¦}UzUõHˆYBÓxy|ZäLU­â¸ãïçÁ¸5rš)fJÙNw)Ü&[,Tă@è«â¡œ‹¹µ-½¥I™£ÝÖÅ3¿aՊïë¸"Hùý|µßZxÉ´å—±ÅõLUì†Xjm«q*6']57á,ç%°±B‰76{£‘ˆYÉ¿Ÿ/¶B±¦®SW§ù\¬XÄ΃~;WÍ#žUbó3kïx½Z>+óMý¶WÝ»(d/:Uí0…õd,íÄ.4ÝΕ¡¦ØìZ7Ó‚·òÅ…L]ÜÒ•r6S„ÛXà +Ѧª½€ÅdSÝð÷m¯ÂÐêÛDØH¨e^mFD×—G0೉ìUT^µrý"_¹QÕìÕ‡�o7\·š«Ö¢$ 6Ÿ.m[5yékµƒcMAçˆ-ʵ\“pµ¯V¢Ùr ÒjºkAÕÐãE0Ý©ª@†-àÙÔºT­¶Uí¸ö +­üšu‹Zâ5µT a Öº™\¾š¿¦Ç¢žÅçÑ»V¶íat©XÊŸgÀ<¶G­³R=š+Vªgå�9×p~u½ÊT/kå³³h½\¹yå¢ Çƒ)t©-îO>×Üõ *7wݾP1ói¦Úsï¡b5djv]ÝŠ > +¥³²¬¶Ýf›ËŸ‚ ó—Ãµî” +s¤Ó+ÅfÏ˧ +endstream endobj 220 0 obj<</Length 22501>>stream +u0½EzØ�‰¯›ó‹í¸ÓÙj. +H®˜©Dß¿iE¹@½óK€ªèÖ£z¼¶¢ìÑîùD­J¹V¸æÄ š8‚Š²í^­\…$#×]l±Uøÿ”¬ozV–°¯R®÷º†âÈ£Øg¦vZ¨_eZIáŽuËל·ªxÊâ¿ž5sùZá¼Ô²ΧR©F/Êèÿrm½nX¯IBáúzÔ?Ÿ•¨\¸O0J ¿„EºÑ»v5Ôg袪`HjAL¥Î•C`¨òƒŠ92¹Ùc®Õ‹ü–+•^XêqÇAÅô-*_‰ÏÅ°xâ­àå«ÍB žs¢ŠÃ™.÷JÀkpâ0ÄOÜ�Í4]£3ó)(ÑÀ : ߘáèV4²—?$Ê‚·ÍEžoí­­?‰¼o\³$ ÐÂï´ÓƉJp(7;$»2¥R¹ú#*®QÊöæñz #¨¦Ðqw¡«Ê•\㺵kûÈ–{ì Єł|‘n'\ ª´q“©'2K×T:Åø`=îk!ö¬iU<W/È@äWèØo@ó4ÝóÔoz]ˆ¤j¹² z¼}Új#´»öYSžÝqr]ðŠJ‚Ôñå ±-Õz-“*UŠÙ{mÑ�ç7 xD¥‹^à ¬óç [wÍCC ‰¢¸ëñí-(MQ=4°ëwÅ Mȹ¦ ÞñØE&tJ‰fÁ8/&kFB÷Ë0а¥€J2õ눣ªxÈÕZú«ö¸ePµvY¨z¯Ô›ÉFŠKÐhxßq•KåÓEÁ=„×èb\Q-µ¾Å"º‰]•Å›€[³Tj7çwªu­—�aZ‚…i›M´›È�¡‹^‚¿ð2ŒHlñÆ«ÀÊ×/«Ýi ØCOÙeX|[*’¾H¡„bHà8Tå°ü˜÷g^æ*„x$Qî(¤PÍpJ!«R+TO\ÓŠ»A³æ9â`7˜¢ÖõŠm‡ä2­—v­M,ÚrÚ*hÝ.Ah˜ë�Àðáb±Ø@æ]\²;Й>¬m=™>–º£ÐP @'2R#ÔÞ¾µ#™j>R¿ÈG˜"Žˆ« j‘.ò¥H-ó>L+SŠ„§tb$SƒbŽN‘L+]I4²SÃ.Å¿Í}XnD*âuEÊ¥Hžæ…CSwçà]hh,"SMK¹Gêeè"›ð²g"Å̇ —ÉT*ÅB–ô!µFö¦·XJ"¯tC£•Ä=kˆÙ•Ï‚á µH£t žŒÑÞ‡w�öZt­*¡ëx "“ IëË…*›–7T2Üph1g±é™–uÃÆìçøaGJ§ÛˆóQ«ÐÇÉ!¶«â{Ji;¬d½,þÃVàÞc{)xºÈGo®­ë,Û•[²Z.•³ÕòU>)nYwÕÞu¿< (ÕY¥çÑ´/ws¢ËÂY!à†oÓMÛŒn°–ˆ=(wªµžc¯v<Êb)+�ÅmnÕ.ÉT{q­4&ØŽÓL}%óa¾§xözåÞ xg=_7¶^ɛ肻4¦eÆaŠ‡ÙµÛsಯ@?HËãÞÜBK³í +ÿ˜NáèÔÅE +"äòÆ;²Ý[ÂßTwó:‰]ó49\GÙŽZÊ#ÓRÂéƒrõr»·>£k»ðônײéZÜ®ih•Ýô²ívµpµš©^îå¯/EvÐf;08êÙB0:‹!MHª’â½51²®À‡0‰›T•‹l¥8;Otg±ªÜ ëF%¤Œ^.”$Œ³:j%íD´’âØiùý›š0Yh\Ãvz4´ý‡àºXwô ª‡–ÇÖÁͼiÃðüŒ.„‚j×k_znjsã›b÷Mo¼xko±ŸŒx_bC[[ÞxG±áKoiKë[íiKÛÐŒ{b%T÷ò§»…ü797@ß™z~û¢quZÊŠ×�¤F—„°l;,<ì$É C†VÔ©È°øD7¡ØEI »n`M'8×¥òid 9–Z$tUzæš°­ ŽNïÍ MežŒ-™ƒkãñ¹êüÕÅäy©o)Ý76<”(d¢µÎÎBÊ韜ۙŸ]µM®<Z«6²n:e¬zºeõkZ-ù<y>¦=˜›z}87=V©ÍÕ– 1ÌÜÔJ_UÖZªÇÏ6V榭üV¢03›MF£Cçmc­äöÅ€n2=0éÌדÏâÖÁøX쪼R‹-nÕ/FgþF:i=Ø‹?/í‰a’gÚÒiÇÞ¸þ™»»qø4¶ˆîv5\oòhnú2}47Y‹^&ÇéáùÜ™÷+}"hãäÙÑž/ΟLžÅ/ê‰ ÷@oÚ‘“ÁdV_y17ýhh:“®%ž?+‹ß_$s‹}ñqïùƒØÖx‰&ñ$“kˆaüçãÙTÖÞN\XÇSÓ±sp4þxìdt.1´“Nägw—ú/¦²ÙÌ%üVM­\Ðк6‘q«…'“…gK¹xqàÑÐxuôi#¶²5ø027µtaŠaœ©Ý£¹X);t5:³:5á^=)¸îDíÌŒU³‹úè央ºÌ&—j»bçÜ¡¼»gj¹ÉBb"#Y_ËÇ‹îú­ae`.±8Ý¿—ómÍ“\<túgÝDùÙèônîpÒ8í?Â~gKbI³ÎÃ~8–CgÏÙ(ÁVÍÆ/Gœq¾ »¹M?ê_MNd¦Ó}£UÆÏ°¬"†ÑNï/ZøÇèlzš›ÞK-SýÄXê„z3öEqƒŸh£³³©1#ùè|†;Ú›™žÊ=ü OSÍXô··å0¢V|IMá(˜‚><³ µò–Ù}ñä1n·`iYÎó<ÛN>MžM,¿He2CâÎéΆ¿>ðd'¶–ˆ¯'϶ +/æ^Mž‹aâÖþö1mè“;H룻qëIl-|¾wœ(<w&¦Î®ÎÓ‰³‡ºØÃÙ×ÝÌ•ƒ½­W˱µ•‡ËéäHn™vGî5=¸õJtcôÑnæ-iÖñ2sSÛõû±í¥z£}q-›Ú yOª}²«-ñ‚Ö௟:È œ'Ó’Zú霉÷`úd:wäáØh¼ì?k=¯æÍ ®< º>.j Ü'XMx«–VæcÇK:Þ›éÑÊÔIzøl9Ó¦·Œ‘Ϧi&Í;â46ý|zx°2’¸p6/S£+Ñtp_Å;Ø/#°ÙJåà¢Î‰×u5(×?’8¿HÕÜ©ìÎfÌ=0öZÏa}¡¸ÛÔùýùÔøØ©ßéXüËürB Û^Í +`3ë'ã+û—æ‹UCõæ÷Ý3ñxR†fÌ[«íק¾žY/N¥“ö1:;Ñ‚¥‰ueÏÒ©¤íÆñµ]„=Q}aw GMNœTÆŸ×sWñbi·Û¾xò@ô±üPuPI•éÁq÷0¶yv1$š=ŒåÊÃx7ÔGæñXz¤>‘Cˆ˜¢ù‹ùù#Ÿök{åüÂÛZ:œŒ6Õ;½˜ºá¼ÐžŠ)ž<P @U!™+ÎUûŸÔŽÇ"�k):›í¥†ŸÊ^¾äýÚ|Hð³ëW€ÐÅtù¬c…êÆÂãض±›¼÷Ð_Œï'N.“sôµ¾\ŸI£õØVãA!uºËÜ;J./öm©¯êB×WÒ+¢Ö2¢3 c{þ製ÑgîæÙPÖYì›3Rf<e$¯´¸qÒ7Ãßô±á„o$®fã«¡¹PÙÉC3Ž-Ä0᪹‡ÔÒHõ9 jybú #ŸXÇFÜ\Ž@QoÓ i#½=µi¤N'± +WN¥p˜`‚P+Ü#ÀCK¡é«zöÐIÒthN0;ì&ÃÐJ±K˜Vú(¶…eÔ®‹†æ-»LºeÔÓóÃiÚè7m£ö(Ô`Šž¿z¤gçÄB»‰ã'ÌñF.ÛÁ&ЖF§‹¹—Í¡X°¹b˜–Óêx¾·>Œ–“†ÙÛ˜§ùÂT©ìø 2Ë[Õ´#T/ø{ÃãÐ&Ñe579\ý&»äfMâÝ€³év=ºßèӕк‚ûÒa¿ð Ói¿p¹´rGB«†Ê÷/Hh;äªMkY84âUÍÓ ½V�0`0*öG£Š¯¸šàÈš–¶ºÄú°ž ¿Lhï tU±S¾TáÖÛ}Ý¥Á]Ç *Ü4uúA#Z¾Äe¤c‘ ÆMÃ7 £§ý‘5þ �Bk‰ù�Ñ·­ÑBL ±² ákÃÎìŽõ8æO½þ¨¯,®ÍUëÃOSÙF¿$ê  µ¥yÝe è?‰o<Õ$‚ÙL§Gú.�·=Lž<"ŽIJ¢T®šq`S½óì +2YHu¶òYã*ªé†X;=~œm–F‰\uöi:åm.Kr§VÒ1K 3ùXOˆ[ÛiFëŸÛžO>.çú7g¦Z¾Æ‹ÅLÌÙ;<šL.Íô=haÞ˜îz:¶ÐDÜ6ïͨàC¶_Ëm£@â§çÉüÃÔf/ÙÜAvs=níS’ls‹;}:¼pêLÏU«;ÖäêÞ#$s=»PuîLæ"ã!z›i §“E=®-Ù“âŸy­ ÉíÓò)w1LÓEu*Fx +ØÞK"xOÜá~ ±Jó•û§Ödîêò„Î! ›ÚPW�lnÏâÝž¿Cªó¶,Þ­ù; ¡;gŸvà R§ÚôÃd¾ZÓòë3S꼚·jáir9î ‰[2rŠ·_3ÍÉÛÏ;7íZžc<˜ ðvøó‰¬óu߸äwð$¿–œ¿È šxcÎhMílr¯Ü:U`c¦kå³D¡Vp'/$.#b–«'íý¶±\åüþ›'ùåäÄ“…GâÛƘ9øxoƒ+”5÷²qº®­,ŸV7º¾¯)íÑÔ p$ íÌO,òhìÄÖ*ñ¦×ô±šâK¢âlŸÅü©åqõAÝyषæÅQ]Z!ΰQÞv禖÷ï‹'pÑ'Ù(8‚I¹¬Å¶æsÏÓÓ©™ª1·ÓçÇ;ö`âpf¸aäã ÛƒgôAñ¯^1Z]@´‚n×J›ñ–¡ùy¶Žþª‡ÃÈ›éÄEGO£j7ýìèa:Ujœþ•tî¹Ù•¥øÆúܺ1²õ8t·vñâñ‡½ç¦âÖŒñÉrb1Y|"îÈÆxl;±³“ÊœœŽ¦vŸ,È0_Ÿ?˜8)§‡—ç púKÚRêE¦c°Z ΙƒøÂV‘yuÉ &O­üÝ´¶{ãÏžÍ5¿äpo7|ÆJ†ýº—¼0ž\ª><¹þ‡fÒÂâöŒ¯_Hi@¨ËùxÑ9? ^\ ¢›\2Ƈ[ú ?ãñÃMµ¥–€› ¶K>tÎœ5^9Ž?›Û}P¯ÓœYÞ~‘œH›$!U¶ÅÞD'š${«y?Û˜¸[…È?9qz¼M¤j§“cÎè¤îõ=Nì¯×Ã(l/7ÂZm/¶¹=ú4uâTêðÛó0eCð›XüsBჇC‹¡OΪa|ÎUGSÙ‘ÎeD£ÓIÍœÚL¦'cY¼è „Æ×—OséTrÄWun;¹TÛ›:[8=Ÿ›Ü›ØC™MòüaÌ=: 0„`œéá¹ê¸ßHqª¬ Æ~èa‡éOJeEôòtu+9¿?w–\^ÞÖãã“ù +’< + + y±=ø`+}Ü?øLœeÌnu©‘ŒnæÆç&?¿ á;8/ç~º”`±0—­Œ¿ØšJ‰ë¶rèdb¡ ô­<½®«ã^ P.ž¡8Ú‘óÄùùùi̬÷­‹Ýx¡}qáz–?]‚+л–=pÒ¡Š/NôM�² ‚#„)¶Xpê~ܲ'_Èë�›ö»Z‹ÑlÏtêtâ Òá‚2SÜßéQÍY­M¦–ç¦â•ÙÈ×"1627u´³NHz¼Ü~þ°¸-ëÏ榾éyÏÜV2¤WˆgR'ãçEt–£©g™­õØæYÇ‹øïžgW§öPaã<ržÌ''võ€,ç¹\Š»áßÚz$î­»Ÿ<;Û0:l©97=ÞWIί]î°`Ó|ežýŠúÕôÅ´f3¸*JÌÛrKÄ»Ù}t97=[I +p6奲§öDœáôßÏ)>çÖµ½ùØŪ•î¹<ìXÅ»˜z’Ðw®j£3KÙvè_ÆRÛ1×ß<Èiþyly/¾Ú>Œ¸2ý‡pú«ñ«µYûfkeú¯¹—Á–žfÛÓà›ôúä¥<­…ñ¹Ýå'NΟŠÛj^\5îcöÅ•xqç}s/eóM£5bÞiå<ôæàݺÕÕaO 3?zh†Ž`fÙÐ秹ªÅ£Úå±V<žÜš©NíOùOû+É女˅™§–ÑziŒáBlýpö)À´­Ævƒi8gCKe³³z¼ø<w©NÕ‹mç&bkþ¹—X +L5|lµßÛƒ1x£cX¡S+xFÌß�ÅPš›ž¹Ü¯à‘ç<¸?1à?‘ÙD{ŒO%·©úàbŸì÷Ä­í,¤c›å™ã˜½8uŠ:­f‘6A 3½<ŽO<È +¢QtôŸšéDìè<x4å„¥¤ŽœÕ}¨¹"ÎÐÕÎýçÕ¡']†Z%Òṳ̈K;ÛPÌÝ\JžÅR‚¼8;ži߯þ˘½p´[]Köû;³:Û²Žç»ô1Xmõ'–b¥…‡/ÒÓélí&O¶ùöèìò�”Üžô Ù½G»“ÆÉÊtrùhÛL—7ôpe?vbñLŸ°~rGˆoÆKcÛŠ±›y(Em<¹¸øäpÅd~úÙýØÆÉ]Ð.ôí¤Û•ñdÐ"Äî¬.Œhñb±rBâEOÊ›&öÆ&vg0¹xU8 +o(Lër—}ˆ3y5ª&nÚJ=9¶ö"‡,“à—.j_Ÿ##f0•½ï‰7ÒWmÐ1º/6WP!8uv58(X×çNly«ÔrÜ +Õ¯&ÏüTTÀêèHg쩈©½ÔèÚÐh¼è>ïUov58[~ †NG; }onº˜étíU•CÖ] »ýFÎ×áªùF¦7 Coj°QÉ#ߦ- –;$å@Ø~5ì•ãÅhªþ|}.¹˜Û¨'—†‡Óð´çv·3p^xÓ6 +¦…IߪTûsâ–XcââgӉ앆¸KzWˆ+†™Ìå²Û“Ÿ6Ò'ÏŒ+±ÉLuíb[§•3æ3ù6ð»°½™xœ¬�ˆO-?H>M¦cƒKsÓ ‰hÓóõŸö Œ÷ OâÂC”“–€sg•Øfibpæir²ì)¡7¦w²2±¨wyÞÒ Áféé„3yº6óæku2^ØÜΔ¦ç‹%q^—¹\h æÃ᧱±ùDìùÎÈ:S1mvé*ti$ˆ­1˶>8*†™™¿ðÄXcóóÞöS3b{És{°+_¬= 8°$¬R0Š�F +ÑoââpúE:¶>«™\­5ÊÍbQÇy¡û›Él"s™|X˜ÈºÓf*Ÿ:8[L)! VÙ´ËV:=§Õ31o<z8¨y©)]?p·O&ÒÉFŒuÒÏ7ªçRŠ­-?¿œšg`×Òåù\Pc.°þhêwã~ÜIO¤r“IÁ߬]LãWR¯b…íþôÜP~[mßÀªgöÅÈeHÖ ;=š^IÅûD[#8Ú¯é±ÆÓ‚höp)yú$¿)^Ú,Sæ÷+'HªÇÓe÷Õý'–)�Vºô£’gCÅN¼ˆ‡ç´1\O/f@åì¬ç&ðÞ¤ôás¸FcÉ¥¾3­½~Ewv_œÅ嬸“Ý:o¤ÎKɳòÑ(Ê;””£E–zK‰øö|#Zy[>ñ‚+€(!•mÜæ­-˜Û¾9¶4•>Ûl{A¹Àvª,€ãø~ËuS$Î/ÒCß•½N}ÄÖ*Î|¬ü¢6ÑH €2vN¼gíáäRfw5Ø‚&1ú† ¾WÓCóéAp&3‚Šó±½÷ š\í·ÃCëRÙÓ±ˆ»qÙÕ}PEÀé'Ï´ƒé&!Í‘;7õl¼üű@+¹A³Ç3±r,ŸÆ âì¨#s86ÜRÜ--nëÉ£ó#ƒHîêØzN<Ä´XsBJ¥çW*mS´oÐßuœ¥Â¹³=¾`¤úÆã¥\æ¾W“]€Dhq=Qè;J>̾HjÆK(zÃØ}‰‡º`J®׸¿s:ÂËÝü‡³÷”çd³}]3I}à#E†z8¥LõZÿÂ]4Evn÷( e8kIà�ƒ”ÙÔäGÈE)>„‹:›üÎÚÉK±ð“Y-7¸5‡Îú ž̸gzd]LŸ¤Ëhêj¶pœOT«³™Ò|q÷ùiüdu#+éGŽ9\N-6æáU-L¬¹‰ú䨰WÍ—®´…“õ„€÷uSløÈš5½1iºútBÓFx@EVgóOûbk϶wU`=§¯£+µjÕ¨eúÆ'†6¤ºLö äuЊöÇÌ•¾±Õ'+}£÷‡úFêñ‚61³?¢†Ù°jFmõ.‹ƒ=‡õM=Òw½d®‘J&žé‚f*ñæƒ 9ÕUÖ5e>ڮlj6 ÀŒx*û³ê«1:³é\ô U¶_ô]<_èÍF`5cǹþ1#½Õ7¼Pƒ?÷£æŠ/–<Sàaĺf+#ÓÜRžtf3ο,=ÂÕD'jö ñÛV¥¥ +P +°Èš—.mÃþþqôRèD`nÕ§µsO í5Fgçûƒ=ýzóæÞTÿ™øs¾(Úî'ç4U;¨M­¯Á0ÖÖ0Î7ØZÑXj=¹Xë8êÑy|¡ë¨Žñ|¢¯eT†>­>›Ýë<êãøHÿN¥¸ÒiÔZÿ3'ÞmÔ…Ù ·´Kï¦Ãr­‘'£SÙµÕN£V'“æûN:ª¥µGÓ-£Êç)vúxSg~—Q÷ŸjéíøFǵÞOW&Ö +«›Gï/±Øe¹NÿÐÒŠµÚíhwªO³ÆŒ:Ò~®÷÷Ì»>$šYeì‹CG;ù`–G]j9ZkÛ/â¨âU¦šG=ªížnvuòà÷Nî|"84ê³ñíÇ]Gu'ζ†::Ý7R­MŽÖ‚QÉZZ ¼î>“׸mÔÚÐì¾ÞeTûbd(žŸï<ª5r„,ãÔUçåÞOgìþNcµÓ¨Zzy#ÞeT§ÀöìGÁ¨0LÓ…:ÖÒåííΣÎ?˜\É_ìtu~ÃÛí¶Ã@^ Ž÷E/hàÔÓËtÓ&ß© Íá&?luáøÊ~ñ°¢‰QÝJë¨+‹xÔýña8›æåºv4zÐyTë ®­\m¸G]¼ßðVö³^§Qجó ÁÀ-£.G_TƺŒz8ªm­¼htuÙ|¶’N?êÃQ‰ iZîöba±ë¨[«ÎöI·Q“Ú®öÌï4ª¦ve¼;wüpªã&ï>›©uuw8\é6ꪶ7þ(Ž£âMkYîJjtoΫ&:Žz0¶ý¬ë¨Ïïo¯Ä;*†?u´£ÌÉhçM~¼S¸œx<ÖqÔgÏžwµœ4|Ž£‚MQÛrŸ®j'©•dçQÓ;úý'õÅN£V«ÇûyÔSs$ 4¼ŸQÿaʤåfî×ç›!Ôdµa&4u¬mÔµ™áÏROæĨ3Õ–QG'Ëûc8*â›KÿaË«8;¼Oè݈ïë‹Í€bSK=>œ‡QÇÛ±ìãñ%sj]Œš¨£Â0¸É©Ôó(-÷Ñpj¬.åFB™&ËÍp1?:ã=>„Q'ÚGuîÏì/�°/õµ,·Ïˆ¯]ð¨“Ñ–µ>/Ϥ.iÔG;++Í;,®Ôó‹2bY¦]›H£~ÕgL–N[*ȯÁ>3wUéüÕgÖÎwûZų9]-t©°¿®¥¦×Rôµ>8˜ÑVæL¿¶c™ƒGÚÊæ# ¿Â…n¯ÓVrËN·æ mµoÏëö5¥­e7[¾›fk[‰Ëz—æ‡cÚÖn_·¯Qm{nu¸ÛW†Ùé{í\aºO«6ú\þÚµ´Ý¾úÚúܬÃ%m÷|ü‘Ú´ö ++ÚÞ?Ö­ùcmÏI%º}]×úÝ£–¯¡M;|®=9xØ¥ùSW;z~6Öí«¯=Û™2»}ƒaŽc¿K…ãª}¸lwùšÖýcµË×Ó~=>ø,Ý}ÓN·ôåûK]šgËúãK£ÐåknDß¾<ØuÓìg¥í©éúAçæFm½ohdé1~5†f‡š¿Æú¢ s³ôµ +u@}ÓÖÒóP…ÄøÃÍ06œÛ—k gmxŠ‹Û—wâ½™}¤æytzû‘»Ÿ<Hïo'RÓQQ¬¥ñh6‘ˆO,†Y¼“"LǤCC÷›CÈ-"Ä>è0€‚«^i7mæIÞÈ¡€•gÓŠíŸ(ÌœŽˆ·t?Uó6&×›Àoõ¾14³>Nhø ì j_�Tn¢Óp`ÕÚÒ}ÔûéÜD×Q‘j•Ø(X¾‚Êtõ¤Ç¨óã~hÔÜà`0*òa:ÍlÙdà ¦ä¨óÅð¨Ó÷‡Ã£Z[‚Q˨G[Fûâ`“7è2ªÓ¼ÁÓΣZû‡]G;|e4ÓiÍËEÞ ë¨À亚oU ¾P7žt®; „Æq·Q7ˆÅm>ÚþÉ1^8þÆ×}ò†õ¦:Õc)GSUëéʺ´FÖ©Á cÅi!…^0^ètC°äC‡‰@žƒÄÁ¹¿ÁÛŸÓÇvô1õÏa˜§gÑX%üªNFK¼šM5 ÁÓ –a‚‰@XÉÀàH÷Âdy³ŒOL' ìaZÒÐ-ªY~g]ü98Àÿdž„¨é)ž¨|˜ÔSGµùЂC3žM¡Áï�nÚØj™6ˆ¨z œƒ5ˆ{˜hÚÃðîÇ'.òÉøG\ËGÚb§9I™ NKÕê2­±ÔýÃ[ªw â®7Zv=Ø´¦Çx…È~w\ázßõ+Ä6¥ «û1 +š^\3<n<”Ó'ž§u…8Œ¸ZꤻãÍÎpj´Ó-EYg×ýêÑÛØ­î|ÀvºöóûÿmßÙ¸’üýþžÃw�G0 ”ƒs�ƒsNãÀ80gìÝÿ¾y>ûSÕ­,µÔݳ{æb!:TWWêúu}ŽÂ_sálþHc#SŸžÉªvÂ|&ê‹Ùe„£o¢‚HøˆH¡‹Úg wþ©R(Lš·p"m_¾SŸªLÞŒ'ßEí;4œèö$¢žüc“ÄZcÈ׺:-±„8s{R×&ÂnðLÚÚqru’ˆ•NnÌô¢Gq#Ylï¿%Ï møíoZboðr6ʔрƒ‚:C‰6í­©!XªfƒIÜžü´é²·Øû>iØìã24u_ ݾ ÙZt÷I$`qè #îä¯!7`p°ëoÚð 1›à‚v¦ÁÜ©¹ªÌàÛuùúgu+mIm[À>`GÙf‰Öj«e{LþUÙ¶ÀíºøgM¸dðíÞAœu–´,ê—'©‹‹Ãz1ûÉ’—W +Á¼Î!5åžßðY“Þ"·Ã"6¬¦+8)Œ.òC[º˜îŒlTÙ±ÎR½îÊ©Œ÷ЖWY›Lí鎈ÇÖ{±Æ™cò–/´†Ä“Ž]Æ—‰Dkcœ{ ÑÐsô Ç2&ÓKìÝvO˜MÑ3é,­=÷N³ÌÑÖ‚ +f”iþ™þ:Ïh‰Ö^f¢ý™-ÿÊh!é–mšv̉Ù|/~EðnåÕó›°HÊr~ìxšß•ilO#^gwð„¦Ãiz²¶çêùËX.Û³ƒ'([Éœq§c“b”‰¹­m¦ˆõ<‚Deð cÍ+ t­žwn_‚5›dñ@öMê`p$ü^MÌH : £G"3G°:SÈ’"�ÂÎãì—§°Bæà÷
ãGr¼Ì_r~Q'c"qpŸõ¼òà¶Åß#ü!_ÞÃá¿e'IXåy#Í Œ‰F9˜ÃúÏElµi‡(xÞ`Šf\€9Ãïêtù]aë`†D"ʼ 3©Üü–fVŸ×m«sTÖúËÞ™dG:ÛÓç1\wpŠÚW_ÙéE¦8X¡ôʸÙèåítí¥Wp³ Þfw†ó¶ÜéJHØdˆE)³ccéÁ”)7˜¿ Þ6\Á,Ü%ikŠ3˜’È…ÉIÓÌÉÙÁ”ôˆÊÛ¦²tz¼3d Ä ©*Ö—8jhº9ýˆ›-fɘS +kYÎ QÓ–¤ÍŸ €"H„„ÑR£ƒa¡ðüƒbÇvÂBÁ–i¨DÐÒ^šÝÿ™ÙÊÒÉ$GüÑgf³÷ÍçÖÈ16Ž4éjOƈxUãVX/Æ°…g¦¨ÆÏ­ jrß,,Tx%s$amè?&âŽô‚½^"º0û” ¤Ž* +¶"êϯo2Ñ&¤ùbEAÀÌõLŽ(‚f.ƒ@\fî4å´ñi_f|Zƒgå”@9ŸŸ{~DânA§pˆ€öþ‡ús])á-l3Jg‹„lhm”]H96Ä'¡YW®RÎÄø~ÑjhfÔDZ¡Ç ¾¨ú° Õ8†ƒÝ¤6TÏvn£m[€´&ŒÐZ0 ^©„,Q*:ÏC'ÃO@S1êÇçâfòÌp` §FÌ“B†e4”Ù‡Yñ†iTºù·ç4¸6Z%$ÝàÙl¬…—IºÙks’ÃÙ-œLéæ tqï±µÌÒ¥o°µ¤ÛàEÉC +à¹>PJ•Ñ„Ša†C•çxÄIúpØb„ÿ—4Ô`ºÿ¿Õ‡‘"öAa¯[5!¨æ?lx¶‹‘ì<2{Ë G4ªãcžÅH?Ê]ƒ/6úi¦zºÅv~Ê+qI&dšÐ=å°ù“%®OBck#'T´/>ã<nï—scãʦxÄC §aCCþáVÂ+C7ÄévÛÁvCixIözP +Ör rOƒ"nWCÊ‘¦Äo‡Ýžá¬ÿ3¦rÌâ¢6dðË;ô +¶6‚õjŠ(Gäv(v“ÆÂñ™áÔÚíØN>j â±kÓ‡“GrihØÈžßa' ICêǘE«'Ç¡³ëÇÙr-¢g˾•¯fÕ0’ËoŽ¼,’ïew0I0[{­ jz;3á|‰œ‚ܤ)w“'+ž}ÞísÁ¡ìî¢é£8 ††=åwgbú<.æHµJÏØ 2Ù)'[ì ãÁ¡©äÕó‹zHSE’18âÐLMu‘äÆñ¤Æã0¶¿Ìv€š›lMPrKíÅÖxT£o’°µ‘x9D´‹±©,vG8×Ñ¿šÑLߤvƶ¿$eúúÙÂû(‚ +PΞÛ‰õn,WÛë@ïŽÙûÛ~=½í’›bÖ­‰å›õãÅýó%cù¨¾ÉΗŒå£žtp¾d,Ÿ_ߌç«&bù +.tqD8ŸÛk,–ÏwÂ>œ/ËWðCGó1{%X¾º˜ΗŒå+ø¡‹£Àù’u ŒçKÆòÙûèp¾d,_|0e8_2–ωr$&@'�ðñ†g̼gƒ‘¾˜^‹ ÃJËßùàÂ*RnòŒçIsŸ\6ƒ0›TâýéLùëìå#©ä(^R…”4JÏ)K�¥q¥üùHåo*äß@ki<Ê=C?‚Ï–áIòΗAÝó›„au“«<c*Ø@Ì´@W©xÀ{©9P||{ÓJÎ/ñÎoR`\{L¿œ'¿ÄoܶF7{“ ¹½Ì4¸”É]gÊ/‰M¸DØ#Å$ LòÓۂÈvÇ#nvÇö8O+€0˜_ÂN²ˆwTZKB‰¡©žÒZJq'„,‹ô3·„¾“Ò¶q’gð¤aX]ŽTMzš]MÊœ]‰Â ZËÀ°¥ÌQ 'À$ÄÑ®#*m¤M+ÎÆâÐë¡ êøÀh¦ð;ÍÆàÆÞü¤eÞóãÑX6™K¯™Pæ={X=&'Î1%ó~ï03Ê^CŽÌ{~Ládö5,01…¡¨ç(q*„m‘ZcŸ¿{™÷ü­¥�~2}ö‘y`r®DSF$Z0^L/¼ dô?v’ y'xŸn}wÒ¡Äζ*};Ö™ +ÝKjÃn Iö(“ìs)uŸ?v²ûƒÌãÕï¥T¶pìêxAñ½4•zÑLj‹1åw­]š„+i¨=®U +¬Äê×Ða‚íR÷m”!S(ˆ`qI€'”;PyL{§¤f‰„£ê!A¹Ù#u¯ß\Q6Cƒ2ÍààêÅÇø´lXVšÝÁo§=o ¹÷cì4 UxëIª`r’—œÄKªÔXPˆ˜™÷L;$‘0¦‹O÷l- {ÆŽ)qWǨµ„aeŠÞ°S⃽̤ +Fo¾½èÇiÒfªÛǽyÛŒ‹ÞdMƒS&fËÙ£7ñ™÷›¹EoÞ6óHN‚É©eŽEáŸÉ<ÜÈÑ\urR8bž âáÂGê!öq““Ò°‚£Eohð±‚YBLÅ¡ƒâš+E°5¤?·BÐØX§ÇÞ2u>$lfR¹|~ˆ²tbL'Äl2E€¶x³t‰©ž€‡«äcÛ é›!!~©×ž‘Ù¤CüF…dB7ñãÊdI£M€¥à0§§ Î9MØÆ®ÕJ9>“…g)ÁÔ|aÿÆçP"óâθÓöø‘y¾ð3m/dɹ‚ó²'Ã&#ó2$ÃŽ‚Ì äz༼‘yQ‡³¡lȼ‚{}{|k9!ól™çåÌ‹‰Ümú% ó +ák üÊ,?d±ÁC!óÂÈÌ´„öéÇÈZõ]#·Æz ­¥ˆ‘€HI½„ÖØGBYRâgVŽ¸ï'a±Û ÂezCñ×od;,& o9v^¶…Ÿ•¥!®ûU ÿpÜÁ±–|Á1ŽÁ;“v÷cëjq&¼[WkÉ4LIèðXŒÑ÷ãŸéø ^ +þKµùS¡§¿¸vPP¦1S¡§Ó|J  ¦JŒnª#~1—«ŽIC÷c¬‹K}?ž2=îˆZKoˆ¹¶úã…ÍiäNœ´‹²’ò%`†…˜²ð˜éygq»u8ÈA¦å +’=Ë${–Höê+¬4VÏ$ å�’ÅVrÉbC¹€dIÇwÑu<Œ.Â’plz6Tx?vû¡ÍH»éöóÙLPž-Ӳⅲ‚ò¨qË)æÊsˆ–ø6”—!Ö$Z6 S’ï™#(/ÁÈ”GlT£qdPžmrðe&ƒFM°“n¿WÒᜋá ~Î4_ÆÒì4Þ<2lí‹}~äBrž±µo’ϲ¹_¡<äÉÅÒÝvOØYª\7£`o$è@‡-Âé£Ià +]iž%s–„Tmuáô«ä’˜ý•ÖˇVZ?ÂâñÛ¥ºYï–f¶æ¤R­yxVªÞa­õãÒÌñŠ^ uØ÷ñÕµR}««‰óÃÖO /þA;ñ© 쮜PBo¿!†’a�¸Áôć¿LlvW¾›8|aÀî*W‰`¿±õ›`ÁÖ ìnUßcôª°Ya°ßM2د]Òؽ¶Ûý ·×0",ýVð!½® hˇ¾^C°»¹×“]F¯Úߙ峙Ï ì§^\$ÁîEf¯âúu'ì7ùÒ8½cõz›Ðk[œeöÚ<nŽÀ~¥«qý„l,Õ’æº1ZW;W½N†@>9¸ÀŸ‡Ð«ñïí÷8Þ+`Ùê½…Ç«ýŸîˤO™â¬#&ª³ƒá·µ²§`msp-ÉíJÏï ·ûSo¡#&º=gÃik™â>.¸è“¤ +žxøžìš^ËÉwQÇŽ).Eq*µD dÍ3ŒÙ]C—׋³¢%džÓËëq‡íö§Çò!UÜeéɹƒY+ë%‡í†¯¬Ç;ý )©°ÿ Ù'¼|hN§ÖX‰S4üÀQTLÛêUè¤+µvت|¡�qÀ>¾˜ÍÈÀ>÷eªÏ%Z~À¾¸ÉQ‡=W`_ÜHìö<}qSò’“rö%$øç ì‹# ªç +ìã¸Ì$`¯’Ø“êK wì‹ Éþ‰ŽmD`_ª‘54 +°/Îb g å�ì‹Cõ9¶À‹ì‹“³¶G'°/nLŽ¾É؇êóPyûâÌV ÎØÇHµÊØ×ÔP‡ÅÉÀ¾¸¦ +ÉxÏa€} DËØ—+ÑØÀ>>¢ ì‹;…‰Ï¼ ؇꣉c¹ûâP}!%°/ÕçK¸Ì Ø×€sXÌhc`_ª/‡ÎØgè${ ì ‘ƒœÀsÕ³S„ÓG,Ä_ÖœR6`;e‡å¸‰Ãûˆ³ƒ°ˆè¤pRß𘾀Kú`F}Å fD~\“#¿*~)&G^UüâÄ4 B2H•RÕ3•Tþ62È´äÉ%ì-ü3™eX)ü˜c +›êXr/©\o–1©¦:'©RËô†…M°ô!ägÐ_B(É„õÒºL›a—)šÛÄÊóŠÿ”jÅ_üÏÇÐ õÿ2e=& ›äú¼“cÿób6\˜¾<®g×ÿË4¥¸â±¢3 ø_4Wÿ/9»…£ø_Cså:¦ÿ+Ģ𸎟@MŒórD}G×VnO¬ŽSúL.4ÑW~ƒKÝc"ÄôeÏp s),|luÀ÷äÃô “iÖžçcg†ð×3ä€Çñ%©! Þmìø7‰õÆÊQwA4_ÒÙFõsÁ—©_¹¥Z ·T+r=Áèœ4az`ÇÐ1JÀ¿ÉØP*Ð×k¥À„`ACÃÕÀ´û#qŒ£¡T˜½kª§%ŽakC¡}]%Fû>÷Ê´ïs/å4*9W�1¡5.‰}öÜ›‰d?¤+3&5Þ9¨Y×ÅMÌÚ>žã³ô”í ÃÎDQ„óQ†Æœä!=ɵ¸ãI&[ +œ~ŒRÜÛ;VnFnˆB‘zôMÊáÚШ¾i¥>V12› ( +ºQ2C(’‹Á&‹îGx–B¼÷•þ _ælFf’ÿ~ä©û‘iÌý8RÝ?/£‹Qú/33¶î_ø"½Ð^fHSÔÅ •þe^‘kÚ†mˆ·î_jT=Ÿº~Ç#¶ôßÉ V‹!%"V2¢}¥1.|nÐø)ÄߥŠ­\_ ޛȈ™Šöå¹£‹44rðëœúž9 }Ï’“¨üÞZzCì»íR€Tþ\uwÝvØ1ú!€T˜²c'Žù±TÓ 'ÉHÕí'ã=“°TñÈ´T UÁwK|–jzáŽY+-Å»® ´ö—#'‘ H5½ð·=9J’s¸øܾg·Ï•1É�R¹ñ4,-É¥â³aLÁpY8üw{9»%Ï‚c\<w»zþðÃb•0è–CI¯ æòÅÚiwƒÜŠaBSÁ¨33Ƀ»½pݪÅgÙ¬ Ü!M¦q€1˜}Àçc£^0u`!ŽŽ»…1q²…?¤£.¼¼¨í¼Çvh¯Ãö ß—¿'l´à¦u8Ãcüg¹T½6bˆÙj((ÛÖ„»‚S¡ÚŸ¹þ@šìû7j°4ݘ<k¢ÁÒtSL bÿç·ÀÆVçåGv>è&¡ê zñ+¡ ßú³ÄìU\ÿ³{ä´Pi:i³{Ïêõ!©4Ýê‘¯× FºŒÿí…Áy‘¿&Þܹ†y6(¼ Ah‰, ¢>>qø&ß°ð€lì#Îfl} 2§+¶k¿O™½N÷ÊÆ_PÕ C·§™½ö'‹%f¯¥åëúq`]{–pþ°£²öëá-îÕð{7?oï©ïéã_7­ó½ÀãUí¯Í}¶âDˆÎÕJÈu¢7å·ˆ2]ÿé‡`ÂÉU~Lÿ*hÈÆ']6‰ºæÌOKR×MôÇÖ)V0%¡X`zâsLþ|fÆÄ-6æk=|P!R(€ó”«™T&¶×†wºlfJÜb.192%n%Àãf˜Þ—àÅ%&—xˆÄËgüŽG´µ¤4°,3¬gLQLۥ怂•Ë†•šŸ4&ßQ‹/ ,}LáÚÀ¡—=¢h èŠ¹Ü󦕛vˆ–Îû­QîÙõ<‚‹Úw²qˈj]†=áu“[ù]Ô¹su’ŠéÙa°‘âiXhïü»tw7$ŽE<b$KuHÚðãÖÒ¼šVä¾» Ù,LE‘¢‡CwòW»s +›Ûõ¼<é;e,4¦ãªc”þíØ÷E]>`E`€^qwÿóÇøÀŠ ÆÓ_ÌÏp]pLr¨ìrÛ“n'™tmqö\è4Š—˜rC6¤×]–«Ø »±¤\uS=0¦¿L„À²?rˇK ŠNli¬õÐŽ+ü3Üö#ù£µÆQ=Ž¿µÔBBñMbpÒØZš/“a`h"þÖ’O@³-µ¤P&¢% ã"(f¦ÙèÃ#úôÍ0Ę­‹G ¥ód…$ò"ÝüæàD†˜ŽàG‰Cg(4È´:ù ‰¼xÄó .H"ï*Å'ÀpCyñˆ§e§H¦Bƒ±Š€’È‹Gä÷¤YGxÉxĽ“`î òG±BCç\¬0KØn„b…zYcº™7Z±Â °ù׊¦HæR¬2tRaÀ\ŠÆårü Å + ŒÒa9+Œ±F,VSï;~˜ÖtDiˆeÁC–Ó­Vñ³ʆ*xC´Í<oµ² Ž˜ÚË[ð0�XÈãV+�ÌáV+Ž‚‡\·Z^ðp1±Ú!M‰Ï¡àarbd ©o”‚‡ÉÖ|$9iØ‚‡þ G«F#P¼€PÁÃä\)3rÁÃÄÉUrˆunåTü„«àaò”ìC¯Ñ &W;t½F.x˜œÑVˆAHŠàŸœj‡A†¡àarµÃp~ÚГ…Ä˳2<L6¯¨ZË¡àarµC~NK)x˜±Ná°ƒ­„Ѩ¬à}悇ɭ0+Ù &W;ä“«:Š`TtÌq2:ÆËå±à!ûDçÏZ›Ì“S¼ ä>› +2Ĉ]í°0:<.eÖN2,䢗Zð0ù¬,¤†/x x¤ÚaüÑ÷“[‰ t SðÑŠí£%9áµðÓ $Ñ‚‡ ÑÔÞ‘ &W;t»µà¡²‹3ù +CÀãRÛq¶~ZÊZð0¹Úa¦úÇÒ<¦:WÁC.8öèVâñO…ìu +‡ñ¸Ã¦zLÁÃL% +Õã]C<Œ=üÕ , fÖ‚‡£É4ÉÆÍi£<ô ,Æ÷_ð0;w¨‚‡q­xÁ/& p6Äé€ÒêŽÕÇV +¾Š˜1çÏ™€W Õ œ·Ä§<¬&V;dï3<Œ^1Âv~‚f-x˜ c‹¬ÍÀ«„j‡ѸWñ3Ä:ƒDËVð0¹Úaß“!ÄÎ5oÖÅ”‚‡É£#ÓF.x˜l1†N +‡/xCM_µÃ؃•a +&O³ü²}R +&gG¢êÃ<Œ%š‹PH>ÊPð0YÁþaãt]„$OÁÃd]QðÃJG)xÕ=ßq¥¯›Þw©‰­&RnfÿœÌ6Â7bÁ3)Iؤäû‡@”³ŒÏPÈ‹F ö×<‘Ußýt ø‡u;ö¾f“ÔiÍþY··Öï/>-7¾ç7W$óìˆè›Å±&y Q]êñþm¿4yU*MÃKÓ7¿%aáy¥:·øeUçç/ªÇO/b«õÜ[ÏõYq}ë )®<m‹í«.noìvÅí·?âÞkï¯x´£X8›ã§Sñdð÷x*~¿Š§7 ?âYý´,þªTÄë»±=ñææüØ=T¾ÅßÊù´ø{§|Ðï÷[þàêc®ÿ#½Ÿöºfy0mL¡‘pøPÓéúÓCg¯³kýA«óôú×cifjò|Âœ{]Ü?joNý}™³»åñ×ûÉ ÕšÚ»{>oÎÏ8¸ÄÒOíSÝýM–…ðVÖ'ʼnÞ<ÛÿÉ’pª¼ˆqÝ.ÕW/T_L»Ââì*ƒ^³*ãçKü=Sé÷wëUo®ÐMdºjå¼:¯L/‹ë«[«âúŸûM±½·û6¿ÑïL[²;\üjUÌÝK±±Þ-!Bò@l]RÿPlìõj!o ˜'huªþ.¿yQZßä<mä§Ä÷T©2¿«–êéS„7KM·g©VY^ÆÇ›¥êÁØ.Âwñ»¥R}Ey(ÕvÎ;¥™¯q˜ëí—i³6)8%WQˆNH3kÒÜÚÓmCÂyu—ç¶K}²@ë-yÇ„OGŸD<>.§_Äý/cù¹2a½}‹bYh?QB–íOϽøE§B šþ™þªâŸUûÏÙrÿ¬Ûn« Û[›@‘ðݺù²Ä†¶!®¼}lV¶ÎήA|[öPŠ÷…‹ Uß·k ÎkuòtC¾“W,9ßm4¼Mö¸â|±'¹_ÜÀ¢M¾ŠöÂŒ÷Ìßu{­æ}DóõÞÞ€æµÐmWUhh¼"_žà‹C‰ü©,”àÏýe¯ñ.±áÙz _™û»·J¤ + +Eë¶IºÛƒõÝßk`DºFt1üyBÚ¡ ÔØ¿T;G/ +üü–`|~¿­B›ظخ»½þvºù «¯ÿª7·óèFÍ>¾OŸ¬Ï·Ôg—¡|hûüÀïÝÆy¦ò¶åQ»¡Fm}“­]GØ’v+›æe¶×—§{ÇÍ»†'Ìð\rú˜ÄlšµÉŸõrgcC®¼vÇmv»¸U]:ÜúÙín¯Žôª…wøó¤asQºÛÞ¨À§K‰Æ»yÑÚ?ÈlînòGP+®ùÕ p•_¸•S €?lâ?KTÔ¾>÷âEA¸Ôpc +'W¶Ý ØöDöz3dG‚ú=š¡Ús¼†0ãW¼ª  j"iCY:kÝ®w+—[(�ÜØe*gzƒÌ©îÌØû\kÈÍúe¶öBÍY”`BÀ³5ÁvqÏ©Ó ÿTlZ[oÄÇQ@F8¬‚¼á0l^µŒ>l¼ryÖÙг3d®¸oZ7³óÎãe²ÅÐÐ8ü‚?×OÀ\ï^V_ÇÞ×¥ÚçšØÜœÿ£’<tº| $°PZîVÀo¾Û[o}>½ºÓ˜°´ÐŽ³68øæ›oк¸àNm7)Ñ–äŠD^•Ú'¢2¥t6O5cNªOltãLåäÆ¡å h¹öË°=]ìÝ­ÏJ÷ÆDöô&7—nåߥúz|n=!K$.";†VíÝ¿ÀžB%Ý_h<)@ (±7¦5¼ñ’g“ênó@|˜|oÂËýª_·›l~éÈ×ÀÆUM6€—2,žtgZŽÕ38 Ü)A-qxfþÐ +ßS¿äMŸ‰Hn:hÍïy DøA7ÊßFgªãßìê½£€è� ò®Œ'¸:Uü$¸Ïî3Øsµ#àÒïrŸÊ-P¿¿ü¾ç”;ñ¿3“ó¥ß¾»"lsŒ–ù¾‚åSÛð…$„L×4ºñY@óÍÁ‘iÔþ!÷RXã1¯Öf0¶þШÆß8Ñ|¡§6nup÷î‰KJ4ß3¾)]ö•;gJ³«>~«_ñ#]5ò½øEFGÌÁßËJÕ«Í ôúð߃½/xm¸WràåÖ˜=õû½”•c‘»:ª;‚ã{FGNzµ£R^º¼f,Æòs1B+,»ôê\ÚÆ•¿¹·C·ó„Õ¤w}Úƒ k“0FW_™³‰´Ñí8r•Ÿš.Ñø'ò—±"0ˆÀ¸b-Äû]߆›ì¹Ã'7àØï÷3¿t£÷?JÌ&ùv0H~§¯7__‹û`ÌfñâÊ寋+ÿ°ìzôŸ¶Að½TE‹McX6ƒOt÷®©ÿ ïY[[Kr=‚Æ]}d›2 Ô-‰³R&†±cít¿Ñ#pTù•mskj…äw[h‰a°1jÓŽñ´Jº?N¬üǼ٪ã‡hÏ£ç¸X»0„‹†$ˆkEƒ¶^høT(~ë…DB‡žÒ”®§›|VŒçñÅóšSO—Mâ%T[§çbæÍjýSIðê¨/·+¦¤Ž¾MoNÒf<CZºŸ0fíÁš#¦Œ\YZžÃgsÊÒñ÷ªö½?Ñk_ÿº{^}5ÇM\×q\øÛR­ûp\ªÝj‚ß4�%B²íÀ: ævðH;tí3òý6°Û’´U÷Ì+4QU»‡;ù<¸KÔžh¾þrBI1Wf¹V:5‘¨aF|Žý â&SëØaP2á2þ4Y}X“óÑž·_g”GÅÊ„)Ê¿?ÚàŠ*Ò²j*æÜêáé™}è «sñƒ‡Ÿ+5˜úÆ’Ü’UréŸ\~|n+«S¿gIÄÁ;ŠoUOw'MXÐ÷:ÉO¸Ù’»?‡7„«¹°ˆYîèa<Owý÷uŽIw'kâVùMÿÜ –¥öÍg ó[õ@_GŸ>ë´VRVæ ¬j¯W—*“?r÷~&2€ïÝÚ¤G ;’¡¬Ì/íÒLÈW`ÞÚÚªÜ<X½é¢!}内}#‘jÒ†)ÿn`¨CŒD‘ÃýW0ˆÆ ¡&îJP¼œ×íÁ3ÖüG›—¢_øƒÆ>ÉTªÌ¬ÖJÕŸY¼íý±;p-òþã¹ü¦•êGK$z£ ßÞ×ì_¶¿¶¨Wß? ʹH‡ž'bUm>e÷ø”¥ÓÏUÛ7Ò¤2…3+  Ñ4c†˜mòõÏüq<pgâ?RõÅN?÷–‘®åß? ~q>×Ã%q¥Úv#@[‚O‚´·ÇâÚŒw~Ù÷e?ÀNFUÃç+GõÙ…«Õ FÃüagîÿ*++­Õ-òB)`ËìÓ/Ø7ŸråçA%Î.¾/ØÎîɘ@~NN +½ØŽjñ‡pbb6ñ=}1'f±r°vÙÜÚ(¬Xèôû‹ wÍ¥êÑqs­suíÉ{7ïp-x°ÂÈOüë¨DŸJÎ`Ú«@¾D¹˜*Ëoçú!ä"FP.rEè&].V”ɇRSj¯ÝˆD’Á6¾i)SOO‹4k Åy‚µ…%“u¤×LãIÛî(SÝÁ=UkÉr±1ãrŸÐÒa}žê**¿ŽÕ9©ýø¶l|gÂÞXX…d2&è† 7Å9Òf«šƒ¦ªŒ}ËÝ×mëÙêâ6…RËþj‚§#˶“aßüTÆ”©Ó·9¢ê¥ÎÒ¡…·@Ð_à+`=T*hÜÊÍŸË9`™M•JÞ©þŒµá¡ ·Ÿ|!9+þ9yX}ÿØ„y]%ŠàϘ…ûWôh#j§ dÌx=pÈÙ‚SÓ˵8ï’<º3Ûge*Ý<Áâ õìõÞíhßùK]îvj¸uèÂnº"›ÝŽ;¹ÛLDò'ìåe´gI\wÚ6¾´å:ýózÐ#±¥ieb~þ7 ’ý¹Y~„nKpË?ÔšøþÛýÂo^ÕÖ&ïÜ/jþ/N¤÷ ¿8­=.üñw#ú¾«Olüu-Q£Çå»uŸUýrùF¸w¿¨û¿øœñYÃ39´]‘ìQb%âŸTéHw7“nãUúÊݧ„:à îJí yz±ŒÇÜ}å^_ÃVD´FÑyßÙ#Oìvï]Jv0öb½ê¹©Í-WôY—6Ç‚_ļM¶jVåfyN<ðÒT¦Ùƒ!#Yî‘ãqƒ·É¸ö\¢šý2¥1>˜¯žÌõõÅuwŸ~(‡d:ÌúRö‚÷“¡êz!S§2íÌÇ2r³³€¡‰3Êäró׆D7@ó~O³?½žÈö§ŸË²ÓäVå¶ëên!OË…’$8[  è+°ãàÏ‹>¬œZÆP–@\17"<Mƒ4àxTíC$Œ(á! ž#Qç wÜréÚÞXkBܾN¬“ÆÓù·@µâS dcŒiâåƂɳ»å3ŽeCÌèÆèGÈQ@è¼ilã“5ÑhrðˆIÔè>\4N;k¿_VPøl­ölYf‡ÐäŒI—EjŸ”ÑÐyܳ]›•ÿ·XøÇ0M­hj¦Qlþ¼öú{ý§Ç§÷b­ðÏ\áŸÆʆ$¼?|¬÷{½ãÞÿ}7?îÞzïßÅÙbcåhmcÃÔš½û‡^±ædFÒÑg¢jõ_úÛ¯ùúïõãL¢'á·ïí×Óç»Õß;++µwéznI:5›ã?¨ôˆ)C(“d!{ŽbóÕ~éŒ.Ü6ÿˆ‹akzúóø c´¢'Ñy¼,Õäõ£R¹3¨‘SÑîà DÐÐz0"|Èt§I¼xQŸ\ûiþZï“‘¯]·Ïõݵ‡1rÌ¿Ü<Ì¡±h¿ì·Î–•›¹_Ûïࣜž_­tôÒßa'g†êQ™XǸ7ny´óîÙ‰®šü œþ*Ø'-v£½QPÄ9ÅÞFš0í|’Êh„–m¶ÝJ•åH°^èVA“š„3œŸ­7Èž³w•_CÔ¦ÿºÇÁ[ÿÖ·+É·üjLzWMlùÕ„ö Ýl5üß}®=º?’üºeõk††I|ÏNÊ®ÜõëÀö£êÊù]‚œ¢‘Š‰e‘î N}õ®DµXLJ8~q÷XEâÔlÅ gH÷õ _i8Á é~iÖÝîýÁ iWñ±vº}z²-Wê*Š½ãºÿøÑ!9\}Á/¾ÿ³M<ÀAd}Y†¿—ä Ê¡³>ŸÜd\{…h±D_“Û Ñ8Žù¸rô3ñÔúõ°fÀ±ä±1à›e[ª]Ü(îá«<|m..ËœÕmmt°†Gg []jgÐøÝ5"ØÎ$G“œŸï?)ôS0§ÉUáÁì ŽxS�Ì^ï}”[g«;›«•×þ>ˆoTYm‰ÂqT�¸"Æ�ÓvºÅŠ9möЉìØ[ñü…fd D‹{ÛŸ"^%ÎF, '-B ¹‹Ñ`¥m‰:'/Ðw¿8ÅUê$ÿïH<Í;„ïw0ƒ›±’Áa”)ŸŸIlWÔÔa³•l†ÅJŸH‚-B¦jÃ9YÝ]M’:ÕþØéx…Úÿ¾Õw'vwÌN=Þ0ô(²3v}Jg¢u£Åõy¡yP÷õÝ›[¡ãÂRé»<pÛت3mAí¬¼9Çš3ÞQÍ,$'›õ÷4¬#—­ %p²©—&W'šN÷S‘£ÑÕ†¯iý¼-yQ�B4’VQR§Å“aT´¢ k;Ï0LBŸ]ôO{ïUÏþ$öT` øÏm¼cÞ£ÃÆ)…ìÈ™Z몺NÎpœî™Úk�6CÝØÓÆà™]Å¡>>aVv«çÅÀ¹œÄ}ºCnÝŒy訑$#ûŽ¢ì£Æ«0§íÔ«£ï’ iNÉù{âá-óu1üw ^*„Óh³’¯å³™[§ ¡ÎnœŽAPaÃjC«Ž6ˆÙrÍw”<\kB—šÎQr¤ ’ZÓ âÓ·Àv‹'ZÉYÕÚd•«É©ÎsÖÉ3¡ö܃q?©ø£’ÝW»³êõ…¤úò½º¢âŒéY¢,`¿Šy#¿íìL0šåÕ iƒ|;²½^pn"úwíu_”úß´×ý£Ñ^§kãž,þ[ö:é†Ä“þU{Æãíëíõˆ©þïØëtmŽÕÏ^G}£yI Ò³ç"hqÞléˆÙsicÆtÄ칈DBgMG å"b ã*ê¶Þüa"x< Žzß?Ÿä­»Ú{|zß¾ý_6­T¤ÿáRQ+ÊšV4,ò±¨áÓí»Â?eòvQ¯·ß¡‘nc¥ÿÝ|ºÿ~úx¿íÿ¯8KžïlŸl4‹³EúvÞž+–aLb^‡¯*$BÕÅ‘v ÿˆÅüçü¿…¶Wí‘Á@ÉoëõÔ¡JÎPáÿÑ‘Ê™F*sTÂ’óñïÁ?‚h™EQPuÙ€ÿ˜¦®ÀDI3Š/øŠ(ètØÐÈÿðÁ&|z†)ü·¨wŠ—×bñ¡�ß³«é†`hК¢Y‚hJRø]ÓDAÓ­¨ˆ†`Jªó5ËÐõ¢lh‚©«JQ5dAW £(›Ð‚¤XÅûÂ?ªb²­Á?Ђ®UY4“´/ +üUTK0L >ˆ²  É5]°LQ+ªš"À¤Tò{~oj‚,™fQSTÁìX>ÀÏ4CdU“Šª. š4^Óx"‰‚¢ŠðÃÈ á‡XkU®ÃÏdE—`Gßý§÷Çbyuuå¸ûðãû_f®–h,‚$K©ê0ÝL¨T– U‘E˜¼¦% PRòI‚dhfQUA4,xˆ%ãrÃà ÖÚ**Bµô¢DWð ¸hh*@E‘¬Ši Šl‹DVVeK�b!uuA7৒ÍÃÛ*,¯fÓH²€ô¬“® +ªeÀ€ð-ÐV QÖ‹ÑyåL[Á°€eàg¢f‡éúJ0)]ÃI 誨SŠª‚ãŠj‚¡:¡(ü\j'‹@?IÔÅR‘·M ±jŠj°—$©)h*J'\«Â¼ÊE†Ün!Óš@(2O 6€%ª„e _!Y-ZTMX!UE²Âî´è +£ÔMJVI0ey˜×Bá‹lˆ"4.õEØÌÑÙåγŸv•%Yd Š ó54BLXvòÈRmã#xKÔðLÞ4¦lä-MÞ�!$HºCÞÐ `‰5ü!.ƒ›W}ŠÂ‹´¤Ô€(*nmSþÇ×LY!2´¦E  ¿ªÊt!‚°(dG«ªœMG!Ê•„~H)EÁŒšÆŸÁ—:n^7u öK¼ ‚hÐ ž¨òšAž5ÁÑqtœ6JÃ>ÁуDÔAHÂC$ ‹-"ÓÈ´}Øܸ{%ØA +²ˆ Ã0l ·6¾Ê„ªØ·|­Jd>þUU™0È5©&áK¦ Â› ‘a†( %Ø"04­³È&p-�Ø8Øø7(̺÷‘a‚ +PÖ@Nâ*ƒ¬Æ©¢0׈L‡MNæ lŽ`‰$Üð ³€;áVSa…,d‘eIdµe ‘aßb§ ålG†ÙÉØ°Èox(K(óa—À’ƒB¹æµ¦‹÷oªE‹÷oŸ?ïÅÁßÛÏ^ñíã¡døORuŽ"DÑ 9[QÓM‹r½‚Ÿa¦ÀlðA×@„ˆÈmJQQ€Ëtø ÉH T@]à ‹,+0*¼ZÆ.«„ø@:eŽ¢Áv/Z ³EÜ-À!Àzˆ&£à†y›™°$Š(ÄaûàÈt €D(¥Â—–¿C½ ª&Ê#àx²€QQ VÅßcS°ÖTyÀVTD¶“Ueý Í ä[$¢êG1a)Éšâ¾q2°ìÀ»i-B®í™$£}"ñʤªq$ ÄÊaÄoTwZšÜœ.éȃ"nrˆ$Qès2e¢%E&›AÂ"êðµ¥*tö Pt +¬ªŽ“À¹’·`z2LC´È"„tÚ(J"Ž.96¢N·@K+&J)0i$4CL\= %h•0EÕaÉaKI’FŠ kDÌ*<µ_pƒ€bÒ |ìYSQ/ — ÅAãý |òøÅ€!jT´Fh–ï²ÀÞÔ è\Ñ,Ð;. ÐÀU‰ð­® 1À0�U ˆ5ja +2,¾!ZtA@„Ihé¤Ãhq  nEÒ:hnSA‘$U‰êЇj‚(Ð5Bx0>Èj t׈ìCíh‘Å€ÒL« +Ý› UePD§‚qdu”OD‚‚‘ d!`M,Ý€^Q˜oM ¶¯‰ªCDQ¢ö LŽn5Í„\Gu[ÕÒ‰T)ßU�«ô�ð¢Š6H"ª@÷Ê ÛTXÀRÐ~Ôp +ºn ð‚q‰hWÃàU4Ÿ×¨8Q-ÚȆLåˆqªz%dph$½FÕ ÌK+Z¨šaÑPI`ÃІ4´ú€*FªºÐÀ‚ET/ò¸#F—@ÅÝBlMX"D<yºŒ*•˜>¦ý3[÷Àâ*Œ¤.Z¸:¤uØû¢J¶.ƒ˜TUÔ\m,L­|ã¨U,WŠçgÁÏ’í=ƒ„�ô?Ð�–¨XÔÔ Hב¡u4ˉˆÃñË&>'|>:û-Ô:Ùu¨XˆM#Zô¼º;œ3«ØŽl¼Û­frfUng–ú®žúHI^ª »,LXddJ $Í@fG»ÉyøŠtrÉh}‚ÜQãCF*nýàCÁhb*Àpà-Éä!¨ +·Kàa¸óWÂMh#) +ð\E³«h¢„öÿ¶ŽhˆÁ‡Š„%$ÈNö+}ÞžhšÁ7ASYj¨M¢LT÷NçøPCm­Ó‡DßãC’‚F�ˆ(Ô|äH[ P NéC7 î$42,adì&Ú1É`s‘÷Pè‹j ë(1(‘€ñÁäGþGç þ«VDo”5î2%›KÊЈ§èê¢6qb¯:êª ƒ¬àÌÂbñu ¢Uü¾~‰B6Hv ‹àSÁew†¨Gt©4tÜ'÷Ø'È$ bø^ÃŽT•0išY)E£Üíˆ Ž~ *,Ó%"iAa9| -�sƒÅEÅh`½, ¸‚vÆÔÐeÒ‰¨$�+šLÉÂ_â[ - ù�–Œ˜•(A)L4jì÷”ˆºt_‚ŽMM¥ÓVP8bDF&P¾š¦ôw°-€Ç[d…t^¢ÿ‘•ÅHøBTá*&Y9h�ºW#n pb$Š#ãÄ2!°ZA€ ú µVBŒ2\¦>ÚÜhð:O0F¤bÜ xÀ{M6© ‚ˆÁ!p=È,©LgÔäšiX„P2ŠeÔjÄNAêh¸7UÜù@Uï‰ÎQÛx¯¡‹…Ì«!™2¡†;0¤•$“]‚±M³ôÀ3à<4Õ"T²ÁÄèC0Í‘ÄÉ$-ŠÔýÀ‡À¡}ÓfÖUbL@‧b†$ŽÿÐ^HÀ—Ú²$$µ‚.eopI â…ëŠjzOèêÀÚø^B™&:°Ž +"@|KÄhHK¥Î6ð=ð'HXCG]Y߇åÑ´‚‡%{Oð‡Èžšæ Ü}â,©`ÌÈXèr« +:`�ɤáäÓ@Ó@&¶˜NÚ7èr+Ôäû_ ßRA¥¡£hj@š«–a¡> +Ƽ€~YXüòzà + +n ÆAvO먋%x훎iÍ.;j=6L­dÒì +·f'I£x +€-gŽ¹£˜CŠï“?oßzï½ÿÚYýÿ¹ ½,Æ�yç¡ð´»2AdŒ!Ôrü +Lîß>öŽû·O¯HÿÇÁízÅÛ÷w´{ŸðUñ±ß@ë½âàïÇñ þÈýÁädkL¼ÿÚ+X +endstream endobj 221 0 obj<</OPM 1/BM/Normal/CA 1.0/OP false/SMask/None/ca 1.0/AIS false/op false/Type/ExtGState/SA true>> endobj 224 0 obj<</Subtype/Type1/FontDescriptor 225 0 R/LastChar 121/Widths[184 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 673 0 0 399 0 487 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 554 562 0 0 501 0 558 563 265 0 0 0 831 0 0 0 0 370 0 348 0 512 733 0 497]/BaseFont/MCOBOQ+Myriad-BoldItalic/FirstChar 32/Encoding/WinAnsiEncoding/Type/Font>> endobj 225 0 obj<</StemV 144/FontName/MCOBOQ+Myriad-BoldItalic/FontStretch/Normal/FontFile3 228 0 R/FontWeight 700/Flags 96/Descent -250/FontBBox[-95 -250 1225 852]/Ascent 852/FontFamily(Myriad)/CapHeight 674/XHeight 489/Type/FontDescriptor/ItalicAngle -11>> endobj 226 0 obj<</Length 1968/Filter/FlateDecode>>stream +H‰¬—Oo]Ç Å÷÷SÜåÓ£™!çß6n piÐEª ÆB­Q ʧïïðJÏŠ ]†%ͼyxxÈwýîæéîq¿þîmÞ¿úÓÛ}ûú;~\_v˱ûó–÷±êÞKÝßèÇ»í¯û¿Ù=þý‹¿î¹÷ç»7ï?ݽýéÃO÷wïo÷Çûíú›¿äýÇ_¶²,å<vë3MŸûÃVFO«Ùn5§5Û^l¤bk¯«$>ÛKö”ÇÚ-×T»í·Û()6Š%k{©ZŠǽïÃR¾{^œœ+™ÍÝ[O³û^êJ¥•ÝgO}Ô½tLrÐGKm.”ÕRåïž|OSnX(=lû—îßnÿÜr9YîüÌ5Ð(<Ýnœº—ˆÓSÏ…8[}FœV;qŽ4e:÷d«ç$î¦8[Â✩ñζIØ°±8FêÀä¯xt»­š:놇ĢXWoÄ +Z¬=§¹�Fõ±–4ë ÖœêšÄê‰U "ù2€ˆô’ìZj*g'Îà,áXì,O“›Ð-Y;ć¥Í¤:ÐHJ!qEK#áO dÇJ"I2@h —Ìa†ÒÅ~»-%¾t<œ÷€È‚-´×x0Ë  9¥µ4ÍX7 ©ºÀ'Ò8'g× !Þ¦¹á+Òªµ .„Ý É!Û�L|̤¡qBÁÖE•% ‹et.JëÊ› +S´'ÇTLzŠ´”lCkèA¶½*_¶Ë#Òà€@÷Æ®)Kð3‹$Nzê$M4ü°N/”SÇå0 M:KÌzÕ ÑÌÁ‘½ò ~+(¤5p³.‹Â¤Îê.,•… dL…¹Šà¨µÆ[žõx%ŒÊ3p"€VêFEMÚR°/yó™UEEc-•I0— :¬2ýÅ „‰» ÕÖ(#µ°½ÔzDKÔ)…lMâ@f­*CÄd”—5Ø×+«™:2A(U%…W³ ’Ì;.Î +‹S?ÊŸ¬â!G®üdHe*[0X�Kâu@‚³-+¥…x\¨à ‰†V”z + *dEXtÈ@¢`ã=¸H‹J)Qÿc†„`q5í€JW†rÛŠ’LI¡k.2 ŒÅ,_ °IùºÊ Ù犷3ÈØWóð-¯ˆZ‹ªB=»N $”n×™© +T%R± ©xŠ´²™SÛ0«aRAg‚ž¡ZÕEûŠÜ5oÈm°.+#"2¥UX’Ø*¡áÎ ,Š;i. ²¬vh1Pk½"­ƒ-˜nÁv‘OpPL­(–nŠ„úÎá¢%mD äaP!>áh¸sS;‘~H +ÐEébª”-HH%W‰ +jê”ð¥F¥ö¨À¸£è:Ù ©Èª3Û!G.ÄjJ:уvå?}QÙð5P ª” bÀ9èH{ñ cï*•´lò?NÃI +©ŠœTuˆj9²KчjP-¤a=+.,eÅ}0 µÞ¤€AnÜ‘¤ª*€‚ok©éŽ£É‚Nµcí‡L»ZÌx¾„êV%=4¯–£×é•ž=t¸W°q)V{Fã‹I¥“Ê÷ÿeV)ÿó¬RI¨©eº0qЮȽlÀbWBx$lÀ9¤ýw;PlR”*Ź¬ˆØìxÈ»ºi…ssØë[¤BƒÇeÃÒ¦ö +é‡ÇƒR~m[5¾üw—T]öù%vš4§ÇΡV %(Û +ÍyÅåÑDM8¹ÔšQ«èN¡Šëð*mš*†8¢š|õÒû˜•2…’þf¥±k蛤äðQÕ†’SuøªÏ/;˜ì*ÌC3ƨ¡3kFAãçþiên‡j,ã÷Tz<T³L“?¯o7)A Åx9!Ë零†€ùò”54…QaÞ/ŒxÚÐù¨œW/°2ÅAÄrJ}u6+¥‹ÛKw”mè-÷ÁP³¬rcfGœòîy}Y“&]NðÚlGXcŸ™®‡®µÖã,Ô˜LR«½ë3ÜO$GcðPR¥g¦öëDéLFèh®Àß«"p<wÌIÓŒ ’ÀU;Õi©(G½¾¬Whäy½:Qg´gG·\ÎH¡@ŽvZbÀ‘ÊÎ�¡ú1úHܺĸJóÛË’óÌÕy®Ëçb-h Txºx JLúzÐúë x¢Ò¢æ”CeSÝþõ½ÜJô8 €2“c&ÑÎŒÙ9¾dH]u¾‚<õ?…]}#Q¢–„Ý™*êÁ¿¬Ì?ÝÚeMxšx^F'ˆF"ah;€\¹D­.¯¹Ç7¤@Jã±f¥� ˜ùC˜§*õyÍ ±¨}ÞqæjMKN3©ºICõu$¯D)ÑS ©êЇ؇ C%u¿§¨þ¦®bí•ÎñëhµõqJ¶Ôçlteƒq.é{ÓEÄH.?k¬ë‹žŸËÎôû÷‡¯ÎÛõ¹ü]WÎcÏ·\?ÿÊýü }P¿ÓÖã.Qh°%ïÔË€®±A§ÓÀÌÈG0ÔT¯HÏùaûÛéÝýï?^½)vúõÊNwZíß²>Ý\½i§OW¥Ÿnöo®ÞøéæánwÿÇ«uºyäÄ<=]ýpþvûú|Äÿýö�>‡,q +endstream endobj 227 0 obj<</CreationDate(D:20050904082613-06'00')/Creator(Adobe Illustrator CS2)/ModDate(D:20050904082822-06'00')>> endobj 228 0 obj<</Subtype/Type1C/Length 1634/Filter/FlateDecode>>stream +H‰|“}PgÇwž5ôâj³„F¶—]¸Z "¶ êÐéEªç BEŠFÂËBbI¤R¢Æ^¬/T„X©X¤€­¢RÐÚzêØvÆŽõeì:gëtªs¿un¼ÍõûïöÝg~ßù}Ÿïïó<Ka2‚$É9i™K3×ÎËØftúùKM•ú•6]¥PßYRŒs*e ¸ùå°KÏ"mûžû|ÿ[)gü‘ º¨™pdL¾xûeªVêîI3™%ײrWÏ¿‘’’”z'ó©zÓæ>g›ÕVb´ò+«ŠM³É¢³•èy>µ²’ÏuYùìk‰¥ZªþžŽ¬¼Ž·Ytú£ÎbàM¥ÿlj7ê¶ñ’f))$Õ"U„*¾¸ÄbÓIߊ­ÁªŠm‚©ÊšHHIÄóˆùÄR"XN¬ V«ˆ5D±ŽXOäùÄ‹.BFÈ ;ÑG\!“Ƚäo2½ì”ìW¹C>VöŠ¥i¨r ‰0Ra¶Ñ®…$æá³—Ä5öR6<=¥Ì8¹jln^1 èÁç7/Œp}Ã:®°ÏÕÖ~Ê17N˜‡m[Vµ'³8<¦<} ·pi&±*jaÏÛç ´ïMÜ°>`ïÞ +¶stŽqÂN–‰ä >u¬£¸25˜÷ì­æLxÚyø´k…ùß]ƒ%½Ü]q-¯Pôq¨Äa;Ù!.‘wDŠ±ÔP!ÜJ=‡ÿ«?v‚bqµÈ©ú^ƒ7AÅ8ÄòHïWµ~=û5mÅþ,»° ¿ƒS8fxîÅ¿þ4ùõÑG´Mãð–{„“¢Žª™a¬Üúnþ&¶ØÑ;zÿ*P?jõzýý/'p¡ÔNöC<äÃ<9¼ú,_7½ í®rQÉSïÌO`$ÝÛxgnæ»æMeZ/5½hÁ´^}·}üìYv¨³lâ,¬X,Ø;ú¸†ÎæCÍôˆÂ~zúëS²´’+_Ú¡/¬Ëeum]nGÀ}8yn˜9 ³£î¿óe^† ¼�ÇãˆoßþüõÇ&µ©ðƒº0g;kÔ8ñ嶷³ÆÊÑ¿á ƒºA&í‘ ÷ãåjÇgëþÆ^¾Þ6xŽ›:Ý}³ýß‹±šàú̶å,°'ã…Ü¼Æ oýÌN }|æ×DíÒ¡øê\C«Ëò4sð \W§¼_[Àmí?óàÒÏ÷:ƒõn‰Áj1B""ÄËáÈS`C¿¿4Îö·Ù*ìÞêz—‡ƒ^¡ÎI”öm9ñqÔ‚Ñ%«óª +7Kì&` tĘýw>¢q¶äXk¿‹|v•tyS˜’ç±á?Q‰ÓµÒM„ÕâõØàñ‰ñ‚Íåë {Œƒ-*CYžÆ€Bõø9awÏÉn's™aHˆ< fô¨}üêÛçß"ÔxžP¨Ã8ê$lA;F¿e{?² +O(o>îDÀKyPKWËçQ·‹ÆÞ^½Æ˜^¤=U/œù3›žeJ/ä¼scÿM„gS»‹\¹ukðm ½(X ¢vU«¨b¤ôŸÁ*Ä\{thèÇûì¾}¾†¹nˆF»v6î`W¬Û¸Ràê)f ¥¯¹·©W!y¹u®”Rsð†æ‚ ÈT_À-|☻Ì5ˆPo[€Ò);–¡KT)ÎE»J=æ-Q'‹î}Úß²·C{òÖm÷Õ±†íGÚ¥:¹^HAO¨Ã C1Th=éƒ<3D[5"zóˆX«¾%†X +ºBÀRñØ€˜sæöÒÊÊÓïp_´A…††釅X,“¨ü%ùŸÌÀ¸Ô?êg©Û°Lš88äïÿ䚢™Zë+hÉÓ2Çø/!v†ÜçJC/Æ›ìÙ5Þ_7ÇC5ŸõžöLÕÁf §^Â=k~Íú9^ªù|ÓHÃDè5ô –´ˆcò!i¯GÓYM;|»ë]s¦ª +›Én¨³¹ŽãYšã{®™<ù«©¿_†HHƒ'œ@%aCu®Óà4J–õ=î>׸ íô?[äÇy­ß:ê§ °gÚäÏöÍø½¼±ýc~E¨\ú¡y¸6¸iÙÎÀse¸¶&<èT¾�² á kS*•4¤GˆÔÿ`�§Ìæ +endstream endobj 229 0 obj[/Indexed/DeviceRGB 255 230 0 R] endobj 230 0 obj<</Length 428/Filter[/ASCII85Decode/FlateDecode]>>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 231 0 obj<</Length 363/Filter[/ASCII85Decode/FlateDecode]/BitsPerComponent 8/ColorSpace 229 0 R/Width 76/Height 99>>stream +8;Z\tb7VW7$q)Oq',C:3#8E>M>c$-\+B]mjG!(U/PJ]SFJ&!W$7@4>\z!:X'SQu3O/ +I,#j06Orc)mgoje=#m#DSX#9=4%liGI-C-sY1lr[V8XV>V>=BJQ\]3jdq9jGA#Cgl +8UV=J9P2mhFuLBGT1D,Ien`"R41C@EoeCU+mCn5OkY/D(U:,!S1bHnnod-U0"@c`s +6J[s(jJTCYTW#%;Tm<HKMHRZblV"@854dDcT5T)d0&2^R:J4V';X63JaN?)Us%D28 +`&qCu>Our?@8e(SMIc0s\d-bHc*om>*1g!a1p)M@AE]3+l=g^^7OmSB?_m^#:4fYE +o$amMGk,4Q9X4U"z!!(qI49kl+'uB;~> +endstream endobj 232 0 obj<</Subtype/XML/Length 14752/Type/Metadata>>stream +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/pdf</dc:format> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xap:CreatorTool>Adobe Illustrator CS2</xap:CreatorTool> + <xap:CreateDate>2005-09-04T08:26:13-06:00</xap:CreateDate> + <xap:ModifyDate>2005-09-04T08:28:22-06:00</xap:ModifyDate> + <xap:MetadataDate>2005-09-04T08:28:22-06:00</xap:MetadataDate> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xapGImg:width>256</xapGImg:width> + <xapGImg:height>92</xapGImg:height> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAXAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FWmZVUsxCq&#xA;BUk7ADFXnnmv84bDS3kt9Ls5L6ZDxa4kDR24b2JHJ/wHvm103Zcp7yNfe6bWdsRxbRiZHv5Bgdz+&#xA;c/neZy0csFuv8kcKkf8AJTmfxzZx7KwjvPxdLLt3UHlwj4I7Sfzx8x28qjUraC9g/aKAwyfQRVf+&#xA;FyrL2PjI9JIPzbsPb+QH1gEfJ6z5X83aL5kszc6bLV0p69s9FljJ6clqevYjbNJqNNPEak9HpdZj&#xA;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</xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"> + <xapMM:DocumentID>uuid:FF8F96D84F1DDA11BBE0D49BBEFDCBAA</xapMM:DocumentID> + <xapMM:InstanceID>uuid:112b4e8a-7599-4f4a-849d-4002d9dd1bb8</xapMM:InstanceID> + <xapMM:DerivedFrom/> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> +endstream endobj xref +0 233 +0000000003 00000 f +0000000016 00000 n +0000000077 00000 n +0000000004 00001 f +0000000006 00000 f +0000000127 00000 n +0000000007 00001 f +0000000008 00000 f +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00001 f +0000000015 00001 f +0000000016 00000 f +0000000017 00000 f +0000000018 00001 f +0000000019 00001 f +0000000020 00001 f +0000000021 00000 f +0000000022 00001 f +0000000023 00000 f +0000000024 00000 f +0000000025 00001 f +0000000026 00001 f +0000000027 00001 f +0000000028 00000 f +0000000029 00001 f +0000000030 00000 f +0000000031 00000 f +0000000032 00001 f +0000000033 00001 f +0000000034 00001 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000053 00000 f +0000000054 00000 f +0000000055 00000 f +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000065 00000 f +0000000066 00000 f +0000000067 00000 f +0000000068 00000 f +0000000069 00000 f +0000000070 00000 f +0000000071 00000 f +0000000072 00000 f +0000000073 00000 f +0000000074 00000 f +0000000075 00000 f +0000000076 00000 f +0000000077 00000 f +0000000078 00000 f +0000000079 00000 f +0000000080 00000 f +0000000081 00000 f +0000000082 00000 f +0000000083 00000 f +0000000084 00000 f +0000000085 00000 f +0000000086 00000 f +0000000087 00000 f +0000000088 00000 f +0000000089 00000 f +0000000090 00000 f +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000097 00000 f +0000000098 00000 f +0000000099 00000 f +0000000100 00000 f +0000000101 00000 f +0000000102 00000 f +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000107 00000 f +0000000108 00000 f +0000000109 00000 f +0000000110 00000 f +0000000111 00000 f +0000000112 00000 f +0000000113 00000 f +0000000114 00000 f +0000000115 00000 f +0000000116 00000 f +0000000117 00000 f +0000000118 00000 f +0000000119 00000 f +0000000120 00000 f +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000125 00000 f +0000000126 00000 f +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000130 00000 f +0000000131 00000 f +0000000132 00000 f +0000000133 00000 f +0000000134 00000 f +0000000135 00000 f +0000000136 00000 f +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000140 00000 f +0000000141 00000 f +0000000142 00000 f +0000000143 00000 f +0000000144 00000 f +0000000145 00000 f +0000000146 00000 f +0000000147 00000 f +0000000148 00000 f +0000000149 00000 f +0000000150 00000 f +0000000151 00000 f +0000000152 00000 f +0000000153 00000 f +0000000154 00000 f +0000000155 00000 f +0000000156 00000 f +0000000157 00000 f +0000000158 00000 f +0000000159 00000 f +0000000160 00000 f +0000000161 00000 f +0000000162 00000 f +0000000163 00000 f +0000000164 00000 f +0000000165 00000 f +0000000166 00000 f +0000000167 00000 f +0000000168 00000 f +0000000169 00000 f +0000000170 00000 f +0000000171 00000 f +0000000172 00001 f +0000000173 00001 f +0000000174 00001 f +0000000175 00000 f +0000000176 00001 f +0000000177 00001 f +0000000178 00000 f +0000000179 00000 f +0000000180 00000 f +0000000181 00001 f +0000000182 00001 f +0000000183 00000 f +0000000184 00000 f +0000000185 00000 f +0000000186 00000 f +0000000187 00000 f +0000000188 00000 f +0000000189 00000 f +0000000190 00001 f +0000000191 00000 f +0000000192 00000 f +0000000193 00000 f +0000000194 00000 f +0000000195 00000 f +0000000196 00001 f +0000000197 00000 f +0000000198 00000 f +0000000199 00000 f +0000000200 00000 f +0000000201 00000 f +0000000202 00000 f +0000000203 00000 f +0000000204 00001 f +0000000205 00001 f +0000000206 00000 f +0000000207 00000 f +0000000208 00000 f +0000000209 00001 f +0000000210 00000 f +0000000211 00000 f +0000000212 00000 f +0000000213 00000 f +0000000222 00000 f +0000000962 00000 n +0000001037 00000 n +0000001259 00000 n +0000002254 00000 n +0000010101 00000 n +0000075690 00000 n +0000141279 00000 n +0000163833 00000 n +0000000223 00001 f +0000000000 00001 f +0000163946 00000 n +0000164319 00000 n +0000164578 00000 n +0000166617 00000 n +0000166740 00000 n +0000168460 00000 n +0000168509 00000 n +0000169023 00000 n +0000169529 00000 n +trailer +<</Size 233/Root 1 0 R/Info 227 0 R/ID[<18A36B0862EA7148AF88533B7BA36CCA><6900ADF75DFA7C479ED6082881A1314D>]>> +startxref +184360 +%%EOF diff --git a/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.svg b/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.svg new file mode 100644 index 0000000..e97e236 --- /dev/null +++ b/etc/lwjgl-2.9.1/res/logo/lwjgl_logo-with_jacket.svg @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ + <!ENTITY ns_svg "http://www.w3.org/2000/svg"> + <!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> +]> +<svg version="1.1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="543.281" height="196.23" viewBox="0 0 543.281 196.23" + overflow="visible" enable-background="new 0 0 543.281 196.23" xml:space="preserve"> +<g id="Layer_6"> +</g> +<g id="Layer_2"> + <path display="none" opacity="0.61" fill="#DE923A" d="M536.093,118.816c-17.196,51.267-59.783,83.217-95.122,71.367 + c-35.338-11.853-50.048-63.028-32.853-114.288c17.195-51.269,59.782-83.217,95.118-71.362 + C538.579,16.382,553.287,67.556,536.093,118.816z"/> + <path fill="#FFFFFF" d="M161.34,109.049c-16.054,47.862-55.868,77.672-88.928,66.585S25.565,116.751,41.617,68.897 + C57.671,21.033,97.485-8.775,130.542,2.316C163.605,13.4,177.392,61.194,161.34,109.049z"/> + <path fill="#0A90CB" d="M157.985,107.256c-15.051,44.873-52.326,72.838-83.257,62.466C43.797,159.349,30.923,114.556,45.973,69.69 + C61.024,24.816,98.298-3.148,129.227,7.229C160.161,17.599,173.034,62.391,157.985,107.256z"/> + <path fill="#FFFFFF" d="M180.458,94.522l-48-11.5c-2.02-0.532-5.155,0.337-6.955,1.197l10.151-37.832 + c0.936-3.473,0.061-7.84-1.75-10.831c-1.811-2.991-7.549-10.722-9.737-13.622s-3.939-3.61-6.528-3.738l-36.7-2.094 + c-4.949-0.335-10.023,3.617-11.332,8.826L59.458,65.647L27.873,58.02c-3.792-1.016-7.688,1.436-8.702,5.473L8.962,104.105 + c-1.016,4.038,1.007,8.071,4.622,9.792l142.5,76.584c4.75,2.5,9.169,1.462,10.667-4.501l19.305-77.485 + C187.554,102.535,185.318,95.803,180.458,94.522z"/> + <g> + <path d="M103.521,133.708c-1.006,4.003-4.428,6.12-7.644,4.728l-32.025-13.862c-3.216-1.393-5.109-5.359-4.229-8.861l8.855-35.227 + c0.88-3.501,4.303-5.621,7.646-4.732l33.288,8.838c3.342,0.888,5.236,4.853,4.229,8.854L103.521,133.708z"/> + <g> + <path d="M163.445,159.116c-1.16,4.615-5.048,7.144-8.683,5.648l-35.622-16.062c-3.635-1.495-5.744-6.04-4.71-10.156 + l10.566-42.111c1.034-4.113,4.922-6.645,8.685-5.653l37.468,9.87c3.762,0.99,5.873,5.535,4.713,10.149L163.445,159.116z"/> + <path d="M50.911,111.844c-0.853,3.394-3.563,5.166-6.052,3.96L19.9,104.265c-2.49-1.208-3.918-4.532-3.19-7.427l7.481-29.591 + c0.728-2.894,3.438-4.67,6.054-3.967l26.056,7.002c2.616,0.702,4.045,4.024,3.192,7.418L50.911,111.844z"/> + <path d="M108.224,68.855c-0.968,3.849-4.276,6.375-7.39,5.639L69.829,67.17c-3.113-0.736-4.955-4.045-4.113-7.393L74.181,26.1 + c0.842-3.348,4.151-5.875,7.391-5.644l32.269,2.3c3.24,0.23,5.082,3.538,4.116,7.386L108.224,68.855z"/> + </g> + </g> + <line display="none" fill="#0092D2" x1="0" y1="108.564" x2="194.333" y2="196.23"/> + <line display="none" fill="none" x1="214" y1="119.23" x2="21.667" y2="68.563"/> +</g> +<g id="Layer_4"> + <polygon points="227.728,31.353 243.953,31.353 216.963,112.878 244.745,112.878 241.184,122.614 197.334,122.614 "/> + <polygon points="255.668,31.432 250.207,122.614 265.404,122.614 280.838,98.157 282.342,122.614 299.281,122.614 340.123,31.432 + 322.79,31.59 294.373,95.188 293.186,76.706 278.226,76.904 267.185,94.357 270.984,31.432 "/> + <path fill="#0B0B0B" d="M323.62,88.421h16.978c0,0-4.097,12.703-5.462,17.096c-1.365,4.394,1.028,7.599,3.72,7.599 + c2.692,0,6.253-1.107,8.786-7.599c2.533-6.49,24.458-74.165,24.458-74.165l18.006,0.08c0,0-21.938,66.379-24.773,74.243 + c-5.225,14.484-13.852,17.889-30.117,17.889c-12.822,0-20.026-10.058-16.621-20.223C321.166,95.664,323.62,88.421,323.62,88.421z" + /> + <path fill="#0B0B0B" d="M444.126,64.358c0,0,2.643-7.251,4.274-13.455c2.612-9.934-0.95-20.263-19.313-20.263 + c-20.658,0-32.452,11.833-42.9,45.116c-11.267,35.894-2.968,47.57,11.16,47.57c8.074,0,11.636-2.612,11.636-2.612l-0.554,2.059 + h16.463l13.772-41.951h-24.299l-3.603,9.418l7.639-0.157c0,0-1.543,6.016-2.73,9.419s-4.314,13.297-12.704,13.297 + c-7.123,0-4.749-17.255,1.267-36.845c8.331-27.134,14.996-35.262,21.964-35.262c6.49,0,5.818,4.907,4.631,9.023 + c-1.617,5.603-4.749,14.563-4.749,14.563L444.126,64.358z"/> + <polygon fill="#0B0B0B" points="483.069,31.432 465.498,31.59 435.459,122.733 487.343,122.614 490.667,112.878 457.662,112.878 + "/> +</g> +<g id="Layer_3"> + <g> + <path d="M192.785,136.61h3.132l-3.727,11.92h5.634l-0.859,2.74h-8.767L192.785,136.61z"/> + <path d="M198.663,151.27l3.33-10.637h3.111l-3.308,10.637H198.663z M204.099,139.242c-0.914,0-1.508-0.652-1.388-1.632 + c0.139-1.131,1.125-1.892,2.147-1.892c0.979,0,1.597,0.631,1.475,1.631c-0.147,1.196-1.146,1.893-2.212,1.893H204.099z"/> + <path d="M204.942,152.75c0.544,0.348,1.798,0.587,2.712,0.587c1.566,0,2.805-0.696,3.523-2.828l0.286-0.913h-0.043 + c-0.96,1.088-1.979,1.588-3.24,1.588c-2.11,0-3.183-1.719-2.948-3.807c0.408-3.502,3.359-6.982,7.992-6.982 + c1.501,0,2.771,0.283,3.847,0.74l-2.687,8.766c-0.61,1.957-1.433,3.697-2.82,4.72c-1.265,0.914-2.845,1.196-4.259,1.196 + c-1.436,0-2.708-0.261-3.397-0.674L204.942,152.75z M213.45,142.983c-0.226-0.108-0.672-0.196-1.107-0.196 + c-1.893,0-3.5,2.11-3.746,4.111c-0.134,1.088,0.249,1.871,1.206,1.871c1.022,0,2.187-1.153,2.754-2.937L213.45,142.983z"/> + <path d="M216.565,151.27l4.833-15.443h3.132l-1.955,6.178h0.043c1.012-0.979,2.199-1.61,3.591-1.61 + c1.653,0,2.547,1.045,2.323,2.872c-0.062,0.5-0.25,1.326-0.431,1.914l-1.901,6.09h-3.132l1.825-5.829 + c0.138-0.413,0.237-0.87,0.291-1.306c0.088-0.718-0.133-1.218-0.917-1.218c-1.109,0-2.384,1.349-3.038,3.48l-1.534,4.872H216.565z + "/> + <path d="M236.475,137.762l-0.896,2.871h2.284l-0.772,2.393h-2.262l-1.159,3.59c-0.141,0.435-0.294,0.979-0.34,1.348 + c-0.064,0.522,0.108,0.893,0.804,0.893c0.261,0,0.587,0,0.854-0.044l-0.65,2.458c-0.432,0.152-1.226,0.239-1.878,0.239 + c-1.893,0-2.667-0.957-2.501-2.306c0.069-0.565,0.207-1.152,0.479-1.958l1.323-4.22h-1.349l0.729-2.393h1.37l0.638-2.001 + L236.475,137.762z"/> + <path d="M241.952,140.633l-0.534,4.524c-0.125,1.196-0.292,2.197-0.501,3.372h0.044c0.508-1.132,1.118-2.197,1.684-3.263 + l2.679-4.634h2.545l-0.289,4.481c-0.09,1.262-0.172,2.283-0.376,3.415h0.065c0.493-1.175,0.99-2.219,1.578-3.459l2.373-4.438 + h3.154l-6.484,10.637h-2.937l0.149-3.697c0.049-1.109,0.175-2.132,0.33-3.394h-0.065c-0.75,1.501-1.085,2.284-1.66,3.241 + l-2.278,3.85h-2.937l0.306-10.637H241.952z"/> + <path d="M261.516,150.661c-1.317,0.631-2.889,0.849-4.063,0.849c-3.045,0-4.4-1.719-4.059-4.503 + c0.398-3.24,3.162-6.612,7.012-6.612c2.154,0,3.549,1.219,3.306,3.198c-0.332,2.696-3.084,3.676-7.334,3.566 + c-0.038,0.305,0.013,0.783,0.193,1.088c0.346,0.544,1.029,0.826,1.943,0.826c1.153,0,2.164-0.261,3.063-0.674L261.516,150.661z + M260.777,143.57c0.064-0.521-0.326-0.892-1.043-0.892c-1.458,0-2.434,1.218-2.771,2.197c2.434,0.021,3.692-0.305,3.812-1.283 + L260.777,143.57z"/> + <path d="M263.442,151.27l3.329-10.637h3.111l-3.308,10.637H263.442z M268.879,139.242c-0.914,0-1.508-0.652-1.388-1.632 + c0.139-1.131,1.124-1.892,2.146-1.892c0.979,0,1.598,0.631,1.475,1.631c-0.147,1.196-1.146,1.893-2.212,1.893H268.879z"/> + <path d="M269.721,152.75c0.545,0.348,1.799,0.587,2.712,0.587c1.566,0,2.805-0.696,3.523-2.828l0.286-0.913H276.2 + c-0.96,1.088-1.979,1.588-3.241,1.588c-2.11,0-3.182-1.719-2.948-3.807c0.409-3.502,3.359-6.982,7.993-6.982 + c1.501,0,2.771,0.283,3.846,0.74l-2.686,8.766c-0.61,1.957-1.434,3.697-2.82,4.72c-1.266,0.914-2.845,1.196-4.259,1.196 + c-1.436,0-2.709-0.261-3.397-0.674L269.721,152.75z M278.23,142.983c-0.226-0.108-0.672-0.196-1.107-0.196 + c-1.892,0-3.5,2.11-3.746,4.111c-0.133,1.088,0.249,1.871,1.206,1.871c1.022,0,2.187-1.153,2.754-2.937L278.23,142.983z"/> + <path d="M281.345,151.27l4.833-15.443h3.133l-1.955,6.178h0.043c1.013-0.979,2.199-1.61,3.592-1.61 + c1.653,0,2.547,1.045,2.323,2.872c-0.062,0.5-0.25,1.326-0.432,1.914l-1.9,6.09h-3.133l1.825-5.829 + c0.138-0.413,0.237-0.87,0.291-1.306c0.088-0.718-0.133-1.218-0.916-1.218c-1.109,0-2.385,1.349-3.038,3.48l-1.533,4.872H281.345z + "/> + <path d="M301.254,137.762l-0.896,2.871h2.284l-0.772,2.393h-2.262l-1.159,3.59c-0.141,0.435-0.294,0.979-0.34,1.348 + c-0.063,0.522,0.108,0.893,0.805,0.893c0.261,0,0.587,0,0.854-0.044l-0.65,2.458c-0.432,0.152-1.226,0.239-1.878,0.239 + c-1.893,0-2.667-0.957-2.501-2.306c0.069-0.565,0.206-1.152,0.479-1.958l1.323-4.22h-1.349l0.729-2.393h1.37l0.638-2.001 + L301.254,137.762z"/> + <path d="M312.664,136.61h3.133l-3.038,9.679c-1.175,3.72-2.946,5.221-6.275,5.221c-0.913,0-1.917-0.152-2.371-0.348l0.938-2.676 + c0.438,0.152,1.012,0.261,1.708,0.261c1.37,0,2.323-0.674,3.004-2.849L312.664,136.61z"/> + <path d="M320.891,151.27c0.097-0.609,0.253-1.349,0.39-2.11h-0.044c-1.217,1.763-2.659,2.35-3.899,2.35 + c-1.914,0-3.037-1.479-2.765-3.697c0.44-3.589,3.304-7.418,8.524-7.418c1.283,0,2.603,0.239,3.438,0.522l-1.75,5.568 + c-0.43,1.37-0.903,3.458-1.023,4.785H320.891z M322.773,142.852c-0.233-0.043-0.489-0.087-0.815-0.087 + c-2.023,0-3.807,2.479-4.05,4.459c-0.129,1.044,0.196,1.762,1.066,1.762c0.936,0,2.263-1.065,3.063-3.676L322.773,142.852z"/> + <path d="M331.268,140.633l-0.071,4.655c-0.052,1.305-0.042,2.109-0.072,2.893h0.064c0.377-0.761,0.802-1.565,1.55-2.871 + l2.706-4.677h3.502l-7.224,10.637h-3.197l-0.478-10.637H331.268z"/> + <path d="M343.84,151.27c0.097-0.609,0.253-1.349,0.39-2.11h-0.044c-1.217,1.763-2.659,2.35-3.899,2.35 + c-1.914,0-3.038-1.479-2.766-3.697c0.441-3.589,3.305-7.418,8.525-7.418c1.283,0,2.603,0.239,3.438,0.522l-1.749,5.568 + c-0.43,1.37-0.904,3.458-1.023,4.785H343.84z M345.722,142.852c-0.233-0.043-0.489-0.087-0.815-0.087 + c-2.023,0-3.807,2.479-4.05,4.459c-0.129,1.044,0.196,1.762,1.066,1.762c0.936,0,2.263-1.065,3.063-3.676L345.722,142.852z"/> + <path d="M365.175,150.596c-1.155,0.369-2.995,0.826-4.844,0.826c-2.001,0-3.612-0.522-4.675-1.609 + c-1.05-1.022-1.523-2.654-1.294-4.524c0.337-2.741,1.737-5.111,3.804-6.699c1.821-1.37,4.199-2.132,6.744-2.132 + c1.893,0,3.261,0.37,3.792,0.652l-1.262,2.654c-0.615-0.305-1.73-0.609-3.036-0.609c-1.457,0-2.791,0.413-3.863,1.175 + c-1.407,1-2.469,2.74-2.715,4.741c-0.302,2.458,1.004,3.698,3.31,3.698c0.739,0,1.253-0.109,1.642-0.262l0.967-3.088h-2.284 + l0.808-2.502h5.329L365.175,150.596z"/> + <path d="M374.62,151.27c0.097-0.609,0.253-1.349,0.39-2.11h-0.043c-1.217,1.763-2.66,2.35-3.899,2.35 + c-1.915,0-3.038-1.479-2.766-3.697c0.44-3.589,3.304-7.418,8.524-7.418c1.283,0,2.603,0.239,3.438,0.522l-1.75,5.568 + c-0.43,1.37-0.903,3.458-1.022,4.785H374.62z M376.502,142.852c-0.234-0.043-0.49-0.087-0.816-0.087 + c-2.022,0-3.807,2.479-4.05,4.459c-0.128,1.044,0.197,1.762,1.067,1.762c0.936,0,2.263-1.065,3.062-3.676L376.502,142.852z"/> + <path d="M379.645,151.27l2.208-7.178c0.427-1.349,0.721-2.502,0.969-3.459h2.697l-0.409,1.74h0.043 + c1.147-1.37,2.506-1.979,3.876-1.979c1.697,0,2.303,1.088,2.275,2.023c1.125-1.37,2.532-2.023,3.925-2.023 + c1.631,0,2.457,1.066,2.235,2.872c-0.053,0.435-0.244,1.283-0.398,1.826l-1.911,6.178h-3.046l1.779-5.808 + c0.138-0.413,0.26-0.87,0.311-1.283c0.091-0.739-0.172-1.262-0.89-1.262c-1.044,0-2.26,1.393-2.938,3.546l-1.481,4.807h-3.024 + l1.828-5.851c0.116-0.414,0.232-0.827,0.277-1.196c0.091-0.74-0.079-1.306-0.84-1.306c-1.066,0-2.357,1.479-2.983,3.567 + l-1.479,4.785H379.645z"/> + <path d="M406.693,150.661c-1.317,0.631-2.889,0.849-4.063,0.849c-3.045,0-4.4-1.719-4.059-4.503 + c0.398-3.24,3.162-6.612,7.012-6.612c2.154,0,3.549,1.219,3.306,3.198c-0.331,2.696-3.083,3.676-7.334,3.566 + c-0.037,0.305,0.013,0.783,0.193,1.088c0.346,0.544,1.029,0.826,1.943,0.826c1.152,0,2.163-0.261,3.063-0.674L406.693,150.661z + M405.955,143.57c0.063-0.521-0.326-0.892-1.044-0.892c-1.457,0-2.434,1.218-2.771,2.197c2.434,0.021,3.692-0.305,3.813-1.283 + L405.955,143.57z"/> + <path d="M417.337,136.61h3.133l-3.727,11.92h5.634l-0.858,2.74h-8.767L417.337,136.61z"/> + <path d="M423.215,151.27l3.329-10.637h3.111l-3.308,10.637H423.215z M428.652,139.242c-0.914,0-1.508-0.652-1.388-1.632 + c0.139-1.131,1.124-1.892,2.146-1.892c0.979,0,1.598,0.631,1.475,1.631c-0.146,1.196-1.146,1.893-2.212,1.893H428.652z"/> + <path d="M436.924,135.827l-2.01,6.091h0.043c0.898-0.936,2.167-1.523,3.473-1.523c2.219,0,2.995,1.827,2.763,3.72 + c-0.423,3.437-3.171,7.396-7.957,7.396c-2.523,0-3.651-1.088-3.419-2.979c0.08-0.653,0.27-1.306,0.478-1.937l3.476-10.767H436.924 + z M433.38,146.79c-0.107,0.348-0.221,0.739-0.253,1.174c-0.071,0.762,0.313,1.175,1.053,1.175c1.827,0,3.42-2.522,3.647-4.372 + c0.128-1.044-0.211-1.827-1.168-1.827c-1.131,0-2.38,1.132-2.977,2.98L433.38,146.79z"/> + <path d="M441.183,151.27l1.996-6.329c0.48-1.61,0.852-3.394,1.072-4.308h2.698c-0.132,0.718-0.285,1.436-0.466,2.197h0.087 + c0.916-1.436,2.213-2.437,3.671-2.437c0.218,0,0.41,0.022,0.585,0.022l-0.986,3.066c-0.128-0.021-0.302-0.021-0.476-0.021 + c-1.979,0-3.153,1.762-3.801,3.85l-1.227,3.959H441.183z"/> + <path d="M456.084,151.27c0.097-0.609,0.253-1.349,0.39-2.11h-0.043c-1.218,1.763-2.66,2.35-3.9,2.35 + c-1.914,0-3.037-1.479-2.765-3.697c0.44-3.589,3.304-7.418,8.524-7.418c1.283,0,2.603,0.239,3.438,0.522l-1.75,5.568 + c-0.43,1.37-0.903,3.458-1.023,4.785H456.084z M457.966,142.852c-0.233-0.043-0.489-0.087-0.815-0.087 + c-2.023,0-3.807,2.479-4.05,4.459c-0.128,1.044,0.196,1.762,1.066,1.762c0.936,0,2.264-1.065,3.063-3.676L457.966,142.852z"/> + <path d="M461.087,151.27l1.995-6.329c0.48-1.61,0.853-3.394,1.073-4.308h2.697c-0.132,0.718-0.285,1.436-0.466,2.197h0.087 + c0.916-1.436,2.214-2.437,3.672-2.437c0.217,0,0.41,0.022,0.584,0.022l-0.985,3.066c-0.128-0.021-0.302-0.021-0.476-0.021 + c-1.98,0-3.153,1.762-3.802,3.85l-1.226,3.959H461.087z"/> + <path d="M474.815,140.633l0.083,4.634c0.017,1.109,0.031,1.87,0.035,2.545h0.044c0.319-0.653,0.645-1.349,1.242-2.502l2.511-4.677 + h3.307l-4.744,7.635c-1.762,2.828-3.261,4.764-4.838,6.091c-1.385,1.175-2.928,1.696-3.637,1.805l-0.368-2.675 + c0.52-0.152,1.247-0.413,1.91-0.849c0.779-0.5,1.466-1.131,1.967-1.849c0.106-0.152,0.122-0.283,0.105-0.5l-0.902-9.658H474.815z" + /> + </g> + <g display="none"> + <path display="inline" d="M261.5,171.218l11.574-34.969h14.483c2.508,0,4.354,0.29,5.537,0.871 + c1.183,0.581,2.099,1.575,2.746,2.982s0.863,2.986,0.648,4.735c-0.178,1.447-0.65,2.92-1.418,4.414 + c-0.768,1.496-1.656,2.729-2.667,3.699c-1.011,0.97-2.004,1.701-2.979,2.194s-2,0.859-3.069,1.098 + c-2.29,0.524-4.57,0.787-6.843,0.787h-8.687l-4.696,14.188H261.5z M272.139,153.062h7.648c2.968,0,5.186-0.321,6.653-0.966 + c1.468-0.644,2.702-1.626,3.701-2.947c0.999-1.32,1.59-2.721,1.771-4.201c0.141-1.145,0.035-2.08-0.317-2.805 + c-0.354-0.724-0.911-1.257-1.673-1.6c-0.763-0.342-2.287-0.513-4.574-0.513h-8.896L272.139,153.062z"/> + <path display="inline" d="M295.298,161.598c0.607-4.943,2.554-9.037,5.84-12.28c2.711-2.671,5.999-4.006,9.865-4.006 + c3.03,0,5.354,0.954,6.975,2.862c1.62,1.907,2.23,4.482,1.833,7.725c-0.357,2.91-1.273,5.616-2.749,8.12s-3.372,4.424-5.689,5.759 + c-2.318,1.336-4.669,2.003-7.052,2.003c-1.957,0-3.685-0.421-5.183-1.264s-2.575-2.035-3.229-3.577 + C295.253,165.398,295.05,163.618,295.298,161.598z M299.632,161.168c-0.293,2.383,0.053,4.19,1.037,5.422s2.352,1.847,4.103,1.847 + c0.915,0,1.845-0.187,2.789-0.56s1.85-0.941,2.717-1.705c0.866-0.762,1.632-1.632,2.295-2.609 + c0.664-0.977,1.231-2.029,1.701-3.158c0.682-1.572,1.112-3.082,1.29-4.527c0.28-2.288-0.073-4.063-1.062-5.326 + c-0.988-1.264-2.35-1.896-4.084-1.896c-1.341,0-2.603,0.321-3.785,0.966c-1.184,0.643-2.297,1.584-3.339,2.824 + c-1.044,1.238-1.875,2.681-2.495,4.325S299.791,159.881,299.632,161.168z"/> + <path display="inline" d="M325.079,171.218l0.487-25.344h4.125l-0.293,11.395l-0.315,6.391c-0.04,0.478-0.108,1.435-0.207,2.871 + c0.68-1.612,1.239-2.853,1.68-3.718s1.123-2.101,2.048-3.706l7.588-13.232h4.656l-0.74,12.681c-0.115,1.925-0.349,4.489-0.7,7.694 + c1.066-2.124,2.718-5.082,4.953-8.872l6.815-11.503h4.313l-15.44,25.344h-4.438l0.9-14.858c0.043-0.922,0.209-2.719,0.498-5.392 + c-0.865,1.694-1.855,3.528-2.971,5.505l-8.459,14.745H325.079z"/> + <path display="inline" d="M374.843,162.625l4.112,0.438c-0.855,2.075-2.475,4.047-4.858,5.915 + c-2.385,1.869-5.069,2.804-8.053,2.804c-1.863,0-3.52-0.434-4.968-1.3c-1.449-0.865-2.479-2.126-3.088-3.779 + c-0.61-1.653-0.785-3.537-0.526-5.651c0.34-2.767,1.305-5.448,2.895-8.048c1.591-2.6,3.474-4.531,5.65-5.795 + c2.176-1.264,4.44-1.896,6.793-1.896c3,0,5.28,0.938,6.842,2.815c1.563,1.876,2.145,4.436,1.746,7.68 + c-0.152,1.241-0.42,2.514-0.801,3.817h-18.512c-0.123,0.493-0.209,0.938-0.258,1.335c-0.291,2.366,0.027,4.173,0.955,5.42 + s2.173,1.87,3.735,1.87c1.467,0,2.97-0.482,4.509-1.448C372.555,165.836,373.832,164.444,374.843,162.625z M363.165,156.343 + h14.103c0.07-0.446,0.118-0.767,0.142-0.958c0.267-2.171-0.065-3.836-0.996-4.993s-2.24-1.736-3.928-1.736 + c-1.83,0-3.576,0.639-5.239,1.916C365.582,151.849,364.221,153.773,363.165,156.343z"/> + <path display="inline" d="M382.333,171.218l8.362-25.344h3.814l-1.712,5.185c1.541-1.955,2.987-3.402,4.342-4.34 + c1.354-0.938,2.677-1.407,3.971-1.407c0.853,0,1.863,0.313,3.033,0.938l-2.242,4c-0.676-0.542-1.455-0.813-2.338-0.813 + c-1.499,0-3.144,0.845-4.934,2.532c-1.789,1.688-3.407,4.721-4.853,9.098l-3.374,10.151H382.333z"/> + <path display="inline" d="M417.95,162.625l4.111,0.438c-0.854,2.075-2.475,4.047-4.858,5.915 + c-2.385,1.869-5.069,2.804-8.053,2.804c-1.863,0-3.52-0.434-4.968-1.3c-1.448-0.865-2.478-2.126-3.088-3.779 + s-0.785-3.537-0.525-5.651c0.34-2.767,1.304-5.448,2.895-8.048c1.59-2.6,3.474-4.531,5.649-5.795s4.44-1.896,6.794-1.896 + c2.999,0,5.28,0.938,6.842,2.815c1.562,1.876,2.144,4.436,1.745,7.68c-0.152,1.241-0.419,2.514-0.801,3.817h-18.512 + c-0.123,0.493-0.209,0.938-0.258,1.335c-0.29,2.366,0.027,4.173,0.956,5.42c0.928,1.247,2.173,1.87,3.734,1.87 + c1.468,0,2.971-0.482,4.509-1.448C415.661,165.836,416.937,164.444,417.95,162.625z M406.27,156.343h14.104 + c0.07-0.446,0.117-0.767,0.141-0.958c0.267-2.171-0.065-3.836-0.996-4.993s-2.24-1.736-3.928-1.736 + c-1.83,0-3.576,0.639-5.239,1.916C408.687,151.849,407.327,153.773,406.27,156.343z"/> + <path display="inline" d="M442.803,167.545c-2.794,2.824-5.524,4.235-8.192,4.235c-2.384,0-4.261-0.886-5.629-2.659 + c-1.369-1.771-1.847-4.344-1.433-7.714c0.379-3.084,1.352-5.901,2.92-8.453s3.374-4.463,5.417-5.735 + c2.042-1.271,4.011-1.907,5.905-1.907c3.126,0,5.299,1.521,6.521,4.563l4.514-13.625h4.25l-11.544,34.969h-3.938L442.803,167.545z + M431.899,160.594c-0.217,1.763-0.213,3.152,0.01,4.168c0.224,1.018,0.713,1.863,1.468,2.537c0.755,0.676,1.718,1.013,2.889,1.013 + c1.944,0,3.832-1.016,5.663-3.047c2.45-2.697,3.919-6.029,4.406-9.997c0.246-2.004-0.083-3.57-0.988-4.699 + s-2.148-1.694-3.729-1.694c-1.028,0-1.993,0.23-2.896,0.69c-0.902,0.461-1.837,1.243-2.803,2.347 + c-0.966,1.104-1.838,2.505-2.615,4.204C432.525,157.815,432.057,159.308,431.899,160.594z"/> + </g> +</g> +</svg> diff --git a/etc/lwjgl-2.9.1/res/lwjgl_16x16.xpm b/etc/lwjgl-2.9.1/res/lwjgl_16x16.xpm new file mode 100644 index 0000000..a893eb2 --- /dev/null +++ b/etc/lwjgl-2.9.1/res/lwjgl_16x16.xpm @@ -0,0 +1,141 @@ +/* XPM */ +static char * lwjgl_logo_2a_xpm[] = { +"16 16 122 2", +" c #000000", +". c #010101", +"+ c #020202", +"@ c #030303", +"# c #0A0A0A", +"$ c #0C0C0C", +"% c #0E0E0E", +"& c #171717", +"* c #1B1B1B", +"= c #1D1D1D", +"- c #1F1F1F", +"; c #222222", +"> c #232323", +", c #2B2B2B", +"' c #2D2D2D", +") c #333333", +"! c #3D3D3D", +"~ c #404040", +"{ c #434343", +"] c #4A4A4A", +"^ c #4F4F4F", +"/ c #525252", +"( c #565656", +"_ c #585858", +": c #595959", +"< c #5C5C5C", +"[ c #5E5E5E", +"} c #5F5F5F", +"| c #666666", +"1 c #686868", +"2 c #6C6C6C", +"3 c #6D6D6D", +"4 c #397CB5", +"5 c #3A7DB5", +"6 c #3D7FB6", +"7 c #3E80B6", +"8 c #747474", +"9 c #787878", +"0 c #4886BA", +"a c #4C89BC", +"b c #4D89BC", +"c c #508BBD", +"d c #508CBD", +"e c #76828D", +"f c #548EBF", +"g c #5690C0", +"h c #848484", +"i c #5B92C1", +"j c #7D8D9B", +"k c #6096C3", +"l c #8C8C8C", +"m c #8D8F91", +"n c #669AC5", +"o c #919191", +"p c #6D9EC8", +"q c #8499AA", +"r c #959595", +"s c #71A1CA", +"t c #74A4CB", +"u c #9B9B9B", +"v c #77A5CC", +"w c #9C9EA0", +"x c #7CA8CE", +"y c #7EA9CE", +"z c #A1A1A1", +"A c #81ABCE", +"B c #82ACD0", +"C c #84ADD0", +"D c #A5A5A5", +"E c #A6A6A7", +"F c #86AFD2", +"G c #87B0D2", +"H c #A8A8A8", +"I c #8CB3D4", +"J c #8DB4D4", +"K c #91B6D5", +"L c #94B7D5", +"M c #97BAD8", +"N c #9EBFDA", +"O c #A2C1DC", +"P c #BCBCBC", +"Q c #BDBDBD", +"R c #BFBFBF", +"S c #C0C0C0", +"T c #B0C5D6", +"U c #C6C6C6", +"V c #CCCCCC", +"W c #CFCFCF", +"X c #D0D0D0", +"Y c #C2D7E8", +"Z c #D3D3D3", +"` c #C4D8E9", +" . c #D4D4D4", +".. c #C6D9E9", +"+. c #D6D6D6", +"@. c #D0E0ED", +"#. c #DADEE1", +"$. c #D2E1EE", +"%. c #DFDFDF", +"&. c #E4E4E4", +"*. c #DAE7F1", +"=. c #E5E5E5", +"-. c #E6E6E6", +";. c #E0EAF3", +">. c #E2ECF4", +",. c #E4EDF5", +"'. c #E7EFF6", +"). c #EEEEEE", +"!. c #E8F0F6", +"~. c #EFEFEF", +"{. c #EBF2F8", +"]. c #EDF3F8", +"^. c #F2F2F2", +"/. c #F5F5F5", +"(. c #F6F6F6", +"_. c #F4F8FB", +":. c #FBFBFB", +"<. c #FAFCFD", +"[. c #FCFDFE", +"}. c #FEFEFE", +"|. c #FEFFFF", +"1. c #FFFFFF", +"1.1.1.1.1.1.|.Y t c f F '.1.1.1.", +"1.1.1.1.1./.m e j q L 5 0 *.1.1.", +"1.1.1.1._.w &.C 5 i [.1.", +"1.1.1.1.K } ; 1.!.4 5 ` 1.", +"1.1.1...A = | 1.@.5 5 J 1.", +"^.D %.O T # H 1.M 5 5 s 1.", +"z . > V X D h < ~.1.k 5 5 p 1.", +"[ W - @ , 2 U <.N v a x 1.", +"* & +.. / =.! 1 E #.1.", +"8 % : r o u + { ", +"1.).l R ( Z _ ) ", +"1.1.[.1.S ~ + * :.& 9 ", +"1.1.$.y ;.1. .3 h Z Q ", +"1.1.}.n 6 B ,.1.1.=.' $ (.", +"1.1.1.>.b 5 7 G '.1.}.P ^ @ ] 1.", +"1.1.1.1.{.I g d v ].1.1.1.%.-.1."}; diff --git a/etc/lwjgl-2.9.1/res/lwjgl_32x32.xpm b/etc/lwjgl-2.9.1/res/lwjgl_32x32.xpm new file mode 100644 index 0000000..1b835e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/res/lwjgl_32x32.xpm @@ -0,0 +1,275 @@ +/* XPM */ +static char * lwjgl_32x32_xpm[] = { +"32 32 240 2", +" c #FFFFFF", +". c #FAFCFD", +"+ c #CBDDEC", +"@ c #93B7D6", +"# c #6FA0C9", +"$ c #5C93C2", +"% c #6096C3", +"& c #7AA7CD", +"* c #ACC8E0", +"= c #EDF3F8", +"- c #FCFDFE", +"; c #B5CEE3", +"> c #5A92C1", +", c #3A7DB5", +"' c #4585B9", +") c #A1C1DC", +"! c #FCFCFC", +"~ c #E2EAF1", +"{ c #B8CFE3", +"] c #AEC9E0", +"^ c #A3C2DC", +"/ c #98BAD8", +"( c #8CB3D3", +"_ c #81ACCF", +": c #6E9FC8", +"< c #3D7FB6", +"[ c #72A2CA", +"} c #F5F8FB", +"| c #D8D8D8", +"1 c #313131", +"2 c #242424", +"3 c #404040", +"4 c #525252", +"5 c #656565", +"6 c #747474", +"7 c #8F8F8F", +"8 c #F7F8F8", +"9 c #ACC8DF", +"0 c #3B7DB5", +"a c #79A7CD", +"b c #FEFEFE", +"c c #686868", +"d c #000000", +"e c #B6B6B6", +"f c #86AED1", +"g c #AECAE1", +"h c #D3E2EE", +"i c #E1EAF2", +"j c #282828", +"k c #020202", +"l c #DEDEDE", +"m c #5B92C1", +"n c #4886BA", +"o c #F4F8FB", +"p c #ECF3F8", +"q c #6499C5", +"r c #D7D9DB", +"s c #050505", +"t c #C0D5E7", +"u c #397CB5", +"v c #ABC8E0", +"w c #FEFFFF", +"x c #78A6CC", +"y c #7BA7CD", +"z c #9E9E9E", +"A c #E2ECF4", +"B c #377BB4", +"C c #669AC5", +"D c #C3D7E8", +"E c #397DB5", +"F c #B2CCE1", +"G c #585858", +"H c #A9A9A9", +"I c #BCD2E5", +"J c #4081B7", +"K c #EEF4F9", +"L c #DDE5ED", +"M c #1C1C1C", +"N c #070707", +"O c #E7E7E7", +"P c #85AED1", +"Q c #CCDEEC", +"R c #BAD2E5", +"S c #5790BF", +"T c #D0D1D1", +"U c #030303", +"V c #333333", +"W c #FDFDFD", +"X c #FBFCFD", +"Y c #508BBD", +"Z c #B1CCE2", +"` c #CACACA", +" . c #373737", +".. c #616161", +"+. c #A2A2A2", +"@. c #DDDDDD", +"#. c #E4ECF3", +"$. c #B1CBE1", +"%. c #B4CDE2", +"&. c #E6E6E6", +"*. c #232323", +"=. c #727272", +"-. c #D8E5F0", +";. c #A0C0DB", +">. c #666666", +",. c #060606", +"'. c #272727", +"). c #D4D4D4", +"!. c #F6F6F6", +"~. c #D0D0D0", +"{. c #979797", +"]. c #5E5E5E", +"^. c #040404", +"/. c #C0C0C0", +"(. c #A2C1DB", +"_. c #9EBFDA", +":. c #FBFBFB", +"<. c #252525", +"[. c #5C5C5C", +"}. c #EAEAEA", +"|. c #B5B5B5", +"1. c #E9E9E9", +"2. c #B2B2B2", +"3. c #BDBDBD", +"4. c #6B9DC7", +"5. c #DBDBDB", +"6. c #838383", +"7. c #5F5F5F", +"8. c #0B0B0B", +"9. c #767676", +"0. c #B7B7B7", +"a. c #F0F0F0", +"b. c #F0F5F9", +"c. c #4B88BB", +"d. c #B2CCE2", +"e. c #9A9A9A", +"f. c #C5C5C5", +"g. c #F7F7F7", +"h. c #1D1D1D", +"i. c #3C3C3C", +"j. c #DFDFDF", +"k. c #F3F7FA", +"l. c #CCDDEB", +"m. c #9EBEDA", +"n. c #72A1C9", +"o. c #4C89BB", +"p. c #C9DCEB", +"q. c #565656", +"r. c #0F0F0F", +"s. c #F9F9F9", +"t. c #D1D1D1", +"u. c #8E8E8E", +"v. c #848484", +"w. c #707070", +"x. c #B0B0B0", +"y. c #F9FBFC", +"z. c #DCE8F2", +"A. c #F6F9FC", +"B. c #151515", +"C. c #4E4E4E", +"D. c #919191", +"E. c #BBBBBB", +"F. c #2F2F2F", +"G. c #393939", +"H. c #909090", +"I. c #4D4D4D", +"J. c #101010", +"K. c #5A5A5A", +"L. c #090909", +"M. c #323232", +"N. c #B1B1B1", +"O. c #A1A1A1", +"P. c #353535", +"Q. c #F5F5F5", +"R. c #131313", +"S. c #454545", +"T. c #F8F8F8", +"U. c #2B2B2B", +"V. c #BEBEBE", +"W. c #505050", +"X. c #C2C2C2", +"Y. c #868686", +"Z. c #D2D2D2", +"`. c #010101", +" + c #434343", +".+ c #DCDCDC", +"++ c #E0E0E0", +"@+ c #959595", +"#+ c #C8C8C8", +"$+ c #888888", +"%+ c #292929", +"&+ c #181818", +"*+ c #4A4A4A", +"=+ c #CFCFCF", +"-+ c #F1F6FA", +";+ c #4B4B4B", +">+ c #86AFD1", +",+ c #90B5D5", +"'+ c #EAF1F7", +")+ c #787878", +"!+ c #1B1B1B", +"~+ c #969696", +"{+ c #C6C6C6", +"]+ c #C3D8E9", +"^+ c #4383B8", +"/+ c #94B8D6", +"(+ c #F4F4F4", +"_+ c #A7A7A7", +":+ c #858585", +"<+ c #9D9D9D", +"[+ c #FAFBFD", +"}+ c #5D94C2", +"|+ c #4685B9", +"1+ c #98BBD8", +"2+ c #EFF4F9", +"3+ c #9B9B9B", +"4+ c #C5D9E9", +"5+ c #3B7EB6", +"6+ c #F2F6FA", +"7+ c #2C2C2C", +"8+ c #8FB5D5", +"9+ c #4A87BB", +"0+ c #FAFAFA", +"a+ c #6E6E6E", +"b+ c #85AFD1", +"c+ c #4D89BC", +"d+ c #A8C5DE", +"e+ c #0E0E0E", +"f+ c #B8B8B8", +"g+ c #FEFEFF", +"h+ c #B1CBE2", +"i+ c #4C89BC", +"j+ c #BFD4E7", +"k+ c #ECECEC", +"l+ c #939393", +"m+ c #81ACD0", +"n+ c #6599C5", +"o+ c #6197C4", +"p+ c #6C9EC8", +"q+ c #F7FAFC", +" . + @ # $ % & * = ", +" - ; > , , , , , , , ' ) - ", +" ! ~ { ] ^ / ( _ : < , , , [ } ", +" | 1 2 1 3 4 5 6 7 8 9 0 , , , a - ", +" b c d d d d d d d d e b f , , , , g ", +" h i j d d d d d d d k l } m , , , n o ", +" p q r s d d d d d d d 2 b t u , , , v ", +" w x y z d d d d d d d d 5 A B , , , C ", +" D E F G d d d d d d d d H I , , , , J K ", +" . > < L M d d d d d d d N O P , , , , E Q ", +" b R , S T U d d d d d d d V W X Y , , , , E Z ", +" ` ...+.@.#.$.%.&.*.d d d d d d d =. -., , , , , , ;. ", +" >.d d d ,.'.>.). !.~.{.].'.^.d U /. (., , , , , , _. ", +":.<.d d d d d d [. }.7 |.1.W O 2.3.b 4., , , , , , ) ", +"5.U d d d d d d 6. 7.d d 8. .9.0.a. b.c.< u , , , , d. ", +"e.d d d d d d d f.g.h.d d d d d d N i.j. X - k.l.m.n.o., p. ", +"q.d d d d d d r.s.t.U d d d d d d d d u. s.v.w.x.}. y.z.A. ", +"B.d d d d d d C. D.d d d d d d d d d E. z d d d ^.F.w.x.&.b ", +"G.d d d d d d H. I.d d d d d d d d J.a. K.d d d d d d d L.M.N.", +"!.O.P.k d d k t.Q.R.d d d d d d d d S.b T.h.d d d d d d d d d U.", +" ! V.W.s <.s.X.d d d d d d d d d Y. Z.`.d d d d d d d d d +", +" b .+++ @+d d d d d d d d `.#+ u.d d d d d d d d d d $+", +" j.%+d d d d d d d &+Q. *+d d d d d d d d d d =+", +" -+ s.|.;+,.d d d d 4 T.J.d d d d d d d d d M T.", +" >+,+'+ 5.)+!+d d ~+ {+d d d d d d d d d d K. ", +" ]+, ^+/+= (+_+:+(+ Y.d d d d d d d d d d <+ ", +" [+}+, , |+1+2+ 3+d d d d d d d d d s @. ", +" 4+5+, , , n m.6+ :.u.<.`.d d d d d d 7+! ", +" 8+, , , , , 9+^ k. 0+x.S.^.d d d d a+ ", +" - b+, , , , , , c+d+A. b Z.c e+d `.f+ ", +" g+h+i+E , , , , , c+j+ k+l+3+W ", +" k.; m+n+o+p+8+4+q+ "}; diff --git a/etc/lwjgl-2.9.1/res/resources.txt b/etc/lwjgl-2.9.1/res/resources.txt new file mode 100644 index 0000000..5f359ca --- /dev/null +++ b/etc/lwjgl-2.9.1/res/resources.txt @@ -0,0 +1,11 @@ +The following files are included in the resource archive: +Footsteps.wav - from openal.org cvs +ding.wav - from openal.org cvs +left.wav - sampled by matzon +right.wav - sampled by matzon +center.wav - sampled by matzon + +optional: +Missing_you.mod - Missing You, by Doh (Nicolas Desessart, http://doh.av7.net) +phero.mp3 - snipped from unreleased Phero track +phero2.ogg - snipped from unreleased Phero track \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/res/right.wav b/etc/lwjgl-2.9.1/res/right.wav new file mode 100644 index 0000000000000000000000000000000000000000..f23dbedac0c27f59ea59e89ccc981784e85be532 GIT binary patch literal 55188 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%0DG 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/alien.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/alien.gif new file mode 100644 index 0000000000000000000000000000000000000000..19bf8fcd62354ccd6cb4b229573740b6e0fac46d GIT binary patch literal 1318 zcmeH`-Ahve9EN}AYn!RtTvO&@wh4aQ#R`ifI@-aNTGNiPBq{TVr7aAGU$j^;*wi*w zNoq`RbqcjZNh};gqG*;-mV#-BWngBStOXiYC?T=`q6?p!_wME8fw!>u5S3e<4N33^ zB2W|sMF2(s7N8!$8p(?QdcEFgG_ovfHk++hD_jNW0^k7#0iFW92M9wifFEES;46UJ z?e=&)JkR_6{?XCVa5x-k-)7sue{3Lm14jT<usgCb@(B=a!2yx7$j6P?MLWqez7hM2 zc2#~o3uS713`tSSj3A8*QM~1^qJa~N$-Rt&XKBn$Qdbn3Y8xiZ5n3}g=z=$bXt~ia z`SWa>7!xXa8yf^XUc4foO)d~{J7mTf-TS2@eJb&ZVP?eC8l50!p1JnXHW%g$$k}Pr z1WGi_#7lFsPdS>Rm|!labBHV#j;S@aZ}UC*LiO+0!>e|oGs>Ei-&|MMDih4PbqkAt z3PgF$tnKluDJqHSVD_vRP7OqB9yvKv32LdDzg_u`UP15Dhi59ew36jG^6f2#4cJ|T z`+J&3noD4%-YwEo$*PghGG$jgMXqg1f+~jBJx7W0PsA6kd*~j#?AK0uF`Qx$fx@Wc zE@4{RN#uHF-|XdL+NVI)y@d$w9ZUaMbF++^#zGZE^KBornr^Gix~wvxS%Drzs$+F6 zeZSJH@VIh((I7Uck=oX!<3UVj;A%{g*i|@+_6iqD@q}|sxB7=asVl2NAM8Z+nFx{^ zRjwukv9$w5xI1wGBpt;aAa(4Y>r_@-mMj%6M+z}SPcD}7W2V#1p2VgU;>kqC3MV<} uyhE=gZYo%T-n{EZ<M{_YNXJ$x+;6NU5uUh4hWZBsq0mFZS1y+V<oyF9GUY!2 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/alien2.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/alien2.gif new file mode 100644 index 0000000000000000000000000000000000000000..199b211eda51706d329170aeed7b476ca6bc7696 GIT binary patch literal 1294 zcmeH`-Ahw(9LB%D&da9GZR(^kt<6YN^kT-SBMP12aMPTuIGBNBXJsuxVac>6$2zrT zZVWAmnlS1_F=s?98e)*(YLJwHn1~ReLameqBkaWrE&q!yd~P0iu0DL=G1k{nRrYe& z1wQ~NiUJb=1Hb}w0B~D<9>8EQFbu=8tkdb_I1UB?ZU9689s)cAm;*>b2p|S94e$YA za}xrAKrk4LL?W?RERjg0QmKFAcD4=t&jyOtaRi`-iY>^kPk?v>4v7m*Q6cUT=c!tw zanJLs>Y9!gII?tEqN1omrGUI7!h8NGy9AL`wcp|m(g+Kvs0(t9p7xMBf-7Cu*EW!u zxr|}v>#2SzMkoa*&GVQ-@>#J^R7(mOat5d8J|4cWmM~E|UPff)ODq%qe8l@P-<X7b z+iu>0cg<(Zb>*#Im#A^Fj0aro?rc(O_)m+&HH7B-)OZvV`9z$qrrY7Tl0&}pYM1Zv zh!9tITKLB=XQ_h50ZZkYaW<TxedHF}-ypYb@wT;+U!IlH4fAH9#GI6?UJuf24>s=K zM=4Dj7aD2GN==t&osbr1Po0!aST#;jUg^|`U_E&5MR=3cyx+hsk(iE-6FV)y_F`3h z0UFdNY)54k2Y4=NPScLG@8&g-rWL$fl9{mg=Dcz&Uz9cyHdkiff*sU#TDsof**uBK z6lrxk)fYYCA&E47=1F&u!Ez1!al1QbiN<r+#`m<U$C53^r1hAbNBwOf_wMk|TP$i~ zXV^Bsjt^+brOCjrv!lgEc~GQB#ZT+oa2brso!_!u4$p75PZb*aqJz`e-qnbSm>V6w WGqi(5cds`;SP6%ER#$8YLG@oY<=zSa literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/alien3.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/alien3.gif new file mode 100644 index 0000000000000000000000000000000000000000..3035868527cc51b049432d1644a213c955e1ac17 GIT binary patch literal 1297 zcmZ?wbhEHb)Mk)n_|Cv!VPV1G!N3s0z>vVeki)=G1EMP!7+hRjLPA0k5)uju3TkR< z7&;gjrZ6z9U|?9oz_5pb;R*x88-_Uy3|kl&&M+`MVPN?GpP{FxXU2>fD^{%7vSrJW zBS+r6c>@$21*0J_m_tDECkrD3gFJ%{$dRBt!NBp4!Jb3LW5a@j%^bo~F&hpxA8MDk z$%$YHe9*)rWnm#Bv4F9Kjgh77k3`V|c0MVifR-5!jLbb!7Igv&jt<RiCag6YKOLRD z*tmp3TrPY{ZR2BRl~_>V(9pmv!t+AphN3gu0#1Pt7KbZOy_d-Iglup)sL9GL$`i1+ zOO&ypi@9?fPr~I)UnZ8KYrFy`+A%F9>^=uH8yHwPDs%lL6dIo2pJ~IY@a@Eo4b1GF z>@_AfrRnLdf^4^23?43SU}WX6&JAeTc>I!uv`<HX;TQKy%Qy|zRW8Up%UBtIe_rfH z#|);0j$YS%7pVC@6Ob}5XqesbxP_(XwVZ*#&lV=Xx$nhh_$Dl9=3Ml!&n+fS;lpQ< zN5L~1X6`=lS<ud&Ct=5y=6Ae27Z_N@V;meCc(;5%SSb+meL~U~)vpJVn2(q@B=DCU zdyvfJDfZBZPsJj!M%ZS;T;|}9<%<4{3swX$Ecv_qMjETl2M5NR6Wb<xFuNEyFgRF! zc<gL=?n(oTU_w|#9E*iOBa3y{6O}4Kn+G!(_%>85EVX9USl}4f<PyNJf;UoNW+c<i z#WR~YEgBu0xBiS^;BPUDo~9(qaIlqEOk`QJz{HzT9tLsZ4fF2KT`t|;!}n$0%-(Z5 dm#48ZNWF9v2&qb&KfUbL%jFBIqy!iktN~U~<ck0R literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/gotyou.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/gotyou.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c373e2ecf46cf25b451783851f40235badc142b GIT binary patch literal 4003 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/hit.wav b/etc/lwjgl-2.9.1/res/spaceinvaders/hit.wav new file mode 100644 index 0000000000000000000000000000000000000000..33dc4bd51c9cf928017ba24adeae4608b3ee83a3 GIT binary patch literal 1886 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/loose.wav b/etc/lwjgl-2.9.1/res/spaceinvaders/loose.wav new file mode 100644 index 0000000000000000000000000000000000000000..e11886aba928ad026dd93b7db442b11510816ca5 GIT binary patch literal 17810 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/pressanykey.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/pressanykey.gif new file mode 100644 index 0000000000000000000000000000000000000000..72125211807180a6ac4237a5b5a640a7c09383d2 GIT binary patch literal 2664 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 NtUGYWfk1%g{{h^gEF=H` literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/ship.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/ship.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb1db981aa46c257632baca6a735ee57708c2dae GIT binary patch literal 1129 zcmZ?wbhEHbRAP`|_|5<XH4zL92@DK53=9<v3@$D%1qB5R3>^#%ds-M6CNMC}VPIIn zz_5jZ;Q#}}83u+Y3=Dr57~ZUinK5I=e=q=<F$zXQU}%Pb;!hSv1_n_E9gy=ud4hrC zAA>fBj7LBM10y4coKM7th0d+qQaT9|3XhJoONa^;Ff3$bY-EvgC~#;<Jl4)AQjoL2 zVZo`1Tt4%1W)!8K=Hha(>aY|}Wn$-#*p>6)fFsjPTXr^&3kw{X7&rtN5?+a9UgGkO zG|G5zz>%5FvOi8&LSYFL1N$O5h6$UWMD*&28oc1zw)W~0Z%LJks)V<3d&{erg-mF0 z@SDaWr19XV*z1O)t@7Fu6DmG79AH+waOcL=f?(D;o>5nA3=Te9CMT*B!63EucGEI; zzJLmYgRfXwgv8YftQnnVZcgPE*$~d~aW5wuhs1#zhNAn&Svh#@_O5Y#I;D8O-fG$1 zM<-p;b`MB<^);j6&2-*H{1dj?G=6APX6lVRaDauGmE+p}c!ku!&IOuVVp2H_1sYid h4ICykau^i|B)(U?GP#jU%q1~dB5g$?D<dO=H2`>0loJ2| literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/shot.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/shot.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a76f2ea1ec140564e4ba1d8d3cb8b00586244a5 GIT binary patch literal 935 zcmZ?wbhEHb<Y5qJ_|5<V>cR~6;tbZ(4F2j2#pc}A?(Flug(ruzua4*5oz4Hho#Fp- zhX3ms{_ke^f1Kg}WrqK^8U8<K`2U&V|9>F*4>n_z7!83T83KwwSr{1@#29oyt_S4_ z296d6T@D$K4GRu7Gjb_t2s}t&V&jugF_2hru!T!l%0$J3;m}b|0S*z92ZG8h%&fvw zSS%+lIK?Rvv8+X)(TRmamtC!bp^>SD-I7(TfWeW8g`Jg4sG(v?qel~?m_X@<1Z787 o0Z9#u2!-sRW+pL%2!jU;TH76`TA6AWFh)1B-#cY0Ex=$6039Sl^Z)<= literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/shot.wav b/etc/lwjgl-2.9.1/res/spaceinvaders/shot.wav new file mode 100644 index 0000000000000000000000000000000000000000..dda47d2b1e4972f046198ca9e78db81db6a14a86 GIT binary patch literal 8276 zcmeHsS(GE!by&+ubezO?qH`3>juK0ZElZI|OEkr0Hq8uYdhbSWKsUP4*mt0?FNLKR z6bh&UPyh-*0foYj#@0YD=)I?BA%`>EMUfPv&{CvGRvbl+;y7lU$VzgYFx8_-=QtnE zN4|WHE~?(UZ@cf_``)|vKGfpm*x1acM@CkzFOTXh?oa>2k&%&)@V}3JVdT;Kk&#~> z(J0-@&+&aizkpw8;BS@&P#*q&IYzU_+DybJABbMN`L)Md<mJ1oF?}X@;yZSz2hoV0 z2FrPMT~Y7`qn3g+7G&c~kN<(@H@_z$Z%X!mTm7Znvmbu^{uKv>(mvmnXNo(5%y&Lj z4+e(ZoU3l;zInml_rLdS^f<35#@=<7^@Ek~`XbdhmpjqFIMFn|WvSeubHK4NM@NpR z=aNu8I~SHsY-h$$XEZgg#W)atYHuwnDqFM~=TKo@yZw7931J2iwO^Arp(_O?I3Kb? z=K1srW(8+66ApUKU@SUrc*0&FB+i@FPBiQ`k~)7j9+pGVa9Lvx<9=ll%GwMjB3jhz zFdTQlWWtPFVxAn~qM<4t#p~H_*;%g9?npYHrztklM;gH%mGZC$xfq?xqs1-M-lWl^ z5J<F5*#rjVD08MvpiwMXB4dFx4YG-tFJX&VqWY$7o{NEK)PRR_0U$^_$i=o6^i~u; z6XVJy6l)<4eCo)ngA@$qK{sU#e&jc#Yj*3`ueV$GKeKsv`|5xG@_$%-8+&8r-Rxnq z_{|6Mdq?n#JMX*M!A}45);qewpT7O&Z+)XAd*=lBFwy?fe|MAndsxr6l~8ZJJfq>l z+!J5_C06j}Ctd?KM&5RAkNoAYXRaTn1f}NReHB7|Hb)v?Y)SsDzEuC-ZzbN}y!uu6 z&icK{+cC)>ee&J4`^f?!dZnTKp3e0GnZ4P6b*-E_)V_3WU;FRny=m4*3w>X8N`I^6 zY9>a2Lh8zAjxCa@--vcce(>~<Mqd63KJp=$|Jy(Q+{VaHR@f`w)jZbx5PHJ?f$Pbi zY-Jyld=D=*n1>(xS`GWxr+0s~`yU@XwHf;1ul(_9EJx?ZY<r*S{H^Z>x+D1fU;OGf z9@~~7{`9Y~UiQ<u-|5I_L<sonC5dI+ro^923$Tkp5&mS;1YUz9@?~au(<gu`21X5A zlQ}2eol3h*(fe9w#12Imi~Fk=TLU1EK<_Qm*?She@v^3lbs}#GZ<{gY8)s&SkkmTf ze&K=|Pi<+u3dc(N{fU_CScYzvOuj@eakZH3PkG+Od_D$$Q*hf|QV-9hCWadN^R0(& z-+r|7VCRs{d^?#qJ?*smhf6u+UCZ~G@`Bg&2luimT|Wz2fAn3igoIk1#r#DI{o?+v z<XR)JEP<EvA>fnJTl(qQ0_gg@5zPrE-V=WL<Eb$E<RWI3jmWCeCqIc6pVLY9il4YP zdMmObXzI4+Czc+><Qv!DwEl7+`AzVqz}+Avx-O~CUCoi$p89=tXzBitexUQeaA0Fy zZ}*2>|If*dZtdS~dctoV|F5rIX<5#k-)8c6_1BRXx8E3@K27Sr82GcZ&-=5-x|zq{ zd7WL6JwUf5SLoOOr7ivOw+4r^((Lh_i`JJ~$*0<IPf@VF);CJN^g-jj=sM@plWe_u zrBxE2eD0)@Qu_AC^CP==_E#UzW~U$j-Ld;md|{;iiO<~lHHlU>vO3as{ZpHKM;%g- zY{n>O-%!flfmi$X#j3?f?R;u7WRh4KSKog2$tQAa`Wldu0T-b)be1{JI;@|KY+`Y? z?D?~%{Ee?$=JxO0|M1Gcx$uK6@0YWUH;*2CjM;GcmPY@4qXRKs#{F6SAHVVAk5=@1 zIkVpL=8xz1aVmNnz&qdhfkWD0Dy#6_Z1zu@YrV^##G9>&g@=hr{5Q+vBNe8dU;Z3s z_dGR+B>(wOK7abm;P3z8Z|KOs1OP{+qFw!HJ^VkW|L~W-AsfBd`^ejahodi}fA3xB zVB}jrI<_DGBQ*A3;NKo(-#H-G|G^&pr*nv_{6pO$c5)TL%U5F$WFMzNk$NyDxH0u# zA2U4uk5>*R10x|)KX!ZM6QSwWM>$FKPIm-)rqOk(KU<0<>bOaSCLhM+1?}rGB4GHR zlZ4|K+^fOjSg}gI@^>D%&$gwNGVO}*m<pw)fz9r#4fQj_3u9!!QAmkvPqRn?em?K? zKj)4(u-al~(pxm%nXs)_DYM7GSxKv2(`NHCAvh0iP?7v@wT&I0a*6y_Z}-*v6;Ew& zaO?HmX1mMw_bLxghGdJV?Z4WBSo)>iiiW7dFUG@uca}h0NVMDqHLL6Bft!Sp6sUCh zi4cKyXvhJ?h)|m1BF=!%-N<^iy!(jzQ4JZ-)Y7tbNrwr9{0te^MhcNw(&1-<Y>mxY zqpkr>rppP2OC{XCP%c{>Bxwo_d(l)sg||t9fSI(bkY#Gh1*iL%N+dLDgDo4hPPx;C z*s4(_u&>x$X0^?#7`>(#m)S+D^OuE~Y)<w24%_Hei53dZjl(*p*8|(-a3+Hjge1vs zZp5MpJxut+(NM|n?ZwhLs|!mh0Cm(E_Ov60uyHM-_M2A?@vJ8dAr@s7Px%;(W{O>+ zmD$ZPXS)nr>y&p7PUvJdIlPz1_vld5c98QTU>!mM3#vDGoTNNp(*OdI*dN4=NWcSF z6E1`(x{}INk1iDsZI$C%t=T-@+3U7mdU%$7`(U`oSH0ZZ+iq5d$Nla`dO%b*nR+VZ zj1QHx9dWEA%npsiEP`wrr`kQCQ_ZjYy($l>0f2zSi0cD|%(^FU<kUqN^@23+>ylx9 zjZ~EwL7+iLKIn*1N;eTv!5#-GRVb~dIlE)oJR7`ZSIWd==D9id;!Hp?t}`w#S`=o5 zTe{$mDXV3hmUR2^5S_?$C?eNl<Ar*aX>FF+T)JFt9+r2S1un}rQvA^^R2m3PQOQ)M zVDXkfEaeVUc*qojR0gwY&F+@2!U~ntV3w{fODrPk!n8tW6HLvIO-`>XE<AsEOfWgR zq+Xj@T~o^EZpx%91{;WIo#vQF8}fj4Gy}uAN+Aj{wKA4yWT+yMDdZc~9jchC)OV|e zTEAJTRgSyePOq@p*lcfbI|t2Psj}ZWZ53;!)^IZ(D;GQcYK+PT=z7La$1-^@=5$0| zK-@wEgAow(YJv{X7sPyvajzNhm|zzJhayf5<aE0*K;wk{pe1A^;gH6RSAzyL0=sae zoUf#JLd`0{ZNz%5?dq_@Zl509JKa5cxc9<a_jX>~J9+rZ(Stj84&Lb$51L$mH(RS! zdX9P&^y>hR-K&<!CQTPKO9Hj{$=PRr=l2$$ePVR{*{3c&{lxY0PYJL7ldnAc)Kg#l zwehtp<CiZ?Uehn!Kx`Mqh<pJ8rafkfzr+B!hQAbx*|~By;AK5jyWuDi{iEARY9CJ> z=8R0Vj}=*PBTIz$3&m=IFfvJQqY}?oD=f!Ui>-3gyRoykX|NrKTRS<DC|63U1cA3B zxlRPiwcLd~RjB4jBo_l23JimOOU&<!mH@9A^qBcW=61Nji3v9nv^%8|g%(gqRqADp zcv<Y!F58wbtWC}7)e}p)NwLak^f;FxyV)NwyX<;r8bvcTj;!RVdY>gTjb4+XGvP|P zRWCQ0ja-c`yA#7C1g8K?*kQMUPC#SO3NA{<$8J0~{gtQx*~H}UUU}}BFI>HR`O@dF zDW%sJBx5GP=z`=J&pr|FRw~`C!P(sx|HYlo>)(0zTVMZgAH09(+aLVVpM3u>e)z$^ zdjCh?e*K&O=^L-T^~Sr0`>%fgWv;v1E}d3~dpMCI_2G09M0}uDWeZs?vqFJncEu19 z$`+QVZV03*iNU_2=Ec++R)hh&7j-DtA*T~kLzpe%k60oRUm(#)#SlD_N8?lu=CEik z9E+vUEJB9yXgVH55w4R@q)5b{N)a8lolS;0{(!Zq#;{Rnoox2o9&c^4#SJ&B73G+B zFi2JFX-cmQnR0n-btR@;63v?|qRA;hu2N~_<Ig{{v^Jp%_yv=K@oR?bPWN)gaCvDB z2DLt;%K&>^kthWD(}2z83DA*B+!iXT157!Qj^Ui$MPLxlFpd=FsFspwoHVkDcsv)6 zWFknIO0ZZmA4Bsfo=9fgp^Q0>IXxf|f}8<drG~7y4+&@i1E7{GrH&=9T5EJj7iOj7 zx@D(LIeu;S#*$!Fqgq^leoZ7?o|0-TW`Rzm*XgZZo!4S=#6W4l<3Q~g8O^7IV1gh^ zRFN5!@f5RPYE$w0V7JlU;4MvIuW`Gz+ubhjbXuo_0!OtvyVYW&S<V!*$?Zy`kSMb( z8ObCmDx0P8L?)Il)$#>~U=sO$A(KtB`BuJOs${5qv(m1VJJnW<?e**ZOsO_#H)*cW zO_v&5>_)v<%Qg$ORI9=@Ds(ni$+3+h-DWv5UnXLSW+uZV@l+z=!;;A~6eJ=jfe`@* z414_ksKsh<m@F=b#b8osv<d~Vrk)dO7i2=+`m#hQk|=B%!{VAiv9PeTESz5v&n#&c zmqap|Vnt&DG$#3yQm9v~DA$Z8K&AKTAWzVXxN!o*s1Om3z;QekPE|?Xi{^`!TD974 zl`FMkvRkjWd!1&lKHM1g+qGf)U^uAt8XLWx_V&Tv>E`x+e{k6Ax4Z4qV546vwyK@h zPIF_hQReD&kVQ}k4Pj{1&)YN*_Yq+Nj(`@g!=Tfsv}S`&Yf`&(W+kALd(9?`4p>!6 ztp=0P0@&PUgI5U{RI3_=S|io3Yu1f&l|`e|>Gix7kgN*U=B~|8&Q1tM$DY4=o-Rzz zO^l7*oS7NBbanL7`25W)f~j%Q><xi<b#ZBYSt2v9h-K=<mDP2#+2hyf9BQpXYINAW zQM*6kUbbosW|u7%55z(e3vP6|5)2TESuAiGiRFD*mMg~70j5w&ln=JsTl;J&-x@Ht zU*3NER`=Fc`}8)~KjRMX_6Ns%?d=lN-rn1~vsGsco8?+1Q;#xPx=@U>bQB_KJeeRV zn2ZF10Wco-xkFBC!0ABjQLow&0?a<6W=-iZx|}oyy4)(E#;F2=K+tJ3y4M#~s{)-1 z(1B1yY7yB~LY-Y|vqDxCh-;lTlg@~k93c>a{YES5aWFwAin(EsA|fOir4pfN2*cBK zlA&_-a2$$}o@|O`Yvq*J2K!MWkqMJUp98i8y}mFE8mV9i4EoF-1U4G{4$x)u+Wcmp z-|j$N#(*ynMR1=73E&Ze3J?esL$Np<uVpEO4A5*f9%1W^OubB3QYS3eEU|1MTWqE1 zTBFzQRr6fC(y2GP#m#cFR4U|oJDtrH3(a!9$Z@qwzuzpDHakqd$rWpzO0l+?Zr4)1 zZoAy<x61Wqp`7h<rHyvC-0GHTrc}sPX{L~2^Cf~x6_Xs53PfWhztyl9fd^oB$nOUb z)(4o~fW@ZQ7}Pq8R;4l8baI1YWnCzjsF&4Ru}&jV&acjmFWg*SR@s(C+LamMHHm0x zWlbzou1hou4X~!vYiIebYtjgTfZF5LTdfw48wH#Y5XTciZzcj+A-5L>qam`q!NpTm z6ob?BMx)j$_1YAR;mumT(BVqWX7OaVP%Pw1#T?;qrAzrjp21O*E#NU*oh~?l*xi8D zCbt@;D=P|>UaK*y{IE=^lFH<A>5AN}b32{u{AN}u&2nQvCvjs=Hxl)l)>ZbX!)px$ zVjLXgS#p6%I+e-xTfJT`QR}t4ovqDIa?l#Sd~|lQ)oc#-51Y5&>hB(%+}pZ;ui7}< zZ#3)eexuv0ZSD07RW_f_&_txn>$6<8Ywa-Lj6myZhk1p7{C=g3Kb21Ll1#85F;9$L zH?Q7Un4XvrTpBkl3B(f`(aef)RJb&A@%LBO=jGa^1?B9bXk9B_Ts3HXQN6(dYMpV5 z9SYbyK8E4>jHYAVF57I=G~3(1eQWTrRX;gs)P}DOcVBpAcX;RI_~4bV^_%xkUV7!I zvv>5u*2ckm_u89{+BP5hR8I!=YBg1)!W;cOlFEit6zU)mvoB6M)K)WQf-s#;?-NS{ zUMt`<TJ>tJ%%+;3QaP<cp<FJOYGhWaXicbxjN@|#U}4<?DA%<Dp~E6p$jw%%Ip8u{ zS1pjsE0$OthyimWsL~elL0*&2X+=`uq&pBU&;`y9k&$qm;9xYDEFMN(krd_Q>N(hj zv6WsU<mLSW<|`JEI8!PUQG`lyaTFnGnh7Og7if)EBSyf%#lxY9%a;s$ln%eqiD`9q zyA`v$H3E%IvTor8T9%u`kXR`cC}r1q7cjdB;8wACUI7A%xp}!!C`WUU!jy`IgEr8H zk$z*W6be(#?IxAUvYXr0WGGi^A8zk=y1To*<Fk$Cu+iJU*YEe5$H&Jn-0N)IfAQ?@ z?X7O>;NIP{{nNwkvsaF89q)Iy_x2BWy1RR~?j9bV?hp6t+uQA0b*tNHx4QLanQbKK zbeK-?TPG2tOVtRJBqJ`~6on%JpVJFk?K+2UT_x3P6>Cxze=`uumK9TT!U@s*@=d|4 zVD9>r3!~GMH!ofun;ySDI(_N#wP!9}yME)jXPzIM_{!DmSFYTA{_@ioFJHJiD!6gu z`O)dQ`MGhy<kG~=rCIUZ#QcJId2wNOQZP4l<L3O-+}zT<Xm(j3Se}~U_ui^dvN$_C zCy^=?>vIe1Hib~3)tjwmwF8BG5E8-QNRI#8uaqK~3|%hr7Kyh|<zB0Ee6-cx+#23G zzI}3M_oUa~I=gdpvcGwDdVG9zdUmvT(%wD1b!-3RWO%%Hc<1);_VG@Kw{`ukokp)S z=(QRHzI(f|v$NG|?d)_r{qCT*wcYD&^-p)Z)s6PnR&UVS=xnrkXWFlCG)uL1y;Wi> z8#T6^<62EF$E10WT+bC*j?FMdI!`C!xokX5P!w-ELjGtX!Uuhz4-8;#pVtN3{dSj1 z4QK$JPOZ?c>b0Ud@#;Ds8VDDbM9ZsFGYj*J<KxrUu3zHOh3k`xV*<h4%;eb3*(KrH zH1AKPlKF*2v1oE$xG0s(OwVcM>*6_)Xh|$tT9GQGtIBnwLT8l7<m>#a(yHWIt<_+* z16r+7Z+98Zb{p*USbR_v^hW)DzXwHe49=vA#aKMahy5(eRMNE?ZyB4d*5>Z+X0>y$ z-)eP-2S<k|hsVcvh9_r72gBQEhX>pHdq;=IC;P*bt-<c_Xt3GcIoRLd8}z%qLBHLp zaa^@kuN7$i-o}t5nMe`|96_)M<n#OCV8CIu^LF2;*J(6re!m&Cs?`<Mnp7%Y7K)aH zt74&0yeJY07pJFr@dQ(Xg?Yi!%DiAvyd)4TiI(QY3W-p-DibS>Dha=Flv;yPBhgyT zdj1BgH=FHd6W|Jfb{FJ_T>cOY!5HF)@E9HnN8(9>B5*pF$)wX6hGm!n$K_eBQYo_K za<NpcmP%Z?R;-knV!2$Ylv%FCa8)js<;ukZ?-FR5&Zm;uG@VMMXeyb^WU{GrDjrLx z(}^&ZiX{@U7!f6t@d!c0!gz!v5R4@Gc@v=!M#T8&F3LM-B8-Qk@mMs>#{uy;Me<h| znvRhvI!#eDPnOP5bTY>z5<HrSr>J;5NhjlEI?K0H{7htwA}NX>$@4gZCm4;K(?lZ# z9*snaC>|ywSO~-La2P{j1i=x15J7`T&=2vq-XI?<_<SC>#|63^Zim%ovs*3vdRR>c zv)N*?nDj=I88907xYTGe82Cz~&S27;Oa>ER;G2zRv)O91ngI&{*lZSy)yfmFIc!dc z)9tjoyl$7<;{kc<etsG-81O?O1V+MmI1<5e@?1f2UU4ZtqE68{I>Y4iIVR8WiY{_| zQsTHGSK>9#2Od09V)?wx@r^|uEAUIe2PgbGFxgCw$?(xX59wqwNhPTS|L;*O5hF<= zdJYjh918PFz``K}Ltqp|U>JfRIOq?YgWu=nx#J%Y^nxB9ye_wke|R^}3*vf|IvqcS z^P<b?;=z3`oZHI-$dBa*Kcc~7=S2B4#V33e8RT^gK|zSm`T3Aw068xN`1xTt$gc<g zKnS1l6?}GHL_$1!C=8>>`6r_DN<QP;`5fU#ooA0yz6%fMYkEE!=6fN075^e3h!>GB zos&985cE9f-w^-9_|3<EdE%A9e}3ZAbL7$P2%iHU=9R=(o#Q{v9^ri5Pu0g?7=HfM z>JiCDT=HbknSBJI^SRD>KIh=)=s9){KdV1y?ytbPeE&E6A2R%~bD}?=_Yv|l?tdo3 cxg7s5;QRhnB7c49oZr8`$1hs{W@+Gm1Bk~JhyVZp literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/start.wav b/etc/lwjgl-2.9.1/res/spaceinvaders/start.wav new file mode 100644 index 0000000000000000000000000000000000000000..3cb25b92252ca50e09b0f40f14314bf3ae1b3691 GIT binary patch literal 20280 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 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/win.wav b/etc/lwjgl-2.9.1/res/spaceinvaders/win.wav new file mode 100644 index 0000000000000000000000000000000000000000..76250e412fbe8919d64ac2ad89b112bb2e966e0e GIT binary patch literal 23496 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 O@Y7pou3mlUq5lsV_MN~0 literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/res/spaceinvaders/youwin.gif b/etc/lwjgl-2.9.1/res/spaceinvaders/youwin.gif new file mode 100644 index 0000000000000000000000000000000000000000..697318ba2a3ac2a525ac6807013b79e20a62fa2a GIT binary patch literal 3937 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 XR1)&5F<7uxhKZNq(y53)XTtG+Nq<TG literal 0 HcmV?d00001 diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL10.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL10.java new file mode 100644 index 0000000..9c939ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL10.java @@ -0,0 +1,1420 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.openal; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <br> + * This is the core OpenAL class. This class implements + * AL.h version 1.0 + * <p> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public final class AL10 { + + /** + * Bad value + */ + public static final int AL_INVALID = 0xFFFFFFFF; + + /** + * Disable value + */ + public static final int AL_NONE = 0x0; + + /** + * Boolean False + */ + public static final int AL_FALSE = 0x0; + + /** + * Boolean True + */ + public static final int AL_TRUE = 0x1; + + /** + * Indicate the type of SOURCE. + * Sources can be spatialized + */ + public static final int AL_SOURCE_TYPE = 0x1027; + + /** + * Indicate source has absolute coordinates + */ + public static final int AL_SOURCE_ABSOLUTE = 0x201; + + /** + * Indicate Source has listener relative coordinates + */ + public static final int AL_SOURCE_RELATIVE = 0x202; + + /** + * Directional source, inner cone angle, in degrees + * Range: [0-360] + * Default: 360 + */ + public static final int AL_CONE_INNER_ANGLE = 0x1001; + + /** + * Directional source, outer cone angle, in degrees. + * Range: [0-360] + * Default: 360 + */ + public static final int AL_CONE_OUTER_ANGLE = 0x1002; + + /** + * Specify the pitch to be applied, either at source, + * or on mixer results, at listener. + * Range: [0.5-2.0] + * Default: 1.0 + */ + public static final int AL_PITCH = 0x1003; + + /** + * Specify the current location in three dimensional space. + * OpenAL, like OpenGL, uses a right handed coordinate system, + * where in a frontal default view X (thumb) points right, + * Y points up (index finger), and Z points towards the + * viewer/camera (middle finger). + * To switch from a left handed coordinate system, flip the + * sign on the Z coordinate. + * Listener position is always in the world coordinate system. + */ + public static final int AL_POSITION = 0x1004; + + /** + * Specify the current direction as forward vector. + */ + public static final int AL_DIRECTION = 0x1005; + + /** + * Specify the current velocity in three dimensional space. + */ + public static final int AL_VELOCITY = 0x1006; + + /** + * Indicate whether source has to loop infinite. + * Type: ALboolean + * Range: [TRUE, FALSE] + * Default: FALSE + */ + public static final int AL_LOOPING = 0x1007; + + /** + * Indicate the buffer to provide sound samples. + * Type: ALuint. + * Range: any valid Buffer id. + */ + public static final int AL_BUFFER = 0x1009; + + /** + * Indicate the gain (volume amplification) applied. + * Type: ALfloat. + * Range: ]0.0- ] + * A value of 1.0 means un-attenuated/unchanged. + * Each division by 2 equals an attenuation of -6dB. + * Each multiplicaton with 2 equals an amplification of +6dB. + * A value of 0.0 is meaningless with respect to a logarithmic + * scale; it is interpreted as zero volume - the channel + * is effectively disabled. + */ + public static final int AL_GAIN = 0x100A; + + /** + * Indicate minimum source attenuation. + * Type: ALfloat + * Range: [0.0 - 1.0] + */ + public static final int AL_MIN_GAIN = 0x100D; + + /** + * Indicate maximum source attenuation. + * Type: ALfloat + * Range: [0.0 - 1.0] + */ + public static final int AL_MAX_GAIN = 0x100E; + + /** + * Specify the current orientation. + * Type: ALfv6 (at/up) + * Range: N/A + */ + public static final int AL_ORIENTATION = 0x100F, + AL_REFERENCE_DISTANCE = 0x1020; + + /** + * Indicate the rolloff factor for the source. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + */ + public static final int AL_ROLLOFF_FACTOR = 0x1021; + + /** + * Indicate the gain (volume amplification) applied. + * Type: ALfloat. + * Range: ]0.0- ] + * A value of 1.0 means un-attenuated/unchanged. + * Each division by 2 equals an attenuation of -6dB. + * Each multiplicaton with 2 equals an amplification of +6dB. + * A value of 0.0 is meaningless with respect to a logarithmic + * scale; it is interpreted as zero volume - the channel + * is effectively disabled. + */ + public static final int AL_CONE_OUTER_GAIN = 0x1022; + + /** + * Specify the maximum distance. + * Type: ALfloat + * Range: [0.0 - ] + */ + public static final int AL_MAX_DISTANCE = 0x1023; + + /** + * Specify the channel mask. (Creative) + * Type: ALuint + * Range: [0 - 255] + */ + public static final int AL_CHANNEL_MASK = 0x3000; + + /** + * Source state information + */ + public static final int AL_SOURCE_STATE = 0x1010, + AL_INITIAL = 0x1011, + AL_PLAYING = 0x1012, + AL_PAUSED = 0x1013, + AL_STOPPED = 0x1014; + + /** + * Buffer Queue params + */ + public static final int AL_BUFFERS_QUEUED = 0x1015, + AL_BUFFERS_PROCESSED = 0x1016; + + /** + * Sound buffers: format specifier. + */ + public static final int AL_FORMAT_MONO8 = 0x1100, + AL_FORMAT_MONO16 = 0x1101, + AL_FORMAT_STEREO8 = 0x1102, + AL_FORMAT_STEREO16 = 0x1103; + + /** + * Ogg Vorbis format specifier. + */ + public static final int AL_FORMAT_VORBIS_EXT = 0x10003; + + /** + * Sound buffers: frequency, in units of Hertz [Hz]. + * This is the number of samples per second. Half of the + * sample frequency marks the maximum significant + * frequency component. + */ + public static final int AL_FREQUENCY = 0x2001; + + /** + * Sound buffers: The number of bits per sample for the + * data contained in the buffer. + */ + public static final int AL_BITS = 0x2002; + + /** + * Sound buffers: The number of channels for the data + * contained in the buffer. + */ + public static final int AL_CHANNELS = 0x2003; + + /** + * Sound buffers: Size in bytes of the buffer data. + */ + public static final int AL_SIZE = 0x2004; + + /** + * @deprecated This token is a relict of the early OpenAL days and is + * no longer supported. Neither the OpenAL spec nor OpenAL Soft define + * it. + */ + public static final int AL_DATA = 0x2005; + + /** + * Buffer state. + * <p> + * Not supported for public use (yet). + */ + public static final int AL_UNUSED = 0x2010, + AL_PENDING = 0x2011, + AL_PROCESSED = 0x2012; + + /** + * Errors: No Error. + */ + public static final int AL_NO_ERROR = 0x0; + + /** + * Illegal name passed as an argument to an AL call. + */ + public static final int AL_INVALID_NAME = 0xA001; + + /** + * Illegal enum passed as an argument to an AL call. + */ + public static final int AL_INVALID_ENUM = 0xA002; + + /** + * Illegal value passed as an argument to an AL call. + * Applies to parameter values, but not to enumerations. + */ + public static final int AL_INVALID_VALUE = 0xA003; + + /** + * A function was called at inappropriate time, + * or in an inappropriate way, causing an illegal state. + * This can be an incompatible ALenum, object ID, + * and/or function. + */ + public static final int AL_INVALID_OPERATION = 0xA004; + + /** + * A function could not be completed, + * because there is not enough memory available. + */ + public static final int AL_OUT_OF_MEMORY = 0xA005; + + /** + * Context strings: Vendor + */ + public static final int AL_VENDOR = 0xB001; + + /** + * Context strings: Version + */ + public static final int AL_VERSION = 0xB002; + + /** + * Context strings: Renderer + */ + public static final int AL_RENDERER = 0xB003; + + /** + * Context strings: Extensions + */ + public static final int AL_EXTENSIONS = 0xB004; + + /** + * Doppler scale. Default 1.0 + */ + public static final int AL_DOPPLER_FACTOR = 0xC000; + + /** + * Doppler velocity. Default 1.0 + */ + public static final int AL_DOPPLER_VELOCITY = 0xC001; + + /** + * Distance model. Default INVERSE_DISTANCE_CLAMPED + */ + public static final int AL_DISTANCE_MODEL = 0xD000; + + /** + * Distance model + */ + public static final int AL_INVERSE_DISTANCE = 0xD001, + AL_INVERSE_DISTANCE_CLAMPED = 0xD002; + + private AL10() {} + + static native void initNativeStubs() throws LWJGLException; + + /** + * The application can temporarily disable certain AL capabilities on a per Context + * basis. This allows the driver implementation to optimize for certain subsets of + * operations. Enabling and disabling capabilities is handled using a function pair. + * <p> + * @param capability name of a capability to enable + */ + public static void alEnable(int capability) { + nalEnable(capability); + } + static native void nalEnable(int capability); + + /** + * The application can temporarily disable certain AL capabilities on a per Context + * basis. This allows the driver implementation to optimize for certain subsets of + * operations. Enabling and disabling capabilities is handled using a function pair. + * <p> + * @param capability name of a capability to disable + */ + public static void alDisable(int capability) { + nalDisable(capability); + } + static native void nalDisable(int capability); + + /** + * The application can also query whether a given capability is currently enabled or + * not. + * <p> + * If the token used to specify target is not legal, an AL_INVALID_ENUM error will be + * generated. + * </p> + * <p> + * At this time, this mechanism is not used. There are no valid targets. + * </p> + * <p> + * @param capability name of a capability to check + * @return true if named feature is enabled + */ + public static boolean alIsEnabled(int capability) { + boolean __result = nalIsEnabled(capability); + return __result; + } + static native boolean nalIsEnabled(int capability); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @return boolean state described by pname will be returned. + */ + public static boolean alGetBoolean(int pname) { + boolean __result = nalGetBoolean(pname); + return __result; + } + static native boolean nalGetBoolean(int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @return int state described by pname will be returned. + */ + public static int alGetInteger(int pname) { + int __result = nalGetInteger(pname); + return __result; + } + static native int nalGetInteger(int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @return float state described by pname will be returned. + */ + public static float alGetFloat(int pname) { + float __result = nalGetFloat(pname); + return __result; + } + static native float nalGetFloat(int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @return double state described by pname will be returned. + */ + public static double alGetDouble(int pname) { + double __result = nalGetDouble(pname); + return __result; + } + static native double nalGetDouble(int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @param pname state to be queried + * @param data Buffer to place the integers in + */ + public static void alGetInteger(int pname, IntBuffer data) { + BufferChecks.checkBuffer(data, 1); + nalGetIntegerv(pname, MemoryUtil.getAddress(data)); + } + static native void nalGetIntegerv(int pname, long data); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @param pname state to be queried + * @param data Buffer to place the floats in + */ + public static void alGetFloat(int pname, FloatBuffer data) { + BufferChecks.checkBuffer(data, 1); + nalGetFloatv(pname, MemoryUtil.getAddress(data)); + } + static native void nalGetFloatv(int pname, long data); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * <p> + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * <p> + * @param pname state to be queried + * @param data Buffer to place the doubles in + */ + public static void alGetDouble(int pname, DoubleBuffer data) { + BufferChecks.checkBuffer(data, 1); + nalGetDoublev(pname, MemoryUtil.getAddress(data)); + } + static native void nalGetDoublev(int pname, long data); + + /** + * The application can retrieve state information global to the current AL Context. + * GetString will return a pointer to a constant string. Valid values for param are + * VERSION, RENDERER, VENDOR, and EXTENSIONS, as well as the error codes + * defined by AL. The application can use GetString to retrieve a string for an error + * code. + * <p> + * @param pname The property to be returned + * @return OpenAL String property + */ + public static String alGetString(int pname) { + String __result = nalGetString(pname); + return __result; + } + static native String nalGetString(int pname); + + /** + * The AL detects only a subset of those conditions that could be considered errors. + * This is because in many cases error checking would adversely impact the + * performance of an error-free program. + * <p> + * Each detectable error is assigned a numeric + * code. When an error is detected by AL, a flag is set and the error code is recorded. + * Further errors, if they occur, do not affect this recorded code. When GetError is + * called, the code is returned and the flag is cleared, so that a further error will again + * record its code. If a call to GetError returns AL_NO_ERROR then there has been no + * detectable error since the last call to GetError (or since the AL was initialized). + * </p> + * <p> + * Error codes can be mapped to strings. The GetString function returns a pointer to a + * constant (literal) string that is identical to the identifier used for the enumeration + * value, as defined in the specification. + * </p> + * <p> + * AL_NO_ERROR - "No Error" token.<br> + * AL_INVALID_NAME - Invalid Name parameter.<br> + * AL_INVALID_ENUM - Invalid parameter.<br> + * AL_INVALID_VALUE - Invalid enum parameter value.<br> + * AL_INVALID_OPERATION - Illegal call.<br> + * AL_OUT_OF_MEMORY - Unable to allocate memory.<br> + * </p> + * <p> + * The table summarizes the AL errors. Currently, when an error flag is set, results of + * AL operations are undefined only if AL_OUT_OF_MEMORY has occured. In other + * cases, the command generating the error is ignored so that it has no effect on AL + * state or output buffer contents. If the error generating command returns a value, it + * returns zero. If the generating command modifies values through a pointer + * argument, no change is made to these values. These error semantics apply only to + * AL errors, not to system errors such as memory access errors. + * </p> + * <p> + * Several error generation conditions are implicit in the description of the various AL + * commands. First, if a command that requires an enumerated value is passed a value + * that is not one of those specified as allowable for that command, the error + * AL_INVALID_ENUM results. This is the case even if the argument is a pointer to a + * symbolic constant if that value is not allowable for the given command. This will + * occur whether the value is allowable for other functions, or an invalid integer value. + * </p> + * <p> + * Integer parameters that are used as names for AL objects such as Buffers and + * Sources are checked for validity. If an invalid name parameter is specified in an AL + * command, an AL_INVALID_NAME error will be generated, and the command is + * ignored. + * </p> + * <p> + * If a negative integer is provided where an argument of type sizei is specified, the + * error AL_INVALID_VALUE results. The same error will result from attempts to set + * integral and floating point values for attributes exceeding the legal range for these. + * The specification does not guarantee that the implementation emits + * AL_INVALID_VALUE if a NaN or Infinity value is passed in for a float or double + * argument (as the specification does not enforce possibly expensive testing of + * floating point values). + * </p> + * <p> + * Commands can be invalid. For example, certain commands might not be applicable + * to a given object. There are also illegal combinations of tokens and values as + * arguments to a command. AL responds to any such illegal command with an + * AL_INVALID_OPERATION error. + * </p> + * <p> + * If memory is exhausted as a side effect of the execution of an AL command, either + * on system level or by exhausting the allocated resources at AL's internal disposal, + * the error AL_OUT_OF_MEMORY may be generated. This can also happen independent + * of recent commands if AL has to request memory for an internal task and fails to + * allocate the required memory from the operating system. + * </p> + * <p> + * Otherwise errors are generated only for conditions that are explicitely described in + * this specification. + * </p> + * <p> + * @return current error state + */ + public static int alGetError() { + int __result = nalGetError(); + return __result; + } + static native int nalGetError(); + + /** + * To verify that a given extension is available for the current context and the device it + * is associated with, use this method. + * <p> + * A <code>null</code> name argument returns AL_FALSE, as do invalid and unsupported string + * tokens. A <code>null</code> deviceHandle will result in an INVALID_DEVICE error. + * </p> + * <p> + * @param fname String describing the desired extension + * @return true if extension is available, false if not + */ + public static boolean alIsExtensionPresent(String fname) { + BufferChecks.checkNotNull(fname); + boolean __result = nalIsExtensionPresent(fname); + return __result; + } + static native boolean nalIsExtensionPresent(String fname); + + /** + * <p> + * To obtain enumeration values for extensions, the application has to use + * GetEnumValue of an extension token. Enumeration values are defined within the + * AL namespace and allocated according to specification of the core API and the + * extensions, thus they are context-independent. + * </p> + * <p> + * Returns 0 if the enumeration can not be found. The presence of an enum value does + * not guarantee the applicability of an extension to the current context. A non-zero + * return indicates merely that the implementation is aware of the existence of this + * extension. Implementations should not attempt to return 0 to indicate that the + * extensions is not supported for the current context. + * </p> + * <p> + * @param ename String describing an OpenAL enum + * @return Actual int for the described enumeration name + */ + public static int alGetEnumValue(String ename) { + BufferChecks.checkNotNull(ename); + int __result = nalGetEnumValue(ename); + return __result; + } + static native int nalGetEnumValue(String ename); + + /** + * Listener attributes are changed using the Listener group of commands. + * <p> + * @param pname name of the attribute to be set + * @param value value to set the attribute to + */ + public static void alListeneri(int pname, int value) { + nalListeneri(pname, value); + } + static native void nalListeneri(int pname, int value); + + /** + * Listener attributes are changed using the Listener group of commands. + * <p> + * @param pname name of the attribute to be set + * @param value floating point value to set the attribute to + */ + public static void alListenerf(int pname, float value) { + nalListenerf(pname, value); + } + static native void nalListenerf(int pname, float value); + + /** + * Listener attributes are changed using the Listener group of commands. + * <p> + * @param pname name of the attribute to be set + * @param value FloatBuffer containing value to set the attribute to + */ + public static void alListener(int pname, FloatBuffer value) { + BufferChecks.checkBuffer(value, 1); + nalListenerfv(pname, MemoryUtil.getAddress(value)); + } + static native void nalListenerfv(int pname, long value); + + /** + * Listener attributes are changed using the Listener group of commands. + * <p> + * @param pname name of the attribute to be set + * @param v1 value value 1 + * @param v2 value value 2 + * @param v3 float value 3 + */ + public static void alListener3f(int pname, float v1, float v2, float v3) { + nalListener3f(pname, v1, v2, v3); + } + static native void nalListener3f(int pname, float v1, float v2, float v3); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * <p> + * @param pname name of the attribute to be retrieved + * @return int + */ + public static int alGetListeneri(int pname) { + int __result = nalGetListeneri(pname); + return __result; + } + static native int nalGetListeneri(int pname); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * <p> + * @param pname name of the attribute to be retrieved + * @return float + */ + public static float alGetListenerf(int pname) { + float __result = nalGetListenerf(pname); + return __result; + } + static native float nalGetListenerf(int pname); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * <p> + * @param pname name of the attribute to be retrieved + * @param floatdata Buffer to write floats to + */ + public static void alGetListener(int pname, FloatBuffer floatdata) { + BufferChecks.checkBuffer(floatdata, 1); + nalGetListenerfv(pname, MemoryUtil.getAddress(floatdata)); + } + static native void nalGetListenerfv(int pname, long floatdata); + + /** + * The application requests a number of Sources using GenSources. + * <p> + * @param sources array holding sources + */ + public static void alGenSources(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalGenSources(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalGenSources(int sources_n, long sources); + + /** Overloads alGenSources. */ + public static int alGenSources() { + int __result = nalGenSources2(1); + return __result; + } + static native int nalGenSources2(int n); + + /** + * The application requests deletion of a number of Sources by DeleteSources. + * <p> + * @param sources Source array to delete from + */ + public static void alDeleteSources(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalDeleteSources(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalDeleteSources(int sources_n, long sources); + + /** Overloads alDeleteSources. */ + public static void alDeleteSources(int source) { + nalDeleteSources2(1, source); + } + static native void nalDeleteSources2(int n, int source); + + /** + * The application can verify whether a source name is valid using the IsSource query. + * <p> + * @param id id of source to be testes for validity + * @return true if id is valid, false if not + */ + public static boolean alIsSource(int id) { + boolean __result = nalIsSource(id); + return __result; + } + static native boolean nalIsSource(int id); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to det property on + * @param pname property to set + * @param value value of property + */ + public static void alSourcei(int source, int pname, int value) { + nalSourcei(source, pname, value); + } + static native void nalSourcei(int source, int pname, int value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to det property on + * @param pname property to set + * @param value value of property + */ + public static void alSourcef(int source, int pname, float value) { + nalSourcef(source, pname, value); + } + static native void nalSourcef(int source, int pname, float value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to set property on + * @param pname property to set + * @param value FloatBuffer containing value of property + */ + public static void alSource(int source, int pname, FloatBuffer value) { + BufferChecks.checkBuffer(value, 1); + nalSourcefv(source, pname, MemoryUtil.getAddress(value)); + } + static native void nalSourcefv(int source, int pname, long value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to set property on + * @param pname property to set + * @param v1 value 1 of property + * @param v2 value 2 of property + * @param v3 value 3 of property + */ + public static void alSource3f(int source, int pname, float v1, float v2, float v3) { + nalSource3f(source, pname, v1, v2, v3); + } + static native void nalSource3f(int source, int pname, float v1, float v2, float v3); + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * <p> + * @param source source to get property from + * @param pname name of property + * @return int + */ + public static int alGetSourcei(int source, int pname) { + int __result = nalGetSourcei(source, pname); + return __result; + } + static native int nalGetSourcei(int source, int pname); + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * <p> + * @param source source to get property from + * @param pname name of property + * @return float + */ + public static float alGetSourcef(int source, int pname) { + float __result = nalGetSourcef(source, pname); + return __result; + } + static native float nalGetSourcef(int source, int pname); + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * <p> + * @param source Source to get property from + * @param pname property to get + * @param floatdata Buffer to write floats to + */ + public static void alGetSource(int source, int pname, FloatBuffer floatdata) { + BufferChecks.checkBuffer(floatdata, 1); + nalGetSourcefv(source, pname, MemoryUtil.getAddress(floatdata)); + } + static native void nalGetSourcefv(int source, int pname, long floatdata); + + /** + * Play() applied to an AL_INITIAL Source will promote the Source to AL_PLAYING, thus + * the data found in the Buffer will be fed into the processing, starting at the + * beginning. Play() applied to a AL_PLAYING Source will restart the Source from the + * beginning. It will not affect the configuration, and will leave the Source in + * AL_PLAYING state, but reset the sampling offset to the beginning. Play() applied to a + * AL_PAUSED Source will resume processing using the Source state as preserved at the + * Pause() operation. Play() applied to a AL_STOPPED Source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately. + * <p> + * @param sources array of sources to play + */ + public static void alSourcePlay(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalSourcePlayv(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalSourcePlayv(int sources_n, long sources); + + /** + * Pause() applied to an AL_INITIAL Source is a legal NOP. Pause() applied to a + * AL_PLAYING Source will change its state to AL_PAUSED. The Source is exempt from + * processing, its current state is preserved. Pause() applied to a AL_PAUSED Source is a + * legal NOP. Pause() applied to a AL_STOPPED Source is a legal NOP. + * <p> + * @param sources array of sources to pause + */ + public static void alSourcePause(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalSourcePausev(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalSourcePausev(int sources_n, long sources); + + /** + * Stop() applied to an AL_INITIAL Source is a legal NOP. Stop() applied to a AL_PLAYING + * Source will change its state to AL_STOPPED. The Source is exempt from processing, + * its current state is preserved. Stop() applied to a AL_PAUSED Source will change its + * state to AL_STOPPED, with the same consequences as on a AL_PLAYING Source. Stop() + * applied to a AL_STOPPED Source is a legal NOP. + * <p> + * @param sources array of sources to stop + */ + public static void alSourceStop(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalSourceStopv(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalSourceStopv(int sources_n, long sources); + + /** + * Rewind() applied to an AL_INITIAL Source is a legal NOP. Rewind() applied to a + * AL_PLAYING Source will change its state to AL_STOPPED then AL_INITIAL. The Source is + * exempt from processing, its current state is preserved, with the exception of the + * sampling offset which is reset to the beginning. Rewind() applied to a AL_PAUSED + * Source will change its state to AL_INITIAL, with the same consequences as on a + * AL_PLAYING Source. Rewind() applied to a AL_STOPPED Source promotes the Source to + * AL_INITIAL, resetting the sampling offset to the beginning. + * <p> + * @param sources array of sources to rewind + */ + public static void alSourceRewind(IntBuffer sources) { + BufferChecks.checkDirect(sources); + nalSourceRewindv(sources.remaining(), MemoryUtil.getAddress(sources)); + } + static native void nalSourceRewindv(int sources_n, long sources); + + /** + * Play() applied to an AL_INITIAL Source will promote the Source to AL_PLAYING, thus + * the data found in the Buffer will be fed into the processing, starting at the + * beginning. Play() applied to a AL_PLAYING Source will restart the Source from the + * beginning. It will not affect the configuration, and will leave the Source in + * AL_PLAYING state, but reset the sampling offset to the beginning. Play() applied to a + * AL_PAUSED Source will resume processing using the Source state as preserved at the + * Pause() operation. Play() applied to a AL_STOPPED Source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately. + * <p> + * @param source Source to play + */ + public static void alSourcePlay(int source) { + nalSourcePlay(source); + } + static native void nalSourcePlay(int source); + + /** + * Pause() applied to an AL_INITIAL Source is a legal NOP. Pause() applied to a + * AL_PLAYING Source will change its state to AL_PAUSED. The Source is exempt from + * processing, its current state is preserved. Pause() applied to a AL_PAUSED Source is a + * legal NOP. Pause() applied to a AL_STOPPED Source is a legal NOP. + * <p> + * @param source Source to pause + */ + public static void alSourcePause(int source) { + nalSourcePause(source); + } + static native void nalSourcePause(int source); + + /** + * Stop() applied to an AL_INITIAL Source is a legal NOP. Stop() applied to a AL_PLAYING + * Source will change its state to AL_STOPPED. The Source is exempt from processing, + * its current state is preserved. Stop() applied to a AL_PAUSED Source will change its + * state to AL_STOPPED, with the same consequences as on a AL_PLAYING Source. Stop() + * applied to a AL_STOPPED Source is a legal NOP. + * <p> + * @param source Source to stop + */ + public static void alSourceStop(int source) { + nalSourceStop(source); + } + static native void nalSourceStop(int source); + + /** + * Rewind() applied to an AL_INITIAL Source is a legal NOP. Rewind() applied to a + * AL_PLAYING Source will change its state to AL_STOPPED then AL_INITIAL. The Source is + * exempt from processing, its current state is preserved, with the exception of the + * sampling offset which is reset to the beginning. Rewind() applied to a AL_PAUSED + * Source will change its state to AL_INITIAL, with the same consequences as on a + * AL_PLAYING Source. Rewind() applied to a AL_STOPPED Source promotes the Source to + * AL_INITIAL, resetting the sampling offset to the beginning. + * <p> + * @param source Source to rewind + */ + public static void alSourceRewind(int source) { + nalSourceRewind(source); + } + static native void nalSourceRewind(int source); + + /** + * The application requests a number of Buffers using GenBuffers. + * <p> + * @param buffers holding buffers + */ + public static void alGenBuffers(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nalGenBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nalGenBuffers(int buffers_n, long buffers); + + /** Overloads alGenBuffers. */ + public static int alGenBuffers() { + int __result = nalGenBuffers2(1); + return __result; + } + static native int nalGenBuffers2(int n); + + /** + * <p> + * The application requests deletion of a number of Buffers by calling DeleteBuffers. + * </p> + * <p> + * Once deleted, Names are no longer valid for use with AL function calls. Any such + * use will cause an AL_INVALID_NAME error. The implementation is free to defer actual + * release of resources. + * </p> + * <p> + * IsBuffer(bname) can be used to verify deletion of a buffer. Deleting bufferName 0 is + * a legal NOP in both scalar and vector forms of the command. The same is true for + * unused buffer names, e.g. such as not allocated yet, or as released already. + * <p> + * @param buffers Buffer to delete from + */ + public static void alDeleteBuffers(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nalDeleteBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nalDeleteBuffers(int buffers_n, long buffers); + + /** Overloads alDeleteBuffers. */ + public static void alDeleteBuffers(int buffer) { + nalDeleteBuffers2(1, buffer); + } + static native void nalDeleteBuffers2(int n, int buffer); + + /** + * The application can verify whether a buffer Name is valid using the IsBuffer query. + * <p> + * @param buffer buffer to be tested for validity + * @return true if supplied buffer is valid, false if not + */ + public static boolean alIsBuffer(int buffer) { + boolean __result = nalIsBuffer(buffer); + return __result; + } + static native boolean nalIsBuffer(int buffer); + + /** + * <p> + * A special case of Buffer state is the actual sound sample data stored in asociation + * with the Buffer. Applications can specify sample data using BufferData. + * </p> + * <p> + * The data specified is copied to an internal software, or if possible, hardware buffer. + * The implementation is free to apply decompression, conversion, resampling, and + * filtering as needed. The internal format of the Buffer is not exposed to the + * application, and not accessible. Valid formats are AL_FORMAT_MONO8, + * AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16. An + * implementation may expose other formats, see the chapter on Extensions for + * information on determining if additional formats are supported. + * </p> + * <p> + * Applications should always check for an error condition after attempting to specify + * buffer data in case an implementation has to generate an AL_OUT_OF_MEMORY or + * conversion related AL_INVALID_VALUE error. The application is free to reuse the + * memory specified by the data pointer once the call to BufferData returns. The + * implementation has to dereference, e.g. copy, the data during BufferData execution. + * </p> + * <p> + * @param buffer Buffer to fill + * @param format format sound data is in + * @param data location of data + * @param freq frequency of data + */ + public static void alBufferData(int buffer, int format, ByteBuffer data, int freq) { + BufferChecks.checkDirect(data); + nalBufferData(buffer, format, MemoryUtil.getAddress(data), data.remaining(), freq); + } + /** + * <p> + * A special case of Buffer state is the actual sound sample data stored in asociation + * with the Buffer. Applications can specify sample data using BufferData. + * </p> + * <p> + * The data specified is copied to an internal software, or if possible, hardware buffer. + * The implementation is free to apply decompression, conversion, resampling, and + * filtering as needed. The internal format of the Buffer is not exposed to the + * application, and not accessible. Valid formats are AL_FORMAT_MONO8, + * AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16. An + * implementation may expose other formats, see the chapter on Extensions for + * information on determining if additional formats are supported. + * </p> + * <p> + * Applications should always check for an error condition after attempting to specify + * buffer data in case an implementation has to generate an AL_OUT_OF_MEMORY or + * conversion related AL_INVALID_VALUE error. The application is free to reuse the + * memory specified by the data pointer once the call to BufferData returns. The + * implementation has to dereference, e.g. copy, the data during BufferData execution. + * </p> + * <p> + * @param buffer Buffer to fill + * @param format format sound data is in + * @param data location of data + * @param freq frequency of data + */ + public static void alBufferData(int buffer, int format, IntBuffer data, int freq) { + BufferChecks.checkDirect(data); + nalBufferData(buffer, format, MemoryUtil.getAddress(data), (data.remaining() << 2), freq); + } + /** + * <p> + * A special case of Buffer state is the actual sound sample data stored in asociation + * with the Buffer. Applications can specify sample data using BufferData. + * </p> + * <p> + * The data specified is copied to an internal software, or if possible, hardware buffer. + * The implementation is free to apply decompression, conversion, resampling, and + * filtering as needed. The internal format of the Buffer is not exposed to the + * application, and not accessible. Valid formats are AL_FORMAT_MONO8, + * AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16. An + * implementation may expose other formats, see the chapter on Extensions for + * information on determining if additional formats are supported. + * </p> + * <p> + * Applications should always check for an error condition after attempting to specify + * buffer data in case an implementation has to generate an AL_OUT_OF_MEMORY or + * conversion related AL_INVALID_VALUE error. The application is free to reuse the + * memory specified by the data pointer once the call to BufferData returns. The + * implementation has to dereference, e.g. copy, the data during BufferData execution. + * </p> + * <p> + * @param buffer Buffer to fill + * @param format format sound data is in + * @param data location of data + * @param freq frequency of data + */ + public static void alBufferData(int buffer, int format, ShortBuffer data, int freq) { + BufferChecks.checkDirect(data); + nalBufferData(buffer, format, MemoryUtil.getAddress(data), (data.remaining() << 1), freq); + } + static native void nalBufferData(int buffer, int format, long data, int data_size, int freq); + + /** + * Buffer state is maintained inside the AL implementation and can be queried in full.<br> + * ALC_FREQUENCY - specified in samples per second, i.e. units of Hertz [Hz].<br> + * ALC_SIZE - Size in bytes of the buffer data.<br> + * <p> + * @param buffer buffer to get property from + * @param pname name of property to retrieve + */ + public static int alGetBufferi(int buffer, int pname) { + int __result = nalGetBufferi(buffer, pname); + return __result; + } + static native int nalGetBufferi(int buffer, int pname); + + /** + * Buffer state is maintained inside the AL implementation and can be queried in full.<br> + * ALC_FREQUENCY - specified in samples per second, i.e. units of Hertz [Hz].<br> + * ALC_SIZE - Size in bytes of the buffer data.<br> + * <p> + * @param buffer buffer to get property from + * @param pname name of property to retrieve + * @return float + */ + public static float alGetBufferf(int buffer, int pname) { + float __result = nalGetBufferf(buffer, pname); + return __result; + } + static native float nalGetBufferf(int buffer, int pname); + + /** + * <p> + * The application can queue up one or multiple buffer names using + * SourceQueueBuffers. The buffers will be queued in the sequence in which they + * appear in the array. + * </p> + * <p> + * This command is legal on a Source in any state (to allow for streaming, queueing + * has to be possible on a AL_PLAYING Source). Queues are read-only with exception of + * the unqueue operation. The Buffer Name AL_NONE (i.e. 0) can be queued. + * </p> + * <p> + * @param source source to queue buffers onto + * @param buffers buffers to be queued + */ + public static void alSourceQueueBuffers(int source, IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nalSourceQueueBuffers(source, buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nalSourceQueueBuffers(int source, int buffers_n, long buffers); + + /** Overloads alSourceQueueBuffers. */ + public static void alSourceQueueBuffers(int source, int buffer) { + nalSourceQueueBuffers2(source, 1, buffer); + } + static native void nalSourceQueueBuffers2(int source, int n, int buffer); + + /** + * <p> + * Once a queue entry for a buffer has been appended to a queue and is pending + * processing, it should not be changed. Removal of a given queue entry is not possible + * unless either the Source is AL_STOPPED (in which case then entire queue is considered + * processed), or if the queue entry has already been processed (AL_PLAYING or AL_PAUSED + * Source). + * </p> + * <p> + * The Unqueue command removes a number of buffers entries that have finished + * processing, in the order of appearance, from the queue. The operation will fail if + * more buffers are requested than available, leaving the destination arguments + * unchanged. An AL_INVALID_VALUE error will be thrown. If no error, the destination + * argument will have been updated accordingly. + * </p> + * <p> + * @param source source to unqueue buffers from + * @param buffers IntBuffer containing list of names that were unqueued + */ + public static void alSourceUnqueueBuffers(int source, IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nalSourceUnqueueBuffers(source, buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nalSourceUnqueueBuffers(int source, int buffers_n, long buffers); + + /** Overloads alSourceUnqueueBuffers. */ + public static int alSourceUnqueueBuffers(int source) { + int __result = nalSourceUnqueueBuffers2(source, 1); + return __result; + } + static native int nalSourceUnqueueBuffers2(int source, int n); + + /** + * <p> + * Samples usually use the entire dynamic range of the chosen format/encoding, + * independent of their real world intensity. In other words, a jet engine and a + * clockwork both will have samples with full amplitude. The application will then + * have to adjust Source AL_GAIN accordingly to account for relative differences. + * </p> + * <p> + * Source AL_GAIN is then attenuated by distance. The effective attenuation of a Source + * depends on many factors, among which distance attenuation and source and + * Listener AL_GAIN are only some of the contributing factors. Even if the source and + * Listener AL_GAIN exceed 1.0 (amplification beyond the guaranteed dynamic range), + * distance and other attenuation might ultimately limit the overall AL_GAIN to a value + * below 1.0. + * </p> + * <p> + * AL currently supports three modes of operation with respect to distance + * attenuation. It supports two distance-dependent attenuation models, one which is + * similar to the IASIG I3DL2 (and DS3D) model. The application choses one of these + * two models (or can chose to disable distance-dependent attenuation effects model) + * on a per-context basis. + * </p> + * <p> + * Legal arguments are AL_NONE, AL_INVERSE_DISTANCE, and + * AL_INVERSE_DISTANCE_CLAMPED. + * <br> + * <br> + * AL_NONE bypasses all distance attenuation + * calculation for all Sources. The implementation is expected to optimize this + * situation. + * <br> + * <br> + * AL_INVERSE_DISTANCE_CLAMPED is the DS3D model, with + * AL_REFERENCE_DISTANCE indicating both the reference distance and the distance + * below which gain will be clamped. + * <br> + * <br> + * AL_INVERSE_DISTANCE is equivalent to the DS3D + * model with the exception that AL_REFERENCE_DISTANCE does not imply any + * clamping. + * <br> + * <br> + * The AL implementation is still free to apply any range clamping as + * necessary. The current distance model chosen can be queried using GetIntegerv and + * AL_DISTANCE_MODEL. + * </p> + * <p> + * @param value distance model to be set + */ + public static void alDistanceModel(int value) { + nalDistanceModel(value); + } + static native void nalDistanceModel(int value); + + /** + * The Doppler Effect depends on the velocities of Source and Listener relative to the + * medium, and the propagation speed of sound in that medium. The application + * might want to emphasize or de-emphasize the Doppler Effect as physically accurate + * calculation might not give the desired results. The amount of frequency shift (pitch + * change) is proportional to the speed of listener and source along their line of sight. + * The application can increase or decrease that frequency shift by specifying the + * scaling factor AL should apply to the result of the calculation. + * <br> + * <br> + * The Doppler Effect as implemented by AL is described by the formula below. Effects + * of the medium (air, water) moving with respect to listener and source are ignored. + * AL_DOPPLER_VELOCITY is the propagation speed relative to which the Source + * velocities are interpreted. + * <p> + * <p> + * <pre> + * VD: AL_DOPPLER_VELOCITY + * DF: AL_DOPPLER_FACTOR + * vl: Listener velocity (scalar, projected on source-listener vector) + * vs: Source verlocity (scalar, projected on source-listener vector) + * f: Frequency in sample + * f': effective Doppler shifted frequency + * <p> + * f' = DF * f * (VD-vl)/(VD+vs) + * <p> + * vl<0, vs>0 : source and listener approaching each other + * vl>0, vs<0 : source and listener moving away from each other + * </pre> + * </p> + * <p> + * The implementation has to clamp the projected Listener velocity vl, if abs(vl) is + * greater or equal VD. It similarly has to clamp the projected Source velocity vs if + * abs(vs) is greater or equal VD. + * </p> + * <p> + * There are two API calls global to the current context that provide control of the two + * related parameters. + * </p> + * <p> + * AL_DOPPLER_FACTOR is a simple scaling to exaggerate or + * deemphasize the Doppler (pitch) shift resulting from the calculation. + * </p> + * <p> + * A negative value will result in an AL_INVALID_VALUE error, the command is then + * ignored. The default value is 1. The current setting can be queried using GetFloatv + * and AL_DOPPLER_FACTOR. The implementation is free to optimize the case of + * AL_DOPPLER_FACTOR being set to zero, as this effectively disables the effect. + * </p> + * <p> + * @param value Doppler scale value to set + */ + public static void alDopplerFactor(float value) { + nalDopplerFactor(value); + } + static native void nalDopplerFactor(float value); + + /** + * The Doppler Effect depends on the velocities of Source and Listener relative to the + * medium, and the propagation speed of sound in that medium. The application + * might want to emphasize or de-emphasize the Doppler Effect as physically accurate + * calculation might not give the desired results. The amount of frequency shift (pitch + * change) is proportional to the speed of listener and source along their line of sight. + * The application can increase or decrease that frequency shift by specifying the + * scaling factor AL should apply to the result of the calculation. + * <br> + * <br> + * The Doppler Effect as implemented by AL is described by the formula below. Effects + * of the medium (air, water) moving with respect to listener and source are ignored. + * AL_DOPPLER_VELOCITY is the propagation speed relative to which the Source + * velocities are interpreted. + * <p> + * <p> + * <pre> + * VD: AL_DOPPLER_VELOCITY + * DF: AL_DOPPLER_FACTOR + * vl: Listener velocity (scalar, projected on source-listener vector) + * vs: Source verlocity (scalar, projected on source-listener vector) + * f: Frequency in sample + * f': effective Doppler shifted frequency + * <p> + * f' = DF * f * (VD-vl)/(VD+vs) + * <p> + * vl<0, vs>0 : source and listener approaching each other + * vl>0, vs<0 : source and listener moving away from each other + * </pre> + * </p> + * <p> + * The implementation has to clamp the projected Listener velocity vl, if abs(vl) is + * greater or equal VD. It similarly has to clamp the projected Source velocity vs if + * abs(vs) is greater or equal VD. + * </p> + * <p> + * There are two API calls global to the current context that provide control of the two + * related parameters. + * </p> + * <p> + * AL_DOPPLER_VELOCITY allows the application to change the reference (propagation) + * velocity used in the Doppler Effect calculation. This permits the application to use a + * velocity scale appropriate to its purposes. + * </p> + * <p> + * A negative or zero value will result in an AL_INVALID_VALUE error, the command is + * then ignored. The default value is 1. The current setting can be queried using + * GetFloatv and AL_DOPPLER_VELOCITY. + * </p> + * <p> + * @param value Doppler velocity value to set + */ + public static void alDopplerVelocity(float value) { + nalDopplerVelocity(value); + } + static native void nalDopplerVelocity(float value); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL11.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL11.java new file mode 100644 index 0000000..caa5cd3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/AL11.java @@ -0,0 +1,289 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.openal; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <br> + * This is the core OpenAL class. This class implements + * AL.h version 1.1 + * <p> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2286 $ + * $Id: AL10.java 2286 2006-03-23 19:32:21Z matzon $ + */ +public final class AL11 { + + /** + * Source buffer position information in seconds + */ + public static final int AL_SEC_OFFSET = 0x1024; + + /** + * Source buffer position information in samples + */ + public static final int AL_SAMPLE_OFFSET = 0x1025; + + /** + * Source buffer position information in bytes + */ + public static final int AL_BYTE_OFFSET = 0x1026; + + /** + * Type of source: Buffer has been attached using AL_BUFFER + */ + public static final int AL_STATIC = 0x1028; + + /** + * Type of source: if one or more Buffers have been attached using alSourceQueueBuffers + */ + public static final int AL_STREAMING = 0x1029; + + /** + * Type of source: when it has the NULL buffer attached + */ + public static final int AL_UNDETERMINED = 0x1030; + + /** + * @see AL10#AL_INVALID_OPERATION + */ + public static final int AL_ILLEGAL_COMMAND = 0xA004; + + /** + * Speed of Sound in units per second + */ + public static final int AL_SPEED_OF_SOUND = 0xC003, + AL_LINEAR_DISTANCE = 0xD003, + AL_LINEAR_DISTANCE_CLAMPED = 0xD004, + AL_EXPONENT_DISTANCE = 0xD005, + AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; + + private AL11() {} + + static native void initNativeStubs() throws LWJGLException; + + /** + * Listener attributes are changed using the Listener group of commands. + * <p> + * @param pname name of the attribute to be set + * @param v1 value value 1 + * @param v2 value value 2 + * @param v3 value value 3 + */ + public static void alListener3i(int pname, int v1, int v2, int v3) { + nalListener3i(pname, v1, v2, v3); + } + static native void nalListener3i(int pname, int v1, int v2, int v3); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * <p> + * @param pname name of the attribute to be retrieved + * @param intdata Buffer to write ints to + */ + public static void alGetListeneri(int pname, FloatBuffer intdata) { + BufferChecks.checkBuffer(intdata, 1); + nalGetListeneriv(pname, MemoryUtil.getAddress(intdata)); + } + static native void nalGetListeneriv(int pname, long intdata); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to set property on + * @param pname property to set + * @param v1 value 1 of property + * @param v2 value 2 of property + * @param v3 value 3 of property + */ + public static void alSource3i(int source, int pname, int v1, int v2, int v3) { + nalSource3i(source, pname, v1, v2, v3); + } + static native void nalSource3i(int source, int pname, int v1, int v2, int v3); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * <p> + * @param source Source to set property on + * @param pname property to set + * @param value IntBuffer containing value of property + */ + public static void alSource(int source, int pname, IntBuffer value) { + BufferChecks.checkBuffer(value, 1); + nalSourceiv(source, pname, MemoryUtil.getAddress(value)); + } + static native void nalSourceiv(int source, int pname, long value); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param value value of property + */ + public static void alBufferf(int buffer, int pname, float value) { + nalBufferf(buffer, pname, value); + } + static native void nalBufferf(int buffer, int pname, float value); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param v1 value of property + * @param v2 value of property + * @param v3 value of property + */ + public static void alBuffer3f(int buffer, int pname, float v1, float v2, float v3) { + nalBuffer3f(buffer, pname, v1, v2, v3); + } + static native void nalBuffer3f(int buffer, int pname, float v1, float v2, float v3); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param value FloatBuffer containing value of property + */ + public static void alBuffer(int buffer, int pname, FloatBuffer value) { + BufferChecks.checkBuffer(value, 1); + nalBufferfv(buffer, pname, MemoryUtil.getAddress(value)); + } + static native void nalBufferfv(int buffer, int pname, long value); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param value value of property + */ + public static void alBufferi(int buffer, int pname, int value) { + nalBufferi(buffer, pname, value); + } + static native void nalBufferi(int buffer, int pname, int value); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param v1 value of property + * @param v2 value of property + * @param v3 value of property + */ + public static void alBuffer3i(int buffer, int pname, int v1, int v2, int v3) { + nalBuffer3i(buffer, pname, v1, v2, v3); + } + static native void nalBuffer3i(int buffer, int pname, int v1, int v2, int v3); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to set property on + * @param pname property to set + * @param value IntBuffer containing value of property + */ + public static void alBuffer(int buffer, int pname, IntBuffer value) { + BufferChecks.checkBuffer(value, 1); + nalBufferiv(buffer, pname, MemoryUtil.getAddress(value)); + } + static native void nalBufferiv(int buffer, int pname, long value); + + /** + * This function retrieves an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to get property from + * @param pname name of property + * @return int + */ + public static int alGetBufferi(int buffer, int pname) { + int __result = nalGetBufferi(buffer, pname); + return __result; + } + static native int nalGetBufferi(int buffer, int pname); + + /** + * This function retrieves an integer property of a buffer. + * <p> + * @param buffer Buffer to get property from + * @param pname name of property + */ + public static void alGetBuffer(int buffer, int pname, IntBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalGetBufferiv(buffer, pname, MemoryUtil.getAddress(values)); + } + static native void nalGetBufferiv(int buffer, int pname, long values); + + /** + * This function retrieves a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to get property from + * @param pname name of property + * @return floating point property + */ + public static float alGetBufferf(int buffer, int pname) { + float __result = nalGetBufferf(buffer, pname); + return __result; + } + static native float nalGetBufferf(int buffer, int pname); + + /** + * This function retrieves a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * <p> + * @param buffer Buffer to get property from + * @param pname name of property + */ + public static void alGetBuffer(int buffer, int pname, FloatBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalGetBufferfv(buffer, pname, MemoryUtil.getAddress(values)); + } + static native void nalGetBufferfv(int buffer, int pname, long values); + + /** + * <p> + * AL_SPEED_OF_SOUND allows the application to change the reference (propagation) + * speed used in the Doppler calculation. The source and listener velocities should be + * expressed in the same units as the speed of sound. + * </p> + * <p> + * A negative or zero value will result in an AL_INVALID_VALUE error, and the + * command is ignored. The default value is 343.3 (appropriate for velocity units of meters + * and air as the propagation medium). The current setting can be queried using + * alGetFloat{v} and AL_SPEED_OF_SOUND. + * Distance and velocity units are completely independent of one another (so you could use + * different units for each if desired). + * </p> + * <p> + * @param value distance model to be set + */ + public static void alSpeedOfSound(float value) { + nalSpeedOfSound(value); + } + static native void nalSpeedOfSound(float value); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/EFX10.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/EFX10.java new file mode 100644 index 0000000..84a657e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/openal/EFX10.java @@ -0,0 +1,757 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.openal; + +import org.lwjgl.*; +import java.nio.*; + +/** + * Implementation of the OpenAL extension ALC_EXT_EFX (version 1.0). Contains necessary fields, + * methods and a range of supplementary fields containing minimum, maximum and default values of + * the former fields. + * <p> + * On top of regular functions defined in the ALC_EXT_EFX, there are also several convenience + * functions. Namely alGen... and alDelete... which do not take a Java buffer parameter and + * automatically create or delete a single object, without the overhead of using a buffer. + * <p> + * For comments and specification of functions and fields, refer to the "Effects Extension Guide" + * which is part of the OpenAL SDK and can be downloaded from: + * http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx + * <p> + * @author Ciardhubh <ciardhubh[at]ciardhubh.de> + * @version $Revision$ + * $Id$ + */ +public final class EFX10 { + + public static final java.lang.String ALC_EXT_EFX_NAME = "ALC_EXT_EFX"; + + public static final int ALC_EFX_MAJOR_VERSION = 0x20001, + ALC_EFX_MINOR_VERSION = 0x20002, + ALC_MAX_AUXILIARY_SENDS = 0x20003, + AL_METERS_PER_UNIT = 0x20004, + AL_DIRECT_FILTER = 0x20005, + AL_AUXILIARY_SEND_FILTER = 0x20006, + AL_AIR_ABSORPTION_FACTOR = 0x20007, + AL_ROOM_ROLLOFF_FACTOR = 0x20008, + AL_CONE_OUTER_GAINHF = 0x20009, + AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A, + AL_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x2000B, + AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x2000C, + AL_EFFECTSLOT_EFFECT = 0x1, + AL_EFFECTSLOT_GAIN = 0x2, + AL_EFFECTSLOT_AUXILIARY_SEND_AUTO = 0x3, + AL_EFFECTSLOT_NULL = 0x0, + AL_REVERB_DENSITY = 0x1, + AL_REVERB_DIFFUSION = 0x2, + AL_REVERB_GAIN = 0x3, + AL_REVERB_GAINHF = 0x4, + AL_REVERB_DECAY_TIME = 0x5, + AL_REVERB_DECAY_HFRATIO = 0x6, + AL_REVERB_REFLECTIONS_GAIN = 0x7, + AL_REVERB_REFLECTIONS_DELAY = 0x8, + AL_REVERB_LATE_REVERB_GAIN = 0x9, + AL_REVERB_LATE_REVERB_DELAY = 0xA, + AL_REVERB_AIR_ABSORPTION_GAINHF = 0xB, + AL_REVERB_ROOM_ROLLOFF_FACTOR = 0xC, + AL_REVERB_DECAY_HFLIMIT = 0xD, + AL_EAXREVERB_DENSITY = 0x1, + AL_EAXREVERB_DIFFUSION = 0x2, + AL_EAXREVERB_GAIN = 0x3, + AL_EAXREVERB_GAINHF = 0x4, + AL_EAXREVERB_GAINLF = 0x5, + AL_EAXREVERB_DECAY_TIME = 0x6, + AL_EAXREVERB_DECAY_HFRATIO = 0x7, + AL_EAXREVERB_DECAY_LFRATIO = 0x8, + AL_EAXREVERB_REFLECTIONS_GAIN = 0x9, + AL_EAXREVERB_REFLECTIONS_DELAY = 0xA, + AL_EAXREVERB_REFLECTIONS_PAN = 0xB, + AL_EAXREVERB_LATE_REVERB_GAIN = 0xC, + AL_EAXREVERB_LATE_REVERB_DELAY = 0xD, + AL_EAXREVERB_LATE_REVERB_PAN = 0xE, + AL_EAXREVERB_ECHO_TIME = 0xF, + AL_EAXREVERB_ECHO_DEPTH = 0x10, + AL_EAXREVERB_MODULATION_TIME = 0x11, + AL_EAXREVERB_MODULATION_DEPTH = 0x12, + AL_EAXREVERB_AIR_ABSORPTION_GAINHF = 0x13, + AL_EAXREVERB_HFREFERENCE = 0x14, + AL_EAXREVERB_LFREFERENCE = 0x15, + AL_EAXREVERB_ROOM_ROLLOFF_FACTOR = 0x16, + AL_EAXREVERB_DECAY_HFLIMIT = 0x17, + AL_CHORUS_WAVEFORM = 0x1, + AL_CHORUS_PHASE = 0x2, + AL_CHORUS_RATE = 0x3, + AL_CHORUS_DEPTH = 0x4, + AL_CHORUS_FEEDBACK = 0x5, + AL_CHORUS_DELAY = 0x6, + AL_DISTORTION_EDGE = 0x1, + AL_DISTORTION_GAIN = 0x2, + AL_DISTORTION_LOWPASS_CUTOFF = 0x3, + AL_DISTORTION_EQCENTER = 0x4, + AL_DISTORTION_EQBANDWIDTH = 0x5, + AL_ECHO_DELAY = 0x1, + AL_ECHO_LRDELAY = 0x2, + AL_ECHO_DAMPING = 0x3, + AL_ECHO_FEEDBACK = 0x4, + AL_ECHO_SPREAD = 0x5, + AL_FLANGER_WAVEFORM = 0x1, + AL_FLANGER_PHASE = 0x2, + AL_FLANGER_RATE = 0x3, + AL_FLANGER_DEPTH = 0x4, + AL_FLANGER_FEEDBACK = 0x5, + AL_FLANGER_DELAY = 0x6, + AL_FREQUENCY_SHIFTER_FREQUENCY = 0x1, + AL_FREQUENCY_SHIFTER_LEFT_DIRECTION = 0x2, + AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION = 0x3, + AL_VOCAL_MORPHER_PHONEMEA = 0x1, + AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING = 0x2, + AL_VOCAL_MORPHER_PHONEMEB = 0x3, + AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING = 0x4, + AL_VOCAL_MORPHER_WAVEFORM = 0x5, + AL_VOCAL_MORPHER_RATE = 0x6, + AL_PITCH_SHIFTER_COARSE_TUNE = 0x1, + AL_PITCH_SHIFTER_FINE_TUNE = 0x2, + AL_RING_MODULATOR_FREQUENCY = 0x1, + AL_RING_MODULATOR_HIGHPASS_CUTOFF = 0x2, + AL_RING_MODULATOR_WAVEFORM = 0x3, + AL_AUTOWAH_ATTACK_TIME = 0x1, + AL_AUTOWAH_RELEASE_TIME = 0x2, + AL_AUTOWAH_RESONANCE = 0x3, + AL_AUTOWAH_PEAK_GAIN = 0x4, + AL_COMPRESSOR_ONOFF = 0x1, + AL_EQUALIZER_LOW_GAIN = 0x1, + AL_EQUALIZER_LOW_CUTOFF = 0x2, + AL_EQUALIZER_MID1_GAIN = 0x3, + AL_EQUALIZER_MID1_CENTER = 0x4, + AL_EQUALIZER_MID1_WIDTH = 0x5, + AL_EQUALIZER_MID2_GAIN = 0x6, + AL_EQUALIZER_MID2_CENTER = 0x7, + AL_EQUALIZER_MID2_WIDTH = 0x8, + AL_EQUALIZER_HIGH_GAIN = 0x9, + AL_EQUALIZER_HIGH_CUTOFF = 0xA, + AL_EFFECT_FIRST_PARAMETER = 0x0, + AL_EFFECT_LAST_PARAMETER = 0x8000, + AL_EFFECT_TYPE = 0x8001, + AL_EFFECT_NULL = 0x0, + AL_EFFECT_REVERB = 0x1, + AL_EFFECT_CHORUS = 0x2, + AL_EFFECT_DISTORTION = 0x3, + AL_EFFECT_ECHO = 0x4, + AL_EFFECT_FLANGER = 0x5, + AL_EFFECT_FREQUENCY_SHIFTER = 0x6, + AL_EFFECT_VOCAL_MORPHER = 0x7, + AL_EFFECT_PITCH_SHIFTER = 0x8, + AL_EFFECT_RING_MODULATOR = 0x9, + AL_EFFECT_AUTOWAH = 0xA, + AL_EFFECT_COMPRESSOR = 0xB, + AL_EFFECT_EQUALIZER = 0xC, + AL_EFFECT_EAXREVERB = 0x8000, + AL_LOWPASS_GAIN = 0x1, + AL_LOWPASS_GAINHF = 0x2, + AL_HIGHPASS_GAIN = 0x1, + AL_HIGHPASS_GAINLF = 0x2, + AL_BANDPASS_GAIN = 0x1, + AL_BANDPASS_GAINLF = 0x2, + AL_BANDPASS_GAINHF = 0x3, + AL_FILTER_FIRST_PARAMETER = 0x0, + AL_FILTER_LAST_PARAMETER = 0x8000, + AL_FILTER_TYPE = 0x8001, + AL_FILTER_NULL = 0x0, + AL_FILTER_LOWPASS = 0x1, + AL_FILTER_HIGHPASS = 0x2, + AL_FILTER_BANDPASS = 0x3; + + public static final float AL_MIN_AIR_ABSORPTION_FACTOR = 0.0f, + AL_MAX_AIR_ABSORPTION_FACTOR = 10.0f, + AL_DEFAULT_AIR_ABSORPTION_FACTOR = 0.0f, + AL_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_MIN_CONE_OUTER_GAINHF = 0.0f, + AL_MAX_CONE_OUTER_GAINHF = 1.0f, + AL_DEFAULT_CONE_OUTER_GAINHF = 1.0f; + + public static final int AL_MIN_DIRECT_FILTER_GAINHF_AUTO = 0x0, + AL_MAX_DIRECT_FILTER_GAINHF_AUTO = 0x1, + AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO = 0x1, + AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x0, + AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x1, + AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x1, + AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x0, + AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x1, + AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x1; + + public static final float AL_MIN_METERS_PER_UNIT = 1.4E-45f, + AL_MAX_METERS_PER_UNIT = 3.4028235E38f, + AL_DEFAULT_METERS_PER_UNIT = 1.0f, + AL_REVERB_MIN_DENSITY = 0.0f, + AL_REVERB_MAX_DENSITY = 1.0f, + AL_REVERB_DEFAULT_DENSITY = 1.0f, + AL_REVERB_MIN_DIFFUSION = 0.0f, + AL_REVERB_MAX_DIFFUSION = 1.0f, + AL_REVERB_DEFAULT_DIFFUSION = 1.0f, + AL_REVERB_MIN_GAIN = 0.0f, + AL_REVERB_MAX_GAIN = 1.0f, + AL_REVERB_DEFAULT_GAIN = 0.32f, + AL_REVERB_MIN_GAINHF = 0.0f, + AL_REVERB_MAX_GAINHF = 1.0f, + AL_REVERB_DEFAULT_GAINHF = 0.89f, + AL_REVERB_MIN_DECAY_TIME = 0.1f, + AL_REVERB_MAX_DECAY_TIME = 20.0f, + AL_REVERB_DEFAULT_DECAY_TIME = 1.49f, + AL_REVERB_MIN_DECAY_HFRATIO = 0.1f, + AL_REVERB_MAX_DECAY_HFRATIO = 2.0f, + AL_REVERB_DEFAULT_DECAY_HFRATIO = 0.83f, + AL_REVERB_MIN_REFLECTIONS_GAIN = 0.0f, + AL_REVERB_MAX_REFLECTIONS_GAIN = 3.16f, + AL_REVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f, + AL_REVERB_MIN_REFLECTIONS_DELAY = 0.0f, + AL_REVERB_MAX_REFLECTIONS_DELAY = 0.3f, + AL_REVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f, + AL_REVERB_MIN_LATE_REVERB_GAIN = 0.0f, + AL_REVERB_MAX_LATE_REVERB_GAIN = 10.0f, + AL_REVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f, + AL_REVERB_MIN_LATE_REVERB_DELAY = 0.0f, + AL_REVERB_MAX_LATE_REVERB_DELAY = 0.1f, + AL_REVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f, + AL_REVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f, + AL_REVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f, + AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f, + AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + + public static final int AL_REVERB_MIN_DECAY_HFLIMIT = 0x0, + AL_REVERB_MAX_DECAY_HFLIMIT = 0x1, + AL_REVERB_DEFAULT_DECAY_HFLIMIT = 0x1; + + public static final float AL_EAXREVERB_MIN_DENSITY = 0.0f, + AL_EAXREVERB_MAX_DENSITY = 1.0f, + AL_EAXREVERB_DEFAULT_DENSITY = 1.0f, + AL_EAXREVERB_MIN_DIFFUSION = 0.0f, + AL_EAXREVERB_MAX_DIFFUSION = 1.0f, + AL_EAXREVERB_DEFAULT_DIFFUSION = 1.0f, + AL_EAXREVERB_MIN_GAIN = 0.0f, + AL_EAXREVERB_MAX_GAIN = 1.0f, + AL_EAXREVERB_DEFAULT_GAIN = 0.32f, + AL_EAXREVERB_MIN_GAINHF = 0.0f, + AL_EAXREVERB_MAX_GAINHF = 1.0f, + AL_EAXREVERB_DEFAULT_GAINHF = 0.89f, + AL_EAXREVERB_MIN_GAINLF = 0.0f, + AL_EAXREVERB_MAX_GAINLF = 1.0f, + AL_EAXREVERB_DEFAULT_GAINLF = 1.0f, + AL_EAXREVERB_MIN_DECAY_TIME = 0.1f, + AL_EAXREVERB_MAX_DECAY_TIME = 20.0f, + AL_EAXREVERB_DEFAULT_DECAY_TIME = 1.49f, + AL_EAXREVERB_MIN_DECAY_HFRATIO = 0.1f, + AL_EAXREVERB_MAX_DECAY_HFRATIO = 2.0f, + AL_EAXREVERB_DEFAULT_DECAY_HFRATIO = 0.83f, + AL_EAXREVERB_MIN_DECAY_LFRATIO = 0.1f, + AL_EAXREVERB_MAX_DECAY_LFRATIO = 2.0f, + AL_EAXREVERB_DEFAULT_DECAY_LFRATIO = 1.0f, + AL_EAXREVERB_MIN_REFLECTIONS_GAIN = 0.0f, + AL_EAXREVERB_MAX_REFLECTIONS_GAIN = 3.16f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f, + AL_EAXREVERB_MIN_REFLECTIONS_DELAY = 0.0f, + AL_EAXREVERB_MAX_REFLECTIONS_DELAY = 0.3f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f, + AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ = 0.0f, + AL_EAXREVERB_MIN_LATE_REVERB_GAIN = 0.0f, + AL_EAXREVERB_MAX_LATE_REVERB_GAIN = 10.0f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f, + AL_EAXREVERB_MIN_LATE_REVERB_DELAY = 0.0f, + AL_EAXREVERB_MAX_LATE_REVERB_DELAY = 0.1f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f, + AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ = 0.0f, + AL_EAXREVERB_MIN_ECHO_TIME = 0.075f, + AL_EAXREVERB_MAX_ECHO_TIME = 0.25f, + AL_EAXREVERB_DEFAULT_ECHO_TIME = 0.25f, + AL_EAXREVERB_MIN_ECHO_DEPTH = 0.0f, + AL_EAXREVERB_MAX_ECHO_DEPTH = 1.0f, + AL_EAXREVERB_DEFAULT_ECHO_DEPTH = 0.0f, + AL_EAXREVERB_MIN_MODULATION_TIME = 0.04f, + AL_EAXREVERB_MAX_MODULATION_TIME = 4.0f, + AL_EAXREVERB_DEFAULT_MODULATION_TIME = 0.25f, + AL_EAXREVERB_MIN_MODULATION_DEPTH = 0.0f, + AL_EAXREVERB_MAX_MODULATION_DEPTH = 1.0f, + AL_EAXREVERB_DEFAULT_MODULATION_DEPTH = 0.0f, + AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f, + AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f, + AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f, + AL_EAXREVERB_MIN_HFREFERENCE = 1000.0f, + AL_EAXREVERB_MAX_HFREFERENCE = 20000.0f, + AL_EAXREVERB_DEFAULT_HFREFERENCE = 5000.0f, + AL_EAXREVERB_MIN_LFREFERENCE = 20.0f, + AL_EAXREVERB_MAX_LFREFERENCE = 1000.0f, + AL_EAXREVERB_DEFAULT_LFREFERENCE = 250.0f, + AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f, + AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f, + AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + + public static final int AL_EAXREVERB_MIN_DECAY_HFLIMIT = 0x0, + AL_EAXREVERB_MAX_DECAY_HFLIMIT = 0x1, + AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT = 0x1, + AL_CHORUS_WAVEFORM_SINUSOID = 0x0, + AL_CHORUS_WAVEFORM_TRIANGLE = 0x1, + AL_CHORUS_MIN_WAVEFORM = 0x0, + AL_CHORUS_MAX_WAVEFORM = 0x1, + AL_CHORUS_DEFAULT_WAVEFORM = 0x1, + AL_CHORUS_MIN_PHASE = 0xFFFFFF4C, + AL_CHORUS_MAX_PHASE = 0xB4, + AL_CHORUS_DEFAULT_PHASE = 0x5A; + + public static final float AL_CHORUS_MIN_RATE = 0.0f, + AL_CHORUS_MAX_RATE = 10.0f, + AL_CHORUS_DEFAULT_RATE = 1.1f, + AL_CHORUS_MIN_DEPTH = 0.0f, + AL_CHORUS_MAX_DEPTH = 1.0f, + AL_CHORUS_DEFAULT_DEPTH = 0.1f, + AL_CHORUS_MIN_FEEDBACK = -1.0f, + AL_CHORUS_MAX_FEEDBACK = 1.0f, + AL_CHORUS_DEFAULT_FEEDBACK = 0.25f, + AL_CHORUS_MIN_DELAY = 0.0f, + AL_CHORUS_MAX_DELAY = 0.016f, + AL_CHORUS_DEFAULT_DELAY = 0.016f, + AL_DISTORTION_MIN_EDGE = 0.0f, + AL_DISTORTION_MAX_EDGE = 1.0f, + AL_DISTORTION_DEFAULT_EDGE = 0.2f, + AL_DISTORTION_MIN_GAIN = 0.01f, + AL_DISTORTION_MAX_GAIN = 1.0f, + AL_DISTORTION_DEFAULT_GAIN = 0.05f, + AL_DISTORTION_MIN_LOWPASS_CUTOFF = 80.0f, + AL_DISTORTION_MAX_LOWPASS_CUTOFF = 24000.0f, + AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF = 8000.0f, + AL_DISTORTION_MIN_EQCENTER = 80.0f, + AL_DISTORTION_MAX_EQCENTER = 24000.0f, + AL_DISTORTION_DEFAULT_EQCENTER = 3600.0f, + AL_DISTORTION_MIN_EQBANDWIDTH = 80.0f, + AL_DISTORTION_MAX_EQBANDWIDTH = 24000.0f, + AL_DISTORTION_DEFAULT_EQBANDWIDTH = 3600.0f, + AL_ECHO_MIN_DELAY = 0.0f, + AL_ECHO_MAX_DELAY = 0.207f, + AL_ECHO_DEFAULT_DELAY = 0.1f, + AL_ECHO_MIN_LRDELAY = 0.0f, + AL_ECHO_MAX_LRDELAY = 0.404f, + AL_ECHO_DEFAULT_LRDELAY = 0.1f, + AL_ECHO_MIN_DAMPING = 0.0f, + AL_ECHO_MAX_DAMPING = 0.99f, + AL_ECHO_DEFAULT_DAMPING = 0.5f, + AL_ECHO_MIN_FEEDBACK = 0.0f, + AL_ECHO_MAX_FEEDBACK = 1.0f, + AL_ECHO_DEFAULT_FEEDBACK = 0.5f, + AL_ECHO_MIN_SPREAD = -1.0f, + AL_ECHO_MAX_SPREAD = 1.0f, + AL_ECHO_DEFAULT_SPREAD = -1.0f; + + public static final int AL_FLANGER_WAVEFORM_SINUSOID = 0x0, + AL_FLANGER_WAVEFORM_TRIANGLE = 0x1, + AL_FLANGER_MIN_WAVEFORM = 0x0, + AL_FLANGER_MAX_WAVEFORM = 0x1, + AL_FLANGER_DEFAULT_WAVEFORM = 0x1, + AL_FLANGER_MIN_PHASE = 0xFFFFFF4C, + AL_FLANGER_MAX_PHASE = 0xB4, + AL_FLANGER_DEFAULT_PHASE = 0x0; + + public static final float AL_FLANGER_MIN_RATE = 0.0f, + AL_FLANGER_MAX_RATE = 10.0f, + AL_FLANGER_DEFAULT_RATE = 0.27f, + AL_FLANGER_MIN_DEPTH = 0.0f, + AL_FLANGER_MAX_DEPTH = 1.0f, + AL_FLANGER_DEFAULT_DEPTH = 1.0f, + AL_FLANGER_MIN_FEEDBACK = -1.0f, + AL_FLANGER_MAX_FEEDBACK = 1.0f, + AL_FLANGER_DEFAULT_FEEDBACK = -0.5f, + AL_FLANGER_MIN_DELAY = 0.0f, + AL_FLANGER_MAX_DELAY = 0.004f, + AL_FLANGER_DEFAULT_DELAY = 0.002f, + AL_FREQUENCY_SHIFTER_MIN_FREQUENCY = 0.0f, + AL_FREQUENCY_SHIFTER_MAX_FREQUENCY = 24000.0f, + AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY = 0.0f; + + public static final int AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION = 0x0, + AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION = 0x2, + AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION = 0x0, + AL_FREQUENCY_SHIFTER_DIRECTION_DOWN = 0x0, + AL_FREQUENCY_SHIFTER_DIRECTION_UP = 0x1, + AL_FREQUENCY_SHIFTER_DIRECTION_OFF = 0x2, + AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION = 0x0, + AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION = 0x2, + AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION = 0x0, + AL_VOCAL_MORPHER_MIN_PHONEMEA = 0x0, + AL_VOCAL_MORPHER_MAX_PHONEMEA = 0x1D, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEA = 0x0, + AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING = 0xFFFFFFE8, + AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING = 0x18, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING = 0x0, + AL_VOCAL_MORPHER_MIN_PHONEMEB = 0x0, + AL_VOCAL_MORPHER_MAX_PHONEMEB = 0x1D, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEB = 0xA, + AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING = 0xFFFFFFE8, + AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING = 0x18, + AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING = 0x0, + AL_VOCAL_MORPHER_PHONEME_A = 0x0, + AL_VOCAL_MORPHER_PHONEME_E = 0x1, + AL_VOCAL_MORPHER_PHONEME_I = 0x2, + AL_VOCAL_MORPHER_PHONEME_O = 0x3, + AL_VOCAL_MORPHER_PHONEME_U = 0x4, + AL_VOCAL_MORPHER_PHONEME_AA = 0x5, + AL_VOCAL_MORPHER_PHONEME_AE = 0x6, + AL_VOCAL_MORPHER_PHONEME_AH = 0x7, + AL_VOCAL_MORPHER_PHONEME_AO = 0x8, + AL_VOCAL_MORPHER_PHONEME_EH = 0x9, + AL_VOCAL_MORPHER_PHONEME_ER = 0xA, + AL_VOCAL_MORPHER_PHONEME_IH = 0xB, + AL_VOCAL_MORPHER_PHONEME_IY = 0xC, + AL_VOCAL_MORPHER_PHONEME_UH = 0xD, + AL_VOCAL_MORPHER_PHONEME_UW = 0xE, + AL_VOCAL_MORPHER_PHONEME_B = 0xF, + AL_VOCAL_MORPHER_PHONEME_D = 0x10, + AL_VOCAL_MORPHER_PHONEME_F = 0x11, + AL_VOCAL_MORPHER_PHONEME_G = 0x12, + AL_VOCAL_MORPHER_PHONEME_J = 0x13, + AL_VOCAL_MORPHER_PHONEME_K = 0x14, + AL_VOCAL_MORPHER_PHONEME_L = 0x15, + AL_VOCAL_MORPHER_PHONEME_M = 0x16, + AL_VOCAL_MORPHER_PHONEME_N = 0x17, + AL_VOCAL_MORPHER_PHONEME_P = 0x18, + AL_VOCAL_MORPHER_PHONEME_R = 0x19, + AL_VOCAL_MORPHER_PHONEME_S = 0x1A, + AL_VOCAL_MORPHER_PHONEME_T = 0x1B, + AL_VOCAL_MORPHER_PHONEME_V = 0x1C, + AL_VOCAL_MORPHER_PHONEME_Z = 0x1D, + AL_VOCAL_MORPHER_WAVEFORM_SINUSOID = 0x0, + AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE = 0x1, + AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH = 0x2, + AL_VOCAL_MORPHER_MIN_WAVEFORM = 0x0, + AL_VOCAL_MORPHER_MAX_WAVEFORM = 0x2, + AL_VOCAL_MORPHER_DEFAULT_WAVEFORM = 0x0; + + public static final float AL_VOCAL_MORPHER_MIN_RATE = 0.0f, + AL_VOCAL_MORPHER_MAX_RATE = 10.0f, + AL_VOCAL_MORPHER_DEFAULT_RATE = 1.41f; + + public static final int AL_PITCH_SHIFTER_MIN_COARSE_TUNE = 0xFFFFFFF4, + AL_PITCH_SHIFTER_MAX_COARSE_TUNE = 0xC, + AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE = 0xC, + AL_PITCH_SHIFTER_MIN_FINE_TUNE = 0xFFFFFFCE, + AL_PITCH_SHIFTER_MAX_FINE_TUNE = 0x32, + AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE = 0x0; + + public static final float AL_RING_MODULATOR_MIN_FREQUENCY = 0.0f, + AL_RING_MODULATOR_MAX_FREQUENCY = 8000.0f, + AL_RING_MODULATOR_DEFAULT_FREQUENCY = 440.0f, + AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF = 0.0f, + AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF = 24000.0f, + AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF = 800.0f; + + public static final int AL_RING_MODULATOR_SINUSOID = 0x0, + AL_RING_MODULATOR_SAWTOOTH = 0x1, + AL_RING_MODULATOR_SQUARE = 0x2, + AL_RING_MODULATOR_MIN_WAVEFORM = 0x0, + AL_RING_MODULATOR_MAX_WAVEFORM = 0x2, + AL_RING_MODULATOR_DEFAULT_WAVEFORM = 0x0; + + public static final float AL_AUTOWAH_MIN_ATTACK_TIME = 1.0E-4f, + AL_AUTOWAH_MAX_ATTACK_TIME = 1.0f, + AL_AUTOWAH_DEFAULT_ATTACK_TIME = 0.06f, + AL_AUTOWAH_MIN_RELEASE_TIME = 1.0E-4f, + AL_AUTOWAH_MAX_RELEASE_TIME = 1.0f, + AL_AUTOWAH_DEFAULT_RELEASE_TIME = 0.06f, + AL_AUTOWAH_MIN_RESONANCE = 2.0f, + AL_AUTOWAH_MAX_RESONANCE = 1000.0f, + AL_AUTOWAH_DEFAULT_RESONANCE = 1000.0f, + AL_AUTOWAH_MIN_PEAK_GAIN = 3.0E-5f, + AL_AUTOWAH_MAX_PEAK_GAIN = 31621.0f, + AL_AUTOWAH_DEFAULT_PEAK_GAIN = 11.22f; + + public static final int AL_COMPRESSOR_MIN_ONOFF = 0x0, + AL_COMPRESSOR_MAX_ONOFF = 0x1, + AL_COMPRESSOR_DEFAULT_ONOFF = 0x1; + + public static final float AL_EQUALIZER_MIN_LOW_GAIN = 0.126f, + AL_EQUALIZER_MAX_LOW_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_LOW_GAIN = 1.0f, + AL_EQUALIZER_MIN_LOW_CUTOFF = 50.0f, + AL_EQUALIZER_MAX_LOW_CUTOFF = 800.0f, + AL_EQUALIZER_DEFAULT_LOW_CUTOFF = 200.0f, + AL_EQUALIZER_MIN_MID1_GAIN = 0.126f, + AL_EQUALIZER_MAX_MID1_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_MID1_GAIN = 1.0f, + AL_EQUALIZER_MIN_MID1_CENTER = 200.0f, + AL_EQUALIZER_MAX_MID1_CENTER = 3000.0f, + AL_EQUALIZER_DEFAULT_MID1_CENTER = 500.0f, + AL_EQUALIZER_MIN_MID1_WIDTH = 0.01f, + AL_EQUALIZER_MAX_MID1_WIDTH = 1.0f, + AL_EQUALIZER_DEFAULT_MID1_WIDTH = 1.0f, + AL_EQUALIZER_MIN_MID2_GAIN = 0.126f, + AL_EQUALIZER_MAX_MID2_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_MID2_GAIN = 1.0f, + AL_EQUALIZER_MIN_MID2_CENTER = 1000.0f, + AL_EQUALIZER_MAX_MID2_CENTER = 8000.0f, + AL_EQUALIZER_DEFAULT_MID2_CENTER = 3000.0f, + AL_EQUALIZER_MIN_MID2_WIDTH = 0.01f, + AL_EQUALIZER_MAX_MID2_WIDTH = 1.0f, + AL_EQUALIZER_DEFAULT_MID2_WIDTH = 1.0f, + AL_EQUALIZER_MIN_HIGH_GAIN = 0.126f, + AL_EQUALIZER_MAX_HIGH_GAIN = 7.943f, + AL_EQUALIZER_DEFAULT_HIGH_GAIN = 1.0f, + AL_EQUALIZER_MIN_HIGH_CUTOFF = 4000.0f, + AL_EQUALIZER_MAX_HIGH_CUTOFF = 16000.0f, + AL_EQUALIZER_DEFAULT_HIGH_CUTOFF = 6000.0f, + LOWPASS_MIN_GAIN = 0.0f, + LOWPASS_MAX_GAIN = 1.0f, + LOWPASS_DEFAULT_GAIN = 1.0f, + LOWPASS_MIN_GAINHF = 0.0f, + LOWPASS_MAX_GAINHF = 1.0f, + LOWPASS_DEFAULT_GAINHF = 1.0f, + HIGHPASS_MIN_GAIN = 0.0f, + HIGHPASS_MAX_GAIN = 1.0f, + HIGHPASS_DEFAULT_GAIN = 1.0f, + HIGHPASS_MIN_GAINLF = 0.0f, + HIGHPASS_MAX_GAINLF = 1.0f, + HIGHPASS_DEFAULT_GAINLF = 1.0f, + BANDPASS_MIN_GAIN = 0.0f, + BANDPASS_MAX_GAIN = 1.0f, + BANDPASS_DEFAULT_GAIN = 1.0f, + BANDPASS_MIN_GAINHF = 0.0f, + BANDPASS_MAX_GAINHF = 1.0f, + BANDPASS_DEFAULT_GAINHF = 1.0f, + BANDPASS_MIN_GAINLF = 0.0f, + BANDPASS_MAX_GAINLF = 1.0f, + BANDPASS_DEFAULT_GAINLF = 1.0f; + + private EFX10() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void alGenAuxiliaryEffectSlots(IntBuffer auxiliaryeffectslots) { + BufferChecks.checkDirect(auxiliaryeffectslots); + nalGenAuxiliaryEffectSlots(auxiliaryeffectslots.remaining(), MemoryUtil.getAddress(auxiliaryeffectslots)); + } + static native void nalGenAuxiliaryEffectSlots(int auxiliaryeffectslots_n, long auxiliaryeffectslots); + + /** Overloads alGenAuxiliaryEffectSlots. */ + public static int alGenAuxiliaryEffectSlots() { + int __result = nalGenAuxiliaryEffectSlots2(1); + return __result; + } + static native int nalGenAuxiliaryEffectSlots2(int n); + + public static void alDeleteAuxiliaryEffectSlots(IntBuffer auxiliaryeffectslots) { + BufferChecks.checkDirect(auxiliaryeffectslots); + nalDeleteAuxiliaryEffectSlots(auxiliaryeffectslots.remaining(), MemoryUtil.getAddress(auxiliaryeffectslots)); + } + static native void nalDeleteAuxiliaryEffectSlots(int auxiliaryeffectslots_n, long auxiliaryeffectslots); + + /** Overloads alDeleteAuxiliaryEffectSlots. */ + public static void alDeleteAuxiliaryEffectSlots(int auxiliaryeffectslot) { + nalDeleteAuxiliaryEffectSlots2(1, auxiliaryeffectslot); + } + static native void nalDeleteAuxiliaryEffectSlots2(int n, int auxiliaryeffectslot); + + public static boolean alIsAuxiliaryEffectSlot(int auxiliaryeffectslot) { + boolean __result = nalIsAuxiliaryEffectSlot(auxiliaryeffectslot); + return __result; + } + static native boolean nalIsAuxiliaryEffectSlot(int auxiliaryeffectslot); + + public static void alAuxiliaryEffectSloti(int auxiliaryeffectslot, int param, int value) { + nalAuxiliaryEffectSloti(auxiliaryeffectslot, param, value); + } + static native void nalAuxiliaryEffectSloti(int auxiliaryeffectslot, int param, int value); + + public static void alAuxiliaryEffectSlot(int auxiliaryeffectslot, int param, IntBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalAuxiliaryEffectSlotiv(auxiliaryeffectslot, param, MemoryUtil.getAddress(values)); + } + static native void nalAuxiliaryEffectSlotiv(int auxiliaryeffectslot, int param, long values); + + public static void alAuxiliaryEffectSlotf(int auxiliaryeffectslot, int param, float value) { + nalAuxiliaryEffectSlotf(auxiliaryeffectslot, param, value); + } + static native void nalAuxiliaryEffectSlotf(int auxiliaryeffectslot, int param, float value); + + public static void alAuxiliaryEffectSlot(int auxiliaryeffectslot, int param, FloatBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalAuxiliaryEffectSlotfv(auxiliaryeffectslot, param, MemoryUtil.getAddress(values)); + } + static native void nalAuxiliaryEffectSlotfv(int auxiliaryeffectslot, int param, long values); + + public static int alGetAuxiliaryEffectSloti(int auxiliaryeffectslot, int param) { + int __result = nalGetAuxiliaryEffectSloti(auxiliaryeffectslot, param); + return __result; + } + static native int nalGetAuxiliaryEffectSloti(int auxiliaryeffectslot, int param); + + public static void alGetAuxiliaryEffectSlot(int auxiliaryeffectslot, int param, IntBuffer intdata) { + BufferChecks.checkBuffer(intdata, 1); + nalGetAuxiliaryEffectSlotiv(auxiliaryeffectslot, param, MemoryUtil.getAddress(intdata)); + } + static native void nalGetAuxiliaryEffectSlotiv(int auxiliaryeffectslot, int param, long intdata); + + public static float alGetAuxiliaryEffectSlotf(int auxiliaryeffectslot, int param) { + float __result = nalGetAuxiliaryEffectSlotf(auxiliaryeffectslot, param); + return __result; + } + static native float nalGetAuxiliaryEffectSlotf(int auxiliaryeffectslot, int param); + + public static void alGetAuxiliaryEffectSlot(int auxiliaryeffectslot, int param, FloatBuffer floatdata) { + BufferChecks.checkBuffer(floatdata, 1); + nalGetAuxiliaryEffectSlotfv(auxiliaryeffectslot, param, MemoryUtil.getAddress(floatdata)); + } + static native void nalGetAuxiliaryEffectSlotfv(int auxiliaryeffectslot, int param, long floatdata); + + public static void alGenEffects(IntBuffer effects) { + BufferChecks.checkDirect(effects); + nalGenEffects(effects.remaining(), MemoryUtil.getAddress(effects)); + } + static native void nalGenEffects(int effects_n, long effects); + + /** Overloads alGenEffects. */ + public static int alGenEffects() { + int __result = nalGenEffects2(1); + return __result; + } + static native int nalGenEffects2(int n); + + public static void alDeleteEffects(IntBuffer effects) { + BufferChecks.checkDirect(effects); + nalDeleteEffects(effects.remaining(), MemoryUtil.getAddress(effects)); + } + static native void nalDeleteEffects(int effects_n, long effects); + + /** Overloads alDeleteEffects. */ + public static void alDeleteEffects(int effect) { + nalDeleteEffects2(1, effect); + } + static native void nalDeleteEffects2(int n, int effect); + + public static boolean alIsEffect(int effect) { + boolean __result = nalIsEffect(effect); + return __result; + } + static native boolean nalIsEffect(int effect); + + public static void alEffecti(int effect, int param, int value) { + nalEffecti(effect, param, value); + } + static native void nalEffecti(int effect, int param, int value); + + public static void alEffect(int effect, int param, IntBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalEffectiv(effect, param, MemoryUtil.getAddress(values)); + } + static native void nalEffectiv(int effect, int param, long values); + + public static void alEffectf(int effect, int param, float value) { + nalEffectf(effect, param, value); + } + static native void nalEffectf(int effect, int param, float value); + + public static void alEffect(int effect, int param, FloatBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalEffectfv(effect, param, MemoryUtil.getAddress(values)); + } + static native void nalEffectfv(int effect, int param, long values); + + public static int alGetEffecti(int effect, int param) { + int __result = nalGetEffecti(effect, param); + return __result; + } + static native int nalGetEffecti(int effect, int param); + + public static void alGetEffect(int effect, int param, IntBuffer intdata) { + BufferChecks.checkBuffer(intdata, 1); + nalGetEffectiv(effect, param, MemoryUtil.getAddress(intdata)); + } + static native void nalGetEffectiv(int effect, int param, long intdata); + + public static float alGetEffectf(int effect, int param) { + float __result = nalGetEffectf(effect, param); + return __result; + } + static native float nalGetEffectf(int effect, int param); + + public static void alGetEffect(int effect, int param, FloatBuffer floatdata) { + BufferChecks.checkBuffer(floatdata, 1); + nalGetEffectfv(effect, param, MemoryUtil.getAddress(floatdata)); + } + static native void nalGetEffectfv(int effect, int param, long floatdata); + + public static void alGenFilters(IntBuffer filters) { + BufferChecks.checkDirect(filters); + nalGenFilters(filters.remaining(), MemoryUtil.getAddress(filters)); + } + static native void nalGenFilters(int filters_n, long filters); + + /** Overloads alGenFilters. */ + public static int alGenFilters() { + int __result = nalGenFilters2(1); + return __result; + } + static native int nalGenFilters2(int n); + + public static void alDeleteFilters(IntBuffer filters) { + BufferChecks.checkDirect(filters); + nalDeleteFilters(filters.remaining(), MemoryUtil.getAddress(filters)); + } + static native void nalDeleteFilters(int filters_n, long filters); + + /** Overloads alDeleteFilters. */ + public static void alDeleteFilters(int filter) { + nalDeleteFilters2(1, filter); + } + static native void nalDeleteFilters2(int n, int filter); + + public static boolean alIsFilter(int filter) { + boolean __result = nalIsFilter(filter); + return __result; + } + static native boolean nalIsFilter(int filter); + + public static void alFilteri(int filter, int param, int value) { + nalFilteri(filter, param, value); + } + static native void nalFilteri(int filter, int param, int value); + + public static void alFilter(int filter, int param, IntBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalFilteriv(filter, param, MemoryUtil.getAddress(values)); + } + static native void nalFilteriv(int filter, int param, long values); + + public static void alFilterf(int filter, int param, float value) { + nalFilterf(filter, param, value); + } + static native void nalFilterf(int filter, int param, float value); + + public static void alFilter(int filter, int param, FloatBuffer values) { + BufferChecks.checkBuffer(values, 1); + nalFilterfv(filter, param, MemoryUtil.getAddress(values)); + } + static native void nalFilterfv(int filter, int param, long values); + + public static int alGetFilteri(int filter, int param) { + int __result = nalGetFilteri(filter, param); + return __result; + } + static native int nalGetFilteri(int filter, int param); + + public static void alGetFilter(int filter, int param, IntBuffer intdata) { + BufferChecks.checkBuffer(intdata, 1); + nalGetFilteriv(filter, param, MemoryUtil.getAddress(intdata)); + } + static native void nalGetFilteriv(int filter, int param, long intdata); + + public static float alGetFilterf(int filter, int param) { + float __result = nalGetFilterf(filter, param); + return __result; + } + static native float nalGetFilterf(int filter, int param); + + public static void alGetFilter(int filter, int param, FloatBuffer floatdata) { + BufferChecks.checkBuffer(floatdata, 1); + nalGetFilterfv(filter, param, MemoryUtil.getAddress(floatdata)); + } + static native void nalGetFilterfv(int filter, int param, long floatdata); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceAttributeQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceAttributeQuery.java new file mode 100644 index 0000000..898be30 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceAttributeQuery.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDDeviceAttributeQuery { + + /** + * Accepted as the &lt;param_name&gt; parameter of clGetDeviceInfo. Return the + * offset in nano-seconds between an event timestamp and Epoch. + */ + public static final int CL_DEVICE_PROFILING_TIMER_OFFSET_AMD = 0x4036; + + private AMDDeviceAttributeQuery() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceMemoryFlags.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceMemoryFlags.java new file mode 100644 index 0000000..6bcb0c0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDDeviceMemoryFlags.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDDeviceMemoryFlags { + + /** + * Alloc from GPU's CPU visible heap. + */ + public static final int CL_MEM_USE_PERSISTENT_MEM_AMD = 0x40; + + private AMDDeviceMemoryFlags() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDOfflineDevices.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDOfflineDevices.java new file mode 100644 index 0000000..f194720 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/AMDOfflineDevices.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDOfflineDevices { + + public static final int CL_CONTEXT_OFFLINE_DEVICES_AMD = 0x403F; + + private AMDOfflineDevices() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEContextLoggingFunctions.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEContextLoggingFunctions.java new file mode 100644 index 0000000..5bf847d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEContextLoggingFunctions.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +final class APPLEContextLoggingFunctions { + + private APPLEContextLoggingFunctions() {} + + static void clLogMessagesToSystemLogAPPLE(ByteBuffer errstr, ByteBuffer private_info, ByteBuffer user_data) { + long function_pointer = CLCapabilities.clLogMessagesToSystemLogAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(errstr); + BufferChecks.checkDirect(private_info); + BufferChecks.checkDirect(user_data); + nclLogMessagesToSystemLogAPPLE(MemoryUtil.getAddress(errstr), MemoryUtil.getAddress(private_info), private_info.remaining(), MemoryUtil.getAddress(user_data), function_pointer); + } + static native void nclLogMessagesToSystemLogAPPLE(long errstr, long private_info, long private_info_cb, long user_data, long function_pointer); + + static void clLogMessagesToStdoutAPPLE(ByteBuffer errstr, ByteBuffer private_info, ByteBuffer user_data) { + long function_pointer = CLCapabilities.clLogMessagesToStdoutAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(errstr); + BufferChecks.checkDirect(private_info); + BufferChecks.checkDirect(user_data); + nclLogMessagesToStdoutAPPLE(MemoryUtil.getAddress(errstr), MemoryUtil.getAddress(private_info), private_info.remaining(), MemoryUtil.getAddress(user_data), function_pointer); + } + static native void nclLogMessagesToStdoutAPPLE(long errstr, long private_info, long private_info_cb, long user_data, long function_pointer); + + static void clLogMessagesToStderrAPPLE(ByteBuffer errstr, ByteBuffer private_info, ByteBuffer user_data) { + long function_pointer = CLCapabilities.clLogMessagesToStderrAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(errstr); + BufferChecks.checkDirect(private_info); + BufferChecks.checkDirect(user_data); + nclLogMessagesToStderrAPPLE(MemoryUtil.getAddress(errstr), MemoryUtil.getAddress(private_info), private_info.remaining(), MemoryUtil.getAddress(user_data), function_pointer); + } + static native void nclLogMessagesToStderrAPPLE(long errstr, long private_info, long private_info_cb, long user_data, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEGLSharing.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEGLSharing.java new file mode 100644 index 0000000..f2cc640 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLEGLSharing.java @@ -0,0 +1,51 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEGLSharing { + + /** + * This enumerated value can be specified as part of the &lt;properties&gt; argument passed to clCreateContext + * to allow OpenCL compliant devices in an existing CGL share group to be used as the devices in + * the newly created CL context. GL objects that were allocated in the given CGL share group can + * now be shared between CL and GL. + */ + public static final int CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE = 0x10000000; + + /** + * Returns a cl_device_id for the CL device associated with the virtual screen for + * the given CGL context. Return type: cl_device_id + */ + public static final int CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE = 0x10000002; + + /** + * Returns an array of cl_device_ids for the CL device(s) corresponding to + * the virtual screen(s) for the given CGL context. Return type: cl_device_id[] + */ + public static final int CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE = 0x10000003; + + /** + * Error code returned by clGetGLContextInfoAPPLE if an invalid platform_gl_ctx is provided + */ + public static final int CL_INVALID_GL_CONTEXT_APPLE = 0xFFFFFC18; + + private APPLEGLSharing() {} + + public static int clGetGLContextInfoAPPLE(CLContext context, PointerBuffer platform_gl_ctx, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetGLContextInfoAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(platform_gl_ctx, 1); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + if ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer(); + int __result = nclGetGLContextInfoAPPLE(context.getPointer(), MemoryUtil.getAddress(platform_gl_ctx), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + if ( __result == CL10.CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret); + return __result; + } + static native int nclGetGLContextInfoAPPLE(long context, long platform_gl_ctx, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLESetMemObjectDestructor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLESetMemObjectDestructor.java new file mode 100644 index 0000000..e5fab40 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/APPLESetMemObjectDestructor.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLESetMemObjectDestructor { + + private APPLESetMemObjectDestructor() {} + + public static int clSetMemObjectDestructorAPPLE(CLMem memobj, CLMemObjectDestructorCallback pfn_notify) { + long function_pointer = CLCapabilities.clSetMemObjectDestructorAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + int __result = 0; + try { + __result = nclSetMemObjectDestructorAPPLE(memobj.getPointer(), pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclSetMemObjectDestructorAPPLE(long memobj, long pfn_notify, long user_data, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10.java new file mode 100644 index 0000000..0da8bd3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10.java @@ -0,0 +1,1800 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenCL 1.0 API + */ +public final class CL10 { + + /** + * Error Codes + */ + public static final int CL_SUCCESS = 0x0, + CL_DEVICE_NOT_FOUND = 0xFFFFFFFF, + CL_DEVICE_NOT_AVAILABLE = 0xFFFFFFFE, + CL_COMPILER_NOT_AVAILABLE = 0xFFFFFFFD, + CL_MEM_OBJECT_ALLOCATION_FAILURE = 0xFFFFFFFC, + CL_OUT_OF_RESOURCES = 0xFFFFFFFB, + CL_OUT_OF_HOST_MEMORY = 0xFFFFFFFA, + CL_PROFILING_INFO_NOT_AVAILABLE = 0xFFFFFFF9, + CL_MEM_COPY_OVERLAP = 0xFFFFFFF8, + CL_IMAGE_FORMAT_MISMATCH = 0xFFFFFFF7, + CL_IMAGE_FORMAT_NOT_SUPPORTED = 0xFFFFFFF6, + CL_BUILD_PROGRAM_FAILURE = 0xFFFFFFF5, + CL_MAP_FAILURE = 0xFFFFFFF4, + CL_INVALID_VALUE = 0xFFFFFFE2, + CL_INVALID_DEVICE_TYPE = 0xFFFFFFE1, + CL_INVALID_PLATFORM = 0xFFFFFFE0, + CL_INVALID_DEVICE = 0xFFFFFFDF, + CL_INVALID_CONTEXT = 0xFFFFFFDE, + CL_INVALID_QUEUE_PROPERTIES = 0xFFFFFFDD, + CL_INVALID_COMMAND_QUEUE = 0xFFFFFFDC, + CL_INVALID_HOST_PTR = 0xFFFFFFDB, + CL_INVALID_MEM_OBJECT = 0xFFFFFFDA, + CL_INVALID_IMAGE_FORMAT_DESCRIPTOR = 0xFFFFFFD9, + CL_INVALID_IMAGE_SIZE = 0xFFFFFFD8, + CL_INVALID_SAMPLER = 0xFFFFFFD7, + CL_INVALID_BINARY = 0xFFFFFFD6, + CL_INVALID_BUILD_OPTIONS = 0xFFFFFFD5, + CL_INVALID_PROGRAM = 0xFFFFFFD4, + CL_INVALID_PROGRAM_EXECUTABLE = 0xFFFFFFD3, + CL_INVALID_KERNEL_NAME = 0xFFFFFFD2, + CL_INVALID_KERNEL_DEFINITION = 0xFFFFFFD1, + CL_INVALID_KERNEL = 0xFFFFFFD0, + CL_INVALID_ARG_INDEX = 0xFFFFFFCF, + CL_INVALID_ARG_VALUE = 0xFFFFFFCE, + CL_INVALID_ARG_SIZE = 0xFFFFFFCD, + CL_INVALID_KERNEL_ARGS = 0xFFFFFFCC, + CL_INVALID_WORK_DIMENSION = 0xFFFFFFCB, + CL_INVALID_WORK_GROUP_SIZE = 0xFFFFFFCA, + CL_INVALID_WORK_ITEM_SIZE = 0xFFFFFFC9, + CL_INVALID_GLOBAL_OFFSET = 0xFFFFFFC8, + CL_INVALID_EVENT_WAIT_LIST = 0xFFFFFFC7, + CL_INVALID_EVENT = 0xFFFFFFC6, + CL_INVALID_OPERATION = 0xFFFFFFC5, + CL_INVALID_GL_OBJECT = 0xFFFFFFC4, + CL_INVALID_BUFFER_SIZE = 0xFFFFFFC3, + CL_INVALID_MIP_LEVEL = 0xFFFFFFC2, + CL_INVALID_GLOBAL_WORK_SIZE = 0xFFFFFFC1; + + /** + * OpenCL Version + */ + public static final int CL_VERSION_1_0 = 0x1; + + /** + * cl_bool + */ + public static final int CL_FALSE = 0x0, + CL_TRUE = 0x1; + + /** + * cl_platform_info + */ + public static final int CL_PLATFORM_PROFILE = 0x900, + CL_PLATFORM_VERSION = 0x901, + CL_PLATFORM_NAME = 0x902, + CL_PLATFORM_VENDOR = 0x903, + CL_PLATFORM_EXTENSIONS = 0x904; + + /** + * cl_device_type - bitfield + */ + public static final int CL_DEVICE_TYPE_DEFAULT = 0x1, + CL_DEVICE_TYPE_CPU = 0x2, + CL_DEVICE_TYPE_GPU = 0x4, + CL_DEVICE_TYPE_ACCELERATOR = 0x8, + CL_DEVICE_TYPE_ALL = 0xFFFFFFFF; + + /** + * cl_device_info + */ + public static final int CL_DEVICE_TYPE = 0x1000, + CL_DEVICE_VENDOR_ID = 0x1001, + CL_DEVICE_MAX_COMPUTE_UNITS = 0x1002, + CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = 0x1003, + CL_DEVICE_MAX_WORK_GROUP_SIZE = 0x1004, + CL_DEVICE_MAX_WORK_ITEM_SIZES = 0x1005, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR = 0x1006, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT = 0x1007, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_ = 0x1008, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG = 0x1009, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT = 0x100A, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE = 0x100B, + CL_DEVICE_MAX_CLOCK_FREQUENCY = 0x100C, + CL_DEVICE_ADDRESS_BITS = 0x100D, + CL_DEVICE_MAX_READ_IMAGE_ARGS = 0x100E, + CL_DEVICE_MAX_WRITE_IMAGE_ARGS = 0x100F, + CL_DEVICE_MAX_MEM_ALLOC_SIZE = 0x1010, + CL_DEVICE_IMAGE2D_MAX_WIDTH = 0x1011, + CL_DEVICE_IMAGE2D_MAX_HEIGHT = 0x1012, + CL_DEVICE_IMAGE3D_MAX_WIDTH = 0x1013, + CL_DEVICE_IMAGE3D_MAX_HEIGHT = 0x1014, + CL_DEVICE_IMAGE3D_MAX_DEPTH = 0x1015, + CL_DEVICE_IMAGE_SUPPORT = 0x1016, + CL_DEVICE_MAX_PARAMETER_SIZE = 0x1017, + CL_DEVICE_MAX_SAMPLERS = 0x1018, + CL_DEVICE_MEM_BASE_ADDR_ALIGN = 0x1019, + CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE = 0x101A, + CL_DEVICE_SINGLE_FP_CONFIG = 0x101B, + CL_DEVICE_GLOBAL_MEM_CACHE_TYPE = 0x101C, + CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = 0x101D, + CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = 0x101E, + CL_DEVICE_GLOBAL_MEM_SIZE = 0x101F, + CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE = 0x1020, + CL_DEVICE_MAX_CONSTANT_ARGS = 0x1021, + CL_DEVICE_LOCAL_MEM_TYPE = 0x1022, + CL_DEVICE_LOCAL_MEM_SIZE = 0x1023, + CL_DEVICE_ERROR_CORRECTION_SUPPORT = 0x1024, + CL_DEVICE_PROFILING_TIMER_RESOLUTION = 0x1025, + CL_DEVICE_ENDIAN_LITTLE = 0x1026, + CL_DEVICE_AVAILABLE = 0x1027, + CL_DEVICE_COMPILER_AVAILABLE = 0x1028, + CL_DEVICE_EXECUTION_CAPABILITIES = 0x1029, + CL_DEVICE_QUEUE_PROPERTIES = 0x102A, + CL_DEVICE_NAME = 0x102B, + CL_DEVICE_VENDOR = 0x102C, + CL_DRIVER_VERSION = 0x102D, + CL_DEVICE_PROFILE = 0x102E, + CL_DEVICE_VERSION = 0x102F, + CL_DEVICE_EXTENSIONS = 0x1030, + CL_DEVICE_PLATFORM = 0x1031; + + /** + * cl_device_fp_config - bitfield + */ + public static final int CL_FP_DENORM = 0x1, + CL_FP_INF_NAN = 0x2, + CL_FP_ROUND_TO_NEAREST = 0x4, + CL_FP_ROUND_TO_ZERO = 0x8, + CL_FP_ROUND_TO_INF = 0x10, + CL_FP_FMA = 0x20; + + /** + * cl_device_mem_cache_type + */ + public static final int CL_NONE = 0x0, + CL_READ_ONLY_CACHE = 0x1, + CL_READ_WRITE_CACHE = 0x2; + + /** + * cl_device_local_mem_type + */ + public static final int CL_LOCAL = 0x1, + CL_GLOBAL = 0x2; + + /** + * cl_device_exec_capabilities - bitfield + */ + public static final int CL_EXEC_KERNEL = 0x1, + CL_EXEC_NATIVE_KERNEL = 0x2; + + /** + * cl_command_queue_properties - bitfield + */ + public static final int CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE = 0x1, + CL_QUEUE_PROFILING_ENABLE = 0x2; + + /** + * cl_context_info + */ + public static final int CL_CONTEXT_REFERENCE_COUNT = 0x1080, + CL_CONTEXT_DEVICES = 0x1081, + CL_CONTEXT_PROPERTIES = 0x1082; + + /** + * cl_context_info + cl_context_properties + */ + public static final int CL_CONTEXT_PLATFORM = 0x1084; + + /** + * cl_command_queue_info + */ + public static final int CL_QUEUE_CONTEXT = 0x1090, + CL_QUEUE_DEVICE = 0x1091, + CL_QUEUE_REFERENCE_COUNT = 0x1092, + CL_QUEUE_PROPERTIES = 0x1093; + + /** + * cl_mem_flags - bitfield + */ + public static final int CL_MEM_READ_WRITE = 0x1, + CL_MEM_WRITE_ONLY = 0x2, + CL_MEM_READ_ONLY = 0x4, + CL_MEM_USE_HOST_PTR = 0x8, + CL_MEM_ALLOC_HOST_PTR = 0x10, + CL_MEM_COPY_HOST_PTR = 0x20; + + /** + * cl_channel_order + */ + public static final int CL_R = 0x10B0, + CL_A = 0x10B1, + CL_RG = 0x10B2, + CL_RA = 0x10B3, + CL_RGB = 0x10B4, + CL_RGBA = 0x10B5, + CL_BGRA = 0x10B6, + CL_ARGB = 0x10B7, + CL_INTENSITY = 0x10B8, + CL_LUMINANCE = 0x10B9; + + /** + * cl_channel_type + */ + public static final int CL_SNORM_INT8 = 0x10D0, + CL_SNORM_INT16 = 0x10D1, + CL_UNORM_INT8 = 0x10D2, + CL_UNORM_INT16 = 0x10D3, + CL_UNORM_SHORT_565 = 0x10D4, + CL_UNORM_SHORT_555 = 0x10D5, + CL_UNORM_INT_101010 = 0x10D6, + CL_SIGNED_INT8 = 0x10D7, + CL_SIGNED_INT16 = 0x10D8, + CL_SIGNED_INT32 = 0x10D9, + CL_UNSIGNED_INT8 = 0x10DA, + CL_UNSIGNED_INT16 = 0x10DB, + CL_UNSIGNED_INT32 = 0x10DC, + CL_HALF_FLOAT = 0x10DD, + CL_FLOAT = 0x10DE; + + /** + * cl_mem_object_type + */ + public static final int CL_MEM_OBJECT_BUFFER = 0x10F0, + CL_MEM_OBJECT_IMAGE2D = 0x10F1, + CL_MEM_OBJECT_IMAGE3D = 0x10F2; + + /** + * cl_mem_info + */ + public static final int CL_MEM_TYPE = 0x1100, + CL_MEM_FLAGS = 0x1101, + CL_MEM_SIZE = 0x1102, + CL_MEM_HOST_PTR = 0x1103, + CL_MEM_MAP_COUNT = 0x1104, + CL_MEM_REFERENCE_COUNT = 0x1105, + CL_MEM_CONTEXT = 0x1106; + + /** + * cl_image_info + */ + public static final int CL_IMAGE_FORMAT = 0x1110, + CL_IMAGE_ELEMENT_SIZE = 0x1111, + CL_IMAGE_ROW_PITCH = 0x1112, + CL_IMAGE_SLICE_PITCH = 0x1113, + CL_IMAGE_WIDTH = 0x1114, + CL_IMAGE_HEIGHT = 0x1115, + CL_IMAGE_DEPTH = 0x1116; + + /** + * cl_addressing_mode + */ + public static final int CL_ADDRESS_NONE = 0x1130, + CL_ADDRESS_CLAMP_TO_EDGE = 0x1131, + CL_ADDRESS_CLAMP = 0x1132, + CL_ADDRESS_REPEAT = 0x1133; + + /** + * cl_filter_mode + */ + public static final int CL_FILTER_NEAREST = 0x1140, + CL_FILTER_LINEAR = 0x1141; + + /** + * cl_sampler_info + */ + public static final int CL_SAMPLER_REFERENCE_COUNT = 0x1150, + CL_SAMPLER_CONTEXT = 0x1151, + CL_SAMPLER_NORMALIZED_COORDS = 0x1152, + CL_SAMPLER_ADDRESSING_MODE = 0x1153, + CL_SAMPLER_FILTER_MODE = 0x1154; + + /** + * cl_map_flags - bitfield + */ + public static final int CL_MAP_READ = 0x1, + CL_MAP_WRITE = 0x2; + + /** + * cl_program_info + */ + public static final int CL_PROGRAM_REFERENCE_COUNT = 0x1160, + CL_PROGRAM_CONTEXT = 0x1161, + CL_PROGRAM_NUM_DEVICES = 0x1162, + CL_PROGRAM_DEVICES = 0x1163, + CL_PROGRAM_SOURCE = 0x1164, + CL_PROGRAM_BINARY_SIZES = 0x1165, + CL_PROGRAM_BINARIES = 0x1166; + + /** + * cl_program_build_info + */ + public static final int CL_PROGRAM_BUILD_STATUS = 0x1181, + CL_PROGRAM_BUILD_OPTIONS = 0x1182, + CL_PROGRAM_BUILD_LOG = 0x1183; + + /** + * cl_build_status + */ + public static final int CL_BUILD_SUCCESS = 0x0, + CL_BUILD_NONE = 0xFFFFFFFF, + CL_BUILD_ERROR = 0xFFFFFFFE, + CL_BUILD_IN_PROGRESS = 0xFFFFFFFD; + + /** + * cl_kernel_info + */ + public static final int CL_KERNEL_FUNCTION_NAME = 0x1190, + CL_KERNEL_NUM_ARGS = 0x1191, + CL_KERNEL_REFERENCE_COUNT = 0x1192, + CL_KERNEL_CONTEXT = 0x1193, + CL_KERNEL_PROGRAM = 0x1194; + + /** + * cl_kernel_work_group_info + */ + public static final int CL_KERNEL_WORK_GROUP_SIZE = 0x11B0, + CL_KERNEL_COMPILE_WORK_GROUP_SIZE = 0x11B1, + CL_KERNEL_LOCAL_MEM_SIZE = 0x11B2; + + /** + * cl_event_info + */ + public static final int CL_EVENT_COMMAND_QUEUE = 0x11D0, + CL_EVENT_COMMAND_TYPE = 0x11D1, + CL_EVENT_REFERENCE_COUNT = 0x11D2, + CL_EVENT_COMMAND_EXECUTION_STATUS = 0x11D3; + + /** + * cl_command_type + */ + public static final int CL_COMMAND_NDRANGE_KERNEL = 0x11F0, + CL_COMMAND_TASK = 0x11F1, + CL_COMMAND_NATIVE_KERNEL = 0x11F2, + CL_COMMAND_READ_BUFFER = 0x11F3, + CL_COMMAND_WRITE_BUFFER = 0x11F4, + CL_COMMAND_COPY_BUFFER = 0x11F5, + CL_COMMAND_READ_IMAGE = 0x11F6, + CL_COMMAND_WRITE_IMAGE = 0x11F7, + CL_COMMAND_COPY_IMAGE = 0x11F8, + CL_COMMAND_COPY_IMAGE_TO_BUFFER = 0x11F9, + CL_COMMAND_COPY_BUFFER_TO_IMAGE = 0x11FA, + CL_COMMAND_MAP_BUFFER = 0x11FB, + CL_COMMAND_MAP_IMAGE = 0x11FC, + CL_COMMAND_UNMAP_MEM_OBJECT = 0x11FD, + CL_COMMAND_MARKER = 0x11FE, + CL_COMMAND_ACQUIRE_GL_OBJECTS = 0x11FF, + CL_COMMAND_RELEASE_GL_OBJECTS = 0x1200; + + /** + * command execution status + */ + public static final int CL_COMPLETE = 0x0, + CL_RUNNING = 0x1, + CL_SUBMITTED = 0x2, + CL_QUEUED = 0x3; + + /** + * cl_profiling_info + */ + public static final int CL_PROFILING_COMMAND_QUEUED = 0x1280, + CL_PROFILING_COMMAND_SUBMIT = 0x1281, + CL_PROFILING_COMMAND_START = 0x1282, + CL_PROFILING_COMMAND_END = 0x1283; + + private CL10() {} + + public static int clGetPlatformIDs(PointerBuffer platforms, IntBuffer num_platforms) { + long function_pointer = CLCapabilities.clGetPlatformIDs; + BufferChecks.checkFunctionAddress(function_pointer); + if (platforms != null) + BufferChecks.checkDirect(platforms); + if (num_platforms != null) + BufferChecks.checkBuffer(num_platforms, 1); + if ( num_platforms == null ) num_platforms = APIUtil.getBufferInt(); + int __result = nclGetPlatformIDs((platforms == null ? 0 : platforms.remaining()), MemoryUtil.getAddressSafe(platforms), MemoryUtil.getAddressSafe(num_platforms), function_pointer); + if ( __result == CL_SUCCESS && platforms != null ) CLPlatform.registerCLPlatforms(platforms, num_platforms); + return __result; + } + static native int nclGetPlatformIDs(int platforms_num_entries, long platforms, long num_platforms, long function_pointer); + + public static int clGetPlatformInfo(CLPlatform platform, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetPlatformInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetPlatformInfo(platform == null ? 0 : platform.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetPlatformInfo(long platform, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clGetDeviceIDs(CLPlatform platform, long device_type, PointerBuffer devices, IntBuffer num_devices) { + long function_pointer = CLCapabilities.clGetDeviceIDs; + BufferChecks.checkFunctionAddress(function_pointer); + if (devices != null) + BufferChecks.checkDirect(devices); + if (num_devices != null) + BufferChecks.checkBuffer(num_devices, 1); + else + num_devices = APIUtil.getBufferInt(); + int __result = nclGetDeviceIDs(platform.getPointer(), device_type, (devices == null ? 0 : devices.remaining()), MemoryUtil.getAddressSafe(devices), MemoryUtil.getAddressSafe(num_devices), function_pointer); + if ( __result == CL_SUCCESS && devices != null ) platform.registerCLDevices(devices, num_devices); + return __result; + } + static native int nclGetDeviceIDs(long platform, long device_type, int devices_num_entries, long devices, long num_devices, long function_pointer); + + public static int clGetDeviceInfo(CLDevice device, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetDeviceInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetDeviceInfo(device.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetDeviceInfo(long device, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + /** + * LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. + */ + public static CLContext clCreateContext(PointerBuffer properties, PointerBuffer devices, CLContextCallback pfn_notify, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateContext; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(properties, 3); + BufferChecks.checkNullTerminated(properties); + BufferChecks.checkBuffer(devices, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + long user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify); + CLContext __result = null; + try { + __result = new CLContext(nclCreateContext(MemoryUtil.getAddress(properties), devices.remaining(), MemoryUtil.getAddress(devices), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), APIUtil.getCLPlatform(properties)); + return __result; + } finally { + if ( __result != null ) __result.setContextCallback(user_data); + } + } + static native long nclCreateContext(long properties, int devices_num_devices, long devices, long pfn_notify, long user_data, long errcode_ret, long function_pointer); + + /** + * Overloads clCreateContext. + * <p> + * LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. + */ + public static CLContext clCreateContext(PointerBuffer properties, CLDevice device, CLContextCallback pfn_notify, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateContext; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(properties, 3); + BufferChecks.checkNullTerminated(properties); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + long user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify); + CLContext __result = null; + try { + __result = new CLContext(nclCreateContext(MemoryUtil.getAddress(properties), 1, APIUtil.getPointer(device), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), APIUtil.getCLPlatform(properties)); + return __result; + } finally { + if ( __result != null ) __result.setContextCallback(user_data); + } + } + + /** + * LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. + */ + public static CLContext clCreateContextFromType(PointerBuffer properties, long device_type, CLContextCallback pfn_notify, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateContextFromType; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(properties, 3); + BufferChecks.checkNullTerminated(properties); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + long user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify); + CLContext __result = null; + try { + __result = new CLContext(nclCreateContextFromType(MemoryUtil.getAddress(properties), device_type, pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), APIUtil.getCLPlatform(properties)); + return __result; + } finally { + if ( __result != null ) __result.setContextCallback(user_data); + } + } + static native long nclCreateContextFromType(long properties, long device_type, long pfn_notify, long user_data, long errcode_ret, long function_pointer); + + public static int clRetainContext(CLContext context) { + long function_pointer = CLCapabilities.clRetainContext; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainContext(context.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) context.retain(); + return __result; + } + static native int nclRetainContext(long context, long function_pointer); + + public static int clReleaseContext(CLContext context) { + long function_pointer = CLCapabilities.clReleaseContext; + BufferChecks.checkFunctionAddress(function_pointer); + APIUtil.releaseObjects(context); + int __result = nclReleaseContext(context.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) context.releaseImpl(); + return __result; + } + static native int nclReleaseContext(long context, long function_pointer); + + public static int clGetContextInfo(CLContext context, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetContextInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + if ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer(); + int __result = nclGetContextInfo(context.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + if ( __result == CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret); + return __result; + } + static native int nclGetContextInfo(long context, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static CLCommandQueue clCreateCommandQueue(CLContext context, CLDevice device, long properties, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateCommandQueue; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLCommandQueue __result = new CLCommandQueue(nclCreateCommandQueue(context.getPointer(), device.getPointer(), properties, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context, device); + return __result; + } + static native long nclCreateCommandQueue(long context, long device, long properties, long errcode_ret, long function_pointer); + + public static int clRetainCommandQueue(CLCommandQueue command_queue) { + long function_pointer = CLCapabilities.clRetainCommandQueue; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainCommandQueue(command_queue.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.retain(); + return __result; + } + static native int nclRetainCommandQueue(long command_queue, long function_pointer); + + public static int clReleaseCommandQueue(CLCommandQueue command_queue) { + long function_pointer = CLCapabilities.clReleaseCommandQueue; + BufferChecks.checkFunctionAddress(function_pointer); + APIUtil.releaseObjects(command_queue); + int __result = nclReleaseCommandQueue(command_queue.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.release(); + return __result; + } + static native int nclReleaseCommandQueue(long command_queue, long function_pointer); + + public static int clGetCommandQueueInfo(CLCommandQueue command_queue, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetCommandQueueInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetCommandQueueInfo(command_queue.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetCommandQueueInfo(long command_queue, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static CLMem clCreateBuffer(CLContext context, long flags, long host_ptr_size, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, host_ptr_size, 0L, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, ByteBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, host_ptr.remaining(), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, DoubleBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, (host_ptr.remaining() << 3), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, FloatBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, (host_ptr.remaining() << 2), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, IntBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, (host_ptr.remaining() << 2), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, LongBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, (host_ptr.remaining() << 3), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateBuffer(CLContext context, long flags, ShortBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateBuffer(context.getPointer(), flags, (host_ptr.remaining() << 1), MemoryUtil.getAddress(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateBuffer(long context, long flags, long host_ptr_size, long host_ptr, long errcode_ret, long function_pointer); + + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, ptr.remaining(), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, DoubleBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, (ptr.remaining() << 3), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, (ptr.remaining() << 2), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, (ptr.remaining() << 2), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, LongBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, (ptr.remaining() << 3), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_read, long offset, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_read, offset, (ptr.remaining() << 1), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueReadBuffer(long command_queue, long buffer, int blocking_read, long offset, long ptr_size, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, ptr.remaining(), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, DoubleBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, (ptr.remaining() << 3), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, (ptr.remaining() << 2), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, (ptr.remaining() << 2), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, LongBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, (ptr.remaining() << 3), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_write, long offset, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_write, offset, (ptr.remaining() << 1), MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueWriteBuffer(long command_queue, long buffer, int blocking_write, long offset, long ptr_size, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueCopyBuffer(CLCommandQueue command_queue, CLMem src_buffer, CLMem dst_buffer, long src_offset, long dst_offset, long size, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueCopyBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueCopyBuffer(command_queue.getPointer(), src_buffer.getPointer(), dst_buffer.getPointer(), src_offset, dst_offset, size, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueCopyBuffer(long command_queue, long src_buffer, long dst_buffer, long src_offset, long dst_offset, long size, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static ByteBuffer clEnqueueMapBuffer(CLCommandQueue command_queue, CLMem buffer, int blocking_map, long map_flags, long offset, long size, PointerBuffer event_wait_list, PointerBuffer event, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clEnqueueMapBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + ByteBuffer __result = nclEnqueueMapBuffer(command_queue.getPointer(), buffer.getPointer(), blocking_map, map_flags, offset, size, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), MemoryUtil.getAddressSafe(errcode_ret), size, function_pointer); + if ( __result != null ) command_queue.registerCLEvent(event); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nclEnqueueMapBuffer(long command_queue, long buffer, int blocking_map, long map_flags, long offset, long size, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long errcode_ret, long result_size, long function_pointer); + + public static CLMem clCreateImage2D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_row_pitch, ByteBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(image_format, image_width, image_height, image_row_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_row_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage2D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_row_pitch, FloatBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(image_format, image_width, image_height, image_row_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_row_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage2D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_row_pitch, IntBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(image_format, image_width, image_height, image_row_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_row_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage2D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_row_pitch, ShortBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(image_format, image_width, image_height, image_row_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_row_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateImage2D(long context, long flags, long image_format, long image_width, long image_height, long image_row_pitch, long host_ptr, long errcode_ret, long function_pointer); + + public static CLMem clCreateImage3D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, ByteBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(image_format, image_width, image_height, image_height, image_row_pitch, image_slice_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage3D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, FloatBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(image_format, image_width, image_height, image_height, image_row_pitch, image_slice_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage3D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, IntBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(image_format, image_width, image_height, image_height, image_row_pitch, image_slice_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage3D(CLContext context, long flags, ByteBuffer image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, ShortBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + if (host_ptr != null) + BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(image_format, image_width, image_height, image_height, image_row_pitch, image_slice_pitch)); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, MemoryUtil.getAddress(image_format), image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateImage3D(long context, long flags, long image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, long host_ptr, long errcode_ret, long function_pointer); + + public static int clGetSupportedImageFormats(CLContext context, long flags, int image_type, ByteBuffer image_formats, IntBuffer num_image_formats) { + long function_pointer = CLCapabilities.clGetSupportedImageFormats; + BufferChecks.checkFunctionAddress(function_pointer); + if (image_formats != null) + BufferChecks.checkDirect(image_formats); + if (num_image_formats != null) + BufferChecks.checkBuffer(num_image_formats, 1); + int __result = nclGetSupportedImageFormats(context.getPointer(), flags, image_type, (image_formats == null ? 0 : image_formats.remaining()) / (2 * 4), MemoryUtil.getAddressSafe(image_formats), MemoryUtil.getAddressSafe(num_image_formats), function_pointer); + return __result; + } + static native int nclGetSupportedImageFormats(long context, long flags, int image_type, int image_formats_num_entries, long image_formats, long num_image_formats, long function_pointer); + + public static int clEnqueueReadImage(CLCommandQueue command_queue, CLMem image, int blocking_read, PointerBuffer origin, PointerBuffer region, long row_pitch, long slice_pitch, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, row_pitch, slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadImage(command_queue.getPointer(), image.getPointer(), blocking_read, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), row_pitch, slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadImage(CLCommandQueue command_queue, CLMem image, int blocking_read, PointerBuffer origin, PointerBuffer region, long row_pitch, long slice_pitch, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, row_pitch, slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadImage(command_queue.getPointer(), image.getPointer(), blocking_read, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), row_pitch, slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadImage(CLCommandQueue command_queue, CLMem image, int blocking_read, PointerBuffer origin, PointerBuffer region, long row_pitch, long slice_pitch, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, row_pitch, slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadImage(command_queue.getPointer(), image.getPointer(), blocking_read, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), row_pitch, slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadImage(CLCommandQueue command_queue, CLMem image, int blocking_read, PointerBuffer origin, PointerBuffer region, long row_pitch, long slice_pitch, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, row_pitch, slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadImage(command_queue.getPointer(), image.getPointer(), blocking_read, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), row_pitch, slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueReadImage(long command_queue, long image, int blocking_read, long origin, long region, long row_pitch, long slice_pitch, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueWriteImage(CLCommandQueue command_queue, CLMem image, int blocking_write, PointerBuffer origin, PointerBuffer region, long input_row_pitch, long input_slice_pitch, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, input_row_pitch, input_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteImage(command_queue.getPointer(), image.getPointer(), blocking_write, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), input_row_pitch, input_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteImage(CLCommandQueue command_queue, CLMem image, int blocking_write, PointerBuffer origin, PointerBuffer region, long input_row_pitch, long input_slice_pitch, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, input_row_pitch, input_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteImage(command_queue.getPointer(), image.getPointer(), blocking_write, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), input_row_pitch, input_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteImage(CLCommandQueue command_queue, CLMem image, int blocking_write, PointerBuffer origin, PointerBuffer region, long input_row_pitch, long input_slice_pitch, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, input_row_pitch, input_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteImage(command_queue.getPointer(), image.getPointer(), blocking_write, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), input_row_pitch, input_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteImage(CLCommandQueue command_queue, CLMem image, int blocking_write, PointerBuffer origin, PointerBuffer region, long input_row_pitch, long input_slice_pitch, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateImageSize(region, input_row_pitch, input_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteImage(command_queue.getPointer(), image.getPointer(), blocking_write, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), input_row_pitch, input_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueWriteImage(long command_queue, long image, int blocking_write, long origin, long region, long input_row_pitch, long input_slice_pitch, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueCopyImage(CLCommandQueue command_queue, CLMem src_image, CLMem dst_image, PointerBuffer src_origin, PointerBuffer dst_origin, PointerBuffer region, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueCopyImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(src_origin, 3); + BufferChecks.checkBuffer(dst_origin, 3); + BufferChecks.checkBuffer(region, 3); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueCopyImage(command_queue.getPointer(), src_image.getPointer(), dst_image.getPointer(), MemoryUtil.getAddress(src_origin), MemoryUtil.getAddress(dst_origin), MemoryUtil.getAddress(region), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueCopyImage(long command_queue, long src_image, long dst_image, long src_origin, long dst_origin, long region, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueCopyImageToBuffer(CLCommandQueue command_queue, CLMem src_image, CLMem dst_buffer, PointerBuffer src_origin, PointerBuffer region, long dst_offset, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueCopyImageToBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(src_origin, 3); + BufferChecks.checkBuffer(region, 3); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueCopyImageToBuffer(command_queue.getPointer(), src_image.getPointer(), dst_buffer.getPointer(), MemoryUtil.getAddress(src_origin), MemoryUtil.getAddress(region), dst_offset, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueCopyImageToBuffer(long command_queue, long src_image, long dst_buffer, long src_origin, long region, long dst_offset, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueCopyBufferToImage(CLCommandQueue command_queue, CLMem src_buffer, CLMem dst_image, long src_offset, PointerBuffer dst_origin, PointerBuffer region, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueCopyBufferToImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(dst_origin, 3); + BufferChecks.checkBuffer(region, 3); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueCopyBufferToImage(command_queue.getPointer(), src_buffer.getPointer(), dst_image.getPointer(), src_offset, MemoryUtil.getAddress(dst_origin), MemoryUtil.getAddress(region), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueCopyBufferToImage(long command_queue, long src_buffer, long dst_image, long src_offset, long dst_origin, long region, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static ByteBuffer clEnqueueMapImage(CLCommandQueue command_queue, CLMem image, int blocking_map, long map_flags, PointerBuffer origin, PointerBuffer region, PointerBuffer image_row_pitch, PointerBuffer image_slice_pitch, PointerBuffer event_wait_list, PointerBuffer event, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clEnqueueMapImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(image_row_pitch, 1); + if (image_slice_pitch != null) + BufferChecks.checkBuffer(image_slice_pitch, 1); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + ByteBuffer __result = nclEnqueueMapImage(command_queue.getPointer(), image.getPointer(), blocking_map, map_flags, MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), MemoryUtil.getAddress(image_row_pitch), MemoryUtil.getAddressSafe(image_slice_pitch), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), MemoryUtil.getAddressSafe(errcode_ret), function_pointer); + if ( __result != null ) command_queue.registerCLEvent(event); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nclEnqueueMapImage(long command_queue, long image, int blocking_map, long map_flags, long origin, long region, long image_row_pitch, long image_slice_pitch, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long errcode_ret, long function_pointer); + + public static int clGetImageInfo(CLMem image, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetImageInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetImageInfo(image.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetImageInfo(long image, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clRetainMemObject(CLMem memobj) { + long function_pointer = CLCapabilities.clRetainMemObject; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainMemObject(memobj.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) memobj.retain(); + return __result; + } + static native int nclRetainMemObject(long memobj, long function_pointer); + + public static int clReleaseMemObject(CLMem memobj) { + long function_pointer = CLCapabilities.clReleaseMemObject; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclReleaseMemObject(memobj.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) memobj.release(); + return __result; + } + static native int nclReleaseMemObject(long memobj, long function_pointer); + + public static int clEnqueueUnmapMemObject(CLCommandQueue command_queue, CLMem memobj, ByteBuffer mapped_ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueUnmapMemObject; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(mapped_ptr); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueUnmapMemObject(command_queue.getPointer(), memobj.getPointer(), MemoryUtil.getAddress(mapped_ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueUnmapMemObject(long command_queue, long memobj, long mapped_ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clGetMemObjectInfo(CLMem memobj, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetMemObjectInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetMemObjectInfo(memobj.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetMemObjectInfo(long memobj, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static CLSampler clCreateSampler(CLContext context, int normalized_coords, int addressing_mode, int filter_mode, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateSampler; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLSampler __result = new CLSampler(nclCreateSampler(context.getPointer(), normalized_coords, addressing_mode, filter_mode, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateSampler(long context, int normalized_coords, int addressing_mode, int filter_mode, long errcode_ret, long function_pointer); + + public static int clRetainSampler(CLSampler sampler) { + long function_pointer = CLCapabilities.clRetainSampler; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainSampler(sampler.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) sampler.retain(); + return __result; + } + static native int nclRetainSampler(long sampler, long function_pointer); + + public static int clReleaseSampler(CLSampler sampler) { + long function_pointer = CLCapabilities.clReleaseSampler; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclReleaseSampler(sampler.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) sampler.release(); + return __result; + } + static native int nclReleaseSampler(long sampler, long function_pointer); + + public static int clGetSamplerInfo(CLSampler sampler, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetSamplerInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetSamplerInfo(sampler.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetSamplerInfo(long sampler, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static CLProgram clCreateProgramWithSource(CLContext context, ByteBuffer string, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithSource(context.getPointer(), 1, MemoryUtil.getAddress(string), string.remaining(), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithSource(long context, int count, long string, long string_lengths, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithSource. */ + public static CLProgram clCreateProgramWithSource(CLContext context, ByteBuffer strings, PointerBuffer lengths, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(strings, APIUtil.getSize(lengths)); + BufferChecks.checkBuffer(lengths, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithSource2(context.getPointer(), lengths.remaining(), MemoryUtil.getAddress(strings), MemoryUtil.getAddress(lengths), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithSource2(long context, int lengths_count, long strings, long lengths, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithSource. */ + public static CLProgram clCreateProgramWithSource(CLContext context, ByteBuffer[] strings, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithSource3(context.getPointer(), strings.length, strings, APIUtil.getLengths(strings), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithSource3(long context, int count, ByteBuffer[] strings, long lengths, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithSource. */ + public static CLProgram clCreateProgramWithSource(CLContext context, CharSequence string, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithSource; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithSource(context.getPointer(), 1, APIUtil.getBuffer(string), string.length(), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + + /** Overloads clCreateProgramWithSource. */ + public static CLProgram clCreateProgramWithSource(CLContext context, CharSequence[] strings, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithSource4(context.getPointer(), strings.length, APIUtil.getBuffer(strings), APIUtil.getLengths(strings), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithSource4(long context, int count, long strings, long lengths, long errcode_ret, long function_pointer); + + public static CLProgram clCreateProgramWithBinary(CLContext context, CLDevice device, ByteBuffer binary, IntBuffer binary_status, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithBinary; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(binary); + BufferChecks.checkBuffer(binary_status, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithBinary(context.getPointer(), 1, device.getPointer(), binary.remaining(), MemoryUtil.getAddress(binary), MemoryUtil.getAddress(binary_status), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithBinary(long context, int num_devices, long device, long binary_lengths, long binary, long binary_status, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithBinary. */ + public static CLProgram clCreateProgramWithBinary(CLContext context, PointerBuffer device_list, PointerBuffer lengths, ByteBuffer binaries, IntBuffer binary_status, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithBinary; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(device_list, 1); + BufferChecks.checkBuffer(lengths, device_list.remaining()); + BufferChecks.checkBuffer(binaries, APIUtil.getSize(lengths)); + BufferChecks.checkBuffer(binary_status, device_list.remaining()); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithBinary2(context.getPointer(), device_list.remaining(), MemoryUtil.getAddress(device_list), MemoryUtil.getAddress(lengths), MemoryUtil.getAddress(binaries), MemoryUtil.getAddress(binary_status), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithBinary2(long context, int device_list_num_devices, long device_list, long lengths, long binaries, long binary_status, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithBinary. */ + public static CLProgram clCreateProgramWithBinary(CLContext context, PointerBuffer device_list, ByteBuffer[] binaries, IntBuffer binary_status, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithBinary; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(device_list, binaries.length); + BufferChecks.checkArray(binaries, 1); + BufferChecks.checkBuffer(binary_status, binaries.length); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithBinary3(context.getPointer(), binaries.length, MemoryUtil.getAddress(device_list), APIUtil.getLengths(binaries), binaries, MemoryUtil.getAddress(binary_status), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithBinary3(long context, int num_devices, long device_list, long lengths, ByteBuffer[] binaries, long binary_status, long errcode_ret, long function_pointer); + + public static int clRetainProgram(CLProgram program) { + long function_pointer = CLCapabilities.clRetainProgram; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainProgram(program.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) program.retain(); + return __result; + } + static native int nclRetainProgram(long program, long function_pointer); + + public static int clReleaseProgram(CLProgram program) { + long function_pointer = CLCapabilities.clReleaseProgram; + BufferChecks.checkFunctionAddress(function_pointer); + APIUtil.releaseObjects(program); + int __result = nclReleaseProgram(program.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) program.release(); + return __result; + } + static native int nclReleaseProgram(long program, long function_pointer); + + public static int clBuildProgram(CLProgram program, PointerBuffer device_list, ByteBuffer options, CLBuildProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clBuildProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(options); + BufferChecks.checkNullTerminated(options); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclBuildProgram(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), MemoryUtil.getAddress(options), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclBuildProgram(long program, int device_list_num_devices, long device_list, long options, long pfn_notify, long user_data, long function_pointer); + + /** Overloads clBuildProgram. */ + public static int clBuildProgram(CLProgram program, PointerBuffer device_list, CharSequence options, CLBuildProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clBuildProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclBuildProgram(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), APIUtil.getBufferNT(options), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + + /** Overloads clBuildProgram. */ + public static int clBuildProgram(CLProgram program, CLDevice device, CharSequence options, CLBuildProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clBuildProgram; + BufferChecks.checkFunctionAddress(function_pointer); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclBuildProgram(program.getPointer(), 1, APIUtil.getPointer(device), APIUtil.getBufferNT(options), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + + public static int clUnloadCompiler() { + long function_pointer = CLCapabilities.clUnloadCompiler; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclUnloadCompiler(function_pointer); + return __result; + } + static native int nclUnloadCompiler(long function_pointer); + + public static int clGetProgramInfo(CLProgram program, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetProgramInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetProgramInfo(program.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetProgramInfo(long program, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + /** + * Overloads clGetProgramInfo. + * <p> + * This method can be used to get program binaries. The binary for each device (in the + * order returned by <code>CL_PROGRAM_DEVICES</code>) will be written sequentially to + * the <code>param_value</code> buffer. The buffer size must be big enough to hold + * all the binaries, as returned by <code>CL_PROGRAM_BINARY_SIZES</code>. + * <p> + * @param program the program + * @param param_value the buffers where the binaries will be written to. + * @param param_value_size_ret optional size result + * <p> + * @return the error code + */ + public static int clGetProgramInfo(CLProgram program, PointerBuffer sizes, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetProgramInfo; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizes, 1); + BufferChecks.checkBuffer(param_value, APIUtil.getSize(sizes)); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetProgramInfo2(program.getPointer(), CL_PROGRAM_BINARIES, sizes.remaining(), MemoryUtil.getAddress(sizes), MemoryUtil.getAddress(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetProgramInfo2(long program, int param_name, long sizes_len, long sizes, long param_value, long param_value_size_ret, long function_pointer); + + /** + * Overloads clGetProgramInfo. + * <p> + * This method can be used to get program binaries. The binary for each device (in the + * order returned by <code>CL_PROGRAM_DEVICES</code>) will be written to the corresponding + * slot of the <code>param_value</code> array. The size of each buffer must be big enough to + * hold the corresponding binary, as returned by <code>CL_PROGRAM_BINARY_SIZES</code>. + * <p> + * @param program the program + * @param param_value the buffers where the binaries will be written to. + * @param param_value_size_ret optional size result + * <p> + * @return the error code + */ + public static int clGetProgramInfo(CLProgram program, ByteBuffer[] param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetProgramInfo; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetProgramInfo3(program.getPointer(), CL_PROGRAM_BINARIES, param_value.length, param_value, MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetProgramInfo3(long program, int param_name, long param_value_len, ByteBuffer[] param_value, long param_value_size_ret, long function_pointer); + + public static int clGetProgramBuildInfo(CLProgram program, CLDevice device, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetProgramBuildInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetProgramBuildInfo(program.getPointer(), device.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetProgramBuildInfo(long program, long device, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static CLKernel clCreateKernel(CLProgram program, ByteBuffer kernel_name, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateKernel; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(kernel_name); + BufferChecks.checkNullTerminated(kernel_name); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLKernel __result = new CLKernel(nclCreateKernel(program.getPointer(), MemoryUtil.getAddress(kernel_name), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), program); + return __result; + } + static native long nclCreateKernel(long program, long kernel_name, long errcode_ret, long function_pointer); + + /** Overloads clCreateKernel. */ + public static CLKernel clCreateKernel(CLProgram program, CharSequence kernel_name, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateKernel; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLKernel __result = new CLKernel(nclCreateKernel(program.getPointer(), APIUtil.getBufferNT(kernel_name), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), program); + return __result; + } + + public static int clCreateKernelsInProgram(CLProgram program, PointerBuffer kernels, IntBuffer num_kernels_ret) { + long function_pointer = CLCapabilities.clCreateKernelsInProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (kernels != null) + BufferChecks.checkDirect(kernels); + if (num_kernels_ret != null) + BufferChecks.checkBuffer(num_kernels_ret, 1); + int __result = nclCreateKernelsInProgram(program.getPointer(), (kernels == null ? 0 : kernels.remaining()), MemoryUtil.getAddressSafe(kernels), MemoryUtil.getAddressSafe(num_kernels_ret), function_pointer); + if ( __result == CL_SUCCESS && kernels != null ) program.registerCLKernels(kernels); + return __result; + } + static native int nclCreateKernelsInProgram(long program, int kernels_num_kernels, long kernels, long num_kernels_ret, long function_pointer); + + public static int clRetainKernel(CLKernel kernel) { + long function_pointer = CLCapabilities.clRetainKernel; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainKernel(kernel.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) kernel.retain(); + return __result; + } + static native int nclRetainKernel(long kernel, long function_pointer); + + public static int clReleaseKernel(CLKernel kernel) { + long function_pointer = CLCapabilities.clReleaseKernel; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclReleaseKernel(kernel.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) kernel.release(); + return __result; + } + static native int nclReleaseKernel(long kernel, long function_pointer); + + public static int clSetKernelArg(CLKernel kernel, int arg_index, long arg_value_arg_size) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, arg_value_arg_size, 0L, function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, ByteBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, arg_value.remaining(), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, DoubleBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, (arg_value.remaining() << 3), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, FloatBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, (arg_value.remaining() << 2), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, IntBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, (arg_value.remaining() << 2), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, LongBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, (arg_value.remaining() << 3), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + public static int clSetKernelArg(CLKernel kernel, int arg_index, ShortBuffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arg_value); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, (arg_value.remaining() << 1), MemoryUtil.getAddress(arg_value), function_pointer); + return __result; + } + static native int nclSetKernelArg(long kernel, int arg_index, long arg_value_arg_size, long arg_value, long function_pointer); + + /** Overloads clSetKernelArg. */ + public static int clSetKernelArg(CLKernel kernel, int arg_index, CLObject arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, PointerBuffer.getPointerSize(), APIUtil.getPointerSafe(arg_value), function_pointer); + return __result; + } + + /** Overloads clSetKernelArg. */ + static int clSetKernelArg(CLKernel kernel, int arg_index, long arg_size, Buffer arg_value) { + long function_pointer = CLCapabilities.clSetKernelArg; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclSetKernelArg(kernel.getPointer(), arg_index, arg_size, MemoryUtil.getAddress0(arg_value), function_pointer); + return __result; + } + + public static int clGetKernelInfo(CLKernel kernel, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetKernelInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetKernelInfo(kernel.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetKernelInfo(long kernel, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clGetKernelWorkGroupInfo(CLKernel kernel, CLDevice device, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetKernelWorkGroupInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetKernelWorkGroupInfo(kernel.getPointer(), device == null ? 0 : device.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetKernelWorkGroupInfo(long kernel, long device, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clEnqueueNDRangeKernel(CLCommandQueue command_queue, CLKernel kernel, int work_dim, PointerBuffer global_work_offset, PointerBuffer global_work_size, PointerBuffer local_work_size, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueNDRangeKernel; + BufferChecks.checkFunctionAddress(function_pointer); + if (global_work_offset != null) + BufferChecks.checkBuffer(global_work_offset, work_dim); + if (global_work_size != null) + BufferChecks.checkBuffer(global_work_size, work_dim); + if (local_work_size != null) + BufferChecks.checkBuffer(local_work_size, work_dim); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueNDRangeKernel(command_queue.getPointer(), kernel.getPointer(), work_dim, MemoryUtil.getAddressSafe(global_work_offset), MemoryUtil.getAddressSafe(global_work_size), MemoryUtil.getAddressSafe(local_work_size), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueNDRangeKernel(long command_queue, long kernel, int work_dim, long global_work_offset, long global_work_size, long local_work_size, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueTask(CLCommandQueue command_queue, CLKernel kernel, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueTask; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueTask(command_queue.getPointer(), kernel.getPointer(), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueTask(long command_queue, long kernel, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + /** + * Enqueues a native kernel to the specified command queue. The <code>mem_list</code> parameter + * can be used to pass a list of <code>CLMem</code> objects that will be mapped to global memory space and + * exposed as a <code>ByteBuffer</code> array in the <code>CLNativeKernel#execute</code> method. The + * <code>sizes</code> parameter will be used to allocate direct <code>ByteBuffer</code>s with the correct + * capacities. The user is responsible for passing appropriate values to avoid crashes. + * <p> + * @param command_queue the command queue + * @param user_func the native kernel + * @param mem_list the CLMem objects + * @param sizes the CLMem object sizes + * @param event_wait_list the event wait list + * @param event the queue event + * <p> + * @return the error code + */ + public static int clEnqueueNativeKernel(CLCommandQueue command_queue, CLNativeKernel user_func, CLMem[] mem_list, long[] sizes, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueNativeKernel; + BufferChecks.checkFunctionAddress(function_pointer); + if (mem_list != null) + BufferChecks.checkArray(mem_list, 1); + if (sizes != null) + BufferChecks.checkArray(sizes, mem_list.length); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + long user_func_ref = CallbackUtil.createGlobalRef(user_func); + ByteBuffer args = APIUtil.getNativeKernelArgs(user_func_ref, mem_list, sizes); + int __result = 0; + try { + __result = nclEnqueueNativeKernel(command_queue.getPointer(), user_func.getPointer(), MemoryUtil.getAddress0(args), args.remaining(), mem_list == null ? 0 : mem_list.length, mem_list, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_func_ref); + } + } + static native int nclEnqueueNativeKernel(long command_queue, long user_func, long args, long args_cb_args, int num_mem_objects, CLMem[] mem_list, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clWaitForEvents(PointerBuffer event_list) { + long function_pointer = CLCapabilities.clWaitForEvents; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(event_list, 1); + int __result = nclWaitForEvents(event_list.remaining(), MemoryUtil.getAddress(event_list), function_pointer); + return __result; + } + static native int nclWaitForEvents(int event_list_num_events, long event_list, long function_pointer); + + /** Overloads clWaitForEvents. */ + public static int clWaitForEvents(CLEvent event) { + long function_pointer = CLCapabilities.clWaitForEvents; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclWaitForEvents(1, APIUtil.getPointer(event), function_pointer); + return __result; + } + + public static int clGetEventInfo(CLEvent event, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetEventInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetEventInfo(event.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetEventInfo(long event, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clRetainEvent(CLEvent event) { + long function_pointer = CLCapabilities.clRetainEvent; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainEvent(event.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) event.retain(); + return __result; + } + static native int nclRetainEvent(long event, long function_pointer); + + public static int clReleaseEvent(CLEvent event) { + long function_pointer = CLCapabilities.clReleaseEvent; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclReleaseEvent(event.getPointer(), function_pointer); + if ( __result == CL_SUCCESS ) event.release(); + return __result; + } + static native int nclReleaseEvent(long event, long function_pointer); + + public static int clEnqueueMarker(CLCommandQueue command_queue, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueMarker; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueMarker(command_queue.getPointer(), MemoryUtil.getAddress(event), function_pointer); + if ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueMarker(long command_queue, long event, long function_pointer); + + public static int clEnqueueBarrier(CLCommandQueue command_queue) { + long function_pointer = CLCapabilities.clEnqueueBarrier; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclEnqueueBarrier(command_queue.getPointer(), function_pointer); + return __result; + } + static native int nclEnqueueBarrier(long command_queue, long function_pointer); + + public static int clEnqueueWaitForEvents(CLCommandQueue command_queue, PointerBuffer event_list) { + long function_pointer = CLCapabilities.clEnqueueWaitForEvents; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(event_list, 1); + int __result = nclEnqueueWaitForEvents(command_queue.getPointer(), event_list.remaining(), MemoryUtil.getAddress(event_list), function_pointer); + return __result; + } + static native int nclEnqueueWaitForEvents(long command_queue, int event_list_num_events, long event_list, long function_pointer); + + /** Overloads clEnqueueWaitForEvents. */ + public static int clEnqueueWaitForEvents(CLCommandQueue command_queue, CLEvent event) { + long function_pointer = CLCapabilities.clEnqueueWaitForEvents; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclEnqueueWaitForEvents(command_queue.getPointer(), 1, APIUtil.getPointer(event), function_pointer); + return __result; + } + + public static int clGetEventProfilingInfo(CLEvent event, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetEventProfilingInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetEventProfilingInfo(event.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetEventProfilingInfo(long event, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clFlush(CLCommandQueue command_queue) { + long function_pointer = CLCapabilities.clFlush; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclFlush(command_queue.getPointer(), function_pointer); + return __result; + } + static native int nclFlush(long command_queue, long function_pointer); + + public static int clFinish(CLCommandQueue command_queue) { + long function_pointer = CLCapabilities.clFinish; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclFinish(command_queue.getPointer(), function_pointer); + return __result; + } + static native int nclFinish(long command_queue, long function_pointer); + + static CLFunctionAddress clGetExtensionFunctionAddress(ByteBuffer func_name) { + long function_pointer = CLCapabilities.clGetExtensionFunctionAddress; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(func_name); + BufferChecks.checkNullTerminated(func_name); + CLFunctionAddress __result = new CLFunctionAddress(nclGetExtensionFunctionAddress(MemoryUtil.getAddress(func_name), function_pointer)); + return __result; + } + static native long nclGetExtensionFunctionAddress(long func_name, long function_pointer); + + /** Overloads clGetExtensionFunctionAddress. */ + static CLFunctionAddress clGetExtensionFunctionAddress(CharSequence func_name) { + long function_pointer = CLCapabilities.clGetExtensionFunctionAddress; + BufferChecks.checkFunctionAddress(function_pointer); + CLFunctionAddress __result = new CLFunctionAddress(nclGetExtensionFunctionAddress(APIUtil.getBufferNT(func_name), function_pointer)); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10GL.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10GL.java new file mode 100644 index 0000000..e76652c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL10GL.java @@ -0,0 +1,146 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenCL 1.0 OpenGL interrop functionality. + */ +public final class CL10GL { + + /** + * cl_gl_object_type + */ + public static final int CL_GL_OBJECT_BUFFER = 0x2000, + CL_GL_OBJECT_TEXTURE2D = 0x2001, + CL_GL_OBJECT_TEXTURE3D = 0x2002, + CL_GL_OBJECT_RENDERBUFFER = 0x2003; + + /** + * cl_gl_texture_info + */ + public static final int CL_GL_TEXTURE_TARGET = 0x2004, + CL_GL_MIPMAP_LEVEL = 0x2005; + + private CL10GL() {} + + public static CLMem clCreateFromGLBuffer(CLContext context, long flags, int bufobj, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateFromGLBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateFromGLBuffer(context.getPointer(), flags, bufobj, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateFromGLBuffer(long context, long flags, int bufobj, long errcode_ret, long function_pointer); + + public static CLMem clCreateFromGLTexture2D(CLContext context, long flags, int target, int miplevel, int texture, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateFromGLTexture2D; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateFromGLTexture2D(context.getPointer(), flags, target, miplevel, texture, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateFromGLTexture2D(long context, long flags, int target, int miplevel, int texture, long errcode_ret, long function_pointer); + + public static CLMem clCreateFromGLTexture3D(CLContext context, long flags, int target, int miplevel, int texture, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateFromGLTexture3D; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateFromGLTexture3D(context.getPointer(), flags, target, miplevel, texture, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateFromGLTexture3D(long context, long flags, int target, int miplevel, int texture, long errcode_ret, long function_pointer); + + public static CLMem clCreateFromGLRenderbuffer(CLContext context, long flags, int renderbuffer, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateFromGLRenderbuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateFromGLRenderbuffer(context.getPointer(), flags, renderbuffer, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateFromGLRenderbuffer(long context, long flags, int renderbuffer, long errcode_ret, long function_pointer); + + public static int clGetGLObjectInfo(CLMem memobj, IntBuffer gl_object_type, IntBuffer gl_object_name) { + long function_pointer = CLCapabilities.clGetGLObjectInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (gl_object_type != null) + BufferChecks.checkBuffer(gl_object_type, 1); + if (gl_object_name != null) + BufferChecks.checkBuffer(gl_object_name, 1); + int __result = nclGetGLObjectInfo(memobj.getPointer(), MemoryUtil.getAddressSafe(gl_object_type), MemoryUtil.getAddressSafe(gl_object_name), function_pointer); + return __result; + } + static native int nclGetGLObjectInfo(long memobj, long gl_object_type, long gl_object_name, long function_pointer); + + public static int clGetGLTextureInfo(CLMem memobj, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetGLTextureInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetGLTextureInfo(memobj.getPointer(), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetGLTextureInfo(long memobj, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clEnqueueAcquireGLObjects(CLCommandQueue command_queue, PointerBuffer mem_objects, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueAcquireGLObjects; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(mem_objects, 1); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueAcquireGLObjects(command_queue.getPointer(), mem_objects.remaining(), MemoryUtil.getAddress(mem_objects), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueAcquireGLObjects(long command_queue, int mem_objects_num_objects, long mem_objects, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + /** Overloads clEnqueueAcquireGLObjects. */ + public static int clEnqueueAcquireGLObjects(CLCommandQueue command_queue, CLMem mem_object, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueAcquireGLObjects; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueAcquireGLObjects(command_queue.getPointer(), 1, APIUtil.getPointer(mem_object), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + + public static int clEnqueueReleaseGLObjects(CLCommandQueue command_queue, PointerBuffer mem_objects, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReleaseGLObjects; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(mem_objects, 1); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReleaseGLObjects(command_queue.getPointer(), mem_objects.remaining(), MemoryUtil.getAddress(mem_objects), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueReleaseGLObjects(long command_queue, int mem_objects_num_objects, long mem_objects, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + /** Overloads clEnqueueReleaseGLObjects. */ + public static int clEnqueueReleaseGLObjects(CLCommandQueue command_queue, CLMem mem_object, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReleaseGLObjects; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReleaseGLObjects(command_queue.getPointer(), 1, APIUtil.getPointer(mem_object), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL11.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL11.java new file mode 100644 index 0000000..c7c17d8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL11.java @@ -0,0 +1,350 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenCL 1.1 API + */ +public final class CL11 { + + /** + * Error Codes + */ + public static final int CL_MISALIGNED_SUB_BUFFER_OFFSET = 0xFFFFFFF3, + CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST = 0xFFFFFFF2, + CL_INVALID_PROPERTY = 0xFFFFFFC0; + + /** + * OpenCL Version + */ + public static final int CL_VERSION_1_1 = 0x1; + + /** + * cl_device_info + */ + public static final int CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF = 0x1034, + CL_DEVICE_HOST_UNIFIED_MEMORY = 0x1035, + CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR = 0x1036, + CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT = 0x1037, + CL_DEVICE_NATIVE_VECTOR_WIDTH_INT = 0x1038, + CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG = 0x1039, + CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT = 0x103A, + CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE = 0x103B, + CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF = 0x103C, + CL_DEVICE_OPENCL_C_VERSION = 0x103D; + + /** + * cl_device_fp_config - bitfield + */ + public static final int CL_FP_SOFT_FLOAT = 0x40; + + /** + * cl_context_info + */ + public static final int CL_CONTEXT_NUM_DEVICES = 0x1083; + + /** + * cl_channel_order + */ + public static final int CL_Rx = 0x10BA, + CL_RGx = 0x10BB, + CL_RGBx = 0x10BC; + + /** + * cl_mem_info + */ + public static final int CL_MEM_ASSOCIATED_MEMOBJECT = 0x1107, + CL_MEM_OFFSET = 0x1108; + + /** + * cl_addressing_mode + */ + public static final int CL_ADDRESS_MIRRORED_REPEAT = 0x1134; + + /** + * cl_kernel_work_group_info + */ + public static final int CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x11B3, + CL_KERNEL_PRIVATE_MEM_SIZE = 0x11B4; + + /** + * cl_event_info + */ + public static final int CL_EVENT_CONTEXT = 0x11D4; + + /** + * cl_command_type + */ + public static final int CL_COMMAND_READ_BUFFER_RECT = 0x1201, + CL_COMMAND_WRITE_BUFFER_RECT = 0x1202, + CL_COMMAND_COPY_BUFFER_RECT = 0x1203, + CL_COMMAND_USER = 0x1204; + + /** + * cl_buffer_create_type + */ + public static final int CL_BUFFER_CREATE_TYPE_REGION = 0x1220; + + private CL11() {} + + public static CLMem clCreateSubBuffer(CLMem buffer, long flags, int buffer_create_type, ByteBuffer buffer_create_info, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateSubBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_create_info, 2 * PointerBuffer.getPointerSize()); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = CLMem.create(nclCreateSubBuffer(buffer.getPointer(), flags, buffer_create_type, MemoryUtil.getAddress(buffer_create_info), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), buffer.getParent()); + return __result; + } + static native long nclCreateSubBuffer(long buffer, long flags, int buffer_create_type, long buffer_create_info, long errcode_ret, long function_pointer); + + public static int clSetMemObjectDestructorCallback(CLMem memobj, CLMemObjectDestructorCallback pfn_notify) { + long function_pointer = CLCapabilities.clSetMemObjectDestructorCallback; + BufferChecks.checkFunctionAddress(function_pointer); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + int __result = 0; + try { + __result = nclSetMemObjectDestructorCallback(memobj.getPointer(), pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclSetMemObjectDestructorCallback(long memobj, long pfn_notify, long user_data, long function_pointer); + + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, DoubleBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, LongBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueReadBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_read, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueReadBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueReadBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_read, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueReadBufferRect(long command_queue, long buffer, int blocking_read, long buffer_offset, long host_offset, long region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, ByteBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, DoubleBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, FloatBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, IntBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, LongBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + public static int clEnqueueWriteBufferRect(CLCommandQueue command_queue, CLMem buffer, int blocking_write, PointerBuffer buffer_offset, PointerBuffer host_offset, PointerBuffer region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, ShortBuffer ptr, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueWriteBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(buffer_offset, 3); + BufferChecks.checkBuffer(host_offset, 3); + BufferChecks.checkBuffer(region, 3); + BufferChecks.checkBuffer(ptr, CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueWriteBufferRect(command_queue.getPointer(), buffer.getPointer(), blocking_write, MemoryUtil.getAddress(buffer_offset), MemoryUtil.getAddress(host_offset), MemoryUtil.getAddress(region), buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, MemoryUtil.getAddress(ptr), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueWriteBufferRect(long command_queue, long buffer, int blocking_write, long buffer_offset, long host_offset, long region, long buffer_row_pitch, long buffer_slice_pitch, long host_row_pitch, long host_slice_pitch, long ptr, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueCopyBufferRect(CLCommandQueue command_queue, CLMem src_buffer, CLMem dst_buffer, PointerBuffer src_origin, PointerBuffer dst_origin, PointerBuffer region, long src_row_pitch, long src_slice_pitch, long dst_row_pitch, long dst_slice_pitch, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueCopyBufferRect; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(src_origin, 3); + BufferChecks.checkBuffer(dst_origin, 3); + BufferChecks.checkBuffer(region, 3); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueCopyBufferRect(command_queue.getPointer(), src_buffer.getPointer(), dst_buffer.getPointer(), MemoryUtil.getAddress(src_origin), MemoryUtil.getAddress(dst_origin), MemoryUtil.getAddress(region), src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueCopyBufferRect(long command_queue, long src_buffer, long dst_buffer, long src_origin, long dst_origin, long region, long src_row_pitch, long src_slice_pitch, long dst_row_pitch, long dst_slice_pitch, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static CLEvent clCreateUserEvent(CLContext context, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateUserEvent; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLEvent __result = new CLEvent(nclCreateUserEvent(context.getPointer(), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateUserEvent(long context, long errcode_ret, long function_pointer); + + public static int clSetUserEventStatus(CLEvent event, int execution_status) { + long function_pointer = CLCapabilities.clSetUserEventStatus; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclSetUserEventStatus(event.getPointer(), execution_status, function_pointer); + return __result; + } + static native int nclSetUserEventStatus(long event, int execution_status, long function_pointer); + + public static int clSetEventCallback(CLEvent event, int command_exec_callback_type, CLEventCallback pfn_notify) { + long function_pointer = CLCapabilities.clSetEventCallback; + BufferChecks.checkFunctionAddress(function_pointer); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + pfn_notify.setRegistry(event.getParentRegistry()); + int __result = 0; + try { + __result = nclSetEventCallback(event.getPointer(), command_exec_callback_type, pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclSetEventCallback(long event, int command_exec_callback_type, long pfn_notify, long user_data, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12.java new file mode 100644 index 0000000..a93eecb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12.java @@ -0,0 +1,495 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenCL 1.1 API + */ +public final class CL12 { + + /** + * Error Codes + */ + public static final int CL_COMPILE_PROGRAM_FAILURE = 0xFFFFFFF1, + CL_LINKER_NOT_AVAILABLE = 0xFFFFFFF0, + CL_LINK_PROGRAM_FAILURE = 0xFFFFFFEF, + CL_DEVICE_PARTITION_FAILED = 0xFFFFFFEE, + CL_KERNEL_ARG_INFO_NOT_AVAILABLE = 0xFFFFFFED, + CL_INVALID_IMAGE_DESCRIPTOR = 0xFFFFFFBF, + CL_INVALID_COMPILER_OPTIONS = 0xFFFFFFBE, + CL_INVALID_LINKER_OPTIONS = 0xFFFFFFBD, + CL_INVALID_DEVICE_PARTITION_COUNT = 0xFFFFFFBC; + + /** + * OpenCL Version + */ + public static final int CL_VERSION_1_2 = 0x1; + + /** + * cl_bool + */ + public static final int CL_BLOCKING = 0x1, + CL_NON_BLOCKING = 0x0; + + /** + * cl_device_type - bitfield + */ + public static final int CL_DEVICE_TYPE_CUSTOM = 0x10, + CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032, + CL_DEVICE_LINKER_AVAILABLE = 0x103E, + CL_DEVICE_BUILT_IN_KERNELS = 0x103F, + CL_DEVICE_IMAGE_MAX_BUFFER_SIZE = 0x1040, + CL_DEVICE_IMAGE_MAX_ARRAY_SIZE = 0x1041, + CL_DEVICE_PARENT_DEVICE = 0x1042, + CL_DEVICE_PARTITION_MAX_SUB_DEVICES = 0x1043, + CL_DEVICE_PARTITION_PROPERTIES = 0x1044, + CL_DEVICE_PARTITION_AFFINITY_DOMAIN = 0x1045, + CL_DEVICE_PARTITION_TYPE = 0x1046, + CL_DEVICE_REFERENCE_COUNT = 0x1047, + CL_DEVICE_PREFERRED_INTEROP_USER_SYNC = 0x1048, + CL_DEVICE_PRINTF_BUFFER_SIZE = 0x1049, + CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT = 0x80, + CL_CONTEXT_INTEROP_USER_SYNC = 0x1085, + CL_DEVICE_PARTITION_EQUALLY = 0x1086, + CL_DEVICE_PARTITION_BY_COUNTS = 0x1087, + CL_DEVICE_PARTITION_BY_COUNTS_LIST_END = 0x0, + CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN = 0x1088, + CL_DEVICE_AFFINITY_DOMAIN_NUMA = 0x1, + CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE = 0x2, + CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE = 0x4, + CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE = 0x8, + CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE = 0x10, + CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE = 0x20, + CL_MEM_HOST_WRITE_ONLY = 0x80, + CL_MEM_HOST_READ_ONLY = 0x100, + CL_MEM_HOST_NO_ACCESS = 0x200, + CL_MIGRATE_MEM_OBJECT_HOST = 0x1, + CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED = 0x2, + CL_MEM_OBJECT_IMAGE2D_ARRAY = 0x10F3, + CL_MEM_OBJECT_IMAGE1D = 0x10F4, + CL_MEM_OBJECT_IMAGE1D_ARRAY = 0x10F5, + CL_MEM_OBJECT_IMAGE1D_BUFFER = 0x10F6, + CL_IMAGE_ARRAY_SIZE = 0x1117, + CL_IMAGE_BUFFER = 0x1118, + CL_IMAGE_NUM_MIP_LEVELS = 0x1119, + CL_IMAGE_NUM_SAMPLES = 0x111A, + CL_MAP_WRITE_INVALIDATE_REGION = 0x4, + CL_PROGRAM_NUM_KERNELS = 0x1167, + CL_PROGRAM_KERNEL_NAMES = 0x1168, + CL_PROGRAM_BINARY_TYPE = 0x1184, + CL_PROGRAM_BINARY_TYPE_NONE = 0x0, + CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT = 0x1, + CL_PROGRAM_BINARY_TYPE_LIBRARY = 0x2, + CL_PROGRAM_BINARY_TYPE_EXECUTABLE = 0x4, + CL_KERNEL_ATTRIBUTES = 0x1195, + CL_KERNEL_ARG_ADDRESS_QUALIFIER = 0x1196, + CL_KERNEL_ARG_ACCESS_QUALIFIER = 0x1197, + CL_KERNEL_ARG_TYPE_NAME = 0x1198, + CL_KERNEL_ARG_TYPE_QUALIFIER = 0x1199, + CL_KERNEL_ARG_NAME = 0x119A, + CL_KERNEL_ARG_ADDRESS_GLOBAL = 0x119A, + CL_KERNEL_ARG_ADDRESS_LOCAL = 0x119B, + CL_KERNEL_ARG_ADDRESS_CONSTANT = 0x119C, + CL_KERNEL_ARG_ADDRESS_PRIVATE = 0x119D, + CL_KERNEL_ARG_ACCESS_READ_ONLY = 0x11A0, + CL_KERNEL_ARG_ACCESS_WRITE_ONLY = 0x11A1, + CL_KERNEL_ARG_ACCESS_READ_WRITE = 0x11A2, + CL_KERNEL_ARG_ACCESS_NONE = 0x11A3, + CL_KERNEL_ARG_TYPE_NONE = 0x0, + CL_KERNEL_ARG_TYPE_CONST = 0x1, + CL_KERNEL_ARG_TYPE_RESTRICT = 0x2, + CL_KERNEL_ARG_TYPE_VOLATILE = 0x4, + CL_KERNEL_GLOBAL_WORK_SIZE = 0x11B5, + CL_COMMAND_BARRIER = 0x1205, + CL_COMMAND_MIGRATE_MEM_OBJECTS = 0x1206, + CL_COMMAND_FILL_BUFFER = 0x1207, + CL_COMMAND_FILL_IMAGE = 0x1208; + + private CL12() {} + + public static int clRetainDevice(CLDevice device) { + long function_pointer = CLCapabilities.clRetainDevice; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainDevice(device.getPointer(), function_pointer); + if ( __result == CL10.CL_SUCCESS ) device.retain(); + return __result; + } + static native int nclRetainDevice(long device, long function_pointer); + + /** + * Warning: LWJGL will not automatically release any objects associated with sub-devices. + * The user is responsible for tracking and releasing everything prior to calling this method. + * <p> + * @param device the parent CLDevice + * <p> + * @return the error code + */ + public static int clReleaseDevice(CLDevice device) { + long function_pointer = CLCapabilities.clReleaseDevice; + BufferChecks.checkFunctionAddress(function_pointer); + APIUtil.releaseObjects(device); + int __result = nclReleaseDevice(device.getPointer(), function_pointer); + if ( __result == CL10.CL_SUCCESS ) device.release(); + return __result; + } + static native int nclReleaseDevice(long device, long function_pointer); + + public static int clCreateSubDevices(CLDevice in_device, LongBuffer properties, PointerBuffer out_devices, IntBuffer num_devices_ret) { + long function_pointer = CLCapabilities.clCreateSubDevices; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(properties); + BufferChecks.checkNullTerminated(properties); + if (out_devices != null) + BufferChecks.checkDirect(out_devices); + if (num_devices_ret != null) + BufferChecks.checkBuffer(num_devices_ret, 1); + int __result = nclCreateSubDevices(in_device.getPointer(), MemoryUtil.getAddress(properties), (out_devices == null ? 0 : out_devices.remaining()), MemoryUtil.getAddressSafe(out_devices), MemoryUtil.getAddressSafe(num_devices_ret), function_pointer); + if ( __result == CL10.CL_SUCCESS && out_devices != null ) in_device.registerSubCLDevices(out_devices); + return __result; + } + static native int nclCreateSubDevices(long in_device, long properties, int out_devices_num_devices, long out_devices, long num_devices_ret, long function_pointer); + + public static CLMem clCreateImage(CLContext context, long flags, ByteBuffer image_format, ByteBuffer image_desc, ByteBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + BufferChecks.checkBuffer(image_desc, 7 * PointerBuffer.getPointerSize() + 2 * 4 + PointerBuffer.getPointerSize()); + if (host_ptr != null) + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage(context.getPointer(), flags, MemoryUtil.getAddress(image_format), MemoryUtil.getAddress(image_desc), MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage(CLContext context, long flags, ByteBuffer image_format, ByteBuffer image_desc, FloatBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + BufferChecks.checkBuffer(image_desc, 7 * PointerBuffer.getPointerSize() + 2 * 4 + PointerBuffer.getPointerSize()); + if (host_ptr != null) + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage(context.getPointer(), flags, MemoryUtil.getAddress(image_format), MemoryUtil.getAddress(image_desc), MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage(CLContext context, long flags, ByteBuffer image_format, ByteBuffer image_desc, IntBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + BufferChecks.checkBuffer(image_desc, 7 * PointerBuffer.getPointerSize() + 2 * 4 + PointerBuffer.getPointerSize()); + if (host_ptr != null) + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage(context.getPointer(), flags, MemoryUtil.getAddress(image_format), MemoryUtil.getAddress(image_desc), MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + public static CLMem clCreateImage(CLContext context, long flags, ByteBuffer image_format, ByteBuffer image_desc, ShortBuffer host_ptr, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(image_format, 2 * 4); + BufferChecks.checkBuffer(image_desc, 7 * PointerBuffer.getPointerSize() + 2 * 4 + PointerBuffer.getPointerSize()); + if (host_ptr != null) + BufferChecks.checkDirect(host_ptr); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateImage(context.getPointer(), flags, MemoryUtil.getAddress(image_format), MemoryUtil.getAddress(image_desc), MemoryUtil.getAddressSafe(host_ptr), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateImage(long context, long flags, long image_format, long image_desc, long host_ptr, long errcode_ret, long function_pointer); + + public static CLProgram clCreateProgramWithBuiltInKernels(CLContext context, PointerBuffer device_list, ByteBuffer kernel_names, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithBuiltInKernels; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(device_list, 1); + BufferChecks.checkDirect(kernel_names); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithBuiltInKernels(context.getPointer(), device_list.remaining(), MemoryUtil.getAddress(device_list), MemoryUtil.getAddress(kernel_names), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateProgramWithBuiltInKernels(long context, int device_list_num_devices, long device_list, long kernel_names, long errcode_ret, long function_pointer); + + /** Overloads clCreateProgramWithBuiltInKernels. */ + public static CLProgram clCreateProgramWithBuiltInKernels(CLContext context, PointerBuffer device_list, CharSequence kernel_names, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateProgramWithBuiltInKernels; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(device_list, 1); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLProgram __result = new CLProgram(nclCreateProgramWithBuiltInKernels(context.getPointer(), device_list.remaining(), MemoryUtil.getAddress(device_list), APIUtil.getBuffer(kernel_names), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + + /** + * Single null-terminated header include name. + */ + public static int clCompileProgram(CLProgram program, PointerBuffer device_list, ByteBuffer options, PointerBuffer input_header, ByteBuffer header_include_name, CLCompileProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clCompileProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(options); + BufferChecks.checkNullTerminated(options); + BufferChecks.checkBuffer(input_header, 1); + BufferChecks.checkDirect(header_include_name); + BufferChecks.checkNullTerminated(header_include_name); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclCompileProgram(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), MemoryUtil.getAddress(options), 1, MemoryUtil.getAddress(input_header), MemoryUtil.getAddress(header_include_name), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclCompileProgram(long program, int device_list_num_devices, long device_list, long options, int num_input_headers, long input_header, long header_include_name, long pfn_notify, long user_data, long function_pointer); + + /** + * Overloads clCompileProgram. + * <p> + * Multiple null-terminated header include names, one after the other. + */ + public static int clCompileProgramMulti(CLProgram program, PointerBuffer device_list, ByteBuffer options, PointerBuffer input_headers, ByteBuffer header_include_names, CLCompileProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clCompileProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(options); + BufferChecks.checkNullTerminated(options); + BufferChecks.checkBuffer(input_headers, 1); + BufferChecks.checkDirect(header_include_names); + BufferChecks.checkNullTerminated(header_include_names, input_headers.remaining()); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclCompileProgramMulti(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), MemoryUtil.getAddress(options), input_headers.remaining(), MemoryUtil.getAddress(input_headers), MemoryUtil.getAddress(header_include_names), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclCompileProgramMulti(long program, int device_list_num_devices, long device_list, long options, int input_headers_num_input_headers, long input_headers, long header_include_names, long pfn_notify, long user_data, long function_pointer); + + /** Overloads clCompileProgram. */ + public static int clCompileProgram(CLProgram program, PointerBuffer device_list, ByteBuffer options, PointerBuffer input_headers, ByteBuffer[] header_include_names, CLCompileProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clCompileProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(options); + BufferChecks.checkNullTerminated(options); + BufferChecks.checkBuffer(input_headers, header_include_names.length); + BufferChecks.checkArray(header_include_names, 1); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclCompileProgram3(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), MemoryUtil.getAddress(options), header_include_names.length, MemoryUtil.getAddress(input_headers), header_include_names, pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + static native int nclCompileProgram3(long program, int device_list_num_devices, long device_list, long options, int num_input_headers, long input_headers, ByteBuffer[] header_include_names, long pfn_notify, long user_data, long function_pointer); + + /** Overloads clCompileProgram. */ + public static int clCompileProgram(CLProgram program, PointerBuffer device_list, CharSequence options, PointerBuffer input_header, CharSequence header_include_name, CLCompileProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clCompileProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkBuffer(input_header, 1); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclCompileProgram(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), APIUtil.getBufferNT(options), 1, MemoryUtil.getAddress(input_header), APIUtil.getBufferNT(header_include_name), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + + /** Overloads clCompileProgram. */ + public static int clCompileProgram(CLProgram program, PointerBuffer device_list, CharSequence options, PointerBuffer input_header, CharSequence[] header_include_name, CLCompileProgramCallback pfn_notify) { + long function_pointer = CLCapabilities.clCompileProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkBuffer(input_header, 1); + BufferChecks.checkArray(header_include_name); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(program.getParent()); + int __result = 0; + try { + __result = nclCompileProgramMulti(program.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), APIUtil.getBufferNT(options), input_header.remaining(), MemoryUtil.getAddress(input_header), APIUtil.getBufferNT(header_include_name), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + CallbackUtil.checkCallback(__result, user_data); + } + } + + public static CLProgram clLinkProgram(CLContext context, PointerBuffer device_list, ByteBuffer options, PointerBuffer input_programs, CLLinkProgramCallback pfn_notify, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clLinkProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(options); + BufferChecks.checkNullTerminated(options); + BufferChecks.checkDirect(input_programs); + BufferChecks.checkBuffer(errcode_ret, 1); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(context); + CLProgram __result = null; + try { + __result = new CLProgram(nclLinkProgram(context.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), MemoryUtil.getAddress(options), input_programs.remaining(), MemoryUtil.getAddress(input_programs), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddress(errcode_ret), function_pointer), context); + return __result; + } finally { + CallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data); + } + } + static native long nclLinkProgram(long context, int device_list_num_devices, long device_list, long options, int input_programs_num_input_programs, long input_programs, long pfn_notify, long user_data, long errcode_ret, long function_pointer); + + /** Overloads clLinkProgram. */ + public static CLProgram clLinkProgram(CLContext context, PointerBuffer device_list, CharSequence options, PointerBuffer input_programs, CLLinkProgramCallback pfn_notify, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clLinkProgram; + BufferChecks.checkFunctionAddress(function_pointer); + if (device_list != null) + BufferChecks.checkDirect(device_list); + BufferChecks.checkDirect(input_programs); + BufferChecks.checkBuffer(errcode_ret, 1); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + if ( pfn_notify != null ) pfn_notify.setContext(context); + CLProgram __result = null; + try { + __result = new CLProgram(nclLinkProgram(context.getPointer(), (device_list == null ? 0 : device_list.remaining()), MemoryUtil.getAddressSafe(device_list), APIUtil.getBufferNT(options), input_programs.remaining(), MemoryUtil.getAddress(input_programs), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddress(errcode_ret), function_pointer), context); + return __result; + } finally { + CallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data); + } + } + + public static int clUnloadPlatformCompiler(CLPlatform platform) { + long function_pointer = CLCapabilities.clUnloadPlatformCompiler; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclUnloadPlatformCompiler(platform.getPointer(), function_pointer); + return __result; + } + static native int nclUnloadPlatformCompiler(long platform, long function_pointer); + + public static int clGetKernelArgInfo(CLKernel kernel, int arg_indx, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetKernelArgInfo; + BufferChecks.checkFunctionAddress(function_pointer); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetKernelArgInfo(kernel.getPointer(), arg_indx, param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetKernelArgInfo(long kernel, int arg_indx, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); + + public static int clEnqueueFillBuffer(CLCommandQueue command_queue, CLMem buffer, ByteBuffer pattern, long offset, long size, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueFillBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pattern); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueFillBuffer(command_queue.getPointer(), buffer.getPointer(), MemoryUtil.getAddress(pattern), pattern.remaining(), offset, size, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + return __result; + } + static native int nclEnqueueFillBuffer(long command_queue, long buffer, long pattern, long pattern_pattern_size, long offset, long size, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueFillImage(CLCommandQueue command_queue, CLMem image, ByteBuffer fill_color, PointerBuffer origin, PointerBuffer region, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueFillImage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(fill_color, 4 * 4); + BufferChecks.checkBuffer(origin, 3); + BufferChecks.checkBuffer(region, 3); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueFillImage(command_queue.getPointer(), image.getPointer(), MemoryUtil.getAddress(fill_color), MemoryUtil.getAddress(origin), MemoryUtil.getAddress(region), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + return __result; + } + static native int nclEnqueueFillImage(long command_queue, long image, long fill_color, long origin, long region, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueMigrateMemObjects(CLCommandQueue command_queue, PointerBuffer mem_objects, long flags, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueMigrateMemObjects; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(mem_objects); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueMigrateMemObjects(command_queue.getPointer(), mem_objects.remaining(), MemoryUtil.getAddress(mem_objects), flags, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + return __result; + } + static native int nclEnqueueMigrateMemObjects(long command_queue, int mem_objects_num_mem_objects, long mem_objects, long flags, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueMarkerWithWaitList(CLCommandQueue command_queue, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueMarkerWithWaitList; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueMarkerWithWaitList(command_queue.getPointer(), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + return __result; + } + static native int nclEnqueueMarkerWithWaitList(long command_queue, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clEnqueueBarrierWithWaitList(CLCommandQueue command_queue, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueBarrierWithWaitList; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueBarrierWithWaitList(command_queue.getPointer(), (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + return __result; + } + static native int nclEnqueueBarrierWithWaitList(long command_queue, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + public static int clSetPrintfCallback(CLContext context, CLPrintfCallback pfn_notify) { + long function_pointer = CLCapabilities.clSetPrintfCallback; + BufferChecks.checkFunctionAddress(function_pointer); + long user_data = CallbackUtil.createGlobalRef(pfn_notify); + int __result = 0; + try { + __result = nclSetPrintfCallback(context.getPointer(), pfn_notify.getPointer(), user_data, function_pointer); + return __result; + } finally { + context.setPrintfCallback(user_data, __result); + } + } + static native int nclSetPrintfCallback(long context, long pfn_notify, long user_data, long function_pointer); + + static CLFunctionAddress clGetExtensionFunctionAddressForPlatform(CLPlatform platform, ByteBuffer func_name) { + long function_pointer = CLCapabilities.clGetExtensionFunctionAddressForPlatform; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(func_name); + BufferChecks.checkNullTerminated(func_name); + CLFunctionAddress __result = new CLFunctionAddress(nclGetExtensionFunctionAddressForPlatform(platform.getPointer(), MemoryUtil.getAddress(func_name), function_pointer)); + return __result; + } + static native long nclGetExtensionFunctionAddressForPlatform(long platform, long func_name, long function_pointer); + + /** Overloads clGetExtensionFunctionAddressForPlatform. */ + static CLFunctionAddress clGetExtensionFunctionAddressForPlatform(CLPlatform platform, CharSequence func_name) { + long function_pointer = CLCapabilities.clGetExtensionFunctionAddressForPlatform; + BufferChecks.checkFunctionAddress(function_pointer); + CLFunctionAddress __result = new CLFunctionAddress(nclGetExtensionFunctionAddressForPlatform(platform.getPointer(), APIUtil.getBufferNT(func_name), function_pointer)); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12GL.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12GL.java new file mode 100644 index 0000000..d3d5849 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CL12GL.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenCL 1.2 OpenGL interrop functionality. + */ +public final class CL12GL { + + public static final int CL_GL_OBJECT_TEXTURE2D_ARRAY = 0x200E, + CL_GL_OBJECT_TEXTURE1D = 0x200F, + CL_GL_OBJECT_TEXTURE1D_ARRAY = 0x2010, + CL_GL_OBJECT_TEXTURE_BUFFER = 0x2011; + + private CL12GL() {} + + public static CLMem clCreateFromGLTexture(CLContext context, long flags, int target, int miplevel, int texture, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateFromGLTexture; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLMem __result = new CLMem(nclCreateFromGLTexture(context.getPointer(), flags, target, miplevel, texture, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateFromGLTexture(long context, long flags, int target, int miplevel, int texture, long errcode_ret, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLCapabilities.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLCapabilities.java new file mode 100644 index 0000000..74ef390 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLCapabilities.java @@ -0,0 +1,362 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +public final class CLCapabilities { + + static final boolean CL_APPLE_ContextLoggingFunctions; + static final long clLogMessagesToSystemLogAPPLE = CL.getFunctionAddress("clLogMessagesToSystemLogAPPLE"); + static final long clLogMessagesToStdoutAPPLE = CL.getFunctionAddress("clLogMessagesToStdoutAPPLE"); + static final long clLogMessagesToStderrAPPLE = CL.getFunctionAddress("clLogMessagesToStderrAPPLE"); + + static final boolean CL_APPLE_SetMemObjectDestructor; + static final long clSetMemObjectDestructorAPPLE = CL.getFunctionAddress("clSetMemObjectDestructorAPPLE"); + + static final boolean CL_APPLE_gl_sharing; + static final long clGetGLContextInfoAPPLE = CL.getFunctionAddress("clGetGLContextInfoAPPLE"); + + static final boolean OpenCL10; + static final long clGetPlatformIDs = CL.getFunctionAddress("clGetPlatformIDs"); + static final long clGetPlatformInfo = CL.getFunctionAddress("clGetPlatformInfo"); + static final long clGetDeviceIDs = CL.getFunctionAddress("clGetDeviceIDs"); + static final long clGetDeviceInfo = CL.getFunctionAddress("clGetDeviceInfo"); + static final long clCreateContext = CL.getFunctionAddress("clCreateContext"); + static final long clCreateContextFromType = CL.getFunctionAddress("clCreateContextFromType"); + static final long clRetainContext = CL.getFunctionAddress("clRetainContext"); + static final long clReleaseContext = CL.getFunctionAddress("clReleaseContext"); + static final long clGetContextInfo = CL.getFunctionAddress("clGetContextInfo"); + static final long clCreateCommandQueue = CL.getFunctionAddress("clCreateCommandQueue"); + static final long clRetainCommandQueue = CL.getFunctionAddress("clRetainCommandQueue"); + static final long clReleaseCommandQueue = CL.getFunctionAddress("clReleaseCommandQueue"); + static final long clGetCommandQueueInfo = CL.getFunctionAddress("clGetCommandQueueInfo"); + static final long clCreateBuffer = CL.getFunctionAddress("clCreateBuffer"); + static final long clEnqueueReadBuffer = CL.getFunctionAddress("clEnqueueReadBuffer"); + static final long clEnqueueWriteBuffer = CL.getFunctionAddress("clEnqueueWriteBuffer"); + static final long clEnqueueCopyBuffer = CL.getFunctionAddress("clEnqueueCopyBuffer"); + static final long clEnqueueMapBuffer = CL.getFunctionAddress("clEnqueueMapBuffer"); + static final long clCreateImage2D = CL.getFunctionAddress("clCreateImage2D"); + static final long clCreateImage3D = CL.getFunctionAddress("clCreateImage3D"); + static final long clGetSupportedImageFormats = CL.getFunctionAddress("clGetSupportedImageFormats"); + static final long clEnqueueReadImage = CL.getFunctionAddress("clEnqueueReadImage"); + static final long clEnqueueWriteImage = CL.getFunctionAddress("clEnqueueWriteImage"); + static final long clEnqueueCopyImage = CL.getFunctionAddress("clEnqueueCopyImage"); + static final long clEnqueueCopyImageToBuffer = CL.getFunctionAddress("clEnqueueCopyImageToBuffer"); + static final long clEnqueueCopyBufferToImage = CL.getFunctionAddress("clEnqueueCopyBufferToImage"); + static final long clEnqueueMapImage = CL.getFunctionAddress("clEnqueueMapImage"); + static final long clGetImageInfo = CL.getFunctionAddress("clGetImageInfo"); + static final long clRetainMemObject = CL.getFunctionAddress("clRetainMemObject"); + static final long clReleaseMemObject = CL.getFunctionAddress("clReleaseMemObject"); + static final long clEnqueueUnmapMemObject = CL.getFunctionAddress("clEnqueueUnmapMemObject"); + static final long clGetMemObjectInfo = CL.getFunctionAddress("clGetMemObjectInfo"); + static final long clCreateSampler = CL.getFunctionAddress("clCreateSampler"); + static final long clRetainSampler = CL.getFunctionAddress("clRetainSampler"); + static final long clReleaseSampler = CL.getFunctionAddress("clReleaseSampler"); + static final long clGetSamplerInfo = CL.getFunctionAddress("clGetSamplerInfo"); + static final long clCreateProgramWithSource = CL.getFunctionAddress("clCreateProgramWithSource"); + static final long clCreateProgramWithBinary = CL.getFunctionAddress("clCreateProgramWithBinary"); + static final long clRetainProgram = CL.getFunctionAddress("clRetainProgram"); + static final long clReleaseProgram = CL.getFunctionAddress("clReleaseProgram"); + static final long clBuildProgram = CL.getFunctionAddress("clBuildProgram"); + static final long clUnloadCompiler = CL.getFunctionAddress("clUnloadCompiler"); + static final long clGetProgramInfo = CL.getFunctionAddress("clGetProgramInfo"); + static final long clGetProgramBuildInfo = CL.getFunctionAddress("clGetProgramBuildInfo"); + static final long clCreateKernel = CL.getFunctionAddress("clCreateKernel"); + static final long clCreateKernelsInProgram = CL.getFunctionAddress("clCreateKernelsInProgram"); + static final long clRetainKernel = CL.getFunctionAddress("clRetainKernel"); + static final long clReleaseKernel = CL.getFunctionAddress("clReleaseKernel"); + static final long clSetKernelArg = CL.getFunctionAddress("clSetKernelArg"); + static final long clGetKernelInfo = CL.getFunctionAddress("clGetKernelInfo"); + static final long clGetKernelWorkGroupInfo = CL.getFunctionAddress("clGetKernelWorkGroupInfo"); + static final long clEnqueueNDRangeKernel = CL.getFunctionAddress("clEnqueueNDRangeKernel"); + static final long clEnqueueTask = CL.getFunctionAddress("clEnqueueTask"); + static final long clEnqueueNativeKernel = CL.getFunctionAddress("clEnqueueNativeKernel"); + static final long clWaitForEvents = CL.getFunctionAddress("clWaitForEvents"); + static final long clGetEventInfo = CL.getFunctionAddress("clGetEventInfo"); + static final long clRetainEvent = CL.getFunctionAddress("clRetainEvent"); + static final long clReleaseEvent = CL.getFunctionAddress("clReleaseEvent"); + static final long clEnqueueMarker = CL.getFunctionAddress("clEnqueueMarker"); + static final long clEnqueueBarrier = CL.getFunctionAddress("clEnqueueBarrier"); + static final long clEnqueueWaitForEvents = CL.getFunctionAddress("clEnqueueWaitForEvents"); + static final long clGetEventProfilingInfo = CL.getFunctionAddress("clGetEventProfilingInfo"); + static final long clFlush = CL.getFunctionAddress("clFlush"); + static final long clFinish = CL.getFunctionAddress("clFinish"); + static final long clGetExtensionFunctionAddress = CL.getFunctionAddress("clGetExtensionFunctionAddress"); + + static final boolean OpenCL10GL; + static final long clCreateFromGLBuffer = CL.getFunctionAddress("clCreateFromGLBuffer"); + static final long clCreateFromGLTexture2D = CL.getFunctionAddress("clCreateFromGLTexture2D"); + static final long clCreateFromGLTexture3D = CL.getFunctionAddress("clCreateFromGLTexture3D"); + static final long clCreateFromGLRenderbuffer = CL.getFunctionAddress("clCreateFromGLRenderbuffer"); + static final long clGetGLObjectInfo = CL.getFunctionAddress("clGetGLObjectInfo"); + static final long clGetGLTextureInfo = CL.getFunctionAddress("clGetGLTextureInfo"); + static final long clEnqueueAcquireGLObjects = CL.getFunctionAddress("clEnqueueAcquireGLObjects"); + static final long clEnqueueReleaseGLObjects = CL.getFunctionAddress("clEnqueueReleaseGLObjects"); + + static final boolean OpenCL11; + static final long clCreateSubBuffer = CL.getFunctionAddress("clCreateSubBuffer"); + static final long clSetMemObjectDestructorCallback = CL.getFunctionAddress("clSetMemObjectDestructorCallback"); + static final long clEnqueueReadBufferRect = CL.getFunctionAddress("clEnqueueReadBufferRect"); + static final long clEnqueueWriteBufferRect = CL.getFunctionAddress("clEnqueueWriteBufferRect"); + static final long clEnqueueCopyBufferRect = CL.getFunctionAddress("clEnqueueCopyBufferRect"); + static final long clCreateUserEvent = CL.getFunctionAddress("clCreateUserEvent"); + static final long clSetUserEventStatus = CL.getFunctionAddress("clSetUserEventStatus"); + static final long clSetEventCallback = CL.getFunctionAddress("clSetEventCallback"); + + static final boolean OpenCL12; + static final long clRetainDevice = CL.getFunctionAddress("clRetainDevice"); + static final long clReleaseDevice = CL.getFunctionAddress("clReleaseDevice"); + static final long clCreateSubDevices = CL.getFunctionAddress("clCreateSubDevices"); + static final long clCreateImage = CL.getFunctionAddress("clCreateImage"); + static final long clCreateProgramWithBuiltInKernels = CL.getFunctionAddress("clCreateProgramWithBuiltInKernels"); + static final long clCompileProgram = CL.getFunctionAddress("clCompileProgram"); + static final long clLinkProgram = CL.getFunctionAddress("clLinkProgram"); + static final long clUnloadPlatformCompiler = CL.getFunctionAddress("clUnloadPlatformCompiler"); + static final long clGetKernelArgInfo = CL.getFunctionAddress("clGetKernelArgInfo"); + static final long clEnqueueFillBuffer = CL.getFunctionAddress("clEnqueueFillBuffer"); + static final long clEnqueueFillImage = CL.getFunctionAddress("clEnqueueFillImage"); + static final long clEnqueueMigrateMemObjects = CL.getFunctionAddress("clEnqueueMigrateMemObjects"); + static final long clEnqueueMarkerWithWaitList = CL.getFunctionAddress("clEnqueueMarkerWithWaitList"); + static final long clEnqueueBarrierWithWaitList = CL.getFunctionAddress("clEnqueueBarrierWithWaitList"); + static final long clSetPrintfCallback = CL.getFunctionAddress("clSetPrintfCallback"); + static final long clGetExtensionFunctionAddressForPlatform = CL.getFunctionAddress("clGetExtensionFunctionAddressForPlatform"); + + static final boolean OpenCL12GL; + static final long clCreateFromGLTexture = CL.getFunctionAddress("clCreateFromGLTexture"); + + static final boolean CL_EXT_device_fission; + static final long clRetainDeviceEXT = CL.getFunctionAddress("clRetainDeviceEXT"); + static final long clReleaseDeviceEXT = CL.getFunctionAddress("clReleaseDeviceEXT"); + static final long clCreateSubDevicesEXT = CL.getFunctionAddress("clCreateSubDevicesEXT"); + + static final boolean CL_EXT_migrate_memobject; + static final long clEnqueueMigrateMemObjectEXT = CL.getFunctionAddress("clEnqueueMigrateMemObjectEXT"); + + static final boolean CL_KHR_gl_event; + static final long clCreateEventFromGLsyncKHR = CL.getFunctionAddress("clCreateEventFromGLsyncKHR"); + + static final boolean CL_KHR_gl_sharing; + static final long clGetGLContextInfoKHR = CL.getFunctionAddress("clGetGLContextInfoKHR"); + + static final boolean CL_KHR_icd; + static final long clIcdGetPlatformIDsKHR = CL.getFunctionAddress("clIcdGetPlatformIDsKHR"); + + static final boolean CL_KHR_subgroups; + static final long clGetKernelSubGroupInfoKHR = CL.getFunctionAddress("clGetKernelSubGroupInfoKHR"); + + static final boolean CL_KHR_terminate_context; + static final long clTerminateContextKHR = CL.getFunctionAddress("clTerminateContextKHR"); + + + private CLCapabilities() {} + + static { + CL_APPLE_ContextLoggingFunctions = isAPPLE_ContextLoggingFunctionsSupported(); + CL_APPLE_SetMemObjectDestructor = isAPPLE_SetMemObjectDestructorSupported(); + CL_APPLE_gl_sharing = isAPPLE_gl_sharingSupported(); + OpenCL10 = isCL10Supported(); + OpenCL10GL = isCL10GLSupported(); + OpenCL11 = isCL11Supported(); + OpenCL12 = isCL12Supported(); + OpenCL12GL = isCL12GLSupported(); + CL_EXT_device_fission = isEXT_device_fissionSupported(); + CL_EXT_migrate_memobject = isEXT_migrate_memobjectSupported(); + CL_KHR_gl_event = isKHR_gl_eventSupported(); + CL_KHR_gl_sharing = isKHR_gl_sharingSupported(); + CL_KHR_icd = isKHR_icdSupported(); + CL_KHR_subgroups = isKHR_subgroupsSupported(); + CL_KHR_terminate_context = isKHR_terminate_contextSupported(); + } + + public static CLPlatformCapabilities getPlatformCapabilities(final CLPlatform platform) { + platform.checkValid(); + + CLPlatformCapabilities caps = (CLPlatformCapabilities)platform.getCapabilities(); + if ( caps == null ) + platform.setCapabilities(caps = new CLPlatformCapabilities(platform)); + + return caps; + } + + public static CLDeviceCapabilities getDeviceCapabilities(final CLDevice device) { + device.checkValid(); + + CLDeviceCapabilities caps = (CLDeviceCapabilities)device.getCapabilities(); + if ( caps == null ) + device.setCapabilities(caps = new CLDeviceCapabilities(device)); + + return caps; + } + + private static boolean isAPPLE_ContextLoggingFunctionsSupported() { + return + clLogMessagesToSystemLogAPPLE != 0 & + clLogMessagesToStdoutAPPLE != 0 & + clLogMessagesToStderrAPPLE != 0; + } + + private static boolean isAPPLE_SetMemObjectDestructorSupported() { + return + clSetMemObjectDestructorAPPLE != 0; + } + + private static boolean isAPPLE_gl_sharingSupported() { + return + clGetGLContextInfoAPPLE != 0; + } + + private static boolean isCL10Supported() { + return + clGetPlatformIDs != 0 & + clGetPlatformInfo != 0 & + clGetDeviceIDs != 0 & + clGetDeviceInfo != 0 & + clCreateContext != 0 & + clCreateContextFromType != 0 & + clRetainContext != 0 & + clReleaseContext != 0 & + clGetContextInfo != 0 & + clCreateCommandQueue != 0 & + clRetainCommandQueue != 0 & + clReleaseCommandQueue != 0 & + clGetCommandQueueInfo != 0 & + clCreateBuffer != 0 & + clEnqueueReadBuffer != 0 & + clEnqueueWriteBuffer != 0 & + clEnqueueCopyBuffer != 0 & + clEnqueueMapBuffer != 0 & + clCreateImage2D != 0 & + clCreateImage3D != 0 & + clGetSupportedImageFormats != 0 & + clEnqueueReadImage != 0 & + clEnqueueWriteImage != 0 & + clEnqueueCopyImage != 0 & + clEnqueueCopyImageToBuffer != 0 & + clEnqueueCopyBufferToImage != 0 & + clEnqueueMapImage != 0 & + clGetImageInfo != 0 & + clRetainMemObject != 0 & + clReleaseMemObject != 0 & + clEnqueueUnmapMemObject != 0 & + clGetMemObjectInfo != 0 & + clCreateSampler != 0 & + clRetainSampler != 0 & + clReleaseSampler != 0 & + clGetSamplerInfo != 0 & + clCreateProgramWithSource != 0 & + clCreateProgramWithBinary != 0 & + clRetainProgram != 0 & + clReleaseProgram != 0 & + clBuildProgram != 0 & + clUnloadCompiler != 0 & + clGetProgramInfo != 0 & + clGetProgramBuildInfo != 0 & + clCreateKernel != 0 & + clCreateKernelsInProgram != 0 & + clRetainKernel != 0 & + clReleaseKernel != 0 & + clSetKernelArg != 0 & + clGetKernelInfo != 0 & + clGetKernelWorkGroupInfo != 0 & + clEnqueueNDRangeKernel != 0 & + clEnqueueTask != 0 & + clEnqueueNativeKernel != 0 & + clWaitForEvents != 0 & + clGetEventInfo != 0 & + clRetainEvent != 0 & + clReleaseEvent != 0 & + clEnqueueMarker != 0 & + clEnqueueBarrier != 0 & + clEnqueueWaitForEvents != 0 & + clGetEventProfilingInfo != 0 & + clFlush != 0 & + clFinish != 0 & + clGetExtensionFunctionAddress != 0; + } + + private static boolean isCL10GLSupported() { + return + clCreateFromGLBuffer != 0 & + clCreateFromGLTexture2D != 0 & + clCreateFromGLTexture3D != 0 & + clCreateFromGLRenderbuffer != 0 & + clGetGLObjectInfo != 0 & + clGetGLTextureInfo != 0 & + clEnqueueAcquireGLObjects != 0 & + clEnqueueReleaseGLObjects != 0; + } + + private static boolean isCL11Supported() { + return + clCreateSubBuffer != 0 & + clSetMemObjectDestructorCallback != 0 & + clEnqueueReadBufferRect != 0 & + clEnqueueWriteBufferRect != 0 & + clEnqueueCopyBufferRect != 0 & + clCreateUserEvent != 0 & + clSetUserEventStatus != 0 & + clSetEventCallback != 0; + } + + private static boolean isCL12Supported() { + return + clRetainDevice != 0 & + clReleaseDevice != 0 & + clCreateSubDevices != 0 & + clCreateImage != 0 & + clCreateProgramWithBuiltInKernels != 0 & + clCompileProgram != 0 & + clLinkProgram != 0 & + clUnloadPlatformCompiler != 0 & + clGetKernelArgInfo != 0 & + clEnqueueFillBuffer != 0 & + clEnqueueFillImage != 0 & + clEnqueueMigrateMemObjects != 0 & + clEnqueueMarkerWithWaitList != 0 & + clEnqueueBarrierWithWaitList != 0 & + (clSetPrintfCallback != 0 || true) & + clGetExtensionFunctionAddressForPlatform != 0; + } + + private static boolean isCL12GLSupported() { + return + clCreateFromGLTexture != 0; + } + + private static boolean isEXT_device_fissionSupported() { + return + clRetainDeviceEXT != 0 & + clReleaseDeviceEXT != 0 & + clCreateSubDevicesEXT != 0; + } + + private static boolean isEXT_migrate_memobjectSupported() { + return + clEnqueueMigrateMemObjectEXT != 0; + } + + private static boolean isKHR_gl_eventSupported() { + return + clCreateEventFromGLsyncKHR != 0; + } + + private static boolean isKHR_gl_sharingSupported() { + return + clGetGLContextInfoKHR != 0; + } + + private static boolean isKHR_icdSupported() { + return + (clIcdGetPlatformIDsKHR != 0 || true); + } + + private static boolean isKHR_subgroupsSupported() { + return + clGetKernelSubGroupInfoKHR != 0; + } + + private static boolean isKHR_terminate_contextSupported() { + return + clTerminateContextKHR != 0; + } + +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLDeviceCapabilities.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLDeviceCapabilities.java new file mode 100644 index 0000000..173c0f9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLDeviceCapabilities.java @@ -0,0 +1,193 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import java.util.*; + +public class CLDeviceCapabilities { + + public final int majorVersion; + public final int minorVersion; + + public final boolean OpenCL11; + public final boolean OpenCL12; + + public final boolean CL_AMD_device_attribute_query; + public final boolean CL_AMD_device_memory_flags; + public final boolean CL_AMD_fp64; + public final boolean CL_AMD_media_ops; + public final boolean CL_AMD_media_ops2; + public final boolean CL_AMD_offline_devices; + public final boolean CL_AMD_popcnt; + public final boolean CL_AMD_printf; + public final boolean CL_AMD_vec3; + final boolean CL_APPLE_ContextLoggingFunctions; + public final boolean CL_APPLE_SetMemObjectDestructor; + public final boolean CL_APPLE_gl_sharing; + public final boolean CL_EXT_atomic_counters_32; + public final boolean CL_EXT_atomic_counters_64; + public final boolean CL_EXT_device_fission; + public final boolean CL_EXT_migrate_memobject; + public final boolean CL_INTEL_immediate_execution; + public final boolean CL_INTEL_printf; + public final boolean CL_INTEL_thread_local_exec; + public final boolean CL_KHR_3d_image_writes; + public final boolean CL_KHR_byte_addressable_store; + public final boolean CL_KHR_depth_images; + public final boolean CL_KHR_fp16; + public final boolean CL_KHR_fp64; + public final boolean CL_KHR_gl_depth_images; + public final boolean CL_KHR_gl_event; + public final boolean CL_KHR_gl_msaa_sharing; + public final boolean CL_KHR_gl_sharing; + public final boolean CL_KHR_global_int32_base_atomics; + public final boolean CL_KHR_global_int32_extended_atomics; + public final boolean CL_KHR_image2d_from_buffer; + public final boolean CL_KHR_initialize_memory; + public final boolean CL_KHR_int64_base_atomics; + public final boolean CL_KHR_int64_extended_atomics; + public final boolean CL_KHR_local_int32_base_atomics; + public final boolean CL_KHR_local_int32_extended_atomics; + public final boolean CL_KHR_mipmap_image; + public final boolean CL_KHR_mipmap_image_writes; + public final boolean CL_KHR_select_fprounding_mode; + public final boolean CL_KHR_spir; + public final boolean CL_KHR_srgb_image_writes; + public final boolean CL_KHR_subgroups; + public final boolean CL_KHR_terminate_context; + public final boolean CL_NV_compiler_options; + public final boolean CL_NV_device_attribute_query; + public final boolean CL_NV_pragma_unroll; + + public CLDeviceCapabilities(final CLDevice device) { + final String extensionList = device.getInfoString(CL10.CL_DEVICE_EXTENSIONS); + final String version = device.getInfoString(CL10.CL_DEVICE_VERSION); + if ( !version.startsWith("OpenCL ") ) + throw new RuntimeException("Invalid OpenCL version string: " + version); + + try { + final StringTokenizer tokenizer = new StringTokenizer(version.substring(7), ". "); + + majorVersion = Integer.parseInt(tokenizer.nextToken()); + minorVersion = Integer.parseInt(tokenizer.nextToken()); + + OpenCL11 = 1 < majorVersion || (1 == majorVersion && 1 <= minorVersion); + OpenCL12 = 1 < majorVersion || (1 == majorVersion && 2 <= minorVersion); + } catch (RuntimeException e) { + throw new RuntimeException("The major and/or minor OpenCL version \"" + version + "\" is malformed: " + e.getMessage()); + } + + final Set<String> extensions = APIUtil.getExtensions(extensionList); + CL_AMD_device_attribute_query = extensions.contains("cl_amd_device_attribute_query"); + CL_AMD_device_memory_flags = extensions.contains("cl_amd_device_memory_flags"); + CL_AMD_fp64 = extensions.contains("cl_amd_fp64"); + CL_AMD_media_ops = extensions.contains("cl_amd_media_ops"); + CL_AMD_media_ops2 = extensions.contains("cl_amd_media_ops2"); + CL_AMD_offline_devices = extensions.contains("cl_amd_offline_devices"); + CL_AMD_popcnt = extensions.contains("cl_amd_popcnt"); + CL_AMD_printf = extensions.contains("cl_amd_printf"); + CL_AMD_vec3 = extensions.contains("cl_amd_vec3"); + CL_APPLE_ContextLoggingFunctions = extensions.contains("cl_apple_contextloggingfunctions") && CLCapabilities.CL_APPLE_ContextLoggingFunctions; + CL_APPLE_SetMemObjectDestructor = extensions.contains("cl_apple_setmemobjectdestructor") && CLCapabilities.CL_APPLE_SetMemObjectDestructor; + CL_APPLE_gl_sharing = extensions.contains("cl_apple_gl_sharing") && CLCapabilities.CL_APPLE_gl_sharing; + CL_EXT_atomic_counters_32 = extensions.contains("cl_ext_atomic_counters_32"); + CL_EXT_atomic_counters_64 = extensions.contains("cl_ext_atomic_counters_64"); + CL_EXT_device_fission = extensions.contains("cl_ext_device_fission") && CLCapabilities.CL_EXT_device_fission; + CL_EXT_migrate_memobject = extensions.contains("cl_ext_migrate_memobject") && CLCapabilities.CL_EXT_migrate_memobject; + CL_INTEL_immediate_execution = extensions.contains("cl_intel_immediate_execution"); + CL_INTEL_printf = extensions.contains("cl_intel_printf"); + CL_INTEL_thread_local_exec = extensions.contains("cl_intel_thread_local_exec"); + CL_KHR_3d_image_writes = extensions.contains("cl_khr_3d_image_writes"); + CL_KHR_byte_addressable_store = extensions.contains("cl_khr_byte_addressable_store"); + CL_KHR_depth_images = extensions.contains("cl_khr_depth_images"); + CL_KHR_fp16 = extensions.contains("cl_khr_fp16"); + CL_KHR_fp64 = extensions.contains("cl_khr_fp64"); + CL_KHR_gl_depth_images = extensions.contains("cl_khr_gl_depth_images"); + CL_KHR_gl_event = extensions.contains("cl_khr_gl_event") && CLCapabilities.CL_KHR_gl_event; + CL_KHR_gl_msaa_sharing = extensions.contains("cl_khr_gl_msaa_sharing"); + CL_KHR_gl_sharing = extensions.contains("cl_khr_gl_sharing") && CLCapabilities.CL_KHR_gl_sharing; + CL_KHR_global_int32_base_atomics = extensions.contains("cl_khr_global_int32_base_atomics"); + CL_KHR_global_int32_extended_atomics = extensions.contains("cl_khr_global_int32_extended_atomics"); + CL_KHR_image2d_from_buffer = extensions.contains("cl_khr_image2d_from_buffer"); + CL_KHR_initialize_memory = extensions.contains("cl_khr_initialize_memory"); + CL_KHR_int64_base_atomics = extensions.contains("cl_khr_int64_base_atomics"); + CL_KHR_int64_extended_atomics = extensions.contains("cl_khr_int64_extended_atomics"); + CL_KHR_local_int32_base_atomics = extensions.contains("cl_khr_local_int32_base_atomics"); + CL_KHR_local_int32_extended_atomics = extensions.contains("cl_khr_local_int32_extended_atomics"); + CL_KHR_mipmap_image = extensions.contains("cl_khr_mipmap_image"); + CL_KHR_mipmap_image_writes = extensions.contains("cl_khr_mipmap_image_writes"); + CL_KHR_select_fprounding_mode = extensions.contains("cl_khr_select_fprounding_mode"); + CL_KHR_spir = extensions.contains("cl_khr_spir"); + CL_KHR_srgb_image_writes = extensions.contains("cl_khr_srgb_image_writes"); + CL_KHR_subgroups = extensions.contains("cl_khr_subgroups") && CLCapabilities.CL_KHR_subgroups; + CL_KHR_terminate_context = extensions.contains("cl_khr_terminate_context") && CLCapabilities.CL_KHR_terminate_context; + CL_NV_compiler_options = extensions.contains("cl_nv_compiler_options"); + CL_NV_device_attribute_query = extensions.contains("cl_nv_device_attribute_query"); + CL_NV_pragma_unroll = extensions.contains("cl_nv_pragma_unroll"); + } + + public int getMajorVersion() { + return majorVersion; + } + + public int getMinorVersion() { + return minorVersion; + } + + public String toString() { + final StringBuilder buf = new StringBuilder(); + + buf.append("OpenCL ").append(majorVersion).append('.').append(minorVersion); + + buf.append(" - Extensions: "); + if ( CL_AMD_device_attribute_query ) buf.append("cl_amd_device_attribute_query "); + if ( CL_AMD_device_memory_flags ) buf.append("cl_amd_device_memory_flags "); + if ( CL_AMD_fp64 ) buf.append("cl_amd_fp64 "); + if ( CL_AMD_media_ops ) buf.append("cl_amd_media_ops "); + if ( CL_AMD_media_ops2 ) buf.append("cl_amd_media_ops2 "); + if ( CL_AMD_offline_devices ) buf.append("cl_amd_offline_devices "); + if ( CL_AMD_popcnt ) buf.append("cl_amd_popcnt "); + if ( CL_AMD_printf ) buf.append("cl_amd_printf "); + if ( CL_AMD_vec3 ) buf.append("cl_amd_vec3 "); + if ( CL_APPLE_ContextLoggingFunctions ) buf.append("cl_apple_contextloggingfunctions "); + if ( CL_APPLE_SetMemObjectDestructor ) buf.append("cl_apple_setmemobjectdestructor "); + if ( CL_APPLE_gl_sharing ) buf.append("cl_apple_gl_sharing "); + if ( CL_EXT_atomic_counters_32 ) buf.append("cl_ext_atomic_counters_32 "); + if ( CL_EXT_atomic_counters_64 ) buf.append("cl_ext_atomic_counters_64 "); + if ( CL_EXT_device_fission ) buf.append("cl_ext_device_fission "); + if ( CL_EXT_migrate_memobject ) buf.append("cl_ext_migrate_memobject "); + if ( CL_INTEL_immediate_execution ) buf.append("cl_intel_immediate_execution "); + if ( CL_INTEL_printf ) buf.append("cl_intel_printf "); + if ( CL_INTEL_thread_local_exec ) buf.append("cl_intel_thread_local_exec "); + if ( CL_KHR_3d_image_writes ) buf.append("cl_khr_3d_image_writes "); + if ( CL_KHR_byte_addressable_store ) buf.append("cl_khr_byte_addressable_store "); + if ( CL_KHR_depth_images ) buf.append("cl_khr_depth_images "); + if ( CL_KHR_fp16 ) buf.append("cl_khr_fp16 "); + if ( CL_KHR_fp64 ) buf.append("cl_khr_fp64 "); + if ( CL_KHR_gl_depth_images ) buf.append("cl_khr_gl_depth_images "); + if ( CL_KHR_gl_event ) buf.append("cl_khr_gl_event "); + if ( CL_KHR_gl_msaa_sharing ) buf.append("cl_khr_gl_msaa_sharing "); + if ( CL_KHR_gl_sharing ) buf.append("cl_khr_gl_sharing "); + if ( CL_KHR_global_int32_base_atomics ) buf.append("cl_khr_global_int32_base_atomics "); + if ( CL_KHR_global_int32_extended_atomics ) buf.append("cl_khr_global_int32_extended_atomics "); + if ( CL_KHR_image2d_from_buffer ) buf.append("cl_khr_image2d_from_buffer "); + if ( CL_KHR_initialize_memory ) buf.append("cl_khr_initialize_memory "); + if ( CL_KHR_int64_base_atomics ) buf.append("cl_khr_int64_base_atomics "); + if ( CL_KHR_int64_extended_atomics ) buf.append("cl_khr_int64_extended_atomics "); + if ( CL_KHR_local_int32_base_atomics ) buf.append("cl_khr_local_int32_base_atomics "); + if ( CL_KHR_local_int32_extended_atomics ) buf.append("cl_khr_local_int32_extended_atomics "); + if ( CL_KHR_mipmap_image ) buf.append("cl_khr_mipmap_image "); + if ( CL_KHR_mipmap_image_writes ) buf.append("cl_khr_mipmap_image_writes "); + if ( CL_KHR_select_fprounding_mode ) buf.append("cl_khr_select_fprounding_mode "); + if ( CL_KHR_spir ) buf.append("cl_khr_spir "); + if ( CL_KHR_srgb_image_writes ) buf.append("cl_khr_srgb_image_writes "); + if ( CL_KHR_subgroups ) buf.append("cl_khr_subgroups "); + if ( CL_KHR_terminate_context ) buf.append("cl_khr_terminate_context "); + if ( CL_NV_compiler_options ) buf.append("cl_nv_compiler_options "); + if ( CL_NV_device_attribute_query ) buf.append("cl_nv_device_attribute_query "); + if ( CL_NV_pragma_unroll ) buf.append("cl_nv_pragma_unroll "); + + return buf.toString(); + } + +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLPlatformCapabilities.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLPlatformCapabilities.java new file mode 100644 index 0000000..d6e3657 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/CLPlatformCapabilities.java @@ -0,0 +1,76 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import java.util.*; + +public class CLPlatformCapabilities { + + public final int majorVersion; + public final int minorVersion; + + public final boolean OpenCL11; + public final boolean OpenCL12; + + final boolean CL_APPLE_ContextLoggingFunctions; + public final boolean CL_APPLE_SetMemObjectDestructor; + public final boolean CL_APPLE_gl_sharing; + public final boolean CL_KHR_d3d10_sharing; + public final boolean CL_KHR_gl_event; + public final boolean CL_KHR_gl_sharing; + public final boolean CL_KHR_icd; + + public CLPlatformCapabilities(final CLPlatform platform) { + final String extensionList = platform.getInfoString(CL10.CL_PLATFORM_EXTENSIONS); + final String version = platform.getInfoString(CL10.CL_PLATFORM_VERSION); + if ( !version.startsWith("OpenCL ") ) + throw new RuntimeException("Invalid OpenCL version string: " + version); + + try { + final StringTokenizer tokenizer = new StringTokenizer(version.substring(7), ". "); + + majorVersion = Integer.parseInt(tokenizer.nextToken()); + minorVersion = Integer.parseInt(tokenizer.nextToken()); + + OpenCL11 = 1 < majorVersion || (1 == majorVersion && 1 <= minorVersion); + OpenCL12 = 1 < majorVersion || (1 == majorVersion && 2 <= minorVersion); + } catch (RuntimeException e) { + throw new RuntimeException("The major and/or minor OpenCL version \"" + version + "\" is malformed: " + e.getMessage()); + } + + final Set<String> extensions = APIUtil.getExtensions(extensionList); + CL_APPLE_ContextLoggingFunctions = extensions.contains("cl_apple_contextloggingfunctions") && CLCapabilities.CL_APPLE_ContextLoggingFunctions; + CL_APPLE_SetMemObjectDestructor = extensions.contains("cl_apple_setmemobjectdestructor") && CLCapabilities.CL_APPLE_SetMemObjectDestructor; + CL_APPLE_gl_sharing = extensions.contains("cl_apple_gl_sharing") && CLCapabilities.CL_APPLE_gl_sharing; + CL_KHR_d3d10_sharing = extensions.contains("cl_khr_d3d10_sharing"); + CL_KHR_gl_event = extensions.contains("cl_khr_gl_event") && CLCapabilities.CL_KHR_gl_event; + CL_KHR_gl_sharing = extensions.contains("cl_khr_gl_sharing") && CLCapabilities.CL_KHR_gl_sharing; + CL_KHR_icd = extensions.contains("cl_khr_icd") && CLCapabilities.CL_KHR_icd; + } + + public int getMajorVersion() { + return majorVersion; + } + + public int getMinorVersion() { + return minorVersion; + } + + public String toString() { + final StringBuilder buf = new StringBuilder(); + + buf.append("OpenCL ").append(majorVersion).append('.').append(minorVersion); + + buf.append(" - Extensions: "); + if ( CL_APPLE_ContextLoggingFunctions ) buf.append("cl_apple_contextloggingfunctions "); + if ( CL_APPLE_SetMemObjectDestructor ) buf.append("cl_apple_setmemobjectdestructor "); + if ( CL_APPLE_gl_sharing ) buf.append("cl_apple_gl_sharing "); + if ( CL_KHR_d3d10_sharing ) buf.append("cl_khr_d3d10_sharing "); + if ( CL_KHR_gl_event ) buf.append("cl_khr_gl_event "); + if ( CL_KHR_gl_sharing ) buf.append("cl_khr_gl_sharing "); + if ( CL_KHR_icd ) buf.append("cl_khr_icd "); + + return buf.toString(); + } + +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters32.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters32.java new file mode 100644 index 0000000..ac85200 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters32.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTAtomicCounters32 { + + /** + * CLDevice query: Max number of atomic counters that can be used by a kernel. + */ + public static final int CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT = 0x4032; + + private EXTAtomicCounters32() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters64.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters64.java new file mode 100644 index 0000000..47429e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTAtomicCounters64.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTAtomicCounters64 { + + /** + * CLDevice query: Max number of atomic counters that can be used by a kernel. + */ + public static final int CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT = 0x4032; + + private EXTAtomicCounters64() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTDeviceFission.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTDeviceFission.java new file mode 100644 index 0000000..21914e5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTDeviceFission.java @@ -0,0 +1,122 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDeviceFission { + + /** + * Accepted as a property name in the &lt;properties&gt; parameter of + * clCreateSubDeviceEXT: + */ + public static final int CL_DEVICE_PARTITION_EQUALLY_EXT = 0x4050, + CL_DEVICE_PARTITION_BY_COUNTS_EXT = 0x4051, + CL_DEVICE_PARTITION_BY_NAMES_EXT = 0x4052, + CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT = 0x4053; + + /** + * Accepted as a property name, when accompanying the + * CL_DEVICE_PARITION_BY_AFFINITY_DOMAIN_EXT property, in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + public static final int CL_AFFINITY_DOMAIN_L1_CACHE_EXT = 0x1, + CL_AFFINITY_DOMAIN_L2_CACHE_EXT = 0x2, + CL_AFFINITY_DOMAIN_L3_CACHE_EXT = 0x3, + CL_AFFINITY_DOMAIN_L4_CACHE_EXT = 0x4, + CL_AFFINITY_DOMAIN_NUMA_EXT = 0x10, + CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT = 0x100; + + /** + * Accepted as a property being queried in the &lt;param_name&gt; argument of + * clGetDeviceInfo: + */ + public static final int CL_DEVICE_PARENT_DEVICE_EXT = 0x4054, + CL_DEVICE_PARITION_TYPES_EXT = 0x4055, + CL_DEVICE_AFFINITY_DOMAINS_EXT = 0x4056, + CL_DEVICE_REFERENCE_COUNT_EXT = 0x4057, + CL_DEVICE_PARTITION_STYLE_EXT = 0x4058; + + /** + * Accepted as the property list terminator in the &lt;properties&gt; parameter of + * clCreateSubDeviceEXT: + */ + public static final int CL_PROPERTIES_LIST_END_EXT = 0x0; + + /** + * Accepted as the partition counts list terminator in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + public static final int CL_PARTITION_BY_COUNTS_LIST_END_EXT = 0x0; + + /** + * Accepted as the partition names list terminator in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + public static final int CL_PARTITION_BY_NAMES_LIST_END_EXT = 0xFFFFFFFF; + + /** + * Returned by clCreateSubDevicesEXT when the indicated partition scheme is + * supported by the implementation, but the implementation can not further + * partition the device in this way. + */ + public static final int CL_DEVICE_PARTITION_FAILED_EXT = 0xFFFFFBDF; + + /** + * Returned by clCreateSubDevicesEXT when the total number of compute units + * requested exceeds CL_DEVICE_MAX_COMPUTE_UNITS, or the number of compute + * units for any one sub-device is less than 1. + */ + public static final int CL_INVALID_PARTITION_COUNT_EXT = 0xFFFFFBDE; + + /** + * Returned by clCreateSubDevicesEXT when a compute unit name appearing in a + * name list following CL_DEVICE_PARTITION_BY_NAMES_EXT is not in range. + */ + public static final int CL_INVALID_PARTITION_NAME_EXT = 0xFFFFFBDD; + + private EXTDeviceFission() {} + + public static int clRetainDeviceEXT(CLDevice device) { + long function_pointer = CLCapabilities.clRetainDeviceEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclRetainDeviceEXT(device.getPointer(), function_pointer); + if ( __result == CL10.CL_SUCCESS ) device.retain(); + return __result; + } + static native int nclRetainDeviceEXT(long device, long function_pointer); + + /** + * Warning: LWJGL will not automatically release any objects associated with sub-devices. + * The user is responsible for tracking and releasing everything prior to calling this method. + * <p> + * @param device the parent CLDevice + * <p> + * @return the error code + */ + public static int clReleaseDeviceEXT(CLDevice device) { + long function_pointer = CLCapabilities.clReleaseDeviceEXT; + BufferChecks.checkFunctionAddress(function_pointer); + APIUtil.releaseObjects(device); + int __result = nclReleaseDeviceEXT(device.getPointer(), function_pointer); + if ( __result == CL10.CL_SUCCESS ) device.release(); + return __result; + } + static native int nclReleaseDeviceEXT(long device, long function_pointer); + + public static int clCreateSubDevicesEXT(CLDevice in_device, LongBuffer properties, PointerBuffer out_devices, IntBuffer num_devices) { + long function_pointer = CLCapabilities.clCreateSubDevicesEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(properties); + BufferChecks.checkNullTerminated(properties); + if (out_devices != null) + BufferChecks.checkDirect(out_devices); + if (num_devices != null) + BufferChecks.checkBuffer(num_devices, 1); + int __result = nclCreateSubDevicesEXT(in_device.getPointer(), MemoryUtil.getAddress(properties), (out_devices == null ? 0 : out_devices.remaining()), MemoryUtil.getAddressSafe(out_devices), MemoryUtil.getAddressSafe(num_devices), function_pointer); + if ( __result == CL10.CL_SUCCESS && out_devices != null ) in_device.registerSubCLDevices(out_devices); + return __result; + } + static native int nclCreateSubDevicesEXT(long in_device, long properties, int out_devices_num_entries, long out_devices, long num_devices, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTMigrateMemobject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTMigrateMemobject.java new file mode 100644 index 0000000..18db74c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/EXTMigrateMemobject.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMigrateMemobject { + + /** + * Besides a value of zero, the following cl_mem_migration_flags_ext values are + * allowed: + */ + public static final int CL_MIGRATE_MEM_OBJECT_HOST_EXT = 0x1; + + /** + * Returned in the &lt;param_value&gt; parameter of the clGetEventInfo when + * &lt;param_name&gt; is CL_EVENT_COMMAND_TYPE: + */ + public static final int CL_COMMAND_MIGRATE_MEM_OBJECT_EXT = 0x4040; + + private EXTMigrateMemobject() {} + + public static int clEnqueueMigrateMemObjectEXT(CLCommandQueue command_queue, PointerBuffer mem_objects, long flags, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueMigrateMemObjectEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(mem_objects, 1); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueMigrateMemObjectEXT(command_queue.getPointer(), mem_objects.remaining(), MemoryUtil.getAddress(mem_objects), flags, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } + static native int nclEnqueueMigrateMemObjectEXT(long command_queue, int mem_objects_num_mem_objects, long mem_objects, long flags, int event_wait_list_num_events_in_wait_list, long event_wait_list, long event, long function_pointer); + + /** Overloads clEnqueueMigrateMemObjectEXT. */ + public static int clEnqueueMigrateMemObjectEXT(CLCommandQueue command_queue, CLMem mem_object, long flags, PointerBuffer event_wait_list, PointerBuffer event) { + long function_pointer = CLCapabilities.clEnqueueMigrateMemObjectEXT; + BufferChecks.checkFunctionAddress(function_pointer); + if (event_wait_list != null) + BufferChecks.checkDirect(event_wait_list); + if (event != null) + BufferChecks.checkBuffer(event, 1); + int __result = nclEnqueueMigrateMemObjectEXT(command_queue.getPointer(), 1, APIUtil.getPointer(mem_object), flags, (event_wait_list == null ? 0 : event_wait_list.remaining()), MemoryUtil.getAddressSafe(event_wait_list), MemoryUtil.getAddressSafe(event), function_pointer); + if ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELImmediateExecution.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELImmediateExecution.java new file mode 100644 index 0000000..cf5a769 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELImmediateExecution.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class INTELImmediateExecution { + + /** + * cl_command_queue_properties - bitfield + */ + public static final int CL_QUEUE_IMMEDIATE_EXECUTION_ENABLE_INTEL = 0x4; + + /** + * cl_device_exec_capabilities - bitfield + */ + public static final int CL_EXEC_IMMEDIATE_EXECUTION_INTEL = 0x4; + + private INTELImmediateExecution() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELThreadLocalExec.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELThreadLocalExec.java new file mode 100644 index 0000000..c663854 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/INTELThreadLocalExec.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class INTELThreadLocalExec { + + /** + * Allows the user to execute OpenCL tasks and kernels with + * the user application's threads. This token that can + * be passed to clCreateCommandQueue, creating a queue with the "thread + * local exec" capability. + * <p/> + * All enqueue APIs (e.g., clEnqueueRead) submitted to such a queue + * never enqueue commands. An Enqueue API call is executed by the + * caller host-thread itself without involving any of the OpenCL + * runtime threads, much like function calls. + */ + public static final int CL_QUEUE_THREAD_LOCAL_EXEC_ENABLE_INTEL = 0x80000000; + + private INTELThreadLocalExec() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRDepthImages.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRDepthImages.java new file mode 100644 index 0000000..806033a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRDepthImages.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRDepthImages { + + /** + * cl_channel_order + */ + public static final int CL_DEPTH = 0x10BD; + + private KHRDepthImages() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp16.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp16.java new file mode 100644 index 0000000..3af2ef8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp16.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRFp16 { + + /** + * cl_device_info + */ + public static final int CL_DEVICE_HALF_FP_CONFIG = 0x1033; + + private KHRFp16() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp64.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp64.java new file mode 100644 index 0000000..a40751a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRFp64.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRFp64 { + + /** + * cl_device_info + */ + public static final int CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032; + + private KHRFp64() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLDepthImages.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLDepthImages.java new file mode 100644 index 0000000..7e611c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLDepthImages.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRGLDepthImages { + + /** + * cl_channel_order + */ + public static final int CL_DEPTH_STENCIL = 0x10BE; + + /** + * cl_channel_type + */ + public static final int CL_UNORM_INT24 = 0x10DF; + + private KHRGLDepthImages() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLEvent.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLEvent.java new file mode 100644 index 0000000..cd0873f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLEvent.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; +import org.lwjgl.opengl.GLSync; + +public final class KHRGLEvent { + + /** + * Returned by clGetEventInfo when param_name is CL_EVENT_COMMAND_TYPE: + */ + public static final int CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR = 0x200D; + + private KHRGLEvent() {} + + public static CLEvent clCreateEventFromGLsyncKHR(CLContext context, GLSync sync, IntBuffer errcode_ret) { + long function_pointer = CLCapabilities.clCreateEventFromGLsyncKHR; + BufferChecks.checkFunctionAddress(function_pointer); + if (errcode_ret != null) + BufferChecks.checkBuffer(errcode_ret, 1); + CLEvent __result = new CLEvent(nclCreateEventFromGLsyncKHR(context.getPointer(), sync.getPointer(), MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + return __result; + } + static native long nclCreateEventFromGLsyncKHR(long context, long sync, long errcode_ret, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLMsaaSharing.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLMsaaSharing.java new file mode 100644 index 0000000..b3f62c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLMsaaSharing.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRGLMsaaSharing { + + /** + * cl_gl_texture_info + */ + public static final int CL_GL_NUM_SAMPLES = 0x2012; + + private KHRGLMsaaSharing() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLSharing.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLSharing.java new file mode 100644 index 0000000..46881e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRGLSharing.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRGLSharing { + + /** + * Returned by clCreateContext, clCreateContextFromType, and + * clGetGLContextInfoKHR when an invalid OpenGL context or share group + * object handle is specified in &lt;properties&gt;: + */ + public static final int CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR = 0xFFFFFC18; + + /** + * Accepted as the &lt;param_name&gt; argument of clGetGLContextInfoKHR: + */ + public static final int CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR = 0x2006, + CL_DEVICES_FOR_GL_CONTEXT_KHR = 0x2007; + + /** + * Accepted as an attribute name in the 'properties' argument of + * clCreateContext and clCreateContextFromType: + */ + public static final int CL_GL_CONTEXT_KHR = 0x2008, + CL_EGL_DISPLAY_KHR = 0x2009, + CL_GLX_DISPLAY_KHR = 0x200A, + CL_WGL_HDC_KHR = 0x200B, + CL_CGL_SHAREGROUP_KHR = 0x200C; + + private KHRGLSharing() {} + + public static int clGetGLContextInfoKHR(PointerBuffer properties, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetGLContextInfoKHR; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(properties); + BufferChecks.checkNullTerminated(properties); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + if ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer(); + int __result = nclGetGLContextInfoKHR(MemoryUtil.getAddress(properties), param_name, (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + if ( __result == CL10.CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) APIUtil.getCLPlatform(properties).registerCLDevices(param_value, param_value_size_ret); + return __result; + } + static native int nclGetGLContextInfoKHR(long properties, int param_name, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRICD.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRICD.java new file mode 100644 index 0000000..c726a41 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRICD.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRICD { + + /** + * Accepted as &lt;param_name&gt; to the function clGetPlatformInfo + */ + public static final int CL_PLATFORM_ICD_SUFFIX_KHR = 0x920; + + /** + * Returned by clGetPlatformIDs when no platforms are found + */ + public static final int CL_PLATFORM_NOT_FOUND_KHR = 0xFFFFFC17; + + private KHRICD() {} + + public static int clIcdGetPlatformIDsKHR(PointerBuffer platforms, IntBuffer num_platforms) { + long function_pointer = CLCapabilities.clIcdGetPlatformIDsKHR; + BufferChecks.checkFunctionAddress(function_pointer); + if (platforms != null) + BufferChecks.checkDirect(platforms); + if (num_platforms != null) + BufferChecks.checkBuffer(num_platforms, 1); + int __result = nclIcdGetPlatformIDsKHR((platforms == null ? 0 : platforms.remaining()), MemoryUtil.getAddressSafe(platforms), MemoryUtil.getAddressSafe(num_platforms), function_pointer); + return __result; + } + static native int nclIcdGetPlatformIDsKHR(int platforms_num_entries, long platforms, long num_platforms, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRImage2DFromBuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRImage2DFromBuffer.java new file mode 100644 index 0000000..9776b5e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRImage2DFromBuffer.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRImage2DFromBuffer { + + /** + * cl_device_info + */ + public static final int CL_DEVICE_IMAGE_PITCH_ALIGNMENT = 0x104A, + CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT = 0x104B; + + private KHRImage2DFromBuffer() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRInitializeMemory.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRInitializeMemory.java new file mode 100644 index 0000000..c9512fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRInitializeMemory.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRInitializeMemory { + + /** + * cl_context_properties + */ + public static final int CL_CONTEXT_MEMORY_INITIALIZE_KHR = 0x200E; + + /** + */ + public static final int CL_CONTEXT_MEMORY_INITIALIZE_LOCAL_KHR = 0x1, + CL_CONTEXT_MEMORY_INITIALIZE_PRIVATE_KHR = 0x2; + + private KHRInitializeMemory() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRSubgroups.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRSubgroups.java new file mode 100644 index 0000000..9789738 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRSubgroups.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRSubgroups { + + private KHRSubgroups() {} + + public static int clGetKernelSubGroupInfoKHR(CLKernel kernel, CLDevice device, int param_name, ByteBuffer input_value, ByteBuffer param_value, PointerBuffer param_value_size_ret) { + long function_pointer = CLCapabilities.clGetKernelSubGroupInfoKHR; + BufferChecks.checkFunctionAddress(function_pointer); + if (input_value != null) + BufferChecks.checkDirect(input_value); + if (param_value != null) + BufferChecks.checkDirect(param_value); + if (param_value_size_ret != null) + BufferChecks.checkBuffer(param_value_size_ret, 1); + int __result = nclGetKernelSubGroupInfoKHR(kernel.getPointer(), device == null ? 0 : device.getPointer(), param_name, (input_value == null ? 0 : input_value.remaining()), MemoryUtil.getAddressSafe(input_value), (param_value == null ? 0 : param_value.remaining()), MemoryUtil.getAddressSafe(param_value), MemoryUtil.getAddressSafe(param_value_size_ret), function_pointer); + return __result; + } + static native int nclGetKernelSubGroupInfoKHR(long kernel, long device, int param_name, long input_value_input_value_size, long input_value, long param_value_param_value_size, long param_value, long param_value_size_ret, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRTerminateContext.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRTerminateContext.java new file mode 100644 index 0000000..696afec --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/KHRTerminateContext.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRTerminateContext { + + public static final int CL_DEVICE_TERMINATE_CAPABILITY_KHR = 0x200F, + CL_CONTEXT_TERMINATE_KHR = 0x2010; + + private KHRTerminateContext() {} + + public static int clTerminateContextKHR(CLContext context) { + long function_pointer = CLCapabilities.clTerminateContextKHR; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nclTerminateContextKHR(context.getPointer(), function_pointer); + return __result; + } + static native int nclTerminateContextKHR(long context, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/NVDeviceAttributeQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/NVDeviceAttributeQuery.java new file mode 100644 index 0000000..f5f702a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opencl/NVDeviceAttributeQuery.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opencl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDeviceAttributeQuery { + + /** + * Accepted as the &lt;param_name&gt; parameter of clGetDeviceInfo. + */ + public static final int CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV = 0x4000, + CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV = 0x4001, + CL_DEVICE_REGISTERS_PER_BLOCK_NV = 0x4002, + CL_DEVICE_WARP_SIZE_NV = 0x4003, + CL_DEVICE_GPU_OVERLAP_NV = 0x4004, + CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV = 0x4005, + CL_DEVICE_INTEGRATED_MEMORY_NV = 0x4006; + + private NVDeviceAttributeQuery() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDBlendMinmaxFactor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDBlendMinmaxFactor.java new file mode 100644 index 0000000..399734f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDBlendMinmaxFactor.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDBlendMinmaxFactor { + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquation and BlendEquationi, and by + * the &lt;modeRGB> and &lt;modeAlpha&gt; parameters of BlendEquationSeparate and + * BlendEquationSeparatei: + */ + public static final int GL_FACTOR_MIN_AMD = 0x901C, + GL_FACTOR_MAX_AMD = 0x901D; + + private AMDBlendMinmaxFactor() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDebugOutput.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDebugOutput.java new file mode 100644 index 0000000..1f79355 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDebugOutput.java @@ -0,0 +1,103 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDDebugOutput { + + /** + * Tokens accepted by GetIntegerv: + */ + public static final int GL_MAX_DEBUG_MESSAGE_LENGTH_AMD = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_AMD = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_AMD = 0x9145; + + /** + * Tokens accepted by DebugMessageEnableAMD, GetDebugMessageLogAMD, + * DebugMessageInsertAMD, and DEBUGPROCAMD callback function + * for &lt;severity&gt;: + */ + public static final int GL_DEBUG_SEVERITY_HIGH_AMD = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_AMD = 0x9147, + GL_DEBUG_SEVERITY_LOW_AMD = 0x9148; + + /** + * Tokens accepted by DebugMessageEnableAMD, GetDebugMessageLogAMD, + * and DEBUGPROCAMD callback function for &lt;category&gt;: + */ + public static final int GL_DEBUG_CATEGORY_API_ERROR_AMD = 0x9149, + GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD = 0x914A, + GL_DEBUG_CATEGORY_DEPRECATION_AMD = 0x914B, + GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD = 0x914C, + GL_DEBUG_CATEGORY_PERFORMANCE_AMD = 0x914D, + GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD = 0x914E, + GL_DEBUG_CATEGORY_APPLICATION_AMD = 0x914F, + GL_DEBUG_CATEGORY_OTHER_AMD = 0x9150; + + private AMDDebugOutput() {} + + public static void glDebugMessageEnableAMD(int category, int severity, IntBuffer ids, boolean enabled) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageEnableAMD; + BufferChecks.checkFunctionAddress(function_pointer); + if (ids != null) + BufferChecks.checkDirect(ids); + nglDebugMessageEnableAMD(category, severity, (ids == null ? 0 : ids.remaining()), MemoryUtil.getAddressSafe(ids), enabled, function_pointer); + } + static native void nglDebugMessageEnableAMD(int category, int severity, int ids_count, long ids, boolean enabled, long function_pointer); + + public static void glDebugMessageInsertAMD(int category, int severity, int id, ByteBuffer buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsertAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buf); + nglDebugMessageInsertAMD(category, severity, id, buf.remaining(), MemoryUtil.getAddress(buf), function_pointer); + } + static native void nglDebugMessageInsertAMD(int category, int severity, int id, int buf_length, long buf, long function_pointer); + + /** Overloads glDebugMessageInsertAMD. */ + public static void glDebugMessageInsertAMD(int category, int severity, int id, CharSequence buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsertAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglDebugMessageInsertAMD(category, severity, id, buf.length(), APIUtil.getBuffer(caps, buf), function_pointer); + } + + /** + * The {@code AMDDebugOutputCallback.Handler} implementation passed to this method will be used for + * AMD_debug_output messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * <p> + * @param callback the callback function to use + */ + public static void glDebugMessageCallbackAMD(AMDDebugOutputCallback callback) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageCallbackAMD; + BufferChecks.checkFunctionAddress(function_pointer); + long userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler()); + CallbackUtil.registerContextCallbackAMD(userParam); + nglDebugMessageCallbackAMD(callback == null ? 0 : callback.getPointer(), userParam, function_pointer); + } + static native void nglDebugMessageCallbackAMD(long callback, long userParam, long function_pointer); + + public static int glGetDebugMessageLogAMD(int count, IntBuffer categories, IntBuffer severities, IntBuffer ids, IntBuffer lengths, ByteBuffer messageLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDebugMessageLogAMD; + BufferChecks.checkFunctionAddress(function_pointer); + if (categories != null) + BufferChecks.checkBuffer(categories, count); + if (severities != null) + BufferChecks.checkBuffer(severities, count); + if (ids != null) + BufferChecks.checkBuffer(ids, count); + if (lengths != null) + BufferChecks.checkBuffer(lengths, count); + if (messageLog != null) + BufferChecks.checkDirect(messageLog); + int __result = nglGetDebugMessageLogAMD(count, (messageLog == null ? 0 : messageLog.remaining()), MemoryUtil.getAddressSafe(categories), MemoryUtil.getAddressSafe(severities), MemoryUtil.getAddressSafe(ids), MemoryUtil.getAddressSafe(lengths), MemoryUtil.getAddressSafe(messageLog), function_pointer); + return __result; + } + static native int nglGetDebugMessageLogAMD(int count, int messageLog_logSize, long categories, long severities, long ids, long lengths, long messageLog, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDepthClampSeparate.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDepthClampSeparate.java new file mode 100644 index 0000000..9517223 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDepthClampSeparate.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDDepthClampSeparate { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_CLAMP_NEAR_AMD = 0x901E, + GL_DEPTH_CLAMP_FAR_AMD = 0x901F; + + private AMDDepthClampSeparate() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDrawBuffersBlend.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDrawBuffersBlend.java new file mode 100644 index 0000000..8670e51 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDDrawBuffersBlend.java @@ -0,0 +1,43 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDDrawBuffersBlend { + + private AMDDrawBuffersBlend() {} + + public static void glBlendFuncIndexedAMD(int buf, int src, int dst) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncIndexedAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncIndexedAMD(buf, src, dst, function_pointer); + } + static native void nglBlendFuncIndexedAMD(int buf, int src, int dst, long function_pointer); + + public static void glBlendFuncSeparateIndexedAMD(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncSeparateIndexedAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha, function_pointer); + } + static native void nglBlendFuncSeparateIndexedAMD(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha, long function_pointer); + + public static void glBlendEquationIndexedAMD(int buf, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationIndexedAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationIndexedAMD(buf, mode, function_pointer); + } + static native void nglBlendEquationIndexedAMD(int buf, int mode, long function_pointer); + + public static void glBlendEquationSeparateIndexedAMD(int buf, int modeRGB, int modeAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationSeparateIndexedAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha, function_pointer); + } + static native void nglBlendEquationSeparateIndexedAMD(int buf, int modeRGB, int modeAlpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDInterleavedElements.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDInterleavedElements.java new file mode 100644 index 0000000..a857076 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDInterleavedElements.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDInterleavedElements { + + /** + * Accepted by the &lt;pname&gt; parameter of VertexAttribParameteriAMD and + * GetVertexAttrib{iv|dv|fv|Iiv|Iuiv|Ldv}: + */ + public static final int GL_VERTEX_ELEMENT_SWIZZLE_AMD = 0x91A4; + + /** + * Selected by the &lt;pname&gt; parameter of ProgramParameteri and GetProgramiv: + */ + public static final int GL_VERTEX_ID_SWIZZLE_AMD = 0x91A5; + + private AMDInterleavedElements() {} + + public static void glVertexAttribParameteriAMD(int index, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribParameteriAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribParameteriAMD(index, pname, param, function_pointer); + } + static native void nglVertexAttribParameteriAMD(int index, int pname, int param, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDMultiDrawIndirect.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDMultiDrawIndirect.java new file mode 100644 index 0000000..db30bf1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDMultiDrawIndirect.java @@ -0,0 +1,67 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDMultiDrawIndirect { + + private AMDMultiDrawIndirect() {} + + public static void glMultiDrawArraysIndirectAMD(int mode, ByteBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 * 4 : stride) * primcount); + nglMultiDrawArraysIndirectAMD(mode, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirectAMD(int mode, long indirect, int primcount, int stride, long function_pointer); + public static void glMultiDrawArraysIndirectAMD(int mode, long indirect_buffer_offset, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawArraysIndirectAMDBO(mode, indirect_buffer_offset, primcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirectAMDBO(int mode, long indirect_buffer_offset, int primcount, int stride, long function_pointer); + + /** Overloads glMultiDrawArraysIndirectAMD. */ + public static void glMultiDrawArraysIndirectAMD(int mode, IntBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 : stride >> 2) * primcount); + nglMultiDrawArraysIndirectAMD(mode, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + + public static void glMultiDrawElementsIndirectAMD(int mode, int type, ByteBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 * 4 : stride) * primcount); + nglMultiDrawElementsIndirectAMD(mode, type, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirectAMD(int mode, int type, long indirect, int primcount, int stride, long function_pointer); + public static void glMultiDrawElementsIndirectAMD(int mode, int type, long indirect_buffer_offset, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawElementsIndirectAMDBO(mode, type, indirect_buffer_offset, primcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirectAMDBO(int mode, int type, long indirect_buffer_offset, int primcount, int stride, long function_pointer); + + /** Overloads glMultiDrawElementsIndirectAMD. */ + public static void glMultiDrawElementsIndirectAMD(int mode, int type, IntBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectAMD; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 : stride >> 2) * primcount); + nglMultiDrawElementsIndirectAMD(mode, type, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDNameGenDelete.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDNameGenDelete.java new file mode 100644 index 0000000..26119a0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDNameGenDelete.java @@ -0,0 +1,65 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDNameGenDelete { + + /** + * Accepted as the &lt;identifier&gt; parameter of GenNamesAMD and DeleteNamesAMD: + */ + public static final int GL_DATA_BUFFER_AMD = 0x9151, + GL_PERFORMANCE_MONITOR_AMD = 0x9152, + GL_QUERY_OBJECT_AMD = 0x9153, + GL_VERTEX_ARRAY_OBJECT_AMD = 0x9154, + GL_SAMPLER_OBJECT_AMD = 0x9155; + + private AMDNameGenDelete() {} + + public static void glGenNamesAMD(int identifier, IntBuffer names) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenNamesAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(names); + nglGenNamesAMD(identifier, names.remaining(), MemoryUtil.getAddress(names), function_pointer); + } + static native void nglGenNamesAMD(int identifier, int names_num, long names, long function_pointer); + + /** Overloads glGenNamesAMD. */ + public static int glGenNamesAMD(int identifier) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenNamesAMD; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer names = APIUtil.getBufferInt(caps); + nglGenNamesAMD(identifier, 1, MemoryUtil.getAddress(names), function_pointer); + return names.get(0); + } + + public static void glDeleteNamesAMD(int identifier, IntBuffer names) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteNamesAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(names); + nglDeleteNamesAMD(identifier, names.remaining(), MemoryUtil.getAddress(names), function_pointer); + } + static native void nglDeleteNamesAMD(int identifier, int names_num, long names, long function_pointer); + + /** Overloads glDeleteNamesAMD. */ + public static void glDeleteNamesAMD(int identifier, int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteNamesAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteNamesAMD(identifier, 1, APIUtil.getInt(caps, name), function_pointer); + } + + public static boolean glIsNameAMD(int identifier, int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsNameAMD; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsNameAMD(identifier, name, function_pointer); + return __result; + } + static native boolean nglIsNameAMD(int identifier, int name, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPerformanceMonitor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPerformanceMonitor.java new file mode 100644 index 0000000..1263ce6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPerformanceMonitor.java @@ -0,0 +1,201 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDPerformanceMonitor { + + /** + * Accepted by the &lt;pame&gt; parameter of GetPerfMonitorCounterInfoAMD + */ + public static final int GL_COUNTER_TYPE_AMD = 0x8BC0, + GL_COUNTER_RANGE_AMD = 0x8BC1; + + /** + * Returned as a valid value in &lt;data&gt; parameter of + * GetPerfMonitorCounterInfoAMD if &lt;pname&gt; = COUNTER_TYPE_AMD + */ + public static final int GL_UNSIGNED_INT64_AMD = 0x8BC2, + GL_PERCENTAGE_AMD = 0x8BC3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPerfMonitorCounterDataAMD + */ + public static final int GL_PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4, + GL_PERFMON_RESULT_SIZE_AMD = 0x8BC5, + GL_PERFMON_RESULT_AMD = 0x8BC6; + + private AMDPerformanceMonitor() {} + + public static void glGetPerfMonitorGroupsAMD(IntBuffer numGroups, IntBuffer groups) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorGroupsAMD; + BufferChecks.checkFunctionAddress(function_pointer); + if (numGroups != null) + BufferChecks.checkBuffer(numGroups, 1); + BufferChecks.checkDirect(groups); + nglGetPerfMonitorGroupsAMD(MemoryUtil.getAddressSafe(numGroups), groups.remaining(), MemoryUtil.getAddress(groups), function_pointer); + } + static native void nglGetPerfMonitorGroupsAMD(long numGroups, int groups_groupsSize, long groups, long function_pointer); + + public static void glGetPerfMonitorCountersAMD(int group, IntBuffer numCounters, IntBuffer maxActiveCounters, IntBuffer counters) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCountersAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(numCounters, 1); + BufferChecks.checkBuffer(maxActiveCounters, 1); + if (counters != null) + BufferChecks.checkDirect(counters); + nglGetPerfMonitorCountersAMD(group, MemoryUtil.getAddress(numCounters), MemoryUtil.getAddress(maxActiveCounters), (counters == null ? 0 : counters.remaining()), MemoryUtil.getAddressSafe(counters), function_pointer); + } + static native void nglGetPerfMonitorCountersAMD(int group, long numCounters, long maxActiveCounters, int counters_countersSize, long counters, long function_pointer); + + public static void glGetPerfMonitorGroupStringAMD(int group, IntBuffer length, ByteBuffer groupString) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorGroupStringAMD; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + if (groupString != null) + BufferChecks.checkDirect(groupString); + nglGetPerfMonitorGroupStringAMD(group, (groupString == null ? 0 : groupString.remaining()), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddressSafe(groupString), function_pointer); + } + static native void nglGetPerfMonitorGroupStringAMD(int group, int groupString_bufSize, long length, long groupString, long function_pointer); + + /** Overloads glGetPerfMonitorGroupStringAMD. */ + public static String glGetPerfMonitorGroupStringAMD(int group, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorGroupStringAMD; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer groupString_length = APIUtil.getLengths(caps); + ByteBuffer groupString = APIUtil.getBufferByte(caps, bufSize); + nglGetPerfMonitorGroupStringAMD(group, bufSize, MemoryUtil.getAddress0(groupString_length), MemoryUtil.getAddress(groupString), function_pointer); + groupString.limit(groupString_length.get(0)); + return APIUtil.getString(caps, groupString); + } + + public static void glGetPerfMonitorCounterStringAMD(int group, int counter, IntBuffer length, ByteBuffer counterString) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCounterStringAMD; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + if (counterString != null) + BufferChecks.checkDirect(counterString); + nglGetPerfMonitorCounterStringAMD(group, counter, (counterString == null ? 0 : counterString.remaining()), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddressSafe(counterString), function_pointer); + } + static native void nglGetPerfMonitorCounterStringAMD(int group, int counter, int counterString_bufSize, long length, long counterString, long function_pointer); + + /** Overloads glGetPerfMonitorCounterStringAMD. */ + public static String glGetPerfMonitorCounterStringAMD(int group, int counter, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCounterStringAMD; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer counterString_length = APIUtil.getLengths(caps); + ByteBuffer counterString = APIUtil.getBufferByte(caps, bufSize); + nglGetPerfMonitorCounterStringAMD(group, counter, bufSize, MemoryUtil.getAddress0(counterString_length), MemoryUtil.getAddress(counterString), function_pointer); + counterString.limit(counterString_length.get(0)); + return APIUtil.getString(caps, counterString); + } + + public static void glGetPerfMonitorCounterInfoAMD(int group, int counter, int pname, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCounterInfoAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 16); + nglGetPerfMonitorCounterInfoAMD(group, counter, pname, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetPerfMonitorCounterInfoAMD(int group, int counter, int pname, long data, long function_pointer); + + public static void glGenPerfMonitorsAMD(IntBuffer monitors) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenPerfMonitorsAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(monitors); + nglGenPerfMonitorsAMD(monitors.remaining(), MemoryUtil.getAddress(monitors), function_pointer); + } + static native void nglGenPerfMonitorsAMD(int monitors_n, long monitors, long function_pointer); + + /** Overloads glGenPerfMonitorsAMD. */ + public static int glGenPerfMonitorsAMD() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenPerfMonitorsAMD; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer monitors = APIUtil.getBufferInt(caps); + nglGenPerfMonitorsAMD(1, MemoryUtil.getAddress(monitors), function_pointer); + return monitors.get(0); + } + + public static void glDeletePerfMonitorsAMD(IntBuffer monitors) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeletePerfMonitorsAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(monitors); + nglDeletePerfMonitorsAMD(monitors.remaining(), MemoryUtil.getAddress(monitors), function_pointer); + } + static native void nglDeletePerfMonitorsAMD(int monitors_n, long monitors, long function_pointer); + + /** Overloads glDeletePerfMonitorsAMD. */ + public static void glDeletePerfMonitorsAMD(int monitor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeletePerfMonitorsAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeletePerfMonitorsAMD(1, APIUtil.getInt(caps, monitor), function_pointer); + } + + public static void glSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, IntBuffer counterList) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSelectPerfMonitorCountersAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(counterList); + nglSelectPerfMonitorCountersAMD(monitor, enable, group, counterList.remaining(), MemoryUtil.getAddress(counterList), function_pointer); + } + static native void nglSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, int counterList_numCounters, long counterList, long function_pointer); + + /** Overloads glSelectPerfMonitorCountersAMD. */ + public static void glSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, int counter) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSelectPerfMonitorCountersAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglSelectPerfMonitorCountersAMD(monitor, enable, group, 1, APIUtil.getInt(caps, counter), function_pointer); + } + + public static void glBeginPerfMonitorAMD(int monitor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginPerfMonitorAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginPerfMonitorAMD(monitor, function_pointer); + } + static native void nglBeginPerfMonitorAMD(int monitor, long function_pointer); + + public static void glEndPerfMonitorAMD(int monitor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndPerfMonitorAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndPerfMonitorAMD(monitor, function_pointer); + } + static native void nglEndPerfMonitorAMD(int monitor, long function_pointer); + + public static void glGetPerfMonitorCounterDataAMD(int monitor, int pname, IntBuffer data, IntBuffer bytesWritten) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCounterDataAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + if (bytesWritten != null) + BufferChecks.checkBuffer(bytesWritten, 1); + nglGetPerfMonitorCounterDataAMD(monitor, pname, data.remaining(), MemoryUtil.getAddress(data), MemoryUtil.getAddressSafe(bytesWritten), function_pointer); + } + static native void nglGetPerfMonitorCounterDataAMD(int monitor, int pname, int data_dataSize, long data, long bytesWritten, long function_pointer); + + /** Overloads glGetPerfMonitorCounterDataAMD. */ + public static int glGetPerfMonitorCounterDataAMD(int monitor, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPerfMonitorCounterDataAMD; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer data = APIUtil.getBufferInt(caps); + nglGetPerfMonitorCounterDataAMD(monitor, pname, 4, MemoryUtil.getAddress(data), 0L, function_pointer); + return data.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPinnedMemory.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPinnedMemory.java new file mode 100644 index 0000000..fa6f2ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDPinnedMemory.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDPinnedMemory { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, GetBufferPointerv, MapBufferRange: + */ + public static final int GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD = 0x9160; + + private AMDPinnedMemory() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDQueryBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDQueryBufferObject.java new file mode 100644 index 0000000..b19df1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDQueryBufferObject.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDQueryBufferObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + public static final int GL_QUERY_RESULT_NO_WAIT_AMD = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv + * and GetBufferPointerv: + */ + public static final int GL_QUERY_BUFFER_AMD = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_QUERY_BUFFER_BINDING_AMD = 0x9193; + + private AMDQueryBufferObject() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSamplePositions.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSamplePositions.java new file mode 100644 index 0000000..a4916dc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSamplePositions.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDSamplePositions { + + /** + * Accepted by the &lt;pname&gt; parameter of GetFloatv: + */ + public static final int GL_SUBSAMPLE_DISTANCE_AMD = 0x883F; + + private AMDSamplePositions() {} + + public static void glSetMultisampleAMD(int pname, int index, FloatBuffer val) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetMultisamplefvAMD; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(val, 2); + nglSetMultisamplefvAMD(pname, index, MemoryUtil.getAddress(val), function_pointer); + } + static native void nglSetMultisamplefvAMD(int pname, int index, long val, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java new file mode 100644 index 0000000..519e7f1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSeamlessCubemapPerTexture.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDSeamlessCubemapPerTexture { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private AMDSeamlessCubemapPerTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSparseTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSparseTexture.java new file mode 100644 index 0000000..8d74608 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDSparseTexture.java @@ -0,0 +1,58 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDSparseTexture { + + /** + * Accepted by the &lt;flags&gt; parameter to TexStorageSparseAMD and TextureStorageSparseAMD: + */ + public static final int GL_TEXTURE_STORAGE_SPARSE_BIT_AMD = 0x1; + + /** + * Accepted by the &lt;pname&gt; parameter to GetInternalformativ: + */ + public static final int GL_VIRTUAL_PAGE_SIZE_X_AMD = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_AMD = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_AMD = 0x9197; + + /** + * Accepted by the &lt;pname&gt; parameter to GetIntegerv, GetFloatv, GetDoublev, + * GetInteger64v, and GetBooleanv: + */ + public static final int GL_MAX_SPARSE_TEXTURE_SIZE_AMD = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS = 0x919A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexParameter{if}v: + */ + public static final int GL_MIN_SPARSE_LEVEL_AMD = 0x919B; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter{if}{v} and + * GetTexParameter{if}v: + */ + public static final int GL_MIN_LOD_WARNING_AMD = 0x919C; + + private AMDSparseTexture() {} + + public static void glTexStorageSparseAMD(int target, int internalFormat, int width, int height, int depth, int layers, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorageSparseAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorageSparseAMD(target, internalFormat, width, height, depth, layers, flags, function_pointer); + } + static native void nglTexStorageSparseAMD(int target, int internalFormat, int width, int height, int depth, int layers, int flags, long function_pointer); + + public static void glTextureStorageSparseAMD(int texture, int target, int internalFormat, int width, int height, int depth, int layers, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorageSparseAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorageSparseAMD(texture, target, internalFormat, width, height, depth, layers, flags, function_pointer); + } + static native void nglTextureStorageSparseAMD(int texture, int target, int internalFormat, int width, int height, int depth, int layers, int flags, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDStencilOperationExtended.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDStencilOperationExtended.java new file mode 100644 index 0000000..d26709b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDStencilOperationExtended.java @@ -0,0 +1,39 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDStencilOperationExtended { + + /** + * Accepted by the &lt;sfail&gt;, &lt;dpfail&gt; and &lt;dppass&gt; parameters of StencilOp + * and StencilOpSeparate: + */ + public static final int GL_SET_AMD = 0x874A, + GL_AND = 0x1501, + GL_XOR = 0x1506, + GL_OR = 0x1507, + GL_NOR = 0x1508, + GL_EQUIV = 0x1509, + GL_NAND = 0x150E, + GL_REPLACE_VALUE_AMD = 0x874B; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerv, GetFloatv, GetBooleanv + * GetDoublev and GetInteger64v: + */ + public static final int GL_STENCIL_OP_VALUE_AMD = 0x874C, + GL_STENCIL_BACK_OP_VALUE_AMD = 0x874D; + + private AMDStencilOperationExtended() {} + + public static void glStencilOpValueAMD(int face, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilOpValueAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilOpValueAMD(face, value, function_pointer); + } + static native void nglStencilOpValueAMD(int face, int value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDVertexShaderTessellator.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDVertexShaderTessellator.java new file mode 100644 index 0000000..4225a5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/AMDVertexShaderTessellator.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDVertexShaderTessellator { + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_BUFFER_AMD = 0x9001, + GL_INT_SAMPLER_BUFFER_AMD = 0x9002, + GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD = 0x9003; + + /** + * Accepted by TessellationModeAMD + */ + public static final int GL_DISCRETE_AMD = 0x9006, + GL_CONTINUOUS_AMD = 0x9007; + + /** + * Accepted by GetIntegerv + */ + public static final int GL_TESSELLATION_MODE_AMD = 0x9004; + + /** + * Accepted by GetFloatv + */ + public static final int GL_TESSELLATION_FACTOR_AMD = 0x9005; + + private AMDVertexShaderTessellator() {} + + public static void glTessellationFactorAMD(float factor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTessellationFactorAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglTessellationFactorAMD(factor, function_pointer); + } + static native void nglTessellationFactorAMD(float factor, long function_pointer); + + public static void glTessellationModeAMD(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTessellationModeAMD; + BufferChecks.checkFunctionAddress(function_pointer); + nglTessellationModeAMD(mode, function_pointer); + } + static native void nglTessellationModeAMD(int mode, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEAuxDepthStencil.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEAuxDepthStencil.java new file mode 100644 index 0000000..19c929b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEAuxDepthStencil.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEAuxDepthStencil { + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv. + */ + public static final int GL_AUX_DEPTH_STENCIL_APPLE = 0x8A14; + + private APPLEAuxDepthStencil() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEClientStorage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEClientStorage.java new file mode 100644 index 0000000..8412c99 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEClientStorage.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEClientStorage { + + /** + * Accepted by the &lt;pname&gt; parameters of PixelStore: + */ + public static final int GL_UNPACK_CLIENT_STORAGE_APPLE = 0x85B2; + + private APPLEClientStorage() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEElementArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEElementArray.java new file mode 100644 index 0000000..46bb1d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEElementArray.java @@ -0,0 +1,87 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEElementArray { + + /** + * Accepted by the &lt;array&gt; parameter of EnableClientState and + * DisableClientState and the &lt;value&gt; parameter of IsEnabled: + */ + public static final int GL_ELEMENT_ARRAY_APPLE = 0x8768; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_ELEMENT_ARRAY_TYPE_APPLE = 0x8769; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_ELEMENT_ARRAY_POINTER_APPLE = 0x876A; + + private APPLEElementArray() {} + + public static void glElementPointerAPPLE(ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglElementPointerAPPLE(GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glElementPointerAPPLE(IntBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglElementPointerAPPLE(GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glElementPointerAPPLE(ShortBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglElementPointerAPPLE(GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglElementPointerAPPLE(int type, long pointer, long function_pointer); + + public static void glDrawElementArrayAPPLE(int mode, int first, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawElementArrayAPPLE(mode, first, count, function_pointer); + } + static native void nglDrawElementArrayAPPLE(int mode, int first, int count, long function_pointer); + + public static void glDrawRangeElementArrayAPPLE(int mode, int start, int end, int first, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawRangeElementArrayAPPLE(mode, start, end, first, count, function_pointer); + } + static native void nglDrawRangeElementArrayAPPLE(int mode, int start, int end, int first, int count, long function_pointer); + + public static void glMultiDrawElementArrayAPPLE(int mode, IntBuffer first, IntBuffer count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(first); + BufferChecks.checkBuffer(count, first.remaining()); + nglMultiDrawElementArrayAPPLE(mode, MemoryUtil.getAddress(first), MemoryUtil.getAddress(count), first.remaining(), function_pointer); + } + static native void nglMultiDrawElementArrayAPPLE(int mode, long first, long count, int first_primcount, long function_pointer); + + public static void glMultiDrawRangeElementArrayAPPLE(int mode, int start, int end, IntBuffer first, IntBuffer count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawRangeElementArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(first); + BufferChecks.checkBuffer(count, first.remaining()); + nglMultiDrawRangeElementArrayAPPLE(mode, start, end, MemoryUtil.getAddress(first), MemoryUtil.getAddress(count), first.remaining(), function_pointer); + } + static native void nglMultiDrawRangeElementArrayAPPLE(int mode, int start, int end, long first, long count, int first_primcount, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFence.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFence.java new file mode 100644 index 0000000..feb1fc1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFence.java @@ -0,0 +1,104 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEFence { + + /** + * Accepted by the &lt;object&gt; parameter of TestObjectAPPLE and FinishObjectAPPLE: + */ + public static final int GL_DRAW_PIXELS_APPLE = 0x8A0A, + GL_FENCE_APPLE = 0x8A0B; + + private APPLEFence() {} + + public static void glGenFencesAPPLE(IntBuffer fences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFencesAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(fences); + nglGenFencesAPPLE(fences.remaining(), MemoryUtil.getAddress(fences), function_pointer); + } + static native void nglGenFencesAPPLE(int fences_n, long fences, long function_pointer); + + /** Overloads glGenFencesAPPLE. */ + public static int glGenFencesAPPLE() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFencesAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer fences = APIUtil.getBufferInt(caps); + nglGenFencesAPPLE(1, MemoryUtil.getAddress(fences), function_pointer); + return fences.get(0); + } + + public static void glDeleteFencesAPPLE(IntBuffer fences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFencesAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(fences); + nglDeleteFencesAPPLE(fences.remaining(), MemoryUtil.getAddress(fences), function_pointer); + } + static native void nglDeleteFencesAPPLE(int fences_n, long fences, long function_pointer); + + /** Overloads glDeleteFencesAPPLE. */ + public static void glDeleteFencesAPPLE(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFencesAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteFencesAPPLE(1, APIUtil.getInt(caps, fence), function_pointer); + } + + public static void glSetFenceAPPLE(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetFenceAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglSetFenceAPPLE(fence, function_pointer); + } + static native void nglSetFenceAPPLE(int fence, long function_pointer); + + public static boolean glIsFenceAPPLE(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsFenceAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsFenceAPPLE(fence, function_pointer); + return __result; + } + static native boolean nglIsFenceAPPLE(int fence, long function_pointer); + + public static boolean glTestFenceAPPLE(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTestFenceAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglTestFenceAPPLE(fence, function_pointer); + return __result; + } + static native boolean nglTestFenceAPPLE(int fence, long function_pointer); + + public static void glFinishFenceAPPLE(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFinishFenceAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglFinishFenceAPPLE(fence, function_pointer); + } + static native void nglFinishFenceAPPLE(int fence, long function_pointer); + + public static boolean glTestObjectAPPLE(int object, int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTestObjectAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglTestObjectAPPLE(object, name, function_pointer); + return __result; + } + static native boolean nglTestObjectAPPLE(int object, int name, long function_pointer); + + public static void glFinishObjectAPPLE(int object, int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFinishObjectAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglFinishObjectAPPLE(object, name, function_pointer); + } + static native void nglFinishObjectAPPLE(int object, int name, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFloatPixels.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFloatPixels.java new file mode 100644 index 0000000..6751ba3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFloatPixels.java @@ -0,0 +1,40 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEFloatPixels { + + /** + * Accepted by the parameters of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + public static final int GL_HALF_APPLE = 0x140B; + + /** + * Accepted by the GetBooleanv: + */ + public static final int GL_COLOR_FLOAT_APPLE = 0x8A0F; + + /** + * Accepted by the parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA_FLOAT32_APPLE = 0x8814, + GL_RGB_FLOAT32_APPLE = 0x8815, + GL_ALPHA_FLOAT32_APPLE = 0x8816, + GL_INTENSITY_FLOAT32_APPLE = 0x8817, + GL_LUMINANCE_FLOAT32_APPLE = 0x8818, + GL_LUMINANCE_ALPHA_FLOAT32_APPLE = 0x8819, + GL_RGBA_FLOAT16_APPLE = 0x881A, + GL_RGB_FLOAT16_APPLE = 0x881B, + GL_ALPHA_FLOAT16_APPLE = 0x881C, + GL_INTENSITY_FLOAT16_APPLE = 0x881D, + GL_LUMINANCE_FLOAT16_APPLE = 0x881E, + GL_LUMINANCE_ALPHA_FLOAT16_APPLE = 0x881F; + + private APPLEFloatPixels() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFlushBufferRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFlushBufferRange.java new file mode 100644 index 0000000..071a168 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEFlushBufferRange.java @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEFlushBufferRange { + + /** + * Accepted by the &lt;pname&gt; parameter of BufferParameteriAPPLE and + * GetBufferParameteriv: + */ + public static final int GL_BUFFER_SERIALIZED_MODIFY_APPLE = 0x8A12, + GL_BUFFER_FLUSHING_UNMAP_APPLE = 0x8A13; + + private APPLEFlushBufferRange() {} + + public static void glBufferParameteriAPPLE(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferParameteriAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglBufferParameteriAPPLE(target, pname, param, function_pointer); + } + static native void nglBufferParameteriAPPLE(int target, int pname, int param, long function_pointer); + + public static void glFlushMappedBufferRangeAPPLE(int target, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushMappedBufferRangeAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlushMappedBufferRangeAPPLE(target, offset, size, function_pointer); + } + static native void nglFlushMappedBufferRangeAPPLE(int target, long offset, long size, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEObjectPurgeable.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEObjectPurgeable.java new file mode 100644 index 0000000..ec75a54 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEObjectPurgeable.java @@ -0,0 +1,73 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEObjectPurgeable { + + /** + * Accepted by the &lt;option&gt; parameter of ObjectPurgeable, and returned + * by ObjectPurgeable: + */ + public static final int GL_RELEASED_APPLE = 0x8A19, + GL_VOLATILE_APPLE = 0x8A1A; + + /** + * Accepted by the &lt;option&gt; parameters of ObjectUnpurgeable, and + * returned by ObjectUnpurgeable: + */ + public static final int GL_RETAINED_APPLE = 0x8A1B, + GL_UNDEFINED_APPLE = 0x8A1C; + + /** + * Accepted by the &lt;pname&gt; parameters of GetObjectParameteriv: + */ + public static final int GL_PURGEABLE_APPLE = 0x8A1D; + + /** + * Accepted by the &lt;objectType&gt; parameters of ObjectPurgeableAPPLE, + * ObjectUnpurgeableAPPLE and GetObjectParameteriv: + */ + public static final int GL_BUFFER_OBJECT_APPLE = 0x85B3; + + private APPLEObjectPurgeable() {} + + public static int glObjectPurgeableAPPLE(int objectType, int name, int option) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectPurgeableAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglObjectPurgeableAPPLE(objectType, name, option, function_pointer); + return __result; + } + static native int nglObjectPurgeableAPPLE(int objectType, int name, int option, long function_pointer); + + public static int glObjectUnpurgeableAPPLE(int objectType, int name, int option) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectUnpurgeableAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglObjectUnpurgeableAPPLE(objectType, name, option, function_pointer); + return __result; + } + static native int nglObjectUnpurgeableAPPLE(int objectType, int name, int option, long function_pointer); + + public static void glGetObjectParameterAPPLE(int objectType, int name, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterivAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetObjectParameterivAPPLE(objectType, name, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetObjectParameterivAPPLE(int objectType, int name, int pname, long params, long function_pointer); + + /** Overloads glGetObjectParameterivAPPLE. */ + public static int glGetObjectParameteriAPPLE(int objectType, int name, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterivAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetObjectParameterivAPPLE(objectType, name, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEPackedPixels.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEPackedPixels.java new file mode 100644 index 0000000..a809881 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEPackedPixels.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEPackedPixels { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, SeparableFilter3D, + * GetSeparableFilter, ColorTable, GetColorTable, TexImage4DSGIS, + * and TexSubImage4DSGIS: + */ + public static final int GL_UNSIGNED_BYTE_3_3_2 = 0x8032, + GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363, + GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364, + GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366, + GL_UNSIGNED_INT_8_8_8_8 = 0x8035, + GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367, + GL_UNSIGNED_INT_10_10_10_2 = 0x8036, + GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + + private APPLEPackedPixels() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERgb422.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERgb422.java new file mode 100644 index 0000000..4cb1783 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERgb422.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLERgb422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + public static final int GL_RGB_422_APPLE = 0x8A1F; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + public static final int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA, + GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + + private APPLERgb422() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERowBytes.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERowBytes.java new file mode 100644 index 0000000..48a5c8a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLERowBytes.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLERowBytes { + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStorei and the &lt;pname&gt; + * parameter of GetIntegerv: + */ + public static final int GL_PACK_ROW_BYTES_APPLE = 0x8A15, + GL_UNPACK_ROW_BYTES_APPLE = 0x8A16; + + private APPLERowBytes() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLETextureRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLETextureRange.java new file mode 100644 index 0000000..1c74631 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLETextureRange.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLETextureRange { + + /** + * Accepted by the <pname> parameters of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and + * GetTexParameterfv: + */ + public static final int GL_TEXTURE_STORAGE_HINT_APPLE = 0x85BC; + + /** + * Accepted by the <param> parameters of TexParameteri, TexParameterf, + * TexParameteriv, and TexParameterfv: + */ + public static final int GL_STORAGE_PRIVATE_APPLE = 0x85BD, + GL_STORAGE_CACHED_APPLE = 0x85BE, + GL_STORAGE_SHARED_APPLE = 0x85BF; + + /** + * Accepted by the <pname> parameters of GetTexParameteriv and + * GetTexParameterfv: + */ + public static final int GL_TEXTURE_RANGE_LENGTH_APPLE = 0x85B7; + + /** + * Accepted by the <pname> parameters of GetTexParameterPointerv: + */ + public static final int GL_TEXTURE_RANGE_POINTER_APPLE = 0x85B8; + + private APPLETextureRange() {} + + public static void glTextureRangeAPPLE(int target, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureRangeAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglTextureRangeAPPLE(target, pointer.remaining(), MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglTextureRangeAPPLE(int target, int pointer_length, long pointer, long function_pointer); + + public static Buffer glGetTexParameterPointervAPPLE(int target, int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterPointervAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + Buffer __result = nglGetTexParameterPointervAPPLE(target, pname, result_size, function_pointer); + return __result; + } + static native Buffer nglGetTexParameterPointervAPPLE(int target, int pname, long result_size, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayObject.java new file mode 100644 index 0000000..003863a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayObject.java @@ -0,0 +1,70 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEVertexArrayObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_VERTEX_ARRAY_BINDING_APPLE = 0x85B5; + + private APPLEVertexArrayObject() {} + + public static void glBindVertexArrayAPPLE(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVertexArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindVertexArrayAPPLE(array, function_pointer); + } + static native void nglBindVertexArrayAPPLE(int array, long function_pointer); + + public static void glDeleteVertexArraysAPPLE(IntBuffer arrays) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteVertexArraysAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arrays); + nglDeleteVertexArraysAPPLE(arrays.remaining(), MemoryUtil.getAddress(arrays), function_pointer); + } + static native void nglDeleteVertexArraysAPPLE(int arrays_n, long arrays, long function_pointer); + + /** Overloads glDeleteVertexArraysAPPLE. */ + public static void glDeleteVertexArraysAPPLE(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteVertexArraysAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteVertexArraysAPPLE(1, APIUtil.getInt(caps, array), function_pointer); + } + + public static void glGenVertexArraysAPPLE(IntBuffer arrays) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenVertexArraysAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arrays); + nglGenVertexArraysAPPLE(arrays.remaining(), MemoryUtil.getAddress(arrays), function_pointer); + } + static native void nglGenVertexArraysAPPLE(int arrays_n, long arrays, long function_pointer); + + /** Overloads glGenVertexArraysAPPLE. */ + public static int glGenVertexArraysAPPLE() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenVertexArraysAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer arrays = APIUtil.getBufferInt(caps); + nglGenVertexArraysAPPLE(1, MemoryUtil.getAddress(arrays), function_pointer); + return arrays.get(0); + } + + public static boolean glIsVertexArrayAPPLE(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsVertexArrayAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsVertexArrayAPPLE(array, function_pointer); + return __result; + } + static native boolean nglIsVertexArrayAPPLE(int array, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayRange.java new file mode 100644 index 0000000..91de23d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexArrayRange.java @@ -0,0 +1,73 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEVertexArrayRange { + + /** + * Accepted by the &lt;cap&gt; parameter of EnableClientState, DisableClientState, + * and IsEnabled: + */ + public static final int GL_VERTEX_ARRAY_RANGE_APPLE = 0x851D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE = 0x851E, + GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE = 0x8520; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_VERTEX_ARRAY_RANGE_POINTER_APPLE = 0x8521; + + /** + * Accepted by the &lt;pname&gt; parameter of VertexArrayParameteriAPPLE, + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_VERTEX_ARRAY_STORAGE_HINT_APPLE = 0x851F; + + /** + * Accepted by the &lt;param&gt; parameter of VertexArrayParameteriAPPLE: + */ + public static final int GL_STORAGE_CACHED_APPLE = 0x85BE, + GL_STORAGE_SHARED_APPLE = 0x85BF; + + /** + * Accepted by the &lt;object&gt; parameter of TestObjectAPPLE and FinishObjectAPPLE: + */ + public static final int GL_DRAW_PIXELS_APPLE = 0x8A0A, + GL_FENCE_APPLE = 0x8A0B; + + private APPLEVertexArrayRange() {} + + public static void glVertexArrayRangeAPPLE(ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglVertexArrayRangeAPPLE(pointer.remaining(), MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglVertexArrayRangeAPPLE(int pointer_length, long pointer, long function_pointer); + + public static void glFlushVertexArrayRangeAPPLE(ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushVertexArrayRangeAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglFlushVertexArrayRangeAPPLE(pointer.remaining(), MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglFlushVertexArrayRangeAPPLE(int pointer_length, long pointer, long function_pointer); + + public static void glVertexArrayParameteriAPPLE(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayParameteriAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayParameteriAPPLE(pname, param, function_pointer); + } + static native void nglVertexArrayParameteriAPPLE(int pname, int param, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexProgramEvaluators.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexProgramEvaluators.java new file mode 100644 index 0000000..4e939e3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEVertexProgramEvaluators.java @@ -0,0 +1,92 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEVertexProgramEvaluators { + + /** + * Accepted by the &lt;pname&gt; parameter of EnableVertexAttribAPPLE, + * DisableVertexAttribAPPLE, and IsVertexAttribEnabledAPPLE. + */ + public static final int GL_VERTEX_ATTRIB_MAP1_APPLE = 0x8A00, + GL_VERTEX_ATTRIB_MAP2_APPLE = 0x8A01; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribdvARB, + * GetVertexAttribfvARB, and GetVertexAttribivARB. + */ + public static final int GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE = 0x8A02, + GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE = 0x8A03, + GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE = 0x8A04, + GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE = 0x8A05, + GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE = 0x8A06, + GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE = 0x8A07, + GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE = 0x8A08, + GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE = 0x8A09; + + private APPLEVertexProgramEvaluators() {} + + public static void glEnableVertexAttribAPPLE(int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVertexAttribAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVertexAttribAPPLE(index, pname, function_pointer); + } + static native void nglEnableVertexAttribAPPLE(int index, int pname, long function_pointer); + + public static void glDisableVertexAttribAPPLE(int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVertexAttribAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVertexAttribAPPLE(index, pname, function_pointer); + } + static native void nglDisableVertexAttribAPPLE(int index, int pname, long function_pointer); + + public static boolean glIsVertexAttribEnabledAPPLE(int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsVertexAttribEnabledAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsVertexAttribEnabledAPPLE(index, pname, function_pointer); + return __result; + } + static native boolean nglIsVertexAttribEnabledAPPLE(int index, int pname, long function_pointer); + + public static void glMapVertexAttrib1dAPPLE(int index, int size, double u1, double u2, int stride, int order, DoubleBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapVertexAttrib1dAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMapVertexAttrib1dAPPLE(int index, int size, double u1, double u2, int stride, int order, long points, long function_pointer); + + public static void glMapVertexAttrib1fAPPLE(int index, int size, float u1, float u2, int stride, int order, FloatBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapVertexAttrib1fAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMapVertexAttrib1fAPPLE(int index, int size, float u1, float u2, int stride, int order, long points, long function_pointer); + + public static void glMapVertexAttrib2dAPPLE(int index, int size, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, DoubleBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapVertexAttrib2dAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMapVertexAttrib2dAPPLE(int index, int size, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, long points, long function_pointer); + + public static void glMapVertexAttrib2fAPPLE(int index, int size, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, FloatBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapVertexAttrib2fAPPLE; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMapVertexAttrib2fAPPLE(int index, int size, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, long points, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEYcbcr422.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEYcbcr422.java new file mode 100644 index 0000000..11dc502 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/APPLEYcbcr422.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEYcbcr422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, + * SeparableFilter2D, SeparableFilter3D, GetSeparableFilter, ColorTable, + * GetColorTable: + */ + public static final int GL_YCBCR_422_APPLE = 0x85B9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, + * SeparableFilter2D, SeparableFilter3D, GetSeparableFilter, ColorTable, + * GetColorTable: + */ + public static final int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA, + GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + + private APPLEYcbcr422() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBaseInstance.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBaseInstance.java new file mode 100644 index 0000000..f89496e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBaseInstance.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBBaseInstance { + + private ARBBaseInstance() {} + + public static void glDrawArraysInstancedBaseInstance(int mode, int first, int count, int primcount, int baseinstance) { + GL42.glDrawArraysInstancedBaseInstance(mode, first, count, primcount, baseinstance); + } + + public static void glDrawElementsInstancedBaseInstance(int mode, ByteBuffer indices, int primcount, int baseinstance) { + GL42.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + public static void glDrawElementsInstancedBaseInstance(int mode, IntBuffer indices, int primcount, int baseinstance) { + GL42.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + public static void glDrawElementsInstancedBaseInstance(int mode, ShortBuffer indices, int primcount, int baseinstance) { + GL42.glDrawElementsInstancedBaseInstance(mode, indices, primcount, baseinstance); + } + public static void glDrawElementsInstancedBaseInstance(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int baseinstance) { + GL42.glDrawElementsInstancedBaseInstance(mode, indices_count, type, indices_buffer_offset, primcount, baseinstance); + } + + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, ByteBuffer indices, int primcount, int basevertex, int baseinstance) { + GL42.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, IntBuffer indices, int primcount, int basevertex, int baseinstance) { + GL42.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, ShortBuffer indices, int primcount, int basevertex, int baseinstance) { + GL42.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices, primcount, basevertex, baseinstance); + } + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex, int baseinstance) { + GL42.glDrawElementsInstancedBaseVertexBaseInstance(mode, indices_count, type, indices_buffer_offset, primcount, basevertex, baseinstance); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBindlessTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBindlessTexture.java new file mode 100644 index 0000000..92f4b4f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBindlessTexture.java @@ -0,0 +1,153 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBBindlessTexture { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribLPointer: + */ + public static final int GL_UNSIGNED_INT64_ARB = 0x140F; + + private ARBBindlessTexture() {} + + public static long glGetTextureHandleARB(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureHandleARB; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetTextureHandleARB(texture, function_pointer); + return __result; + } + static native long nglGetTextureHandleARB(int texture, long function_pointer); + + public static long glGetTextureSamplerHandleARB(int texture, int sampler) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureSamplerHandleARB; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetTextureSamplerHandleARB(texture, sampler, function_pointer); + return __result; + } + static native long nglGetTextureSamplerHandleARB(int texture, int sampler, long function_pointer); + + public static void glMakeTextureHandleResidentARB(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeTextureHandleResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeTextureHandleResidentARB(handle, function_pointer); + } + static native void nglMakeTextureHandleResidentARB(long handle, long function_pointer); + + public static void glMakeTextureHandleNonResidentARB(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeTextureHandleNonResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeTextureHandleNonResidentARB(handle, function_pointer); + } + static native void nglMakeTextureHandleNonResidentARB(long handle, long function_pointer); + + public static long glGetImageHandleARB(int texture, int level, boolean layered, int layer, int format) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetImageHandleARB; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetImageHandleARB(texture, level, layered, layer, format, function_pointer); + return __result; + } + static native long nglGetImageHandleARB(int texture, int level, boolean layered, int layer, int format, long function_pointer); + + public static void glMakeImageHandleResidentARB(long handle, int access) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeImageHandleResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeImageHandleResidentARB(handle, access, function_pointer); + } + static native void nglMakeImageHandleResidentARB(long handle, int access, long function_pointer); + + public static void glMakeImageHandleNonResidentARB(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeImageHandleNonResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeImageHandleNonResidentARB(handle, function_pointer); + } + static native void nglMakeImageHandleNonResidentARB(long handle, long function_pointer); + + public static void glUniformHandleui64ARB(int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformHandleui64ARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniformHandleui64ARB(location, value, function_pointer); + } + static native void nglUniformHandleui64ARB(int location, long value, long function_pointer); + + public static void glUniformHandleuARB(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformHandleui64vARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformHandleui64vARB(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformHandleui64vARB(int location, int value_count, long value, long function_pointer); + + public static void glProgramUniformHandleui64ARB(int program, int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformHandleui64ARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniformHandleui64ARB(program, location, value, function_pointer); + } + static native void nglProgramUniformHandleui64ARB(int program, int location, long value, long function_pointer); + + public static void glProgramUniformHandleuARB(int program, int location, LongBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformHandleui64vARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglProgramUniformHandleui64vARB(program, location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglProgramUniformHandleui64vARB(int program, int location, int values_count, long values, long function_pointer); + + public static boolean glIsTextureHandleResidentARB(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsTextureHandleResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsTextureHandleResidentARB(handle, function_pointer); + return __result; + } + static native boolean nglIsTextureHandleResidentARB(long handle, long function_pointer); + + public static boolean glIsImageHandleResidentARB(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsImageHandleResidentARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsImageHandleResidentARB(handle, function_pointer); + return __result; + } + static native boolean nglIsImageHandleResidentARB(long handle, long function_pointer); + + public static void glVertexAttribL1ui64ARB(int index, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1ui64ARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL1ui64ARB(index, x, function_pointer); + } + static native void nglVertexAttribL1ui64ARB(int index, long x, long function_pointer); + + public static void glVertexAttribL1uARB(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1ui64vARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribL1ui64vARB(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL1ui64vARB(int index, long v, long function_pointer); + + public static void glGetVertexAttribLuARB(int index, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribLui64vARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribLui64vARB(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribLui64vARB(int index, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBlendFuncExtended.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBlendFuncExtended.java new file mode 100644 index 0000000..2bb4c78 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBlendFuncExtended.java @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBBlendFuncExtended { + + /** + * Accepted by the &lt;src&gt; and &lt;dst&gt; parameters of BlendFunc and + * BlendFunci, and by the &lt;srcRGB&gt;, &lt;dstRGB&gt;, &lt;srcAlpha&gt; and &lt;dstAlpha&gt; + * parameters of BlendFuncSeparate and BlendFuncSeparatei: + */ + public static final int GL_SRC1_COLOR = 0x88F9, + GL_SRC1_ALPHA = 0x8589, + GL_ONE_MINUS_SRC1_COLOR = 0x88FA, + GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + public static final int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + private ARBBlendFuncExtended() {} + + public static void glBindFragDataLocationIndexed(int program, int colorNumber, int index, ByteBuffer name) { + GL33.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + /** Overloads glBindFragDataLocationIndexed. */ + public static void glBindFragDataLocationIndexed(int program, int colorNumber, int index, CharSequence name) { + GL33.glBindFragDataLocationIndexed(program, colorNumber, index, name); + } + + public static int glGetFragDataIndex(int program, ByteBuffer name) { + return GL33.glGetFragDataIndex(program, name); + } + + /** Overloads glGetFragDataIndex. */ + public static int glGetFragDataIndex(int program, CharSequence name) { + return GL33.glGetFragDataIndex(program, name); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferObject.java new file mode 100644 index 0000000..eef8990 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferObject.java @@ -0,0 +1,323 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public class ARBBufferObject { + + /** + * Accepted by the &lt;usage&gt; parameter of BufferDataARB: + */ + public static final int GL_STREAM_DRAW_ARB = 0x88E0, + GL_STREAM_READ_ARB = 0x88E1, + GL_STREAM_COPY_ARB = 0x88E2, + GL_STATIC_DRAW_ARB = 0x88E4, + GL_STATIC_READ_ARB = 0x88E5, + GL_STATIC_COPY_ARB = 0x88E6, + GL_DYNAMIC_DRAW_ARB = 0x88E8, + GL_DYNAMIC_READ_ARB = 0x88E9, + GL_DYNAMIC_COPY_ARB = 0x88EA; + + /** + * Accepted by the &lt;access&gt; parameter of MapBufferARB: + */ + public static final int GL_READ_ONLY_ARB = 0x88B8, + GL_WRITE_ONLY_ARB = 0x88B9, + GL_READ_WRITE_ARB = 0x88BA; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferParameterivARB: + */ + public static final int GL_BUFFER_SIZE_ARB = 0x8764, + GL_BUFFER_USAGE_ARB = 0x8765, + GL_BUFFER_ACCESS_ARB = 0x88BB, + GL_BUFFER_MAPPED_ARB = 0x88BC, + GL_BUFFER_MAP_POINTER_ARB = 0x88BD; + + + public static void glBindBufferARB(int target, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.bindBuffer(caps, target, buffer); + nglBindBufferARB(target, buffer, function_pointer); + } + static native void nglBindBufferARB(int target, int buffer, long function_pointer); + + public static void glDeleteBuffersARB(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglDeleteBuffersARB(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglDeleteBuffersARB(int buffers_n, long buffers, long function_pointer); + + /** Overloads glDeleteBuffersARB. */ + public static void glDeleteBuffersARB(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteBuffersARB(1, APIUtil.getInt(caps, buffer), function_pointer); + } + + public static void glGenBuffersARB(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglGenBuffersARB(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglGenBuffersARB(int buffers_n, long buffers, long function_pointer); + + /** Overloads glGenBuffersARB. */ + public static int glGenBuffersARB() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer buffers = APIUtil.getBufferInt(caps); + nglGenBuffersARB(1, MemoryUtil.getAddress(buffers), function_pointer); + return buffers.get(0); + } + + public static boolean glIsBufferARB(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsBufferARB(buffer, function_pointer); + return __result; + } + static native boolean nglIsBufferARB(int buffer, long function_pointer); + + public static void glBufferDataARB(int target, long data_size, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBufferDataARB(target, data_size, 0L, usage, function_pointer); + } + public static void glBufferDataARB(int target, ByteBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferDataARB(target, data.remaining(), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferDataARB(int target, DoubleBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferDataARB(target, (data.remaining() << 3), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferDataARB(int target, FloatBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferDataARB(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferDataARB(int target, IntBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferDataARB(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferDataARB(int target, ShortBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferDataARB(target, (data.remaining() << 1), MemoryUtil.getAddress(data), usage, function_pointer); + } + static native void nglBufferDataARB(int target, long data_size, long data, int usage, long function_pointer); + + public static void glBufferSubDataARB(int target, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubDataARB(target, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubDataARB(int target, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubDataARB(target, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubDataARB(int target, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubDataARB(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubDataARB(int target, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubDataARB(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubDataARB(int target, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubDataARB(target, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglBufferSubDataARB(int target, long offset, long data_size, long data, long function_pointer); + + public static void glGetBufferSubDataARB(int target, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubDataARB(target, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubDataARB(int target, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubDataARB(target, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubDataARB(int target, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubDataARB(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubDataARB(int target, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubDataARB(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubDataARB(int target, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubDataARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubDataARB(target, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetBufferSubDataARB(int target, long offset, long data_size, long data, long function_pointer); + + /** + * glMapBufferARB maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferARB like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferARB(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferARB(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameterARB internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferARB(int target, int access, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferARB(target, access, GLChecks.getBufferObjectSizeARB(caps, target), old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + /** + * glMapBufferARB maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferARB like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferARB(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferARB(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameterARB internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferARB(int target, int access, long length, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferARB(target, access, length, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBufferARB(int target, int access, long result_size, ByteBuffer old_buffer, long function_pointer); + + public static boolean glUnmapBufferARB(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnmapBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglUnmapBufferARB(target, function_pointer); + return __result; + } + static native boolean nglUnmapBufferARB(int target, long function_pointer); + + public static void glGetBufferParameterARB(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameterivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetBufferParameterivARB(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetBufferParameterivARB(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetBufferParameterivARB. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteriARB} instead. + */ + @Deprecated + public static int glGetBufferParameterARB(int target, int pname) { + return ARBBufferObject.glGetBufferParameteriARB(target, pname); + } + + /** Overloads glGetBufferParameterivARB. */ + public static int glGetBufferParameteriARB(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameterivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetBufferParameterivARB(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static ByteBuffer glGetBufferPointerARB(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferPointervARB; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetBufferPointervARB(target, pname, GLChecks.getBufferObjectSizeARB(caps, target), function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetBufferPointervARB(int target, int pname, long result_size, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferStorage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferStorage.java new file mode 100644 index 0000000..b7a2ade --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBBufferStorage.java @@ -0,0 +1,107 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBBufferStorage { + + /** + * Accepted in the &lt;flags&gt; parameter of BufferStorage and + * NamedBufferStorageEXT: + */ + public static final int GL_MAP_PERSISTENT_BIT = 0x40, + GL_MAP_COHERENT_BIT = 0x80, + GL_DYNAMIC_STORAGE_BIT = 0x100, + GL_CLIENT_STORAGE_BIT = 0x200; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferParameter{i|i64}v:\ + */ + public static final int GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: + */ + public static final int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x4000; + + private ARBBufferStorage() {} + + public static void glBufferStorage(int target, ByteBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + public static void glBufferStorage(int target, DoubleBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + public static void glBufferStorage(int target, FloatBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + public static void glBufferStorage(int target, IntBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + public static void glBufferStorage(int target, ShortBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + public static void glBufferStorage(int target, LongBuffer data, int flags) { + GL44.glBufferStorage(target, data, flags); + } + + /** Overloads glBufferStorage. */ + public static void glBufferStorage(int target, long size, int flags) { + GL44.glBufferStorage(target, size, flags); + } + + public static void glNamedBufferStorageEXT(int buffer, ByteBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, data.remaining(), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glNamedBufferStorageEXT(int buffer, DoubleBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, (data.remaining() << 3), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glNamedBufferStorageEXT(int buffer, FloatBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, (data.remaining() << 2), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glNamedBufferStorageEXT(int buffer, IntBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, (data.remaining() << 2), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glNamedBufferStorageEXT(int buffer, ShortBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, (data.remaining() << 1), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glNamedBufferStorageEXT(int buffer, LongBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferStorageEXT(buffer, (data.remaining() << 3), MemoryUtil.getAddress(data), flags, function_pointer); + } + static native void nglNamedBufferStorageEXT(int buffer, long data_size, long data, int flags, long function_pointer); + + /** Overloads glNamedBufferStorageEXT. */ + public static void glNamedBufferStorageEXT(int buffer, long size, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedBufferStorageEXT(buffer, size, 0L, flags, function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCLEvent.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCLEvent.java new file mode 100644 index 0000000..f7d3893 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCLEvent.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; +import org.lwjgl.opencl.*; + +public final class ARBCLEvent { + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE. + */ + public static final int GL_SYNC_CL_EVENT_ARB = 0x8240; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION. + */ + public static final int GL_SYNC_CL_EVENT_COMPLETE_ARB = 0x8241; + + private ARBCLEvent() {} + + public static GLSync glCreateSyncFromCLeventARB(CLContext context, CLEvent event, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateSyncFromCLeventARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLSync __result = new GLSync(nglCreateSyncFromCLeventARB(context.getPointer(), event.getPointer(), flags, function_pointer)); + return __result; + } + static native long nglCreateSyncFromCLeventARB(long context, long event, int flags, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearBufferObject.java new file mode 100644 index 0000000..82ffbd7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearBufferObject.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBClearBufferObject { + + private ARBClearBufferObject() {} + + public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { + GL43.glClearBufferData(target, internalformat, format, type, data); + } + + public static void glClearBufferSubData(int target, int internalformat, long offset, int format, int type, ByteBuffer data) { + GL43.glClearBufferSubData(target, internalformat, offset, format, type, data); + } + + public static void glClearNamedBufferDataEXT(int buffer, int internalformat, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 1); + nglClearNamedBufferDataEXT(buffer, internalformat, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglClearNamedBufferDataEXT(int buffer, int internalformat, int format, int type, long data, long function_pointer); + + public static void glClearNamedBufferSubDataEXT(int buffer, int internalformat, long offset, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglClearNamedBufferSubDataEXT(buffer, internalformat, offset, data.remaining(), format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglClearNamedBufferSubDataEXT(int buffer, int internalformat, long offset, long data_size, int format, int type, long data, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearTexture.java new file mode 100644 index 0000000..ce82150 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBClearTexture.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBClearTexture { + + /** + * Accepted by the &lt;pname&gt; parameter for GetInternalformativ and + * GetInternalformati64v: + */ + public static final int GL_CLEAR_TEXTURE = 0x9365; + + private ARBClearTexture() {} + + public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + public static void glClearTexImage(int texture, int level, int format, int type, DoubleBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + public static void glClearTexImage(int texture, int level, int format, int type, FloatBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + public static void glClearTexImage(int texture, int level, int format, int type, IntBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + public static void glClearTexImage(int texture, int level, int format, int type, ShortBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + public static void glClearTexImage(int texture, int level, int format, int type, LongBuffer data) { + GL44.glClearTexImage(texture, level, format, type, data); + } + + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, DoubleBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, LongBuffer data) { + GL44.glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBColorBufferFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBColorBufferFloat.java new file mode 100644 index 0000000..59009a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBColorBufferFloat.java @@ -0,0 +1,57 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBColorBufferFloat { + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_RGBA_FLOAT_MODE_ARB = 0x8820; + + /** + * Accepted by the &lt;target&gt; parameter of ClampColorARB and the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_CLAMP_VERTEX_COLOR_ARB = 0x891A, + GL_CLAMP_FRAGMENT_COLOR_ARB = 0x891B, + GL_CLAMP_READ_COLOR_ARB = 0x891C; + + /** + * Accepted by the &lt;clamp&gt; parameter of ClampColorARB. + */ + public static final int GL_FIXED_ONLY_ARB = 0x891D; + + /** + * Accepted as a value in the &lt;piAttribIList&gt; and &lt;pfAttribFList&gt; + * parameter arrays of wglChoosePixelFormatARB, and returned in the + * &lt;piValues&gt; parameter array of wglGetPixelFormatAttribivARB, and the + * &lt;pfValues&gt; parameter array of wglGetPixelFormatAttribfvARB: + */ + public static final int WGL_TYPE_RGBA_FLOAT_ARB = 0x21A0; + + /** + * Accepted as values of the &lt;render_type&gt; arguments in the + * glXCreateNewContext and glXCreateContext functions + */ + public static final int GLX_RGBA_FLOAT_TYPE = 0x20B9; + + /** + * Accepted as a bit set in the GLX_RENDER_TYPE variable + */ + public static final int GLX_RGBA_FLOAT_BIT = 0x4; + + private ARBColorBufferFloat() {} + + public static void glClampColorARB(int target, int clamp) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClampColorARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglClampColorARB(target, clamp, function_pointer); + } + static native void nglClampColorARB(int target, int clamp, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java new file mode 100644 index 0000000..4301b18 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCompressedTexturePixelStorage.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBCompressedTexturePixelStorage { + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStore[fi], GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + private ARBCompressedTexturePixelStorage() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeShader.java new file mode 100644 index 0000000..43bacc2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeShader.java @@ -0,0 +1,79 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBComputeShader { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned in the + * &lt;params&gt; parameter by GetShaderiv: + */ + public static final int GL_COMPUTE_SHADER = 0x91B9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + public static final int GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: + */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** + * Accepted by the &lt;stages&gt; parameter of UseProgramStages: + */ + public static final int GL_COMPUTE_SHADER_BIT = 0x20; + + private ARBComputeShader() {} + + public static void glDispatchCompute(int num_groups_x, int num_groups_y, int num_groups_z) { + GL43.glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); + } + + public static void glDispatchComputeIndirect(long indirect) { + GL43.glDispatchComputeIndirect(indirect); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeVariableGroupSize.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeVariableGroupSize.java new file mode 100644 index 0000000..a076b52 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBComputeVariableGroupSize.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBComputeVariableGroupSize { + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB = 0x9344, + GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB = 0x90EB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + public static final int GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB = 0x9345, + GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB = 0x91BF; + + private ARBComputeVariableGroupSize() {} + + public static void glDispatchComputeGroupSizeARB(int num_groups_x, int num_groups_y, int num_groups_z, int group_size_x, int group_size_y, int group_size_z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDispatchComputeGroupSizeARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z, function_pointer); + } + static native void nglDispatchComputeGroupSizeARB(int num_groups_x, int num_groups_y, int num_groups_z, int group_size_x, int group_size_y, int group_size_z, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyBuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyBuffer.java new file mode 100644 index 0000000..9924a50 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyBuffer.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBCopyBuffer { + + /** + * Accepted by the target parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, + * and CopyBufferSubData: + */ + public static final int GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37; + + private ARBCopyBuffer() {} + + public static void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { + GL31.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyImage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyImage.java new file mode 100644 index 0000000..4547e7c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBCopyImage.java @@ -0,0 +1,15 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBCopyImage { + + private ARBCopyImage() {} + + public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth) { + GL43.glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDebugOutput.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDebugOutput.java new file mode 100644 index 0000000..2d54783 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDebugOutput.java @@ -0,0 +1,131 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDebugOutput { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, + * and IsEnabled: + */ + public static final int GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB = 0x8242; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_DEBUG_MESSAGE_LENGTH_ARB = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_ARB = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_ARB = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243; + + /** + * Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_DEBUG_CALLBACK_FUNCTION_ARB = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM_ARB = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, + * and the &lt;sources&gt; parameter of GetDebugMessageLogARB: + */ + public static final int GL_DEBUG_SOURCE_API_ARB = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY_ARB = 0x8249, + GL_DEBUG_SOURCE_APPLICATION_ARB = 0x824A, + GL_DEBUG_SOURCE_OTHER_ARB = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, + * and the &lt;types&gt; parameter of GetDebugMessageLogARB: + */ + public static final int GL_DEBUG_TYPE_ERROR_ARB = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E, + GL_DEBUG_TYPE_PORTABILITY_ARB = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE_ARB = 0x8250, + GL_DEBUG_TYPE_OTHER_ARB = 0x8251; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB + * callback functions, and the &lt;severities&gt; parameter of + * GetDebugMessageLogARB: + */ + public static final int GL_DEBUG_SEVERITY_HIGH_ARB = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_ARB = 0x9147, + GL_DEBUG_SEVERITY_LOW_ARB = 0x9148; + + private ARBDebugOutput() {} + + public static void glDebugMessageControlARB(int source, int type, int severity, IntBuffer ids, boolean enabled) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageControlARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (ids != null) + BufferChecks.checkDirect(ids); + nglDebugMessageControlARB(source, type, severity, (ids == null ? 0 : ids.remaining()), MemoryUtil.getAddressSafe(ids), enabled, function_pointer); + } + static native void nglDebugMessageControlARB(int source, int type, int severity, int ids_count, long ids, boolean enabled, long function_pointer); + + public static void glDebugMessageInsertARB(int source, int type, int id, int severity, ByteBuffer buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsertARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buf); + nglDebugMessageInsertARB(source, type, id, severity, buf.remaining(), MemoryUtil.getAddress(buf), function_pointer); + } + static native void nglDebugMessageInsertARB(int source, int type, int id, int severity, int buf_length, long buf, long function_pointer); + + /** Overloads glDebugMessageInsertARB. */ + public static void glDebugMessageInsertARB(int source, int type, int id, int severity, CharSequence buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsertARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDebugMessageInsertARB(source, type, id, severity, buf.length(), APIUtil.getBuffer(caps, buf), function_pointer); + } + + /** + * The {@code ARBDebugOutputCallback.Handler} implementation passed to this method will be used for + * ARB_debug_output messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * <p> + * @param callback the callback function to use + */ + public static void glDebugMessageCallbackARB(ARBDebugOutputCallback callback) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageCallbackARB; + BufferChecks.checkFunctionAddress(function_pointer); + long userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler()); + CallbackUtil.registerContextCallbackARB(userParam); + nglDebugMessageCallbackARB(callback == null ? 0 : callback.getPointer(), userParam, function_pointer); + } + static native void nglDebugMessageCallbackARB(long callback, long userParam, long function_pointer); + + public static int glGetDebugMessageLogARB(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDebugMessageLogARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (sources != null) + BufferChecks.checkBuffer(sources, count); + if (types != null) + BufferChecks.checkBuffer(types, count); + if (ids != null) + BufferChecks.checkBuffer(ids, count); + if (severities != null) + BufferChecks.checkBuffer(severities, count); + if (lengths != null) + BufferChecks.checkBuffer(lengths, count); + if (messageLog != null) + BufferChecks.checkDirect(messageLog); + int __result = nglGetDebugMessageLogARB(count, (messageLog == null ? 0 : messageLog.remaining()), MemoryUtil.getAddressSafe(sources), MemoryUtil.getAddressSafe(types), MemoryUtil.getAddressSafe(ids), MemoryUtil.getAddressSafe(severities), MemoryUtil.getAddressSafe(lengths), MemoryUtil.getAddressSafe(messageLog), function_pointer); + return __result; + } + static native int nglGetDebugMessageLogARB(int count, int messageLog_logSize, long sources, long types, long ids, long severities, long lengths, long messageLog, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthBufferFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthBufferFloat.java new file mode 100644 index 0000000..fddab46 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthBufferFloat.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDepthBufferFloat { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + public static final int GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + private ARBDepthBufferFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthClamp.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthClamp.java new file mode 100644 index 0000000..b1e6c16 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthClamp.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDepthClamp { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_CLAMP = 0x864F; + + private ARBDepthClamp() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthTexture.java new file mode 100644 index 0000000..a5b0b6d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDepthTexture.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDepthTexture { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * CopyTexImage1D and CopyTexImage2D: + */ + public static final int GL_DEPTH_COMPONENT16_ARB = 0x81A5, + GL_DEPTH_COMPONENT24_ARB = 0x81A6, + GL_DEPTH_COMPONENT32_ARB = 0x81A7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + public static final int GL_TEXTURE_DEPTH_SIZE_ARB = 0x884A; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_DEPTH_TEXTURE_MODE_ARB = 0x884B; + + private ARBDepthTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffers.java new file mode 100644 index 0000000..288231a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffers.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawBuffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_DRAW_BUFFERS_ARB = 0x8824, + GL_DRAW_BUFFER0_ARB = 0x8825, + GL_DRAW_BUFFER1_ARB = 0x8826, + GL_DRAW_BUFFER2_ARB = 0x8827, + GL_DRAW_BUFFER3_ARB = 0x8828, + GL_DRAW_BUFFER4_ARB = 0x8829, + GL_DRAW_BUFFER5_ARB = 0x882A, + GL_DRAW_BUFFER6_ARB = 0x882B, + GL_DRAW_BUFFER7_ARB = 0x882C, + GL_DRAW_BUFFER8_ARB = 0x882D, + GL_DRAW_BUFFER9_ARB = 0x882E, + GL_DRAW_BUFFER10_ARB = 0x882F, + GL_DRAW_BUFFER11_ARB = 0x8830, + GL_DRAW_BUFFER12_ARB = 0x8831, + GL_DRAW_BUFFER13_ARB = 0x8832, + GL_DRAW_BUFFER14_ARB = 0x8833, + GL_DRAW_BUFFER15_ARB = 0x8834; + + private ARBDrawBuffers() {} + + public static void glDrawBuffersARB(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglDrawBuffersARB(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglDrawBuffersARB(int buffers_size, long buffers, long function_pointer); + + /** Overloads glDrawBuffersARB. */ + public static void glDrawBuffersARB(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffersARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawBuffersARB(1, APIUtil.getInt(caps, buffer), function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffersBlend.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffersBlend.java new file mode 100644 index 0000000..915c8aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawBuffersBlend.java @@ -0,0 +1,43 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawBuffersBlend { + + private ARBDrawBuffersBlend() {} + + public static void glBlendEquationiARB(int buf, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationiARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationiARB(buf, mode, function_pointer); + } + static native void nglBlendEquationiARB(int buf, int mode, long function_pointer); + + public static void glBlendEquationSeparateiARB(int buf, int modeRGB, int modeAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationSeparateiARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationSeparateiARB(buf, modeRGB, modeAlpha, function_pointer); + } + static native void nglBlendEquationSeparateiARB(int buf, int modeRGB, int modeAlpha, long function_pointer); + + public static void glBlendFunciARB(int buf, int src, int dst) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFunciARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFunciARB(buf, src, dst, function_pointer); + } + static native void nglBlendFunciARB(int buf, int src, int dst, long function_pointer); + + public static void glBlendFuncSeparateiARB(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncSeparateiARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha, function_pointer); + } + static native void nglBlendFuncSeparateiARB(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java new file mode 100644 index 0000000..ab5e4ae --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawElementsBaseVertex.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawElementsBaseVertex { + + private ARBDrawElementsBaseVertex() {} + + public static void glDrawElementsBaseVertex(int mode, ByteBuffer indices, int basevertex) { + GL32.glDrawElementsBaseVertex(mode, indices, basevertex); + } + public static void glDrawElementsBaseVertex(int mode, IntBuffer indices, int basevertex) { + GL32.glDrawElementsBaseVertex(mode, indices, basevertex); + } + public static void glDrawElementsBaseVertex(int mode, ShortBuffer indices, int basevertex) { + GL32.glDrawElementsBaseVertex(mode, indices, basevertex); + } + public static void glDrawElementsBaseVertex(int mode, int indices_count, int type, long indices_buffer_offset, int basevertex) { + GL32.glDrawElementsBaseVertex(mode, indices_count, type, indices_buffer_offset, basevertex); + } + + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, ByteBuffer indices, int basevertex) { + GL32.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, IntBuffer indices, int basevertex) { + GL32.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, ShortBuffer indices, int basevertex) { + GL32.glDrawRangeElementsBaseVertex(mode, start, end, indices, basevertex); + } + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset, int basevertex) { + GL32.glDrawRangeElementsBaseVertex(mode, start, end, indices_count, type, indices_buffer_offset, basevertex); + } + + public static void glDrawElementsInstancedBaseVertex(int mode, ByteBuffer indices, int primcount, int basevertex) { + GL32.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + public static void glDrawElementsInstancedBaseVertex(int mode, IntBuffer indices, int primcount, int basevertex) { + GL32.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + public static void glDrawElementsInstancedBaseVertex(int mode, ShortBuffer indices, int primcount, int basevertex) { + GL32.glDrawElementsInstancedBaseVertex(mode, indices, primcount, basevertex); + } + public static void glDrawElementsInstancedBaseVertex(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex) { + GL32.glDrawElementsInstancedBaseVertex(mode, indices_count, type, indices_buffer_offset, primcount, basevertex); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawIndirect.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawIndirect.java new file mode 100644 index 0000000..6b5db88 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawIndirect.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawIndirect { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, and + * CopyBufferSubData: + */ + public static final int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + private ARBDrawIndirect() {} + + public static void glDrawArraysIndirect(int mode, ByteBuffer indirect) { + GL40.glDrawArraysIndirect(mode, indirect); + } + public static void glDrawArraysIndirect(int mode, long indirect_buffer_offset) { + GL40.glDrawArraysIndirect(mode, indirect_buffer_offset); + } + + /** Overloads glDrawArraysIndirect. */ + public static void glDrawArraysIndirect(int mode, IntBuffer indirect) { + GL40.glDrawArraysIndirect(mode, indirect); + } + + public static void glDrawElementsIndirect(int mode, int type, ByteBuffer indirect) { + GL40.glDrawElementsIndirect(mode, type, indirect); + } + public static void glDrawElementsIndirect(int mode, int type, long indirect_buffer_offset) { + GL40.glDrawElementsIndirect(mode, type, indirect_buffer_offset); + } + + /** Overloads glDrawElementsIndirect. */ + public static void glDrawElementsIndirect(int mode, int type, IntBuffer indirect) { + GL40.glDrawElementsIndirect(mode, type, indirect); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawInstanced.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawInstanced.java new file mode 100644 index 0000000..e481cf0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBDrawInstanced.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawInstanced { + + private ARBDrawInstanced() {} + + public static void glDrawArraysInstancedARB(int mode, int first, int count, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysInstancedARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawArraysInstancedARB(mode, first, count, primcount, function_pointer); + } + static native void nglDrawArraysInstancedARB(int mode, int first, int count, int primcount, long function_pointer); + + public static void glDrawElementsInstancedARB(int mode, ByteBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstancedARB(int mode, IntBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstancedARB(int mode, ShortBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedARB(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + static native void nglDrawElementsInstancedARB(int mode, int indices_count, int type, long indices, int primcount, long function_pointer); + public static void glDrawElementsInstancedARB(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedARBBO(mode, indices_count, type, indices_buffer_offset, primcount, function_pointer); + } + static native void nglDrawElementsInstancedARBBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES2Compatibility.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES2Compatibility.java new file mode 100644 index 0000000..1af878b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES2Compatibility.java @@ -0,0 +1,64 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBES2Compatibility { + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_SHADER_COMPILER = 0x8DFA, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer: + */ + public static final int GL_FIXED = 0x140C; + + /** + * Accepted by the &lt;precisiontype&gt; parameter of + * GetShaderPrecisionFormat: + */ + public static final int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** + * Accepted by the &lt;format&gt; parameter of most commands taking sized internal formats: + */ + public static final int GL_RGB565 = 0x8D62; + + private ARBES2Compatibility() {} + + public static void glReleaseShaderCompiler() { + GL41.glReleaseShaderCompiler(); + } + + public static void glShaderBinary(IntBuffer shaders, int binaryformat, ByteBuffer binary) { + GL41.glShaderBinary(shaders, binaryformat, binary); + } + + public static void glGetShaderPrecisionFormat(int shadertype, int precisiontype, IntBuffer range, IntBuffer precision) { + GL41.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); + } + + public static void glDepthRangef(float n, float f) { + GL41.glDepthRangef(n, f); + } + + public static void glClearDepthf(float d) { + GL41.glClearDepthf(d); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES3Compatibility.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES3Compatibility.java new file mode 100644 index 0000000..0c9703a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBES3Compatibility.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBES3Compatibility { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D + */ + public static final int GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** + * Accepted by the &lt;target&gt; parameter of Enable and Disable: + */ + public static final int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * GetQueryIndexediv and GetQueryiv: + */ + public static final int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** + * Accepted by the &lt;value&gt; parameter of the GetInteger* functions: + */ + public static final int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + private ARBES3Compatibility() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBEnhancedLayouts.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBEnhancedLayouts.java new file mode 100644 index 0000000..bc72c29 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBEnhancedLayouts.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBEnhancedLayouts { + + /** + * Accepted in the &lt;props&gt; array of GetProgramResourceiv: + */ + public static final int GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + private ARBEnhancedLayouts() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBExplicitUniformLocation.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBExplicitUniformLocation.java new file mode 100644 index 0000000..de2ff6c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBExplicitUniformLocation.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBExplicitUniformLocation { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + private ARBExplicitUniformLocation() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentProgram.java new file mode 100644 index 0000000..047dcab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentProgram.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBFragmentProgram extends ARBProgram { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of ProgramStringARB, BindProgramARB, + * ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, + * GetProgramivARB and GetProgramStringARB. + */ + public static final int GL_FRAGMENT_PROGRAM_ARB = 0x8804; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x8805, + GL_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x8806, + GL_PROGRAM_TEX_INDIRECTIONS_ARB = 0x8807, + GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x8808, + GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x8809, + GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x880A, + GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x880B, + GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x880C, + GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = 0x880D, + GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x880E, + GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x880F, + GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x8810; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_TEXTURE_COORDS_ARB = 0x8871, + GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; + + private ARBFragmentProgram() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentShader.java new file mode 100644 index 0000000..99acefb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFragmentShader.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBFragmentShader { + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShaderObjectARB and + * returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: + */ + public static final int GL_FRAGMENT_SHADER_ARB = 0x8B30; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = 0x8B49, + GL_MAX_TEXTURE_COORDS_ARB = 0x8871, + GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; + + /** + * Accepted by the &lt;target&gt; parameter of Hint and the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB = 0x8B8B; + + private ARBFragmentShader() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferNoAttachments.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferNoAttachments.java new file mode 100644 index 0000000..0f82c72 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferNoAttachments.java @@ -0,0 +1,71 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBFramebufferNoAttachments { + + /** + * Accepted by the &lt;pname&gt; parameter of FramebufferParameteri, + * GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + private ARBFramebufferNoAttachments() {} + + public static void glFramebufferParameteri(int target, int pname, int param) { + GL43.glFramebufferParameteri(target, pname, param); + } + + public static void glGetFramebufferParameter(int target, int pname, IntBuffer params) { + GL43.glGetFramebufferParameter(target, pname, params); + } + + /** Overloads glGetFramebufferParameteriv. */ + public static int glGetFramebufferParameteri(int target, int pname) { + return GL43.glGetFramebufferParameteri(target, pname); + } + + public static void glNamedFramebufferParameteriEXT(int framebuffer, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferParameteriEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferParameteriEXT(framebuffer, pname, param, function_pointer); + } + static native void nglNamedFramebufferParameteriEXT(int framebuffer, int pname, int param, long function_pointer); + + public static void glGetNamedFramebufferParameterEXT(int framebuffer, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedFramebufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetNamedFramebufferParameterivEXT(framebuffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedFramebufferParameterivEXT(int framebuffer, int pname, long params, long function_pointer); + + /** Overloads glGetNamedFramebufferParameterivEXT. */ + public static int glGetNamedFramebufferParameterEXT(int framebuffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedFramebufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedFramebufferParameterivEXT(framebuffer, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferObject.java new file mode 100644 index 0000000..f91f651 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferObject.java @@ -0,0 +1,297 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBFramebufferObject { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER = 0x8D40, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbuffer, + * RenderbufferStorage, and GetRenderbufferParameteriv, and + * returned by GetFramebufferAttachmentParameteriv: + */ + public static final int GL_RENDERBUFFER = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorage: + */ + public static final int GL_STENCIL_INDEX1 = 0x8D46, + GL_STENCIL_INDEX4 = 0x8D47, + GL_STENCIL_INDEX8 = 0x8D48, + GL_STENCIL_INDEX16 = 0x8D49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** + * Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: + */ + public static final int GL_SRGB = 0x8C40, + GL_UNSIGNED_NORMALIZED = 0x8C17, + GL_FRAMEBUFFER_DEFAULT = 0x8218, + GL_INDEX = 0x8222; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv + */ + public static final int GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_SAMPLES = 0x8D57; + + /** + * Returned by CheckFramebufferStatus(): + */ + public static final int GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56, + GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** + * Returned by GetError(): + */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + * CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv: + */ + public static final int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage: + */ + public static final int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv: + */ + public static final int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + private ARBFramebufferObject() {} + + public static boolean glIsRenderbuffer(int renderbuffer) { + return GL30.glIsRenderbuffer(renderbuffer); + } + + public static void glBindRenderbuffer(int target, int renderbuffer) { + GL30.glBindRenderbuffer(target, renderbuffer); + } + + public static void glDeleteRenderbuffers(IntBuffer renderbuffers) { + GL30.glDeleteRenderbuffers(renderbuffers); + } + + /** Overloads glDeleteRenderbuffers. */ + public static void glDeleteRenderbuffers(int renderbuffer) { + GL30.glDeleteRenderbuffers(renderbuffer); + } + + public static void glGenRenderbuffers(IntBuffer renderbuffers) { + GL30.glGenRenderbuffers(renderbuffers); + } + + /** Overloads glGenRenderbuffers. */ + public static int glGenRenderbuffers() { + return GL30.glGenRenderbuffers(); + } + + public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { + GL30.glRenderbufferStorage(target, internalformat, width, height); + } + + public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { + GL30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + } + + public static void glGetRenderbufferParameter(int target, int pname, IntBuffer params) { + GL30.glGetRenderbufferParameter(target, pname, params); + } + + /** + * Overloads glGetRenderbufferParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. + */ + @Deprecated + public static int glGetRenderbufferParameter(int target, int pname) { + return ARBFramebufferObject.glGetRenderbufferParameteri(target, pname); + } + + /** Overloads glGetRenderbufferParameteriv. */ + public static int glGetRenderbufferParameteri(int target, int pname) { + return GL30.glGetRenderbufferParameteri(target, pname); + } + + public static boolean glIsFramebuffer(int framebuffer) { + return GL30.glIsFramebuffer(framebuffer); + } + + public static void glBindFramebuffer(int target, int framebuffer) { + GL30.glBindFramebuffer(target, framebuffer); + } + + public static void glDeleteFramebuffers(IntBuffer framebuffers) { + GL30.glDeleteFramebuffers(framebuffers); + } + + /** Overloads glDeleteFramebuffers. */ + public static void glDeleteFramebuffers(int framebuffer) { + GL30.glDeleteFramebuffers(framebuffer); + } + + public static void glGenFramebuffers(IntBuffer framebuffers) { + GL30.glGenFramebuffers(framebuffers); + } + + /** Overloads glGenFramebuffers. */ + public static int glGenFramebuffers() { + return GL30.glGenFramebuffers(); + } + + public static int glCheckFramebufferStatus(int target) { + return GL30.glCheckFramebufferStatus(target); + } + + public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) { + GL30.glFramebufferTexture1D(target, attachment, textarget, texture, level); + } + + public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { + GL30.glFramebufferTexture2D(target, attachment, textarget, texture, level); + } + + public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int layer) { + GL30.glFramebufferTexture3D(target, attachment, textarget, texture, level, layer); + } + + public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) { + GL30.glFramebufferTextureLayer(target, attachment, texture, level, layer); + } + + public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) { + GL30.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + } + + public static void glGetFramebufferAttachmentParameter(int target, int attachment, int pname, IntBuffer params) { + GL30.glGetFramebufferAttachmentParameter(target, attachment, pname, params); + } + + /** + * Overloads glGetFramebufferAttachmentParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. + */ + @Deprecated + public static int glGetFramebufferAttachmentParameter(int target, int attachment, int pname) { + return GL30.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + /** Overloads glGetFramebufferAttachmentParameteriv. */ + public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) { + return GL30.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + GL30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + public static void glGenerateMipmap(int target) { + GL30.glGenerateMipmap(target); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferSRGB.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferSRGB.java new file mode 100644 index 0000000..1643552 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBFramebufferSRGB.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBFramebufferSRGB { + + /** + * Accepted by the &lt;attribList&gt; parameter of glXChooseVisual, and by + * the &lt;attrib&gt; parameter of glXGetConfig: + */ + public static final int GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20B2; + + /** + * Accepted by the &lt;piAttributes&gt; parameter of + * wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and + * the &lt;piAttribIList&gt; and &lt;pfAttribIList&gt; of wglChoosePixelFormatEXT: + */ + public static final int WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20A9; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB_ARB = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x8DBA; + + private ARBFramebufferSRGB() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGeometryShader4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGeometryShader4.java new file mode 100644 index 0000000..1e38b93 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGeometryShader4.java @@ -0,0 +1,99 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBGeometryShader4 { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + public static final int GL_GEOMETRY_SHADER_ARB = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + public static final int GL_GEOMETRY_VERTICES_OUT_ARB = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE_ARB = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE_ARB = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = 0x8C29, + GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = 0x8DDD, + GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = 0x8DDE, + GL_MAX_VARYING_COMPONENTS_ARB = 0x8B4B, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + public static final int GL_LINES_ADJACENCY_ARB = 0xA, + GL_LINE_STRIP_ADJACENCY_ARB = 0xB, + GL_TRIANGLES_ADJACENCY_ARB = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY_ARB = 0xD; + + /** + * Returned by CheckFramebufferStatusEXT: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = 0x8DA8, + GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = 0x8DA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = 0x8DA7, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_ARB = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + public static final int GL_PROGRAM_POINT_SIZE_ARB = 0x8642; + + private ARBGeometryShader4() {} + + public static void glProgramParameteriARB(int program, int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameteriARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramParameteriARB(program, pname, value, function_pointer); + } + static native void nglProgramParameteriARB(int program, int pname, int value, long function_pointer); + + public static void glFramebufferTextureARB(int target, int attachment, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureARB(target, attachment, texture, level, function_pointer); + } + static native void nglFramebufferTextureARB(int target, int attachment, int texture, int level, long function_pointer); + + public static void glFramebufferTextureLayerARB(int target, int attachment, int texture, int level, int layer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureLayerARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureLayerARB(target, attachment, texture, level, layer, function_pointer); + } + static native void nglFramebufferTextureLayerARB(int target, int attachment, int texture, int level, int layer, long function_pointer); + + public static void glFramebufferTextureFaceARB(int target, int attachment, int texture, int level, int face) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureFaceARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureFaceARB(target, attachment, texture, level, face, function_pointer); + } + static native void nglFramebufferTextureFaceARB(int target, int attachment, int texture, int level, int face, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGetProgramBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGetProgramBinary.java new file mode 100644 index 0000000..ad563f6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGetProgramBinary.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBGetProgramBinary { + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + public static final int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev: + */ + public static final int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + private ARBGetProgramBinary() {} + + public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { + GL41.glGetProgramBinary(program, length, binaryFormat, binary); + } + + public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) { + GL41.glProgramBinary(program, binaryFormat, binary); + } + + public static void glProgramParameteri(int program, int pname, int value) { + GL41.glProgramParameteri(program, pname, value); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShader5.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShader5.java new file mode 100644 index 0000000..345944d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShader5.java @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBGpuShader5 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C, + GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + private ARBGpuShader5() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShaderFp64.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShaderFp64.java new file mode 100644 index 0000000..53af909 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBGpuShaderFp64.java @@ -0,0 +1,250 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBGpuShaderFp64 { + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + public static final int GL_DOUBLE = 0x140A, + GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + private ARBGpuShaderFp64() {} + + public static void glUniform1d(int location, double x) { + GL40.glUniform1d(location, x); + } + + public static void glUniform2d(int location, double x, double y) { + GL40.glUniform2d(location, x, y); + } + + public static void glUniform3d(int location, double x, double y, double z) { + GL40.glUniform3d(location, x, y, z); + } + + public static void glUniform4d(int location, double x, double y, double z, double w) { + GL40.glUniform4d(location, x, y, z, w); + } + + public static void glUniform1(int location, DoubleBuffer value) { + GL40.glUniform1(location, value); + } + + public static void glUniform2(int location, DoubleBuffer value) { + GL40.glUniform2(location, value); + } + + public static void glUniform3(int location, DoubleBuffer value) { + GL40.glUniform3(location, value); + } + + public static void glUniform4(int location, DoubleBuffer value) { + GL40.glUniform4(location, value); + } + + public static void glUniformMatrix2(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix2(location, transpose, value); + } + + public static void glUniformMatrix3(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix3(location, transpose, value); + } + + public static void glUniformMatrix4(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix4(location, transpose, value); + } + + public static void glUniformMatrix2x3(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix2x3(location, transpose, value); + } + + public static void glUniformMatrix2x4(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix2x4(location, transpose, value); + } + + public static void glUniformMatrix3x2(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix3x2(location, transpose, value); + } + + public static void glUniformMatrix3x4(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix3x4(location, transpose, value); + } + + public static void glUniformMatrix4x2(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix4x2(location, transpose, value); + } + + public static void glUniformMatrix4x3(int location, boolean transpose, DoubleBuffer value) { + GL40.glUniformMatrix4x3(location, transpose, value); + } + + public static void glGetUniform(int program, int location, DoubleBuffer params) { + GL40.glGetUniform(program, location, params); + } + + public static void glProgramUniform1dEXT(int program, int location, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1dEXT(program, location, x, function_pointer); + } + static native void nglProgramUniform1dEXT(int program, int location, double x, long function_pointer); + + public static void glProgramUniform2dEXT(int program, int location, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2dEXT(program, location, x, y, function_pointer); + } + static native void nglProgramUniform2dEXT(int program, int location, double x, double y, long function_pointer); + + public static void glProgramUniform3dEXT(int program, int location, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3dEXT(program, location, x, y, z, function_pointer); + } + static native void nglProgramUniform3dEXT(int program, int location, double x, double y, double z, long function_pointer); + + public static void glProgramUniform4dEXT(int program, int location, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4dEXT(program, location, x, y, z, w, function_pointer); + } + static native void nglProgramUniform4dEXT(int program, int location, double x, double y, double z, double w, long function_pointer); + + public static void glProgramUniform1EXT(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1dvEXT(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1dvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2EXT(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2dvEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2dvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3EXT(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3dvEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3dvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4EXT(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4dvEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4dvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniformMatrix2EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2dvEXT(program, location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3dvEXT(program, location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4dvEXT(program, location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x3EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x3dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x3dvEXT(program, location, value.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x3dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x4EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x4dvEXT(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x4dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x2EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x2dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x2dvEXT(program, location, value.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x2dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x4EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x4dvEXT(program, location, value.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x4dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x2EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x2dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x2dvEXT(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x2dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x3EXT(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x3dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x3dvEXT(program, location, value.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x3dvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatPixel.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatPixel.java new file mode 100644 index 0000000..68c2912 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatPixel.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBHalfFloatPixel { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, + * SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, + * and GetColorTable: + */ + public static final int GL_HALF_FLOAT_ARB = 0x140B; + + private ARBHalfFloatPixel() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatVertex.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatVertex.java new file mode 100644 index 0000000..68c6b4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBHalfFloatVertex.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBHalfFloatVertex { + + /** + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, + * and VertexAttribPointer: + */ + public static final int GL_HALF_FLOAT = 0x140B; + + private ARBHalfFloatVertex() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBImaging.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBImaging.java new file mode 100644 index 0000000..645c97e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBImaging.java @@ -0,0 +1,1662 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <p/> + * The GL12 imaging subset extension. + * <p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class ARBImaging { + + public static final int GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_BLEND_COLOR = 0x8005, + GL_FUNC_ADD = 0x8006, + GL_MIN = 0x8007, + GL_MAX = 0x8008, + GL_BLEND_EQUATION = 0x8009, + GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B, + GL_COLOR_MATRIX = 0x80B1, + GL_COLOR_MATRIX_STACK_DEPTH = 0x80B2, + GL_MAX_COLOR_MATRIX_STACK_DEPTH = 0x80B3, + GL_POST_COLOR_MATRIX_RED_SCALE = 0x80B4, + GL_POST_COLOR_MATRIX_GREEN_SCALE = 0x80B5, + GL_POST_COLOR_MATRIX_BLUE_SCALE = 0x80B6, + GL_POST_COLOR_MATRIX_ALPHA_SCALE = 0x80B7, + GL_POST_COLOR_MATRIX_RED_BIAS = 0x80B8, + GL_POST_COLOR_MATRIX_GREEN_BIAS = 0x80B9, + GL_POST_COLOR_MATRIX_BLUE_BIAS = 0x80BA, + GL_POST_COLOR_MATRIX_ALPHA_BIAS = 0x80BB, + GL_COLOR_TABLE = 0x80D0, + GL_POST_CONVOLUTION_COLOR_TABLE = 0x80D1, + GL_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D2, + GL_PROXY_COLOR_TABLE = 0x80D3, + GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = 0x80D4, + GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D5, + GL_COLOR_TABLE_SCALE = 0x80D6, + GL_COLOR_TABLE_BIAS = 0x80D7, + GL_COLOR_TABLE_FORMAT = 0x80D8, + GL_COLOR_TABLE_WIDTH = 0x80D9, + GL_COLOR_TABLE_RED_SIZE = 0x80DA, + GL_COLOR_TABLE_GREEN_SIZE = 0x80DB, + GL_COLOR_TABLE_BLUE_SIZE = 0x80DC, + GL_COLOR_TABLE_ALPHA_SIZE = 0x80DD, + GL_COLOR_TABLE_LUMINANCE_SIZE = 0x80DE, + GL_COLOR_TABLE_INTENSITY_SIZE = 0x80DF, + GL_CONVOLUTION_1D = 0x8010, + GL_CONVOLUTION_2D = 0x8011, + GL_SEPARABLE_2D = 0x8012, + GL_CONVOLUTION_BORDER_MODE = 0x8013, + GL_CONVOLUTION_FILTER_SCALE = 0x8014, + GL_CONVOLUTION_FILTER_BIAS = 0x8015, + GL_REDUCE = 0x8016, + GL_CONVOLUTION_FORMAT = 0x8017, + GL_CONVOLUTION_WIDTH = 0x8018, + GL_CONVOLUTION_HEIGHT = 0x8019, + GL_MAX_CONVOLUTION_WIDTH = 0x801A, + GL_MAX_CONVOLUTION_HEIGHT = 0x801B, + GL_POST_CONVOLUTION_RED_SCALE = 0x801C, + GL_POST_CONVOLUTION_GREEN_SCALE = 0x801D, + GL_POST_CONVOLUTION_BLUE_SCALE = 0x801E, + GL_POST_CONVOLUTION_ALPHA_SCALE = 0x801F, + GL_POST_CONVOLUTION_RED_BIAS = 0x8020, + GL_POST_CONVOLUTION_GREEN_BIAS = 0x8021, + GL_POST_CONVOLUTION_BLUE_BIAS = 0x8022, + GL_POST_CONVOLUTION_ALPHA_BIAS = 0x8023, + GL_IGNORE_BORDER = 0x8150, + GL_CONSTANT_BORDER = 0x8151, + GL_REPLICATE_BORDER = 0x8153, + GL_CONVOLUTION_BORDER_COLOR = 0x8154, + GL_HISTOGRAM = 0x8024, + GL_PROXY_HISTOGRAM = 0x8025, + GL_HISTOGRAM_WIDTH = 0x8026, + GL_HISTOGRAM_FORMAT = 0x8027, + GL_HISTOGRAM_RED_SIZE = 0x8028, + GL_HISTOGRAM_GREEN_SIZE = 0x8029, + GL_HISTOGRAM_BLUE_SIZE = 0x802A, + GL_HISTOGRAM_ALPHA_SIZE = 0x802B, + GL_HISTOGRAM_LUMINANCE_SIZE = 0x802C, + GL_HISTOGRAM_SINK = 0x802D, + GL_MINMAX = 0x802E, + GL_MINMAX_FORMAT = 0x802F, + GL_MINMAX_SINK = 0x8030, + GL_TABLE_TOO_LARGE = 0x8031; + + private ARBImaging() {} + + public static void glColorTable(int target, int internalFormat, int width, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorTable(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTable(int target, int internalFormat, int width, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorTable(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTable(int target, int internalFormat, int width, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorTable(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglColorTable(int target, int internalFormat, int width, int format, int type, long data, long function_pointer); + public static void glColorTable(int target, int internalFormat, int width, int format, int type, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglColorTableBO(target, internalFormat, width, format, type, data_buffer_offset, function_pointer); + } + static native void nglColorTableBO(int target, int internalFormat, int width, int format, int type, long data_buffer_offset, long function_pointer); + + public static void glColorSubTable(int target, int start, int count, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorSubTable(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTable(int target, int start, int count, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorSubTable(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTable(int target, int start, int count, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(data, 256); + nglColorSubTable(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglColorSubTable(int target, int start, int count, int format, int type, long data, long function_pointer); + public static void glColorSubTable(int target, int start, int count, int format, int type, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTable; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglColorSubTableBO(target, start, count, format, type, data_buffer_offset, function_pointer); + } + static native void nglColorSubTableBO(int target, int start, int count, int format, int type, long data_buffer_offset, long function_pointer); + + public static void glColorTableParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglColorTableParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglColorTableParameteriv(int target, int pname, long params, long function_pointer); + + public static void glColorTableParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglColorTableParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglColorTableParameterfv(int target, int pname, long params, long function_pointer); + + public static void glCopyColorSubTable(int target, int start, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyColorSubTable; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyColorSubTable(target, start, x, y, width, function_pointer); + } + static native void nglCopyColorSubTable(int target, int start, int x, int y, int width, long function_pointer); + + public static void glCopyColorTable(int target, int internalformat, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyColorTable(target, internalformat, x, y, width, function_pointer); + } + static native void nglCopyColorTable(int target, int internalformat, int x, int y, int width, long function_pointer); + + public static void glGetColorTable(int target, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 256); + nglGetColorTable(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTable(int target, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 256); + nglGetColorTable(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTable(int target, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTable; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 256); + nglGetColorTable(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetColorTable(int target, int format, int type, long data, long function_pointer); + + public static void glGetColorTableParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetColorTableParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetColorTableParameteriv(int target, int pname, long params, long function_pointer); + + public static void glGetColorTableParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetColorTableParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetColorTableParameterfv(int target, int pname, long params, long function_pointer); + + public static void glBlendEquation(int mode) { + GL14.glBlendEquation(mode); + } + + public static void glBlendColor(float red, float green, float blue, float alpha) { + GL14.glBlendColor(red, green, blue, alpha); + } + + public static void glHistogram(int target, int width, int internalformat, boolean sink) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + nglHistogram(target, width, internalformat, sink, function_pointer); + } + static native void nglHistogram(int target, int width, int internalformat, boolean sink, long function_pointer); + + public static void glResetHistogram(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glResetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + nglResetHistogram(target, function_pointer); + } + static native void nglResetHistogram(int target, long function_pointer); + + public static void glGetHistogram(int target, boolean reset, int format, int type, ByteBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetHistogram(target, reset, format, type, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetHistogram(int target, boolean reset, int format, int type, DoubleBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetHistogram(target, reset, format, type, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetHistogram(int target, boolean reset, int format, int type, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetHistogram(target, reset, format, type, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetHistogram(int target, boolean reset, int format, int type, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetHistogram(target, reset, format, type, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetHistogram(int target, boolean reset, int format, int type, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetHistogram(target, reset, format, type, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetHistogram(int target, boolean reset, int format, int type, long values, long function_pointer); + public static void glGetHistogram(int target, boolean reset, int format, int type, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogram; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetHistogramBO(target, reset, format, type, values_buffer_offset, function_pointer); + } + static native void nglGetHistogramBO(int target, boolean reset, int format, int type, long values_buffer_offset, long function_pointer); + + public static void glGetHistogramParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogramParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 256); + nglGetHistogramParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetHistogramParameterfv(int target, int pname, long params, long function_pointer); + + public static void glGetHistogramParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHistogramParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 256); + nglGetHistogramParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetHistogramParameteriv(int target, int pname, long params, long function_pointer); + + public static void glMinmax(int target, int internalformat, boolean sink) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + nglMinmax(target, internalformat, sink, function_pointer); + } + static native void nglMinmax(int target, int internalformat, boolean sink, long function_pointer); + + public static void glResetMinmax(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glResetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + nglResetMinmax(target, function_pointer); + } + static native void nglResetMinmax(int target, long function_pointer); + + public static void glGetMinmax(int target, boolean reset, int format, int types, ByteBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 4); + nglGetMinmax(target, reset, format, types, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetMinmax(int target, boolean reset, int format, int types, DoubleBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 4); + nglGetMinmax(target, reset, format, types, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetMinmax(int target, boolean reset, int format, int types, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 4); + nglGetMinmax(target, reset, format, types, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetMinmax(int target, boolean reset, int format, int types, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 4); + nglGetMinmax(target, reset, format, types, MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetMinmax(int target, boolean reset, int format, int types, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 4); + nglGetMinmax(target, reset, format, types, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetMinmax(int target, boolean reset, int format, int types, long values, long function_pointer); + public static void glGetMinmax(int target, boolean reset, int format, int types, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmax; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetMinmaxBO(target, reset, format, types, values_buffer_offset, function_pointer); + } + static native void nglGetMinmaxBO(int target, boolean reset, int format, int types, long values_buffer_offset, long function_pointer); + + public static void glGetMinmaxParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmaxParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMinmaxParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMinmaxParameterfv(int target, int pname, long params, long function_pointer); + + public static void glGetMinmaxParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMinmaxParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMinmaxParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMinmaxParameteriv(int target, int pname, long params, long function_pointer); + + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, ByteBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, 1, 1)); + nglConvolutionFilter1D(target, internalformat, width, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, DoubleBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, 1, 1)); + nglConvolutionFilter1D(target, internalformat, width, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, FloatBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, 1, 1)); + nglConvolutionFilter1D(target, internalformat, width, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, IntBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, 1, 1)); + nglConvolutionFilter1D(target, internalformat, width, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, ShortBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, 1, 1)); + nglConvolutionFilter1D(target, internalformat, width, format, type, MemoryUtil.getAddress(image), function_pointer); + } + static native void nglConvolutionFilter1D(int target, int internalformat, int width, int format, int type, long image, long function_pointer); + public static void glConvolutionFilter1D(int target, int internalformat, int width, int format, int type, long image_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglConvolutionFilter1DBO(target, internalformat, width, format, type, image_buffer_offset, function_pointer); + } + static native void nglConvolutionFilter1DBO(int target, int internalformat, int width, int format, int type, long image_buffer_offset, long function_pointer); + + public static void glConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, height, 1)); + nglConvolutionFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, height, 1)); + nglConvolutionFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(image, GLChecks.calculateImageStorage(image, format, type, width, height, 1)); + nglConvolutionFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(image), function_pointer); + } + static native void nglConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, long image, long function_pointer); + public static void glConvolutionFilter2D(int target, int internalformat, int width, int height, int format, int type, long image_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglConvolutionFilter2DBO(target, internalformat, width, height, format, type, image_buffer_offset, function_pointer); + } + static native void nglConvolutionFilter2DBO(int target, int internalformat, int width, int height, int format, int type, long image_buffer_offset, long function_pointer); + + public static void glConvolutionParameterf(int target, int pname, float params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionParameterf; + BufferChecks.checkFunctionAddress(function_pointer); + nglConvolutionParameterf(target, pname, params, function_pointer); + } + static native void nglConvolutionParameterf(int target, int pname, float params, long function_pointer); + + public static void glConvolutionParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglConvolutionParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglConvolutionParameterfv(int target, int pname, long params, long function_pointer); + + public static void glConvolutionParameteri(int target, int pname, int params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglConvolutionParameteri(target, pname, params, function_pointer); + } + static native void nglConvolutionParameteri(int target, int pname, int params, long function_pointer); + + public static void glConvolutionParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glConvolutionParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglConvolutionParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglConvolutionParameteriv(int target, int pname, long params, long function_pointer); + + public static void glCopyConvolutionFilter1D(int target, int internalformat, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyConvolutionFilter1D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyConvolutionFilter1D(target, internalformat, x, y, width, function_pointer); + } + static native void nglCopyConvolutionFilter1D(int target, int internalformat, int x, int y, int width, long function_pointer); + + public static void glCopyConvolutionFilter2D(int target, int internalformat, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyConvolutionFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyConvolutionFilter2D(target, internalformat, x, y, width, height, function_pointer); + } + static native void nglCopyConvolutionFilter2D(int target, int internalformat, int x, int y, int width, int height, long function_pointer); + + public static void glGetConvolutionFilter(int target, int format, int type, ByteBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetConvolutionFilter(target, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetConvolutionFilter(int target, int format, int type, DoubleBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetConvolutionFilter(target, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetConvolutionFilter(int target, int format, int type, FloatBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetConvolutionFilter(target, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetConvolutionFilter(int target, int format, int type, IntBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetConvolutionFilter(target, format, type, MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetConvolutionFilter(int target, int format, int type, ShortBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetConvolutionFilter(target, format, type, MemoryUtil.getAddress(image), function_pointer); + } + static native void nglGetConvolutionFilter(int target, int format, int type, long image, long function_pointer); + public static void glGetConvolutionFilter(int target, int format, int type, long image_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetConvolutionFilterBO(target, format, type, image_buffer_offset, function_pointer); + } + static native void nglGetConvolutionFilterBO(int target, int format, int type, long image_buffer_offset, long function_pointer); + + public static void glGetConvolutionParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetConvolutionParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetConvolutionParameterfv(int target, int pname, long params, long function_pointer); + + public static void glGetConvolutionParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetConvolutionParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetConvolutionParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetConvolutionParameteriv(int target, int pname, long params, long function_pointer); + + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer row, ByteBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer row, DoubleBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer row, FloatBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer row, IntBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ByteBuffer row, ShortBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, DoubleBuffer row, ByteBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, DoubleBuffer row, DoubleBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, DoubleBuffer row, FloatBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, DoubleBuffer row, IntBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, DoubleBuffer row, ShortBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, FloatBuffer row, ByteBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, FloatBuffer row, DoubleBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, FloatBuffer row, FloatBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, FloatBuffer row, IntBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, FloatBuffer row, ShortBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer row, ByteBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer row, DoubleBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer row, FloatBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer row, IntBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, IntBuffer row, ShortBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer row, ByteBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer row, DoubleBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer row, FloatBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer row, IntBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, ShortBuffer row, ShortBuffer column) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + nglSeparableFilter2D(target, internalformat, width, height, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), function_pointer); + } + static native void nglSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, long row, long column, long function_pointer); + public static void glSeparableFilter2D(int target, int internalformat, int width, int height, int format, int type, long row_buffer_offset, long column_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSeparableFilter2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglSeparableFilter2DBO(target, internalformat, width, height, format, type, row_buffer_offset, column_buffer_offset, function_pointer); + } + static native void nglSeparableFilter2DBO(int target, int internalformat, int width, int height, int format, int type, long row_buffer_offset, long column_buffer_offset, long function_pointer); + + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ByteBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, DoubleBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, FloatBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, IntBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetSeparableFilter(int target, int format, int type, ShortBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetSeparableFilter(target, format, type, MemoryUtil.getAddress(row), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + static native void nglGetSeparableFilter(int target, int format, int type, long row, long column, long span, long function_pointer); + public static void glGetSeparableFilter(int target, int format, int type, long row_buffer_offset, long column_buffer_offset, long span_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSeparableFilter; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetSeparableFilterBO(target, format, type, row_buffer_offset, column_buffer_offset, span_buffer_offset, function_pointer); + } + static native void nglGetSeparableFilterBO(int target, int format, int type, long row_buffer_offset, long column_buffer_offset, long span_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBIndirectParameters.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBIndirectParameters.java new file mode 100644 index 0000000..f2b1436 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBIndirectParameters.java @@ -0,0 +1,81 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBIndirectParameters { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, and CopyBufferSubData: + */ + public static final int GL_PARAMETER_BUFFER_ARB = 0x80EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_PARAMETER_BUFFER_BINDING_ARB = 0x80EF; + + private ARBIndirectParameters() {} + + public static void glMultiDrawArraysIndirectCountARB(int mode, ByteBuffer indirect, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 * 4 : stride) * maxdrawcount); + nglMultiDrawArraysIndirectCountARB(mode, MemoryUtil.getAddress(indirect), drawcount, maxdrawcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirectCountARB(int mode, long indirect, long drawcount, int maxdrawcount, int stride, long function_pointer); + public static void glMultiDrawArraysIndirectCountARB(int mode, long indirect_buffer_offset, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawArraysIndirectCountARBBO(mode, indirect_buffer_offset, drawcount, maxdrawcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirectCountARBBO(int mode, long indirect_buffer_offset, long drawcount, int maxdrawcount, int stride, long function_pointer); + + /** Overloads glMultiDrawArraysIndirectCountARB. */ + public static void glMultiDrawArraysIndirectCountARB(int mode, IntBuffer indirect, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 : stride >> 2) * maxdrawcount); + nglMultiDrawArraysIndirectCountARB(mode, MemoryUtil.getAddress(indirect), drawcount, maxdrawcount, stride, function_pointer); + } + + public static void glMultiDrawElementsIndirectCountARB(int mode, int type, ByteBuffer indirect, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 * 4 : stride) * maxdrawcount); + nglMultiDrawElementsIndirectCountARB(mode, type, MemoryUtil.getAddress(indirect), drawcount, maxdrawcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirectCountARB(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride, long function_pointer); + public static void glMultiDrawElementsIndirectCountARB(int mode, int type, long indirect_buffer_offset, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawElementsIndirectCountARBBO(mode, type, indirect_buffer_offset, drawcount, maxdrawcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirectCountARBBO(int mode, int type, long indirect_buffer_offset, long drawcount, int maxdrawcount, int stride, long function_pointer); + + /** Overloads glMultiDrawElementsIndirectCountARB. */ + public static void glMultiDrawElementsIndirectCountARB(int mode, int type, IntBuffer indirect, long drawcount, int maxdrawcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectCountARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 : stride >> 2) * maxdrawcount); + nglMultiDrawElementsIndirectCountARB(mode, type, MemoryUtil.getAddress(indirect), drawcount, maxdrawcount, stride, function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInstancedArrays.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInstancedArrays.java new file mode 100644 index 0000000..5637002 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInstancedArrays.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBInstancedArrays { + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, and GetVertexAttribiv: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB = 0x88FE; + + private ARBInstancedArrays() {} + + public static void glVertexAttribDivisorARB(int index, int divisor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribDivisorARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribDivisorARB(index, divisor, function_pointer); + } + static native void nglVertexAttribDivisorARB(int index, int divisor, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery.java new file mode 100644 index 0000000..750ee51 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBInternalformatQuery { + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ: + */ + public static final int GL_NUM_SAMPLE_COUNTS = 0x9380; + + private ARBInternalformatQuery() {} + + public static void glGetInternalformat(int target, int internalformat, int pname, IntBuffer params) { + GL42.glGetInternalformat(target, internalformat, pname, params); + } + + /** Overloads glGetInternalformativ. */ + public static int glGetInternalformat(int target, int internalformat, int pname) { + return GL42.glGetInternalformat(target, internalformat, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery2.java new file mode 100644 index 0000000..bbb79fa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInternalformatQuery2.java @@ -0,0 +1,150 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBInternalformatQuery2 { + + /** + * Accepted by the &lt;target&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + public static final int GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D = 0xDE1, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009, + GL_TEXTURE_RECTANGLE = 0x84F5, + GL_TEXTURE_BUFFER = 0x8C2A, + GL_RENDERBUFFER = 0x8D41, + GL_TEXTURE_2D_MULTISAMPLE = 0x9100, + GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + public static final int GL_SAMPLES = 0x80A9, + GL_NUM_SAMPLE_COUNTS = 0x9380, + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_SRGB_DECODE_ARB = 0x8299, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** + * Returned as possible responses for various &lt;pname&gt; queries + * to GetInternalformativ and GetInternalformati64v + */ + public static final int GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + private ARBInternalformatQuery2() {} + + public static void glGetInternalformat(int target, int internalformat, int pname, LongBuffer params) { + GL43.glGetInternalformat(target, internalformat, pname, params); + } + + /** Overloads glGetInternalformati64v. */ + public static long glGetInternalformati64(int target, int internalformat, int pname) { + return GL43.glGetInternalformati64(target, internalformat, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInvalidateSubdata.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInvalidateSubdata.java new file mode 100644 index 0000000..e923946 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBInvalidateSubdata.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBInvalidateSubdata { + + private ARBInvalidateSubdata() {} + + public static void glInvalidateTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth) { + GL43.glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); + } + + public static void glInvalidateTexImage(int texture, int level) { + GL43.glInvalidateTexImage(texture, level); + } + + public static void glInvalidateBufferSubData(int buffer, long offset, long length) { + GL43.glInvalidateBufferSubData(buffer, offset, length); + } + + public static void glInvalidateBufferData(int buffer) { + GL43.glInvalidateBufferData(buffer); + } + + public static void glInvalidateFramebuffer(int target, IntBuffer attachments) { + GL43.glInvalidateFramebuffer(target, attachments); + } + + public static void glInvalidateSubFramebuffer(int target, IntBuffer attachments, int x, int y, int width, int height) { + GL43.glInvalidateSubFramebuffer(target, attachments, x, y, width, height); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferAlignment.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferAlignment.java new file mode 100644 index 0000000..101517a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferAlignment.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMapBufferAlignment { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + + private ARBMapBufferAlignment() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferRange.java new file mode 100644 index 0000000..718d94c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMapBufferRange.java @@ -0,0 +1,43 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMapBufferRange { + + /** + * Accepted by the &lt;access&gt; parameter of MapBufferRange: + */ + public static final int GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20; + + private ARBMapBufferRange() {} + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { + return GL30.glMapBufferRange(target, offset, length, access, old_buffer); + } + + public static void glFlushMappedBufferRange(int target, long offset, long length) { + GL30.glFlushMappedBufferRange(target, offset, length); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMatrixPalette.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMatrixPalette.java new file mode 100644 index 0000000..09ad0a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMatrixPalette.java @@ -0,0 +1,94 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMatrixPalette { + + public static final int GL_MATRIX_PALETTE_ARB = 0x8840, + GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = 0x8841, + GL_MAX_PALETTE_MATRICES_ARB = 0x8842, + GL_CURRENT_PALETTE_MATRIX_ARB = 0x8843, + GL_MATRIX_INDEX_ARRAY_ARB = 0x8844, + GL_CURRENT_MATRIX_INDEX_ARB = 0x8845, + GL_MATRIX_INDEX_ARRAY_SIZE_ARB = 0x8846, + GL_MATRIX_INDEX_ARRAY_TYPE_ARB = 0x8847, + GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = 0x8848, + GL_MATRIX_INDEX_ARRAY_POINTER_ARB = 0x8849; + + private ARBMatrixPalette() {} + + public static void glCurrentPaletteMatrixARB(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCurrentPaletteMatrixARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglCurrentPaletteMatrixARB(index, function_pointer); + } + static native void nglCurrentPaletteMatrixARB(int index, long function_pointer); + + public static void glMatrixIndexPointerARB(int size, int stride, ByteBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_matrix_palette_glMatrixIndexPointerARB_pPointer = pPointer; + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_BYTE, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glMatrixIndexPointerARB(int size, int stride, IntBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_matrix_palette_glMatrixIndexPointerARB_pPointer = pPointer; + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_INT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glMatrixIndexPointerARB(int size, int stride, ShortBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_matrix_palette_glMatrixIndexPointerARB_pPointer = pPointer; + nglMatrixIndexPointerARB(size, GL11.GL_UNSIGNED_SHORT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglMatrixIndexPointerARB(int size, int type, int stride, long pPointer, long function_pointer); + public static void glMatrixIndexPointerARB(int size, int type, int stride, long pPointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglMatrixIndexPointerARBBO(size, type, stride, pPointer_buffer_offset, function_pointer); + } + static native void nglMatrixIndexPointerARBBO(int size, int type, int stride, long pPointer_buffer_offset, long function_pointer); + + public static void glMatrixIndexuARB(ByteBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexubvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pIndices); + nglMatrixIndexubvARB(pIndices.remaining(), MemoryUtil.getAddress(pIndices), function_pointer); + } + static native void nglMatrixIndexubvARB(int pIndices_size, long pIndices, long function_pointer); + + public static void glMatrixIndexuARB(ShortBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexusvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pIndices); + nglMatrixIndexusvARB(pIndices.remaining(), MemoryUtil.getAddress(pIndices), function_pointer); + } + static native void nglMatrixIndexusvARB(int pIndices_size, long pIndices, long function_pointer); + + public static void glMatrixIndexuARB(IntBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixIndexuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pIndices); + nglMatrixIndexuivARB(pIndices.remaining(), MemoryUtil.getAddress(pIndices), function_pointer); + } + static native void nglMatrixIndexuivARB(int pIndices_size, long pIndices, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiBind.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiBind.java new file mode 100644 index 0000000..f2bb59f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiBind.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMultiBind { + + private ARBMultiBind() {} + + public static void glBindBuffersBase(int target, int first, int count, IntBuffer buffers) { + GL44.glBindBuffersBase(target, first, count, buffers); + } + + public static void glBindBuffersRange(int target, int first, int count, IntBuffer buffers, PointerBuffer offsets, PointerBuffer sizes) { + GL44.glBindBuffersRange(target, first, count, buffers, offsets, sizes); + } + + public static void glBindTextures(int first, int count, IntBuffer textures) { + GL44.glBindTextures(first, count, textures); + } + + public static void glBindSamplers(int first, int count, IntBuffer samplers) { + GL44.glBindSamplers(first, count, samplers); + } + + public static void glBindImageTextures(int first, int count, IntBuffer textures) { + GL44.glBindImageTextures(first, count, textures); + } + + public static void glBindVertexBuffers(int first, int count, IntBuffer buffers, PointerBuffer offsets, IntBuffer strides) { + GL44.glBindVertexBuffers(first, count, buffers, offsets, strides); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiDrawIndirect.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiDrawIndirect.java new file mode 100644 index 0000000..99f101f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultiDrawIndirect.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMultiDrawIndirect { + + private ARBMultiDrawIndirect() {} + + public static void glMultiDrawArraysIndirect(int mode, ByteBuffer indirect, int primcount, int stride) { + GL43.glMultiDrawArraysIndirect(mode, indirect, primcount, stride); + } + public static void glMultiDrawArraysIndirect(int mode, long indirect_buffer_offset, int primcount, int stride) { + GL43.glMultiDrawArraysIndirect(mode, indirect_buffer_offset, primcount, stride); + } + + /** Overloads glMultiDrawArraysIndirect. */ + public static void glMultiDrawArraysIndirect(int mode, IntBuffer indirect, int primcount, int stride) { + GL43.glMultiDrawArraysIndirect(mode, indirect, primcount, stride); + } + + public static void glMultiDrawElementsIndirect(int mode, int type, ByteBuffer indirect, int primcount, int stride) { + GL43.glMultiDrawElementsIndirect(mode, type, indirect, primcount, stride); + } + public static void glMultiDrawElementsIndirect(int mode, int type, long indirect_buffer_offset, int primcount, int stride) { + GL43.glMultiDrawElementsIndirect(mode, type, indirect_buffer_offset, primcount, stride); + } + + /** Overloads glMultiDrawElementsIndirect. */ + public static void glMultiDrawElementsIndirect(int mode, int type, IntBuffer indirect, int primcount, int stride) { + GL43.glMultiDrawElementsIndirect(mode, type, indirect, primcount, stride); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultisample.java new file mode 100644 index 0000000..bebd14c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultisample.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMultisample { + + public static final int GL_MULTISAMPLE_ARB = 0x809D, + GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = 0x809E, + GL_SAMPLE_ALPHA_TO_ONE_ARB = 0x809F, + GL_SAMPLE_COVERAGE_ARB = 0x80A0, + GL_SAMPLE_BUFFERS_ARB = 0x80A8, + GL_SAMPLES_ARB = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE_ARB = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT_ARB = 0x80AB, + GL_MULTISAMPLE_BIT_ARB = 0x20000000; + + private ARBMultisample() {} + + public static void glSampleCoverageARB(float value, boolean invert) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSampleCoverageARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglSampleCoverageARB(value, invert, function_pointer); + } + static native void nglSampleCoverageARB(float value, boolean invert, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultitexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultitexture.java new file mode 100644 index 0000000..e0293e2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBMultitexture.java @@ -0,0 +1,191 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBMultitexture { + + public static final int GL_TEXTURE0_ARB = 0x84C0, + GL_TEXTURE1_ARB = 0x84C1, + GL_TEXTURE2_ARB = 0x84C2, + GL_TEXTURE3_ARB = 0x84C3, + GL_TEXTURE4_ARB = 0x84C4, + GL_TEXTURE5_ARB = 0x84C5, + GL_TEXTURE6_ARB = 0x84C6, + GL_TEXTURE7_ARB = 0x84C7, + GL_TEXTURE8_ARB = 0x84C8, + GL_TEXTURE9_ARB = 0x84C9, + GL_TEXTURE10_ARB = 0x84CA, + GL_TEXTURE11_ARB = 0x84CB, + GL_TEXTURE12_ARB = 0x84CC, + GL_TEXTURE13_ARB = 0x84CD, + GL_TEXTURE14_ARB = 0x84CE, + GL_TEXTURE15_ARB = 0x84CF, + GL_TEXTURE16_ARB = 0x84D0, + GL_TEXTURE17_ARB = 0x84D1, + GL_TEXTURE18_ARB = 0x84D2, + GL_TEXTURE19_ARB = 0x84D3, + GL_TEXTURE20_ARB = 0x84D4, + GL_TEXTURE21_ARB = 0x84D5, + GL_TEXTURE22_ARB = 0x84D6, + GL_TEXTURE23_ARB = 0x84D7, + GL_TEXTURE24_ARB = 0x84D8, + GL_TEXTURE25_ARB = 0x84D9, + GL_TEXTURE26_ARB = 0x84DA, + GL_TEXTURE27_ARB = 0x84DB, + GL_TEXTURE28_ARB = 0x84DC, + GL_TEXTURE29_ARB = 0x84DD, + GL_TEXTURE30_ARB = 0x84DE, + GL_TEXTURE31_ARB = 0x84DF, + GL_ACTIVE_TEXTURE_ARB = 0x84E0, + GL_CLIENT_ACTIVE_TEXTURE_ARB = 0x84E1, + GL_MAX_TEXTURE_UNITS_ARB = 0x84E2; + + private ARBMultitexture() {} + + public static void glClientActiveTextureARB(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClientActiveTextureARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglClientActiveTextureARB(texture, function_pointer); + } + static native void nglClientActiveTextureARB(int texture, long function_pointer); + + public static void glActiveTextureARB(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveTextureARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveTextureARB(texture, function_pointer); + } + static native void nglActiveTextureARB(int texture, long function_pointer); + + public static void glMultiTexCoord1fARB(int target, float s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1fARB(target, s, function_pointer); + } + static native void nglMultiTexCoord1fARB(int target, float s, long function_pointer); + + public static void glMultiTexCoord1dARB(int target, double s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1dARB(target, s, function_pointer); + } + static native void nglMultiTexCoord1dARB(int target, double s, long function_pointer); + + public static void glMultiTexCoord1iARB(int target, int s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1iARB(target, s, function_pointer); + } + static native void nglMultiTexCoord1iARB(int target, int s, long function_pointer); + + public static void glMultiTexCoord1sARB(int target, short s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1sARB(target, s, function_pointer); + } + static native void nglMultiTexCoord1sARB(int target, short s, long function_pointer); + + public static void glMultiTexCoord2fARB(int target, float s, float t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2fARB(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2fARB(int target, float s, float t, long function_pointer); + + public static void glMultiTexCoord2dARB(int target, double s, double t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2dARB(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2dARB(int target, double s, double t, long function_pointer); + + public static void glMultiTexCoord2iARB(int target, int s, int t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2iARB(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2iARB(int target, int s, int t, long function_pointer); + + public static void glMultiTexCoord2sARB(int target, short s, short t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2sARB(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2sARB(int target, short s, short t, long function_pointer); + + public static void glMultiTexCoord3fARB(int target, float s, float t, float r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3fARB(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3fARB(int target, float s, float t, float r, long function_pointer); + + public static void glMultiTexCoord3dARB(int target, double s, double t, double r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3dARB(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3dARB(int target, double s, double t, double r, long function_pointer); + + public static void glMultiTexCoord3iARB(int target, int s, int t, int r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3iARB(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3iARB(int target, int s, int t, int r, long function_pointer); + + public static void glMultiTexCoord3sARB(int target, short s, short t, short r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3sARB(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3sARB(int target, short s, short t, short r, long function_pointer); + + public static void glMultiTexCoord4fARB(int target, float s, float t, float r, float q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4fARB(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4fARB(int target, float s, float t, float r, float q, long function_pointer); + + public static void glMultiTexCoord4dARB(int target, double s, double t, double r, double q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4dARB(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4dARB(int target, double s, double t, double r, double q, long function_pointer); + + public static void glMultiTexCoord4iARB(int target, int s, int t, int r, int q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4iARB(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4iARB(int target, int s, int t, int r, int q, long function_pointer); + + public static void glMultiTexCoord4sARB(int target, short s, short t, short r, short q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4sARB(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4sARB(int target, short s, short t, short r, short q, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery.java new file mode 100644 index 0000000..58b353c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery.java @@ -0,0 +1,158 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBOcclusionQuery { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQueryARB, EndQueryARB, + * and GetQueryivARB: + */ + public static final int GL_SAMPLES_PASSED_ARB = 0x8914; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryivARB: + */ + public static final int GL_QUERY_COUNTER_BITS_ARB = 0x8864, + GL_CURRENT_QUERY_ARB = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectivARB and + * GetQueryObjectuivARB: + */ + public static final int GL_QUERY_RESULT_ARB = 0x8866, + GL_QUERY_RESULT_AVAILABLE_ARB = 0x8867; + + private ARBOcclusionQuery() {} + + public static void glGenQueriesARB(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenQueriesARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglGenQueriesARB(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglGenQueriesARB(int ids_n, long ids, long function_pointer); + + /** Overloads glGenQueriesARB. */ + public static int glGenQueriesARB() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenQueriesARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer ids = APIUtil.getBufferInt(caps); + nglGenQueriesARB(1, MemoryUtil.getAddress(ids), function_pointer); + return ids.get(0); + } + + public static void glDeleteQueriesARB(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteQueriesARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglDeleteQueriesARB(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglDeleteQueriesARB(int ids_n, long ids, long function_pointer); + + /** Overloads glDeleteQueriesARB. */ + public static void glDeleteQueriesARB(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteQueriesARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteQueriesARB(1, APIUtil.getInt(caps, id), function_pointer); + } + + public static boolean glIsQueryARB(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsQueryARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsQueryARB(id, function_pointer); + return __result; + } + static native boolean nglIsQueryARB(int id, long function_pointer); + + public static void glBeginQueryARB(int target, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginQueryARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginQueryARB(target, id, function_pointer); + } + static native void nglBeginQueryARB(int target, int id, long function_pointer); + + public static void glEndQueryARB(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndQueryARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndQueryARB(target, function_pointer); + } + static native void nglEndQueryARB(int target, long function_pointer); + + public static void glGetQueryARB(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryivARB(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryivARB(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetQueryivARB. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetQueryiARB} instead. + */ + @Deprecated + public static int glGetQueryARB(int target, int pname) { + return ARBOcclusionQuery.glGetQueryiARB(target, pname); + } + + /** Overloads glGetQueryivARB. */ + public static int glGetQueryiARB(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryivARB(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObjectARB(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectivARB(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectivARB(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjectivARB. */ + public static int glGetQueryObjectiARB(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryObjectivARB(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObjectuARB(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectuivARB(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectuivARB(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjectuivARB. */ + public static int glGetQueryObjectuiARB(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryObjectuivARB(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery2.java new file mode 100644 index 0000000..b05ce17 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBOcclusionQuery2.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBOcclusionQuery2 { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + public static final int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + private ARBOcclusionQuery2() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPixelBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPixelBufferObject.java new file mode 100644 index 0000000..282faa5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPixelBufferObject.java @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBPixelBufferObject extends ARBBufferObject { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv: + */ + public static final int GL_PIXEL_PACK_BUFFER_ARB = 0x88EB, + GL_PIXEL_UNPACK_BUFFER_ARB = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PIXEL_PACK_BUFFER_BINDING_ARB = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = 0x88EF; + + private ARBPixelBufferObject() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointParameters.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointParameters.java new file mode 100644 index 0000000..05e9dcc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointParameters.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBPointParameters { + + public static final int GL_POINT_SIZE_MIN_ARB = 0x8126, + GL_POINT_SIZE_MAX_ARB = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE_ARB = 0x8128, + GL_POINT_DISTANCE_ATTENUATION_ARB = 0x8129; + + private ARBPointParameters() {} + + public static void glPointParameterfARB(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterfARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointParameterfARB(pname, param, function_pointer); + } + static native void nglPointParameterfARB(int pname, float param, long function_pointer); + + public static void glPointParameterARB(int pname, FloatBuffer pfParams) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pfParams, 4); + nglPointParameterfvARB(pname, MemoryUtil.getAddress(pfParams), function_pointer); + } + static native void nglPointParameterfvARB(int pname, long pfParams, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointSprite.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointSprite.java new file mode 100644 index 0000000..22db3c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBPointSprite.java @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBPointSprite { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the &lt;target&gt; parameter of TexEnvi, TexEnviv, + * TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv: + */ + public static final int GL_POINT_SPRITE_ARB = 0x8861; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_ARB, then the value of + * &lt;pname&gt; may be: + */ + public static final int GL_COORD_REPLACE_ARB = 0x8862; + + private ARBPointSprite() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgram.java new file mode 100644 index 0000000..d63f0bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgram.java @@ -0,0 +1,322 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public class ARBProgram { + + /** + * Accepted by the &lt;format&gt; parameter of ProgramStringARB: + */ + public static final int GL_PROGRAM_FORMAT_ASCII_ARB = 0x8875; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_PROGRAM_LENGTH_ARB = 0x8627, + GL_PROGRAM_FORMAT_ARB = 0x8876, + GL_PROGRAM_BINDING_ARB = 0x8677, + GL_PROGRAM_INSTRUCTIONS_ARB = 0x88A0, + GL_MAX_PROGRAM_INSTRUCTIONS_ARB = 0x88A1, + GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A2, + GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A3, + GL_PROGRAM_TEMPORARIES_ARB = 0x88A4, + GL_MAX_PROGRAM_TEMPORARIES_ARB = 0x88A5, + GL_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A6, + GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A7, + GL_PROGRAM_PARAMETERS_ARB = 0x88A8, + GL_MAX_PROGRAM_PARAMETERS_ARB = 0x88A9, + GL_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AA, + GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AB, + GL_PROGRAM_ATTRIBS_ARB = 0x88AC, + GL_MAX_PROGRAM_ATTRIBS_ARB = 0x88AD, + GL_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AE, + GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AF, + GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = 0x88B4, + GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = 0x88B5, + GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = 0x88B6; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramStringARB: + */ + public static final int GL_PROGRAM_STRING_ARB = 0x8628; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PROGRAM_ERROR_POSITION_ARB = 0x864B, + GL_CURRENT_MATRIX_ARB = 0x8641, + GL_TRANSPOSE_CURRENT_MATRIX_ARB = 0x88B7, + GL_CURRENT_MATRIX_STACK_DEPTH_ARB = 0x8640, + GL_MAX_PROGRAM_MATRICES_ARB = 0x862F, + GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = 0x862E; + + /** + * Accepted by the &lt;name&gt; parameter of GetString: + */ + public static final int GL_PROGRAM_ERROR_STRING_ARB = 0x8874; + + /** + * Accepted by the &lt;mode&gt; parameter of MatrixMode: + */ + public static final int GL_MATRIX0_ARB = 0x88C0, + GL_MATRIX1_ARB = 0x88C1, + GL_MATRIX2_ARB = 0x88C2, + GL_MATRIX3_ARB = 0x88C3, + GL_MATRIX4_ARB = 0x88C4, + GL_MATRIX5_ARB = 0x88C5, + GL_MATRIX6_ARB = 0x88C6, + GL_MATRIX7_ARB = 0x88C7, + GL_MATRIX8_ARB = 0x88C8, + GL_MATRIX9_ARB = 0x88C9, + GL_MATRIX10_ARB = 0x88CA, + GL_MATRIX11_ARB = 0x88CB, + GL_MATRIX12_ARB = 0x88CC, + GL_MATRIX13_ARB = 0x88CD, + GL_MATRIX14_ARB = 0x88CE, + GL_MATRIX15_ARB = 0x88CF, + GL_MATRIX16_ARB = 0x88D0, + GL_MATRIX17_ARB = 0x88D1, + GL_MATRIX18_ARB = 0x88D2, + GL_MATRIX19_ARB = 0x88D3, + GL_MATRIX20_ARB = 0x88D4, + GL_MATRIX21_ARB = 0x88D5, + GL_MATRIX22_ARB = 0x88D6, + GL_MATRIX23_ARB = 0x88D7, + GL_MATRIX24_ARB = 0x88D8, + GL_MATRIX25_ARB = 0x88D9, + GL_MATRIX26_ARB = 0x88DA, + GL_MATRIX27_ARB = 0x88DB, + GL_MATRIX28_ARB = 0x88DC, + GL_MATRIX29_ARB = 0x88DD, + GL_MATRIX30_ARB = 0x88DE, + GL_MATRIX31_ARB = 0x88DF; + + + public static void glProgramStringARB(int target, int format, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglProgramStringARB(target, format, string.remaining(), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglProgramStringARB(int target, int format, int string_length, long string, long function_pointer); + + /** Overloads glProgramStringARB. */ + public static void glProgramStringARB(int target, int format, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramStringARB(target, format, string.length(), APIUtil.getBuffer(caps, string), function_pointer); + } + + public static void glBindProgramARB(int target, int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindProgramARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindProgramARB(target, program, function_pointer); + } + static native void nglBindProgramARB(int target, int program, long function_pointer); + + public static void glDeleteProgramsARB(IntBuffer programs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramsARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programs); + nglDeleteProgramsARB(programs.remaining(), MemoryUtil.getAddress(programs), function_pointer); + } + static native void nglDeleteProgramsARB(int programs_n, long programs, long function_pointer); + + /** Overloads glDeleteProgramsARB. */ + public static void glDeleteProgramsARB(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramsARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteProgramsARB(1, APIUtil.getInt(caps, program), function_pointer); + } + + public static void glGenProgramsARB(IntBuffer programs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramsARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programs); + nglGenProgramsARB(programs.remaining(), MemoryUtil.getAddress(programs), function_pointer); + } + static native void nglGenProgramsARB(int programs_n, long programs, long function_pointer); + + /** Overloads glGenProgramsARB. */ + public static int glGenProgramsARB() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramsARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer programs = APIUtil.getBufferInt(caps); + nglGenProgramsARB(1, MemoryUtil.getAddress(programs), function_pointer); + return programs.get(0); + } + + public static void glProgramEnvParameter4fARB(int target, int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameter4fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramEnvParameter4fARB(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramEnvParameter4fARB(int target, int index, float x, float y, float z, float w, long function_pointer); + + public static void glProgramEnvParameter4dARB(int target, int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameter4dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramEnvParameter4dARB(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramEnvParameter4dARB(int target, int index, double x, double y, double z, double w, long function_pointer); + + public static void glProgramEnvParameter4ARB(int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameter4fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramEnvParameter4fvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParameter4fvARB(int target, int index, long params, long function_pointer); + + public static void glProgramEnvParameter4ARB(int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameter4dvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramEnvParameter4dvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParameter4dvARB(int target, int index, long params, long function_pointer); + + public static void glProgramLocalParameter4fARB(int target, int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameter4fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramLocalParameter4fARB(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramLocalParameter4fARB(int target, int index, float x, float y, float z, float w, long function_pointer); + + public static void glProgramLocalParameter4dARB(int target, int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameter4dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramLocalParameter4dARB(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramLocalParameter4dARB(int target, int index, double x, double y, double z, double w, long function_pointer); + + public static void glProgramLocalParameter4ARB(int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameter4fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramLocalParameter4fvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParameter4fvARB(int target, int index, long params, long function_pointer); + + public static void glProgramLocalParameter4ARB(int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameter4dvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramLocalParameter4dvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParameter4dvARB(int target, int index, long params, long function_pointer); + + public static void glGetProgramEnvParameterARB(int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramEnvParameterfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramEnvParameterfvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramEnvParameterfvARB(int target, int index, long params, long function_pointer); + + public static void glGetProgramEnvParameterARB(int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramEnvParameterdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramEnvParameterdvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramEnvParameterdvARB(int target, int index, long params, long function_pointer); + + public static void glGetProgramLocalParameterARB(int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramLocalParameterfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramLocalParameterfvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramLocalParameterfvARB(int target, int index, long params, long function_pointer); + + public static void glGetProgramLocalParameterARB(int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramLocalParameterdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramLocalParameterdvARB(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramLocalParameterdvARB(int target, int index, long params, long function_pointer); + + public static void glGetProgramARB(int target, int parameterName, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramivARB(target, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramivARB(int target, int parameterName, long params, long function_pointer); + + /** + * Overloads glGetProgramivARB. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetProgramiARB} instead. + */ + @Deprecated + public static int glGetProgramARB(int target, int parameterName) { + return ARBProgram.glGetProgramiARB(target, parameterName); + } + + /** Overloads glGetProgramivARB. */ + public static int glGetProgramiARB(int target, int parameterName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetProgramivARB(target, parameterName, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetProgramStringARB(int target, int parameterName, ByteBuffer paramString) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paramString); + nglGetProgramStringARB(target, parameterName, MemoryUtil.getAddress(paramString), function_pointer); + } + static native void nglGetProgramStringARB(int target, int parameterName, long paramString, long function_pointer); + + /** Overloads glGetProgramStringARB. */ + public static String glGetProgramStringARB(int target, int parameterName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + int programLength = glGetProgramiARB(target, GL_PROGRAM_LENGTH_ARB); + ByteBuffer paramString = APIUtil.getBufferByte(caps, programLength); + nglGetProgramStringARB(target, parameterName, MemoryUtil.getAddress(paramString), function_pointer); + paramString.limit(programLength); + return APIUtil.getString(caps, paramString); + } + + public static boolean glIsProgramARB(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsProgramARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsProgramARB(program, function_pointer); + return __result; + } + static native boolean nglIsProgramARB(int program, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgramInterfaceQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgramInterfaceQuery.java new file mode 100644 index 0000000..f310d5d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProgramInterfaceQuery.java @@ -0,0 +1,121 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBProgramInterfaceQuery { + + /** + * Accepted by the &lt;programInterface&gt; parameter of GetProgramInterfaceiv, + * GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex: + */ + public static final int GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramInterfaceiv: + */ + public static final int GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** + * Accepted in the &lt;props&gt; array of GetProgramResourceiv: + */ + public static final int GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + private ARBProgramInterfaceQuery() {} + + public static void glGetProgramInterface(int program, int programInterface, int pname, IntBuffer params) { + GL43.glGetProgramInterface(program, programInterface, pname, params); + } + + /** Overloads glGetProgramInterfaceiv. */ + public static int glGetProgramInterfacei(int program, int programInterface, int pname) { + return GL43.glGetProgramInterfacei(program, programInterface, pname); + } + + public static int glGetProgramResourceIndex(int program, int programInterface, ByteBuffer name) { + return GL43.glGetProgramResourceIndex(program, programInterface, name); + } + + /** Overloads glGetProgramResourceIndex. */ + public static int glGetProgramResourceIndex(int program, int programInterface, CharSequence name) { + return GL43.glGetProgramResourceIndex(program, programInterface, name); + } + + public static void glGetProgramResourceName(int program, int programInterface, int index, IntBuffer length, ByteBuffer name) { + GL43.glGetProgramResourceName(program, programInterface, index, length, name); + } + + /** Overloads glGetProgramResourceName. */ + public static String glGetProgramResourceName(int program, int programInterface, int index, int bufSize) { + return GL43.glGetProgramResourceName(program, programInterface, index, bufSize); + } + + public static void glGetProgramResource(int program, int programInterface, int index, IntBuffer props, IntBuffer length, IntBuffer params) { + GL43.glGetProgramResource(program, programInterface, index, props, length, params); + } + + public static int glGetProgramResourceLocation(int program, int programInterface, ByteBuffer name) { + return GL43.glGetProgramResourceLocation(program, programInterface, name); + } + + /** Overloads glGetProgramResourceLocation. */ + public static int glGetProgramResourceLocation(int program, int programInterface, CharSequence name) { + return GL43.glGetProgramResourceLocation(program, programInterface, name); + } + + public static int glGetProgramResourceLocationIndex(int program, int programInterface, ByteBuffer name) { + return GL43.glGetProgramResourceLocationIndex(program, programInterface, name); + } + + /** Overloads glGetProgramResourceLocationIndex. */ + public static int glGetProgramResourceLocationIndex(int program, int programInterface, CharSequence name) { + return GL43.glGetProgramResourceLocationIndex(program, programInterface, name); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProvokingVertex.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProvokingVertex.java new file mode 100644 index 0000000..ff211e3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBProvokingVertex.java @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBProvokingVertex { + + /** + * Accepted by the &lt;mode&gt; parameter of ProvokingVertex: + */ + public static final int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PROVOKING_VERTEX = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + private ARBProvokingVertex() {} + + public static void glProvokingVertex(int mode) { + GL32.glProvokingVertex(mode); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBQueryBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBQueryBufferObject.java new file mode 100644 index 0000000..b1bf0db --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBQueryBufferObject.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBQueryBufferObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + public static final int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv, GetBufferParameteri64v, GetBufferPointerv, + * ClearBufferSubData, and the &lt;readtarget&gt; and &lt;writetarget&gt; parameters of + * CopyBufferSubData: + */ + public static final int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** + * Accepted in the &lt;barriers&gt; bitfield in MemoryBarrier: + */ + public static final int GL_QUERY_BUFFER_BARRIER_BIT = 0x8000; + + private ARBQueryBufferObject() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBRobustness.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBRobustness.java new file mode 100644 index 0000000..94ca83d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBRobustness.java @@ -0,0 +1,1712 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBRobustness { + + /** + * Returned by GetGraphicsResetStatusARB: + */ + public static final int GL_NO_ERROR = 0x0, + GL_GUILTY_CONTEXT_RESET_ARB = 0x8253, + GL_INNOCENT_CONTEXT_RESET_ARB = 0x8254, + GL_UNKNOWN_CONTEXT_RESET_ARB = 0x8255; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + + /** + * Returned by GetIntegerv and related simple queries when + * &lt;value&gt; is RESET_NOTIFICATION_STRATEGY_ARB: + */ + public static final int GL_LOSE_CONTEXT_ON_RESET_ARB = 0x8252, + GL_NO_RESET_NOTIFICATION_ARB = 0x8261; + + /** + * Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: + */ + public static final int GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB = 0x4; + + private ARBRobustness() {} + + public static int glGetGraphicsResetStatusARB() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetGraphicsResetStatusARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetGraphicsResetStatusARB(function_pointer); + return __result; + } + static native int nglGetGraphicsResetStatusARB(long function_pointer); + + public static void glGetnMapdvARB(int target, int query, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMapdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglGetnMapdvARB(target, query, v.remaining() << 3, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetnMapdvARB(int target, int query, int bufSize, long v, long function_pointer); + + public static void glGetnMapfvARB(int target, int query, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMapfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglGetnMapfvARB(target, query, v.remaining() << 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetnMapfvARB(int target, int query, int bufSize, long v, long function_pointer); + + public static void glGetnMapivARB(int target, int query, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMapivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglGetnMapivARB(target, query, v.remaining() << 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetnMapivARB(int target, int query, int bufSize, long v, long function_pointer); + + public static void glGetnPixelMapfvARB(int map, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnPixelMapfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglGetnPixelMapfvARB(map, values.remaining() << 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetnPixelMapfvARB(int map, int bufSize, long values, long function_pointer); + + public static void glGetnPixelMapuivARB(int map, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnPixelMapuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglGetnPixelMapuivARB(map, values.remaining() << 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetnPixelMapuivARB(int map, int bufSize, long values, long function_pointer); + + public static void glGetnPixelMapusvARB(int map, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnPixelMapusvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglGetnPixelMapusvARB(map, values.remaining() << 1, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetnPixelMapusvARB(int map, int bufSize, long values, long function_pointer); + + public static void glGetnPolygonStippleARB(ByteBuffer pattern) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnPolygonStippleARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pattern); + nglGetnPolygonStippleARB(pattern.remaining(), MemoryUtil.getAddress(pattern), function_pointer); + } + static native void nglGetnPolygonStippleARB(int pattern_bufSize, long pattern, long function_pointer); + + public static void glGetnTexImageARB(int target, int level, int format, int type, ByteBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnTexImageARB(target, level, format, type, img.remaining(), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnTexImageARB(int target, int level, int format, int type, DoubleBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnTexImageARB(target, level, format, type, (img.remaining() << 3), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnTexImageARB(int target, int level, int format, int type, FloatBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnTexImageARB(target, level, format, type, (img.remaining() << 2), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnTexImageARB(int target, int level, int format, int type, IntBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnTexImageARB(target, level, format, type, (img.remaining() << 2), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnTexImageARB(int target, int level, int format, int type, ShortBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnTexImageARB(target, level, format, type, (img.remaining() << 1), MemoryUtil.getAddress(img), function_pointer); + } + static native void nglGetnTexImageARB(int target, int level, int format, int type, int img_bufSize, long img, long function_pointer); + public static void glGetnTexImageARB(int target, int level, int format, int type, int img_bufSize, long img_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnTexImageARBBO(target, level, format, type, img_bufSize, img_buffer_offset, function_pointer); + } + static native void nglGetnTexImageARBBO(int target, int level, int format, int type, int img_bufSize, long img_buffer_offset, long function_pointer); + + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglReadnPixelsARB(x, y, width, height, format, type, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglReadnPixelsARB(x, y, width, height, format, type, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglReadnPixelsARB(x, y, width, height, format, type, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglReadnPixelsARB(x, y, width, height, format, type, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglReadnPixelsARB(x, y, width, height, format, type, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglReadnPixelsARB(int x, int y, int width, int height, int format, int type, int data_bufSize, long data, long function_pointer); + public static void glReadnPixelsARB(int x, int y, int width, int height, int format, int type, int data_bufSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadnPixelsARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglReadnPixelsARBBO(x, y, width, height, format, type, data_bufSize, data_buffer_offset, function_pointer); + } + static native void nglReadnPixelsARBBO(int x, int y, int width, int height, int format, int type, int data_bufSize, long data_buffer_offset, long function_pointer); + + public static void glGetnColorTableARB(int target, int format, int type, ByteBuffer table) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnColorTableARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(table); + nglGetnColorTableARB(target, format, type, table.remaining(), MemoryUtil.getAddress(table), function_pointer); + } + public static void glGetnColorTableARB(int target, int format, int type, DoubleBuffer table) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnColorTableARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(table); + nglGetnColorTableARB(target, format, type, (table.remaining() << 3), MemoryUtil.getAddress(table), function_pointer); + } + public static void glGetnColorTableARB(int target, int format, int type, FloatBuffer table) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnColorTableARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(table); + nglGetnColorTableARB(target, format, type, (table.remaining() << 2), MemoryUtil.getAddress(table), function_pointer); + } + static native void nglGetnColorTableARB(int target, int format, int type, int table_bufSize, long table, long function_pointer); + + public static void glGetnConvolutionFilterARB(int target, int format, int type, ByteBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetnConvolutionFilterARB(target, format, type, image.remaining(), MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetnConvolutionFilterARB(int target, int format, int type, DoubleBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetnConvolutionFilterARB(target, format, type, (image.remaining() << 3), MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetnConvolutionFilterARB(int target, int format, int type, FloatBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetnConvolutionFilterARB(target, format, type, (image.remaining() << 2), MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetnConvolutionFilterARB(int target, int format, int type, IntBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetnConvolutionFilterARB(target, format, type, (image.remaining() << 2), MemoryUtil.getAddress(image), function_pointer); + } + public static void glGetnConvolutionFilterARB(int target, int format, int type, ShortBuffer image) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(image); + nglGetnConvolutionFilterARB(target, format, type, (image.remaining() << 1), MemoryUtil.getAddress(image), function_pointer); + } + static native void nglGetnConvolutionFilterARB(int target, int format, int type, int image_bufSize, long image, long function_pointer); + public static void glGetnConvolutionFilterARB(int target, int format, int type, int image_bufSize, long image_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnConvolutionFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnConvolutionFilterARBBO(target, format, type, image_bufSize, image_buffer_offset, function_pointer); + } + static native void nglGetnConvolutionFilterARBBO(int target, int format, int type, int image_bufSize, long image_buffer_offset, long function_pointer); + + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ByteBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, DoubleBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, FloatBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, FloatBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, FloatBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, FloatBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, FloatBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, IntBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ShortBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ByteBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, row.remaining(), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ByteBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, FloatBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, FloatBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, FloatBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, FloatBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, FloatBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, IntBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ShortBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, DoubleBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 3), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ByteBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, DoubleBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, FloatBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, FloatBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, FloatBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, FloatBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, FloatBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, IntBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ShortBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, FloatBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ByteBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, DoubleBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, FloatBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, FloatBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, FloatBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, FloatBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, FloatBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, IntBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ShortBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, IntBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 2), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ByteBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ByteBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ByteBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ByteBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ByteBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), column.remaining(), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, DoubleBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, DoubleBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, DoubleBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, DoubleBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, DoubleBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 3), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, FloatBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, FloatBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, FloatBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, FloatBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, FloatBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, IntBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, IntBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, IntBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, IntBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, IntBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 2), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ShortBuffer column, ByteBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ShortBuffer column, DoubleBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ShortBuffer column, FloatBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ShortBuffer column, IntBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + public static void glGetnSeparableFilterARB(int target, int format, int type, ShortBuffer row, ShortBuffer column, ShortBuffer span) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(row); + BufferChecks.checkDirect(column); + BufferChecks.checkDirect(span); + nglGetnSeparableFilterARB(target, format, type, (row.remaining() << 1), MemoryUtil.getAddress(row), (column.remaining() << 1), MemoryUtil.getAddress(column), MemoryUtil.getAddress(span), function_pointer); + } + static native void nglGetnSeparableFilterARB(int target, int format, int type, int row_rowBufSize, long row, int column_columnBufSize, long column, long span, long function_pointer); + public static void glGetnSeparableFilterARB(int target, int format, int type, int row_rowBufSize, long row_buffer_offset, int column_columnBufSize, long column_buffer_offset, long span_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnSeparableFilterARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnSeparableFilterARBBO(target, format, type, row_rowBufSize, row_buffer_offset, column_columnBufSize, column_buffer_offset, span_buffer_offset, function_pointer); + } + static native void nglGetnSeparableFilterARBBO(int target, int format, int type, int row_rowBufSize, long row_buffer_offset, int column_columnBufSize, long column_buffer_offset, long span_buffer_offset, long function_pointer); + + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, ByteBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnHistogramARB(target, reset, format, type, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, DoubleBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnHistogramARB(target, reset, format, type, (values.remaining() << 3), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnHistogramARB(target, reset, format, type, (values.remaining() << 2), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnHistogramARB(target, reset, format, type, (values.remaining() << 2), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnHistogramARB(target, reset, format, type, (values.remaining() << 1), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetnHistogramARB(int target, boolean reset, int format, int type, int values_bufSize, long values, long function_pointer); + public static void glGetnHistogramARB(int target, boolean reset, int format, int type, int values_bufSize, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnHistogramARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnHistogramARBBO(target, reset, format, type, values_bufSize, values_buffer_offset, function_pointer); + } + static native void nglGetnHistogramARBBO(int target, boolean reset, int format, int type, int values_bufSize, long values_buffer_offset, long function_pointer); + + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, ByteBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnMinmaxARB(target, reset, format, type, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, DoubleBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnMinmaxARB(target, reset, format, type, (values.remaining() << 3), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnMinmaxARB(target, reset, format, type, (values.remaining() << 2), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnMinmaxARB(target, reset, format, type, (values.remaining() << 2), MemoryUtil.getAddress(values), function_pointer); + } + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglGetnMinmaxARB(target, reset, format, type, (values.remaining() << 1), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetnMinmaxARB(int target, boolean reset, int format, int type, int values_bufSize, long values, long function_pointer); + public static void glGetnMinmaxARB(int target, boolean reset, int format, int type, int values_bufSize, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnMinmaxARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnMinmaxARBBO(target, reset, format, type, values_bufSize, values_buffer_offset, function_pointer); + } + static native void nglGetnMinmaxARBBO(int target, boolean reset, int format, int type, int values_bufSize, long values_buffer_offset, long function_pointer); + + public static void glGetnCompressedTexImageARB(int target, int lod, ByteBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnCompressedTexImageARB(target, lod, img.remaining(), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnCompressedTexImageARB(int target, int lod, IntBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnCompressedTexImageARB(target, lod, (img.remaining() << 2), MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetnCompressedTexImageARB(int target, int lod, ShortBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetnCompressedTexImageARB(target, lod, (img.remaining() << 1), MemoryUtil.getAddress(img), function_pointer); + } + static native void nglGetnCompressedTexImageARB(int target, int lod, int img_bufSize, long img, long function_pointer); + public static void glGetnCompressedTexImageARB(int target, int lod, int img_bufSize, long img_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetnCompressedTexImageARBBO(target, lod, img_bufSize, img_buffer_offset, function_pointer); + } + static native void nglGetnCompressedTexImageARBBO(int target, int lod, int img_bufSize, long img_buffer_offset, long function_pointer); + + public static void glGetnUniformfvARB(int program, int location, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnUniformfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetnUniformfvARB(program, location, params.remaining() << 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetnUniformfvARB(int program, int location, int bufSize, long params, long function_pointer); + + public static void glGetnUniformivARB(int program, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnUniformivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetnUniformivARB(program, location, params.remaining() << 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetnUniformivARB(int program, int location, int bufSize, long params, long function_pointer); + + public static void glGetnUniformuivARB(int program, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnUniformuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetnUniformuivARB(program, location, params.remaining() << 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetnUniformuivARB(int program, int location, int bufSize, long params, long function_pointer); + + public static void glGetnUniformdvARB(int program, int location, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetnUniformdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetnUniformdvARB(program, location, params.remaining() << 3, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetnUniformdvARB(int program, int location, int bufSize, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSampleShading.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSampleShading.java new file mode 100644 index 0000000..4396c0f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSampleShading.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSampleShading { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_SAMPLE_SHADING_ARB = 0x8C36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + public static final int GL_MIN_SAMPLE_SHADING_VALUE_ARB = 0x8C37; + + private ARBSampleShading() {} + + public static void glMinSampleShadingARB(float value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMinSampleShadingARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglMinSampleShadingARB(value, function_pointer); + } + static native void nglMinSampleShadingARB(float value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSamplerObjects.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSamplerObjects.java new file mode 100644 index 0000000..da4d1e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSamplerObjects.java @@ -0,0 +1,103 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSamplerObjects { + + /** + * Accepted by the &lt;value&gt; parameter of the GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev functions: + */ + public static final int GL_SAMPLER_BINDING = 0x8919; + + private ARBSamplerObjects() {} + + public static void glGenSamplers(IntBuffer samplers) { + GL33.glGenSamplers(samplers); + } + + /** Overloads glGenSamplers. */ + public static int glGenSamplers() { + return GL33.glGenSamplers(); + } + + public static void glDeleteSamplers(IntBuffer samplers) { + GL33.glDeleteSamplers(samplers); + } + + /** Overloads glDeleteSamplers. */ + public static void glDeleteSamplers(int sampler) { + GL33.glDeleteSamplers(sampler); + } + + public static boolean glIsSampler(int sampler) { + return GL33.glIsSampler(sampler); + } + + public static void glBindSampler(int unit, int sampler) { + GL33.glBindSampler(unit, sampler); + } + + public static void glSamplerParameteri(int sampler, int pname, int param) { + GL33.glSamplerParameteri(sampler, pname, param); + } + + public static void glSamplerParameterf(int sampler, int pname, float param) { + GL33.glSamplerParameterf(sampler, pname, param); + } + + public static void glSamplerParameter(int sampler, int pname, IntBuffer params) { + GL33.glSamplerParameter(sampler, pname, params); + } + + public static void glSamplerParameter(int sampler, int pname, FloatBuffer params) { + GL33.glSamplerParameter(sampler, pname, params); + } + + public static void glSamplerParameterI(int sampler, int pname, IntBuffer params) { + GL33.glSamplerParameterI(sampler, pname, params); + } + + public static void glSamplerParameterIu(int sampler, int pname, IntBuffer params) { + GL33.glSamplerParameterIu(sampler, pname, params); + } + + public static void glGetSamplerParameter(int sampler, int pname, IntBuffer params) { + GL33.glGetSamplerParameter(sampler, pname, params); + } + + /** Overloads glGetSamplerParameteriv. */ + public static int glGetSamplerParameteri(int sampler, int pname) { + return GL33.glGetSamplerParameteri(sampler, pname); + } + + public static void glGetSamplerParameter(int sampler, int pname, FloatBuffer params) { + GL33.glGetSamplerParameter(sampler, pname, params); + } + + /** Overloads glGetSamplerParameterfv. */ + public static float glGetSamplerParameterf(int sampler, int pname) { + return GL33.glGetSamplerParameterf(sampler, pname); + } + + public static void glGetSamplerParameterI(int sampler, int pname, IntBuffer params) { + GL33.glGetSamplerParameterI(sampler, pname, params); + } + + /** Overloads glGetSamplerParameterIiv. */ + public static int glGetSamplerParameterIi(int sampler, int pname) { + return GL33.glGetSamplerParameterIi(sampler, pname); + } + + public static void glGetSamplerParameterIu(int sampler, int pname, IntBuffer params) { + GL33.glGetSamplerParameterIu(sampler, pname, params); + } + + /** Overloads glGetSamplerParameterIuiv. */ + public static int glGetSamplerParameterIui(int sampler, int pname) { + return GL33.glGetSamplerParameterIui(sampler, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubeMap.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubeMap.java new file mode 100644 index 0000000..9df648e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubeMap.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSeamlessCubeMap { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private ARBSeamlessCubeMap() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java new file mode 100644 index 0000000..607d496 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeamlessCubemapPerTexture.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSeamlessCubemapPerTexture { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter{if}, + * TexParameter{if}v, GetTexParameter{if}v, SamplerParameter{if}, + * SamplerParameter{if}v, and GetSamplerParameter{if}v: + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + private ARBSeamlessCubemapPerTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeparateShaderObjects.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeparateShaderObjects.java new file mode 100644 index 0000000..f270571 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSeparateShaderObjects.java @@ -0,0 +1,329 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSeparateShaderObjects { + + /** + * Accepted by &lt;stages&gt; parameter to UseProgramStages: + */ + public static final int GL_VERTEX_SHADER_BIT = 0x1, + GL_FRAGMENT_SHADER_BIT = 0x2, + GL_GEOMETRY_SHADER_BIT = 0x4, + GL_TESS_CONTROL_SHADER_BIT = 0x8, + GL_TESS_EVALUATION_SHADER_BIT = 0x10, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + public static final int GL_PROGRAM_SEPARABLE = 0x8258; + + /** + * Accepted by &lt;type&gt; parameter to GetProgramPipelineiv: + */ + public static final int GL_ACTIVE_PROGRAM = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + private ARBSeparateShaderObjects() {} + + public static void glUseProgramStages(int pipeline, int stages, int program) { + GL41.glUseProgramStages(pipeline, stages, program); + } + + public static void glActiveShaderProgram(int pipeline, int program) { + GL41.glActiveShaderProgram(pipeline, program); + } + + /** + * Single null-terminated source code string. + */ + public static int glCreateShaderProgram(int type, ByteBuffer string) { + return GL41.glCreateShaderProgram(type, string); + } + + /** + * Overloads glCreateShaderProgramv. + * <p> + * Multiple null-terminated source code strings, one after the other. + */ + public static int glCreateShaderProgram(int type, int count, ByteBuffer strings) { + return GL41.glCreateShaderProgram(type, count, strings); + } + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, ByteBuffer[] strings) { + return GL41.glCreateShaderProgram(type, strings); + } + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, CharSequence string) { + return GL41.glCreateShaderProgram(type, string); + } + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, CharSequence[] strings) { + return GL41.glCreateShaderProgram(type, strings); + } + + public static void glBindProgramPipeline(int pipeline) { + GL41.glBindProgramPipeline(pipeline); + } + + public static void glDeleteProgramPipelines(IntBuffer pipelines) { + GL41.glDeleteProgramPipelines(pipelines); + } + + /** Overloads glDeleteProgramPipelines. */ + public static void glDeleteProgramPipelines(int pipeline) { + GL41.glDeleteProgramPipelines(pipeline); + } + + public static void glGenProgramPipelines(IntBuffer pipelines) { + GL41.glGenProgramPipelines(pipelines); + } + + /** Overloads glGenProgramPipelines. */ + public static int glGenProgramPipelines() { + return GL41.glGenProgramPipelines(); + } + + public static boolean glIsProgramPipeline(int pipeline) { + return GL41.glIsProgramPipeline(pipeline); + } + + public static void glProgramParameteri(int program, int pname, int value) { + GL41.glProgramParameteri(program, pname, value); + } + + public static void glGetProgramPipeline(int pipeline, int pname, IntBuffer params) { + GL41.glGetProgramPipeline(pipeline, pname, params); + } + + /** Overloads glGetProgramPipelineiv. */ + public static int glGetProgramPipelinei(int pipeline, int pname) { + return GL41.glGetProgramPipelinei(pipeline, pname); + } + + public static void glProgramUniform1i(int program, int location, int v0) { + GL41.glProgramUniform1i(program, location, v0); + } + + public static void glProgramUniform2i(int program, int location, int v0, int v1) { + GL41.glProgramUniform2i(program, location, v0, v1); + } + + public static void glProgramUniform3i(int program, int location, int v0, int v1, int v2) { + GL41.glProgramUniform3i(program, location, v0, v1, v2); + } + + public static void glProgramUniform4i(int program, int location, int v0, int v1, int v2, int v3) { + GL41.glProgramUniform4i(program, location, v0, v1, v2, v3); + } + + public static void glProgramUniform1f(int program, int location, float v0) { + GL41.glProgramUniform1f(program, location, v0); + } + + public static void glProgramUniform2f(int program, int location, float v0, float v1) { + GL41.glProgramUniform2f(program, location, v0, v1); + } + + public static void glProgramUniform3f(int program, int location, float v0, float v1, float v2) { + GL41.glProgramUniform3f(program, location, v0, v1, v2); + } + + public static void glProgramUniform4f(int program, int location, float v0, float v1, float v2, float v3) { + GL41.glProgramUniform4f(program, location, v0, v1, v2, v3); + } + + public static void glProgramUniform1d(int program, int location, double v0) { + GL41.glProgramUniform1d(program, location, v0); + } + + public static void glProgramUniform2d(int program, int location, double v0, double v1) { + GL41.glProgramUniform2d(program, location, v0, v1); + } + + public static void glProgramUniform3d(int program, int location, double v0, double v1, double v2) { + GL41.glProgramUniform3d(program, location, v0, v1, v2); + } + + public static void glProgramUniform4d(int program, int location, double v0, double v1, double v2, double v3) { + GL41.glProgramUniform4d(program, location, v0, v1, v2, v3); + } + + public static void glProgramUniform1(int program, int location, IntBuffer value) { + GL41.glProgramUniform1(program, location, value); + } + + public static void glProgramUniform2(int program, int location, IntBuffer value) { + GL41.glProgramUniform2(program, location, value); + } + + public static void glProgramUniform3(int program, int location, IntBuffer value) { + GL41.glProgramUniform3(program, location, value); + } + + public static void glProgramUniform4(int program, int location, IntBuffer value) { + GL41.glProgramUniform4(program, location, value); + } + + public static void glProgramUniform1(int program, int location, FloatBuffer value) { + GL41.glProgramUniform1(program, location, value); + } + + public static void glProgramUniform2(int program, int location, FloatBuffer value) { + GL41.glProgramUniform2(program, location, value); + } + + public static void glProgramUniform3(int program, int location, FloatBuffer value) { + GL41.glProgramUniform3(program, location, value); + } + + public static void glProgramUniform4(int program, int location, FloatBuffer value) { + GL41.glProgramUniform4(program, location, value); + } + + public static void glProgramUniform1(int program, int location, DoubleBuffer value) { + GL41.glProgramUniform1(program, location, value); + } + + public static void glProgramUniform2(int program, int location, DoubleBuffer value) { + GL41.glProgramUniform2(program, location, value); + } + + public static void glProgramUniform3(int program, int location, DoubleBuffer value) { + GL41.glProgramUniform3(program, location, value); + } + + public static void glProgramUniform4(int program, int location, DoubleBuffer value) { + GL41.glProgramUniform4(program, location, value); + } + + public static void glProgramUniform1ui(int program, int location, int v0) { + GL41.glProgramUniform1ui(program, location, v0); + } + + public static void glProgramUniform2ui(int program, int location, int v0, int v1) { + GL41.glProgramUniform2ui(program, location, v0, v1); + } + + public static void glProgramUniform3ui(int program, int location, int v0, int v1, int v2) { + GL41.glProgramUniform3ui(program, location, v0, v1, v2); + } + + public static void glProgramUniform4ui(int program, int location, int v0, int v1, int v2, int v3) { + GL41.glProgramUniform4ui(program, location, v0, v1, v2, v3); + } + + public static void glProgramUniform1u(int program, int location, IntBuffer value) { + GL41.glProgramUniform1u(program, location, value); + } + + public static void glProgramUniform2u(int program, int location, IntBuffer value) { + GL41.glProgramUniform2u(program, location, value); + } + + public static void glProgramUniform3u(int program, int location, IntBuffer value) { + GL41.glProgramUniform3u(program, location, value); + } + + public static void glProgramUniform4u(int program, int location, IntBuffer value) { + GL41.glProgramUniform4u(program, location, value); + } + + public static void glProgramUniformMatrix2(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix3(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix2(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix3(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix2x3(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix2x3(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3x2(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix3x2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix2x4(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix2x4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4x2(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix4x2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3x4(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix3x4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4x3(int program, int location, boolean transpose, FloatBuffer value) { + GL41.glProgramUniformMatrix4x3(program, location, transpose, value); + } + + public static void glProgramUniformMatrix2x3(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix2x3(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3x2(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix3x2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix2x4(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix2x4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4x2(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix4x2(program, location, transpose, value); + } + + public static void glProgramUniformMatrix3x4(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix3x4(program, location, transpose, value); + } + + public static void glProgramUniformMatrix4x3(int program, int location, boolean transpose, DoubleBuffer value) { + GL41.glProgramUniformMatrix4x3(program, location, transpose, value); + } + + public static void glValidateProgramPipeline(int pipeline) { + GL41.glValidateProgramPipeline(pipeline); + } + + public static void glGetProgramPipelineInfoLog(int pipeline, IntBuffer length, ByteBuffer infoLog) { + GL41.glGetProgramPipelineInfoLog(pipeline, length, infoLog); + } + + /** Overloads glGetProgramPipelineInfoLog. */ + public static String glGetProgramPipelineInfoLog(int pipeline, int bufSize) { + return GL41.glGetProgramPipelineInfoLog(pipeline, bufSize); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderAtomicCounters.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderAtomicCounters.java new file mode 100644 index 0000000..8a76c61 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderAtomicCounters.java @@ -0,0 +1,84 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShaderAtomicCounters { + + /** + * Accepted by the &lt;target&gt; parameter of BindBufferBase and BindBufferRange: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_64v: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: + */ + public static final int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** + * Returned in &lt;params&gt; by GetActiveUniform and GetActiveUniformsiv: + */ + public static final int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + private ARBShaderAtomicCounters() {} + + public static void glGetActiveAtomicCounterBuffer(int program, int bufferIndex, int pname, IntBuffer params) { + GL42.glGetActiveAtomicCounterBuffer(program, bufferIndex, pname, params); + } + + /** Overloads glGetActiveAtomicCounterBufferiv. */ + public static int glGetActiveAtomicCounterBuffer(int program, int bufferIndex, int pname) { + return GL42.glGetActiveAtomicCounterBuffer(program, bufferIndex, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderImageLoadStore.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderImageLoadStore.java new file mode 100644 index 0000000..59a8c74 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderImageLoadStore.java @@ -0,0 +1,111 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShaderImageLoadStore { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** + * Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: + */ + public static final int GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x2, + GL_UNIFORM_BARRIER_BIT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x20, + GL_COMMAND_BARRIER_BIT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x1000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv: + */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the &lt;data&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv when &lt;value&gt; is + * IMAGE_FORMAT_COMPATIBILITY_TYPE: + */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + private ARBShaderImageLoadStore() {} + + public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) { + GL42.glBindImageTexture(unit, texture, level, layered, layer, access, format); + } + + public static void glMemoryBarrier(int barriers) { + GL42.glMemoryBarrier(barriers); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderObjects.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderObjects.java new file mode 100644 index 0000000..530a1db --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderObjects.java @@ -0,0 +1,552 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShaderObjects { + + /** + * Accepted by the &lt;pname&gt; argument of GetHandleARB: + */ + public static final int GL_PROGRAM_OBJECT_ARB = 0x8B40; + + /** + * Accepted by the &lt;pname&gt; parameter of GetObjectParameter{fi}vARB: + */ + public static final int GL_OBJECT_TYPE_ARB = 0x8B4E, + GL_OBJECT_SUBTYPE_ARB = 0x8B4F, + GL_OBJECT_DELETE_STATUS_ARB = 0x8B80, + GL_OBJECT_COMPILE_STATUS_ARB = 0x8B81, + GL_OBJECT_LINK_STATUS_ARB = 0x8B82, + GL_OBJECT_VALIDATE_STATUS_ARB = 0x8B83, + GL_OBJECT_INFO_LOG_LENGTH_ARB = 0x8B84, + GL_OBJECT_ATTACHED_OBJECTS_ARB = 0x8B85, + GL_OBJECT_ACTIVE_UNIFORMS_ARB = 0x8B86, + GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = 0x8B87, + GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = 0x8B88; + + /** + * Returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: + */ + public static final int GL_SHADER_OBJECT_ARB = 0x8B48; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniformARB: + */ + public static final int GL_FLOAT_VEC2_ARB = 0x8B50, + GL_FLOAT_VEC3_ARB = 0x8B51, + GL_FLOAT_VEC4_ARB = 0x8B52, + GL_INT_VEC2_ARB = 0x8B53, + GL_INT_VEC3_ARB = 0x8B54, + GL_INT_VEC4_ARB = 0x8B55, + GL_BOOL_ARB = 0x8B56, + GL_BOOL_VEC2_ARB = 0x8B57, + GL_BOOL_VEC3_ARB = 0x8B58, + GL_BOOL_VEC4_ARB = 0x8B59, + GL_FLOAT_MAT2_ARB = 0x8B5A, + GL_FLOAT_MAT3_ARB = 0x8B5B, + GL_FLOAT_MAT4_ARB = 0x8B5C, + GL_SAMPLER_1D_ARB = 0x8B5D, + GL_SAMPLER_2D_ARB = 0x8B5E, + GL_SAMPLER_3D_ARB = 0x8B5F, + GL_SAMPLER_CUBE_ARB = 0x8B60, + GL_SAMPLER_1D_SHADOW_ARB = 0x8B61, + GL_SAMPLER_2D_SHADOW_ARB = 0x8B62, + GL_SAMPLER_2D_RECT_ARB = 0x8B63, + GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + private ARBShaderObjects() {} + + public static void glDeleteObjectARB(int obj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteObjectARB(obj, function_pointer); + } + static native void nglDeleteObjectARB(int obj, long function_pointer); + + public static int glGetHandleARB(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetHandleARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetHandleARB(pname, function_pointer); + return __result; + } + static native int nglGetHandleARB(int pname, long function_pointer); + + public static void glDetachObjectARB(int containerObj, int attachedObj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDetachObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDetachObjectARB(containerObj, attachedObj, function_pointer); + } + static native void nglDetachObjectARB(int containerObj, int attachedObj, long function_pointer); + + public static int glCreateShaderObjectARB(int shaderType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateShaderObjectARB(shaderType, function_pointer); + return __result; + } + static native int nglCreateShaderObjectARB(int shaderType, long function_pointer); + + /** + * The ARB_shader_objects extension allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + */ + public static void glShaderSourceARB(int shader, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSourceARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglShaderSourceARB(shader, 1, MemoryUtil.getAddress(string), string.remaining(), function_pointer); + } + static native void nglShaderSourceARB(int shader, int count, long string, int string_length, long function_pointer); + + /** Overloads glShaderSourceARB. */ + public static void glShaderSourceARB(int shader, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSourceARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderSourceARB(shader, 1, APIUtil.getBuffer(caps, string), string.length(), function_pointer); + } + + /** Overloads glShaderSourceARB. */ + public static void glShaderSourceARB(int shader, CharSequence[] strings) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSourceARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings); + nglShaderSourceARB3(shader, strings.length, APIUtil.getBuffer(caps, strings), APIUtil.getLengths(caps, strings), function_pointer); + } + static native void nglShaderSourceARB3(int shader, int count, long strings, long length, long function_pointer); + + public static void glCompileShaderARB(int shaderObj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompileShaderARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglCompileShaderARB(shaderObj, function_pointer); + } + static native void nglCompileShaderARB(int shaderObj, long function_pointer); + + public static int glCreateProgramObjectARB() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateProgramObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateProgramObjectARB(function_pointer); + return __result; + } + static native int nglCreateProgramObjectARB(long function_pointer); + + public static void glAttachObjectARB(int containerObj, int obj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAttachObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglAttachObjectARB(containerObj, obj, function_pointer); + } + static native void nglAttachObjectARB(int containerObj, int obj, long function_pointer); + + public static void glLinkProgramARB(int programObj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLinkProgramARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglLinkProgramARB(programObj, function_pointer); + } + static native void nglLinkProgramARB(int programObj, long function_pointer); + + public static void glUseProgramObjectARB(int programObj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUseProgramObjectARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUseProgramObjectARB(programObj, function_pointer); + } + static native void nglUseProgramObjectARB(int programObj, long function_pointer); + + public static void glValidateProgramARB(int programObj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glValidateProgramARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglValidateProgramARB(programObj, function_pointer); + } + static native void nglValidateProgramARB(int programObj, long function_pointer); + + public static void glUniform1fARB(int location, float v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1fARB(location, v0, function_pointer); + } + static native void nglUniform1fARB(int location, float v0, long function_pointer); + + public static void glUniform2fARB(int location, float v0, float v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2fARB(location, v0, v1, function_pointer); + } + static native void nglUniform2fARB(int location, float v0, float v1, long function_pointer); + + public static void glUniform3fARB(int location, float v0, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3fARB(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3fARB(int location, float v0, float v1, float v2, long function_pointer); + + public static void glUniform4fARB(int location, float v0, float v1, float v2, float v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4fARB(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4fARB(int location, float v0, float v1, float v2, float v3, long function_pointer); + + public static void glUniform1iARB(int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1iARB(location, v0, function_pointer); + } + static native void nglUniform1iARB(int location, int v0, long function_pointer); + + public static void glUniform2iARB(int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2iARB(location, v0, v1, function_pointer); + } + static native void nglUniform2iARB(int location, int v0, int v1, long function_pointer); + + public static void glUniform3iARB(int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3iARB(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3iARB(int location, int v0, int v1, int v2, long function_pointer); + + public static void glUniform4iARB(int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4iARB(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4iARB(int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glUniform1ARB(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform1fvARB(location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform1fvARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform2ARB(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform2fvARB(location, values.remaining() >> 1, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform2fvARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform3ARB(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform3fvARB(location, values.remaining() / 3, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform3fvARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform4ARB(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform4fvARB(location, values.remaining() >> 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform4fvARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform1ARB(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1ivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform1ivARB(location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform1ivARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform2ARB(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2ivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform2ivARB(location, values.remaining() >> 1, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform2ivARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform3ARB(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3ivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform3ivARB(location, values.remaining() / 3, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform3ivARB(int location, int values_count, long values, long function_pointer); + + public static void glUniform4ARB(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4ivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform4ivARB(location, values.remaining() >> 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform4ivARB(int location, int values_count, long values, long function_pointer); + + public static void glUniformMatrix2ARB(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix2fvARB(location, matrices.remaining() >> 2, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix2fvARB(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix3ARB(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix3fvARB(location, matrices.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix3fvARB(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix4ARB(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4fvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix4fvARB(location, matrices.remaining() >> 4, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix4fvARB(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glGetObjectParameterARB(int obj, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetObjectParameterfvARB(obj, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetObjectParameterfvARB(int obj, int pname, long params, long function_pointer); + + /** Overloads glGetObjectParameterfvARB. */ + public static float glGetObjectParameterfARB(int obj, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetObjectParameterfvARB(obj, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetObjectParameterARB(int obj, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetObjectParameterivARB(obj, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetObjectParameterivARB(int obj, int pname, long params, long function_pointer); + + /** Overloads glGetObjectParameterivARB. */ + public static int glGetObjectParameteriARB(int obj, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectParameterivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetObjectParameterivARB(obj, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetInfoLogARB(int obj, IntBuffer length, ByteBuffer infoLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInfoLogARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetInfoLogARB(obj, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog), function_pointer); + } + static native void nglGetInfoLogARB(int obj, int infoLog_maxLength, long length, long infoLog, long function_pointer); + + /** Overloads glGetInfoLogARB. */ + public static String glGetInfoLogARB(int obj, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInfoLogARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer infoLog_length = APIUtil.getLengths(caps); + ByteBuffer infoLog = APIUtil.getBufferByte(caps, maxLength); + nglGetInfoLogARB(obj, maxLength, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog), function_pointer); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(caps, infoLog); + } + + public static void glGetAttachedObjectsARB(int containerObj, IntBuffer count, IntBuffer obj) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttachedObjectsARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (count != null) + BufferChecks.checkBuffer(count, 1); + BufferChecks.checkDirect(obj); + nglGetAttachedObjectsARB(containerObj, obj.remaining(), MemoryUtil.getAddressSafe(count), MemoryUtil.getAddress(obj), function_pointer); + } + static native void nglGetAttachedObjectsARB(int containerObj, int obj_maxCount, long count, long obj, long function_pointer); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a <b>null-terminated</b> string. + * <p> + * @param programObj + * @param name + */ + public static int glGetUniformLocationARB(int programObj, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetUniformLocationARB(programObj, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetUniformLocationARB(int programObj, long name, long function_pointer); + + /** Overloads glGetUniformLocationARB. */ + public static int glGetUniformLocationARB(int programObj, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetUniformLocationARB(programObj, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetActiveUniformARB(int programObj, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveUniformARB(programObj, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveUniformARB(int programObj, int index, int name_maxLength, long length, long size, long type, long name, long function_pointer); + + /** + * Overloads glGetActiveUniformARB. + * <p> + * Overloads glGetActiveUniformARB. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveUniformARB(int programObj, int index, int maxLength, IntBuffer sizeType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveUniformARB(programObj, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveUniformARB. + * <p> + * Overloads glGetActiveUniformARB. This version returns only the uniform name. + */ + public static String glGetActiveUniformARB(int programObj, int index, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveUniformARB(programObj, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveUniformARB. + * <p> + * Overloads glGetActiveUniformARB. This version returns only the uniform size. + */ + public static int glGetActiveUniformSizeARB(int programObj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer size = APIUtil.getBufferInt(caps); + nglGetActiveUniformARB(programObj, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0(caps), function_pointer); + return size.get(0); + } + + /** + * Overloads glGetActiveUniformARB. + * <p> + * Overloads glGetActiveUniformARB. This version returns only the uniform type. + */ + public static int glGetActiveUniformTypeARB(int programObj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer type = APIUtil.getBufferInt(caps); + nglGetActiveUniformARB(programObj, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0(caps), function_pointer); + return type.get(0); + } + + public static void glGetUniformARB(int programObj, int location, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformfvARB(programObj, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformfvARB(int programObj, int location, long params, long function_pointer); + + public static void glGetUniformARB(int programObj, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformivARB(programObj, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformivARB(int programObj, int location, long params, long function_pointer); + + public static void glGetShaderSourceARB(int obj, IntBuffer length, ByteBuffer source) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderSourceARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(source); + nglGetShaderSourceARB(obj, source.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(source), function_pointer); + } + static native void nglGetShaderSourceARB(int obj, int source_maxLength, long length, long source, long function_pointer); + + /** Overloads glGetShaderSourceARB. */ + public static String glGetShaderSourceARB(int obj, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderSourceARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer source_length = APIUtil.getLengths(caps); + ByteBuffer source = APIUtil.getBufferByte(caps, maxLength); + nglGetShaderSourceARB(obj, maxLength, MemoryUtil.getAddress0(source_length), MemoryUtil.getAddress(source), function_pointer); + source.limit(source_length.get(0)); + return APIUtil.getString(caps, source); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderStorageBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderStorageBufferObject.java new file mode 100644 index 0000000..ad5a462 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderStorageBufferObject.java @@ -0,0 +1,62 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShaderStorageBufferObject { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetIntegeri_v, + * GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** + * Accepted in the &lt;barriers&gt; bitfield in glMemoryBarrier: + */ + public static final int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** + * Alias for the existing token + * MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS: + */ + public static final int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + private ARBShaderStorageBufferObject() {} + + public static void glShaderStorageBlockBinding(int program, int storageBlockIndex, int storageBlockBinding) { + GL43.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderSubroutine.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderSubroutine.java new file mode 100644 index 0000000..a4683f0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShaderSubroutine.java @@ -0,0 +1,102 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShaderSubroutine { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramStageiv: + */ + public static final int GL_ACTIVE_SUBROUTINES = 0x8DE5, + GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6, + GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47, + GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48, + GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_SUBROUTINES = 0x8DE7, + GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveSubroutineUniformiv: + */ + public static final int GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A, + GL_COMPATIBLE_SUBROUTINES = 0x8E4B, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39; + + private ARBShaderSubroutine() {} + + public static int glGetSubroutineUniformLocation(int program, int shadertype, ByteBuffer name) { + return GL40.glGetSubroutineUniformLocation(program, shadertype, name); + } + + /** Overloads glGetSubroutineUniformLocation. */ + public static int glGetSubroutineUniformLocation(int program, int shadertype, CharSequence name) { + return GL40.glGetSubroutineUniformLocation(program, shadertype, name); + } + + public static int glGetSubroutineIndex(int program, int shadertype, ByteBuffer name) { + return GL40.glGetSubroutineIndex(program, shadertype, name); + } + + /** Overloads glGetSubroutineIndex. */ + public static int glGetSubroutineIndex(int program, int shadertype, CharSequence name) { + return GL40.glGetSubroutineIndex(program, shadertype, name); + } + + public static void glGetActiveSubroutineUniform(int program, int shadertype, int index, int pname, IntBuffer values) { + GL40.glGetActiveSubroutineUniform(program, shadertype, index, pname, values); + } + + /** Overloads glGetActiveSubroutineUniformiv. */ + public static int glGetActiveSubroutineUniformi(int program, int shadertype, int index, int pname) { + return GL40.glGetActiveSubroutineUniformi(program, shadertype, index, pname); + } + + public static void glGetActiveSubroutineUniformName(int program, int shadertype, int index, IntBuffer length, ByteBuffer name) { + GL40.glGetActiveSubroutineUniformName(program, shadertype, index, length, name); + } + + /** Overloads glGetActiveSubroutineUniformName. */ + public static String glGetActiveSubroutineUniformName(int program, int shadertype, int index, int bufsize) { + return GL40.glGetActiveSubroutineUniformName(program, shadertype, index, bufsize); + } + + public static void glGetActiveSubroutineName(int program, int shadertype, int index, IntBuffer length, ByteBuffer name) { + GL40.glGetActiveSubroutineName(program, shadertype, index, length, name); + } + + /** Overloads glGetActiveSubroutineName. */ + public static String glGetActiveSubroutineName(int program, int shadertype, int index, int bufsize) { + return GL40.glGetActiveSubroutineName(program, shadertype, index, bufsize); + } + + public static void glUniformSubroutinesu(int shadertype, IntBuffer indices) { + GL40.glUniformSubroutinesu(shadertype, indices); + } + + public static void glGetUniformSubroutineu(int shadertype, int location, IntBuffer params) { + GL40.glGetUniformSubroutineu(shadertype, location, params); + } + + /** Overloads glGetUniformSubroutineuiv. */ + public static int glGetUniformSubroutineui(int shadertype, int location) { + return GL40.glGetUniformSubroutineui(shadertype, location); + } + + public static void glGetProgramStage(int program, int shadertype, int pname, IntBuffer values) { + GL40.glGetProgramStage(program, shadertype, pname, values); + } + + /** Overloads glGetProgramStageiv. */ + public static int glGetProgramStagei(int program, int shadertype, int pname) { + return GL40.glGetProgramStagei(program, shadertype, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguage100.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguage100.java new file mode 100644 index 0000000..06af31c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguage100.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShadingLanguage100 { + + /** + * Accepted by the &lt;name&gt; parameter of GetString: + */ + public static final int GL_SHADING_LANGUAGE_VERSION_ARB = 0x8B8C; + + private ARBShadingLanguage100() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguageInclude.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguageInclude.java new file mode 100644 index 0000000..a8c5012 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadingLanguageInclude.java @@ -0,0 +1,160 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShadingLanguageInclude { + + /** + * Accepted by the &lt;type&gt; parameter of NamedStringARB: + */ + public static final int GL_SHADER_INCLUDE_ARB = 0x8DAE; + + /** + * Accepted by the &lt;pname&gt; parameter of GetNamedStringivARB: + */ + public static final int GL_NAMED_STRING_LENGTH_ARB = 0x8DE9, + GL_NAMED_STRING_TYPE_ARB = 0x8DEA; + + private ARBShadingLanguageInclude() {} + + public static void glNamedStringARB(int type, ByteBuffer name, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkDirect(string); + nglNamedStringARB(type, name.remaining(), MemoryUtil.getAddress(name), string.remaining(), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglNamedStringARB(int type, int name_namelen, long name, int string_stringlen, long string, long function_pointer); + + /** Overloads glNamedStringARB. */ + public static void glNamedStringARB(int type, CharSequence name, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedStringARB(type, name.length(), APIUtil.getBuffer(caps, name), string.length(), APIUtil.getBuffer(caps, string, name.length()), function_pointer); + } + + public static void glDeleteNamedStringARB(ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + nglDeleteNamedStringARB(name.remaining(), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglDeleteNamedStringARB(int name_namelen, long name, long function_pointer); + + /** Overloads glDeleteNamedStringARB. */ + public static void glDeleteNamedStringARB(CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteNamedStringARB(name.length(), APIUtil.getBuffer(caps, name), function_pointer); + } + + public static void glCompileShaderIncludeARB(int shader, int count, ByteBuffer path) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompileShaderIncludeARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(path); + BufferChecks.checkNullTerminated(path, count); + nglCompileShaderIncludeARB(shader, count, MemoryUtil.getAddress(path), 0L, function_pointer); + } + static native void nglCompileShaderIncludeARB(int shader, int count, long path, long length, long function_pointer); + + /** Overloads glCompileShaderIncludeARB. */ + public static void glCompileShaderIncludeARB(int shader, CharSequence[] path) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompileShaderIncludeARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(path); + nglCompileShaderIncludeARB2(shader, path.length, APIUtil.getBuffer(caps, path), APIUtil.getLengths(caps, path), function_pointer); + } + static native void nglCompileShaderIncludeARB2(int shader, int count, long path, long length, long function_pointer); + + public static boolean glIsNamedStringARB(ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + boolean __result = nglIsNamedStringARB(name.remaining(), MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native boolean nglIsNamedStringARB(int name_namelen, long name, long function_pointer); + + /** Overloads glIsNamedStringARB. */ + public static boolean glIsNamedStringARB(CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsNamedStringARB(name.length(), APIUtil.getBuffer(caps, name), function_pointer); + return __result; + } + + public static void glGetNamedStringARB(ByteBuffer name, IntBuffer stringlen, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + if (stringlen != null) + BufferChecks.checkBuffer(stringlen, 1); + BufferChecks.checkDirect(string); + nglGetNamedStringARB(name.remaining(), MemoryUtil.getAddress(name), string.remaining(), MemoryUtil.getAddressSafe(stringlen), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglGetNamedStringARB(int name_namelen, long name, int string_bufSize, long stringlen, long string, long function_pointer); + + /** Overloads glGetNamedStringARB. */ + public static void glGetNamedStringARB(CharSequence name, IntBuffer stringlen, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (stringlen != null) + BufferChecks.checkBuffer(stringlen, 1); + BufferChecks.checkDirect(string); + nglGetNamedStringARB(name.length(), APIUtil.getBuffer(caps, name), string.remaining(), MemoryUtil.getAddressSafe(stringlen), MemoryUtil.getAddress(string), function_pointer); + } + + /** Overloads glGetNamedStringARB. */ + public static String glGetNamedStringARB(CharSequence name, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer string_length = APIUtil.getLengths(caps); + ByteBuffer string = APIUtil.getBufferByte(caps, bufSize + name.length()); + nglGetNamedStringARB(name.length(), APIUtil.getBuffer(caps, name), bufSize, MemoryUtil.getAddress0(string_length), MemoryUtil.getAddress(string), function_pointer); + string.limit(name.length() + string_length.get(0)); + return APIUtil.getString(caps, string); + } + + public static void glGetNamedStringARB(ByteBuffer name, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkBuffer(params, 1); + nglGetNamedStringivARB(name.remaining(), MemoryUtil.getAddress(name), pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedStringivARB(int name_namelen, long name, int pname, long params, long function_pointer); + + /** Overloads glGetNamedStringivARB. */ + public static void glGetNamedStringiARB(CharSequence name, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetNamedStringivARB(name.length(), APIUtil.getBuffer(caps, name), pname, MemoryUtil.getAddress(params), function_pointer); + } + + /** Overloads glGetNamedStringivARB. */ + public static int glGetNamedStringiARB(CharSequence name, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedStringivARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedStringivARB(name.length(), APIUtil.getBuffer(caps, name), pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadow.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadow.java new file mode 100644 index 0000000..ff9f1b9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadow.java @@ -0,0 +1,15 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShadow { + + public static final int GL_TEXTURE_COMPARE_MODE_ARB = 0x884C, + GL_TEXTURE_COMPARE_FUNC_ARB = 0x884D, + GL_COMPARE_R_TO_TEXTURE_ARB = 0x884E; + + private ARBShadow() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadowAmbient.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadowAmbient.java new file mode 100644 index 0000000..92619ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBShadowAmbient.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBShadowAmbient { + + public static final int GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = 0x80BF; + + private ARBShadowAmbient() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSparseTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSparseTexture.java new file mode 100644 index 0000000..e39991e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSparseTexture.java @@ -0,0 +1,57 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSparseTexture { + + /** + * Accepted by the &lt;pname&gt; parameter to TexParameter{i f}{v}, + * TexParameterI{u}v, GetTexParameter{if}v and GetTexParameterIi{u}v: + */ + public static final int GL_TEXTURE_SPARSE_ARB = 0x91A6, + GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexParameter{if}v and + * GetTexParameterIi{u}v: + */ + public static final int GL_NUM_SPARSE_LEVELS_ARB = 0x91AA; + + /** + * Accepted by the &lt;pname&gt; parameter to GetInternalformativ: + */ + public static final int GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8, + GL_VIRTUAL_PAGE_SIZE_X_ARB = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_ARB = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_ARB = 0x9197; + + /** + * Accepted by the &lt;pname&gt; parameter to GetIntegerv, GetFloatv, GetDoublev, + * GetInteger64v, and GetBooleanv: + */ + public static final int GL_MAX_SPARSE_TEXTURE_SIZE_ARB = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB = 0x919A, + GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9; + + private ARBSparseTexture() {} + + public static void glTexPageCommitmentARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, boolean commit) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexPageCommitmentARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit, function_pointer); + } + static native void nglTexPageCommitmentARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, boolean commit, long function_pointer); + + public static void glTexturePageCommitmentEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, boolean commit) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexturePageCommitmentEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexturePageCommitmentEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, commit, function_pointer); + } + static native void nglTexturePageCommitmentEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, boolean commit, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBStencilTexturing.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBStencilTexturing.java new file mode 100644 index 0000000..c03b7ef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBStencilTexturing.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBStencilTexturing { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter* and GetTexParameter*: + */ + public static final int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + private ARBStencilTexturing() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSync.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSync.java new file mode 100644 index 0000000..30fe11f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBSync.java @@ -0,0 +1,106 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBSync { + + /** + * Accepted as the &lt;pname&gt; parameter of GetInteger64v: + */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** + * Accepted as the &lt;pname&gt; parameter of GetSynciv: + */ + public static final int GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE: + */ + public static final int GL_SYNC_FENCE = 0x9116; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION: + */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_STATUS: + */ + public static final int GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119; + + /** + * Accepted in the &lt;flags&gt; parameter of ClientWaitSync: + */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + /** + * Accepted in the &lt;timeout&gt; parameter of WaitSync: + */ + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + /** + * Returned by ClientWaitSync: + */ + public static final int GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D; + + private ARBSync() {} + + public static GLSync glFenceSync(int condition, int flags) { + return GL32.glFenceSync(condition, flags); + } + + public static boolean glIsSync(GLSync sync) { + return GL32.glIsSync(sync); + } + + public static void glDeleteSync(GLSync sync) { + GL32.glDeleteSync(sync); + } + + public static int glClientWaitSync(GLSync sync, int flags, long timeout) { + return GL32.glClientWaitSync(sync, flags, timeout); + } + + public static void glWaitSync(GLSync sync, int flags, long timeout) { + GL32.glWaitSync(sync, flags, timeout); + } + + public static void glGetInteger64(int pname, LongBuffer params) { + GL32.glGetInteger64(pname, params); + } + + /** Overloads glGetInteger64v. */ + public static long glGetInteger64(int pname) { + return GL32.glGetInteger64(pname); + } + + public static void glGetSync(GLSync sync, int pname, IntBuffer length, IntBuffer values) { + GL32.glGetSync(sync, pname, length, values); + } + + /** + * Overloads glGetSynciv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetSynci} instead. + */ + @Deprecated + public static int glGetSync(GLSync sync, int pname) { + return GL32.glGetSynci(sync, pname); + } + + /** Overloads glGetSynciv. */ + public static int glGetSynci(GLSync sync, int pname) { + return GL32.glGetSynci(sync, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTessellationShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTessellationShader.java new file mode 100644 index 0000000..2aee60b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTessellationShader.java @@ -0,0 +1,107 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTessellationShader { + + /** + * Accepted by the &lt;mode&gt; parameter of Begin and all vertex array functions + * that implicitly call Begin: + */ + public static final int GL_PATCHES = 0xE; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameteri, GetBooleanv, + * GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v: + */ + public static final int GL_PATCH_VERTICES = 0x8E72; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameterfv, GetBooleanv, + * GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v: + */ + public static final int GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73, + GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75, + GL_TESS_GEN_MODE = 0x8E76, + GL_TESS_GEN_SPACING = 0x8E77, + GL_TESS_GEN_VERTEX_ORDER = 0x8E78, + GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_MODE: + */ + public static final int GL_TRIANGLES = 0x4, + GL_QUADS = 0x7, + GL_ISOLINES = 0x8E7A; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_SPACING: + */ + public static final int GL_EQUAL = 0x202, + GL_FRACTIONAL_ODD = 0x8E7B, + GL_FRACTIONAL_EVEN = 0x8E7C; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_VERTEX_ORDER: + */ + public static final int GL_CCW = 0x901, + GL_CW = 0x900; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_POINT_MODE: + */ + public static final int GL_FALSE = 0x0, + GL_TRUE = 0x1; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, + * GetIntegerv, and GetInteger64v: + */ + public static final int GL_MAX_PATCH_VERTICES = 0x8E7D, + GL_MAX_TESS_GEN_LEVEL = 0x8E7E, + GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F, + GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80, + GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81, + GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82, + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83, + GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84, + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85, + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86, + GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89, + GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A, + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C, + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D, + GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E, + GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: + */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0, + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + public static final int GL_TESS_EVALUATION_SHADER = 0x8E87, + GL_TESS_CONTROL_SHADER = 0x8E88; + + private ARBTessellationShader() {} + + public static void glPatchParameteri(int pname, int value) { + GL40.glPatchParameteri(pname, value); + } + + public static void glPatchParameter(int pname, FloatBuffer values) { + GL40.glPatchParameter(pname, values); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBorderClamp.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBorderClamp.java new file mode 100644 index 0000000..86a0b1b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBorderClamp.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureBorderClamp { + + public static final int GL_CLAMP_TO_BORDER_ARB = 0x812D; + + private ARBTextureBorderClamp() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferObject.java new file mode 100644 index 0000000..a0c5d11 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferObject.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureBufferObject { + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, MapBufferRangeARB, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBufferARB, + * and the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + public static final int GL_TEXTURE_BUFFER_ARB = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + public static final int GL_MAX_TEXTURE_BUFFER_SIZE_ARB = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER_ARB = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = 0x8C2D, + GL_TEXTURE_BUFFER_FORMAT_ARB = 0x8C2E; + + private ARBTextureBufferObject() {} + + public static void glTexBufferARB(int target, int internalformat, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBufferARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexBufferARB(target, internalformat, buffer, function_pointer); + } + static native void nglTexBufferARB(int target, int internalformat, int buffer, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferRange.java new file mode 100644 index 0000000..f6e2179 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureBufferRange.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureBufferRange { + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + private ARBTextureBufferRange() {} + + public static void glTexBufferRange(int target, int internalformat, int buffer, long offset, long size) { + GL43.glTexBufferRange(target, internalformat, buffer, offset, size); + } + + public static void glTextureBufferRangeEXT(int texture, int target, int internalformat, int buffer, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureBufferRangeEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size, function_pointer); + } + static native void nglTextureBufferRangeEXT(int texture, int target, int internalformat, int buffer, long offset, long size, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompression.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompression.java new file mode 100644 index 0000000..85a556a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompression.java @@ -0,0 +1,149 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureCompression { + + public static final int GL_COMPRESSED_ALPHA_ARB = 0x84E9, + GL_COMPRESSED_LUMINANCE_ARB = 0x84EA, + GL_COMPRESSED_LUMINANCE_ALPHA_ARB = 0x84EB, + GL_COMPRESSED_INTENSITY_ARB = 0x84EC, + GL_COMPRESSED_RGB_ARB = 0x84ED, + GL_COMPRESSED_RGBA_ARB = 0x84EE, + GL_TEXTURE_COMPRESSION_HINT_ARB = 0x84EF, + GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = 0x86A0, + GL_TEXTURE_COMPRESSED_ARB = 0x86A1, + GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A3; + + private ARBTextureCompression() {} + + public static void glCompressedTexImage1DARB(int target, int level, int internalformat, int width, int border, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage1DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexImage1DARB(target, level, internalformat, width, border, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexImage1DARB(int target, int level, int internalformat, int width, int border, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexImage1DARB(int target, int level, int internalformat, int width, int border, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage1DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage1DARBBO(target, level, internalformat, width, border, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage1DARBBO(int target, int level, int internalformat, int width, int border, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glCompressedTexImage2DARB(int target, int level, int internalformat, int width, int height, int border, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage2DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexImage2DARB(target, level, internalformat, width, height, border, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexImage2DARB(int target, int level, int internalformat, int width, int height, int border, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexImage2DARB(int target, int level, int internalformat, int width, int height, int border, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage2DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage2DARBBO(target, level, internalformat, width, height, border, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage2DARBBO(int target, int level, int internalformat, int width, int height, int border, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glCompressedTexImage3DARB(int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage3DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexImage3DARB(int target, int level, int internalformat, int width, int height, int depth, int border, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexImage3DARB(int target, int level, int internalformat, int width, int height, int depth, int border, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage3DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage3DARBBO(target, level, internalformat, width, height, depth, border, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage3DARBBO(int target, int level, int internalformat, int width, int height, int depth, int border, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage1DARB(int target, int level, int xoffset, int width, int format, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage1DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexSubImage1DARB(target, level, xoffset, width, format, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexSubImage1DARB(int target, int level, int xoffset, int width, int format, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexSubImage1DARB(int target, int level, int xoffset, int width, int format, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage1DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage1DARBBO(target, level, xoffset, width, format, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage1DARBBO(int target, int level, int xoffset, int width, int format, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage2DARB(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage2DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexSubImage2DARB(int target, int level, int xoffset, int yoffset, int width, int height, int format, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexSubImage2DARB(int target, int level, int xoffset, int yoffset, int width, int height, int format, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage2DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage2DARBBO(target, level, xoffset, yoffset, width, height, format, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage2DARBBO(int target, int level, int xoffset, int yoffset, int width, int height, int format, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage3DARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer pData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage3DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(pData); + nglCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, pData.remaining(), MemoryUtil.getAddress(pData), function_pointer); + } + static native void nglCompressedTexSubImage3DARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int pData_imageSize, long pData, long function_pointer); + public static void glCompressedTexSubImage3DARB(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int pData_imageSize, long pData_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage3DARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage3DARBBO(target, level, xoffset, yoffset, zoffset, width, height, depth, format, pData_imageSize, pData_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage3DARBBO(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int pData_imageSize, long pData_buffer_offset, long function_pointer); + + public static void glGetCompressedTexImageARB(int target, int lod, ByteBuffer pImg) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(pImg); + nglGetCompressedTexImageARB(target, lod, MemoryUtil.getAddress(pImg), function_pointer); + } + static native void nglGetCompressedTexImageARB(int target, int lod, long pImg, long function_pointer); + public static void glGetCompressedTexImageARB(int target, int lod, long pImg_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImageARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetCompressedTexImageARBBO(target, lod, pImg_buffer_offset, function_pointer); + } + static native void nglGetCompressedTexImageARBBO(int target, int lod, long pImg_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionBPTC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionBPTC.java new file mode 100644 index 0000000..777bf14 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionBPTC.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureCompressionBPTC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, TexImage3D, + * CopyTexImage2D, CopyTexImage3D, CompressedTexImage2DARB, and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB and CompressedTexSubImage3DARB: + */ + public static final int GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C, + GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D, + GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E, + GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F; + + private ARBTextureCompressionBPTC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionRGTC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionRGTC.java new file mode 100644 index 0000000..0ebb60f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCompressionRGTC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureCompressionRGTC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + private ARBTextureCompressionRGTC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMap.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMap.java new file mode 100644 index 0000000..dc75f31 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMap.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureCubeMap { + + public static final int GL_NORMAL_MAP_ARB = 0x8511, + GL_REFLECTION_MAP_ARB = 0x8512, + GL_TEXTURE_CUBE_MAP_ARB = 0x8513, + GL_TEXTURE_BINDING_CUBE_MAP_ARB = 0x8514, + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x851A, + GL_PROXY_TEXTURE_CUBE_MAP_ARB = 0x851B, + GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = 0x851C; + + private ARBTextureCubeMap() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMapArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMapArray.java new file mode 100644 index 0000000..41ff84e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureCubeMapArray.java @@ -0,0 +1,42 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureCubeMapArray { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap: + * <p/> + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + * <p/> + * Accepted by the &lt;tex&gt; parameter of GetTexImage: + */ + public static final int GL_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x9009; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900C, + GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D, + GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E, + GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F; + + private ARBTextureCubeMapArray() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvCombine.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvCombine.java new file mode 100644 index 0000000..6623eb3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvCombine.java @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureEnvCombine { + + public static final int GL_COMBINE_ARB = 0x8570, + GL_COMBINE_RGB_ARB = 0x8571, + GL_COMBINE_ALPHA_ARB = 0x8572, + GL_SOURCE0_RGB_ARB = 0x8580, + GL_SOURCE1_RGB_ARB = 0x8581, + GL_SOURCE2_RGB_ARB = 0x8582, + GL_SOURCE0_ALPHA_ARB = 0x8588, + GL_SOURCE1_ALPHA_ARB = 0x8589, + GL_SOURCE2_ALPHA_ARB = 0x858A, + GL_OPERAND0_RGB_ARB = 0x8590, + GL_OPERAND1_RGB_ARB = 0x8591, + GL_OPERAND2_RGB_ARB = 0x8592, + GL_OPERAND0_ALPHA_ARB = 0x8598, + GL_OPERAND1_ALPHA_ARB = 0x8599, + GL_OPERAND2_ALPHA_ARB = 0x859A, + GL_RGB_SCALE_ARB = 0x8573, + GL_ADD_SIGNED_ARB = 0x8574, + GL_INTERPOLATE_ARB = 0x8575, + GL_SUBTRACT_ARB = 0x84E7, + GL_CONSTANT_ARB = 0x8576, + GL_PRIMARY_COLOR_ARB = 0x8577, + GL_PREVIOUS_ARB = 0x8578; + + private ARBTextureEnvCombine() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvDot3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvDot3.java new file mode 100644 index 0000000..2a5d0f2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureEnvDot3.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureEnvDot3 { + + public static final int GL_DOT3_RGB_ARB = 0x86AE, + GL_DOT3_RGBA_ARB = 0x86AF; + + private ARBTextureEnvDot3() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureFloat.java new file mode 100644 index 0000000..428f068 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureFloat.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureFloat { + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_RED_TYPE_ARB = 0x8C10, + GL_TEXTURE_GREEN_TYPE_ARB = 0x8C11, + GL_TEXTURE_BLUE_TYPE_ARB = 0x8C12, + GL_TEXTURE_ALPHA_TYPE_ARB = 0x8C13, + GL_TEXTURE_LUMINANCE_TYPE_ARB = 0x8C14, + GL_TEXTURE_INTENSITY_TYPE_ARB = 0x8C15, + GL_TEXTURE_DEPTH_TYPE_ARB = 0x8C16; + + /** + * Returned by the &lt;params&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_UNSIGNED_NORMALIZED_ARB = 0x8C17; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA32F_ARB = 0x8814, + GL_RGB32F_ARB = 0x8815, + GL_ALPHA32F_ARB = 0x8816, + GL_INTENSITY32F_ARB = 0x8817, + GL_LUMINANCE32F_ARB = 0x8818, + GL_LUMINANCE_ALPHA32F_ARB = 0x8819, + GL_RGBA16F_ARB = 0x881A, + GL_RGB16F_ARB = 0x881B, + GL_ALPHA16F_ARB = 0x881C, + GL_INTENSITY16F_ARB = 0x881D, + GL_LUMINANCE16F_ARB = 0x881E, + GL_LUMINANCE_ALPHA16F_ARB = 0x881F; + + private ARBTextureFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureGather.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureGather.java new file mode 100644 index 0000000..6aff98e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureGather.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureGather { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E, + GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F, + GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB = 0x8F9F; + + private ARBTextureGather() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java new file mode 100644 index 0000000..eadf435 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirrorClampToEdge.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureMirrorClampToEdge { + + /** + * Accepted by the &lt;param&gt; parameter of TexParameter{if}, SamplerParameter{if} + * and SamplerParameter{if}v, and by the &lt;params&gt; parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when + * their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or + * TEXTURE_WRAP_R: + */ + public static final int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + + private ARBTextureMirrorClampToEdge() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirroredRepeat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirroredRepeat.java new file mode 100644 index 0000000..7980995 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMirroredRepeat.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureMirroredRepeat { + + public static final int GL_MIRRORED_REPEAT_ARB = 0x8370; + + private ARBTextureMirroredRepeat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMultisample.java new file mode 100644 index 0000000..939611a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureMultisample.java @@ -0,0 +1,94 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetMultisamplefv: + */ + public static final int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_SAMPLE_MASK = 0x8E51; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v and + * GetIntegeri_v: + */ + public static final int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage2DMultisample: + */ + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2DMultisample: + */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage3DMultisample: + */ + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3DMultisample: + */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_SAMPLE_MASK_WORDS = 0x8E59, + GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E, + GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F, + GL_MAX_INTEGER_SAMPLES = 0x9110, + GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter + */ + public static final int GL_TEXTURE_SAMPLES = 0x9106, + GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_2D_MULTISAMPLE = 0x9108, + GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A, + GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B, + GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + private ARBTextureMultisample() {} + + public static void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { + GL32.glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + public static void glTexImage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations) { + GL32.glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + public static void glGetMultisample(int pname, int index, FloatBuffer val) { + GL32.glGetMultisample(pname, index, val); + } + + public static void glSampleMaski(int index, int mask) { + GL32.glSampleMaski(index, mask); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java new file mode 100644 index 0000000..a77977c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRGB10_A2UI.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureRGB10_A2UI { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample: + */ + public static final int GL_RGB10_A2UI = 0x906F; + + private ARBTextureRGB10_A2UI() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRectangle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRectangle.java new file mode 100644 index 0000000..cc2bc2f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRectangle.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureRectangle { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + * GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + * TexParameterfv and TexParameteriv: + * Accepted by the &lt;target&gt; parameter of GetTexImage, + * GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + * CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + public static final int GL_TEXTURE_RECTANGLE_ARB = 0x84F5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv and GetDoublev: + */ + public static final int GL_TEXTURE_BINDING_RECTANGLE_ARB = 0x84F6; + + /** + * Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + * GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + public static final int GL_PROXY_TEXTURE_RECTANGLE_ARB = 0x84F7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = 0x84F8; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + public static final int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + private ARBTextureRectangle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRg.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRg.java new file mode 100644 index 0000000..a7159a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureRg.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureRg { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, and CopyTexImage2D: + */ + public static final int GL_R8 = 0x8229, + GL_R16 = 0x822A, + GL_RG8 = 0x822B, + GL_RG16 = 0x822C, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage3D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + public static final int GL_RG = 0x8227, + GL_RG_INTEGER = 0x8228; + + private ARBTextureRg() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorage.java new file mode 100644 index 0000000..171cfb5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorage.java @@ -0,0 +1,52 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureStorage { + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: + */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + private ARBTextureStorage() {} + + public static void glTexStorage1D(int target, int levels, int internalformat, int width) { + GL42.glTexStorage1D(target, levels, internalformat, width); + } + + public static void glTexStorage2D(int target, int levels, int internalformat, int width, int height) { + GL42.glTexStorage2D(target, levels, internalformat, width, height); + } + + public static void glTexStorage3D(int target, int levels, int internalformat, int width, int height, int depth) { + GL42.glTexStorage3D(target, levels, internalformat, width, height, depth); + } + + public static void glTextureStorage1DEXT(int texture, int target, int levels, int internalformat, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorage1DEXT(texture, target, levels, internalformat, width, function_pointer); + } + static native void nglTextureStorage1DEXT(int texture, int target, int levels, int internalformat, int width, long function_pointer); + + public static void glTextureStorage2DEXT(int texture, int target, int levels, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorage2DEXT(texture, target, levels, internalformat, width, height, function_pointer); + } + static native void nglTextureStorage2DEXT(int texture, int target, int levels, int internalformat, int width, int height, long function_pointer); + + public static void glTextureStorage3DEXT(int texture, int target, int levels, int internalformat, int width, int height, int depth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth, function_pointer); + } + static native void nglTextureStorage3DEXT(int texture, int target, int levels, int internalformat, int width, int height, int depth, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorageMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorageMultisample.java new file mode 100644 index 0000000..ebb24a0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureStorageMultisample.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureStorageMultisample { + + private ARBTextureStorageMultisample() {} + + public static void glTexStorage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { + GL43.glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); + } + + public static void glTexStorage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations) { + GL43.glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + public static void glTextureStorage2DMultisampleEXT(int texture, int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorage2DMultisampleEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorage2DMultisampleEXT(texture, target, samples, internalformat, width, height, fixedsamplelocations, function_pointer); + } + static native void nglTextureStorage2DMultisampleEXT(int texture, int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations, long function_pointer); + + public static void glTextureStorage3DMultisampleEXT(int texture, int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureStorage3DMultisampleEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureStorage3DMultisampleEXT(texture, target, samples, internalformat, width, height, depth, fixedsamplelocations, function_pointer); + } + static native void nglTextureStorage3DMultisampleEXT(int texture, int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureSwizzle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureSwizzle.java new file mode 100644 index 0000000..2d08d30 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureSwizzle.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureSwizzle { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + private ARBTextureSwizzle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureView.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureView.java new file mode 100644 index 0000000..cb3289f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTextureView.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureView { + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv and + * GetTexParameteriv: + */ + public static final int GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE, + GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + private ARBTextureView() {} + + public static void glTextureView(int texture, int target, int origtexture, int internalformat, int minlevel, int numlevels, int minlayer, int numlayers) { + GL43.glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTimerQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTimerQuery.java new file mode 100644 index 0000000..b079364 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTimerQuery.java @@ -0,0 +1,46 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTimerQuery { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the &lt;target&gt; parameter of GetQueryiv and QueryCounter. + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_TIMESTAMP = 0x8E28; + + private ARBTimerQuery() {} + + public static void glQueryCounter(int id, int target) { + GL33.glQueryCounter(id, target); + } + + public static void glGetQueryObject(int id, int pname, LongBuffer params) { + GL33.glGetQueryObject(id, pname, params); + } + + /** Overloads glGetQueryObjecti64v. */ + public static long glGetQueryObjecti64(int id, int pname) { + return GL33.glGetQueryObjecti64(id, pname); + } + + public static void glGetQueryObjectu(int id, int pname, LongBuffer params) { + GL33.glGetQueryObjectu(id, pname, params); + } + + /** Overloads glGetQueryObjectui64v. */ + public static long glGetQueryObjectui64(int id, int pname) { + return GL33.glGetQueryObjectui64(id, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback2.java new file mode 100644 index 0000000..eb5096d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback2.java @@ -0,0 +1,62 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTransformFeedback2 { + + /** + * Accepted by the &lt;target&gt; parameter of BindTransformFeedback: + */ + public static final int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + private ARBTransformFeedback2() {} + + public static void glBindTransformFeedback(int target, int id) { + GL40.glBindTransformFeedback(target, id); + } + + public static void glDeleteTransformFeedbacks(IntBuffer ids) { + GL40.glDeleteTransformFeedbacks(ids); + } + + /** Overloads glDeleteTransformFeedbacks. */ + public static void glDeleteTransformFeedbacks(int id) { + GL40.glDeleteTransformFeedbacks(id); + } + + public static void glGenTransformFeedbacks(IntBuffer ids) { + GL40.glGenTransformFeedbacks(ids); + } + + /** Overloads glGenTransformFeedbacks. */ + public static int glGenTransformFeedbacks() { + return GL40.glGenTransformFeedbacks(); + } + + public static boolean glIsTransformFeedback(int id) { + return GL40.glIsTransformFeedback(id); + } + + public static void glPauseTransformFeedback() { + GL40.glPauseTransformFeedback(); + } + + public static void glResumeTransformFeedback() { + GL40.glResumeTransformFeedback(); + } + + public static void glDrawTransformFeedback(int mode, int id) { + GL40.glDrawTransformFeedback(mode, id); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback3.java new file mode 100644 index 0000000..775a12b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedback3.java @@ -0,0 +1,39 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTransformFeedback3 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + private ARBTransformFeedback3() {} + + public static void glDrawTransformFeedbackStream(int mode, int id, int stream) { + GL40.glDrawTransformFeedbackStream(mode, id, stream); + } + + public static void glBeginQueryIndexed(int target, int index, int id) { + GL40.glBeginQueryIndexed(target, index, id); + } + + public static void glEndQueryIndexed(int target, int index) { + GL40.glEndQueryIndexed(target, index); + } + + public static void glGetQueryIndexed(int target, int index, int pname, IntBuffer params) { + GL40.glGetQueryIndexed(target, index, pname, params); + } + + /** Overloads glGetQueryIndexediv. */ + public static int glGetQueryIndexedi(int target, int index, int pname) { + return GL40.glGetQueryIndexedi(target, index, pname); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java new file mode 100644 index 0000000..6972db0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransformFeedbackInstanced.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTransformFeedbackInstanced { + + private ARBTransformFeedbackInstanced() {} + + public static void glDrawTransformFeedbackInstanced(int mode, int id, int primcount) { + GL42.glDrawTransformFeedbackInstanced(mode, id, primcount); + } + + public static void glDrawTransformFeedbackStreamInstanced(int mode, int id, int stream, int primcount) { + GL42.glDrawTransformFeedbackStreamInstanced(mode, id, stream, primcount); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransposeMatrix.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransposeMatrix.java new file mode 100644 index 0000000..f242822 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBTransposeMatrix.java @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTransposeMatrix { + + public static final int GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = 0x84E3, + GL_TRANSPOSE_PROJECTION_MATRIX_ARB = 0x84E4, + GL_TRANSPOSE_TEXTURE_MATRIX_ARB = 0x84E5, + GL_TRANSPOSE_COLOR_MATRIX_ARB = 0x84E6; + + private ARBTransposeMatrix() {} + + public static void glLoadTransposeMatrixARB(FloatBuffer pfMtx) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadTransposeMatrixfARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pfMtx, 16); + nglLoadTransposeMatrixfARB(MemoryUtil.getAddress(pfMtx), function_pointer); + } + static native void nglLoadTransposeMatrixfARB(long pfMtx, long function_pointer); + + public static void glMultTransposeMatrixARB(FloatBuffer pfMtx) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultTransposeMatrixfARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pfMtx, 16); + nglMultTransposeMatrixfARB(MemoryUtil.getAddress(pfMtx), function_pointer); + } + static native void nglMultTransposeMatrixfARB(long pfMtx, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBUniformBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBUniformBufferObject.java new file mode 100644 index 0000000..59703da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBUniformBufferObject.java @@ -0,0 +1,175 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBUniformBufferObject { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: + */ + public static final int GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformsivARB: + */ + public static final int GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockivARB: + */ + public static final int GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** + * Returned by GetActiveUniformsivARB and GetUniformBlockIndexARB + */ + public static final int GL_INVALID_INDEX = 0xFFFFFFFF; + + private ARBUniformBufferObject() {} + + public static void glGetUniformIndices(int program, ByteBuffer uniformNames, IntBuffer uniformIndices) { + GL31.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + /** Overloads glGetUniformIndices. */ + public static void glGetUniformIndices(int program, CharSequence[] uniformNames, IntBuffer uniformIndices) { + GL31.glGetUniformIndices(program, uniformNames, uniformIndices); + } + + public static void glGetActiveUniforms(int program, IntBuffer uniformIndices, int pname, IntBuffer params) { + GL31.glGetActiveUniforms(program, uniformIndices, pname, params); + } + + /** + * Overloads glGetActiveUniformsiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformsi} instead. + */ + @Deprecated + public static int glGetActiveUniforms(int program, int uniformIndex, int pname) { + return GL31.glGetActiveUniformsi(program, uniformIndex, pname); + } + + /** Overloads glGetActiveUniformsiv. */ + public static int glGetActiveUniformsi(int program, int uniformIndex, int pname) { + return GL31.glGetActiveUniformsi(program, uniformIndex, pname); + } + + public static void glGetActiveUniformName(int program, int uniformIndex, IntBuffer length, ByteBuffer uniformName) { + GL31.glGetActiveUniformName(program, uniformIndex, length, uniformName); + } + + /** Overloads glGetActiveUniformName. */ + public static String glGetActiveUniformName(int program, int uniformIndex, int bufSize) { + return GL31.glGetActiveUniformName(program, uniformIndex, bufSize); + } + + public static int glGetUniformBlockIndex(int program, ByteBuffer uniformBlockName) { + return GL31.glGetUniformBlockIndex(program, uniformBlockName); + } + + /** Overloads glGetUniformBlockIndex. */ + public static int glGetUniformBlockIndex(int program, CharSequence uniformBlockName) { + return GL31.glGetUniformBlockIndex(program, uniformBlockName); + } + + public static void glGetActiveUniformBlock(int program, int uniformBlockIndex, int pname, IntBuffer params) { + GL31.glGetActiveUniformBlock(program, uniformBlockIndex, pname, params); + } + + /** + * Overloads glGetActiveUniformBlockiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformBlocki} instead. + */ + @Deprecated + public static int glGetActiveUniformBlock(int program, int uniformBlockIndex, int pname) { + return GL31.glGetActiveUniformBlocki(program, uniformBlockIndex, pname); + } + + /** Overloads glGetActiveUniformBlockiv. */ + public static int glGetActiveUniformBlocki(int program, int uniformBlockIndex, int pname) { + return GL31.glGetActiveUniformBlocki(program, uniformBlockIndex, pname); + } + + public static void glGetActiveUniformBlockName(int program, int uniformBlockIndex, IntBuffer length, ByteBuffer uniformBlockName) { + GL31.glGetActiveUniformBlockName(program, uniformBlockIndex, length, uniformBlockName); + } + + /** Overloads glGetActiveUniformBlockName. */ + public static String glGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize) { + return GL31.glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize); + } + + public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) { + GL30.glBindBufferRange(target, index, buffer, offset, size); + } + + public static void glBindBufferBase(int target, int index, int buffer) { + GL30.glBindBufferBase(target, index, buffer); + } + + public static void glGetInteger(int value, int index, IntBuffer data) { + GL30.glGetInteger(value, index, data); + } + + /** Overloads glGetIntegeri_v. */ + public static int glGetInteger(int value, int index) { + return GL30.glGetInteger(value, index); + } + + public static void glUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding) { + GL31.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayBgra.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayBgra.java new file mode 100644 index 0000000..ac036a3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayBgra.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexArrayBgra { + + /** + * Accepted by the &lt;size&gt; parameter of ColorPointer, + * SecondaryColorPointer, and VertexAttribPointer: + */ + public static final int GL_BGRA = 0x80E1; + + private ARBVertexArrayBgra() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayObject.java new file mode 100644 index 0000000..e83de31 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexArrayObject.java @@ -0,0 +1,43 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexArrayObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + private ARBVertexArrayObject() {} + + public static void glBindVertexArray(int array) { + GL30.glBindVertexArray(array); + } + + public static void glDeleteVertexArrays(IntBuffer arrays) { + GL30.glDeleteVertexArrays(arrays); + } + + /** Overloads glDeleteVertexArrays. */ + public static void glDeleteVertexArrays(int array) { + GL30.glDeleteVertexArrays(array); + } + + public static void glGenVertexArrays(IntBuffer arrays) { + GL30.glGenVertexArrays(arrays); + } + + /** Overloads glGenVertexArrays. */ + public static int glGenVertexArrays() { + return GL30.glGenVertexArrays(); + } + + public static boolean glIsVertexArray(int array) { + return GL30.glIsVertexArray(array); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttrib64bit.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttrib64bit.java new file mode 100644 index 0000000..7da665a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttrib64bit.java @@ -0,0 +1,78 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexAttrib64bit { + + /** + * Returned in the &lt;type&gt; parameter of GetActiveAttrib: + */ + public static final int GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + private ARBVertexAttrib64bit() {} + + public static void glVertexAttribL1d(int index, double x) { + GL41.glVertexAttribL1d(index, x); + } + + public static void glVertexAttribL2d(int index, double x, double y) { + GL41.glVertexAttribL2d(index, x, y); + } + + public static void glVertexAttribL3d(int index, double x, double y, double z) { + GL41.glVertexAttribL3d(index, x, y, z); + } + + public static void glVertexAttribL4d(int index, double x, double y, double z, double w) { + GL41.glVertexAttribL4d(index, x, y, z, w); + } + + public static void glVertexAttribL1(int index, DoubleBuffer v) { + GL41.glVertexAttribL1(index, v); + } + + public static void glVertexAttribL2(int index, DoubleBuffer v) { + GL41.glVertexAttribL2(index, v); + } + + public static void glVertexAttribL3(int index, DoubleBuffer v) { + GL41.glVertexAttribL3(index, v); + } + + public static void glVertexAttribL4(int index, DoubleBuffer v) { + GL41.glVertexAttribL4(index, v); + } + + public static void glVertexAttribLPointer(int index, int size, int stride, DoubleBuffer pointer) { + GL41.glVertexAttribLPointer(index, size, stride, pointer); + } + public static void glVertexAttribLPointer(int index, int size, int stride, long pointer_buffer_offset) { + GL41.glVertexAttribLPointer(index, size, stride, pointer_buffer_offset); + } + + public static void glGetVertexAttribL(int index, int pname, DoubleBuffer params) { + GL41.glGetVertexAttribL(index, pname, params); + } + + public static void glVertexArrayVertexAttribLOffsetEXT(int vaobj, int buffer, int index, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayVertexAttribLOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayVertexAttribLOffsetEXT(int vaobj, int buffer, int index, int size, int type, int stride, long offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttribBinding.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttribBinding.java new file mode 100644 index 0000000..4afb727 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexAttribBinding.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexAttribBinding { + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib*v: + */ + public static final int GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, ... + */ + public static final int GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + private ARBVertexAttribBinding() {} + + public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { + GL43.glBindVertexBuffer(bindingindex, buffer, offset, stride); + } + + public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { + GL43.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + } + + public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { + GL43.glVertexAttribIFormat(attribindex, size, type, relativeoffset); + } + + public static void glVertexAttribLFormat(int attribindex, int size, int type, int relativeoffset) { + GL43.glVertexAttribLFormat(attribindex, size, type, relativeoffset); + } + + public static void glVertexAttribBinding(int attribindex, int bindingindex) { + GL43.glVertexAttribBinding(attribindex, bindingindex); + } + + public static void glVertexBindingDivisor(int bindingindex, int divisor) { + GL43.glVertexBindingDivisor(bindingindex, divisor); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBlend.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBlend.java new file mode 100644 index 0000000..084211e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBlend.java @@ -0,0 +1,189 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexBlend { + + public static final int GL_MAX_VERTEX_UNITS_ARB = 0x86A4, + GL_ACTIVE_VERTEX_UNITS_ARB = 0x86A5, + GL_WEIGHT_SUM_UNITY_ARB = 0x86A6, + GL_VERTEX_BLEND_ARB = 0x86A7, + GL_CURRENT_WEIGHT_ARB = 0x86A8, + GL_WEIGHT_ARRAY_TYPE_ARB = 0x86A9, + GL_WEIGHT_ARRAY_STRIDE_ARB = 0x86AA, + GL_WEIGHT_ARRAY_SIZE_ARB = 0x86AB, + GL_WEIGHT_ARRAY_POINTER_ARB = 0x86AC, + GL_WEIGHT_ARRAY_ARB = 0x86AD, + GL_MODELVIEW0_ARB = 0x1700, + GL_MODELVIEW1_ARB = 0x850A, + GL_MODELVIEW2_ARB = 0x8722, + GL_MODELVIEW3_ARB = 0x8723, + GL_MODELVIEW4_ARB = 0x8724, + GL_MODELVIEW5_ARB = 0x8725, + GL_MODELVIEW6_ARB = 0x8726, + GL_MODELVIEW7_ARB = 0x8727, + GL_MODELVIEW8_ARB = 0x8728, + GL_MODELVIEW9_ARB = 0x8729, + GL_MODELVIEW10_ARB = 0x872A, + GL_MODELVIEW11_ARB = 0x872B, + GL_MODELVIEW12_ARB = 0x872C, + GL_MODELVIEW13_ARB = 0x872D, + GL_MODELVIEW14_ARB = 0x872E, + GL_MODELVIEW15_ARB = 0x872F, + GL_MODELVIEW16_ARB = 0x8730, + GL_MODELVIEW17_ARB = 0x8731, + GL_MODELVIEW18_ARB = 0x8732, + GL_MODELVIEW19_ARB = 0x8733, + GL_MODELVIEW20_ARB = 0x8734, + GL_MODELVIEW21_ARB = 0x8735, + GL_MODELVIEW22_ARB = 0x8736, + GL_MODELVIEW23_ARB = 0x8737, + GL_MODELVIEW24_ARB = 0x8738, + GL_MODELVIEW25_ARB = 0x8739, + GL_MODELVIEW26_ARB = 0x873A, + GL_MODELVIEW27_ARB = 0x873B, + GL_MODELVIEW28_ARB = 0x873C, + GL_MODELVIEW29_ARB = 0x873D, + GL_MODELVIEW30_ARB = 0x873E, + GL_MODELVIEW31_ARB = 0x873F; + + private ARBVertexBlend() {} + + public static void glWeightARB(ByteBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightbvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightbvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightbvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightARB(ShortBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightsvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightsvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightsvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightARB(IntBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightivARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightivARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightARB(FloatBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightfvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightfvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightARB(DoubleBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightdvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightdvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightuARB(ByteBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightubvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightubvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightubvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightuARB(ShortBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightusvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightusvARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightusvARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightuARB(IntBuffer pWeights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightuivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pWeights); + nglWeightuivARB(pWeights.remaining(), MemoryUtil.getAddress(pWeights), function_pointer); + } + static native void nglWeightuivARB(int pWeights_size, long pWeights, long function_pointer); + + public static void glWeightPointerARB(int size, int stride, DoubleBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_vertex_blend_glWeightPointerARB_pPointer = pPointer; + nglWeightPointerARB(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glWeightPointerARB(int size, int stride, FloatBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_vertex_blend_glWeightPointerARB_pPointer = pPointer; + nglWeightPointerARB(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glWeightPointerARB(int size, boolean unsigned, int stride, ByteBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_vertex_blend_glWeightPointerARB_pPointer = pPointer; + nglWeightPointerARB(size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glWeightPointerARB(int size, boolean unsigned, int stride, IntBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_vertex_blend_glWeightPointerARB_pPointer = pPointer; + nglWeightPointerARB(size, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glWeightPointerARB(int size, boolean unsigned, int stride, ShortBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).ARB_vertex_blend_glWeightPointerARB_pPointer = pPointer; + nglWeightPointerARB(size, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglWeightPointerARB(int size, int type, int stride, long pPointer, long function_pointer); + public static void glWeightPointerARB(int size, int type, int stride, long pPointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglWeightPointerARBBO(size, type, stride, pPointer_buffer_offset, function_pointer); + } + static native void nglWeightPointerARBBO(int size, int type, int stride, long pPointer_buffer_offset, long function_pointer); + + public static void glVertexBlendARB(int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexBlendARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexBlendARB(count, function_pointer); + } + static native void nglVertexBlendARB(int count, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBufferObject.java new file mode 100644 index 0000000..cd0fc4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexBufferObject.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexBufferObject extends ARBBufferObject { + + /** + * Accepted by the &lt;target&gt; parameters of BindBufferARB, BufferDataARB, + * BufferSubDataARB, MapBufferARB, UnmapBufferARB, + * GetBufferSubDataARB, GetBufferParameterivARB, and + * GetBufferPointervARB: + */ + public static final int GL_ARRAY_BUFFER_ARB = 0x8892, + GL_ELEMENT_ARRAY_BUFFER_ARB = 0x8893; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_ARRAY_BUFFER_BINDING_ARB = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = 0x8895, + GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = 0x8896, + GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = 0x8897, + GL_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x8898, + GL_INDEX_ARRAY_BUFFER_BINDING_ARB = 0x8899, + GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = 0x889A, + GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = 0x889B, + GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x889C, + GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = 0x889D, + GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = 0x889E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribivARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = 0x889F; + + private ARBVertexBufferObject() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexProgram.java new file mode 100644 index 0000000..39b3951 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexProgram.java @@ -0,0 +1,154 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexProgram extends ARBProgram { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of ProgramStringARB, BindProgramARB, + * ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, + * GetProgramivARB, and GetProgramStringARB. + */ + public static final int GL_VERTEX_PROGRAM_ARB = 0x8620; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643, + GL_COLOR_SUM_ARB = 0x8458; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib[dfi]vARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A, + GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B0, + GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B1, + GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B2, + GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869; + + private ARBVertexProgram() {} + + public static void glVertexAttrib1sARB(int index, short x) { + ARBVertexShader.glVertexAttrib1sARB(index, x); + } + + public static void glVertexAttrib1fARB(int index, float x) { + ARBVertexShader.glVertexAttrib1fARB(index, x); + } + + public static void glVertexAttrib1dARB(int index, double x) { + ARBVertexShader.glVertexAttrib1dARB(index, x); + } + + public static void glVertexAttrib2sARB(int index, short x, short y) { + ARBVertexShader.glVertexAttrib2sARB(index, x, y); + } + + public static void glVertexAttrib2fARB(int index, float x, float y) { + ARBVertexShader.glVertexAttrib2fARB(index, x, y); + } + + public static void glVertexAttrib2dARB(int index, double x, double y) { + ARBVertexShader.glVertexAttrib2dARB(index, x, y); + } + + public static void glVertexAttrib3sARB(int index, short x, short y, short z) { + ARBVertexShader.glVertexAttrib3sARB(index, x, y, z); + } + + public static void glVertexAttrib3fARB(int index, float x, float y, float z) { + ARBVertexShader.glVertexAttrib3fARB(index, x, y, z); + } + + public static void glVertexAttrib3dARB(int index, double x, double y, double z) { + ARBVertexShader.glVertexAttrib3dARB(index, x, y, z); + } + + public static void glVertexAttrib4sARB(int index, short x, short y, short z, short w) { + ARBVertexShader.glVertexAttrib4sARB(index, x, y, z, w); + } + + public static void glVertexAttrib4fARB(int index, float x, float y, float z, float w) { + ARBVertexShader.glVertexAttrib4fARB(index, x, y, z, w); + } + + public static void glVertexAttrib4dARB(int index, double x, double y, double z, double w) { + ARBVertexShader.glVertexAttrib4dARB(index, x, y, z, w); + } + + public static void glVertexAttrib4NubARB(int index, byte x, byte y, byte z, byte w) { + ARBVertexShader.glVertexAttrib4NubARB(index, x, y, z, w); + } + + public static void glVertexAttribPointerARB(int index, int size, boolean normalized, int stride, DoubleBuffer buffer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, normalized, stride, buffer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean normalized, int stride, FloatBuffer buffer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, normalized, stride, buffer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, ByteBuffer buffer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, unsigned, normalized, stride, buffer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, IntBuffer buffer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, unsigned, normalized, stride, buffer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, ShortBuffer buffer) { + ARBVertexShader.glVertexAttribPointerARB(index, size, unsigned, normalized, stride, buffer); + } + public static void glVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, buffer_buffer_offset); + } + + public static void glEnableVertexAttribArrayARB(int index) { + ARBVertexShader.glEnableVertexAttribArrayARB(index); + } + + public static void glDisableVertexAttribArrayARB(int index) { + ARBVertexShader.glDisableVertexAttribArrayARB(index); + } + + public static void glGetVertexAttribARB(int index, int pname, FloatBuffer params) { + ARBVertexShader.glGetVertexAttribARB(index, pname, params); + } + + public static void glGetVertexAttribARB(int index, int pname, DoubleBuffer params) { + ARBVertexShader.glGetVertexAttribARB(index, pname, params); + } + + public static void glGetVertexAttribARB(int index, int pname, IntBuffer params) { + ARBVertexShader.glGetVertexAttribARB(index, pname, params); + } + + public static ByteBuffer glGetVertexAttribPointerARB(int index, int pname, long result_size) { + return ARBVertexShader.glGetVertexAttribPointerARB(index, pname, result_size); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexShader.java new file mode 100644 index 0000000..ad6b048 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexShader.java @@ -0,0 +1,402 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexShader { + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShaderObjectARB and + * returned by the &lt;params&gt; parameter of GetObjectParameter{if}vARB: + */ + public static final int GL_VERTEX_SHADER_ARB = 0x8B31; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = 0x8B4A, + GL_MAX_VARYING_FLOATS_ARB = 0x8B4B, + GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869, + GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = 0x8B4C, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = 0x8B4D, + GL_MAX_TEXTURE_COORDS_ARB = 0x8871; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643; + + /** + * Accepted by the &lt;pname&gt; parameter GetObjectParameter{if}vARB: + */ + public static final int GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = 0x8B89, + GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = 0x8B8A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib{dfi}vARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A, + GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveAttribARB: + */ + public static final int GL_FLOAT_VEC2_ARB = 0x8B50, + GL_FLOAT_VEC3_ARB = 0x8B51, + GL_FLOAT_VEC4_ARB = 0x8B52, + GL_FLOAT_MAT2_ARB = 0x8B5A, + GL_FLOAT_MAT3_ARB = 0x8B5B, + GL_FLOAT_MAT4_ARB = 0x8B5C; + + private ARBVertexShader() {} + + public static void glVertexAttrib1sARB(int index, short v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1sARB(index, v0, function_pointer); + } + static native void nglVertexAttrib1sARB(int index, short v0, long function_pointer); + + public static void glVertexAttrib1fARB(int index, float v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1fARB(index, v0, function_pointer); + } + static native void nglVertexAttrib1fARB(int index, float v0, long function_pointer); + + public static void glVertexAttrib1dARB(int index, double v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1dARB(index, v0, function_pointer); + } + static native void nglVertexAttrib1dARB(int index, double v0, long function_pointer); + + public static void glVertexAttrib2sARB(int index, short v0, short v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2sARB(index, v0, v1, function_pointer); + } + static native void nglVertexAttrib2sARB(int index, short v0, short v1, long function_pointer); + + public static void glVertexAttrib2fARB(int index, float v0, float v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2fARB(index, v0, v1, function_pointer); + } + static native void nglVertexAttrib2fARB(int index, float v0, float v1, long function_pointer); + + public static void glVertexAttrib2dARB(int index, double v0, double v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2dARB(index, v0, v1, function_pointer); + } + static native void nglVertexAttrib2dARB(int index, double v0, double v1, long function_pointer); + + public static void glVertexAttrib3sARB(int index, short v0, short v1, short v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3sARB(index, v0, v1, v2, function_pointer); + } + static native void nglVertexAttrib3sARB(int index, short v0, short v1, short v2, long function_pointer); + + public static void glVertexAttrib3fARB(int index, float v0, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3fARB(index, v0, v1, v2, function_pointer); + } + static native void nglVertexAttrib3fARB(int index, float v0, float v1, float v2, long function_pointer); + + public static void glVertexAttrib3dARB(int index, double v0, double v1, double v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3dARB(index, v0, v1, v2, function_pointer); + } + static native void nglVertexAttrib3dARB(int index, double v0, double v1, double v2, long function_pointer); + + public static void glVertexAttrib4sARB(int index, short v0, short v1, short v2, short v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4sARB(index, v0, v1, v2, v3, function_pointer); + } + static native void nglVertexAttrib4sARB(int index, short v0, short v1, short v2, short v3, long function_pointer); + + public static void glVertexAttrib4fARB(int index, float v0, float v1, float v2, float v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4fARB(index, v0, v1, v2, v3, function_pointer); + } + static native void nglVertexAttrib4fARB(int index, float v0, float v1, float v2, float v3, long function_pointer); + + public static void glVertexAttrib4dARB(int index, double v0, double v1, double v2, double v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4dARB(index, v0, v1, v2, v3, function_pointer); + } + static native void nglVertexAttrib4dARB(int index, double v0, double v1, double v2, double v3, long function_pointer); + + public static void glVertexAttrib4NubARB(int index, byte x, byte y, byte z, byte w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4NubARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4NubARB(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4NubARB(int index, byte x, byte y, byte z, byte w, long function_pointer); + + public static void glVertexAttribPointerARB(int index, int size, boolean normalized, int stride, DoubleBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, GL11.GL_DOUBLE, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean normalized, int stride, FloatBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, GL11.GL_FLOAT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerARB(int index, int size, boolean unsigned, boolean normalized, int stride, ShortBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, long buffer, long function_pointer); + public static void glVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribPointerARBBO(index, size, type, normalized, stride, buffer_buffer_offset, function_pointer); + } + static native void nglVertexAttribPointerARBBO(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset, long function_pointer); + + /** Overloads glVertexAttribPointerARB. */ + public static void glVertexAttribPointerARB(int index, int size, int type, boolean normalized, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerARB; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerARB(index, size, type, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + + public static void glEnableVertexAttribArrayARB(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVertexAttribArrayARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVertexAttribArrayARB(index, function_pointer); + } + static native void nglEnableVertexAttribArrayARB(int index, long function_pointer); + + public static void glDisableVertexAttribArrayARB(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVertexAttribArrayARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVertexAttribArrayARB(index, function_pointer); + } + static native void nglDisableVertexAttribArrayARB(int index, long function_pointer); + + public static void glBindAttribLocationARB(int programObj, int index, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindAttribLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindAttribLocationARB(programObj, index, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglBindAttribLocationARB(int programObj, int index, long name, long function_pointer); + + /** Overloads glBindAttribLocationARB. */ + public static void glBindAttribLocationARB(int programObj, int index, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindAttribLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindAttribLocationARB(programObj, index, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static void glGetActiveAttribARB(int programObj, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttribARB; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveAttribARB(programObj, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveAttribARB(int programObj, int index, int name_maxLength, long length, long size, long type, long name, long function_pointer); + + /** + * Overloads glGetActiveAttribARB. + * <p> + * Overloads glGetActiveAttribARB. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveAttribARB(int programObj, int index, int maxLength, IntBuffer sizeType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttribARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveAttribARB(programObj, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveAttribARB. + * <p> + * Overloads glGetActiveAttribARB. This version returns only the attrib name. + */ + public static String glGetActiveAttribARB(int programObj, int index, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttribARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveAttribARB(programObj, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveAttribARB. + * <p> + * Overloads glGetActiveAttribARB. This version returns only the attrib size. + */ + public static int glGetActiveAttribSizeARB(int programObj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttribARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer size = APIUtil.getBufferInt(caps); + nglGetActiveAttribARB(programObj, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0(caps), function_pointer); + return size.get(0); + } + + /** + * Overloads glGetActiveAttribARB. + * <p> + * Overloads glGetActiveAttribARB. This version returns only the attrib type. + */ + public static int glGetActiveAttribTypeARB(int programObj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttribARB; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer type = APIUtil.getBufferInt(caps); + nglGetActiveAttribARB(programObj, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0(caps), function_pointer); + return type.get(0); + } + + public static int glGetAttribLocationARB(int programObj, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttribLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetAttribLocationARB(programObj, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetAttribLocationARB(int programObj, long name, long function_pointer); + + /** Overloads glGetAttribLocationARB. */ + public static int glGetAttribLocationARB(int programObj, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttribLocationARB; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetAttribLocationARB(programObj, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetVertexAttribARB(int index, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribfvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribfvARB(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribfvARB(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribARB(int index, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribdvARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribdvARB(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribdvARB(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribARB(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribivARB; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribivARB(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribivARB(int index, int pname, long params, long function_pointer); + + public static ByteBuffer glGetVertexAttribPointerARB(int index, int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribPointervARB; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVertexAttribPointervARB(index, pname, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexAttribPointervARB(int index, int pname, long result_size, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java new file mode 100644 index 0000000..b4abfc0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBVertexType2_10_10_10_REV.java @@ -0,0 +1,172 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBVertexType2_10_10_10_REV { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer, VertexPointer, + * NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, + * ColorP*, SecondaryColorP* and VertexAttribP* + */ + public static final int GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368, + GL_INT_2_10_10_10_REV = 0x8D9F; + + private ARBVertexType2_10_10_10_REV() {} + + public static void glVertexP2ui(int type, int value) { + GL33.glVertexP2ui(type, value); + } + + public static void glVertexP3ui(int type, int value) { + GL33.glVertexP3ui(type, value); + } + + public static void glVertexP4ui(int type, int value) { + GL33.glVertexP4ui(type, value); + } + + public static void glVertexP2u(int type, IntBuffer value) { + GL33.glVertexP2u(type, value); + } + + public static void glVertexP3u(int type, IntBuffer value) { + GL33.glVertexP3u(type, value); + } + + public static void glVertexP4u(int type, IntBuffer value) { + GL33.glVertexP4u(type, value); + } + + public static void glTexCoordP1ui(int type, int coords) { + GL33.glTexCoordP1ui(type, coords); + } + + public static void glTexCoordP2ui(int type, int coords) { + GL33.glTexCoordP2ui(type, coords); + } + + public static void glTexCoordP3ui(int type, int coords) { + GL33.glTexCoordP3ui(type, coords); + } + + public static void glTexCoordP4ui(int type, int coords) { + GL33.glTexCoordP4ui(type, coords); + } + + public static void glTexCoordP1u(int type, IntBuffer coords) { + GL33.glTexCoordP1u(type, coords); + } + + public static void glTexCoordP2u(int type, IntBuffer coords) { + GL33.glTexCoordP2u(type, coords); + } + + public static void glTexCoordP3u(int type, IntBuffer coords) { + GL33.glTexCoordP3u(type, coords); + } + + public static void glTexCoordP4u(int type, IntBuffer coords) { + GL33.glTexCoordP4u(type, coords); + } + + public static void glMultiTexCoordP1ui(int texture, int type, int coords) { + GL33.glMultiTexCoordP1ui(texture, type, coords); + } + + public static void glMultiTexCoordP2ui(int texture, int type, int coords) { + GL33.glMultiTexCoordP2ui(texture, type, coords); + } + + public static void glMultiTexCoordP3ui(int texture, int type, int coords) { + GL33.glMultiTexCoordP3ui(texture, type, coords); + } + + public static void glMultiTexCoordP4ui(int texture, int type, int coords) { + GL33.glMultiTexCoordP4ui(texture, type, coords); + } + + public static void glMultiTexCoordP1u(int texture, int type, IntBuffer coords) { + GL33.glMultiTexCoordP1u(texture, type, coords); + } + + public static void glMultiTexCoordP2u(int texture, int type, IntBuffer coords) { + GL33.glMultiTexCoordP2u(texture, type, coords); + } + + public static void glMultiTexCoordP3u(int texture, int type, IntBuffer coords) { + GL33.glMultiTexCoordP3u(texture, type, coords); + } + + public static void glMultiTexCoordP4u(int texture, int type, IntBuffer coords) { + GL33.glMultiTexCoordP4u(texture, type, coords); + } + + public static void glNormalP3ui(int type, int coords) { + GL33.glNormalP3ui(type, coords); + } + + public static void glNormalP3u(int type, IntBuffer coords) { + GL33.glNormalP3u(type, coords); + } + + public static void glColorP3ui(int type, int color) { + GL33.glColorP3ui(type, color); + } + + public static void glColorP4ui(int type, int color) { + GL33.glColorP4ui(type, color); + } + + public static void glColorP3u(int type, IntBuffer color) { + GL33.glColorP3u(type, color); + } + + public static void glColorP4u(int type, IntBuffer color) { + GL33.glColorP4u(type, color); + } + + public static void glSecondaryColorP3ui(int type, int color) { + GL33.glSecondaryColorP3ui(type, color); + } + + public static void glSecondaryColorP3u(int type, IntBuffer color) { + GL33.glSecondaryColorP3u(type, color); + } + + public static void glVertexAttribP1ui(int index, int type, boolean normalized, int value) { + GL33.glVertexAttribP1ui(index, type, normalized, value); + } + + public static void glVertexAttribP2ui(int index, int type, boolean normalized, int value) { + GL33.glVertexAttribP2ui(index, type, normalized, value); + } + + public static void glVertexAttribP3ui(int index, int type, boolean normalized, int value) { + GL33.glVertexAttribP3ui(index, type, normalized, value); + } + + public static void glVertexAttribP4ui(int index, int type, boolean normalized, int value) { + GL33.glVertexAttribP4ui(index, type, normalized, value); + } + + public static void glVertexAttribP1u(int index, int type, boolean normalized, IntBuffer value) { + GL33.glVertexAttribP1u(index, type, normalized, value); + } + + public static void glVertexAttribP2u(int index, int type, boolean normalized, IntBuffer value) { + GL33.glVertexAttribP2u(index, type, normalized, value); + } + + public static void glVertexAttribP3u(int index, int type, boolean normalized, IntBuffer value) { + GL33.glVertexAttribP3u(index, type, normalized, value); + } + + public static void glVertexAttribP4u(int index, int type, boolean normalized, IntBuffer value) { + GL33.glVertexAttribP4u(index, type, normalized, value); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBViewportArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBViewportArray.java new file mode 100644 index 0000000..0c13d8b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBViewportArray.java @@ -0,0 +1,121 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBViewportArray { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: + */ + public static final int GL_SCISSOR_BOX = 0xC10; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFloati_v: + */ + public static final int GL_VIEWPORT = 0xBA2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetDoublei_v: + */ + public static final int GL_DEPTH_RANGE = 0xB70; + + /** + * Accepted by the &lt;pname&gt; parameter of Enablei, Disablei, and IsEnabledi: + */ + public static final int GL_SCISSOR_TEST = 0xC11; + + /** + * Returned in the &lt;data&gt; parameter from a Get query with a &lt;pname&gt; of + * LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX: + */ + public static final int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E, + GL_PROVOKING_VERTEX = 0x8E4F, + GL_UNDEFINED_VERTEX = 0x8260; + + private ARBViewportArray() {} + + public static void glViewportArray(int first, FloatBuffer v) { + GL41.glViewportArray(first, v); + } + + public static void glViewportIndexedf(int index, float x, float y, float w, float h) { + GL41.glViewportIndexedf(index, x, y, w, h); + } + + public static void glViewportIndexed(int index, FloatBuffer v) { + GL41.glViewportIndexed(index, v); + } + + public static void glScissorArray(int first, IntBuffer v) { + GL41.glScissorArray(first, v); + } + + public static void glScissorIndexed(int index, int left, int bottom, int width, int height) { + GL41.glScissorIndexed(index, left, bottom, width, height); + } + + public static void glScissorIndexed(int index, IntBuffer v) { + GL41.glScissorIndexed(index, v); + } + + public static void glDepthRangeArray(int first, DoubleBuffer v) { + GL41.glDepthRangeArray(first, v); + } + + public static void glDepthRangeIndexed(int index, double n, double f) { + GL41.glDepthRangeIndexed(index, n, f); + } + + public static void glGetFloat(int target, int index, FloatBuffer data) { + GL41.glGetFloat(target, index, data); + } + + /** Overloads glGetFloati_v. */ + public static float glGetFloat(int target, int index) { + return GL41.glGetFloat(target, index); + } + + public static void glGetDouble(int target, int index, DoubleBuffer data) { + GL41.glGetDouble(target, index, data); + } + + /** Overloads glGetDoublei_v. */ + public static double glGetDouble(int target, int index) { + return GL41.glGetDouble(target, index); + } + + public static void glGetIntegerIndexedEXT(int target, int index, IntBuffer v) { + EXTDrawBuffers2.glGetIntegerIndexedEXT(target, index, v); + } + + /** Overloads glGetIntegerIndexedivEXT. */ + public static int glGetIntegerIndexedEXT(int target, int index) { + return EXTDrawBuffers2.glGetIntegerIndexedEXT(target, index); + } + + public static void glEnableIndexedEXT(int target, int index) { + EXTDrawBuffers2.glEnableIndexedEXT(target, index); + } + + public static void glDisableIndexedEXT(int target, int index) { + EXTDrawBuffers2.glDisableIndexedEXT(target, index); + } + + public static boolean glIsEnabledIndexedEXT(int target, int index) { + return EXTDrawBuffers2.glIsEnabledIndexedEXT(target, index); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBWindowPos.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBWindowPos.java new file mode 100644 index 0000000..363153b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ARBWindowPos.java @@ -0,0 +1,75 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBWindowPos { + + private ARBWindowPos() {} + + public static void glWindowPos2fARB(float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2fARB(x, y, function_pointer); + } + static native void nglWindowPos2fARB(float x, float y, long function_pointer); + + public static void glWindowPos2dARB(double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2dARB(x, y, function_pointer); + } + static native void nglWindowPos2dARB(double x, double y, long function_pointer); + + public static void glWindowPos2iARB(int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2iARB(x, y, function_pointer); + } + static native void nglWindowPos2iARB(int x, int y, long function_pointer); + + public static void glWindowPos2sARB(short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2sARB(x, y, function_pointer); + } + static native void nglWindowPos2sARB(short x, short y, long function_pointer); + + public static void glWindowPos3fARB(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3fARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3fARB(x, y, z, function_pointer); + } + static native void nglWindowPos3fARB(float x, float y, float z, long function_pointer); + + public static void glWindowPos3dARB(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3dARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3dARB(x, y, z, function_pointer); + } + static native void nglWindowPos3dARB(double x, double y, double z, long function_pointer); + + public static void glWindowPos3iARB(int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3iARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3iARB(x, y, z, function_pointer); + } + static native void nglWindowPos3iARB(int x, int y, int z, long function_pointer); + + public static void glWindowPos3sARB(short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3sARB; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3sARB(x, y, z, function_pointer); + } + static native void nglWindowPos3sARB(short x, short y, short z, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIDrawBuffers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIDrawBuffers.java new file mode 100644 index 0000000..eb55fbd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIDrawBuffers.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIDrawBuffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_DRAW_BUFFERS_ATI = 0x8824, + GL_DRAW_BUFFER0_ATI = 0x8825, + GL_DRAW_BUFFER1_ATI = 0x8826, + GL_DRAW_BUFFER2_ATI = 0x8827, + GL_DRAW_BUFFER3_ATI = 0x8828, + GL_DRAW_BUFFER4_ATI = 0x8829, + GL_DRAW_BUFFER5_ATI = 0x882A, + GL_DRAW_BUFFER6_ATI = 0x882B, + GL_DRAW_BUFFER7_ATI = 0x882C, + GL_DRAW_BUFFER8_ATI = 0x882D, + GL_DRAW_BUFFER9_ATI = 0x882E, + GL_DRAW_BUFFER10_ATI = 0x882F, + GL_DRAW_BUFFER11_ATI = 0x8830, + GL_DRAW_BUFFER12_ATI = 0x8831, + GL_DRAW_BUFFER13_ATI = 0x8832, + GL_DRAW_BUFFER14_ATI = 0x8833, + GL_DRAW_BUFFER15_ATI = 0x8834; + + private ATIDrawBuffers() {} + + public static void glDrawBuffersATI(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffersATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglDrawBuffersATI(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglDrawBuffersATI(int buffers_size, long buffers, long function_pointer); + + /** Overloads glDrawBuffersATI. */ + public static void glDrawBuffersATI(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffersATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawBuffersATI(1, APIUtil.getInt(caps, buffer), function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIElementArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIElementArray.java new file mode 100644 index 0000000..cb31afd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIElementArray.java @@ -0,0 +1,54 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIElementArray { + + public static final int GL_ELEMENT_ARRAY_ATI = 0x8768, + GL_ELEMENT_ARRAY_TYPE_ATI = 0x8769, + GL_ELEMENT_ARRAY_POINTER_ATI = 0x876A; + + private ATIElementArray() {} + + public static void glElementPointerATI(ByteBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglElementPointerATI(GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glElementPointerATI(IntBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglElementPointerATI(GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glElementPointerATI(ShortBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glElementPointerATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglElementPointerATI(GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglElementPointerATI(int type, long pPointer, long function_pointer); + + public static void glDrawElementArrayATI(int mode, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementArrayATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawElementArrayATI(mode, count, function_pointer); + } + static native void nglDrawElementArrayATI(int mode, int count, long function_pointer); + + public static void glDrawRangeElementArrayATI(int mode, int start, int end, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementArrayATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawRangeElementArrayATI(mode, start, end, count, function_pointer); + } + static native void nglDrawRangeElementArrayATI(int mode, int start, int end, int count, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIEnvmapBumpmap.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIEnvmapBumpmap.java new file mode 100644 index 0000000..ab1abba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIEnvmapBumpmap.java @@ -0,0 +1,56 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIEnvmapBumpmap { + + public static final int GL_BUMP_ROT_MATRIX_ATI = 0x8775, + GL_BUMP_ROT_MATRIX_SIZE_ATI = 0x8776, + GL_BUMP_NUM_TEX_UNITS_ATI = 0x8777, + GL_BUMP_TEX_UNITS_ATI = 0x8778, + GL_DUDV_ATI = 0x8779, + GL_DU8DV8_ATI = 0x877A, + GL_BUMP_ENVMAP_ATI = 0x877B, + GL_BUMP_TARGET_ATI = 0x877C; + + private ATIEnvmapBumpmap() {} + + public static void glTexBumpParameterATI(int pname, FloatBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBumpParameterfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTexBumpParameterfvATI(pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTexBumpParameterfvATI(int pname, long param, long function_pointer); + + public static void glTexBumpParameterATI(int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBumpParameterivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTexBumpParameterivATI(pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTexBumpParameterivATI(int pname, long param, long function_pointer); + + public static void glGetTexBumpParameterATI(int pname, FloatBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexBumpParameterfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglGetTexBumpParameterfvATI(pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglGetTexBumpParameterfvATI(int pname, long param, long function_pointer); + + public static void glGetTexBumpParameterATI(int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexBumpParameterivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglGetTexBumpParameterivATI(pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglGetTexBumpParameterivATI(int pname, long param, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIFragmentShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIFragmentShader.java new file mode 100644 index 0000000..637fae2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIFragmentShader.java @@ -0,0 +1,230 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIFragmentShader { + + public static final int GL_FRAGMENT_SHADER_ATI = 0x8920, + GL_REG_0_ATI = 0x8921, + GL_REG_1_ATI = 0x8922, + GL_REG_2_ATI = 0x8923, + GL_REG_3_ATI = 0x8924, + GL_REG_4_ATI = 0x8925, + GL_REG_5_ATI = 0x8926, + GL_REG_6_ATI = 0x8927, + GL_REG_7_ATI = 0x8928, + GL_REG_8_ATI = 0x8929, + GL_REG_9_ATI = 0x892A, + GL_REG_10_ATI = 0x892B, + GL_REG_11_ATI = 0x892C, + GL_REG_12_ATI = 0x892D, + GL_REG_13_ATI = 0x892E, + GL_REG_14_ATI = 0x892F, + GL_REG_15_ATI = 0x8930, + GL_REG_16_ATI = 0x8931, + GL_REG_17_ATI = 0x8932, + GL_REG_18_ATI = 0x8933, + GL_REG_19_ATI = 0x8934, + GL_REG_20_ATI = 0x8935, + GL_REG_21_ATI = 0x8936, + GL_REG_22_ATI = 0x8937, + GL_REG_23_ATI = 0x8938, + GL_REG_24_ATI = 0x8939, + GL_REG_25_ATI = 0x893A, + GL_REG_26_ATI = 0x893B, + GL_REG_27_ATI = 0x893C, + GL_REG_28_ATI = 0x893D, + GL_REG_29_ATI = 0x893E, + GL_REG_30_ATI = 0x893F, + GL_REG_31_ATI = 0x8940, + GL_CON_0_ATI = 0x8941, + GL_CON_1_ATI = 0x8942, + GL_CON_2_ATI = 0x8943, + GL_CON_3_ATI = 0x8944, + GL_CON_4_ATI = 0x8945, + GL_CON_5_ATI = 0x8946, + GL_CON_6_ATI = 0x8947, + GL_CON_7_ATI = 0x8948, + GL_CON_8_ATI = 0x8949, + GL_CON_9_ATI = 0x894A, + GL_CON_10_ATI = 0x894B, + GL_CON_11_ATI = 0x894C, + GL_CON_12_ATI = 0x894D, + GL_CON_13_ATI = 0x894E, + GL_CON_14_ATI = 0x894F, + GL_CON_15_ATI = 0x8950, + GL_CON_16_ATI = 0x8951, + GL_CON_17_ATI = 0x8952, + GL_CON_18_ATI = 0x8953, + GL_CON_19_ATI = 0x8954, + GL_CON_20_ATI = 0x8955, + GL_CON_21_ATI = 0x8956, + GL_CON_22_ATI = 0x8957, + GL_CON_23_ATI = 0x8958, + GL_CON_24_ATI = 0x8959, + GL_CON_25_ATI = 0x895A, + GL_CON_26_ATI = 0x895B, + GL_CON_27_ATI = 0x895C, + GL_CON_28_ATI = 0x895D, + GL_CON_29_ATI = 0x895E, + GL_CON_30_ATI = 0x895F, + GL_CON_31_ATI = 0x8960, + GL_MOV_ATI = 0x8961, + GL_ADD_ATI = 0x8963, + GL_MUL_ATI = 0x8964, + GL_SUB_ATI = 0x8965, + GL_DOT3_ATI = 0x8966, + GL_DOT4_ATI = 0x8967, + GL_MAD_ATI = 0x8968, + GL_LERP_ATI = 0x8969, + GL_CND_ATI = 0x896A, + GL_CND0_ATI = 0x896B, + GL_DOT2_ADD_ATI = 0x896C, + GL_SECONDARY_INTERPOLATOR_ATI = 0x896D, + GL_NUM_FRAGMENT_REGISTERS_ATI = 0x896E, + GL_NUM_FRAGMENT_CONSTANTS_ATI = 0x896F, + GL_NUM_PASSES_ATI = 0x8970, + GL_NUM_INSTRUCTIONS_PER_PASS_ATI = 0x8971, + GL_NUM_INSTRUCTIONS_TOTAL_ATI = 0x8972, + GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI = 0x8973, + GL_NUM_LOOPBACK_COMPONENTS_ATI = 0x8974, + GL_COLOR_ALPHA_PAIRING_ATI = 0x8975, + GL_SWIZZLE_STR_ATI = 0x8976, + GL_SWIZZLE_STQ_ATI = 0x8977, + GL_SWIZZLE_STR_DR_ATI = 0x8978, + GL_SWIZZLE_STQ_DQ_ATI = 0x8979, + GL_SWIZZLE_STRQ_ATI = 0x897A, + GL_SWIZZLE_STRQ_DQ_ATI = 0x897B, + GL_RED_BIT_ATI = 0x1, + GL_GREEN_BIT_ATI = 0x2, + GL_BLUE_BIT_ATI = 0x4, + GL_2X_BIT_ATI = 0x1, + GL_4X_BIT_ATI = 0x2, + GL_8X_BIT_ATI = 0x4, + GL_HALF_BIT_ATI = 0x8, + GL_QUARTER_BIT_ATI = 0x10, + GL_EIGHTH_BIT_ATI = 0x20, + GL_SATURATE_BIT_ATI = 0x40, + GL_COMP_BIT_ATI = 0x2, + GL_NEGATE_BIT_ATI = 0x4, + GL_BIAS_BIT_ATI = 0x8; + + private ATIFragmentShader() {} + + public static int glGenFragmentShadersATI(int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFragmentShadersATI; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGenFragmentShadersATI(range, function_pointer); + return __result; + } + static native int nglGenFragmentShadersATI(int range, long function_pointer); + + public static void glBindFragmentShaderATI(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragmentShaderATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFragmentShaderATI(id, function_pointer); + } + static native void nglBindFragmentShaderATI(int id, long function_pointer); + + public static void glDeleteFragmentShaderATI(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFragmentShaderATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteFragmentShaderATI(id, function_pointer); + } + static native void nglDeleteFragmentShaderATI(int id, long function_pointer); + + public static void glBeginFragmentShaderATI() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginFragmentShaderATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginFragmentShaderATI(function_pointer); + } + static native void nglBeginFragmentShaderATI(long function_pointer); + + public static void glEndFragmentShaderATI() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndFragmentShaderATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndFragmentShaderATI(function_pointer); + } + static native void nglEndFragmentShaderATI(long function_pointer); + + public static void glPassTexCoordATI(int dst, int coord, int swizzle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPassTexCoordATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglPassTexCoordATI(dst, coord, swizzle, function_pointer); + } + static native void nglPassTexCoordATI(int dst, int coord, int swizzle, long function_pointer); + + public static void glSampleMapATI(int dst, int interp, int swizzle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSampleMapATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglSampleMapATI(dst, interp, swizzle, function_pointer); + } + static native void nglSampleMapATI(int dst, int interp, int swizzle, long function_pointer); + + public static void glColorFragmentOp1ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorFragmentOp1ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, function_pointer); + } + static native void nglColorFragmentOp1ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod, long function_pointer); + + public static void glColorFragmentOp2ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorFragmentOp2ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, function_pointer); + } + static native void nglColorFragmentOp2ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, long function_pointer); + + public static void glColorFragmentOp3ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, int arg3, int arg3Rep, int arg3Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorFragmentOp3ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod, function_pointer); + } + static native void nglColorFragmentOp3ATI(int op, int dst, int dstMask, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, int arg3, int arg3Rep, int arg3Mod, long function_pointer); + + public static void glAlphaFragmentOp1ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAlphaFragmentOp1ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, function_pointer); + } + static native void nglAlphaFragmentOp1ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod, long function_pointer); + + public static void glAlphaFragmentOp2ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAlphaFragmentOp2ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, function_pointer); + } + static native void nglAlphaFragmentOp2ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, long function_pointer); + + public static void glAlphaFragmentOp3ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, int arg3, int arg3Rep, int arg3Mod) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAlphaFragmentOp3ATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod, function_pointer); + } + static native void nglAlphaFragmentOp3ATI(int op, int dst, int dstMod, int arg1, int arg1Rep, int arg1Mod, int arg2, int arg2Rep, int arg2Mod, int arg3, int arg3Rep, int arg3Mod, long function_pointer); + + public static void glSetFragmentShaderConstantATI(int dst, FloatBuffer pfValue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetFragmentShaderConstantATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pfValue, 4); + nglSetFragmentShaderConstantATI(dst, MemoryUtil.getAddress(pfValue), function_pointer); + } + static native void nglSetFragmentShaderConstantATI(int dst, long pfValue, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMapObjectBuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMapObjectBuffer.java new file mode 100644 index 0000000..00a4b5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMapObjectBuffer.java @@ -0,0 +1,85 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIMapObjectBuffer { + + private ATIMapObjectBuffer() {} + + /** + * glMapObjectBufferATI maps an ATI vertex array object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the vertex array object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapObjectBufferATI like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapObjectBufferATI(..., null); ... // Another map on the same buffer mapped_buffer = glMapObjectBufferATI(..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetObjectBufferATI internally to + * retrieve the current vertex array object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the vertex array object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the vertex array object size. Reading from or writing to outside + * the memory region that corresponds to the mapped vertex array object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapObjectBufferATI(int buffer, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapObjectBufferATI(buffer, GLChecks.getBufferObjectSizeATI(caps, buffer), old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + /** + * glMapObjectBufferATI maps an ATI vertex array object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the vertex array object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapObjectBufferATI like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapObjectBufferATI(..., null); ... // Another map on the same buffer mapped_buffer = glMapObjectBufferATI(..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetObjectBufferATI internally to + * retrieve the current vertex array object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the vertex array object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the vertex array object size. Reading from or writing to outside + * the memory region that corresponds to the mapped vertex array object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapObjectBufferATI(int buffer, long length, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapObjectBufferATI(buffer, length, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapObjectBufferATI(int buffer, long result_size, ByteBuffer old_buffer, long function_pointer); + + public static void glUnmapObjectBufferATI(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnmapObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglUnmapObjectBufferATI(buffer, function_pointer); + } + static native void nglUnmapObjectBufferATI(int buffer, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMeminfo.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMeminfo.java new file mode 100644 index 0000000..afe9291 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIMeminfo.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIMeminfo { + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv: + */ + public static final int GL_VBO_FREE_MEMORY_ATI = 0x87FB, + GL_TEXTURE_FREE_MEMORY_ATI = 0x87FC, + GL_RENDERBUFFER_FREE_MEMORY_ATI = 0x87FD; + + private ATIMeminfo() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIPnTriangles.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIPnTriangles.java new file mode 100644 index 0000000..6b35b0b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIPnTriangles.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIPnTriangles { + + public static final int GL_PN_TRIANGLES_ATI = 0x87F0, + GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI = 0x87F1, + GL_PN_TRIANGLES_POINT_MODE_ATI = 0x87F2, + GL_PN_TRIANGLES_NORMAL_MODE_ATI = 0x87F3, + GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI = 0x87F4, + GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI = 0x87F5, + GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI = 0x87F6, + GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI = 0x87F7, + GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI = 0x87F8; + + private ATIPnTriangles() {} + + public static void glPNTrianglesfATI(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPNTrianglesfATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglPNTrianglesfATI(pname, param, function_pointer); + } + static native void nglPNTrianglesfATI(int pname, float param, long function_pointer); + + public static void glPNTrianglesiATI(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPNTrianglesiATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglPNTrianglesiATI(pname, param, function_pointer); + } + static native void nglPNTrianglesiATI(int pname, int param, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATISeparateStencil.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATISeparateStencil.java new file mode 100644 index 0000000..69c6ebc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATISeparateStencil.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATISeparateStencil { + + public static final int GL_STENCIL_BACK_FUNC_ATI = 0x8800, + GL_STENCIL_BACK_FAIL_ATI = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI = 0x8803; + + private ATISeparateStencil() {} + + public static void glStencilOpSeparateATI(int face, int sfail, int dpfail, int dppass) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilOpSeparateATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilOpSeparateATI(face, sfail, dpfail, dppass, function_pointer); + } + static native void nglStencilOpSeparateATI(int face, int sfail, int dpfail, int dppass, long function_pointer); + + public static void glStencilFuncSeparateATI(int frontfunc, int backfunc, int ref, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilFuncSeparateATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilFuncSeparateATI(frontfunc, backfunc, ref, mask, function_pointer); + } + static native void nglStencilFuncSeparateATI(int frontfunc, int backfunc, int ref, int mask, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextFragmentShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextFragmentShader.java new file mode 100644 index 0000000..bad03ea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextFragmentShader.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATITextFragmentShader { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4{d,dv,f,fv}ARB, + * ProgramLocalParameter4{d,dv,f,fv}ARB, + * GetProgramEnvParameter{dv,fv}ARB, GetProgramLocalParameter{dv,fv}ARB, + * GetProgramivARB, GetProgramfvATI, and GetProgramStringARB. + */ + public static final int GL_TEXT_FRAGMENT_SHADER_ATI = 0x8200; + + private ATITextFragmentShader() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureCompression3DC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureCompression3DC.java new file mode 100644 index 0000000..9add243 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureCompression3DC.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATITextureCompression3DC { + + public static final int GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI = 0x8837; + + private ATITextureCompression3DC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureEnvCombine3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureEnvCombine3.java new file mode 100644 index 0000000..6f854cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureEnvCombine3.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATITextureEnvCombine3 { + + /** + * Accepted by the &lt;params&gt; parameter of TexEnvf, TexEnvi, TexEnvfv, + * and TexEnviv when the &lt;pname&gt; parameter value is COMBINE_RGB_ARB + * or COMBINE_ALPHA_ARB + */ + public static final int GL_MODULATE_ADD_ATI = 0x8744, + GL_MODULATE_SIGNED_ADD_ATI = 0x8745, + GL_MODULATE_SUBTRACT_ATI = 0x8746; + + private ATITextureEnvCombine3() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureFloat.java new file mode 100644 index 0000000..bbe80e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureFloat.java @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATITextureFloat { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA_FLOAT32_ATI = 0x8814, + GL_RGB_FLOAT32_ATI = 0x8815, + GL_ALPHA_FLOAT32_ATI = 0x8816, + GL_INTENSITY_FLOAT32_ATI = 0x8817, + GL_LUMINANCE_FLOAT32_ATI = 0x8818, + GL_LUMINANCE_ALPHA_FLOAT32_ATI = 0x8819, + GL_RGBA_FLOAT16_ATI = 0x881A, + GL_RGB_FLOAT16_ATI = 0x881B, + GL_ALPHA_FLOAT16_ATI = 0x881C, + GL_INTENSITY_FLOAT16_ATI = 0x881D, + GL_LUMINANCE_FLOAT16_ATI = 0x881E, + GL_LUMINANCE_ALPHA_FLOAT16_ATI = 0x881F; + + private ATITextureFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureMirrorOnce.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureMirrorOnce.java new file mode 100644 index 0000000..b45ec38 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATITextureMirrorOnce.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATITextureMirrorOnce { + + public static final int GL_MIRROR_CLAMP_ATI = 0x8742, + GL_MIRROR_CLAMP_TO_EDGE_ATI = 0x8743; + + private ATITextureMirrorOnce() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexArrayObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexArrayObject.java new file mode 100644 index 0000000..5574ddb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexArrayObject.java @@ -0,0 +1,203 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIVertexArrayObject { + + public static final int GL_STATIC_ATI = 0x8760, + GL_DYNAMIC_ATI = 0x8761, + GL_PRESERVE_ATI = 0x8762, + GL_DISCARD_ATI = 0x8763, + GL_OBJECT_BUFFER_SIZE_ATI = 0x8764, + GL_OBJECT_BUFFER_USAGE_ATI = 0x8765, + GL_ARRAY_OBJECT_BUFFER_ATI = 0x8766, + GL_ARRAY_OBJECT_OFFSET_ATI = 0x8767; + + private ATIVertexArrayObject() {} + + public static int glNewObjectBufferATI(int pPointer_size, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglNewObjectBufferATI(pPointer_size, 0L, usage, function_pointer); + return __result; + } + public static int glNewObjectBufferATI(ByteBuffer pPointer, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + int __result = nglNewObjectBufferATI(pPointer.remaining(), MemoryUtil.getAddress(pPointer), usage, function_pointer); + return __result; + } + public static int glNewObjectBufferATI(DoubleBuffer pPointer, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + int __result = nglNewObjectBufferATI((pPointer.remaining() << 3), MemoryUtil.getAddress(pPointer), usage, function_pointer); + return __result; + } + public static int glNewObjectBufferATI(FloatBuffer pPointer, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + int __result = nglNewObjectBufferATI((pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), usage, function_pointer); + return __result; + } + public static int glNewObjectBufferATI(IntBuffer pPointer, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + int __result = nglNewObjectBufferATI((pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), usage, function_pointer); + return __result; + } + public static int glNewObjectBufferATI(ShortBuffer pPointer, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + int __result = nglNewObjectBufferATI((pPointer.remaining() << 1), MemoryUtil.getAddress(pPointer), usage, function_pointer); + return __result; + } + static native int nglNewObjectBufferATI(int pPointer_size, long pPointer, int usage, long function_pointer); + + public static boolean glIsObjectBufferATI(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsObjectBufferATI(buffer, function_pointer); + return __result; + } + static native boolean nglIsObjectBufferATI(int buffer, long function_pointer); + + public static void glUpdateObjectBufferATI(int buffer, int offset, ByteBuffer pPointer, int preserve) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUpdateObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglUpdateObjectBufferATI(buffer, offset, pPointer.remaining(), MemoryUtil.getAddress(pPointer), preserve, function_pointer); + } + public static void glUpdateObjectBufferATI(int buffer, int offset, DoubleBuffer pPointer, int preserve) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUpdateObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglUpdateObjectBufferATI(buffer, offset, (pPointer.remaining() << 3), MemoryUtil.getAddress(pPointer), preserve, function_pointer); + } + public static void glUpdateObjectBufferATI(int buffer, int offset, FloatBuffer pPointer, int preserve) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUpdateObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglUpdateObjectBufferATI(buffer, offset, (pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), preserve, function_pointer); + } + public static void glUpdateObjectBufferATI(int buffer, int offset, IntBuffer pPointer, int preserve) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUpdateObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglUpdateObjectBufferATI(buffer, offset, (pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), preserve, function_pointer); + } + public static void glUpdateObjectBufferATI(int buffer, int offset, ShortBuffer pPointer, int preserve) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUpdateObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglUpdateObjectBufferATI(buffer, offset, (pPointer.remaining() << 1), MemoryUtil.getAddress(pPointer), preserve, function_pointer); + } + static native void nglUpdateObjectBufferATI(int buffer, int offset, int pPointer_size, long pPointer, int preserve, long function_pointer); + + public static void glGetObjectBufferATI(int buffer, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectBufferfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetObjectBufferfvATI(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetObjectBufferfvATI(int buffer, int pname, long params, long function_pointer); + + public static void glGetObjectBufferATI(int buffer, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectBufferivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetObjectBufferivATI(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetObjectBufferivATI(int buffer, int pname, long params, long function_pointer); + + /** Overloads glGetObjectBufferivATI. */ + public static int glGetObjectBufferiATI(int buffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectBufferivATI; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetObjectBufferivATI(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glFreeObjectBufferATI(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFreeObjectBufferATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglFreeObjectBufferATI(buffer, function_pointer); + } + static native void nglFreeObjectBufferATI(int buffer, long function_pointer); + + public static void glArrayObjectATI(int array, int size, int type, int stride, int buffer, int offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glArrayObjectATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglArrayObjectATI(array, size, type, stride, buffer, offset, function_pointer); + } + static native void nglArrayObjectATI(int array, int size, int type, int stride, int buffer, int offset, long function_pointer); + + public static void glGetArrayObjectATI(int array, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetArrayObjectfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetArrayObjectfvATI(array, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetArrayObjectfvATI(int array, int pname, long params, long function_pointer); + + public static void glGetArrayObjectATI(int array, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetArrayObjectivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetArrayObjectivATI(array, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetArrayObjectivATI(int array, int pname, long params, long function_pointer); + + public static void glVariantArrayObjectATI(int id, int type, int stride, int buffer, int offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantArrayObjectATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVariantArrayObjectATI(id, type, stride, buffer, offset, function_pointer); + } + static native void nglVariantArrayObjectATI(int id, int type, int stride, int buffer, int offset, long function_pointer); + + public static void glGetVariantArrayObjectATI(int id, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantArrayObjectfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVariantArrayObjectfvATI(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVariantArrayObjectfvATI(int id, int pname, long params, long function_pointer); + + public static void glGetVariantArrayObjectATI(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantArrayObjectivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVariantArrayObjectivATI(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVariantArrayObjectivATI(int id, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexAttribArrayObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexAttribArrayObject.java new file mode 100644 index 0000000..d3a8f16 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexAttribArrayObject.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIVertexAttribArrayObject { + + private ATIVertexAttribArrayObject() {} + + public static void glVertexAttribArrayObjectATI(int index, int size, int type, boolean normalized, int stride, int buffer, int offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribArrayObjectATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset, function_pointer); + } + static native void nglVertexAttribArrayObjectATI(int index, int size, int type, boolean normalized, int stride, int buffer, int offset, long function_pointer); + + public static void glGetVertexAttribArrayObjectATI(int index, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribArrayObjectfvATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribArrayObjectfvATI(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribArrayObjectfvATI(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribArrayObjectATI(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribArrayObjectivATI; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribArrayObjectivATI(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribArrayObjectivATI(int index, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexStreams.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexStreams.java new file mode 100644 index 0000000..ddb353e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ATIVertexStreams.java @@ -0,0 +1,182 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class ATIVertexStreams { + + public static final int GL_MAX_VERTEX_STREAMS_ATI = 0x876B, + GL_VERTEX_SOURCE_ATI = 0x876C, + GL_VERTEX_STREAM0_ATI = 0x876D, + GL_VERTEX_STREAM1_ATI = 0x876E, + GL_VERTEX_STREAM2_ATI = 0x876F, + GL_VERTEX_STREAM3_ATI = 0x8770, + GL_VERTEX_STREAM4_ATI = 0x8771, + GL_VERTEX_STREAM5_ATI = 0x8772, + GL_VERTEX_STREAM6_ATI = 0x8773, + GL_VERTEX_STREAM7_ATI = 0x8774; + + private ATIVertexStreams() {} + + public static void glVertexStream2fATI(int stream, float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream2fATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream2fATI(stream, x, y, function_pointer); + } + static native void nglVertexStream2fATI(int stream, float x, float y, long function_pointer); + + public static void glVertexStream2dATI(int stream, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream2dATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream2dATI(stream, x, y, function_pointer); + } + static native void nglVertexStream2dATI(int stream, double x, double y, long function_pointer); + + public static void glVertexStream2iATI(int stream, int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream2iATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream2iATI(stream, x, y, function_pointer); + } + static native void nglVertexStream2iATI(int stream, int x, int y, long function_pointer); + + public static void glVertexStream2sATI(int stream, short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream2sATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream2sATI(stream, x, y, function_pointer); + } + static native void nglVertexStream2sATI(int stream, short x, short y, long function_pointer); + + public static void glVertexStream3fATI(int stream, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream3fATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream3fATI(stream, x, y, z, function_pointer); + } + static native void nglVertexStream3fATI(int stream, float x, float y, float z, long function_pointer); + + public static void glVertexStream3dATI(int stream, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream3dATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream3dATI(stream, x, y, z, function_pointer); + } + static native void nglVertexStream3dATI(int stream, double x, double y, double z, long function_pointer); + + public static void glVertexStream3iATI(int stream, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream3iATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream3iATI(stream, x, y, z, function_pointer); + } + static native void nglVertexStream3iATI(int stream, int x, int y, int z, long function_pointer); + + public static void glVertexStream3sATI(int stream, short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream3sATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream3sATI(stream, x, y, z, function_pointer); + } + static native void nglVertexStream3sATI(int stream, short x, short y, short z, long function_pointer); + + public static void glVertexStream4fATI(int stream, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream4fATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream4fATI(stream, x, y, z, w, function_pointer); + } + static native void nglVertexStream4fATI(int stream, float x, float y, float z, float w, long function_pointer); + + public static void glVertexStream4dATI(int stream, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream4dATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream4dATI(stream, x, y, z, w, function_pointer); + } + static native void nglVertexStream4dATI(int stream, double x, double y, double z, double w, long function_pointer); + + public static void glVertexStream4iATI(int stream, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream4iATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream4iATI(stream, x, y, z, w, function_pointer); + } + static native void nglVertexStream4iATI(int stream, int x, int y, int z, int w, long function_pointer); + + public static void glVertexStream4sATI(int stream, short x, short y, short z, short w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexStream4sATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexStream4sATI(stream, x, y, z, w, function_pointer); + } + static native void nglVertexStream4sATI(int stream, short x, short y, short z, short w, long function_pointer); + + public static void glNormalStream3bATI(int stream, byte x, byte y, byte z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalStream3bATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalStream3bATI(stream, x, y, z, function_pointer); + } + static native void nglNormalStream3bATI(int stream, byte x, byte y, byte z, long function_pointer); + + public static void glNormalStream3fATI(int stream, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalStream3fATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalStream3fATI(stream, x, y, z, function_pointer); + } + static native void nglNormalStream3fATI(int stream, float x, float y, float z, long function_pointer); + + public static void glNormalStream3dATI(int stream, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalStream3dATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalStream3dATI(stream, x, y, z, function_pointer); + } + static native void nglNormalStream3dATI(int stream, double x, double y, double z, long function_pointer); + + public static void glNormalStream3iATI(int stream, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalStream3iATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalStream3iATI(stream, x, y, z, function_pointer); + } + static native void nglNormalStream3iATI(int stream, int x, int y, int z, long function_pointer); + + public static void glNormalStream3sATI(int stream, short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalStream3sATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalStream3sATI(stream, x, y, z, function_pointer); + } + static native void nglNormalStream3sATI(int stream, short x, short y, short z, long function_pointer); + + public static void glClientActiveVertexStreamATI(int stream) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClientActiveVertexStreamATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglClientActiveVertexStreamATI(stream, function_pointer); + } + static native void nglClientActiveVertexStreamATI(int stream, long function_pointer); + + public static void glVertexBlendEnvfATI(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexBlendEnvfATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexBlendEnvfATI(pname, param, function_pointer); + } + static native void nglVertexBlendEnvfATI(int pname, float param, long function_pointer); + + public static void glVertexBlendEnviATI(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexBlendEnviATI; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexBlendEnviATI(pname, param, function_pointer); + } + static native void nglVertexBlendEnviATI(int pname, int param, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ContextCapabilities.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ContextCapabilities.java new file mode 100644 index 0000000..cb91e91 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/ContextCapabilities.java @@ -0,0 +1,6239 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import java.util.Set; +import java.util.HashSet; + +public class ContextCapabilities { + static final boolean DEBUG = false; + final APIUtil util = new APIUtil(); + final StateTracker tracker = new StateTracker(); + + public final boolean GL_AMD_blend_minmax_factor; + public final boolean GL_AMD_conservative_depth; + public final boolean GL_AMD_debug_output; + public final boolean GL_AMD_depth_clamp_separate; + public final boolean GL_AMD_draw_buffers_blend; + public final boolean GL_AMD_interleaved_elements; + public final boolean GL_AMD_multi_draw_indirect; + public final boolean GL_AMD_name_gen_delete; + public final boolean GL_AMD_performance_monitor; + public final boolean GL_AMD_pinned_memory; + public final boolean GL_AMD_query_buffer_object; + public final boolean GL_AMD_sample_positions; + public final boolean GL_AMD_seamless_cubemap_per_texture; + public final boolean GL_AMD_shader_atomic_counter_ops; + public final boolean GL_AMD_shader_stencil_export; + public final boolean GL_AMD_shader_trinary_minmax; + public final boolean GL_AMD_sparse_texture; + public final boolean GL_AMD_stencil_operation_extended; + public final boolean GL_AMD_texture_texture4; + public final boolean GL_AMD_transform_feedback3_lines_triangles; + public final boolean GL_AMD_vertex_shader_layer; + public final boolean GL_AMD_vertex_shader_tessellator; + public final boolean GL_AMD_vertex_shader_viewport_index; + public final boolean GL_APPLE_aux_depth_stencil; + public final boolean GL_APPLE_client_storage; + public final boolean GL_APPLE_element_array; + public final boolean GL_APPLE_fence; + public final boolean GL_APPLE_float_pixels; + public final boolean GL_APPLE_flush_buffer_range; + public final boolean GL_APPLE_object_purgeable; + public final boolean GL_APPLE_packed_pixels; + public final boolean GL_APPLE_rgb_422; + public final boolean GL_APPLE_row_bytes; + public final boolean GL_APPLE_texture_range; + public final boolean GL_APPLE_vertex_array_object; + public final boolean GL_APPLE_vertex_array_range; + public final boolean GL_APPLE_vertex_program_evaluators; + public final boolean GL_APPLE_ycbcr_422; + public final boolean GL_ARB_ES2_compatibility; + public final boolean GL_ARB_ES3_compatibility; + public final boolean GL_ARB_arrays_of_arrays; + public final boolean GL_ARB_base_instance; + public final boolean GL_ARB_bindless_texture; + public final boolean GL_ARB_blend_func_extended; + public final boolean GL_ARB_buffer_storage; + public final boolean GL_ARB_cl_event; + public final boolean GL_ARB_clear_buffer_object; + public final boolean GL_ARB_clear_texture; + public final boolean GL_ARB_color_buffer_float; + public final boolean GL_ARB_compatibility; + public final boolean GL_ARB_compressed_texture_pixel_storage; + public final boolean GL_ARB_compute_shader; + public final boolean GL_ARB_compute_variable_group_size; + public final boolean GL_ARB_conservative_depth; + public final boolean GL_ARB_copy_buffer; + public final boolean GL_ARB_copy_image; + public final boolean GL_ARB_debug_output; + public final boolean GL_ARB_depth_buffer_float; + public final boolean GL_ARB_depth_clamp; + public final boolean GL_ARB_depth_texture; + public final boolean GL_ARB_draw_buffers; + public final boolean GL_ARB_draw_buffers_blend; + public final boolean GL_ARB_draw_elements_base_vertex; + public final boolean GL_ARB_draw_indirect; + public final boolean GL_ARB_draw_instanced; + public final boolean GL_ARB_enhanced_layouts; + public final boolean GL_ARB_explicit_attrib_location; + public final boolean GL_ARB_explicit_uniform_location; + public final boolean GL_ARB_fragment_coord_conventions; + public final boolean GL_ARB_fragment_layer_viewport; + public final boolean GL_ARB_fragment_program; + public final boolean GL_ARB_fragment_program_shadow; + public final boolean GL_ARB_fragment_shader; + public final boolean GL_ARB_framebuffer_no_attachments; + public final boolean GL_ARB_framebuffer_object; + public final boolean GL_ARB_framebuffer_sRGB; + public final boolean GL_ARB_geometry_shader4; + public final boolean GL_ARB_get_program_binary; + public final boolean GL_ARB_gpu_shader5; + public final boolean GL_ARB_gpu_shader_fp64; + public final boolean GL_ARB_half_float_pixel; + public final boolean GL_ARB_half_float_vertex; + public final boolean GL_ARB_imaging; + public final boolean GL_ARB_indirect_parameters; + public final boolean GL_ARB_instanced_arrays; + public final boolean GL_ARB_internalformat_query; + public final boolean GL_ARB_internalformat_query2; + public final boolean GL_ARB_invalidate_subdata; + public final boolean GL_ARB_map_buffer_alignment; + public final boolean GL_ARB_map_buffer_range; + public final boolean GL_ARB_matrix_palette; + public final boolean GL_ARB_multi_bind; + public final boolean GL_ARB_multi_draw_indirect; + public final boolean GL_ARB_multisample; + public final boolean GL_ARB_multitexture; + public final boolean GL_ARB_occlusion_query; + public final boolean GL_ARB_occlusion_query2; + public final boolean GL_ARB_pixel_buffer_object; + public final boolean GL_ARB_point_parameters; + public final boolean GL_ARB_point_sprite; + public final boolean GL_ARB_program_interface_query; + public final boolean GL_ARB_provoking_vertex; + public final boolean GL_ARB_query_buffer_object; + public final boolean GL_ARB_robust_buffer_access_behavior; + public final boolean GL_ARB_robustness; + public final boolean GL_ARB_robustness_isolation; + public final boolean GL_ARB_sample_shading; + public final boolean GL_ARB_sampler_objects; + public final boolean GL_ARB_seamless_cube_map; + public final boolean GL_ARB_seamless_cubemap_per_texture; + public final boolean GL_ARB_separate_shader_objects; + public final boolean GL_ARB_shader_atomic_counters; + public final boolean GL_ARB_shader_bit_encoding; + public final boolean GL_ARB_shader_draw_parameters; + public final boolean GL_ARB_shader_group_vote; + public final boolean GL_ARB_shader_image_load_store; + public final boolean GL_ARB_shader_image_size; + public final boolean GL_ARB_shader_objects; + public final boolean GL_ARB_shader_precision; + public final boolean GL_ARB_shader_stencil_export; + public final boolean GL_ARB_shader_storage_buffer_object; + public final boolean GL_ARB_shader_subroutine; + public final boolean GL_ARB_shader_texture_lod; + public final boolean GL_ARB_shading_language_100; + public final boolean GL_ARB_shading_language_420pack; + public final boolean GL_ARB_shading_language_include; + public final boolean GL_ARB_shading_language_packing; + public final boolean GL_ARB_shadow; + public final boolean GL_ARB_shadow_ambient; + public final boolean GL_ARB_sparse_texture; + public final boolean GL_ARB_stencil_texturing; + public final boolean GL_ARB_sync; + public final boolean GL_ARB_tessellation_shader; + public final boolean GL_ARB_texture_border_clamp; + public final boolean GL_ARB_texture_buffer_object; + public final boolean GL_ARB_texture_buffer_object_rgb32; + public final boolean GL_ARB_texture_buffer_range; + public final boolean GL_ARB_texture_compression; + public final boolean GL_ARB_texture_compression_bptc; + public final boolean GL_ARB_texture_compression_rgtc; + public final boolean GL_ARB_texture_cube_map; + public final boolean GL_ARB_texture_cube_map_array; + public final boolean GL_ARB_texture_env_add; + public final boolean GL_ARB_texture_env_combine; + public final boolean GL_ARB_texture_env_crossbar; + public final boolean GL_ARB_texture_env_dot3; + public final boolean GL_ARB_texture_float; + public final boolean GL_ARB_texture_gather; + public final boolean GL_ARB_texture_mirror_clamp_to_edge; + public final boolean GL_ARB_texture_mirrored_repeat; + public final boolean GL_ARB_texture_multisample; + public final boolean GL_ARB_texture_non_power_of_two; + public final boolean GL_ARB_texture_query_levels; + public final boolean GL_ARB_texture_query_lod; + public final boolean GL_ARB_texture_rectangle; + public final boolean GL_ARB_texture_rg; + public final boolean GL_ARB_texture_rgb10_a2ui; + public final boolean GL_ARB_texture_stencil8; + public final boolean GL_ARB_texture_storage; + public final boolean GL_ARB_texture_storage_multisample; + public final boolean GL_ARB_texture_swizzle; + public final boolean GL_ARB_texture_view; + public final boolean GL_ARB_timer_query; + public final boolean GL_ARB_transform_feedback2; + public final boolean GL_ARB_transform_feedback3; + public final boolean GL_ARB_transform_feedback_instanced; + public final boolean GL_ARB_transpose_matrix; + public final boolean GL_ARB_uniform_buffer_object; + public final boolean GL_ARB_vertex_array_bgra; + public final boolean GL_ARB_vertex_array_object; + public final boolean GL_ARB_vertex_attrib_64bit; + public final boolean GL_ARB_vertex_attrib_binding; + public final boolean GL_ARB_vertex_blend; + public final boolean GL_ARB_vertex_buffer_object; + public final boolean GL_ARB_vertex_program; + public final boolean GL_ARB_vertex_shader; + public final boolean GL_ARB_vertex_type_10f_11f_11f_rev; + public final boolean GL_ARB_vertex_type_2_10_10_10_rev; + public final boolean GL_ARB_viewport_array; + public final boolean GL_ARB_window_pos; + public final boolean GL_ATI_draw_buffers; + public final boolean GL_ATI_element_array; + public final boolean GL_ATI_envmap_bumpmap; + public final boolean GL_ATI_fragment_shader; + public final boolean GL_ATI_map_object_buffer; + public final boolean GL_ATI_meminfo; + public final boolean GL_ATI_pn_triangles; + public final boolean GL_ATI_separate_stencil; + public final boolean GL_ATI_shader_texture_lod; + public final boolean GL_ATI_text_fragment_shader; + public final boolean GL_ATI_texture_compression_3dc; + public final boolean GL_ATI_texture_env_combine3; + public final boolean GL_ATI_texture_float; + public final boolean GL_ATI_texture_mirror_once; + public final boolean GL_ATI_vertex_array_object; + public final boolean GL_ATI_vertex_attrib_array_object; + public final boolean GL_ATI_vertex_streams; + public final boolean GL_EXT_abgr; + public final boolean GL_EXT_bgra; + public final boolean GL_EXT_bindable_uniform; + public final boolean GL_EXT_blend_color; + public final boolean GL_EXT_blend_equation_separate; + public final boolean GL_EXT_blend_func_separate; + public final boolean GL_EXT_blend_minmax; + public final boolean GL_EXT_blend_subtract; + public final boolean GL_EXT_Cg_shader; + public final boolean GL_EXT_compiled_vertex_array; + public final boolean GL_EXT_depth_bounds_test; + public final boolean GL_EXT_direct_state_access; + public final boolean GL_EXT_draw_buffers2; + public final boolean GL_EXT_draw_instanced; + public final boolean GL_EXT_draw_range_elements; + public final boolean GL_EXT_fog_coord; + public final boolean GL_EXT_framebuffer_blit; + public final boolean GL_EXT_framebuffer_multisample; + public final boolean GL_EXT_framebuffer_multisample_blit_scaled; + public final boolean GL_EXT_framebuffer_object; + public final boolean GL_EXT_framebuffer_sRGB; + public final boolean GL_EXT_geometry_shader4; + public final boolean GL_EXT_gpu_program_parameters; + public final boolean GL_EXT_gpu_shader4; + public final boolean GL_EXT_multi_draw_arrays; + public final boolean GL_EXT_packed_depth_stencil; + public final boolean GL_EXT_packed_float; + public final boolean GL_EXT_packed_pixels; + public final boolean GL_EXT_paletted_texture; + public final boolean GL_EXT_pixel_buffer_object; + public final boolean GL_EXT_point_parameters; + public final boolean GL_EXT_provoking_vertex; + public final boolean GL_EXT_rescale_normal; + public final boolean GL_EXT_secondary_color; + public final boolean GL_EXT_separate_shader_objects; + public final boolean GL_EXT_separate_specular_color; + public final boolean GL_EXT_shader_image_load_store; + public final boolean GL_EXT_shadow_funcs; + public final boolean GL_EXT_shared_texture_palette; + public final boolean GL_EXT_stencil_clear_tag; + public final boolean GL_EXT_stencil_two_side; + public final boolean GL_EXT_stencil_wrap; + public final boolean GL_EXT_texture_3d; + public final boolean GL_EXT_texture_array; + public final boolean GL_EXT_texture_buffer_object; + public final boolean GL_EXT_texture_compression_latc; + public final boolean GL_EXT_texture_compression_rgtc; + public final boolean GL_EXT_texture_compression_s3tc; + public final boolean GL_EXT_texture_env_combine; + public final boolean GL_EXT_texture_env_dot3; + public final boolean GL_EXT_texture_filter_anisotropic; + public final boolean GL_EXT_texture_integer; + public final boolean GL_EXT_texture_lod_bias; + public final boolean GL_EXT_texture_mirror_clamp; + public final boolean GL_EXT_texture_rectangle; + public final boolean GL_EXT_texture_sRGB; + public final boolean GL_EXT_texture_sRGB_decode; + public final boolean GL_EXT_texture_shared_exponent; + public final boolean GL_EXT_texture_snorm; + public final boolean GL_EXT_texture_swizzle; + public final boolean GL_EXT_timer_query; + public final boolean GL_EXT_transform_feedback; + public final boolean GL_EXT_vertex_array_bgra; + public final boolean GL_EXT_vertex_attrib_64bit; + public final boolean GL_EXT_vertex_shader; + public final boolean GL_EXT_vertex_weighting; + public final boolean OpenGL11; + public final boolean OpenGL12; + public final boolean OpenGL13; + public final boolean OpenGL14; + public final boolean OpenGL15; + public final boolean OpenGL20; + public final boolean OpenGL21; + public final boolean OpenGL30; + public final boolean OpenGL31; + public final boolean OpenGL32; + public final boolean OpenGL33; + public final boolean OpenGL40; + public final boolean OpenGL41; + public final boolean OpenGL42; + public final boolean OpenGL43; + public final boolean OpenGL44; + public final boolean GL_GREMEDY_frame_terminator; + public final boolean GL_GREMEDY_string_marker; + public final boolean GL_HP_occlusion_test; + public final boolean GL_IBM_rasterpos_clip; + public final boolean GL_INTEL_map_texture; + public final boolean GL_KHR_debug; + public final boolean GL_KHR_texture_compression_astc_ldr; + public final boolean GL_NVX_gpu_memory_info; + public final boolean GL_NV_bindless_multi_draw_indirect; + public final boolean GL_NV_bindless_texture; + public final boolean GL_NV_blend_equation_advanced; + public final boolean GL_NV_blend_square; + public final boolean GL_NV_compute_program5; + public final boolean GL_NV_conditional_render; + public final boolean GL_NV_copy_depth_to_color; + public final boolean GL_NV_copy_image; + public final boolean GL_NV_deep_texture3D; + public final boolean GL_NV_depth_buffer_float; + public final boolean GL_NV_depth_clamp; + public final boolean GL_NV_draw_texture; + public final boolean GL_NV_evaluators; + public final boolean GL_NV_explicit_multisample; + public final boolean GL_NV_fence; + public final boolean GL_NV_float_buffer; + public final boolean GL_NV_fog_distance; + public final boolean GL_NV_fragment_program; + public final boolean GL_NV_fragment_program2; + public final boolean GL_NV_fragment_program4; + public final boolean GL_NV_fragment_program_option; + public final boolean GL_NV_framebuffer_multisample_coverage; + public final boolean GL_NV_geometry_program4; + public final boolean GL_NV_geometry_shader4; + public final boolean GL_NV_gpu_program4; + public final boolean GL_NV_gpu_program5; + public final boolean GL_NV_gpu_program5_mem_extended; + public final boolean GL_NV_gpu_shader5; + public final boolean GL_NV_half_float; + public final boolean GL_NV_light_max_exponent; + public final boolean GL_NV_multisample_coverage; + public final boolean GL_NV_multisample_filter_hint; + public final boolean GL_NV_occlusion_query; + public final boolean GL_NV_packed_depth_stencil; + public final boolean GL_NV_parameter_buffer_object; + public final boolean GL_NV_parameter_buffer_object2; + public final boolean GL_NV_path_rendering; + public final boolean GL_NV_pixel_data_range; + public final boolean GL_NV_point_sprite; + public final boolean GL_NV_present_video; + public final boolean GL_NV_primitive_restart; + public final boolean GL_NV_register_combiners; + public final boolean GL_NV_register_combiners2; + public final boolean GL_NV_shader_atomic_counters; + public final boolean GL_NV_shader_atomic_float; + public final boolean GL_NV_shader_buffer_load; + public final boolean GL_NV_shader_buffer_store; + public final boolean GL_NV_shader_storage_buffer_object; + public final boolean GL_NV_tessellation_program5; + public final boolean GL_NV_texgen_reflection; + public final boolean GL_NV_texture_barrier; + public final boolean GL_NV_texture_compression_vtc; + public final boolean GL_NV_texture_env_combine4; + public final boolean GL_NV_texture_expand_normal; + public final boolean GL_NV_texture_multisample; + public final boolean GL_NV_texture_rectangle; + public final boolean GL_NV_texture_shader; + public final boolean GL_NV_texture_shader2; + public final boolean GL_NV_texture_shader3; + public final boolean GL_NV_transform_feedback; + public final boolean GL_NV_transform_feedback2; + public final boolean GL_NV_vertex_array_range; + public final boolean GL_NV_vertex_array_range2; + public final boolean GL_NV_vertex_attrib_integer_64bit; + public final boolean GL_NV_vertex_buffer_unified_memory; + public final boolean GL_NV_vertex_program; + public final boolean GL_NV_vertex_program1_1; + public final boolean GL_NV_vertex_program2; + public final boolean GL_NV_vertex_program2_option; + public final boolean GL_NV_vertex_program3; + public final boolean GL_NV_vertex_program4; + public final boolean GL_NV_video_capture; + public final boolean GL_SGIS_generate_mipmap; + public final boolean GL_SGIS_texture_lod; + public final boolean GL_SUN_slice_accum; + + // AMD_debug_output + long glDebugMessageEnableAMD; + long glDebugMessageInsertAMD; + long glDebugMessageCallbackAMD; + long glGetDebugMessageLogAMD; + // AMD_draw_buffers_blend + long glBlendFuncIndexedAMD; + long glBlendFuncSeparateIndexedAMD; + long glBlendEquationIndexedAMD; + long glBlendEquationSeparateIndexedAMD; + // AMD_interleaved_elements + long glVertexAttribParameteriAMD; + // AMD_multi_draw_indirect + long glMultiDrawArraysIndirectAMD; + long glMultiDrawElementsIndirectAMD; + // AMD_name_gen_delete + long glGenNamesAMD; + long glDeleteNamesAMD; + long glIsNameAMD; + // AMD_performance_monitor + long glGetPerfMonitorGroupsAMD; + long glGetPerfMonitorCountersAMD; + long glGetPerfMonitorGroupStringAMD; + long glGetPerfMonitorCounterStringAMD; + long glGetPerfMonitorCounterInfoAMD; + long glGenPerfMonitorsAMD; + long glDeletePerfMonitorsAMD; + long glSelectPerfMonitorCountersAMD; + long glBeginPerfMonitorAMD; + long glEndPerfMonitorAMD; + long glGetPerfMonitorCounterDataAMD; + // AMD_sample_positions + long glSetMultisamplefvAMD; + // AMD_sparse_texture + long glTexStorageSparseAMD; + long glTextureStorageSparseAMD; + // AMD_stencil_operation_extended + long glStencilOpValueAMD; + // AMD_vertex_shader_tessellator + long glTessellationFactorAMD; + long glTessellationModeAMD; + // APPLE_element_array + long glElementPointerAPPLE; + long glDrawElementArrayAPPLE; + long glDrawRangeElementArrayAPPLE; + long glMultiDrawElementArrayAPPLE; + long glMultiDrawRangeElementArrayAPPLE; + // APPLE_fence + long glGenFencesAPPLE; + long glDeleteFencesAPPLE; + long glSetFenceAPPLE; + long glIsFenceAPPLE; + long glTestFenceAPPLE; + long glFinishFenceAPPLE; + long glTestObjectAPPLE; + long glFinishObjectAPPLE; + // APPLE_flush_buffer_range + long glBufferParameteriAPPLE; + long glFlushMappedBufferRangeAPPLE; + // APPLE_object_purgeable + long glObjectPurgeableAPPLE; + long glObjectUnpurgeableAPPLE; + long glGetObjectParameterivAPPLE; + // APPLE_texture_range + long glTextureRangeAPPLE; + long glGetTexParameterPointervAPPLE; + // APPLE_vertex_array_object + long glBindVertexArrayAPPLE; + long glDeleteVertexArraysAPPLE; + long glGenVertexArraysAPPLE; + long glIsVertexArrayAPPLE; + // APPLE_vertex_array_range + long glVertexArrayRangeAPPLE; + long glFlushVertexArrayRangeAPPLE; + long glVertexArrayParameteriAPPLE; + // APPLE_vertex_program_evaluators + long glEnableVertexAttribAPPLE; + long glDisableVertexAttribAPPLE; + long glIsVertexAttribEnabledAPPLE; + long glMapVertexAttrib1dAPPLE; + long glMapVertexAttrib1fAPPLE; + long glMapVertexAttrib2dAPPLE; + long glMapVertexAttrib2fAPPLE; + // ARB_bindless_texture + long glGetTextureHandleARB; + long glGetTextureSamplerHandleARB; + long glMakeTextureHandleResidentARB; + long glMakeTextureHandleNonResidentARB; + long glGetImageHandleARB; + long glMakeImageHandleResidentARB; + long glMakeImageHandleNonResidentARB; + long glUniformHandleui64ARB; + long glUniformHandleui64vARB; + long glProgramUniformHandleui64ARB; + long glProgramUniformHandleui64vARB; + long glIsTextureHandleResidentARB; + long glIsImageHandleResidentARB; + long glVertexAttribL1ui64ARB; + long glVertexAttribL1ui64vARB; + long glGetVertexAttribLui64vARB; + // ARB_buffer_object + long glBindBufferARB; + long glDeleteBuffersARB; + long glGenBuffersARB; + long glIsBufferARB; + long glBufferDataARB; + long glBufferSubDataARB; + long glGetBufferSubDataARB; + long glMapBufferARB; + long glUnmapBufferARB; + long glGetBufferParameterivARB; + long glGetBufferPointervARB; + // ARB_buffer_storage + long glNamedBufferStorageEXT; + // ARB_cl_event + long glCreateSyncFromCLeventARB; + // ARB_clear_buffer_object + long glClearNamedBufferDataEXT; + long glClearNamedBufferSubDataEXT; + // ARB_color_buffer_float + long glClampColorARB; + // ARB_compute_variable_group_size + long glDispatchComputeGroupSizeARB; + // ARB_debug_output + long glDebugMessageControlARB; + long glDebugMessageInsertARB; + long glDebugMessageCallbackARB; + long glGetDebugMessageLogARB; + // ARB_draw_buffers + long glDrawBuffersARB; + // ARB_draw_buffers_blend + long glBlendEquationiARB; + long glBlendEquationSeparateiARB; + long glBlendFunciARB; + long glBlendFuncSeparateiARB; + // ARB_draw_instanced + long glDrawArraysInstancedARB; + long glDrawElementsInstancedARB; + // ARB_framebuffer_no_attachments + long glNamedFramebufferParameteriEXT; + long glGetNamedFramebufferParameterivEXT; + // ARB_geometry_shader4 + long glProgramParameteriARB; + long glFramebufferTextureARB; + long glFramebufferTextureLayerARB; + long glFramebufferTextureFaceARB; + // ARB_gpu_shader_fp64 + long glProgramUniform1dEXT; + long glProgramUniform2dEXT; + long glProgramUniform3dEXT; + long glProgramUniform4dEXT; + long glProgramUniform1dvEXT; + long glProgramUniform2dvEXT; + long glProgramUniform3dvEXT; + long glProgramUniform4dvEXT; + long glProgramUniformMatrix2dvEXT; + long glProgramUniformMatrix3dvEXT; + long glProgramUniformMatrix4dvEXT; + long glProgramUniformMatrix2x3dvEXT; + long glProgramUniformMatrix2x4dvEXT; + long glProgramUniformMatrix3x2dvEXT; + long glProgramUniformMatrix3x4dvEXT; + long glProgramUniformMatrix4x2dvEXT; + long glProgramUniformMatrix4x3dvEXT; + // ARB_imaging + long glColorTable; + long glColorSubTable; + long glColorTableParameteriv; + long glColorTableParameterfv; + long glCopyColorSubTable; + long glCopyColorTable; + long glGetColorTable; + long glGetColorTableParameteriv; + long glGetColorTableParameterfv; + long glHistogram; + long glResetHistogram; + long glGetHistogram; + long glGetHistogramParameterfv; + long glGetHistogramParameteriv; + long glMinmax; + long glResetMinmax; + long glGetMinmax; + long glGetMinmaxParameterfv; + long glGetMinmaxParameteriv; + long glConvolutionFilter1D; + long glConvolutionFilter2D; + long glConvolutionParameterf; + long glConvolutionParameterfv; + long glConvolutionParameteri; + long glConvolutionParameteriv; + long glCopyConvolutionFilter1D; + long glCopyConvolutionFilter2D; + long glGetConvolutionFilter; + long glGetConvolutionParameterfv; + long glGetConvolutionParameteriv; + long glSeparableFilter2D; + long glGetSeparableFilter; + // ARB_indirect_parameters + long glMultiDrawArraysIndirectCountARB; + long glMultiDrawElementsIndirectCountARB; + // ARB_instanced_arrays + long glVertexAttribDivisorARB; + // ARB_matrix_palette + long glCurrentPaletteMatrixARB; + long glMatrixIndexPointerARB; + long glMatrixIndexubvARB; + long glMatrixIndexusvARB; + long glMatrixIndexuivARB; + // ARB_multisample + long glSampleCoverageARB; + // ARB_multitexture + long glClientActiveTextureARB; + long glActiveTextureARB; + long glMultiTexCoord1fARB; + long glMultiTexCoord1dARB; + long glMultiTexCoord1iARB; + long glMultiTexCoord1sARB; + long glMultiTexCoord2fARB; + long glMultiTexCoord2dARB; + long glMultiTexCoord2iARB; + long glMultiTexCoord2sARB; + long glMultiTexCoord3fARB; + long glMultiTexCoord3dARB; + long glMultiTexCoord3iARB; + long glMultiTexCoord3sARB; + long glMultiTexCoord4fARB; + long glMultiTexCoord4dARB; + long glMultiTexCoord4iARB; + long glMultiTexCoord4sARB; + // ARB_occlusion_query + long glGenQueriesARB; + long glDeleteQueriesARB; + long glIsQueryARB; + long glBeginQueryARB; + long glEndQueryARB; + long glGetQueryivARB; + long glGetQueryObjectivARB; + long glGetQueryObjectuivARB; + // ARB_point_parameters + long glPointParameterfARB; + long glPointParameterfvARB; + // ARB_program + long glProgramStringARB; + long glBindProgramARB; + long glDeleteProgramsARB; + long glGenProgramsARB; + long glProgramEnvParameter4fARB; + long glProgramEnvParameter4dARB; + long glProgramEnvParameter4fvARB; + long glProgramEnvParameter4dvARB; + long glProgramLocalParameter4fARB; + long glProgramLocalParameter4dARB; + long glProgramLocalParameter4fvARB; + long glProgramLocalParameter4dvARB; + long glGetProgramEnvParameterfvARB; + long glGetProgramEnvParameterdvARB; + long glGetProgramLocalParameterfvARB; + long glGetProgramLocalParameterdvARB; + long glGetProgramivARB; + long glGetProgramStringARB; + long glIsProgramARB; + // ARB_robustness + long glGetGraphicsResetStatusARB; + long glGetnMapdvARB; + long glGetnMapfvARB; + long glGetnMapivARB; + long glGetnPixelMapfvARB; + long glGetnPixelMapuivARB; + long glGetnPixelMapusvARB; + long glGetnPolygonStippleARB; + long glGetnTexImageARB; + long glReadnPixelsARB; + long glGetnColorTableARB; + long glGetnConvolutionFilterARB; + long glGetnSeparableFilterARB; + long glGetnHistogramARB; + long glGetnMinmaxARB; + long glGetnCompressedTexImageARB; + long glGetnUniformfvARB; + long glGetnUniformivARB; + long glGetnUniformuivARB; + long glGetnUniformdvARB; + // ARB_sample_shading + long glMinSampleShadingARB; + // ARB_shader_objects + long glDeleteObjectARB; + long glGetHandleARB; + long glDetachObjectARB; + long glCreateShaderObjectARB; + long glShaderSourceARB; + long glCompileShaderARB; + long glCreateProgramObjectARB; + long glAttachObjectARB; + long glLinkProgramARB; + long glUseProgramObjectARB; + long glValidateProgramARB; + long glUniform1fARB; + long glUniform2fARB; + long glUniform3fARB; + long glUniform4fARB; + long glUniform1iARB; + long glUniform2iARB; + long glUniform3iARB; + long glUniform4iARB; + long glUniform1fvARB; + long glUniform2fvARB; + long glUniform3fvARB; + long glUniform4fvARB; + long glUniform1ivARB; + long glUniform2ivARB; + long glUniform3ivARB; + long glUniform4ivARB; + long glUniformMatrix2fvARB; + long glUniformMatrix3fvARB; + long glUniformMatrix4fvARB; + long glGetObjectParameterfvARB; + long glGetObjectParameterivARB; + long glGetInfoLogARB; + long glGetAttachedObjectsARB; + long glGetUniformLocationARB; + long glGetActiveUniformARB; + long glGetUniformfvARB; + long glGetUniformivARB; + long glGetShaderSourceARB; + // ARB_shading_language_include + long glNamedStringARB; + long glDeleteNamedStringARB; + long glCompileShaderIncludeARB; + long glIsNamedStringARB; + long glGetNamedStringARB; + long glGetNamedStringivARB; + // ARB_sparse_texture + long glTexPageCommitmentARB; + long glTexturePageCommitmentEXT; + // ARB_texture_buffer_object + long glTexBufferARB; + // ARB_texture_buffer_range + long glTextureBufferRangeEXT; + // ARB_texture_compression + long glCompressedTexImage1DARB; + long glCompressedTexImage2DARB; + long glCompressedTexImage3DARB; + long glCompressedTexSubImage1DARB; + long glCompressedTexSubImage2DARB; + long glCompressedTexSubImage3DARB; + long glGetCompressedTexImageARB; + // ARB_texture_storage + long glTextureStorage1DEXT; + long glTextureStorage2DEXT; + long glTextureStorage3DEXT; + // ARB_texture_storage_multisample + long glTextureStorage2DMultisampleEXT; + long glTextureStorage3DMultisampleEXT; + // ARB_transpose_matrix + long glLoadTransposeMatrixfARB; + long glMultTransposeMatrixfARB; + // ARB_vertex_attrib_64bit + long glVertexArrayVertexAttribLOffsetEXT; + // ARB_vertex_blend + long glWeightbvARB; + long glWeightsvARB; + long glWeightivARB; + long glWeightfvARB; + long glWeightdvARB; + long glWeightubvARB; + long glWeightusvARB; + long glWeightuivARB; + long glWeightPointerARB; + long glVertexBlendARB; + // ARB_vertex_shader + long glVertexAttrib1sARB; + long glVertexAttrib1fARB; + long glVertexAttrib1dARB; + long glVertexAttrib2sARB; + long glVertexAttrib2fARB; + long glVertexAttrib2dARB; + long glVertexAttrib3sARB; + long glVertexAttrib3fARB; + long glVertexAttrib3dARB; + long glVertexAttrib4sARB; + long glVertexAttrib4fARB; + long glVertexAttrib4dARB; + long glVertexAttrib4NubARB; + long glVertexAttribPointerARB; + long glEnableVertexAttribArrayARB; + long glDisableVertexAttribArrayARB; + long glBindAttribLocationARB; + long glGetActiveAttribARB; + long glGetAttribLocationARB; + long glGetVertexAttribfvARB; + long glGetVertexAttribdvARB; + long glGetVertexAttribivARB; + long glGetVertexAttribPointervARB; + // ARB_window_pos + long glWindowPos2fARB; + long glWindowPos2dARB; + long glWindowPos2iARB; + long glWindowPos2sARB; + long glWindowPos3fARB; + long glWindowPos3dARB; + long glWindowPos3iARB; + long glWindowPos3sARB; + // ATI_draw_buffers + long glDrawBuffersATI; + // ATI_element_array + long glElementPointerATI; + long glDrawElementArrayATI; + long glDrawRangeElementArrayATI; + // ATI_envmap_bumpmap + long glTexBumpParameterfvATI; + long glTexBumpParameterivATI; + long glGetTexBumpParameterfvATI; + long glGetTexBumpParameterivATI; + // ATI_fragment_shader + long glGenFragmentShadersATI; + long glBindFragmentShaderATI; + long glDeleteFragmentShaderATI; + long glBeginFragmentShaderATI; + long glEndFragmentShaderATI; + long glPassTexCoordATI; + long glSampleMapATI; + long glColorFragmentOp1ATI; + long glColorFragmentOp2ATI; + long glColorFragmentOp3ATI; + long glAlphaFragmentOp1ATI; + long glAlphaFragmentOp2ATI; + long glAlphaFragmentOp3ATI; + long glSetFragmentShaderConstantATI; + // ATI_map_object_buffer + long glMapObjectBufferATI; + long glUnmapObjectBufferATI; + // ATI_pn_triangles + long glPNTrianglesfATI; + long glPNTrianglesiATI; + // ATI_separate_stencil + long glStencilOpSeparateATI; + long glStencilFuncSeparateATI; + // ATI_vertex_array_object + long glNewObjectBufferATI; + long glIsObjectBufferATI; + long glUpdateObjectBufferATI; + long glGetObjectBufferfvATI; + long glGetObjectBufferivATI; + long glFreeObjectBufferATI; + long glArrayObjectATI; + long glGetArrayObjectfvATI; + long glGetArrayObjectivATI; + long glVariantArrayObjectATI; + long glGetVariantArrayObjectfvATI; + long glGetVariantArrayObjectivATI; + // ATI_vertex_attrib_array_object + long glVertexAttribArrayObjectATI; + long glGetVertexAttribArrayObjectfvATI; + long glGetVertexAttribArrayObjectivATI; + // ATI_vertex_streams + long glVertexStream2fATI; + long glVertexStream2dATI; + long glVertexStream2iATI; + long glVertexStream2sATI; + long glVertexStream3fATI; + long glVertexStream3dATI; + long glVertexStream3iATI; + long glVertexStream3sATI; + long glVertexStream4fATI; + long glVertexStream4dATI; + long glVertexStream4iATI; + long glVertexStream4sATI; + long glNormalStream3bATI; + long glNormalStream3fATI; + long glNormalStream3dATI; + long glNormalStream3iATI; + long glNormalStream3sATI; + long glClientActiveVertexStreamATI; + long glVertexBlendEnvfATI; + long glVertexBlendEnviATI; + // EXT_bindable_uniform + long glUniformBufferEXT; + long glGetUniformBufferSizeEXT; + long glGetUniformOffsetEXT; + // EXT_blend_color + long glBlendColorEXT; + // EXT_blend_equation_separate + long glBlendEquationSeparateEXT; + // EXT_blend_func_separate + long glBlendFuncSeparateEXT; + // EXT_blend_minmax + long glBlendEquationEXT; + // EXT_compiled_vertex_array + long glLockArraysEXT; + long glUnlockArraysEXT; + // EXT_depth_bounds_test + long glDepthBoundsEXT; + // EXT_direct_state_access + long glClientAttribDefaultEXT; + long glPushClientAttribDefaultEXT; + long glMatrixLoadfEXT; + long glMatrixLoaddEXT; + long glMatrixMultfEXT; + long glMatrixMultdEXT; + long glMatrixLoadIdentityEXT; + long glMatrixRotatefEXT; + long glMatrixRotatedEXT; + long glMatrixScalefEXT; + long glMatrixScaledEXT; + long glMatrixTranslatefEXT; + long glMatrixTranslatedEXT; + long glMatrixOrthoEXT; + long glMatrixFrustumEXT; + long glMatrixPushEXT; + long glMatrixPopEXT; + long glTextureParameteriEXT; + long glTextureParameterivEXT; + long glTextureParameterfEXT; + long glTextureParameterfvEXT; + long glTextureImage1DEXT; + long glTextureImage2DEXT; + long glTextureSubImage1DEXT; + long glTextureSubImage2DEXT; + long glCopyTextureImage1DEXT; + long glCopyTextureImage2DEXT; + long glCopyTextureSubImage1DEXT; + long glCopyTextureSubImage2DEXT; + long glGetTextureImageEXT; + long glGetTextureParameterfvEXT; + long glGetTextureParameterivEXT; + long glGetTextureLevelParameterfvEXT; + long glGetTextureLevelParameterivEXT; + long glTextureImage3DEXT; + long glTextureSubImage3DEXT; + long glCopyTextureSubImage3DEXT; + long glBindMultiTextureEXT; + long glMultiTexCoordPointerEXT; + long glMultiTexEnvfEXT; + long glMultiTexEnvfvEXT; + long glMultiTexEnviEXT; + long glMultiTexEnvivEXT; + long glMultiTexGendEXT; + long glMultiTexGendvEXT; + long glMultiTexGenfEXT; + long glMultiTexGenfvEXT; + long glMultiTexGeniEXT; + long glMultiTexGenivEXT; + long glGetMultiTexEnvfvEXT; + long glGetMultiTexEnvivEXT; + long glGetMultiTexGendvEXT; + long glGetMultiTexGenfvEXT; + long glGetMultiTexGenivEXT; + long glMultiTexParameteriEXT; + long glMultiTexParameterivEXT; + long glMultiTexParameterfEXT; + long glMultiTexParameterfvEXT; + long glMultiTexImage1DEXT; + long glMultiTexImage2DEXT; + long glMultiTexSubImage1DEXT; + long glMultiTexSubImage2DEXT; + long glCopyMultiTexImage1DEXT; + long glCopyMultiTexImage2DEXT; + long glCopyMultiTexSubImage1DEXT; + long glCopyMultiTexSubImage2DEXT; + long glGetMultiTexImageEXT; + long glGetMultiTexParameterfvEXT; + long glGetMultiTexParameterivEXT; + long glGetMultiTexLevelParameterfvEXT; + long glGetMultiTexLevelParameterivEXT; + long glMultiTexImage3DEXT; + long glMultiTexSubImage3DEXT; + long glCopyMultiTexSubImage3DEXT; + long glEnableClientStateIndexedEXT; + long glDisableClientStateIndexedEXT; + long glEnableClientStateiEXT; + long glDisableClientStateiEXT; + long glGetFloatIndexedvEXT; + long glGetDoubleIndexedvEXT; + long glGetPointerIndexedvEXT; + long glGetFloati_vEXT; + long glGetDoublei_vEXT; + long glGetPointeri_vEXT; + long glNamedProgramStringEXT; + long glNamedProgramLocalParameter4dEXT; + long glNamedProgramLocalParameter4dvEXT; + long glNamedProgramLocalParameter4fEXT; + long glNamedProgramLocalParameter4fvEXT; + long glGetNamedProgramLocalParameterdvEXT; + long glGetNamedProgramLocalParameterfvEXT; + long glGetNamedProgramivEXT; + long glGetNamedProgramStringEXT; + long glCompressedTextureImage3DEXT; + long glCompressedTextureImage2DEXT; + long glCompressedTextureImage1DEXT; + long glCompressedTextureSubImage3DEXT; + long glCompressedTextureSubImage2DEXT; + long glCompressedTextureSubImage1DEXT; + long glGetCompressedTextureImageEXT; + long glCompressedMultiTexImage3DEXT; + long glCompressedMultiTexImage2DEXT; + long glCompressedMultiTexImage1DEXT; + long glCompressedMultiTexSubImage3DEXT; + long glCompressedMultiTexSubImage2DEXT; + long glCompressedMultiTexSubImage1DEXT; + long glGetCompressedMultiTexImageEXT; + long glMatrixLoadTransposefEXT; + long glMatrixLoadTransposedEXT; + long glMatrixMultTransposefEXT; + long glMatrixMultTransposedEXT; + long glNamedBufferDataEXT; + long glNamedBufferSubDataEXT; + long glMapNamedBufferEXT; + long glUnmapNamedBufferEXT; + long glGetNamedBufferParameterivEXT; + long glGetNamedBufferPointervEXT; + long glGetNamedBufferSubDataEXT; + long glProgramUniform1fEXT; + long glProgramUniform2fEXT; + long glProgramUniform3fEXT; + long glProgramUniform4fEXT; + long glProgramUniform1iEXT; + long glProgramUniform2iEXT; + long glProgramUniform3iEXT; + long glProgramUniform4iEXT; + long glProgramUniform1fvEXT; + long glProgramUniform2fvEXT; + long glProgramUniform3fvEXT; + long glProgramUniform4fvEXT; + long glProgramUniform1ivEXT; + long glProgramUniform2ivEXT; + long glProgramUniform3ivEXT; + long glProgramUniform4ivEXT; + long glProgramUniformMatrix2fvEXT; + long glProgramUniformMatrix3fvEXT; + long glProgramUniformMatrix4fvEXT; + long glProgramUniformMatrix2x3fvEXT; + long glProgramUniformMatrix3x2fvEXT; + long glProgramUniformMatrix2x4fvEXT; + long glProgramUniformMatrix4x2fvEXT; + long glProgramUniformMatrix3x4fvEXT; + long glProgramUniformMatrix4x3fvEXT; + long glTextureBufferEXT; + long glMultiTexBufferEXT; + long glTextureParameterIivEXT; + long glTextureParameterIuivEXT; + long glGetTextureParameterIivEXT; + long glGetTextureParameterIuivEXT; + long glMultiTexParameterIivEXT; + long glMultiTexParameterIuivEXT; + long glGetMultiTexParameterIivEXT; + long glGetMultiTexParameterIuivEXT; + long glProgramUniform1uiEXT; + long glProgramUniform2uiEXT; + long glProgramUniform3uiEXT; + long glProgramUniform4uiEXT; + long glProgramUniform1uivEXT; + long glProgramUniform2uivEXT; + long glProgramUniform3uivEXT; + long glProgramUniform4uivEXT; + long glNamedProgramLocalParameters4fvEXT; + long glNamedProgramLocalParameterI4iEXT; + long glNamedProgramLocalParameterI4ivEXT; + long glNamedProgramLocalParametersI4ivEXT; + long glNamedProgramLocalParameterI4uiEXT; + long glNamedProgramLocalParameterI4uivEXT; + long glNamedProgramLocalParametersI4uivEXT; + long glGetNamedProgramLocalParameterIivEXT; + long glGetNamedProgramLocalParameterIuivEXT; + long glNamedRenderbufferStorageEXT; + long glGetNamedRenderbufferParameterivEXT; + long glNamedRenderbufferStorageMultisampleEXT; + long glNamedRenderbufferStorageMultisampleCoverageEXT; + long glCheckNamedFramebufferStatusEXT; + long glNamedFramebufferTexture1DEXT; + long glNamedFramebufferTexture2DEXT; + long glNamedFramebufferTexture3DEXT; + long glNamedFramebufferRenderbufferEXT; + long glGetNamedFramebufferAttachmentParameterivEXT; + long glGenerateTextureMipmapEXT; + long glGenerateMultiTexMipmapEXT; + long glFramebufferDrawBufferEXT; + long glFramebufferDrawBuffersEXT; + long glFramebufferReadBufferEXT; + long glGetFramebufferParameterivEXT; + long glNamedCopyBufferSubDataEXT; + long glNamedFramebufferTextureEXT; + long glNamedFramebufferTextureLayerEXT; + long glNamedFramebufferTextureFaceEXT; + long glTextureRenderbufferEXT; + long glMultiTexRenderbufferEXT; + long glVertexArrayVertexOffsetEXT; + long glVertexArrayColorOffsetEXT; + long glVertexArrayEdgeFlagOffsetEXT; + long glVertexArrayIndexOffsetEXT; + long glVertexArrayNormalOffsetEXT; + long glVertexArrayTexCoordOffsetEXT; + long glVertexArrayMultiTexCoordOffsetEXT; + long glVertexArrayFogCoordOffsetEXT; + long glVertexArraySecondaryColorOffsetEXT; + long glVertexArrayVertexAttribOffsetEXT; + long glVertexArrayVertexAttribIOffsetEXT; + long glEnableVertexArrayEXT; + long glDisableVertexArrayEXT; + long glEnableVertexArrayAttribEXT; + long glDisableVertexArrayAttribEXT; + long glGetVertexArrayIntegervEXT; + long glGetVertexArrayPointervEXT; + long glGetVertexArrayIntegeri_vEXT; + long glGetVertexArrayPointeri_vEXT; + long glMapNamedBufferRangeEXT; + long glFlushMappedNamedBufferRangeEXT; + // EXT_draw_buffers2 + long glColorMaskIndexedEXT; + long glGetBooleanIndexedvEXT; + long glGetIntegerIndexedvEXT; + long glEnableIndexedEXT; + long glDisableIndexedEXT; + long glIsEnabledIndexedEXT; + // EXT_draw_instanced + long glDrawArraysInstancedEXT; + long glDrawElementsInstancedEXT; + // EXT_draw_range_elements + long glDrawRangeElementsEXT; + // EXT_fog_coord + long glFogCoordfEXT; + long glFogCoorddEXT; + long glFogCoordPointerEXT; + // EXT_framebuffer_blit + long glBlitFramebufferEXT; + // EXT_framebuffer_multisample + long glRenderbufferStorageMultisampleEXT; + // EXT_framebuffer_object + long glIsRenderbufferEXT; + long glBindRenderbufferEXT; + long glDeleteRenderbuffersEXT; + long glGenRenderbuffersEXT; + long glRenderbufferStorageEXT; + long glGetRenderbufferParameterivEXT; + long glIsFramebufferEXT; + long glBindFramebufferEXT; + long glDeleteFramebuffersEXT; + long glGenFramebuffersEXT; + long glCheckFramebufferStatusEXT; + long glFramebufferTexture1DEXT; + long glFramebufferTexture2DEXT; + long glFramebufferTexture3DEXT; + long glFramebufferRenderbufferEXT; + long glGetFramebufferAttachmentParameterivEXT; + long glGenerateMipmapEXT; + // EXT_geometry_shader4 + long glProgramParameteriEXT; + long glFramebufferTextureEXT; + long glFramebufferTextureLayerEXT; + long glFramebufferTextureFaceEXT; + // EXT_gpu_program_parameters + long glProgramEnvParameters4fvEXT; + long glProgramLocalParameters4fvEXT; + // EXT_gpu_shader4 + long glVertexAttribI1iEXT; + long glVertexAttribI2iEXT; + long glVertexAttribI3iEXT; + long glVertexAttribI4iEXT; + long glVertexAttribI1uiEXT; + long glVertexAttribI2uiEXT; + long glVertexAttribI3uiEXT; + long glVertexAttribI4uiEXT; + long glVertexAttribI1ivEXT; + long glVertexAttribI2ivEXT; + long glVertexAttribI3ivEXT; + long glVertexAttribI4ivEXT; + long glVertexAttribI1uivEXT; + long glVertexAttribI2uivEXT; + long glVertexAttribI3uivEXT; + long glVertexAttribI4uivEXT; + long glVertexAttribI4bvEXT; + long glVertexAttribI4svEXT; + long glVertexAttribI4ubvEXT; + long glVertexAttribI4usvEXT; + long glVertexAttribIPointerEXT; + long glGetVertexAttribIivEXT; + long glGetVertexAttribIuivEXT; + long glUniform1uiEXT; + long glUniform2uiEXT; + long glUniform3uiEXT; + long glUniform4uiEXT; + long glUniform1uivEXT; + long glUniform2uivEXT; + long glUniform3uivEXT; + long glUniform4uivEXT; + long glGetUniformuivEXT; + long glBindFragDataLocationEXT; + long glGetFragDataLocationEXT; + // EXT_multi_draw_arrays + long glMultiDrawArraysEXT; + // EXT_paletted_texture + long glColorTableEXT; + long glColorSubTableEXT; + long glGetColorTableEXT; + long glGetColorTableParameterivEXT; + long glGetColorTableParameterfvEXT; + // EXT_point_parameters + long glPointParameterfEXT; + long glPointParameterfvEXT; + // EXT_provoking_vertex + long glProvokingVertexEXT; + // EXT_secondary_color + long glSecondaryColor3bEXT; + long glSecondaryColor3fEXT; + long glSecondaryColor3dEXT; + long glSecondaryColor3ubEXT; + long glSecondaryColorPointerEXT; + // EXT_separate_shader_objects + long glUseShaderProgramEXT; + long glActiveProgramEXT; + long glCreateShaderProgramEXT; + // EXT_shader_image_load_store + long glBindImageTextureEXT; + long glMemoryBarrierEXT; + // EXT_stencil_clear_tag + long glStencilClearTagEXT; + // EXT_stencil_two_side + long glActiveStencilFaceEXT; + // EXT_texture_buffer_object + long glTexBufferEXT; + // EXT_texture_integer + long glClearColorIiEXT; + long glClearColorIuiEXT; + long glTexParameterIivEXT; + long glTexParameterIuivEXT; + long glGetTexParameterIivEXT; + long glGetTexParameterIuivEXT; + // EXT_timer_query + long glGetQueryObjecti64vEXT; + long glGetQueryObjectui64vEXT; + // EXT_transform_feedback + long glBindBufferRangeEXT; + long glBindBufferOffsetEXT; + long glBindBufferBaseEXT; + long glBeginTransformFeedbackEXT; + long glEndTransformFeedbackEXT; + long glTransformFeedbackVaryingsEXT; + long glGetTransformFeedbackVaryingEXT; + // EXT_vertex_attrib_64bit + long glVertexAttribL1dEXT; + long glVertexAttribL2dEXT; + long glVertexAttribL3dEXT; + long glVertexAttribL4dEXT; + long glVertexAttribL1dvEXT; + long glVertexAttribL2dvEXT; + long glVertexAttribL3dvEXT; + long glVertexAttribL4dvEXT; + long glVertexAttribLPointerEXT; + long glGetVertexAttribLdvEXT; + // EXT_vertex_shader + long glBeginVertexShaderEXT; + long glEndVertexShaderEXT; + long glBindVertexShaderEXT; + long glGenVertexShadersEXT; + long glDeleteVertexShaderEXT; + long glShaderOp1EXT; + long glShaderOp2EXT; + long glShaderOp3EXT; + long glSwizzleEXT; + long glWriteMaskEXT; + long glInsertComponentEXT; + long glExtractComponentEXT; + long glGenSymbolsEXT; + long glSetInvariantEXT; + long glSetLocalConstantEXT; + long glVariantbvEXT; + long glVariantsvEXT; + long glVariantivEXT; + long glVariantfvEXT; + long glVariantdvEXT; + long glVariantubvEXT; + long glVariantusvEXT; + long glVariantuivEXT; + long glVariantPointerEXT; + long glEnableVariantClientStateEXT; + long glDisableVariantClientStateEXT; + long glBindLightParameterEXT; + long glBindMaterialParameterEXT; + long glBindTexGenParameterEXT; + long glBindTextureUnitParameterEXT; + long glBindParameterEXT; + long glIsVariantEnabledEXT; + long glGetVariantBooleanvEXT; + long glGetVariantIntegervEXT; + long glGetVariantFloatvEXT; + long glGetVariantPointervEXT; + long glGetInvariantBooleanvEXT; + long glGetInvariantIntegervEXT; + long glGetInvariantFloatvEXT; + long glGetLocalConstantBooleanvEXT; + long glGetLocalConstantIntegervEXT; + long glGetLocalConstantFloatvEXT; + // EXT_vertex_weighting + long glVertexWeightfEXT; + long glVertexWeightPointerEXT; + // GL11 + long glAccum; + long glAlphaFunc; + long glClearColor; + long glClearAccum; + long glClear; + long glCallLists; + long glCallList; + long glBlendFunc; + long glBitmap; + long glBindTexture; + long glPrioritizeTextures; + long glAreTexturesResident; + long glBegin; + long glEnd; + long glArrayElement; + long glClearDepth; + long glDeleteLists; + long glDeleteTextures; + long glCullFace; + long glCopyTexSubImage2D; + long glCopyTexSubImage1D; + long glCopyTexImage2D; + long glCopyTexImage1D; + long glCopyPixels; + long glColorPointer; + long glColorMaterial; + long glColorMask; + long glColor3b; + long glColor3f; + long glColor3d; + long glColor3ub; + long glColor4b; + long glColor4f; + long glColor4d; + long glColor4ub; + long glClipPlane; + long glClearStencil; + long glEvalPoint1; + long glEvalPoint2; + long glEvalMesh1; + long glEvalMesh2; + long glEvalCoord1f; + long glEvalCoord1d; + long glEvalCoord2f; + long glEvalCoord2d; + long glEnableClientState; + long glDisableClientState; + long glEnable; + long glDisable; + long glEdgeFlagPointer; + long glEdgeFlag; + long glDrawPixels; + long glDrawElements; + long glDrawBuffer; + long glDrawArrays; + long glDepthRange; + long glDepthMask; + long glDepthFunc; + long glFeedbackBuffer; + long glGetPixelMapfv; + long glGetPixelMapuiv; + long glGetPixelMapusv; + long glGetMaterialfv; + long glGetMaterialiv; + long glGetMapfv; + long glGetMapdv; + long glGetMapiv; + long glGetLightfv; + long glGetLightiv; + long glGetError; + long glGetClipPlane; + long glGetBooleanv; + long glGetDoublev; + long glGetFloatv; + long glGetIntegerv; + long glGenTextures; + long glGenLists; + long glFrustum; + long glFrontFace; + long glFogf; + long glFogi; + long glFogfv; + long glFogiv; + long glFlush; + long glFinish; + long glGetPointerv; + long glIsEnabled; + long glInterleavedArrays; + long glInitNames; + long glHint; + long glGetTexParameterfv; + long glGetTexParameteriv; + long glGetTexLevelParameterfv; + long glGetTexLevelParameteriv; + long glGetTexImage; + long glGetTexGeniv; + long glGetTexGenfv; + long glGetTexGendv; + long glGetTexEnviv; + long glGetTexEnvfv; + long glGetString; + long glGetPolygonStipple; + long glIsList; + long glMaterialf; + long glMateriali; + long glMaterialfv; + long glMaterialiv; + long glMapGrid1f; + long glMapGrid1d; + long glMapGrid2f; + long glMapGrid2d; + long glMap2f; + long glMap2d; + long glMap1f; + long glMap1d; + long glLogicOp; + long glLoadName; + long glLoadMatrixf; + long glLoadMatrixd; + long glLoadIdentity; + long glListBase; + long glLineWidth; + long glLineStipple; + long glLightModelf; + long glLightModeli; + long glLightModelfv; + long glLightModeliv; + long glLightf; + long glLighti; + long glLightfv; + long glLightiv; + long glIsTexture; + long glMatrixMode; + long glPolygonStipple; + long glPolygonOffset; + long glPolygonMode; + long glPointSize; + long glPixelZoom; + long glPixelTransferf; + long glPixelTransferi; + long glPixelStoref; + long glPixelStorei; + long glPixelMapfv; + long glPixelMapuiv; + long glPixelMapusv; + long glPassThrough; + long glOrtho; + long glNormalPointer; + long glNormal3b; + long glNormal3f; + long glNormal3d; + long glNormal3i; + long glNewList; + long glEndList; + long glMultMatrixf; + long glMultMatrixd; + long glShadeModel; + long glSelectBuffer; + long glScissor; + long glScalef; + long glScaled; + long glRotatef; + long glRotated; + long glRenderMode; + long glRectf; + long glRectd; + long glRecti; + long glReadPixels; + long glReadBuffer; + long glRasterPos2f; + long glRasterPos2d; + long glRasterPos2i; + long glRasterPos3f; + long glRasterPos3d; + long glRasterPos3i; + long glRasterPos4f; + long glRasterPos4d; + long glRasterPos4i; + long glPushName; + long glPopName; + long glPushMatrix; + long glPopMatrix; + long glPushClientAttrib; + long glPopClientAttrib; + long glPushAttrib; + long glPopAttrib; + long glStencilFunc; + long glVertexPointer; + long glVertex2f; + long glVertex2d; + long glVertex2i; + long glVertex3f; + long glVertex3d; + long glVertex3i; + long glVertex4f; + long glVertex4d; + long glVertex4i; + long glTranslatef; + long glTranslated; + long glTexImage1D; + long glTexImage2D; + long glTexSubImage1D; + long glTexSubImage2D; + long glTexParameterf; + long glTexParameteri; + long glTexParameterfv; + long glTexParameteriv; + long glTexGenf; + long glTexGend; + long glTexGenfv; + long glTexGendv; + long glTexGeni; + long glTexGeniv; + long glTexEnvf; + long glTexEnvi; + long glTexEnvfv; + long glTexEnviv; + long glTexCoordPointer; + long glTexCoord1f; + long glTexCoord1d; + long glTexCoord2f; + long glTexCoord2d; + long glTexCoord3f; + long glTexCoord3d; + long glTexCoord4f; + long glTexCoord4d; + long glStencilOp; + long glStencilMask; + long glViewport; + // GL12 + long glDrawRangeElements; + long glTexImage3D; + long glTexSubImage3D; + long glCopyTexSubImage3D; + // GL13 + long glActiveTexture; + long glClientActiveTexture; + long glCompressedTexImage1D; + long glCompressedTexImage2D; + long glCompressedTexImage3D; + long glCompressedTexSubImage1D; + long glCompressedTexSubImage2D; + long glCompressedTexSubImage3D; + long glGetCompressedTexImage; + long glMultiTexCoord1f; + long glMultiTexCoord1d; + long glMultiTexCoord2f; + long glMultiTexCoord2d; + long glMultiTexCoord3f; + long glMultiTexCoord3d; + long glMultiTexCoord4f; + long glMultiTexCoord4d; + long glLoadTransposeMatrixf; + long glLoadTransposeMatrixd; + long glMultTransposeMatrixf; + long glMultTransposeMatrixd; + long glSampleCoverage; + // GL14 + long glBlendEquation; + long glBlendColor; + long glFogCoordf; + long glFogCoordd; + long glFogCoordPointer; + long glMultiDrawArrays; + long glPointParameteri; + long glPointParameterf; + long glPointParameteriv; + long glPointParameterfv; + long glSecondaryColor3b; + long glSecondaryColor3f; + long glSecondaryColor3d; + long glSecondaryColor3ub; + long glSecondaryColorPointer; + long glBlendFuncSeparate; + long glWindowPos2f; + long glWindowPos2d; + long glWindowPos2i; + long glWindowPos3f; + long glWindowPos3d; + long glWindowPos3i; + // GL15 + long glBindBuffer; + long glDeleteBuffers; + long glGenBuffers; + long glIsBuffer; + long glBufferData; + long glBufferSubData; + long glGetBufferSubData; + long glMapBuffer; + long glUnmapBuffer; + long glGetBufferParameteriv; + long glGetBufferPointerv; + long glGenQueries; + long glDeleteQueries; + long glIsQuery; + long glBeginQuery; + long glEndQuery; + long glGetQueryiv; + long glGetQueryObjectiv; + long glGetQueryObjectuiv; + // GL20 + long glShaderSource; + long glCreateShader; + long glIsShader; + long glCompileShader; + long glDeleteShader; + long glCreateProgram; + long glIsProgram; + long glAttachShader; + long glDetachShader; + long glLinkProgram; + long glUseProgram; + long glValidateProgram; + long glDeleteProgram; + long glUniform1f; + long glUniform2f; + long glUniform3f; + long glUniform4f; + long glUniform1i; + long glUniform2i; + long glUniform3i; + long glUniform4i; + long glUniform1fv; + long glUniform2fv; + long glUniform3fv; + long glUniform4fv; + long glUniform1iv; + long glUniform2iv; + long glUniform3iv; + long glUniform4iv; + long glUniformMatrix2fv; + long glUniformMatrix3fv; + long glUniformMatrix4fv; + long glGetShaderiv; + long glGetProgramiv; + long glGetShaderInfoLog; + long glGetProgramInfoLog; + long glGetAttachedShaders; + long glGetUniformLocation; + long glGetActiveUniform; + long glGetUniformfv; + long glGetUniformiv; + long glGetShaderSource; + long glVertexAttrib1s; + long glVertexAttrib1f; + long glVertexAttrib1d; + long glVertexAttrib2s; + long glVertexAttrib2f; + long glVertexAttrib2d; + long glVertexAttrib3s; + long glVertexAttrib3f; + long glVertexAttrib3d; + long glVertexAttrib4s; + long glVertexAttrib4f; + long glVertexAttrib4d; + long glVertexAttrib4Nub; + long glVertexAttribPointer; + long glEnableVertexAttribArray; + long glDisableVertexAttribArray; + long glGetVertexAttribfv; + long glGetVertexAttribdv; + long glGetVertexAttribiv; + long glGetVertexAttribPointerv; + long glBindAttribLocation; + long glGetActiveAttrib; + long glGetAttribLocation; + long glDrawBuffers; + long glStencilOpSeparate; + long glStencilFuncSeparate; + long glStencilMaskSeparate; + long glBlendEquationSeparate; + // GL21 + long glUniformMatrix2x3fv; + long glUniformMatrix3x2fv; + long glUniformMatrix2x4fv; + long glUniformMatrix4x2fv; + long glUniformMatrix3x4fv; + long glUniformMatrix4x3fv; + // GL30 + long glGetStringi; + long glClearBufferfv; + long glClearBufferiv; + long glClearBufferuiv; + long glClearBufferfi; + long glVertexAttribI1i; + long glVertexAttribI2i; + long glVertexAttribI3i; + long glVertexAttribI4i; + long glVertexAttribI1ui; + long glVertexAttribI2ui; + long glVertexAttribI3ui; + long glVertexAttribI4ui; + long glVertexAttribI1iv; + long glVertexAttribI2iv; + long glVertexAttribI3iv; + long glVertexAttribI4iv; + long glVertexAttribI1uiv; + long glVertexAttribI2uiv; + long glVertexAttribI3uiv; + long glVertexAttribI4uiv; + long glVertexAttribI4bv; + long glVertexAttribI4sv; + long glVertexAttribI4ubv; + long glVertexAttribI4usv; + long glVertexAttribIPointer; + long glGetVertexAttribIiv; + long glGetVertexAttribIuiv; + long glUniform1ui; + long glUniform2ui; + long glUniform3ui; + long glUniform4ui; + long glUniform1uiv; + long glUniform2uiv; + long glUniform3uiv; + long glUniform4uiv; + long glGetUniformuiv; + long glBindFragDataLocation; + long glGetFragDataLocation; + long glBeginConditionalRender; + long glEndConditionalRender; + long glMapBufferRange; + long glFlushMappedBufferRange; + long glClampColor; + long glIsRenderbuffer; + long glBindRenderbuffer; + long glDeleteRenderbuffers; + long glGenRenderbuffers; + long glRenderbufferStorage; + long glGetRenderbufferParameteriv; + long glIsFramebuffer; + long glBindFramebuffer; + long glDeleteFramebuffers; + long glGenFramebuffers; + long glCheckFramebufferStatus; + long glFramebufferTexture1D; + long glFramebufferTexture2D; + long glFramebufferTexture3D; + long glFramebufferRenderbuffer; + long glGetFramebufferAttachmentParameteriv; + long glGenerateMipmap; + long glRenderbufferStorageMultisample; + long glBlitFramebuffer; + long glTexParameterIiv; + long glTexParameterIuiv; + long glGetTexParameterIiv; + long glGetTexParameterIuiv; + long glFramebufferTextureLayer; + long glColorMaski; + long glGetBooleani_v; + long glGetIntegeri_v; + long glEnablei; + long glDisablei; + long glIsEnabledi; + long glBindBufferRange; + long glBindBufferBase; + long glBeginTransformFeedback; + long glEndTransformFeedback; + long glTransformFeedbackVaryings; + long glGetTransformFeedbackVarying; + long glBindVertexArray; + long glDeleteVertexArrays; + long glGenVertexArrays; + long glIsVertexArray; + // GL31 + long glDrawArraysInstanced; + long glDrawElementsInstanced; + long glCopyBufferSubData; + long glPrimitiveRestartIndex; + long glTexBuffer; + long glGetUniformIndices; + long glGetActiveUniformsiv; + long glGetActiveUniformName; + long glGetUniformBlockIndex; + long glGetActiveUniformBlockiv; + long glGetActiveUniformBlockName; + long glUniformBlockBinding; + // GL32 + long glGetBufferParameteri64v; + long glDrawElementsBaseVertex; + long glDrawRangeElementsBaseVertex; + long glDrawElementsInstancedBaseVertex; + long glProvokingVertex; + long glTexImage2DMultisample; + long glTexImage3DMultisample; + long glGetMultisamplefv; + long glSampleMaski; + long glFramebufferTexture; + long glFenceSync; + long glIsSync; + long glDeleteSync; + long glClientWaitSync; + long glWaitSync; + long glGetInteger64v; + long glGetInteger64i_v; + long glGetSynciv; + // GL33 + long glBindFragDataLocationIndexed; + long glGetFragDataIndex; + long glGenSamplers; + long glDeleteSamplers; + long glIsSampler; + long glBindSampler; + long glSamplerParameteri; + long glSamplerParameterf; + long glSamplerParameteriv; + long glSamplerParameterfv; + long glSamplerParameterIiv; + long glSamplerParameterIuiv; + long glGetSamplerParameteriv; + long glGetSamplerParameterfv; + long glGetSamplerParameterIiv; + long glGetSamplerParameterIuiv; + long glQueryCounter; + long glGetQueryObjecti64v; + long glGetQueryObjectui64v; + long glVertexAttribDivisor; + long glVertexP2ui; + long glVertexP3ui; + long glVertexP4ui; + long glVertexP2uiv; + long glVertexP3uiv; + long glVertexP4uiv; + long glTexCoordP1ui; + long glTexCoordP2ui; + long glTexCoordP3ui; + long glTexCoordP4ui; + long glTexCoordP1uiv; + long glTexCoordP2uiv; + long glTexCoordP3uiv; + long glTexCoordP4uiv; + long glMultiTexCoordP1ui; + long glMultiTexCoordP2ui; + long glMultiTexCoordP3ui; + long glMultiTexCoordP4ui; + long glMultiTexCoordP1uiv; + long glMultiTexCoordP2uiv; + long glMultiTexCoordP3uiv; + long glMultiTexCoordP4uiv; + long glNormalP3ui; + long glNormalP3uiv; + long glColorP3ui; + long glColorP4ui; + long glColorP3uiv; + long glColorP4uiv; + long glSecondaryColorP3ui; + long glSecondaryColorP3uiv; + long glVertexAttribP1ui; + long glVertexAttribP2ui; + long glVertexAttribP3ui; + long glVertexAttribP4ui; + long glVertexAttribP1uiv; + long glVertexAttribP2uiv; + long glVertexAttribP3uiv; + long glVertexAttribP4uiv; + // GL40 + long glBlendEquationi; + long glBlendEquationSeparatei; + long glBlendFunci; + long glBlendFuncSeparatei; + long glDrawArraysIndirect; + long glDrawElementsIndirect; + long glUniform1d; + long glUniform2d; + long glUniform3d; + long glUniform4d; + long glUniform1dv; + long glUniform2dv; + long glUniform3dv; + long glUniform4dv; + long glUniformMatrix2dv; + long glUniformMatrix3dv; + long glUniformMatrix4dv; + long glUniformMatrix2x3dv; + long glUniformMatrix2x4dv; + long glUniformMatrix3x2dv; + long glUniformMatrix3x4dv; + long glUniformMatrix4x2dv; + long glUniformMatrix4x3dv; + long glGetUniformdv; + long glMinSampleShading; + long glGetSubroutineUniformLocation; + long glGetSubroutineIndex; + long glGetActiveSubroutineUniformiv; + long glGetActiveSubroutineUniformName; + long glGetActiveSubroutineName; + long glUniformSubroutinesuiv; + long glGetUniformSubroutineuiv; + long glGetProgramStageiv; + long glPatchParameteri; + long glPatchParameterfv; + long glBindTransformFeedback; + long glDeleteTransformFeedbacks; + long glGenTransformFeedbacks; + long glIsTransformFeedback; + long glPauseTransformFeedback; + long glResumeTransformFeedback; + long glDrawTransformFeedback; + long glDrawTransformFeedbackStream; + long glBeginQueryIndexed; + long glEndQueryIndexed; + long glGetQueryIndexediv; + // GL41 + long glReleaseShaderCompiler; + long glShaderBinary; + long glGetShaderPrecisionFormat; + long glDepthRangef; + long glClearDepthf; + long glGetProgramBinary; + long glProgramBinary; + long glProgramParameteri; + long glUseProgramStages; + long glActiveShaderProgram; + long glCreateShaderProgramv; + long glBindProgramPipeline; + long glDeleteProgramPipelines; + long glGenProgramPipelines; + long glIsProgramPipeline; + long glGetProgramPipelineiv; + long glProgramUniform1i; + long glProgramUniform2i; + long glProgramUniform3i; + long glProgramUniform4i; + long glProgramUniform1f; + long glProgramUniform2f; + long glProgramUniform3f; + long glProgramUniform4f; + long glProgramUniform1d; + long glProgramUniform2d; + long glProgramUniform3d; + long glProgramUniform4d; + long glProgramUniform1iv; + long glProgramUniform2iv; + long glProgramUniform3iv; + long glProgramUniform4iv; + long glProgramUniform1fv; + long glProgramUniform2fv; + long glProgramUniform3fv; + long glProgramUniform4fv; + long glProgramUniform1dv; + long glProgramUniform2dv; + long glProgramUniform3dv; + long glProgramUniform4dv; + long glProgramUniform1ui; + long glProgramUniform2ui; + long glProgramUniform3ui; + long glProgramUniform4ui; + long glProgramUniform1uiv; + long glProgramUniform2uiv; + long glProgramUniform3uiv; + long glProgramUniform4uiv; + long glProgramUniformMatrix2fv; + long glProgramUniformMatrix3fv; + long glProgramUniformMatrix4fv; + long glProgramUniformMatrix2dv; + long glProgramUniformMatrix3dv; + long glProgramUniformMatrix4dv; + long glProgramUniformMatrix2x3fv; + long glProgramUniformMatrix3x2fv; + long glProgramUniformMatrix2x4fv; + long glProgramUniformMatrix4x2fv; + long glProgramUniformMatrix3x4fv; + long glProgramUniformMatrix4x3fv; + long glProgramUniformMatrix2x3dv; + long glProgramUniformMatrix3x2dv; + long glProgramUniformMatrix2x4dv; + long glProgramUniformMatrix4x2dv; + long glProgramUniformMatrix3x4dv; + long glProgramUniformMatrix4x3dv; + long glValidateProgramPipeline; + long glGetProgramPipelineInfoLog; + long glVertexAttribL1d; + long glVertexAttribL2d; + long glVertexAttribL3d; + long glVertexAttribL4d; + long glVertexAttribL1dv; + long glVertexAttribL2dv; + long glVertexAttribL3dv; + long glVertexAttribL4dv; + long glVertexAttribLPointer; + long glGetVertexAttribLdv; + long glViewportArrayv; + long glViewportIndexedf; + long glViewportIndexedfv; + long glScissorArrayv; + long glScissorIndexed; + long glScissorIndexedv; + long glDepthRangeArrayv; + long glDepthRangeIndexed; + long glGetFloati_v; + long glGetDoublei_v; + // GL42 + long glGetActiveAtomicCounterBufferiv; + long glTexStorage1D; + long glTexStorage2D; + long glTexStorage3D; + long glDrawTransformFeedbackInstanced; + long glDrawTransformFeedbackStreamInstanced; + long glDrawArraysInstancedBaseInstance; + long glDrawElementsInstancedBaseInstance; + long glDrawElementsInstancedBaseVertexBaseInstance; + long glBindImageTexture; + long glMemoryBarrier; + long glGetInternalformativ; + // GL43 + long glClearBufferData; + long glClearBufferSubData; + long glDispatchCompute; + long glDispatchComputeIndirect; + long glCopyImageSubData; + long glDebugMessageControl; + long glDebugMessageInsert; + long glDebugMessageCallback; + long glGetDebugMessageLog; + long glPushDebugGroup; + long glPopDebugGroup; + long glObjectLabel; + long glGetObjectLabel; + long glObjectPtrLabel; + long glGetObjectPtrLabel; + long glFramebufferParameteri; + long glGetFramebufferParameteriv; + long glGetInternalformati64v; + long glInvalidateTexSubImage; + long glInvalidateTexImage; + long glInvalidateBufferSubData; + long glInvalidateBufferData; + long glInvalidateFramebuffer; + long glInvalidateSubFramebuffer; + long glMultiDrawArraysIndirect; + long glMultiDrawElementsIndirect; + long glGetProgramInterfaceiv; + long glGetProgramResourceIndex; + long glGetProgramResourceName; + long glGetProgramResourceiv; + long glGetProgramResourceLocation; + long glGetProgramResourceLocationIndex; + long glShaderStorageBlockBinding; + long glTexBufferRange; + long glTexStorage2DMultisample; + long glTexStorage3DMultisample; + long glTextureView; + long glBindVertexBuffer; + long glVertexAttribFormat; + long glVertexAttribIFormat; + long glVertexAttribLFormat; + long glVertexAttribBinding; + long glVertexBindingDivisor; + // GL44 + long glBufferStorage; + long glClearTexImage; + long glClearTexSubImage; + long glBindBuffersBase; + long glBindBuffersRange; + long glBindTextures; + long glBindSamplers; + long glBindImageTextures; + long glBindVertexBuffers; + // GREMEDY_frame_terminator + long glFrameTerminatorGREMEDY; + // GREMEDY_string_marker + long glStringMarkerGREMEDY; + // INTEL_map_texture + long glMapTexture2DINTEL; + long glUnmapTexture2DINTEL; + long glSyncTextureINTEL; + // NV_bindless_multi_draw_indirect + long glMultiDrawArraysIndirectBindlessNV; + long glMultiDrawElementsIndirectBindlessNV; + // NV_bindless_texture + long glGetTextureHandleNV; + long glGetTextureSamplerHandleNV; + long glMakeTextureHandleResidentNV; + long glMakeTextureHandleNonResidentNV; + long glGetImageHandleNV; + long glMakeImageHandleResidentNV; + long glMakeImageHandleNonResidentNV; + long glUniformHandleui64NV; + long glUniformHandleui64vNV; + long glProgramUniformHandleui64NV; + long glProgramUniformHandleui64vNV; + long glIsTextureHandleResidentNV; + long glIsImageHandleResidentNV; + // NV_blend_equation_advanced + long glBlendParameteriNV; + long glBlendBarrierNV; + // NV_conditional_render + long glBeginConditionalRenderNV; + long glEndConditionalRenderNV; + // NV_copy_image + long glCopyImageSubDataNV; + // NV_depth_buffer_float + long glDepthRangedNV; + long glClearDepthdNV; + long glDepthBoundsdNV; + // NV_draw_texture + long glDrawTextureNV; + // NV_evaluators + long glGetMapControlPointsNV; + long glMapControlPointsNV; + long glMapParameterfvNV; + long glMapParameterivNV; + long glGetMapParameterfvNV; + long glGetMapParameterivNV; + long glGetMapAttribParameterfvNV; + long glGetMapAttribParameterivNV; + long glEvalMapsNV; + // NV_explicit_multisample + long glGetMultisamplefvNV; + long glSampleMaskIndexedNV; + long glTexRenderbufferNV; + // NV_fence + long glGenFencesNV; + long glDeleteFencesNV; + long glSetFenceNV; + long glTestFenceNV; + long glFinishFenceNV; + long glIsFenceNV; + long glGetFenceivNV; + // NV_fragment_program + long glProgramNamedParameter4fNV; + long glProgramNamedParameter4dNV; + long glGetProgramNamedParameterfvNV; + long glGetProgramNamedParameterdvNV; + // NV_framebuffer_multisample_coverage + long glRenderbufferStorageMultisampleCoverageNV; + // NV_geometry_program4 + long glProgramVertexLimitNV; + // NV_gpu_program4 + long glProgramLocalParameterI4iNV; + long glProgramLocalParameterI4ivNV; + long glProgramLocalParametersI4ivNV; + long glProgramLocalParameterI4uiNV; + long glProgramLocalParameterI4uivNV; + long glProgramLocalParametersI4uivNV; + long glProgramEnvParameterI4iNV; + long glProgramEnvParameterI4ivNV; + long glProgramEnvParametersI4ivNV; + long glProgramEnvParameterI4uiNV; + long glProgramEnvParameterI4uivNV; + long glProgramEnvParametersI4uivNV; + long glGetProgramLocalParameterIivNV; + long glGetProgramLocalParameterIuivNV; + long glGetProgramEnvParameterIivNV; + long glGetProgramEnvParameterIuivNV; + // NV_gpu_shader5 + long glUniform1i64NV; + long glUniform2i64NV; + long glUniform3i64NV; + long glUniform4i64NV; + long glUniform1i64vNV; + long glUniform2i64vNV; + long glUniform3i64vNV; + long glUniform4i64vNV; + long glUniform1ui64NV; + long glUniform2ui64NV; + long glUniform3ui64NV; + long glUniform4ui64NV; + long glUniform1ui64vNV; + long glUniform2ui64vNV; + long glUniform3ui64vNV; + long glUniform4ui64vNV; + long glGetUniformi64vNV; + long glGetUniformui64vNV; + long glProgramUniform1i64NV; + long glProgramUniform2i64NV; + long glProgramUniform3i64NV; + long glProgramUniform4i64NV; + long glProgramUniform1i64vNV; + long glProgramUniform2i64vNV; + long glProgramUniform3i64vNV; + long glProgramUniform4i64vNV; + long glProgramUniform1ui64NV; + long glProgramUniform2ui64NV; + long glProgramUniform3ui64NV; + long glProgramUniform4ui64NV; + long glProgramUniform1ui64vNV; + long glProgramUniform2ui64vNV; + long glProgramUniform3ui64vNV; + long glProgramUniform4ui64vNV; + // NV_half_float + long glVertex2hNV; + long glVertex3hNV; + long glVertex4hNV; + long glNormal3hNV; + long glColor3hNV; + long glColor4hNV; + long glTexCoord1hNV; + long glTexCoord2hNV; + long glTexCoord3hNV; + long glTexCoord4hNV; + long glMultiTexCoord1hNV; + long glMultiTexCoord2hNV; + long glMultiTexCoord3hNV; + long glMultiTexCoord4hNV; + long glFogCoordhNV; + long glSecondaryColor3hNV; + long glVertexWeighthNV; + long glVertexAttrib1hNV; + long glVertexAttrib2hNV; + long glVertexAttrib3hNV; + long glVertexAttrib4hNV; + long glVertexAttribs1hvNV; + long glVertexAttribs2hvNV; + long glVertexAttribs3hvNV; + long glVertexAttribs4hvNV; + // NV_occlusion_query + long glGenOcclusionQueriesNV; + long glDeleteOcclusionQueriesNV; + long glIsOcclusionQueryNV; + long glBeginOcclusionQueryNV; + long glEndOcclusionQueryNV; + long glGetOcclusionQueryuivNV; + long glGetOcclusionQueryivNV; + // NV_parameter_buffer_object + long glProgramBufferParametersfvNV; + long glProgramBufferParametersIivNV; + long glProgramBufferParametersIuivNV; + // NV_path_rendering + long glPathCommandsNV; + long glPathCoordsNV; + long glPathSubCommandsNV; + long glPathSubCoordsNV; + long glPathStringNV; + long glPathGlyphsNV; + long glPathGlyphRangeNV; + long glWeightPathsNV; + long glCopyPathNV; + long glInterpolatePathsNV; + long glTransformPathNV; + long glPathParameterivNV; + long glPathParameteriNV; + long glPathParameterfvNV; + long glPathParameterfNV; + long glPathDashArrayNV; + long glGenPathsNV; + long glDeletePathsNV; + long glIsPathNV; + long glPathStencilFuncNV; + long glPathStencilDepthOffsetNV; + long glStencilFillPathNV; + long glStencilStrokePathNV; + long glStencilFillPathInstancedNV; + long glStencilStrokePathInstancedNV; + long glPathCoverDepthFuncNV; + long glPathColorGenNV; + long glPathTexGenNV; + long glPathFogGenNV; + long glCoverFillPathNV; + long glCoverStrokePathNV; + long glCoverFillPathInstancedNV; + long glCoverStrokePathInstancedNV; + long glGetPathParameterivNV; + long glGetPathParameterfvNV; + long glGetPathCommandsNV; + long glGetPathCoordsNV; + long glGetPathDashArrayNV; + long glGetPathMetricsNV; + long glGetPathMetricRangeNV; + long glGetPathSpacingNV; + long glGetPathColorGenivNV; + long glGetPathColorGenfvNV; + long glGetPathTexGenivNV; + long glGetPathTexGenfvNV; + long glIsPointInFillPathNV; + long glIsPointInStrokePathNV; + long glGetPathLengthNV; + long glPointAlongPathNV; + // NV_pixel_data_range + long glPixelDataRangeNV; + long glFlushPixelDataRangeNV; + // NV_point_sprite + long glPointParameteriNV; + long glPointParameterivNV; + // NV_present_video + long glPresentFrameKeyedNV; + long glPresentFrameDualFillNV; + long glGetVideoivNV; + long glGetVideouivNV; + long glGetVideoi64vNV; + long glGetVideoui64vNV; + // NV_primitive_restart + long glPrimitiveRestartNV; + long glPrimitiveRestartIndexNV; + // NV_program + long glLoadProgramNV; + long glBindProgramNV; + long glDeleteProgramsNV; + long glGenProgramsNV; + long glGetProgramivNV; + long glGetProgramStringNV; + long glIsProgramNV; + long glAreProgramsResidentNV; + long glRequestResidentProgramsNV; + // NV_register_combiners + long glCombinerParameterfNV; + long glCombinerParameterfvNV; + long glCombinerParameteriNV; + long glCombinerParameterivNV; + long glCombinerInputNV; + long glCombinerOutputNV; + long glFinalCombinerInputNV; + long glGetCombinerInputParameterfvNV; + long glGetCombinerInputParameterivNV; + long glGetCombinerOutputParameterfvNV; + long glGetCombinerOutputParameterivNV; + long glGetFinalCombinerInputParameterfvNV; + long glGetFinalCombinerInputParameterivNV; + // NV_register_combiners2 + long glCombinerStageParameterfvNV; + long glGetCombinerStageParameterfvNV; + // NV_shader_buffer_load + long glMakeBufferResidentNV; + long glMakeBufferNonResidentNV; + long glIsBufferResidentNV; + long glMakeNamedBufferResidentNV; + long glMakeNamedBufferNonResidentNV; + long glIsNamedBufferResidentNV; + long glGetBufferParameterui64vNV; + long glGetNamedBufferParameterui64vNV; + long glGetIntegerui64vNV; + long glUniformui64NV; + long glUniformui64vNV; + long glProgramUniformui64NV; + long glProgramUniformui64vNV; + // NV_texture_barrier + long glTextureBarrierNV; + // NV_texture_multisample + long glTexImage2DMultisampleCoverageNV; + long glTexImage3DMultisampleCoverageNV; + long glTextureImage2DMultisampleNV; + long glTextureImage3DMultisampleNV; + long glTextureImage2DMultisampleCoverageNV; + long glTextureImage3DMultisampleCoverageNV; + // NV_transform_feedback + long glBindBufferRangeNV; + long glBindBufferOffsetNV; + long glBindBufferBaseNV; + long glTransformFeedbackAttribsNV; + long glTransformFeedbackVaryingsNV; + long glBeginTransformFeedbackNV; + long glEndTransformFeedbackNV; + long glGetVaryingLocationNV; + long glGetActiveVaryingNV; + long glActiveVaryingNV; + long glGetTransformFeedbackVaryingNV; + // NV_transform_feedback2 + long glBindTransformFeedbackNV; + long glDeleteTransformFeedbacksNV; + long glGenTransformFeedbacksNV; + long glIsTransformFeedbackNV; + long glPauseTransformFeedbackNV; + long glResumeTransformFeedbackNV; + long glDrawTransformFeedbackNV; + // NV_vertex_array_range + long glVertexArrayRangeNV; + long glFlushVertexArrayRangeNV; + long glAllocateMemoryNV; + long glFreeMemoryNV; + // NV_vertex_attrib_integer_64bit + long glVertexAttribL1i64NV; + long glVertexAttribL2i64NV; + long glVertexAttribL3i64NV; + long glVertexAttribL4i64NV; + long glVertexAttribL1i64vNV; + long glVertexAttribL2i64vNV; + long glVertexAttribL3i64vNV; + long glVertexAttribL4i64vNV; + long glVertexAttribL1ui64NV; + long glVertexAttribL2ui64NV; + long glVertexAttribL3ui64NV; + long glVertexAttribL4ui64NV; + long glVertexAttribL1ui64vNV; + long glVertexAttribL2ui64vNV; + long glVertexAttribL3ui64vNV; + long glVertexAttribL4ui64vNV; + long glGetVertexAttribLi64vNV; + long glGetVertexAttribLui64vNV; + long glVertexAttribLFormatNV; + // NV_vertex_buffer_unified_memory + long glBufferAddressRangeNV; + long glVertexFormatNV; + long glNormalFormatNV; + long glColorFormatNV; + long glIndexFormatNV; + long glTexCoordFormatNV; + long glEdgeFlagFormatNV; + long glSecondaryColorFormatNV; + long glFogCoordFormatNV; + long glVertexAttribFormatNV; + long glVertexAttribIFormatNV; + long glGetIntegerui64i_vNV; + // NV_vertex_program + long glExecuteProgramNV; + long glGetProgramParameterfvNV; + long glGetProgramParameterdvNV; + long glGetTrackMatrixivNV; + long glGetVertexAttribfvNV; + long glGetVertexAttribdvNV; + long glGetVertexAttribivNV; + long glGetVertexAttribPointervNV; + long glProgramParameter4fNV; + long glProgramParameter4dNV; + long glProgramParameters4fvNV; + long glProgramParameters4dvNV; + long glTrackMatrixNV; + long glVertexAttribPointerNV; + long glVertexAttrib1sNV; + long glVertexAttrib1fNV; + long glVertexAttrib1dNV; + long glVertexAttrib2sNV; + long glVertexAttrib2fNV; + long glVertexAttrib2dNV; + long glVertexAttrib3sNV; + long glVertexAttrib3fNV; + long glVertexAttrib3dNV; + long glVertexAttrib4sNV; + long glVertexAttrib4fNV; + long glVertexAttrib4dNV; + long glVertexAttrib4ubNV; + long glVertexAttribs1svNV; + long glVertexAttribs1fvNV; + long glVertexAttribs1dvNV; + long glVertexAttribs2svNV; + long glVertexAttribs2fvNV; + long glVertexAttribs2dvNV; + long glVertexAttribs3svNV; + long glVertexAttribs3fvNV; + long glVertexAttribs3dvNV; + long glVertexAttribs4svNV; + long glVertexAttribs4fvNV; + long glVertexAttribs4dvNV; + // NV_video_capture + long glBeginVideoCaptureNV; + long glBindVideoCaptureStreamBufferNV; + long glBindVideoCaptureStreamTextureNV; + long glEndVideoCaptureNV; + long glGetVideoCaptureivNV; + long glGetVideoCaptureStreamivNV; + long glGetVideoCaptureStreamfvNV; + long glGetVideoCaptureStreamdvNV; + long glVideoCaptureNV; + long glVideoCaptureStreamParameterivNV; + long glVideoCaptureStreamParameterfvNV; + long glVideoCaptureStreamParameterdvNV; + + private boolean AMD_debug_output_initNativeFunctionAddresses() { + return + (glDebugMessageEnableAMD = GLContext.getFunctionAddress(new String[] {"glDebugMessageEnableAMD","glDebugMessageEnableAMDX"})) != 0 & + (glDebugMessageInsertAMD = GLContext.getFunctionAddress(new String[] {"glDebugMessageInsertAMD","glDebugMessageInsertAMDX"})) != 0 & + (glDebugMessageCallbackAMD = GLContext.getFunctionAddress(new String[] {"glDebugMessageCallbackAMD","glDebugMessageCallbackAMDX"})) != 0 & + (glGetDebugMessageLogAMD = GLContext.getFunctionAddress(new String[] {"glGetDebugMessageLogAMD","glGetDebugMessageLogAMDX"})) != 0; + } + + private boolean AMD_draw_buffers_blend_initNativeFunctionAddresses() { + return + (glBlendFuncIndexedAMD = GLContext.getFunctionAddress("glBlendFuncIndexedAMD")) != 0 & + (glBlendFuncSeparateIndexedAMD = GLContext.getFunctionAddress("glBlendFuncSeparateIndexedAMD")) != 0 & + (glBlendEquationIndexedAMD = GLContext.getFunctionAddress("glBlendEquationIndexedAMD")) != 0 & + (glBlendEquationSeparateIndexedAMD = GLContext.getFunctionAddress("glBlendEquationSeparateIndexedAMD")) != 0; + } + + private boolean AMD_interleaved_elements_initNativeFunctionAddresses() { + return + (glVertexAttribParameteriAMD = GLContext.getFunctionAddress("glVertexAttribParameteriAMD")) != 0; + } + + private boolean AMD_multi_draw_indirect_initNativeFunctionAddresses() { + return + (glMultiDrawArraysIndirectAMD = GLContext.getFunctionAddress("glMultiDrawArraysIndirectAMD")) != 0 & + (glMultiDrawElementsIndirectAMD = GLContext.getFunctionAddress("glMultiDrawElementsIndirectAMD")) != 0; + } + + private boolean AMD_name_gen_delete_initNativeFunctionAddresses() { + return + (glGenNamesAMD = GLContext.getFunctionAddress("glGenNamesAMD")) != 0 & + (glDeleteNamesAMD = GLContext.getFunctionAddress("glDeleteNamesAMD")) != 0 & + (glIsNameAMD = GLContext.getFunctionAddress("glIsNameAMD")) != 0; + } + + private boolean AMD_performance_monitor_initNativeFunctionAddresses() { + return + (glGetPerfMonitorGroupsAMD = GLContext.getFunctionAddress("glGetPerfMonitorGroupsAMD")) != 0 & + (glGetPerfMonitorCountersAMD = GLContext.getFunctionAddress("glGetPerfMonitorCountersAMD")) != 0 & + (glGetPerfMonitorGroupStringAMD = GLContext.getFunctionAddress("glGetPerfMonitorGroupStringAMD")) != 0 & + (glGetPerfMonitorCounterStringAMD = GLContext.getFunctionAddress("glGetPerfMonitorCounterStringAMD")) != 0 & + (glGetPerfMonitorCounterInfoAMD = GLContext.getFunctionAddress("glGetPerfMonitorCounterInfoAMD")) != 0 & + (glGenPerfMonitorsAMD = GLContext.getFunctionAddress("glGenPerfMonitorsAMD")) != 0 & + (glDeletePerfMonitorsAMD = GLContext.getFunctionAddress("glDeletePerfMonitorsAMD")) != 0 & + (glSelectPerfMonitorCountersAMD = GLContext.getFunctionAddress("glSelectPerfMonitorCountersAMD")) != 0 & + (glBeginPerfMonitorAMD = GLContext.getFunctionAddress("glBeginPerfMonitorAMD")) != 0 & + (glEndPerfMonitorAMD = GLContext.getFunctionAddress("glEndPerfMonitorAMD")) != 0 & + (glGetPerfMonitorCounterDataAMD = GLContext.getFunctionAddress("glGetPerfMonitorCounterDataAMD")) != 0; + } + + private boolean AMD_sample_positions_initNativeFunctionAddresses() { + return + (glSetMultisamplefvAMD = GLContext.getFunctionAddress("glSetMultisamplefvAMD")) != 0; + } + + private boolean AMD_sparse_texture_initNativeFunctionAddresses() { + return + (glTexStorageSparseAMD = GLContext.getFunctionAddress("glTexStorageSparseAMD")) != 0 & + (glTextureStorageSparseAMD = GLContext.getFunctionAddress("glTextureStorageSparseAMD")) != 0; + } + + private boolean AMD_stencil_operation_extended_initNativeFunctionAddresses() { + return + (glStencilOpValueAMD = GLContext.getFunctionAddress("glStencilOpValueAMD")) != 0; + } + + private boolean AMD_vertex_shader_tessellator_initNativeFunctionAddresses() { + return + (glTessellationFactorAMD = GLContext.getFunctionAddress("glTessellationFactorAMD")) != 0 & + (glTessellationModeAMD = GLContext.getFunctionAddress("glTessellationModeAMD")) != 0; + } + + private boolean APPLE_element_array_initNativeFunctionAddresses() { + return + (glElementPointerAPPLE = GLContext.getFunctionAddress("glElementPointerAPPLE")) != 0 & + (glDrawElementArrayAPPLE = GLContext.getFunctionAddress("glDrawElementArrayAPPLE")) != 0 & + (glDrawRangeElementArrayAPPLE = GLContext.getFunctionAddress("glDrawRangeElementArrayAPPLE")) != 0 & + (glMultiDrawElementArrayAPPLE = GLContext.getFunctionAddress("glMultiDrawElementArrayAPPLE")) != 0 & + (glMultiDrawRangeElementArrayAPPLE = GLContext.getFunctionAddress("glMultiDrawRangeElementArrayAPPLE")) != 0; + } + + private boolean APPLE_fence_initNativeFunctionAddresses() { + return + (glGenFencesAPPLE = GLContext.getFunctionAddress("glGenFencesAPPLE")) != 0 & + (glDeleteFencesAPPLE = GLContext.getFunctionAddress("glDeleteFencesAPPLE")) != 0 & + (glSetFenceAPPLE = GLContext.getFunctionAddress("glSetFenceAPPLE")) != 0 & + (glIsFenceAPPLE = GLContext.getFunctionAddress("glIsFenceAPPLE")) != 0 & + (glTestFenceAPPLE = GLContext.getFunctionAddress("glTestFenceAPPLE")) != 0 & + (glFinishFenceAPPLE = GLContext.getFunctionAddress("glFinishFenceAPPLE")) != 0 & + (glTestObjectAPPLE = GLContext.getFunctionAddress("glTestObjectAPPLE")) != 0 & + (glFinishObjectAPPLE = GLContext.getFunctionAddress("glFinishObjectAPPLE")) != 0; + } + + private boolean APPLE_flush_buffer_range_initNativeFunctionAddresses() { + return + (glBufferParameteriAPPLE = GLContext.getFunctionAddress("glBufferParameteriAPPLE")) != 0 & + (glFlushMappedBufferRangeAPPLE = GLContext.getFunctionAddress("glFlushMappedBufferRangeAPPLE")) != 0; + } + + private boolean APPLE_object_purgeable_initNativeFunctionAddresses() { + return + (glObjectPurgeableAPPLE = GLContext.getFunctionAddress("glObjectPurgeableAPPLE")) != 0 & + (glObjectUnpurgeableAPPLE = GLContext.getFunctionAddress("glObjectUnpurgeableAPPLE")) != 0 & + (glGetObjectParameterivAPPLE = GLContext.getFunctionAddress("glGetObjectParameterivAPPLE")) != 0; + } + + private boolean APPLE_texture_range_initNativeFunctionAddresses() { + return + (glTextureRangeAPPLE = GLContext.getFunctionAddress("glTextureRangeAPPLE")) != 0 & + (glGetTexParameterPointervAPPLE = GLContext.getFunctionAddress("glGetTexParameterPointervAPPLE")) != 0; + } + + private boolean APPLE_vertex_array_object_initNativeFunctionAddresses() { + return + (glBindVertexArrayAPPLE = GLContext.getFunctionAddress("glBindVertexArrayAPPLE")) != 0 & + (glDeleteVertexArraysAPPLE = GLContext.getFunctionAddress("glDeleteVertexArraysAPPLE")) != 0 & + (glGenVertexArraysAPPLE = GLContext.getFunctionAddress("glGenVertexArraysAPPLE")) != 0 & + (glIsVertexArrayAPPLE = GLContext.getFunctionAddress("glIsVertexArrayAPPLE")) != 0; + } + + private boolean APPLE_vertex_array_range_initNativeFunctionAddresses() { + return + (glVertexArrayRangeAPPLE = GLContext.getFunctionAddress("glVertexArrayRangeAPPLE")) != 0 & + (glFlushVertexArrayRangeAPPLE = GLContext.getFunctionAddress("glFlushVertexArrayRangeAPPLE")) != 0 & + (glVertexArrayParameteriAPPLE = GLContext.getFunctionAddress("glVertexArrayParameteriAPPLE")) != 0; + } + + private boolean APPLE_vertex_program_evaluators_initNativeFunctionAddresses() { + return + (glEnableVertexAttribAPPLE = GLContext.getFunctionAddress("glEnableVertexAttribAPPLE")) != 0 & + (glDisableVertexAttribAPPLE = GLContext.getFunctionAddress("glDisableVertexAttribAPPLE")) != 0 & + (glIsVertexAttribEnabledAPPLE = GLContext.getFunctionAddress("glIsVertexAttribEnabledAPPLE")) != 0 & + (glMapVertexAttrib1dAPPLE = GLContext.getFunctionAddress("glMapVertexAttrib1dAPPLE")) != 0 & + (glMapVertexAttrib1fAPPLE = GLContext.getFunctionAddress("glMapVertexAttrib1fAPPLE")) != 0 & + (glMapVertexAttrib2dAPPLE = GLContext.getFunctionAddress("glMapVertexAttrib2dAPPLE")) != 0 & + (glMapVertexAttrib2fAPPLE = GLContext.getFunctionAddress("glMapVertexAttrib2fAPPLE")) != 0; + } + + private boolean ARB_ES2_compatibility_initNativeFunctionAddresses() { + return + (glReleaseShaderCompiler = GLContext.getFunctionAddress("glReleaseShaderCompiler")) != 0 & + (glShaderBinary = GLContext.getFunctionAddress("glShaderBinary")) != 0 & + (glGetShaderPrecisionFormat = GLContext.getFunctionAddress("glGetShaderPrecisionFormat")) != 0 & + (glDepthRangef = GLContext.getFunctionAddress("glDepthRangef")) != 0 & + (glClearDepthf = GLContext.getFunctionAddress("glClearDepthf")) != 0; + } + + private boolean ARB_base_instance_initNativeFunctionAddresses() { + return + (glDrawArraysInstancedBaseInstance = GLContext.getFunctionAddress("glDrawArraysInstancedBaseInstance")) != 0 & + (glDrawElementsInstancedBaseInstance = GLContext.getFunctionAddress("glDrawElementsInstancedBaseInstance")) != 0 & + (glDrawElementsInstancedBaseVertexBaseInstance = GLContext.getFunctionAddress("glDrawElementsInstancedBaseVertexBaseInstance")) != 0; + } + + private boolean ARB_bindless_texture_initNativeFunctionAddresses() { + return + (glGetTextureHandleARB = GLContext.getFunctionAddress("glGetTextureHandleARB")) != 0 & + (glGetTextureSamplerHandleARB = GLContext.getFunctionAddress("glGetTextureSamplerHandleARB")) != 0 & + (glMakeTextureHandleResidentARB = GLContext.getFunctionAddress("glMakeTextureHandleResidentARB")) != 0 & + (glMakeTextureHandleNonResidentARB = GLContext.getFunctionAddress("glMakeTextureHandleNonResidentARB")) != 0 & + (glGetImageHandleARB = GLContext.getFunctionAddress("glGetImageHandleARB")) != 0 & + (glMakeImageHandleResidentARB = GLContext.getFunctionAddress("glMakeImageHandleResidentARB")) != 0 & + (glMakeImageHandleNonResidentARB = GLContext.getFunctionAddress("glMakeImageHandleNonResidentARB")) != 0 & + (glUniformHandleui64ARB = GLContext.getFunctionAddress("glUniformHandleui64ARB")) != 0 & + (glUniformHandleui64vARB = GLContext.getFunctionAddress("glUniformHandleui64vARB")) != 0 & + (glProgramUniformHandleui64ARB = GLContext.getFunctionAddress("glProgramUniformHandleui64ARB")) != 0 & + (glProgramUniformHandleui64vARB = GLContext.getFunctionAddress("glProgramUniformHandleui64vARB")) != 0 & + (glIsTextureHandleResidentARB = GLContext.getFunctionAddress("glIsTextureHandleResidentARB")) != 0 & + (glIsImageHandleResidentARB = GLContext.getFunctionAddress("glIsImageHandleResidentARB")) != 0 & + (glVertexAttribL1ui64ARB = GLContext.getFunctionAddress("glVertexAttribL1ui64ARB")) != 0 & + (glVertexAttribL1ui64vARB = GLContext.getFunctionAddress("glVertexAttribL1ui64vARB")) != 0 & + (glGetVertexAttribLui64vARB = GLContext.getFunctionAddress("glGetVertexAttribLui64vARB")) != 0; + } + + private boolean ARB_blend_func_extended_initNativeFunctionAddresses() { + return + (glBindFragDataLocationIndexed = GLContext.getFunctionAddress("glBindFragDataLocationIndexed")) != 0 & + (glGetFragDataIndex = GLContext.getFunctionAddress("glGetFragDataIndex")) != 0; + } + + private boolean ARB_buffer_object_initNativeFunctionAddresses() { + return + (glBindBufferARB = GLContext.getFunctionAddress("glBindBufferARB")) != 0 & + (glDeleteBuffersARB = GLContext.getFunctionAddress("glDeleteBuffersARB")) != 0 & + (glGenBuffersARB = GLContext.getFunctionAddress("glGenBuffersARB")) != 0 & + (glIsBufferARB = GLContext.getFunctionAddress("glIsBufferARB")) != 0 & + (glBufferDataARB = GLContext.getFunctionAddress("glBufferDataARB")) != 0 & + (glBufferSubDataARB = GLContext.getFunctionAddress("glBufferSubDataARB")) != 0 & + (glGetBufferSubDataARB = GLContext.getFunctionAddress("glGetBufferSubDataARB")) != 0 & + (glMapBufferARB = GLContext.getFunctionAddress("glMapBufferARB")) != 0 & + (glUnmapBufferARB = GLContext.getFunctionAddress("glUnmapBufferARB")) != 0 & + (glGetBufferParameterivARB = GLContext.getFunctionAddress("glGetBufferParameterivARB")) != 0 & + (glGetBufferPointervARB = GLContext.getFunctionAddress("glGetBufferPointervARB")) != 0; + } + + private boolean ARB_buffer_storage_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glBufferStorage = GLContext.getFunctionAddress("glBufferStorage")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glNamedBufferStorageEXT = GLContext.getFunctionAddress("glNamedBufferStorageEXT")) != 0); + } + + private boolean ARB_cl_event_initNativeFunctionAddresses() { + return + (glCreateSyncFromCLeventARB = GLContext.getFunctionAddress("glCreateSyncFromCLeventARB")) != 0; + } + + private boolean ARB_clear_buffer_object_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glClearBufferData = GLContext.getFunctionAddress("glClearBufferData")) != 0 & + (glClearBufferSubData = GLContext.getFunctionAddress("glClearBufferSubData")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glClearNamedBufferDataEXT = GLContext.getFunctionAddress("glClearNamedBufferDataEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glClearNamedBufferSubDataEXT = GLContext.getFunctionAddress("glClearNamedBufferSubDataEXT")) != 0); + } + + private boolean ARB_clear_texture_initNativeFunctionAddresses() { + return + (glClearTexImage = GLContext.getFunctionAddress("glClearTexImage")) != 0 & + (glClearTexSubImage = GLContext.getFunctionAddress("glClearTexSubImage")) != 0; + } + + private boolean ARB_color_buffer_float_initNativeFunctionAddresses() { + return + (glClampColorARB = GLContext.getFunctionAddress("glClampColorARB")) != 0; + } + + private boolean ARB_compute_shader_initNativeFunctionAddresses() { + return + (glDispatchCompute = GLContext.getFunctionAddress("glDispatchCompute")) != 0 & + (glDispatchComputeIndirect = GLContext.getFunctionAddress("glDispatchComputeIndirect")) != 0; + } + + private boolean ARB_compute_variable_group_size_initNativeFunctionAddresses() { + return + (glDispatchComputeGroupSizeARB = GLContext.getFunctionAddress("glDispatchComputeGroupSizeARB")) != 0; + } + + private boolean ARB_copy_buffer_initNativeFunctionAddresses() { + return + (glCopyBufferSubData = GLContext.getFunctionAddress("glCopyBufferSubData")) != 0; + } + + private boolean ARB_copy_image_initNativeFunctionAddresses() { + return + (glCopyImageSubData = GLContext.getFunctionAddress("glCopyImageSubData")) != 0; + } + + private boolean ARB_debug_output_initNativeFunctionAddresses() { + return + (glDebugMessageControlARB = GLContext.getFunctionAddress("glDebugMessageControlARB")) != 0 & + (glDebugMessageInsertARB = GLContext.getFunctionAddress("glDebugMessageInsertARB")) != 0 & + (glDebugMessageCallbackARB = GLContext.getFunctionAddress("glDebugMessageCallbackARB")) != 0 & + (glGetDebugMessageLogARB = GLContext.getFunctionAddress("glGetDebugMessageLogARB")) != 0; + } + + private boolean ARB_draw_buffers_initNativeFunctionAddresses() { + return + (glDrawBuffersARB = GLContext.getFunctionAddress("glDrawBuffersARB")) != 0; + } + + private boolean ARB_draw_buffers_blend_initNativeFunctionAddresses() { + return + (glBlendEquationiARB = GLContext.getFunctionAddress("glBlendEquationiARB")) != 0 & + (glBlendEquationSeparateiARB = GLContext.getFunctionAddress("glBlendEquationSeparateiARB")) != 0 & + (glBlendFunciARB = GLContext.getFunctionAddress("glBlendFunciARB")) != 0 & + (glBlendFuncSeparateiARB = GLContext.getFunctionAddress("glBlendFuncSeparateiARB")) != 0; + } + + private boolean ARB_draw_elements_base_vertex_initNativeFunctionAddresses() { + return + (glDrawElementsBaseVertex = GLContext.getFunctionAddress("glDrawElementsBaseVertex")) != 0 & + (glDrawRangeElementsBaseVertex = GLContext.getFunctionAddress("glDrawRangeElementsBaseVertex")) != 0 & + (glDrawElementsInstancedBaseVertex = GLContext.getFunctionAddress("glDrawElementsInstancedBaseVertex")) != 0; + } + + private boolean ARB_draw_indirect_initNativeFunctionAddresses() { + return + (glDrawArraysIndirect = GLContext.getFunctionAddress("glDrawArraysIndirect")) != 0 & + (glDrawElementsIndirect = GLContext.getFunctionAddress("glDrawElementsIndirect")) != 0; + } + + private boolean ARB_draw_instanced_initNativeFunctionAddresses() { + return + (glDrawArraysInstancedARB = GLContext.getFunctionAddress("glDrawArraysInstancedARB")) != 0 & + (glDrawElementsInstancedARB = GLContext.getFunctionAddress("glDrawElementsInstancedARB")) != 0; + } + + private boolean ARB_framebuffer_no_attachments_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glFramebufferParameteri = GLContext.getFunctionAddress("glFramebufferParameteri")) != 0 & + (glGetFramebufferParameteriv = GLContext.getFunctionAddress("glGetFramebufferParameteriv")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glNamedFramebufferParameteriEXT = GLContext.getFunctionAddress("glNamedFramebufferParameteriEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glGetNamedFramebufferParameterivEXT = GLContext.getFunctionAddress("glGetNamedFramebufferParameterivEXT")) != 0); + } + + private boolean ARB_framebuffer_object_initNativeFunctionAddresses() { + return + (glIsRenderbuffer = GLContext.getFunctionAddress("glIsRenderbuffer")) != 0 & + (glBindRenderbuffer = GLContext.getFunctionAddress("glBindRenderbuffer")) != 0 & + (glDeleteRenderbuffers = GLContext.getFunctionAddress("glDeleteRenderbuffers")) != 0 & + (glGenRenderbuffers = GLContext.getFunctionAddress("glGenRenderbuffers")) != 0 & + (glRenderbufferStorage = GLContext.getFunctionAddress("glRenderbufferStorage")) != 0 & + (glRenderbufferStorageMultisample = GLContext.getFunctionAddress("glRenderbufferStorageMultisample")) != 0 & + (glGetRenderbufferParameteriv = GLContext.getFunctionAddress("glGetRenderbufferParameteriv")) != 0 & + (glIsFramebuffer = GLContext.getFunctionAddress("glIsFramebuffer")) != 0 & + (glBindFramebuffer = GLContext.getFunctionAddress("glBindFramebuffer")) != 0 & + (glDeleteFramebuffers = GLContext.getFunctionAddress("glDeleteFramebuffers")) != 0 & + (glGenFramebuffers = GLContext.getFunctionAddress("glGenFramebuffers")) != 0 & + (glCheckFramebufferStatus = GLContext.getFunctionAddress("glCheckFramebufferStatus")) != 0 & + (glFramebufferTexture1D = GLContext.getFunctionAddress("glFramebufferTexture1D")) != 0 & + (glFramebufferTexture2D = GLContext.getFunctionAddress("glFramebufferTexture2D")) != 0 & + (glFramebufferTexture3D = GLContext.getFunctionAddress("glFramebufferTexture3D")) != 0 & + (glFramebufferTextureLayer = GLContext.getFunctionAddress("glFramebufferTextureLayer")) != 0 & + (glFramebufferRenderbuffer = GLContext.getFunctionAddress("glFramebufferRenderbuffer")) != 0 & + (glGetFramebufferAttachmentParameteriv = GLContext.getFunctionAddress("glGetFramebufferAttachmentParameteriv")) != 0 & + (glBlitFramebuffer = GLContext.getFunctionAddress("glBlitFramebuffer")) != 0 & + (glGenerateMipmap = GLContext.getFunctionAddress("glGenerateMipmap")) != 0; + } + + private boolean ARB_geometry_shader4_initNativeFunctionAddresses() { + return + (glProgramParameteriARB = GLContext.getFunctionAddress("glProgramParameteriARB")) != 0 & + (glFramebufferTextureARB = GLContext.getFunctionAddress("glFramebufferTextureARB")) != 0 & + (glFramebufferTextureLayerARB = GLContext.getFunctionAddress("glFramebufferTextureLayerARB")) != 0 & + (glFramebufferTextureFaceARB = GLContext.getFunctionAddress("glFramebufferTextureFaceARB")) != 0; + } + + private boolean ARB_get_program_binary_initNativeFunctionAddresses() { + return + (glGetProgramBinary = GLContext.getFunctionAddress("glGetProgramBinary")) != 0 & + (glProgramBinary = GLContext.getFunctionAddress("glProgramBinary")) != 0 & + (glProgramParameteri = GLContext.getFunctionAddress("glProgramParameteri")) != 0; + } + + private boolean ARB_gpu_shader_fp64_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glUniform1d = GLContext.getFunctionAddress("glUniform1d")) != 0 & + (glUniform2d = GLContext.getFunctionAddress("glUniform2d")) != 0 & + (glUniform3d = GLContext.getFunctionAddress("glUniform3d")) != 0 & + (glUniform4d = GLContext.getFunctionAddress("glUniform4d")) != 0 & + (glUniform1dv = GLContext.getFunctionAddress("glUniform1dv")) != 0 & + (glUniform2dv = GLContext.getFunctionAddress("glUniform2dv")) != 0 & + (glUniform3dv = GLContext.getFunctionAddress("glUniform3dv")) != 0 & + (glUniform4dv = GLContext.getFunctionAddress("glUniform4dv")) != 0 & + (glUniformMatrix2dv = GLContext.getFunctionAddress("glUniformMatrix2dv")) != 0 & + (glUniformMatrix3dv = GLContext.getFunctionAddress("glUniformMatrix3dv")) != 0 & + (glUniformMatrix4dv = GLContext.getFunctionAddress("glUniformMatrix4dv")) != 0 & + (glUniformMatrix2x3dv = GLContext.getFunctionAddress("glUniformMatrix2x3dv")) != 0 & + (glUniformMatrix2x4dv = GLContext.getFunctionAddress("glUniformMatrix2x4dv")) != 0 & + (glUniformMatrix3x2dv = GLContext.getFunctionAddress("glUniformMatrix3x2dv")) != 0 & + (glUniformMatrix3x4dv = GLContext.getFunctionAddress("glUniformMatrix3x4dv")) != 0 & + (glUniformMatrix4x2dv = GLContext.getFunctionAddress("glUniformMatrix4x2dv")) != 0 & + (glUniformMatrix4x3dv = GLContext.getFunctionAddress("glUniformMatrix4x3dv")) != 0 & + (glGetUniformdv = GLContext.getFunctionAddress("glGetUniformdv")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1dEXT = GLContext.getFunctionAddress("glProgramUniform1dEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2dEXT = GLContext.getFunctionAddress("glProgramUniform2dEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3dEXT = GLContext.getFunctionAddress("glProgramUniform3dEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4dEXT = GLContext.getFunctionAddress("glProgramUniform4dEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1dvEXT = GLContext.getFunctionAddress("glProgramUniform1dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2dvEXT = GLContext.getFunctionAddress("glProgramUniform2dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3dvEXT = GLContext.getFunctionAddress("glProgramUniform3dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4dvEXT = GLContext.getFunctionAddress("glProgramUniform4dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix2dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix3dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix4dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix2x3dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2x3dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix2x4dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2x4dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix3x2dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3x2dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix3x4dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3x4dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix4x2dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4x2dvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniformMatrix4x3dvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4x3dvEXT")) != 0); + } + + private boolean ARB_imaging_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (forwardCompatible || (glColorTable = GLContext.getFunctionAddress("glColorTable")) != 0) & + (forwardCompatible || (glColorSubTable = GLContext.getFunctionAddress("glColorSubTable")) != 0) & + (forwardCompatible || (glColorTableParameteriv = GLContext.getFunctionAddress("glColorTableParameteriv")) != 0) & + (forwardCompatible || (glColorTableParameterfv = GLContext.getFunctionAddress("glColorTableParameterfv")) != 0) & + (forwardCompatible || (glCopyColorSubTable = GLContext.getFunctionAddress("glCopyColorSubTable")) != 0) & + (forwardCompatible || (glCopyColorTable = GLContext.getFunctionAddress("glCopyColorTable")) != 0) & + (forwardCompatible || (glGetColorTable = GLContext.getFunctionAddress("glGetColorTable")) != 0) & + (forwardCompatible || (glGetColorTableParameteriv = GLContext.getFunctionAddress("glGetColorTableParameteriv")) != 0) & + (forwardCompatible || (glGetColorTableParameterfv = GLContext.getFunctionAddress("glGetColorTableParameterfv")) != 0) & + (glBlendEquation = GLContext.getFunctionAddress("glBlendEquation")) != 0 & + (glBlendColor = GLContext.getFunctionAddress("glBlendColor")) != 0 & + (forwardCompatible || (glHistogram = GLContext.getFunctionAddress("glHistogram")) != 0) & + (forwardCompatible || (glResetHistogram = GLContext.getFunctionAddress("glResetHistogram")) != 0) & + (forwardCompatible || (glGetHistogram = GLContext.getFunctionAddress("glGetHistogram")) != 0) & + (forwardCompatible || (glGetHistogramParameterfv = GLContext.getFunctionAddress("glGetHistogramParameterfv")) != 0) & + (forwardCompatible || (glGetHistogramParameteriv = GLContext.getFunctionAddress("glGetHistogramParameteriv")) != 0) & + (forwardCompatible || (glMinmax = GLContext.getFunctionAddress("glMinmax")) != 0) & + (forwardCompatible || (glResetMinmax = GLContext.getFunctionAddress("glResetMinmax")) != 0) & + (forwardCompatible || (glGetMinmax = GLContext.getFunctionAddress("glGetMinmax")) != 0) & + (forwardCompatible || (glGetMinmaxParameterfv = GLContext.getFunctionAddress("glGetMinmaxParameterfv")) != 0) & + (forwardCompatible || (glGetMinmaxParameteriv = GLContext.getFunctionAddress("glGetMinmaxParameteriv")) != 0) & + (forwardCompatible || (glConvolutionFilter1D = GLContext.getFunctionAddress("glConvolutionFilter1D")) != 0) & + (forwardCompatible || (glConvolutionFilter2D = GLContext.getFunctionAddress("glConvolutionFilter2D")) != 0) & + (forwardCompatible || (glConvolutionParameterf = GLContext.getFunctionAddress("glConvolutionParameterf")) != 0) & + (forwardCompatible || (glConvolutionParameterfv = GLContext.getFunctionAddress("glConvolutionParameterfv")) != 0) & + (forwardCompatible || (glConvolutionParameteri = GLContext.getFunctionAddress("glConvolutionParameteri")) != 0) & + (forwardCompatible || (glConvolutionParameteriv = GLContext.getFunctionAddress("glConvolutionParameteriv")) != 0) & + (forwardCompatible || (glCopyConvolutionFilter1D = GLContext.getFunctionAddress("glCopyConvolutionFilter1D")) != 0) & + (forwardCompatible || (glCopyConvolutionFilter2D = GLContext.getFunctionAddress("glCopyConvolutionFilter2D")) != 0) & + (forwardCompatible || (glGetConvolutionFilter = GLContext.getFunctionAddress("glGetConvolutionFilter")) != 0) & + (forwardCompatible || (glGetConvolutionParameterfv = GLContext.getFunctionAddress("glGetConvolutionParameterfv")) != 0) & + (forwardCompatible || (glGetConvolutionParameteriv = GLContext.getFunctionAddress("glGetConvolutionParameteriv")) != 0) & + (forwardCompatible || (glSeparableFilter2D = GLContext.getFunctionAddress("glSeparableFilter2D")) != 0) & + (forwardCompatible || (glGetSeparableFilter = GLContext.getFunctionAddress("glGetSeparableFilter")) != 0); + } + + private boolean ARB_indirect_parameters_initNativeFunctionAddresses() { + return + (glMultiDrawArraysIndirectCountARB = GLContext.getFunctionAddress("glMultiDrawArraysIndirectCountARB")) != 0 & + (glMultiDrawElementsIndirectCountARB = GLContext.getFunctionAddress("glMultiDrawElementsIndirectCountARB")) != 0; + } + + private boolean ARB_instanced_arrays_initNativeFunctionAddresses() { + return + (glVertexAttribDivisorARB = GLContext.getFunctionAddress("glVertexAttribDivisorARB")) != 0; + } + + private boolean ARB_internalformat_query_initNativeFunctionAddresses() { + return + (glGetInternalformativ = GLContext.getFunctionAddress("glGetInternalformativ")) != 0; + } + + private boolean ARB_internalformat_query2_initNativeFunctionAddresses() { + return + (glGetInternalformati64v = GLContext.getFunctionAddress("glGetInternalformati64v")) != 0; + } + + private boolean ARB_invalidate_subdata_initNativeFunctionAddresses() { + return + (glInvalidateTexSubImage = GLContext.getFunctionAddress("glInvalidateTexSubImage")) != 0 & + (glInvalidateTexImage = GLContext.getFunctionAddress("glInvalidateTexImage")) != 0 & + (glInvalidateBufferSubData = GLContext.getFunctionAddress("glInvalidateBufferSubData")) != 0 & + (glInvalidateBufferData = GLContext.getFunctionAddress("glInvalidateBufferData")) != 0 & + (glInvalidateFramebuffer = GLContext.getFunctionAddress("glInvalidateFramebuffer")) != 0 & + (glInvalidateSubFramebuffer = GLContext.getFunctionAddress("glInvalidateSubFramebuffer")) != 0; + } + + private boolean ARB_map_buffer_range_initNativeFunctionAddresses() { + return + (glMapBufferRange = GLContext.getFunctionAddress("glMapBufferRange")) != 0 & + (glFlushMappedBufferRange = GLContext.getFunctionAddress("glFlushMappedBufferRange")) != 0; + } + + private boolean ARB_matrix_palette_initNativeFunctionAddresses() { + return + (glCurrentPaletteMatrixARB = GLContext.getFunctionAddress("glCurrentPaletteMatrixARB")) != 0 & + (glMatrixIndexPointerARB = GLContext.getFunctionAddress("glMatrixIndexPointerARB")) != 0 & + (glMatrixIndexubvARB = GLContext.getFunctionAddress("glMatrixIndexubvARB")) != 0 & + (glMatrixIndexusvARB = GLContext.getFunctionAddress("glMatrixIndexusvARB")) != 0 & + (glMatrixIndexuivARB = GLContext.getFunctionAddress("glMatrixIndexuivARB")) != 0; + } + + private boolean ARB_multi_bind_initNativeFunctionAddresses() { + return + (glBindBuffersBase = GLContext.getFunctionAddress("glBindBuffersBase")) != 0 & + (glBindBuffersRange = GLContext.getFunctionAddress("glBindBuffersRange")) != 0 & + (glBindTextures = GLContext.getFunctionAddress("glBindTextures")) != 0 & + (glBindSamplers = GLContext.getFunctionAddress("glBindSamplers")) != 0 & + (glBindImageTextures = GLContext.getFunctionAddress("glBindImageTextures")) != 0 & + (glBindVertexBuffers = GLContext.getFunctionAddress("glBindVertexBuffers")) != 0; + } + + private boolean ARB_multi_draw_indirect_initNativeFunctionAddresses() { + return + (glMultiDrawArraysIndirect = GLContext.getFunctionAddress("glMultiDrawArraysIndirect")) != 0 & + (glMultiDrawElementsIndirect = GLContext.getFunctionAddress("glMultiDrawElementsIndirect")) != 0; + } + + private boolean ARB_multisample_initNativeFunctionAddresses() { + return + (glSampleCoverageARB = GLContext.getFunctionAddress("glSampleCoverageARB")) != 0; + } + + private boolean ARB_multitexture_initNativeFunctionAddresses() { + return + (glClientActiveTextureARB = GLContext.getFunctionAddress("glClientActiveTextureARB")) != 0 & + (glActiveTextureARB = GLContext.getFunctionAddress("glActiveTextureARB")) != 0 & + (glMultiTexCoord1fARB = GLContext.getFunctionAddress("glMultiTexCoord1fARB")) != 0 & + (glMultiTexCoord1dARB = GLContext.getFunctionAddress("glMultiTexCoord1dARB")) != 0 & + (glMultiTexCoord1iARB = GLContext.getFunctionAddress("glMultiTexCoord1iARB")) != 0 & + (glMultiTexCoord1sARB = GLContext.getFunctionAddress("glMultiTexCoord1sARB")) != 0 & + (glMultiTexCoord2fARB = GLContext.getFunctionAddress("glMultiTexCoord2fARB")) != 0 & + (glMultiTexCoord2dARB = GLContext.getFunctionAddress("glMultiTexCoord2dARB")) != 0 & + (glMultiTexCoord2iARB = GLContext.getFunctionAddress("glMultiTexCoord2iARB")) != 0 & + (glMultiTexCoord2sARB = GLContext.getFunctionAddress("glMultiTexCoord2sARB")) != 0 & + (glMultiTexCoord3fARB = GLContext.getFunctionAddress("glMultiTexCoord3fARB")) != 0 & + (glMultiTexCoord3dARB = GLContext.getFunctionAddress("glMultiTexCoord3dARB")) != 0 & + (glMultiTexCoord3iARB = GLContext.getFunctionAddress("glMultiTexCoord3iARB")) != 0 & + (glMultiTexCoord3sARB = GLContext.getFunctionAddress("glMultiTexCoord3sARB")) != 0 & + (glMultiTexCoord4fARB = GLContext.getFunctionAddress("glMultiTexCoord4fARB")) != 0 & + (glMultiTexCoord4dARB = GLContext.getFunctionAddress("glMultiTexCoord4dARB")) != 0 & + (glMultiTexCoord4iARB = GLContext.getFunctionAddress("glMultiTexCoord4iARB")) != 0 & + (glMultiTexCoord4sARB = GLContext.getFunctionAddress("glMultiTexCoord4sARB")) != 0; + } + + private boolean ARB_occlusion_query_initNativeFunctionAddresses() { + return + (glGenQueriesARB = GLContext.getFunctionAddress("glGenQueriesARB")) != 0 & + (glDeleteQueriesARB = GLContext.getFunctionAddress("glDeleteQueriesARB")) != 0 & + (glIsQueryARB = GLContext.getFunctionAddress("glIsQueryARB")) != 0 & + (glBeginQueryARB = GLContext.getFunctionAddress("glBeginQueryARB")) != 0 & + (glEndQueryARB = GLContext.getFunctionAddress("glEndQueryARB")) != 0 & + (glGetQueryivARB = GLContext.getFunctionAddress("glGetQueryivARB")) != 0 & + (glGetQueryObjectivARB = GLContext.getFunctionAddress("glGetQueryObjectivARB")) != 0 & + (glGetQueryObjectuivARB = GLContext.getFunctionAddress("glGetQueryObjectuivARB")) != 0; + } + + private boolean ARB_point_parameters_initNativeFunctionAddresses() { + return + (glPointParameterfARB = GLContext.getFunctionAddress("glPointParameterfARB")) != 0 & + (glPointParameterfvARB = GLContext.getFunctionAddress("glPointParameterfvARB")) != 0; + } + + private boolean ARB_program_initNativeFunctionAddresses() { + return + (glProgramStringARB = GLContext.getFunctionAddress("glProgramStringARB")) != 0 & + (glBindProgramARB = GLContext.getFunctionAddress("glBindProgramARB")) != 0 & + (glDeleteProgramsARB = GLContext.getFunctionAddress("glDeleteProgramsARB")) != 0 & + (glGenProgramsARB = GLContext.getFunctionAddress("glGenProgramsARB")) != 0 & + (glProgramEnvParameter4fARB = GLContext.getFunctionAddress("glProgramEnvParameter4fARB")) != 0 & + (glProgramEnvParameter4dARB = GLContext.getFunctionAddress("glProgramEnvParameter4dARB")) != 0 & + (glProgramEnvParameter4fvARB = GLContext.getFunctionAddress("glProgramEnvParameter4fvARB")) != 0 & + (glProgramEnvParameter4dvARB = GLContext.getFunctionAddress("glProgramEnvParameter4dvARB")) != 0 & + (glProgramLocalParameter4fARB = GLContext.getFunctionAddress("glProgramLocalParameter4fARB")) != 0 & + (glProgramLocalParameter4dARB = GLContext.getFunctionAddress("glProgramLocalParameter4dARB")) != 0 & + (glProgramLocalParameter4fvARB = GLContext.getFunctionAddress("glProgramLocalParameter4fvARB")) != 0 & + (glProgramLocalParameter4dvARB = GLContext.getFunctionAddress("glProgramLocalParameter4dvARB")) != 0 & + (glGetProgramEnvParameterfvARB = GLContext.getFunctionAddress("glGetProgramEnvParameterfvARB")) != 0 & + (glGetProgramEnvParameterdvARB = GLContext.getFunctionAddress("glGetProgramEnvParameterdvARB")) != 0 & + (glGetProgramLocalParameterfvARB = GLContext.getFunctionAddress("glGetProgramLocalParameterfvARB")) != 0 & + (glGetProgramLocalParameterdvARB = GLContext.getFunctionAddress("glGetProgramLocalParameterdvARB")) != 0 & + (glGetProgramivARB = GLContext.getFunctionAddress("glGetProgramivARB")) != 0 & + (glGetProgramStringARB = GLContext.getFunctionAddress("glGetProgramStringARB")) != 0 & + (glIsProgramARB = GLContext.getFunctionAddress("glIsProgramARB")) != 0; + } + + private boolean ARB_program_interface_query_initNativeFunctionAddresses() { + return + (glGetProgramInterfaceiv = GLContext.getFunctionAddress("glGetProgramInterfaceiv")) != 0 & + (glGetProgramResourceIndex = GLContext.getFunctionAddress("glGetProgramResourceIndex")) != 0 & + (glGetProgramResourceName = GLContext.getFunctionAddress("glGetProgramResourceName")) != 0 & + (glGetProgramResourceiv = GLContext.getFunctionAddress("glGetProgramResourceiv")) != 0 & + (glGetProgramResourceLocation = GLContext.getFunctionAddress("glGetProgramResourceLocation")) != 0 & + (glGetProgramResourceLocationIndex = GLContext.getFunctionAddress("glGetProgramResourceLocationIndex")) != 0; + } + + private boolean ARB_provoking_vertex_initNativeFunctionAddresses() { + return + (glProvokingVertex = GLContext.getFunctionAddress("glProvokingVertex")) != 0; + } + + private boolean ARB_robustness_initNativeFunctionAddresses(boolean forwardCompatible,Set<String> supported_extensions) { + return + (glGetGraphicsResetStatusARB = GLContext.getFunctionAddress("glGetGraphicsResetStatusARB")) != 0 & + (forwardCompatible || (glGetnMapdvARB = GLContext.getFunctionAddress("glGetnMapdvARB")) != 0) & + (forwardCompatible || (glGetnMapfvARB = GLContext.getFunctionAddress("glGetnMapfvARB")) != 0) & + (forwardCompatible || (glGetnMapivARB = GLContext.getFunctionAddress("glGetnMapivARB")) != 0) & + (forwardCompatible || (glGetnPixelMapfvARB = GLContext.getFunctionAddress("glGetnPixelMapfvARB")) != 0) & + (forwardCompatible || (glGetnPixelMapuivARB = GLContext.getFunctionAddress("glGetnPixelMapuivARB")) != 0) & + (forwardCompatible || (glGetnPixelMapusvARB = GLContext.getFunctionAddress("glGetnPixelMapusvARB")) != 0) & + (forwardCompatible || (glGetnPolygonStippleARB = GLContext.getFunctionAddress("glGetnPolygonStippleARB")) != 0) & + (glGetnTexImageARB = GLContext.getFunctionAddress("glGetnTexImageARB")) != 0 & + (glReadnPixelsARB = GLContext.getFunctionAddress("glReadnPixelsARB")) != 0 & + (!supported_extensions.contains("GL_ARB_imaging") || (glGetnColorTableARB = GLContext.getFunctionAddress("glGetnColorTableARB")) != 0) & + (!supported_extensions.contains("GL_ARB_imaging") || (glGetnConvolutionFilterARB = GLContext.getFunctionAddress("glGetnConvolutionFilterARB")) != 0) & + (!supported_extensions.contains("GL_ARB_imaging") || (glGetnSeparableFilterARB = GLContext.getFunctionAddress("glGetnSeparableFilterARB")) != 0) & + (!supported_extensions.contains("GL_ARB_imaging") || (glGetnHistogramARB = GLContext.getFunctionAddress("glGetnHistogramARB")) != 0) & + (!supported_extensions.contains("GL_ARB_imaging") || (glGetnMinmaxARB = GLContext.getFunctionAddress("glGetnMinmaxARB")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetnCompressedTexImageARB = GLContext.getFunctionAddress("glGetnCompressedTexImageARB")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glGetnUniformfvARB = GLContext.getFunctionAddress("glGetnUniformfvARB")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glGetnUniformivARB = GLContext.getFunctionAddress("glGetnUniformivARB")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glGetnUniformuivARB = GLContext.getFunctionAddress("glGetnUniformuivARB")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glGetnUniformdvARB = GLContext.getFunctionAddress("glGetnUniformdvARB")) != 0); + } + + private boolean ARB_sample_shading_initNativeFunctionAddresses() { + return + (glMinSampleShadingARB = GLContext.getFunctionAddress("glMinSampleShadingARB")) != 0; + } + + private boolean ARB_sampler_objects_initNativeFunctionAddresses() { + return + (glGenSamplers = GLContext.getFunctionAddress("glGenSamplers")) != 0 & + (glDeleteSamplers = GLContext.getFunctionAddress("glDeleteSamplers")) != 0 & + (glIsSampler = GLContext.getFunctionAddress("glIsSampler")) != 0 & + (glBindSampler = GLContext.getFunctionAddress("glBindSampler")) != 0 & + (glSamplerParameteri = GLContext.getFunctionAddress("glSamplerParameteri")) != 0 & + (glSamplerParameterf = GLContext.getFunctionAddress("glSamplerParameterf")) != 0 & + (glSamplerParameteriv = GLContext.getFunctionAddress("glSamplerParameteriv")) != 0 & + (glSamplerParameterfv = GLContext.getFunctionAddress("glSamplerParameterfv")) != 0 & + (glSamplerParameterIiv = GLContext.getFunctionAddress("glSamplerParameterIiv")) != 0 & + (glSamplerParameterIuiv = GLContext.getFunctionAddress("glSamplerParameterIuiv")) != 0 & + (glGetSamplerParameteriv = GLContext.getFunctionAddress("glGetSamplerParameteriv")) != 0 & + (glGetSamplerParameterfv = GLContext.getFunctionAddress("glGetSamplerParameterfv")) != 0 & + (glGetSamplerParameterIiv = GLContext.getFunctionAddress("glGetSamplerParameterIiv")) != 0 & + (glGetSamplerParameterIuiv = GLContext.getFunctionAddress("glGetSamplerParameterIuiv")) != 0; + } + + private boolean ARB_separate_shader_objects_initNativeFunctionAddresses() { + return + (glUseProgramStages = GLContext.getFunctionAddress("glUseProgramStages")) != 0 & + (glActiveShaderProgram = GLContext.getFunctionAddress("glActiveShaderProgram")) != 0 & + (glCreateShaderProgramv = GLContext.getFunctionAddress("glCreateShaderProgramv")) != 0 & + (glBindProgramPipeline = GLContext.getFunctionAddress("glBindProgramPipeline")) != 0 & + (glDeleteProgramPipelines = GLContext.getFunctionAddress("glDeleteProgramPipelines")) != 0 & + (glGenProgramPipelines = GLContext.getFunctionAddress("glGenProgramPipelines")) != 0 & + (glIsProgramPipeline = GLContext.getFunctionAddress("glIsProgramPipeline")) != 0 & + (glProgramParameteri = GLContext.getFunctionAddress("glProgramParameteri")) != 0 & + (glGetProgramPipelineiv = GLContext.getFunctionAddress("glGetProgramPipelineiv")) != 0 & + (glProgramUniform1i = GLContext.getFunctionAddress("glProgramUniform1i")) != 0 & + (glProgramUniform2i = GLContext.getFunctionAddress("glProgramUniform2i")) != 0 & + (glProgramUniform3i = GLContext.getFunctionAddress("glProgramUniform3i")) != 0 & + (glProgramUniform4i = GLContext.getFunctionAddress("glProgramUniform4i")) != 0 & + (glProgramUniform1f = GLContext.getFunctionAddress("glProgramUniform1f")) != 0 & + (glProgramUniform2f = GLContext.getFunctionAddress("glProgramUniform2f")) != 0 & + (glProgramUniform3f = GLContext.getFunctionAddress("glProgramUniform3f")) != 0 & + (glProgramUniform4f = GLContext.getFunctionAddress("glProgramUniform4f")) != 0 & + (glProgramUniform1d = GLContext.getFunctionAddress("glProgramUniform1d")) != 0 & + (glProgramUniform2d = GLContext.getFunctionAddress("glProgramUniform2d")) != 0 & + (glProgramUniform3d = GLContext.getFunctionAddress("glProgramUniform3d")) != 0 & + (glProgramUniform4d = GLContext.getFunctionAddress("glProgramUniform4d")) != 0 & + (glProgramUniform1iv = GLContext.getFunctionAddress("glProgramUniform1iv")) != 0 & + (glProgramUniform2iv = GLContext.getFunctionAddress("glProgramUniform2iv")) != 0 & + (glProgramUniform3iv = GLContext.getFunctionAddress("glProgramUniform3iv")) != 0 & + (glProgramUniform4iv = GLContext.getFunctionAddress("glProgramUniform4iv")) != 0 & + (glProgramUniform1fv = GLContext.getFunctionAddress("glProgramUniform1fv")) != 0 & + (glProgramUniform2fv = GLContext.getFunctionAddress("glProgramUniform2fv")) != 0 & + (glProgramUniform3fv = GLContext.getFunctionAddress("glProgramUniform3fv")) != 0 & + (glProgramUniform4fv = GLContext.getFunctionAddress("glProgramUniform4fv")) != 0 & + (glProgramUniform1dv = GLContext.getFunctionAddress("glProgramUniform1dv")) != 0 & + (glProgramUniform2dv = GLContext.getFunctionAddress("glProgramUniform2dv")) != 0 & + (glProgramUniform3dv = GLContext.getFunctionAddress("glProgramUniform3dv")) != 0 & + (glProgramUniform4dv = GLContext.getFunctionAddress("glProgramUniform4dv")) != 0 & + (glProgramUniform1ui = GLContext.getFunctionAddress("glProgramUniform1ui")) != 0 & + (glProgramUniform2ui = GLContext.getFunctionAddress("glProgramUniform2ui")) != 0 & + (glProgramUniform3ui = GLContext.getFunctionAddress("glProgramUniform3ui")) != 0 & + (glProgramUniform4ui = GLContext.getFunctionAddress("glProgramUniform4ui")) != 0 & + (glProgramUniform1uiv = GLContext.getFunctionAddress("glProgramUniform1uiv")) != 0 & + (glProgramUniform2uiv = GLContext.getFunctionAddress("glProgramUniform2uiv")) != 0 & + (glProgramUniform3uiv = GLContext.getFunctionAddress("glProgramUniform3uiv")) != 0 & + (glProgramUniform4uiv = GLContext.getFunctionAddress("glProgramUniform4uiv")) != 0 & + (glProgramUniformMatrix2fv = GLContext.getFunctionAddress("glProgramUniformMatrix2fv")) != 0 & + (glProgramUniformMatrix3fv = GLContext.getFunctionAddress("glProgramUniformMatrix3fv")) != 0 & + (glProgramUniformMatrix4fv = GLContext.getFunctionAddress("glProgramUniformMatrix4fv")) != 0 & + (glProgramUniformMatrix2dv = GLContext.getFunctionAddress("glProgramUniformMatrix2dv")) != 0 & + (glProgramUniformMatrix3dv = GLContext.getFunctionAddress("glProgramUniformMatrix3dv")) != 0 & + (glProgramUniformMatrix4dv = GLContext.getFunctionAddress("glProgramUniformMatrix4dv")) != 0 & + (glProgramUniformMatrix2x3fv = GLContext.getFunctionAddress("glProgramUniformMatrix2x3fv")) != 0 & + (glProgramUniformMatrix3x2fv = GLContext.getFunctionAddress("glProgramUniformMatrix3x2fv")) != 0 & + (glProgramUniformMatrix2x4fv = GLContext.getFunctionAddress("glProgramUniformMatrix2x4fv")) != 0 & + (glProgramUniformMatrix4x2fv = GLContext.getFunctionAddress("glProgramUniformMatrix4x2fv")) != 0 & + (glProgramUniformMatrix3x4fv = GLContext.getFunctionAddress("glProgramUniformMatrix3x4fv")) != 0 & + (glProgramUniformMatrix4x3fv = GLContext.getFunctionAddress("glProgramUniformMatrix4x3fv")) != 0 & + (glProgramUniformMatrix2x3dv = GLContext.getFunctionAddress("glProgramUniformMatrix2x3dv")) != 0 & + (glProgramUniformMatrix3x2dv = GLContext.getFunctionAddress("glProgramUniformMatrix3x2dv")) != 0 & + (glProgramUniformMatrix2x4dv = GLContext.getFunctionAddress("glProgramUniformMatrix2x4dv")) != 0 & + (glProgramUniformMatrix4x2dv = GLContext.getFunctionAddress("glProgramUniformMatrix4x2dv")) != 0 & + (glProgramUniformMatrix3x4dv = GLContext.getFunctionAddress("glProgramUniformMatrix3x4dv")) != 0 & + (glProgramUniformMatrix4x3dv = GLContext.getFunctionAddress("glProgramUniformMatrix4x3dv")) != 0 & + (glValidateProgramPipeline = GLContext.getFunctionAddress("glValidateProgramPipeline")) != 0 & + (glGetProgramPipelineInfoLog = GLContext.getFunctionAddress("glGetProgramPipelineInfoLog")) != 0; + } + + private boolean ARB_shader_atomic_counters_initNativeFunctionAddresses() { + return + (glGetActiveAtomicCounterBufferiv = GLContext.getFunctionAddress("glGetActiveAtomicCounterBufferiv")) != 0; + } + + private boolean ARB_shader_image_load_store_initNativeFunctionAddresses() { + return + (glBindImageTexture = GLContext.getFunctionAddress("glBindImageTexture")) != 0 & + (glMemoryBarrier = GLContext.getFunctionAddress("glMemoryBarrier")) != 0; + } + + private boolean ARB_shader_objects_initNativeFunctionAddresses() { + return + (glDeleteObjectARB = GLContext.getFunctionAddress("glDeleteObjectARB")) != 0 & + (glGetHandleARB = GLContext.getFunctionAddress("glGetHandleARB")) != 0 & + (glDetachObjectARB = GLContext.getFunctionAddress("glDetachObjectARB")) != 0 & + (glCreateShaderObjectARB = GLContext.getFunctionAddress("glCreateShaderObjectARB")) != 0 & + (glShaderSourceARB = GLContext.getFunctionAddress("glShaderSourceARB")) != 0 & + (glCompileShaderARB = GLContext.getFunctionAddress("glCompileShaderARB")) != 0 & + (glCreateProgramObjectARB = GLContext.getFunctionAddress("glCreateProgramObjectARB")) != 0 & + (glAttachObjectARB = GLContext.getFunctionAddress("glAttachObjectARB")) != 0 & + (glLinkProgramARB = GLContext.getFunctionAddress("glLinkProgramARB")) != 0 & + (glUseProgramObjectARB = GLContext.getFunctionAddress("glUseProgramObjectARB")) != 0 & + (glValidateProgramARB = GLContext.getFunctionAddress("glValidateProgramARB")) != 0 & + (glUniform1fARB = GLContext.getFunctionAddress("glUniform1fARB")) != 0 & + (glUniform2fARB = GLContext.getFunctionAddress("glUniform2fARB")) != 0 & + (glUniform3fARB = GLContext.getFunctionAddress("glUniform3fARB")) != 0 & + (glUniform4fARB = GLContext.getFunctionAddress("glUniform4fARB")) != 0 & + (glUniform1iARB = GLContext.getFunctionAddress("glUniform1iARB")) != 0 & + (glUniform2iARB = GLContext.getFunctionAddress("glUniform2iARB")) != 0 & + (glUniform3iARB = GLContext.getFunctionAddress("glUniform3iARB")) != 0 & + (glUniform4iARB = GLContext.getFunctionAddress("glUniform4iARB")) != 0 & + (glUniform1fvARB = GLContext.getFunctionAddress("glUniform1fvARB")) != 0 & + (glUniform2fvARB = GLContext.getFunctionAddress("glUniform2fvARB")) != 0 & + (glUniform3fvARB = GLContext.getFunctionAddress("glUniform3fvARB")) != 0 & + (glUniform4fvARB = GLContext.getFunctionAddress("glUniform4fvARB")) != 0 & + (glUniform1ivARB = GLContext.getFunctionAddress("glUniform1ivARB")) != 0 & + (glUniform2ivARB = GLContext.getFunctionAddress("glUniform2ivARB")) != 0 & + (glUniform3ivARB = GLContext.getFunctionAddress("glUniform3ivARB")) != 0 & + (glUniform4ivARB = GLContext.getFunctionAddress("glUniform4ivARB")) != 0 & + (glUniformMatrix2fvARB = GLContext.getFunctionAddress("glUniformMatrix2fvARB")) != 0 & + (glUniformMatrix3fvARB = GLContext.getFunctionAddress("glUniformMatrix3fvARB")) != 0 & + (glUniformMatrix4fvARB = GLContext.getFunctionAddress("glUniformMatrix4fvARB")) != 0 & + (glGetObjectParameterfvARB = GLContext.getFunctionAddress("glGetObjectParameterfvARB")) != 0 & + (glGetObjectParameterivARB = GLContext.getFunctionAddress("glGetObjectParameterivARB")) != 0 & + (glGetInfoLogARB = GLContext.getFunctionAddress("glGetInfoLogARB")) != 0 & + (glGetAttachedObjectsARB = GLContext.getFunctionAddress("glGetAttachedObjectsARB")) != 0 & + (glGetUniformLocationARB = GLContext.getFunctionAddress("glGetUniformLocationARB")) != 0 & + (glGetActiveUniformARB = GLContext.getFunctionAddress("glGetActiveUniformARB")) != 0 & + (glGetUniformfvARB = GLContext.getFunctionAddress("glGetUniformfvARB")) != 0 & + (glGetUniformivARB = GLContext.getFunctionAddress("glGetUniformivARB")) != 0 & + (glGetShaderSourceARB = GLContext.getFunctionAddress("glGetShaderSourceARB")) != 0; + } + + private boolean ARB_shader_storage_buffer_object_initNativeFunctionAddresses() { + return + (glShaderStorageBlockBinding = GLContext.getFunctionAddress("glShaderStorageBlockBinding")) != 0; + } + + private boolean ARB_shader_subroutine_initNativeFunctionAddresses() { + return + (glGetSubroutineUniformLocation = GLContext.getFunctionAddress("glGetSubroutineUniformLocation")) != 0 & + (glGetSubroutineIndex = GLContext.getFunctionAddress("glGetSubroutineIndex")) != 0 & + (glGetActiveSubroutineUniformiv = GLContext.getFunctionAddress("glGetActiveSubroutineUniformiv")) != 0 & + (glGetActiveSubroutineUniformName = GLContext.getFunctionAddress("glGetActiveSubroutineUniformName")) != 0 & + (glGetActiveSubroutineName = GLContext.getFunctionAddress("glGetActiveSubroutineName")) != 0 & + (glUniformSubroutinesuiv = GLContext.getFunctionAddress("glUniformSubroutinesuiv")) != 0 & + (glGetUniformSubroutineuiv = GLContext.getFunctionAddress("glGetUniformSubroutineuiv")) != 0 & + (glGetProgramStageiv = GLContext.getFunctionAddress("glGetProgramStageiv")) != 0; + } + + private boolean ARB_shading_language_include_initNativeFunctionAddresses() { + return + (glNamedStringARB = GLContext.getFunctionAddress("glNamedStringARB")) != 0 & + (glDeleteNamedStringARB = GLContext.getFunctionAddress("glDeleteNamedStringARB")) != 0 & + (glCompileShaderIncludeARB = GLContext.getFunctionAddress("glCompileShaderIncludeARB")) != 0 & + (glIsNamedStringARB = GLContext.getFunctionAddress("glIsNamedStringARB")) != 0 & + (glGetNamedStringARB = GLContext.getFunctionAddress("glGetNamedStringARB")) != 0 & + (glGetNamedStringivARB = GLContext.getFunctionAddress("glGetNamedStringivARB")) != 0; + } + + private boolean ARB_sparse_texture_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glTexPageCommitmentARB = GLContext.getFunctionAddress("glTexPageCommitmentARB")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTexturePageCommitmentEXT = GLContext.getFunctionAddress("glTexturePageCommitmentEXT")) != 0); + } + + private boolean ARB_sync_initNativeFunctionAddresses() { + return + (glFenceSync = GLContext.getFunctionAddress("glFenceSync")) != 0 & + (glIsSync = GLContext.getFunctionAddress("glIsSync")) != 0 & + (glDeleteSync = GLContext.getFunctionAddress("glDeleteSync")) != 0 & + (glClientWaitSync = GLContext.getFunctionAddress("glClientWaitSync")) != 0 & + (glWaitSync = GLContext.getFunctionAddress("glWaitSync")) != 0 & + (glGetInteger64v = GLContext.getFunctionAddress("glGetInteger64v")) != 0 & + (glGetSynciv = GLContext.getFunctionAddress("glGetSynciv")) != 0; + } + + private boolean ARB_tessellation_shader_initNativeFunctionAddresses() { + return + (glPatchParameteri = GLContext.getFunctionAddress("glPatchParameteri")) != 0 & + (glPatchParameterfv = GLContext.getFunctionAddress("glPatchParameterfv")) != 0; + } + + private boolean ARB_texture_buffer_object_initNativeFunctionAddresses() { + return + (glTexBufferARB = GLContext.getFunctionAddress("glTexBufferARB")) != 0; + } + + private boolean ARB_texture_buffer_range_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glTexBufferRange = GLContext.getFunctionAddress("glTexBufferRange")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureBufferRangeEXT = GLContext.getFunctionAddress("glTextureBufferRangeEXT")) != 0); + } + + private boolean ARB_texture_compression_initNativeFunctionAddresses() { + return + (glCompressedTexImage1DARB = GLContext.getFunctionAddress("glCompressedTexImage1DARB")) != 0 & + (glCompressedTexImage2DARB = GLContext.getFunctionAddress("glCompressedTexImage2DARB")) != 0 & + (glCompressedTexImage3DARB = GLContext.getFunctionAddress("glCompressedTexImage3DARB")) != 0 & + (glCompressedTexSubImage1DARB = GLContext.getFunctionAddress("glCompressedTexSubImage1DARB")) != 0 & + (glCompressedTexSubImage2DARB = GLContext.getFunctionAddress("glCompressedTexSubImage2DARB")) != 0 & + (glCompressedTexSubImage3DARB = GLContext.getFunctionAddress("glCompressedTexSubImage3DARB")) != 0 & + (glGetCompressedTexImageARB = GLContext.getFunctionAddress("glGetCompressedTexImageARB")) != 0; + } + + private boolean ARB_texture_multisample_initNativeFunctionAddresses() { + return + (glTexImage2DMultisample = GLContext.getFunctionAddress("glTexImage2DMultisample")) != 0 & + (glTexImage3DMultisample = GLContext.getFunctionAddress("glTexImage3DMultisample")) != 0 & + (glGetMultisamplefv = GLContext.getFunctionAddress("glGetMultisamplefv")) != 0 & + (glSampleMaski = GLContext.getFunctionAddress("glSampleMaski")) != 0; + } + + private boolean ARB_texture_storage_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glTexStorage1D = GLContext.getFunctionAddress(new String[] {"glTexStorage1D","glTexStorage1DEXT"})) != 0 & + (glTexStorage2D = GLContext.getFunctionAddress(new String[] {"glTexStorage2D","glTexStorage2DEXT"})) != 0 & + (glTexStorage3D = GLContext.getFunctionAddress(new String[] {"glTexStorage3D","glTexStorage3DEXT"})) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureStorage1DEXT = GLContext.getFunctionAddress(new String[] {"glTextureStorage1DEXT","glTextureStorage1DEXTEXT"})) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureStorage2DEXT = GLContext.getFunctionAddress(new String[] {"glTextureStorage2DEXT","glTextureStorage2DEXTEXT"})) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureStorage3DEXT = GLContext.getFunctionAddress(new String[] {"glTextureStorage3DEXT","glTextureStorage3DEXTEXT"})) != 0); + } + + private boolean ARB_texture_storage_multisample_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glTexStorage2DMultisample = GLContext.getFunctionAddress("glTexStorage2DMultisample")) != 0 & + (glTexStorage3DMultisample = GLContext.getFunctionAddress("glTexStorage3DMultisample")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureStorage2DMultisampleEXT = GLContext.getFunctionAddress("glTextureStorage2DMultisampleEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glTextureStorage3DMultisampleEXT = GLContext.getFunctionAddress("glTextureStorage3DMultisampleEXT")) != 0); + } + + private boolean ARB_texture_view_initNativeFunctionAddresses() { + return + (glTextureView = GLContext.getFunctionAddress("glTextureView")) != 0; + } + + private boolean ARB_timer_query_initNativeFunctionAddresses() { + return + (glQueryCounter = GLContext.getFunctionAddress("glQueryCounter")) != 0 & + (glGetQueryObjecti64v = GLContext.getFunctionAddress("glGetQueryObjecti64v")) != 0 & + (glGetQueryObjectui64v = GLContext.getFunctionAddress("glGetQueryObjectui64v")) != 0; + } + + private boolean ARB_transform_feedback2_initNativeFunctionAddresses() { + return + (glBindTransformFeedback = GLContext.getFunctionAddress("glBindTransformFeedback")) != 0 & + (glDeleteTransformFeedbacks = GLContext.getFunctionAddress("glDeleteTransformFeedbacks")) != 0 & + (glGenTransformFeedbacks = GLContext.getFunctionAddress("glGenTransformFeedbacks")) != 0 & + (glIsTransformFeedback = GLContext.getFunctionAddress("glIsTransformFeedback")) != 0 & + (glPauseTransformFeedback = GLContext.getFunctionAddress("glPauseTransformFeedback")) != 0 & + (glResumeTransformFeedback = GLContext.getFunctionAddress("glResumeTransformFeedback")) != 0 & + (glDrawTransformFeedback = GLContext.getFunctionAddress("glDrawTransformFeedback")) != 0; + } + + private boolean ARB_transform_feedback3_initNativeFunctionAddresses() { + return + (glDrawTransformFeedbackStream = GLContext.getFunctionAddress("glDrawTransformFeedbackStream")) != 0 & + (glBeginQueryIndexed = GLContext.getFunctionAddress("glBeginQueryIndexed")) != 0 & + (glEndQueryIndexed = GLContext.getFunctionAddress("glEndQueryIndexed")) != 0 & + (glGetQueryIndexediv = GLContext.getFunctionAddress("glGetQueryIndexediv")) != 0; + } + + private boolean ARB_transform_feedback_instanced_initNativeFunctionAddresses() { + return + (glDrawTransformFeedbackInstanced = GLContext.getFunctionAddress("glDrawTransformFeedbackInstanced")) != 0 & + (glDrawTransformFeedbackStreamInstanced = GLContext.getFunctionAddress("glDrawTransformFeedbackStreamInstanced")) != 0; + } + + private boolean ARB_transpose_matrix_initNativeFunctionAddresses() { + return + (glLoadTransposeMatrixfARB = GLContext.getFunctionAddress("glLoadTransposeMatrixfARB")) != 0 & + (glMultTransposeMatrixfARB = GLContext.getFunctionAddress("glMultTransposeMatrixfARB")) != 0; + } + + private boolean ARB_uniform_buffer_object_initNativeFunctionAddresses() { + return + (glGetUniformIndices = GLContext.getFunctionAddress("glGetUniformIndices")) != 0 & + (glGetActiveUniformsiv = GLContext.getFunctionAddress("glGetActiveUniformsiv")) != 0 & + (glGetActiveUniformName = GLContext.getFunctionAddress("glGetActiveUniformName")) != 0 & + (glGetUniformBlockIndex = GLContext.getFunctionAddress("glGetUniformBlockIndex")) != 0 & + (glGetActiveUniformBlockiv = GLContext.getFunctionAddress("glGetActiveUniformBlockiv")) != 0 & + (glGetActiveUniformBlockName = GLContext.getFunctionAddress("glGetActiveUniformBlockName")) != 0 & + (glBindBufferRange = GLContext.getFunctionAddress("glBindBufferRange")) != 0 & + (glBindBufferBase = GLContext.getFunctionAddress("glBindBufferBase")) != 0 & + (glGetIntegeri_v = GLContext.getFunctionAddress("glGetIntegeri_v")) != 0 & + (glUniformBlockBinding = GLContext.getFunctionAddress("glUniformBlockBinding")) != 0; + } + + private boolean ARB_vertex_array_object_initNativeFunctionAddresses() { + return + (glBindVertexArray = GLContext.getFunctionAddress("glBindVertexArray")) != 0 & + (glDeleteVertexArrays = GLContext.getFunctionAddress("glDeleteVertexArrays")) != 0 & + (glGenVertexArrays = GLContext.getFunctionAddress("glGenVertexArrays")) != 0 & + (glIsVertexArray = GLContext.getFunctionAddress("glIsVertexArray")) != 0; + } + + private boolean ARB_vertex_attrib_64bit_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glVertexAttribL1d = GLContext.getFunctionAddress("glVertexAttribL1d")) != 0 & + (glVertexAttribL2d = GLContext.getFunctionAddress("glVertexAttribL2d")) != 0 & + (glVertexAttribL3d = GLContext.getFunctionAddress("glVertexAttribL3d")) != 0 & + (glVertexAttribL4d = GLContext.getFunctionAddress("glVertexAttribL4d")) != 0 & + (glVertexAttribL1dv = GLContext.getFunctionAddress("glVertexAttribL1dv")) != 0 & + (glVertexAttribL2dv = GLContext.getFunctionAddress("glVertexAttribL2dv")) != 0 & + (glVertexAttribL3dv = GLContext.getFunctionAddress("glVertexAttribL3dv")) != 0 & + (glVertexAttribL4dv = GLContext.getFunctionAddress("glVertexAttribL4dv")) != 0 & + (glVertexAttribLPointer = GLContext.getFunctionAddress("glVertexAttribLPointer")) != 0 & + (glGetVertexAttribLdv = GLContext.getFunctionAddress("glGetVertexAttribLdv")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glVertexArrayVertexAttribLOffsetEXT = GLContext.getFunctionAddress("glVertexArrayVertexAttribLOffsetEXT")) != 0); + } + + private boolean ARB_vertex_attrib_binding_initNativeFunctionAddresses() { + return + (glBindVertexBuffer = GLContext.getFunctionAddress("glBindVertexBuffer")) != 0 & + (glVertexAttribFormat = GLContext.getFunctionAddress("glVertexAttribFormat")) != 0 & + (glVertexAttribIFormat = GLContext.getFunctionAddress("glVertexAttribIFormat")) != 0 & + (glVertexAttribLFormat = GLContext.getFunctionAddress("glVertexAttribLFormat")) != 0 & + (glVertexAttribBinding = GLContext.getFunctionAddress("glVertexAttribBinding")) != 0 & + (glVertexBindingDivisor = GLContext.getFunctionAddress("glVertexBindingDivisor")) != 0; + } + + private boolean ARB_vertex_blend_initNativeFunctionAddresses() { + return + (glWeightbvARB = GLContext.getFunctionAddress("glWeightbvARB")) != 0 & + (glWeightsvARB = GLContext.getFunctionAddress("glWeightsvARB")) != 0 & + (glWeightivARB = GLContext.getFunctionAddress("glWeightivARB")) != 0 & + (glWeightfvARB = GLContext.getFunctionAddress("glWeightfvARB")) != 0 & + (glWeightdvARB = GLContext.getFunctionAddress("glWeightdvARB")) != 0 & + (glWeightubvARB = GLContext.getFunctionAddress("glWeightubvARB")) != 0 & + (glWeightusvARB = GLContext.getFunctionAddress("glWeightusvARB")) != 0 & + (glWeightuivARB = GLContext.getFunctionAddress("glWeightuivARB")) != 0 & + (glWeightPointerARB = GLContext.getFunctionAddress("glWeightPointerARB")) != 0 & + (glVertexBlendARB = GLContext.getFunctionAddress("glVertexBlendARB")) != 0; + } + + private boolean ARB_vertex_program_initNativeFunctionAddresses() { + return + (glVertexAttrib1sARB = GLContext.getFunctionAddress("glVertexAttrib1sARB")) != 0 & + (glVertexAttrib1fARB = GLContext.getFunctionAddress("glVertexAttrib1fARB")) != 0 & + (glVertexAttrib1dARB = GLContext.getFunctionAddress("glVertexAttrib1dARB")) != 0 & + (glVertexAttrib2sARB = GLContext.getFunctionAddress("glVertexAttrib2sARB")) != 0 & + (glVertexAttrib2fARB = GLContext.getFunctionAddress("glVertexAttrib2fARB")) != 0 & + (glVertexAttrib2dARB = GLContext.getFunctionAddress("glVertexAttrib2dARB")) != 0 & + (glVertexAttrib3sARB = GLContext.getFunctionAddress("glVertexAttrib3sARB")) != 0 & + (glVertexAttrib3fARB = GLContext.getFunctionAddress("glVertexAttrib3fARB")) != 0 & + (glVertexAttrib3dARB = GLContext.getFunctionAddress("glVertexAttrib3dARB")) != 0 & + (glVertexAttrib4sARB = GLContext.getFunctionAddress("glVertexAttrib4sARB")) != 0 & + (glVertexAttrib4fARB = GLContext.getFunctionAddress("glVertexAttrib4fARB")) != 0 & + (glVertexAttrib4dARB = GLContext.getFunctionAddress("glVertexAttrib4dARB")) != 0 & + (glVertexAttrib4NubARB = GLContext.getFunctionAddress("glVertexAttrib4NubARB")) != 0 & + (glVertexAttribPointerARB = GLContext.getFunctionAddress("glVertexAttribPointerARB")) != 0 & + (glEnableVertexAttribArrayARB = GLContext.getFunctionAddress("glEnableVertexAttribArrayARB")) != 0 & + (glDisableVertexAttribArrayARB = GLContext.getFunctionAddress("glDisableVertexAttribArrayARB")) != 0 & + (glGetVertexAttribfvARB = GLContext.getFunctionAddress("glGetVertexAttribfvARB")) != 0 & + (glGetVertexAttribdvARB = GLContext.getFunctionAddress("glGetVertexAttribdvARB")) != 0 & + (glGetVertexAttribivARB = GLContext.getFunctionAddress("glGetVertexAttribivARB")) != 0 & + (glGetVertexAttribPointervARB = GLContext.getFunctionAddress("glGetVertexAttribPointervARB")) != 0; + } + + private boolean ARB_vertex_shader_initNativeFunctionAddresses() { + return + (glVertexAttrib1sARB = GLContext.getFunctionAddress("glVertexAttrib1sARB")) != 0 & + (glVertexAttrib1fARB = GLContext.getFunctionAddress("glVertexAttrib1fARB")) != 0 & + (glVertexAttrib1dARB = GLContext.getFunctionAddress("glVertexAttrib1dARB")) != 0 & + (glVertexAttrib2sARB = GLContext.getFunctionAddress("glVertexAttrib2sARB")) != 0 & + (glVertexAttrib2fARB = GLContext.getFunctionAddress("glVertexAttrib2fARB")) != 0 & + (glVertexAttrib2dARB = GLContext.getFunctionAddress("glVertexAttrib2dARB")) != 0 & + (glVertexAttrib3sARB = GLContext.getFunctionAddress("glVertexAttrib3sARB")) != 0 & + (glVertexAttrib3fARB = GLContext.getFunctionAddress("glVertexAttrib3fARB")) != 0 & + (glVertexAttrib3dARB = GLContext.getFunctionAddress("glVertexAttrib3dARB")) != 0 & + (glVertexAttrib4sARB = GLContext.getFunctionAddress("glVertexAttrib4sARB")) != 0 & + (glVertexAttrib4fARB = GLContext.getFunctionAddress("glVertexAttrib4fARB")) != 0 & + (glVertexAttrib4dARB = GLContext.getFunctionAddress("glVertexAttrib4dARB")) != 0 & + (glVertexAttrib4NubARB = GLContext.getFunctionAddress("glVertexAttrib4NubARB")) != 0 & + (glVertexAttribPointerARB = GLContext.getFunctionAddress("glVertexAttribPointerARB")) != 0 & + (glEnableVertexAttribArrayARB = GLContext.getFunctionAddress("glEnableVertexAttribArrayARB")) != 0 & + (glDisableVertexAttribArrayARB = GLContext.getFunctionAddress("glDisableVertexAttribArrayARB")) != 0 & + (glBindAttribLocationARB = GLContext.getFunctionAddress("glBindAttribLocationARB")) != 0 & + (glGetActiveAttribARB = GLContext.getFunctionAddress("glGetActiveAttribARB")) != 0 & + (glGetAttribLocationARB = GLContext.getFunctionAddress("glGetAttribLocationARB")) != 0 & + (glGetVertexAttribfvARB = GLContext.getFunctionAddress("glGetVertexAttribfvARB")) != 0 & + (glGetVertexAttribdvARB = GLContext.getFunctionAddress("glGetVertexAttribdvARB")) != 0 & + (glGetVertexAttribivARB = GLContext.getFunctionAddress("glGetVertexAttribivARB")) != 0 & + (glGetVertexAttribPointervARB = GLContext.getFunctionAddress("glGetVertexAttribPointervARB")) != 0; + } + + private boolean ARB_vertex_type_2_10_10_10_rev_initNativeFunctionAddresses() { + return + (glVertexP2ui = GLContext.getFunctionAddress("glVertexP2ui")) != 0 & + (glVertexP3ui = GLContext.getFunctionAddress("glVertexP3ui")) != 0 & + (glVertexP4ui = GLContext.getFunctionAddress("glVertexP4ui")) != 0 & + (glVertexP2uiv = GLContext.getFunctionAddress("glVertexP2uiv")) != 0 & + (glVertexP3uiv = GLContext.getFunctionAddress("glVertexP3uiv")) != 0 & + (glVertexP4uiv = GLContext.getFunctionAddress("glVertexP4uiv")) != 0 & + (glTexCoordP1ui = GLContext.getFunctionAddress("glTexCoordP1ui")) != 0 & + (glTexCoordP2ui = GLContext.getFunctionAddress("glTexCoordP2ui")) != 0 & + (glTexCoordP3ui = GLContext.getFunctionAddress("glTexCoordP3ui")) != 0 & + (glTexCoordP4ui = GLContext.getFunctionAddress("glTexCoordP4ui")) != 0 & + (glTexCoordP1uiv = GLContext.getFunctionAddress("glTexCoordP1uiv")) != 0 & + (glTexCoordP2uiv = GLContext.getFunctionAddress("glTexCoordP2uiv")) != 0 & + (glTexCoordP3uiv = GLContext.getFunctionAddress("glTexCoordP3uiv")) != 0 & + (glTexCoordP4uiv = GLContext.getFunctionAddress("glTexCoordP4uiv")) != 0 & + (glMultiTexCoordP1ui = GLContext.getFunctionAddress("glMultiTexCoordP1ui")) != 0 & + (glMultiTexCoordP2ui = GLContext.getFunctionAddress("glMultiTexCoordP2ui")) != 0 & + (glMultiTexCoordP3ui = GLContext.getFunctionAddress("glMultiTexCoordP3ui")) != 0 & + (glMultiTexCoordP4ui = GLContext.getFunctionAddress("glMultiTexCoordP4ui")) != 0 & + (glMultiTexCoordP1uiv = GLContext.getFunctionAddress("glMultiTexCoordP1uiv")) != 0 & + (glMultiTexCoordP2uiv = GLContext.getFunctionAddress("glMultiTexCoordP2uiv")) != 0 & + (glMultiTexCoordP3uiv = GLContext.getFunctionAddress("glMultiTexCoordP3uiv")) != 0 & + (glMultiTexCoordP4uiv = GLContext.getFunctionAddress("glMultiTexCoordP4uiv")) != 0 & + (glNormalP3ui = GLContext.getFunctionAddress("glNormalP3ui")) != 0 & + (glNormalP3uiv = GLContext.getFunctionAddress("glNormalP3uiv")) != 0 & + (glColorP3ui = GLContext.getFunctionAddress("glColorP3ui")) != 0 & + (glColorP4ui = GLContext.getFunctionAddress("glColorP4ui")) != 0 & + (glColorP3uiv = GLContext.getFunctionAddress("glColorP3uiv")) != 0 & + (glColorP4uiv = GLContext.getFunctionAddress("glColorP4uiv")) != 0 & + (glSecondaryColorP3ui = GLContext.getFunctionAddress("glSecondaryColorP3ui")) != 0 & + (glSecondaryColorP3uiv = GLContext.getFunctionAddress("glSecondaryColorP3uiv")) != 0 & + (glVertexAttribP1ui = GLContext.getFunctionAddress("glVertexAttribP1ui")) != 0 & + (glVertexAttribP2ui = GLContext.getFunctionAddress("glVertexAttribP2ui")) != 0 & + (glVertexAttribP3ui = GLContext.getFunctionAddress("glVertexAttribP3ui")) != 0 & + (glVertexAttribP4ui = GLContext.getFunctionAddress("glVertexAttribP4ui")) != 0 & + (glVertexAttribP1uiv = GLContext.getFunctionAddress("glVertexAttribP1uiv")) != 0 & + (glVertexAttribP2uiv = GLContext.getFunctionAddress("glVertexAttribP2uiv")) != 0 & + (glVertexAttribP3uiv = GLContext.getFunctionAddress("glVertexAttribP3uiv")) != 0 & + (glVertexAttribP4uiv = GLContext.getFunctionAddress("glVertexAttribP4uiv")) != 0; + } + + private boolean ARB_viewport_array_initNativeFunctionAddresses() { + return + (glViewportArrayv = GLContext.getFunctionAddress("glViewportArrayv")) != 0 & + (glViewportIndexedf = GLContext.getFunctionAddress("glViewportIndexedf")) != 0 & + (glViewportIndexedfv = GLContext.getFunctionAddress("glViewportIndexedfv")) != 0 & + (glScissorArrayv = GLContext.getFunctionAddress("glScissorArrayv")) != 0 & + (glScissorIndexed = GLContext.getFunctionAddress("glScissorIndexed")) != 0 & + (glScissorIndexedv = GLContext.getFunctionAddress("glScissorIndexedv")) != 0 & + (glDepthRangeArrayv = GLContext.getFunctionAddress("glDepthRangeArrayv")) != 0 & + (glDepthRangeIndexed = GLContext.getFunctionAddress("glDepthRangeIndexed")) != 0 & + (glGetFloati_v = GLContext.getFunctionAddress("glGetFloati_v")) != 0 & + (glGetDoublei_v = GLContext.getFunctionAddress("glGetDoublei_v")) != 0 & + (glGetIntegerIndexedvEXT = GLContext.getFunctionAddress("glGetIntegerIndexedvEXT")) != 0 & + (glEnableIndexedEXT = GLContext.getFunctionAddress("glEnableIndexedEXT")) != 0 & + (glDisableIndexedEXT = GLContext.getFunctionAddress("glDisableIndexedEXT")) != 0 & + (glIsEnabledIndexedEXT = GLContext.getFunctionAddress("glIsEnabledIndexedEXT")) != 0; + } + + private boolean ARB_window_pos_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (forwardCompatible || (glWindowPos2fARB = GLContext.getFunctionAddress("glWindowPos2fARB")) != 0) & + (forwardCompatible || (glWindowPos2dARB = GLContext.getFunctionAddress("glWindowPos2dARB")) != 0) & + (forwardCompatible || (glWindowPos2iARB = GLContext.getFunctionAddress("glWindowPos2iARB")) != 0) & + (forwardCompatible || (glWindowPos2sARB = GLContext.getFunctionAddress("glWindowPos2sARB")) != 0) & + (forwardCompatible || (glWindowPos3fARB = GLContext.getFunctionAddress("glWindowPos3fARB")) != 0) & + (forwardCompatible || (glWindowPos3dARB = GLContext.getFunctionAddress("glWindowPos3dARB")) != 0) & + (forwardCompatible || (glWindowPos3iARB = GLContext.getFunctionAddress("glWindowPos3iARB")) != 0) & + (forwardCompatible || (glWindowPos3sARB = GLContext.getFunctionAddress("glWindowPos3sARB")) != 0); + } + + private boolean ATI_draw_buffers_initNativeFunctionAddresses() { + return + (glDrawBuffersATI = GLContext.getFunctionAddress("glDrawBuffersATI")) != 0; + } + + private boolean ATI_element_array_initNativeFunctionAddresses() { + return + (glElementPointerATI = GLContext.getFunctionAddress("glElementPointerATI")) != 0 & + (glDrawElementArrayATI = GLContext.getFunctionAddress("glDrawElementArrayATI")) != 0 & + (glDrawRangeElementArrayATI = GLContext.getFunctionAddress("glDrawRangeElementArrayATI")) != 0; + } + + private boolean ATI_envmap_bumpmap_initNativeFunctionAddresses() { + return + (glTexBumpParameterfvATI = GLContext.getFunctionAddress("glTexBumpParameterfvATI")) != 0 & + (glTexBumpParameterivATI = GLContext.getFunctionAddress("glTexBumpParameterivATI")) != 0 & + (glGetTexBumpParameterfvATI = GLContext.getFunctionAddress("glGetTexBumpParameterfvATI")) != 0 & + (glGetTexBumpParameterivATI = GLContext.getFunctionAddress("glGetTexBumpParameterivATI")) != 0; + } + + private boolean ATI_fragment_shader_initNativeFunctionAddresses() { + return + (glGenFragmentShadersATI = GLContext.getFunctionAddress("glGenFragmentShadersATI")) != 0 & + (glBindFragmentShaderATI = GLContext.getFunctionAddress("glBindFragmentShaderATI")) != 0 & + (glDeleteFragmentShaderATI = GLContext.getFunctionAddress("glDeleteFragmentShaderATI")) != 0 & + (glBeginFragmentShaderATI = GLContext.getFunctionAddress("glBeginFragmentShaderATI")) != 0 & + (glEndFragmentShaderATI = GLContext.getFunctionAddress("glEndFragmentShaderATI")) != 0 & + (glPassTexCoordATI = GLContext.getFunctionAddress("glPassTexCoordATI")) != 0 & + (glSampleMapATI = GLContext.getFunctionAddress("glSampleMapATI")) != 0 & + (glColorFragmentOp1ATI = GLContext.getFunctionAddress("glColorFragmentOp1ATI")) != 0 & + (glColorFragmentOp2ATI = GLContext.getFunctionAddress("glColorFragmentOp2ATI")) != 0 & + (glColorFragmentOp3ATI = GLContext.getFunctionAddress("glColorFragmentOp3ATI")) != 0 & + (glAlphaFragmentOp1ATI = GLContext.getFunctionAddress("glAlphaFragmentOp1ATI")) != 0 & + (glAlphaFragmentOp2ATI = GLContext.getFunctionAddress("glAlphaFragmentOp2ATI")) != 0 & + (glAlphaFragmentOp3ATI = GLContext.getFunctionAddress("glAlphaFragmentOp3ATI")) != 0 & + (glSetFragmentShaderConstantATI = GLContext.getFunctionAddress("glSetFragmentShaderConstantATI")) != 0; + } + + private boolean ATI_map_object_buffer_initNativeFunctionAddresses() { + return + (glMapObjectBufferATI = GLContext.getFunctionAddress("glMapObjectBufferATI")) != 0 & + (glUnmapObjectBufferATI = GLContext.getFunctionAddress("glUnmapObjectBufferATI")) != 0; + } + + private boolean ATI_pn_triangles_initNativeFunctionAddresses() { + return + (glPNTrianglesfATI = GLContext.getFunctionAddress("glPNTrianglesfATI")) != 0 & + (glPNTrianglesiATI = GLContext.getFunctionAddress("glPNTrianglesiATI")) != 0; + } + + private boolean ATI_separate_stencil_initNativeFunctionAddresses() { + return + (glStencilOpSeparateATI = GLContext.getFunctionAddress("glStencilOpSeparateATI")) != 0 & + (glStencilFuncSeparateATI = GLContext.getFunctionAddress("glStencilFuncSeparateATI")) != 0; + } + + private boolean ATI_vertex_array_object_initNativeFunctionAddresses() { + return + (glNewObjectBufferATI = GLContext.getFunctionAddress("glNewObjectBufferATI")) != 0 & + (glIsObjectBufferATI = GLContext.getFunctionAddress("glIsObjectBufferATI")) != 0 & + (glUpdateObjectBufferATI = GLContext.getFunctionAddress("glUpdateObjectBufferATI")) != 0 & + (glGetObjectBufferfvATI = GLContext.getFunctionAddress("glGetObjectBufferfvATI")) != 0 & + (glGetObjectBufferivATI = GLContext.getFunctionAddress("glGetObjectBufferivATI")) != 0 & + (glFreeObjectBufferATI = GLContext.getFunctionAddress("glFreeObjectBufferATI")) != 0 & + (glArrayObjectATI = GLContext.getFunctionAddress("glArrayObjectATI")) != 0 & + (glGetArrayObjectfvATI = GLContext.getFunctionAddress("glGetArrayObjectfvATI")) != 0 & + (glGetArrayObjectivATI = GLContext.getFunctionAddress("glGetArrayObjectivATI")) != 0 & + (glVariantArrayObjectATI = GLContext.getFunctionAddress("glVariantArrayObjectATI")) != 0 & + (glGetVariantArrayObjectfvATI = GLContext.getFunctionAddress("glGetVariantArrayObjectfvATI")) != 0 & + (glGetVariantArrayObjectivATI = GLContext.getFunctionAddress("glGetVariantArrayObjectivATI")) != 0; + } + + private boolean ATI_vertex_attrib_array_object_initNativeFunctionAddresses() { + return + (glVertexAttribArrayObjectATI = GLContext.getFunctionAddress("glVertexAttribArrayObjectATI")) != 0 & + (glGetVertexAttribArrayObjectfvATI = GLContext.getFunctionAddress("glGetVertexAttribArrayObjectfvATI")) != 0 & + (glGetVertexAttribArrayObjectivATI = GLContext.getFunctionAddress("glGetVertexAttribArrayObjectivATI")) != 0; + } + + private boolean ATI_vertex_streams_initNativeFunctionAddresses() { + return + (glVertexStream2fATI = GLContext.getFunctionAddress("glVertexStream2fATI")) != 0 & + (glVertexStream2dATI = GLContext.getFunctionAddress("glVertexStream2dATI")) != 0 & + (glVertexStream2iATI = GLContext.getFunctionAddress("glVertexStream2iATI")) != 0 & + (glVertexStream2sATI = GLContext.getFunctionAddress("glVertexStream2sATI")) != 0 & + (glVertexStream3fATI = GLContext.getFunctionAddress("glVertexStream3fATI")) != 0 & + (glVertexStream3dATI = GLContext.getFunctionAddress("glVertexStream3dATI")) != 0 & + (glVertexStream3iATI = GLContext.getFunctionAddress("glVertexStream3iATI")) != 0 & + (glVertexStream3sATI = GLContext.getFunctionAddress("glVertexStream3sATI")) != 0 & + (glVertexStream4fATI = GLContext.getFunctionAddress("glVertexStream4fATI")) != 0 & + (glVertexStream4dATI = GLContext.getFunctionAddress("glVertexStream4dATI")) != 0 & + (glVertexStream4iATI = GLContext.getFunctionAddress("glVertexStream4iATI")) != 0 & + (glVertexStream4sATI = GLContext.getFunctionAddress("glVertexStream4sATI")) != 0 & + (glNormalStream3bATI = GLContext.getFunctionAddress("glNormalStream3bATI")) != 0 & + (glNormalStream3fATI = GLContext.getFunctionAddress("glNormalStream3fATI")) != 0 & + (glNormalStream3dATI = GLContext.getFunctionAddress("glNormalStream3dATI")) != 0 & + (glNormalStream3iATI = GLContext.getFunctionAddress("glNormalStream3iATI")) != 0 & + (glNormalStream3sATI = GLContext.getFunctionAddress("glNormalStream3sATI")) != 0 & + (glClientActiveVertexStreamATI = GLContext.getFunctionAddress("glClientActiveVertexStreamATI")) != 0 & + (glVertexBlendEnvfATI = GLContext.getFunctionAddress("glVertexBlendEnvfATI")) != 0 & + (glVertexBlendEnviATI = GLContext.getFunctionAddress("glVertexBlendEnviATI")) != 0; + } + + private boolean EXT_bindable_uniform_initNativeFunctionAddresses() { + return + (glUniformBufferEXT = GLContext.getFunctionAddress("glUniformBufferEXT")) != 0 & + (glGetUniformBufferSizeEXT = GLContext.getFunctionAddress("glGetUniformBufferSizeEXT")) != 0 & + (glGetUniformOffsetEXT = GLContext.getFunctionAddress("glGetUniformOffsetEXT")) != 0; + } + + private boolean EXT_blend_color_initNativeFunctionAddresses() { + return + (glBlendColorEXT = GLContext.getFunctionAddress("glBlendColorEXT")) != 0; + } + + private boolean EXT_blend_equation_separate_initNativeFunctionAddresses() { + return + (glBlendEquationSeparateEXT = GLContext.getFunctionAddress("glBlendEquationSeparateEXT")) != 0; + } + + private boolean EXT_blend_func_separate_initNativeFunctionAddresses() { + return + (glBlendFuncSeparateEXT = GLContext.getFunctionAddress("glBlendFuncSeparateEXT")) != 0; + } + + private boolean EXT_blend_minmax_initNativeFunctionAddresses() { + return + (glBlendEquationEXT = GLContext.getFunctionAddress("glBlendEquationEXT")) != 0; + } + + private boolean EXT_compiled_vertex_array_initNativeFunctionAddresses() { + return + (glLockArraysEXT = GLContext.getFunctionAddress("glLockArraysEXT")) != 0 & + (glUnlockArraysEXT = GLContext.getFunctionAddress("glUnlockArraysEXT")) != 0; + } + + private boolean EXT_depth_bounds_test_initNativeFunctionAddresses() { + return + (glDepthBoundsEXT = GLContext.getFunctionAddress("glDepthBoundsEXT")) != 0; + } + + private boolean EXT_direct_state_access_initNativeFunctionAddresses(boolean forwardCompatible,Set<String> supported_extensions) { + return + (forwardCompatible || (glClientAttribDefaultEXT = GLContext.getFunctionAddress("glClientAttribDefaultEXT")) != 0) & + (forwardCompatible || (glPushClientAttribDefaultEXT = GLContext.getFunctionAddress("glPushClientAttribDefaultEXT")) != 0) & + (forwardCompatible || (glMatrixLoadfEXT = GLContext.getFunctionAddress("glMatrixLoadfEXT")) != 0) & + (forwardCompatible || (glMatrixLoaddEXT = GLContext.getFunctionAddress("glMatrixLoaddEXT")) != 0) & + (forwardCompatible || (glMatrixMultfEXT = GLContext.getFunctionAddress("glMatrixMultfEXT")) != 0) & + (forwardCompatible || (glMatrixMultdEXT = GLContext.getFunctionAddress("glMatrixMultdEXT")) != 0) & + (forwardCompatible || (glMatrixLoadIdentityEXT = GLContext.getFunctionAddress("glMatrixLoadIdentityEXT")) != 0) & + (forwardCompatible || (glMatrixRotatefEXT = GLContext.getFunctionAddress("glMatrixRotatefEXT")) != 0) & + (forwardCompatible || (glMatrixRotatedEXT = GLContext.getFunctionAddress("glMatrixRotatedEXT")) != 0) & + (forwardCompatible || (glMatrixScalefEXT = GLContext.getFunctionAddress("glMatrixScalefEXT")) != 0) & + (forwardCompatible || (glMatrixScaledEXT = GLContext.getFunctionAddress("glMatrixScaledEXT")) != 0) & + (forwardCompatible || (glMatrixTranslatefEXT = GLContext.getFunctionAddress("glMatrixTranslatefEXT")) != 0) & + (forwardCompatible || (glMatrixTranslatedEXT = GLContext.getFunctionAddress("glMatrixTranslatedEXT")) != 0) & + (forwardCompatible || (glMatrixOrthoEXT = GLContext.getFunctionAddress("glMatrixOrthoEXT")) != 0) & + (forwardCompatible || (glMatrixFrustumEXT = GLContext.getFunctionAddress("glMatrixFrustumEXT")) != 0) & + (forwardCompatible || (glMatrixPushEXT = GLContext.getFunctionAddress("glMatrixPushEXT")) != 0) & + (forwardCompatible || (glMatrixPopEXT = GLContext.getFunctionAddress("glMatrixPopEXT")) != 0) & + (glTextureParameteriEXT = GLContext.getFunctionAddress("glTextureParameteriEXT")) != 0 & + (glTextureParameterivEXT = GLContext.getFunctionAddress("glTextureParameterivEXT")) != 0 & + (glTextureParameterfEXT = GLContext.getFunctionAddress("glTextureParameterfEXT")) != 0 & + (glTextureParameterfvEXT = GLContext.getFunctionAddress("glTextureParameterfvEXT")) != 0 & + (glTextureImage1DEXT = GLContext.getFunctionAddress("glTextureImage1DEXT")) != 0 & + (glTextureImage2DEXT = GLContext.getFunctionAddress("glTextureImage2DEXT")) != 0 & + (glTextureSubImage1DEXT = GLContext.getFunctionAddress("glTextureSubImage1DEXT")) != 0 & + (glTextureSubImage2DEXT = GLContext.getFunctionAddress("glTextureSubImage2DEXT")) != 0 & + (glCopyTextureImage1DEXT = GLContext.getFunctionAddress("glCopyTextureImage1DEXT")) != 0 & + (glCopyTextureImage2DEXT = GLContext.getFunctionAddress("glCopyTextureImage2DEXT")) != 0 & + (glCopyTextureSubImage1DEXT = GLContext.getFunctionAddress("glCopyTextureSubImage1DEXT")) != 0 & + (glCopyTextureSubImage2DEXT = GLContext.getFunctionAddress("glCopyTextureSubImage2DEXT")) != 0 & + (glGetTextureImageEXT = GLContext.getFunctionAddress("glGetTextureImageEXT")) != 0 & + (glGetTextureParameterfvEXT = GLContext.getFunctionAddress("glGetTextureParameterfvEXT")) != 0 & + (glGetTextureParameterivEXT = GLContext.getFunctionAddress("glGetTextureParameterivEXT")) != 0 & + (glGetTextureLevelParameterfvEXT = GLContext.getFunctionAddress("glGetTextureLevelParameterfvEXT")) != 0 & + (glGetTextureLevelParameterivEXT = GLContext.getFunctionAddress("glGetTextureLevelParameterivEXT")) != 0 & + (!supported_extensions.contains("OpenGL12") || (glTextureImage3DEXT = GLContext.getFunctionAddress("glTextureImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL12") || (glTextureSubImage3DEXT = GLContext.getFunctionAddress("glTextureSubImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL12") || (glCopyTextureSubImage3DEXT = GLContext.getFunctionAddress("glCopyTextureSubImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glBindMultiTextureEXT = GLContext.getFunctionAddress("glBindMultiTextureEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexCoordPointerEXT = GLContext.getFunctionAddress("glMultiTexCoordPointerEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexEnvfEXT = GLContext.getFunctionAddress("glMultiTexEnvfEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexEnvfvEXT = GLContext.getFunctionAddress("glMultiTexEnvfvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexEnviEXT = GLContext.getFunctionAddress("glMultiTexEnviEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexEnvivEXT = GLContext.getFunctionAddress("glMultiTexEnvivEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGendEXT = GLContext.getFunctionAddress("glMultiTexGendEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGendvEXT = GLContext.getFunctionAddress("glMultiTexGendvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGenfEXT = GLContext.getFunctionAddress("glMultiTexGenfEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGenfvEXT = GLContext.getFunctionAddress("glMultiTexGenfvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGeniEXT = GLContext.getFunctionAddress("glMultiTexGeniEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMultiTexGenivEXT = GLContext.getFunctionAddress("glMultiTexGenivEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glGetMultiTexEnvfvEXT = GLContext.getFunctionAddress("glGetMultiTexEnvfvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glGetMultiTexEnvivEXT = GLContext.getFunctionAddress("glGetMultiTexEnvivEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glGetMultiTexGendvEXT = GLContext.getFunctionAddress("glGetMultiTexGendvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glGetMultiTexGenfvEXT = GLContext.getFunctionAddress("glGetMultiTexGenfvEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glGetMultiTexGenivEXT = GLContext.getFunctionAddress("glGetMultiTexGenivEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexParameteriEXT = GLContext.getFunctionAddress("glMultiTexParameteriEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexParameterivEXT = GLContext.getFunctionAddress("glMultiTexParameterivEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexParameterfEXT = GLContext.getFunctionAddress("glMultiTexParameterfEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexParameterfvEXT = GLContext.getFunctionAddress("glMultiTexParameterfvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexImage1DEXT = GLContext.getFunctionAddress("glMultiTexImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexImage2DEXT = GLContext.getFunctionAddress("glMultiTexImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexSubImage1DEXT = GLContext.getFunctionAddress("glMultiTexSubImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexSubImage2DEXT = GLContext.getFunctionAddress("glMultiTexSubImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCopyMultiTexImage1DEXT = GLContext.getFunctionAddress("glCopyMultiTexImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCopyMultiTexImage2DEXT = GLContext.getFunctionAddress("glCopyMultiTexImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCopyMultiTexSubImage1DEXT = GLContext.getFunctionAddress("glCopyMultiTexSubImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCopyMultiTexSubImage2DEXT = GLContext.getFunctionAddress("glCopyMultiTexSubImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetMultiTexImageEXT = GLContext.getFunctionAddress("glGetMultiTexImageEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetMultiTexParameterfvEXT = GLContext.getFunctionAddress("glGetMultiTexParameterfvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetMultiTexParameterivEXT = GLContext.getFunctionAddress("glGetMultiTexParameterivEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetMultiTexLevelParameterfvEXT = GLContext.getFunctionAddress("glGetMultiTexLevelParameterfvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetMultiTexLevelParameterivEXT = GLContext.getFunctionAddress("glGetMultiTexLevelParameterivEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexImage3DEXT = GLContext.getFunctionAddress("glMultiTexImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glMultiTexSubImage3DEXT = GLContext.getFunctionAddress("glMultiTexSubImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCopyMultiTexSubImage3DEXT = GLContext.getFunctionAddress("glCopyMultiTexSubImage3DEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glEnableClientStateIndexedEXT = GLContext.getFunctionAddress("glEnableClientStateIndexedEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glDisableClientStateIndexedEXT = GLContext.getFunctionAddress("glDisableClientStateIndexedEXT")) != 0) & + ((!supported_extensions.contains("OpenGL30") || (glEnableClientStateiEXT = GLContext.getFunctionAddress("glEnableClientStateiEXT")) != 0) || true) & + ((!supported_extensions.contains("OpenGL30") || (glDisableClientStateiEXT = GLContext.getFunctionAddress("glDisableClientStateiEXT")) != 0) || true) & + (!supported_extensions.contains("OpenGL13") || (glGetFloatIndexedvEXT = GLContext.getFunctionAddress("glGetFloatIndexedvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetDoubleIndexedvEXT = GLContext.getFunctionAddress("glGetDoubleIndexedvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetPointerIndexedvEXT = GLContext.getFunctionAddress("glGetPointerIndexedvEXT")) != 0) & + ((!supported_extensions.contains("OpenGL30") || (glGetFloati_vEXT = GLContext.getFunctionAddress("glGetFloati_vEXT")) != 0) || true) & + ((!supported_extensions.contains("OpenGL30") || (glGetDoublei_vEXT = GLContext.getFunctionAddress("glGetDoublei_vEXT")) != 0) || true) & + ((!supported_extensions.contains("OpenGL30") || (glGetPointeri_vEXT = GLContext.getFunctionAddress("glGetPointeri_vEXT")) != 0) || true) & + (!supported_extensions.contains("OpenGL13") || (glEnableIndexedEXT = GLContext.getFunctionAddress("glEnableIndexedEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glDisableIndexedEXT = GLContext.getFunctionAddress("glDisableIndexedEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glIsEnabledIndexedEXT = GLContext.getFunctionAddress("glIsEnabledIndexedEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetIntegerIndexedvEXT = GLContext.getFunctionAddress("glGetIntegerIndexedvEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetBooleanIndexedvEXT = GLContext.getFunctionAddress("glGetBooleanIndexedvEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glNamedProgramStringEXT = GLContext.getFunctionAddress("glNamedProgramStringEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glNamedProgramLocalParameter4dEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameter4dEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glNamedProgramLocalParameter4dvEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameter4dvEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glNamedProgramLocalParameter4fEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameter4fEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glNamedProgramLocalParameter4fvEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameter4fvEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glGetNamedProgramLocalParameterdvEXT = GLContext.getFunctionAddress("glGetNamedProgramLocalParameterdvEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glGetNamedProgramLocalParameterfvEXT = GLContext.getFunctionAddress("glGetNamedProgramLocalParameterfvEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glGetNamedProgramivEXT = GLContext.getFunctionAddress("glGetNamedProgramivEXT")) != 0) & + (!supported_extensions.contains("GL_ARB_vertex_program") || (glGetNamedProgramStringEXT = GLContext.getFunctionAddress("glGetNamedProgramStringEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureImage3DEXT = GLContext.getFunctionAddress("glCompressedTextureImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureImage2DEXT = GLContext.getFunctionAddress("glCompressedTextureImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureImage1DEXT = GLContext.getFunctionAddress("glCompressedTextureImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureSubImage3DEXT = GLContext.getFunctionAddress("glCompressedTextureSubImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureSubImage2DEXT = GLContext.getFunctionAddress("glCompressedTextureSubImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedTextureSubImage1DEXT = GLContext.getFunctionAddress("glCompressedTextureSubImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetCompressedTextureImageEXT = GLContext.getFunctionAddress("glGetCompressedTextureImageEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexImage3DEXT = GLContext.getFunctionAddress("glCompressedMultiTexImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexImage2DEXT = GLContext.getFunctionAddress("glCompressedMultiTexImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexImage1DEXT = GLContext.getFunctionAddress("glCompressedMultiTexImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexSubImage3DEXT = GLContext.getFunctionAddress("glCompressedMultiTexSubImage3DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexSubImage2DEXT = GLContext.getFunctionAddress("glCompressedMultiTexSubImage2DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glCompressedMultiTexSubImage1DEXT = GLContext.getFunctionAddress("glCompressedMultiTexSubImage1DEXT")) != 0) & + (!supported_extensions.contains("OpenGL13") || (glGetCompressedMultiTexImageEXT = GLContext.getFunctionAddress("glGetCompressedMultiTexImageEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMatrixLoadTransposefEXT = GLContext.getFunctionAddress("glMatrixLoadTransposefEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMatrixLoadTransposedEXT = GLContext.getFunctionAddress("glMatrixLoadTransposedEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMatrixMultTransposefEXT = GLContext.getFunctionAddress("glMatrixMultTransposefEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL13") || (glMatrixMultTransposedEXT = GLContext.getFunctionAddress("glMatrixMultTransposedEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glNamedBufferDataEXT = GLContext.getFunctionAddress("glNamedBufferDataEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glNamedBufferSubDataEXT = GLContext.getFunctionAddress("glNamedBufferSubDataEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glMapNamedBufferEXT = GLContext.getFunctionAddress("glMapNamedBufferEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glUnmapNamedBufferEXT = GLContext.getFunctionAddress("glUnmapNamedBufferEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glGetNamedBufferParameterivEXT = GLContext.getFunctionAddress("glGetNamedBufferParameterivEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glGetNamedBufferPointervEXT = GLContext.getFunctionAddress("glGetNamedBufferPointervEXT")) != 0) & + (!supported_extensions.contains("OpenGL15") || (glGetNamedBufferSubDataEXT = GLContext.getFunctionAddress("glGetNamedBufferSubDataEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform1fEXT = GLContext.getFunctionAddress("glProgramUniform1fEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform2fEXT = GLContext.getFunctionAddress("glProgramUniform2fEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform3fEXT = GLContext.getFunctionAddress("glProgramUniform3fEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform4fEXT = GLContext.getFunctionAddress("glProgramUniform4fEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform1iEXT = GLContext.getFunctionAddress("glProgramUniform1iEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform2iEXT = GLContext.getFunctionAddress("glProgramUniform2iEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform3iEXT = GLContext.getFunctionAddress("glProgramUniform3iEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform4iEXT = GLContext.getFunctionAddress("glProgramUniform4iEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform1fvEXT = GLContext.getFunctionAddress("glProgramUniform1fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform2fvEXT = GLContext.getFunctionAddress("glProgramUniform2fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform3fvEXT = GLContext.getFunctionAddress("glProgramUniform3fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform4fvEXT = GLContext.getFunctionAddress("glProgramUniform4fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform1ivEXT = GLContext.getFunctionAddress("glProgramUniform1ivEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform2ivEXT = GLContext.getFunctionAddress("glProgramUniform2ivEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform3ivEXT = GLContext.getFunctionAddress("glProgramUniform3ivEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniform4ivEXT = GLContext.getFunctionAddress("glProgramUniform4ivEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniformMatrix2fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniformMatrix3fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL20") || (glProgramUniformMatrix4fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix2x3fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2x3fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix3x2fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3x2fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix2x4fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix2x4fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix4x2fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4x2fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix3x4fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix3x4fvEXT")) != 0) & + (!supported_extensions.contains("OpenGL21") || (glProgramUniformMatrix4x3fvEXT = GLContext.getFunctionAddress("glProgramUniformMatrix4x3fvEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_buffer_object") || (glTextureBufferEXT = GLContext.getFunctionAddress("glTextureBufferEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_buffer_object") || (glMultiTexBufferEXT = GLContext.getFunctionAddress("glMultiTexBufferEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glTextureParameterIivEXT = GLContext.getFunctionAddress("glTextureParameterIivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glTextureParameterIuivEXT = GLContext.getFunctionAddress("glTextureParameterIuivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glGetTextureParameterIivEXT = GLContext.getFunctionAddress("glGetTextureParameterIivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glGetTextureParameterIuivEXT = GLContext.getFunctionAddress("glGetTextureParameterIuivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glMultiTexParameterIivEXT = GLContext.getFunctionAddress("glMultiTexParameterIivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glMultiTexParameterIuivEXT = GLContext.getFunctionAddress("glMultiTexParameterIuivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glGetMultiTexParameterIivEXT = GLContext.getFunctionAddress("glGetMultiTexParameterIivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_texture_integer") || (glGetMultiTexParameterIuivEXT = GLContext.getFunctionAddress("glGetMultiTexParameterIuivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform1uiEXT = GLContext.getFunctionAddress("glProgramUniform1uiEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform2uiEXT = GLContext.getFunctionAddress("glProgramUniform2uiEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform3uiEXT = GLContext.getFunctionAddress("glProgramUniform3uiEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform4uiEXT = GLContext.getFunctionAddress("glProgramUniform4uiEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform1uivEXT = GLContext.getFunctionAddress("glProgramUniform1uivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform2uivEXT = GLContext.getFunctionAddress("glProgramUniform2uivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform3uivEXT = GLContext.getFunctionAddress("glProgramUniform3uivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_shader4") || (glProgramUniform4uivEXT = GLContext.getFunctionAddress("glProgramUniform4uivEXT")) != 0) & + (!supported_extensions.contains("GL_EXT_gpu_program_parameters") || (glNamedProgramLocalParameters4fvEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameters4fvEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParameterI4iEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameterI4iEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParameterI4ivEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameterI4ivEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParametersI4ivEXT = GLContext.getFunctionAddress("glNamedProgramLocalParametersI4ivEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParameterI4uiEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameterI4uiEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParameterI4uivEXT = GLContext.getFunctionAddress("glNamedProgramLocalParameterI4uivEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glNamedProgramLocalParametersI4uivEXT = GLContext.getFunctionAddress("glNamedProgramLocalParametersI4uivEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glGetNamedProgramLocalParameterIivEXT = GLContext.getFunctionAddress("glGetNamedProgramLocalParameterIivEXT")) != 0) & + (!supported_extensions.contains("GL_NV_gpu_program4") || (glGetNamedProgramLocalParameterIuivEXT = GLContext.getFunctionAddress("glGetNamedProgramLocalParameterIuivEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glNamedRenderbufferStorageEXT = GLContext.getFunctionAddress("glNamedRenderbufferStorageEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glGetNamedRenderbufferParameterivEXT = GLContext.getFunctionAddress("glGetNamedRenderbufferParameterivEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_multisample")) || (glNamedRenderbufferStorageMultisampleEXT = GLContext.getFunctionAddress("glNamedRenderbufferStorageMultisampleEXT")) != 0) & + (!supported_extensions.contains("GL_NV_framebuffer_multisample_coverage") || (glNamedRenderbufferStorageMultisampleCoverageEXT = GLContext.getFunctionAddress("glNamedRenderbufferStorageMultisampleCoverageEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glCheckNamedFramebufferStatusEXT = GLContext.getFunctionAddress("glCheckNamedFramebufferStatusEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glNamedFramebufferTexture1DEXT = GLContext.getFunctionAddress("glNamedFramebufferTexture1DEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glNamedFramebufferTexture2DEXT = GLContext.getFunctionAddress("glNamedFramebufferTexture2DEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glNamedFramebufferTexture3DEXT = GLContext.getFunctionAddress("glNamedFramebufferTexture3DEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glNamedFramebufferRenderbufferEXT = GLContext.getFunctionAddress("glNamedFramebufferRenderbufferEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glGetNamedFramebufferAttachmentParameterivEXT = GLContext.getFunctionAddress("glGetNamedFramebufferAttachmentParameterivEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glGenerateTextureMipmapEXT = GLContext.getFunctionAddress("glGenerateTextureMipmapEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glGenerateMultiTexMipmapEXT = GLContext.getFunctionAddress("glGenerateMultiTexMipmapEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glFramebufferDrawBufferEXT = GLContext.getFunctionAddress("glFramebufferDrawBufferEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glFramebufferDrawBuffersEXT = GLContext.getFunctionAddress("glFramebufferDrawBuffersEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glFramebufferReadBufferEXT = GLContext.getFunctionAddress("glFramebufferReadBufferEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL30") || supported_extensions.contains("GL_EXT_framebuffer_object")) || (glGetFramebufferParameterivEXT = GLContext.getFunctionAddress("glGetFramebufferParameterivEXT")) != 0) & + (!(false || supported_extensions.contains("OpenGL31") || supported_extensions.contains("GL_ARB_copy_buffer")) || (glNamedCopyBufferSubDataEXT = GLContext.getFunctionAddress("glNamedCopyBufferSubDataEXT")) != 0) & + (!(false || supported_extensions.contains("GL_EXT_geometry_shader4") || supported_extensions.contains("GL_NV_geometry_program4")) || (glNamedFramebufferTextureEXT = GLContext.getFunctionAddress("glNamedFramebufferTextureEXT")) != 0) & + (!(false || supported_extensions.contains("GL_EXT_geometry_shader4") || supported_extensions.contains("GL_NV_geometry_program4")) || (glNamedFramebufferTextureLayerEXT = GLContext.getFunctionAddress("glNamedFramebufferTextureLayerEXT")) != 0) & + (!(false || supported_extensions.contains("GL_EXT_geometry_shader4") || supported_extensions.contains("GL_NV_geometry_program4")) || (glNamedFramebufferTextureFaceEXT = GLContext.getFunctionAddress("glNamedFramebufferTextureFaceEXT")) != 0) & + (!supported_extensions.contains("GL_NV_explicit_multisample") || (glTextureRenderbufferEXT = GLContext.getFunctionAddress("glTextureRenderbufferEXT")) != 0) & + (!supported_extensions.contains("GL_NV_explicit_multisample") || (glMultiTexRenderbufferEXT = GLContext.getFunctionAddress("glMultiTexRenderbufferEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayVertexOffsetEXT = GLContext.getFunctionAddress("glVertexArrayVertexOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayColorOffsetEXT = GLContext.getFunctionAddress("glVertexArrayColorOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayEdgeFlagOffsetEXT = GLContext.getFunctionAddress("glVertexArrayEdgeFlagOffsetEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glVertexArrayIndexOffsetEXT = GLContext.getFunctionAddress("glVertexArrayIndexOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayNormalOffsetEXT = GLContext.getFunctionAddress("glVertexArrayNormalOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayTexCoordOffsetEXT = GLContext.getFunctionAddress("glVertexArrayTexCoordOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayMultiTexCoordOffsetEXT = GLContext.getFunctionAddress("glVertexArrayMultiTexCoordOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArrayFogCoordOffsetEXT = GLContext.getFunctionAddress("glVertexArrayFogCoordOffsetEXT")) != 0) & + (forwardCompatible || !supported_extensions.contains("OpenGL30") || (glVertexArraySecondaryColorOffsetEXT = GLContext.getFunctionAddress("glVertexArraySecondaryColorOffsetEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glVertexArrayVertexAttribOffsetEXT = GLContext.getFunctionAddress("glVertexArrayVertexAttribOffsetEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glVertexArrayVertexAttribIOffsetEXT = GLContext.getFunctionAddress("glVertexArrayVertexAttribIOffsetEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glEnableVertexArrayEXT = GLContext.getFunctionAddress("glEnableVertexArrayEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glDisableVertexArrayEXT = GLContext.getFunctionAddress("glDisableVertexArrayEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glEnableVertexArrayAttribEXT = GLContext.getFunctionAddress("glEnableVertexArrayAttribEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glDisableVertexArrayAttribEXT = GLContext.getFunctionAddress("glDisableVertexArrayAttribEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glGetVertexArrayIntegervEXT = GLContext.getFunctionAddress("glGetVertexArrayIntegervEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glGetVertexArrayPointervEXT = GLContext.getFunctionAddress("glGetVertexArrayPointervEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glGetVertexArrayIntegeri_vEXT = GLContext.getFunctionAddress("glGetVertexArrayIntegeri_vEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glGetVertexArrayPointeri_vEXT = GLContext.getFunctionAddress("glGetVertexArrayPointeri_vEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glMapNamedBufferRangeEXT = GLContext.getFunctionAddress("glMapNamedBufferRangeEXT")) != 0) & + (!supported_extensions.contains("OpenGL30") || (glFlushMappedNamedBufferRangeEXT = GLContext.getFunctionAddress("glFlushMappedNamedBufferRangeEXT")) != 0); + } + + private boolean EXT_draw_buffers2_initNativeFunctionAddresses() { + return + (glColorMaskIndexedEXT = GLContext.getFunctionAddress("glColorMaskIndexedEXT")) != 0 & + (glGetBooleanIndexedvEXT = GLContext.getFunctionAddress("glGetBooleanIndexedvEXT")) != 0 & + (glGetIntegerIndexedvEXT = GLContext.getFunctionAddress("glGetIntegerIndexedvEXT")) != 0 & + (glEnableIndexedEXT = GLContext.getFunctionAddress("glEnableIndexedEXT")) != 0 & + (glDisableIndexedEXT = GLContext.getFunctionAddress("glDisableIndexedEXT")) != 0 & + (glIsEnabledIndexedEXT = GLContext.getFunctionAddress("glIsEnabledIndexedEXT")) != 0; + } + + private boolean EXT_draw_instanced_initNativeFunctionAddresses() { + return + (glDrawArraysInstancedEXT = GLContext.getFunctionAddress("glDrawArraysInstancedEXT")) != 0 & + (glDrawElementsInstancedEXT = GLContext.getFunctionAddress("glDrawElementsInstancedEXT")) != 0; + } + + private boolean EXT_draw_range_elements_initNativeFunctionAddresses() { + return + (glDrawRangeElementsEXT = GLContext.getFunctionAddress("glDrawRangeElementsEXT")) != 0; + } + + private boolean EXT_fog_coord_initNativeFunctionAddresses() { + return + (glFogCoordfEXT = GLContext.getFunctionAddress("glFogCoordfEXT")) != 0 & + (glFogCoorddEXT = GLContext.getFunctionAddress("glFogCoorddEXT")) != 0 & + (glFogCoordPointerEXT = GLContext.getFunctionAddress("glFogCoordPointerEXT")) != 0; + } + + private boolean EXT_framebuffer_blit_initNativeFunctionAddresses() { + return + (glBlitFramebufferEXT = GLContext.getFunctionAddress("glBlitFramebufferEXT")) != 0; + } + + private boolean EXT_framebuffer_multisample_initNativeFunctionAddresses() { + return + (glRenderbufferStorageMultisampleEXT = GLContext.getFunctionAddress("glRenderbufferStorageMultisampleEXT")) != 0; + } + + private boolean EXT_framebuffer_object_initNativeFunctionAddresses() { + return + (glIsRenderbufferEXT = GLContext.getFunctionAddress("glIsRenderbufferEXT")) != 0 & + (glBindRenderbufferEXT = GLContext.getFunctionAddress("glBindRenderbufferEXT")) != 0 & + (glDeleteRenderbuffersEXT = GLContext.getFunctionAddress("glDeleteRenderbuffersEXT")) != 0 & + (glGenRenderbuffersEXT = GLContext.getFunctionAddress("glGenRenderbuffersEXT")) != 0 & + (glRenderbufferStorageEXT = GLContext.getFunctionAddress("glRenderbufferStorageEXT")) != 0 & + (glGetRenderbufferParameterivEXT = GLContext.getFunctionAddress("glGetRenderbufferParameterivEXT")) != 0 & + (glIsFramebufferEXT = GLContext.getFunctionAddress("glIsFramebufferEXT")) != 0 & + (glBindFramebufferEXT = GLContext.getFunctionAddress("glBindFramebufferEXT")) != 0 & + (glDeleteFramebuffersEXT = GLContext.getFunctionAddress("glDeleteFramebuffersEXT")) != 0 & + (glGenFramebuffersEXT = GLContext.getFunctionAddress("glGenFramebuffersEXT")) != 0 & + (glCheckFramebufferStatusEXT = GLContext.getFunctionAddress("glCheckFramebufferStatusEXT")) != 0 & + (glFramebufferTexture1DEXT = GLContext.getFunctionAddress("glFramebufferTexture1DEXT")) != 0 & + (glFramebufferTexture2DEXT = GLContext.getFunctionAddress("glFramebufferTexture2DEXT")) != 0 & + (glFramebufferTexture3DEXT = GLContext.getFunctionAddress("glFramebufferTexture3DEXT")) != 0 & + (glFramebufferRenderbufferEXT = GLContext.getFunctionAddress("glFramebufferRenderbufferEXT")) != 0 & + (glGetFramebufferAttachmentParameterivEXT = GLContext.getFunctionAddress("glGetFramebufferAttachmentParameterivEXT")) != 0 & + (glGenerateMipmapEXT = GLContext.getFunctionAddress("glGenerateMipmapEXT")) != 0; + } + + private boolean EXT_geometry_shader4_initNativeFunctionAddresses() { + return + (glProgramParameteriEXT = GLContext.getFunctionAddress("glProgramParameteriEXT")) != 0 & + (glFramebufferTextureEXT = GLContext.getFunctionAddress("glFramebufferTextureEXT")) != 0 & + (glFramebufferTextureLayerEXT = GLContext.getFunctionAddress("glFramebufferTextureLayerEXT")) != 0 & + (glFramebufferTextureFaceEXT = GLContext.getFunctionAddress("glFramebufferTextureFaceEXT")) != 0; + } + + private boolean EXT_gpu_program_parameters_initNativeFunctionAddresses() { + return + (glProgramEnvParameters4fvEXT = GLContext.getFunctionAddress("glProgramEnvParameters4fvEXT")) != 0 & + (glProgramLocalParameters4fvEXT = GLContext.getFunctionAddress("glProgramLocalParameters4fvEXT")) != 0; + } + + private boolean EXT_gpu_shader4_initNativeFunctionAddresses() { + return + (glVertexAttribI1iEXT = GLContext.getFunctionAddress("glVertexAttribI1iEXT")) != 0 & + (glVertexAttribI2iEXT = GLContext.getFunctionAddress("glVertexAttribI2iEXT")) != 0 & + (glVertexAttribI3iEXT = GLContext.getFunctionAddress("glVertexAttribI3iEXT")) != 0 & + (glVertexAttribI4iEXT = GLContext.getFunctionAddress("glVertexAttribI4iEXT")) != 0 & + (glVertexAttribI1uiEXT = GLContext.getFunctionAddress("glVertexAttribI1uiEXT")) != 0 & + (glVertexAttribI2uiEXT = GLContext.getFunctionAddress("glVertexAttribI2uiEXT")) != 0 & + (glVertexAttribI3uiEXT = GLContext.getFunctionAddress("glVertexAttribI3uiEXT")) != 0 & + (glVertexAttribI4uiEXT = GLContext.getFunctionAddress("glVertexAttribI4uiEXT")) != 0 & + (glVertexAttribI1ivEXT = GLContext.getFunctionAddress("glVertexAttribI1ivEXT")) != 0 & + (glVertexAttribI2ivEXT = GLContext.getFunctionAddress("glVertexAttribI2ivEXT")) != 0 & + (glVertexAttribI3ivEXT = GLContext.getFunctionAddress("glVertexAttribI3ivEXT")) != 0 & + (glVertexAttribI4ivEXT = GLContext.getFunctionAddress("glVertexAttribI4ivEXT")) != 0 & + (glVertexAttribI1uivEXT = GLContext.getFunctionAddress("glVertexAttribI1uivEXT")) != 0 & + (glVertexAttribI2uivEXT = GLContext.getFunctionAddress("glVertexAttribI2uivEXT")) != 0 & + (glVertexAttribI3uivEXT = GLContext.getFunctionAddress("glVertexAttribI3uivEXT")) != 0 & + (glVertexAttribI4uivEXT = GLContext.getFunctionAddress("glVertexAttribI4uivEXT")) != 0 & + (glVertexAttribI4bvEXT = GLContext.getFunctionAddress("glVertexAttribI4bvEXT")) != 0 & + (glVertexAttribI4svEXT = GLContext.getFunctionAddress("glVertexAttribI4svEXT")) != 0 & + (glVertexAttribI4ubvEXT = GLContext.getFunctionAddress("glVertexAttribI4ubvEXT")) != 0 & + (glVertexAttribI4usvEXT = GLContext.getFunctionAddress("glVertexAttribI4usvEXT")) != 0 & + (glVertexAttribIPointerEXT = GLContext.getFunctionAddress("glVertexAttribIPointerEXT")) != 0 & + (glGetVertexAttribIivEXT = GLContext.getFunctionAddress("glGetVertexAttribIivEXT")) != 0 & + (glGetVertexAttribIuivEXT = GLContext.getFunctionAddress("glGetVertexAttribIuivEXT")) != 0 & + (glUniform1uiEXT = GLContext.getFunctionAddress("glUniform1uiEXT")) != 0 & + (glUniform2uiEXT = GLContext.getFunctionAddress("glUniform2uiEXT")) != 0 & + (glUniform3uiEXT = GLContext.getFunctionAddress("glUniform3uiEXT")) != 0 & + (glUniform4uiEXT = GLContext.getFunctionAddress("glUniform4uiEXT")) != 0 & + (glUniform1uivEXT = GLContext.getFunctionAddress("glUniform1uivEXT")) != 0 & + (glUniform2uivEXT = GLContext.getFunctionAddress("glUniform2uivEXT")) != 0 & + (glUniform3uivEXT = GLContext.getFunctionAddress("glUniform3uivEXT")) != 0 & + (glUniform4uivEXT = GLContext.getFunctionAddress("glUniform4uivEXT")) != 0 & + (glGetUniformuivEXT = GLContext.getFunctionAddress("glGetUniformuivEXT")) != 0 & + (glBindFragDataLocationEXT = GLContext.getFunctionAddress("glBindFragDataLocationEXT")) != 0 & + (glGetFragDataLocationEXT = GLContext.getFunctionAddress("glGetFragDataLocationEXT")) != 0; + } + + private boolean EXT_multi_draw_arrays_initNativeFunctionAddresses() { + return + (glMultiDrawArraysEXT = GLContext.getFunctionAddress("glMultiDrawArraysEXT")) != 0; + } + + private boolean EXT_paletted_texture_initNativeFunctionAddresses() { + return + (glColorTableEXT = GLContext.getFunctionAddress("glColorTableEXT")) != 0 & + (glColorSubTableEXT = GLContext.getFunctionAddress("glColorSubTableEXT")) != 0 & + (glGetColorTableEXT = GLContext.getFunctionAddress("glGetColorTableEXT")) != 0 & + (glGetColorTableParameterivEXT = GLContext.getFunctionAddress("glGetColorTableParameterivEXT")) != 0 & + (glGetColorTableParameterfvEXT = GLContext.getFunctionAddress("glGetColorTableParameterfvEXT")) != 0; + } + + private boolean EXT_point_parameters_initNativeFunctionAddresses() { + return + (glPointParameterfEXT = GLContext.getFunctionAddress("glPointParameterfEXT")) != 0 & + (glPointParameterfvEXT = GLContext.getFunctionAddress("glPointParameterfvEXT")) != 0; + } + + private boolean EXT_provoking_vertex_initNativeFunctionAddresses() { + return + (glProvokingVertexEXT = GLContext.getFunctionAddress("glProvokingVertexEXT")) != 0; + } + + private boolean EXT_secondary_color_initNativeFunctionAddresses() { + return + (glSecondaryColor3bEXT = GLContext.getFunctionAddress("glSecondaryColor3bEXT")) != 0 & + (glSecondaryColor3fEXT = GLContext.getFunctionAddress("glSecondaryColor3fEXT")) != 0 & + (glSecondaryColor3dEXT = GLContext.getFunctionAddress("glSecondaryColor3dEXT")) != 0 & + (glSecondaryColor3ubEXT = GLContext.getFunctionAddress("glSecondaryColor3ubEXT")) != 0 & + (glSecondaryColorPointerEXT = GLContext.getFunctionAddress("glSecondaryColorPointerEXT")) != 0; + } + + private boolean EXT_separate_shader_objects_initNativeFunctionAddresses() { + return + (glUseShaderProgramEXT = GLContext.getFunctionAddress("glUseShaderProgramEXT")) != 0 & + (glActiveProgramEXT = GLContext.getFunctionAddress("glActiveProgramEXT")) != 0 & + (glCreateShaderProgramEXT = GLContext.getFunctionAddress("glCreateShaderProgramEXT")) != 0; + } + + private boolean EXT_shader_image_load_store_initNativeFunctionAddresses() { + return + (glBindImageTextureEXT = GLContext.getFunctionAddress("glBindImageTextureEXT")) != 0 & + (glMemoryBarrierEXT = GLContext.getFunctionAddress("glMemoryBarrierEXT")) != 0; + } + + private boolean EXT_stencil_clear_tag_initNativeFunctionAddresses() { + return + (glStencilClearTagEXT = GLContext.getFunctionAddress("glStencilClearTagEXT")) != 0; + } + + private boolean EXT_stencil_two_side_initNativeFunctionAddresses() { + return + (glActiveStencilFaceEXT = GLContext.getFunctionAddress("glActiveStencilFaceEXT")) != 0; + } + + private boolean EXT_texture_array_initNativeFunctionAddresses() { + return + (glFramebufferTextureLayerEXT = GLContext.getFunctionAddress("glFramebufferTextureLayerEXT")) != 0; + } + + private boolean EXT_texture_buffer_object_initNativeFunctionAddresses() { + return + (glTexBufferEXT = GLContext.getFunctionAddress("glTexBufferEXT")) != 0; + } + + private boolean EXT_texture_integer_initNativeFunctionAddresses() { + return + (glClearColorIiEXT = GLContext.getFunctionAddress("glClearColorIiEXT")) != 0 & + (glClearColorIuiEXT = GLContext.getFunctionAddress("glClearColorIuiEXT")) != 0 & + (glTexParameterIivEXT = GLContext.getFunctionAddress("glTexParameterIivEXT")) != 0 & + (glTexParameterIuivEXT = GLContext.getFunctionAddress("glTexParameterIuivEXT")) != 0 & + (glGetTexParameterIivEXT = GLContext.getFunctionAddress("glGetTexParameterIivEXT")) != 0 & + (glGetTexParameterIuivEXT = GLContext.getFunctionAddress("glGetTexParameterIuivEXT")) != 0; + } + + private boolean EXT_timer_query_initNativeFunctionAddresses() { + return + (glGetQueryObjecti64vEXT = GLContext.getFunctionAddress("glGetQueryObjecti64vEXT")) != 0 & + (glGetQueryObjectui64vEXT = GLContext.getFunctionAddress("glGetQueryObjectui64vEXT")) != 0; + } + + private boolean EXT_transform_feedback_initNativeFunctionAddresses() { + return + (glBindBufferRangeEXT = GLContext.getFunctionAddress("glBindBufferRangeEXT")) != 0 & + (glBindBufferOffsetEXT = GLContext.getFunctionAddress("glBindBufferOffsetEXT")) != 0 & + (glBindBufferBaseEXT = GLContext.getFunctionAddress("glBindBufferBaseEXT")) != 0 & + (glBeginTransformFeedbackEXT = GLContext.getFunctionAddress("glBeginTransformFeedbackEXT")) != 0 & + (glEndTransformFeedbackEXT = GLContext.getFunctionAddress("glEndTransformFeedbackEXT")) != 0 & + (glTransformFeedbackVaryingsEXT = GLContext.getFunctionAddress("glTransformFeedbackVaryingsEXT")) != 0 & + (glGetTransformFeedbackVaryingEXT = GLContext.getFunctionAddress("glGetTransformFeedbackVaryingEXT")) != 0; + } + + private boolean EXT_vertex_attrib_64bit_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glVertexAttribL1dEXT = GLContext.getFunctionAddress("glVertexAttribL1dEXT")) != 0 & + (glVertexAttribL2dEXT = GLContext.getFunctionAddress("glVertexAttribL2dEXT")) != 0 & + (glVertexAttribL3dEXT = GLContext.getFunctionAddress("glVertexAttribL3dEXT")) != 0 & + (glVertexAttribL4dEXT = GLContext.getFunctionAddress("glVertexAttribL4dEXT")) != 0 & + (glVertexAttribL1dvEXT = GLContext.getFunctionAddress("glVertexAttribL1dvEXT")) != 0 & + (glVertexAttribL2dvEXT = GLContext.getFunctionAddress("glVertexAttribL2dvEXT")) != 0 & + (glVertexAttribL3dvEXT = GLContext.getFunctionAddress("glVertexAttribL3dvEXT")) != 0 & + (glVertexAttribL4dvEXT = GLContext.getFunctionAddress("glVertexAttribL4dvEXT")) != 0 & + (glVertexAttribLPointerEXT = GLContext.getFunctionAddress("glVertexAttribLPointerEXT")) != 0 & + (glGetVertexAttribLdvEXT = GLContext.getFunctionAddress("glGetVertexAttribLdvEXT")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glVertexArrayVertexAttribLOffsetEXT = GLContext.getFunctionAddress("glVertexArrayVertexAttribLOffsetEXT")) != 0); + } + + private boolean EXT_vertex_shader_initNativeFunctionAddresses() { + return + (glBeginVertexShaderEXT = GLContext.getFunctionAddress("glBeginVertexShaderEXT")) != 0 & + (glEndVertexShaderEXT = GLContext.getFunctionAddress("glEndVertexShaderEXT")) != 0 & + (glBindVertexShaderEXT = GLContext.getFunctionAddress("glBindVertexShaderEXT")) != 0 & + (glGenVertexShadersEXT = GLContext.getFunctionAddress("glGenVertexShadersEXT")) != 0 & + (glDeleteVertexShaderEXT = GLContext.getFunctionAddress("glDeleteVertexShaderEXT")) != 0 & + (glShaderOp1EXT = GLContext.getFunctionAddress("glShaderOp1EXT")) != 0 & + (glShaderOp2EXT = GLContext.getFunctionAddress("glShaderOp2EXT")) != 0 & + (glShaderOp3EXT = GLContext.getFunctionAddress("glShaderOp3EXT")) != 0 & + (glSwizzleEXT = GLContext.getFunctionAddress("glSwizzleEXT")) != 0 & + (glWriteMaskEXT = GLContext.getFunctionAddress("glWriteMaskEXT")) != 0 & + (glInsertComponentEXT = GLContext.getFunctionAddress("glInsertComponentEXT")) != 0 & + (glExtractComponentEXT = GLContext.getFunctionAddress("glExtractComponentEXT")) != 0 & + (glGenSymbolsEXT = GLContext.getFunctionAddress("glGenSymbolsEXT")) != 0 & + (glSetInvariantEXT = GLContext.getFunctionAddress("glSetInvariantEXT")) != 0 & + (glSetLocalConstantEXT = GLContext.getFunctionAddress("glSetLocalConstantEXT")) != 0 & + (glVariantbvEXT = GLContext.getFunctionAddress("glVariantbvEXT")) != 0 & + (glVariantsvEXT = GLContext.getFunctionAddress("glVariantsvEXT")) != 0 & + (glVariantivEXT = GLContext.getFunctionAddress("glVariantivEXT")) != 0 & + (glVariantfvEXT = GLContext.getFunctionAddress("glVariantfvEXT")) != 0 & + (glVariantdvEXT = GLContext.getFunctionAddress("glVariantdvEXT")) != 0 & + (glVariantubvEXT = GLContext.getFunctionAddress("glVariantubvEXT")) != 0 & + (glVariantusvEXT = GLContext.getFunctionAddress("glVariantusvEXT")) != 0 & + (glVariantuivEXT = GLContext.getFunctionAddress("glVariantuivEXT")) != 0 & + (glVariantPointerEXT = GLContext.getFunctionAddress("glVariantPointerEXT")) != 0 & + (glEnableVariantClientStateEXT = GLContext.getFunctionAddress("glEnableVariantClientStateEXT")) != 0 & + (glDisableVariantClientStateEXT = GLContext.getFunctionAddress("glDisableVariantClientStateEXT")) != 0 & + (glBindLightParameterEXT = GLContext.getFunctionAddress("glBindLightParameterEXT")) != 0 & + (glBindMaterialParameterEXT = GLContext.getFunctionAddress("glBindMaterialParameterEXT")) != 0 & + (glBindTexGenParameterEXT = GLContext.getFunctionAddress("glBindTexGenParameterEXT")) != 0 & + (glBindTextureUnitParameterEXT = GLContext.getFunctionAddress("glBindTextureUnitParameterEXT")) != 0 & + (glBindParameterEXT = GLContext.getFunctionAddress("glBindParameterEXT")) != 0 & + (glIsVariantEnabledEXT = GLContext.getFunctionAddress("glIsVariantEnabledEXT")) != 0 & + (glGetVariantBooleanvEXT = GLContext.getFunctionAddress("glGetVariantBooleanvEXT")) != 0 & + (glGetVariantIntegervEXT = GLContext.getFunctionAddress("glGetVariantIntegervEXT")) != 0 & + (glGetVariantFloatvEXT = GLContext.getFunctionAddress("glGetVariantFloatvEXT")) != 0 & + (glGetVariantPointervEXT = GLContext.getFunctionAddress("glGetVariantPointervEXT")) != 0 & + (glGetInvariantBooleanvEXT = GLContext.getFunctionAddress("glGetInvariantBooleanvEXT")) != 0 & + (glGetInvariantIntegervEXT = GLContext.getFunctionAddress("glGetInvariantIntegervEXT")) != 0 & + (glGetInvariantFloatvEXT = GLContext.getFunctionAddress("glGetInvariantFloatvEXT")) != 0 & + (glGetLocalConstantBooleanvEXT = GLContext.getFunctionAddress("glGetLocalConstantBooleanvEXT")) != 0 & + (glGetLocalConstantIntegervEXT = GLContext.getFunctionAddress("glGetLocalConstantIntegervEXT")) != 0 & + (glGetLocalConstantFloatvEXT = GLContext.getFunctionAddress("glGetLocalConstantFloatvEXT")) != 0; + } + + private boolean EXT_vertex_weighting_initNativeFunctionAddresses() { + return + (glVertexWeightfEXT = GLContext.getFunctionAddress("glVertexWeightfEXT")) != 0 & + (glVertexWeightPointerEXT = GLContext.getFunctionAddress("glVertexWeightPointerEXT")) != 0; + } + + private boolean GL11_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (forwardCompatible || (glAccum = GLContext.getFunctionAddress("glAccum")) != 0) & + (forwardCompatible || (glAlphaFunc = GLContext.getFunctionAddress("glAlphaFunc")) != 0) & + (glClearColor = GLContext.getFunctionAddress("glClearColor")) != 0 & + (forwardCompatible || (glClearAccum = GLContext.getFunctionAddress("glClearAccum")) != 0) & + (glClear = GLContext.getFunctionAddress("glClear")) != 0 & + (forwardCompatible || (glCallLists = GLContext.getFunctionAddress("glCallLists")) != 0) & + (forwardCompatible || (glCallList = GLContext.getFunctionAddress("glCallList")) != 0) & + (glBlendFunc = GLContext.getFunctionAddress("glBlendFunc")) != 0 & + (forwardCompatible || (glBitmap = GLContext.getFunctionAddress("glBitmap")) != 0) & + (glBindTexture = GLContext.getFunctionAddress("glBindTexture")) != 0 & + (forwardCompatible || (glPrioritizeTextures = GLContext.getFunctionAddress("glPrioritizeTextures")) != 0) & + (forwardCompatible || (glAreTexturesResident = GLContext.getFunctionAddress("glAreTexturesResident")) != 0) & + (forwardCompatible || (glBegin = GLContext.getFunctionAddress("glBegin")) != 0) & + (forwardCompatible || (glEnd = GLContext.getFunctionAddress("glEnd")) != 0) & + (glArrayElement = GLContext.getFunctionAddress("glArrayElement")) != 0 & + (glClearDepth = GLContext.getFunctionAddress("glClearDepth")) != 0 & + (forwardCompatible || (glDeleteLists = GLContext.getFunctionAddress("glDeleteLists")) != 0) & + (glDeleteTextures = GLContext.getFunctionAddress("glDeleteTextures")) != 0 & + (glCullFace = GLContext.getFunctionAddress("glCullFace")) != 0 & + (glCopyTexSubImage2D = GLContext.getFunctionAddress("glCopyTexSubImage2D")) != 0 & + (glCopyTexSubImage1D = GLContext.getFunctionAddress("glCopyTexSubImage1D")) != 0 & + (glCopyTexImage2D = GLContext.getFunctionAddress("glCopyTexImage2D")) != 0 & + (glCopyTexImage1D = GLContext.getFunctionAddress("glCopyTexImage1D")) != 0 & + (glCopyPixels = GLContext.getFunctionAddress("glCopyPixels")) != 0 & + (forwardCompatible || (glColorPointer = GLContext.getFunctionAddress("glColorPointer")) != 0) & + (forwardCompatible || (glColorMaterial = GLContext.getFunctionAddress("glColorMaterial")) != 0) & + (glColorMask = GLContext.getFunctionAddress("glColorMask")) != 0 & + (forwardCompatible || (glColor3b = GLContext.getFunctionAddress("glColor3b")) != 0) & + (forwardCompatible || (glColor3f = GLContext.getFunctionAddress("glColor3f")) != 0) & + (forwardCompatible || (glColor3d = GLContext.getFunctionAddress("glColor3d")) != 0) & + (forwardCompatible || (glColor3ub = GLContext.getFunctionAddress("glColor3ub")) != 0) & + (forwardCompatible || (glColor4b = GLContext.getFunctionAddress("glColor4b")) != 0) & + (forwardCompatible || (glColor4f = GLContext.getFunctionAddress("glColor4f")) != 0) & + (forwardCompatible || (glColor4d = GLContext.getFunctionAddress("glColor4d")) != 0) & + (forwardCompatible || (glColor4ub = GLContext.getFunctionAddress("glColor4ub")) != 0) & + (glClipPlane = GLContext.getFunctionAddress("glClipPlane")) != 0 & + (glClearStencil = GLContext.getFunctionAddress("glClearStencil")) != 0 & + (forwardCompatible || (glEvalPoint1 = GLContext.getFunctionAddress("glEvalPoint1")) != 0) & + (forwardCompatible || (glEvalPoint2 = GLContext.getFunctionAddress("glEvalPoint2")) != 0) & + (forwardCompatible || (glEvalMesh1 = GLContext.getFunctionAddress("glEvalMesh1")) != 0) & + (forwardCompatible || (glEvalMesh2 = GLContext.getFunctionAddress("glEvalMesh2")) != 0) & + (forwardCompatible || (glEvalCoord1f = GLContext.getFunctionAddress("glEvalCoord1f")) != 0) & + (forwardCompatible || (glEvalCoord1d = GLContext.getFunctionAddress("glEvalCoord1d")) != 0) & + (forwardCompatible || (glEvalCoord2f = GLContext.getFunctionAddress("glEvalCoord2f")) != 0) & + (forwardCompatible || (glEvalCoord2d = GLContext.getFunctionAddress("glEvalCoord2d")) != 0) & + (forwardCompatible || (glEnableClientState = GLContext.getFunctionAddress("glEnableClientState")) != 0) & + (forwardCompatible || (glDisableClientState = GLContext.getFunctionAddress("glDisableClientState")) != 0) & + (glEnable = GLContext.getFunctionAddress("glEnable")) != 0 & + (glDisable = GLContext.getFunctionAddress("glDisable")) != 0 & + (forwardCompatible || (glEdgeFlagPointer = GLContext.getFunctionAddress("glEdgeFlagPointer")) != 0) & + (forwardCompatible || (glEdgeFlag = GLContext.getFunctionAddress("glEdgeFlag")) != 0) & + (forwardCompatible || (glDrawPixels = GLContext.getFunctionAddress("glDrawPixels")) != 0) & + (glDrawElements = GLContext.getFunctionAddress("glDrawElements")) != 0 & + (glDrawBuffer = GLContext.getFunctionAddress("glDrawBuffer")) != 0 & + (glDrawArrays = GLContext.getFunctionAddress("glDrawArrays")) != 0 & + (glDepthRange = GLContext.getFunctionAddress("glDepthRange")) != 0 & + (glDepthMask = GLContext.getFunctionAddress("glDepthMask")) != 0 & + (glDepthFunc = GLContext.getFunctionAddress("glDepthFunc")) != 0 & + (forwardCompatible || (glFeedbackBuffer = GLContext.getFunctionAddress("glFeedbackBuffer")) != 0) & + (forwardCompatible || (glGetPixelMapfv = GLContext.getFunctionAddress("glGetPixelMapfv")) != 0) & + (forwardCompatible || (glGetPixelMapuiv = GLContext.getFunctionAddress("glGetPixelMapuiv")) != 0) & + (forwardCompatible || (glGetPixelMapusv = GLContext.getFunctionAddress("glGetPixelMapusv")) != 0) & + (forwardCompatible || (glGetMaterialfv = GLContext.getFunctionAddress("glGetMaterialfv")) != 0) & + (forwardCompatible || (glGetMaterialiv = GLContext.getFunctionAddress("glGetMaterialiv")) != 0) & + (forwardCompatible || (glGetMapfv = GLContext.getFunctionAddress("glGetMapfv")) != 0) & + (forwardCompatible || (glGetMapdv = GLContext.getFunctionAddress("glGetMapdv")) != 0) & + (forwardCompatible || (glGetMapiv = GLContext.getFunctionAddress("glGetMapiv")) != 0) & + (forwardCompatible || (glGetLightfv = GLContext.getFunctionAddress("glGetLightfv")) != 0) & + (forwardCompatible || (glGetLightiv = GLContext.getFunctionAddress("glGetLightiv")) != 0) & + (glGetError = GLContext.getFunctionAddress("glGetError")) != 0 & + (glGetClipPlane = GLContext.getFunctionAddress("glGetClipPlane")) != 0 & + (glGetBooleanv = GLContext.getFunctionAddress("glGetBooleanv")) != 0 & + (glGetDoublev = GLContext.getFunctionAddress("glGetDoublev")) != 0 & + (glGetFloatv = GLContext.getFunctionAddress("glGetFloatv")) != 0 & + (glGetIntegerv = GLContext.getFunctionAddress("glGetIntegerv")) != 0 & + (glGenTextures = GLContext.getFunctionAddress("glGenTextures")) != 0 & + (forwardCompatible || (glGenLists = GLContext.getFunctionAddress("glGenLists")) != 0) & + (forwardCompatible || (glFrustum = GLContext.getFunctionAddress("glFrustum")) != 0) & + (glFrontFace = GLContext.getFunctionAddress("glFrontFace")) != 0 & + (forwardCompatible || (glFogf = GLContext.getFunctionAddress("glFogf")) != 0) & + (forwardCompatible || (glFogi = GLContext.getFunctionAddress("glFogi")) != 0) & + (forwardCompatible || (glFogfv = GLContext.getFunctionAddress("glFogfv")) != 0) & + (forwardCompatible || (glFogiv = GLContext.getFunctionAddress("glFogiv")) != 0) & + (glFlush = GLContext.getFunctionAddress("glFlush")) != 0 & + (glFinish = GLContext.getFunctionAddress("glFinish")) != 0 & + (glGetPointerv = GLContext.getFunctionAddress("glGetPointerv")) != 0 & + (glIsEnabled = GLContext.getFunctionAddress("glIsEnabled")) != 0 & + (glInterleavedArrays = GLContext.getFunctionAddress("glInterleavedArrays")) != 0 & + (forwardCompatible || (glInitNames = GLContext.getFunctionAddress("glInitNames")) != 0) & + (glHint = GLContext.getFunctionAddress("glHint")) != 0 & + (glGetTexParameterfv = GLContext.getFunctionAddress("glGetTexParameterfv")) != 0 & + (glGetTexParameteriv = GLContext.getFunctionAddress("glGetTexParameteriv")) != 0 & + (glGetTexLevelParameterfv = GLContext.getFunctionAddress("glGetTexLevelParameterfv")) != 0 & + (glGetTexLevelParameteriv = GLContext.getFunctionAddress("glGetTexLevelParameteriv")) != 0 & + (glGetTexImage = GLContext.getFunctionAddress("glGetTexImage")) != 0 & + (forwardCompatible || (glGetTexGeniv = GLContext.getFunctionAddress("glGetTexGeniv")) != 0) & + (forwardCompatible || (glGetTexGenfv = GLContext.getFunctionAddress("glGetTexGenfv")) != 0) & + (forwardCompatible || (glGetTexGendv = GLContext.getFunctionAddress("glGetTexGendv")) != 0) & + (glGetTexEnviv = GLContext.getFunctionAddress("glGetTexEnviv")) != 0 & + (glGetTexEnvfv = GLContext.getFunctionAddress("glGetTexEnvfv")) != 0 & + (glGetString = GLContext.getFunctionAddress("glGetString")) != 0 & + (forwardCompatible || (glGetPolygonStipple = GLContext.getFunctionAddress("glGetPolygonStipple")) != 0) & + (forwardCompatible || (glIsList = GLContext.getFunctionAddress("glIsList")) != 0) & + (forwardCompatible || (glMaterialf = GLContext.getFunctionAddress("glMaterialf")) != 0) & + (forwardCompatible || (glMateriali = GLContext.getFunctionAddress("glMateriali")) != 0) & + (forwardCompatible || (glMaterialfv = GLContext.getFunctionAddress("glMaterialfv")) != 0) & + (forwardCompatible || (glMaterialiv = GLContext.getFunctionAddress("glMaterialiv")) != 0) & + (forwardCompatible || (glMapGrid1f = GLContext.getFunctionAddress("glMapGrid1f")) != 0) & + (forwardCompatible || (glMapGrid1d = GLContext.getFunctionAddress("glMapGrid1d")) != 0) & + (forwardCompatible || (glMapGrid2f = GLContext.getFunctionAddress("glMapGrid2f")) != 0) & + (forwardCompatible || (glMapGrid2d = GLContext.getFunctionAddress("glMapGrid2d")) != 0) & + (forwardCompatible || (glMap2f = GLContext.getFunctionAddress("glMap2f")) != 0) & + (forwardCompatible || (glMap2d = GLContext.getFunctionAddress("glMap2d")) != 0) & + (forwardCompatible || (glMap1f = GLContext.getFunctionAddress("glMap1f")) != 0) & + (forwardCompatible || (glMap1d = GLContext.getFunctionAddress("glMap1d")) != 0) & + (glLogicOp = GLContext.getFunctionAddress("glLogicOp")) != 0 & + (forwardCompatible || (glLoadName = GLContext.getFunctionAddress("glLoadName")) != 0) & + (forwardCompatible || (glLoadMatrixf = GLContext.getFunctionAddress("glLoadMatrixf")) != 0) & + (forwardCompatible || (glLoadMatrixd = GLContext.getFunctionAddress("glLoadMatrixd")) != 0) & + (forwardCompatible || (glLoadIdentity = GLContext.getFunctionAddress("glLoadIdentity")) != 0) & + (forwardCompatible || (glListBase = GLContext.getFunctionAddress("glListBase")) != 0) & + (glLineWidth = GLContext.getFunctionAddress("glLineWidth")) != 0 & + (forwardCompatible || (glLineStipple = GLContext.getFunctionAddress("glLineStipple")) != 0) & + (forwardCompatible || (glLightModelf = GLContext.getFunctionAddress("glLightModelf")) != 0) & + (forwardCompatible || (glLightModeli = GLContext.getFunctionAddress("glLightModeli")) != 0) & + (forwardCompatible || (glLightModelfv = GLContext.getFunctionAddress("glLightModelfv")) != 0) & + (forwardCompatible || (glLightModeliv = GLContext.getFunctionAddress("glLightModeliv")) != 0) & + (forwardCompatible || (glLightf = GLContext.getFunctionAddress("glLightf")) != 0) & + (forwardCompatible || (glLighti = GLContext.getFunctionAddress("glLighti")) != 0) & + (forwardCompatible || (glLightfv = GLContext.getFunctionAddress("glLightfv")) != 0) & + (forwardCompatible || (glLightiv = GLContext.getFunctionAddress("glLightiv")) != 0) & + (glIsTexture = GLContext.getFunctionAddress("glIsTexture")) != 0 & + (forwardCompatible || (glMatrixMode = GLContext.getFunctionAddress("glMatrixMode")) != 0) & + (forwardCompatible || (glPolygonStipple = GLContext.getFunctionAddress("glPolygonStipple")) != 0) & + (glPolygonOffset = GLContext.getFunctionAddress("glPolygonOffset")) != 0 & + (glPolygonMode = GLContext.getFunctionAddress("glPolygonMode")) != 0 & + (glPointSize = GLContext.getFunctionAddress("glPointSize")) != 0 & + (forwardCompatible || (glPixelZoom = GLContext.getFunctionAddress("glPixelZoom")) != 0) & + (forwardCompatible || (glPixelTransferf = GLContext.getFunctionAddress("glPixelTransferf")) != 0) & + (forwardCompatible || (glPixelTransferi = GLContext.getFunctionAddress("glPixelTransferi")) != 0) & + (glPixelStoref = GLContext.getFunctionAddress("glPixelStoref")) != 0 & + (glPixelStorei = GLContext.getFunctionAddress("glPixelStorei")) != 0 & + (forwardCompatible || (glPixelMapfv = GLContext.getFunctionAddress("glPixelMapfv")) != 0) & + (forwardCompatible || (glPixelMapuiv = GLContext.getFunctionAddress("glPixelMapuiv")) != 0) & + (forwardCompatible || (glPixelMapusv = GLContext.getFunctionAddress("glPixelMapusv")) != 0) & + (forwardCompatible || (glPassThrough = GLContext.getFunctionAddress("glPassThrough")) != 0) & + (forwardCompatible || (glOrtho = GLContext.getFunctionAddress("glOrtho")) != 0) & + (forwardCompatible || (glNormalPointer = GLContext.getFunctionAddress("glNormalPointer")) != 0) & + (forwardCompatible || (glNormal3b = GLContext.getFunctionAddress("glNormal3b")) != 0) & + (forwardCompatible || (glNormal3f = GLContext.getFunctionAddress("glNormal3f")) != 0) & + (forwardCompatible || (glNormal3d = GLContext.getFunctionAddress("glNormal3d")) != 0) & + (forwardCompatible || (glNormal3i = GLContext.getFunctionAddress("glNormal3i")) != 0) & + (forwardCompatible || (glNewList = GLContext.getFunctionAddress("glNewList")) != 0) & + (forwardCompatible || (glEndList = GLContext.getFunctionAddress("glEndList")) != 0) & + (forwardCompatible || (glMultMatrixf = GLContext.getFunctionAddress("glMultMatrixf")) != 0) & + (forwardCompatible || (glMultMatrixd = GLContext.getFunctionAddress("glMultMatrixd")) != 0) & + (glShadeModel = GLContext.getFunctionAddress("glShadeModel")) != 0 & + (forwardCompatible || (glSelectBuffer = GLContext.getFunctionAddress("glSelectBuffer")) != 0) & + (glScissor = GLContext.getFunctionAddress("glScissor")) != 0 & + (forwardCompatible || (glScalef = GLContext.getFunctionAddress("glScalef")) != 0) & + (forwardCompatible || (glScaled = GLContext.getFunctionAddress("glScaled")) != 0) & + (forwardCompatible || (glRotatef = GLContext.getFunctionAddress("glRotatef")) != 0) & + (forwardCompatible || (glRotated = GLContext.getFunctionAddress("glRotated")) != 0) & + (forwardCompatible || (glRenderMode = GLContext.getFunctionAddress("glRenderMode")) != 0) & + (forwardCompatible || (glRectf = GLContext.getFunctionAddress("glRectf")) != 0) & + (forwardCompatible || (glRectd = GLContext.getFunctionAddress("glRectd")) != 0) & + (forwardCompatible || (glRecti = GLContext.getFunctionAddress("glRecti")) != 0) & + (glReadPixels = GLContext.getFunctionAddress("glReadPixels")) != 0 & + (glReadBuffer = GLContext.getFunctionAddress("glReadBuffer")) != 0 & + (forwardCompatible || (glRasterPos2f = GLContext.getFunctionAddress("glRasterPos2f")) != 0) & + (forwardCompatible || (glRasterPos2d = GLContext.getFunctionAddress("glRasterPos2d")) != 0) & + (forwardCompatible || (glRasterPos2i = GLContext.getFunctionAddress("glRasterPos2i")) != 0) & + (forwardCompatible || (glRasterPos3f = GLContext.getFunctionAddress("glRasterPos3f")) != 0) & + (forwardCompatible || (glRasterPos3d = GLContext.getFunctionAddress("glRasterPos3d")) != 0) & + (forwardCompatible || (glRasterPos3i = GLContext.getFunctionAddress("glRasterPos3i")) != 0) & + (forwardCompatible || (glRasterPos4f = GLContext.getFunctionAddress("glRasterPos4f")) != 0) & + (forwardCompatible || (glRasterPos4d = GLContext.getFunctionAddress("glRasterPos4d")) != 0) & + (forwardCompatible || (glRasterPos4i = GLContext.getFunctionAddress("glRasterPos4i")) != 0) & + (forwardCompatible || (glPushName = GLContext.getFunctionAddress("glPushName")) != 0) & + (forwardCompatible || (glPopName = GLContext.getFunctionAddress("glPopName")) != 0) & + (forwardCompatible || (glPushMatrix = GLContext.getFunctionAddress("glPushMatrix")) != 0) & + (forwardCompatible || (glPopMatrix = GLContext.getFunctionAddress("glPopMatrix")) != 0) & + (forwardCompatible || (glPushClientAttrib = GLContext.getFunctionAddress("glPushClientAttrib")) != 0) & + (forwardCompatible || (glPopClientAttrib = GLContext.getFunctionAddress("glPopClientAttrib")) != 0) & + (forwardCompatible || (glPushAttrib = GLContext.getFunctionAddress("glPushAttrib")) != 0) & + (forwardCompatible || (glPopAttrib = GLContext.getFunctionAddress("glPopAttrib")) != 0) & + (glStencilFunc = GLContext.getFunctionAddress("glStencilFunc")) != 0 & + (forwardCompatible || (glVertexPointer = GLContext.getFunctionAddress("glVertexPointer")) != 0) & + (forwardCompatible || (glVertex2f = GLContext.getFunctionAddress("glVertex2f")) != 0) & + (forwardCompatible || (glVertex2d = GLContext.getFunctionAddress("glVertex2d")) != 0) & + (forwardCompatible || (glVertex2i = GLContext.getFunctionAddress("glVertex2i")) != 0) & + (forwardCompatible || (glVertex3f = GLContext.getFunctionAddress("glVertex3f")) != 0) & + (forwardCompatible || (glVertex3d = GLContext.getFunctionAddress("glVertex3d")) != 0) & + (forwardCompatible || (glVertex3i = GLContext.getFunctionAddress("glVertex3i")) != 0) & + (forwardCompatible || (glVertex4f = GLContext.getFunctionAddress("glVertex4f")) != 0) & + (forwardCompatible || (glVertex4d = GLContext.getFunctionAddress("glVertex4d")) != 0) & + (forwardCompatible || (glVertex4i = GLContext.getFunctionAddress("glVertex4i")) != 0) & + (forwardCompatible || (glTranslatef = GLContext.getFunctionAddress("glTranslatef")) != 0) & + (forwardCompatible || (glTranslated = GLContext.getFunctionAddress("glTranslated")) != 0) & + (glTexImage1D = GLContext.getFunctionAddress("glTexImage1D")) != 0 & + (glTexImage2D = GLContext.getFunctionAddress("glTexImage2D")) != 0 & + (glTexSubImage1D = GLContext.getFunctionAddress("glTexSubImage1D")) != 0 & + (glTexSubImage2D = GLContext.getFunctionAddress("glTexSubImage2D")) != 0 & + (glTexParameterf = GLContext.getFunctionAddress("glTexParameterf")) != 0 & + (glTexParameteri = GLContext.getFunctionAddress("glTexParameteri")) != 0 & + (glTexParameterfv = GLContext.getFunctionAddress("glTexParameterfv")) != 0 & + (glTexParameteriv = GLContext.getFunctionAddress("glTexParameteriv")) != 0 & + (forwardCompatible || (glTexGenf = GLContext.getFunctionAddress("glTexGenf")) != 0) & + (forwardCompatible || (glTexGend = GLContext.getFunctionAddress("glTexGend")) != 0) & + (forwardCompatible || (glTexGenfv = GLContext.getFunctionAddress("glTexGenfv")) != 0) & + (forwardCompatible || (glTexGendv = GLContext.getFunctionAddress("glTexGendv")) != 0) & + (forwardCompatible || (glTexGeni = GLContext.getFunctionAddress("glTexGeni")) != 0) & + (forwardCompatible || (glTexGeniv = GLContext.getFunctionAddress("glTexGeniv")) != 0) & + (glTexEnvf = GLContext.getFunctionAddress("glTexEnvf")) != 0 & + (glTexEnvi = GLContext.getFunctionAddress("glTexEnvi")) != 0 & + (glTexEnvfv = GLContext.getFunctionAddress("glTexEnvfv")) != 0 & + (glTexEnviv = GLContext.getFunctionAddress("glTexEnviv")) != 0 & + (forwardCompatible || (glTexCoordPointer = GLContext.getFunctionAddress("glTexCoordPointer")) != 0) & + (forwardCompatible || (glTexCoord1f = GLContext.getFunctionAddress("glTexCoord1f")) != 0) & + (forwardCompatible || (glTexCoord1d = GLContext.getFunctionAddress("glTexCoord1d")) != 0) & + (forwardCompatible || (glTexCoord2f = GLContext.getFunctionAddress("glTexCoord2f")) != 0) & + (forwardCompatible || (glTexCoord2d = GLContext.getFunctionAddress("glTexCoord2d")) != 0) & + (forwardCompatible || (glTexCoord3f = GLContext.getFunctionAddress("glTexCoord3f")) != 0) & + (forwardCompatible || (glTexCoord3d = GLContext.getFunctionAddress("glTexCoord3d")) != 0) & + (forwardCompatible || (glTexCoord4f = GLContext.getFunctionAddress("glTexCoord4f")) != 0) & + (forwardCompatible || (glTexCoord4d = GLContext.getFunctionAddress("glTexCoord4d")) != 0) & + (glStencilOp = GLContext.getFunctionAddress("glStencilOp")) != 0 & + (glStencilMask = GLContext.getFunctionAddress("glStencilMask")) != 0 & + (glViewport = GLContext.getFunctionAddress("glViewport")) != 0; + } + + private boolean GL12_initNativeFunctionAddresses() { + return + (glDrawRangeElements = GLContext.getFunctionAddress("glDrawRangeElements")) != 0 & + (glTexImage3D = GLContext.getFunctionAddress("glTexImage3D")) != 0 & + (glTexSubImage3D = GLContext.getFunctionAddress("glTexSubImage3D")) != 0 & + (glCopyTexSubImage3D = GLContext.getFunctionAddress("glCopyTexSubImage3D")) != 0; + } + + private boolean GL13_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (glActiveTexture = GLContext.getFunctionAddress("glActiveTexture")) != 0 & + (forwardCompatible || (glClientActiveTexture = GLContext.getFunctionAddress("glClientActiveTexture")) != 0) & + (glCompressedTexImage1D = GLContext.getFunctionAddress("glCompressedTexImage1D")) != 0 & + (glCompressedTexImage2D = GLContext.getFunctionAddress("glCompressedTexImage2D")) != 0 & + (glCompressedTexImage3D = GLContext.getFunctionAddress("glCompressedTexImage3D")) != 0 & + (glCompressedTexSubImage1D = GLContext.getFunctionAddress("glCompressedTexSubImage1D")) != 0 & + (glCompressedTexSubImage2D = GLContext.getFunctionAddress("glCompressedTexSubImage2D")) != 0 & + (glCompressedTexSubImage3D = GLContext.getFunctionAddress("glCompressedTexSubImage3D")) != 0 & + (glGetCompressedTexImage = GLContext.getFunctionAddress("glGetCompressedTexImage")) != 0 & + (forwardCompatible || (glMultiTexCoord1f = GLContext.getFunctionAddress("glMultiTexCoord1f")) != 0) & + (forwardCompatible || (glMultiTexCoord1d = GLContext.getFunctionAddress("glMultiTexCoord1d")) != 0) & + (forwardCompatible || (glMultiTexCoord2f = GLContext.getFunctionAddress("glMultiTexCoord2f")) != 0) & + (forwardCompatible || (glMultiTexCoord2d = GLContext.getFunctionAddress("glMultiTexCoord2d")) != 0) & + (forwardCompatible || (glMultiTexCoord3f = GLContext.getFunctionAddress("glMultiTexCoord3f")) != 0) & + (forwardCompatible || (glMultiTexCoord3d = GLContext.getFunctionAddress("glMultiTexCoord3d")) != 0) & + (forwardCompatible || (glMultiTexCoord4f = GLContext.getFunctionAddress("glMultiTexCoord4f")) != 0) & + (forwardCompatible || (glMultiTexCoord4d = GLContext.getFunctionAddress("glMultiTexCoord4d")) != 0) & + (forwardCompatible || (glLoadTransposeMatrixf = GLContext.getFunctionAddress("glLoadTransposeMatrixf")) != 0) & + (forwardCompatible || (glLoadTransposeMatrixd = GLContext.getFunctionAddress("glLoadTransposeMatrixd")) != 0) & + (forwardCompatible || (glMultTransposeMatrixf = GLContext.getFunctionAddress("glMultTransposeMatrixf")) != 0) & + (forwardCompatible || (glMultTransposeMatrixd = GLContext.getFunctionAddress("glMultTransposeMatrixd")) != 0) & + (glSampleCoverage = GLContext.getFunctionAddress("glSampleCoverage")) != 0; + } + + private boolean GL14_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (glBlendEquation = GLContext.getFunctionAddress("glBlendEquation")) != 0 & + (glBlendColor = GLContext.getFunctionAddress("glBlendColor")) != 0 & + (forwardCompatible || (glFogCoordf = GLContext.getFunctionAddress("glFogCoordf")) != 0) & + (forwardCompatible || (glFogCoordd = GLContext.getFunctionAddress("glFogCoordd")) != 0) & + (forwardCompatible || (glFogCoordPointer = GLContext.getFunctionAddress("glFogCoordPointer")) != 0) & + (glMultiDrawArrays = GLContext.getFunctionAddress("glMultiDrawArrays")) != 0 & + (glPointParameteri = GLContext.getFunctionAddress("glPointParameteri")) != 0 & + (glPointParameterf = GLContext.getFunctionAddress("glPointParameterf")) != 0 & + (glPointParameteriv = GLContext.getFunctionAddress("glPointParameteriv")) != 0 & + (glPointParameterfv = GLContext.getFunctionAddress("glPointParameterfv")) != 0 & + (forwardCompatible || (glSecondaryColor3b = GLContext.getFunctionAddress("glSecondaryColor3b")) != 0) & + (forwardCompatible || (glSecondaryColor3f = GLContext.getFunctionAddress("glSecondaryColor3f")) != 0) & + (forwardCompatible || (glSecondaryColor3d = GLContext.getFunctionAddress("glSecondaryColor3d")) != 0) & + (forwardCompatible || (glSecondaryColor3ub = GLContext.getFunctionAddress("glSecondaryColor3ub")) != 0) & + (forwardCompatible || (glSecondaryColorPointer = GLContext.getFunctionAddress("glSecondaryColorPointer")) != 0) & + (glBlendFuncSeparate = GLContext.getFunctionAddress("glBlendFuncSeparate")) != 0 & + (forwardCompatible || (glWindowPos2f = GLContext.getFunctionAddress("glWindowPos2f")) != 0) & + (forwardCompatible || (glWindowPos2d = GLContext.getFunctionAddress("glWindowPos2d")) != 0) & + (forwardCompatible || (glWindowPos2i = GLContext.getFunctionAddress("glWindowPos2i")) != 0) & + (forwardCompatible || (glWindowPos3f = GLContext.getFunctionAddress("glWindowPos3f")) != 0) & + (forwardCompatible || (glWindowPos3d = GLContext.getFunctionAddress("glWindowPos3d")) != 0) & + (forwardCompatible || (glWindowPos3i = GLContext.getFunctionAddress("glWindowPos3i")) != 0); + } + + private boolean GL15_initNativeFunctionAddresses() { + return + (glBindBuffer = GLContext.getFunctionAddress("glBindBuffer")) != 0 & + (glDeleteBuffers = GLContext.getFunctionAddress("glDeleteBuffers")) != 0 & + (glGenBuffers = GLContext.getFunctionAddress("glGenBuffers")) != 0 & + (glIsBuffer = GLContext.getFunctionAddress("glIsBuffer")) != 0 & + (glBufferData = GLContext.getFunctionAddress("glBufferData")) != 0 & + (glBufferSubData = GLContext.getFunctionAddress("glBufferSubData")) != 0 & + (glGetBufferSubData = GLContext.getFunctionAddress("glGetBufferSubData")) != 0 & + (glMapBuffer = GLContext.getFunctionAddress("glMapBuffer")) != 0 & + (glUnmapBuffer = GLContext.getFunctionAddress("glUnmapBuffer")) != 0 & + (glGetBufferParameteriv = GLContext.getFunctionAddress("glGetBufferParameteriv")) != 0 & + (glGetBufferPointerv = GLContext.getFunctionAddress("glGetBufferPointerv")) != 0 & + (glGenQueries = GLContext.getFunctionAddress("glGenQueries")) != 0 & + (glDeleteQueries = GLContext.getFunctionAddress("glDeleteQueries")) != 0 & + (glIsQuery = GLContext.getFunctionAddress("glIsQuery")) != 0 & + (glBeginQuery = GLContext.getFunctionAddress("glBeginQuery")) != 0 & + (glEndQuery = GLContext.getFunctionAddress("glEndQuery")) != 0 & + (glGetQueryiv = GLContext.getFunctionAddress("glGetQueryiv")) != 0 & + (glGetQueryObjectiv = GLContext.getFunctionAddress("glGetQueryObjectiv")) != 0 & + (glGetQueryObjectuiv = GLContext.getFunctionAddress("glGetQueryObjectuiv")) != 0; + } + + private boolean GL20_initNativeFunctionAddresses() { + return + (glShaderSource = GLContext.getFunctionAddress("glShaderSource")) != 0 & + (glCreateShader = GLContext.getFunctionAddress("glCreateShader")) != 0 & + (glIsShader = GLContext.getFunctionAddress("glIsShader")) != 0 & + (glCompileShader = GLContext.getFunctionAddress("glCompileShader")) != 0 & + (glDeleteShader = GLContext.getFunctionAddress("glDeleteShader")) != 0 & + (glCreateProgram = GLContext.getFunctionAddress("glCreateProgram")) != 0 & + (glIsProgram = GLContext.getFunctionAddress("glIsProgram")) != 0 & + (glAttachShader = GLContext.getFunctionAddress("glAttachShader")) != 0 & + (glDetachShader = GLContext.getFunctionAddress("glDetachShader")) != 0 & + (glLinkProgram = GLContext.getFunctionAddress("glLinkProgram")) != 0 & + (glUseProgram = GLContext.getFunctionAddress("glUseProgram")) != 0 & + (glValidateProgram = GLContext.getFunctionAddress("glValidateProgram")) != 0 & + (glDeleteProgram = GLContext.getFunctionAddress("glDeleteProgram")) != 0 & + (glUniform1f = GLContext.getFunctionAddress("glUniform1f")) != 0 & + (glUniform2f = GLContext.getFunctionAddress("glUniform2f")) != 0 & + (glUniform3f = GLContext.getFunctionAddress("glUniform3f")) != 0 & + (glUniform4f = GLContext.getFunctionAddress("glUniform4f")) != 0 & + (glUniform1i = GLContext.getFunctionAddress("glUniform1i")) != 0 & + (glUniform2i = GLContext.getFunctionAddress("glUniform2i")) != 0 & + (glUniform3i = GLContext.getFunctionAddress("glUniform3i")) != 0 & + (glUniform4i = GLContext.getFunctionAddress("glUniform4i")) != 0 & + (glUniform1fv = GLContext.getFunctionAddress("glUniform1fv")) != 0 & + (glUniform2fv = GLContext.getFunctionAddress("glUniform2fv")) != 0 & + (glUniform3fv = GLContext.getFunctionAddress("glUniform3fv")) != 0 & + (glUniform4fv = GLContext.getFunctionAddress("glUniform4fv")) != 0 & + (glUniform1iv = GLContext.getFunctionAddress("glUniform1iv")) != 0 & + (glUniform2iv = GLContext.getFunctionAddress("glUniform2iv")) != 0 & + (glUniform3iv = GLContext.getFunctionAddress("glUniform3iv")) != 0 & + (glUniform4iv = GLContext.getFunctionAddress("glUniform4iv")) != 0 & + (glUniformMatrix2fv = GLContext.getFunctionAddress("glUniformMatrix2fv")) != 0 & + (glUniformMatrix3fv = GLContext.getFunctionAddress("glUniformMatrix3fv")) != 0 & + (glUniformMatrix4fv = GLContext.getFunctionAddress("glUniformMatrix4fv")) != 0 & + (glGetShaderiv = GLContext.getFunctionAddress("glGetShaderiv")) != 0 & + (glGetProgramiv = GLContext.getFunctionAddress("glGetProgramiv")) != 0 & + (glGetShaderInfoLog = GLContext.getFunctionAddress("glGetShaderInfoLog")) != 0 & + (glGetProgramInfoLog = GLContext.getFunctionAddress("glGetProgramInfoLog")) != 0 & + (glGetAttachedShaders = GLContext.getFunctionAddress("glGetAttachedShaders")) != 0 & + (glGetUniformLocation = GLContext.getFunctionAddress("glGetUniformLocation")) != 0 & + (glGetActiveUniform = GLContext.getFunctionAddress("glGetActiveUniform")) != 0 & + (glGetUniformfv = GLContext.getFunctionAddress("glGetUniformfv")) != 0 & + (glGetUniformiv = GLContext.getFunctionAddress("glGetUniformiv")) != 0 & + (glGetShaderSource = GLContext.getFunctionAddress("glGetShaderSource")) != 0 & + (glVertexAttrib1s = GLContext.getFunctionAddress("glVertexAttrib1s")) != 0 & + (glVertexAttrib1f = GLContext.getFunctionAddress("glVertexAttrib1f")) != 0 & + (glVertexAttrib1d = GLContext.getFunctionAddress("glVertexAttrib1d")) != 0 & + (glVertexAttrib2s = GLContext.getFunctionAddress("glVertexAttrib2s")) != 0 & + (glVertexAttrib2f = GLContext.getFunctionAddress("glVertexAttrib2f")) != 0 & + (glVertexAttrib2d = GLContext.getFunctionAddress("glVertexAttrib2d")) != 0 & + (glVertexAttrib3s = GLContext.getFunctionAddress("glVertexAttrib3s")) != 0 & + (glVertexAttrib3f = GLContext.getFunctionAddress("glVertexAttrib3f")) != 0 & + (glVertexAttrib3d = GLContext.getFunctionAddress("glVertexAttrib3d")) != 0 & + (glVertexAttrib4s = GLContext.getFunctionAddress("glVertexAttrib4s")) != 0 & + (glVertexAttrib4f = GLContext.getFunctionAddress("glVertexAttrib4f")) != 0 & + (glVertexAttrib4d = GLContext.getFunctionAddress("glVertexAttrib4d")) != 0 & + (glVertexAttrib4Nub = GLContext.getFunctionAddress("glVertexAttrib4Nub")) != 0 & + (glVertexAttribPointer = GLContext.getFunctionAddress("glVertexAttribPointer")) != 0 & + (glEnableVertexAttribArray = GLContext.getFunctionAddress("glEnableVertexAttribArray")) != 0 & + (glDisableVertexAttribArray = GLContext.getFunctionAddress("glDisableVertexAttribArray")) != 0 & + (glGetVertexAttribfv = GLContext.getFunctionAddress("glGetVertexAttribfv")) != 0 & + (glGetVertexAttribdv = GLContext.getFunctionAddress("glGetVertexAttribdv")) != 0 & + (glGetVertexAttribiv = GLContext.getFunctionAddress("glGetVertexAttribiv")) != 0 & + (glGetVertexAttribPointerv = GLContext.getFunctionAddress("glGetVertexAttribPointerv")) != 0 & + (glBindAttribLocation = GLContext.getFunctionAddress("glBindAttribLocation")) != 0 & + (glGetActiveAttrib = GLContext.getFunctionAddress("glGetActiveAttrib")) != 0 & + (glGetAttribLocation = GLContext.getFunctionAddress("glGetAttribLocation")) != 0 & + (glDrawBuffers = GLContext.getFunctionAddress("glDrawBuffers")) != 0 & + (glStencilOpSeparate = GLContext.getFunctionAddress("glStencilOpSeparate")) != 0 & + (glStencilFuncSeparate = GLContext.getFunctionAddress("glStencilFuncSeparate")) != 0 & + (glStencilMaskSeparate = GLContext.getFunctionAddress("glStencilMaskSeparate")) != 0 & + (glBlendEquationSeparate = GLContext.getFunctionAddress("glBlendEquationSeparate")) != 0; + } + + private boolean GL21_initNativeFunctionAddresses() { + return + (glUniformMatrix2x3fv = GLContext.getFunctionAddress("glUniformMatrix2x3fv")) != 0 & + (glUniformMatrix3x2fv = GLContext.getFunctionAddress("glUniformMatrix3x2fv")) != 0 & + (glUniformMatrix2x4fv = GLContext.getFunctionAddress("glUniformMatrix2x4fv")) != 0 & + (glUniformMatrix4x2fv = GLContext.getFunctionAddress("glUniformMatrix4x2fv")) != 0 & + (glUniformMatrix3x4fv = GLContext.getFunctionAddress("glUniformMatrix3x4fv")) != 0 & + (glUniformMatrix4x3fv = GLContext.getFunctionAddress("glUniformMatrix4x3fv")) != 0; + } + + private boolean GL30_initNativeFunctionAddresses() { + return + (glGetStringi = GLContext.getFunctionAddress("glGetStringi")) != 0 & + (glClearBufferfv = GLContext.getFunctionAddress("glClearBufferfv")) != 0 & + (glClearBufferiv = GLContext.getFunctionAddress("glClearBufferiv")) != 0 & + (glClearBufferuiv = GLContext.getFunctionAddress("glClearBufferuiv")) != 0 & + (glClearBufferfi = GLContext.getFunctionAddress("glClearBufferfi")) != 0 & + (glVertexAttribI1i = GLContext.getFunctionAddress("glVertexAttribI1i")) != 0 & + (glVertexAttribI2i = GLContext.getFunctionAddress("glVertexAttribI2i")) != 0 & + (glVertexAttribI3i = GLContext.getFunctionAddress("glVertexAttribI3i")) != 0 & + (glVertexAttribI4i = GLContext.getFunctionAddress("glVertexAttribI4i")) != 0 & + (glVertexAttribI1ui = GLContext.getFunctionAddress("glVertexAttribI1ui")) != 0 & + (glVertexAttribI2ui = GLContext.getFunctionAddress("glVertexAttribI2ui")) != 0 & + (glVertexAttribI3ui = GLContext.getFunctionAddress("glVertexAttribI3ui")) != 0 & + (glVertexAttribI4ui = GLContext.getFunctionAddress("glVertexAttribI4ui")) != 0 & + (glVertexAttribI1iv = GLContext.getFunctionAddress("glVertexAttribI1iv")) != 0 & + (glVertexAttribI2iv = GLContext.getFunctionAddress("glVertexAttribI2iv")) != 0 & + (glVertexAttribI3iv = GLContext.getFunctionAddress("glVertexAttribI3iv")) != 0 & + (glVertexAttribI4iv = GLContext.getFunctionAddress("glVertexAttribI4iv")) != 0 & + (glVertexAttribI1uiv = GLContext.getFunctionAddress("glVertexAttribI1uiv")) != 0 & + (glVertexAttribI2uiv = GLContext.getFunctionAddress("glVertexAttribI2uiv")) != 0 & + (glVertexAttribI3uiv = GLContext.getFunctionAddress("glVertexAttribI3uiv")) != 0 & + (glVertexAttribI4uiv = GLContext.getFunctionAddress("glVertexAttribI4uiv")) != 0 & + (glVertexAttribI4bv = GLContext.getFunctionAddress("glVertexAttribI4bv")) != 0 & + (glVertexAttribI4sv = GLContext.getFunctionAddress("glVertexAttribI4sv")) != 0 & + (glVertexAttribI4ubv = GLContext.getFunctionAddress("glVertexAttribI4ubv")) != 0 & + (glVertexAttribI4usv = GLContext.getFunctionAddress("glVertexAttribI4usv")) != 0 & + (glVertexAttribIPointer = GLContext.getFunctionAddress("glVertexAttribIPointer")) != 0 & + (glGetVertexAttribIiv = GLContext.getFunctionAddress("glGetVertexAttribIiv")) != 0 & + (glGetVertexAttribIuiv = GLContext.getFunctionAddress("glGetVertexAttribIuiv")) != 0 & + (glUniform1ui = GLContext.getFunctionAddress("glUniform1ui")) != 0 & + (glUniform2ui = GLContext.getFunctionAddress("glUniform2ui")) != 0 & + (glUniform3ui = GLContext.getFunctionAddress("glUniform3ui")) != 0 & + (glUniform4ui = GLContext.getFunctionAddress("glUniform4ui")) != 0 & + (glUniform1uiv = GLContext.getFunctionAddress("glUniform1uiv")) != 0 & + (glUniform2uiv = GLContext.getFunctionAddress("glUniform2uiv")) != 0 & + (glUniform3uiv = GLContext.getFunctionAddress("glUniform3uiv")) != 0 & + (glUniform4uiv = GLContext.getFunctionAddress("glUniform4uiv")) != 0 & + (glGetUniformuiv = GLContext.getFunctionAddress("glGetUniformuiv")) != 0 & + (glBindFragDataLocation = GLContext.getFunctionAddress("glBindFragDataLocation")) != 0 & + (glGetFragDataLocation = GLContext.getFunctionAddress("glGetFragDataLocation")) != 0 & + (glBeginConditionalRender = GLContext.getFunctionAddress("glBeginConditionalRender")) != 0 & + (glEndConditionalRender = GLContext.getFunctionAddress("glEndConditionalRender")) != 0 & + (glMapBufferRange = GLContext.getFunctionAddress("glMapBufferRange")) != 0 & + (glFlushMappedBufferRange = GLContext.getFunctionAddress("glFlushMappedBufferRange")) != 0 & + (glClampColor = GLContext.getFunctionAddress("glClampColor")) != 0 & + (glIsRenderbuffer = GLContext.getFunctionAddress("glIsRenderbuffer")) != 0 & + (glBindRenderbuffer = GLContext.getFunctionAddress("glBindRenderbuffer")) != 0 & + (glDeleteRenderbuffers = GLContext.getFunctionAddress("glDeleteRenderbuffers")) != 0 & + (glGenRenderbuffers = GLContext.getFunctionAddress("glGenRenderbuffers")) != 0 & + (glRenderbufferStorage = GLContext.getFunctionAddress("glRenderbufferStorage")) != 0 & + (glGetRenderbufferParameteriv = GLContext.getFunctionAddress("glGetRenderbufferParameteriv")) != 0 & + (glIsFramebuffer = GLContext.getFunctionAddress("glIsFramebuffer")) != 0 & + (glBindFramebuffer = GLContext.getFunctionAddress("glBindFramebuffer")) != 0 & + (glDeleteFramebuffers = GLContext.getFunctionAddress("glDeleteFramebuffers")) != 0 & + (glGenFramebuffers = GLContext.getFunctionAddress("glGenFramebuffers")) != 0 & + (glCheckFramebufferStatus = GLContext.getFunctionAddress("glCheckFramebufferStatus")) != 0 & + (glFramebufferTexture1D = GLContext.getFunctionAddress("glFramebufferTexture1D")) != 0 & + (glFramebufferTexture2D = GLContext.getFunctionAddress("glFramebufferTexture2D")) != 0 & + (glFramebufferTexture3D = GLContext.getFunctionAddress("glFramebufferTexture3D")) != 0 & + (glFramebufferRenderbuffer = GLContext.getFunctionAddress("glFramebufferRenderbuffer")) != 0 & + (glGetFramebufferAttachmentParameteriv = GLContext.getFunctionAddress("glGetFramebufferAttachmentParameteriv")) != 0 & + (glGenerateMipmap = GLContext.getFunctionAddress("glGenerateMipmap")) != 0 & + (glRenderbufferStorageMultisample = GLContext.getFunctionAddress("glRenderbufferStorageMultisample")) != 0 & + (glBlitFramebuffer = GLContext.getFunctionAddress("glBlitFramebuffer")) != 0 & + (glTexParameterIiv = GLContext.getFunctionAddress("glTexParameterIiv")) != 0 & + (glTexParameterIuiv = GLContext.getFunctionAddress("glTexParameterIuiv")) != 0 & + (glGetTexParameterIiv = GLContext.getFunctionAddress("glGetTexParameterIiv")) != 0 & + (glGetTexParameterIuiv = GLContext.getFunctionAddress("glGetTexParameterIuiv")) != 0 & + (glFramebufferTextureLayer = GLContext.getFunctionAddress("glFramebufferTextureLayer")) != 0 & + (glColorMaski = GLContext.getFunctionAddress("glColorMaski")) != 0 & + (glGetBooleani_v = GLContext.getFunctionAddress("glGetBooleani_v")) != 0 & + (glGetIntegeri_v = GLContext.getFunctionAddress("glGetIntegeri_v")) != 0 & + (glEnablei = GLContext.getFunctionAddress("glEnablei")) != 0 & + (glDisablei = GLContext.getFunctionAddress("glDisablei")) != 0 & + (glIsEnabledi = GLContext.getFunctionAddress("glIsEnabledi")) != 0 & + (glBindBufferRange = GLContext.getFunctionAddress("glBindBufferRange")) != 0 & + (glBindBufferBase = GLContext.getFunctionAddress("glBindBufferBase")) != 0 & + (glBeginTransformFeedback = GLContext.getFunctionAddress("glBeginTransformFeedback")) != 0 & + (glEndTransformFeedback = GLContext.getFunctionAddress("glEndTransformFeedback")) != 0 & + (glTransformFeedbackVaryings = GLContext.getFunctionAddress("glTransformFeedbackVaryings")) != 0 & + (glGetTransformFeedbackVarying = GLContext.getFunctionAddress("glGetTransformFeedbackVarying")) != 0 & + (glBindVertexArray = GLContext.getFunctionAddress("glBindVertexArray")) != 0 & + (glDeleteVertexArrays = GLContext.getFunctionAddress("glDeleteVertexArrays")) != 0 & + (glGenVertexArrays = GLContext.getFunctionAddress("glGenVertexArrays")) != 0 & + (glIsVertexArray = GLContext.getFunctionAddress("glIsVertexArray")) != 0; + } + + private boolean GL31_initNativeFunctionAddresses() { + return + (glDrawArraysInstanced = GLContext.getFunctionAddress("glDrawArraysInstanced")) != 0 & + (glDrawElementsInstanced = GLContext.getFunctionAddress("glDrawElementsInstanced")) != 0 & + (glCopyBufferSubData = GLContext.getFunctionAddress("glCopyBufferSubData")) != 0 & + (glPrimitiveRestartIndex = GLContext.getFunctionAddress("glPrimitiveRestartIndex")) != 0 & + (glTexBuffer = GLContext.getFunctionAddress("glTexBuffer")) != 0 & + (glGetUniformIndices = GLContext.getFunctionAddress("glGetUniformIndices")) != 0 & + (glGetActiveUniformsiv = GLContext.getFunctionAddress("glGetActiveUniformsiv")) != 0 & + (glGetActiveUniformName = GLContext.getFunctionAddress("glGetActiveUniformName")) != 0 & + (glGetUniformBlockIndex = GLContext.getFunctionAddress("glGetUniformBlockIndex")) != 0 & + (glGetActiveUniformBlockiv = GLContext.getFunctionAddress("glGetActiveUniformBlockiv")) != 0 & + (glGetActiveUniformBlockName = GLContext.getFunctionAddress("glGetActiveUniformBlockName")) != 0 & + (glUniformBlockBinding = GLContext.getFunctionAddress("glUniformBlockBinding")) != 0; + } + + private boolean GL32_initNativeFunctionAddresses() { + return + (glGetBufferParameteri64v = GLContext.getFunctionAddress("glGetBufferParameteri64v")) != 0 & + (glDrawElementsBaseVertex = GLContext.getFunctionAddress("glDrawElementsBaseVertex")) != 0 & + (glDrawRangeElementsBaseVertex = GLContext.getFunctionAddress("glDrawRangeElementsBaseVertex")) != 0 & + (glDrawElementsInstancedBaseVertex = GLContext.getFunctionAddress("glDrawElementsInstancedBaseVertex")) != 0 & + (glProvokingVertex = GLContext.getFunctionAddress("glProvokingVertex")) != 0 & + (glTexImage2DMultisample = GLContext.getFunctionAddress("glTexImage2DMultisample")) != 0 & + (glTexImage3DMultisample = GLContext.getFunctionAddress("glTexImage3DMultisample")) != 0 & + (glGetMultisamplefv = GLContext.getFunctionAddress("glGetMultisamplefv")) != 0 & + (glSampleMaski = GLContext.getFunctionAddress("glSampleMaski")) != 0 & + (glFramebufferTexture = GLContext.getFunctionAddress("glFramebufferTexture")) != 0 & + (glFenceSync = GLContext.getFunctionAddress("glFenceSync")) != 0 & + (glIsSync = GLContext.getFunctionAddress("glIsSync")) != 0 & + (glDeleteSync = GLContext.getFunctionAddress("glDeleteSync")) != 0 & + (glClientWaitSync = GLContext.getFunctionAddress("glClientWaitSync")) != 0 & + (glWaitSync = GLContext.getFunctionAddress("glWaitSync")) != 0 & + (glGetInteger64v = GLContext.getFunctionAddress("glGetInteger64v")) != 0 & + ((glGetInteger64i_v = GLContext.getFunctionAddress("glGetInteger64i_v")) != 0 || true) & + (glGetSynciv = GLContext.getFunctionAddress("glGetSynciv")) != 0; + } + + private boolean GL33_initNativeFunctionAddresses(boolean forwardCompatible) { + return + (glBindFragDataLocationIndexed = GLContext.getFunctionAddress("glBindFragDataLocationIndexed")) != 0 & + (glGetFragDataIndex = GLContext.getFunctionAddress("glGetFragDataIndex")) != 0 & + (glGenSamplers = GLContext.getFunctionAddress("glGenSamplers")) != 0 & + (glDeleteSamplers = GLContext.getFunctionAddress("glDeleteSamplers")) != 0 & + (glIsSampler = GLContext.getFunctionAddress("glIsSampler")) != 0 & + (glBindSampler = GLContext.getFunctionAddress("glBindSampler")) != 0 & + (glSamplerParameteri = GLContext.getFunctionAddress("glSamplerParameteri")) != 0 & + (glSamplerParameterf = GLContext.getFunctionAddress("glSamplerParameterf")) != 0 & + (glSamplerParameteriv = GLContext.getFunctionAddress("glSamplerParameteriv")) != 0 & + (glSamplerParameterfv = GLContext.getFunctionAddress("glSamplerParameterfv")) != 0 & + (glSamplerParameterIiv = GLContext.getFunctionAddress("glSamplerParameterIiv")) != 0 & + (glSamplerParameterIuiv = GLContext.getFunctionAddress("glSamplerParameterIuiv")) != 0 & + (glGetSamplerParameteriv = GLContext.getFunctionAddress("glGetSamplerParameteriv")) != 0 & + (glGetSamplerParameterfv = GLContext.getFunctionAddress("glGetSamplerParameterfv")) != 0 & + (glGetSamplerParameterIiv = GLContext.getFunctionAddress("glGetSamplerParameterIiv")) != 0 & + (glGetSamplerParameterIuiv = GLContext.getFunctionAddress("glGetSamplerParameterIuiv")) != 0 & + (glQueryCounter = GLContext.getFunctionAddress("glQueryCounter")) != 0 & + (glGetQueryObjecti64v = GLContext.getFunctionAddress("glGetQueryObjecti64v")) != 0 & + (glGetQueryObjectui64v = GLContext.getFunctionAddress("glGetQueryObjectui64v")) != 0 & + (glVertexAttribDivisor = GLContext.getFunctionAddress("glVertexAttribDivisor")) != 0 & + (forwardCompatible || (glVertexP2ui = GLContext.getFunctionAddress("glVertexP2ui")) != 0) & + (forwardCompatible || (glVertexP3ui = GLContext.getFunctionAddress("glVertexP3ui")) != 0) & + (forwardCompatible || (glVertexP4ui = GLContext.getFunctionAddress("glVertexP4ui")) != 0) & + (forwardCompatible || (glVertexP2uiv = GLContext.getFunctionAddress("glVertexP2uiv")) != 0) & + (forwardCompatible || (glVertexP3uiv = GLContext.getFunctionAddress("glVertexP3uiv")) != 0) & + (forwardCompatible || (glVertexP4uiv = GLContext.getFunctionAddress("glVertexP4uiv")) != 0) & + (forwardCompatible || (glTexCoordP1ui = GLContext.getFunctionAddress("glTexCoordP1ui")) != 0) & + (forwardCompatible || (glTexCoordP2ui = GLContext.getFunctionAddress("glTexCoordP2ui")) != 0) & + (forwardCompatible || (glTexCoordP3ui = GLContext.getFunctionAddress("glTexCoordP3ui")) != 0) & + (forwardCompatible || (glTexCoordP4ui = GLContext.getFunctionAddress("glTexCoordP4ui")) != 0) & + (forwardCompatible || (glTexCoordP1uiv = GLContext.getFunctionAddress("glTexCoordP1uiv")) != 0) & + (forwardCompatible || (glTexCoordP2uiv = GLContext.getFunctionAddress("glTexCoordP2uiv")) != 0) & + (forwardCompatible || (glTexCoordP3uiv = GLContext.getFunctionAddress("glTexCoordP3uiv")) != 0) & + (forwardCompatible || (glTexCoordP4uiv = GLContext.getFunctionAddress("glTexCoordP4uiv")) != 0) & + (forwardCompatible || (glMultiTexCoordP1ui = GLContext.getFunctionAddress("glMultiTexCoordP1ui")) != 0) & + (forwardCompatible || (glMultiTexCoordP2ui = GLContext.getFunctionAddress("glMultiTexCoordP2ui")) != 0) & + (forwardCompatible || (glMultiTexCoordP3ui = GLContext.getFunctionAddress("glMultiTexCoordP3ui")) != 0) & + (forwardCompatible || (glMultiTexCoordP4ui = GLContext.getFunctionAddress("glMultiTexCoordP4ui")) != 0) & + (forwardCompatible || (glMultiTexCoordP1uiv = GLContext.getFunctionAddress("glMultiTexCoordP1uiv")) != 0) & + (forwardCompatible || (glMultiTexCoordP2uiv = GLContext.getFunctionAddress("glMultiTexCoordP2uiv")) != 0) & + (forwardCompatible || (glMultiTexCoordP3uiv = GLContext.getFunctionAddress("glMultiTexCoordP3uiv")) != 0) & + (forwardCompatible || (glMultiTexCoordP4uiv = GLContext.getFunctionAddress("glMultiTexCoordP4uiv")) != 0) & + (forwardCompatible || (glNormalP3ui = GLContext.getFunctionAddress("glNormalP3ui")) != 0) & + (forwardCompatible || (glNormalP3uiv = GLContext.getFunctionAddress("glNormalP3uiv")) != 0) & + (forwardCompatible || (glColorP3ui = GLContext.getFunctionAddress("glColorP3ui")) != 0) & + (forwardCompatible || (glColorP4ui = GLContext.getFunctionAddress("glColorP4ui")) != 0) & + (forwardCompatible || (glColorP3uiv = GLContext.getFunctionAddress("glColorP3uiv")) != 0) & + (forwardCompatible || (glColorP4uiv = GLContext.getFunctionAddress("glColorP4uiv")) != 0) & + (forwardCompatible || (glSecondaryColorP3ui = GLContext.getFunctionAddress("glSecondaryColorP3ui")) != 0) & + (forwardCompatible || (glSecondaryColorP3uiv = GLContext.getFunctionAddress("glSecondaryColorP3uiv")) != 0) & + (forwardCompatible || (glVertexAttribP1ui = GLContext.getFunctionAddress("glVertexAttribP1ui")) != 0) & + (forwardCompatible || (glVertexAttribP2ui = GLContext.getFunctionAddress("glVertexAttribP2ui")) != 0) & + (forwardCompatible || (glVertexAttribP3ui = GLContext.getFunctionAddress("glVertexAttribP3ui")) != 0) & + (forwardCompatible || (glVertexAttribP4ui = GLContext.getFunctionAddress("glVertexAttribP4ui")) != 0) & + (forwardCompatible || (glVertexAttribP1uiv = GLContext.getFunctionAddress("glVertexAttribP1uiv")) != 0) & + (forwardCompatible || (glVertexAttribP2uiv = GLContext.getFunctionAddress("glVertexAttribP2uiv")) != 0) & + (forwardCompatible || (glVertexAttribP3uiv = GLContext.getFunctionAddress("glVertexAttribP3uiv")) != 0) & + (forwardCompatible || (glVertexAttribP4uiv = GLContext.getFunctionAddress("glVertexAttribP4uiv")) != 0); + } + + private boolean GL40_initNativeFunctionAddresses() { + return + (glBlendEquationi = GLContext.getFunctionAddress("glBlendEquationi")) != 0 & + (glBlendEquationSeparatei = GLContext.getFunctionAddress("glBlendEquationSeparatei")) != 0 & + (glBlendFunci = GLContext.getFunctionAddress("glBlendFunci")) != 0 & + (glBlendFuncSeparatei = GLContext.getFunctionAddress("glBlendFuncSeparatei")) != 0 & + (glDrawArraysIndirect = GLContext.getFunctionAddress("glDrawArraysIndirect")) != 0 & + (glDrawElementsIndirect = GLContext.getFunctionAddress("glDrawElementsIndirect")) != 0 & + (glUniform1d = GLContext.getFunctionAddress("glUniform1d")) != 0 & + (glUniform2d = GLContext.getFunctionAddress("glUniform2d")) != 0 & + (glUniform3d = GLContext.getFunctionAddress("glUniform3d")) != 0 & + (glUniform4d = GLContext.getFunctionAddress("glUniform4d")) != 0 & + (glUniform1dv = GLContext.getFunctionAddress("glUniform1dv")) != 0 & + (glUniform2dv = GLContext.getFunctionAddress("glUniform2dv")) != 0 & + (glUniform3dv = GLContext.getFunctionAddress("glUniform3dv")) != 0 & + (glUniform4dv = GLContext.getFunctionAddress("glUniform4dv")) != 0 & + (glUniformMatrix2dv = GLContext.getFunctionAddress("glUniformMatrix2dv")) != 0 & + (glUniformMatrix3dv = GLContext.getFunctionAddress("glUniformMatrix3dv")) != 0 & + (glUniformMatrix4dv = GLContext.getFunctionAddress("glUniformMatrix4dv")) != 0 & + (glUniformMatrix2x3dv = GLContext.getFunctionAddress("glUniformMatrix2x3dv")) != 0 & + (glUniformMatrix2x4dv = GLContext.getFunctionAddress("glUniformMatrix2x4dv")) != 0 & + (glUniformMatrix3x2dv = GLContext.getFunctionAddress("glUniformMatrix3x2dv")) != 0 & + (glUniformMatrix3x4dv = GLContext.getFunctionAddress("glUniformMatrix3x4dv")) != 0 & + (glUniformMatrix4x2dv = GLContext.getFunctionAddress("glUniformMatrix4x2dv")) != 0 & + (glUniformMatrix4x3dv = GLContext.getFunctionAddress("glUniformMatrix4x3dv")) != 0 & + (glGetUniformdv = GLContext.getFunctionAddress("glGetUniformdv")) != 0 & + (glMinSampleShading = GLContext.getFunctionAddress("glMinSampleShading")) != 0 & + (glGetSubroutineUniformLocation = GLContext.getFunctionAddress("glGetSubroutineUniformLocation")) != 0 & + (glGetSubroutineIndex = GLContext.getFunctionAddress("glGetSubroutineIndex")) != 0 & + (glGetActiveSubroutineUniformiv = GLContext.getFunctionAddress("glGetActiveSubroutineUniformiv")) != 0 & + (glGetActiveSubroutineUniformName = GLContext.getFunctionAddress("glGetActiveSubroutineUniformName")) != 0 & + (glGetActiveSubroutineName = GLContext.getFunctionAddress("glGetActiveSubroutineName")) != 0 & + (glUniformSubroutinesuiv = GLContext.getFunctionAddress("glUniformSubroutinesuiv")) != 0 & + (glGetUniformSubroutineuiv = GLContext.getFunctionAddress("glGetUniformSubroutineuiv")) != 0 & + (glGetProgramStageiv = GLContext.getFunctionAddress("glGetProgramStageiv")) != 0 & + (glPatchParameteri = GLContext.getFunctionAddress("glPatchParameteri")) != 0 & + (glPatchParameterfv = GLContext.getFunctionAddress("glPatchParameterfv")) != 0 & + (glBindTransformFeedback = GLContext.getFunctionAddress("glBindTransformFeedback")) != 0 & + (glDeleteTransformFeedbacks = GLContext.getFunctionAddress("glDeleteTransformFeedbacks")) != 0 & + (glGenTransformFeedbacks = GLContext.getFunctionAddress("glGenTransformFeedbacks")) != 0 & + (glIsTransformFeedback = GLContext.getFunctionAddress("glIsTransformFeedback")) != 0 & + (glPauseTransformFeedback = GLContext.getFunctionAddress("glPauseTransformFeedback")) != 0 & + (glResumeTransformFeedback = GLContext.getFunctionAddress("glResumeTransformFeedback")) != 0 & + (glDrawTransformFeedback = GLContext.getFunctionAddress("glDrawTransformFeedback")) != 0 & + (glDrawTransformFeedbackStream = GLContext.getFunctionAddress("glDrawTransformFeedbackStream")) != 0 & + (glBeginQueryIndexed = GLContext.getFunctionAddress("glBeginQueryIndexed")) != 0 & + (glEndQueryIndexed = GLContext.getFunctionAddress("glEndQueryIndexed")) != 0 & + (glGetQueryIndexediv = GLContext.getFunctionAddress("glGetQueryIndexediv")) != 0; + } + + private boolean GL41_initNativeFunctionAddresses() { + return + (glReleaseShaderCompiler = GLContext.getFunctionAddress("glReleaseShaderCompiler")) != 0 & + (glShaderBinary = GLContext.getFunctionAddress("glShaderBinary")) != 0 & + (glGetShaderPrecisionFormat = GLContext.getFunctionAddress("glGetShaderPrecisionFormat")) != 0 & + (glDepthRangef = GLContext.getFunctionAddress("glDepthRangef")) != 0 & + (glClearDepthf = GLContext.getFunctionAddress("glClearDepthf")) != 0 & + (glGetProgramBinary = GLContext.getFunctionAddress("glGetProgramBinary")) != 0 & + (glProgramBinary = GLContext.getFunctionAddress("glProgramBinary")) != 0 & + (glProgramParameteri = GLContext.getFunctionAddress("glProgramParameteri")) != 0 & + (glUseProgramStages = GLContext.getFunctionAddress("glUseProgramStages")) != 0 & + (glActiveShaderProgram = GLContext.getFunctionAddress("glActiveShaderProgram")) != 0 & + (glCreateShaderProgramv = GLContext.getFunctionAddress("glCreateShaderProgramv")) != 0 & + (glBindProgramPipeline = GLContext.getFunctionAddress("glBindProgramPipeline")) != 0 & + (glDeleteProgramPipelines = GLContext.getFunctionAddress("glDeleteProgramPipelines")) != 0 & + (glGenProgramPipelines = GLContext.getFunctionAddress("glGenProgramPipelines")) != 0 & + (glIsProgramPipeline = GLContext.getFunctionAddress("glIsProgramPipeline")) != 0 & + (glGetProgramPipelineiv = GLContext.getFunctionAddress("glGetProgramPipelineiv")) != 0 & + (glProgramUniform1i = GLContext.getFunctionAddress("glProgramUniform1i")) != 0 & + (glProgramUniform2i = GLContext.getFunctionAddress("glProgramUniform2i")) != 0 & + (glProgramUniform3i = GLContext.getFunctionAddress("glProgramUniform3i")) != 0 & + (glProgramUniform4i = GLContext.getFunctionAddress("glProgramUniform4i")) != 0 & + (glProgramUniform1f = GLContext.getFunctionAddress("glProgramUniform1f")) != 0 & + (glProgramUniform2f = GLContext.getFunctionAddress("glProgramUniform2f")) != 0 & + (glProgramUniform3f = GLContext.getFunctionAddress("glProgramUniform3f")) != 0 & + (glProgramUniform4f = GLContext.getFunctionAddress("glProgramUniform4f")) != 0 & + (glProgramUniform1d = GLContext.getFunctionAddress("glProgramUniform1d")) != 0 & + (glProgramUniform2d = GLContext.getFunctionAddress("glProgramUniform2d")) != 0 & + (glProgramUniform3d = GLContext.getFunctionAddress("glProgramUniform3d")) != 0 & + (glProgramUniform4d = GLContext.getFunctionAddress("glProgramUniform4d")) != 0 & + (glProgramUniform1iv = GLContext.getFunctionAddress("glProgramUniform1iv")) != 0 & + (glProgramUniform2iv = GLContext.getFunctionAddress("glProgramUniform2iv")) != 0 & + (glProgramUniform3iv = GLContext.getFunctionAddress("glProgramUniform3iv")) != 0 & + (glProgramUniform4iv = GLContext.getFunctionAddress("glProgramUniform4iv")) != 0 & + (glProgramUniform1fv = GLContext.getFunctionAddress("glProgramUniform1fv")) != 0 & + (glProgramUniform2fv = GLContext.getFunctionAddress("glProgramUniform2fv")) != 0 & + (glProgramUniform3fv = GLContext.getFunctionAddress("glProgramUniform3fv")) != 0 & + (glProgramUniform4fv = GLContext.getFunctionAddress("glProgramUniform4fv")) != 0 & + (glProgramUniform1dv = GLContext.getFunctionAddress("glProgramUniform1dv")) != 0 & + (glProgramUniform2dv = GLContext.getFunctionAddress("glProgramUniform2dv")) != 0 & + (glProgramUniform3dv = GLContext.getFunctionAddress("glProgramUniform3dv")) != 0 & + (glProgramUniform4dv = GLContext.getFunctionAddress("glProgramUniform4dv")) != 0 & + (glProgramUniform1ui = GLContext.getFunctionAddress("glProgramUniform1ui")) != 0 & + (glProgramUniform2ui = GLContext.getFunctionAddress("glProgramUniform2ui")) != 0 & + (glProgramUniform3ui = GLContext.getFunctionAddress("glProgramUniform3ui")) != 0 & + (glProgramUniform4ui = GLContext.getFunctionAddress("glProgramUniform4ui")) != 0 & + (glProgramUniform1uiv = GLContext.getFunctionAddress("glProgramUniform1uiv")) != 0 & + (glProgramUniform2uiv = GLContext.getFunctionAddress("glProgramUniform2uiv")) != 0 & + (glProgramUniform3uiv = GLContext.getFunctionAddress("glProgramUniform3uiv")) != 0 & + (glProgramUniform4uiv = GLContext.getFunctionAddress("glProgramUniform4uiv")) != 0 & + (glProgramUniformMatrix2fv = GLContext.getFunctionAddress("glProgramUniformMatrix2fv")) != 0 & + (glProgramUniformMatrix3fv = GLContext.getFunctionAddress("glProgramUniformMatrix3fv")) != 0 & + (glProgramUniformMatrix4fv = GLContext.getFunctionAddress("glProgramUniformMatrix4fv")) != 0 & + (glProgramUniformMatrix2dv = GLContext.getFunctionAddress("glProgramUniformMatrix2dv")) != 0 & + (glProgramUniformMatrix3dv = GLContext.getFunctionAddress("glProgramUniformMatrix3dv")) != 0 & + (glProgramUniformMatrix4dv = GLContext.getFunctionAddress("glProgramUniformMatrix4dv")) != 0 & + (glProgramUniformMatrix2x3fv = GLContext.getFunctionAddress("glProgramUniformMatrix2x3fv")) != 0 & + (glProgramUniformMatrix3x2fv = GLContext.getFunctionAddress("glProgramUniformMatrix3x2fv")) != 0 & + (glProgramUniformMatrix2x4fv = GLContext.getFunctionAddress("glProgramUniformMatrix2x4fv")) != 0 & + (glProgramUniformMatrix4x2fv = GLContext.getFunctionAddress("glProgramUniformMatrix4x2fv")) != 0 & + (glProgramUniformMatrix3x4fv = GLContext.getFunctionAddress("glProgramUniformMatrix3x4fv")) != 0 & + (glProgramUniformMatrix4x3fv = GLContext.getFunctionAddress("glProgramUniformMatrix4x3fv")) != 0 & + (glProgramUniformMatrix2x3dv = GLContext.getFunctionAddress("glProgramUniformMatrix2x3dv")) != 0 & + (glProgramUniformMatrix3x2dv = GLContext.getFunctionAddress("glProgramUniformMatrix3x2dv")) != 0 & + (glProgramUniformMatrix2x4dv = GLContext.getFunctionAddress("glProgramUniformMatrix2x4dv")) != 0 & + (glProgramUniformMatrix4x2dv = GLContext.getFunctionAddress("glProgramUniformMatrix4x2dv")) != 0 & + (glProgramUniformMatrix3x4dv = GLContext.getFunctionAddress("glProgramUniformMatrix3x4dv")) != 0 & + (glProgramUniformMatrix4x3dv = GLContext.getFunctionAddress("glProgramUniformMatrix4x3dv")) != 0 & + (glValidateProgramPipeline = GLContext.getFunctionAddress("glValidateProgramPipeline")) != 0 & + (glGetProgramPipelineInfoLog = GLContext.getFunctionAddress("glGetProgramPipelineInfoLog")) != 0 & + (glVertexAttribL1d = GLContext.getFunctionAddress("glVertexAttribL1d")) != 0 & + (glVertexAttribL2d = GLContext.getFunctionAddress("glVertexAttribL2d")) != 0 & + (glVertexAttribL3d = GLContext.getFunctionAddress("glVertexAttribL3d")) != 0 & + (glVertexAttribL4d = GLContext.getFunctionAddress("glVertexAttribL4d")) != 0 & + (glVertexAttribL1dv = GLContext.getFunctionAddress("glVertexAttribL1dv")) != 0 & + (glVertexAttribL2dv = GLContext.getFunctionAddress("glVertexAttribL2dv")) != 0 & + (glVertexAttribL3dv = GLContext.getFunctionAddress("glVertexAttribL3dv")) != 0 & + (glVertexAttribL4dv = GLContext.getFunctionAddress("glVertexAttribL4dv")) != 0 & + (glVertexAttribLPointer = GLContext.getFunctionAddress("glVertexAttribLPointer")) != 0 & + (glGetVertexAttribLdv = GLContext.getFunctionAddress("glGetVertexAttribLdv")) != 0 & + (glViewportArrayv = GLContext.getFunctionAddress("glViewportArrayv")) != 0 & + (glViewportIndexedf = GLContext.getFunctionAddress("glViewportIndexedf")) != 0 & + (glViewportIndexedfv = GLContext.getFunctionAddress("glViewportIndexedfv")) != 0 & + (glScissorArrayv = GLContext.getFunctionAddress("glScissorArrayv")) != 0 & + (glScissorIndexed = GLContext.getFunctionAddress("glScissorIndexed")) != 0 & + (glScissorIndexedv = GLContext.getFunctionAddress("glScissorIndexedv")) != 0 & + (glDepthRangeArrayv = GLContext.getFunctionAddress("glDepthRangeArrayv")) != 0 & + (glDepthRangeIndexed = GLContext.getFunctionAddress("glDepthRangeIndexed")) != 0 & + (glGetFloati_v = GLContext.getFunctionAddress("glGetFloati_v")) != 0 & + (glGetDoublei_v = GLContext.getFunctionAddress("glGetDoublei_v")) != 0; + } + + private boolean GL42_initNativeFunctionAddresses() { + return + ((glGetActiveAtomicCounterBufferiv = GLContext.getFunctionAddress("glGetActiveAtomicCounterBufferiv")) != 0 || true) & + (glTexStorage1D = GLContext.getFunctionAddress("glTexStorage1D")) != 0 & + (glTexStorage2D = GLContext.getFunctionAddress("glTexStorage2D")) != 0 & + (glTexStorage3D = GLContext.getFunctionAddress("glTexStorage3D")) != 0 & + (glDrawTransformFeedbackInstanced = GLContext.getFunctionAddress("glDrawTransformFeedbackInstanced")) != 0 & + (glDrawTransformFeedbackStreamInstanced = GLContext.getFunctionAddress("glDrawTransformFeedbackStreamInstanced")) != 0 & + (glDrawArraysInstancedBaseInstance = GLContext.getFunctionAddress("glDrawArraysInstancedBaseInstance")) != 0 & + (glDrawElementsInstancedBaseInstance = GLContext.getFunctionAddress("glDrawElementsInstancedBaseInstance")) != 0 & + (glDrawElementsInstancedBaseVertexBaseInstance = GLContext.getFunctionAddress("glDrawElementsInstancedBaseVertexBaseInstance")) != 0 & + (glBindImageTexture = GLContext.getFunctionAddress("glBindImageTexture")) != 0 & + (glMemoryBarrier = GLContext.getFunctionAddress("glMemoryBarrier")) != 0 & + (glGetInternalformativ = GLContext.getFunctionAddress("glGetInternalformativ")) != 0; + } + + private boolean GL43_initNativeFunctionAddresses() { + return + (glClearBufferData = GLContext.getFunctionAddress("glClearBufferData")) != 0 & + (glClearBufferSubData = GLContext.getFunctionAddress("glClearBufferSubData")) != 0 & + (glDispatchCompute = GLContext.getFunctionAddress("glDispatchCompute")) != 0 & + (glDispatchComputeIndirect = GLContext.getFunctionAddress("glDispatchComputeIndirect")) != 0 & + (glCopyImageSubData = GLContext.getFunctionAddress("glCopyImageSubData")) != 0 & + (glDebugMessageControl = GLContext.getFunctionAddress("glDebugMessageControl")) != 0 & + (glDebugMessageInsert = GLContext.getFunctionAddress("glDebugMessageInsert")) != 0 & + (glDebugMessageCallback = GLContext.getFunctionAddress("glDebugMessageCallback")) != 0 & + (glGetDebugMessageLog = GLContext.getFunctionAddress("glGetDebugMessageLog")) != 0 & + (glPushDebugGroup = GLContext.getFunctionAddress("glPushDebugGroup")) != 0 & + (glPopDebugGroup = GLContext.getFunctionAddress("glPopDebugGroup")) != 0 & + (glObjectLabel = GLContext.getFunctionAddress("glObjectLabel")) != 0 & + (glGetObjectLabel = GLContext.getFunctionAddress("glGetObjectLabel")) != 0 & + (glObjectPtrLabel = GLContext.getFunctionAddress("glObjectPtrLabel")) != 0 & + (glGetObjectPtrLabel = GLContext.getFunctionAddress("glGetObjectPtrLabel")) != 0 & + (glFramebufferParameteri = GLContext.getFunctionAddress("glFramebufferParameteri")) != 0 & + (glGetFramebufferParameteriv = GLContext.getFunctionAddress("glGetFramebufferParameteriv")) != 0 & + (glGetInternalformati64v = GLContext.getFunctionAddress("glGetInternalformati64v")) != 0 & + (glInvalidateTexSubImage = GLContext.getFunctionAddress("glInvalidateTexSubImage")) != 0 & + (glInvalidateTexImage = GLContext.getFunctionAddress("glInvalidateTexImage")) != 0 & + (glInvalidateBufferSubData = GLContext.getFunctionAddress("glInvalidateBufferSubData")) != 0 & + (glInvalidateBufferData = GLContext.getFunctionAddress("glInvalidateBufferData")) != 0 & + (glInvalidateFramebuffer = GLContext.getFunctionAddress("glInvalidateFramebuffer")) != 0 & + (glInvalidateSubFramebuffer = GLContext.getFunctionAddress("glInvalidateSubFramebuffer")) != 0 & + (glMultiDrawArraysIndirect = GLContext.getFunctionAddress("glMultiDrawArraysIndirect")) != 0 & + (glMultiDrawElementsIndirect = GLContext.getFunctionAddress("glMultiDrawElementsIndirect")) != 0 & + (glGetProgramInterfaceiv = GLContext.getFunctionAddress("glGetProgramInterfaceiv")) != 0 & + (glGetProgramResourceIndex = GLContext.getFunctionAddress("glGetProgramResourceIndex")) != 0 & + (glGetProgramResourceName = GLContext.getFunctionAddress("glGetProgramResourceName")) != 0 & + (glGetProgramResourceiv = GLContext.getFunctionAddress("glGetProgramResourceiv")) != 0 & + (glGetProgramResourceLocation = GLContext.getFunctionAddress("glGetProgramResourceLocation")) != 0 & + (glGetProgramResourceLocationIndex = GLContext.getFunctionAddress("glGetProgramResourceLocationIndex")) != 0 & + (glShaderStorageBlockBinding = GLContext.getFunctionAddress("glShaderStorageBlockBinding")) != 0 & + (glTexBufferRange = GLContext.getFunctionAddress("glTexBufferRange")) != 0 & + (glTexStorage2DMultisample = GLContext.getFunctionAddress("glTexStorage2DMultisample")) != 0 & + (glTexStorage3DMultisample = GLContext.getFunctionAddress("glTexStorage3DMultisample")) != 0 & + (glTextureView = GLContext.getFunctionAddress("glTextureView")) != 0 & + (glBindVertexBuffer = GLContext.getFunctionAddress("glBindVertexBuffer")) != 0 & + (glVertexAttribFormat = GLContext.getFunctionAddress("glVertexAttribFormat")) != 0 & + (glVertexAttribIFormat = GLContext.getFunctionAddress("glVertexAttribIFormat")) != 0 & + (glVertexAttribLFormat = GLContext.getFunctionAddress("glVertexAttribLFormat")) != 0 & + (glVertexAttribBinding = GLContext.getFunctionAddress("glVertexAttribBinding")) != 0 & + (glVertexBindingDivisor = GLContext.getFunctionAddress("glVertexBindingDivisor")) != 0; + } + + private boolean GL44_initNativeFunctionAddresses() { + return + (glBufferStorage = GLContext.getFunctionAddress("glBufferStorage")) != 0 & + (glClearTexImage = GLContext.getFunctionAddress("glClearTexImage")) != 0 & + (glClearTexSubImage = GLContext.getFunctionAddress("glClearTexSubImage")) != 0 & + (glBindBuffersBase = GLContext.getFunctionAddress("glBindBuffersBase")) != 0 & + (glBindBuffersRange = GLContext.getFunctionAddress("glBindBuffersRange")) != 0 & + (glBindTextures = GLContext.getFunctionAddress("glBindTextures")) != 0 & + (glBindSamplers = GLContext.getFunctionAddress("glBindSamplers")) != 0 & + (glBindImageTextures = GLContext.getFunctionAddress("glBindImageTextures")) != 0 & + (glBindVertexBuffers = GLContext.getFunctionAddress("glBindVertexBuffers")) != 0; + } + + private boolean GREMEDY_frame_terminator_initNativeFunctionAddresses() { + return + (glFrameTerminatorGREMEDY = GLContext.getFunctionAddress("glFrameTerminatorGREMEDY")) != 0; + } + + private boolean GREMEDY_string_marker_initNativeFunctionAddresses() { + return + (glStringMarkerGREMEDY = GLContext.getFunctionAddress("glStringMarkerGREMEDY")) != 0; + } + + private boolean INTEL_map_texture_initNativeFunctionAddresses() { + return + (glMapTexture2DINTEL = GLContext.getFunctionAddress("glMapTexture2DINTEL")) != 0 & + (glUnmapTexture2DINTEL = GLContext.getFunctionAddress("glUnmapTexture2DINTEL")) != 0 & + (glSyncTextureINTEL = GLContext.getFunctionAddress("glSyncTextureINTEL")) != 0; + } + + private boolean KHR_debug_initNativeFunctionAddresses() { + return + (glDebugMessageControl = GLContext.getFunctionAddress("glDebugMessageControl")) != 0 & + (glDebugMessageInsert = GLContext.getFunctionAddress("glDebugMessageInsert")) != 0 & + (glDebugMessageCallback = GLContext.getFunctionAddress("glDebugMessageCallback")) != 0 & + (glGetDebugMessageLog = GLContext.getFunctionAddress("glGetDebugMessageLog")) != 0 & + (glPushDebugGroup = GLContext.getFunctionAddress("glPushDebugGroup")) != 0 & + (glPopDebugGroup = GLContext.getFunctionAddress("glPopDebugGroup")) != 0 & + (glObjectLabel = GLContext.getFunctionAddress("glObjectLabel")) != 0 & + (glGetObjectLabel = GLContext.getFunctionAddress("glGetObjectLabel")) != 0 & + (glObjectPtrLabel = GLContext.getFunctionAddress("glObjectPtrLabel")) != 0 & + (glGetObjectPtrLabel = GLContext.getFunctionAddress("glGetObjectPtrLabel")) != 0; + } + + private boolean NV_bindless_multi_draw_indirect_initNativeFunctionAddresses() { + return + (glMultiDrawArraysIndirectBindlessNV = GLContext.getFunctionAddress("glMultiDrawArraysIndirectBindlessNV")) != 0 & + (glMultiDrawElementsIndirectBindlessNV = GLContext.getFunctionAddress("glMultiDrawElementsIndirectBindlessNV")) != 0; + } + + private boolean NV_bindless_texture_initNativeFunctionAddresses() { + return + (glGetTextureHandleNV = GLContext.getFunctionAddress("glGetTextureHandleNV")) != 0 & + (glGetTextureSamplerHandleNV = GLContext.getFunctionAddress("glGetTextureSamplerHandleNV")) != 0 & + (glMakeTextureHandleResidentNV = GLContext.getFunctionAddress("glMakeTextureHandleResidentNV")) != 0 & + (glMakeTextureHandleNonResidentNV = GLContext.getFunctionAddress("glMakeTextureHandleNonResidentNV")) != 0 & + (glGetImageHandleNV = GLContext.getFunctionAddress("glGetImageHandleNV")) != 0 & + (glMakeImageHandleResidentNV = GLContext.getFunctionAddress("glMakeImageHandleResidentNV")) != 0 & + (glMakeImageHandleNonResidentNV = GLContext.getFunctionAddress("glMakeImageHandleNonResidentNV")) != 0 & + (glUniformHandleui64NV = GLContext.getFunctionAddress("glUniformHandleui64NV")) != 0 & + (glUniformHandleui64vNV = GLContext.getFunctionAddress("glUniformHandleui64vNV")) != 0 & + (glProgramUniformHandleui64NV = GLContext.getFunctionAddress("glProgramUniformHandleui64NV")) != 0 & + (glProgramUniformHandleui64vNV = GLContext.getFunctionAddress("glProgramUniformHandleui64vNV")) != 0 & + (glIsTextureHandleResidentNV = GLContext.getFunctionAddress("glIsTextureHandleResidentNV")) != 0 & + (glIsImageHandleResidentNV = GLContext.getFunctionAddress("glIsImageHandleResidentNV")) != 0; + } + + private boolean NV_blend_equation_advanced_initNativeFunctionAddresses() { + return + (glBlendParameteriNV = GLContext.getFunctionAddress("glBlendParameteriNV")) != 0 & + (glBlendBarrierNV = GLContext.getFunctionAddress("glBlendBarrierNV")) != 0; + } + + private boolean NV_conditional_render_initNativeFunctionAddresses() { + return + (glBeginConditionalRenderNV = GLContext.getFunctionAddress("glBeginConditionalRenderNV")) != 0 & + (glEndConditionalRenderNV = GLContext.getFunctionAddress("glEndConditionalRenderNV")) != 0; + } + + private boolean NV_copy_image_initNativeFunctionAddresses() { + return + (glCopyImageSubDataNV = GLContext.getFunctionAddress("glCopyImageSubDataNV")) != 0; + } + + private boolean NV_depth_buffer_float_initNativeFunctionAddresses() { + return + (glDepthRangedNV = GLContext.getFunctionAddress("glDepthRangedNV")) != 0 & + (glClearDepthdNV = GLContext.getFunctionAddress("glClearDepthdNV")) != 0 & + (glDepthBoundsdNV = GLContext.getFunctionAddress("glDepthBoundsdNV")) != 0; + } + + private boolean NV_draw_texture_initNativeFunctionAddresses() { + return + (glDrawTextureNV = GLContext.getFunctionAddress("glDrawTextureNV")) != 0; + } + + private boolean NV_evaluators_initNativeFunctionAddresses() { + return + (glGetMapControlPointsNV = GLContext.getFunctionAddress("glGetMapControlPointsNV")) != 0 & + (glMapControlPointsNV = GLContext.getFunctionAddress("glMapControlPointsNV")) != 0 & + (glMapParameterfvNV = GLContext.getFunctionAddress("glMapParameterfvNV")) != 0 & + (glMapParameterivNV = GLContext.getFunctionAddress("glMapParameterivNV")) != 0 & + (glGetMapParameterfvNV = GLContext.getFunctionAddress("glGetMapParameterfvNV")) != 0 & + (glGetMapParameterivNV = GLContext.getFunctionAddress("glGetMapParameterivNV")) != 0 & + (glGetMapAttribParameterfvNV = GLContext.getFunctionAddress("glGetMapAttribParameterfvNV")) != 0 & + (glGetMapAttribParameterivNV = GLContext.getFunctionAddress("glGetMapAttribParameterivNV")) != 0 & + (glEvalMapsNV = GLContext.getFunctionAddress("glEvalMapsNV")) != 0; + } + + private boolean NV_explicit_multisample_initNativeFunctionAddresses() { + return + (glGetBooleanIndexedvEXT = GLContext.getFunctionAddress("glGetBooleanIndexedvEXT")) != 0 & + (glGetIntegerIndexedvEXT = GLContext.getFunctionAddress("glGetIntegerIndexedvEXT")) != 0 & + (glGetMultisamplefvNV = GLContext.getFunctionAddress("glGetMultisamplefvNV")) != 0 & + (glSampleMaskIndexedNV = GLContext.getFunctionAddress("glSampleMaskIndexedNV")) != 0 & + (glTexRenderbufferNV = GLContext.getFunctionAddress("glTexRenderbufferNV")) != 0; + } + + private boolean NV_fence_initNativeFunctionAddresses() { + return + (glGenFencesNV = GLContext.getFunctionAddress("glGenFencesNV")) != 0 & + (glDeleteFencesNV = GLContext.getFunctionAddress("glDeleteFencesNV")) != 0 & + (glSetFenceNV = GLContext.getFunctionAddress("glSetFenceNV")) != 0 & + (glTestFenceNV = GLContext.getFunctionAddress("glTestFenceNV")) != 0 & + (glFinishFenceNV = GLContext.getFunctionAddress("glFinishFenceNV")) != 0 & + (glIsFenceNV = GLContext.getFunctionAddress("glIsFenceNV")) != 0 & + (glGetFenceivNV = GLContext.getFunctionAddress("glGetFenceivNV")) != 0; + } + + private boolean NV_fragment_program_initNativeFunctionAddresses() { + return + (glProgramNamedParameter4fNV = GLContext.getFunctionAddress("glProgramNamedParameter4fNV")) != 0 & + (glProgramNamedParameter4dNV = GLContext.getFunctionAddress("glProgramNamedParameter4dNV")) != 0 & + (glGetProgramNamedParameterfvNV = GLContext.getFunctionAddress("glGetProgramNamedParameterfvNV")) != 0 & + (glGetProgramNamedParameterdvNV = GLContext.getFunctionAddress("glGetProgramNamedParameterdvNV")) != 0; + } + + private boolean NV_framebuffer_multisample_coverage_initNativeFunctionAddresses() { + return + (glRenderbufferStorageMultisampleCoverageNV = GLContext.getFunctionAddress("glRenderbufferStorageMultisampleCoverageNV")) != 0; + } + + private boolean NV_geometry_program4_initNativeFunctionAddresses() { + return + (glProgramVertexLimitNV = GLContext.getFunctionAddress("glProgramVertexLimitNV")) != 0 & + (glFramebufferTextureEXT = GLContext.getFunctionAddress("glFramebufferTextureEXT")) != 0 & + (glFramebufferTextureLayerEXT = GLContext.getFunctionAddress("glFramebufferTextureLayerEXT")) != 0 & + (glFramebufferTextureFaceEXT = GLContext.getFunctionAddress("glFramebufferTextureFaceEXT")) != 0; + } + + private boolean NV_gpu_program4_initNativeFunctionAddresses() { + return + (glProgramLocalParameterI4iNV = GLContext.getFunctionAddress("glProgramLocalParameterI4iNV")) != 0 & + (glProgramLocalParameterI4ivNV = GLContext.getFunctionAddress("glProgramLocalParameterI4ivNV")) != 0 & + (glProgramLocalParametersI4ivNV = GLContext.getFunctionAddress("glProgramLocalParametersI4ivNV")) != 0 & + (glProgramLocalParameterI4uiNV = GLContext.getFunctionAddress("glProgramLocalParameterI4uiNV")) != 0 & + (glProgramLocalParameterI4uivNV = GLContext.getFunctionAddress("glProgramLocalParameterI4uivNV")) != 0 & + (glProgramLocalParametersI4uivNV = GLContext.getFunctionAddress("glProgramLocalParametersI4uivNV")) != 0 & + (glProgramEnvParameterI4iNV = GLContext.getFunctionAddress("glProgramEnvParameterI4iNV")) != 0 & + (glProgramEnvParameterI4ivNV = GLContext.getFunctionAddress("glProgramEnvParameterI4ivNV")) != 0 & + (glProgramEnvParametersI4ivNV = GLContext.getFunctionAddress("glProgramEnvParametersI4ivNV")) != 0 & + (glProgramEnvParameterI4uiNV = GLContext.getFunctionAddress("glProgramEnvParameterI4uiNV")) != 0 & + (glProgramEnvParameterI4uivNV = GLContext.getFunctionAddress("glProgramEnvParameterI4uivNV")) != 0 & + (glProgramEnvParametersI4uivNV = GLContext.getFunctionAddress("glProgramEnvParametersI4uivNV")) != 0 & + (glGetProgramLocalParameterIivNV = GLContext.getFunctionAddress("glGetProgramLocalParameterIivNV")) != 0 & + (glGetProgramLocalParameterIuivNV = GLContext.getFunctionAddress("glGetProgramLocalParameterIuivNV")) != 0 & + (glGetProgramEnvParameterIivNV = GLContext.getFunctionAddress("glGetProgramEnvParameterIivNV")) != 0 & + (glGetProgramEnvParameterIuivNV = GLContext.getFunctionAddress("glGetProgramEnvParameterIuivNV")) != 0; + } + + private boolean NV_gpu_shader5_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glUniform1i64NV = GLContext.getFunctionAddress("glUniform1i64NV")) != 0 & + (glUniform2i64NV = GLContext.getFunctionAddress("glUniform2i64NV")) != 0 & + (glUniform3i64NV = GLContext.getFunctionAddress("glUniform3i64NV")) != 0 & + (glUniform4i64NV = GLContext.getFunctionAddress("glUniform4i64NV")) != 0 & + (glUniform1i64vNV = GLContext.getFunctionAddress("glUniform1i64vNV")) != 0 & + (glUniform2i64vNV = GLContext.getFunctionAddress("glUniform2i64vNV")) != 0 & + (glUniform3i64vNV = GLContext.getFunctionAddress("glUniform3i64vNV")) != 0 & + (glUniform4i64vNV = GLContext.getFunctionAddress("glUniform4i64vNV")) != 0 & + (glUniform1ui64NV = GLContext.getFunctionAddress("glUniform1ui64NV")) != 0 & + (glUniform2ui64NV = GLContext.getFunctionAddress("glUniform2ui64NV")) != 0 & + (glUniform3ui64NV = GLContext.getFunctionAddress("glUniform3ui64NV")) != 0 & + (glUniform4ui64NV = GLContext.getFunctionAddress("glUniform4ui64NV")) != 0 & + (glUniform1ui64vNV = GLContext.getFunctionAddress("glUniform1ui64vNV")) != 0 & + (glUniform2ui64vNV = GLContext.getFunctionAddress("glUniform2ui64vNV")) != 0 & + (glUniform3ui64vNV = GLContext.getFunctionAddress("glUniform3ui64vNV")) != 0 & + (glUniform4ui64vNV = GLContext.getFunctionAddress("glUniform4ui64vNV")) != 0 & + (glGetUniformi64vNV = GLContext.getFunctionAddress("glGetUniformi64vNV")) != 0 & + (glGetUniformui64vNV = GLContext.getFunctionAddress("glGetUniformui64vNV")) != 0 & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1i64NV = GLContext.getFunctionAddress("glProgramUniform1i64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2i64NV = GLContext.getFunctionAddress("glProgramUniform2i64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3i64NV = GLContext.getFunctionAddress("glProgramUniform3i64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4i64NV = GLContext.getFunctionAddress("glProgramUniform4i64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1i64vNV = GLContext.getFunctionAddress("glProgramUniform1i64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2i64vNV = GLContext.getFunctionAddress("glProgramUniform2i64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3i64vNV = GLContext.getFunctionAddress("glProgramUniform3i64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4i64vNV = GLContext.getFunctionAddress("glProgramUniform4i64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1ui64NV = GLContext.getFunctionAddress("glProgramUniform1ui64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2ui64NV = GLContext.getFunctionAddress("glProgramUniform2ui64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3ui64NV = GLContext.getFunctionAddress("glProgramUniform3ui64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4ui64NV = GLContext.getFunctionAddress("glProgramUniform4ui64NV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform1ui64vNV = GLContext.getFunctionAddress("glProgramUniform1ui64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform2ui64vNV = GLContext.getFunctionAddress("glProgramUniform2ui64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform3ui64vNV = GLContext.getFunctionAddress("glProgramUniform3ui64vNV")) != 0) & + (!supported_extensions.contains("GL_EXT_direct_state_access") || (glProgramUniform4ui64vNV = GLContext.getFunctionAddress("glProgramUniform4ui64vNV")) != 0); + } + + private boolean NV_half_float_initNativeFunctionAddresses() { + return + (glVertex2hNV = GLContext.getFunctionAddress("glVertex2hNV")) != 0 & + (glVertex3hNV = GLContext.getFunctionAddress("glVertex3hNV")) != 0 & + (glVertex4hNV = GLContext.getFunctionAddress("glVertex4hNV")) != 0 & + (glNormal3hNV = GLContext.getFunctionAddress("glNormal3hNV")) != 0 & + (glColor3hNV = GLContext.getFunctionAddress("glColor3hNV")) != 0 & + (glColor4hNV = GLContext.getFunctionAddress("glColor4hNV")) != 0 & + (glTexCoord1hNV = GLContext.getFunctionAddress("glTexCoord1hNV")) != 0 & + (glTexCoord2hNV = GLContext.getFunctionAddress("glTexCoord2hNV")) != 0 & + (glTexCoord3hNV = GLContext.getFunctionAddress("glTexCoord3hNV")) != 0 & + (glTexCoord4hNV = GLContext.getFunctionAddress("glTexCoord4hNV")) != 0 & + (glMultiTexCoord1hNV = GLContext.getFunctionAddress("glMultiTexCoord1hNV")) != 0 & + (glMultiTexCoord2hNV = GLContext.getFunctionAddress("glMultiTexCoord2hNV")) != 0 & + (glMultiTexCoord3hNV = GLContext.getFunctionAddress("glMultiTexCoord3hNV")) != 0 & + (glMultiTexCoord4hNV = GLContext.getFunctionAddress("glMultiTexCoord4hNV")) != 0 & + (glFogCoordhNV = GLContext.getFunctionAddress("glFogCoordhNV")) != 0 & + (glSecondaryColor3hNV = GLContext.getFunctionAddress("glSecondaryColor3hNV")) != 0 & + ((glVertexWeighthNV = GLContext.getFunctionAddress("glVertexWeighthNV")) != 0 || true) & + ((glVertexAttrib1hNV = GLContext.getFunctionAddress("glVertexAttrib1hNV")) != 0 || true) & + ((glVertexAttrib2hNV = GLContext.getFunctionAddress("glVertexAttrib2hNV")) != 0 || true) & + ((glVertexAttrib3hNV = GLContext.getFunctionAddress("glVertexAttrib3hNV")) != 0 || true) & + ((glVertexAttrib4hNV = GLContext.getFunctionAddress("glVertexAttrib4hNV")) != 0 || true) & + ((glVertexAttribs1hvNV = GLContext.getFunctionAddress("glVertexAttribs1hvNV")) != 0 || true) & + ((glVertexAttribs2hvNV = GLContext.getFunctionAddress("glVertexAttribs2hvNV")) != 0 || true) & + ((glVertexAttribs3hvNV = GLContext.getFunctionAddress("glVertexAttribs3hvNV")) != 0 || true) & + ((glVertexAttribs4hvNV = GLContext.getFunctionAddress("glVertexAttribs4hvNV")) != 0 || true); + } + + private boolean NV_occlusion_query_initNativeFunctionAddresses() { + return + (glGenOcclusionQueriesNV = GLContext.getFunctionAddress("glGenOcclusionQueriesNV")) != 0 & + (glDeleteOcclusionQueriesNV = GLContext.getFunctionAddress("glDeleteOcclusionQueriesNV")) != 0 & + (glIsOcclusionQueryNV = GLContext.getFunctionAddress("glIsOcclusionQueryNV")) != 0 & + (glBeginOcclusionQueryNV = GLContext.getFunctionAddress("glBeginOcclusionQueryNV")) != 0 & + (glEndOcclusionQueryNV = GLContext.getFunctionAddress("glEndOcclusionQueryNV")) != 0 & + (glGetOcclusionQueryuivNV = GLContext.getFunctionAddress("glGetOcclusionQueryuivNV")) != 0 & + (glGetOcclusionQueryivNV = GLContext.getFunctionAddress("glGetOcclusionQueryivNV")) != 0; + } + + private boolean NV_parameter_buffer_object_initNativeFunctionAddresses() { + return + (glProgramBufferParametersfvNV = GLContext.getFunctionAddress("glProgramBufferParametersfvNV")) != 0 & + (glProgramBufferParametersIivNV = GLContext.getFunctionAddress("glProgramBufferParametersIivNV")) != 0 & + (glProgramBufferParametersIuivNV = GLContext.getFunctionAddress("glProgramBufferParametersIuivNV")) != 0; + } + + private boolean NV_path_rendering_initNativeFunctionAddresses() { + return + (glPathCommandsNV = GLContext.getFunctionAddress("glPathCommandsNV")) != 0 & + (glPathCoordsNV = GLContext.getFunctionAddress("glPathCoordsNV")) != 0 & + (glPathSubCommandsNV = GLContext.getFunctionAddress("glPathSubCommandsNV")) != 0 & + (glPathSubCoordsNV = GLContext.getFunctionAddress("glPathSubCoordsNV")) != 0 & + (glPathStringNV = GLContext.getFunctionAddress("glPathStringNV")) != 0 & + (glPathGlyphsNV = GLContext.getFunctionAddress("glPathGlyphsNV")) != 0 & + (glPathGlyphRangeNV = GLContext.getFunctionAddress("glPathGlyphRangeNV")) != 0 & + (glWeightPathsNV = GLContext.getFunctionAddress("glWeightPathsNV")) != 0 & + (glCopyPathNV = GLContext.getFunctionAddress("glCopyPathNV")) != 0 & + (glInterpolatePathsNV = GLContext.getFunctionAddress("glInterpolatePathsNV")) != 0 & + (glTransformPathNV = GLContext.getFunctionAddress("glTransformPathNV")) != 0 & + (glPathParameterivNV = GLContext.getFunctionAddress("glPathParameterivNV")) != 0 & + (glPathParameteriNV = GLContext.getFunctionAddress("glPathParameteriNV")) != 0 & + (glPathParameterfvNV = GLContext.getFunctionAddress("glPathParameterfvNV")) != 0 & + (glPathParameterfNV = GLContext.getFunctionAddress("glPathParameterfNV")) != 0 & + (glPathDashArrayNV = GLContext.getFunctionAddress("glPathDashArrayNV")) != 0 & + (glGenPathsNV = GLContext.getFunctionAddress("glGenPathsNV")) != 0 & + (glDeletePathsNV = GLContext.getFunctionAddress("glDeletePathsNV")) != 0 & + (glIsPathNV = GLContext.getFunctionAddress("glIsPathNV")) != 0 & + (glPathStencilFuncNV = GLContext.getFunctionAddress("glPathStencilFuncNV")) != 0 & + (glPathStencilDepthOffsetNV = GLContext.getFunctionAddress("glPathStencilDepthOffsetNV")) != 0 & + (glStencilFillPathNV = GLContext.getFunctionAddress("glStencilFillPathNV")) != 0 & + (glStencilStrokePathNV = GLContext.getFunctionAddress("glStencilStrokePathNV")) != 0 & + (glStencilFillPathInstancedNV = GLContext.getFunctionAddress("glStencilFillPathInstancedNV")) != 0 & + (glStencilStrokePathInstancedNV = GLContext.getFunctionAddress("glStencilStrokePathInstancedNV")) != 0 & + (glPathCoverDepthFuncNV = GLContext.getFunctionAddress("glPathCoverDepthFuncNV")) != 0 & + (glPathColorGenNV = GLContext.getFunctionAddress("glPathColorGenNV")) != 0 & + (glPathTexGenNV = GLContext.getFunctionAddress("glPathTexGenNV")) != 0 & + (glPathFogGenNV = GLContext.getFunctionAddress("glPathFogGenNV")) != 0 & + (glCoverFillPathNV = GLContext.getFunctionAddress("glCoverFillPathNV")) != 0 & + (glCoverStrokePathNV = GLContext.getFunctionAddress("glCoverStrokePathNV")) != 0 & + (glCoverFillPathInstancedNV = GLContext.getFunctionAddress("glCoverFillPathInstancedNV")) != 0 & + (glCoverStrokePathInstancedNV = GLContext.getFunctionAddress("glCoverStrokePathInstancedNV")) != 0 & + (glGetPathParameterivNV = GLContext.getFunctionAddress("glGetPathParameterivNV")) != 0 & + (glGetPathParameterfvNV = GLContext.getFunctionAddress("glGetPathParameterfvNV")) != 0 & + (glGetPathCommandsNV = GLContext.getFunctionAddress("glGetPathCommandsNV")) != 0 & + (glGetPathCoordsNV = GLContext.getFunctionAddress("glGetPathCoordsNV")) != 0 & + (glGetPathDashArrayNV = GLContext.getFunctionAddress("glGetPathDashArrayNV")) != 0 & + (glGetPathMetricsNV = GLContext.getFunctionAddress("glGetPathMetricsNV")) != 0 & + (glGetPathMetricRangeNV = GLContext.getFunctionAddress("glGetPathMetricRangeNV")) != 0 & + (glGetPathSpacingNV = GLContext.getFunctionAddress("glGetPathSpacingNV")) != 0 & + (glGetPathColorGenivNV = GLContext.getFunctionAddress("glGetPathColorGenivNV")) != 0 & + (glGetPathColorGenfvNV = GLContext.getFunctionAddress("glGetPathColorGenfvNV")) != 0 & + (glGetPathTexGenivNV = GLContext.getFunctionAddress("glGetPathTexGenivNV")) != 0 & + (glGetPathTexGenfvNV = GLContext.getFunctionAddress("glGetPathTexGenfvNV")) != 0 & + (glIsPointInFillPathNV = GLContext.getFunctionAddress("glIsPointInFillPathNV")) != 0 & + (glIsPointInStrokePathNV = GLContext.getFunctionAddress("glIsPointInStrokePathNV")) != 0 & + (glGetPathLengthNV = GLContext.getFunctionAddress("glGetPathLengthNV")) != 0 & + (glPointAlongPathNV = GLContext.getFunctionAddress("glPointAlongPathNV")) != 0; + } + + private boolean NV_pixel_data_range_initNativeFunctionAddresses() { + return + (glPixelDataRangeNV = GLContext.getFunctionAddress("glPixelDataRangeNV")) != 0 & + (glFlushPixelDataRangeNV = GLContext.getFunctionAddress("glFlushPixelDataRangeNV")) != 0; + } + + private boolean NV_point_sprite_initNativeFunctionAddresses() { + return + (glPointParameteriNV = GLContext.getFunctionAddress("glPointParameteriNV")) != 0 & + (glPointParameterivNV = GLContext.getFunctionAddress("glPointParameterivNV")) != 0; + } + + private boolean NV_present_video_initNativeFunctionAddresses() { + return + (glPresentFrameKeyedNV = GLContext.getFunctionAddress("glPresentFrameKeyedNV")) != 0 & + (glPresentFrameDualFillNV = GLContext.getFunctionAddress("glPresentFrameDualFillNV")) != 0 & + (glGetVideoivNV = GLContext.getFunctionAddress("glGetVideoivNV")) != 0 & + (glGetVideouivNV = GLContext.getFunctionAddress("glGetVideouivNV")) != 0 & + (glGetVideoi64vNV = GLContext.getFunctionAddress("glGetVideoi64vNV")) != 0 & + (glGetVideoui64vNV = GLContext.getFunctionAddress("glGetVideoui64vNV")) != 0; + } + + private boolean NV_primitive_restart_initNativeFunctionAddresses() { + return + (glPrimitiveRestartNV = GLContext.getFunctionAddress("glPrimitiveRestartNV")) != 0 & + (glPrimitiveRestartIndexNV = GLContext.getFunctionAddress("glPrimitiveRestartIndexNV")) != 0; + } + + private boolean NV_program_initNativeFunctionAddresses() { + return + (glLoadProgramNV = GLContext.getFunctionAddress("glLoadProgramNV")) != 0 & + (glBindProgramNV = GLContext.getFunctionAddress("glBindProgramNV")) != 0 & + (glDeleteProgramsNV = GLContext.getFunctionAddress("glDeleteProgramsNV")) != 0 & + (glGenProgramsNV = GLContext.getFunctionAddress("glGenProgramsNV")) != 0 & + (glGetProgramivNV = GLContext.getFunctionAddress("glGetProgramivNV")) != 0 & + (glGetProgramStringNV = GLContext.getFunctionAddress("glGetProgramStringNV")) != 0 & + (glIsProgramNV = GLContext.getFunctionAddress("glIsProgramNV")) != 0 & + (glAreProgramsResidentNV = GLContext.getFunctionAddress("glAreProgramsResidentNV")) != 0 & + (glRequestResidentProgramsNV = GLContext.getFunctionAddress("glRequestResidentProgramsNV")) != 0; + } + + private boolean NV_register_combiners_initNativeFunctionAddresses() { + return + (glCombinerParameterfNV = GLContext.getFunctionAddress("glCombinerParameterfNV")) != 0 & + (glCombinerParameterfvNV = GLContext.getFunctionAddress("glCombinerParameterfvNV")) != 0 & + (glCombinerParameteriNV = GLContext.getFunctionAddress("glCombinerParameteriNV")) != 0 & + (glCombinerParameterivNV = GLContext.getFunctionAddress("glCombinerParameterivNV")) != 0 & + (glCombinerInputNV = GLContext.getFunctionAddress("glCombinerInputNV")) != 0 & + (glCombinerOutputNV = GLContext.getFunctionAddress("glCombinerOutputNV")) != 0 & + (glFinalCombinerInputNV = GLContext.getFunctionAddress("glFinalCombinerInputNV")) != 0 & + (glGetCombinerInputParameterfvNV = GLContext.getFunctionAddress("glGetCombinerInputParameterfvNV")) != 0 & + (glGetCombinerInputParameterivNV = GLContext.getFunctionAddress("glGetCombinerInputParameterivNV")) != 0 & + (glGetCombinerOutputParameterfvNV = GLContext.getFunctionAddress("glGetCombinerOutputParameterfvNV")) != 0 & + (glGetCombinerOutputParameterivNV = GLContext.getFunctionAddress("glGetCombinerOutputParameterivNV")) != 0 & + (glGetFinalCombinerInputParameterfvNV = GLContext.getFunctionAddress("glGetFinalCombinerInputParameterfvNV")) != 0 & + (glGetFinalCombinerInputParameterivNV = GLContext.getFunctionAddress("glGetFinalCombinerInputParameterivNV")) != 0; + } + + private boolean NV_register_combiners2_initNativeFunctionAddresses() { + return + (glCombinerStageParameterfvNV = GLContext.getFunctionAddress("glCombinerStageParameterfvNV")) != 0 & + (glGetCombinerStageParameterfvNV = GLContext.getFunctionAddress("glGetCombinerStageParameterfvNV")) != 0; + } + + private boolean NV_shader_buffer_load_initNativeFunctionAddresses() { + return + (glMakeBufferResidentNV = GLContext.getFunctionAddress("glMakeBufferResidentNV")) != 0 & + (glMakeBufferNonResidentNV = GLContext.getFunctionAddress("glMakeBufferNonResidentNV")) != 0 & + (glIsBufferResidentNV = GLContext.getFunctionAddress("glIsBufferResidentNV")) != 0 & + (glMakeNamedBufferResidentNV = GLContext.getFunctionAddress("glMakeNamedBufferResidentNV")) != 0 & + (glMakeNamedBufferNonResidentNV = GLContext.getFunctionAddress("glMakeNamedBufferNonResidentNV")) != 0 & + (glIsNamedBufferResidentNV = GLContext.getFunctionAddress("glIsNamedBufferResidentNV")) != 0 & + (glGetBufferParameterui64vNV = GLContext.getFunctionAddress("glGetBufferParameterui64vNV")) != 0 & + (glGetNamedBufferParameterui64vNV = GLContext.getFunctionAddress("glGetNamedBufferParameterui64vNV")) != 0 & + (glGetIntegerui64vNV = GLContext.getFunctionAddress("glGetIntegerui64vNV")) != 0 & + (glUniformui64NV = GLContext.getFunctionAddress("glUniformui64NV")) != 0 & + (glUniformui64vNV = GLContext.getFunctionAddress("glUniformui64vNV")) != 0 & + (glGetUniformui64vNV = GLContext.getFunctionAddress("glGetUniformui64vNV")) != 0 & + (glProgramUniformui64NV = GLContext.getFunctionAddress("glProgramUniformui64NV")) != 0 & + (glProgramUniformui64vNV = GLContext.getFunctionAddress("glProgramUniformui64vNV")) != 0; + } + + private boolean NV_texture_barrier_initNativeFunctionAddresses() { + return + (glTextureBarrierNV = GLContext.getFunctionAddress("glTextureBarrierNV")) != 0; + } + + private boolean NV_texture_multisample_initNativeFunctionAddresses() { + return + (glTexImage2DMultisampleCoverageNV = GLContext.getFunctionAddress("glTexImage2DMultisampleCoverageNV")) != 0 & + (glTexImage3DMultisampleCoverageNV = GLContext.getFunctionAddress("glTexImage3DMultisampleCoverageNV")) != 0 & + (glTextureImage2DMultisampleNV = GLContext.getFunctionAddress("glTextureImage2DMultisampleNV")) != 0 & + (glTextureImage3DMultisampleNV = GLContext.getFunctionAddress("glTextureImage3DMultisampleNV")) != 0 & + (glTextureImage2DMultisampleCoverageNV = GLContext.getFunctionAddress("glTextureImage2DMultisampleCoverageNV")) != 0 & + (glTextureImage3DMultisampleCoverageNV = GLContext.getFunctionAddress("glTextureImage3DMultisampleCoverageNV")) != 0; + } + + private boolean NV_transform_feedback_initNativeFunctionAddresses() { + return + (glBindBufferRangeNV = GLContext.getFunctionAddress("glBindBufferRangeNV")) != 0 & + (glBindBufferOffsetNV = GLContext.getFunctionAddress("glBindBufferOffsetNV")) != 0 & + (glBindBufferBaseNV = GLContext.getFunctionAddress("glBindBufferBaseNV")) != 0 & + (glTransformFeedbackAttribsNV = GLContext.getFunctionAddress("glTransformFeedbackAttribsNV")) != 0 & + (glTransformFeedbackVaryingsNV = GLContext.getFunctionAddress("glTransformFeedbackVaryingsNV")) != 0 & + (glBeginTransformFeedbackNV = GLContext.getFunctionAddress("glBeginTransformFeedbackNV")) != 0 & + (glEndTransformFeedbackNV = GLContext.getFunctionAddress("glEndTransformFeedbackNV")) != 0 & + (glGetVaryingLocationNV = GLContext.getFunctionAddress("glGetVaryingLocationNV")) != 0 & + (glGetActiveVaryingNV = GLContext.getFunctionAddress("glGetActiveVaryingNV")) != 0 & + (glActiveVaryingNV = GLContext.getFunctionAddress("glActiveVaryingNV")) != 0 & + (glGetTransformFeedbackVaryingNV = GLContext.getFunctionAddress("glGetTransformFeedbackVaryingNV")) != 0; + } + + private boolean NV_transform_feedback2_initNativeFunctionAddresses() { + return + (glBindTransformFeedbackNV = GLContext.getFunctionAddress("glBindTransformFeedbackNV")) != 0 & + (glDeleteTransformFeedbacksNV = GLContext.getFunctionAddress("glDeleteTransformFeedbacksNV")) != 0 & + (glGenTransformFeedbacksNV = GLContext.getFunctionAddress("glGenTransformFeedbacksNV")) != 0 & + (glIsTransformFeedbackNV = GLContext.getFunctionAddress("glIsTransformFeedbackNV")) != 0 & + (glPauseTransformFeedbackNV = GLContext.getFunctionAddress("glPauseTransformFeedbackNV")) != 0 & + (glResumeTransformFeedbackNV = GLContext.getFunctionAddress("glResumeTransformFeedbackNV")) != 0 & + (glDrawTransformFeedbackNV = GLContext.getFunctionAddress("glDrawTransformFeedbackNV")) != 0; + } + + private boolean NV_vertex_array_range_initNativeFunctionAddresses() { + return + (glVertexArrayRangeNV = GLContext.getFunctionAddress("glVertexArrayRangeNV")) != 0 & + (glFlushVertexArrayRangeNV = GLContext.getFunctionAddress("glFlushVertexArrayRangeNV")) != 0 & + (glAllocateMemoryNV = GLContext.getPlatformSpecificFunctionAddress("gl", new String[]{"Windows", "Linux"}, new String[]{"wgl", "glX"}, "glAllocateMemoryNV")) != 0 & + (glFreeMemoryNV = GLContext.getPlatformSpecificFunctionAddress("gl", new String[]{"Windows", "Linux"}, new String[]{"wgl", "glX"}, "glFreeMemoryNV")) != 0; + } + + private boolean NV_vertex_attrib_integer_64bit_initNativeFunctionAddresses(Set<String> supported_extensions) { + return + (glVertexAttribL1i64NV = GLContext.getFunctionAddress("glVertexAttribL1i64NV")) != 0 & + (glVertexAttribL2i64NV = GLContext.getFunctionAddress("glVertexAttribL2i64NV")) != 0 & + (glVertexAttribL3i64NV = GLContext.getFunctionAddress("glVertexAttribL3i64NV")) != 0 & + (glVertexAttribL4i64NV = GLContext.getFunctionAddress("glVertexAttribL4i64NV")) != 0 & + (glVertexAttribL1i64vNV = GLContext.getFunctionAddress("glVertexAttribL1i64vNV")) != 0 & + (glVertexAttribL2i64vNV = GLContext.getFunctionAddress("glVertexAttribL2i64vNV")) != 0 & + (glVertexAttribL3i64vNV = GLContext.getFunctionAddress("glVertexAttribL3i64vNV")) != 0 & + (glVertexAttribL4i64vNV = GLContext.getFunctionAddress("glVertexAttribL4i64vNV")) != 0 & + (glVertexAttribL1ui64NV = GLContext.getFunctionAddress("glVertexAttribL1ui64NV")) != 0 & + (glVertexAttribL2ui64NV = GLContext.getFunctionAddress("glVertexAttribL2ui64NV")) != 0 & + (glVertexAttribL3ui64NV = GLContext.getFunctionAddress("glVertexAttribL3ui64NV")) != 0 & + (glVertexAttribL4ui64NV = GLContext.getFunctionAddress("glVertexAttribL4ui64NV")) != 0 & + (glVertexAttribL1ui64vNV = GLContext.getFunctionAddress("glVertexAttribL1ui64vNV")) != 0 & + (glVertexAttribL2ui64vNV = GLContext.getFunctionAddress("glVertexAttribL2ui64vNV")) != 0 & + (glVertexAttribL3ui64vNV = GLContext.getFunctionAddress("glVertexAttribL3ui64vNV")) != 0 & + (glVertexAttribL4ui64vNV = GLContext.getFunctionAddress("glVertexAttribL4ui64vNV")) != 0 & + (glGetVertexAttribLi64vNV = GLContext.getFunctionAddress("glGetVertexAttribLi64vNV")) != 0 & + (glGetVertexAttribLui64vNV = GLContext.getFunctionAddress("glGetVertexAttribLui64vNV")) != 0 & + (!supported_extensions.contains("GL_NV_vertex_buffer_unified_memory") || (glVertexAttribLFormatNV = GLContext.getFunctionAddress("glVertexAttribLFormatNV")) != 0); + } + + private boolean NV_vertex_buffer_unified_memory_initNativeFunctionAddresses() { + return + (glBufferAddressRangeNV = GLContext.getFunctionAddress("glBufferAddressRangeNV")) != 0 & + (glVertexFormatNV = GLContext.getFunctionAddress("glVertexFormatNV")) != 0 & + (glNormalFormatNV = GLContext.getFunctionAddress("glNormalFormatNV")) != 0 & + (glColorFormatNV = GLContext.getFunctionAddress("glColorFormatNV")) != 0 & + (glIndexFormatNV = GLContext.getFunctionAddress("glIndexFormatNV")) != 0 & + (glTexCoordFormatNV = GLContext.getFunctionAddress("glTexCoordFormatNV")) != 0 & + (glEdgeFlagFormatNV = GLContext.getFunctionAddress("glEdgeFlagFormatNV")) != 0 & + (glSecondaryColorFormatNV = GLContext.getFunctionAddress("glSecondaryColorFormatNV")) != 0 & + (glFogCoordFormatNV = GLContext.getFunctionAddress("glFogCoordFormatNV")) != 0 & + (glVertexAttribFormatNV = GLContext.getFunctionAddress("glVertexAttribFormatNV")) != 0 & + (glVertexAttribIFormatNV = GLContext.getFunctionAddress("glVertexAttribIFormatNV")) != 0 & + (glGetIntegerui64i_vNV = GLContext.getFunctionAddress("glGetIntegerui64i_vNV")) != 0; + } + + private boolean NV_vertex_program_initNativeFunctionAddresses() { + return + (glExecuteProgramNV = GLContext.getFunctionAddress("glExecuteProgramNV")) != 0 & + (glGetProgramParameterfvNV = GLContext.getFunctionAddress("glGetProgramParameterfvNV")) != 0 & + (glGetProgramParameterdvNV = GLContext.getFunctionAddress("glGetProgramParameterdvNV")) != 0 & + (glGetTrackMatrixivNV = GLContext.getFunctionAddress("glGetTrackMatrixivNV")) != 0 & + (glGetVertexAttribfvNV = GLContext.getFunctionAddress("glGetVertexAttribfvNV")) != 0 & + (glGetVertexAttribdvNV = GLContext.getFunctionAddress("glGetVertexAttribdvNV")) != 0 & + (glGetVertexAttribivNV = GLContext.getFunctionAddress("glGetVertexAttribivNV")) != 0 & + (glGetVertexAttribPointervNV = GLContext.getFunctionAddress("glGetVertexAttribPointervNV")) != 0 & + (glProgramParameter4fNV = GLContext.getFunctionAddress("glProgramParameter4fNV")) != 0 & + (glProgramParameter4dNV = GLContext.getFunctionAddress("glProgramParameter4dNV")) != 0 & + (glProgramParameters4fvNV = GLContext.getFunctionAddress("glProgramParameters4fvNV")) != 0 & + (glProgramParameters4dvNV = GLContext.getFunctionAddress("glProgramParameters4dvNV")) != 0 & + (glTrackMatrixNV = GLContext.getFunctionAddress("glTrackMatrixNV")) != 0 & + (glVertexAttribPointerNV = GLContext.getFunctionAddress("glVertexAttribPointerNV")) != 0 & + (glVertexAttrib1sNV = GLContext.getFunctionAddress("glVertexAttrib1sNV")) != 0 & + (glVertexAttrib1fNV = GLContext.getFunctionAddress("glVertexAttrib1fNV")) != 0 & + (glVertexAttrib1dNV = GLContext.getFunctionAddress("glVertexAttrib1dNV")) != 0 & + (glVertexAttrib2sNV = GLContext.getFunctionAddress("glVertexAttrib2sNV")) != 0 & + (glVertexAttrib2fNV = GLContext.getFunctionAddress("glVertexAttrib2fNV")) != 0 & + (glVertexAttrib2dNV = GLContext.getFunctionAddress("glVertexAttrib2dNV")) != 0 & + (glVertexAttrib3sNV = GLContext.getFunctionAddress("glVertexAttrib3sNV")) != 0 & + (glVertexAttrib3fNV = GLContext.getFunctionAddress("glVertexAttrib3fNV")) != 0 & + (glVertexAttrib3dNV = GLContext.getFunctionAddress("glVertexAttrib3dNV")) != 0 & + (glVertexAttrib4sNV = GLContext.getFunctionAddress("glVertexAttrib4sNV")) != 0 & + (glVertexAttrib4fNV = GLContext.getFunctionAddress("glVertexAttrib4fNV")) != 0 & + (glVertexAttrib4dNV = GLContext.getFunctionAddress("glVertexAttrib4dNV")) != 0 & + (glVertexAttrib4ubNV = GLContext.getFunctionAddress("glVertexAttrib4ubNV")) != 0 & + (glVertexAttribs1svNV = GLContext.getFunctionAddress("glVertexAttribs1svNV")) != 0 & + (glVertexAttribs1fvNV = GLContext.getFunctionAddress("glVertexAttribs1fvNV")) != 0 & + (glVertexAttribs1dvNV = GLContext.getFunctionAddress("glVertexAttribs1dvNV")) != 0 & + (glVertexAttribs2svNV = GLContext.getFunctionAddress("glVertexAttribs2svNV")) != 0 & + (glVertexAttribs2fvNV = GLContext.getFunctionAddress("glVertexAttribs2fvNV")) != 0 & + (glVertexAttribs2dvNV = GLContext.getFunctionAddress("glVertexAttribs2dvNV")) != 0 & + (glVertexAttribs3svNV = GLContext.getFunctionAddress("glVertexAttribs3svNV")) != 0 & + (glVertexAttribs3fvNV = GLContext.getFunctionAddress("glVertexAttribs3fvNV")) != 0 & + (glVertexAttribs3dvNV = GLContext.getFunctionAddress("glVertexAttribs3dvNV")) != 0 & + (glVertexAttribs4svNV = GLContext.getFunctionAddress("glVertexAttribs4svNV")) != 0 & + (glVertexAttribs4fvNV = GLContext.getFunctionAddress("glVertexAttribs4fvNV")) != 0 & + (glVertexAttribs4dvNV = GLContext.getFunctionAddress("glVertexAttribs4dvNV")) != 0; + } + + private boolean NV_video_capture_initNativeFunctionAddresses() { + return + (glBeginVideoCaptureNV = GLContext.getFunctionAddress("glBeginVideoCaptureNV")) != 0 & + (glBindVideoCaptureStreamBufferNV = GLContext.getFunctionAddress("glBindVideoCaptureStreamBufferNV")) != 0 & + (glBindVideoCaptureStreamTextureNV = GLContext.getFunctionAddress("glBindVideoCaptureStreamTextureNV")) != 0 & + (glEndVideoCaptureNV = GLContext.getFunctionAddress("glEndVideoCaptureNV")) != 0 & + (glGetVideoCaptureivNV = GLContext.getFunctionAddress("glGetVideoCaptureivNV")) != 0 & + (glGetVideoCaptureStreamivNV = GLContext.getFunctionAddress("glGetVideoCaptureStreamivNV")) != 0 & + (glGetVideoCaptureStreamfvNV = GLContext.getFunctionAddress("glGetVideoCaptureStreamfvNV")) != 0 & + (glGetVideoCaptureStreamdvNV = GLContext.getFunctionAddress("glGetVideoCaptureStreamdvNV")) != 0 & + (glVideoCaptureNV = GLContext.getFunctionAddress("glVideoCaptureNV")) != 0 & + (glVideoCaptureStreamParameterivNV = GLContext.getFunctionAddress("glVideoCaptureStreamParameterivNV")) != 0 & + (glVideoCaptureStreamParameterfvNV = GLContext.getFunctionAddress("glVideoCaptureStreamParameterfvNV")) != 0 & + (glVideoCaptureStreamParameterdvNV = GLContext.getFunctionAddress("glVideoCaptureStreamParameterdvNV")) != 0; + } + + + private static void remove(Set supported_extensions, String extension) { + LWJGLUtil.log(extension + " was reported as available but an entry point is missing"); + supported_extensions.remove(extension); + } + + private Set<String> initAllStubs(boolean forwardCompatible) throws LWJGLException { + glGetError = GLContext.getFunctionAddress("glGetError"); + glGetString = GLContext.getFunctionAddress("glGetString"); + glGetIntegerv = GLContext.getFunctionAddress("glGetIntegerv"); + glGetStringi = GLContext.getFunctionAddress("glGetStringi"); + GLContext.setCapabilities(this); + Set<String> supported_extensions = new HashSet<String>(256); + int profileMask = GLContext.getSupportedExtensions(supported_extensions); + if ( supported_extensions.contains("OpenGL31") && !(supported_extensions.contains("GL_ARB_compatibility") || (profileMask & GL32.GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0) ) + forwardCompatible = true; + if (!GL11_initNativeFunctionAddresses(forwardCompatible)) + throw new LWJGLException("GL11 not supported"); + if (supported_extensions.contains("GL_ARB_fragment_program")) + supported_extensions.add("GL_ARB_program"); + if (supported_extensions.contains("GL_ARB_pixel_buffer_object")) + supported_extensions.add("GL_ARB_buffer_object"); + if (supported_extensions.contains("GL_ARB_vertex_buffer_object")) + supported_extensions.add("GL_ARB_buffer_object"); + if (supported_extensions.contains("GL_ARB_vertex_program")) + supported_extensions.add("GL_ARB_program"); + if (supported_extensions.contains("GL_EXT_pixel_buffer_object")) + supported_extensions.add("GL_ARB_buffer_object"); + if (supported_extensions.contains("GL_NV_fragment_program")) + supported_extensions.add("GL_NV_program"); + if (supported_extensions.contains("GL_NV_vertex_program")) + supported_extensions.add("GL_NV_program"); + if ((supported_extensions.contains("GL_AMD_debug_output") || supported_extensions.contains("GL_AMDX_debug_output")) && !AMD_debug_output_initNativeFunctionAddresses()) { + remove(supported_extensions, "GL_AMDX_debug_output"); + remove(supported_extensions, "GL_AMD_debug_output"); + } + if (supported_extensions.contains("GL_AMD_draw_buffers_blend") && !AMD_draw_buffers_blend_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_draw_buffers_blend"); + if (supported_extensions.contains("GL_AMD_interleaved_elements") && !AMD_interleaved_elements_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_interleaved_elements"); + if (supported_extensions.contains("GL_AMD_multi_draw_indirect") && !AMD_multi_draw_indirect_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_multi_draw_indirect"); + if (supported_extensions.contains("GL_AMD_name_gen_delete") && !AMD_name_gen_delete_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_name_gen_delete"); + if (supported_extensions.contains("GL_AMD_performance_monitor") && !AMD_performance_monitor_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_performance_monitor"); + if (supported_extensions.contains("GL_AMD_sample_positions") && !AMD_sample_positions_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_sample_positions"); + if (supported_extensions.contains("GL_AMD_sparse_texture") && !AMD_sparse_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_sparse_texture"); + if (supported_extensions.contains("GL_AMD_stencil_operation_extended") && !AMD_stencil_operation_extended_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_stencil_operation_extended"); + if (supported_extensions.contains("GL_AMD_vertex_shader_tessellator") && !AMD_vertex_shader_tessellator_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_AMD_vertex_shader_tessellator"); + if (supported_extensions.contains("GL_APPLE_element_array") && !APPLE_element_array_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_element_array"); + if (supported_extensions.contains("GL_APPLE_fence") && !APPLE_fence_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_fence"); + if (supported_extensions.contains("GL_APPLE_flush_buffer_range") && !APPLE_flush_buffer_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_flush_buffer_range"); + if (supported_extensions.contains("GL_APPLE_object_purgeable") && !APPLE_object_purgeable_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_object_purgeable"); + if (supported_extensions.contains("GL_APPLE_texture_range") && !APPLE_texture_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_texture_range"); + if (supported_extensions.contains("GL_APPLE_vertex_array_object") && !APPLE_vertex_array_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_vertex_array_object"); + if (supported_extensions.contains("GL_APPLE_vertex_array_range") && !APPLE_vertex_array_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_vertex_array_range"); + if (supported_extensions.contains("GL_APPLE_vertex_program_evaluators") && !APPLE_vertex_program_evaluators_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_APPLE_vertex_program_evaluators"); + if (supported_extensions.contains("GL_ARB_ES2_compatibility") && !ARB_ES2_compatibility_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_ES2_compatibility"); + if (supported_extensions.contains("GL_ARB_base_instance") && !ARB_base_instance_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_base_instance"); + if (supported_extensions.contains("GL_ARB_bindless_texture") && !ARB_bindless_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_bindless_texture"); + if (supported_extensions.contains("GL_ARB_blend_func_extended") && !ARB_blend_func_extended_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_blend_func_extended"); + if (supported_extensions.contains("GL_ARB_buffer_object") && !ARB_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_buffer_object"); + if (supported_extensions.contains("GL_ARB_buffer_storage") && !ARB_buffer_storage_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_buffer_storage"); + if (supported_extensions.contains("GL_ARB_cl_event") && !ARB_cl_event_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_cl_event"); + if (supported_extensions.contains("GL_ARB_clear_buffer_object") && !ARB_clear_buffer_object_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_clear_buffer_object"); + if (supported_extensions.contains("GL_ARB_clear_texture") && !ARB_clear_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_clear_texture"); + if (supported_extensions.contains("GL_ARB_color_buffer_float") && !ARB_color_buffer_float_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_color_buffer_float"); + if (supported_extensions.contains("GL_ARB_compute_shader") && !ARB_compute_shader_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_compute_shader"); + if (supported_extensions.contains("GL_ARB_compute_variable_group_size") && !ARB_compute_variable_group_size_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_compute_variable_group_size"); + if (supported_extensions.contains("GL_ARB_copy_buffer") && !ARB_copy_buffer_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_copy_buffer"); + if (supported_extensions.contains("GL_ARB_copy_image") && !ARB_copy_image_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_copy_image"); + if (supported_extensions.contains("GL_ARB_debug_output") && !ARB_debug_output_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_debug_output"); + if (supported_extensions.contains("GL_ARB_draw_buffers") && !ARB_draw_buffers_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_draw_buffers"); + if (supported_extensions.contains("GL_ARB_draw_buffers_blend") && !ARB_draw_buffers_blend_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_draw_buffers_blend"); + if (supported_extensions.contains("GL_ARB_draw_elements_base_vertex") && !ARB_draw_elements_base_vertex_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_draw_elements_base_vertex"); + if (supported_extensions.contains("GL_ARB_draw_indirect") && !ARB_draw_indirect_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_draw_indirect"); + if (supported_extensions.contains("GL_ARB_draw_instanced") && !ARB_draw_instanced_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_draw_instanced"); + if (supported_extensions.contains("GL_ARB_framebuffer_no_attachments") && !ARB_framebuffer_no_attachments_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_framebuffer_no_attachments"); + if (supported_extensions.contains("GL_ARB_framebuffer_object") && !ARB_framebuffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_framebuffer_object"); + if (supported_extensions.contains("GL_ARB_geometry_shader4") && !ARB_geometry_shader4_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_geometry_shader4"); + if (supported_extensions.contains("GL_ARB_get_program_binary") && !ARB_get_program_binary_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_get_program_binary"); + if (supported_extensions.contains("GL_ARB_gpu_shader_fp64") && !ARB_gpu_shader_fp64_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_gpu_shader_fp64"); + if (supported_extensions.contains("GL_ARB_imaging") && !ARB_imaging_initNativeFunctionAddresses(forwardCompatible)) + remove(supported_extensions, "GL_ARB_imaging"); + if (supported_extensions.contains("GL_ARB_indirect_parameters") && !ARB_indirect_parameters_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_indirect_parameters"); + if (supported_extensions.contains("GL_ARB_instanced_arrays") && !ARB_instanced_arrays_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_instanced_arrays"); + if (supported_extensions.contains("GL_ARB_internalformat_query") && !ARB_internalformat_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_internalformat_query"); + if (supported_extensions.contains("GL_ARB_internalformat_query2") && !ARB_internalformat_query2_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_internalformat_query2"); + if (supported_extensions.contains("GL_ARB_invalidate_subdata") && !ARB_invalidate_subdata_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_invalidate_subdata"); + if (supported_extensions.contains("GL_ARB_map_buffer_range") && !ARB_map_buffer_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_map_buffer_range"); + if (supported_extensions.contains("GL_ARB_matrix_palette") && !ARB_matrix_palette_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_matrix_palette"); + if (supported_extensions.contains("GL_ARB_multi_bind") && !ARB_multi_bind_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_multi_bind"); + if (supported_extensions.contains("GL_ARB_multi_draw_indirect") && !ARB_multi_draw_indirect_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_multi_draw_indirect"); + if (supported_extensions.contains("GL_ARB_multisample") && !ARB_multisample_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_multisample"); + if (supported_extensions.contains("GL_ARB_multitexture") && !ARB_multitexture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_multitexture"); + if (supported_extensions.contains("GL_ARB_occlusion_query") && !ARB_occlusion_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_occlusion_query"); + if (supported_extensions.contains("GL_ARB_point_parameters") && !ARB_point_parameters_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_point_parameters"); + if (supported_extensions.contains("GL_ARB_program") && !ARB_program_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_program"); + if (supported_extensions.contains("GL_ARB_program_interface_query") && !ARB_program_interface_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_program_interface_query"); + if (supported_extensions.contains("GL_ARB_provoking_vertex") && !ARB_provoking_vertex_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_provoking_vertex"); + if (supported_extensions.contains("GL_ARB_robustness") && !ARB_robustness_initNativeFunctionAddresses(forwardCompatible,supported_extensions)) + remove(supported_extensions, "GL_ARB_robustness"); + if (supported_extensions.contains("GL_ARB_sample_shading") && !ARB_sample_shading_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_sample_shading"); + if (supported_extensions.contains("GL_ARB_sampler_objects") && !ARB_sampler_objects_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_sampler_objects"); + if (supported_extensions.contains("GL_ARB_separate_shader_objects") && !ARB_separate_shader_objects_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_separate_shader_objects"); + if (supported_extensions.contains("GL_ARB_shader_atomic_counters") && !ARB_shader_atomic_counters_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shader_atomic_counters"); + if (supported_extensions.contains("GL_ARB_shader_image_load_store") && !ARB_shader_image_load_store_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shader_image_load_store"); + if (supported_extensions.contains("GL_ARB_shader_objects") && !ARB_shader_objects_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shader_objects"); + if (supported_extensions.contains("GL_ARB_shader_storage_buffer_object") && !ARB_shader_storage_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shader_storage_buffer_object"); + if (supported_extensions.contains("GL_ARB_shader_subroutine") && !ARB_shader_subroutine_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shader_subroutine"); + if (supported_extensions.contains("GL_ARB_shading_language_include") && !ARB_shading_language_include_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_shading_language_include"); + if (supported_extensions.contains("GL_ARB_sparse_texture") && !ARB_sparse_texture_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_sparse_texture"); + if (supported_extensions.contains("GL_ARB_sync") && !ARB_sync_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_sync"); + if (supported_extensions.contains("GL_ARB_tessellation_shader") && !ARB_tessellation_shader_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_tessellation_shader"); + if (supported_extensions.contains("GL_ARB_texture_buffer_object") && !ARB_texture_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_texture_buffer_object"); + if (supported_extensions.contains("GL_ARB_texture_buffer_range") && !ARB_texture_buffer_range_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_texture_buffer_range"); + if (supported_extensions.contains("GL_ARB_texture_compression") && !ARB_texture_compression_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_texture_compression"); + if (supported_extensions.contains("GL_ARB_texture_multisample") && !ARB_texture_multisample_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_texture_multisample"); + if ((supported_extensions.contains("GL_ARB_texture_storage") || supported_extensions.contains("GL_EXT_texture_storage")) && !ARB_texture_storage_initNativeFunctionAddresses(supported_extensions)) { + remove(supported_extensions, "GL_EXT_texture_storage"); + remove(supported_extensions, "GL_ARB_texture_storage"); + } + if (supported_extensions.contains("GL_ARB_texture_storage_multisample") && !ARB_texture_storage_multisample_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_texture_storage_multisample"); + if (supported_extensions.contains("GL_ARB_texture_view") && !ARB_texture_view_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_texture_view"); + if (supported_extensions.contains("GL_ARB_timer_query") && !ARB_timer_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_timer_query"); + if (supported_extensions.contains("GL_ARB_transform_feedback2") && !ARB_transform_feedback2_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_transform_feedback2"); + if (supported_extensions.contains("GL_ARB_transform_feedback3") && !ARB_transform_feedback3_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_transform_feedback3"); + if (supported_extensions.contains("GL_ARB_transform_feedback_instanced") && !ARB_transform_feedback_instanced_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_transform_feedback_instanced"); + if (supported_extensions.contains("GL_ARB_transpose_matrix") && !ARB_transpose_matrix_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_transpose_matrix"); + if (supported_extensions.contains("GL_ARB_uniform_buffer_object") && !ARB_uniform_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_uniform_buffer_object"); + if (supported_extensions.contains("GL_ARB_vertex_array_object") && !ARB_vertex_array_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_array_object"); + if (supported_extensions.contains("GL_ARB_vertex_attrib_64bit") && !ARB_vertex_attrib_64bit_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_ARB_vertex_attrib_64bit"); + if (supported_extensions.contains("GL_ARB_vertex_attrib_binding") && !ARB_vertex_attrib_binding_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_attrib_binding"); + if (supported_extensions.contains("GL_ARB_vertex_blend") && !ARB_vertex_blend_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_blend"); + if (supported_extensions.contains("GL_ARB_vertex_program") && !ARB_vertex_program_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_program"); + if (supported_extensions.contains("GL_ARB_vertex_shader") && !ARB_vertex_shader_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_shader"); + if (supported_extensions.contains("GL_ARB_vertex_type_2_10_10_10_rev") && !ARB_vertex_type_2_10_10_10_rev_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_vertex_type_2_10_10_10_rev"); + if (supported_extensions.contains("GL_ARB_viewport_array") && !ARB_viewport_array_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ARB_viewport_array"); + if (supported_extensions.contains("GL_ARB_window_pos") && !ARB_window_pos_initNativeFunctionAddresses(forwardCompatible)) + remove(supported_extensions, "GL_ARB_window_pos"); + if (supported_extensions.contains("GL_ATI_draw_buffers") && !ATI_draw_buffers_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_draw_buffers"); + if (supported_extensions.contains("GL_ATI_element_array") && !ATI_element_array_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_element_array"); + if (supported_extensions.contains("GL_ATI_envmap_bumpmap") && !ATI_envmap_bumpmap_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_envmap_bumpmap"); + if (supported_extensions.contains("GL_ATI_fragment_shader") && !ATI_fragment_shader_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_fragment_shader"); + if (supported_extensions.contains("GL_ATI_map_object_buffer") && !ATI_map_object_buffer_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_map_object_buffer"); + if (supported_extensions.contains("GL_ATI_pn_triangles") && !ATI_pn_triangles_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_pn_triangles"); + if (supported_extensions.contains("GL_ATI_separate_stencil") && !ATI_separate_stencil_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_separate_stencil"); + if (supported_extensions.contains("GL_ATI_vertex_array_object") && !ATI_vertex_array_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_vertex_array_object"); + if (supported_extensions.contains("GL_ATI_vertex_attrib_array_object") && !ATI_vertex_attrib_array_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_vertex_attrib_array_object"); + if (supported_extensions.contains("GL_ATI_vertex_streams") && !ATI_vertex_streams_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_ATI_vertex_streams"); + if (supported_extensions.contains("GL_EXT_bindable_uniform") && !EXT_bindable_uniform_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_bindable_uniform"); + if (supported_extensions.contains("GL_EXT_blend_color") && !EXT_blend_color_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_blend_color"); + if (supported_extensions.contains("GL_EXT_blend_equation_separate") && !EXT_blend_equation_separate_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_blend_equation_separate"); + if (supported_extensions.contains("GL_EXT_blend_func_separate") && !EXT_blend_func_separate_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_blend_func_separate"); + if (supported_extensions.contains("GL_EXT_blend_minmax") && !EXT_blend_minmax_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_blend_minmax"); + if (supported_extensions.contains("GL_EXT_compiled_vertex_array") && !EXT_compiled_vertex_array_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_compiled_vertex_array"); + if (supported_extensions.contains("GL_EXT_depth_bounds_test") && !EXT_depth_bounds_test_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_depth_bounds_test"); + supported_extensions.add("GL_EXT_direct_state_access"); + if (supported_extensions.contains("GL_EXT_direct_state_access") && !EXT_direct_state_access_initNativeFunctionAddresses(forwardCompatible,supported_extensions)) + remove(supported_extensions, "GL_EXT_direct_state_access"); + if (supported_extensions.contains("GL_EXT_draw_buffers2") && !EXT_draw_buffers2_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_draw_buffers2"); + if (supported_extensions.contains("GL_EXT_draw_instanced") && !EXT_draw_instanced_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_draw_instanced"); + if (supported_extensions.contains("GL_EXT_draw_range_elements") && !EXT_draw_range_elements_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_draw_range_elements"); + if (supported_extensions.contains("GL_EXT_fog_coord") && !EXT_fog_coord_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_fog_coord"); + if (supported_extensions.contains("GL_EXT_framebuffer_blit") && !EXT_framebuffer_blit_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_framebuffer_blit"); + if (supported_extensions.contains("GL_EXT_framebuffer_multisample") && !EXT_framebuffer_multisample_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_framebuffer_multisample"); + if (supported_extensions.contains("GL_EXT_framebuffer_object") && !EXT_framebuffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_framebuffer_object"); + if (supported_extensions.contains("GL_EXT_geometry_shader4") && !EXT_geometry_shader4_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_geometry_shader4"); + if (supported_extensions.contains("GL_EXT_gpu_program_parameters") && !EXT_gpu_program_parameters_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_gpu_program_parameters"); + if (supported_extensions.contains("GL_EXT_gpu_shader4") && !EXT_gpu_shader4_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_gpu_shader4"); + if (supported_extensions.contains("GL_EXT_multi_draw_arrays") && !EXT_multi_draw_arrays_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_multi_draw_arrays"); + if (supported_extensions.contains("GL_EXT_paletted_texture") && !EXT_paletted_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_paletted_texture"); + if (supported_extensions.contains("GL_EXT_point_parameters") && !EXT_point_parameters_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_point_parameters"); + if (supported_extensions.contains("GL_EXT_provoking_vertex") && !EXT_provoking_vertex_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_provoking_vertex"); + if (supported_extensions.contains("GL_EXT_secondary_color") && !EXT_secondary_color_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_secondary_color"); + if (supported_extensions.contains("GL_EXT_separate_shader_objects") && !EXT_separate_shader_objects_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_separate_shader_objects"); + if (supported_extensions.contains("GL_EXT_shader_image_load_store") && !EXT_shader_image_load_store_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_shader_image_load_store"); + if (supported_extensions.contains("GL_EXT_stencil_clear_tag") && !EXT_stencil_clear_tag_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_stencil_clear_tag"); + if (supported_extensions.contains("GL_EXT_stencil_two_side") && !EXT_stencil_two_side_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_stencil_two_side"); + if (supported_extensions.contains("GL_EXT_texture_array") && !EXT_texture_array_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_texture_array"); + if (supported_extensions.contains("GL_EXT_texture_buffer_object") && !EXT_texture_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_texture_buffer_object"); + if (supported_extensions.contains("GL_EXT_texture_integer") && !EXT_texture_integer_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_texture_integer"); + if (supported_extensions.contains("GL_EXT_timer_query") && !EXT_timer_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_timer_query"); + if (supported_extensions.contains("GL_EXT_transform_feedback") && !EXT_transform_feedback_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_transform_feedback"); + if (supported_extensions.contains("GL_EXT_vertex_attrib_64bit") && !EXT_vertex_attrib_64bit_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_EXT_vertex_attrib_64bit"); + if (supported_extensions.contains("GL_EXT_vertex_shader") && !EXT_vertex_shader_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_vertex_shader"); + if (supported_extensions.contains("GL_EXT_vertex_weighting") && !EXT_vertex_weighting_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_EXT_vertex_weighting"); + if (supported_extensions.contains("OpenGL12") && !GL12_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL12"); + if (supported_extensions.contains("OpenGL13") && !GL13_initNativeFunctionAddresses(forwardCompatible)) + remove(supported_extensions, "OpenGL13"); + if (supported_extensions.contains("OpenGL14") && !GL14_initNativeFunctionAddresses(forwardCompatible)) + remove(supported_extensions, "OpenGL14"); + if (supported_extensions.contains("OpenGL15") && !GL15_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL15"); + if (supported_extensions.contains("OpenGL20") && !GL20_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL20"); + if (supported_extensions.contains("OpenGL21") && !GL21_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL21"); + if (supported_extensions.contains("OpenGL30") && !GL30_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL30"); + if (supported_extensions.contains("OpenGL31") && !GL31_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL31"); + if (supported_extensions.contains("OpenGL32") && !GL32_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL32"); + if (supported_extensions.contains("OpenGL33") && !GL33_initNativeFunctionAddresses(forwardCompatible)) + remove(supported_extensions, "OpenGL33"); + if (supported_extensions.contains("OpenGL40") && !GL40_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL40"); + if (supported_extensions.contains("OpenGL41") && !GL41_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL41"); + if (supported_extensions.contains("OpenGL42") && !GL42_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL42"); + if (supported_extensions.contains("OpenGL43") && !GL43_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL43"); + if (supported_extensions.contains("OpenGL44") && !GL44_initNativeFunctionAddresses()) + remove(supported_extensions, "OpenGL44"); + if (supported_extensions.contains("GL_GREMEDY_frame_terminator") && !GREMEDY_frame_terminator_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_GREMEDY_frame_terminator"); + if (supported_extensions.contains("GL_GREMEDY_string_marker") && !GREMEDY_string_marker_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_GREMEDY_string_marker"); + if (supported_extensions.contains("GL_INTEL_map_texture") && !INTEL_map_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_INTEL_map_texture"); + if (supported_extensions.contains("GL_KHR_debug") && !KHR_debug_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_KHR_debug"); + if (supported_extensions.contains("GL_NV_bindless_multi_draw_indirect") && !NV_bindless_multi_draw_indirect_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_bindless_multi_draw_indirect"); + if (supported_extensions.contains("GL_NV_bindless_texture") && !NV_bindless_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_bindless_texture"); + if (supported_extensions.contains("GL_NV_blend_equation_advanced") && !NV_blend_equation_advanced_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_blend_equation_advanced"); + if (supported_extensions.contains("GL_NV_conditional_render") && !NV_conditional_render_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_conditional_render"); + if (supported_extensions.contains("GL_NV_copy_image") && !NV_copy_image_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_copy_image"); + if (supported_extensions.contains("GL_NV_depth_buffer_float") && !NV_depth_buffer_float_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_depth_buffer_float"); + if (supported_extensions.contains("GL_NV_draw_texture") && !NV_draw_texture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_draw_texture"); + if (supported_extensions.contains("GL_NV_evaluators") && !NV_evaluators_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_evaluators"); + if (supported_extensions.contains("GL_NV_explicit_multisample") && !NV_explicit_multisample_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_explicit_multisample"); + if (supported_extensions.contains("GL_NV_fence") && !NV_fence_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_fence"); + if (supported_extensions.contains("GL_NV_fragment_program") && !NV_fragment_program_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_fragment_program"); + if (supported_extensions.contains("GL_NV_framebuffer_multisample_coverage") && !NV_framebuffer_multisample_coverage_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_framebuffer_multisample_coverage"); + if (supported_extensions.contains("GL_NV_geometry_program4") && !NV_geometry_program4_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_geometry_program4"); + if (supported_extensions.contains("GL_NV_gpu_program4") && !NV_gpu_program4_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_gpu_program4"); + if (supported_extensions.contains("GL_NV_gpu_shader5") && !NV_gpu_shader5_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_NV_gpu_shader5"); + if (supported_extensions.contains("GL_NV_half_float") && !NV_half_float_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_half_float"); + if (supported_extensions.contains("GL_NV_occlusion_query") && !NV_occlusion_query_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_occlusion_query"); + if (supported_extensions.contains("GL_NV_parameter_buffer_object") && !NV_parameter_buffer_object_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_parameter_buffer_object"); + if (supported_extensions.contains("GL_NV_path_rendering") && !NV_path_rendering_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_path_rendering"); + if (supported_extensions.contains("GL_NV_pixel_data_range") && !NV_pixel_data_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_pixel_data_range"); + if (supported_extensions.contains("GL_NV_point_sprite") && !NV_point_sprite_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_point_sprite"); + if (supported_extensions.contains("GL_NV_present_video") && !NV_present_video_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_present_video"); + supported_extensions.add("GL_NV_primitive_restart"); + if (supported_extensions.contains("GL_NV_primitive_restart") && !NV_primitive_restart_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_primitive_restart"); + if (supported_extensions.contains("GL_NV_program") && !NV_program_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_program"); + if (supported_extensions.contains("GL_NV_register_combiners") && !NV_register_combiners_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_register_combiners"); + if (supported_extensions.contains("GL_NV_register_combiners2") && !NV_register_combiners2_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_register_combiners2"); + if (supported_extensions.contains("GL_NV_shader_buffer_load") && !NV_shader_buffer_load_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_shader_buffer_load"); + if (supported_extensions.contains("GL_NV_texture_barrier") && !NV_texture_barrier_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_texture_barrier"); + if (supported_extensions.contains("GL_NV_texture_multisample") && !NV_texture_multisample_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_texture_multisample"); + if (supported_extensions.contains("GL_NV_transform_feedback") && !NV_transform_feedback_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_transform_feedback"); + if (supported_extensions.contains("GL_NV_transform_feedback2") && !NV_transform_feedback2_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_transform_feedback2"); + if (supported_extensions.contains("GL_NV_vertex_array_range") && !NV_vertex_array_range_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_vertex_array_range"); + if (supported_extensions.contains("GL_NV_vertex_attrib_integer_64bit") && !NV_vertex_attrib_integer_64bit_initNativeFunctionAddresses(supported_extensions)) + remove(supported_extensions, "GL_NV_vertex_attrib_integer_64bit"); + if (supported_extensions.contains("GL_NV_vertex_buffer_unified_memory") && !NV_vertex_buffer_unified_memory_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_vertex_buffer_unified_memory"); + if (supported_extensions.contains("GL_NV_vertex_program") && !NV_vertex_program_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_vertex_program"); + if (supported_extensions.contains("GL_NV_video_capture") && !NV_video_capture_initNativeFunctionAddresses()) + remove(supported_extensions, "GL_NV_video_capture"); + return supported_extensions; + } + + static void unloadAllStubs() { + } + + ContextCapabilities(boolean forwardCompatible) throws LWJGLException { + Set<String> supported_extensions = initAllStubs(forwardCompatible); + this.GL_AMD_blend_minmax_factor = supported_extensions.contains("GL_AMD_blend_minmax_factor"); + this.GL_AMD_conservative_depth = supported_extensions.contains("GL_AMD_conservative_depth"); + this.GL_AMD_debug_output = supported_extensions.contains("GL_AMD_debug_output") + || supported_extensions.contains("GL_AMDX_debug_output"); + this.GL_AMD_depth_clamp_separate = supported_extensions.contains("GL_AMD_depth_clamp_separate"); + this.GL_AMD_draw_buffers_blend = supported_extensions.contains("GL_AMD_draw_buffers_blend"); + this.GL_AMD_interleaved_elements = supported_extensions.contains("GL_AMD_interleaved_elements"); + this.GL_AMD_multi_draw_indirect = supported_extensions.contains("GL_AMD_multi_draw_indirect"); + this.GL_AMD_name_gen_delete = supported_extensions.contains("GL_AMD_name_gen_delete"); + this.GL_AMD_performance_monitor = supported_extensions.contains("GL_AMD_performance_monitor"); + this.GL_AMD_pinned_memory = supported_extensions.contains("GL_AMD_pinned_memory"); + this.GL_AMD_query_buffer_object = supported_extensions.contains("GL_AMD_query_buffer_object"); + this.GL_AMD_sample_positions = supported_extensions.contains("GL_AMD_sample_positions"); + this.GL_AMD_seamless_cubemap_per_texture = supported_extensions.contains("GL_AMD_seamless_cubemap_per_texture"); + this.GL_AMD_shader_atomic_counter_ops = supported_extensions.contains("GL_AMD_shader_atomic_counter_ops"); + this.GL_AMD_shader_stencil_export = supported_extensions.contains("GL_AMD_shader_stencil_export"); + this.GL_AMD_shader_trinary_minmax = supported_extensions.contains("GL_AMD_shader_trinary_minmax"); + this.GL_AMD_sparse_texture = supported_extensions.contains("GL_AMD_sparse_texture"); + this.GL_AMD_stencil_operation_extended = supported_extensions.contains("GL_AMD_stencil_operation_extended"); + this.GL_AMD_texture_texture4 = supported_extensions.contains("GL_AMD_texture_texture4"); + this.GL_AMD_transform_feedback3_lines_triangles = supported_extensions.contains("GL_AMD_transform_feedback3_lines_triangles"); + this.GL_AMD_vertex_shader_layer = supported_extensions.contains("GL_AMD_vertex_shader_layer"); + this.GL_AMD_vertex_shader_tessellator = supported_extensions.contains("GL_AMD_vertex_shader_tessellator"); + this.GL_AMD_vertex_shader_viewport_index = supported_extensions.contains("GL_AMD_vertex_shader_viewport_index"); + this.GL_APPLE_aux_depth_stencil = supported_extensions.contains("GL_APPLE_aux_depth_stencil"); + this.GL_APPLE_client_storage = supported_extensions.contains("GL_APPLE_client_storage"); + this.GL_APPLE_element_array = supported_extensions.contains("GL_APPLE_element_array"); + this.GL_APPLE_fence = supported_extensions.contains("GL_APPLE_fence"); + this.GL_APPLE_float_pixels = supported_extensions.contains("GL_APPLE_float_pixels"); + this.GL_APPLE_flush_buffer_range = supported_extensions.contains("GL_APPLE_flush_buffer_range"); + this.GL_APPLE_object_purgeable = supported_extensions.contains("GL_APPLE_object_purgeable"); + this.GL_APPLE_packed_pixels = supported_extensions.contains("GL_APPLE_packed_pixels"); + this.GL_APPLE_rgb_422 = supported_extensions.contains("GL_APPLE_rgb_422"); + this.GL_APPLE_row_bytes = supported_extensions.contains("GL_APPLE_row_bytes"); + this.GL_APPLE_texture_range = supported_extensions.contains("GL_APPLE_texture_range"); + this.GL_APPLE_vertex_array_object = supported_extensions.contains("GL_APPLE_vertex_array_object"); + this.GL_APPLE_vertex_array_range = supported_extensions.contains("GL_APPLE_vertex_array_range"); + this.GL_APPLE_vertex_program_evaluators = supported_extensions.contains("GL_APPLE_vertex_program_evaluators"); + this.GL_APPLE_ycbcr_422 = supported_extensions.contains("GL_APPLE_ycbcr_422"); + this.GL_ARB_ES2_compatibility = supported_extensions.contains("GL_ARB_ES2_compatibility"); + this.GL_ARB_ES3_compatibility = supported_extensions.contains("GL_ARB_ES3_compatibility"); + this.GL_ARB_arrays_of_arrays = supported_extensions.contains("GL_ARB_arrays_of_arrays"); + this.GL_ARB_base_instance = supported_extensions.contains("GL_ARB_base_instance"); + this.GL_ARB_bindless_texture = supported_extensions.contains("GL_ARB_bindless_texture"); + this.GL_ARB_blend_func_extended = supported_extensions.contains("GL_ARB_blend_func_extended"); + this.GL_ARB_buffer_storage = supported_extensions.contains("GL_ARB_buffer_storage"); + this.GL_ARB_cl_event = supported_extensions.contains("GL_ARB_cl_event"); + this.GL_ARB_clear_buffer_object = supported_extensions.contains("GL_ARB_clear_buffer_object"); + this.GL_ARB_clear_texture = supported_extensions.contains("GL_ARB_clear_texture"); + this.GL_ARB_color_buffer_float = supported_extensions.contains("GL_ARB_color_buffer_float"); + this.GL_ARB_compatibility = supported_extensions.contains("GL_ARB_compatibility"); + this.GL_ARB_compressed_texture_pixel_storage = supported_extensions.contains("GL_ARB_compressed_texture_pixel_storage"); + this.GL_ARB_compute_shader = supported_extensions.contains("GL_ARB_compute_shader"); + this.GL_ARB_compute_variable_group_size = supported_extensions.contains("GL_ARB_compute_variable_group_size"); + this.GL_ARB_conservative_depth = supported_extensions.contains("GL_ARB_conservative_depth"); + this.GL_ARB_copy_buffer = supported_extensions.contains("GL_ARB_copy_buffer"); + this.GL_ARB_copy_image = supported_extensions.contains("GL_ARB_copy_image"); + this.GL_ARB_debug_output = supported_extensions.contains("GL_ARB_debug_output"); + this.GL_ARB_depth_buffer_float = supported_extensions.contains("GL_ARB_depth_buffer_float"); + this.GL_ARB_depth_clamp = supported_extensions.contains("GL_ARB_depth_clamp"); + this.GL_ARB_depth_texture = supported_extensions.contains("GL_ARB_depth_texture"); + this.GL_ARB_draw_buffers = supported_extensions.contains("GL_ARB_draw_buffers"); + this.GL_ARB_draw_buffers_blend = supported_extensions.contains("GL_ARB_draw_buffers_blend"); + this.GL_ARB_draw_elements_base_vertex = supported_extensions.contains("GL_ARB_draw_elements_base_vertex"); + this.GL_ARB_draw_indirect = supported_extensions.contains("GL_ARB_draw_indirect"); + this.GL_ARB_draw_instanced = supported_extensions.contains("GL_ARB_draw_instanced"); + this.GL_ARB_enhanced_layouts = supported_extensions.contains("GL_ARB_enhanced_layouts"); + this.GL_ARB_explicit_attrib_location = supported_extensions.contains("GL_ARB_explicit_attrib_location"); + this.GL_ARB_explicit_uniform_location = supported_extensions.contains("GL_ARB_explicit_uniform_location"); + this.GL_ARB_fragment_coord_conventions = supported_extensions.contains("GL_ARB_fragment_coord_conventions"); + this.GL_ARB_fragment_layer_viewport = supported_extensions.contains("GL_ARB_fragment_layer_viewport"); + this.GL_ARB_fragment_program = supported_extensions.contains("GL_ARB_fragment_program") + && supported_extensions.contains("GL_ARB_program"); + this.GL_ARB_fragment_program_shadow = supported_extensions.contains("GL_ARB_fragment_program_shadow"); + this.GL_ARB_fragment_shader = supported_extensions.contains("GL_ARB_fragment_shader"); + this.GL_ARB_framebuffer_no_attachments = supported_extensions.contains("GL_ARB_framebuffer_no_attachments"); + this.GL_ARB_framebuffer_object = supported_extensions.contains("GL_ARB_framebuffer_object"); + this.GL_ARB_framebuffer_sRGB = supported_extensions.contains("GL_ARB_framebuffer_sRGB"); + this.GL_ARB_geometry_shader4 = supported_extensions.contains("GL_ARB_geometry_shader4"); + this.GL_ARB_get_program_binary = supported_extensions.contains("GL_ARB_get_program_binary"); + this.GL_ARB_gpu_shader5 = supported_extensions.contains("GL_ARB_gpu_shader5"); + this.GL_ARB_gpu_shader_fp64 = supported_extensions.contains("GL_ARB_gpu_shader_fp64"); + this.GL_ARB_half_float_pixel = supported_extensions.contains("GL_ARB_half_float_pixel"); + this.GL_ARB_half_float_vertex = supported_extensions.contains("GL_ARB_half_float_vertex"); + this.GL_ARB_imaging = supported_extensions.contains("GL_ARB_imaging"); + this.GL_ARB_indirect_parameters = supported_extensions.contains("GL_ARB_indirect_parameters"); + this.GL_ARB_instanced_arrays = supported_extensions.contains("GL_ARB_instanced_arrays"); + this.GL_ARB_internalformat_query = supported_extensions.contains("GL_ARB_internalformat_query"); + this.GL_ARB_internalformat_query2 = supported_extensions.contains("GL_ARB_internalformat_query2"); + this.GL_ARB_invalidate_subdata = supported_extensions.contains("GL_ARB_invalidate_subdata"); + this.GL_ARB_map_buffer_alignment = supported_extensions.contains("GL_ARB_map_buffer_alignment"); + this.GL_ARB_map_buffer_range = supported_extensions.contains("GL_ARB_map_buffer_range"); + this.GL_ARB_matrix_palette = supported_extensions.contains("GL_ARB_matrix_palette"); + this.GL_ARB_multi_bind = supported_extensions.contains("GL_ARB_multi_bind"); + this.GL_ARB_multi_draw_indirect = supported_extensions.contains("GL_ARB_multi_draw_indirect"); + this.GL_ARB_multisample = supported_extensions.contains("GL_ARB_multisample"); + this.GL_ARB_multitexture = supported_extensions.contains("GL_ARB_multitexture"); + this.GL_ARB_occlusion_query = supported_extensions.contains("GL_ARB_occlusion_query"); + this.GL_ARB_occlusion_query2 = supported_extensions.contains("GL_ARB_occlusion_query2"); + this.GL_ARB_pixel_buffer_object = supported_extensions.contains("GL_ARB_pixel_buffer_object") + && supported_extensions.contains("GL_ARB_buffer_object"); + this.GL_ARB_point_parameters = supported_extensions.contains("GL_ARB_point_parameters"); + this.GL_ARB_point_sprite = supported_extensions.contains("GL_ARB_point_sprite"); + this.GL_ARB_program_interface_query = supported_extensions.contains("GL_ARB_program_interface_query"); + this.GL_ARB_provoking_vertex = supported_extensions.contains("GL_ARB_provoking_vertex"); + this.GL_ARB_query_buffer_object = supported_extensions.contains("GL_ARB_query_buffer_object"); + this.GL_ARB_robust_buffer_access_behavior = supported_extensions.contains("GL_ARB_robust_buffer_access_behavior"); + this.GL_ARB_robustness = supported_extensions.contains("GL_ARB_robustness"); + this.GL_ARB_robustness_isolation = supported_extensions.contains("GL_ARB_robustness_isolation"); + this.GL_ARB_sample_shading = supported_extensions.contains("GL_ARB_sample_shading"); + this.GL_ARB_sampler_objects = supported_extensions.contains("GL_ARB_sampler_objects"); + this.GL_ARB_seamless_cube_map = supported_extensions.contains("GL_ARB_seamless_cube_map"); + this.GL_ARB_seamless_cubemap_per_texture = supported_extensions.contains("GL_ARB_seamless_cubemap_per_texture"); + this.GL_ARB_separate_shader_objects = supported_extensions.contains("GL_ARB_separate_shader_objects"); + this.GL_ARB_shader_atomic_counters = supported_extensions.contains("GL_ARB_shader_atomic_counters"); + this.GL_ARB_shader_bit_encoding = supported_extensions.contains("GL_ARB_shader_bit_encoding"); + this.GL_ARB_shader_draw_parameters = supported_extensions.contains("GL_ARB_shader_draw_parameters"); + this.GL_ARB_shader_group_vote = supported_extensions.contains("GL_ARB_shader_group_vote"); + this.GL_ARB_shader_image_load_store = supported_extensions.contains("GL_ARB_shader_image_load_store"); + this.GL_ARB_shader_image_size = supported_extensions.contains("GL_ARB_shader_image_size"); + this.GL_ARB_shader_objects = supported_extensions.contains("GL_ARB_shader_objects"); + this.GL_ARB_shader_precision = supported_extensions.contains("GL_ARB_shader_precision"); + this.GL_ARB_shader_stencil_export = supported_extensions.contains("GL_ARB_shader_stencil_export"); + this.GL_ARB_shader_storage_buffer_object = supported_extensions.contains("GL_ARB_shader_storage_buffer_object"); + this.GL_ARB_shader_subroutine = supported_extensions.contains("GL_ARB_shader_subroutine"); + this.GL_ARB_shader_texture_lod = supported_extensions.contains("GL_ARB_shader_texture_lod"); + this.GL_ARB_shading_language_100 = supported_extensions.contains("GL_ARB_shading_language_100"); + this.GL_ARB_shading_language_420pack = supported_extensions.contains("GL_ARB_shading_language_420pack"); + this.GL_ARB_shading_language_include = supported_extensions.contains("GL_ARB_shading_language_include"); + this.GL_ARB_shading_language_packing = supported_extensions.contains("GL_ARB_shading_language_packing"); + this.GL_ARB_shadow = supported_extensions.contains("GL_ARB_shadow"); + this.GL_ARB_shadow_ambient = supported_extensions.contains("GL_ARB_shadow_ambient"); + this.GL_ARB_sparse_texture = supported_extensions.contains("GL_ARB_sparse_texture"); + this.GL_ARB_stencil_texturing = supported_extensions.contains("GL_ARB_stencil_texturing"); + this.GL_ARB_sync = supported_extensions.contains("GL_ARB_sync"); + this.GL_ARB_tessellation_shader = supported_extensions.contains("GL_ARB_tessellation_shader"); + this.GL_ARB_texture_border_clamp = supported_extensions.contains("GL_ARB_texture_border_clamp"); + this.GL_ARB_texture_buffer_object = supported_extensions.contains("GL_ARB_texture_buffer_object"); + this.GL_ARB_texture_buffer_object_rgb32 = supported_extensions.contains("GL_ARB_texture_buffer_object_rgb32") + || supported_extensions.contains("GL_EXT_texture_buffer_object_rgb32"); + this.GL_ARB_texture_buffer_range = supported_extensions.contains("GL_ARB_texture_buffer_range"); + this.GL_ARB_texture_compression = supported_extensions.contains("GL_ARB_texture_compression"); + this.GL_ARB_texture_compression_bptc = supported_extensions.contains("GL_ARB_texture_compression_bptc") + || supported_extensions.contains("GL_EXT_texture_compression_bptc"); + this.GL_ARB_texture_compression_rgtc = supported_extensions.contains("GL_ARB_texture_compression_rgtc"); + this.GL_ARB_texture_cube_map = supported_extensions.contains("GL_ARB_texture_cube_map"); + this.GL_ARB_texture_cube_map_array = supported_extensions.contains("GL_ARB_texture_cube_map_array"); + this.GL_ARB_texture_env_add = supported_extensions.contains("GL_ARB_texture_env_add"); + this.GL_ARB_texture_env_combine = supported_extensions.contains("GL_ARB_texture_env_combine"); + this.GL_ARB_texture_env_crossbar = supported_extensions.contains("GL_ARB_texture_env_crossbar"); + this.GL_ARB_texture_env_dot3 = supported_extensions.contains("GL_ARB_texture_env_dot3"); + this.GL_ARB_texture_float = supported_extensions.contains("GL_ARB_texture_float"); + this.GL_ARB_texture_gather = supported_extensions.contains("GL_ARB_texture_gather"); + this.GL_ARB_texture_mirror_clamp_to_edge = supported_extensions.contains("GL_ARB_texture_mirror_clamp_to_edge"); + this.GL_ARB_texture_mirrored_repeat = supported_extensions.contains("GL_ARB_texture_mirrored_repeat"); + this.GL_ARB_texture_multisample = supported_extensions.contains("GL_ARB_texture_multisample"); + this.GL_ARB_texture_non_power_of_two = supported_extensions.contains("GL_ARB_texture_non_power_of_two"); + this.GL_ARB_texture_query_levels = supported_extensions.contains("GL_ARB_texture_query_levels"); + this.GL_ARB_texture_query_lod = supported_extensions.contains("GL_ARB_texture_query_lod"); + this.GL_ARB_texture_rectangle = supported_extensions.contains("GL_ARB_texture_rectangle"); + this.GL_ARB_texture_rg = supported_extensions.contains("GL_ARB_texture_rg"); + this.GL_ARB_texture_rgb10_a2ui = supported_extensions.contains("GL_ARB_texture_rgb10_a2ui"); + this.GL_ARB_texture_stencil8 = supported_extensions.contains("GL_ARB_texture_stencil8"); + this.GL_ARB_texture_storage = supported_extensions.contains("GL_ARB_texture_storage") + || supported_extensions.contains("GL_EXT_texture_storage"); + this.GL_ARB_texture_storage_multisample = supported_extensions.contains("GL_ARB_texture_storage_multisample"); + this.GL_ARB_texture_swizzle = supported_extensions.contains("GL_ARB_texture_swizzle"); + this.GL_ARB_texture_view = supported_extensions.contains("GL_ARB_texture_view"); + this.GL_ARB_timer_query = supported_extensions.contains("GL_ARB_timer_query"); + this.GL_ARB_transform_feedback2 = supported_extensions.contains("GL_ARB_transform_feedback2"); + this.GL_ARB_transform_feedback3 = supported_extensions.contains("GL_ARB_transform_feedback3"); + this.GL_ARB_transform_feedback_instanced = supported_extensions.contains("GL_ARB_transform_feedback_instanced"); + this.GL_ARB_transpose_matrix = supported_extensions.contains("GL_ARB_transpose_matrix"); + this.GL_ARB_uniform_buffer_object = supported_extensions.contains("GL_ARB_uniform_buffer_object"); + this.GL_ARB_vertex_array_bgra = supported_extensions.contains("GL_ARB_vertex_array_bgra"); + this.GL_ARB_vertex_array_object = supported_extensions.contains("GL_ARB_vertex_array_object"); + this.GL_ARB_vertex_attrib_64bit = supported_extensions.contains("GL_ARB_vertex_attrib_64bit"); + this.GL_ARB_vertex_attrib_binding = supported_extensions.contains("GL_ARB_vertex_attrib_binding"); + this.GL_ARB_vertex_blend = supported_extensions.contains("GL_ARB_vertex_blend"); + this.GL_ARB_vertex_buffer_object = supported_extensions.contains("GL_ARB_vertex_buffer_object") + && supported_extensions.contains("GL_ARB_buffer_object"); + this.GL_ARB_vertex_program = supported_extensions.contains("GL_ARB_vertex_program") + && supported_extensions.contains("GL_ARB_program"); + this.GL_ARB_vertex_shader = supported_extensions.contains("GL_ARB_vertex_shader"); + this.GL_ARB_vertex_type_10f_11f_11f_rev = supported_extensions.contains("GL_ARB_vertex_type_10f_11f_11f_rev"); + this.GL_ARB_vertex_type_2_10_10_10_rev = supported_extensions.contains("GL_ARB_vertex_type_2_10_10_10_rev"); + this.GL_ARB_viewport_array = supported_extensions.contains("GL_ARB_viewport_array"); + this.GL_ARB_window_pos = supported_extensions.contains("GL_ARB_window_pos"); + this.GL_ATI_draw_buffers = supported_extensions.contains("GL_ATI_draw_buffers"); + this.GL_ATI_element_array = supported_extensions.contains("GL_ATI_element_array"); + this.GL_ATI_envmap_bumpmap = supported_extensions.contains("GL_ATI_envmap_bumpmap"); + this.GL_ATI_fragment_shader = supported_extensions.contains("GL_ATI_fragment_shader"); + this.GL_ATI_map_object_buffer = supported_extensions.contains("GL_ATI_map_object_buffer"); + this.GL_ATI_meminfo = supported_extensions.contains("GL_ATI_meminfo"); + this.GL_ATI_pn_triangles = supported_extensions.contains("GL_ATI_pn_triangles"); + this.GL_ATI_separate_stencil = supported_extensions.contains("GL_ATI_separate_stencil"); + this.GL_ATI_shader_texture_lod = supported_extensions.contains("GL_ATI_shader_texture_lod"); + this.GL_ATI_text_fragment_shader = supported_extensions.contains("GL_ATI_text_fragment_shader"); + this.GL_ATI_texture_compression_3dc = supported_extensions.contains("GL_ATI_texture_compression_3dc"); + this.GL_ATI_texture_env_combine3 = supported_extensions.contains("GL_ATI_texture_env_combine3"); + this.GL_ATI_texture_float = supported_extensions.contains("GL_ATI_texture_float"); + this.GL_ATI_texture_mirror_once = supported_extensions.contains("GL_ATI_texture_mirror_once"); + this.GL_ATI_vertex_array_object = supported_extensions.contains("GL_ATI_vertex_array_object"); + this.GL_ATI_vertex_attrib_array_object = supported_extensions.contains("GL_ATI_vertex_attrib_array_object"); + this.GL_ATI_vertex_streams = supported_extensions.contains("GL_ATI_vertex_streams"); + this.GL_EXT_abgr = supported_extensions.contains("GL_EXT_abgr"); + this.GL_EXT_bgra = supported_extensions.contains("GL_EXT_bgra"); + this.GL_EXT_bindable_uniform = supported_extensions.contains("GL_EXT_bindable_uniform"); + this.GL_EXT_blend_color = supported_extensions.contains("GL_EXT_blend_color"); + this.GL_EXT_blend_equation_separate = supported_extensions.contains("GL_EXT_blend_equation_separate"); + this.GL_EXT_blend_func_separate = supported_extensions.contains("GL_EXT_blend_func_separate"); + this.GL_EXT_blend_minmax = supported_extensions.contains("GL_EXT_blend_minmax"); + this.GL_EXT_blend_subtract = supported_extensions.contains("GL_EXT_blend_subtract"); + this.GL_EXT_Cg_shader = supported_extensions.contains("GL_EXT_Cg_shader"); + this.GL_EXT_compiled_vertex_array = supported_extensions.contains("GL_EXT_compiled_vertex_array"); + this.GL_EXT_depth_bounds_test = supported_extensions.contains("GL_EXT_depth_bounds_test"); + this.GL_EXT_direct_state_access = supported_extensions.contains("GL_EXT_direct_state_access"); + this.GL_EXT_draw_buffers2 = supported_extensions.contains("GL_EXT_draw_buffers2"); + this.GL_EXT_draw_instanced = supported_extensions.contains("GL_EXT_draw_instanced"); + this.GL_EXT_draw_range_elements = supported_extensions.contains("GL_EXT_draw_range_elements"); + this.GL_EXT_fog_coord = supported_extensions.contains("GL_EXT_fog_coord"); + this.GL_EXT_framebuffer_blit = supported_extensions.contains("GL_EXT_framebuffer_blit"); + this.GL_EXT_framebuffer_multisample = supported_extensions.contains("GL_EXT_framebuffer_multisample"); + this.GL_EXT_framebuffer_multisample_blit_scaled = supported_extensions.contains("GL_EXT_framebuffer_multisample_blit_scaled"); + this.GL_EXT_framebuffer_object = supported_extensions.contains("GL_EXT_framebuffer_object"); + this.GL_EXT_framebuffer_sRGB = supported_extensions.contains("GL_EXT_framebuffer_sRGB"); + this.GL_EXT_geometry_shader4 = supported_extensions.contains("GL_EXT_geometry_shader4"); + this.GL_EXT_gpu_program_parameters = supported_extensions.contains("GL_EXT_gpu_program_parameters"); + this.GL_EXT_gpu_shader4 = supported_extensions.contains("GL_EXT_gpu_shader4"); + this.GL_EXT_multi_draw_arrays = supported_extensions.contains("GL_EXT_multi_draw_arrays"); + this.GL_EXT_packed_depth_stencil = supported_extensions.contains("GL_EXT_packed_depth_stencil"); + this.GL_EXT_packed_float = supported_extensions.contains("GL_EXT_packed_float"); + this.GL_EXT_packed_pixels = supported_extensions.contains("GL_EXT_packed_pixels"); + this.GL_EXT_paletted_texture = supported_extensions.contains("GL_EXT_paletted_texture"); + this.GL_EXT_pixel_buffer_object = supported_extensions.contains("GL_EXT_pixel_buffer_object") + && supported_extensions.contains("GL_ARB_buffer_object"); + this.GL_EXT_point_parameters = supported_extensions.contains("GL_EXT_point_parameters"); + this.GL_EXT_provoking_vertex = supported_extensions.contains("GL_EXT_provoking_vertex"); + this.GL_EXT_rescale_normal = supported_extensions.contains("GL_EXT_rescale_normal"); + this.GL_EXT_secondary_color = supported_extensions.contains("GL_EXT_secondary_color"); + this.GL_EXT_separate_shader_objects = supported_extensions.contains("GL_EXT_separate_shader_objects"); + this.GL_EXT_separate_specular_color = supported_extensions.contains("GL_EXT_separate_specular_color"); + this.GL_EXT_shader_image_load_store = supported_extensions.contains("GL_EXT_shader_image_load_store"); + this.GL_EXT_shadow_funcs = supported_extensions.contains("GL_EXT_shadow_funcs"); + this.GL_EXT_shared_texture_palette = supported_extensions.contains("GL_EXT_shared_texture_palette"); + this.GL_EXT_stencil_clear_tag = supported_extensions.contains("GL_EXT_stencil_clear_tag"); + this.GL_EXT_stencil_two_side = supported_extensions.contains("GL_EXT_stencil_two_side"); + this.GL_EXT_stencil_wrap = supported_extensions.contains("GL_EXT_stencil_wrap"); + this.GL_EXT_texture_3d = supported_extensions.contains("GL_EXT_texture_3d"); + this.GL_EXT_texture_array = supported_extensions.contains("GL_EXT_texture_array"); + this.GL_EXT_texture_buffer_object = supported_extensions.contains("GL_EXT_texture_buffer_object"); + this.GL_EXT_texture_compression_latc = supported_extensions.contains("GL_EXT_texture_compression_latc"); + this.GL_EXT_texture_compression_rgtc = supported_extensions.contains("GL_EXT_texture_compression_rgtc"); + this.GL_EXT_texture_compression_s3tc = supported_extensions.contains("GL_EXT_texture_compression_s3tc"); + this.GL_EXT_texture_env_combine = supported_extensions.contains("GL_EXT_texture_env_combine"); + this.GL_EXT_texture_env_dot3 = supported_extensions.contains("GL_EXT_texture_env_dot3"); + this.GL_EXT_texture_filter_anisotropic = supported_extensions.contains("GL_EXT_texture_filter_anisotropic"); + this.GL_EXT_texture_integer = supported_extensions.contains("GL_EXT_texture_integer"); + this.GL_EXT_texture_lod_bias = supported_extensions.contains("GL_EXT_texture_lod_bias"); + this.GL_EXT_texture_mirror_clamp = supported_extensions.contains("GL_EXT_texture_mirror_clamp"); + this.GL_EXT_texture_rectangle = supported_extensions.contains("GL_EXT_texture_rectangle"); + this.GL_EXT_texture_sRGB = supported_extensions.contains("GL_EXT_texture_sRGB"); + this.GL_EXT_texture_sRGB_decode = supported_extensions.contains("GL_EXT_texture_sRGB_decode"); + this.GL_EXT_texture_shared_exponent = supported_extensions.contains("GL_EXT_texture_shared_exponent"); + this.GL_EXT_texture_snorm = supported_extensions.contains("GL_EXT_texture_snorm"); + this.GL_EXT_texture_swizzle = supported_extensions.contains("GL_EXT_texture_swizzle"); + this.GL_EXT_timer_query = supported_extensions.contains("GL_EXT_timer_query"); + this.GL_EXT_transform_feedback = supported_extensions.contains("GL_EXT_transform_feedback"); + this.GL_EXT_vertex_array_bgra = supported_extensions.contains("GL_EXT_vertex_array_bgra"); + this.GL_EXT_vertex_attrib_64bit = supported_extensions.contains("GL_EXT_vertex_attrib_64bit"); + this.GL_EXT_vertex_shader = supported_extensions.contains("GL_EXT_vertex_shader"); + this.GL_EXT_vertex_weighting = supported_extensions.contains("GL_EXT_vertex_weighting"); + this.OpenGL11 = supported_extensions.contains("OpenGL11"); + this.OpenGL12 = supported_extensions.contains("OpenGL12"); + this.OpenGL13 = supported_extensions.contains("OpenGL13"); + this.OpenGL14 = supported_extensions.contains("OpenGL14"); + this.OpenGL15 = supported_extensions.contains("OpenGL15"); + this.OpenGL20 = supported_extensions.contains("OpenGL20"); + this.OpenGL21 = supported_extensions.contains("OpenGL21"); + this.OpenGL30 = supported_extensions.contains("OpenGL30"); + this.OpenGL31 = supported_extensions.contains("OpenGL31"); + this.OpenGL32 = supported_extensions.contains("OpenGL32"); + this.OpenGL33 = supported_extensions.contains("OpenGL33"); + this.OpenGL40 = supported_extensions.contains("OpenGL40"); + this.OpenGL41 = supported_extensions.contains("OpenGL41"); + this.OpenGL42 = supported_extensions.contains("OpenGL42"); + this.OpenGL43 = supported_extensions.contains("OpenGL43"); + this.OpenGL44 = supported_extensions.contains("OpenGL44"); + this.GL_GREMEDY_frame_terminator = supported_extensions.contains("GL_GREMEDY_frame_terminator"); + this.GL_GREMEDY_string_marker = supported_extensions.contains("GL_GREMEDY_string_marker"); + this.GL_HP_occlusion_test = supported_extensions.contains("GL_HP_occlusion_test"); + this.GL_IBM_rasterpos_clip = supported_extensions.contains("GL_IBM_rasterpos_clip"); + this.GL_INTEL_map_texture = supported_extensions.contains("GL_INTEL_map_texture"); + this.GL_KHR_debug = supported_extensions.contains("GL_KHR_debug"); + this.GL_KHR_texture_compression_astc_ldr = supported_extensions.contains("GL_KHR_texture_compression_astc_ldr"); + this.GL_NVX_gpu_memory_info = supported_extensions.contains("GL_NVX_gpu_memory_info"); + this.GL_NV_bindless_multi_draw_indirect = supported_extensions.contains("GL_NV_bindless_multi_draw_indirect"); + this.GL_NV_bindless_texture = supported_extensions.contains("GL_NV_bindless_texture"); + this.GL_NV_blend_equation_advanced = supported_extensions.contains("GL_NV_blend_equation_advanced"); + this.GL_NV_blend_square = supported_extensions.contains("GL_NV_blend_square"); + this.GL_NV_compute_program5 = supported_extensions.contains("GL_NV_compute_program5"); + this.GL_NV_conditional_render = supported_extensions.contains("GL_NV_conditional_render"); + this.GL_NV_copy_depth_to_color = supported_extensions.contains("GL_NV_copy_depth_to_color"); + this.GL_NV_copy_image = supported_extensions.contains("GL_NV_copy_image"); + this.GL_NV_deep_texture3D = supported_extensions.contains("GL_NV_deep_texture3D"); + this.GL_NV_depth_buffer_float = supported_extensions.contains("GL_NV_depth_buffer_float"); + this.GL_NV_depth_clamp = supported_extensions.contains("GL_NV_depth_clamp"); + this.GL_NV_draw_texture = supported_extensions.contains("GL_NV_draw_texture"); + this.GL_NV_evaluators = supported_extensions.contains("GL_NV_evaluators"); + this.GL_NV_explicit_multisample = supported_extensions.contains("GL_NV_explicit_multisample"); + this.GL_NV_fence = supported_extensions.contains("GL_NV_fence"); + this.GL_NV_float_buffer = supported_extensions.contains("GL_NV_float_buffer"); + this.GL_NV_fog_distance = supported_extensions.contains("GL_NV_fog_distance"); + this.GL_NV_fragment_program = supported_extensions.contains("GL_NV_fragment_program") + && supported_extensions.contains("GL_NV_program"); + this.GL_NV_fragment_program2 = supported_extensions.contains("GL_NV_fragment_program2"); + this.GL_NV_fragment_program4 = supported_extensions.contains("GL_NV_fragment_program4"); + this.GL_NV_fragment_program_option = supported_extensions.contains("GL_NV_fragment_program_option"); + this.GL_NV_framebuffer_multisample_coverage = supported_extensions.contains("GL_NV_framebuffer_multisample_coverage"); + this.GL_NV_geometry_program4 = supported_extensions.contains("GL_NV_geometry_program4"); + this.GL_NV_geometry_shader4 = supported_extensions.contains("GL_NV_geometry_shader4"); + this.GL_NV_gpu_program4 = supported_extensions.contains("GL_NV_gpu_program4"); + this.GL_NV_gpu_program5 = supported_extensions.contains("GL_NV_gpu_program5"); + this.GL_NV_gpu_program5_mem_extended = supported_extensions.contains("GL_NV_gpu_program5_mem_extended"); + this.GL_NV_gpu_shader5 = supported_extensions.contains("GL_NV_gpu_shader5"); + this.GL_NV_half_float = supported_extensions.contains("GL_NV_half_float"); + this.GL_NV_light_max_exponent = supported_extensions.contains("GL_NV_light_max_exponent"); + this.GL_NV_multisample_coverage = supported_extensions.contains("GL_NV_multisample_coverage"); + this.GL_NV_multisample_filter_hint = supported_extensions.contains("GL_NV_multisample_filter_hint"); + this.GL_NV_occlusion_query = supported_extensions.contains("GL_NV_occlusion_query"); + this.GL_NV_packed_depth_stencil = supported_extensions.contains("GL_NV_packed_depth_stencil"); + this.GL_NV_parameter_buffer_object = supported_extensions.contains("GL_NV_parameter_buffer_object"); + this.GL_NV_parameter_buffer_object2 = supported_extensions.contains("GL_NV_parameter_buffer_object2"); + this.GL_NV_path_rendering = supported_extensions.contains("GL_NV_path_rendering"); + this.GL_NV_pixel_data_range = supported_extensions.contains("GL_NV_pixel_data_range"); + this.GL_NV_point_sprite = supported_extensions.contains("GL_NV_point_sprite"); + this.GL_NV_present_video = supported_extensions.contains("GL_NV_present_video"); + this.GL_NV_primitive_restart = supported_extensions.contains("GL_NV_primitive_restart"); + this.GL_NV_register_combiners = supported_extensions.contains("GL_NV_register_combiners"); + this.GL_NV_register_combiners2 = supported_extensions.contains("GL_NV_register_combiners2"); + this.GL_NV_shader_atomic_counters = supported_extensions.contains("GL_NV_shader_atomic_counters"); + this.GL_NV_shader_atomic_float = supported_extensions.contains("GL_NV_shader_atomic_float"); + this.GL_NV_shader_buffer_load = supported_extensions.contains("GL_NV_shader_buffer_load"); + this.GL_NV_shader_buffer_store = supported_extensions.contains("GL_NV_shader_buffer_store"); + this.GL_NV_shader_storage_buffer_object = supported_extensions.contains("GL_NV_shader_storage_buffer_object"); + this.GL_NV_tessellation_program5 = supported_extensions.contains("GL_NV_tessellation_program5"); + this.GL_NV_texgen_reflection = supported_extensions.contains("GL_NV_texgen_reflection"); + this.GL_NV_texture_barrier = supported_extensions.contains("GL_NV_texture_barrier"); + this.GL_NV_texture_compression_vtc = supported_extensions.contains("GL_NV_texture_compression_vtc"); + this.GL_NV_texture_env_combine4 = supported_extensions.contains("GL_NV_texture_env_combine4"); + this.GL_NV_texture_expand_normal = supported_extensions.contains("GL_NV_texture_expand_normal"); + this.GL_NV_texture_multisample = supported_extensions.contains("GL_NV_texture_multisample"); + this.GL_NV_texture_rectangle = supported_extensions.contains("GL_NV_texture_rectangle"); + this.GL_NV_texture_shader = supported_extensions.contains("GL_NV_texture_shader"); + this.GL_NV_texture_shader2 = supported_extensions.contains("GL_NV_texture_shader2"); + this.GL_NV_texture_shader3 = supported_extensions.contains("GL_NV_texture_shader3"); + this.GL_NV_transform_feedback = supported_extensions.contains("GL_NV_transform_feedback"); + this.GL_NV_transform_feedback2 = supported_extensions.contains("GL_NV_transform_feedback2"); + this.GL_NV_vertex_array_range = supported_extensions.contains("GL_NV_vertex_array_range"); + this.GL_NV_vertex_array_range2 = supported_extensions.contains("GL_NV_vertex_array_range2"); + this.GL_NV_vertex_attrib_integer_64bit = supported_extensions.contains("GL_NV_vertex_attrib_integer_64bit"); + this.GL_NV_vertex_buffer_unified_memory = supported_extensions.contains("GL_NV_vertex_buffer_unified_memory"); + this.GL_NV_vertex_program = supported_extensions.contains("GL_NV_vertex_program") + && supported_extensions.contains("GL_NV_program"); + this.GL_NV_vertex_program1_1 = supported_extensions.contains("GL_NV_vertex_program1_1"); + this.GL_NV_vertex_program2 = supported_extensions.contains("GL_NV_vertex_program2"); + this.GL_NV_vertex_program2_option = supported_extensions.contains("GL_NV_vertex_program2_option"); + this.GL_NV_vertex_program3 = supported_extensions.contains("GL_NV_vertex_program3"); + this.GL_NV_vertex_program4 = supported_extensions.contains("GL_NV_vertex_program4"); + this.GL_NV_video_capture = supported_extensions.contains("GL_NV_video_capture"); + this.GL_SGIS_generate_mipmap = supported_extensions.contains("GL_SGIS_generate_mipmap"); + this.GL_SGIS_texture_lod = supported_extensions.contains("GL_SGIS_texture_lod"); + this.GL_SUN_slice_accum = supported_extensions.contains("GL_SUN_slice_accum"); + tracker.init(); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTAbgr.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTAbgr.java new file mode 100644 index 0000000..e5d3cab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTAbgr.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTAbgr { + + public static final int GL_ABGR_EXT = 0x8000; + + private EXTAbgr() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBgra.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBgra.java new file mode 100644 index 0000000..244c047 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBgra.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBgra { + + public static final int GL_BGR_EXT = 0x80E0, + GL_BGRA_EXT = 0x80E1; + + private EXTBgra() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBindableUniform.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBindableUniform.java new file mode 100644 index 0000000..ad578ac --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBindableUniform.java @@ -0,0 +1,54 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBindableUniform { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT = 0x8DE2, + GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT = 0x8DE3, + GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT = 0x8DE4, + GL_MAX_BINDABLE_UNIFORM_SIZE_EXT = 0x8DED, + GL_UNIFORM_BUFFER_BINDING_EXT = 0x8DEF; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_UNIFORM_BUFFER_EXT = 0x8DEE; + + private EXTBindableUniform() {} + + public static void glUniformBufferEXT(int program, int location, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniformBufferEXT(program, location, buffer, function_pointer); + } + static native void nglUniformBufferEXT(int program, int location, int buffer, long function_pointer); + + public static int glGetUniformBufferSizeEXT(int program, int location) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformBufferSizeEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetUniformBufferSizeEXT(program, location, function_pointer); + return __result; + } + static native int nglGetUniformBufferSizeEXT(int program, int location, long function_pointer); + + public static long glGetUniformOffsetEXT(int program, int location) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetUniformOffsetEXT(program, location, function_pointer); + return __result; + } + static native long nglGetUniformOffsetEXT(int program, int location, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendColor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendColor.java new file mode 100644 index 0000000..4529009 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendColor.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendColor { + + /** + * Accepted by the &lt;sfactor&gt; and &lt;dfactor&gt; parameters of BlendFunc. + */ + public static final int GL_CONSTANT_COLOR_EXT = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR_EXT = 0x8002, + GL_CONSTANT_ALPHA_EXT = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA_EXT = 0x8004; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_BLEND_COLOR_EXT = 0x8005; + + private EXTBlendColor() {} + + public static void glBlendColorEXT(float red, float green, float blue, float alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendColorEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendColorEXT(red, green, blue, alpha, function_pointer); + } + static native void nglBlendColorEXT(float red, float green, float blue, float alpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendEquationSeparate.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendEquationSeparate.java new file mode 100644 index 0000000..01d4982 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendEquationSeparate.java @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendEquationSeparate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_BLEND_EQUATION_RGB_EXT = 0x8009, + GL_BLEND_EQUATION_ALPHA_EXT = 0x883D; + + private EXTBlendEquationSeparate() {} + + public static void glBlendEquationSeparateEXT(int modeRGB, int modeAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationSeparateEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationSeparateEXT(modeRGB, modeAlpha, function_pointer); + } + static native void nglBlendEquationSeparateEXT(int modeRGB, int modeAlpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendFuncSeparate.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendFuncSeparate.java new file mode 100644 index 0000000..a54f70e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendFuncSeparate.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendFuncSeparate { + + public static final int GL_BLEND_DST_RGB_EXT = 0x80C8, + GL_BLEND_SRC_RGB_EXT = 0x80C9, + GL_BLEND_DST_ALPHA_EXT = 0x80CA, + GL_BLEND_SRC_ALPHA_EXT = 0x80CB; + + private EXTBlendFuncSeparate() {} + + public static void glBlendFuncSeparateEXT(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncSeparateEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha, function_pointer); + } + static native void nglBlendFuncSeparateEXT(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendMinmax.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendMinmax.java new file mode 100644 index 0000000..40d7828 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendMinmax.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendMinmax { + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquationEXT. + */ + public static final int GL_FUNC_ADD_EXT = 0x8006, + GL_MIN_EXT = 0x8007, + GL_MAX_EXT = 0x8008; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_BLEND_EQUATION_EXT = 0x8009; + + private EXTBlendMinmax() {} + + public static void glBlendEquationEXT(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationEXT(mode, function_pointer); + } + static native void nglBlendEquationEXT(int mode, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendSubtract.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendSubtract.java new file mode 100644 index 0000000..b9d5d56 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTBlendSubtract.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendSubtract { + + public static final int GL_FUNC_SUBTRACT_EXT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT_EXT = 0x800B; + + private EXTBlendSubtract() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCgShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCgShader.java new file mode 100644 index 0000000..0f62e92 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCgShader.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTCgShader { + + /** + * You can pass GL_CG_VERTEX_SHADER_EXT to glCreateShaderARB instead of GL_VERTEX_SHADER_ARB to create a vertex shader object + * that will parse and compile its shader source with the Cg compiler front-end rather than the GLSL front-end. Likewise, you + * can pass GL_CG_FRAGMENT_SHADER_EXT to glCreateShaderARB instead of GL_FRAGMENT_SHADER_ARB to create a fragment shader object + * that will parse and compile its shader source with the Cg front-end rather than the GLSL front-end. + */ + public static final int GL_CG_VERTEX_SHADER_EXT = 0x890E, + GL_CG_FRAGMENT_SHADER_EXT = 0x890F; + + private EXTCgShader() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCompiledVertexArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCompiledVertexArray.java new file mode 100644 index 0000000..d32ba69 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTCompiledVertexArray.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTCompiledVertexArray { + + public static final int GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = 0x81A8, + GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = 0x81A9; + + private EXTCompiledVertexArray() {} + + public static void glLockArraysEXT(int first, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLockArraysEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglLockArraysEXT(first, count, function_pointer); + } + static native void nglLockArraysEXT(int first, int count, long function_pointer); + + public static void glUnlockArraysEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnlockArraysEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUnlockArraysEXT(function_pointer); + } + static native void nglUnlockArraysEXT(long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDepthBoundsTest.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDepthBoundsTest.java new file mode 100644 index 0000000..2c9b45a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDepthBoundsTest.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDepthBoundsTest { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_BOUNDS_TEST_EXT = 0x8890; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_BOUNDS_EXT = 0x8891; + + private EXTDepthBoundsTest() {} + + public static void glDepthBoundsEXT(double zmin, double zmax) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthBoundsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthBoundsEXT(zmin, zmax, function_pointer); + } + static native void nglDepthBoundsEXT(double zmin, double zmax, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDirectStateAccess.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDirectStateAccess.java new file mode 100644 index 0000000..07d36c9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDirectStateAccess.java @@ -0,0 +1,3103 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDirectStateAccess { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanIndexedvEXT, + * GetIntegerIndexedvEXT, GetFloatIndexedvEXT, GetDoubleIndexedvEXT: + * GetBooleani_v, GetIntegeri_v, GetFloati_vEXT, GetDoublei_vEXT: + */ + public static final int GL_PROGRAM_MATRIX_EXT = 0x8E2D, + GL_TRANSPOSE_PROGRAM_MATRIX_EXT = 0x8E2E, + GL_PROGRAM_MATRIX_STACK_DEPTH_EXT = 0x8E2F; + + private EXTDirectStateAccess() {} + + public static void glClientAttribDefaultEXT(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClientAttribDefaultEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglClientAttribDefaultEXT(mask, function_pointer); + } + static native void nglClientAttribDefaultEXT(int mask, long function_pointer); + + public static void glPushClientAttribDefaultEXT(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushClientAttribDefaultEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglPushClientAttribDefaultEXT(mask, function_pointer); + } + static native void nglPushClientAttribDefaultEXT(int mask, long function_pointer); + + public static void glMatrixLoadEXT(int matrixMode, FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixLoadfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixLoadfEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixLoadfEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixLoadEXT(int matrixMode, DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixLoaddEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixLoaddEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixLoaddEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixMultEXT(int matrixMode, FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixMultfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixMultfEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixMultfEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixMultEXT(int matrixMode, DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixMultdEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixMultdEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixMultdEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixLoadIdentityEXT(int matrixMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixLoadIdentityEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixLoadIdentityEXT(matrixMode, function_pointer); + } + static native void nglMatrixLoadIdentityEXT(int matrixMode, long function_pointer); + + public static void glMatrixRotatefEXT(int matrixMode, float angle, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixRotatefEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixRotatefEXT(matrixMode, angle, x, y, z, function_pointer); + } + static native void nglMatrixRotatefEXT(int matrixMode, float angle, float x, float y, float z, long function_pointer); + + public static void glMatrixRotatedEXT(int matrixMode, double angle, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixRotatedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixRotatedEXT(matrixMode, angle, x, y, z, function_pointer); + } + static native void nglMatrixRotatedEXT(int matrixMode, double angle, double x, double y, double z, long function_pointer); + + public static void glMatrixScalefEXT(int matrixMode, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixScalefEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixScalefEXT(matrixMode, x, y, z, function_pointer); + } + static native void nglMatrixScalefEXT(int matrixMode, float x, float y, float z, long function_pointer); + + public static void glMatrixScaledEXT(int matrixMode, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixScaledEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixScaledEXT(matrixMode, x, y, z, function_pointer); + } + static native void nglMatrixScaledEXT(int matrixMode, double x, double y, double z, long function_pointer); + + public static void glMatrixTranslatefEXT(int matrixMode, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixTranslatefEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixTranslatefEXT(matrixMode, x, y, z, function_pointer); + } + static native void nglMatrixTranslatefEXT(int matrixMode, float x, float y, float z, long function_pointer); + + public static void glMatrixTranslatedEXT(int matrixMode, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixTranslatedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixTranslatedEXT(matrixMode, x, y, z, function_pointer); + } + static native void nglMatrixTranslatedEXT(int matrixMode, double x, double y, double z, long function_pointer); + + public static void glMatrixOrthoEXT(int matrixMode, double l, double r, double b, double t, double n, double f) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixOrthoEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixOrthoEXT(matrixMode, l, r, b, t, n, f, function_pointer); + } + static native void nglMatrixOrthoEXT(int matrixMode, double l, double r, double b, double t, double n, double f, long function_pointer); + + public static void glMatrixFrustumEXT(int matrixMode, double l, double r, double b, double t, double n, double f) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixFrustumEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixFrustumEXT(matrixMode, l, r, b, t, n, f, function_pointer); + } + static native void nglMatrixFrustumEXT(int matrixMode, double l, double r, double b, double t, double n, double f, long function_pointer); + + public static void glMatrixPushEXT(int matrixMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixPushEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixPushEXT(matrixMode, function_pointer); + } + static native void nglMatrixPushEXT(int matrixMode, long function_pointer); + + public static void glMatrixPopEXT(int matrixMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixPopEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixPopEXT(matrixMode, function_pointer); + } + static native void nglMatrixPopEXT(int matrixMode, long function_pointer); + + public static void glTextureParameteriEXT(int texture, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameteriEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureParameteriEXT(texture, target, pname, param, function_pointer); + } + static native void nglTextureParameteriEXT(int texture, int target, int pname, int param, long function_pointer); + + public static void glTextureParameterEXT(int texture, int target, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTextureParameterivEXT(texture, target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTextureParameterivEXT(int texture, int target, int pname, long param, long function_pointer); + + public static void glTextureParameterfEXT(int texture, int target, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureParameterfEXT(texture, target, pname, param, function_pointer); + } + static native void nglTextureParameterfEXT(int texture, int target, int pname, float param, long function_pointer); + + public static void glTextureParameterEXT(int texture, int target, int pname, FloatBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTextureParameterfvEXT(texture, target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTextureParameterfvEXT(int texture, int target, int pname, long param, long function_pointer); + + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, long pixels, long function_pointer); + public static void glTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureImage1DEXTBO(texture, target, level, internalformat, width, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureImage1DEXTBO(int texture, int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels, long function_pointer); + public static void glTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureImage2DEXTBO(texture, target, level, internalformat, width, height, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureImage2DEXTBO(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, long pixels, long function_pointer); + public static void glTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureSubImage1DEXTBO(texture, target, level, xoffset, width, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureSubImage1DEXTBO(int texture, int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels, long function_pointer); + public static void glTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureSubImage2DEXTBO(texture, target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureSubImage2DEXTBO(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glCopyTextureImage1DEXT(int texture, int target, int level, int internalformat, int x, int y, int width, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border, function_pointer); + } + static native void nglCopyTextureImage1DEXT(int texture, int target, int level, int internalformat, int x, int y, int width, int border, long function_pointer); + + public static void glCopyTextureImage2DEXT(int texture, int target, int level, int internalformat, int x, int y, int width, int height, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border, function_pointer); + } + static native void nglCopyTextureImage2DEXT(int texture, int target, int level, int internalformat, int x, int y, int width, int height, int border, long function_pointer); + + public static void glCopyTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width, function_pointer); + } + static native void nglCopyTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int x, int y, int width, long function_pointer); + + public static void glCopyTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height, function_pointer); + } + static native void nglCopyTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int x, int y, int width, int height, long function_pointer); + + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTextureImageEXT(texture, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTextureImageEXT(texture, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTextureImageEXT(texture, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTextureImageEXT(texture, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTextureImageEXT(texture, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglGetTextureImageEXT(int texture, int target, int level, int format, int type, long pixels, long function_pointer); + public static void glGetTextureImageEXT(int texture, int target, int level, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetTextureImageEXTBO(texture, target, level, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglGetTextureImageEXTBO(int texture, int target, int level, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glGetTextureParameterEXT(int texture, int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureParameterfvEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureParameterfvEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glGetTextureParameterfvEXT. */ + public static float glGetTextureParameterfEXT(int texture, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTextureParameterfvEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTextureParameterEXT(int texture, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureParameterivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureParameterivEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glGetTextureParameterivEXT. */ + public static int glGetTextureParameteriEXT(int texture, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTextureParameterivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTextureLevelParameterEXT(int texture, int target, int level, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureLevelParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureLevelParameterfvEXT(texture, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureLevelParameterfvEXT(int texture, int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetTextureLevelParameterfvEXT. */ + public static float glGetTextureLevelParameterfEXT(int texture, int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureLevelParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTextureLevelParameterfvEXT(texture, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTextureLevelParameterEXT(int texture, int target, int level, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureLevelParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureLevelParameterivEXT(texture, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureLevelParameterivEXT(int texture, int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetTextureLevelParameterivEXT. */ + public static int glGetTextureLevelParameteriEXT(int texture, int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureLevelParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTextureLevelParameterivEXT(texture, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels, long function_pointer); + public static void glTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureImage3DEXTBO(texture, target, level, internalformat, width, height, depth, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureImage3DEXTBO(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels, long function_pointer); + public static void glTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTextureSubImage3DEXTBO(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTextureSubImage3DEXTBO(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glCopyTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height, function_pointer); + } + static native void nglCopyTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height, long function_pointer); + + public static void glBindMultiTextureEXT(int texunit, int target, int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindMultiTextureEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindMultiTextureEXT(texunit, target, texture, function_pointer); + } + static native void nglBindMultiTextureEXT(int texunit, int target, int texture, long function_pointer); + + public static void glMultiTexCoordPointerEXT(int texunit, int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglMultiTexCoordPointerEXT(texunit, size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glMultiTexCoordPointerEXT(int texunit, int size, int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglMultiTexCoordPointerEXT(texunit, size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglMultiTexCoordPointerEXT(int texunit, int size, int type, int stride, long pointer, long function_pointer); + public static void glMultiTexCoordPointerEXT(int texunit, int size, int type, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglMultiTexCoordPointerEXTBO(texunit, size, type, stride, pointer_buffer_offset, function_pointer); + } + static native void nglMultiTexCoordPointerEXTBO(int texunit, int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + public static void glMultiTexEnvfEXT(int texunit, int target, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexEnvfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexEnvfEXT(texunit, target, pname, param, function_pointer); + } + static native void nglMultiTexEnvfEXT(int texunit, int target, int pname, float param, long function_pointer); + + public static void glMultiTexEnvEXT(int texunit, int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexEnvfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexEnvfvEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexEnvfvEXT(int texunit, int target, int pname, long params, long function_pointer); + + public static void glMultiTexEnviEXT(int texunit, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexEnviEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexEnviEXT(texunit, target, pname, param, function_pointer); + } + static native void nglMultiTexEnviEXT(int texunit, int target, int pname, int param, long function_pointer); + + public static void glMultiTexEnvEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexEnvivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexEnvivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexEnvivEXT(int texunit, int target, int pname, long params, long function_pointer); + + public static void glMultiTexGendEXT(int texunit, int coord, int pname, double param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGendEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexGendEXT(texunit, coord, pname, param, function_pointer); + } + static native void nglMultiTexGendEXT(int texunit, int coord, int pname, double param, long function_pointer); + + public static void glMultiTexGenEXT(int texunit, int coord, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGendvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexGendvEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexGendvEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glMultiTexGenfEXT(int texunit, int coord, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGenfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexGenfEXT(texunit, coord, pname, param, function_pointer); + } + static native void nglMultiTexGenfEXT(int texunit, int coord, int pname, float param, long function_pointer); + + public static void glMultiTexGenEXT(int texunit, int coord, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGenfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexGenfvEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexGenfvEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glMultiTexGeniEXT(int texunit, int coord, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGeniEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexGeniEXT(texunit, coord, pname, param, function_pointer); + } + static native void nglMultiTexGeniEXT(int texunit, int coord, int pname, int param, long function_pointer); + + public static void glMultiTexGenEXT(int texunit, int coord, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexGenivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexGenivEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexGenivEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glGetMultiTexEnvEXT(int texunit, int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexEnvfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexEnvfvEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexEnvfvEXT(int texunit, int target, int pname, long params, long function_pointer); + + public static void glGetMultiTexEnvEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexEnvivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexEnvivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexEnvivEXT(int texunit, int target, int pname, long params, long function_pointer); + + public static void glGetMultiTexGenEXT(int texunit, int coord, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexGendvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexGendvEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexGendvEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glGetMultiTexGenEXT(int texunit, int coord, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexGenfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexGenfvEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexGenfvEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glGetMultiTexGenEXT(int texunit, int coord, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexGenivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexGenivEXT(texunit, coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexGenivEXT(int texunit, int coord, int pname, long params, long function_pointer); + + public static void glMultiTexParameteriEXT(int texunit, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameteriEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexParameteriEXT(texunit, target, pname, param, function_pointer); + } + static native void nglMultiTexParameteriEXT(int texunit, int target, int pname, int param, long function_pointer); + + public static void glMultiTexParameterEXT(int texunit, int target, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglMultiTexParameterivEXT(texunit, target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglMultiTexParameterivEXT(int texunit, int target, int pname, long param, long function_pointer); + + public static void glMultiTexParameterfEXT(int texunit, int target, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexParameterfEXT(texunit, target, pname, param, function_pointer); + } + static native void nglMultiTexParameterfEXT(int texunit, int target, int pname, float param, long function_pointer); + + public static void glMultiTexParameterEXT(int texunit, int target, int pname, FloatBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglMultiTexParameterfvEXT(texunit, target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglMultiTexParameterfvEXT(int texunit, int target, int pname, long param, long function_pointer); + + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, long pixels, long function_pointer); + public static void glMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexImage1DEXTBO(texunit, target, level, internalformat, width, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexImage1DEXTBO(int texunit, int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels, long function_pointer); + public static void glMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexImage2DEXTBO(texunit, target, level, internalformat, width, height, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexImage2DEXTBO(int texunit, int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, long pixels, long function_pointer); + public static void glMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexSubImage1DEXTBO(texunit, target, level, xoffset, width, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexSubImage1DEXTBO(int texunit, int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels, long function_pointer); + public static void glMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexSubImage2DEXTBO(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexSubImage2DEXTBO(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glCopyMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int x, int y, int width, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border, function_pointer); + } + static native void nglCopyMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int x, int y, int width, int border, long function_pointer); + + public static void glCopyMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int x, int y, int width, int height, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border, function_pointer); + } + static native void nglCopyMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int x, int y, int width, int height, int border, long function_pointer); + + public static void glCopyMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width, function_pointer); + } + static native void nglCopyMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int x, int y, int width, long function_pointer); + + public static void glCopyMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height, function_pointer); + } + static native void nglCopyMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int x, int y, int width, int height, long function_pointer); + + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetMultiTexImageEXT(texunit, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetMultiTexImageEXT(texunit, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetMultiTexImageEXT(texunit, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetMultiTexImageEXT(texunit, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetMultiTexImageEXT(texunit, target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, long pixels, long function_pointer); + public static void glGetMultiTexImageEXT(int texunit, int target, int level, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetMultiTexImageEXTBO(texunit, target, level, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglGetMultiTexImageEXTBO(int texunit, int target, int level, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glGetMultiTexParameterEXT(int texunit, int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexParameterfvEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexParameterfvEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexParameterfvEXT. */ + public static float glGetMultiTexParameterfEXT(int texunit, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetMultiTexParameterfvEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetMultiTexParameterEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexParameterivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexParameterivEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexParameterivEXT. */ + public static int glGetMultiTexParameteriEXT(int texunit, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetMultiTexParameterivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetMultiTexLevelParameterEXT(int texunit, int target, int level, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexLevelParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexLevelParameterfvEXT(int texunit, int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexLevelParameterfvEXT. */ + public static float glGetMultiTexLevelParameterfEXT(int texunit, int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexLevelParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetMultiTexLevelParameterEXT(int texunit, int target, int level, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexLevelParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexLevelParameterivEXT(texunit, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexLevelParameterivEXT(int texunit, int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexLevelParameterivEXT. */ + public static int glGetMultiTexLevelParameteriEXT(int texunit, int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexLevelParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetMultiTexLevelParameterivEXT(texunit, target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels, long function_pointer); + public static void glMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexImage3DEXTBO(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexImage3DEXTBO(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels, long function_pointer); + public static void glMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglMultiTexSubImage3DEXTBO(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglMultiTexSubImage3DEXTBO(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glCopyMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height, function_pointer); + } + static native void nglCopyMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height, long function_pointer); + + public static void glEnableClientStateIndexedEXT(int array, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableClientStateIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableClientStateIndexedEXT(array, index, function_pointer); + } + static native void nglEnableClientStateIndexedEXT(int array, int index, long function_pointer); + + public static void glDisableClientStateIndexedEXT(int array, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableClientStateIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableClientStateIndexedEXT(array, index, function_pointer); + } + static native void nglDisableClientStateIndexedEXT(int array, int index, long function_pointer); + + public static void glEnableClientStateiEXT(int array, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableClientStateiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableClientStateiEXT(array, index, function_pointer); + } + static native void nglEnableClientStateiEXT(int array, int index, long function_pointer); + + public static void glDisableClientStateiEXT(int array, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableClientStateiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableClientStateiEXT(array, index, function_pointer); + } + static native void nglDisableClientStateiEXT(int array, int index, long function_pointer); + + public static void glGetFloatIndexedEXT(int pname, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloatIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetFloatIndexedvEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFloatIndexedvEXT(int pname, int index, long params, long function_pointer); + + /** Overloads glGetFloatIndexedvEXT. */ + public static float glGetFloatIndexedEXT(int pname, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloatIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetFloatIndexedvEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetDoubleIndexedEXT(int pname, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoubleIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetDoubleIndexedvEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetDoubleIndexedvEXT(int pname, int index, long params, long function_pointer); + + /** Overloads glGetDoubleIndexedvEXT. */ + public static double glGetDoubleIndexedEXT(int pname, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoubleIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer params = APIUtil.getBufferDouble(caps); + nglGetDoubleIndexedvEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static ByteBuffer glGetPointerIndexedEXT(int pname, int index, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPointerIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetPointerIndexedvEXT(pname, index, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetPointerIndexedvEXT(int pname, int index, long result_size, long function_pointer); + + public static void glGetFloatEXT(int pname, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloati_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetFloati_vEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFloati_vEXT(int pname, int index, long params, long function_pointer); + + /** Overloads glGetFloati_vEXT. */ + public static float glGetFloatEXT(int pname, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloati_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetFloati_vEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetDoubleEXT(int pname, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublei_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetDoublei_vEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetDoublei_vEXT(int pname, int index, long params, long function_pointer); + + /** Overloads glGetDoublei_vEXT. */ + public static double glGetDoubleEXT(int pname, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublei_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer params = APIUtil.getBufferDouble(caps); + nglGetDoublei_vEXT(pname, index, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static ByteBuffer glGetPointerEXT(int pname, int index, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPointeri_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetPointeri_vEXT(pname, index, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetPointeri_vEXT(int pname, int index, long result_size, long function_pointer); + + public static void glEnableIndexedEXT(int cap, int index) { + EXTDrawBuffers2.glEnableIndexedEXT(cap, index); + } + + public static void glDisableIndexedEXT(int cap, int index) { + EXTDrawBuffers2.glDisableIndexedEXT(cap, index); + } + + public static boolean glIsEnabledIndexedEXT(int cap, int index) { + return EXTDrawBuffers2.glIsEnabledIndexedEXT(cap, index); + } + + public static void glGetIntegerIndexedEXT(int pname, int index, IntBuffer params) { + EXTDrawBuffers2.glGetIntegerIndexedEXT(pname, index, params); + } + + /** Overloads glGetIntegerIndexedvEXT. */ + public static int glGetIntegerIndexedEXT(int pname, int index) { + return EXTDrawBuffers2.glGetIntegerIndexedEXT(pname, index); + } + + public static void glGetBooleanIndexedEXT(int pname, int index, ByteBuffer params) { + EXTDrawBuffers2.glGetBooleanIndexedEXT(pname, index, params); + } + + /** Overloads glGetBooleanIndexedvEXT. */ + public static boolean glGetBooleanIndexedEXT(int pname, int index) { + return EXTDrawBuffers2.glGetBooleanIndexedEXT(pname, index); + } + + public static void glNamedProgramStringEXT(int program, int target, int format, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramStringEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglNamedProgramStringEXT(program, target, format, string.remaining(), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglNamedProgramStringEXT(int program, int target, int format, int string_len, long string, long function_pointer); + + /** Overloads glNamedProgramStringEXT. */ + public static void glNamedProgramStringEXT(int program, int target, int format, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramStringEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedProgramStringEXT(program, target, format, string.length(), APIUtil.getBuffer(caps, string), function_pointer); + } + + public static void glNamedProgramLocalParameter4dEXT(int program, int target, int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameter4dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w, function_pointer); + } + static native void nglNamedProgramLocalParameter4dEXT(int program, int target, int index, double x, double y, double z, double w, long function_pointer); + + public static void glNamedProgramLocalParameter4EXT(int program, int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameter4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglNamedProgramLocalParameter4dvEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParameter4dvEXT(int program, int target, int index, long params, long function_pointer); + + public static void glNamedProgramLocalParameter4fEXT(int program, int target, int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameter4fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w, function_pointer); + } + static native void nglNamedProgramLocalParameter4fEXT(int program, int target, int index, float x, float y, float z, float w, long function_pointer); + + public static void glNamedProgramLocalParameter4EXT(int program, int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameter4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglNamedProgramLocalParameter4fvEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParameter4fvEXT(int program, int target, int index, long params, long function_pointer); + + public static void glGetNamedProgramLocalParameterEXT(int program, int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramLocalParameterdvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedProgramLocalParameterdvEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedProgramLocalParameterdvEXT(int program, int target, int index, long params, long function_pointer); + + public static void glGetNamedProgramLocalParameterEXT(int program, int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramLocalParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedProgramLocalParameterfvEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedProgramLocalParameterfvEXT(int program, int target, int index, long params, long function_pointer); + + public static void glGetNamedProgramEXT(int program, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedProgramivEXT(program, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedProgramivEXT(int program, int target, int pname, long params, long function_pointer); + + /** Overloads glGetNamedProgramivEXT. */ + public static int glGetNamedProgramEXT(int program, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedProgramivEXT(program, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetNamedProgramStringEXT(int program, int target, int pname, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramStringEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglGetNamedProgramStringEXT(program, target, pname, MemoryUtil.getAddress(string), function_pointer); + } + static native void nglGetNamedProgramStringEXT(int program, int target, int pname, long string, long function_pointer); + + /** Overloads glGetNamedProgramStringEXT. */ + public static String glGetNamedProgramStringEXT(int program, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramStringEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int programLength = glGetNamedProgramEXT(program, target, ARBProgram.GL_PROGRAM_LENGTH_ARB); + ByteBuffer paramString = APIUtil.getBufferByte(caps, programLength); + nglGetNamedProgramStringEXT(program, target, pname, MemoryUtil.getAddress(paramString), function_pointer); + paramString.limit(programLength); + return APIUtil.getString(caps, paramString); + } + + public static void glCompressedTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureImage3DEXT(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureImage3DEXTBO(texture, target, level, internalformat, width, height, depth, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureImage3DEXTBO(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureImage2DEXT(int texture, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureImage2DEXTBO(texture, target, level, internalformat, width, height, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureImage2DEXTBO(int texture, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureImage1DEXT(int texture, int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureImage1DEXTBO(texture, target, level, internalformat, width, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureImage1DEXTBO(int texture, int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureSubImage3DEXT(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureSubImage3DEXTBO(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureSubImage3DEXTBO(int texture, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureSubImage2DEXT(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureSubImage2DEXTBO(texture, target, level, xoffset, yoffset, width, height, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureSubImage2DEXTBO(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTextureSubImage1DEXT(int texture, int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTextureSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTextureSubImage1DEXTBO(texture, target, level, xoffset, width, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTextureSubImage1DEXTBO(int texture, int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glGetCompressedTextureImageEXT(int texture, int target, int level, ByteBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTextureImageEXT(texture, target, level, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedTextureImageEXT(int texture, int target, int level, IntBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTextureImageEXT(texture, target, level, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedTextureImageEXT(int texture, int target, int level, ShortBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTextureImageEXT(texture, target, level, MemoryUtil.getAddress(img), function_pointer); + } + static native void nglGetCompressedTextureImageEXT(int texture, int target, int level, long img, long function_pointer); + public static void glGetCompressedTextureImageEXT(int texture, int target, int level, long img_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTextureImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetCompressedTextureImageEXTBO(texture, target, level, img_buffer_offset, function_pointer); + } + static native void nglGetCompressedTextureImageEXTBO(int texture, int target, int level, long img_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexImage3DEXT(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexImage3DEXTBO(texunit, target, level, internalformat, width, height, depth, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexImage3DEXTBO(int texunit, int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexImage2DEXT(int texunit, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexImage2DEXTBO(texunit, target, level, internalformat, width, height, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexImage2DEXTBO(int texunit, int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexImage1DEXT(int texunit, int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexImage1DEXTBO(texunit, target, level, internalformat, width, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexImage1DEXTBO(int texunit, int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexSubImage3DEXT(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexSubImage3DEXTBO(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexSubImage3DEXTBO(int texunit, int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexSubImage2DEXT(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexSubImage2DEXTBO(texunit, target, level, xoffset, yoffset, width, height, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexSubImage2DEXTBO(int texunit, int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedMultiTexSubImage1DEXT(int texunit, int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedMultiTexSubImage1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedMultiTexSubImage1DEXTBO(texunit, target, level, xoffset, width, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedMultiTexSubImage1DEXTBO(int texunit, int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glGetCompressedMultiTexImageEXT(int texunit, int target, int level, ByteBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedMultiTexImageEXT(texunit, target, level, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedMultiTexImageEXT(int texunit, int target, int level, IntBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedMultiTexImageEXT(texunit, target, level, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedMultiTexImageEXT(int texunit, int target, int level, ShortBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedMultiTexImageEXT(texunit, target, level, MemoryUtil.getAddress(img), function_pointer); + } + static native void nglGetCompressedMultiTexImageEXT(int texunit, int target, int level, long img, long function_pointer); + public static void glGetCompressedMultiTexImageEXT(int texunit, int target, int level, long img_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedMultiTexImageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetCompressedMultiTexImageEXTBO(texunit, target, level, img_buffer_offset, function_pointer); + } + static native void nglGetCompressedMultiTexImageEXTBO(int texunit, int target, int level, long img_buffer_offset, long function_pointer); + + public static void glMatrixLoadTransposeEXT(int matrixMode, FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixLoadTransposefEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixLoadTransposefEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixLoadTransposefEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixLoadTransposeEXT(int matrixMode, DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixLoadTransposedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixLoadTransposedEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixLoadTransposedEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixMultTransposeEXT(int matrixMode, FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixMultTransposefEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixMultTransposefEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixMultTransposefEXT(int matrixMode, long m, long function_pointer); + + public static void glMatrixMultTransposeEXT(int matrixMode, DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixMultTransposedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMatrixMultTransposedEXT(matrixMode, MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMatrixMultTransposedEXT(int matrixMode, long m, long function_pointer); + + public static void glNamedBufferDataEXT(int buffer, long data_size, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedBufferDataEXT(buffer, data_size, 0L, usage, function_pointer); + } + public static void glNamedBufferDataEXT(int buffer, ByteBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferDataEXT(buffer, data.remaining(), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glNamedBufferDataEXT(int buffer, DoubleBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferDataEXT(buffer, (data.remaining() << 3), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glNamedBufferDataEXT(int buffer, FloatBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferDataEXT(buffer, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glNamedBufferDataEXT(int buffer, IntBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferDataEXT(buffer, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glNamedBufferDataEXT(int buffer, ShortBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferDataEXT(buffer, (data.remaining() << 1), MemoryUtil.getAddress(data), usage, function_pointer); + } + static native void nglNamedBufferDataEXT(int buffer, long data_size, long data, int usage, long function_pointer); + + public static void glNamedBufferSubDataEXT(int buffer, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferSubDataEXT(buffer, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glNamedBufferSubDataEXT(int buffer, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glNamedBufferSubDataEXT(int buffer, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glNamedBufferSubDataEXT(int buffer, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glNamedBufferSubDataEXT(int buffer, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglNamedBufferSubDataEXT(int buffer, long offset, long data_size, long data, long function_pointer); + + /** + * glMapNamedBufferEXT maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapNamedBufferEXT like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapNamedBufferEXT(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapNamedBufferEXT(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetNamedBufferParameterEXT internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapNamedBufferEXT(int buffer, int access, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapNamedBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapNamedBufferEXT(buffer, access, GLChecks.getNamedBufferObjectSize(caps, buffer), old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + /** + * glMapNamedBufferEXT maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapNamedBufferEXT like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapNamedBufferEXT(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapNamedBufferEXT(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetNamedBufferParameterEXT internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapNamedBufferEXT(int buffer, int access, long length, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapNamedBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapNamedBufferEXT(buffer, access, length, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapNamedBufferEXT(int buffer, int access, long result_size, ByteBuffer old_buffer, long function_pointer); + + public static boolean glUnmapNamedBufferEXT(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnmapNamedBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglUnmapNamedBufferEXT(buffer, function_pointer); + return __result; + } + static native boolean nglUnmapNamedBufferEXT(int buffer, long function_pointer); + + public static void glGetNamedBufferParameterEXT(int buffer, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedBufferParameterivEXT(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedBufferParameterivEXT(int buffer, int pname, long params, long function_pointer); + + /** Overloads glGetNamedBufferParameterivEXT. */ + public static int glGetNamedBufferParameterEXT(int buffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedBufferParameterivEXT(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static ByteBuffer glGetNamedBufferPointerEXT(int buffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferPointervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetNamedBufferPointervEXT(buffer, pname, GLChecks.getNamedBufferObjectSize(caps, buffer), function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetNamedBufferPointervEXT(int buffer, int pname, long result_size, long function_pointer); + + public static void glGetNamedBufferSubDataEXT(int buffer, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetNamedBufferSubDataEXT(buffer, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetNamedBufferSubDataEXT(int buffer, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetNamedBufferSubDataEXT(int buffer, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetNamedBufferSubDataEXT(int buffer, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetNamedBufferSubDataEXT(int buffer, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetNamedBufferSubDataEXT(buffer, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetNamedBufferSubDataEXT(int buffer, long offset, long data_size, long data, long function_pointer); + + public static void glProgramUniform1fEXT(int program, int location, float v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1fEXT(program, location, v0, function_pointer); + } + static native void nglProgramUniform1fEXT(int program, int location, float v0, long function_pointer); + + public static void glProgramUniform2fEXT(int program, int location, float v0, float v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2fEXT(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2fEXT(int program, int location, float v0, float v1, long function_pointer); + + public static void glProgramUniform3fEXT(int program, int location, float v0, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3fEXT(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3fEXT(int program, int location, float v0, float v1, float v2, long function_pointer); + + public static void glProgramUniform4fEXT(int program, int location, float v0, float v1, float v2, float v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4fEXT(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4fEXT(int program, int location, float v0, float v1, float v2, float v3, long function_pointer); + + public static void glProgramUniform1iEXT(int program, int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1iEXT(program, location, v0, function_pointer); + } + static native void nglProgramUniform1iEXT(int program, int location, int v0, long function_pointer); + + public static void glProgramUniform2iEXT(int program, int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2iEXT(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2iEXT(int program, int location, int v0, int v1, long function_pointer); + + public static void glProgramUniform3iEXT(int program, int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3iEXT(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3iEXT(int program, int location, int v0, int v1, int v2, long function_pointer); + + public static void glProgramUniform4iEXT(int program, int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4iEXT(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4iEXT(int program, int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glProgramUniform1EXT(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1fvEXT(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1fvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2EXT(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2fvEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2fvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3EXT(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3fvEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3fvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4EXT(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4fvEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4fvEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform1EXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1ivEXT(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1ivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2EXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2ivEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2ivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3EXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3ivEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3ivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4EXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4ivEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4ivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniformMatrix2EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2fvEXT(program, location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3fvEXT(program, location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4fvEXT(program, location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x3EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x3fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x3fvEXT(program, location, value.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x3fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x2EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x2fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x2fvEXT(program, location, value.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x2fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x4EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x4fvEXT(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x4fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x2EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x2fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x2fvEXT(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x2fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x4EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x4fvEXT(program, location, value.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x4fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x3EXT(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x3fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x3fvEXT(program, location, value.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x3fvEXT(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glTextureBufferEXT(int texture, int target, int internalformat, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureBufferEXT(texture, target, internalformat, buffer, function_pointer); + } + static native void nglTextureBufferEXT(int texture, int target, int internalformat, int buffer, long function_pointer); + + public static void glMultiTexBufferEXT(int texunit, int target, int internalformat, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexBufferEXT(texunit, target, internalformat, buffer, function_pointer); + } + static native void nglMultiTexBufferEXT(int texunit, int target, int internalformat, int buffer, long function_pointer); + + public static void glTextureParameterIEXT(int texture, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTextureParameterIivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTextureParameterIivEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glTextureParameterIivEXT. */ + public static void glTextureParameterIEXT(int texture, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureParameterIivEXT(texture, target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glTextureParameterIuEXT(int texture, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTextureParameterIuivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTextureParameterIuivEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glTextureParameterIuivEXT. */ + public static void glTextureParameterIuEXT(int texture, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureParameterIuivEXT(texture, target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glGetTextureParameterIEXT(int texture, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureParameterIivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureParameterIivEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glGetTextureParameterIivEXT. */ + public static int glGetTextureParameterIiEXT(int texture, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTextureParameterIivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTextureParameterIuEXT(int texture, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTextureParameterIuivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTextureParameterIuivEXT(int texture, int target, int pname, long params, long function_pointer); + + /** Overloads glGetTextureParameterIuivEXT. */ + public static int glGetTextureParameterIuiEXT(int texture, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTextureParameterIuivEXT(texture, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glMultiTexParameterIEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexParameterIivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexParameterIivEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glMultiTexParameterIivEXT. */ + public static void glMultiTexParameterIEXT(int texunit, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexParameterIivEXT(texunit, target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glMultiTexParameterIuEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMultiTexParameterIuivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMultiTexParameterIuivEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glMultiTexParameterIuivEXT. */ + public static void glMultiTexParameterIuEXT(int texunit, int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexParameterIuivEXT(texunit, target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glGetMultiTexParameterIEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexParameterIivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexParameterIivEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexParameterIivEXT. */ + public static int glGetMultiTexParameterIiEXT(int texunit, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetMultiTexParameterIivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetMultiTexParameterIuEXT(int texunit, int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMultiTexParameterIuivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMultiTexParameterIuivEXT(int texunit, int target, int pname, long params, long function_pointer); + + /** Overloads glGetMultiTexParameterIuivEXT. */ + public static int glGetMultiTexParameterIuiEXT(int texunit, int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultiTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetMultiTexParameterIuivEXT(texunit, target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glProgramUniform1uiEXT(int program, int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1uiEXT(program, location, v0, function_pointer); + } + static native void nglProgramUniform1uiEXT(int program, int location, int v0, long function_pointer); + + public static void glProgramUniform2uiEXT(int program, int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2uiEXT(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2uiEXT(int program, int location, int v0, int v1, long function_pointer); + + public static void glProgramUniform3uiEXT(int program, int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3uiEXT(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3uiEXT(int program, int location, int v0, int v1, int v2, long function_pointer); + + public static void glProgramUniform4uiEXT(int program, int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4uiEXT(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4uiEXT(int program, int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glProgramUniform1uEXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1uivEXT(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1uivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2uEXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2uivEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2uivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3uEXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3uivEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3uivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4uEXT(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4uivEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4uivEXT(int program, int location, int value_count, long value, long function_pointer); + + public static void glNamedProgramLocalParameters4EXT(int program, int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameters4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglNamedProgramLocalParameters4fvEXT(program, target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParameters4fvEXT(int program, int target, int index, int params_count, long params, long function_pointer); + + public static void glNamedProgramLocalParameterI4iEXT(int program, int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameterI4iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w, function_pointer); + } + static native void nglNamedProgramLocalParameterI4iEXT(int program, int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glNamedProgramLocalParameterI4EXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameterI4ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglNamedProgramLocalParameterI4ivEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParameterI4ivEXT(int program, int target, int index, long params, long function_pointer); + + public static void glNamedProgramLocalParametersI4EXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParametersI4ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglNamedProgramLocalParametersI4ivEXT(program, target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParametersI4ivEXT(int program, int target, int index, int params_count, long params, long function_pointer); + + public static void glNamedProgramLocalParameterI4uiEXT(int program, int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameterI4uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w, function_pointer); + } + static native void nglNamedProgramLocalParameterI4uiEXT(int program, int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glNamedProgramLocalParameterI4uEXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParameterI4uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglNamedProgramLocalParameterI4uivEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParameterI4uivEXT(int program, int target, int index, long params, long function_pointer); + + public static void glNamedProgramLocalParametersI4uEXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedProgramLocalParametersI4uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglNamedProgramLocalParametersI4uivEXT(program, target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglNamedProgramLocalParametersI4uivEXT(int program, int target, int index, int params_count, long params, long function_pointer); + + public static void glGetNamedProgramLocalParameterIEXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramLocalParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedProgramLocalParameterIivEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedProgramLocalParameterIivEXT(int program, int target, int index, long params, long function_pointer); + + public static void glGetNamedProgramLocalParameterIuEXT(int program, int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedProgramLocalParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedProgramLocalParameterIuivEXT(program, target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedProgramLocalParameterIuivEXT(int program, int target, int index, long params, long function_pointer); + + public static void glNamedRenderbufferStorageEXT(int renderbuffer, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedRenderbufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height, function_pointer); + } + static native void nglNamedRenderbufferStorageEXT(int renderbuffer, int internalformat, int width, int height, long function_pointer); + + public static void glGetNamedRenderbufferParameterEXT(int renderbuffer, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedRenderbufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedRenderbufferParameterivEXT(renderbuffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedRenderbufferParameterivEXT(int renderbuffer, int pname, long params, long function_pointer); + + /** Overloads glGetNamedRenderbufferParameterivEXT. */ + public static int glGetNamedRenderbufferParameterEXT(int renderbuffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedRenderbufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedRenderbufferParameterivEXT(renderbuffer, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glNamedRenderbufferStorageMultisampleEXT(int renderbuffer, int samples, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedRenderbufferStorageMultisampleEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height, function_pointer); + } + static native void nglNamedRenderbufferStorageMultisampleEXT(int renderbuffer, int samples, int internalformat, int width, int height, long function_pointer); + + public static void glNamedRenderbufferStorageMultisampleCoverageEXT(int renderbuffer, int coverageSamples, int colorSamples, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedRenderbufferStorageMultisampleCoverageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height, function_pointer); + } + static native void nglNamedRenderbufferStorageMultisampleCoverageEXT(int renderbuffer, int coverageSamples, int colorSamples, int internalformat, int width, int height, long function_pointer); + + public static int glCheckNamedFramebufferStatusEXT(int framebuffer, int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCheckNamedFramebufferStatusEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCheckNamedFramebufferStatusEXT(framebuffer, target, function_pointer); + return __result; + } + static native int nglCheckNamedFramebufferStatusEXT(int framebuffer, int target, long function_pointer); + + public static void glNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTexture1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level, function_pointer); + } + static native void nglNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTexture2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level, function_pointer); + } + static native void nglNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTexture3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset, function_pointer); + } + static native void nglNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset, long function_pointer); + + public static void glNamedFramebufferRenderbufferEXT(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer, function_pointer); + } + static native void nglNamedFramebufferRenderbufferEXT(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer, long function_pointer); + + public static void glGetNamedFramebufferAttachmentParameterEXT(int framebuffer, int attachment, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedFramebufferAttachmentParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedFramebufferAttachmentParameterivEXT(int framebuffer, int attachment, int pname, long params, long function_pointer); + + /** Overloads glGetNamedFramebufferAttachmentParameterivEXT. */ + public static int glGetNamedFramebufferAttachmentParameterEXT(int framebuffer, int attachment, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedFramebufferAttachmentParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGenerateTextureMipmapEXT(int texture, int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenerateTextureMipmapEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglGenerateTextureMipmapEXT(texture, target, function_pointer); + } + static native void nglGenerateTextureMipmapEXT(int texture, int target, long function_pointer); + + public static void glGenerateMultiTexMipmapEXT(int texunit, int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenerateMultiTexMipmapEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglGenerateMultiTexMipmapEXT(texunit, target, function_pointer); + } + static native void nglGenerateMultiTexMipmapEXT(int texunit, int target, long function_pointer); + + public static void glFramebufferDrawBufferEXT(int framebuffer, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferDrawBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferDrawBufferEXT(framebuffer, mode, function_pointer); + } + static native void nglFramebufferDrawBufferEXT(int framebuffer, int mode, long function_pointer); + + public static void glFramebufferDrawBuffersEXT(int framebuffer, IntBuffer bufs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferDrawBuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(bufs); + nglFramebufferDrawBuffersEXT(framebuffer, bufs.remaining(), MemoryUtil.getAddress(bufs), function_pointer); + } + static native void nglFramebufferDrawBuffersEXT(int framebuffer, int bufs_n, long bufs, long function_pointer); + + public static void glFramebufferReadBufferEXT(int framebuffer, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferReadBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferReadBufferEXT(framebuffer, mode, function_pointer); + } + static native void nglFramebufferReadBufferEXT(int framebuffer, int mode, long function_pointer); + + public static void glGetFramebufferParameterEXT(int framebuffer, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglGetFramebufferParameterivEXT(framebuffer, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglGetFramebufferParameterivEXT(int framebuffer, int pname, long param, long function_pointer); + + /** Overloads glGetFramebufferParameterivEXT. */ + public static int glGetFramebufferParameterEXT(int framebuffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer param = APIUtil.getBufferInt(caps); + nglGetFramebufferParameterivEXT(framebuffer, pname, MemoryUtil.getAddress(param), function_pointer); + return param.get(0); + } + + public static void glNamedCopyBufferSubDataEXT(int readBuffer, int writeBuffer, long readoffset, long writeoffset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedCopyBufferSubDataEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedCopyBufferSubDataEXT(readBuffer, writeBuffer, readoffset, writeoffset, size, function_pointer); + } + static native void nglNamedCopyBufferSubDataEXT(int readBuffer, int writeBuffer, long readoffset, long writeoffset, long size, long function_pointer); + + public static void glNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTextureEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTextureEXT(framebuffer, attachment, texture, level, function_pointer); + } + static native void nglNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level, long function_pointer); + + public static void glNamedFramebufferTextureLayerEXT(int framebuffer, int attachment, int texture, int level, int layer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTextureLayerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer, function_pointer); + } + static native void nglNamedFramebufferTextureLayerEXT(int framebuffer, int attachment, int texture, int level, int layer, long function_pointer); + + public static void glNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNamedFramebufferTextureFaceEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face, function_pointer); + } + static native void nglNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face, long function_pointer); + + public static void glTextureRenderbufferEXT(int texture, int target, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureRenderbufferEXT(texture, target, renderbuffer, function_pointer); + } + static native void nglTextureRenderbufferEXT(int texture, int target, int renderbuffer, long function_pointer); + + public static void glMultiTexRenderbufferEXT(int texunit, int target, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexRenderbufferEXT(texunit, target, renderbuffer, function_pointer); + } + static native void nglMultiTexRenderbufferEXT(int texunit, int target, int renderbuffer, long function_pointer); + + public static void glVertexArrayVertexOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayVertexOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayVertexOffsetEXT(vaobj, buffer, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayVertexOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayColorOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayColorOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayColorOffsetEXT(vaobj, buffer, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayColorOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayEdgeFlagOffsetEXT(int vaobj, int buffer, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayEdgeFlagOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayEdgeFlagOffsetEXT(vaobj, buffer, stride, offset, function_pointer); + } + static native void nglVertexArrayEdgeFlagOffsetEXT(int vaobj, int buffer, int stride, long offset, long function_pointer); + + public static void glVertexArrayIndexOffsetEXT(int vaobj, int buffer, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayIndexOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayIndexOffsetEXT(vaobj, buffer, type, stride, offset, function_pointer); + } + static native void nglVertexArrayIndexOffsetEXT(int vaobj, int buffer, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayNormalOffsetEXT(int vaobj, int buffer, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayNormalOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayNormalOffsetEXT(vaobj, buffer, type, stride, offset, function_pointer); + } + static native void nglVertexArrayNormalOffsetEXT(int vaobj, int buffer, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayTexCoordOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayTexCoordOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayTexCoordOffsetEXT(vaobj, buffer, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayTexCoordOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayMultiTexCoordOffsetEXT(int vaobj, int buffer, int texunit, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayMultiTexCoordOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayMultiTexCoordOffsetEXT(vaobj, buffer, texunit, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayMultiTexCoordOffsetEXT(int vaobj, int buffer, int texunit, int size, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayFogCoordOffsetEXT(int vaobj, int buffer, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayFogCoordOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayFogCoordOffsetEXT(vaobj, buffer, type, stride, offset, function_pointer); + } + static native void nglVertexArrayFogCoordOffsetEXT(int vaobj, int buffer, int type, int stride, long offset, long function_pointer); + + public static void glVertexArraySecondaryColorOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArraySecondaryColorOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArraySecondaryColorOffsetEXT(vaobj, buffer, size, type, stride, offset, function_pointer); + } + static native void nglVertexArraySecondaryColorOffsetEXT(int vaobj, int buffer, int size, int type, int stride, long offset, long function_pointer); + + public static void glVertexArrayVertexAttribOffsetEXT(int vaobj, int buffer, int index, int size, int type, boolean normalized, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayVertexAttribOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset, function_pointer); + } + static native void nglVertexArrayVertexAttribOffsetEXT(int vaobj, int buffer, int index, int size, int type, boolean normalized, int stride, long offset, long function_pointer); + + public static void glVertexArrayVertexAttribIOffsetEXT(int vaobj, int buffer, int index, int size, int type, int stride, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayVertexAttribIOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset, function_pointer); + } + static native void nglVertexArrayVertexAttribIOffsetEXT(int vaobj, int buffer, int index, int size, int type, int stride, long offset, long function_pointer); + + public static void glEnableVertexArrayEXT(int vaobj, int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVertexArrayEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVertexArrayEXT(vaobj, array, function_pointer); + } + static native void nglEnableVertexArrayEXT(int vaobj, int array, long function_pointer); + + public static void glDisableVertexArrayEXT(int vaobj, int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVertexArrayEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVertexArrayEXT(vaobj, array, function_pointer); + } + static native void nglDisableVertexArrayEXT(int vaobj, int array, long function_pointer); + + public static void glEnableVertexArrayAttribEXT(int vaobj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVertexArrayAttribEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVertexArrayAttribEXT(vaobj, index, function_pointer); + } + static native void nglEnableVertexArrayAttribEXT(int vaobj, int index, long function_pointer); + + public static void glDisableVertexArrayAttribEXT(int vaobj, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVertexArrayAttribEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVertexArrayAttribEXT(vaobj, index, function_pointer); + } + static native void nglDisableVertexArrayAttribEXT(int vaobj, int index, long function_pointer); + + public static void glGetVertexArrayIntegerEXT(int vaobj, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayIntegervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 16); + nglGetVertexArrayIntegervEXT(vaobj, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglGetVertexArrayIntegervEXT(int vaobj, int pname, long param, long function_pointer); + + /** Overloads glGetVertexArrayIntegervEXT. */ + public static int glGetVertexArrayIntegerEXT(int vaobj, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayIntegervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer param = APIUtil.getBufferInt(caps); + nglGetVertexArrayIntegervEXT(vaobj, pname, MemoryUtil.getAddress(param), function_pointer); + return param.get(0); + } + + public static ByteBuffer glGetVertexArrayPointerEXT(int vaobj, int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayPointervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVertexArrayPointervEXT(vaobj, pname, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexArrayPointervEXT(int vaobj, int pname, long result_size, long function_pointer); + + public static void glGetVertexArrayIntegerEXT(int vaobj, int index, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayIntegeri_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 16); + nglGetVertexArrayIntegeri_vEXT(vaobj, index, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglGetVertexArrayIntegeri_vEXT(int vaobj, int index, int pname, long param, long function_pointer); + + /** Overloads glGetVertexArrayIntegeri_vEXT. */ + public static int glGetVertexArrayIntegeriEXT(int vaobj, int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayIntegeri_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer param = APIUtil.getBufferInt(caps); + nglGetVertexArrayIntegeri_vEXT(vaobj, index, pname, MemoryUtil.getAddress(param), function_pointer); + return param.get(0); + } + + public static ByteBuffer glGetVertexArrayPointeri_EXT(int vaobj, int index, int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexArrayPointeri_vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVertexArrayPointeri_vEXT(vaobj, index, pname, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexArrayPointeri_vEXT(int vaobj, int index, int pname, long result_size, long function_pointer); + + /** + * glMapNamedBufferRangeEXT maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapNamedBufferRangeEXT like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapNamedBufferRangeEXT(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapNamedBufferRangeEXT(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapNamedBufferRangeEXT(int buffer, long offset, long length, int access, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapNamedBufferRangeEXT; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapNamedBufferRangeEXT(buffer, offset, length, access, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapNamedBufferRangeEXT(int buffer, long offset, long length, int access, ByteBuffer old_buffer, long function_pointer); + + public static void glFlushMappedNamedBufferRangeEXT(int buffer, long offset, long length) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushMappedNamedBufferRangeEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlushMappedNamedBufferRangeEXT(buffer, offset, length, function_pointer); + } + static native void nglFlushMappedNamedBufferRangeEXT(int buffer, long offset, long length, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawBuffers2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawBuffers2.java new file mode 100644 index 0000000..ba2b9df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawBuffers2.java @@ -0,0 +1,82 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDrawBuffers2 { + + private EXTDrawBuffers2() {} + + public static void glColorMaskIndexedEXT(int buf, boolean r, boolean g, boolean b, boolean a) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorMaskIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorMaskIndexedEXT(buf, r, g, b, a, function_pointer); + } + static native void nglColorMaskIndexedEXT(int buf, boolean r, boolean g, boolean b, boolean a, long function_pointer); + + public static void glGetBooleanIndexedEXT(int value, int index, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleanIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 4); + nglGetBooleanIndexedvEXT(value, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetBooleanIndexedvEXT(int value, int index, long data, long function_pointer); + + /** Overloads glGetBooleanIndexedvEXT. */ + public static boolean glGetBooleanIndexedEXT(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleanIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer data = APIUtil.getBufferByte(caps, 1); + nglGetBooleanIndexedvEXT(value, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0) == 1; + } + + public static void glGetIntegerIndexedEXT(int value, int index, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 4); + nglGetIntegerIndexedvEXT(value, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetIntegerIndexedvEXT(int value, int index, long data, long function_pointer); + + /** Overloads glGetIntegerIndexedvEXT. */ + public static int glGetIntegerIndexedEXT(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerIndexedvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer data = APIUtil.getBufferInt(caps); + nglGetIntegerIndexedvEXT(value, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } + + public static void glEnableIndexedEXT(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableIndexedEXT(target, index, function_pointer); + } + static native void nglEnableIndexedEXT(int target, int index, long function_pointer); + + public static void glDisableIndexedEXT(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableIndexedEXT(target, index, function_pointer); + } + static native void nglDisableIndexedEXT(int target, int index, long function_pointer); + + public static boolean glIsEnabledIndexedEXT(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsEnabledIndexedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsEnabledIndexedEXT(target, index, function_pointer); + return __result; + } + static native boolean nglIsEnabledIndexedEXT(int target, int index, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawInstanced.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawInstanced.java new file mode 100644 index 0000000..72e7601 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawInstanced.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDrawInstanced { + + private EXTDrawInstanced() {} + + public static void glDrawArraysInstancedEXT(int mode, int first, int count, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysInstancedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawArraysInstancedEXT(mode, first, count, primcount, function_pointer); + } + static native void nglDrawArraysInstancedEXT(int mode, int first, int count, int primcount, long function_pointer); + + public static void glDrawElementsInstancedEXT(int mode, ByteBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstancedEXT(int mode, IntBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstancedEXT(int mode, ShortBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedEXT(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + static native void nglDrawElementsInstancedEXT(int mode, int indices_count, int type, long indices, int primcount, long function_pointer); + public static void glDrawElementsInstancedEXT(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedEXTBO(mode, indices_count, type, indices_buffer_offset, primcount, function_pointer); + } + static native void nglDrawElementsInstancedEXTBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawRangeElements.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawRangeElements.java new file mode 100644 index 0000000..4b2d792 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTDrawRangeElements.java @@ -0,0 +1,48 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDrawRangeElements { + + public static final int GL_MAX_ELEMENTS_VERTICES_EXT = 0x80E8, + GL_MAX_ELEMENTS_INDICES_EXT = 0x80E9; + + private EXTDrawRangeElements() {} + + public static void glDrawRangeElementsEXT(int mode, int start, int end, ByteBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(pIndices); + nglDrawRangeElementsEXT(mode, start, end, pIndices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(pIndices), function_pointer); + } + public static void glDrawRangeElementsEXT(int mode, int start, int end, IntBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(pIndices); + nglDrawRangeElementsEXT(mode, start, end, pIndices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(pIndices), function_pointer); + } + public static void glDrawRangeElementsEXT(int mode, int start, int end, ShortBuffer pIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(pIndices); + nglDrawRangeElementsEXT(mode, start, end, pIndices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(pIndices), function_pointer); + } + static native void nglDrawRangeElementsEXT(int mode, int start, int end, int pIndices_count, int type, long pIndices, long function_pointer); + public static void glDrawRangeElementsEXT(int mode, int start, int end, int pIndices_count, int type, long pIndices_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawRangeElementsEXTBO(mode, start, end, pIndices_count, type, pIndices_buffer_offset, function_pointer); + } + static native void nglDrawRangeElementsEXTBO(int mode, int start, int end, int pIndices_count, int type, long pIndices_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFogCoord.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFogCoord.java new file mode 100644 index 0000000..87bcee4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFogCoord.java @@ -0,0 +1,64 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFogCoord { + + public static final int GL_FOG_COORDINATE_SOURCE_EXT = 0x8450, + GL_FOG_COORDINATE_EXT = 0x8451, + GL_FRAGMENT_DEPTH_EXT = 0x8452, + GL_CURRENT_FOG_COORDINATE_EXT = 0x8453, + GL_FOG_COORDINATE_ARRAY_TYPE_EXT = 0x8454, + GL_FOG_COORDINATE_ARRAY_STRIDE_EXT = 0x8455, + GL_FOG_COORDINATE_ARRAY_POINTER_EXT = 0x8456, + GL_FOG_COORDINATE_ARRAY_EXT = 0x8457; + + private EXTFogCoord() {} + + public static void glFogCoordfEXT(float coord) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoordfEXT(coord, function_pointer); + } + static native void nglFogCoordfEXT(float coord, long function_pointer); + + public static void glFogCoorddEXT(double coord) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoorddEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoorddEXT(coord, function_pointer); + } + static native void nglFogCoorddEXT(double coord, long function_pointer); + + public static void glFogCoordPointerEXT(int stride, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_fog_coord_glFogCoordPointerEXT_data = data; + nglFogCoordPointerEXT(GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(data), function_pointer); + } + public static void glFogCoordPointerEXT(int stride, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_fog_coord_glFogCoordPointerEXT_data = data; + nglFogCoordPointerEXT(GL11.GL_FLOAT, stride, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglFogCoordPointerEXT(int type, int stride, long data, long function_pointer); + public static void glFogCoordPointerEXT(int type, int stride, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglFogCoordPointerEXTBO(type, stride, data_buffer_offset, function_pointer); + } + static native void nglFogCoordPointerEXTBO(int type, int stride, long data_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferBlit.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferBlit.java new file mode 100644 index 0000000..d7e8e1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferBlit.java @@ -0,0 +1,51 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFramebufferBlit { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebufferEXT, + * CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, + * FramebufferRenderbufferEXT, and + * GetFramebufferAttachmentParameterivEXT. + */ + public static final int GL_READ_FRAMEBUFFER_EXT = 0x8CA8, + GL_DRAW_FRAMEBUFFER_EXT = 0x8CA9; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_DRAW_FRAMEBUFFER_BINDING_EXT = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING_EXT = 0x8CAA; + + private EXTFramebufferBlit() {} + + /** + * Transfers a rectangle of pixel values from one + * region of the read framebuffer to another in the draw framebuffer. + * &lt;mask&gt; is the bitwise OR of a number of values indicating which + * buffers are to be copied. The values are COLOR_BUFFER_BIT, + * DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + * The pixels corresponding to these buffers are + * copied from the source rectangle, bound by the locations (srcX0, + * srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + * bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + * inclusive. + * If the source and destination rectangle dimensions do not match, + * the source image is stretched to fit the destination + * rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + * method of interpolation to be applied if the image is + * stretched. + */ + public static void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlitFramebufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, function_pointer); + } + static native void nglBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisample.java new file mode 100644 index 0000000..8bb3a29 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisample.java @@ -0,0 +1,39 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFramebufferMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT. + */ + public static final int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB; + + /** + * Returned by CheckFramebufferStatusEXT. + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_MAX_SAMPLES_EXT = 0x8D57; + + private EXTFramebufferMultisample() {} + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + public static void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderbufferStorageMultisampleEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height, function_pointer); + } + static native void nglRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java new file mode 100644 index 0000000..f742832 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferMultisampleBlitScaled.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFramebufferMultisampleBlitScaled { + + /** + * Accepted by the &lt;filter&gt; parameter of BlitFramebuffer: + */ + public static final int GL_SCALED_RESOLVE_FASTEST_EXT = 0x90BA, + GL_SCALED_RESOLVE_NICEST_EXT = 0x90BB; + + private EXTFramebufferMultisampleBlitScaled() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferObject.java new file mode 100644 index 0000000..e3957ce --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferObject.java @@ -0,0 +1,327 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFramebufferObject { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebufferEXT, + * CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, and + * FramebufferRenderbufferEXT: + */ + public static final int GL_FRAMEBUFFER_EXT = 0x8D40; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbufferEXT, + * RenderbufferStorageEXT, and GetRenderbufferParameterivEXT, and + * returned by GetFramebufferAttachmentParameterivEXT: + */ + public static final int GL_RENDERBUFFER_EXT = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT: + */ + public static final int GL_STENCIL_INDEX1_EXT = 0x8D46, + GL_STENCIL_INDEX4_EXT = 0x8D47, + GL_STENCIL_INDEX8_EXT = 0x8D48, + GL_STENCIL_INDEX16_EXT = 0x8D49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT: + */ + public static final int GL_RENDERBUFFER_WIDTH_EXT = 0x8D42, + GL_RENDERBUFFER_HEIGHT_EXT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE_EXT = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE_EXT = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE_EXT = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE_EXT = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE_EXT = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE_EXT = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = 0x8CD4; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}EXT, FramebufferRenderbufferEXT, and + * GetFramebufferAttachmentParameterivEXT + */ + public static final int GL_COLOR_ATTACHMENT0_EXT = 0x8CE0, + GL_COLOR_ATTACHMENT1_EXT = 0x8CE1, + GL_COLOR_ATTACHMENT2_EXT = 0x8CE2, + GL_COLOR_ATTACHMENT3_EXT = 0x8CE3, + GL_COLOR_ATTACHMENT4_EXT = 0x8CE4, + GL_COLOR_ATTACHMENT5_EXT = 0x8CE5, + GL_COLOR_ATTACHMENT6_EXT = 0x8CE6, + GL_COLOR_ATTACHMENT7_EXT = 0x8CE7, + GL_COLOR_ATTACHMENT8_EXT = 0x8CE8, + GL_COLOR_ATTACHMENT9_EXT = 0x8CE9, + GL_COLOR_ATTACHMENT10_EXT = 0x8CEA, + GL_COLOR_ATTACHMENT11_EXT = 0x8CEB, + GL_COLOR_ATTACHMENT12_EXT = 0x8CEC, + GL_COLOR_ATTACHMENT13_EXT = 0x8CED, + GL_COLOR_ATTACHMENT14_EXT = 0x8CEE, + GL_COLOR_ATTACHMENT15_EXT = 0x8CEF, + GL_DEPTH_ATTACHMENT_EXT = 0x8D00, + GL_STENCIL_ATTACHMENT_EXT = 0x8D20; + + /** + * Returned by CheckFramebufferStatusEXT(): + */ + public static final int GL_FRAMEBUFFER_COMPLETE_EXT = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = 0x8CD9, + GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = 0x8CDA, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED_EXT = 0x8CDD; + + /** + * Accepted by GetIntegerv(): + */ + public static final int GL_FRAMEBUFFER_BINDING_EXT = 0x8CA6, + GL_RENDERBUFFER_BINDING_EXT = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS_EXT = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE_EXT = 0x84E8; + + /** + * Returned by GetError(): + */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION_EXT = 0x506; + + private EXTFramebufferObject() {} + + public static boolean glIsRenderbufferEXT(int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsRenderbufferEXT(renderbuffer, function_pointer); + return __result; + } + static native boolean nglIsRenderbufferEXT(int renderbuffer, long function_pointer); + + public static void glBindRenderbufferEXT(int target, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindRenderbufferEXT(target, renderbuffer, function_pointer); + } + static native void nglBindRenderbufferEXT(int target, int renderbuffer, long function_pointer); + + public static void glDeleteRenderbuffersEXT(IntBuffer renderbuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteRenderbuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(renderbuffers); + nglDeleteRenderbuffersEXT(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers), function_pointer); + } + static native void nglDeleteRenderbuffersEXT(int renderbuffers_n, long renderbuffers, long function_pointer); + + /** Overloads glDeleteRenderbuffersEXT. */ + public static void glDeleteRenderbuffersEXT(int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteRenderbuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteRenderbuffersEXT(1, APIUtil.getInt(caps, renderbuffer), function_pointer); + } + + public static void glGenRenderbuffersEXT(IntBuffer renderbuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenRenderbuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(renderbuffers); + nglGenRenderbuffersEXT(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers), function_pointer); + } + static native void nglGenRenderbuffersEXT(int renderbuffers_n, long renderbuffers, long function_pointer); + + /** Overloads glGenRenderbuffersEXT. */ + public static int glGenRenderbuffersEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenRenderbuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer renderbuffers = APIUtil.getBufferInt(caps); + nglGenRenderbuffersEXT(1, MemoryUtil.getAddress(renderbuffers), function_pointer); + return renderbuffers.get(0); + } + + public static void glRenderbufferStorageEXT(int target, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderbufferStorageEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglRenderbufferStorageEXT(target, internalformat, width, height, function_pointer); + } + static native void nglRenderbufferStorageEXT(int target, int internalformat, int width, int height, long function_pointer); + + public static void glGetRenderbufferParameterEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetRenderbufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetRenderbufferParameterivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetRenderbufferParameterivEXT(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetRenderbufferParameterivEXT. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteriEXT} instead. + */ + @Deprecated + public static int glGetRenderbufferParameterEXT(int target, int pname) { + return EXTFramebufferObject.glGetRenderbufferParameteriEXT(target, pname); + } + + /** Overloads glGetRenderbufferParameterivEXT. */ + public static int glGetRenderbufferParameteriEXT(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetRenderbufferParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetRenderbufferParameterivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static boolean glIsFramebufferEXT(int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsFramebufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsFramebufferEXT(framebuffer, function_pointer); + return __result; + } + static native boolean nglIsFramebufferEXT(int framebuffer, long function_pointer); + + public static void glBindFramebufferEXT(int target, int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFramebufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFramebufferEXT(target, framebuffer, function_pointer); + } + static native void nglBindFramebufferEXT(int target, int framebuffer, long function_pointer); + + public static void glDeleteFramebuffersEXT(IntBuffer framebuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFramebuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(framebuffers); + nglDeleteFramebuffersEXT(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers), function_pointer); + } + static native void nglDeleteFramebuffersEXT(int framebuffers_n, long framebuffers, long function_pointer); + + /** Overloads glDeleteFramebuffersEXT. */ + public static void glDeleteFramebuffersEXT(int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFramebuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteFramebuffersEXT(1, APIUtil.getInt(caps, framebuffer), function_pointer); + } + + public static void glGenFramebuffersEXT(IntBuffer framebuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFramebuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(framebuffers); + nglGenFramebuffersEXT(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers), function_pointer); + } + static native void nglGenFramebuffersEXT(int framebuffers_n, long framebuffers, long function_pointer); + + /** Overloads glGenFramebuffersEXT. */ + public static int glGenFramebuffersEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFramebuffersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer framebuffers = APIUtil.getBufferInt(caps); + nglGenFramebuffersEXT(1, MemoryUtil.getAddress(framebuffers), function_pointer); + return framebuffers.get(0); + } + + public static int glCheckFramebufferStatusEXT(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCheckFramebufferStatusEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCheckFramebufferStatusEXT(target, function_pointer); + return __result; + } + static native int nglCheckFramebufferStatusEXT(int target, long function_pointer); + + public static void glFramebufferTexture1DEXT(int target, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture1DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture1DEXT(target, attachment, textarget, texture, level, function_pointer); + } + static native void nglFramebufferTexture1DEXT(int target, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glFramebufferTexture2DEXT(int target, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture2DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture2DEXT(target, attachment, textarget, texture, level, function_pointer); + } + static native void nglFramebufferTexture2DEXT(int target, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glFramebufferTexture3DEXT(int target, int attachment, int textarget, int texture, int level, int zoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture3DEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset, function_pointer); + } + static native void nglFramebufferTexture3DEXT(int target, int attachment, int textarget, int texture, int level, int zoffset, long function_pointer); + + public static void glFramebufferRenderbufferEXT(int target, int attachment, int renderbuffertarget, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferRenderbufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer, function_pointer); + } + static native void nglFramebufferRenderbufferEXT(int target, int attachment, int renderbuffertarget, int renderbuffer, long function_pointer); + + public static void glGetFramebufferAttachmentParameterEXT(int target, int attachment, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferAttachmentParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetFramebufferAttachmentParameterivEXT(target, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFramebufferAttachmentParameterivEXT(int target, int attachment, int pname, long params, long function_pointer); + + /** + * Overloads glGetFramebufferAttachmentParameterivEXT. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteriEXT} instead. + */ + @Deprecated + public static int glGetFramebufferAttachmentParameterEXT(int target, int attachment, int pname) { + return EXTFramebufferObject.glGetFramebufferAttachmentParameteriEXT(target, attachment, pname); + } + + /** Overloads glGetFramebufferAttachmentParameterivEXT. */ + public static int glGetFramebufferAttachmentParameteriEXT(int target, int attachment, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferAttachmentParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetFramebufferAttachmentParameterivEXT(target, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGenerateMipmapEXT(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenerateMipmapEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglGenerateMipmapEXT(target, function_pointer); + } + static native void nglGenerateMipmapEXT(int target, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferSRGB.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferSRGB.java new file mode 100644 index 0000000..f92b911 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTFramebufferSRGB.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTFramebufferSRGB { + + /** + * Accepted by the &lt;attribList&gt; parameter of glXChooseVisual, and by + * the &lt;attrib&gt; parameter of glXGetConfig: + */ + public static final int GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20B2; + + /** + * Accepted by the &lt;piAttributes&gt; parameter of + * wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and + * the &lt;piAttribIList&gt; and &lt;pfAttribIList&gt; of wglChoosePixelFormatEXT: + */ + public static final int WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20A9; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB_EXT = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x8DBA; + + private EXTFramebufferSRGB() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGeometryShader4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGeometryShader4.java new file mode 100644 index 0000000..1cd7f34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGeometryShader4.java @@ -0,0 +1,99 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTGeometryShader4 { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + public static final int GL_GEOMETRY_SHADER_EXT = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + public static final int GL_GEOMETRY_VERTICES_OUT_EXT = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE_EXT = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE_EXT = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT = 0x8C29, + GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT = 0x8DDD, + GL_MAX_VERTEX_VARYING_COMPONENTS_EXT = 0x8DDE, + GL_MAX_VARYING_COMPONENTS_EXT = 0x8B4B, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + public static final int GL_LINES_ADJACENCY_EXT = 0xA, + GL_LINE_STRIP_ADJACENCY_EXT = 0xB, + GL_TRIANGLES_ADJACENCY_EXT = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY_EXT = 0xD; + + /** + * Returned by CheckFramebufferStatusEXT: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT = 0x8DA8, + GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT = 0x8DA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT = 0x8DA7, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + public static final int GL_PROGRAM_POINT_SIZE_EXT = 0x8642; + + private EXTGeometryShader4() {} + + public static void glProgramParameteriEXT(int program, int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameteriEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramParameteriEXT(program, pname, value, function_pointer); + } + static native void nglProgramParameteriEXT(int program, int pname, int value, long function_pointer); + + public static void glFramebufferTextureEXT(int target, int attachment, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureEXT(target, attachment, texture, level, function_pointer); + } + static native void nglFramebufferTextureEXT(int target, int attachment, int texture, int level, long function_pointer); + + public static void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureLayerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureLayerEXT(target, attachment, texture, level, layer, function_pointer); + } + static native void nglFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer, long function_pointer); + + public static void glFramebufferTextureFaceEXT(int target, int attachment, int texture, int level, int face) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureFaceEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureFaceEXT(target, attachment, texture, level, face, function_pointer); + } + static native void nglFramebufferTextureFaceEXT(int target, int attachment, int texture, int level, int face, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuProgramParameters.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuProgramParameters.java new file mode 100644 index 0000000..955b8c9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuProgramParameters.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTGpuProgramParameters { + + private EXTGpuProgramParameters() {} + + public static void glProgramEnvParameters4EXT(int target, int index, int count, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameters4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, count << 2); + nglProgramEnvParameters4fvEXT(target, index, count, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParameters4fvEXT(int target, int index, int count, long params, long function_pointer); + + public static void glProgramLocalParameters4EXT(int target, int index, int count, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameters4fvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, count << 2); + nglProgramLocalParameters4fvEXT(target, index, count, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParameters4fvEXT(int target, int index, int count, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuShader4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuShader4.java new file mode 100644 index 0000000..cf738a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTGpuShader4.java @@ -0,0 +1,396 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTGpuShader4 { + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIivEXT, and + * GetVertexAttribIuivEXT: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT = 0x88FD; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1, + GL_SAMPLER_BUFFER_EXT = 0x8DC2, + GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4, + GL_SAMPLER_CUBE_SHADOW_EXT = 0x8DC5, + GL_UNSIGNED_INT_VEC2_EXT = 0x8DC6, + GL_UNSIGNED_INT_VEC3_EXT = 0x8DC7, + GL_UNSIGNED_INT_VEC4_EXT = 0x8DC8, + GL_INT_SAMPLER_1D_EXT = 0x8DC9, + GL_INT_SAMPLER_2D_EXT = 0x8DCA, + GL_INT_SAMPLER_3D_EXT = 0x8DCB, + GL_INT_SAMPLER_CUBE_EXT = 0x8DCC, + GL_INT_SAMPLER_2D_RECT_EXT = 0x8DCD, + GL_INT_SAMPLER_1D_ARRAY_EXT = 0x8DCE, + GL_INT_SAMPLER_2D_ARRAY_EXT = 0x8DCF, + GL_INT_SAMPLER_BUFFER_EXT = 0x8DD0, + GL_UNSIGNED_INT_SAMPLER_1D_EXT = 0x8DD1, + GL_UNSIGNED_INT_SAMPLER_2D_EXT = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D_EXT = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE_EXT = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT = 0x8DD5, + GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT = 0x8DD6, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT = 0x8DD7, + GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT = 0x8DD8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MIN_PROGRAM_TEXEL_OFFSET_EXT = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET_EXT = 0x8905; + + private EXTGpuShader4() {} + + public static void glVertexAttribI1iEXT(int index, int x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI1iEXT(index, x, function_pointer); + } + static native void nglVertexAttribI1iEXT(int index, int x, long function_pointer); + + public static void glVertexAttribI2iEXT(int index, int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI2iEXT(index, x, y, function_pointer); + } + static native void nglVertexAttribI2iEXT(int index, int x, int y, long function_pointer); + + public static void glVertexAttribI3iEXT(int index, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI3iEXT(index, x, y, z, function_pointer); + } + static native void nglVertexAttribI3iEXT(int index, int x, int y, int z, long function_pointer); + + public static void glVertexAttribI4iEXT(int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4iEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI4iEXT(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribI4iEXT(int index, int x, int y, int z, int w, long function_pointer); + + public static void glVertexAttribI1uiEXT(int index, int x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI1uiEXT(index, x, function_pointer); + } + static native void nglVertexAttribI1uiEXT(int index, int x, long function_pointer); + + public static void glVertexAttribI2uiEXT(int index, int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI2uiEXT(index, x, y, function_pointer); + } + static native void nglVertexAttribI2uiEXT(int index, int x, int y, long function_pointer); + + public static void glVertexAttribI3uiEXT(int index, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI3uiEXT(index, x, y, z, function_pointer); + } + static native void nglVertexAttribI3uiEXT(int index, int x, int y, int z, long function_pointer); + + public static void glVertexAttribI4uiEXT(int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI4uiEXT(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribI4uiEXT(int index, int x, int y, int z, int w, long function_pointer); + + public static void glVertexAttribI1EXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribI1ivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI1ivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI2EXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribI2ivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI2ivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI3EXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribI3ivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI3ivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4EXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4ivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4ivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4ivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI1uEXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribI1uivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI1uivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI2uEXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribI2uivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI2uivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI3uEXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribI3uivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI3uivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4uEXT(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4uivEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4uivEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4EXT(int index, ByteBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4bvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4bvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4bvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4EXT(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4svEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4svEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4svEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4uEXT(int index, ByteBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4ubvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4ubvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4ubvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribI4uEXT(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4usvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4usvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4usvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribIPointerEXT(int index, int size, int type, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointerEXT(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribIPointerEXT(int index, int size, int type, int stride, IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointerEXT(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribIPointerEXT(int index, int size, int type, int stride, ShortBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointerEXT(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglVertexAttribIPointerEXT(int index, int size, int type, int stride, long buffer, long function_pointer); + public static void glVertexAttribIPointerEXT(int index, int size, int type, int stride, long buffer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribIPointerEXTBO(index, size, type, stride, buffer_buffer_offset, function_pointer); + } + static native void nglVertexAttribIPointerEXTBO(int index, int size, int type, int stride, long buffer_buffer_offset, long function_pointer); + + public static void glGetVertexAttribIEXT(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIivEXT(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribIivEXT(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribIuEXT(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIuivEXT(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribIuivEXT(int index, int pname, long params, long function_pointer); + + public static void glUniform1uiEXT(int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1uiEXT(location, v0, function_pointer); + } + static native void nglUniform1uiEXT(int location, int v0, long function_pointer); + + public static void glUniform2uiEXT(int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2uiEXT(location, v0, v1, function_pointer); + } + static native void nglUniform2uiEXT(int location, int v0, int v1, long function_pointer); + + public static void glUniform3uiEXT(int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3uiEXT(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3uiEXT(int location, int v0, int v1, int v2, long function_pointer); + + public static void glUniform4uiEXT(int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4uiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4uiEXT(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4uiEXT(int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glUniform1uEXT(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform1uivEXT(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform1uivEXT(int location, int value_count, long value, long function_pointer); + + public static void glUniform2uEXT(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform2uivEXT(location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform2uivEXT(int location, int value_count, long value, long function_pointer); + + public static void glUniform3uEXT(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform3uivEXT(location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform3uivEXT(int location, int value_count, long value, long function_pointer); + + public static void glUniform4uEXT(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4uivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform4uivEXT(location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform4uivEXT(int location, int value_count, long value, long function_pointer); + + public static void glGetUniformuEXT(int program, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformuivEXT(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformuivEXT(int program, int location, long params, long function_pointer); + + public static void glBindFragDataLocationEXT(int program, int colorNumber, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocationEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindFragDataLocationEXT(program, colorNumber, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglBindFragDataLocationEXT(int program, int colorNumber, long name, long function_pointer); + + /** Overloads glBindFragDataLocationEXT. */ + public static void glBindFragDataLocationEXT(int program, int colorNumber, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocationEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFragDataLocationEXT(program, colorNumber, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static int glGetFragDataLocationEXT(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataLocationEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetFragDataLocationEXT(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetFragDataLocationEXT(int program, long name, long function_pointer); + + /** Overloads glGetFragDataLocationEXT. */ + public static int glGetFragDataLocationEXT(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataLocationEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetFragDataLocationEXT(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTMultiDrawArrays.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTMultiDrawArrays.java new file mode 100644 index 0000000..8ce01c0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTMultiDrawArrays.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMultiDrawArrays { + + private EXTMultiDrawArrays() {} + + public static void glMultiDrawArraysEXT(int mode, IntBuffer piFirst, IntBuffer piCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piFirst); + BufferChecks.checkBuffer(piCount, piFirst.remaining()); + nglMultiDrawArraysEXT(mode, MemoryUtil.getAddress(piFirst), MemoryUtil.getAddress(piCount), piFirst.remaining(), function_pointer); + } + static native void nglMultiDrawArraysEXT(int mode, long piFirst, long piCount, int piFirst_primcount, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedDepthStencil.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedDepthStencil.java new file mode 100644 index 0000000..9bfe978 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedDepthStencil.java @@ -0,0 +1,42 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPackedDepthStencil { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + * CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int GL_DEPTH_STENCIL_EXT = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8_EXT = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + public static final int GL_DEPTH24_STENCIL8_EXT = 0x88F0; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter. + */ + public static final int GL_TEXTURE_STENCIL_SIZE_EXT = 0x88F1; + + private EXTPackedDepthStencil() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedFloat.java new file mode 100644 index 0000000..7aae012 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedFloat.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPackedFloat { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT: + */ + public static final int GL_R11F_G11F_B10F_EXT = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_RGBA_SIGNED_COMPONENTS_EXT = 0x8C3C; + + /** + * Accepted as a value in the &lt;piAttribIList&gt; and &lt;pfAttribFList&gt; + * parameter arrays of wglChoosePixelFormatARB, and returned in the + * &lt;piValues&gt; parameter array of wglGetPixelFormatAttribivARB, and the + * &lt;pfValues&gt; parameter array of wglGetPixelFormatAttribfvARB: + */ + public static final int WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT = 0x20A8; + + /** + * Accepted as values of the &lt;render_type&gt; arguments in the + * glXCreateNewContext and glXCreateContext functions + */ + public static final int GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT = 0x20B1; + + /** + * Returned by glXGetFBConfigAttrib (when &lt;attribute&gt; is set to + * GLX_RENDER_TYPE) and accepted by the &lt;attrib_list&gt; parameter of + * glXChooseFBConfig (following the GLX_RENDER_TYPE token): + */ + public static final int GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT = 0x8; + + private EXTPackedFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedPixels.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedPixels.java new file mode 100644 index 0000000..32f06e0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPackedPixels.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPackedPixels { + + public static final int GL_UNSIGNED_BYTE_3_3_2_EXT = 0x8032, + GL_UNSIGNED_SHORT_4_4_4_4_EXT = 0x8033, + GL_UNSIGNED_SHORT_5_5_5_1_EXT = 0x8034, + GL_UNSIGNED_INT_8_8_8_8_EXT = 0x8035, + GL_UNSIGNED_INT_10_10_10_2_EXT = 0x8036; + + private EXTPackedPixels() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPalettedTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPalettedTexture.java new file mode 100644 index 0000000..1a6d712 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPalettedTexture.java @@ -0,0 +1,169 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPalettedTexture { + + /** + * Accepted by the internalformat parameter of TexImage1D, TexImage2D and + * TexImage3DEXT: + */ + public static final int GL_COLOR_INDEX1_EXT = 0x80E2, + GL_COLOR_INDEX2_EXT = 0x80E3, + GL_COLOR_INDEX4_EXT = 0x80E4, + GL_COLOR_INDEX8_EXT = 0x80E5, + GL_COLOR_INDEX12_EXT = 0x80E6, + GL_COLOR_INDEX16_EXT = 0x80E7; + + /** + * Accepted by the pname parameter of GetColorTableParameterivEXT and + * GetColorTableParameterfvEXT: + */ + public static final int GL_COLOR_TABLE_FORMAT_EXT = 0x80D8, + GL_COLOR_TABLE_WIDTH_EXT = 0x80D9, + GL_COLOR_TABLE_RED_SIZE_EXT = 0x80DA, + GL_COLOR_TABLE_GREEN_SIZE_EXT = 0x80DB, + GL_COLOR_TABLE_BLUE_SIZE_EXT = 0x80DC, + GL_COLOR_TABLE_ALPHA_SIZE_EXT = 0x80DD, + GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = 0x80DE, + GL_COLOR_TABLE_INTENSITY_SIZE_EXT = 0x80DF; + + /** + * Accepted by the value parameter of GetTexLevelParameter{if}v: + */ + public static final int GL_TEXTURE_INDEX_SIZE_EXT = 0x80ED; + + private EXTPalettedTexture() {} + + public static void glColorTableEXT(int target, int internalFormat, int width, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, width, 1, 1)); + nglColorTableEXT(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTableEXT(int target, int internalFormat, int width, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, width, 1, 1)); + nglColorTableEXT(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTableEXT(int target, int internalFormat, int width, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, width, 1, 1)); + nglColorTableEXT(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTableEXT(int target, int internalFormat, int width, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, width, 1, 1)); + nglColorTableEXT(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorTableEXT(int target, int internalFormat, int width, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, width, 1, 1)); + nglColorTableEXT(target, internalFormat, width, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglColorTableEXT(int target, int internalFormat, int width, int format, int type, long data, long function_pointer); + + public static void glColorSubTableEXT(int target, int start, int count, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, count, 1, 1)); + nglColorSubTableEXT(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTableEXT(int target, int start, int count, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, count, 1, 1)); + nglColorSubTableEXT(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTableEXT(int target, int start, int count, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, count, 1, 1)); + nglColorSubTableEXT(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTableEXT(int target, int start, int count, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, count, 1, 1)); + nglColorSubTableEXT(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glColorSubTableEXT(int target, int start, int count, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorSubTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, GLChecks.calculateImageStorage(data, format, type, count, 1, 1)); + nglColorSubTableEXT(target, start, count, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglColorSubTableEXT(int target, int start, int count, int format, int type, long data, long function_pointer); + + public static void glGetColorTableEXT(int target, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetColorTableEXT(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTableEXT(int target, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetColorTableEXT(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTableEXT(int target, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetColorTableEXT(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTableEXT(int target, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetColorTableEXT(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetColorTableEXT(int target, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetColorTableEXT(target, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetColorTableEXT(int target, int format, int type, long data, long function_pointer); + + public static void glGetColorTableParameterEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableParameterivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetColorTableParameterivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetColorTableParameterivEXT(int target, int pname, long params, long function_pointer); + + public static void glGetColorTableParameterEXT(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetColorTableParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetColorTableParameterfvEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetColorTableParameterfvEXT(int target, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPixelBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPixelBufferObject.java new file mode 100644 index 0000000..0da9472 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPixelBufferObject.java @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPixelBufferObject extends ARBBufferObject { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv: + */ + public static final int GL_PIXEL_PACK_BUFFER_EXT = 0x88EB, + GL_PIXEL_UNPACK_BUFFER_EXT = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PIXEL_PACK_BUFFER_BINDING_EXT = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = 0x88EF; + + private EXTPixelBufferObject() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPointParameters.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPointParameters.java new file mode 100644 index 0000000..0e6cff1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTPointParameters.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPointParameters { + + public static final int GL_POINT_SIZE_MIN_EXT = 0x8126, + GL_POINT_SIZE_MAX_EXT = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE_EXT = 0x8128, + GL_DISTANCE_ATTENUATION_EXT = 0x8129; + + private EXTPointParameters() {} + + public static void glPointParameterfEXT(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointParameterfEXT(pname, param, function_pointer); + } + static native void nglPointParameterfEXT(int pname, float param, long function_pointer); + + public static void glPointParameterEXT(int pname, FloatBuffer pfParams) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pfParams, 4); + nglPointParameterfvEXT(pname, MemoryUtil.getAddress(pfParams), function_pointer); + } + static native void nglPointParameterfvEXT(int pname, long pfParams, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTProvokingVertex.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTProvokingVertex.java new file mode 100644 index 0000000..efd8e9a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTProvokingVertex.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTProvokingVertex { + + /** + * Accepted by the &lt;mode&gt; parameter of ProvokingVertexEXT: + */ + public static final int GL_FIRST_VERTEX_CONVENTION_EXT = 0x8E4D, + GL_LAST_VERTEX_CONVENTION_EXT = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PROVOKING_VERTEX_EXT = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT = 0x8E4C; + + private EXTProvokingVertex() {} + + public static void glProvokingVertexEXT(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProvokingVertexEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglProvokingVertexEXT(mode, function_pointer); + } + static native void nglProvokingVertexEXT(int mode, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTRescaleNormal.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTRescaleNormal.java new file mode 100644 index 0000000..10fde6c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTRescaleNormal.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTRescaleNormal { + + public static final int GL_RESCALE_NORMAL_EXT = 0x803A; + + private EXTRescaleNormal() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSecondaryColor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSecondaryColor.java new file mode 100644 index 0000000..6ad057d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSecondaryColor.java @@ -0,0 +1,88 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSecondaryColor { + + public static final int GL_COLOR_SUM_EXT = 0x8458, + GL_CURRENT_SECONDARY_COLOR_EXT = 0x8459, + GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = 0x845A, + GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = 0x845B, + GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = 0x845C, + GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = 0x845D, + GL_SECONDARY_COLOR_ARRAY_EXT = 0x845E; + + private EXTSecondaryColor() {} + + public static void glSecondaryColor3bEXT(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3bEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3bEXT(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3bEXT(byte red, byte green, byte blue, long function_pointer); + + public static void glSecondaryColor3fEXT(float red, float green, float blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3fEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3fEXT(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3fEXT(float red, float green, float blue, long function_pointer); + + public static void glSecondaryColor3dEXT(double red, double green, double blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3dEXT(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3dEXT(double red, double green, double blue, long function_pointer); + + public static void glSecondaryColor3ubEXT(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3ubEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3ubEXT(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3ubEXT(byte red, byte green, byte blue, long function_pointer); + + public static void glSecondaryColorPointerEXT(int size, int stride, DoubleBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_secondary_color_glSecondaryColorPointerEXT_pPointer = pPointer; + nglSecondaryColorPointerEXT(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glSecondaryColorPointerEXT(int size, int stride, FloatBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_secondary_color_glSecondaryColorPointerEXT_pPointer = pPointer; + nglSecondaryColorPointerEXT(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glSecondaryColorPointerEXT(int size, boolean unsigned, int stride, ByteBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_secondary_color_glSecondaryColorPointerEXT_pPointer = pPointer; + nglSecondaryColorPointerEXT(size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglSecondaryColorPointerEXT(int size, int type, int stride, long pPointer, long function_pointer); + public static void glSecondaryColorPointerEXT(int size, int type, int stride, long pPointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglSecondaryColorPointerEXTBO(size, type, stride, pPointer_buffer_offset, function_pointer); + } + static native void nglSecondaryColorPointerEXTBO(int size, int type, int stride, long pPointer_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateShaderObjects.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateShaderObjects.java new file mode 100644 index 0000000..328d1fc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateShaderObjects.java @@ -0,0 +1,52 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSeparateShaderObjects { + + /** + * Accepted by &lt;type&gt; parameter to GetIntegerv and GetFloatv: + */ + public static final int GL_ACTIVE_PROGRAM_EXT = 0x8B8D; + + private EXTSeparateShaderObjects() {} + + public static void glUseShaderProgramEXT(int type, int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUseShaderProgramEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglUseShaderProgramEXT(type, program, function_pointer); + } + static native void nglUseShaderProgramEXT(int type, int program, long function_pointer); + + public static void glActiveProgramEXT(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveProgramEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveProgramEXT(program, function_pointer); + } + static native void nglActiveProgramEXT(int program, long function_pointer); + + public static int glCreateShaderProgramEXT(int type, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + BufferChecks.checkNullTerminated(string); + int __result = nglCreateShaderProgramEXT(type, MemoryUtil.getAddress(string), function_pointer); + return __result; + } + static native int nglCreateShaderProgramEXT(int type, long string, long function_pointer); + + /** Overloads glCreateShaderProgramEXT. */ + public static int glCreateShaderProgramEXT(int type, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateShaderProgramEXT(type, APIUtil.getBufferNT(caps, string), function_pointer); + return __result; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateSpecularColor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateSpecularColor.java new file mode 100644 index 0000000..a3931b8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSeparateSpecularColor.java @@ -0,0 +1,15 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSeparateSpecularColor { + + public static final int GL_SINGLE_COLOR_EXT = 0x81F9, + GL_SEPARATE_SPECULAR_COLOR_EXT = 0x81FA, + GL_LIGHT_MODEL_COLOR_CONTROL_EXT = 0x81F8; + + private EXTSeparateSpecularColor() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTShaderImageLoadStore.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTShaderImageLoadStore.java new file mode 100644 index 0000000..c6ca70c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTShaderImageLoadStore.java @@ -0,0 +1,99 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTShaderImageLoadStore { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_IMAGE_UNITS_EXT = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT = 0x8F39, + GL_MAX_IMAGE_SAMPLES_EXT = 0x906D; + + /** + * Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: + */ + public static final int GL_IMAGE_BINDING_NAME_EXT = 0x8F3A, + GL_IMAGE_BINDING_LEVEL_EXT = 0x8F3B, + GL_IMAGE_BINDING_LAYERED_EXT = 0x8F3C, + GL_IMAGE_BINDING_LAYER_EXT = 0x8F3D, + GL_IMAGE_BINDING_ACCESS_EXT = 0x8F3E, + GL_IMAGE_BINDING_FORMAT_EXT = 0x906E; + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrierEXT: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT_EXT = 0x2, + GL_UNIFORM_BARRIER_BIT_EXT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT_EXT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT = 0x20, + GL_COMMAND_BARRIER_BIT_EXT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT_EXT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT_EXT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT_EXT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT_EXT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT_EXT = 0x1000, + GL_ALL_BARRIER_BITS_EXT = 0xFFFFFFFF; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_IMAGE_1D_EXT = 0x904C, + GL_IMAGE_2D_EXT = 0x904D, + GL_IMAGE_3D_EXT = 0x904E, + GL_IMAGE_2D_RECT_EXT = 0x904F, + GL_IMAGE_CUBE_EXT = 0x9050, + GL_IMAGE_BUFFER_EXT = 0x9051, + GL_IMAGE_1D_ARRAY_EXT = 0x9052, + GL_IMAGE_2D_ARRAY_EXT = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY_EXT = 0x9054, + GL_IMAGE_2D_MULTISAMPLE_EXT = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9056, + GL_INT_IMAGE_1D_EXT = 0x9057, + GL_INT_IMAGE_2D_EXT = 0x9058, + GL_INT_IMAGE_3D_EXT = 0x9059, + GL_INT_IMAGE_2D_RECT_EXT = 0x905A, + GL_INT_IMAGE_CUBE_EXT = 0x905B, + GL_INT_IMAGE_BUFFER_EXT = 0x905C, + GL_INT_IMAGE_1D_ARRAY_EXT = 0x905D, + GL_INT_IMAGE_2D_ARRAY_EXT = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D_EXT = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D_EXT = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D_EXT = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE_EXT = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER_EXT = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x906C; + + private EXTShaderImageLoadStore() {} + + public static void glBindImageTextureEXT(int index, int texture, int level, boolean layered, int layer, int access, int format) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindImageTextureEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindImageTextureEXT(index, texture, level, layered, layer, access, format, function_pointer); + } + static native void nglBindImageTextureEXT(int index, int texture, int level, boolean layered, int layer, int access, int format, long function_pointer); + + public static void glMemoryBarrierEXT(int barriers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMemoryBarrierEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglMemoryBarrierEXT(barriers, function_pointer); + } + static native void nglMemoryBarrierEXT(int barriers, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSharedTexturePalette.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSharedTexturePalette.java new file mode 100644 index 0000000..94253e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTSharedTexturePalette.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSharedTexturePalette { + + public static final int GL_SHARED_TEXTURE_PALETTE_EXT = 0x81FB; + + private EXTSharedTexturePalette() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilClearTag.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilClearTag.java new file mode 100644 index 0000000..4f35b59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilClearTag.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTStencilClearTag { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_STENCIL_TAG_BITS_EXT = 0x88F2, + GL_STENCIL_CLEAR_TAG_VALUE_EXT = 0x88F3; + + private EXTStencilClearTag() {} + + /** + * Controls the stencil clear tag state. stencilTagBits is a count of + * the number of most-significant stencil buffer bits involved in the + * stencil clear tag update. + */ + public static void glStencilClearTagEXT(int stencilTagBits, int stencilClearTag) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilClearTagEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilClearTagEXT(stencilTagBits, stencilClearTag, function_pointer); + } + static native void nglStencilClearTagEXT(int stencilTagBits, int stencilClearTag, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilTwoSide.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilTwoSide.java new file mode 100644 index 0000000..f369300 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilTwoSide.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTStencilTwoSide { + + public static final int GL_STENCIL_TEST_TWO_SIDE_EXT = 0x8910, + GL_ACTIVE_STENCIL_FACE_EXT = 0x8911; + + private EXTStencilTwoSide() {} + + public static void glActiveStencilFaceEXT(int face) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveStencilFaceEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveStencilFaceEXT(face, function_pointer); + } + static native void nglActiveStencilFaceEXT(int face, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilWrap.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilWrap.java new file mode 100644 index 0000000..d6c2658 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTStencilWrap.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTStencilWrap { + + public static final int GL_INCR_WRAP_EXT = 0x8507, + GL_DECR_WRAP_EXT = 0x8508; + + private EXTStencilWrap() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureArray.java new file mode 100644 index 0000000..5375283 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureArray.java @@ -0,0 +1,64 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureArray { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + public static final int GL_TEXTURE_1D_ARRAY_EXT = 0x8C18, + GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY_EXT = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY_EXT = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_1D_ARRAY_EXT = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY_EXT = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = 0x88FF; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_ARB: + */ + public static final int GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT = 0x884E; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1, + GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4; + + private EXTTextureArray() {} + + public static void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) { + EXTGeometryShader4.glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureBufferObject.java new file mode 100644 index 0000000..8785e1e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureBufferObject.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureBufferObject { + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, BindTexture, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, GetBufferPointerv, and TexBufferEXT, and + * the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + public static final int GL_TEXTURE_BUFFER_EXT = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + public static final int GL_MAX_TEXTURE_BUFFER_SIZE_EXT = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER_EXT = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT = 0x8C2D, + GL_TEXTURE_BUFFER_FORMAT_EXT = 0x8C2E; + + private EXTTextureBufferObject() {} + + public static void glTexBufferEXT(int target, int internalformat, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBufferEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexBufferEXT(target, internalformat, buffer, function_pointer); + } + static native void nglTexBufferEXT(int target, int internalformat, int buffer, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionLATC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionLATC.java new file mode 100644 index 0000000..f908354 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionLATC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionLATC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_LUMINANCE_LATC1_EXT = 0x8C70, + GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = 0x8C71, + GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C72, + GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C73; + + private EXTTextureCompressionLATC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionRGTC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionRGTC.java new file mode 100644 index 0000000..994133f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionRGTC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionRGTC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_RED_RGTC1_EXT = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC, + GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD, + GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE; + + private EXTTextureCompressionRGTC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionS3TC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionS3TC.java new file mode 100644 index 0000000..cca79d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureCompressionS3TC.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionS3TC { + + public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + + private EXTTextureCompressionS3TC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvCombine.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvCombine.java new file mode 100644 index 0000000..f2401ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvCombine.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureEnvCombine { + + public static final int GL_COMBINE_EXT = 0x8570, + GL_COMBINE_RGB_EXT = 0x8571, + GL_COMBINE_ALPHA_EXT = 0x8572, + GL_SOURCE0_RGB_EXT = 0x8580, + GL_SOURCE1_RGB_EXT = 0x8581, + GL_SOURCE2_RGB_EXT = 0x8582, + GL_SOURCE0_ALPHA_EXT = 0x8588, + GL_SOURCE1_ALPHA_EXT = 0x8589, + GL_SOURCE2_ALPHA_EXT = 0x858A, + GL_OPERAND0_RGB_EXT = 0x8590, + GL_OPERAND1_RGB_EXT = 0x8591, + GL_OPERAND2_RGB_EXT = 0x8592, + GL_OPERAND0_ALPHA_EXT = 0x8598, + GL_OPERAND1_ALPHA_EXT = 0x8599, + GL_OPERAND2_ALPHA_EXT = 0x859A, + GL_RGB_SCALE_EXT = 0x8573, + GL_ADD_SIGNED_EXT = 0x8574, + GL_INTERPOLATE_EXT = 0x8575, + GL_CONSTANT_EXT = 0x8576, + GL_PRIMARY_COLOR_EXT = 0x8577, + GL_PREVIOUS_EXT = 0x8578; + + private EXTTextureEnvCombine() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvDot3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvDot3.java new file mode 100644 index 0000000..8a311de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureEnvDot3.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureEnvDot3 { + + public static final int GL_DOT3_RGB_EXT = 0x8740, + GL_DOT3_RGBA_EXT = 0x8741; + + private EXTTextureEnvDot3() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java new file mode 100644 index 0000000..8c0ddad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureFilterAnisotropic.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureFilterAnisotropic { + + public static final int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE, + GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; + + private EXTTextureFilterAnisotropic() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureInteger.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureInteger.java new file mode 100644 index 0000000..1d2a708 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureInteger.java @@ -0,0 +1,162 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureInteger { + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_RGBA_INTEGER_MODE_EXT = 0x8D9E; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA32UI_EXT = 0x8D70, + GL_RGB32UI_EXT = 0x8D71, + GL_ALPHA32UI_EXT = 0x8D72, + GL_INTENSITY32UI_EXT = 0x8D73, + GL_LUMINANCE32UI_EXT = 0x8D74, + GL_LUMINANCE_ALPHA32UI_EXT = 0x8D75, + GL_RGBA16UI_EXT = 0x8D76, + GL_RGB16UI_EXT = 0x8D77, + GL_ALPHA16UI_EXT = 0x8D78, + GL_INTENSITY16UI_EXT = 0x8D79, + GL_LUMINANCE16UI_EXT = 0x8D7A, + GL_LUMINANCE_ALPHA16UI_EXT = 0x8D7B, + GL_RGBA8UI_EXT = 0x8D7C, + GL_RGB8UI_EXT = 0x8D7D, + GL_ALPHA8UI_EXT = 0x8D7E, + GL_INTENSITY8UI_EXT = 0x8D7F, + GL_LUMINANCE8UI_EXT = 0x8D80, + GL_LUMINANCE_ALPHA8UI_EXT = 0x8D81, + GL_RGBA32I_EXT = 0x8D82, + GL_RGB32I_EXT = 0x8D83, + GL_ALPHA32I_EXT = 0x8D84, + GL_INTENSITY32I_EXT = 0x8D85, + GL_LUMINANCE32I_EXT = 0x8D86, + GL_LUMINANCE_ALPHA32I_EXT = 0x8D87, + GL_RGBA16I_EXT = 0x8D88, + GL_RGB16I_EXT = 0x8D89, + GL_ALPHA16I_EXT = 0x8D8A, + GL_INTENSITY16I_EXT = 0x8D8B, + GL_LUMINANCE16I_EXT = 0x8D8C, + GL_LUMINANCE_ALPHA16I_EXT = 0x8D8D, + GL_RGBA8I_EXT = 0x8D8E, + GL_RGB8I_EXT = 0x8D8F, + GL_ALPHA8I_EXT = 0x8D90, + GL_INTENSITY8I_EXT = 0x8D91, + GL_LUMINANCE8I_EXT = 0x8D92, + GL_LUMINANCE_ALPHA8I_EXT = 0x8D93; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + public static final int GL_RED_INTEGER_EXT = 0x8D94, + GL_GREEN_INTEGER_EXT = 0x8D95, + GL_BLUE_INTEGER_EXT = 0x8D96, + GL_ALPHA_INTEGER_EXT = 0x8D97, + GL_RGB_INTEGER_EXT = 0x8D98, + GL_RGBA_INTEGER_EXT = 0x8D99, + GL_BGR_INTEGER_EXT = 0x8D9A, + GL_BGRA_INTEGER_EXT = 0x8D9B, + GL_LUMINANCE_INTEGER_EXT = 0x8D9C, + GL_LUMINANCE_ALPHA_INTEGER_EXT = 0x8D9D; + + private EXTTextureInteger() {} + + public static void glClearColorIiEXT(int r, int g, int b, int a) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearColorIiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearColorIiEXT(r, g, b, a, function_pointer); + } + static native void nglClearColorIiEXT(int r, int g, int b, int a, long function_pointer); + + public static void glClearColorIuiEXT(int r, int g, int b, int a) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearColorIuiEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearColorIuiEXT(r, g, b, a, function_pointer); + } + static native void nglClearColorIuiEXT(int r, int g, int b, int a, long function_pointer); + + public static void glTexParameterIEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexParameterIivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexParameterIivEXT(int target, int pname, long params, long function_pointer); + + /** Overloads glTexParameterIivEXT. */ + public static void glTexParameterIiEXT(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameterIivEXT(target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glTexParameterIuEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexParameterIuivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexParameterIuivEXT(int target, int pname, long params, long function_pointer); + + /** Overloads glTexParameterIuivEXT. */ + public static void glTexParameterIuiEXT(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameterIuivEXT(target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glGetTexParameterIEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameterIivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameterIivEXT(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameterIivEXT. */ + public static int glGetTexParameterIiEXT(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexParameterIivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexParameterIuEXT(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameterIuivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameterIuivEXT(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameterIuivEXT. */ + public static int glGetTexParameterIuiEXT(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexParameterIuivEXT(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureLODBias.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureLODBias.java new file mode 100644 index 0000000..8be1000 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureLODBias.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureLODBias { + + /** + * Accepted by the &lt;target&gt; parameters of GetTexEnvfv, GetTexEnviv, + * TexEnvi, TexEnvf, Texenviv, and TexEnvfv: + */ + public static final int GL_TEXTURE_FILTER_CONTROL_EXT = 0x8500; + + /** + * When the &lt;target&gt; parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, + * TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL_EXT, then + * the value of &lt;pname&gt; may be: + */ + public static final int GL_TEXTURE_LOD_BIAS_EXT = 0x8501; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_TEXTURE_LOD_BIAS_EXT = 0x84FD; + + private EXTTextureLODBias() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureMirrorClamp.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureMirrorClamp.java new file mode 100644 index 0000000..edbeee3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureMirrorClamp.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureMirrorClamp { + + /** + * Accepted by the &lt;param&gt; parameter of TexParameteri and TexParameterf, + * and by the &lt;params&gt; parameter of TexParameteriv and TexParameterfv, + * when their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, + * or TEXTURE_WRAP_R: + */ + public static final int GL_MIRROR_CLAMP_EXT = 0x8742, + GL_MIRROR_CLAMP_TO_EDGE_EXT = 0x8743, + GL_MIRROR_CLAMP_TO_BORDER_EXT = 0x8912; + + private EXTTextureMirrorClamp() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureRectangle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureRectangle.java new file mode 100644 index 0000000..b9d8bb8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureRectangle.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureRectangle { + + public static final int GL_TEXTURE_RECTANGLE_EXT = 0x84F5, + GL_TEXTURE_BINDING_RECTANGLE_EXT = 0x84F6, + GL_PROXY_TEXTURE_RECTANGLE_EXT = 0x84F7, + GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT = 0x84F8; + + private EXTTextureRectangle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGB.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGB.java new file mode 100644 index 0000000..010ce33 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGB.java @@ -0,0 +1,38 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureSRGB { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D. + */ + public static final int GL_SRGB_EXT = 0x8C40, + GL_SRGB8_EXT = 0x8C41, + GL_SRGB_ALPHA_EXT = 0x8C42, + GL_SRGB8_ALPHA8_EXT = 0x8C43, + GL_SLUMINANCE_ALPHA_EXT = 0x8C44, + GL_SLUMINANCE8_ALPHA8_EXT = 0x8C45, + GL_SLUMINANCE_EXT = 0x8C46, + GL_SLUMINANCE8_EXT = 0x8C47, + GL_COMPRESSED_SRGB_EXT = 0x8C48, + GL_COMPRESSED_SRGB_ALPHA_EXT = 0x8C49, + GL_COMPRESSED_SLUMINANCE_EXT = 0x8C4A, + GL_COMPRESSED_SLUMINANCE_ALPHA_EXT = 0x8C4B; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2DARB and the &lt;format&gt; parameter + * of CompressedTexSubImage2DARB. + */ + public static final int GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E, + GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F; + + private EXTTextureSRGB() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGBDecode.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGBDecode.java new file mode 100644 index 0000000..4b0c71e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSRGBDecode.java @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureSRGBDecode { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * GetTexParameterfv, GetTexParameteriv, SamplerParameteri, + * SamplerParameterf, SamplerParameteriv, SamplerParameterfv, + * SamplerParameterIiv, SamplerParameterIuiv, GetSamplerParameteriv, + * GetSamplerParameterfv, GetSamplerParameterIiv, and GetSamplerParameterIuiv: + */ + public static final int GL_TEXTURE_SRGB_DECODE_EXT = 0x8A48; + + /** + * Accepted by the &lt;enum&gt; parameter of TexParameterf, TexParameteri, + * SamplerParameteri, SamplerParameterf, SamplerParameteriv, SamplerParameterfv, + * SamplerParameterIiv and SamplerParameterIuiv: + */ + public static final int GL_DECODE_EXT = 0x8A49, + GL_SKIP_DECODE_EXT = 0x8A4A; + + private EXTTextureSRGBDecode() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSharedExponent.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSharedExponent.java new file mode 100644 index 0000000..a0d23d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSharedExponent.java @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureSharedExponent { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT: + */ + public static final int GL_RGB9_E5_EXT = 0x8C3D; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + public static final int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = 0x8C3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + public static final int GL_TEXTURE_SHARED_SIZE_EXT = 0x8C3F; + + private EXTTextureSharedExponent() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSnorm.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSnorm.java new file mode 100644 index 0000000..cc2b769 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSnorm.java @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureSnorm { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RED_SNORM = 0x8F90, + GL_RG_SNORM = 0x8F91, + GL_RGB_SNORM = 0x8F92, + GL_RGBA_SNORM = 0x8F93, + GL_ALPHA_SNORM = 0x9010, + GL_LUMINANCE_SNORM = 0x9011, + GL_LUMINANCE_ALPHA_SNORM = 0x9012, + GL_INTENSITY_SNORM = 0x9013, + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_ALPHA8_SNORM = 0x9014, + GL_LUMINANCE8_SNORM = 0x9015, + GL_LUMINANCE8_ALPHA8_SNORM = 0x9016, + GL_INTENSITY8_SNORM = 0x9017, + GL_R16_SNORM = 0x8F98, + GL_RG16_SNORM = 0x8F99, + GL_RGB16_SNORM = 0x8F9A, + GL_RGBA16_SNORM = 0x8F9B, + GL_ALPHA16_SNORM = 0x9018, + GL_LUMINANCE16_SNORM = 0x9019, + GL_LUMINANCE16_ALPHA16_SNORM = 0x901A, + GL_INTENSITY16_SNORM = 0x901B; + + /** + * Returned by GetTexLevelParmeter + */ + public static final int GL_SIGNED_NORMALIZED = 0x8F9C; + + private EXTTextureSnorm() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSwizzle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSwizzle.java new file mode 100644 index 0000000..509e0b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTextureSwizzle.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureSwizzle { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_R_EXT = 0x8E42, + GL_TEXTURE_SWIZZLE_G_EXT = 0x8E43, + GL_TEXTURE_SWIZZLE_B_EXT = 0x8E44, + GL_TEXTURE_SWIZZLE_A_EXT = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_RGBA_EXT = 0x8E46; + + private EXTTextureSwizzle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTimerQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTimerQuery.java new file mode 100644 index 0000000..c23883f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTimerQuery.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTimerQuery { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_TIME_ELAPSED_EXT = 0x88BF; + + private EXTTimerQuery() {} + + public static void glGetQueryObjectEXT(int id, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjecti64vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjecti64vEXT(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjecti64vEXT(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjecti64vEXT. */ + public static long glGetQueryObjectEXT(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjecti64vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetQueryObjecti64vEXT(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObjectuEXT(int id, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectui64vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectui64vEXT(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectui64vEXT(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjectui64vEXT. */ + public static long glGetQueryObjectuEXT(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectui64vEXT; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetQueryObjectui64vEXT(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTransformFeedback.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTransformFeedback.java new file mode 100644 index 0000000..a0dfa7a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTTransformFeedback.java @@ -0,0 +1,154 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTransformFeedback { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRangeEXT, BindBufferOffsetEXT and + * BindBufferBaseEXT: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_EXT = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT = 0x8C85; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT = 0x8C8F; + + /** + * Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackVaryingsEXT: + */ + public static final int GL_INTERLEAVED_ATTRIBS_EXT = 0x8C8C, + GL_SEPARATE_ATTRIBS_EXT = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_PRIMITIVES_GENERATED_EXT = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_RASTERIZER_DISCARD_EXT = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT = 0x8C80; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_TRANSFORM_FEEDBACK_VARYINGS_EXT = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT = 0x8C7F, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT = 0x8C76; + + private EXTTransformFeedback() {} + + public static void glBindBufferRangeEXT(int target, int index, int buffer, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferRangeEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferRangeEXT(target, index, buffer, offset, size, function_pointer); + } + static native void nglBindBufferRangeEXT(int target, int index, int buffer, long offset, long size, long function_pointer); + + public static void glBindBufferOffsetEXT(int target, int index, int buffer, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferOffsetEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferOffsetEXT(target, index, buffer, offset, function_pointer); + } + static native void nglBindBufferOffsetEXT(int target, int index, int buffer, long offset, long function_pointer); + + public static void glBindBufferBaseEXT(int target, int index, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferBaseEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferBaseEXT(target, index, buffer, function_pointer); + } + static native void nglBindBufferBaseEXT(int target, int index, int buffer, long function_pointer); + + public static void glBeginTransformFeedbackEXT(int primitiveMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginTransformFeedbackEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginTransformFeedbackEXT(primitiveMode, function_pointer); + } + static native void nglBeginTransformFeedbackEXT(int primitiveMode, long function_pointer); + + public static void glEndTransformFeedbackEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndTransformFeedbackEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndTransformFeedbackEXT(function_pointer); + } + static native void nglEndTransformFeedbackEXT(long function_pointer); + + public static void glTransformFeedbackVaryingsEXT(int program, int count, ByteBuffer varyings, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackVaryingsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(varyings); + BufferChecks.checkNullTerminated(varyings, count); + nglTransformFeedbackVaryingsEXT(program, count, MemoryUtil.getAddress(varyings), bufferMode, function_pointer); + } + static native void nglTransformFeedbackVaryingsEXT(int program, int count, long varyings, int bufferMode, long function_pointer); + + /** Overloads glTransformFeedbackVaryingsEXT. */ + public static void glTransformFeedbackVaryingsEXT(int program, CharSequence[] varyings, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackVaryingsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(varyings); + nglTransformFeedbackVaryingsEXT(program, varyings.length, APIUtil.getBufferNT(caps, varyings), bufferMode, function_pointer); + } + + public static void glGetTransformFeedbackVaryingEXT(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVaryingEXT; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetTransformFeedbackVaryingEXT(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetTransformFeedbackVaryingEXT(int program, int index, int name_bufSize, long length, long size, long type, long name, long function_pointer); + + /** Overloads glGetTransformFeedbackVaryingEXT. */ + public static String glGetTransformFeedbackVaryingEXT(int program, int index, int bufSize, IntBuffer size, IntBuffer type) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVaryingEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufSize); + nglGetTransformFeedbackVaryingEXT(program, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexArrayBgra.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexArrayBgra.java new file mode 100644 index 0000000..498b95a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexArrayBgra.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTVertexArrayBgra { + + /** + * Accepted by the &lt;size&gt; parameter of ColorPointer, + * SecondaryColorPointer, and VertexAttribPointer: + */ + public static final int GL_BGRA = 0x80E1; + + private EXTVertexArrayBgra() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexAttrib64bit.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexAttrib64bit.java new file mode 100644 index 0000000..080f8e3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexAttrib64bit.java @@ -0,0 +1,127 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTVertexAttrib64bit { + + /** + * Returned in the &lt;type&gt; parameter of GetActiveAttrib: + */ + public static final int GL_DOUBLE_VEC2_EXT = 0x8FFC, + GL_DOUBLE_VEC3_EXT = 0x8FFD, + GL_DOUBLE_VEC4_EXT = 0x8FFE, + GL_DOUBLE_MAT2_EXT = 0x8F46, + GL_DOUBLE_MAT3_EXT = 0x8F47, + GL_DOUBLE_MAT4_EXT = 0x8F48, + GL_DOUBLE_MAT2x3_EXT = 0x8F49, + GL_DOUBLE_MAT2x4_EXT = 0x8F4A, + GL_DOUBLE_MAT3x2_EXT = 0x8F4B, + GL_DOUBLE_MAT3x4_EXT = 0x8F4C, + GL_DOUBLE_MAT4x2_EXT = 0x8F4D, + GL_DOUBLE_MAT4x3_EXT = 0x8F4E; + + private EXTVertexAttrib64bit() {} + + public static void glVertexAttribL1dEXT(int index, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL1dEXT(index, x, function_pointer); + } + static native void nglVertexAttribL1dEXT(int index, double x, long function_pointer); + + public static void glVertexAttribL2dEXT(int index, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL2dEXT(index, x, y, function_pointer); + } + static native void nglVertexAttribL2dEXT(int index, double x, double y, long function_pointer); + + public static void glVertexAttribL3dEXT(int index, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL3dEXT(index, x, y, z, function_pointer); + } + static native void nglVertexAttribL3dEXT(int index, double x, double y, double z, long function_pointer); + + public static void glVertexAttribL4dEXT(int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4dEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL4dEXT(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribL4dEXT(int index, double x, double y, double z, double w, long function_pointer); + + public static void glVertexAttribL1EXT(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribL1dvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL1dvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribL2EXT(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribL2dvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL2dvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribL3EXT(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribL3dvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL3dvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribL4EXT(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4dvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribL4dvEXT(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL4dvEXT(int index, long v, long function_pointer); + + public static void glVertexAttribLPointerEXT(int index, int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = pointer; + nglVertexAttribLPointerEXT(index, size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglVertexAttribLPointerEXT(int index, int size, int type, int stride, long pointer, long function_pointer); + public static void glVertexAttribLPointerEXT(int index, int size, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribLPointerEXTBO(index, size, GL11.GL_DOUBLE, stride, pointer_buffer_offset, function_pointer); + } + static native void nglVertexAttribLPointerEXTBO(int index, int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + public static void glGetVertexAttribLEXT(int index, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribLdvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribLdvEXT(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribLdvEXT(int index, int pname, long params, long function_pointer); + + public static void glVertexArrayVertexAttribLOffsetEXT(int vaobj, int buffer, int index, int size, int type, int stride, long offset) { + ARBVertexAttrib64bit.glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexShader.java new file mode 100644 index 0000000..8a130ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexShader.java @@ -0,0 +1,589 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTVertexShader { + + public static final int GL_VERTEX_SHADER_EXT = 0x8780, + GL_VERTEX_SHADER_BINDING_EXT = 0x8781, + GL_OP_INDEX_EXT = 0x8782, + GL_OP_NEGATE_EXT = 0x8783, + GL_OP_DOT3_EXT = 0x8784, + GL_OP_DOT4_EXT = 0x8785, + GL_OP_MUL_EXT = 0x8786, + GL_OP_ADD_EXT = 0x8787, + GL_OP_MADD_EXT = 0x8788, + GL_OP_FRAC_EXT = 0x8789, + GL_OP_MAX_EXT = 0x878A, + GL_OP_MIN_EXT = 0x878B, + GL_OP_SET_GE_EXT = 0x878C, + GL_OP_SET_LT_EXT = 0x878D, + GL_OP_CLAMP_EXT = 0x878E, + GL_OP_FLOOR_EXT = 0x878F, + GL_OP_ROUND_EXT = 0x8790, + GL_OP_EXP_BASE_2_EXT = 0x8791, + GL_OP_LOG_BASE_2_EXT = 0x8792, + GL_OP_POWER_EXT = 0x8793, + GL_OP_RECIP_EXT = 0x8794, + GL_OP_RECIP_SQRT_EXT = 0x8795, + GL_OP_SUB_EXT = 0x8796, + GL_OP_CROSS_PRODUCT_EXT = 0x8797, + GL_OP_MULTIPLY_MATRIX_EXT = 0x8798, + GL_OP_MOV_EXT = 0x8799, + GL_OUTPUT_VERTEX_EXT = 0x879A, + GL_OUTPUT_COLOR0_EXT = 0x879B, + GL_OUTPUT_COLOR1_EXT = 0x879C, + GL_OUTPUT_TEXTURE_COORD0_EXT = 0x879D, + GL_OUTPUT_TEXTURE_COORD1_EXT = 0x879E, + GL_OUTPUT_TEXTURE_COORD2_EXT = 0x879F, + GL_OUTPUT_TEXTURE_COORD3_EXT = 0x87A0, + GL_OUTPUT_TEXTURE_COORD4_EXT = 0x87A1, + GL_OUTPUT_TEXTURE_COORD5_EXT = 0x87A2, + GL_OUTPUT_TEXTURE_COORD6_EXT = 0x87A3, + GL_OUTPUT_TEXTURE_COORD7_EXT = 0x87A4, + GL_OUTPUT_TEXTURE_COORD8_EXT = 0x87A5, + GL_OUTPUT_TEXTURE_COORD9_EXT = 0x87A6, + GL_OUTPUT_TEXTURE_COORD10_EXT = 0x87A7, + GL_OUTPUT_TEXTURE_COORD11_EXT = 0x87A8, + GL_OUTPUT_TEXTURE_COORD12_EXT = 0x87A9, + GL_OUTPUT_TEXTURE_COORD13_EXT = 0x87AA, + GL_OUTPUT_TEXTURE_COORD14_EXT = 0x87AB, + GL_OUTPUT_TEXTURE_COORD15_EXT = 0x87AC, + GL_OUTPUT_TEXTURE_COORD16_EXT = 0x87AD, + GL_OUTPUT_TEXTURE_COORD17_EXT = 0x87AE, + GL_OUTPUT_TEXTURE_COORD18_EXT = 0x87AF, + GL_OUTPUT_TEXTURE_COORD19_EXT = 0x87B0, + GL_OUTPUT_TEXTURE_COORD20_EXT = 0x87B1, + GL_OUTPUT_TEXTURE_COORD21_EXT = 0x87B2, + GL_OUTPUT_TEXTURE_COORD22_EXT = 0x87B3, + GL_OUTPUT_TEXTURE_COORD23_EXT = 0x87B4, + GL_OUTPUT_TEXTURE_COORD24_EXT = 0x87B5, + GL_OUTPUT_TEXTURE_COORD25_EXT = 0x87B6, + GL_OUTPUT_TEXTURE_COORD26_EXT = 0x87B7, + GL_OUTPUT_TEXTURE_COORD27_EXT = 0x87B8, + GL_OUTPUT_TEXTURE_COORD28_EXT = 0x87B9, + GL_OUTPUT_TEXTURE_COORD29_EXT = 0x87BA, + GL_OUTPUT_TEXTURE_COORD30_EXT = 0x87BB, + GL_OUTPUT_TEXTURE_COORD31_EXT = 0x87BC, + GL_OUTPUT_FOG_EXT = 0x87BD, + GL_SCALAR_EXT = 0x87BE, + GL_VECTOR_EXT = 0x87BF, + GL_MATRIX_EXT = 0x87C0, + GL_VARIANT_EXT = 0x87C1, + GL_INVARIANT_EXT = 0x87C2, + GL_LOCAL_CONSTANT_EXT = 0x87C3, + GL_LOCAL_EXT = 0x87C4, + GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87C5, + GL_MAX_VERTEX_SHADER_VARIANTS_EXT = 0x87C6, + GL_MAX_VERTEX_SHADER_INVARIANTS_EXT = 0x87C7, + GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87C8, + GL_MAX_VERTEX_SHADER_LOCALS_EXT = 0x87C9, + GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87CA, + GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT = 0x87CB, + GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT = 0x87CC, + GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87CD, + GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT = 0x87CE, + GL_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87CF, + GL_VERTEX_SHADER_VARIANTS_EXT = 0x87D0, + GL_VERTEX_SHADER_INVARIANTS_EXT = 0x87D1, + GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87D2, + GL_VERTEX_SHADER_LOCALS_EXT = 0x87D3, + GL_VERTEX_SHADER_OPTIMIZED_EXT = 0x87D4, + GL_X_EXT = 0x87D5, + GL_Y_EXT = 0x87D6, + GL_Z_EXT = 0x87D7, + GL_W_EXT = 0x87D8, + GL_NEGATIVE_X_EXT = 0x87D9, + GL_NEGATIVE_Y_EXT = 0x87DA, + GL_NEGATIVE_Z_EXT = 0x87DB, + GL_NEGATIVE_W_EXT = 0x87DC, + GL_ZERO_EXT = 0x87DD, + GL_ONE_EXT = 0x87DE, + GL_NEGATIVE_ONE_EXT = 0x87DF, + GL_NORMALIZED_RANGE_EXT = 0x87E0, + GL_FULL_RANGE_EXT = 0x87E1, + GL_CURRENT_VERTEX_EXT = 0x87E2, + GL_MVP_MATRIX_EXT = 0x87E3, + GL_VARIANT_VALUE_EXT = 0x87E4, + GL_VARIANT_DATATYPE_EXT = 0x87E5, + GL_VARIANT_ARRAY_STRIDE_EXT = 0x87E6, + GL_VARIANT_ARRAY_TYPE_EXT = 0x87E7, + GL_VARIANT_ARRAY_EXT = 0x87E8, + GL_VARIANT_ARRAY_POINTER_EXT = 0x87E9, + GL_INVARIANT_VALUE_EXT = 0x87EA, + GL_INVARIANT_DATATYPE_EXT = 0x87EB, + GL_LOCAL_CONSTANT_VALUE_EXT = 0x87EC, + GL_LOCAL_CONSTANT_DATATYPE_EXT = 0x87ED; + + private EXTVertexShader() {} + + public static void glBeginVertexShaderEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginVertexShaderEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginVertexShaderEXT(function_pointer); + } + static native void nglBeginVertexShaderEXT(long function_pointer); + + public static void glEndVertexShaderEXT() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndVertexShaderEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndVertexShaderEXT(function_pointer); + } + static native void nglEndVertexShaderEXT(long function_pointer); + + public static void glBindVertexShaderEXT(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVertexShaderEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindVertexShaderEXT(id, function_pointer); + } + static native void nglBindVertexShaderEXT(int id, long function_pointer); + + public static int glGenVertexShadersEXT(int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenVertexShadersEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGenVertexShadersEXT(range, function_pointer); + return __result; + } + static native int nglGenVertexShadersEXT(int range, long function_pointer); + + public static void glDeleteVertexShaderEXT(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteVertexShaderEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteVertexShaderEXT(id, function_pointer); + } + static native void nglDeleteVertexShaderEXT(int id, long function_pointer); + + public static void glShaderOp1EXT(int op, int res, int arg1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderOp1EXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderOp1EXT(op, res, arg1, function_pointer); + } + static native void nglShaderOp1EXT(int op, int res, int arg1, long function_pointer); + + public static void glShaderOp2EXT(int op, int res, int arg1, int arg2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderOp2EXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderOp2EXT(op, res, arg1, arg2, function_pointer); + } + static native void nglShaderOp2EXT(int op, int res, int arg1, int arg2, long function_pointer); + + public static void glShaderOp3EXT(int op, int res, int arg1, int arg2, int arg3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderOp3EXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderOp3EXT(op, res, arg1, arg2, arg3, function_pointer); + } + static native void nglShaderOp3EXT(int op, int res, int arg1, int arg2, int arg3, long function_pointer); + + public static void glSwizzleEXT(int res, int in, int outX, int outY, int outZ, int outW) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSwizzleEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglSwizzleEXT(res, in, outX, outY, outZ, outW, function_pointer); + } + static native void nglSwizzleEXT(int res, int in, int outX, int outY, int outZ, int outW, long function_pointer); + + public static void glWriteMaskEXT(int res, int in, int outX, int outY, int outZ, int outW) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWriteMaskEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglWriteMaskEXT(res, in, outX, outY, outZ, outW, function_pointer); + } + static native void nglWriteMaskEXT(int res, int in, int outX, int outY, int outZ, int outW, long function_pointer); + + public static void glInsertComponentEXT(int res, int src, int num) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInsertComponentEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglInsertComponentEXT(res, src, num, function_pointer); + } + static native void nglInsertComponentEXT(int res, int src, int num, long function_pointer); + + public static void glExtractComponentEXT(int res, int src, int num) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glExtractComponentEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglExtractComponentEXT(res, src, num, function_pointer); + } + static native void nglExtractComponentEXT(int res, int src, int num, long function_pointer); + + public static int glGenSymbolsEXT(int dataType, int storageType, int range, int components) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenSymbolsEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGenSymbolsEXT(dataType, storageType, range, components, function_pointer); + return __result; + } + static native int nglGenSymbolsEXT(int dataType, int storageType, int range, int components, long function_pointer); + + public static void glSetInvariantEXT(int id, DoubleBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetInvariantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetInvariantEXT(id, GL11.GL_DOUBLE, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetInvariantEXT(int id, FloatBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetInvariantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetInvariantEXT(id, GL11.GL_FLOAT, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetInvariantEXT(int id, boolean unsigned, ByteBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetInvariantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetInvariantEXT(id, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetInvariantEXT(int id, boolean unsigned, IntBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetInvariantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetInvariantEXT(id, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetInvariantEXT(int id, boolean unsigned, ShortBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetInvariantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetInvariantEXT(id, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglSetInvariantEXT(int id, int type, long pAddr, long function_pointer); + + public static void glSetLocalConstantEXT(int id, DoubleBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetLocalConstantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetLocalConstantEXT(id, GL11.GL_DOUBLE, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetLocalConstantEXT(int id, FloatBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetLocalConstantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetLocalConstantEXT(id, GL11.GL_FLOAT, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetLocalConstantEXT(int id, boolean unsigned, ByteBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetLocalConstantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetLocalConstantEXT(id, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetLocalConstantEXT(int id, boolean unsigned, IntBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetLocalConstantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetLocalConstantEXT(id, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glSetLocalConstantEXT(int id, boolean unsigned, ShortBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetLocalConstantEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglSetLocalConstantEXT(id, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglSetLocalConstantEXT(int id, int type, long pAddr, long function_pointer); + + public static void glVariantEXT(int id, ByteBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantbvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantbvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantbvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantEXT(int id, ShortBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantsvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantsvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantsvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantEXT(int id, IntBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantivEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantivEXT(int id, long pAddr, long function_pointer); + + public static void glVariantEXT(int id, FloatBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantfvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantfvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantfvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantEXT(int id, DoubleBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantdvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantdvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantdvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantuEXT(int id, ByteBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantubvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantubvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantubvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantuEXT(int id, ShortBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantusvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantusvEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantusvEXT(int id, long pAddr, long function_pointer); + + public static void glVariantuEXT(int id, IntBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantuivEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pAddr, 4); + nglVariantuivEXT(id, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantuivEXT(int id, long pAddr, long function_pointer); + + public static void glVariantPointerEXT(int id, int stride, DoubleBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pAddr); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_shader_glVariantPointerEXT_pAddr = pAddr; + nglVariantPointerEXT(id, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glVariantPointerEXT(int id, int stride, FloatBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pAddr); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_shader_glVariantPointerEXT_pAddr = pAddr; + nglVariantPointerEXT(id, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glVariantPointerEXT(int id, boolean unsigned, int stride, ByteBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pAddr); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_shader_glVariantPointerEXT_pAddr = pAddr; + nglVariantPointerEXT(id, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glVariantPointerEXT(int id, boolean unsigned, int stride, IntBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pAddr); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_shader_glVariantPointerEXT_pAddr = pAddr; + nglVariantPointerEXT(id, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, stride, MemoryUtil.getAddress(pAddr), function_pointer); + } + public static void glVariantPointerEXT(int id, boolean unsigned, int stride, ShortBuffer pAddr) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pAddr); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_shader_glVariantPointerEXT_pAddr = pAddr; + nglVariantPointerEXT(id, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, stride, MemoryUtil.getAddress(pAddr), function_pointer); + } + static native void nglVariantPointerEXT(int id, int type, int stride, long pAddr, long function_pointer); + public static void glVariantPointerEXT(int id, int type, int stride, long pAddr_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVariantPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVariantPointerEXTBO(id, type, stride, pAddr_buffer_offset, function_pointer); + } + static native void nglVariantPointerEXTBO(int id, int type, int stride, long pAddr_buffer_offset, long function_pointer); + + public static void glEnableVariantClientStateEXT(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVariantClientStateEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVariantClientStateEXT(id, function_pointer); + } + static native void nglEnableVariantClientStateEXT(int id, long function_pointer); + + public static void glDisableVariantClientStateEXT(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVariantClientStateEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVariantClientStateEXT(id, function_pointer); + } + static native void nglDisableVariantClientStateEXT(int id, long function_pointer); + + public static int glBindLightParameterEXT(int light, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindLightParameterEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglBindLightParameterEXT(light, value, function_pointer); + return __result; + } + static native int nglBindLightParameterEXT(int light, int value, long function_pointer); + + public static int glBindMaterialParameterEXT(int face, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindMaterialParameterEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglBindMaterialParameterEXT(face, value, function_pointer); + return __result; + } + static native int nglBindMaterialParameterEXT(int face, int value, long function_pointer); + + public static int glBindTexGenParameterEXT(int unit, int coord, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTexGenParameterEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglBindTexGenParameterEXT(unit, coord, value, function_pointer); + return __result; + } + static native int nglBindTexGenParameterEXT(int unit, int coord, int value, long function_pointer); + + public static int glBindTextureUnitParameterEXT(int unit, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTextureUnitParameterEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglBindTextureUnitParameterEXT(unit, value, function_pointer); + return __result; + } + static native int nglBindTextureUnitParameterEXT(int unit, int value, long function_pointer); + + public static int glBindParameterEXT(int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindParameterEXT; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglBindParameterEXT(value, function_pointer); + return __result; + } + static native int nglBindParameterEXT(int value, long function_pointer); + + public static boolean glIsVariantEnabledEXT(int id, int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsVariantEnabledEXT; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsVariantEnabledEXT(id, cap, function_pointer); + return __result; + } + static native boolean nglIsVariantEnabledEXT(int id, int cap, long function_pointer); + + public static void glGetVariantBooleanEXT(int id, int value, ByteBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantBooleanvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetVariantBooleanvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetVariantBooleanvEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetVariantIntegerEXT(int id, int value, IntBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantIntegervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetVariantIntegervEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetVariantIntegervEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetVariantFloatEXT(int id, int value, FloatBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantFloatvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetVariantFloatvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetVariantFloatvEXT(int id, int value, long pbData, long function_pointer); + + public static ByteBuffer glGetVariantPointerEXT(int id, int value, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVariantPointervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVariantPointervEXT(id, value, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVariantPointervEXT(int id, int value, long result_size, long function_pointer); + + public static void glGetInvariantBooleanEXT(int id, int value, ByteBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInvariantBooleanvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetInvariantBooleanvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetInvariantBooleanvEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetInvariantIntegerEXT(int id, int value, IntBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInvariantIntegervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetInvariantIntegervEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetInvariantIntegervEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetInvariantFloatEXT(int id, int value, FloatBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInvariantFloatvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetInvariantFloatvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetInvariantFloatvEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetLocalConstantBooleanEXT(int id, int value, ByteBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetLocalConstantBooleanvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetLocalConstantBooleanvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetLocalConstantBooleanvEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetLocalConstantIntegerEXT(int id, int value, IntBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetLocalConstantIntegervEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetLocalConstantIntegervEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetLocalConstantIntegervEXT(int id, int value, long pbData, long function_pointer); + + public static void glGetLocalConstantFloatEXT(int id, int value, FloatBuffer pbData) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetLocalConstantFloatvEXT; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pbData, 4); + nglGetLocalConstantFloatvEXT(id, value, MemoryUtil.getAddress(pbData), function_pointer); + } + static native void nglGetLocalConstantFloatvEXT(int id, int value, long pbData, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexWeighting.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexWeighting.java new file mode 100644 index 0000000..de226cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/EXTVertexWeighting.java @@ -0,0 +1,52 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTVertexWeighting { + + public static final int GL_MODELVIEW0_STACK_DEPTH_EXT = 0xBA3, + GL_MODELVIEW1_STACK_DEPTH_EXT = 0x8502, + GL_MODELVIEW0_MATRIX_EXT = 0xBA6, + GL_MODELVIEW1_MATRIX_EXT = 0x8506, + GL_VERTEX_WEIGHTING_EXT = 0x8509, + GL_MODELVIEW0_EXT = 0x1700, + GL_MODELVIEW1_EXT = 0x850A, + GL_CURRENT_VERTEX_WEIGHT_EXT = 0x850B, + GL_VERTEX_WEIGHT_ARRAY_EXT = 0x850C, + GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT = 0x850D, + GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT = 0x850E, + GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT = 0x850F, + GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT = 0x8510; + + private EXTVertexWeighting() {} + + public static void glVertexWeightfEXT(float weight) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexWeightfEXT; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexWeightfEXT(weight, function_pointer); + } + static native void nglVertexWeightfEXT(float weight, long function_pointer); + + public static void glVertexWeightPointerEXT(int size, int stride, FloatBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexWeightPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pPointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).EXT_vertex_weighting_glVertexWeightPointerEXT_pPointer = pPointer; + nglVertexWeightPointerEXT(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglVertexWeightPointerEXT(int size, int type, int stride, long pPointer, long function_pointer); + public static void glVertexWeightPointerEXT(int size, int type, int stride, long pPointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexWeightPointerEXT; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexWeightPointerEXTBO(size, type, stride, pPointer_buffer_offset, function_pointer); + } + static native void nglVertexWeightPointerEXTBO(int size, int type, int stride, long pPointer_buffer_offset, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL11.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL11.java new file mode 100644 index 0000000..6c35f52 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL11.java @@ -0,0 +1,3267 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * The core OpenGL1.1 API. + * <p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class GL11 { + + public static final int GL_ACCUM = 0x100, + GL_LOAD = 0x101, + GL_RETURN = 0x102, + GL_MULT = 0x103, + GL_ADD = 0x104, + GL_NEVER = 0x200, + GL_LESS = 0x201, + GL_EQUAL = 0x202, + GL_LEQUAL = 0x203, + GL_GREATER = 0x204, + GL_NOTEQUAL = 0x205, + GL_GEQUAL = 0x206, + GL_ALWAYS = 0x207, + GL_CURRENT_BIT = 0x1, + GL_POINT_BIT = 0x2, + GL_LINE_BIT = 0x4, + GL_POLYGON_BIT = 0x8, + GL_POLYGON_STIPPLE_BIT = 0x10, + GL_PIXEL_MODE_BIT = 0x20, + GL_LIGHTING_BIT = 0x40, + GL_FOG_BIT = 0x80, + GL_DEPTH_BUFFER_BIT = 0x100, + GL_ACCUM_BUFFER_BIT = 0x200, + GL_STENCIL_BUFFER_BIT = 0x400, + GL_VIEWPORT_BIT = 0x800, + GL_TRANSFORM_BIT = 0x1000, + GL_ENABLE_BIT = 0x2000, + GL_COLOR_BUFFER_BIT = 0x4000, + GL_HINT_BIT = 0x8000, + GL_EVAL_BIT = 0x10000, + GL_LIST_BIT = 0x20000, + GL_TEXTURE_BIT = 0x40000, + GL_SCISSOR_BIT = 0x80000, + GL_ALL_ATTRIB_BITS = 0xFFFFF, + GL_POINTS = 0x0, + GL_LINES = 0x1, + GL_LINE_LOOP = 0x2, + GL_LINE_STRIP = 0x3, + GL_TRIANGLES = 0x4, + GL_TRIANGLE_STRIP = 0x5, + GL_TRIANGLE_FAN = 0x6, + GL_QUADS = 0x7, + GL_QUAD_STRIP = 0x8, + GL_POLYGON = 0x9, + GL_ZERO = 0x0, + GL_ONE = 0x1, + GL_SRC_COLOR = 0x300, + GL_ONE_MINUS_SRC_COLOR = 0x301, + GL_SRC_ALPHA = 0x302, + GL_ONE_MINUS_SRC_ALPHA = 0x303, + GL_DST_ALPHA = 0x304, + GL_ONE_MINUS_DST_ALPHA = 0x305, + GL_DST_COLOR = 0x306, + GL_ONE_MINUS_DST_COLOR = 0x307, + GL_SRC_ALPHA_SATURATE = 0x308, + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_TRUE = 0x1, + GL_FALSE = 0x0, + GL_CLIP_PLANE0 = 0x3000, + GL_CLIP_PLANE1 = 0x3001, + GL_CLIP_PLANE2 = 0x3002, + GL_CLIP_PLANE3 = 0x3003, + GL_CLIP_PLANE4 = 0x3004, + GL_CLIP_PLANE5 = 0x3005, + GL_BYTE = 0x1400, + GL_UNSIGNED_BYTE = 0x1401, + GL_SHORT = 0x1402, + GL_UNSIGNED_SHORT = 0x1403, + GL_INT = 0x1404, + GL_UNSIGNED_INT = 0x1405, + GL_FLOAT = 0x1406, + GL_2_BYTES = 0x1407, + GL_3_BYTES = 0x1408, + GL_4_BYTES = 0x1409, + GL_DOUBLE = 0x140A, + GL_NONE = 0x0, + GL_FRONT_LEFT = 0x400, + GL_FRONT_RIGHT = 0x401, + GL_BACK_LEFT = 0x402, + GL_BACK_RIGHT = 0x403, + GL_FRONT = 0x404, + GL_BACK = 0x405, + GL_LEFT = 0x406, + GL_RIGHT = 0x407, + GL_FRONT_AND_BACK = 0x408, + GL_AUX0 = 0x409, + GL_AUX1 = 0x40A, + GL_AUX2 = 0x40B, + GL_AUX3 = 0x40C, + GL_NO_ERROR = 0x0, + GL_INVALID_ENUM = 0x500, + GL_INVALID_VALUE = 0x501, + GL_INVALID_OPERATION = 0x502, + GL_STACK_OVERFLOW = 0x503, + GL_STACK_UNDERFLOW = 0x504, + GL_OUT_OF_MEMORY = 0x505, + GL_2D = 0x600, + GL_3D = 0x601, + GL_3D_COLOR = 0x602, + GL_3D_COLOR_TEXTURE = 0x603, + GL_4D_COLOR_TEXTURE = 0x604, + GL_PASS_THROUGH_TOKEN = 0x700, + GL_POINT_TOKEN = 0x701, + GL_LINE_TOKEN = 0x702, + GL_POLYGON_TOKEN = 0x703, + GL_BITMAP_TOKEN = 0x704, + GL_DRAW_PIXEL_TOKEN = 0x705, + GL_COPY_PIXEL_TOKEN = 0x706, + GL_LINE_RESET_TOKEN = 0x707, + GL_EXP = 0x800, + GL_EXP2 = 0x801, + GL_CW = 0x900, + GL_CCW = 0x901, + GL_COEFF = 0xA00, + GL_ORDER = 0xA01, + GL_DOMAIN = 0xA02, + GL_CURRENT_COLOR = 0xB00, + GL_CURRENT_INDEX = 0xB01, + GL_CURRENT_NORMAL = 0xB02, + GL_CURRENT_TEXTURE_COORDS = 0xB03, + GL_CURRENT_RASTER_COLOR = 0xB04, + GL_CURRENT_RASTER_INDEX = 0xB05, + GL_CURRENT_RASTER_TEXTURE_COORDS = 0xB06, + GL_CURRENT_RASTER_POSITION = 0xB07, + GL_CURRENT_RASTER_POSITION_VALID = 0xB08, + GL_CURRENT_RASTER_DISTANCE = 0xB09, + GL_POINT_SMOOTH = 0xB10, + GL_POINT_SIZE = 0xB11, + GL_POINT_SIZE_RANGE = 0xB12, + GL_POINT_SIZE_GRANULARITY = 0xB13, + GL_LINE_SMOOTH = 0xB20, + GL_LINE_WIDTH = 0xB21, + GL_LINE_WIDTH_RANGE = 0xB22, + GL_LINE_WIDTH_GRANULARITY = 0xB23, + GL_LINE_STIPPLE = 0xB24, + GL_LINE_STIPPLE_PATTERN = 0xB25, + GL_LINE_STIPPLE_REPEAT = 0xB26, + GL_LIST_MODE = 0xB30, + GL_MAX_LIST_NESTING = 0xB31, + GL_LIST_BASE = 0xB32, + GL_LIST_INDEX = 0xB33, + GL_POLYGON_MODE = 0xB40, + GL_POLYGON_SMOOTH = 0xB41, + GL_POLYGON_STIPPLE = 0xB42, + GL_EDGE_FLAG = 0xB43, + GL_CULL_FACE = 0xB44, + GL_CULL_FACE_MODE = 0xB45, + GL_FRONT_FACE = 0xB46, + GL_LIGHTING = 0xB50, + GL_LIGHT_MODEL_LOCAL_VIEWER = 0xB51, + GL_LIGHT_MODEL_TWO_SIDE = 0xB52, + GL_LIGHT_MODEL_AMBIENT = 0xB53, + GL_SHADE_MODEL = 0xB54, + GL_COLOR_MATERIAL_FACE = 0xB55, + GL_COLOR_MATERIAL_PARAMETER = 0xB56, + GL_COLOR_MATERIAL = 0xB57, + GL_FOG = 0xB60, + GL_FOG_INDEX = 0xB61, + GL_FOG_DENSITY = 0xB62, + GL_FOG_START = 0xB63, + GL_FOG_END = 0xB64, + GL_FOG_MODE = 0xB65, + GL_FOG_COLOR = 0xB66, + GL_DEPTH_RANGE = 0xB70, + GL_DEPTH_TEST = 0xB71, + GL_DEPTH_WRITEMASK = 0xB72, + GL_DEPTH_CLEAR_VALUE = 0xB73, + GL_DEPTH_FUNC = 0xB74, + GL_ACCUM_CLEAR_VALUE = 0xB80, + GL_STENCIL_TEST = 0xB90, + GL_STENCIL_CLEAR_VALUE = 0xB91, + GL_STENCIL_FUNC = 0xB92, + GL_STENCIL_VALUE_MASK = 0xB93, + GL_STENCIL_FAIL = 0xB94, + GL_STENCIL_PASS_DEPTH_FAIL = 0xB95, + GL_STENCIL_PASS_DEPTH_PASS = 0xB96, + GL_STENCIL_REF = 0xB97, + GL_STENCIL_WRITEMASK = 0xB98, + GL_MATRIX_MODE = 0xBA0, + GL_NORMALIZE = 0xBA1, + GL_VIEWPORT = 0xBA2, + GL_MODELVIEW_STACK_DEPTH = 0xBA3, + GL_PROJECTION_STACK_DEPTH = 0xBA4, + GL_TEXTURE_STACK_DEPTH = 0xBA5, + GL_MODELVIEW_MATRIX = 0xBA6, + GL_PROJECTION_MATRIX = 0xBA7, + GL_TEXTURE_MATRIX = 0xBA8, + GL_ATTRIB_STACK_DEPTH = 0xBB0, + GL_CLIENT_ATTRIB_STACK_DEPTH = 0xBB1, + GL_ALPHA_TEST = 0xBC0, + GL_ALPHA_TEST_FUNC = 0xBC1, + GL_ALPHA_TEST_REF = 0xBC2, + GL_DITHER = 0xBD0, + GL_BLEND_DST = 0xBE0, + GL_BLEND_SRC = 0xBE1, + GL_BLEND = 0xBE2, + GL_LOGIC_OP_MODE = 0xBF0, + GL_INDEX_LOGIC_OP = 0xBF1, + GL_COLOR_LOGIC_OP = 0xBF2, + GL_AUX_BUFFERS = 0xC00, + GL_DRAW_BUFFER = 0xC01, + GL_READ_BUFFER = 0xC02, + GL_SCISSOR_BOX = 0xC10, + GL_SCISSOR_TEST = 0xC11, + GL_INDEX_CLEAR_VALUE = 0xC20, + GL_INDEX_WRITEMASK = 0xC21, + GL_COLOR_CLEAR_VALUE = 0xC22, + GL_COLOR_WRITEMASK = 0xC23, + GL_INDEX_MODE = 0xC30, + GL_RGBA_MODE = 0xC31, + GL_DOUBLEBUFFER = 0xC32, + GL_STEREO = 0xC33, + GL_RENDER_MODE = 0xC40, + GL_PERSPECTIVE_CORRECTION_HINT = 0xC50, + GL_POINT_SMOOTH_HINT = 0xC51, + GL_LINE_SMOOTH_HINT = 0xC52, + GL_POLYGON_SMOOTH_HINT = 0xC53, + GL_FOG_HINT = 0xC54, + GL_TEXTURE_GEN_S = 0xC60, + GL_TEXTURE_GEN_T = 0xC61, + GL_TEXTURE_GEN_R = 0xC62, + GL_TEXTURE_GEN_Q = 0xC63, + GL_PIXEL_MAP_I_TO_I = 0xC70, + GL_PIXEL_MAP_S_TO_S = 0xC71, + GL_PIXEL_MAP_I_TO_R = 0xC72, + GL_PIXEL_MAP_I_TO_G = 0xC73, + GL_PIXEL_MAP_I_TO_B = 0xC74, + GL_PIXEL_MAP_I_TO_A = 0xC75, + GL_PIXEL_MAP_R_TO_R = 0xC76, + GL_PIXEL_MAP_G_TO_G = 0xC77, + GL_PIXEL_MAP_B_TO_B = 0xC78, + GL_PIXEL_MAP_A_TO_A = 0xC79, + GL_PIXEL_MAP_I_TO_I_SIZE = 0xCB0, + GL_PIXEL_MAP_S_TO_S_SIZE = 0xCB1, + GL_PIXEL_MAP_I_TO_R_SIZE = 0xCB2, + GL_PIXEL_MAP_I_TO_G_SIZE = 0xCB3, + GL_PIXEL_MAP_I_TO_B_SIZE = 0xCB4, + GL_PIXEL_MAP_I_TO_A_SIZE = 0xCB5, + GL_PIXEL_MAP_R_TO_R_SIZE = 0xCB6, + GL_PIXEL_MAP_G_TO_G_SIZE = 0xCB7, + GL_PIXEL_MAP_B_TO_B_SIZE = 0xCB8, + GL_PIXEL_MAP_A_TO_A_SIZE = 0xCB9, + GL_UNPACK_SWAP_BYTES = 0xCF0, + GL_UNPACK_LSB_FIRST = 0xCF1, + GL_UNPACK_ROW_LENGTH = 0xCF2, + GL_UNPACK_SKIP_ROWS = 0xCF3, + GL_UNPACK_SKIP_PIXELS = 0xCF4, + GL_UNPACK_ALIGNMENT = 0xCF5, + GL_PACK_SWAP_BYTES = 0xD00, + GL_PACK_LSB_FIRST = 0xD01, + GL_PACK_ROW_LENGTH = 0xD02, + GL_PACK_SKIP_ROWS = 0xD03, + GL_PACK_SKIP_PIXELS = 0xD04, + GL_PACK_ALIGNMENT = 0xD05, + GL_MAP_COLOR = 0xD10, + GL_MAP_STENCIL = 0xD11, + GL_INDEX_SHIFT = 0xD12, + GL_INDEX_OFFSET = 0xD13, + GL_RED_SCALE = 0xD14, + GL_RED_BIAS = 0xD15, + GL_ZOOM_X = 0xD16, + GL_ZOOM_Y = 0xD17, + GL_GREEN_SCALE = 0xD18, + GL_GREEN_BIAS = 0xD19, + GL_BLUE_SCALE = 0xD1A, + GL_BLUE_BIAS = 0xD1B, + GL_ALPHA_SCALE = 0xD1C, + GL_ALPHA_BIAS = 0xD1D, + GL_DEPTH_SCALE = 0xD1E, + GL_DEPTH_BIAS = 0xD1F, + GL_MAX_EVAL_ORDER = 0xD30, + GL_MAX_LIGHTS = 0xD31, + GL_MAX_CLIP_PLANES = 0xD32, + GL_MAX_TEXTURE_SIZE = 0xD33, + GL_MAX_PIXEL_MAP_TABLE = 0xD34, + GL_MAX_ATTRIB_STACK_DEPTH = 0xD35, + GL_MAX_MODELVIEW_STACK_DEPTH = 0xD36, + GL_MAX_NAME_STACK_DEPTH = 0xD37, + GL_MAX_PROJECTION_STACK_DEPTH = 0xD38, + GL_MAX_TEXTURE_STACK_DEPTH = 0xD39, + GL_MAX_VIEWPORT_DIMS = 0xD3A, + GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 0xD3B, + GL_SUBPIXEL_BITS = 0xD50, + GL_INDEX_BITS = 0xD51, + GL_RED_BITS = 0xD52, + GL_GREEN_BITS = 0xD53, + GL_BLUE_BITS = 0xD54, + GL_ALPHA_BITS = 0xD55, + GL_DEPTH_BITS = 0xD56, + GL_STENCIL_BITS = 0xD57, + GL_ACCUM_RED_BITS = 0xD58, + GL_ACCUM_GREEN_BITS = 0xD59, + GL_ACCUM_BLUE_BITS = 0xD5A, + GL_ACCUM_ALPHA_BITS = 0xD5B, + GL_NAME_STACK_DEPTH = 0xD70, + GL_AUTO_NORMAL = 0xD80, + GL_MAP1_COLOR_4 = 0xD90, + GL_MAP1_INDEX = 0xD91, + GL_MAP1_NORMAL = 0xD92, + GL_MAP1_TEXTURE_COORD_1 = 0xD93, + GL_MAP1_TEXTURE_COORD_2 = 0xD94, + GL_MAP1_TEXTURE_COORD_3 = 0xD95, + GL_MAP1_TEXTURE_COORD_4 = 0xD96, + GL_MAP1_VERTEX_3 = 0xD97, + GL_MAP1_VERTEX_4 = 0xD98, + GL_MAP2_COLOR_4 = 0xDB0, + GL_MAP2_INDEX = 0xDB1, + GL_MAP2_NORMAL = 0xDB2, + GL_MAP2_TEXTURE_COORD_1 = 0xDB3, + GL_MAP2_TEXTURE_COORD_2 = 0xDB4, + GL_MAP2_TEXTURE_COORD_3 = 0xDB5, + GL_MAP2_TEXTURE_COORD_4 = 0xDB6, + GL_MAP2_VERTEX_3 = 0xDB7, + GL_MAP2_VERTEX_4 = 0xDB8, + GL_MAP1_GRID_DOMAIN = 0xDD0, + GL_MAP1_GRID_SEGMENTS = 0xDD1, + GL_MAP2_GRID_DOMAIN = 0xDD2, + GL_MAP2_GRID_SEGMENTS = 0xDD3, + GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_2D = 0xDE1, + GL_FEEDBACK_BUFFER_POINTER = 0xDF0, + GL_FEEDBACK_BUFFER_SIZE = 0xDF1, + GL_FEEDBACK_BUFFER_TYPE = 0xDF2, + GL_SELECTION_BUFFER_POINTER = 0xDF3, + GL_SELECTION_BUFFER_SIZE = 0xDF4, + GL_TEXTURE_WIDTH = 0x1000, + GL_TEXTURE_HEIGHT = 0x1001, + GL_TEXTURE_INTERNAL_FORMAT = 0x1003, + GL_TEXTURE_BORDER_COLOR = 0x1004, + GL_TEXTURE_BORDER = 0x1005, + GL_DONT_CARE = 0x1100, + GL_FASTEST = 0x1101, + GL_NICEST = 0x1102, + GL_LIGHT0 = 0x4000, + GL_LIGHT1 = 0x4001, + GL_LIGHT2 = 0x4002, + GL_LIGHT3 = 0x4003, + GL_LIGHT4 = 0x4004, + GL_LIGHT5 = 0x4005, + GL_LIGHT6 = 0x4006, + GL_LIGHT7 = 0x4007, + GL_AMBIENT = 0x1200, + GL_DIFFUSE = 0x1201, + GL_SPECULAR = 0x1202, + GL_POSITION = 0x1203, + GL_SPOT_DIRECTION = 0x1204, + GL_SPOT_EXPONENT = 0x1205, + GL_SPOT_CUTOFF = 0x1206, + GL_CONSTANT_ATTENUATION = 0x1207, + GL_LINEAR_ATTENUATION = 0x1208, + GL_QUADRATIC_ATTENUATION = 0x1209, + GL_COMPILE = 0x1300, + GL_COMPILE_AND_EXECUTE = 0x1301, + GL_CLEAR = 0x1500, + GL_AND = 0x1501, + GL_AND_REVERSE = 0x1502, + GL_COPY = 0x1503, + GL_AND_INVERTED = 0x1504, + GL_NOOP = 0x1505, + GL_XOR = 0x1506, + GL_OR = 0x1507, + GL_NOR = 0x1508, + GL_EQUIV = 0x1509, + GL_INVERT = 0x150A, + GL_OR_REVERSE = 0x150B, + GL_COPY_INVERTED = 0x150C, + GL_OR_INVERTED = 0x150D, + GL_NAND = 0x150E, + GL_SET = 0x150F, + GL_EMISSION = 0x1600, + GL_SHININESS = 0x1601, + GL_AMBIENT_AND_DIFFUSE = 0x1602, + GL_COLOR_INDEXES = 0x1603, + GL_MODELVIEW = 0x1700, + GL_PROJECTION = 0x1701, + GL_TEXTURE = 0x1702, + GL_COLOR = 0x1800, + GL_DEPTH = 0x1801, + GL_STENCIL = 0x1802, + GL_COLOR_INDEX = 0x1900, + GL_STENCIL_INDEX = 0x1901, + GL_DEPTH_COMPONENT = 0x1902, + GL_RED = 0x1903, + GL_GREEN = 0x1904, + GL_BLUE = 0x1905, + GL_ALPHA = 0x1906, + GL_RGB = 0x1907, + GL_RGBA = 0x1908, + GL_LUMINANCE = 0x1909, + GL_LUMINANCE_ALPHA = 0x190A, + GL_BITMAP = 0x1A00, + GL_POINT = 0x1B00, + GL_LINE = 0x1B01, + GL_FILL = 0x1B02, + GL_RENDER = 0x1C00, + GL_FEEDBACK = 0x1C01, + GL_SELECT = 0x1C02, + GL_FLAT = 0x1D00, + GL_SMOOTH = 0x1D01, + GL_KEEP = 0x1E00, + GL_REPLACE = 0x1E01, + GL_INCR = 0x1E02, + GL_DECR = 0x1E03, + GL_VENDOR = 0x1F00, + GL_RENDERER = 0x1F01, + GL_VERSION = 0x1F02, + GL_EXTENSIONS = 0x1F03, + GL_S = 0x2000, + GL_T = 0x2001, + GL_R = 0x2002, + GL_Q = 0x2003, + GL_MODULATE = 0x2100, + GL_DECAL = 0x2101, + GL_TEXTURE_ENV_MODE = 0x2200, + GL_TEXTURE_ENV_COLOR = 0x2201, + GL_TEXTURE_ENV = 0x2300, + GL_EYE_LINEAR = 0x2400, + GL_OBJECT_LINEAR = 0x2401, + GL_SPHERE_MAP = 0x2402, + GL_TEXTURE_GEN_MODE = 0x2500, + GL_OBJECT_PLANE = 0x2501, + GL_EYE_PLANE = 0x2502, + GL_NEAREST = 0x2600, + GL_LINEAR = 0x2601, + GL_NEAREST_MIPMAP_NEAREST = 0x2700, + GL_LINEAR_MIPMAP_NEAREST = 0x2701, + GL_NEAREST_MIPMAP_LINEAR = 0x2702, + GL_LINEAR_MIPMAP_LINEAR = 0x2703, + GL_TEXTURE_MAG_FILTER = 0x2800, + GL_TEXTURE_MIN_FILTER = 0x2801, + GL_TEXTURE_WRAP_S = 0x2802, + GL_TEXTURE_WRAP_T = 0x2803, + GL_CLAMP = 0x2900, + GL_REPEAT = 0x2901, + GL_CLIENT_PIXEL_STORE_BIT = 0x1, + GL_CLIENT_VERTEX_ARRAY_BIT = 0x2, + GL_ALL_CLIENT_ATTRIB_BITS = 0xFFFFFFFF, + GL_POLYGON_OFFSET_FACTOR = 0x8038, + GL_POLYGON_OFFSET_UNITS = 0x2A00, + GL_POLYGON_OFFSET_POINT = 0x2A01, + GL_POLYGON_OFFSET_LINE = 0x2A02, + GL_POLYGON_OFFSET_FILL = 0x8037, + GL_ALPHA4 = 0x803B, + GL_ALPHA8 = 0x803C, + GL_ALPHA12 = 0x803D, + GL_ALPHA16 = 0x803E, + GL_LUMINANCE4 = 0x803F, + GL_LUMINANCE8 = 0x8040, + GL_LUMINANCE12 = 0x8041, + GL_LUMINANCE16 = 0x8042, + GL_LUMINANCE4_ALPHA4 = 0x8043, + GL_LUMINANCE6_ALPHA2 = 0x8044, + GL_LUMINANCE8_ALPHA8 = 0x8045, + GL_LUMINANCE12_ALPHA4 = 0x8046, + GL_LUMINANCE12_ALPHA12 = 0x8047, + GL_LUMINANCE16_ALPHA16 = 0x8048, + GL_INTENSITY = 0x8049, + GL_INTENSITY4 = 0x804A, + GL_INTENSITY8 = 0x804B, + GL_INTENSITY12 = 0x804C, + GL_INTENSITY16 = 0x804D, + GL_R3_G3_B2 = 0x2A10, + GL_RGB4 = 0x804F, + GL_RGB5 = 0x8050, + GL_RGB8 = 0x8051, + GL_RGB10 = 0x8052, + GL_RGB12 = 0x8053, + GL_RGB16 = 0x8054, + GL_RGBA2 = 0x8055, + GL_RGBA4 = 0x8056, + GL_RGB5_A1 = 0x8057, + GL_RGBA8 = 0x8058, + GL_RGB10_A2 = 0x8059, + GL_RGBA12 = 0x805A, + GL_RGBA16 = 0x805B, + GL_TEXTURE_RED_SIZE = 0x805C, + GL_TEXTURE_GREEN_SIZE = 0x805D, + GL_TEXTURE_BLUE_SIZE = 0x805E, + GL_TEXTURE_ALPHA_SIZE = 0x805F, + GL_TEXTURE_LUMINANCE_SIZE = 0x8060, + GL_TEXTURE_INTENSITY_SIZE = 0x8061, + GL_PROXY_TEXTURE_1D = 0x8063, + GL_PROXY_TEXTURE_2D = 0x8064, + GL_TEXTURE_PRIORITY = 0x8066, + GL_TEXTURE_RESIDENT = 0x8067, + GL_TEXTURE_BINDING_1D = 0x8068, + GL_TEXTURE_BINDING_2D = 0x8069, + GL_VERTEX_ARRAY = 0x8074, + GL_NORMAL_ARRAY = 0x8075, + GL_COLOR_ARRAY = 0x8076, + GL_INDEX_ARRAY = 0x8077, + GL_TEXTURE_COORD_ARRAY = 0x8078, + GL_EDGE_FLAG_ARRAY = 0x8079, + GL_VERTEX_ARRAY_SIZE = 0x807A, + GL_VERTEX_ARRAY_TYPE = 0x807B, + GL_VERTEX_ARRAY_STRIDE = 0x807C, + GL_NORMAL_ARRAY_TYPE = 0x807E, + GL_NORMAL_ARRAY_STRIDE = 0x807F, + GL_COLOR_ARRAY_SIZE = 0x8081, + GL_COLOR_ARRAY_TYPE = 0x8082, + GL_COLOR_ARRAY_STRIDE = 0x8083, + GL_INDEX_ARRAY_TYPE = 0x8085, + GL_INDEX_ARRAY_STRIDE = 0x8086, + GL_TEXTURE_COORD_ARRAY_SIZE = 0x8088, + GL_TEXTURE_COORD_ARRAY_TYPE = 0x8089, + GL_TEXTURE_COORD_ARRAY_STRIDE = 0x808A, + GL_EDGE_FLAG_ARRAY_STRIDE = 0x808C, + GL_VERTEX_ARRAY_POINTER = 0x808E, + GL_NORMAL_ARRAY_POINTER = 0x808F, + GL_COLOR_ARRAY_POINTER = 0x8090, + GL_INDEX_ARRAY_POINTER = 0x8091, + GL_TEXTURE_COORD_ARRAY_POINTER = 0x8092, + GL_EDGE_FLAG_ARRAY_POINTER = 0x8093, + GL_V2F = 0x2A20, + GL_V3F = 0x2A21, + GL_C4UB_V2F = 0x2A22, + GL_C4UB_V3F = 0x2A23, + GL_C3F_V3F = 0x2A24, + GL_N3F_V3F = 0x2A25, + GL_C4F_N3F_V3F = 0x2A26, + GL_T2F_V3F = 0x2A27, + GL_T4F_V4F = 0x2A28, + GL_T2F_C4UB_V3F = 0x2A29, + GL_T2F_C3F_V3F = 0x2A2A, + GL_T2F_N3F_V3F = 0x2A2B, + GL_T2F_C4F_N3F_V3F = 0x2A2C, + GL_T4F_C4F_N3F_V4F = 0x2A2D, + GL_LOGIC_OP = 0xBF1, + GL_TEXTURE_COMPONENTS = 0x1003; + + private GL11() {} + + public static void glAccum(int op, float value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAccum; + BufferChecks.checkFunctionAddress(function_pointer); + nglAccum(op, value, function_pointer); + } + static native void nglAccum(int op, float value, long function_pointer); + + public static void glAlphaFunc(int func, float ref) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAlphaFunc; + BufferChecks.checkFunctionAddress(function_pointer); + nglAlphaFunc(func, ref, function_pointer); + } + static native void nglAlphaFunc(int func, float ref, long function_pointer); + + public static void glClearColor(float red, float green, float blue, float alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearColor; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearColor(red, green, blue, alpha, function_pointer); + } + static native void nglClearColor(float red, float green, float blue, float alpha, long function_pointer); + + public static void glClearAccum(float red, float green, float blue, float alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearAccum; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearAccum(red, green, blue, alpha, function_pointer); + } + static native void nglClearAccum(float red, float green, float blue, float alpha, long function_pointer); + + public static void glClear(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClear; + BufferChecks.checkFunctionAddress(function_pointer); + nglClear(mask, function_pointer); + } + static native void nglClear(int mask, long function_pointer); + + public static void glCallLists(ByteBuffer lists) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCallLists; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(lists); + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(lists), function_pointer); + } + public static void glCallLists(IntBuffer lists) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCallLists; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(lists); + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(lists), function_pointer); + } + public static void glCallLists(ShortBuffer lists) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCallLists; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(lists); + nglCallLists(lists.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(lists), function_pointer); + } + static native void nglCallLists(int lists_n, int type, long lists, long function_pointer); + + public static void glCallList(int list) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCallList; + BufferChecks.checkFunctionAddress(function_pointer); + nglCallList(list, function_pointer); + } + static native void nglCallList(int list, long function_pointer); + + public static void glBlendFunc(int sfactor, int dfactor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFunc; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFunc(sfactor, dfactor, function_pointer); + } + static native void nglBlendFunc(int sfactor, int dfactor, long function_pointer); + + public static void glBitmap(int width, int height, float xorig, float yorig, float xmove, float ymove, ByteBuffer bitmap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBitmap; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (bitmap != null) + BufferChecks.checkBuffer(bitmap, (((width + 7)/8)*height)); + nglBitmap(width, height, xorig, yorig, xmove, ymove, MemoryUtil.getAddressSafe(bitmap), function_pointer); + } + static native void nglBitmap(int width, int height, float xorig, float yorig, float xmove, float ymove, long bitmap, long function_pointer); + public static void glBitmap(int width, int height, float xorig, float yorig, float xmove, float ymove, long bitmap_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBitmap; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglBitmapBO(width, height, xorig, yorig, xmove, ymove, bitmap_buffer_offset, function_pointer); + } + static native void nglBitmapBO(int width, int height, float xorig, float yorig, float xmove, float ymove, long bitmap_buffer_offset, long function_pointer); + + public static void glBindTexture(int target, int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTexture; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindTexture(target, texture, function_pointer); + } + static native void nglBindTexture(int target, int texture, long function_pointer); + + public static void glPrioritizeTextures(IntBuffer textures, FloatBuffer priorities) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPrioritizeTextures; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(textures); + BufferChecks.checkBuffer(priorities, textures.remaining()); + nglPrioritizeTextures(textures.remaining(), MemoryUtil.getAddress(textures), MemoryUtil.getAddress(priorities), function_pointer); + } + static native void nglPrioritizeTextures(int textures_n, long textures, long priorities, long function_pointer); + + public static boolean glAreTexturesResident(IntBuffer textures, ByteBuffer residences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAreTexturesResident; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(textures); + BufferChecks.checkBuffer(residences, textures.remaining()); + boolean __result = nglAreTexturesResident(textures.remaining(), MemoryUtil.getAddress(textures), MemoryUtil.getAddress(residences), function_pointer); + return __result; + } + static native boolean nglAreTexturesResident(int textures_n, long textures, long residences, long function_pointer); + + public static void glBegin(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBegin; + BufferChecks.checkFunctionAddress(function_pointer); + if ( ContextCapabilities.DEBUG ) StateTracker.setBeginEnd(caps, true); + nglBegin(mode, function_pointer); + } + static native void nglBegin(int mode, long function_pointer); + + public static void glEnd() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnd; + BufferChecks.checkFunctionAddress(function_pointer); + if ( ContextCapabilities.DEBUG ) StateTracker.setBeginEnd(caps, false); + nglEnd(function_pointer); + } + static native void nglEnd(long function_pointer); + + public static void glArrayElement(int i) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glArrayElement; + BufferChecks.checkFunctionAddress(function_pointer); + nglArrayElement(i, function_pointer); + } + static native void nglArrayElement(int i, long function_pointer); + + public static void glClearDepth(double depth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearDepth; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearDepth(depth, function_pointer); + } + static native void nglClearDepth(double depth, long function_pointer); + + public static void glDeleteLists(int list, int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteLists; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteLists(list, range, function_pointer); + } + static native void nglDeleteLists(int list, int range, long function_pointer); + + public static void glDeleteTextures(IntBuffer textures) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTextures; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(textures); + nglDeleteTextures(textures.remaining(), MemoryUtil.getAddress(textures), function_pointer); + } + static native void nglDeleteTextures(int textures_n, long textures, long function_pointer); + + /** Overloads glDeleteTextures. */ + public static void glDeleteTextures(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTextures; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteTextures(1, APIUtil.getInt(caps, texture), function_pointer); + } + + public static void glCullFace(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCullFace; + BufferChecks.checkFunctionAddress(function_pointer); + nglCullFace(mode, function_pointer); + } + static native void nglCullFace(int mode, long function_pointer); + + public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height, function_pointer); + } + static native void nglCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height, long function_pointer); + + public static void glCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTexSubImage1D(target, level, xoffset, x, y, width, function_pointer); + } + static native void nglCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width, long function_pointer); + + public static void glCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTexImage2D(target, level, internalFormat, x, y, width, height, border, function_pointer); + } + static native void nglCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border, long function_pointer); + + public static void glCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTexImage1D(target, level, internalFormat, x, y, width, border, function_pointer); + } + static native void nglCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border, long function_pointer); + + public static void glCopyPixels(int x, int y, int width, int height, int type) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyPixels; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyPixels(x, y, width, height, type, function_pointer); + } + static native void nglCopyPixels(int x, int y, int width, int height, int type, long function_pointer); + + public static void glColorPointer(int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glColorPointer_pointer = pointer; + nglColorPointer(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glColorPointer(int size, int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glColorPointer_pointer = pointer; + nglColorPointer(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glColorPointer_pointer = pointer; + nglColorPointer(size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglColorPointer(int size, int type, int stride, long pointer, long function_pointer); + public static void glColorPointer(int size, int type, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglColorPointerBO(size, type, stride, pointer_buffer_offset, function_pointer); + } + static native void nglColorPointerBO(int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + /** Overloads glColorPointer. */ + public static void glColorPointer(int size, int type, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glColorPointer_pointer = pointer; + nglColorPointer(size, type, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + + public static void glColorMaterial(int face, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorMaterial; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorMaterial(face, mode, function_pointer); + } + static native void nglColorMaterial(int face, int mode, long function_pointer); + + public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorMask; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorMask(red, green, blue, alpha, function_pointer); + } + static native void nglColorMask(boolean red, boolean green, boolean blue, boolean alpha, long function_pointer); + + public static void glColor3b(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor3b; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor3b(red, green, blue, function_pointer); + } + static native void nglColor3b(byte red, byte green, byte blue, long function_pointer); + + public static void glColor3f(float red, float green, float blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor3f(red, green, blue, function_pointer); + } + static native void nglColor3f(float red, float green, float blue, long function_pointer); + + public static void glColor3d(double red, double green, double blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor3d(red, green, blue, function_pointer); + } + static native void nglColor3d(double red, double green, double blue, long function_pointer); + + public static void glColor3ub(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor3ub; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor3ub(red, green, blue, function_pointer); + } + static native void nglColor3ub(byte red, byte green, byte blue, long function_pointer); + + public static void glColor4b(byte red, byte green, byte blue, byte alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor4b; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor4b(red, green, blue, alpha, function_pointer); + } + static native void nglColor4b(byte red, byte green, byte blue, byte alpha, long function_pointer); + + public static void glColor4f(float red, float green, float blue, float alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor4f(red, green, blue, alpha, function_pointer); + } + static native void nglColor4f(float red, float green, float blue, float alpha, long function_pointer); + + public static void glColor4d(double red, double green, double blue, double alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor4d(red, green, blue, alpha, function_pointer); + } + static native void nglColor4d(double red, double green, double blue, double alpha, long function_pointer); + + public static void glColor4ub(byte red, byte green, byte blue, byte alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor4ub; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor4ub(red, green, blue, alpha, function_pointer); + } + static native void nglColor4ub(byte red, byte green, byte blue, byte alpha, long function_pointer); + + public static void glClipPlane(int plane, DoubleBuffer equation) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClipPlane; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(equation, 4); + nglClipPlane(plane, MemoryUtil.getAddress(equation), function_pointer); + } + static native void nglClipPlane(int plane, long equation, long function_pointer); + + public static void glClearStencil(int s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearStencil; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearStencil(s, function_pointer); + } + static native void nglClearStencil(int s, long function_pointer); + + public static void glEvalPoint1(int i) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalPoint1; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalPoint1(i, function_pointer); + } + static native void nglEvalPoint1(int i, long function_pointer); + + public static void glEvalPoint2(int i, int j) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalPoint2; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalPoint2(i, j, function_pointer); + } + static native void nglEvalPoint2(int i, int j, long function_pointer); + + public static void glEvalMesh1(int mode, int i1, int i2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalMesh1; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalMesh1(mode, i1, i2, function_pointer); + } + static native void nglEvalMesh1(int mode, int i1, int i2, long function_pointer); + + public static void glEvalMesh2(int mode, int i1, int i2, int j1, int j2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalMesh2; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalMesh2(mode, i1, i2, j1, j2, function_pointer); + } + static native void nglEvalMesh2(int mode, int i1, int i2, int j1, int j2, long function_pointer); + + public static void glEvalCoord1f(float u) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalCoord1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalCoord1f(u, function_pointer); + } + static native void nglEvalCoord1f(float u, long function_pointer); + + public static void glEvalCoord1d(double u) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalCoord1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalCoord1d(u, function_pointer); + } + static native void nglEvalCoord1d(double u, long function_pointer); + + public static void glEvalCoord2f(float u, float v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalCoord2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalCoord2f(u, v, function_pointer); + } + static native void nglEvalCoord2f(float u, float v, long function_pointer); + + public static void glEvalCoord2d(double u, double v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalCoord2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalCoord2d(u, v, function_pointer); + } + static native void nglEvalCoord2d(double u, double v, long function_pointer); + + public static void glEnableClientState(int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableClientState; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableClientState(cap, function_pointer); + } + static native void nglEnableClientState(int cap, long function_pointer); + + public static void glDisableClientState(int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableClientState; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableClientState(cap, function_pointer); + } + static native void nglDisableClientState(int cap, long function_pointer); + + public static void glEnable(int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnable; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnable(cap, function_pointer); + } + static native void nglEnable(int cap, long function_pointer); + + public static void glDisable(int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisable; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisable(cap, function_pointer); + } + static native void nglDisable(int cap, long function_pointer); + + public static void glEdgeFlagPointer(int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEdgeFlagPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glEdgeFlagPointer_pointer = pointer; + nglEdgeFlagPointer(stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglEdgeFlagPointer(int stride, long pointer, long function_pointer); + public static void glEdgeFlagPointer(int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEdgeFlagPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglEdgeFlagPointerBO(stride, pointer_buffer_offset, function_pointer); + } + static native void nglEdgeFlagPointerBO(int stride, long pointer_buffer_offset, long function_pointer); + + public static void glEdgeFlag(boolean flag) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEdgeFlag; + BufferChecks.checkFunctionAddress(function_pointer); + nglEdgeFlag(flag, function_pointer); + } + static native void nglEdgeFlag(boolean flag, long function_pointer); + + public static void glDrawPixels(int width, int height, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglDrawPixels(width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glDrawPixels(int width, int height, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglDrawPixels(width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glDrawPixels(int width, int height, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglDrawPixels(width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglDrawPixels(int width, int height, int format, int type, long pixels, long function_pointer); + public static void glDrawPixels(int width, int height, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglDrawPixelsBO(width, height, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglDrawPixelsBO(int width, int height, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glDrawElements(int mode, ByteBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), function_pointer); + } + public static void glDrawElements(int mode, IntBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), function_pointer); + } + public static void glDrawElements(int mode, ShortBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), function_pointer); + } + static native void nglDrawElements(int mode, int indices_count, int type, long indices, long function_pointer); + public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsBO(mode, indices_count, type, indices_buffer_offset, function_pointer); + } + static native void nglDrawElementsBO(int mode, int indices_count, int type, long indices_buffer_offset, long function_pointer); + + /** Overloads glDrawElements. */ + public static void glDrawElements(int mode, int count, int type, ByteBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkBuffer(indices, count); + nglDrawElements(mode, count, type, MemoryUtil.getAddress(indices), function_pointer); + } + + public static void glDrawBuffer(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawBuffer(mode, function_pointer); + } + static native void nglDrawBuffer(int mode, long function_pointer); + + public static void glDrawArrays(int mode, int first, int count) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArrays; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawArrays(mode, first, count, function_pointer); + } + static native void nglDrawArrays(int mode, int first, int count, long function_pointer); + + public static void glDepthRange(double zNear, double zFar) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthRange; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthRange(zNear, zFar, function_pointer); + } + static native void nglDepthRange(double zNear, double zFar, long function_pointer); + + public static void glDepthMask(boolean flag) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthMask; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthMask(flag, function_pointer); + } + static native void nglDepthMask(boolean flag, long function_pointer); + + public static void glDepthFunc(int func) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthFunc; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthFunc(func, function_pointer); + } + static native void nglDepthFunc(int func, long function_pointer); + + public static void glFeedbackBuffer(int type, FloatBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFeedbackBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffer); + nglFeedbackBuffer(buffer.remaining(), type, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglFeedbackBuffer(int buffer_size, int type, long buffer, long function_pointer); + + public static void glGetPixelMap(int map, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapfv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetPixelMapfv(map, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetPixelMapfv(int map, long values, long function_pointer); + public static void glGetPixelMapfv(int map, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapfv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetPixelMapfvBO(map, values_buffer_offset, function_pointer); + } + static native void nglGetPixelMapfvBO(int map, long values_buffer_offset, long function_pointer); + + public static void glGetPixelMapu(int map, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapuiv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetPixelMapuiv(map, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetPixelMapuiv(int map, long values, long function_pointer); + public static void glGetPixelMapuiv(int map, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapuiv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetPixelMapuivBO(map, values_buffer_offset, function_pointer); + } + static native void nglGetPixelMapuivBO(int map, long values_buffer_offset, long function_pointer); + + public static void glGetPixelMapu(int map, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapusv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(values, 256); + nglGetPixelMapusv(map, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetPixelMapusv(int map, long values, long function_pointer); + public static void glGetPixelMapusv(int map, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPixelMapusv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetPixelMapusvBO(map, values_buffer_offset, function_pointer); + } + static native void nglGetPixelMapusvBO(int map, long values_buffer_offset, long function_pointer); + + public static void glGetMaterial(int face, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMaterialfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMaterialfv(face, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMaterialfv(int face, int pname, long params, long function_pointer); + + public static void glGetMaterial(int face, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMaterialiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMaterialiv(face, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMaterialiv(int face, int pname, long params, long function_pointer); + + public static void glGetMap(int target, int query, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 256); + nglGetMapfv(target, query, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetMapfv(int target, int query, long v, long function_pointer); + + public static void glGetMap(int target, int query, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapdv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 256); + nglGetMapdv(target, query, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetMapdv(int target, int query, long v, long function_pointer); + + public static void glGetMap(int target, int query, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 256); + nglGetMapiv(target, query, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglGetMapiv(int target, int query, long v, long function_pointer); + + public static void glGetLight(int light, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetLightfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetLightfv(light, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetLightfv(int light, int pname, long params, long function_pointer); + + public static void glGetLight(int light, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetLightiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetLightiv(light, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetLightiv(int light, int pname, long params, long function_pointer); + + public static int glGetError() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetError; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetError(function_pointer); + return __result; + } + static native int nglGetError(long function_pointer); + + public static void glGetClipPlane(int plane, DoubleBuffer equation) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetClipPlane; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(equation, 4); + nglGetClipPlane(plane, MemoryUtil.getAddress(equation), function_pointer); + } + static native void nglGetClipPlane(int plane, long equation, long function_pointer); + + public static void glGetBoolean(int pname, ByteBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleanv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetBooleanv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetBooleanv(int pname, long params, long function_pointer); + + /** Overloads glGetBooleanv. */ + public static boolean glGetBoolean(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleanv; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer params = APIUtil.getBufferByte(caps, 1); + nglGetBooleanv(pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0) == 1; + } + + public static void glGetDouble(int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublev; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetDoublev(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetDoublev(int pname, long params, long function_pointer); + + /** Overloads glGetDoublev. */ + public static double glGetDouble(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublev; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer params = APIUtil.getBufferDouble(caps); + nglGetDoublev(pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetFloat(int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloatv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetFloatv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFloatv(int pname, long params, long function_pointer); + + /** Overloads glGetFloatv. */ + public static float glGetFloat(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloatv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetFloatv(pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetInteger(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetIntegerv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetIntegerv(int pname, long params, long function_pointer); + + /** Overloads glGetIntegerv. */ + public static int glGetInteger(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetIntegerv(pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGenTextures(IntBuffer textures) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTextures; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(textures); + nglGenTextures(textures.remaining(), MemoryUtil.getAddress(textures), function_pointer); + } + static native void nglGenTextures(int textures_n, long textures, long function_pointer); + + /** Overloads glGenTextures. */ + public static int glGenTextures() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTextures; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer textures = APIUtil.getBufferInt(caps); + nglGenTextures(1, MemoryUtil.getAddress(textures), function_pointer); + return textures.get(0); + } + + public static int glGenLists(int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenLists; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGenLists(range, function_pointer); + return __result; + } + static native int nglGenLists(int range, long function_pointer); + + public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFrustum; + BufferChecks.checkFunctionAddress(function_pointer); + nglFrustum(left, right, bottom, top, zNear, zFar, function_pointer); + } + static native void nglFrustum(double left, double right, double bottom, double top, double zNear, double zFar, long function_pointer); + + public static void glFrontFace(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFrontFace; + BufferChecks.checkFunctionAddress(function_pointer); + nglFrontFace(mode, function_pointer); + } + static native void nglFrontFace(int mode, long function_pointer); + + public static void glFogf(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogf; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogf(pname, param, function_pointer); + } + static native void nglFogf(int pname, float param, long function_pointer); + + public static void glFogi(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogi; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogi(pname, param, function_pointer); + } + static native void nglFogi(int pname, int param, long function_pointer); + + public static void glFog(int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglFogfv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglFogfv(int pname, long params, long function_pointer); + + public static void glFog(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglFogiv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglFogiv(int pname, long params, long function_pointer); + + public static void glFlush() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlush; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlush(function_pointer); + } + static native void nglFlush(long function_pointer); + + public static void glFinish() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFinish; + BufferChecks.checkFunctionAddress(function_pointer); + nglFinish(function_pointer); + } + static native void nglFinish(long function_pointer); + + public static ByteBuffer glGetPointer(int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPointerv; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetPointerv(pname, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetPointerv(int pname, long result_size, long function_pointer); + + public static boolean glIsEnabled(int cap) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsEnabled; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsEnabled(cap, function_pointer); + return __result; + } + static native boolean nglIsEnabled(int cap, long function_pointer); + + public static void glInterleavedArrays(int format, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglInterleavedArrays(format, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glInterleavedArrays(int format, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglInterleavedArrays(format, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glInterleavedArrays(int format, int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglInterleavedArrays(format, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glInterleavedArrays(int format, int stride, IntBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglInterleavedArrays(format, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glInterleavedArrays(int format, int stride, ShortBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + nglInterleavedArrays(format, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglInterleavedArrays(int format, int stride, long pointer, long function_pointer); + public static void glInterleavedArrays(int format, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterleavedArrays; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglInterleavedArraysBO(format, stride, pointer_buffer_offset, function_pointer); + } + static native void nglInterleavedArraysBO(int format, int stride, long pointer_buffer_offset, long function_pointer); + + public static void glInitNames() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInitNames; + BufferChecks.checkFunctionAddress(function_pointer); + nglInitNames(function_pointer); + } + static native void nglInitNames(long function_pointer); + + public static void glHint(int target, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glHint; + BufferChecks.checkFunctionAddress(function_pointer); + nglHint(target, mode, function_pointer); + } + static native void nglHint(int target, int mode, long function_pointer); + + public static void glGetTexParameter(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameterfv(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameterfv. */ + public static float glGetTexParameterf(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTexParameterfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameteriv(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameteriv. */ + public static int glGetTexParameteri(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexLevelParameter(int target, int level, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexLevelParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexLevelParameterfv(target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexLevelParameterfv(int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetTexLevelParameterfv. */ + public static float glGetTexLevelParameterf(int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexLevelParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTexLevelParameterfv(target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexLevelParameter(int target, int level, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexLevelParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexLevelParameteriv(target, level, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexLevelParameteriv(int target, int level, int pname, long params, long function_pointer); + + /** Overloads glGetTexLevelParameteriv. */ + public static int glGetTexLevelParameteri(int target, int level, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexLevelParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexLevelParameteriv(target, level, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTexImage(target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTexImage(int target, int level, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTexImage(target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTexImage(int target, int level, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTexImage(target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTexImage(int target, int level, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTexImage(target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glGetTexImage(int target, int level, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)); + nglGetTexImage(target, level, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglGetTexImage(int target, int level, int format, int type, long pixels, long function_pointer); + public static void glGetTexImage(int target, int level, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetTexImageBO(target, level, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglGetTexImageBO(int target, int level, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glGetTexGen(int coord, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGeniv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexGeniv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexGeniv(int coord, int pname, long params, long function_pointer); + + /** Overloads glGetTexGeniv. */ + public static int glGetTexGeni(int coord, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGeniv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexGeniv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexGen(int coord, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGenfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexGenfv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexGenfv(int coord, int pname, long params, long function_pointer); + + /** Overloads glGetTexGenfv. */ + public static float glGetTexGenf(int coord, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGenfv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTexGenfv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexGen(int coord, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGendv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexGendv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexGendv(int coord, int pname, long params, long function_pointer); + + /** Overloads glGetTexGendv. */ + public static double glGetTexGend(int coord, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexGendv; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer params = APIUtil.getBufferDouble(caps); + nglGetTexGendv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexEnv(int coord, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexEnviv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexEnviv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexEnviv(int coord, int pname, long params, long function_pointer); + + /** Overloads glGetTexEnviv. */ + public static int glGetTexEnvi(int coord, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexEnviv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexEnviv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexEnv(int coord, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexEnvfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexEnvfv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexEnvfv(int coord, int pname, long params, long function_pointer); + + /** Overloads glGetTexEnvfv. */ + public static float glGetTexEnvf(int coord, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexEnvfv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetTexEnvfv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static String glGetString(int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetString; + BufferChecks.checkFunctionAddress(function_pointer); + String __result = nglGetString(name, function_pointer); + return __result; + } + static native String nglGetString(int name, long function_pointer); + + public static void glGetPolygonStipple(ByteBuffer mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPolygonStipple; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(mask, 128); + nglGetPolygonStipple(MemoryUtil.getAddress(mask), function_pointer); + } + static native void nglGetPolygonStipple(long mask, long function_pointer); + public static void glGetPolygonStipple(long mask_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPolygonStipple; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetPolygonStippleBO(mask_buffer_offset, function_pointer); + } + static native void nglGetPolygonStippleBO(long mask_buffer_offset, long function_pointer); + + public static boolean glIsList(int list) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsList; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsList(list, function_pointer); + return __result; + } + static native boolean nglIsList(int list, long function_pointer); + + public static void glMaterialf(int face, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMaterialf; + BufferChecks.checkFunctionAddress(function_pointer); + nglMaterialf(face, pname, param, function_pointer); + } + static native void nglMaterialf(int face, int pname, float param, long function_pointer); + + public static void glMateriali(int face, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMateriali; + BufferChecks.checkFunctionAddress(function_pointer); + nglMateriali(face, pname, param, function_pointer); + } + static native void nglMateriali(int face, int pname, int param, long function_pointer); + + public static void glMaterial(int face, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMaterialfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMaterialfv(face, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMaterialfv(int face, int pname, long params, long function_pointer); + + public static void glMaterial(int face, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMaterialiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMaterialiv(face, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMaterialiv(int face, int pname, long params, long function_pointer); + + public static void glMapGrid1f(int un, float u1, float u2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapGrid1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMapGrid1f(un, u1, u2, function_pointer); + } + static native void nglMapGrid1f(int un, float u1, float u2, long function_pointer); + + public static void glMapGrid1d(int un, double u1, double u2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapGrid1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMapGrid1d(un, u1, u2, function_pointer); + } + static native void nglMapGrid1d(int un, double u1, double u2, long function_pointer); + + public static void glMapGrid2f(int un, float u1, float u2, int vn, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapGrid2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMapGrid2f(un, u1, u2, vn, v1, v2, function_pointer); + } + static native void nglMapGrid2f(int un, float u1, float u2, int vn, float v1, float v2, long function_pointer); + + public static void glMapGrid2d(int un, double u1, double u2, int vn, double v1, double v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapGrid2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMapGrid2d(un, u1, u2, vn, v1, v2, function_pointer); + } + static native void nglMapGrid2d(int un, double u1, double u2, int vn, double v1, double v2, long function_pointer); + + public static void glMap2f(int target, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, FloatBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMap2f; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMap2f(int target, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, long points, long function_pointer); + + public static void glMap2d(int target, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, DoubleBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMap2d; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMap2d(int target, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, long points, long function_pointer); + + public static void glMap1f(int target, float u1, float u2, int stride, int order, FloatBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMap1f; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMap1f(target, u1, u2, stride, order, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMap1f(int target, float u1, float u2, int stride, int order, long points, long function_pointer); + + public static void glMap1d(int target, double u1, double u2, int stride, int order, DoubleBuffer points) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMap1d; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(points); + nglMap1d(target, u1, u2, stride, order, MemoryUtil.getAddress(points), function_pointer); + } + static native void nglMap1d(int target, double u1, double u2, int stride, int order, long points, long function_pointer); + + public static void glLogicOp(int opcode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLogicOp; + BufferChecks.checkFunctionAddress(function_pointer); + nglLogicOp(opcode, function_pointer); + } + static native void nglLogicOp(int opcode, long function_pointer); + + public static void glLoadName(int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadName; + BufferChecks.checkFunctionAddress(function_pointer); + nglLoadName(name, function_pointer); + } + static native void nglLoadName(int name, long function_pointer); + + public static void glLoadMatrix(FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadMatrixf; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglLoadMatrixf(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglLoadMatrixf(long m, long function_pointer); + + public static void glLoadMatrix(DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadMatrixd; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglLoadMatrixd(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglLoadMatrixd(long m, long function_pointer); + + public static void glLoadIdentity() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadIdentity; + BufferChecks.checkFunctionAddress(function_pointer); + nglLoadIdentity(function_pointer); + } + static native void nglLoadIdentity(long function_pointer); + + public static void glListBase(int base) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glListBase; + BufferChecks.checkFunctionAddress(function_pointer); + nglListBase(base, function_pointer); + } + static native void nglListBase(int base, long function_pointer); + + public static void glLineWidth(float width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLineWidth; + BufferChecks.checkFunctionAddress(function_pointer); + nglLineWidth(width, function_pointer); + } + static native void nglLineWidth(float width, long function_pointer); + + public static void glLineStipple(int factor, short pattern) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLineStipple; + BufferChecks.checkFunctionAddress(function_pointer); + nglLineStipple(factor, pattern, function_pointer); + } + static native void nglLineStipple(int factor, short pattern, long function_pointer); + + public static void glLightModelf(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightModelf; + BufferChecks.checkFunctionAddress(function_pointer); + nglLightModelf(pname, param, function_pointer); + } + static native void nglLightModelf(int pname, float param, long function_pointer); + + public static void glLightModeli(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightModeli; + BufferChecks.checkFunctionAddress(function_pointer); + nglLightModeli(pname, param, function_pointer); + } + static native void nglLightModeli(int pname, int param, long function_pointer); + + public static void glLightModel(int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightModelfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglLightModelfv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglLightModelfv(int pname, long params, long function_pointer); + + public static void glLightModel(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightModeliv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglLightModeliv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglLightModeliv(int pname, long params, long function_pointer); + + public static void glLightf(int light, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightf; + BufferChecks.checkFunctionAddress(function_pointer); + nglLightf(light, pname, param, function_pointer); + } + static native void nglLightf(int light, int pname, float param, long function_pointer); + + public static void glLighti(int light, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLighti; + BufferChecks.checkFunctionAddress(function_pointer); + nglLighti(light, pname, param, function_pointer); + } + static native void nglLighti(int light, int pname, int param, long function_pointer); + + public static void glLight(int light, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglLightfv(light, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglLightfv(int light, int pname, long params, long function_pointer); + + public static void glLight(int light, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLightiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglLightiv(light, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglLightiv(int light, int pname, long params, long function_pointer); + + public static boolean glIsTexture(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsTexture; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsTexture(texture, function_pointer); + return __result; + } + static native boolean nglIsTexture(int texture, long function_pointer); + + public static void glMatrixMode(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMatrixMode; + BufferChecks.checkFunctionAddress(function_pointer); + nglMatrixMode(mode, function_pointer); + } + static native void nglMatrixMode(int mode, long function_pointer); + + public static void glPolygonStipple(ByteBuffer mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPolygonStipple; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(mask, 128); + nglPolygonStipple(MemoryUtil.getAddress(mask), function_pointer); + } + static native void nglPolygonStipple(long mask, long function_pointer); + public static void glPolygonStipple(long mask_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPolygonStipple; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglPolygonStippleBO(mask_buffer_offset, function_pointer); + } + static native void nglPolygonStippleBO(long mask_buffer_offset, long function_pointer); + + public static void glPolygonOffset(float factor, float units) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPolygonOffset; + BufferChecks.checkFunctionAddress(function_pointer); + nglPolygonOffset(factor, units, function_pointer); + } + static native void nglPolygonOffset(float factor, float units, long function_pointer); + + public static void glPolygonMode(int face, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPolygonMode; + BufferChecks.checkFunctionAddress(function_pointer); + nglPolygonMode(face, mode, function_pointer); + } + static native void nglPolygonMode(int face, int mode, long function_pointer); + + public static void glPointSize(float size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointSize; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointSize(size, function_pointer); + } + static native void nglPointSize(float size, long function_pointer); + + public static void glPixelZoom(float xfactor, float yfactor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelZoom; + BufferChecks.checkFunctionAddress(function_pointer); + nglPixelZoom(xfactor, yfactor, function_pointer); + } + static native void nglPixelZoom(float xfactor, float yfactor, long function_pointer); + + public static void glPixelTransferf(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelTransferf; + BufferChecks.checkFunctionAddress(function_pointer); + nglPixelTransferf(pname, param, function_pointer); + } + static native void nglPixelTransferf(int pname, float param, long function_pointer); + + public static void glPixelTransferi(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelTransferi; + BufferChecks.checkFunctionAddress(function_pointer); + nglPixelTransferi(pname, param, function_pointer); + } + static native void nglPixelTransferi(int pname, int param, long function_pointer); + + public static void glPixelStoref(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelStoref; + BufferChecks.checkFunctionAddress(function_pointer); + nglPixelStoref(pname, param, function_pointer); + } + static native void nglPixelStoref(int pname, float param, long function_pointer); + + public static void glPixelStorei(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelStorei; + BufferChecks.checkFunctionAddress(function_pointer); + nglPixelStorei(pname, param, function_pointer); + } + static native void nglPixelStorei(int pname, int param, long function_pointer); + + public static void glPixelMap(int map, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapfv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglPixelMapfv(map, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglPixelMapfv(int map, int values_mapsize, long values, long function_pointer); + public static void glPixelMapfv(int map, int values_mapsize, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapfv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglPixelMapfvBO(map, values_mapsize, values_buffer_offset, function_pointer); + } + static native void nglPixelMapfvBO(int map, int values_mapsize, long values_buffer_offset, long function_pointer); + + public static void glPixelMapu(int map, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapuiv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglPixelMapuiv(map, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglPixelMapuiv(int map, int values_mapsize, long values, long function_pointer); + public static void glPixelMapuiv(int map, int values_mapsize, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapuiv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglPixelMapuivBO(map, values_mapsize, values_buffer_offset, function_pointer); + } + static native void nglPixelMapuivBO(int map, int values_mapsize, long values_buffer_offset, long function_pointer); + + public static void glPixelMapu(int map, ShortBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapusv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(values); + nglPixelMapusv(map, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglPixelMapusv(int map, int values_mapsize, long values, long function_pointer); + public static void glPixelMapusv(int map, int values_mapsize, long values_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelMapusv; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglPixelMapusvBO(map, values_mapsize, values_buffer_offset, function_pointer); + } + static native void nglPixelMapusvBO(int map, int values_mapsize, long values_buffer_offset, long function_pointer); + + public static void glPassThrough(float token) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPassThrough; + BufferChecks.checkFunctionAddress(function_pointer); + nglPassThrough(token, function_pointer); + } + static native void nglPassThrough(float token, long function_pointer); + + public static void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glOrtho; + BufferChecks.checkFunctionAddress(function_pointer); + nglOrtho(left, right, bottom, top, zNear, zFar, function_pointer); + } + static native void nglOrtho(double left, double right, double bottom, double top, double zNear, double zFar, long function_pointer); + + public static void glNormalPointer(int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glNormalPointer_pointer = pointer; + nglNormalPointer(GL11.GL_BYTE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glNormalPointer(int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glNormalPointer_pointer = pointer; + nglNormalPointer(GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glNormalPointer(int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glNormalPointer_pointer = pointer; + nglNormalPointer(GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glNormalPointer(int stride, IntBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glNormalPointer_pointer = pointer; + nglNormalPointer(GL11.GL_INT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglNormalPointer(int type, int stride, long pointer, long function_pointer); + public static void glNormalPointer(int type, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglNormalPointerBO(type, stride, pointer_buffer_offset, function_pointer); + } + static native void nglNormalPointerBO(int type, int stride, long pointer_buffer_offset, long function_pointer); + + /** Overloads glNormalPointer. */ + public static void glNormalPointer(int type, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glNormalPointer_pointer = pointer; + nglNormalPointer(type, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + + public static void glNormal3b(byte nx, byte ny, byte nz) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormal3b; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormal3b(nx, ny, nz, function_pointer); + } + static native void nglNormal3b(byte nx, byte ny, byte nz, long function_pointer); + + public static void glNormal3f(float nx, float ny, float nz) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormal3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormal3f(nx, ny, nz, function_pointer); + } + static native void nglNormal3f(float nx, float ny, float nz, long function_pointer); + + public static void glNormal3d(double nx, double ny, double nz) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormal3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormal3d(nx, ny, nz, function_pointer); + } + static native void nglNormal3d(double nx, double ny, double nz, long function_pointer); + + public static void glNormal3i(int nx, int ny, int nz) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormal3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormal3i(nx, ny, nz, function_pointer); + } + static native void nglNormal3i(int nx, int ny, int nz, long function_pointer); + + public static void glNewList(int list, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNewList; + BufferChecks.checkFunctionAddress(function_pointer); + nglNewList(list, mode, function_pointer); + } + static native void nglNewList(int list, int mode, long function_pointer); + + public static void glEndList() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndList; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndList(function_pointer); + } + static native void nglEndList(long function_pointer); + + public static void glMultMatrix(FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultMatrixf; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMultMatrixf(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMultMatrixf(long m, long function_pointer); + + public static void glMultMatrix(DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultMatrixd; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMultMatrixd(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMultMatrixd(long m, long function_pointer); + + public static void glShadeModel(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShadeModel; + BufferChecks.checkFunctionAddress(function_pointer); + nglShadeModel(mode, function_pointer); + } + static native void nglShadeModel(int mode, long function_pointer); + + public static void glSelectBuffer(IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSelectBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffer); + nglSelectBuffer(buffer.remaining(), MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglSelectBuffer(int buffer_size, long buffer, long function_pointer); + + public static void glScissor(int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScissor; + BufferChecks.checkFunctionAddress(function_pointer); + nglScissor(x, y, width, height, function_pointer); + } + static native void nglScissor(int x, int y, int width, int height, long function_pointer); + + public static void glScalef(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScalef; + BufferChecks.checkFunctionAddress(function_pointer); + nglScalef(x, y, z, function_pointer); + } + static native void nglScalef(float x, float y, float z, long function_pointer); + + public static void glScaled(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScaled; + BufferChecks.checkFunctionAddress(function_pointer); + nglScaled(x, y, z, function_pointer); + } + static native void nglScaled(double x, double y, double z, long function_pointer); + + public static void glRotatef(float angle, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRotatef; + BufferChecks.checkFunctionAddress(function_pointer); + nglRotatef(angle, x, y, z, function_pointer); + } + static native void nglRotatef(float angle, float x, float y, float z, long function_pointer); + + public static void glRotated(double angle, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRotated; + BufferChecks.checkFunctionAddress(function_pointer); + nglRotated(angle, x, y, z, function_pointer); + } + static native void nglRotated(double angle, double x, double y, double z, long function_pointer); + + public static int glRenderMode(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderMode; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglRenderMode(mode, function_pointer); + return __result; + } + static native int nglRenderMode(int mode, long function_pointer); + + public static void glRectf(float x1, float y1, float x2, float y2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRectf; + BufferChecks.checkFunctionAddress(function_pointer); + nglRectf(x1, y1, x2, y2, function_pointer); + } + static native void nglRectf(float x1, float y1, float x2, float y2, long function_pointer); + + public static void glRectd(double x1, double y1, double x2, double y2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRectd; + BufferChecks.checkFunctionAddress(function_pointer); + nglRectd(x1, y1, x2, y2, function_pointer); + } + static native void nglRectd(double x1, double y1, double x2, double y2, long function_pointer); + + public static void glRecti(int x1, int y1, int x2, int y2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRecti; + BufferChecks.checkFunctionAddress(function_pointer); + nglRecti(x1, y1, x2, y2, function_pointer); + } + static native void nglRecti(int x1, int y1, int x2, int y2, long function_pointer); + + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglReadPixels(int x, int y, int width, int height, int format, int type, long pixels, long function_pointer); + public static void glReadPixels(int x, int y, int width, int height, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadPixels; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglReadPixelsBO(x, y, width, height, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglReadPixelsBO(int x, int y, int width, int height, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glReadBuffer(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReadBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglReadBuffer(mode, function_pointer); + } + static native void nglReadBuffer(int mode, long function_pointer); + + public static void glRasterPos2f(float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos2f(x, y, function_pointer); + } + static native void nglRasterPos2f(float x, float y, long function_pointer); + + public static void glRasterPos2d(double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos2d(x, y, function_pointer); + } + static native void nglRasterPos2d(double x, double y, long function_pointer); + + public static void glRasterPos2i(int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos2i(x, y, function_pointer); + } + static native void nglRasterPos2i(int x, int y, long function_pointer); + + public static void glRasterPos3f(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos3f(x, y, z, function_pointer); + } + static native void nglRasterPos3f(float x, float y, float z, long function_pointer); + + public static void glRasterPos3d(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos3d(x, y, z, function_pointer); + } + static native void nglRasterPos3d(double x, double y, double z, long function_pointer); + + public static void glRasterPos3i(int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos3i(x, y, z, function_pointer); + } + static native void nglRasterPos3i(int x, int y, int z, long function_pointer); + + public static void glRasterPos4f(float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos4f(x, y, z, w, function_pointer); + } + static native void nglRasterPos4f(float x, float y, float z, float w, long function_pointer); + + public static void glRasterPos4d(double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos4d(x, y, z, w, function_pointer); + } + static native void nglRasterPos4d(double x, double y, double z, double w, long function_pointer); + + public static void glRasterPos4i(int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRasterPos4i; + BufferChecks.checkFunctionAddress(function_pointer); + nglRasterPos4i(x, y, z, w, function_pointer); + } + static native void nglRasterPos4i(int x, int y, int z, int w, long function_pointer); + + public static void glPushName(int name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushName; + BufferChecks.checkFunctionAddress(function_pointer); + nglPushName(name, function_pointer); + } + static native void nglPushName(int name, long function_pointer); + + public static void glPopName() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPopName; + BufferChecks.checkFunctionAddress(function_pointer); + nglPopName(function_pointer); + } + static native void nglPopName(long function_pointer); + + public static void glPushMatrix() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushMatrix; + BufferChecks.checkFunctionAddress(function_pointer); + nglPushMatrix(function_pointer); + } + static native void nglPushMatrix(long function_pointer); + + public static void glPopMatrix() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPopMatrix; + BufferChecks.checkFunctionAddress(function_pointer); + nglPopMatrix(function_pointer); + } + static native void nglPopMatrix(long function_pointer); + + public static void glPushClientAttrib(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushClientAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.pushAttrib(caps, mask); + nglPushClientAttrib(mask, function_pointer); + } + static native void nglPushClientAttrib(int mask, long function_pointer); + + public static void glPopClientAttrib() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPopClientAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.popAttrib(caps); + nglPopClientAttrib(function_pointer); + } + static native void nglPopClientAttrib(long function_pointer); + + public static void glPushAttrib(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + nglPushAttrib(mask, function_pointer); + } + static native void nglPushAttrib(int mask, long function_pointer); + + public static void glPopAttrib() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPopAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + nglPopAttrib(function_pointer); + } + static native void nglPopAttrib(long function_pointer); + + public static void glStencilFunc(int func, int ref, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilFunc; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilFunc(func, ref, mask, function_pointer); + } + static native void nglStencilFunc(int func, int ref, int mask, long function_pointer); + + public static void glVertexPointer(int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glVertexPointer_pointer = pointer; + nglVertexPointer(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glVertexPointer(int size, int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glVertexPointer_pointer = pointer; + nglVertexPointer(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glVertexPointer(int size, int stride, IntBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glVertexPointer_pointer = pointer; + nglVertexPointer(size, GL11.GL_INT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glVertexPointer(int size, int stride, ShortBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glVertexPointer_pointer = pointer; + nglVertexPointer(size, GL11.GL_SHORT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglVertexPointer(int size, int type, int stride, long pointer, long function_pointer); + public static void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexPointerBO(size, type, stride, pointer_buffer_offset, function_pointer); + } + static native void nglVertexPointerBO(int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + /** Overloads glVertexPointer. */ + public static void glVertexPointer(int size, int type, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL11_glVertexPointer_pointer = pointer; + nglVertexPointer(size, type, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + + public static void glVertex2f(float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex2f(x, y, function_pointer); + } + static native void nglVertex2f(float x, float y, long function_pointer); + + public static void glVertex2d(double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex2d(x, y, function_pointer); + } + static native void nglVertex2d(double x, double y, long function_pointer); + + public static void glVertex2i(int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex2i(x, y, function_pointer); + } + static native void nglVertex2i(int x, int y, long function_pointer); + + public static void glVertex3f(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex3f(x, y, z, function_pointer); + } + static native void nglVertex3f(float x, float y, float z, long function_pointer); + + public static void glVertex3d(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex3d(x, y, z, function_pointer); + } + static native void nglVertex3d(double x, double y, double z, long function_pointer); + + public static void glVertex3i(int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex3i(x, y, z, function_pointer); + } + static native void nglVertex3i(int x, int y, int z, long function_pointer); + + public static void glVertex4f(float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex4f(x, y, z, w, function_pointer); + } + static native void nglVertex4f(float x, float y, float z, float w, long function_pointer); + + public static void glVertex4d(double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex4d(x, y, z, w, function_pointer); + } + static native void nglVertex4d(double x, double y, double z, double w, long function_pointer); + + public static void glVertex4i(int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex4i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex4i(x, y, z, w, function_pointer); + } + static native void nglVertex4i(int x, int y, int z, int w, long function_pointer); + + public static void glTranslatef(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTranslatef; + BufferChecks.checkFunctionAddress(function_pointer); + nglTranslatef(x, y, z, function_pointer); + } + static native void nglTranslatef(float x, float y, float z, long function_pointer); + + public static void glTranslated(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTranslated; + BufferChecks.checkFunctionAddress(function_pointer); + nglTranslated(x, y, z, function_pointer); + } + static native void nglTranslated(double x, double y, double z, long function_pointer); + + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTexImage1D(target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTexImage1D(target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTexImage1D(target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTexImage1D(target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage1DStorage(pixels, format, type, width)); + nglTexImage1D(target, level, internalformat, width, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, long pixels, long function_pointer); + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexImage1DBO(target, level, internalformat, width, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexImage1DBO(int target, int level, int internalformat, int width, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels, long function_pointer); + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexImage2DBO(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexImage2DBO(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTexSubImage1D(target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTexSubImage1D(target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTexSubImage1D(target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTexSubImage1D(target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)); + nglTexSubImage1D(target, level, xoffset, width, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, long pixels, long function_pointer); + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexSubImage1DBO(target, level, xoffset, width, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexSubImage1DBO(int target, int level, int xoffset, int width, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels, long function_pointer); + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexSubImage2DBO(target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexSubImage2DBO(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTexParameterf(int target, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterf; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameterf(target, pname, param, function_pointer); + } + static native void nglTexParameterf(int target, int pname, float param, long function_pointer); + + public static void glTexParameteri(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameteri(target, pname, param, function_pointer); + } + static native void nglTexParameteri(int target, int pname, int param, long function_pointer); + + public static void glTexParameter(int target, int pname, FloatBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTexParameterfv(target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTexParameterfv(int target, int pname, long param, long function_pointer); + + public static void glTexParameter(int target, int pname, IntBuffer param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(param, 4); + nglTexParameteriv(target, pname, MemoryUtil.getAddress(param), function_pointer); + } + static native void nglTexParameteriv(int target, int pname, long param, long function_pointer); + + public static void glTexGenf(int coord, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGenf; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexGenf(coord, pname, param, function_pointer); + } + static native void nglTexGenf(int coord, int pname, float param, long function_pointer); + + public static void glTexGend(int coord, int pname, double param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGend; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexGend(coord, pname, param, function_pointer); + } + static native void nglTexGend(int coord, int pname, double param, long function_pointer); + + public static void glTexGen(int coord, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGenfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexGenfv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexGenfv(int coord, int pname, long params, long function_pointer); + + public static void glTexGen(int coord, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGendv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexGendv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexGendv(int coord, int pname, long params, long function_pointer); + + public static void glTexGeni(int coord, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGeni; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexGeni(coord, pname, param, function_pointer); + } + static native void nglTexGeni(int coord, int pname, int param, long function_pointer); + + public static void glTexGen(int coord, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexGeniv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexGeniv(coord, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexGeniv(int coord, int pname, long params, long function_pointer); + + public static void glTexEnvf(int target, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexEnvf; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexEnvf(target, pname, param, function_pointer); + } + static native void nglTexEnvf(int target, int pname, float param, long function_pointer); + + public static void glTexEnvi(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexEnvi; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexEnvi(target, pname, param, function_pointer); + } + static native void nglTexEnvi(int target, int pname, int param, long function_pointer); + + public static void glTexEnv(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexEnvfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexEnvfv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexEnvfv(int target, int pname, long params, long function_pointer); + + public static void glTexEnv(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexEnviv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexEnviv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexEnviv(int target, int pname, long params, long function_pointer); + + public static void glTexCoordPointer(int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glTexCoordPointer_buffer[StateTracker.getReferences(caps).glClientActiveTexture] = pointer; + nglTexCoordPointer(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glTexCoordPointer_buffer[StateTracker.getReferences(caps).glClientActiveTexture] = pointer; + nglTexCoordPointer(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glTexCoordPointer_buffer[StateTracker.getReferences(caps).glClientActiveTexture] = pointer; + nglTexCoordPointer(size, GL11.GL_INT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glTexCoordPointer_buffer[StateTracker.getReferences(caps).glClientActiveTexture] = pointer; + nglTexCoordPointer(size, GL11.GL_SHORT, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglTexCoordPointer(int size, int type, int stride, long pointer, long function_pointer); + public static void glTexCoordPointer(int size, int type, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglTexCoordPointerBO(size, type, stride, pointer_buffer_offset, function_pointer); + } + static native void nglTexCoordPointerBO(int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + /** Overloads glTexCoordPointer. */ + public static void glTexCoordPointer(int size, int type, int stride, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glTexCoordPointer_buffer[StateTracker.getReferences(caps).glClientActiveTexture] = pointer; + nglTexCoordPointer(size, type, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + + public static void glTexCoord1f(float s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord1f(s, function_pointer); + } + static native void nglTexCoord1f(float s, long function_pointer); + + public static void glTexCoord1d(double s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord1d(s, function_pointer); + } + static native void nglTexCoord1d(double s, long function_pointer); + + public static void glTexCoord2f(float s, float t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord2f(s, t, function_pointer); + } + static native void nglTexCoord2f(float s, float t, long function_pointer); + + public static void glTexCoord2d(double s, double t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord2d(s, t, function_pointer); + } + static native void nglTexCoord2d(double s, double t, long function_pointer); + + public static void glTexCoord3f(float s, float t, float r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord3f(s, t, r, function_pointer); + } + static native void nglTexCoord3f(float s, float t, float r, long function_pointer); + + public static void glTexCoord3d(double s, double t, double r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord3d(s, t, r, function_pointer); + } + static native void nglTexCoord3d(double s, double t, double r, long function_pointer); + + public static void glTexCoord4f(float s, float t, float r, float q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord4f(s, t, r, q, function_pointer); + } + static native void nglTexCoord4f(float s, float t, float r, float q, long function_pointer); + + public static void glTexCoord4d(double s, double t, double r, double q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord4d(s, t, r, q, function_pointer); + } + static native void nglTexCoord4d(double s, double t, double r, double q, long function_pointer); + + public static void glStencilOp(int fail, int zfail, int zpass) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilOp; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilOp(fail, zfail, zpass, function_pointer); + } + static native void nglStencilOp(int fail, int zfail, int zpass, long function_pointer); + + public static void glStencilMask(int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilMask; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilMask(mask, function_pointer); + } + static native void nglStencilMask(int mask, long function_pointer); + + public static void glViewport(int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glViewport; + BufferChecks.checkFunctionAddress(function_pointer); + nglViewport(x, y, width, height, function_pointer); + } + static native void nglViewport(int x, int y, int width, int height, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL12.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL12.java new file mode 100644 index 0000000..8798fc4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL12.java @@ -0,0 +1,208 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <p/> + * The core OpenGL1.2.1 API, with the imaging subset. + * <p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class GL12 { + + public static final int GL_TEXTURE_BINDING_3D = 0x806A, + GL_PACK_SKIP_IMAGES = 0x806B, + GL_PACK_IMAGE_HEIGHT = 0x806C, + GL_UNPACK_SKIP_IMAGES = 0x806D, + GL_UNPACK_IMAGE_HEIGHT = 0x806E, + GL_TEXTURE_3D = 0x806F, + GL_PROXY_TEXTURE_3D = 0x8070, + GL_TEXTURE_DEPTH = 0x8071, + GL_TEXTURE_WRAP_R = 0x8072, + GL_MAX_3D_TEXTURE_SIZE = 0x8073, + GL_BGR = 0x80E0, + GL_BGRA = 0x80E1, + GL_UNSIGNED_BYTE_3_3_2 = 0x8032, + GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363, + GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364, + GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366, + GL_UNSIGNED_INT_8_8_8_8 = 0x8035, + GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367, + GL_UNSIGNED_INT_10_10_10_2 = 0x8036, + GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368, + GL_RESCALE_NORMAL = 0x803A, + GL_LIGHT_MODEL_COLOR_CONTROL = 0x81F8, + GL_SINGLE_COLOR = 0x81F9, + GL_SEPARATE_SPECULAR_COLOR = 0x81FA, + GL_CLAMP_TO_EDGE = 0x812F, + GL_TEXTURE_MIN_LOD = 0x813A, + GL_TEXTURE_MAX_LOD = 0x813B, + GL_TEXTURE_BASE_LEVEL = 0x813C, + GL_TEXTURE_MAX_LEVEL = 0x813D, + GL_MAX_ELEMENTS_VERTICES = 0x80E8, + GL_MAX_ELEMENTS_INDICES = 0x80E9, + GL_ALIASED_POINT_SIZE_RANGE = 0x846D, + GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, + GL_SMOOTH_POINT_SIZE_RANGE = 0xB12, + GL_SMOOTH_POINT_SIZE_GRANULARITY = 0xB13, + GL_SMOOTH_LINE_WIDTH_RANGE = 0xB22, + GL_SMOOTH_LINE_WIDTH_GRANULARITY = 0xB23; + + private GL12() {} + + public static void glDrawRangeElements(int mode, int start, int end, ByteBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), function_pointer); + } + public static void glDrawRangeElements(int mode, int start, int end, IntBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), function_pointer); + } + public static void glDrawRangeElements(int mode, int start, int end, ShortBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), function_pointer); + } + static native void nglDrawRangeElements(int mode, int start, int end, int indices_count, int type, long indices, long function_pointer); + public static void glDrawRangeElements(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElements; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawRangeElementsBO(mode, start, end, indices_count, type, indices_buffer_offset, function_pointer); + } + static native void nglDrawRangeElementsBO(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset, long function_pointer); + + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels), function_pointer); + } + static native void nglTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels, long function_pointer); + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexImage3DBO(target, level, internalFormat, width, height, depth, border, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexImage3DBO(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, DoubleBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer pixels) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels), function_pointer); + } + static native void nglTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels, long function_pointer); + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglTexSubImage3DBO(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_buffer_offset, function_pointer); + } + static native void nglTexSubImage3DBO(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset, long function_pointer); + + public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height, function_pointer); + } + static native void nglCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL13.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL13.java new file mode 100644 index 0000000..1430e63 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL13.java @@ -0,0 +1,383 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <p/> + * The core OpenGL1.3 API. + * <p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class GL13 { + + public static final int GL_TEXTURE0 = 0x84C0, + GL_TEXTURE1 = 0x84C1, + GL_TEXTURE2 = 0x84C2, + GL_TEXTURE3 = 0x84C3, + GL_TEXTURE4 = 0x84C4, + GL_TEXTURE5 = 0x84C5, + GL_TEXTURE6 = 0x84C6, + GL_TEXTURE7 = 0x84C7, + GL_TEXTURE8 = 0x84C8, + GL_TEXTURE9 = 0x84C9, + GL_TEXTURE10 = 0x84CA, + GL_TEXTURE11 = 0x84CB, + GL_TEXTURE12 = 0x84CC, + GL_TEXTURE13 = 0x84CD, + GL_TEXTURE14 = 0x84CE, + GL_TEXTURE15 = 0x84CF, + GL_TEXTURE16 = 0x84D0, + GL_TEXTURE17 = 0x84D1, + GL_TEXTURE18 = 0x84D2, + GL_TEXTURE19 = 0x84D3, + GL_TEXTURE20 = 0x84D4, + GL_TEXTURE21 = 0x84D5, + GL_TEXTURE22 = 0x84D6, + GL_TEXTURE23 = 0x84D7, + GL_TEXTURE24 = 0x84D8, + GL_TEXTURE25 = 0x84D9, + GL_TEXTURE26 = 0x84DA, + GL_TEXTURE27 = 0x84DB, + GL_TEXTURE28 = 0x84DC, + GL_TEXTURE29 = 0x84DD, + GL_TEXTURE30 = 0x84DE, + GL_TEXTURE31 = 0x84DF, + GL_ACTIVE_TEXTURE = 0x84E0, + GL_CLIENT_ACTIVE_TEXTURE = 0x84E1, + GL_MAX_TEXTURE_UNITS = 0x84E2, + GL_NORMAL_MAP = 0x8511, + GL_REFLECTION_MAP = 0x8512, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_BINDING_CUBE_MAP = 0x8514, + GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A, + GL_PROXY_TEXTURE_CUBE_MAP = 0x851B, + GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C, + GL_COMPRESSED_ALPHA = 0x84E9, + GL_COMPRESSED_LUMINANCE = 0x84EA, + GL_COMPRESSED_LUMINANCE_ALPHA = 0x84EB, + GL_COMPRESSED_INTENSITY = 0x84EC, + GL_COMPRESSED_RGB = 0x84ED, + GL_COMPRESSED_RGBA = 0x84EE, + GL_TEXTURE_COMPRESSION_HINT = 0x84EF, + GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3, + GL_MULTISAMPLE = 0x809D, + GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E, + GL_SAMPLE_ALPHA_TO_ONE = 0x809F, + GL_SAMPLE_COVERAGE = 0x80A0, + GL_SAMPLE_BUFFERS = 0x80A8, + GL_SAMPLES = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT = 0x80AB, + GL_MULTISAMPLE_BIT = 0x20000000, + GL_TRANSPOSE_MODELVIEW_MATRIX = 0x84E3, + GL_TRANSPOSE_PROJECTION_MATRIX = 0x84E4, + GL_TRANSPOSE_TEXTURE_MATRIX = 0x84E5, + GL_TRANSPOSE_COLOR_MATRIX = 0x84E6, + GL_COMBINE = 0x8570, + GL_COMBINE_RGB = 0x8571, + GL_COMBINE_ALPHA = 0x8572, + GL_SOURCE0_RGB = 0x8580, + GL_SOURCE1_RGB = 0x8581, + GL_SOURCE2_RGB = 0x8582, + GL_SOURCE0_ALPHA = 0x8588, + GL_SOURCE1_ALPHA = 0x8589, + GL_SOURCE2_ALPHA = 0x858A, + GL_OPERAND0_RGB = 0x8590, + GL_OPERAND1_RGB = 0x8591, + GL_OPERAND2_RGB = 0x8592, + GL_OPERAND0_ALPHA = 0x8598, + GL_OPERAND1_ALPHA = 0x8599, + GL_OPERAND2_ALPHA = 0x859A, + GL_RGB_SCALE = 0x8573, + GL_ADD_SIGNED = 0x8574, + GL_INTERPOLATE = 0x8575, + GL_SUBTRACT = 0x84E7, + GL_CONSTANT = 0x8576, + GL_PRIMARY_COLOR = 0x8577, + GL_PREVIOUS = 0x8578, + GL_DOT3_RGB = 0x86AE, + GL_DOT3_RGBA = 0x86AF, + GL_CLAMP_TO_BORDER = 0x812D; + + private GL13() {} + + public static void glActiveTexture(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveTexture; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveTexture(texture, function_pointer); + } + static native void nglActiveTexture(int texture, long function_pointer); + + public static void glClientActiveTexture(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClientActiveTexture; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.getReferences(caps).glClientActiveTexture = texture - GL_TEXTURE0; + nglClientActiveTexture(texture, function_pointer); + } + static native void nglClientActiveTexture(int texture, long function_pointer); + + public static void glCompressedTexImage1D(int target, int level, int internalformat, int width, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexImage1D(target, level, internalformat, width, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexImage1D(int target, int level, int internalformat, int width, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexImage1D(int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage1DBO(target, level, internalformat, width, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage1DBO(int target, int level, int internalformat, int width, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexImage2D(target, level, internalformat, width, height, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage2DBO(target, level, internalformat, width, height, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage2DBO(int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexImage3D(target, level, internalformat, width, height, depth, border, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexImage3DBO(target, level, internalformat, width, height, depth, border, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexImage3DBO(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage1D(int target, int level, int xoffset, int width, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexSubImage1D(target, level, xoffset, width, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexSubImage1D(int target, int level, int xoffset, int width, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexSubImage1D(int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage1D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage1DBO(target, level, xoffset, width, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage1DBO(int target, int level, int xoffset, int width, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage2DBO(target, level, xoffset, yoffset, width, height, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage2DBO(int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOdisabled(caps); + BufferChecks.checkDirect(data); + nglCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data, long function_pointer); + public static void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompressedTexSubImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureUnpackPBOenabled(caps); + nglCompressedTexSubImage3DBO(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data_imageSize, data_buffer_offset, function_pointer); + } + static native void nglCompressedTexSubImage3DBO(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset, long function_pointer); + + public static void glGetCompressedTexImage(int target, int lod, ByteBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTexImage(target, lod, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedTexImage(int target, int lod, IntBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTexImage(target, lod, MemoryUtil.getAddress(img), function_pointer); + } + public static void glGetCompressedTexImage(int target, int lod, ShortBuffer img) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOdisabled(caps); + BufferChecks.checkDirect(img); + nglGetCompressedTexImage(target, lod, MemoryUtil.getAddress(img), function_pointer); + } + static native void nglGetCompressedTexImage(int target, int lod, long img, long function_pointer); + public static void glGetCompressedTexImage(int target, int lod, long img_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCompressedTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensurePackPBOenabled(caps); + nglGetCompressedTexImageBO(target, lod, img_buffer_offset, function_pointer); + } + static native void nglGetCompressedTexImageBO(int target, int lod, long img_buffer_offset, long function_pointer); + + public static void glMultiTexCoord1f(int target, float s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1f(target, s, function_pointer); + } + static native void nglMultiTexCoord1f(int target, float s, long function_pointer); + + public static void glMultiTexCoord1d(int target, double s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1d(target, s, function_pointer); + } + static native void nglMultiTexCoord1d(int target, double s, long function_pointer); + + public static void glMultiTexCoord2f(int target, float s, float t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2f(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2f(int target, float s, float t, long function_pointer); + + public static void glMultiTexCoord2d(int target, double s, double t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2d(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2d(int target, double s, double t, long function_pointer); + + public static void glMultiTexCoord3f(int target, float s, float t, float r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3f(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3f(int target, float s, float t, float r, long function_pointer); + + public static void glMultiTexCoord3d(int target, double s, double t, double r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3d(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3d(int target, double s, double t, double r, long function_pointer); + + public static void glMultiTexCoord4f(int target, float s, float t, float r, float q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4f(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4f(int target, float s, float t, float r, float q, long function_pointer); + + public static void glMultiTexCoord4d(int target, double s, double t, double r, double q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4d(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4d(int target, double s, double t, double r, double q, long function_pointer); + + public static void glLoadTransposeMatrix(FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadTransposeMatrixf; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglLoadTransposeMatrixf(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglLoadTransposeMatrixf(long m, long function_pointer); + + public static void glLoadTransposeMatrix(DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadTransposeMatrixd; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglLoadTransposeMatrixd(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglLoadTransposeMatrixd(long m, long function_pointer); + + public static void glMultTransposeMatrix(FloatBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultTransposeMatrixf; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMultTransposeMatrixf(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMultTransposeMatrixf(long m, long function_pointer); + + public static void glMultTransposeMatrix(DoubleBuffer m) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultTransposeMatrixd; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(m, 16); + nglMultTransposeMatrixd(MemoryUtil.getAddress(m), function_pointer); + } + static native void nglMultTransposeMatrixd(long m, long function_pointer); + + public static void glSampleCoverage(float value, boolean invert) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSampleCoverage; + BufferChecks.checkFunctionAddress(function_pointer); + nglSampleCoverage(value, invert, function_pointer); + } + static native void nglSampleCoverage(float value, boolean invert, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL14.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL14.java new file mode 100644 index 0000000..2ff7c1f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL14.java @@ -0,0 +1,292 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * <p/> + * The core OpenGL1.4 API. + * <p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class GL14 { + + public static final int GL_GENERATE_MIPMAP = 0x8191, + GL_GENERATE_MIPMAP_HINT = 0x8192, + GL_DEPTH_COMPONENT16 = 0x81A5, + GL_DEPTH_COMPONENT24 = 0x81A6, + GL_DEPTH_COMPONENT32 = 0x81A7, + GL_TEXTURE_DEPTH_SIZE = 0x884A, + GL_DEPTH_TEXTURE_MODE = 0x884B, + GL_TEXTURE_COMPARE_MODE = 0x884C, + GL_TEXTURE_COMPARE_FUNC = 0x884D, + GL_COMPARE_R_TO_TEXTURE = 0x884E, + GL_FOG_COORDINATE_SOURCE = 0x8450, + GL_FOG_COORDINATE = 0x8451, + GL_FRAGMENT_DEPTH = 0x8452, + GL_CURRENT_FOG_COORDINATE = 0x8453, + GL_FOG_COORDINATE_ARRAY_TYPE = 0x8454, + GL_FOG_COORDINATE_ARRAY_STRIDE = 0x8455, + GL_FOG_COORDINATE_ARRAY_POINTER = 0x8456, + GL_FOG_COORDINATE_ARRAY = 0x8457, + GL_POINT_SIZE_MIN = 0x8126, + GL_POINT_SIZE_MAX = 0x8127, + GL_POINT_FADE_THRESHOLD_SIZE = 0x8128, + GL_POINT_DISTANCE_ATTENUATION = 0x8129, + GL_COLOR_SUM = 0x8458, + GL_CURRENT_SECONDARY_COLOR = 0x8459, + GL_SECONDARY_COLOR_ARRAY_SIZE = 0x845A, + GL_SECONDARY_COLOR_ARRAY_TYPE = 0x845B, + GL_SECONDARY_COLOR_ARRAY_STRIDE = 0x845C, + GL_SECONDARY_COLOR_ARRAY_POINTER = 0x845D, + GL_SECONDARY_COLOR_ARRAY = 0x845E, + GL_BLEND_DST_RGB = 0x80C8, + GL_BLEND_SRC_RGB = 0x80C9, + GL_BLEND_DST_ALPHA = 0x80CA, + GL_BLEND_SRC_ALPHA = 0x80CB, + GL_INCR_WRAP = 0x8507, + GL_DECR_WRAP = 0x8508, + GL_TEXTURE_FILTER_CONTROL = 0x8500, + GL_TEXTURE_LOD_BIAS = 0x8501, + GL_MAX_TEXTURE_LOD_BIAS = 0x84FD, + GL_MIRRORED_REPEAT = 0x8370, + GL_BLEND_COLOR = 0x8005, + GL_BLEND_EQUATION = 0x8009, + GL_FUNC_ADD = 0x8006, + GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B, + GL_MIN = 0x8007, + GL_MAX = 0x8008; + + private GL14() {} + + public static void glBlendEquation(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquation; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquation(mode, function_pointer); + } + static native void nglBlendEquation(int mode, long function_pointer); + + public static void glBlendColor(float red, float green, float blue, float alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendColor; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendColor(red, green, blue, alpha, function_pointer); + } + static native void nglBlendColor(float red, float green, float blue, float alpha, long function_pointer); + + public static void glFogCoordf(float coord) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordf; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoordf(coord, function_pointer); + } + static native void nglFogCoordf(float coord, long function_pointer); + + public static void glFogCoordd(double coord) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordd; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoordd(coord, function_pointer); + } + static native void nglFogCoordd(double coord, long function_pointer); + + public static void glFogCoordPointer(int stride, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL14_glFogCoordPointer_data = data; + nglFogCoordPointer(GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(data), function_pointer); + } + public static void glFogCoordPointer(int stride, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).GL14_glFogCoordPointer_data = data; + nglFogCoordPointer(GL11.GL_FLOAT, stride, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglFogCoordPointer(int type, int stride, long data, long function_pointer); + public static void glFogCoordPointer(int type, int stride, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglFogCoordPointerBO(type, stride, data_buffer_offset, function_pointer); + } + static native void nglFogCoordPointerBO(int type, int stride, long data_buffer_offset, long function_pointer); + + public static void glMultiDrawArrays(int mode, IntBuffer piFirst, IntBuffer piCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArrays; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piFirst); + BufferChecks.checkBuffer(piCount, piFirst.remaining()); + nglMultiDrawArrays(mode, MemoryUtil.getAddress(piFirst), MemoryUtil.getAddress(piCount), piFirst.remaining(), function_pointer); + } + static native void nglMultiDrawArrays(int mode, long piFirst, long piCount, int piFirst_primcount, long function_pointer); + + public static void glPointParameteri(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointParameteri(pname, param, function_pointer); + } + static native void nglPointParameteri(int pname, int param, long function_pointer); + + public static void glPointParameterf(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterf; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointParameterf(pname, param, function_pointer); + } + static native void nglPointParameterf(int pname, float param, long function_pointer); + + public static void glPointParameter(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglPointParameteriv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglPointParameteriv(int pname, long params, long function_pointer); + + public static void glPointParameter(int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglPointParameterfv(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglPointParameterfv(int pname, long params, long function_pointer); + + public static void glSecondaryColor3b(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3b; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3b(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3b(byte red, byte green, byte blue, long function_pointer); + + public static void glSecondaryColor3f(float red, float green, float blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3f(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3f(float red, float green, float blue, long function_pointer); + + public static void glSecondaryColor3d(double red, double green, double blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3d(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3d(double red, double green, double blue, long function_pointer); + + public static void glSecondaryColor3ub(byte red, byte green, byte blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3ub; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3ub(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3ub(byte red, byte green, byte blue, long function_pointer); + + public static void glSecondaryColorPointer(int size, int stride, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + nglSecondaryColorPointer(size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(data), function_pointer); + } + public static void glSecondaryColorPointer(int size, int stride, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + nglSecondaryColorPointer(size, GL11.GL_FLOAT, stride, MemoryUtil.getAddress(data), function_pointer); + } + public static void glSecondaryColorPointer(int size, boolean unsigned, int stride, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(data); + nglSecondaryColorPointer(size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, stride, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglSecondaryColorPointer(int size, int type, int stride, long data, long function_pointer); + public static void glSecondaryColorPointer(int size, int type, int stride, long data_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglSecondaryColorPointerBO(size, type, stride, data_buffer_offset, function_pointer); + } + static native void nglSecondaryColorPointerBO(int size, int type, int stride, long data_buffer_offset, long function_pointer); + + public static void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncSeparate; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha, function_pointer); + } + static native void nglBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha, long function_pointer); + + public static void glWindowPos2f(float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2f(x, y, function_pointer); + } + static native void nglWindowPos2f(float x, float y, long function_pointer); + + public static void glWindowPos2d(double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2d(x, y, function_pointer); + } + static native void nglWindowPos2d(double x, double y, long function_pointer); + + public static void glWindowPos2i(int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos2i(x, y, function_pointer); + } + static native void nglWindowPos2i(int x, int y, long function_pointer); + + public static void glWindowPos3f(float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3f(x, y, z, function_pointer); + } + static native void nglWindowPos3f(float x, float y, float z, long function_pointer); + + public static void glWindowPos3d(double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3d(x, y, z, function_pointer); + } + static native void nglWindowPos3d(double x, double y, double z, long function_pointer); + + public static void glWindowPos3i(int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWindowPos3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglWindowPos3i(x, y, z, function_pointer); + } + static native void nglWindowPos3i(int x, int y, int z, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL15.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL15.java new file mode 100644 index 0000000..5d225fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL15.java @@ -0,0 +1,486 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL15 { + + public static final int GL_ARRAY_BUFFER = 0x8892, + GL_ELEMENT_ARRAY_BUFFER = 0x8893, + GL_ARRAY_BUFFER_BINDING = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895, + GL_VERTEX_ARRAY_BUFFER_BINDING = 0x8896, + GL_NORMAL_ARRAY_BUFFER_BINDING = 0x8897, + GL_COLOR_ARRAY_BUFFER_BINDING = 0x8898, + GL_INDEX_ARRAY_BUFFER_BINDING = 0x8899, + GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 0x889A, + GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 0x889B, + GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 0x889C, + GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 0x889D, + GL_WEIGHT_ARRAY_BUFFER_BINDING = 0x889E, + GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F, + GL_STREAM_DRAW = 0x88E0, + GL_STREAM_READ = 0x88E1, + GL_STREAM_COPY = 0x88E2, + GL_STATIC_DRAW = 0x88E4, + GL_STATIC_READ = 0x88E5, + GL_STATIC_COPY = 0x88E6, + GL_DYNAMIC_DRAW = 0x88E8, + GL_DYNAMIC_READ = 0x88E9, + GL_DYNAMIC_COPY = 0x88EA, + GL_READ_ONLY = 0x88B8, + GL_WRITE_ONLY = 0x88B9, + GL_READ_WRITE = 0x88BA, + GL_BUFFER_SIZE = 0x8764, + GL_BUFFER_USAGE = 0x8765, + GL_BUFFER_ACCESS = 0x88BB, + GL_BUFFER_MAPPED = 0x88BC, + GL_BUFFER_MAP_POINTER = 0x88BD, + GL_FOG_COORD_SRC = 0x8450, + GL_FOG_COORD = 0x8451, + GL_CURRENT_FOG_COORD = 0x8453, + GL_FOG_COORD_ARRAY_TYPE = 0x8454, + GL_FOG_COORD_ARRAY_STRIDE = 0x8455, + GL_FOG_COORD_ARRAY_POINTER = 0x8456, + GL_FOG_COORD_ARRAY = 0x8457, + GL_FOG_COORD_ARRAY_BUFFER_BINDING = 0x889D, + GL_SRC0_RGB = 0x8580, + GL_SRC1_RGB = 0x8581, + GL_SRC2_RGB = 0x8582, + GL_SRC0_ALPHA = 0x8588, + GL_SRC1_ALPHA = 0x8589, + GL_SRC2_ALPHA = 0x858A; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + public static final int GL_SAMPLES_PASSED = 0x8914; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryiv: + */ + public static final int GL_QUERY_COUNTER_BITS = 0x8864, + GL_CURRENT_QUERY = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv and + * GetQueryObjectuiv: + */ + public static final int GL_QUERY_RESULT = 0x8866, + GL_QUERY_RESULT_AVAILABLE = 0x8867; + + private GL15() {} + + public static void glBindBuffer(int target, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.bindBuffer(caps, target, buffer); + nglBindBuffer(target, buffer, function_pointer); + } + static native void nglBindBuffer(int target, int buffer, long function_pointer); + + public static void glDeleteBuffers(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglDeleteBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglDeleteBuffers(int buffers_n, long buffers, long function_pointer); + + /** Overloads glDeleteBuffers. */ + public static void glDeleteBuffers(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteBuffers(1, APIUtil.getInt(caps, buffer), function_pointer); + } + + public static void glGenBuffers(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglGenBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglGenBuffers(int buffers_n, long buffers, long function_pointer); + + /** Overloads glGenBuffers. */ + public static int glGenBuffers() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer buffers = APIUtil.getBufferInt(caps); + nglGenBuffers(1, MemoryUtil.getAddress(buffers), function_pointer); + return buffers.get(0); + } + + public static boolean glIsBuffer(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsBuffer(buffer, function_pointer); + return __result; + } + static native boolean nglIsBuffer(int buffer, long function_pointer); + + public static void glBufferData(int target, long data_size, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + nglBufferData(target, data_size, 0L, usage, function_pointer); + } + public static void glBufferData(int target, ByteBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferData(target, data.remaining(), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferData(int target, DoubleBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 3), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferData(int target, FloatBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferData(int target, IntBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage, function_pointer); + } + public static void glBufferData(int target, ShortBuffer data, int usage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 1), MemoryUtil.getAddress(data), usage, function_pointer); + } + static native void nglBufferData(int target, long data_size, long data, int usage, long function_pointer); + + public static void glBufferSubData(int target, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubData(int target, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubData(int target, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubData(int target, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glBufferSubData(int target, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglBufferSubData(int target, long offset, long data_size, long data, long function_pointer); + + public static void glGetBufferSubData(int target, long offset, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubData(target, offset, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubData(int target, long offset, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubData(target, offset, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubData(int target, long offset, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubData(int target, long offset, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glGetBufferSubData(int target, long offset, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetBufferSubData(target, offset, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetBufferSubData(int target, long offset, long data_size, long data, long function_pointer); + + /** + * glMapBuffer maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBuffer(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBuffer(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBuffer(int target, int access, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBuffer(target, access, GLChecks.getBufferObjectSize(caps, target), old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + /** + * glMapBuffer maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBuffer(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBuffer(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBuffer(int target, int access, long length, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBuffer(target, access, length, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBuffer(int target, int access, long result_size, ByteBuffer old_buffer, long function_pointer); + + public static boolean glUnmapBuffer(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnmapBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglUnmapBuffer(target, function_pointer); + return __result; + } + static native boolean nglUnmapBuffer(int target, long function_pointer); + + public static void glGetBufferParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetBufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetBufferParameteriv(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetBufferParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri} instead. + */ + @Deprecated + public static int glGetBufferParameter(int target, int pname) { + return GL15.glGetBufferParameteri(target, pname); + } + + /** Overloads glGetBufferParameteriv. */ + public static int glGetBufferParameteri(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetBufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static ByteBuffer glGetBufferPointer(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferPointerv; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetBufferPointerv(target, pname, GLChecks.getBufferObjectSize(caps, target), function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetBufferPointerv(int target, int pname, long result_size, long function_pointer); + + public static void glGenQueries(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenQueries; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglGenQueries(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglGenQueries(int ids_n, long ids, long function_pointer); + + /** Overloads glGenQueries. */ + public static int glGenQueries() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenQueries; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer ids = APIUtil.getBufferInt(caps); + nglGenQueries(1, MemoryUtil.getAddress(ids), function_pointer); + return ids.get(0); + } + + public static void glDeleteQueries(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteQueries; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglDeleteQueries(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglDeleteQueries(int ids_n, long ids, long function_pointer); + + /** Overloads glDeleteQueries. */ + public static void glDeleteQueries(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteQueries; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteQueries(1, APIUtil.getInt(caps, id), function_pointer); + } + + public static boolean glIsQuery(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsQuery; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsQuery(id, function_pointer); + return __result; + } + static native boolean nglIsQuery(int id, long function_pointer); + + public static void glBeginQuery(int target, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginQuery; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginQuery(target, id, function_pointer); + } + static native void nglBeginQuery(int target, int id, long function_pointer); + + public static void glEndQuery(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndQuery; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndQuery(target, function_pointer); + } + static native void nglEndQuery(int target, long function_pointer); + + public static void glGetQuery(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryiv(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetQueryiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetQueryi} instead. + */ + @Deprecated + public static int glGetQuery(int target, int pname) { + return GL15.glGetQueryi(target, pname); + } + + /** Overloads glGetQueryiv. */ + public static int glGetQueryi(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObject(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectiv(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectiv(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjectiv. */ + public static int glGetQueryObjecti(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryObjectiv(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObjectu(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectuiv(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectuiv(int id, int pname, long params, long function_pointer); + + /** Overloads glGetQueryObjectuiv. */ + public static int glGetQueryObjectui(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectuiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryObjectuiv(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL20.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL20.java new file mode 100644 index 0000000..8aa536a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL20.java @@ -0,0 +1,1130 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL20 { + + /** + * Accepted by the &lt;name&gt; parameter of GetString: + */ + public static final int GL_SHADING_LANGUAGE_VERSION = 0x8B8C; + + /** + * Accepted by the &lt;pname&gt; argument of GetInteger: + */ + public static final int GL_CURRENT_PROGRAM = 0x8B8D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetObjectParameter{fi}vARB: + */ + public static final int GL_SHADER_TYPE = 0x8B4F, + GL_DELETE_STATUS = 0x8B80, + GL_COMPILE_STATUS = 0x8B81, + GL_LINK_STATUS = 0x8B82, + GL_VALIDATE_STATUS = 0x8B83, + GL_INFO_LOG_LENGTH = 0x8B84, + GL_ATTACHED_SHADERS = 0x8B85, + GL_ACTIVE_UNIFORMS = 0x8B86, + GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, + GL_ACTIVE_ATTRIBUTES = 0x8B89, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A, + GL_SHADER_SOURCE_LENGTH = 0x8B88; + + /** + * Returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: + */ + public static final int GL_SHADER_OBJECT = 0x8B48; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniformARB: + */ + public static final int GL_FLOAT_VEC2 = 0x8B50, + GL_FLOAT_VEC3 = 0x8B51, + GL_FLOAT_VEC4 = 0x8B52, + GL_INT_VEC2 = 0x8B53, + GL_INT_VEC3 = 0x8B54, + GL_INT_VEC4 = 0x8B55, + GL_BOOL = 0x8B56, + GL_BOOL_VEC2 = 0x8B57, + GL_BOOL_VEC3 = 0x8B58, + GL_BOOL_VEC4 = 0x8B59, + GL_FLOAT_MAT2 = 0x8B5A, + GL_FLOAT_MAT3 = 0x8B5B, + GL_FLOAT_MAT4 = 0x8B5C, + GL_SAMPLER_1D = 0x8B5D, + GL_SAMPLER_2D = 0x8B5E, + GL_SAMPLER_3D = 0x8B5F, + GL_SAMPLER_CUBE = 0x8B60, + GL_SAMPLER_1D_SHADOW = 0x8B61, + GL_SAMPLER_2D_SHADOW = 0x8B62; + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShader and + * returned by the &lt;params&gt; parameter of GetShader{if}v: + */ + public static final int GL_VERTEX_SHADER = 0x8B31; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A, + GL_MAX_VARYING_FLOATS = 0x8B4B, + GL_MAX_VERTEX_ATTRIBS = 0x8869, + GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D, + GL_MAX_TEXTURE_COORDS = 0x8871; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE = 0x8643; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib{dfi}vARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A, + GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShader and + * returned by the &lt;params&gt; parameter of GetShader{fi}vARB: + */ + public static final int GL_FRAGMENT_SHADER = 0x8B30; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + + /** + * Accepted by the &lt;target&gt; parameter of Hint and the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_DRAW_BUFFERS = 0x8824, + GL_DRAW_BUFFER0 = 0x8825, + GL_DRAW_BUFFER1 = 0x8826, + GL_DRAW_BUFFER2 = 0x8827, + GL_DRAW_BUFFER3 = 0x8828, + GL_DRAW_BUFFER4 = 0x8829, + GL_DRAW_BUFFER5 = 0x882A, + GL_DRAW_BUFFER6 = 0x882B, + GL_DRAW_BUFFER7 = 0x882C, + GL_DRAW_BUFFER8 = 0x882D, + GL_DRAW_BUFFER9 = 0x882E, + GL_DRAW_BUFFER10 = 0x882F, + GL_DRAW_BUFFER11 = 0x8830, + GL_DRAW_BUFFER12 = 0x8831, + GL_DRAW_BUFFER13 = 0x8832, + GL_DRAW_BUFFER14 = 0x8833, + GL_DRAW_BUFFER15 = 0x8834; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the &lt;target&gt; parameter of TexEnvi, TexEnviv, + * TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv: + */ + public static final int GL_POINT_SPRITE = 0x8861; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, or GetTexEnviv is POINT_SPRITE, then the value of + * &lt;pname&gt; may be: + */ + public static final int GL_COORD_REPLACE = 0x8862; + + /** + * Accepted by the &lt;pname&gt; parameter of PointParameter{if}vARB, and the + * &lt;pname&gt; of Get: + */ + public static final int GL_POINT_SPRITE_COORD_ORIGIN = 0x8CA0; + + /** + * Accepted by the &lt;param&gt; parameter of PointParameter{if}vARB: + */ + public static final int GL_LOWER_LEFT = 0x8CA1, + GL_UPPER_LEFT = 0x8CA2, + GL_STENCIL_BACK_FUNC = 0x8800, + GL_STENCIL_BACK_FAIL = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + GL_STENCIL_BACK_REF = 0x8CA3, + GL_STENCIL_BACK_VALUE_MASK = 0x8CA4, + GL_STENCIL_BACK_WRITEMASK = 0x8CA5, + GL_BLEND_EQUATION_RGB = 0x8009, + GL_BLEND_EQUATION_ALPHA = 0x883D; + + private GL20() {} + + /** + * The ARB_shader_objects extension allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + * <p> + * @param shader + * @param string + */ + public static void glShaderSource(int shader, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglShaderSource(shader, 1, MemoryUtil.getAddress(string), string.remaining(), function_pointer); + } + static native void nglShaderSource(int shader, int count, long string, int string_length, long function_pointer); + + /** Overloads glShaderSource. */ + public static void glShaderSource(int shader, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSource; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderSource(shader, 1, APIUtil.getBuffer(caps, string), string.length(), function_pointer); + } + + /** Overloads glShaderSource. */ + public static void glShaderSource(int shader, CharSequence[] strings) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderSource; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings); + nglShaderSource3(shader, strings.length, APIUtil.getBuffer(caps, strings), APIUtil.getLengths(caps, strings), function_pointer); + } + static native void nglShaderSource3(int shader, int count, long strings, long length, long function_pointer); + + public static int glCreateShader(int type) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShader; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateShader(type, function_pointer); + return __result; + } + static native int nglCreateShader(int type, long function_pointer); + + public static boolean glIsShader(int shader) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsShader; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsShader(shader, function_pointer); + return __result; + } + static native boolean nglIsShader(int shader, long function_pointer); + + public static void glCompileShader(int shader) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCompileShader; + BufferChecks.checkFunctionAddress(function_pointer); + nglCompileShader(shader, function_pointer); + } + static native void nglCompileShader(int shader, long function_pointer); + + public static void glDeleteShader(int shader) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteShader; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteShader(shader, function_pointer); + } + static native void nglDeleteShader(int shader, long function_pointer); + + public static int glCreateProgram() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateProgram; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateProgram(function_pointer); + return __result; + } + static native int nglCreateProgram(long function_pointer); + + public static boolean glIsProgram(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsProgram; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsProgram(program, function_pointer); + return __result; + } + static native boolean nglIsProgram(int program, long function_pointer); + + public static void glAttachShader(int program, int shader) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAttachShader; + BufferChecks.checkFunctionAddress(function_pointer); + nglAttachShader(program, shader, function_pointer); + } + static native void nglAttachShader(int program, int shader, long function_pointer); + + public static void glDetachShader(int program, int shader) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDetachShader; + BufferChecks.checkFunctionAddress(function_pointer); + nglDetachShader(program, shader, function_pointer); + } + static native void nglDetachShader(int program, int shader, long function_pointer); + + public static void glLinkProgram(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLinkProgram; + BufferChecks.checkFunctionAddress(function_pointer); + nglLinkProgram(program, function_pointer); + } + static native void nglLinkProgram(int program, long function_pointer); + + public static void glUseProgram(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUseProgram; + BufferChecks.checkFunctionAddress(function_pointer); + nglUseProgram(program, function_pointer); + } + static native void nglUseProgram(int program, long function_pointer); + + public static void glValidateProgram(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glValidateProgram; + BufferChecks.checkFunctionAddress(function_pointer); + nglValidateProgram(program, function_pointer); + } + static native void nglValidateProgram(int program, long function_pointer); + + public static void glDeleteProgram(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgram; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteProgram(program, function_pointer); + } + static native void nglDeleteProgram(int program, long function_pointer); + + public static void glUniform1f(int location, float v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1f(location, v0, function_pointer); + } + static native void nglUniform1f(int location, float v0, long function_pointer); + + public static void glUniform2f(int location, float v0, float v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2f(location, v0, v1, function_pointer); + } + static native void nglUniform2f(int location, float v0, float v1, long function_pointer); + + public static void glUniform3f(int location, float v0, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3f(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3f(int location, float v0, float v1, float v2, long function_pointer); + + public static void glUniform4f(int location, float v0, float v1, float v2, float v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4f(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4f(int location, float v0, float v1, float v2, float v3, long function_pointer); + + public static void glUniform1i(int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1i; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1i(location, v0, function_pointer); + } + static native void nglUniform1i(int location, int v0, long function_pointer); + + public static void glUniform2i(int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2i(location, v0, v1, function_pointer); + } + static native void nglUniform2i(int location, int v0, int v1, long function_pointer); + + public static void glUniform3i(int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3i(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3i(int location, int v0, int v1, int v2, long function_pointer); + + public static void glUniform4i(int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4i; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4i(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4i(int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glUniform1(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform1fv(location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform1fv(int location, int values_count, long values, long function_pointer); + + public static void glUniform2(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform2fv(location, values.remaining() >> 1, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform2fv(int location, int values_count, long values, long function_pointer); + + public static void glUniform3(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform3fv(location, values.remaining() / 3, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform3fv(int location, int values_count, long values, long function_pointer); + + public static void glUniform4(int location, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform4fv(location, values.remaining() >> 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform4fv(int location, int values_count, long values, long function_pointer); + + public static void glUniform1(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform1iv(location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform1iv(int location, int values_count, long values, long function_pointer); + + public static void glUniform2(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform2iv(location, values.remaining() >> 1, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform2iv(int location, int values_count, long values, long function_pointer); + + public static void glUniform3(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform3iv(location, values.remaining() / 3, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform3iv(int location, int values_count, long values, long function_pointer); + + public static void glUniform4(int location, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglUniform4iv(location, values.remaining() >> 2, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglUniform4iv(int location, int values_count, long values, long function_pointer); + + public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix2fv(location, matrices.remaining() >> 2, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix2fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix3fv(location, matrices.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix3fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix4fv(location, matrices.remaining() >> 4, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix4fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glGetShader(int shader, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetShaderiv(shader, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetShaderiv(int shader, int pname, long params, long function_pointer); + + /** + * Overloads glGetShaderiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetShaderi} instead. + */ + @Deprecated + public static int glGetShader(int shader, int pname) { + return GL20.glGetShaderi(shader, pname); + } + + /** Overloads glGetShaderiv. */ + public static int glGetShaderi(int shader, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetShaderiv(shader, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetProgram(int program, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetProgramiv(program, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramiv(int program, int pname, long params, long function_pointer); + + /** + * Overloads glGetProgramiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetProgrami} instead. + */ + @Deprecated + public static int glGetProgram(int program, int pname) { + return GL20.glGetProgrami(program, pname); + } + + /** Overloads glGetProgramiv. */ + public static int glGetProgrami(int program, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetProgramiv(program, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetShaderInfoLog(int shader, IntBuffer length, ByteBuffer infoLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetShaderInfoLog(shader, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog), function_pointer); + } + static native void nglGetShaderInfoLog(int shader, int infoLog_maxLength, long length, long infoLog, long function_pointer); + + /** Overloads glGetShaderInfoLog. */ + public static String glGetShaderInfoLog(int shader, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer infoLog_length = APIUtil.getLengths(caps); + ByteBuffer infoLog = APIUtil.getBufferByte(caps, maxLength); + nglGetShaderInfoLog(shader, maxLength, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog), function_pointer); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(caps, infoLog); + } + + public static void glGetProgramInfoLog(int program, IntBuffer length, ByteBuffer infoLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetProgramInfoLog(program, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog), function_pointer); + } + static native void nglGetProgramInfoLog(int program, int infoLog_maxLength, long length, long infoLog, long function_pointer); + + /** Overloads glGetProgramInfoLog. */ + public static String glGetProgramInfoLog(int program, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer infoLog_length = APIUtil.getLengths(caps); + ByteBuffer infoLog = APIUtil.getBufferByte(caps, maxLength); + nglGetProgramInfoLog(program, maxLength, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog), function_pointer); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(caps, infoLog); + } + + public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttachedShaders; + BufferChecks.checkFunctionAddress(function_pointer); + if (count != null) + BufferChecks.checkBuffer(count, 1); + BufferChecks.checkDirect(shaders); + nglGetAttachedShaders(program, shaders.remaining(), MemoryUtil.getAddressSafe(count), MemoryUtil.getAddress(shaders), function_pointer); + } + static native void nglGetAttachedShaders(int program, int shaders_maxCount, long count, long shaders, long function_pointer); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a + * <b>null-terminated</b> string. + * <p> + * @param program + * @param name + */ + public static int glGetUniformLocation(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(name, 1); + BufferChecks.checkNullTerminated(name); + int __result = nglGetUniformLocation(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetUniformLocation(int program, long name, long function_pointer); + + /** Overloads glGetUniformLocation. */ + public static int glGetUniformLocation(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformLocation; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetUniformLocation(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniform; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveUniform(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveUniform(int program, int index, int name_maxLength, long length, long size, long type, long name, long function_pointer); + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveUniform(int program, int index, int maxLength, IntBuffer sizeType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniform; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveUniform(program, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniformARB. This version returns only the uniform name. + */ + public static String glGetActiveUniform(int program, int index, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniform; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveUniform(program, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns only the uniform size. + */ + public static int glGetActiveUniformSize(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniform; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer size = APIUtil.getBufferInt(caps); + nglGetActiveUniform(program, index, 1, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0(caps), function_pointer); + return size.get(0); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns only the uniform type. + */ + public static int glGetActiveUniformType(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniform; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer type = APIUtil.getBufferInt(caps); + nglGetActiveUniform(program, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0(caps), function_pointer); + return type.get(0); + } + + public static void glGetUniform(int program, int location, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformfv(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformfv(int program, int location, long params, long function_pointer); + + public static void glGetUniform(int program, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformiv(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformiv(int program, int location, long params, long function_pointer); + + public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderSource; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(source); + nglGetShaderSource(shader, source.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(source), function_pointer); + } + static native void nglGetShaderSource(int shader, int source_maxLength, long length, long source, long function_pointer); + + /** Overloads glGetShaderSource. */ + public static String glGetShaderSource(int shader, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderSource; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer source_length = APIUtil.getLengths(caps); + ByteBuffer source = APIUtil.getBufferByte(caps, maxLength); + nglGetShaderSource(shader, maxLength, MemoryUtil.getAddress0(source_length), MemoryUtil.getAddress(source), function_pointer); + source.limit(source_length.get(0)); + return APIUtil.getString(caps, source); + } + + public static void glVertexAttrib1s(int index, short x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1s; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1s(index, x, function_pointer); + } + static native void nglVertexAttrib1s(int index, short x, long function_pointer); + + public static void glVertexAttrib1f(int index, float x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1f(index, x, function_pointer); + } + static native void nglVertexAttrib1f(int index, float x, long function_pointer); + + public static void glVertexAttrib1d(int index, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1d(index, x, function_pointer); + } + static native void nglVertexAttrib1d(int index, double x, long function_pointer); + + public static void glVertexAttrib2s(int index, short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2s; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2s(index, x, y, function_pointer); + } + static native void nglVertexAttrib2s(int index, short x, short y, long function_pointer); + + public static void glVertexAttrib2f(int index, float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2f(index, x, y, function_pointer); + } + static native void nglVertexAttrib2f(int index, float x, float y, long function_pointer); + + public static void glVertexAttrib2d(int index, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2d(index, x, y, function_pointer); + } + static native void nglVertexAttrib2d(int index, double x, double y, long function_pointer); + + public static void glVertexAttrib3s(int index, short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3s; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3s(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3s(int index, short x, short y, short z, long function_pointer); + + public static void glVertexAttrib3f(int index, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3f(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3f(int index, float x, float y, float z, long function_pointer); + + public static void glVertexAttrib3d(int index, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3d(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3d(int index, double x, double y, double z, long function_pointer); + + public static void glVertexAttrib4s(int index, short x, short y, short z, short w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4s; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4s(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4s(int index, short x, short y, short z, short w, long function_pointer); + + public static void glVertexAttrib4f(int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4f(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4f(int index, float x, float y, float z, float w, long function_pointer); + + public static void glVertexAttrib4d(int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4d(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4d(int index, double x, double y, double z, double w, long function_pointer); + + public static void glVertexAttrib4Nub(int index, byte x, byte y, byte z, byte w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4Nub; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4Nub(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4Nub(int index, byte x, byte y, byte z, byte w, long function_pointer); + + public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, DoubleBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, GL11.GL_DOUBLE, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GL11.GL_UNSIGNED_INT : GL11.GL_INT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, ShortBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GL11.GL_UNSIGNED_SHORT : GL11.GL_SHORT, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long buffer, long function_pointer); + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribPointerBO(index, size, type, normalized, stride, buffer_buffer_offset, function_pointer); + } + static native void nglVertexAttribPointerBO(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset, long function_pointer); + + /** Overloads glVertexAttribPointer. */ + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, type, normalized, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + + public static void glEnableVertexAttribArray(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnableVertexAttribArray; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnableVertexAttribArray(index, function_pointer); + } + static native void nglEnableVertexAttribArray(int index, long function_pointer); + + public static void glDisableVertexAttribArray(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisableVertexAttribArray; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisableVertexAttribArray(index, function_pointer); + } + static native void nglDisableVertexAttribArray(int index, long function_pointer); + + public static void glGetVertexAttrib(int index, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribfv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribfv(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttrib(int index, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribdv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribdv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribdv(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttrib(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribiv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribiv(int index, int pname, long params, long function_pointer); + + public static ByteBuffer glGetVertexAttribPointer(int index, int pname, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribPointerv; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVertexAttribPointerv(index, pname, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexAttribPointerv(int index, int pname, long result_size, long function_pointer); + + /** Overloads glGetVertexAttribPointerv. */ + public static void glGetVertexAttribPointer(int index, int pname, ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribPointerv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(pointer, PointerBuffer.getPointerSize()); + nglGetVertexAttribPointerv2(index, pname, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglGetVertexAttribPointerv2(int index, int pname, long pointer, long function_pointer); + + public static void glBindAttribLocation(int program, int index, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindAttribLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindAttribLocation(program, index, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglBindAttribLocation(int program, int index, long name, long function_pointer); + + /** Overloads glBindAttribLocation. */ + public static void glBindAttribLocation(int program, int index, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindAttribLocation; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindAttribLocation(program, index, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveAttrib(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveAttrib(int program, int index, int name_maxLength, long length, long size, long type, long name, long function_pointer); + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveAttrib(int program, int index, int maxLength, IntBuffer sizeType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveAttrib(program, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns only the attrib name. + */ + public static String glGetActiveAttrib(int program, int index, int maxLength) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, maxLength); + nglGetActiveAttrib(program, index, maxLength, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttribARB. This version returns only the attrib size. + */ + public static int glGetActiveAttribSize(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer size = APIUtil.getBufferInt(caps); + nglGetActiveAttrib(program, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0(caps), function_pointer); + return size.get(0); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns only the attrib type. + */ + public static int glGetActiveAttribType(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAttrib; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer type = APIUtil.getBufferInt(caps); + nglGetActiveAttrib(program, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0(caps), function_pointer); + return type.get(0); + } + + public static int glGetAttribLocation(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttribLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetAttribLocation(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetAttribLocation(int program, long name, long function_pointer); + + /** Overloads glGetAttribLocation. */ + public static int glGetAttribLocation(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetAttribLocation; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetAttribLocation(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glDrawBuffers(IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buffers); + nglDrawBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers), function_pointer); + } + static native void nglDrawBuffers(int buffers_size, long buffers, long function_pointer); + + /** Overloads glDrawBuffers. */ + public static void glDrawBuffers(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawBuffers(1, APIUtil.getInt(caps, buffer), function_pointer); + } + + public static void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilOpSeparate; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilOpSeparate(face, sfail, dpfail, dppass, function_pointer); + } + static native void nglStencilOpSeparate(int face, int sfail, int dpfail, int dppass, long function_pointer); + + public static void glStencilFuncSeparate(int face, int func, int ref, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilFuncSeparate; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilFuncSeparate(face, func, ref, mask, function_pointer); + } + static native void nglStencilFuncSeparate(int face, int func, int ref, int mask, long function_pointer); + + public static void glStencilMaskSeparate(int face, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilMaskSeparate; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilMaskSeparate(face, mask, function_pointer); + } + static native void nglStencilMaskSeparate(int face, int mask, long function_pointer); + + public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationSeparate; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationSeparate(modeRGB, modeAlpha, function_pointer); + } + static native void nglBlendEquationSeparate(int modeRGB, int modeAlpha, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL21.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL21.java new file mode 100644 index 0000000..cdbb9c5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL21.java @@ -0,0 +1,112 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL21 { + + /** + * Returned by the &lt;type&gt; parameter of GetActiveAttribARB. + */ + public static final int GL_FLOAT_MAT2x3 = 0x8B65, + GL_FLOAT_MAT2x4 = 0x8B66, + GL_FLOAT_MAT3x2 = 0x8B67, + GL_FLOAT_MAT3x4 = 0x8B68, + GL_FLOAT_MAT4x2 = 0x8B69, + GL_FLOAT_MAT4x3 = 0x8B6A; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv. + */ + public static final int GL_PIXEL_PACK_BUFFER = 0x88EB, + GL_PIXEL_UNPACK_BUFFER = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D. + */ + public static final int GL_SRGB = 0x8C40, + GL_SRGB8 = 0x8C41, + GL_SRGB_ALPHA = 0x8C42, + GL_SRGB8_ALPHA8 = 0x8C43, + GL_SLUMINANCE_ALPHA = 0x8C44, + GL_SLUMINANCE8_ALPHA8 = 0x8C45, + GL_SLUMINANCE = 0x8C46, + GL_SLUMINANCE8 = 0x8C47, + GL_COMPRESSED_SRGB = 0x8C48, + GL_COMPRESSED_SRGB_ALPHA = 0x8C49, + GL_COMPRESSED_SLUMINANCE = 0x8C4A, + GL_COMPRESSED_SLUMINANCE_ALPHA = 0x8C4B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv and GetFloatv. + */ + public static final int GL_CURRENT_RASTER_SECONDARY_COLOR = 0x845F; + + private GL21() {} + + public static void glUniformMatrix2x3(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2x3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix2x3fv(location, matrices.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix2x3fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix3x2(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3x2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix3x2fv(location, matrices.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix3x2fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix2x4(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2x4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix2x4fv(location, matrices.remaining() >> 3, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix2x4fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix4x2(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4x2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix4x2fv(location, matrices.remaining() >> 3, transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix4x2fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix3x4(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3x4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix3x4fv(location, matrices.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix3x4fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); + + public static void glUniformMatrix4x3(int location, boolean transpose, FloatBuffer matrices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4x3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(matrices); + nglUniformMatrix4x3fv(location, matrices.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(matrices), function_pointer); + } + static native void nglUniformMatrix4x3fv(int location, int matrices_count, boolean transpose, long matrices, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL30.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL30.java new file mode 100644 index 0000000..5245a53 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL30.java @@ -0,0 +1,1564 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL30 { + + public static final int GL_MAJOR_VERSION = 0x821B, + GL_MINOR_VERSION = 0x821C, + GL_NUM_EXTENSIONS = 0x821D, + GL_CONTEXT_FLAGS = 0x821E, + GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x1, + GL_DEPTH_BUFFER = 0x8223, + GL_STENCIL_BUFFER = 0x8224, + GL_COMPRESSED_RED = 0x8225, + GL_COMPRESSED_RG = 0x8226, + GL_COMPARE_REF_TO_TEXTURE = 0x884E, + GL_CLIP_DISTANCE0 = 0x3000, + GL_CLIP_DISTANCE1 = 0x3001, + GL_CLIP_DISTANCE2 = 0x3002, + GL_CLIP_DISTANCE3 = 0x3003, + GL_CLIP_DISTANCE4 = 0x3004, + GL_CLIP_DISTANCE5 = 0x3005, + GL_CLIP_DISTANCE6 = 0x3006, + GL_CLIP_DISTANCE7 = 0x3007, + GL_MAX_CLIP_DISTANCES = 0xD32, + GL_MAX_VARYING_COMPONENTS = 0x8B4B, + GL_BUFFER_ACCESS_FLAGS = 0x911F, + GL_BUFFER_MAP_LENGTH = 0x9120, + GL_BUFFER_MAP_OFFSET = 0x9121; + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIiv, and + * GetVertexAttribIuiv: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_BUFFER = 0x8DC2, + GL_SAMPLER_CUBE_SHADOW = 0x8DC5, + GL_UNSIGNED_INT_VEC2 = 0x8DC6, + GL_UNSIGNED_INT_VEC3 = 0x8DC7, + GL_UNSIGNED_INT_VEC4 = 0x8DC8, + GL_INT_SAMPLER_1D = 0x8DC9, + GL_INT_SAMPLER_2D = 0x8DCA, + GL_INT_SAMPLER_3D = 0x8DCB, + GL_INT_SAMPLER_CUBE = 0x8DCC, + GL_INT_SAMPLER_2D_RECT = 0x8DCD, + GL_INT_SAMPLER_1D_ARRAY = 0x8DCE, + GL_INT_SAMPLER_2D_ARRAY = 0x8DCF, + GL_INT_SAMPLER_BUFFER = 0x8DD0, + GL_UNSIGNED_INT_SAMPLER_1D = 0x8DD1, + GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5, + GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7, + GL_UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + + /** + * Accepted by the &lt;mode&gt; parameter of BeginConditionalRender: + */ + public static final int GL_QUERY_WAIT = 0x8E13, + GL_QUERY_NO_WAIT = 0x8E14, + GL_QUERY_BY_REGION_WAIT = 0x8E15, + GL_QUERY_BY_REGION_NO_WAIT = 0x8E16; + + /** + * Accepted by the &lt;access&gt; parameter of MapBufferRange: + */ + public static final int GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20; + + /** + * Accepted by the &lt;target&gt; parameter of ClampColor and the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_CLAMP_VERTEX_COLOR = 0x891A, + GL_CLAMP_FRAGMENT_COLOR = 0x891B, + GL_CLAMP_READ_COLOR = 0x891C; + + /** + * Accepted by the &lt;clamp&gt; parameter of ClampColor. + */ + public static final int GL_FIXED_ONLY = 0x891D; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + public static final int GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_RED_TYPE = 0x8C10, + GL_TEXTURE_GREEN_TYPE = 0x8C11, + GL_TEXTURE_BLUE_TYPE = 0x8C12, + GL_TEXTURE_ALPHA_TYPE = 0x8C13, + GL_TEXTURE_LUMINANCE_TYPE = 0x8C14, + GL_TEXTURE_INTENSITY_TYPE = 0x8C15, + GL_TEXTURE_DEPTH_TYPE = 0x8C16; + + /** + * Returned by the &lt;params&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_UNSIGNED_NORMALIZED = 0x8C17; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA32F = 0x8814, + GL_RGB32F = 0x8815, + GL_ALPHA32F = 0x8816, + GL_RGBA16F = 0x881A, + GL_RGB16F = 0x881B, + GL_ALPHA16F = 0x881C; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + public static final int GL_R11F_G11F_B10F = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + public static final int GL_RGB9_E5 = 0x8C3D; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + public static final int GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + public static final int GL_TEXTURE_SHARED_SIZE = 0x8C3F; + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER = 0x8D40, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbuffer, + * RenderbufferStorage, and GetRenderbufferParameteriv, and + * returned by GetFramebufferAttachmentParameteriv: + */ + public static final int GL_RENDERBUFFER = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorage: + */ + public static final int GL_STENCIL_INDEX1 = 0x8D46, + GL_STENCIL_INDEX4 = 0x8D47, + GL_STENCIL_INDEX8 = 0x8D48, + GL_STENCIL_INDEX16 = 0x8D49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** + * Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_DEFAULT = 0x8218, + GL_INDEX = 0x8222; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv + */ + public static final int GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** + * Returned by CheckFramebufferStatus(): + */ + public static final int GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** + * Returned by GetError(): + */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, + * SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, + * and GetColorTable: + * <p/> + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, + * and VertexAttribPointer: + */ + public static final int GL_HALF_FLOAT = 0x140B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv. + */ + public static final int GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** + * Returned by CheckFramebufferStatus. + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + public static final int GL_MAX_SAMPLES = 0x8D57; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_RGBA_INTEGER_MODE = 0x8D9E; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + public static final int GL_RGBA32UI = 0x8D70, + GL_RGB32UI = 0x8D71, + GL_ALPHA32UI = 0x8D72, + GL_RGBA16UI = 0x8D76, + GL_RGB16UI = 0x8D77, + GL_ALPHA16UI = 0x8D78, + GL_RGBA8UI = 0x8D7C, + GL_RGB8UI = 0x8D7D, + GL_ALPHA8UI = 0x8D7E, + GL_RGBA32I = 0x8D82, + GL_RGB32I = 0x8D83, + GL_ALPHA32I = 0x8D84, + GL_RGBA16I = 0x8D88, + GL_RGB16I = 0x8D89, + GL_ALPHA16I = 0x8D8A, + GL_RGBA8I = 0x8D8E, + GL_RGB8I = 0x8D8F, + GL_ALPHA8I = 0x8D90; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + public static final int GL_RED_INTEGER = 0x8D94, + GL_GREEN_INTEGER = 0x8D95, + GL_BLUE_INTEGER = 0x8D96, + GL_ALPHA_INTEGER = 0x8D97, + GL_RGB_INTEGER = 0x8D98, + GL_RGBA_INTEGER = 0x8D99, + GL_BGR_INTEGER = 0x8D9A, + GL_BGRA_INTEGER = 0x8D9B; + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + public static final int GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D_ARRAY = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_1D_ARRAY = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_ARB: + */ + public static final int GL_COMPARE_REF_DEPTH_TO_TEXTURE = 0x884E; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_1D_ARRAY = 0x8DC0, + GL_SAMPLER_2D_ARRAY = 0x8DC1, + GL_SAMPLER_1D_ARRAY_SHADOW = 0x8DC3, + GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + * CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage. + */ + public static final int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv. + */ + public static final int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter. + */ + public static final int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, and CopyTexImage2D: + */ + public static final int GL_R8 = 0x8229, + GL_R16 = 0x822A, + GL_RG8 = 0x822B, + GL_RG16 = 0x822C, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage3D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + public static final int GL_RG = 0x8227, + GL_RG_INTEGER = 0x8228; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRange, BindBufferOffset and + * BindBufferBase: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedv and + * GetBooleanIndexedv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedv and + * GetBooleanIndexedv, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + + /** + * Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackVaryings: + */ + public static final int GL_INTERLEAVED_ATTRIBS = 0x8C8C, + GL_SEPARATE_ATTRIBS = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_PRIMITIVES_GENERATED = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_RASTERIZER_DISCARD = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_FRAMEBUFFER_SRGB_CAPABLE = 0x8DBA; + + private GL30() {} + + public static String glGetStringi(int name, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetStringi; + BufferChecks.checkFunctionAddress(function_pointer); + String __result = nglGetStringi(name, index, function_pointer); + return __result; + } + static native String nglGetStringi(int name, int index, long function_pointer); + + public static void glClearBuffer(int buffer, int drawbuffer, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglClearBufferfv(buffer, drawbuffer, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglClearBufferfv(int buffer, int drawbuffer, long value, long function_pointer); + + public static void glClearBuffer(int buffer, int drawbuffer, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglClearBufferiv(buffer, drawbuffer, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglClearBufferiv(int buffer, int drawbuffer, long value, long function_pointer); + + public static void glClearBufferu(int buffer, int drawbuffer, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglClearBufferuiv(buffer, drawbuffer, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglClearBufferuiv(int buffer, int drawbuffer, long value, long function_pointer); + + public static void glClearBufferfi(int buffer, int drawbuffer, float depth, int stencil) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferfi; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearBufferfi(buffer, drawbuffer, depth, stencil, function_pointer); + } + static native void nglClearBufferfi(int buffer, int drawbuffer, float depth, int stencil, long function_pointer); + + public static void glVertexAttribI1i(int index, int x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI1i(index, x, function_pointer); + } + static native void nglVertexAttribI1i(int index, int x, long function_pointer); + + public static void glVertexAttribI2i(int index, int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI2i(index, x, y, function_pointer); + } + static native void nglVertexAttribI2i(int index, int x, int y, long function_pointer); + + public static void glVertexAttribI3i(int index, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI3i(index, x, y, z, function_pointer); + } + static native void nglVertexAttribI3i(int index, int x, int y, int z, long function_pointer); + + public static void glVertexAttribI4i(int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4i; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI4i(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribI4i(int index, int x, int y, int z, int w, long function_pointer); + + public static void glVertexAttribI1ui(int index, int x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI1ui(index, x, function_pointer); + } + static native void nglVertexAttribI1ui(int index, int x, long function_pointer); + + public static void glVertexAttribI2ui(int index, int x, int y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI2ui(index, x, y, function_pointer); + } + static native void nglVertexAttribI2ui(int index, int x, int y, long function_pointer); + + public static void glVertexAttribI3ui(int index, int x, int y, int z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI3ui(index, x, y, z, function_pointer); + } + static native void nglVertexAttribI3ui(int index, int x, int y, int z, long function_pointer); + + public static void glVertexAttribI4ui(int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribI4ui(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribI4ui(int index, int x, int y, int z, int w, long function_pointer); + + public static void glVertexAttribI1(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribI1iv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI1iv(int index, long v, long function_pointer); + + public static void glVertexAttribI2(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribI2iv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI2iv(int index, long v, long function_pointer); + + public static void glVertexAttribI3(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribI3iv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI3iv(int index, long v, long function_pointer); + + public static void glVertexAttribI4(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4iv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4iv(int index, long v, long function_pointer); + + public static void glVertexAttribI1u(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribI1uiv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI1uiv(int index, long v, long function_pointer); + + public static void glVertexAttribI2u(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribI2uiv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI2uiv(int index, long v, long function_pointer); + + public static void glVertexAttribI3u(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribI3uiv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI3uiv(int index, long v, long function_pointer); + + public static void glVertexAttribI4u(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4uiv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4uiv(int index, long v, long function_pointer); + + public static void glVertexAttribI4(int index, ByteBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4bv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4bv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4bv(int index, long v, long function_pointer); + + public static void glVertexAttribI4(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4sv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4sv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4sv(int index, long v, long function_pointer); + + public static void glVertexAttribI4u(int index, ByteBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4ubv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4ubv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4ubv(int index, long v, long function_pointer); + + public static void glVertexAttribI4u(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribI4usv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4usv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribI4usv(int index, long v, long function_pointer); + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglVertexAttribIPointer(int index, int size, int type, int stride, long buffer, long function_pointer); + public static void glVertexAttribIPointer(int index, int size, int type, int stride, long buffer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribIPointerBO(index, size, type, stride, buffer_buffer_offset, function_pointer); + } + static native void nglVertexAttribIPointerBO(int index, int size, int type, int stride, long buffer_buffer_offset, long function_pointer); + + public static void glGetVertexAttribI(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribIiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIiv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribIiv(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribIu(int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIuiv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribIuiv(int index, int pname, long params, long function_pointer); + + public static void glUniform1ui(int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1ui(location, v0, function_pointer); + } + static native void nglUniform1ui(int location, int v0, long function_pointer); + + public static void glUniform2ui(int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2ui(location, v0, v1, function_pointer); + } + static native void nglUniform2ui(int location, int v0, int v1, long function_pointer); + + public static void glUniform3ui(int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3ui(location, v0, v1, v2, function_pointer); + } + static native void nglUniform3ui(int location, int v0, int v1, int v2, long function_pointer); + + public static void glUniform4ui(int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4ui(location, v0, v1, v2, v3, function_pointer); + } + static native void nglUniform4ui(int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glUniform1u(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform1uiv(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform1uiv(int location, int value_count, long value, long function_pointer); + + public static void glUniform2u(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform2uiv(location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform2uiv(int location, int value_count, long value, long function_pointer); + + public static void glUniform3u(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform3uiv(location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform3uiv(int location, int value_count, long value, long function_pointer); + + public static void glUniform4u(int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform4uiv(location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform4uiv(int location, int value_count, long value, long function_pointer); + + public static void glGetUniformu(int program, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformuiv(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformuiv(int program, int location, long params, long function_pointer); + + public static void glBindFragDataLocation(int program, int colorNumber, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindFragDataLocation(program, colorNumber, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglBindFragDataLocation(int program, int colorNumber, long name, long function_pointer); + + /** Overloads glBindFragDataLocation. */ + public static void glBindFragDataLocation(int program, int colorNumber, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocation; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFragDataLocation(program, colorNumber, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static int glGetFragDataLocation(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetFragDataLocation(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetFragDataLocation(int program, long name, long function_pointer); + + /** Overloads glGetFragDataLocation. */ + public static int glGetFragDataLocation(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataLocation; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetFragDataLocation(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glBeginConditionalRender(int id, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginConditionalRender; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginConditionalRender(id, mode, function_pointer); + } + static native void nglBeginConditionalRender(int id, int mode, long function_pointer); + + public static void glEndConditionalRender() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndConditionalRender; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndConditionalRender(function_pointer); + } + static native void nglEndConditionalRender(long function_pointer); + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapBufferRange; + BufferChecks.checkFunctionAddress(function_pointer); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferRange(target, offset, length, access, old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer, long function_pointer); + + public static void glFlushMappedBufferRange(int target, long offset, long length) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushMappedBufferRange; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlushMappedBufferRange(target, offset, length, function_pointer); + } + static native void nglFlushMappedBufferRange(int target, long offset, long length, long function_pointer); + + public static void glClampColor(int target, int clamp) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClampColor; + BufferChecks.checkFunctionAddress(function_pointer); + nglClampColor(target, clamp, function_pointer); + } + static native void nglClampColor(int target, int clamp, long function_pointer); + + public static boolean glIsRenderbuffer(int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsRenderbuffer; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsRenderbuffer(renderbuffer, function_pointer); + return __result; + } + static native boolean nglIsRenderbuffer(int renderbuffer, long function_pointer); + + public static void glBindRenderbuffer(int target, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindRenderbuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindRenderbuffer(target, renderbuffer, function_pointer); + } + static native void nglBindRenderbuffer(int target, int renderbuffer, long function_pointer); + + public static void glDeleteRenderbuffers(IntBuffer renderbuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteRenderbuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(renderbuffers); + nglDeleteRenderbuffers(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers), function_pointer); + } + static native void nglDeleteRenderbuffers(int renderbuffers_n, long renderbuffers, long function_pointer); + + /** Overloads glDeleteRenderbuffers. */ + public static void glDeleteRenderbuffers(int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteRenderbuffers; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteRenderbuffers(1, APIUtil.getInt(caps, renderbuffer), function_pointer); + } + + public static void glGenRenderbuffers(IntBuffer renderbuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenRenderbuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(renderbuffers); + nglGenRenderbuffers(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers), function_pointer); + } + static native void nglGenRenderbuffers(int renderbuffers_n, long renderbuffers, long function_pointer); + + /** Overloads glGenRenderbuffers. */ + public static int glGenRenderbuffers() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenRenderbuffers; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer renderbuffers = APIUtil.getBufferInt(caps); + nglGenRenderbuffers(1, MemoryUtil.getAddress(renderbuffers), function_pointer); + return renderbuffers.get(0); + } + + public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderbufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + nglRenderbufferStorage(target, internalformat, width, height, function_pointer); + } + static native void nglRenderbufferStorage(int target, int internalformat, int width, int height, long function_pointer); + + public static void glGetRenderbufferParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetRenderbufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetRenderbufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetRenderbufferParameteriv(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetRenderbufferParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. + */ + @Deprecated + public static int glGetRenderbufferParameter(int target, int pname) { + return GL30.glGetRenderbufferParameteri(target, pname); + } + + /** Overloads glGetRenderbufferParameteriv. */ + public static int glGetRenderbufferParameteri(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetRenderbufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetRenderbufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static boolean glIsFramebuffer(int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsFramebuffer; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsFramebuffer(framebuffer, function_pointer); + return __result; + } + static native boolean nglIsFramebuffer(int framebuffer, long function_pointer); + + public static void glBindFramebuffer(int target, int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFramebuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFramebuffer(target, framebuffer, function_pointer); + } + static native void nglBindFramebuffer(int target, int framebuffer, long function_pointer); + + public static void glDeleteFramebuffers(IntBuffer framebuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFramebuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(framebuffers); + nglDeleteFramebuffers(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers), function_pointer); + } + static native void nglDeleteFramebuffers(int framebuffers_n, long framebuffers, long function_pointer); + + /** Overloads glDeleteFramebuffers. */ + public static void glDeleteFramebuffers(int framebuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFramebuffers; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteFramebuffers(1, APIUtil.getInt(caps, framebuffer), function_pointer); + } + + public static void glGenFramebuffers(IntBuffer framebuffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFramebuffers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(framebuffers); + nglGenFramebuffers(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers), function_pointer); + } + static native void nglGenFramebuffers(int framebuffers_n, long framebuffers, long function_pointer); + + /** Overloads glGenFramebuffers. */ + public static int glGenFramebuffers() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFramebuffers; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer framebuffers = APIUtil.getBufferInt(caps); + nglGenFramebuffers(1, MemoryUtil.getAddress(framebuffers), function_pointer); + return framebuffers.get(0); + } + + public static int glCheckFramebufferStatus(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCheckFramebufferStatus; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCheckFramebufferStatus(target, function_pointer); + return __result; + } + static native int nglCheckFramebufferStatus(int target, long function_pointer); + + public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture1D; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture1D(target, attachment, textarget, texture, level, function_pointer); + } + static native void nglFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture2D; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture2D(target, attachment, textarget, texture, level, function_pointer); + } + static native void nglFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level, long function_pointer); + + public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture3D; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset, function_pointer); + } + static native void nglFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset, long function_pointer); + + public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferRenderbuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer, function_pointer); + } + static native void nglFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer, long function_pointer); + + public static void glGetFramebufferAttachmentParameter(int target, int attachment, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferAttachmentParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFramebufferAttachmentParameteriv(int target, int attachment, int pname, long params, long function_pointer); + + /** + * Overloads glGetFramebufferAttachmentParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. + */ + @Deprecated + public static int glGetFramebufferAttachmentParameter(int target, int attachment, int pname) { + return GL30.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + /** Overloads glGetFramebufferAttachmentParameteriv. */ + public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferAttachmentParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGenerateMipmap(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenerateMipmap; + BufferChecks.checkFunctionAddress(function_pointer); + nglGenerateMipmap(target, function_pointer); + } + static native void nglGenerateMipmap(int target, long function_pointer); + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderbufferStorageMultisample; + BufferChecks.checkFunctionAddress(function_pointer); + nglRenderbufferStorageMultisample(target, samples, internalformat, width, height, function_pointer); + } + static native void nglRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height, long function_pointer); + + /** + * Transfers a rectangle of pixel values from one + * region of the read framebuffer to another in the draw framebuffer. + * &lt;mask&gt; is the bitwise OR of a number of values indicating which + * buffers are to be copied. The values are COLOR_BUFFER_BIT, + * DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + * The pixels corresponding to these buffers are + * copied from the source rectangle, bound by the locations (srcX0, + * srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + * bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + * inclusive. + * If the source and destination rectangle dimensions do not match, + * the source image is stretched to fit the destination + * rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + * method of interpolation to be applied if the image is + * stretched. + */ + public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlitFramebuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, function_pointer); + } + static native void nglBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter, long function_pointer); + + public static void glTexParameterI(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexParameterIiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexParameterIiv(int target, int pname, long params, long function_pointer); + + /** Overloads glTexParameterIiv. */ + public static void glTexParameterIi(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameterIiv(target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glTexParameterIu(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglTexParameterIuiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglTexParameterIuiv(int target, int pname, long params, long function_pointer); + + /** Overloads glTexParameterIuiv. */ + public static void glTexParameterIui(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexParameterIuiv(target, pname, APIUtil.getInt(caps, param), function_pointer); + } + + public static void glGetTexParameterI(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameterIiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameterIiv(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameterIiv. */ + public static int glGetTexParameterIi(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexParameterIiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetTexParameterIu(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTexParameterIuiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTexParameterIuiv(int target, int pname, long params, long function_pointer); + + /** Overloads glGetTexParameterIuiv. */ + public static int glGetTexParameterIui(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTexParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetTexParameterIuiv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTextureLayer; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTextureLayer(target, attachment, texture, level, layer, function_pointer); + } + static native void nglFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer, long function_pointer); + + public static void glColorMaski(int buf, boolean r, boolean g, boolean b, boolean a) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorMaski; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorMaski(buf, r, g, b, a, function_pointer); + } + static native void nglColorMaski(int buf, boolean r, boolean g, boolean b, boolean a, long function_pointer); + + public static void glGetBoolean(int value, int index, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleani_v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 4); + nglGetBooleani_v(value, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetBooleani_v(int value, int index, long data, long function_pointer); + + /** Overloads glGetBooleani_v. */ + public static boolean glGetBoolean(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBooleani_v; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer data = APIUtil.getBufferByte(caps, 1); + nglGetBooleani_v(value, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0) == 1; + } + + public static void glGetInteger(int value, int index, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegeri_v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 4); + nglGetIntegeri_v(value, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetIntegeri_v(int value, int index, long data, long function_pointer); + + /** Overloads glGetIntegeri_v. */ + public static int glGetInteger(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegeri_v; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer data = APIUtil.getBufferInt(caps); + nglGetIntegeri_v(value, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } + + public static void glEnablei(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEnablei; + BufferChecks.checkFunctionAddress(function_pointer); + nglEnablei(target, index, function_pointer); + } + static native void nglEnablei(int target, int index, long function_pointer); + + public static void glDisablei(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDisablei; + BufferChecks.checkFunctionAddress(function_pointer); + nglDisablei(target, index, function_pointer); + } + static native void nglDisablei(int target, int index, long function_pointer); + + public static boolean glIsEnabledi(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsEnabledi; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsEnabledi(target, index, function_pointer); + return __result; + } + static native boolean nglIsEnabledi(int target, int index, long function_pointer); + + public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferRange; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferRange(target, index, buffer, offset, size, function_pointer); + } + static native void nglBindBufferRange(int target, int index, int buffer, long offset, long size, long function_pointer); + + public static void glBindBufferBase(int target, int index, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferBase; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferBase(target, index, buffer, function_pointer); + } + static native void nglBindBufferBase(int target, int index, int buffer, long function_pointer); + + public static void glBeginTransformFeedback(int primitiveMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginTransformFeedback(primitiveMode, function_pointer); + } + static native void nglBeginTransformFeedback(int primitiveMode, long function_pointer); + + public static void glEndTransformFeedback() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndTransformFeedback(function_pointer); + } + static native void nglEndTransformFeedback(long function_pointer); + + public static void glTransformFeedbackVaryings(int program, int count, ByteBuffer varyings, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackVaryings; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(varyings); + BufferChecks.checkNullTerminated(varyings, count); + nglTransformFeedbackVaryings(program, count, MemoryUtil.getAddress(varyings), bufferMode, function_pointer); + } + static native void nglTransformFeedbackVaryings(int program, int count, long varyings, int bufferMode, long function_pointer); + + /** Overloads glTransformFeedbackVaryings. */ + public static void glTransformFeedbackVaryings(int program, CharSequence[] varyings, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackVaryings; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(varyings); + nglTransformFeedbackVaryings(program, varyings.length, APIUtil.getBufferNT(caps, varyings), bufferMode, function_pointer); + } + + public static void glGetTransformFeedbackVarying(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVarying; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetTransformFeedbackVarying(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetTransformFeedbackVarying(int program, int index, int name_bufSize, long length, long size, long type, long name, long function_pointer); + + /** Overloads glGetTransformFeedbackVarying. */ + public static String glGetTransformFeedbackVarying(int program, int index, int bufSize, IntBuffer size, IntBuffer type) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVarying; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufSize); + nglGetTransformFeedbackVarying(program, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + public static void glBindVertexArray(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVertexArray; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.bindVAO(caps, array); + nglBindVertexArray(array, function_pointer); + } + static native void nglBindVertexArray(int array, long function_pointer); + + public static void glDeleteVertexArrays(IntBuffer arrays) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteVertexArrays; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.deleteVAO(caps, arrays); + BufferChecks.checkDirect(arrays); + nglDeleteVertexArrays(arrays.remaining(), MemoryUtil.getAddress(arrays), function_pointer); + } + static native void nglDeleteVertexArrays(int arrays_n, long arrays, long function_pointer); + + /** Overloads glDeleteVertexArrays. */ + public static void glDeleteVertexArrays(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteVertexArrays; + BufferChecks.checkFunctionAddress(function_pointer); + StateTracker.deleteVAO(caps, array); + nglDeleteVertexArrays(1, APIUtil.getInt(caps, array), function_pointer); + } + + public static void glGenVertexArrays(IntBuffer arrays) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenVertexArrays; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(arrays); + nglGenVertexArrays(arrays.remaining(), MemoryUtil.getAddress(arrays), function_pointer); + } + static native void nglGenVertexArrays(int arrays_n, long arrays, long function_pointer); + + /** Overloads glGenVertexArrays. */ + public static int glGenVertexArrays() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenVertexArrays; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer arrays = APIUtil.getBufferInt(caps); + nglGenVertexArrays(1, MemoryUtil.getAddress(arrays), function_pointer); + return arrays.get(0); + } + + public static boolean glIsVertexArray(int array) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsVertexArray; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsVertexArray(array, function_pointer); + return __result; + } + static native boolean nglIsVertexArray(int array, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL31.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL31.java new file mode 100644 index 0000000..d4ddc97 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL31.java @@ -0,0 +1,391 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL31 { + + public static final int GL_RED_SNORM = 0x8F90, + GL_RG_SNORM = 0x8F91, + GL_RGB_SNORM = 0x8F92, + GL_RGBA_SNORM = 0x8F93, + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_R16_SNORM = 0x8F98, + GL_RG16_SNORM = 0x8F99, + GL_RGB16_SNORM = 0x8F9A, + GL_RGBA16_SNORM = 0x8F9B, + GL_SIGNED_NORMALIZED = 0x8F9C, + GL_COPY_READ_BUFFER_BINDING = 0x8F36, + GL_COPY_WRITE_BUFFER_BINDING = 0x8F37, + GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37; + + /** + * Accepted by the &lt;cap&gt; parameter of IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_PRIMITIVE_RESTART = 0x8F9D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PRIMITIVE_RESTART_INDEX = 0x8F9E; + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, MapBufferRange, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBuffer, + * and the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + public static final int GL_TEXTURE_BUFFER = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + public static final int GL_MAX_TEXTURE_BUFFER_SIZE = 0x8C2B, + GL_TEXTURE_BINDING_BUFFER = 0x8C2C, + GL_TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D, + GL_TEXTURE_BUFFER_FORMAT = 0x8C2E; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + * GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + * TexParameterfv and TexParameteriv: + * Accepted by the &lt;target&gt; parameter of GetTexImage, + * GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + * CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + public static final int GL_TEXTURE_RECTANGLE = 0x84F5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv and GetDoublev: + */ + public static final int GL_TEXTURE_BINDING_RECTANGLE = 0x84F6; + + /** + * Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + * GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + public static final int GL_PROXY_TEXTURE_RECTANGLE = 0x84F7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + public static final int GL_SAMPLER_2D_RECT = 0x8B63; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW = 0x8B64; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_UNIFORM_BUFFER = 0x8A11; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: + */ + public static final int GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: + */ + public static final int GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: + */ + public static final int GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** + * Returned by GetActiveUniformsiv and GetUniformBlockIndex + */ + public static final int GL_INVALID_INDEX = 0xFFFFFFFF; + + private GL31() {} + + public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawArraysInstanced(mode, first, count, primcount, function_pointer); + } + static native void nglDrawArraysInstanced(int mode, int first, int count, int primcount, long function_pointer); + + public static void glDrawElementsInstanced(int mode, ByteBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstanced(int mode, IntBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + public static void glDrawElementsInstanced(int mode, ShortBuffer indices, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, function_pointer); + } + static native void nglDrawElementsInstanced(int mode, int indices_count, int type, long indices, int primcount, long function_pointer); + public static void glDrawElementsInstanced(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedBO(mode, indices_count, type, indices_buffer_offset, primcount, function_pointer); + } + static native void nglDrawElementsInstancedBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, long function_pointer); + + public static void glCopyBufferSubData(int readtarget, int writetarget, long readoffset, long writeoffset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size, function_pointer); + } + static native void nglCopyBufferSubData(int readtarget, int writetarget, long readoffset, long writeoffset, long size, long function_pointer); + + public static void glPrimitiveRestartIndex(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPrimitiveRestartIndex; + BufferChecks.checkFunctionAddress(function_pointer); + nglPrimitiveRestartIndex(index, function_pointer); + } + static native void nglPrimitiveRestartIndex(int index, long function_pointer); + + public static void glTexBuffer(int target, int internalformat, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexBuffer(target, internalformat, buffer, function_pointer); + } + static native void nglTexBuffer(int target, int internalformat, int buffer, long function_pointer); + + public static void glGetUniformIndices(int program, ByteBuffer uniformNames, IntBuffer uniformIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformIndices; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(uniformNames); + BufferChecks.checkNullTerminated(uniformNames, uniformIndices.remaining()); + BufferChecks.checkDirect(uniformIndices); + nglGetUniformIndices(program, uniformIndices.remaining(), MemoryUtil.getAddress(uniformNames), MemoryUtil.getAddress(uniformIndices), function_pointer); + } + static native void nglGetUniformIndices(int program, int uniformIndices_uniformCount, long uniformNames, long uniformIndices, long function_pointer); + + /** Overloads glGetUniformIndices. */ + public static void glGetUniformIndices(int program, CharSequence[] uniformNames, IntBuffer uniformIndices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformIndices; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(uniformNames); + BufferChecks.checkBuffer(uniformIndices, uniformNames.length); + nglGetUniformIndices(program, uniformNames.length, APIUtil.getBufferNT(caps, uniformNames), MemoryUtil.getAddress(uniformIndices), function_pointer); + } + + public static void glGetActiveUniforms(int program, IntBuffer uniformIndices, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformsiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(uniformIndices); + BufferChecks.checkBuffer(params, uniformIndices.remaining()); + nglGetActiveUniformsiv(program, uniformIndices.remaining(), MemoryUtil.getAddress(uniformIndices), pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetActiveUniformsiv(int program, int uniformIndices_uniformCount, long uniformIndices, int pname, long params, long function_pointer); + + /** + * Overloads glGetActiveUniformsiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformsi} instead. + */ + @Deprecated + public static int glGetActiveUniforms(int program, int uniformIndex, int pname) { + return GL31.glGetActiveUniformsi(program, uniformIndex, pname); + } + + /** Overloads glGetActiveUniformsiv. */ + public static int glGetActiveUniformsi(int program, int uniformIndex, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformsiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetActiveUniformsiv(program, 1, MemoryUtil.getAddress(params.put(1, uniformIndex), 1), pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetActiveUniformName(int program, int uniformIndex, IntBuffer length, ByteBuffer uniformName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformName; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(uniformName); + nglGetActiveUniformName(program, uniformIndex, uniformName.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(uniformName), function_pointer); + } + static native void nglGetActiveUniformName(int program, int uniformIndex, int uniformName_bufSize, long length, long uniformName, long function_pointer); + + /** Overloads glGetActiveUniformName. */ + public static String glGetActiveUniformName(int program, int uniformIndex, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformName; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer uniformName_length = APIUtil.getLengths(caps); + ByteBuffer uniformName = APIUtil.getBufferByte(caps, bufSize); + nglGetActiveUniformName(program, uniformIndex, bufSize, MemoryUtil.getAddress0(uniformName_length), MemoryUtil.getAddress(uniformName), function_pointer); + uniformName.limit(uniformName_length.get(0)); + return APIUtil.getString(caps, uniformName); + } + + public static int glGetUniformBlockIndex(int program, ByteBuffer uniformBlockName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformBlockIndex; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(uniformBlockName); + BufferChecks.checkNullTerminated(uniformBlockName); + int __result = nglGetUniformBlockIndex(program, MemoryUtil.getAddress(uniformBlockName), function_pointer); + return __result; + } + static native int nglGetUniformBlockIndex(int program, long uniformBlockName, long function_pointer); + + /** Overloads glGetUniformBlockIndex. */ + public static int glGetUniformBlockIndex(int program, CharSequence uniformBlockName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformBlockIndex; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetUniformBlockIndex(program, APIUtil.getBufferNT(caps, uniformBlockName), function_pointer); + return __result; + } + + public static void glGetActiveUniformBlock(int program, int uniformBlockIndex, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformBlockiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, long params, long function_pointer); + + /** + * Overloads glGetActiveUniformBlockiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformBlocki} instead. + */ + @Deprecated + public static int glGetActiveUniformBlock(int program, int uniformBlockIndex, int pname) { + return GL31.glGetActiveUniformBlocki(program, uniformBlockIndex, pname); + } + + /** Overloads glGetActiveUniformBlockiv. */ + public static int glGetActiveUniformBlocki(int program, int uniformBlockIndex, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformBlockiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetActiveUniformBlockName(int program, int uniformBlockIndex, IntBuffer length, ByteBuffer uniformBlockName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformBlockName; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(uniformBlockName); + nglGetActiveUniformBlockName(program, uniformBlockIndex, uniformBlockName.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(uniformBlockName), function_pointer); + } + static native void nglGetActiveUniformBlockName(int program, int uniformBlockIndex, int uniformBlockName_bufSize, long length, long uniformBlockName, long function_pointer); + + /** Overloads glGetActiveUniformBlockName. */ + public static String glGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveUniformBlockName; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer uniformBlockName_length = APIUtil.getLengths(caps); + ByteBuffer uniformBlockName = APIUtil.getBufferByte(caps, bufSize); + nglGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, MemoryUtil.getAddress0(uniformBlockName_length), MemoryUtil.getAddress(uniformBlockName), function_pointer); + uniformBlockName.limit(uniformBlockName_length.get(0)); + return APIUtil.getString(caps, uniformBlockName); + } + + public static void glUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformBlockBinding; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding, function_pointer); + } + static native void nglUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL32.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL32.java new file mode 100644 index 0000000..2450389 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL32.java @@ -0,0 +1,505 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL32 { + + public static final int GL_CONTEXT_PROFILE_MASK = 0x9126, + GL_CONTEXT_CORE_PROFILE_BIT = 0x1, + GL_CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x2, + GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122, + GL_MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123, + GL_MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124, + GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + + /** + * Accepted by the &lt;mode&gt; parameter of ProvokingVertex: + */ + public static final int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PROVOKING_VERTEX = 0x8E4F, + GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + public static final int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetMultisamplefv: + */ + public static final int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_SAMPLE_MASK = 0x8E51; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v and + * GetIntegeri_v: + */ + public static final int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage2DMultisample: + */ + public static final int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2DMultisample: + */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage3DMultisample: + */ + public static final int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3DMultisample: + */ + public static final int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_SAMPLE_MASK_WORDS = 0x8E59, + GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E, + GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F, + GL_MAX_INTEGER_SAMPLES = 0x9110, + GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter + */ + public static final int GL_TEXTURE_SAMPLES = 0x9106, + GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_2D_MULTISAMPLE = 0x9108, + GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A, + GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B, + GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C, + GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_CLAMP = 0x864F; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + public static final int GL_GEOMETRY_SHADER = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + public static final int GL_GEOMETRY_VERTICES_OUT = 0x8DDA, + GL_GEOMETRY_INPUT_TYPE = 0x8DDB, + GL_GEOMETRY_OUTPUT_TYPE = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29, + GL_MAX_VARYING_COMPONENTS = 0x8B4B, + GL_MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF, + GL_MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0, + GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + public static final int GL_LINES_ADJACENCY = 0xA, + GL_LINE_STRIP_ADJACENCY = 0xB, + GL_TRIANGLES_ADJACENCY = 0xC, + GL_TRIANGLE_STRIP_ADJACENCY = 0xD; + + /** + * Returned by CheckFramebufferStatusEXT: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + public static final int GL_PROGRAM_POINT_SIZE = 0x8642; + + /** + * Accepted as the &lt;pname&gt; parameter of GetInteger64v: + */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** + * Accepted as the &lt;pname&gt; parameter of GetSynciv: + */ + public static final int GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE: + */ + public static final int GL_SYNC_FENCE = 0x9116; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION: + */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_STATUS: + */ + public static final int GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119; + + /** + * Accepted in the &lt;flags&gt; parameter of ClientWaitSync: + */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + /** + * Accepted in the &lt;timeout&gt; parameter of WaitSync: + */ + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + /** + * Returned by ClientWaitSync: + */ + public static final int GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D; + + private GL32() {} + + public static void glGetBufferParameter(int target, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameteri64v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetBufferParameteri64v(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetBufferParameteri64v(int target, int pname, long params, long function_pointer); + + /** + * Overloads glGetBufferParameteri64v. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri64} instead. + */ + @Deprecated + public static long glGetBufferParameter(int target, int pname) { + return GL32.glGetBufferParameteri64(target, pname); + } + + /** Overloads glGetBufferParameteri64v. */ + public static long glGetBufferParameteri64(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameteri64v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetBufferParameteri64v(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glDrawElementsBaseVertex(int mode, ByteBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + public static void glDrawElementsBaseVertex(int mode, IntBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + public static void glDrawElementsBaseVertex(int mode, ShortBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + static native void nglDrawElementsBaseVertex(int mode, int indices_count, int type, long indices, int basevertex, long function_pointer); + public static void glDrawElementsBaseVertex(int mode, int indices_count, int type, long indices_buffer_offset, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsBaseVertexBO(mode, indices_count, type, indices_buffer_offset, basevertex, function_pointer); + } + static native void nglDrawElementsBaseVertexBO(int mode, int indices_count, int type, long indices_buffer_offset, int basevertex, long function_pointer); + + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, ByteBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, IntBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, ShortBuffer indices, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawRangeElementsBaseVertex(mode, start, end, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), basevertex, function_pointer); + } + static native void nglDrawRangeElementsBaseVertex(int mode, int start, int end, int indices_count, int type, long indices, int basevertex, long function_pointer); + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawRangeElementsBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawRangeElementsBaseVertexBO(mode, start, end, indices_count, type, indices_buffer_offset, basevertex, function_pointer); + } + static native void nglDrawRangeElementsBaseVertexBO(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset, int basevertex, long function_pointer); + + public static void glDrawElementsInstancedBaseVertex(int mode, ByteBuffer indices, int primcount, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, basevertex, function_pointer); + } + public static void glDrawElementsInstancedBaseVertex(int mode, IntBuffer indices, int primcount, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, basevertex, function_pointer); + } + public static void glDrawElementsInstancedBaseVertex(int mode, ShortBuffer indices, int primcount, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertex(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, basevertex, function_pointer); + } + static native void nglDrawElementsInstancedBaseVertex(int mode, int indices_count, int type, long indices, int primcount, int basevertex, long function_pointer); + public static void glDrawElementsInstancedBaseVertex(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertex; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedBaseVertexBO(mode, indices_count, type, indices_buffer_offset, primcount, basevertex, function_pointer); + } + static native void nglDrawElementsInstancedBaseVertexBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex, long function_pointer); + + public static void glProvokingVertex(int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProvokingVertex; + BufferChecks.checkFunctionAddress(function_pointer); + nglProvokingVertex(mode, function_pointer); + } + static native void nglProvokingVertex(int mode, long function_pointer); + + public static void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2DMultisample; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations, function_pointer); + } + static native void nglTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations, long function_pointer); + + public static void glTexImage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3DMultisample; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations, function_pointer); + } + static native void nglTexImage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations, long function_pointer); + + public static void glGetMultisample(int pname, int index, FloatBuffer val) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultisamplefv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(val, 2); + nglGetMultisamplefv(pname, index, MemoryUtil.getAddress(val), function_pointer); + } + static native void nglGetMultisamplefv(int pname, int index, long val, long function_pointer); + + public static void glSampleMaski(int index, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSampleMaski; + BufferChecks.checkFunctionAddress(function_pointer); + nglSampleMaski(index, mask, function_pointer); + } + static native void nglSampleMaski(int index, int mask, long function_pointer); + + public static void glFramebufferTexture(int target, int attachment, int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferTexture; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferTexture(target, attachment, texture, level, function_pointer); + } + static native void nglFramebufferTexture(int target, int attachment, int texture, int level, long function_pointer); + + public static GLSync glFenceSync(int condition, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFenceSync; + BufferChecks.checkFunctionAddress(function_pointer); + GLSync __result = new GLSync(nglFenceSync(condition, flags, function_pointer)); + return __result; + } + static native long nglFenceSync(int condition, int flags, long function_pointer); + + public static boolean glIsSync(GLSync sync) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsSync; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsSync(sync.getPointer(), function_pointer); + return __result; + } + static native boolean nglIsSync(long sync, long function_pointer); + + public static void glDeleteSync(GLSync sync) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteSync; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteSync(sync.getPointer(), function_pointer); + } + static native void nglDeleteSync(long sync, long function_pointer); + + public static int glClientWaitSync(GLSync sync, int flags, long timeout) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClientWaitSync; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglClientWaitSync(sync.getPointer(), flags, timeout, function_pointer); + return __result; + } + static native int nglClientWaitSync(long sync, int flags, long timeout, long function_pointer); + + public static void glWaitSync(GLSync sync, int flags, long timeout) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWaitSync; + BufferChecks.checkFunctionAddress(function_pointer); + nglWaitSync(sync.getPointer(), flags, timeout, function_pointer); + } + static native void nglWaitSync(long sync, int flags, long timeout, long function_pointer); + + public static void glGetInteger64(int pname, LongBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInteger64v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 1); + nglGetInteger64v(pname, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetInteger64v(int pname, long data, long function_pointer); + + /** Overloads glGetInteger64v. */ + public static long glGetInteger64(int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInteger64v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer data = APIUtil.getBufferLong(caps); + nglGetInteger64v(pname, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } + + public static void glGetInteger64(int value, int index, LongBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInteger64i_v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 4); + nglGetInteger64i_v(value, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetInteger64i_v(int value, int index, long data, long function_pointer); + + /** Overloads glGetInteger64i_v. */ + public static long glGetInteger64(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInteger64i_v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer data = APIUtil.getBufferLong(caps); + nglGetInteger64i_v(value, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } + + public static void glGetSync(GLSync sync, int pname, IntBuffer length, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSynciv; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(values); + nglGetSynciv(sync.getPointer(), pname, values.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetSynciv(long sync, int pname, int values_bufSize, long length, long values, long function_pointer); + + /** + * Overloads glGetSynciv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetSynci} instead. + */ + @Deprecated + public static int glGetSync(GLSync sync, int pname) { + return GL32.glGetSynci(sync, pname); + } + + /** Overloads glGetSynciv. */ + public static int glGetSynci(GLSync sync, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSynciv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer values = APIUtil.getBufferInt(caps); + nglGetSynciv(sync.getPointer(), pname, 1, 0L, MemoryUtil.getAddress(values), function_pointer); + return values.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL33.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL33.java new file mode 100644 index 0000000..334870e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL33.java @@ -0,0 +1,705 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL33 { + + /** + * Accepted by the &lt;src&gt; and &lt;dst&gt; parameters of BlendFunc and + * BlendFunci, and by the &lt;srcRGB&gt;, &lt;dstRGB&gt;, &lt;srcAlpha&gt; and &lt;dstAlpha&gt; + * parameters of BlendFuncSeparate and BlendFuncSeparatei: + */ + public static final int GL_SRC1_COLOR = 0x88F9, + GL_SRC1_ALPHA = 0x8589, + GL_ONE_MINUS_SRC1_COLOR = 0x88FA, + GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + public static final int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + public static final int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + /** + * Accepted by the &lt;value&gt; parameter of the GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev functions: + */ + public static final int GL_SAMPLER_BINDING = 0x8919; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample: + */ + public static final int GL_RGB10_A2UI = 0x906F; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the &lt;target&gt; parameter of GetQueryiv and QueryCounter. + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_TIMESTAMP = 0x8E28; + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, and GetVertexAttribiv: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer, VertexPointer, + * NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, + * ColorP*, SecondaryColorP* and VertexAttribP* + */ + public static final int GL_INT_2_10_10_10_REV = 0x8D9F; + + private GL33() {} + + public static void glBindFragDataLocationIndexed(int program, int colorNumber, int index, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocationIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindFragDataLocationIndexed(program, colorNumber, index, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglBindFragDataLocationIndexed(int program, int colorNumber, int index, long name, long function_pointer); + + /** Overloads glBindFragDataLocationIndexed. */ + public static void glBindFragDataLocationIndexed(int program, int colorNumber, int index, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindFragDataLocationIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindFragDataLocationIndexed(program, colorNumber, index, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static int glGetFragDataIndex(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataIndex; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetFragDataIndex(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetFragDataIndex(int program, long name, long function_pointer); + + /** Overloads glGetFragDataIndex. */ + public static int glGetFragDataIndex(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFragDataIndex; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetFragDataIndex(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGenSamplers(IntBuffer samplers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenSamplers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(samplers); + nglGenSamplers(samplers.remaining(), MemoryUtil.getAddress(samplers), function_pointer); + } + static native void nglGenSamplers(int samplers_count, long samplers, long function_pointer); + + /** Overloads glGenSamplers. */ + public static int glGenSamplers() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenSamplers; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer samplers = APIUtil.getBufferInt(caps); + nglGenSamplers(1, MemoryUtil.getAddress(samplers), function_pointer); + return samplers.get(0); + } + + public static void glDeleteSamplers(IntBuffer samplers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteSamplers; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(samplers); + nglDeleteSamplers(samplers.remaining(), MemoryUtil.getAddress(samplers), function_pointer); + } + static native void nglDeleteSamplers(int samplers_count, long samplers, long function_pointer); + + /** Overloads glDeleteSamplers. */ + public static void glDeleteSamplers(int sampler) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteSamplers; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteSamplers(1, APIUtil.getInt(caps, sampler), function_pointer); + } + + public static boolean glIsSampler(int sampler) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsSampler; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsSampler(sampler, function_pointer); + return __result; + } + static native boolean nglIsSampler(int sampler, long function_pointer); + + public static void glBindSampler(int unit, int sampler) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindSampler; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindSampler(unit, sampler, function_pointer); + } + static native void nglBindSampler(int unit, int sampler, long function_pointer); + + public static void glSamplerParameteri(int sampler, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglSamplerParameteri(sampler, pname, param, function_pointer); + } + static native void nglSamplerParameteri(int sampler, int pname, int param, long function_pointer); + + public static void glSamplerParameterf(int sampler, int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameterf; + BufferChecks.checkFunctionAddress(function_pointer); + nglSamplerParameterf(sampler, pname, param, function_pointer); + } + static native void nglSamplerParameterf(int sampler, int pname, float param, long function_pointer); + + public static void glSamplerParameter(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglSamplerParameteriv(int sampler, int pname, long params, long function_pointer); + + public static void glSamplerParameter(int sampler, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglSamplerParameterfv(int sampler, int pname, long params, long function_pointer); + + public static void glSamplerParameterI(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglSamplerParameterIiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglSamplerParameterIiv(int sampler, int pname, long params, long function_pointer); + + public static void glSamplerParameterIu(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSamplerParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglSamplerParameterIuiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglSamplerParameterIuiv(int sampler, int pname, long params, long function_pointer); + + public static void glGetSamplerParameter(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetSamplerParameteriv(int sampler, int pname, long params, long function_pointer); + + /** Overloads glGetSamplerParameteriv. */ + public static int glGetSamplerParameteri(int sampler, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetSamplerParameter(int sampler, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetSamplerParameterfv(int sampler, int pname, long params, long function_pointer); + + /** Overloads glGetSamplerParameterfv. */ + public static float glGetSamplerParameterf(int sampler, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetSamplerParameterI(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameterIiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetSamplerParameterIiv(int sampler, int pname, long params, long function_pointer); + + /** Overloads glGetSamplerParameterIiv. */ + public static int glGetSamplerParameterIi(int sampler, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterIiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetSamplerParameterIiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetSamplerParameterIu(int sampler, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameterIuiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetSamplerParameterIuiv(int sampler, int pname, long params, long function_pointer); + + /** Overloads glGetSamplerParameterIuiv. */ + public static int glGetSamplerParameterIui(int sampler, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSamplerParameterIuiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetSamplerParameterIuiv(sampler, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glQueryCounter(int id, int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glQueryCounter; + BufferChecks.checkFunctionAddress(function_pointer); + nglQueryCounter(id, target, function_pointer); + } + static native void nglQueryCounter(int id, int target, long function_pointer); + + public static void glGetQueryObject(int id, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjecti64v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjecti64v(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjecti64v(int id, int pname, long params, long function_pointer); + + /** + * Overloads glGetQueryObjecti64v. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetQueryObjecti64} instead. + */ + @Deprecated + public static long glGetQueryObject(int id, int pname) { + return GL33.glGetQueryObjecti64(id, pname); + } + + /** Overloads glGetQueryObjecti64v. */ + public static long glGetQueryObjecti64(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjecti64v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetQueryObjecti64v(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetQueryObjectu(int id, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectui64v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectui64v(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryObjectui64v(int id, int pname, long params, long function_pointer); + + /** + * Overloads glGetQueryObjectui64v. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetQueryObjectui64} instead. + */ + @Deprecated + public static long glGetQueryObjectu(int id, int pname) { + return GL33.glGetQueryObjectui64(id, pname); + } + + /** Overloads glGetQueryObjectui64v. */ + public static long glGetQueryObjectui64(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryObjectui64v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetQueryObjectui64v(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glVertexAttribDivisor(int index, int divisor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribDivisor; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribDivisor(index, divisor, function_pointer); + } + static native void nglVertexAttribDivisor(int index, int divisor, long function_pointer); + + public static void glVertexP2ui(int type, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexP2ui(type, value, function_pointer); + } + static native void nglVertexP2ui(int type, int value, long function_pointer); + + public static void glVertexP3ui(int type, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexP3ui(type, value, function_pointer); + } + static native void nglVertexP3ui(int type, int value, long function_pointer); + + public static void glVertexP4ui(int type, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexP4ui(type, value, function_pointer); + } + static native void nglVertexP4ui(int type, int value, long function_pointer); + + public static void glVertexP2u(int type, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 2); + nglVertexP2uiv(type, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexP2uiv(int type, long value, long function_pointer); + + public static void glVertexP3u(int type, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 3); + nglVertexP3uiv(type, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexP3uiv(int type, long value, long function_pointer); + + public static void glVertexP4u(int type, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexP4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglVertexP4uiv(type, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexP4uiv(int type, long value, long function_pointer); + + public static void glTexCoordP1ui(int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoordP1ui(type, coords, function_pointer); + } + static native void nglTexCoordP1ui(int type, int coords, long function_pointer); + + public static void glTexCoordP2ui(int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoordP2ui(type, coords, function_pointer); + } + static native void nglTexCoordP2ui(int type, int coords, long function_pointer); + + public static void glTexCoordP3ui(int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoordP3ui(type, coords, function_pointer); + } + static native void nglTexCoordP3ui(int type, int coords, long function_pointer); + + public static void glTexCoordP4ui(int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoordP4ui(type, coords, function_pointer); + } + static native void nglTexCoordP4ui(int type, int coords, long function_pointer); + + public static void glTexCoordP1u(int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 1); + nglTexCoordP1uiv(type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglTexCoordP1uiv(int type, long coords, long function_pointer); + + public static void glTexCoordP2u(int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 2); + nglTexCoordP2uiv(type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglTexCoordP2uiv(int type, long coords, long function_pointer); + + public static void glTexCoordP3u(int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 3); + nglTexCoordP3uiv(type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglTexCoordP3uiv(int type, long coords, long function_pointer); + + public static void glTexCoordP4u(int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordP4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 4); + nglTexCoordP4uiv(type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglTexCoordP4uiv(int type, long coords, long function_pointer); + + public static void glMultiTexCoordP1ui(int texture, int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoordP1ui(texture, type, coords, function_pointer); + } + static native void nglMultiTexCoordP1ui(int texture, int type, int coords, long function_pointer); + + public static void glMultiTexCoordP2ui(int texture, int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoordP2ui(texture, type, coords, function_pointer); + } + static native void nglMultiTexCoordP2ui(int texture, int type, int coords, long function_pointer); + + public static void glMultiTexCoordP3ui(int texture, int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoordP3ui(texture, type, coords, function_pointer); + } + static native void nglMultiTexCoordP3ui(int texture, int type, int coords, long function_pointer); + + public static void glMultiTexCoordP4ui(int texture, int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoordP4ui(texture, type, coords, function_pointer); + } + static native void nglMultiTexCoordP4ui(int texture, int type, int coords, long function_pointer); + + public static void glMultiTexCoordP1u(int texture, int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 1); + nglMultiTexCoordP1uiv(texture, type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglMultiTexCoordP1uiv(int texture, int type, long coords, long function_pointer); + + public static void glMultiTexCoordP2u(int texture, int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 2); + nglMultiTexCoordP2uiv(texture, type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglMultiTexCoordP2uiv(int texture, int type, long coords, long function_pointer); + + public static void glMultiTexCoordP3u(int texture, int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 3); + nglMultiTexCoordP3uiv(texture, type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglMultiTexCoordP3uiv(int texture, int type, long coords, long function_pointer); + + public static void glMultiTexCoordP4u(int texture, int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoordP4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 4); + nglMultiTexCoordP4uiv(texture, type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglMultiTexCoordP4uiv(int texture, int type, long coords, long function_pointer); + + public static void glNormalP3ui(int type, int coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalP3ui(type, coords, function_pointer); + } + static native void nglNormalP3ui(int type, int coords, long function_pointer); + + public static void glNormalP3u(int type, IntBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(coords, 3); + nglNormalP3uiv(type, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglNormalP3uiv(int type, long coords, long function_pointer); + + public static void glColorP3ui(int type, int color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorP3ui(type, color, function_pointer); + } + static native void nglColorP3ui(int type, int color, long function_pointer); + + public static void glColorP4ui(int type, int color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorP4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorP4ui(type, color, function_pointer); + } + static native void nglColorP4ui(int type, int color, long function_pointer); + + public static void glColorP3u(int type, IntBuffer color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(color, 3); + nglColorP3uiv(type, MemoryUtil.getAddress(color), function_pointer); + } + static native void nglColorP3uiv(int type, long color, long function_pointer); + + public static void glColorP4u(int type, IntBuffer color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorP4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(color, 4); + nglColorP4uiv(type, MemoryUtil.getAddress(color), function_pointer); + } + static native void nglColorP4uiv(int type, long color, long function_pointer); + + public static void glSecondaryColorP3ui(int type, int color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColorP3ui(type, color, function_pointer); + } + static native void nglSecondaryColorP3ui(int type, int color, long function_pointer); + + public static void glSecondaryColorP3u(int type, IntBuffer color) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(color, 3); + nglSecondaryColorP3uiv(type, MemoryUtil.getAddress(color), function_pointer); + } + static native void nglSecondaryColorP3uiv(int type, long color, long function_pointer); + + public static void glVertexAttribP1ui(int index, int type, boolean normalized, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribP1ui(index, type, normalized, value, function_pointer); + } + static native void nglVertexAttribP1ui(int index, int type, boolean normalized, int value, long function_pointer); + + public static void glVertexAttribP2ui(int index, int type, boolean normalized, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribP2ui(index, type, normalized, value, function_pointer); + } + static native void nglVertexAttribP2ui(int index, int type, boolean normalized, int value, long function_pointer); + + public static void glVertexAttribP3ui(int index, int type, boolean normalized, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribP3ui(index, type, normalized, value, function_pointer); + } + static native void nglVertexAttribP3ui(int index, int type, boolean normalized, int value, long function_pointer); + + public static void glVertexAttribP4ui(int index, int type, boolean normalized, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribP4ui(index, type, normalized, value, function_pointer); + } + static native void nglVertexAttribP4ui(int index, int type, boolean normalized, int value, long function_pointer); + + public static void glVertexAttribP1u(int index, int type, boolean normalized, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 1); + nglVertexAttribP1uiv(index, type, normalized, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexAttribP1uiv(int index, int type, boolean normalized, long value, long function_pointer); + + public static void glVertexAttribP2u(int index, int type, boolean normalized, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 2); + nglVertexAttribP2uiv(index, type, normalized, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexAttribP2uiv(int index, int type, boolean normalized, long value, long function_pointer); + + public static void glVertexAttribP3u(int index, int type, boolean normalized, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 3); + nglVertexAttribP3uiv(index, type, normalized, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexAttribP3uiv(int index, int type, boolean normalized, long value, long function_pointer); + + public static void glVertexAttribP4u(int index, int type, boolean normalized, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribP4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglVertexAttribP4uiv(index, type, normalized, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglVertexAttribP4uiv(int index, int type, boolean normalized, long value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL40.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL40.java new file mode 100644 index 0000000..710eff6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL40.java @@ -0,0 +1,811 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL40 { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, and + * CopyBufferSubData: + */ + public static final int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C, + GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D, + GL_MAX_VERTEX_STREAMS = 0x8E71; + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + public static final int GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_SAMPLE_SHADING = 0x8C36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + public static final int GL_MIN_SAMPLE_SHADING_VALUE = 0x8C37; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramStageiv: + */ + public static final int GL_ACTIVE_SUBROUTINES = 0x8DE5, + GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6, + GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47, + GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48, + GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_SUBROUTINES = 0x8DE7, + GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveSubroutineUniformiv: + */ + public static final int GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A, + GL_COMPATIBLE_SUBROUTINES = 0x8E4B, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin and all vertex array functions + * that implicitly call Begin: + */ + public static final int GL_PATCHES = 0xE; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameteri, GetBooleanv, + * GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v: + */ + public static final int GL_PATCH_VERTICES = 0x8E72; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameterfv, GetBooleanv, + * GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v: + */ + public static final int GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73, + GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75, + GL_TESS_GEN_MODE = 0x8E76, + GL_TESS_GEN_SPACING = 0x8E77, + GL_TESS_GEN_VERTEX_ORDER = 0x8E78, + GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_MODE: + */ + public static final int GL_ISOLINES = 0x8E7A; + + /** + * Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_SPACING: + */ + public static final int GL_FRACTIONAL_ODD = 0x8E7B, + GL_FRACTIONAL_EVEN = 0x8E7C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, + * GetIntegerv, and GetInteger64v: + */ + public static final int GL_MAX_PATCH_VERTICES = 0x8E7D, + GL_MAX_TESS_GEN_LEVEL = 0x8E7E, + GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F, + GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80, + GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81, + GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82, + GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83, + GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84, + GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85, + GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86, + GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89, + GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A, + GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C, + GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D, + GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E, + GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: + */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0, + GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + public static final int GL_TESS_EVALUATION_SHADER = 0x8E87, + GL_TESS_CONTROL_SHADER = 0x8E88; + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap: + * <p/> + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + * <p/> + * Accepted by the &lt;tex&gt; parameter of GetTexImage: + */ + public static final int GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + */ + public static final int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY = 0x900B; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_CUBE_MAP_ARRAY = 0x900C, + GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D, + GL_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E, + GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E, + GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F, + GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB = 0x8F9F; + + /** + * Accepted by the &lt;target&gt; parameter of BindTransformFeedback: + */ + public static final int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70; + + private GL40() {} + + public static void glBlendEquationi(int buf, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationi; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationi(buf, mode, function_pointer); + } + static native void nglBlendEquationi(int buf, int mode, long function_pointer); + + public static void glBlendEquationSeparatei(int buf, int modeRGB, int modeAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendEquationSeparatei; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendEquationSeparatei(buf, modeRGB, modeAlpha, function_pointer); + } + static native void nglBlendEquationSeparatei(int buf, int modeRGB, int modeAlpha, long function_pointer); + + public static void glBlendFunci(int buf, int src, int dst) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFunci; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFunci(buf, src, dst, function_pointer); + } + static native void nglBlendFunci(int buf, int src, int dst, long function_pointer); + + public static void glBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendFuncSeparatei; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha, function_pointer); + } + static native void nglBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha, long function_pointer); + + public static void glDrawArraysIndirect(int mode, ByteBuffer indirect) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, 4 * 4); + nglDrawArraysIndirect(mode, MemoryUtil.getAddress(indirect), function_pointer); + } + static native void nglDrawArraysIndirect(int mode, long indirect, long function_pointer); + public static void glDrawArraysIndirect(int mode, long indirect_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglDrawArraysIndirectBO(mode, indirect_buffer_offset, function_pointer); + } + static native void nglDrawArraysIndirectBO(int mode, long indirect_buffer_offset, long function_pointer); + + /** Overloads glDrawArraysIndirect. */ + public static void glDrawArraysIndirect(int mode, IntBuffer indirect) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, 4); + nglDrawArraysIndirect(mode, MemoryUtil.getAddress(indirect), function_pointer); + } + + public static void glDrawElementsIndirect(int mode, int type, ByteBuffer indirect) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, 5 * 4); + nglDrawElementsIndirect(mode, type, MemoryUtil.getAddress(indirect), function_pointer); + } + static native void nglDrawElementsIndirect(int mode, int type, long indirect, long function_pointer); + public static void glDrawElementsIndirect(int mode, int type, long indirect_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglDrawElementsIndirectBO(mode, type, indirect_buffer_offset, function_pointer); + } + static native void nglDrawElementsIndirectBO(int mode, int type, long indirect_buffer_offset, long function_pointer); + + /** Overloads glDrawElementsIndirect. */ + public static void glDrawElementsIndirect(int mode, int type, IntBuffer indirect) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, 5); + nglDrawElementsIndirect(mode, type, MemoryUtil.getAddress(indirect), function_pointer); + } + + public static void glUniform1d(int location, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1d(location, x, function_pointer); + } + static native void nglUniform1d(int location, double x, long function_pointer); + + public static void glUniform2d(int location, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2d(location, x, y, function_pointer); + } + static native void nglUniform2d(int location, double x, double y, long function_pointer); + + public static void glUniform3d(int location, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3d(location, x, y, z, function_pointer); + } + static native void nglUniform3d(int location, double x, double y, double z, long function_pointer); + + public static void glUniform4d(int location, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4d(location, x, y, z, w, function_pointer); + } + static native void nglUniform4d(int location, double x, double y, double z, double w, long function_pointer); + + public static void glUniform1(int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform1dv(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform1dv(int location, int value_count, long value, long function_pointer); + + public static void glUniform2(int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform2dv(location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform2dv(int location, int value_count, long value, long function_pointer); + + public static void glUniform3(int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform3dv(location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform3dv(int location, int value_count, long value, long function_pointer); + + public static void glUniform4(int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform4dv(location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform4dv(int location, int value_count, long value, long function_pointer); + + public static void glUniformMatrix2(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix2dv(location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix2dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix3(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix3dv(location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix3dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix4(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix4dv(location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix4dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix2x3(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2x3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix2x3dv(location, value.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix2x3dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix2x4(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix2x4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix2x4dv(location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix2x4dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix3x2(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3x2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix3x2dv(location, value.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix3x2dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix3x4(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix3x4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix3x4dv(location, value.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix3x4dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix4x2(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4x2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix4x2dv(location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix4x2dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glUniformMatrix4x3(int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformMatrix4x3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformMatrix4x3dv(location, value.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformMatrix4x3dv(int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glGetUniform(int program, int location, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformdv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetUniformdv(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformdv(int program, int location, long params, long function_pointer); + + public static void glMinSampleShading(float value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMinSampleShading; + BufferChecks.checkFunctionAddress(function_pointer); + nglMinSampleShading(value, function_pointer); + } + static native void nglMinSampleShading(float value, long function_pointer); + + public static int glGetSubroutineUniformLocation(int program, int shadertype, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSubroutineUniformLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetSubroutineUniformLocation(program, shadertype, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetSubroutineUniformLocation(int program, int shadertype, long name, long function_pointer); + + /** Overloads glGetSubroutineUniformLocation. */ + public static int glGetSubroutineUniformLocation(int program, int shadertype, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSubroutineUniformLocation; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetSubroutineUniformLocation(program, shadertype, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static int glGetSubroutineIndex(int program, int shadertype, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSubroutineIndex; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetSubroutineIndex(program, shadertype, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetSubroutineIndex(int program, int shadertype, long name, long function_pointer); + + /** Overloads glGetSubroutineIndex. */ + public static int glGetSubroutineIndex(int program, int shadertype, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetSubroutineIndex; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetSubroutineIndex(program, shadertype, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetActiveSubroutineUniform(int program, int shadertype, int index, int pname, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineUniformiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(values, 1); + nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetActiveSubroutineUniformiv(int program, int shadertype, int index, int pname, long values, long function_pointer); + + /** + * Overloads glGetActiveSubroutineUniformiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetActiveSubroutineUniformi} instead. + */ + @Deprecated + public static int glGetActiveSubroutineUniform(int program, int shadertype, int index, int pname) { + return GL40.glGetActiveSubroutineUniformi(program, shadertype, index, pname); + } + + /** Overloads glGetActiveSubroutineUniformiv. */ + public static int glGetActiveSubroutineUniformi(int program, int shadertype, int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineUniformiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer values = APIUtil.getBufferInt(caps); + nglGetActiveSubroutineUniformiv(program, shadertype, index, pname, MemoryUtil.getAddress(values), function_pointer); + return values.get(0); + } + + public static void glGetActiveSubroutineUniformName(int program, int shadertype, int index, IntBuffer length, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineUniformName; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(name); + nglGetActiveSubroutineUniformName(program, shadertype, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveSubroutineUniformName(int program, int shadertype, int index, int name_bufsize, long length, long name, long function_pointer); + + /** Overloads glGetActiveSubroutineUniformName. */ + public static String glGetActiveSubroutineUniformName(int program, int shadertype, int index, int bufsize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineUniformName; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufsize); + nglGetActiveSubroutineUniformName(program, shadertype, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + public static void glGetActiveSubroutineName(int program, int shadertype, int index, IntBuffer length, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineName; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(name); + nglGetActiveSubroutineName(program, shadertype, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveSubroutineName(int program, int shadertype, int index, int name_bufsize, long length, long name, long function_pointer); + + /** Overloads glGetActiveSubroutineName. */ + public static String glGetActiveSubroutineName(int program, int shadertype, int index, int bufsize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveSubroutineName; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufsize); + nglGetActiveSubroutineName(program, shadertype, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + public static void glUniformSubroutinesu(int shadertype, IntBuffer indices) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformSubroutinesuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(indices); + nglUniformSubroutinesuiv(shadertype, indices.remaining(), MemoryUtil.getAddress(indices), function_pointer); + } + static native void nglUniformSubroutinesuiv(int shadertype, int indices_count, long indices, long function_pointer); + + public static void glGetUniformSubroutineu(int shadertype, int location, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformSubroutineuiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetUniformSubroutineuiv(shadertype, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformSubroutineuiv(int shadertype, int location, long params, long function_pointer); + + /** + * Overloads glGetUniformSubroutineuiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetUniformSubroutineui} instead. + */ + @Deprecated + public static int glGetUniformSubroutineu(int shadertype, int location) { + return GL40.glGetUniformSubroutineui(shadertype, location); + } + + /** Overloads glGetUniformSubroutineuiv. */ + public static int glGetUniformSubroutineui(int shadertype, int location) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformSubroutineuiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetUniformSubroutineuiv(shadertype, location, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetProgramStage(int program, int shadertype, int pname, IntBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStageiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(values, 1); + nglGetProgramStageiv(program, shadertype, pname, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglGetProgramStageiv(int program, int shadertype, int pname, long values, long function_pointer); + + /** + * Overloads glGetProgramStageiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetProgramStagei} instead. + */ + @Deprecated + public static int glGetProgramStage(int program, int shadertype, int pname) { + return GL40.glGetProgramStagei(program, shadertype, pname); + } + + /** Overloads glGetProgramStageiv. */ + public static int glGetProgramStagei(int program, int shadertype, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStageiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer values = APIUtil.getBufferInt(caps); + nglGetProgramStageiv(program, shadertype, pname, MemoryUtil.getAddress(values), function_pointer); + return values.get(0); + } + + public static void glPatchParameteri(int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPatchParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglPatchParameteri(pname, value, function_pointer); + } + static native void nglPatchParameteri(int pname, int value, long function_pointer); + + public static void glPatchParameter(int pname, FloatBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPatchParameterfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(values, 4); + nglPatchParameterfv(pname, MemoryUtil.getAddress(values), function_pointer); + } + static native void nglPatchParameterfv(int pname, long values, long function_pointer); + + public static void glBindTransformFeedback(int target, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindTransformFeedback(target, id, function_pointer); + } + static native void nglBindTransformFeedback(int target, int id, long function_pointer); + + public static void glDeleteTransformFeedbacks(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTransformFeedbacks; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglDeleteTransformFeedbacks(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglDeleteTransformFeedbacks(int ids_n, long ids, long function_pointer); + + /** Overloads glDeleteTransformFeedbacks. */ + public static void glDeleteTransformFeedbacks(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTransformFeedbacks; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteTransformFeedbacks(1, APIUtil.getInt(caps, id), function_pointer); + } + + public static void glGenTransformFeedbacks(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTransformFeedbacks; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglGenTransformFeedbacks(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglGenTransformFeedbacks(int ids_n, long ids, long function_pointer); + + /** Overloads glGenTransformFeedbacks. */ + public static int glGenTransformFeedbacks() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTransformFeedbacks; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer ids = APIUtil.getBufferInt(caps); + nglGenTransformFeedbacks(1, MemoryUtil.getAddress(ids), function_pointer); + return ids.get(0); + } + + public static boolean glIsTransformFeedback(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsTransformFeedback(id, function_pointer); + return __result; + } + static native boolean nglIsTransformFeedback(int id, long function_pointer); + + public static void glPauseTransformFeedback() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPauseTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglPauseTransformFeedback(function_pointer); + } + static native void nglPauseTransformFeedback(long function_pointer); + + public static void glResumeTransformFeedback() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glResumeTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglResumeTransformFeedback(function_pointer); + } + static native void nglResumeTransformFeedback(long function_pointer); + + public static void glDrawTransformFeedback(int mode, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTransformFeedback; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTransformFeedback(mode, id, function_pointer); + } + static native void nglDrawTransformFeedback(int mode, int id, long function_pointer); + + public static void glDrawTransformFeedbackStream(int mode, int id, int stream) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTransformFeedbackStream; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTransformFeedbackStream(mode, id, stream, function_pointer); + } + static native void nglDrawTransformFeedbackStream(int mode, int id, int stream, long function_pointer); + + public static void glBeginQueryIndexed(int target, int index, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginQueryIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginQueryIndexed(target, index, id, function_pointer); + } + static native void nglBeginQueryIndexed(int target, int index, int id, long function_pointer); + + public static void glEndQueryIndexed(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndQueryIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndQueryIndexed(target, index, function_pointer); + } + static native void nglEndQueryIndexed(int target, int index, long function_pointer); + + public static void glGetQueryIndexed(int target, int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryIndexediv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetQueryIndexediv(target, index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetQueryIndexediv(int target, int index, int pname, long params, long function_pointer); + + /** + * Overloads glGetQueryIndexediv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetQueryIndexedi} instead. + */ + @Deprecated + public static int glGetQueryIndexed(int target, int index, int pname) { + return GL40.glGetQueryIndexedi(target, index, pname); + } + + /** Overloads glGetQueryIndexediv. */ + public static int glGetQueryIndexedi(int target, int index, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetQueryIndexediv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetQueryIndexediv(target, index, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL41.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL41.java new file mode 100644 index 0000000..1a1ffd8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL41.java @@ -0,0 +1,1033 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL41 { + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_SHADER_COMPILER = 0x8DFA, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer: + */ + public static final int GL_FIXED = 0x140C; + + /** + * Accepted by the &lt;precisiontype&gt; parameter of + * GetShaderPrecisionFormat: + */ + public static final int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** + * Accepted by the &lt;format&gt; parameter of most commands taking sized internal formats: + */ + public static final int GL_RGB565 = 0x8D62; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + public static final int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev: + */ + public static final int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + /** + * Accepted by &lt;stages&gt; parameter to UseProgramStages: + */ + public static final int GL_VERTEX_SHADER_BIT = 0x1, + GL_FRAGMENT_SHADER_BIT = 0x2, + GL_GEOMETRY_SHADER_BIT = 0x4, + GL_TESS_CONTROL_SHADER_BIT = 0x8, + GL_TESS_EVALUATION_SHADER_BIT = 0x10, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + public static final int GL_PROGRAM_SEPARABLE = 0x8258; + + /** + * Accepted by &lt;type&gt; parameter to GetProgramPipelineiv: + */ + public static final int GL_ACTIVE_PROGRAM = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + /** + * Returned in the &lt;type&gt; parameter of GetActiveAttrib: + */ + public static final int GL_DOUBLE_VEC2 = 0x8FFC, + GL_DOUBLE_VEC3 = 0x8FFD, + GL_DOUBLE_VEC4 = 0x8FFE, + GL_DOUBLE_MAT2 = 0x8F46, + GL_DOUBLE_MAT3 = 0x8F47, + GL_DOUBLE_MAT4 = 0x8F48, + GL_DOUBLE_MAT2x3 = 0x8F49, + GL_DOUBLE_MAT2x4 = 0x8F4A, + GL_DOUBLE_MAT3x2 = 0x8F4B, + GL_DOUBLE_MAT3x4 = 0x8F4C, + GL_DOUBLE_MAT4x2 = 0x8F4D, + GL_DOUBLE_MAT4x3 = 0x8F4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: + */ + public static final int GL_SCISSOR_BOX = 0xC10; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFloati_v: + */ + public static final int GL_VIEWPORT = 0xBA2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetDoublei_v: + */ + public static final int GL_DEPTH_RANGE = 0xB70; + + /** + * Accepted by the &lt;pname&gt; parameter of Enablei, Disablei, and IsEnabledi: + */ + public static final int GL_SCISSOR_TEST = 0xC11; + + /** + * Returned in the &lt;data&gt; parameter from a Get query with a &lt;pname&gt; of + * LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX: + */ + public static final int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E, + GL_PROVOKING_VERTEX = 0x8E4F, + GL_UNDEFINED_VERTEX = 0x8260; + + private GL41() {} + + public static void glReleaseShaderCompiler() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glReleaseShaderCompiler; + BufferChecks.checkFunctionAddress(function_pointer); + nglReleaseShaderCompiler(function_pointer); + } + static native void nglReleaseShaderCompiler(long function_pointer); + + public static void glShaderBinary(IntBuffer shaders, int binaryformat, ByteBuffer binary) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderBinary; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(shaders); + BufferChecks.checkDirect(binary); + nglShaderBinary(shaders.remaining(), MemoryUtil.getAddress(shaders), binaryformat, MemoryUtil.getAddress(binary), binary.remaining(), function_pointer); + } + static native void nglShaderBinary(int shaders_count, long shaders, int binaryformat, long binary, int binary_length, long function_pointer); + + public static void glGetShaderPrecisionFormat(int shadertype, int precisiontype, IntBuffer range, IntBuffer precision) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetShaderPrecisionFormat; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(range, 2); + BufferChecks.checkBuffer(precision, 1); + nglGetShaderPrecisionFormat(shadertype, precisiontype, MemoryUtil.getAddress(range), MemoryUtil.getAddress(precision), function_pointer); + } + static native void nglGetShaderPrecisionFormat(int shadertype, int precisiontype, long range, long precision, long function_pointer); + + public static void glDepthRangef(float n, float f) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthRangef; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthRangef(n, f, function_pointer); + } + static native void nglDepthRangef(float n, float f, long function_pointer); + + public static void glClearDepthf(float d) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearDepthf; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearDepthf(d, function_pointer); + } + static native void nglClearDepthf(float d, long function_pointer); + + public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramBinary; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(binaryFormat, 1); + BufferChecks.checkDirect(binary); + nglGetProgramBinary(program, binary.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(binaryFormat), MemoryUtil.getAddress(binary), function_pointer); + } + static native void nglGetProgramBinary(int program, int binary_bufSize, long length, long binaryFormat, long binary, long function_pointer); + + public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramBinary; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(binary); + nglProgramBinary(program, binaryFormat, MemoryUtil.getAddress(binary), binary.remaining(), function_pointer); + } + static native void nglProgramBinary(int program, int binaryFormat, long binary, int binary_length, long function_pointer); + + public static void glProgramParameteri(int program, int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramParameteri(program, pname, value, function_pointer); + } + static native void nglProgramParameteri(int program, int pname, int value, long function_pointer); + + public static void glUseProgramStages(int pipeline, int stages, int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUseProgramStages; + BufferChecks.checkFunctionAddress(function_pointer); + nglUseProgramStages(pipeline, stages, program, function_pointer); + } + static native void nglUseProgramStages(int pipeline, int stages, int program, long function_pointer); + + public static void glActiveShaderProgram(int pipeline, int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveShaderProgram; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveShaderProgram(pipeline, program, function_pointer); + } + static native void nglActiveShaderProgram(int pipeline, int program, long function_pointer); + + /** + * Single null-terminated source code string. + */ + public static int glCreateShaderProgram(int type, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + BufferChecks.checkNullTerminated(string); + int __result = nglCreateShaderProgramv(type, 1, MemoryUtil.getAddress(string), function_pointer); + return __result; + } + static native int nglCreateShaderProgramv(int type, int count, long string, long function_pointer); + + /** + * Overloads glCreateShaderProgramv. + * <p> + * Multiple null-terminated source code strings, one after the other. + */ + public static int glCreateShaderProgram(int type, int count, ByteBuffer strings) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(strings); + BufferChecks.checkNullTerminated(strings, count); + int __result = nglCreateShaderProgramv2(type, count, MemoryUtil.getAddress(strings), function_pointer); + return __result; + } + static native int nglCreateShaderProgramv2(int type, int count, long strings, long function_pointer); + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, ByteBuffer[] strings) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings, 1); + int __result = nglCreateShaderProgramv3(type, strings.length, strings, function_pointer); + return __result; + } + static native int nglCreateShaderProgramv3(int type, int count, ByteBuffer[] strings, long function_pointer); + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramv; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglCreateShaderProgramv(type, 1, APIUtil.getBufferNT(caps, string), function_pointer); + return __result; + } + + /** Overloads glCreateShaderProgramv. */ + public static int glCreateShaderProgram(int type, CharSequence[] strings) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCreateShaderProgramv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkArray(strings); + int __result = nglCreateShaderProgramv2(type, strings.length, APIUtil.getBufferNT(caps, strings), function_pointer); + return __result; + } + + public static void glBindProgramPipeline(int pipeline) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindProgramPipeline; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindProgramPipeline(pipeline, function_pointer); + } + static native void nglBindProgramPipeline(int pipeline, long function_pointer); + + public static void glDeleteProgramPipelines(IntBuffer pipelines) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramPipelines; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pipelines); + nglDeleteProgramPipelines(pipelines.remaining(), MemoryUtil.getAddress(pipelines), function_pointer); + } + static native void nglDeleteProgramPipelines(int pipelines_n, long pipelines, long function_pointer); + + /** Overloads glDeleteProgramPipelines. */ + public static void glDeleteProgramPipelines(int pipeline) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramPipelines; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteProgramPipelines(1, APIUtil.getInt(caps, pipeline), function_pointer); + } + + public static void glGenProgramPipelines(IntBuffer pipelines) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramPipelines; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pipelines); + nglGenProgramPipelines(pipelines.remaining(), MemoryUtil.getAddress(pipelines), function_pointer); + } + static native void nglGenProgramPipelines(int pipelines_n, long pipelines, long function_pointer); + + /** Overloads glGenProgramPipelines. */ + public static int glGenProgramPipelines() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramPipelines; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer pipelines = APIUtil.getBufferInt(caps); + nglGenProgramPipelines(1, MemoryUtil.getAddress(pipelines), function_pointer); + return pipelines.get(0); + } + + public static boolean glIsProgramPipeline(int pipeline) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsProgramPipeline; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsProgramPipeline(pipeline, function_pointer); + return __result; + } + static native boolean nglIsProgramPipeline(int pipeline, long function_pointer); + + public static void glGetProgramPipeline(int pipeline, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramPipelineiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetProgramPipelineiv(pipeline, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramPipelineiv(int pipeline, int pname, long params, long function_pointer); + + /** Overloads glGetProgramPipelineiv. */ + public static int glGetProgramPipelinei(int pipeline, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramPipelineiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetProgramPipelineiv(pipeline, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glProgramUniform1i(int program, int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1i; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1i(program, location, v0, function_pointer); + } + static native void nglProgramUniform1i(int program, int location, int v0, long function_pointer); + + public static void glProgramUniform2i(int program, int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2i; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2i(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2i(int program, int location, int v0, int v1, long function_pointer); + + public static void glProgramUniform3i(int program, int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3i; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3i(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3i(int program, int location, int v0, int v1, int v2, long function_pointer); + + public static void glProgramUniform4i(int program, int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4i; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4i(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4i(int program, int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glProgramUniform1f(int program, int location, float v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1f; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1f(program, location, v0, function_pointer); + } + static native void nglProgramUniform1f(int program, int location, float v0, long function_pointer); + + public static void glProgramUniform2f(int program, int location, float v0, float v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2f; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2f(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2f(int program, int location, float v0, float v1, long function_pointer); + + public static void glProgramUniform3f(int program, int location, float v0, float v1, float v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3f; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3f(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3f(int program, int location, float v0, float v1, float v2, long function_pointer); + + public static void glProgramUniform4f(int program, int location, float v0, float v1, float v2, float v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4f; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4f(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4f(int program, int location, float v0, float v1, float v2, float v3, long function_pointer); + + public static void glProgramUniform1d(int program, int location, double v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1d(program, location, v0, function_pointer); + } + static native void nglProgramUniform1d(int program, int location, double v0, long function_pointer); + + public static void glProgramUniform2d(int program, int location, double v0, double v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2d(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2d(int program, int location, double v0, double v1, long function_pointer); + + public static void glProgramUniform3d(int program, int location, double v0, double v1, double v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3d(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3d(int program, int location, double v0, double v1, double v2, long function_pointer); + + public static void glProgramUniform4d(int program, int location, double v0, double v1, double v2, double v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4d(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4d(int program, int location, double v0, double v1, double v2, double v3, long function_pointer); + + public static void glProgramUniform1(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1iv(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1iv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2iv(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2iv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3iv(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3iv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4iv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4iv(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4iv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform1(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1fv(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1fv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2fv(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2fv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3fv(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3fv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4(int program, int location, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4fv(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4fv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform1(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1dv(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1dv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2dv(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2dv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3dv(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3dv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4(int program, int location, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4dv(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4dv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform1ui(int program, int location, int v0) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1ui(program, location, v0, function_pointer); + } + static native void nglProgramUniform1ui(int program, int location, int v0, long function_pointer); + + public static void glProgramUniform2ui(int program, int location, int v0, int v1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2ui(program, location, v0, v1, function_pointer); + } + static native void nglProgramUniform2ui(int program, int location, int v0, int v1, long function_pointer); + + public static void glProgramUniform3ui(int program, int location, int v0, int v1, int v2) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3ui(program, location, v0, v1, v2, function_pointer); + } + static native void nglProgramUniform3ui(int program, int location, int v0, int v1, int v2, long function_pointer); + + public static void glProgramUniform4ui(int program, int location, int v0, int v1, int v2, int v3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4ui; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4ui(program, location, v0, v1, v2, v3, function_pointer); + } + static native void nglProgramUniform4ui(int program, int location, int v0, int v1, int v2, int v3, long function_pointer); + + public static void glProgramUniform1u(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1uiv(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1uiv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2u(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2uiv(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2uiv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3u(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3uiv(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3uiv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4u(int program, int location, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4uiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4uiv(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4uiv(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniformMatrix2(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2fv(program, location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3fv(program, location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4fv(program, location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2dv(program, location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3dv(program, location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4dv(program, location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x3(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x3fv(program, location, value.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x3fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x2(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x2fv(program, location, value.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x2fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x4(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x4fv(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x4fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x2(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x2fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x2fv(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x2fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x4(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x4fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x4fv(program, location, value.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x4fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x3(int program, int location, boolean transpose, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x3fv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x3fv(program, location, value.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x3fv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x3(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x3dv(program, location, value.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x3dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x2(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x2dv(program, location, value.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x2dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix2x4(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix2x4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2x4dv(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix2x4dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x2(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x2dv(program, location, value.remaining() >> 3, transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x2dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix3x4(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix3x4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3x4dv(program, location, value.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix3x4dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glProgramUniformMatrix4x3(int program, int location, boolean transpose, DoubleBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformMatrix4x3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4x3dv(program, location, value.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformMatrix4x3dv(int program, int location, int value_count, boolean transpose, long value, long function_pointer); + + public static void glValidateProgramPipeline(int pipeline) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glValidateProgramPipeline; + BufferChecks.checkFunctionAddress(function_pointer); + nglValidateProgramPipeline(pipeline, function_pointer); + } + static native void nglValidateProgramPipeline(int pipeline, long function_pointer); + + public static void glGetProgramPipelineInfoLog(int pipeline, IntBuffer length, ByteBuffer infoLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramPipelineInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetProgramPipelineInfoLog(pipeline, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog), function_pointer); + } + static native void nglGetProgramPipelineInfoLog(int pipeline, int infoLog_bufSize, long length, long infoLog, long function_pointer); + + /** Overloads glGetProgramPipelineInfoLog. */ + public static String glGetProgramPipelineInfoLog(int pipeline, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramPipelineInfoLog; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer infoLog_length = APIUtil.getLengths(caps); + ByteBuffer infoLog = APIUtil.getBufferByte(caps, bufSize); + nglGetProgramPipelineInfoLog(pipeline, bufSize, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog), function_pointer); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(caps, infoLog); + } + + public static void glVertexAttribL1d(int index, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL1d(index, x, function_pointer); + } + static native void nglVertexAttribL1d(int index, double x, long function_pointer); + + public static void glVertexAttribL2d(int index, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL2d(index, x, y, function_pointer); + } + static native void nglVertexAttribL2d(int index, double x, double y, long function_pointer); + + public static void glVertexAttribL3d(int index, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL3d(index, x, y, z, function_pointer); + } + static native void nglVertexAttribL3d(int index, double x, double y, double z, long function_pointer); + + public static void glVertexAttribL4d(int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4d; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL4d(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribL4d(int index, double x, double y, double z, double w, long function_pointer); + + public static void glVertexAttribL1(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribL1dv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL1dv(int index, long v, long function_pointer); + + public static void glVertexAttribL2(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribL2dv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL2dv(int index, long v, long function_pointer); + + public static void glVertexAttribL3(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribL3dv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL3dv(int index, long v, long function_pointer); + + public static void glVertexAttribL4(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4dv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribL4dv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL4dv(int index, long v, long function_pointer); + + public static void glVertexAttribLPointer(int index, int size, int stride, DoubleBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(pointer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = pointer; + nglVertexAttribLPointer(index, size, GL11.GL_DOUBLE, stride, MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglVertexAttribLPointer(int index, int size, int type, int stride, long pointer, long function_pointer); + public static void glVertexAttribLPointer(int index, int size, int stride, long pointer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLPointer; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribLPointerBO(index, size, GL11.GL_DOUBLE, stride, pointer_buffer_offset, function_pointer); + } + static native void nglVertexAttribLPointerBO(int index, int size, int type, int stride, long pointer_buffer_offset, long function_pointer); + + public static void glGetVertexAttribL(int index, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribLdv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribLdv(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribLdv(int index, int pname, long params, long function_pointer); + + public static void glViewportArray(int first, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glViewportArrayv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglViewportArrayv(first, v.remaining() >> 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglViewportArrayv(int first, int v_count, long v, long function_pointer); + + public static void glViewportIndexedf(int index, float x, float y, float w, float h) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glViewportIndexedf; + BufferChecks.checkFunctionAddress(function_pointer); + nglViewportIndexedf(index, x, y, w, h, function_pointer); + } + static native void nglViewportIndexedf(int index, float x, float y, float w, float h, long function_pointer); + + public static void glViewportIndexed(int index, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glViewportIndexedfv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglViewportIndexedfv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglViewportIndexedfv(int index, long v, long function_pointer); + + public static void glScissorArray(int first, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScissorArrayv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglScissorArrayv(first, v.remaining() >> 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglScissorArrayv(int first, int v_count, long v, long function_pointer); + + public static void glScissorIndexed(int index, int left, int bottom, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScissorIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + nglScissorIndexed(index, left, bottom, width, height, function_pointer); + } + static native void nglScissorIndexed(int index, int left, int bottom, int width, int height, long function_pointer); + + public static void glScissorIndexed(int index, IntBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glScissorIndexedv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglScissorIndexedv(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglScissorIndexedv(int index, long v, long function_pointer); + + public static void glDepthRangeArray(int first, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthRangeArrayv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglDepthRangeArrayv(first, v.remaining() >> 1, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglDepthRangeArrayv(int first, int v_count, long v, long function_pointer); + + public static void glDepthRangeIndexed(int index, double n, double f) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthRangeIndexed; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthRangeIndexed(index, n, f, function_pointer); + } + static native void nglDepthRangeIndexed(int index, double n, double f, long function_pointer); + + public static void glGetFloat(int target, int index, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloati_v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetFloati_v(target, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetFloati_v(int target, int index, long data, long function_pointer); + + /** Overloads glGetFloati_v. */ + public static float glGetFloat(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFloati_v; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer data = APIUtil.getBufferFloat(caps); + nglGetFloati_v(target, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } + + public static void glGetDouble(int target, int index, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublei_v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglGetDoublei_v(target, index, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglGetDoublei_v(int target, int index, long data, long function_pointer); + + /** Overloads glGetDoublei_v. */ + public static double glGetDouble(int target, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDoublei_v; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer data = APIUtil.getBufferDouble(caps); + nglGetDoublei_v(target, index, MemoryUtil.getAddress(data), function_pointer); + return data.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL42.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL42.java new file mode 100644 index 0000000..6d5c92e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL42.java @@ -0,0 +1,377 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL42 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, TexImage3D, + * CopyTexImage2D, CopyTexImage3D, CompressedTexImage2DARB, and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB and CompressedTexSubImage3DARB: + */ + public static final int GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C, + GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D, + GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E, + GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStore[fi], GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + /** + * Accepted by the &lt;target&gt; parameter of BindBufferBase and BindBufferRange: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_64v: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: + */ + public static final int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** + * Returned in &lt;params&gt; by GetActiveUniform and GetActiveUniformsiv: + */ + public static final int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: + */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** + * Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: + */ + public static final int GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x1, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x2, + GL_UNIFORM_BARRIER_BIT = 0x4, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x8, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x20, + GL_COMMAND_BARRIER_BIT = 0x40, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x80, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x1000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv: + */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the &lt;data&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv when &lt;value&gt; is + * IMAGE_FORMAT_COMPATIBILITY_TYPE: + */ + public static final int GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ: + */ + public static final int GL_NUM_SAMPLE_COUNTS = 0x9380; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + + private GL42() {} + + public static void glGetActiveAtomicCounterBuffer(int program, int bufferIndex, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAtomicCounterBufferiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetActiveAtomicCounterBufferiv(int program, int bufferIndex, int pname, long params, long function_pointer); + + /** Overloads glGetActiveAtomicCounterBufferiv. */ + public static int glGetActiveAtomicCounterBuffer(int program, int bufferIndex, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveAtomicCounterBufferiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glTexStorage1D(int target, int levels, int internalformat, int width) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorage1D; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorage1D(target, levels, internalformat, width, function_pointer); + } + static native void nglTexStorage1D(int target, int levels, int internalformat, int width, long function_pointer); + + public static void glTexStorage2D(int target, int levels, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorage2D; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorage2D(target, levels, internalformat, width, height, function_pointer); + } + static native void nglTexStorage2D(int target, int levels, int internalformat, int width, int height, long function_pointer); + + public static void glTexStorage3D(int target, int levels, int internalformat, int width, int height, int depth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorage3D; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorage3D(target, levels, internalformat, width, height, depth, function_pointer); + } + static native void nglTexStorage3D(int target, int levels, int internalformat, int width, int height, int depth, long function_pointer); + + public static void glDrawTransformFeedbackInstanced(int mode, int id, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTransformFeedbackInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTransformFeedbackInstanced(mode, id, primcount, function_pointer); + } + static native void nglDrawTransformFeedbackInstanced(int mode, int id, int primcount, long function_pointer); + + public static void glDrawTransformFeedbackStreamInstanced(int mode, int id, int stream, int primcount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTransformFeedbackStreamInstanced; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTransformFeedbackStreamInstanced(mode, id, stream, primcount, function_pointer); + } + static native void nglDrawTransformFeedbackStreamInstanced(int mode, int id, int stream, int primcount, long function_pointer); + + public static void glDrawArraysInstancedBaseInstance(int mode, int first, int count, int primcount, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawArraysInstancedBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawArraysInstancedBaseInstance(mode, first, count, primcount, baseinstance, function_pointer); + } + static native void nglDrawArraysInstancedBaseInstance(int mode, int first, int count, int primcount, int baseinstance, long function_pointer); + + public static void glDrawElementsInstancedBaseInstance(int mode, ByteBuffer indices, int primcount, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, baseinstance, function_pointer); + } + public static void glDrawElementsInstancedBaseInstance(int mode, IntBuffer indices, int primcount, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, baseinstance, function_pointer); + } + public static void glDrawElementsInstancedBaseInstance(int mode, ShortBuffer indices, int primcount, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, baseinstance, function_pointer); + } + static native void nglDrawElementsInstancedBaseInstance(int mode, int indices_count, int type, long indices, int primcount, int baseinstance, long function_pointer); + public static void glDrawElementsInstancedBaseInstance(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedBaseInstanceBO(mode, indices_count, type, indices_buffer_offset, primcount, baseinstance, function_pointer); + } + static native void nglDrawElementsInstancedBaseInstanceBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int baseinstance, long function_pointer); + + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, ByteBuffer indices, int primcount, int basevertex, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertexBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount, basevertex, baseinstance, function_pointer); + } + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, IntBuffer indices, int primcount, int basevertex, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertexBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount, basevertex, baseinstance, function_pointer); + } + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, ShortBuffer indices, int primcount, int basevertex, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertexBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOdisabled(caps); + BufferChecks.checkDirect(indices); + nglDrawElementsInstancedBaseVertexBaseInstance(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount, basevertex, baseinstance, function_pointer); + } + static native void nglDrawElementsInstancedBaseVertexBaseInstance(int mode, int indices_count, int type, long indices, int primcount, int basevertex, int baseinstance, long function_pointer); + public static void glDrawElementsInstancedBaseVertexBaseInstance(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex, int baseinstance) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawElementsInstancedBaseVertexBaseInstance; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureElementVBOenabled(caps); + nglDrawElementsInstancedBaseVertexBaseInstanceBO(mode, indices_count, type, indices_buffer_offset, primcount, basevertex, baseinstance, function_pointer); + } + static native void nglDrawElementsInstancedBaseVertexBaseInstanceBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount, int basevertex, int baseinstance, long function_pointer); + + public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindImageTexture; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindImageTexture(unit, texture, level, layered, layer, access, format, function_pointer); + } + static native void nglBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format, long function_pointer); + + public static void glMemoryBarrier(int barriers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMemoryBarrier; + BufferChecks.checkFunctionAddress(function_pointer); + nglMemoryBarrier(barriers, function_pointer); + } + static native void nglMemoryBarrier(int barriers, long function_pointer); + + public static void glGetInternalformat(int target, int internalformat, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInternalformativ; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetInternalformativ(target, internalformat, pname, params.remaining(), MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetInternalformativ(int target, int internalformat, int pname, int params_bufSize, long params, long function_pointer); + + /** Overloads glGetInternalformativ. */ + public static int glGetInternalformat(int target, int internalformat, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInternalformativ; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetInternalformativ(target, internalformat, pname, 1, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL43.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL43.java new file mode 100644 index 0000000..7bd4059 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL43.java @@ -0,0 +1,1082 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL43 { + + /** + * No. of supported Shading Language Versions. Accepted by the &lt;pname&gt; parameter of GetIntegerv. + */ + public static final int GL_NUM_SHADING_LANGUAGE_VERSIONS = 0x82E9; + + /** + * Vertex attrib array has unconverted doubles. Accepted by the &lt;pname&gt; parameter of GetVertexAttribiv. + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_LONG = 0x874E; + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D + */ + public static final int GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** + * Accepted by the &lt;target&gt; parameter of Enable and Disable: + */ + public static final int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * GetQueryIndexediv and GetQueryiv: + */ + public static final int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** + * Accepted by the &lt;value&gt; parameter of the GetInteger* functions: + */ + public static final int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned in the + * &lt;params&gt; parameter by GetShaderiv: + */ + public static final int GL_COMPUTE_SHADER = 0x91B9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + public static final int GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: + */ + public static final int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: + */ + public static final int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** + * Accepted by the &lt;stages&gt; parameter of UseProgramStages: + */ + public static final int GL_COMPUTE_SHADER_BIT = 0x20; + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + public static final int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** + * Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: + */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** + * Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** + * Returned by GetError: + */ + public static final int GL_STACK_UNDERFLOW = 0x504, + GL_STACK_OVERFLOW = 0x503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + public static final int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + public static final int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + /** + * Accepted by the &lt;pname&gt; parameter of FramebufferParameteri, + * GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + /** + * Accepted by the &lt;target&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + public static final int GL_TEXTURE_1D = 0xDE0, + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D = 0xDE1, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009, + GL_TEXTURE_RECTANGLE = 0x84F5, + GL_TEXTURE_BUFFER = 0x8C2A, + GL_RENDERBUFFER = 0x8D41, + GL_TEXTURE_2D_MULTISAMPLE = 0x9100, + GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + public static final int GL_SAMPLES = 0x80A9, + GL_NUM_SAMPLE_COUNTS = 0x9380, + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_SRGB_DECODE_ARB = 0x8299, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** + * Returned as possible responses for various &lt;pname&gt; queries + * to GetInternalformativ and GetInternalformati64v + */ + public static final int GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + /** + * Accepted by the &lt;programInterface&gt; parameter of GetProgramInterfaceiv, + * GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex: + */ + public static final int GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramInterfaceiv: + */ + public static final int GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** + * Accepted in the &lt;props&gt; array of GetProgramResourceiv: + */ + public static final int GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + public static final int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetIntegeri_v, + * GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** + * Accepted in the &lt;barriers&gt; bitfield in glMemoryBarrier: + */ + public static final int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** + * Alias for the existing token + * MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS: + */ + public static final int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter* and GetTexParameter*: + */ + public static final int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv and + * GetTexParameteriv: + */ + public static final int GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE, + GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib*v: + */ + public static final int GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + public static final int GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, ... + */ + public static final int GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + private GL43() {} + + public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(data, 1); + nglClearBufferData(target, internalformat, format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglClearBufferData(int target, int internalformat, int format, int type, long data, long function_pointer); + + public static void glClearBufferSubData(int target, int internalformat, long offset, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglClearBufferSubData(target, internalformat, offset, data.remaining(), format, type, MemoryUtil.getAddress(data), function_pointer); + } + static native void nglClearBufferSubData(int target, int internalformat, long offset, long data_size, int format, int type, long data, long function_pointer); + + public static void glDispatchCompute(int num_groups_x, int num_groups_y, int num_groups_z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDispatchCompute; + BufferChecks.checkFunctionAddress(function_pointer); + nglDispatchCompute(num_groups_x, num_groups_y, num_groups_z, function_pointer); + } + static native void nglDispatchCompute(int num_groups_x, int num_groups_y, int num_groups_z, long function_pointer); + + public static void glDispatchComputeIndirect(long indirect) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDispatchComputeIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + nglDispatchComputeIndirect(indirect, function_pointer); + } + static native void nglDispatchComputeIndirect(long indirect, long function_pointer); + + public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyImageSubData; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth, function_pointer); + } + static native void nglCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth, long function_pointer); + + public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageControl; + BufferChecks.checkFunctionAddress(function_pointer); + if (ids != null) + BufferChecks.checkDirect(ids); + nglDebugMessageControl(source, type, severity, (ids == null ? 0 : ids.remaining()), MemoryUtil.getAddressSafe(ids), enabled, function_pointer); + } + static native void nglDebugMessageControl(int source, int type, int severity, int ids_count, long ids, boolean enabled, long function_pointer); + + public static void glDebugMessageInsert(int source, int type, int id, int severity, ByteBuffer buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsert; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(buf); + nglDebugMessageInsert(source, type, id, severity, buf.remaining(), MemoryUtil.getAddress(buf), function_pointer); + } + static native void nglDebugMessageInsert(int source, int type, int id, int severity, int buf_length, long buf, long function_pointer); + + /** Overloads glDebugMessageInsert. */ + public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageInsert; + BufferChecks.checkFunctionAddress(function_pointer); + nglDebugMessageInsert(source, type, id, severity, buf.length(), APIUtil.getBuffer(caps, buf), function_pointer); + } + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * <p> + * @param callback the callback function to use + */ + public static void glDebugMessageCallback(KHRDebugCallback callback) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDebugMessageCallback; + BufferChecks.checkFunctionAddress(function_pointer); + long userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler()); + CallbackUtil.registerContextCallbackKHR(userParam); + nglDebugMessageCallback(callback == null ? 0 : callback.getPointer(), userParam, function_pointer); + } + static native void nglDebugMessageCallback(long callback, long userParam, long function_pointer); + + public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetDebugMessageLog; + BufferChecks.checkFunctionAddress(function_pointer); + if (sources != null) + BufferChecks.checkBuffer(sources, count); + if (types != null) + BufferChecks.checkBuffer(types, count); + if (ids != null) + BufferChecks.checkBuffer(ids, count); + if (severities != null) + BufferChecks.checkBuffer(severities, count); + if (lengths != null) + BufferChecks.checkBuffer(lengths, count); + if (messageLog != null) + BufferChecks.checkDirect(messageLog); + int __result = nglGetDebugMessageLog(count, (messageLog == null ? 0 : messageLog.remaining()), MemoryUtil.getAddressSafe(sources), MemoryUtil.getAddressSafe(types), MemoryUtil.getAddressSafe(ids), MemoryUtil.getAddressSafe(severities), MemoryUtil.getAddressSafe(lengths), MemoryUtil.getAddressSafe(messageLog), function_pointer); + return __result; + } + static native int nglGetDebugMessageLog(int count, int messageLog_bufsize, long sources, long types, long ids, long severities, long lengths, long messageLog, long function_pointer); + + public static void glPushDebugGroup(int source, int id, ByteBuffer message) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushDebugGroup; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(message); + nglPushDebugGroup(source, id, message.remaining(), MemoryUtil.getAddress(message), function_pointer); + } + static native void nglPushDebugGroup(int source, int id, int message_length, long message, long function_pointer); + + /** Overloads glPushDebugGroup. */ + public static void glPushDebugGroup(int source, int id, CharSequence message) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPushDebugGroup; + BufferChecks.checkFunctionAddress(function_pointer); + nglPushDebugGroup(source, id, message.length(), APIUtil.getBuffer(caps, message), function_pointer); + } + + public static void glPopDebugGroup() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPopDebugGroup; + BufferChecks.checkFunctionAddress(function_pointer); + nglPopDebugGroup(function_pointer); + } + static native void nglPopDebugGroup(long function_pointer); + + public static void glObjectLabel(int identifier, int name, ByteBuffer label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectLabel; + BufferChecks.checkFunctionAddress(function_pointer); + if (label != null) + BufferChecks.checkDirect(label); + nglObjectLabel(identifier, name, (label == null ? 0 : label.remaining()), MemoryUtil.getAddressSafe(label), function_pointer); + } + static native void nglObjectLabel(int identifier, int name, int label_length, long label, long function_pointer); + + /** Overloads glObjectLabel. */ + public static void glObjectLabel(int identifier, int name, CharSequence label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectLabel; + BufferChecks.checkFunctionAddress(function_pointer); + nglObjectLabel(identifier, name, label.length(), APIUtil.getBuffer(caps, label), function_pointer); + } + + public static void glGetObjectLabel(int identifier, int name, IntBuffer length, ByteBuffer label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectLabel; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(label); + nglGetObjectLabel(identifier, name, label.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(label), function_pointer); + } + static native void nglGetObjectLabel(int identifier, int name, int label_bufSize, long length, long label, long function_pointer); + + /** Overloads glGetObjectLabel. */ + public static String glGetObjectLabel(int identifier, int name, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectLabel; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer label_length = APIUtil.getLengths(caps); + ByteBuffer label = APIUtil.getBufferByte(caps, bufSize); + nglGetObjectLabel(identifier, name, bufSize, MemoryUtil.getAddress0(label_length), MemoryUtil.getAddress(label), function_pointer); + label.limit(label_length.get(0)); + return APIUtil.getString(caps, label); + } + + public static void glObjectPtrLabel(PointerWrapper ptr, ByteBuffer label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectPtrLabel; + BufferChecks.checkFunctionAddress(function_pointer); + if (label != null) + BufferChecks.checkDirect(label); + nglObjectPtrLabel(ptr.getPointer(), (label == null ? 0 : label.remaining()), MemoryUtil.getAddressSafe(label), function_pointer); + } + static native void nglObjectPtrLabel(long ptr, int label_length, long label, long function_pointer); + + /** Overloads glObjectPtrLabel. */ + public static void glObjectPtrLabel(PointerWrapper ptr, CharSequence label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glObjectPtrLabel; + BufferChecks.checkFunctionAddress(function_pointer); + nglObjectPtrLabel(ptr.getPointer(), label.length(), APIUtil.getBuffer(caps, label), function_pointer); + } + + public static void glGetObjectPtrLabel(PointerWrapper ptr, IntBuffer length, ByteBuffer label) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectPtrLabel; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(label); + nglGetObjectPtrLabel(ptr.getPointer(), label.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(label), function_pointer); + } + static native void nglGetObjectPtrLabel(long ptr, int label_bufSize, long length, long label, long function_pointer); + + /** Overloads glGetObjectPtrLabel. */ + public static String glGetObjectPtrLabel(PointerWrapper ptr, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetObjectPtrLabel; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer label_length = APIUtil.getLengths(caps); + ByteBuffer label = APIUtil.getBufferByte(caps, bufSize); + nglGetObjectPtrLabel(ptr.getPointer(), bufSize, MemoryUtil.getAddress0(label_length), MemoryUtil.getAddress(label), function_pointer); + label.limit(label_length.get(0)); + return APIUtil.getString(caps, label); + } + + public static void glFramebufferParameteri(int target, int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFramebufferParameteri; + BufferChecks.checkFunctionAddress(function_pointer); + nglFramebufferParameteri(target, pname, param, function_pointer); + } + static native void nglFramebufferParameteri(int target, int pname, int param, long function_pointer); + + public static void glGetFramebufferParameter(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetFramebufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFramebufferParameteriv(int target, int pname, long params, long function_pointer); + + /** Overloads glGetFramebufferParameteriv. */ + public static int glGetFramebufferParameteri(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFramebufferParameteriv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetFramebufferParameteriv(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetInternalformat(int target, int internalformat, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInternalformati64v; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetInternalformati64v(target, internalformat, pname, params.remaining(), MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetInternalformati64v(int target, int internalformat, int pname, int params_bufSize, long params, long function_pointer); + + /** Overloads glGetInternalformati64v. */ + public static long glGetInternalformati64(int target, int internalformat, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetInternalformati64v; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetInternalformati64v(target, internalformat, pname, 1, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glInvalidateTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + nglInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, function_pointer); + } + static native void nglInvalidateTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, long function_pointer); + + public static void glInvalidateTexImage(int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + nglInvalidateTexImage(texture, level, function_pointer); + } + static native void nglInvalidateTexImage(int texture, int level, long function_pointer); + + public static void glInvalidateBufferSubData(int buffer, long offset, long length) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateBufferSubData; + BufferChecks.checkFunctionAddress(function_pointer); + nglInvalidateBufferSubData(buffer, offset, length, function_pointer); + } + static native void nglInvalidateBufferSubData(int buffer, long offset, long length, long function_pointer); + + public static void glInvalidateBufferData(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateBufferData; + BufferChecks.checkFunctionAddress(function_pointer); + nglInvalidateBufferData(buffer, function_pointer); + } + static native void nglInvalidateBufferData(int buffer, long function_pointer); + + public static void glInvalidateFramebuffer(int target, IntBuffer attachments) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateFramebuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attachments); + nglInvalidateFramebuffer(target, attachments.remaining(), MemoryUtil.getAddress(attachments), function_pointer); + } + static native void nglInvalidateFramebuffer(int target, int attachments_numAttachments, long attachments, long function_pointer); + + public static void glInvalidateSubFramebuffer(int target, IntBuffer attachments, int x, int y, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInvalidateSubFramebuffer; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attachments); + nglInvalidateSubFramebuffer(target, attachments.remaining(), MemoryUtil.getAddress(attachments), x, y, width, height, function_pointer); + } + static native void nglInvalidateSubFramebuffer(int target, int attachments_numAttachments, long attachments, int x, int y, int width, int height, long function_pointer); + + public static void glMultiDrawArraysIndirect(int mode, ByteBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 * 4 : stride) * primcount); + nglMultiDrawArraysIndirect(mode, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirect(int mode, long indirect, int primcount, int stride, long function_pointer); + public static void glMultiDrawArraysIndirect(int mode, long indirect_buffer_offset, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawArraysIndirectBO(mode, indirect_buffer_offset, primcount, stride, function_pointer); + } + static native void nglMultiDrawArraysIndirectBO(int mode, long indirect_buffer_offset, int primcount, int stride, long function_pointer); + + /** Overloads glMultiDrawArraysIndirect. */ + public static void glMultiDrawArraysIndirect(int mode, IntBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 4 : stride >> 2) * primcount); + nglMultiDrawArraysIndirect(mode, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + + public static void glMultiDrawElementsIndirect(int mode, int type, ByteBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 * 4 : stride) * primcount); + nglMultiDrawElementsIndirect(mode, type, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirect(int mode, int type, long indirect, int primcount, int stride, long function_pointer); + public static void glMultiDrawElementsIndirect(int mode, int type, long indirect_buffer_offset, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawElementsIndirectBO(mode, type, indirect_buffer_offset, primcount, stride, function_pointer); + } + static native void nglMultiDrawElementsIndirectBO(int mode, int type, long indirect_buffer_offset, int primcount, int stride, long function_pointer); + + /** Overloads glMultiDrawElementsIndirect. */ + public static void glMultiDrawElementsIndirect(int mode, int type, IntBuffer indirect, int primcount, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirect; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 5 : stride >> 2) * primcount); + nglMultiDrawElementsIndirect(mode, type, MemoryUtil.getAddress(indirect), primcount, stride, function_pointer); + } + + public static void glGetProgramInterface(int program, int programInterface, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramInterfaceiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetProgramInterfaceiv(program, programInterface, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramInterfaceiv(int program, int programInterface, int pname, long params, long function_pointer); + + /** Overloads glGetProgramInterfaceiv. */ + public static int glGetProgramInterfacei(int program, int programInterface, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramInterfaceiv; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetProgramInterfaceiv(program, programInterface, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static int glGetProgramResourceIndex(int program, int programInterface, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceIndex; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetProgramResourceIndex(program, programInterface, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetProgramResourceIndex(int program, int programInterface, long name, long function_pointer); + + /** Overloads glGetProgramResourceIndex. */ + public static int glGetProgramResourceIndex(int program, int programInterface, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceIndex; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetProgramResourceIndex(program, programInterface, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetProgramResourceName(int program, int programInterface, int index, IntBuffer length, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceName; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + if (name != null) + BufferChecks.checkDirect(name); + nglGetProgramResourceName(program, programInterface, index, (name == null ? 0 : name.remaining()), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddressSafe(name), function_pointer); + } + static native void nglGetProgramResourceName(int program, int programInterface, int index, int name_bufSize, long length, long name, long function_pointer); + + /** Overloads glGetProgramResourceName. */ + public static String glGetProgramResourceName(int program, int programInterface, int index, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceName; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufSize); + nglGetProgramResourceName(program, programInterface, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + public static void glGetProgramResource(int program, int programInterface, int index, IntBuffer props, IntBuffer length, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceiv; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(props); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(params); + nglGetProgramResourceiv(program, programInterface, index, props.remaining(), MemoryUtil.getAddress(props), params.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramResourceiv(int program, int programInterface, int index, int props_propCount, long props, int params_bufSize, long length, long params, long function_pointer); + + public static int glGetProgramResourceLocation(int program, int programInterface, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceLocation; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetProgramResourceLocation(program, programInterface, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetProgramResourceLocation(int program, int programInterface, long name, long function_pointer); + + /** Overloads glGetProgramResourceLocation. */ + public static int glGetProgramResourceLocation(int program, int programInterface, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceLocation; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetProgramResourceLocation(program, programInterface, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static int glGetProgramResourceLocationIndex(int program, int programInterface, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceLocationIndex; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetProgramResourceLocationIndex(program, programInterface, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetProgramResourceLocationIndex(int program, int programInterface, long name, long function_pointer); + + /** Overloads glGetProgramResourceLocationIndex. */ + public static int glGetProgramResourceLocationIndex(int program, int programInterface, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramResourceLocationIndex; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetProgramResourceLocationIndex(program, programInterface, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glShaderStorageBlockBinding(int program, int storageBlockIndex, int storageBlockBinding) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glShaderStorageBlockBinding; + BufferChecks.checkFunctionAddress(function_pointer); + nglShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding, function_pointer); + } + static native void nglShaderStorageBlockBinding(int program, int storageBlockIndex, int storageBlockBinding, long function_pointer); + + public static void glTexBufferRange(int target, int internalformat, int buffer, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexBufferRange; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexBufferRange(target, internalformat, buffer, offset, size, function_pointer); + } + static native void nglTexBufferRange(int target, int internalformat, int buffer, long offset, long size, long function_pointer); + + public static void glTexStorage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorage2DMultisample; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations, function_pointer); + } + static native void nglTexStorage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations, long function_pointer); + + public static void glTexStorage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexStorage3DMultisample; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations, function_pointer); + } + static native void nglTexStorage3DMultisample(int target, int samples, int internalformat, int width, int height, int depth, boolean fixedsamplelocations, long function_pointer); + + public static void glTextureView(int texture, int target, int origtexture, int internalformat, int minlevel, int numlevels, int minlayer, int numlayers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureView; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers, function_pointer); + } + static native void nglTextureView(int texture, int target, int origtexture, int internalformat, int minlevel, int numlevels, int minlayer, int numlayers, long function_pointer); + + public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVertexBuffer; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindVertexBuffer(bindingindex, buffer, offset, stride, function_pointer); + } + static native void nglBindVertexBuffer(int bindingindex, int buffer, long offset, int stride, long function_pointer); + + public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribFormat; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribFormat(attribindex, size, type, normalized, relativeoffset, function_pointer); + } + static native void nglVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset, long function_pointer); + + public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIFormat; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribIFormat(attribindex, size, type, relativeoffset, function_pointer); + } + static native void nglVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset, long function_pointer); + + public static void glVertexAttribLFormat(int attribindex, int size, int type, int relativeoffset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLFormat; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribLFormat(attribindex, size, type, relativeoffset, function_pointer); + } + static native void nglVertexAttribLFormat(int attribindex, int size, int type, int relativeoffset, long function_pointer); + + public static void glVertexAttribBinding(int attribindex, int bindingindex) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribBinding; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribBinding(attribindex, bindingindex, function_pointer); + } + static native void nglVertexAttribBinding(int attribindex, int bindingindex, long function_pointer); + + public static void glVertexBindingDivisor(int bindingindex, int divisor) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexBindingDivisor; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexBindingDivisor(bindingindex, divisor, function_pointer); + } + static native void nglVertexBindingDivisor(int bindingindex, int divisor, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL44.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL44.java new file mode 100644 index 0000000..ab9cbb3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GL44.java @@ -0,0 +1,304 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GL44 { + + /** + * Implementation-dependent state which constrains the maximum value of stride parameters to vertex array pointer-setting commands. + */ + public static final int GL_MAX_VERTEX_ATTRIB_STRIDE = 0x82E5; + + /** + * Accepted in the &lt;flags&gt; parameter of BufferStorage and + * NamedBufferStorageEXT: + */ + public static final int GL_MAP_PERSISTENT_BIT = 0x40, + GL_MAP_COHERENT_BIT = 0x80, + GL_DYNAMIC_STORAGE_BIT = 0x100, + GL_CLIENT_STORAGE_BIT = 0x200; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferParameter{i|i64}v:\ + */ + public static final int GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: + */ + public static final int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x4000; + + /** + * Accepted by the &lt;pname&gt; parameter for GetInternalformativ and + * GetInternalformati64v: + */ + public static final int GL_CLEAR_TEXTURE = 0x9365; + + /** + * Accepted in the &lt;props&gt; array of GetProgramResourceiv: + */ + public static final int GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + public static final int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv, GetBufferParameteri64v, GetBufferPointerv, + * ClearBufferSubData, and the &lt;readtarget&gt; and &lt;writetarget&gt; parameters of + * CopyBufferSubData: + */ + public static final int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** + * Accepted in the &lt;barriers&gt; bitfield in MemoryBarrier: + */ + public static final int GL_QUERY_BUFFER_BARRIER_BIT = 0x8000; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameter{if}, SamplerParameter{if} + * and SamplerParameter{if}v, and by the &lt;params&gt; parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when + * their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or + * TEXTURE_WRAP_R: + */ + public static final int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + + private GL44() {} + + public static void glBufferStorage(int target, ByteBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, data.remaining(), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glBufferStorage(int target, DoubleBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, (data.remaining() << 3), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glBufferStorage(int target, FloatBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, (data.remaining() << 2), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glBufferStorage(int target, IntBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, (data.remaining() << 2), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glBufferStorage(int target, ShortBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, (data.remaining() << 1), MemoryUtil.getAddress(data), flags, function_pointer); + } + public static void glBufferStorage(int target, LongBuffer data, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglBufferStorage(target, (data.remaining() << 3), MemoryUtil.getAddress(data), flags, function_pointer); + } + static native void nglBufferStorage(int target, long data_size, long data, int flags, long function_pointer); + + /** Overloads glBufferStorage. */ + public static void glBufferStorage(int target, long size, int flags) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferStorage; + BufferChecks.checkFunctionAddress(function_pointer); + nglBufferStorage(target, size, 0L, flags, function_pointer); + } + + public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexImage(int texture, int level, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexImage(int texture, int level, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexImage(int texture, int level, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexImage(int texture, int level, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexImage(int texture, int level, int format, int type, LongBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexImage(texture, level, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + static native void nglClearTexImage(int texture, int level, int format, int type, long data, long function_pointer); + + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + public static void glClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, LongBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearTexSubImage; + BufferChecks.checkFunctionAddress(function_pointer); + if (data != null) + BufferChecks.checkBuffer(data, 1); + nglClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddressSafe(data), function_pointer); + } + static native void nglClearTexSubImage(int texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long data, long function_pointer); + + public static void glBindBuffersBase(int target, int first, int count, IntBuffer buffers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBuffersBase; + BufferChecks.checkFunctionAddress(function_pointer); + if (buffers != null) + BufferChecks.checkBuffer(buffers, count); + nglBindBuffersBase(target, first, count, MemoryUtil.getAddressSafe(buffers), function_pointer); + } + static native void nglBindBuffersBase(int target, int first, int count, long buffers, long function_pointer); + + public static void glBindBuffersRange(int target, int first, int count, IntBuffer buffers, PointerBuffer offsets, PointerBuffer sizes) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBuffersRange; + BufferChecks.checkFunctionAddress(function_pointer); + if (buffers != null) + BufferChecks.checkBuffer(buffers, count); + if (offsets != null) + BufferChecks.checkBuffer(offsets, count); + if (sizes != null) + BufferChecks.checkBuffer(sizes, count); + nglBindBuffersRange(target, first, count, MemoryUtil.getAddressSafe(buffers), MemoryUtil.getAddressSafe(offsets), MemoryUtil.getAddressSafe(sizes), function_pointer); + } + static native void nglBindBuffersRange(int target, int first, int count, long buffers, long offsets, long sizes, long function_pointer); + + public static void glBindTextures(int first, int count, IntBuffer textures) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTextures; + BufferChecks.checkFunctionAddress(function_pointer); + if (textures != null) + BufferChecks.checkBuffer(textures, count); + nglBindTextures(first, count, MemoryUtil.getAddressSafe(textures), function_pointer); + } + static native void nglBindTextures(int first, int count, long textures, long function_pointer); + + public static void glBindSamplers(int first, int count, IntBuffer samplers) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindSamplers; + BufferChecks.checkFunctionAddress(function_pointer); + if (samplers != null) + BufferChecks.checkBuffer(samplers, count); + nglBindSamplers(first, count, MemoryUtil.getAddressSafe(samplers), function_pointer); + } + static native void nglBindSamplers(int first, int count, long samplers, long function_pointer); + + public static void glBindImageTextures(int first, int count, IntBuffer textures) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindImageTextures; + BufferChecks.checkFunctionAddress(function_pointer); + if (textures != null) + BufferChecks.checkBuffer(textures, count); + nglBindImageTextures(first, count, MemoryUtil.getAddressSafe(textures), function_pointer); + } + static native void nglBindImageTextures(int first, int count, long textures, long function_pointer); + + public static void glBindVertexBuffers(int first, int count, IntBuffer buffers, PointerBuffer offsets, IntBuffer strides) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVertexBuffers; + BufferChecks.checkFunctionAddress(function_pointer); + if (buffers != null) + BufferChecks.checkBuffer(buffers, count); + if (offsets != null) + BufferChecks.checkBuffer(offsets, count); + if (strides != null) + BufferChecks.checkBuffer(strides, count); + nglBindVertexBuffers(first, count, MemoryUtil.getAddressSafe(buffers), MemoryUtil.getAddressSafe(offsets), MemoryUtil.getAddressSafe(strides), function_pointer); + } + static native void nglBindVertexBuffers(int first, int count, long buffers, long offsets, long strides, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYFrameTerminator.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYFrameTerminator.java new file mode 100644 index 0000000..32b06d5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYFrameTerminator.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GREMEDYFrameTerminator { + + private GREMEDYFrameTerminator() {} + + public static void glFrameTerminatorGREMEDY() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFrameTerminatorGREMEDY; + BufferChecks.checkFunctionAddress(function_pointer); + nglFrameTerminatorGREMEDY(function_pointer); + } + static native void nglFrameTerminatorGREMEDY(long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYStringMarker.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYStringMarker.java new file mode 100644 index 0000000..9fec105 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/GREMEDYStringMarker.java @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class GREMEDYStringMarker { + + private GREMEDYStringMarker() {} + + public static void glStringMarkerGREMEDY(ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStringMarkerGREMEDY; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglStringMarkerGREMEDY(string.remaining(), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglStringMarkerGREMEDY(int string_len, long string, long function_pointer); + + /** Overloads glStringMarkerGREMEDY. */ + public static void glStringMarkerGREMEDY(CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStringMarkerGREMEDY; + BufferChecks.checkFunctionAddress(function_pointer); + nglStringMarkerGREMEDY(string.length(), APIUtil.getBuffer(caps, string), function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/HPOcclusionTest.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/HPOcclusionTest.java new file mode 100644 index 0000000..f56d5f2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/HPOcclusionTest.java @@ -0,0 +1,23 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class HPOcclusionTest { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev : + */ + public static final int GL_OCCLUSION_TEST_HP = 0x8165; + + /** + * Accepted by the &lt;pname&gt; of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev : + */ + public static final int GL_OCCLUSION_TEST_RESULT_HP = 0x8166; + + private HPOcclusionTest() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/IBMRasterposClip.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/IBMRasterposClip.java new file mode 100644 index 0000000..c9a2467 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/IBMRasterposClip.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class IBMRasterposClip { + + /** + * Accepted by the &lt;target&gt; parameter of Enable and Disable and the &lt;value&gt; + * parameter of IsEnabled, GetBooleanv, GetIntegerv, GetFloatv, GetDoublev: + */ + public static final int GL_RASTER_POSITION_UNCLIPPED_IBM = 0x19262; + + private IBMRasterposClip() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/INTELMapTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/INTELMapTexture.java new file mode 100644 index 0000000..c1b2521 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/INTELMapTexture.java @@ -0,0 +1,57 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class INTELMapTexture { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, for target TEXTURE_2D + */ + public static final int GL_TEXTURE_MEMORY_LAYOUT_INTEL = 0x83FF; + + /** + * Accepted by the &lt;params&gt; when &lt;pname&gt; is set to + * &lt;TEXTURE_MEMORY_LAYOUT_INTEL&gt;: + */ + public static final int GL_LAYOUT_DEFAULT_INTEL = 0x0, + GL_LAYOUT_LINEAR_INTEL = 0x1, + GL_LAYOUT_LINEAR_CPU_CACHED_INTEL = 0x2; + + private INTELMapTexture() {} + + /** + * The length parameter does not exist in the native API. It used by LWJGL to return a ByteBuffer + * with a proper capacity. + */ + public static ByteBuffer glMapTexture2DINTEL(int texture, int level, long length, int access, IntBuffer stride, IntBuffer layout, ByteBuffer old_buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapTexture2DINTEL; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(stride, 1); + BufferChecks.checkBuffer(layout, 1); + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapTexture2DINTEL(texture, level, length, access, MemoryUtil.getAddress(stride), MemoryUtil.getAddress(layout), old_buffer, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapTexture2DINTEL(int texture, int level, long length, int access, long stride, long layout, ByteBuffer old_buffer, long function_pointer); + + public static void glUnmapTexture2DINTEL(int texture, int level) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUnmapTexture2DINTEL; + BufferChecks.checkFunctionAddress(function_pointer); + nglUnmapTexture2DINTEL(texture, level, function_pointer); + } + static native void nglUnmapTexture2DINTEL(int texture, int level, long function_pointer); + + public static void glSyncTextureINTEL(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSyncTextureINTEL; + BufferChecks.checkFunctionAddress(function_pointer); + nglSyncTextureINTEL(texture, function_pointer); + } + static native void nglSyncTextureINTEL(int texture, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRDebug.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRDebug.java new file mode 100644 index 0000000..a1cc4a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRDebug.java @@ -0,0 +1,179 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRDebug { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + public static final int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** + * Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: + */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** + * Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** + * Returned by GetError: + */ + public static final int GL_STACK_UNDERFLOW = 0x504, + GL_STACK_OVERFLOW = 0x503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + public static final int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + private KHRDebug() {} + + public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { + GL43.glDebugMessageControl(source, type, severity, ids, enabled); + } + + public static void glDebugMessageInsert(int source, int type, int id, int severity, ByteBuffer buf) { + GL43.glDebugMessageInsert(source, type, id, severity, buf); + } + + /** Overloads glDebugMessageInsert. */ + public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { + GL43.glDebugMessageInsert(source, type, id, severity, buf); + } + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * <p> + * @param callback the callback function to use + */ + public static void glDebugMessageCallback(KHRDebugCallback callback) { + GL43.glDebugMessageCallback(callback); + } + + public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { + return GL43.glGetDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + public static void glPushDebugGroup(int source, int id, ByteBuffer message) { + GL43.glPushDebugGroup(source, id, message); + } + + /** Overloads glPushDebugGroup. */ + public static void glPushDebugGroup(int source, int id, CharSequence message) { + GL43.glPushDebugGroup(source, id, message); + } + + public static void glPopDebugGroup() { + GL43.glPopDebugGroup(); + } + + public static void glObjectLabel(int identifier, int name, ByteBuffer label) { + GL43.glObjectLabel(identifier, name, label); + } + + /** Overloads glObjectLabel. */ + public static void glObjectLabel(int identifier, int name, CharSequence label) { + GL43.glObjectLabel(identifier, name, label); + } + + public static void glGetObjectLabel(int identifier, int name, IntBuffer length, ByteBuffer label) { + GL43.glGetObjectLabel(identifier, name, length, label); + } + + /** Overloads glGetObjectLabel. */ + public static String glGetObjectLabel(int identifier, int name, int bufSize) { + return GL43.glGetObjectLabel(identifier, name, bufSize); + } + + public static void glObjectPtrLabel(PointerWrapper ptr, ByteBuffer label) { + GL43.glObjectPtrLabel(ptr, label); + } + + /** Overloads glObjectPtrLabel. */ + public static void glObjectPtrLabel(PointerWrapper ptr, CharSequence label) { + GL43.glObjectPtrLabel(ptr, label); + } + + public static void glGetObjectPtrLabel(PointerWrapper ptr, IntBuffer length, ByteBuffer label) { + GL43.glGetObjectPtrLabel(ptr, length, label); + } + + /** Overloads glGetObjectPtrLabel. */ + public static String glGetObjectPtrLabel(PointerWrapper ptr, int bufSize) { + return GL43.glGetObjectPtrLabel(ptr, bufSize); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRTextureCompressionAstcLdr.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRTextureCompressionAstcLdr.java new file mode 100644 index 0000000..2645e32 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/KHRTextureCompressionAstcLdr.java @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRTextureCompressionAstcLdr { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D, + * CompressedTexSubImage2D, TexStorage2D, TextureStorage2D, TexStorage3D, + * and TextureStorage3D: + */ + public static final int GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, + GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, + GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, + GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, + GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, + GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, + GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, + GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, + GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, + GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, + GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, + GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, + GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD; + + private KHRTextureCompressionAstcLdr() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java new file mode 100644 index 0000000..920fadd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessMultiDrawIndirect.java @@ -0,0 +1,47 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVBindlessMultiDrawIndirect { + + private NVBindlessMultiDrawIndirect() {} + + public static void glMultiDrawArraysIndirectBindlessNV(int mode, ByteBuffer indirect, int drawCount, int stride, int vertexBufferCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectBindlessNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 20 + 24 * vertexBufferCount : stride) * drawCount); + nglMultiDrawArraysIndirectBindlessNV(mode, MemoryUtil.getAddress(indirect), drawCount, stride, vertexBufferCount, function_pointer); + } + static native void nglMultiDrawArraysIndirectBindlessNV(int mode, long indirect, int drawCount, int stride, int vertexBufferCount, long function_pointer); + public static void glMultiDrawArraysIndirectBindlessNV(int mode, long indirect_buffer_offset, int drawCount, int stride, int vertexBufferCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawArraysIndirectBindlessNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawArraysIndirectBindlessNVBO(mode, indirect_buffer_offset, drawCount, stride, vertexBufferCount, function_pointer); + } + static native void nglMultiDrawArraysIndirectBindlessNVBO(int mode, long indirect_buffer_offset, int drawCount, int stride, int vertexBufferCount, long function_pointer); + + public static void glMultiDrawElementsIndirectBindlessNV(int mode, int type, ByteBuffer indirect, int drawCount, int stride, int vertexBufferCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectBindlessNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOdisabled(caps); + BufferChecks.checkBuffer(indirect, (stride == 0 ? 48 + 24 * vertexBufferCount : stride) * drawCount); + nglMultiDrawElementsIndirectBindlessNV(mode, type, MemoryUtil.getAddress(indirect), drawCount, stride, vertexBufferCount, function_pointer); + } + static native void nglMultiDrawElementsIndirectBindlessNV(int mode, int type, long indirect, int drawCount, int stride, int vertexBufferCount, long function_pointer); + public static void glMultiDrawElementsIndirectBindlessNV(int mode, int type, long indirect_buffer_offset, int drawCount, int stride, int vertexBufferCount) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiDrawElementsIndirectBindlessNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureIndirectBOenabled(caps); + nglMultiDrawElementsIndirectBindlessNVBO(mode, type, indirect_buffer_offset, drawCount, stride, vertexBufferCount, function_pointer); + } + static native void nglMultiDrawElementsIndirectBindlessNVBO(int mode, int type, long indirect_buffer_offset, int drawCount, int stride, int vertexBufferCount, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessTexture.java new file mode 100644 index 0000000..e81ae7e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBindlessTexture.java @@ -0,0 +1,122 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVBindlessTexture { + + private NVBindlessTexture() {} + + public static long glGetTextureHandleNV(int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureHandleNV; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetTextureHandleNV(texture, function_pointer); + return __result; + } + static native long nglGetTextureHandleNV(int texture, long function_pointer); + + public static long glGetTextureSamplerHandleNV(int texture, int sampler) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTextureSamplerHandleNV; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetTextureSamplerHandleNV(texture, sampler, function_pointer); + return __result; + } + static native long nglGetTextureSamplerHandleNV(int texture, int sampler, long function_pointer); + + public static void glMakeTextureHandleResidentNV(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeTextureHandleResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeTextureHandleResidentNV(handle, function_pointer); + } + static native void nglMakeTextureHandleResidentNV(long handle, long function_pointer); + + public static void glMakeTextureHandleNonResidentNV(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeTextureHandleNonResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeTextureHandleNonResidentNV(handle, function_pointer); + } + static native void nglMakeTextureHandleNonResidentNV(long handle, long function_pointer); + + public static long glGetImageHandleNV(int texture, int level, boolean layered, int layer, int format) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetImageHandleNV; + BufferChecks.checkFunctionAddress(function_pointer); + long __result = nglGetImageHandleNV(texture, level, layered, layer, format, function_pointer); + return __result; + } + static native long nglGetImageHandleNV(int texture, int level, boolean layered, int layer, int format, long function_pointer); + + public static void glMakeImageHandleResidentNV(long handle, int access) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeImageHandleResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeImageHandleResidentNV(handle, access, function_pointer); + } + static native void nglMakeImageHandleResidentNV(long handle, int access, long function_pointer); + + public static void glMakeImageHandleNonResidentNV(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeImageHandleNonResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeImageHandleNonResidentNV(handle, function_pointer); + } + static native void nglMakeImageHandleNonResidentNV(long handle, long function_pointer); + + public static void glUniformHandleui64NV(int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformHandleui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniformHandleui64NV(location, value, function_pointer); + } + static native void nglUniformHandleui64NV(int location, long value, long function_pointer); + + public static void glUniformHandleuNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformHandleui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformHandleui64vNV(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformHandleui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glProgramUniformHandleui64NV(int program, int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformHandleui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniformHandleui64NV(program, location, value, function_pointer); + } + static native void nglProgramUniformHandleui64NV(int program, int location, long value, long function_pointer); + + public static void glProgramUniformHandleuNV(int program, int location, LongBuffer values) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformHandleui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(values); + nglProgramUniformHandleui64vNV(program, location, values.remaining(), MemoryUtil.getAddress(values), function_pointer); + } + static native void nglProgramUniformHandleui64vNV(int program, int location, int values_count, long values, long function_pointer); + + public static boolean glIsTextureHandleResidentNV(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsTextureHandleResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsTextureHandleResidentNV(handle, function_pointer); + return __result; + } + static native boolean nglIsTextureHandleResidentNV(long handle, long function_pointer); + + public static boolean glIsImageHandleResidentNV(long handle) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsImageHandleResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsImageHandleResidentNV(handle, function_pointer); + return __result; + } + static native boolean nglIsImageHandleResidentNV(long handle, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBlendEquationAdvanced.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBlendEquationAdvanced.java new file mode 100644 index 0000000..f1a26a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVBlendEquationAdvanced.java @@ -0,0 +1,93 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVBlendEquationAdvanced { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev + * and GetInteger64v: + */ + public static final int GL_BLEND_ADVANCED_COHERENT_NV = 0x9285; + + /** + * Accepted by the &lt;pname&gt; parameter of BlendParameteriNV, GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_BLEND_PREMULTIPLIED_SRC_NV = 0x9280, + GL_BLEND_OVERLAP_NV = 0x9281; + + /** + * Accepted by the &lt;value&gt; parameter of BlendParameteriNV when &lt;pname&gt; is + * BLEND_OVERLAP_NV: + */ + public static final int GL_UNCORRELATED_NV = 0x9282, + GL_DISJOINT_NV = 0x9283, + GL_CONJOINT_NV = 0x9284; + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquation and BlendEquationi: + */ + public static final int GL_SRC_NV = 0x9286, + GL_DST_NV = 0x9287, + GL_SRC_OVER_NV = 0x9288, + GL_DST_OVER_NV = 0x9289, + GL_SRC_IN_NV = 0x928A, + GL_DST_IN_NV = 0x928B, + GL_SRC_OUT_NV = 0x928C, + GL_DST_OUT_NV = 0x928D, + GL_SRC_ATOP_NV = 0x928E, + GL_DST_ATOP_NV = 0x928F, + GL_MULTIPLY_NV = 0x9294, + GL_SCREEN_NV = 0x9295, + GL_OVERLAY_NV = 0x9296, + GL_DARKEN_NV = 0x9297, + GL_LIGHTEN_NV = 0x9298, + GL_COLORDODGE_NV = 0x9299, + GL_COLORBURN_NV = 0x929A, + GL_HARDLIGHT_NV = 0x929B, + GL_SOFTLIGHT_NV = 0x929C, + GL_DIFFERENCE_NV = 0x929E, + GL_EXCLUSION_NV = 0x92A0, + GL_INVERT_RGB_NV = 0x92A3, + GL_LINEARDODGE_NV = 0x92A4, + GL_LINEARBURN_NV = 0x92A5, + GL_VIVIDLIGHT_NV = 0x92A6, + GL_LINEARLIGHT_NV = 0x92A7, + GL_PINLIGHT_NV = 0x92A8, + GL_HARDMIX_NV = 0x92A9, + GL_HSL_HUE_NV = 0x92AD, + GL_HSL_SATURATION_NV = 0x92AE, + GL_HSL_COLOR_NV = 0x92AF, + GL_HSL_LUMINOSITY_NV = 0x92B0, + GL_PLUS_NV = 0x9291, + GL_PLUS_CLAMPED_NV = 0x92B1, + GL_PLUS_CLAMPED_ALPHA_NV = 0x92B2, + GL_PLUS_DARKER_NV = 0x9292, + GL_MINUS_NV = 0x929F, + GL_MINUS_CLAMPED_NV = 0x92B3, + GL_CONTRAST_NV = 0x92A1, + GL_INVERT_OVG_NV = 0x92B4; + + private NVBlendEquationAdvanced() {} + + public static void glBlendParameteriNV(int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendParameteriNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendParameteriNV(pname, value, function_pointer); + } + static native void nglBlendParameteriNV(int pname, int value, long function_pointer); + + public static void glBlendBarrierNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBlendBarrierNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBlendBarrierNV(function_pointer); + } + static native void nglBlendBarrierNV(long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVComputeProgram5.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVComputeProgram5.java new file mode 100644 index 0000000..e47c4cd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVComputeProgram5.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVComputeProgram5 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4[df][v]ARB, + * ProgramLocalParameter4[df][v]ARB, GetProgramEnvParameter[df]vARB, + * GetProgramLocalParameter[df]vARB, GetProgramivARB and + * GetProgramStringARB: + */ + public static final int GL_COMPUTE_PROGRAM_NV = 0x90FB; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + public static final int GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV = 0x90FC; + + private NVComputeProgram5() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVConditionalRender.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVConditionalRender.java new file mode 100644 index 0000000..fb1fd41 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVConditionalRender.java @@ -0,0 +1,35 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVConditionalRender { + + /** + * Accepted by the &lt;mode&gt; parameter of BeginConditionalRenderNV: + */ + public static final int GL_QUERY_WAIT_NV = 0x8E13, + GL_QUERY_NO_WAIT_NV = 0x8E14, + GL_QUERY_BY_REGION_WAIT_NV = 0x8E15, + GL_QUERY_BY_REGION_NO_WAIT_NV = 0x8E16; + + private NVConditionalRender() {} + + public static void glBeginConditionalRenderNV(int id, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginConditionalRenderNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginConditionalRenderNV(id, mode, function_pointer); + } + static native void nglBeginConditionalRenderNV(int id, int mode, long function_pointer); + + public static void glEndConditionalRenderNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndConditionalRenderNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndConditionalRenderNV(function_pointer); + } + static native void nglEndConditionalRenderNV(long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyDepthToColor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyDepthToColor.java new file mode 100644 index 0000000..2cfb4c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyDepthToColor.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVCopyDepthToColor { + + public static final int GL_DEPTH_STENCIL_TO_RGBA_NV = 0x886E, + GL_DEPTH_STENCIL_TO_BGRA_NV = 0x886F; + + private NVCopyDepthToColor() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyImage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyImage.java new file mode 100644 index 0000000..8ea9328 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVCopyImage.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVCopyImage { + + private NVCopyImage() {} + + public static void glCopyImageSubDataNV(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int width, int height, int depth) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyImageSubDataNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, function_pointer); + } + static native void nglCopyImageSubDataNV(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int width, int height, int depth, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDeepTexture3D.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDeepTexture3D.java new file mode 100644 index 0000000..9af787c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDeepTexture3D.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDeepTexture3D { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + public static final int GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV = 0x90D0, + GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV = 0x90D1; + + private NVDeepTexture3D() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthBufferFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthBufferFloat.java new file mode 100644 index 0000000..fda6d9d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthBufferFloat.java @@ -0,0 +1,57 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDepthBufferFloat { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + public static final int GL_DEPTH_COMPONENT32F_NV = 0x8DAB, + GL_DEPTH32F_STENCIL8_NV = 0x8DAC; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + public static final int GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV = 0x8DAD; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_DEPTH_BUFFER_FLOAT_MODE_NV = 0x8DAF; + + private NVDepthBufferFloat() {} + + public static void glDepthRangedNV(double n, double f) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthRangedNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthRangedNV(n, f, function_pointer); + } + static native void nglDepthRangedNV(double n, double f, long function_pointer); + + public static void glClearDepthdNV(double d) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glClearDepthdNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglClearDepthdNV(d, function_pointer); + } + static native void nglClearDepthdNV(double d, long function_pointer); + + public static void glDepthBoundsdNV(double zmin, double zmax) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDepthBoundsdNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDepthBoundsdNV(zmin, zmax, function_pointer); + } + static native void nglDepthBoundsdNV(double zmin, double zmax, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthClamp.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthClamp.java new file mode 100644 index 0000000..5548e32 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDepthClamp.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDepthClamp { + + public static final int GL_DEPTH_CLAMP_NV = 0x864F; + + private NVDepthClamp() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDrawTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDrawTexture.java new file mode 100644 index 0000000..20a6968 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVDrawTexture.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDrawTexture { + + private NVDrawTexture() {} + + public static void glDrawTextureNV(int texture, int sampler, float x0, float y0, float x1, float y1, float z, float s0, float t0, float s1, float t1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTextureNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1, function_pointer); + } + static native void nglDrawTextureNV(int texture, int sampler, float x0, float y0, float x1, float y1, float z, float s0, float t0, float s1, float t1, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVEvaluators.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVEvaluators.java new file mode 100644 index 0000000..90bbb36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVEvaluators.java @@ -0,0 +1,116 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVEvaluators { + + public static final int GL_EVAL_2D_NV = 0x86C0, + GL_EVAL_TRIANGULAR_2D_NV = 0x86C1, + GL_MAP_TESSELLATION_NV = 0x86C2, + GL_MAP_ATTRIB_U_ORDER_NV = 0x86C3, + GL_MAP_ATTRIB_V_ORDER_NV = 0x86C4, + GL_EVAL_FRACTIONAL_TESSELLATION_NV = 0x86C5, + GL_EVAL_VERTEX_ATTRIB0_NV = 0x86C6, + GL_EVAL_VERTEX_ATTRIB1_NV = 0x86C7, + GL_EVAL_VERTEX_ATTRIB2_NV = 0x86C8, + GL_EVAL_VERTEX_ATTRIB3_NV = 0x86C9, + GL_EVAL_VERTEX_ATTRIB4_NV = 0x86CA, + GL_EVAL_VERTEX_ATTRIB5_NV = 0x86CB, + GL_EVAL_VERTEX_ATTRIB6_NV = 0x86CC, + GL_EVAL_VERTEX_ATTRIB7_NV = 0x86CD, + GL_EVAL_VERTEX_ATTRIB8_NV = 0x86CE, + GL_EVAL_VERTEX_ATTRIB9_NV = 0x86CF, + GL_EVAL_VERTEX_ATTRIB10_NV = 0x86D0, + GL_EVAL_VERTEX_ATTRIB11_NV = 0x86D1, + GL_EVAL_VERTEX_ATTRIB12_NV = 0x86D2, + GL_EVAL_VERTEX_ATTRIB13_NV = 0x86D3, + GL_EVAL_VERTEX_ATTRIB14_NV = 0x86D4, + GL_EVAL_VERTEX_ATTRIB15_NV = 0x86D5, + GL_MAX_MAP_TESSELLATION_NV = 0x86D6, + GL_MAX_RATIONAL_EVAL_ORDER_NV = 0x86D7; + + private NVEvaluators() {} + + public static void glGetMapControlPointsNV(int target, int index, int type, int ustride, int vstride, boolean packed, FloatBuffer pPoints) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapControlPointsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPoints); + nglGetMapControlPointsNV(target, index, type, ustride, vstride, packed, MemoryUtil.getAddress(pPoints), function_pointer); + } + static native void nglGetMapControlPointsNV(int target, int index, int type, int ustride, int vstride, boolean packed, long pPoints, long function_pointer); + + public static void glMapControlPointsNV(int target, int index, int type, int ustride, int vstride, int uorder, int vorder, boolean packed, FloatBuffer pPoints) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapControlPointsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPoints); + nglMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, MemoryUtil.getAddress(pPoints), function_pointer); + } + static native void nglMapControlPointsNV(int target, int index, int type, int ustride, int vstride, int uorder, int vorder, boolean packed, long pPoints, long function_pointer); + + public static void glMapParameterNV(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMapParameterfvNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMapParameterfvNV(int target, int pname, long params, long function_pointer); + + public static void glMapParameterNV(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMapParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglMapParameterivNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglMapParameterivNV(int target, int pname, long params, long function_pointer); + + public static void glGetMapParameterNV(int target, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMapParameterfvNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMapParameterfvNV(int target, int pname, long params, long function_pointer); + + public static void glGetMapParameterNV(int target, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMapParameterivNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMapParameterivNV(int target, int pname, long params, long function_pointer); + + public static void glGetMapAttribParameterNV(int target, int index, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapAttribParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMapAttribParameterfvNV(target, index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMapAttribParameterfvNV(int target, int index, int pname, long params, long function_pointer); + + public static void glGetMapAttribParameterNV(int target, int index, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMapAttribParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetMapAttribParameterivNV(target, index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetMapAttribParameterivNV(int target, int index, int pname, long params, long function_pointer); + + public static void glEvalMapsNV(int target, int mode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEvalMapsNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEvalMapsNV(target, mode, function_pointer); + } + static native void nglEvalMapsNV(int target, int mode, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVExplicitMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVExplicitMultisample.java new file mode 100644 index 0000000..1cf63c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVExplicitMultisample.java @@ -0,0 +1,92 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVExplicitMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetMultisamplefvNV: + */ + public static final int GL_SAMPLE_POSITION_NV = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_SAMPLE_MASK_NV = 0x8E51; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanIndexedvEXT and + * GetIntegerIndexedvEXT: + */ + public static final int GL_SAMPLE_MASK_VALUE_NV = 0x8E52; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_RENDERBUFFER_NV = 0x8E53, + GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV = 0x8E54, + GL_MAX_SAMPLE_MASK_WORDS_NV = 0x8E59; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture, and TexRenderbufferNV: + */ + public static final int GL_TEXTURE_RENDERBUFFER_NV = 0x8E55; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_RENDERBUFFER_NV = 0x8E56, + GL_INT_SAMPLER_RENDERBUFFER_NV = 0x8E57, + GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV = 0x8E58; + + private NVExplicitMultisample() {} + + public static void glGetBooleanIndexedEXT(int pname, int index, ByteBuffer data) { + EXTDrawBuffers2.glGetBooleanIndexedEXT(pname, index, data); + } + + /** Overloads glGetBooleanIndexedvEXT. */ + public static boolean glGetBooleanIndexedEXT(int pname, int index) { + return EXTDrawBuffers2.glGetBooleanIndexedEXT(pname, index); + } + + public static void glGetIntegerIndexedEXT(int pname, int index, IntBuffer data) { + EXTDrawBuffers2.glGetIntegerIndexedEXT(pname, index, data); + } + + /** Overloads glGetIntegerIndexedvEXT. */ + public static int glGetIntegerIndexedEXT(int pname, int index) { + return EXTDrawBuffers2.glGetIntegerIndexedEXT(pname, index); + } + + public static void glGetMultisampleNV(int pname, int index, FloatBuffer val) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetMultisamplefvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(val, 2); + nglGetMultisamplefvNV(pname, index, MemoryUtil.getAddress(val), function_pointer); + } + static native void nglGetMultisamplefvNV(int pname, int index, long val, long function_pointer); + + public static void glSampleMaskIndexedNV(int index, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSampleMaskIndexedNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglSampleMaskIndexedNV(index, mask, function_pointer); + } + static native void nglSampleMaskIndexedNV(int index, int mask, long function_pointer); + + public static void glTexRenderbufferNV(int target, int renderbuffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexRenderbufferNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexRenderbufferNV(target, renderbuffer, function_pointer); + } + static native void nglTexRenderbufferNV(int target, int renderbuffer, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFence.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFence.java new file mode 100644 index 0000000..d9b134a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFence.java @@ -0,0 +1,94 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFence { + + public static final int GL_ALL_COMPLETED_NV = 0x84F2, + GL_FENCE_STATUS_NV = 0x84F3, + GL_FENCE_CONDITION_NV = 0x84F4; + + private NVFence() {} + + public static void glGenFencesNV(IntBuffer piFences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFencesNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piFences); + nglGenFencesNV(piFences.remaining(), MemoryUtil.getAddress(piFences), function_pointer); + } + static native void nglGenFencesNV(int piFences_n, long piFences, long function_pointer); + + /** Overloads glGenFencesNV. */ + public static int glGenFencesNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenFencesNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer piFences = APIUtil.getBufferInt(caps); + nglGenFencesNV(1, MemoryUtil.getAddress(piFences), function_pointer); + return piFences.get(0); + } + + public static void glDeleteFencesNV(IntBuffer piFences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFencesNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piFences); + nglDeleteFencesNV(piFences.remaining(), MemoryUtil.getAddress(piFences), function_pointer); + } + static native void nglDeleteFencesNV(int piFences_n, long piFences, long function_pointer); + + /** Overloads glDeleteFencesNV. */ + public static void glDeleteFencesNV(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteFencesNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteFencesNV(1, APIUtil.getInt(caps, fence), function_pointer); + } + + public static void glSetFenceNV(int fence, int condition) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSetFenceNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglSetFenceNV(fence, condition, function_pointer); + } + static native void nglSetFenceNV(int fence, int condition, long function_pointer); + + public static boolean glTestFenceNV(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTestFenceNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglTestFenceNV(fence, function_pointer); + return __result; + } + static native boolean nglTestFenceNV(int fence, long function_pointer); + + public static void glFinishFenceNV(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFinishFenceNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFinishFenceNV(fence, function_pointer); + } + static native void nglFinishFenceNV(int fence, long function_pointer); + + public static boolean glIsFenceNV(int fence) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsFenceNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsFenceNV(fence, function_pointer); + return __result; + } + static native boolean nglIsFenceNV(int fence, long function_pointer); + + public static void glGetFenceivNV(int fence, int pname, IntBuffer piParams) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFenceivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(piParams, 4); + nglGetFenceivNV(fence, pname, MemoryUtil.getAddress(piParams), function_pointer); + } + static native void nglGetFenceivNV(int fence, int pname, long piParams, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFloatBuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFloatBuffer.java new file mode 100644 index 0000000..b6fbe08 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFloatBuffer.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFloatBuffer { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D and + * CopyTexImage2D: + */ + public static final int GL_FLOAT_R_NV = 0x8880, + GL_FLOAT_RG_NV = 0x8881, + GL_FLOAT_RGB_NV = 0x8882, + GL_FLOAT_RGBA_NV = 0x8883, + GL_FLOAT_R16_NV = 0x8884, + GL_FLOAT_R32_NV = 0x8885, + GL_FLOAT_RG16_NV = 0x8886, + GL_FLOAT_RG32_NV = 0x8887, + GL_FLOAT_RGB16_NV = 0x8888, + GL_FLOAT_RGB32_NV = 0x8889, + GL_FLOAT_RGBA16_NV = 0x888A, + GL_FLOAT_RGBA32_NV = 0x888B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + public static final int GL_TEXTURE_FLOAT_COMPONENTS_NV = 0x888C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FLOAT_CLEAR_COLOR_VALUE_NV = 0x888D, + GL_FLOAT_RGBA_MODE_NV = 0x888E; + + private NVFloatBuffer() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFogDistance.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFogDistance.java new file mode 100644 index 0000000..57dffc9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFogDistance.java @@ -0,0 +1,15 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFogDistance { + + public static final int GL_FOG_DISTANCE_MODE_NV = 0x855A, + GL_EYE_RADIAL_NV = 0x855B, + GL_EYE_PLANE_ABSOLUTE_NV = 0x855C; + + private NVFogDistance() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram.java new file mode 100644 index 0000000..0ec5a94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram.java @@ -0,0 +1,68 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFragmentProgram extends NVProgram { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of BindProgramNV, LoadProgramNV, + * ProgramLocalParameter4dARB, ProgramLocalParameter4dvARB, + * ProgramLocalParameter4fARB, ProgramLocalParameter4fvARB, + * GetProgramLocalParameterdvARB, and GetProgramLocalParameterfvARB: + */ + public static final int GL_FRAGMENT_PROGRAM_NV = 0x8870; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_TEXTURE_COORDS_NV = 0x8871, + GL_MAX_TEXTURE_IMAGE_UNITS_NV = 0x8872, + GL_FRAGMENT_PROGRAM_BINDING_NV = 0x8873, + GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV = 0x8868; + + private NVFragmentProgram() {} + + public static void glProgramNamedParameter4fNV(int id, ByteBuffer name, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramNamedParameter4fNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + nglProgramNamedParameter4fNV(id, name.remaining(), MemoryUtil.getAddress(name), x, y, z, w, function_pointer); + } + static native void nglProgramNamedParameter4fNV(int id, int name_length, long name, float x, float y, float z, float w, long function_pointer); + + public static void glProgramNamedParameter4dNV(int id, ByteBuffer name, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramNamedParameter4dNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + nglProgramNamedParameter4dNV(id, name.remaining(), MemoryUtil.getAddress(name), x, y, z, w, function_pointer); + } + static native void nglProgramNamedParameter4dNV(int id, int name_length, long name, double x, double y, double z, double w, long function_pointer); + + public static void glGetProgramNamedParameterNV(int id, ByteBuffer name, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramNamedParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkBuffer(params, 4); + nglGetProgramNamedParameterfvNV(id, name.remaining(), MemoryUtil.getAddress(name), MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramNamedParameterfvNV(int id, int name_length, long name, long params, long function_pointer); + + public static void glGetProgramNamedParameterNV(int id, ByteBuffer name, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramNamedParameterdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkBuffer(params, 4); + nglGetProgramNamedParameterdvNV(id, name.remaining(), MemoryUtil.getAddress(name), MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramNamedParameterdvNV(int id, int name_length, long name, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram2.java new file mode 100644 index 0000000..220b11b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFragmentProgram2.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFragmentProgram2 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = 0x88F4, + GL_MAX_PROGRAM_CALL_DEPTH_NV = 0x88F5, + GL_MAX_PROGRAM_IF_DEPTH_NV = 0x88F6, + GL_MAX_PROGRAM_LOOP_DEPTH_NV = 0x88F7, + GL_MAX_PROGRAM_LOOP_COUNT_NV = 0x88F8; + + private NVFragmentProgram2() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java new file mode 100644 index 0000000..63333ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVFramebufferMultisampleCoverage.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFramebufferMultisampleCoverage { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT. + */ + public static final int GL_RENDERBUFFER_COVERAGE_SAMPLES_NV = 0x8CAB, + GL_RENDERBUFFER_COLOR_SAMPLES_NV = 0x8E10; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv. + */ + public static final int GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E11, + GL_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E12; + + private NVFramebufferMultisampleCoverage() {} + + public static void glRenderbufferStorageMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalformat, int width, int height) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRenderbufferStorageMultisampleCoverageNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height, function_pointer); + } + static native void nglRenderbufferStorageMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalformat, int width, int height, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGeometryProgram4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGeometryProgram4.java new file mode 100644 index 0000000..255ddb1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGeometryProgram4.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVGeometryProgram4 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_GEOMETRY_PROGRAM_NV = 0x8C26; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_MAX_PROGRAM_OUTPUT_VERTICES_NV = 0x8C27, + GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV = 0x8C28; + + private NVGeometryProgram4() {} + + public static void glProgramVertexLimitNV(int target, int limit) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramVertexLimitNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramVertexLimitNV(target, limit, function_pointer); + } + static native void nglProgramVertexLimitNV(int target, int limit, long function_pointer); + + public static void glFramebufferTextureEXT(int target, int attachment, int texture, int level) { + EXTGeometryShader4.glFramebufferTextureEXT(target, attachment, texture, level); + } + + public static void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) { + EXTGeometryShader4.glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); + } + + public static void glFramebufferTextureFaceEXT(int target, int attachment, int texture, int level, int face) { + EXTGeometryShader4.glFramebufferTextureFaceEXT(target, attachment, texture, level, face); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram4.java new file mode 100644 index 0000000..18befcf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram4.java @@ -0,0 +1,161 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVGpuProgram4 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_PROGRAM_ATTRIB_COMPONENTS_NV = 0x8906, + GL_PROGRAM_RESULT_COMPONENTS_NV = 0x8907, + GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV = 0x8908, + GL_MAX_PROGRAM_RESULT_COMPONENTS_NV = 0x8909, + GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV = 0x8DA5, + GL_MAX_PROGRAM_GENERIC_RESULTS_NV = 0x8DA6; + + private NVGpuProgram4() {} + + public static void glProgramLocalParameterI4iNV(int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameterI4iNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramLocalParameterI4iNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramLocalParameterI4iNV(int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glProgramLocalParameterI4NV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameterI4ivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramLocalParameterI4ivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParameterI4ivNV(int target, int index, long params, long function_pointer); + + public static void glProgramLocalParametersI4NV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParametersI4ivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramLocalParametersI4ivNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParametersI4ivNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glProgramLocalParameterI4uiNV(int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameterI4uiNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramLocalParameterI4uiNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramLocalParameterI4uiNV(int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glProgramLocalParameterI4uNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParameterI4uivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramLocalParameterI4uivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParameterI4uivNV(int target, int index, long params, long function_pointer); + + public static void glProgramLocalParametersI4uNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramLocalParametersI4uivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramLocalParametersI4uivNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramLocalParametersI4uivNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glProgramEnvParameterI4iNV(int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameterI4iNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramEnvParameterI4iNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramEnvParameterI4iNV(int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glProgramEnvParameterI4NV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameterI4ivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramEnvParameterI4ivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParameterI4ivNV(int target, int index, long params, long function_pointer); + + public static void glProgramEnvParametersI4NV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParametersI4ivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramEnvParametersI4ivNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParametersI4ivNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glProgramEnvParameterI4uiNV(int target, int index, int x, int y, int z, int w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameterI4uiNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramEnvParameterI4uiNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramEnvParameterI4uiNV(int target, int index, int x, int y, int z, int w, long function_pointer); + + public static void glProgramEnvParameterI4uNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParameterI4uivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglProgramEnvParameterI4uivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParameterI4uivNV(int target, int index, long params, long function_pointer); + + public static void glProgramEnvParametersI4uNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramEnvParametersI4uivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramEnvParametersI4uivNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramEnvParametersI4uivNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glGetProgramLocalParameterINV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramLocalParameterIivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramLocalParameterIivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramLocalParameterIivNV(int target, int index, long params, long function_pointer); + + public static void glGetProgramLocalParameterIuNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramLocalParameterIuivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramLocalParameterIuivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramLocalParameterIuivNV(int target, int index, long params, long function_pointer); + + public static void glGetProgramEnvParameterINV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramEnvParameterIivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramEnvParameterIivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramEnvParameterIivNV(int target, int index, long params, long function_pointer); + + public static void glGetProgramEnvParameterIuNV(int target, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramEnvParameterIuivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramEnvParameterIuivNV(target, index, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramEnvParameterIuivNV(int target, int index, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram5.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram5.java new file mode 100644 index 0000000..9b10f3f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuProgram5.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVGpuProgram5 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV = 0x8E5A, + GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV = 0x8E5B, + GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV = 0x8E5C, + GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV = 0x8E5D; + + private NVGpuProgram5() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuShader5.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuShader5.java new file mode 100644 index 0000000..c249d02 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVGpuShader5.java @@ -0,0 +1,339 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVGpuShader5 { + + /** + * Returned by the &lt;type&gt; parameter of GetActiveAttrib, GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + public static final int GL_INT64_NV = 0x140E, + GL_UNSIGNED_INT64_NV = 0x140F, + GL_INT8_NV = 0x8FE0, + GL_INT8_VEC2_NV = 0x8FE1, + GL_INT8_VEC3_NV = 0x8FE2, + GL_INT8_VEC4_NV = 0x8FE3, + GL_INT16_NV = 0x8FE4, + GL_INT16_VEC2_NV = 0x8FE5, + GL_INT16_VEC3_NV = 0x8FE6, + GL_INT16_VEC4_NV = 0x8FE7, + GL_INT64_VEC2_NV = 0x8FE9, + GL_INT64_VEC3_NV = 0x8FEA, + GL_INT64_VEC4_NV = 0x8FEB, + GL_UNSIGNED_INT8_NV = 0x8FEC, + GL_UNSIGNED_INT8_VEC2_NV = 0x8FED, + GL_UNSIGNED_INT8_VEC3_NV = 0x8FEE, + GL_UNSIGNED_INT8_VEC4_NV = 0x8FEF, + GL_UNSIGNED_INT16_NV = 0x8FF0, + GL_UNSIGNED_INT16_VEC2_NV = 0x8FF1, + GL_UNSIGNED_INT16_VEC3_NV = 0x8FF2, + GL_UNSIGNED_INT16_VEC4_NV = 0x8FF3, + GL_UNSIGNED_INT64_VEC2_NV = 0x8FF5, + GL_UNSIGNED_INT64_VEC3_NV = 0x8FF6, + GL_UNSIGNED_INT64_VEC4_NV = 0x8FF7, + GL_FLOAT16_NV = 0x8FF8, + GL_FLOAT16_VEC2_NV = 0x8FF9, + GL_FLOAT16_VEC3_NV = 0x8FFA, + GL_FLOAT16_VEC4_NV = 0x8FFB; + + /** + * Accepted by the &lt;primitiveMode&gt; parameter of BeginTransformFeedback: + */ + public static final int GL_PATCHES = 0xE; + + private NVGpuShader5() {} + + public static void glUniform1i64NV(int location, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1i64NV(location, x, function_pointer); + } + static native void nglUniform1i64NV(int location, long x, long function_pointer); + + public static void glUniform2i64NV(int location, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2i64NV(location, x, y, function_pointer); + } + static native void nglUniform2i64NV(int location, long x, long y, long function_pointer); + + public static void glUniform3i64NV(int location, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3i64NV(location, x, y, z, function_pointer); + } + static native void nglUniform3i64NV(int location, long x, long y, long z, long function_pointer); + + public static void glUniform4i64NV(int location, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4i64NV(location, x, y, z, w, function_pointer); + } + static native void nglUniform4i64NV(int location, long x, long y, long z, long w, long function_pointer); + + public static void glUniform1NV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform1i64vNV(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform1i64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform2NV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform2i64vNV(location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform2i64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform3NV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform3i64vNV(location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform3i64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform4NV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform4i64vNV(location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform4i64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform1ui64NV(int location, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform1ui64NV(location, x, function_pointer); + } + static native void nglUniform1ui64NV(int location, long x, long function_pointer); + + public static void glUniform2ui64NV(int location, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform2ui64NV(location, x, y, function_pointer); + } + static native void nglUniform2ui64NV(int location, long x, long y, long function_pointer); + + public static void glUniform3ui64NV(int location, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform3ui64NV(location, x, y, z, function_pointer); + } + static native void nglUniform3ui64NV(int location, long x, long y, long z, long function_pointer); + + public static void glUniform4ui64NV(int location, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniform4ui64NV(location, x, y, z, w, function_pointer); + } + static native void nglUniform4ui64NV(int location, long x, long y, long z, long w, long function_pointer); + + public static void glUniform1uNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform1ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform1ui64vNV(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform1ui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform2uNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform2ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform2ui64vNV(location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform2ui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform3uNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform3ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform3ui64vNV(location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform3ui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glUniform4uNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniform4ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniform4ui64vNV(location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniform4ui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glGetUniformNV(int program, int location, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformi64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetUniformi64vNV(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformi64vNV(int program, int location, long params, long function_pointer); + + public static void glGetUniformuNV(int program, int location, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetUniformui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetUniformui64vNV(program, location, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetUniformui64vNV(int program, int location, long params, long function_pointer); + + public static void glProgramUniform1i64NV(int program, int location, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1i64NV(program, location, x, function_pointer); + } + static native void nglProgramUniform1i64NV(int program, int location, long x, long function_pointer); + + public static void glProgramUniform2i64NV(int program, int location, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2i64NV(program, location, x, y, function_pointer); + } + static native void nglProgramUniform2i64NV(int program, int location, long x, long y, long function_pointer); + + public static void glProgramUniform3i64NV(int program, int location, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3i64NV(program, location, x, y, z, function_pointer); + } + static native void nglProgramUniform3i64NV(int program, int location, long x, long y, long z, long function_pointer); + + public static void glProgramUniform4i64NV(int program, int location, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4i64NV(program, location, x, y, z, w, function_pointer); + } + static native void nglProgramUniform4i64NV(int program, int location, long x, long y, long z, long w, long function_pointer); + + public static void glProgramUniform1NV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1i64vNV(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1i64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2NV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2i64vNV(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2i64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3NV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3i64vNV(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3i64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4NV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4i64vNV(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4i64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform1ui64NV(int program, int location, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform1ui64NV(program, location, x, function_pointer); + } + static native void nglProgramUniform1ui64NV(int program, int location, long x, long function_pointer); + + public static void glProgramUniform2ui64NV(int program, int location, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform2ui64NV(program, location, x, y, function_pointer); + } + static native void nglProgramUniform2ui64NV(int program, int location, long x, long y, long function_pointer); + + public static void glProgramUniform3ui64NV(int program, int location, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform3ui64NV(program, location, x, y, z, function_pointer); + } + static native void nglProgramUniform3ui64NV(int program, int location, long x, long y, long z, long function_pointer); + + public static void glProgramUniform4ui64NV(int program, int location, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniform4ui64NV(program, location, x, y, z, w, function_pointer); + } + static native void nglProgramUniform4ui64NV(int program, int location, long x, long y, long z, long w, long function_pointer); + + public static void glProgramUniform1uNV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform1ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform1ui64vNV(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform1ui64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform2uNV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform2ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform2ui64vNV(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform2ui64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform3uNV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform3ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform3ui64vNV(program, location, value.remaining() / 3, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform3ui64vNV(int program, int location, int value_count, long value, long function_pointer); + + public static void glProgramUniform4uNV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniform4ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniform4ui64vNV(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniform4ui64vNV(int program, int location, int value_count, long value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVHalfFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVHalfFloat.java new file mode 100644 index 0000000..8054e4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVHalfFloat.java @@ -0,0 +1,224 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVHalfFloat { + + /** + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, TexCoordPointer, FogCoordPointerEXT, + * SecondaryColorPointerEXT, VertexWeightPointerEXT, VertexAttribPointerNV, + * DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, and GetTexImage: + */ + public static final int GL_HALF_FLOAT_NV = 0x140B; + + private NVHalfFloat() {} + + public static void glVertex2hNV(short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex2hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex2hNV(x, y, function_pointer); + } + static native void nglVertex2hNV(short x, short y, long function_pointer); + + public static void glVertex3hNV(short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex3hNV(x, y, z, function_pointer); + } + static native void nglVertex3hNV(short x, short y, short z, long function_pointer); + + public static void glVertex4hNV(short x, short y, short z, short w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertex4hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertex4hNV(x, y, z, w, function_pointer); + } + static native void nglVertex4hNV(short x, short y, short z, short w, long function_pointer); + + public static void glNormal3hNV(short nx, short ny, short nz) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormal3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormal3hNV(nx, ny, nz, function_pointer); + } + static native void nglNormal3hNV(short nx, short ny, short nz, long function_pointer); + + public static void glColor3hNV(short red, short green, short blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor3hNV(red, green, blue, function_pointer); + } + static native void nglColor3hNV(short red, short green, short blue, long function_pointer); + + public static void glColor4hNV(short red, short green, short blue, short alpha) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColor4hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglColor4hNV(red, green, blue, alpha, function_pointer); + } + static native void nglColor4hNV(short red, short green, short blue, short alpha, long function_pointer); + + public static void glTexCoord1hNV(short s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord1hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord1hNV(s, function_pointer); + } + static native void nglTexCoord1hNV(short s, long function_pointer); + + public static void glTexCoord2hNV(short s, short t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord2hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord2hNV(s, t, function_pointer); + } + static native void nglTexCoord2hNV(short s, short t, long function_pointer); + + public static void glTexCoord3hNV(short s, short t, short r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord3hNV(s, t, r, function_pointer); + } + static native void nglTexCoord3hNV(short s, short t, short r, long function_pointer); + + public static void glTexCoord4hNV(short s, short t, short r, short q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoord4hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoord4hNV(s, t, r, q, function_pointer); + } + static native void nglTexCoord4hNV(short s, short t, short r, short q, long function_pointer); + + public static void glMultiTexCoord1hNV(int target, short s) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord1hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord1hNV(target, s, function_pointer); + } + static native void nglMultiTexCoord1hNV(int target, short s, long function_pointer); + + public static void glMultiTexCoord2hNV(int target, short s, short t) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord2hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord2hNV(target, s, t, function_pointer); + } + static native void nglMultiTexCoord2hNV(int target, short s, short t, long function_pointer); + + public static void glMultiTexCoord3hNV(int target, short s, short t, short r) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord3hNV(target, s, t, r, function_pointer); + } + static native void nglMultiTexCoord3hNV(int target, short s, short t, short r, long function_pointer); + + public static void glMultiTexCoord4hNV(int target, short s, short t, short r, short q) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMultiTexCoord4hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMultiTexCoord4hNV(target, s, t, r, q, function_pointer); + } + static native void nglMultiTexCoord4hNV(int target, short s, short t, short r, short q, long function_pointer); + + public static void glFogCoordhNV(short fog) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordhNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoordhNV(fog, function_pointer); + } + static native void nglFogCoordhNV(short fog, long function_pointer); + + public static void glSecondaryColor3hNV(short red, short green, short blue) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColor3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColor3hNV(red, green, blue, function_pointer); + } + static native void nglSecondaryColor3hNV(short red, short green, short blue, long function_pointer); + + public static void glVertexWeighthNV(short weight) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexWeighthNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexWeighthNV(weight, function_pointer); + } + static native void nglVertexWeighthNV(short weight, long function_pointer); + + public static void glVertexAttrib1hNV(int index, short x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1hNV(index, x, function_pointer); + } + static native void nglVertexAttrib1hNV(int index, short x, long function_pointer); + + public static void glVertexAttrib2hNV(int index, short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2hNV(index, x, y, function_pointer); + } + static native void nglVertexAttrib2hNV(int index, short x, short y, long function_pointer); + + public static void glVertexAttrib3hNV(int index, short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3hNV(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3hNV(int index, short x, short y, short z, long function_pointer); + + public static void glVertexAttrib4hNV(int index, short x, short y, short z, short w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4hNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4hNV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4hNV(int index, short x, short y, short z, short w, long function_pointer); + + public static void glVertexAttribs1NV(int index, ShortBuffer attribs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs1hvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attribs); + nglVertexAttribs1hvNV(index, attribs.remaining(), MemoryUtil.getAddress(attribs), function_pointer); + } + static native void nglVertexAttribs1hvNV(int index, int attribs_n, long attribs, long function_pointer); + + public static void glVertexAttribs2NV(int index, ShortBuffer attribs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs2hvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attribs); + nglVertexAttribs2hvNV(index, attribs.remaining() >> 1, MemoryUtil.getAddress(attribs), function_pointer); + } + static native void nglVertexAttribs2hvNV(int index, int attribs_n, long attribs, long function_pointer); + + public static void glVertexAttribs3NV(int index, ShortBuffer attribs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs3hvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attribs); + nglVertexAttribs3hvNV(index, attribs.remaining() / 3, MemoryUtil.getAddress(attribs), function_pointer); + } + static native void nglVertexAttribs3hvNV(int index, int attribs_n, long attribs, long function_pointer); + + public static void glVertexAttribs4NV(int index, ShortBuffer attribs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs4hvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(attribs); + nglVertexAttribs4hvNV(index, attribs.remaining() >> 2, MemoryUtil.getAddress(attribs), function_pointer); + } + static native void nglVertexAttribs4hvNV(int index, int attribs_n, long attribs, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVLightMaxExponent.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVLightMaxExponent.java new file mode 100644 index 0000000..7545370 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVLightMaxExponent.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVLightMaxExponent { + + public static final int GL_MAX_SHININESS_NV = 0x8504, + GL_MAX_SPOT_EXPONENT_NV = 0x8505; + + private NVLightMaxExponent() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleCoverage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleCoverage.java new file mode 100644 index 0000000..df4fe73 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleCoverage.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVMultisampleCoverage { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + public static final int GL_COVERAGE_SAMPLES_NV = 0x80A9, + GL_COLOR_SAMPLES_NV = 0x8E20; + + private NVMultisampleCoverage() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleFilterHint.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleFilterHint.java new file mode 100644 index 0000000..116dae4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVMultisampleFilterHint.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVMultisampleFilterHint { + + /** + * Accepted by the &lt;target&gt; parameter of Hint and by the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_MULTISAMPLE_FILTER_HINT_NV = 0x8534; + + private NVMultisampleFilterHint() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVOcclusionQuery.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVOcclusionQuery.java new file mode 100644 index 0000000..280dfaa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVOcclusionQuery.java @@ -0,0 +1,117 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVOcclusionQuery { + + public static final int GL_OCCLUSION_TEST_HP = 0x8165, + GL_OCCLUSION_TEST_RESULT_HP = 0x8166, + GL_PIXEL_COUNTER_BITS_NV = 0x8864, + GL_CURRENT_OCCLUSION_QUERY_ID_NV = 0x8865, + GL_PIXEL_COUNT_NV = 0x8866, + GL_PIXEL_COUNT_AVAILABLE_NV = 0x8867; + + private NVOcclusionQuery() {} + + public static void glGenOcclusionQueriesNV(IntBuffer piIDs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenOcclusionQueriesNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piIDs); + nglGenOcclusionQueriesNV(piIDs.remaining(), MemoryUtil.getAddress(piIDs), function_pointer); + } + static native void nglGenOcclusionQueriesNV(int piIDs_n, long piIDs, long function_pointer); + + /** Overloads glGenOcclusionQueriesNV. */ + public static int glGenOcclusionQueriesNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenOcclusionQueriesNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer piIDs = APIUtil.getBufferInt(caps); + nglGenOcclusionQueriesNV(1, MemoryUtil.getAddress(piIDs), function_pointer); + return piIDs.get(0); + } + + public static void glDeleteOcclusionQueriesNV(IntBuffer piIDs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteOcclusionQueriesNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(piIDs); + nglDeleteOcclusionQueriesNV(piIDs.remaining(), MemoryUtil.getAddress(piIDs), function_pointer); + } + static native void nglDeleteOcclusionQueriesNV(int piIDs_n, long piIDs, long function_pointer); + + /** Overloads glDeleteOcclusionQueriesNV. */ + public static void glDeleteOcclusionQueriesNV(int piID) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteOcclusionQueriesNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteOcclusionQueriesNV(1, APIUtil.getInt(caps, piID), function_pointer); + } + + public static boolean glIsOcclusionQueryNV(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsOcclusionQueryNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsOcclusionQueryNV(id, function_pointer); + return __result; + } + static native boolean nglIsOcclusionQueryNV(int id, long function_pointer); + + public static void glBeginOcclusionQueryNV(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginOcclusionQueryNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginOcclusionQueryNV(id, function_pointer); + } + static native void nglBeginOcclusionQueryNV(int id, long function_pointer); + + public static void glEndOcclusionQueryNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndOcclusionQueryNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndOcclusionQueryNV(function_pointer); + } + static native void nglEndOcclusionQueryNV(long function_pointer); + + public static void glGetOcclusionQueryuNV(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetOcclusionQueryuivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetOcclusionQueryuivNV(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetOcclusionQueryuivNV(int id, int pname, long params, long function_pointer); + + /** Overloads glGetOcclusionQueryuivNV. */ + public static int glGetOcclusionQueryuiNV(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetOcclusionQueryuivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetOcclusionQueryuivNV(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetOcclusionQueryNV(int id, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetOcclusionQueryivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetOcclusionQueryivNV(id, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetOcclusionQueryivNV(int id, int pname, long params, long function_pointer); + + /** Overloads glGetOcclusionQueryivNV. */ + public static int glGetOcclusionQueryiNV(int id, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetOcclusionQueryivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetOcclusionQueryivNV(id, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPackedDepthStencil.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPackedDepthStencil.java new file mode 100644 index 0000000..faac63a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPackedDepthStencil.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPackedDepthStencil { + + public static final int GL_DEPTH_STENCIL_NV = 0x84F9, + GL_UNSIGNED_INT_24_8_NV = 0x84FA; + + private NVPackedDepthStencil() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVParameterBufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVParameterBufferObject.java new file mode 100644 index 0000000..0ec1ff9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVParameterBufferObject.java @@ -0,0 +1,54 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVParameterBufferObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV = 0x8DA0, + GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV = 0x8DA1; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + public static final int GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA2, + GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA3, + GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA4; + + private NVParameterBufferObject() {} + + public static void glProgramBufferParametersNV(int target, int buffer, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramBufferParametersfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramBufferParametersfvNV(target, buffer, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramBufferParametersfvNV(int target, int buffer, int index, int params_count, long params, long function_pointer); + + public static void glProgramBufferParametersINV(int target, int buffer, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramBufferParametersIivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramBufferParametersIivNV(target, buffer, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramBufferParametersIivNV(int target, int buffer, int index, int params_count, long params, long function_pointer); + + public static void glProgramBufferParametersIuNV(int target, int buffer, int index, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramBufferParametersIuivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramBufferParametersIuivNV(target, buffer, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramBufferParametersIuivNV(int target, int buffer, int index, int params_count, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPathRendering.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPathRendering.java new file mode 100644 index 0000000..6c5e98e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPathRendering.java @@ -0,0 +1,768 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPathRendering { + + /** + * Accepted in elements of the &lt;commands&gt; array parameter of + * PathCommandsNV and PathSubCommandsNV: + */ + public static final int GL_CLOSE_PATH_NV = 0x0, + GL_MOVE_TO_NV = 0x2, + GL_RELATIVE_MOVE_TO_NV = 0x3, + GL_LINE_TO_NV = 0x4, + GL_RELATIVE_LINE_TO_NV = 0x5, + GL_HORIZONTAL_LINE_TO_NV = 0x6, + GL_RELATIVE_HORIZONTAL_LINE_TO_NV = 0x7, + GL_VERTICAL_LINE_TO_NV = 0x8, + GL_RELATIVE_VERTICAL_LINE_TO_NV = 0x9, + GL_QUADRATIC_CURVE_TO_NV = 0xA, + GL_RELATIVE_QUADRATIC_CURVE_TO_NV = 0xB, + GL_CUBIC_CURVE_TO_NV = 0xC, + GL_RELATIVE_CUBIC_CURVE_TO_NV = 0xD, + GL_SMOOTH_QUADRATIC_CURVE_TO_NV = 0xE, + GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV = 0xF, + GL_SMOOTH_CUBIC_CURVE_TO_NV = 0x10, + GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV = 0x11, + GL_SMALL_CCW_ARC_TO_NV = 0x12, + GL_RELATIVE_SMALL_CCW_ARC_TO_NV = 0x13, + GL_SMALL_CW_ARC_TO_NV = 0x14, + GL_RELATIVE_SMALL_CW_ARC_TO_NV = 0x15, + GL_LARGE_CCW_ARC_TO_NV = 0x16, + GL_RELATIVE_LARGE_CCW_ARC_TO_NV = 0x17, + GL_LARGE_CW_ARC_TO_NV = 0x18, + GL_RELATIVE_LARGE_CW_ARC_TO_NV = 0x19, + GL_CIRCULAR_CCW_ARC_TO_NV = 0xF8, + GL_CIRCULAR_CW_ARC_TO_NV = 0xFA, + GL_CIRCULAR_TANGENT_ARC_TO_NV = 0xFC, + GL_ARC_TO_NV = 0xFE, + GL_RELATIVE_ARC_TO_NV = 0xFF; + + /** + * Accepted by the &lt;format&gt; parameter of PathStringNV: + */ + public static final int GL_PATH_FORMAT_SVG_NV = 0x9070, + GL_PATH_FORMAT_PS_NV = 0x9071; + + /** + * Accepted by the &lt;fontTarget&gt; parameter of PathGlyphsNV and + * PathGlyphRangeNV: + */ + public static final int GL_STANDARD_FONT_NAME_NV = 0x9072, + GL_SYSTEM_FONT_NAME_NV = 0x9073, + GL_FILE_NAME_NV = 0x9074; + + /** + * Accepted by the &lt;handleMissingGlyph&gt; parameter of PathGlyphsNV and + * PathGlyphRangeNV: + */ + public static final int GL_SKIP_MISSING_GLYPH_NV = 0x90A9, + GL_USE_MISSING_GLYPH_NV = 0x90AA; + + /** + * Accepted by the &lt;pname&gt; parameter of PathParameterfNV, + * PathParameterfvNV, GetPathParameterfvNV, PathParameteriNV, + * PathParameterivNV, and GetPathParameterivNV: + */ + public static final int GL_PATH_STROKE_WIDTH_NV = 0x9075, + GL_PATH_INITIAL_END_CAP_NV = 0x9077, + GL_PATH_TERMINAL_END_CAP_NV = 0x9078, + GL_PATH_JOIN_STYLE_NV = 0x9079, + GL_PATH_MITER_LIMIT_NV = 0x907A, + GL_PATH_INITIAL_DASH_CAP_NV = 0x907C, + GL_PATH_TERMINAL_DASH_CAP_NV = 0x907D, + GL_PATH_DASH_OFFSET_NV = 0x907E, + GL_PATH_CLIENT_LENGTH_NV = 0x907F, + GL_PATH_DASH_OFFSET_RESET_NV = 0x90B4, + GL_PATH_FILL_MODE_NV = 0x9080, + GL_PATH_FILL_MASK_NV = 0x9081, + GL_PATH_FILL_COVER_MODE_NV = 0x9082, + GL_PATH_STROKE_COVER_MODE_NV = 0x9083, + GL_PATH_STROKE_MASK_NV = 0x9084; + + /** + * Accepted by the &lt;pname&gt; parameter of PathParameterfNV and + * PathParameterfvNV: + */ + public static final int GL_PATH_END_CAPS_NV = 0x9076, + GL_PATH_DASH_CAPS_NV = 0x907B; + + /** + * Accepted by the &lt;fillMode&gt; parameter of StencilFillPathNV and + * StencilFillPathInstancedNV: + */ + public static final int GL_COUNT_UP_NV = 0x9088, + GL_COUNT_DOWN_NV = 0x9089; + + /** + * Accepted by the &lt;color&gt; parameter of PathColorGenNV, + * GetPathColorGenivNV, and GetPathColorGenfvNV: + */ + public static final int GL_PRIMARY_COLOR = 0x8577, + GL_PRIMARY_COLOR_NV = 0x852C, + GL_SECONDARY_COLOR_NV = 0x852D; + + /** + * Accepted by the &lt;genMode&gt; parameter of PathColorGenNV and + * PathTexGenNV: + */ + public static final int GL_PATH_OBJECT_BOUNDING_BOX_NV = 0x908A; + + /** + * Accepted by the &lt;coverMode&gt; parameter of CoverFillPathNV and + * CoverFillPathInstancedNV: + */ + public static final int GL_CONVEX_HULL_NV = 0x908B, + GL_BOUNDING_BOX_NV = 0x908D; + + /** + * Accepted by the &lt;transformType&gt; parameter of + * StencilFillPathInstancedNV, StencilStrokePathInstancedNV, + * CoverFillPathInstancedNV, and CoverStrokePathInstancedNV: + */ + public static final int GL_TRANSLATE_X_NV = 0x908E, + GL_TRANSLATE_Y_NV = 0x908F, + GL_TRANSLATE_2D_NV = 0x9090, + GL_TRANSLATE_3D_NV = 0x9091, + GL_AFFINE_2D_NV = 0x9092, + GL_AFFINE_3D_NV = 0x9094, + GL_TRANSPOSE_AFFINE_2D_NV = 0x9096, + GL_TRANSPOSE_AFFINE_3D_NV = 0x9098; + + /** + * Accepted by the &lt;type&gt; or &lt;pathNameType&gt; parameter of CallLists, + * StencilFillPathInstancedNV, StencilStrokePathInstancedNV, + * CoverFillPathInstancedNV, CoverStrokePathInstancedNV, + * GetPathMetricsNV, and GetPathSpacingNV: + */ + public static final int GL_UTF8_NV = 0x909A, + GL_UTF16_NV = 0x909B; + + /** + * Accepted by the &lt;coverMode&gt; parameter of CoverFillPathInstancedNV: + */ + public static final int GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV = 0x909C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPathParameterfvNV and + * GetPathParameterivNV: + */ + public static final int GL_PATH_COMMAND_COUNT_NV = 0x909D, + GL_PATH_COORD_COUNT_NV = 0x909E, + GL_PATH_DASH_ARRAY_COUNT_NV = 0x909F, + GL_PATH_COMPUTED_LENGTH_NV = 0x90A0, + GL_PATH_FILL_BOUNDING_BOX_NV = 0x90A1, + GL_PATH_STROKE_BOUNDING_BOX_NV = 0x90A2; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV + * when &lt;pname&gt; is one of PATH_END_CAPS_NV, PATH_INTIAL_END_CAP_NV, + * PATH_TERMINAL_END_CAP_NV, PATH_DASH_CAPS_NV, PATH_INITIAL_DASH_CAP_NV, + * and PATH_TERMINAL_DASH_CAP_NV: + */ + public static final int GL_SQUARE_NV = 0x90A3, + GL_ROUND_NV = 0x90A4, + GL_TRIANGULAR_NV = 0x90A5; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV + * when &lt;pname&gt; is PATH_JOIN_STYLE_NV: + */ + public static final int GL_BEVEL_NV = 0x90A6, + GL_MITER_REVERT_NV = 0x90A7, + GL_MITER_TRUNCATE_NV = 0x90A8; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV when + * &lt;pname&gt; is PATH_DASH_OFFSET_RESET_NV + */ + public static final int GL_MOVE_TO_RESETS_NV = 0x90B5, + GL_MOVE_TO_CONTINUES_NV = 0x90B6; + + /** + * Accepted by the &lt;fontStyle&gt; parameter of PathStringNV: + */ + public static final int GL_BOLD_BIT_NV = 0x1, + GL_ITALIC_BIT_NV = 0x2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + public static final int GL_PATH_ERROR_POSITION_NV = 0x90AB, + GL_PATH_FOG_GEN_MODE_NV = 0x90AC, + GL_PATH_STENCIL_FUNC_NV = 0x90B7, + GL_PATH_STENCIL_REF_NV = 0x90B8, + GL_PATH_STENCIL_VALUE_MASK_NV = 0x90B9, + GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV = 0x90BD, + GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV = 0x90BE, + GL_PATH_COVER_DEPTH_FUNC_NV = 0x90BF; + + /** + * Accepted as a bit within the &lt;metricQueryMask&gt; parameter of + * GetPathMetricRangeNV or GetPathMetricsNV: + */ + public static final int GL_GLYPH_WIDTH_BIT_NV = 0x1, + GL_GLYPH_HEIGHT_BIT_NV = 0x2, + GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV = 0x4, + GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV = 0x8, + GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV = 0x10, + GL_GLYPH_VERTICAL_BEARING_X_BIT_NV = 0x20, + GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV = 0x40, + GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV = 0x80, + GL_GLYPH_HAS_KERNING_NV = 0x100, + GL_FONT_X_MIN_BOUNDS_NV = 0x10000, + GL_FONT_Y_MIN_BOUNDS_NV = 0x20000, + GL_FONT_X_MAX_BOUNDS_NV = 0x40000, + GL_FONT_Y_MAX_BOUNDS_NV = 0x80000, + GL_FONT_UNITS_PER_EM_NV = 0x100000, + GL_FONT_ASCENDER_NV = 0x200000, + GL_FONT_DESCENDER_NV = 0x400000, + GL_FONT_HEIGHT_NV = 0x800000, + GL_FONT_MAX_ADVANCE_WIDTH_NV = 0x1000000, + GL_FONT_MAX_ADVANCE_HEIGHT_NV = 0x2000000, + GL_FONT_UNDERLINE_POSITION_NV = 0x4000000, + GL_FONT_UNDERLINE_THICKNESS_NV = 0x8000000, + GL_FONT_HAS_KERNING_NV = 0x10000000; + + /** + * Accepted by the &lt;pathListMode&gt; parameter of GetPathSpacingNV: + */ + public static final int GL_ACCUM_ADJACENT_PAIRS_NV = 0x90AD, + GL_ADJACENT_PAIRS_NV = 0x90AE, + GL_FIRST_TO_REST_NV = 0x90AF; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPathColorGenivNV, + * GetPathColorGenfvNV, GetPathTexGenivNV and GetPathTexGenfvNV: + */ + public static final int GL_PATH_GEN_MODE_NV = 0x90B0, + GL_PATH_GEN_COEFF_NV = 0x90B1, + GL_PATH_GEN_COLOR_FORMAT_NV = 0x90B2, + GL_PATH_GEN_COMPONENTS_NV = 0x90B3; + + private NVPathRendering() {} + + public static void glPathCommandsNV(int path, ByteBuffer commands, int coordType, ByteBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathCommandsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(commands); + BufferChecks.checkDirect(coords); + nglPathCommandsNV(path, commands.remaining(), MemoryUtil.getAddress(commands), coords.remaining(), coordType, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglPathCommandsNV(int path, int commands_numCommands, long commands, int coords_numCoords, int coordType, long coords, long function_pointer); + + public static void glPathCoordsNV(int path, int coordType, ByteBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathCoordsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(coords); + nglPathCoordsNV(path, coords.remaining(), coordType, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglPathCoordsNV(int path, int coords_numCoords, int coordType, long coords, long function_pointer); + + public static void glPathSubCommandsNV(int path, int commandStart, int commandsToDelete, ByteBuffer commands, int coordType, ByteBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathSubCommandsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(commands); + BufferChecks.checkDirect(coords); + nglPathSubCommandsNV(path, commandStart, commandsToDelete, commands.remaining(), MemoryUtil.getAddress(commands), coords.remaining(), coordType, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglPathSubCommandsNV(int path, int commandStart, int commandsToDelete, int commands_numCommands, long commands, int coords_numCoords, int coordType, long coords, long function_pointer); + + public static void glPathSubCoordsNV(int path, int coordStart, int coordType, ByteBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathSubCoordsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(coords); + nglPathSubCoordsNV(path, coordStart, coords.remaining(), coordType, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglPathSubCoordsNV(int path, int coordStart, int coords_numCoords, int coordType, long coords, long function_pointer); + + public static void glPathStringNV(int path, int format, ByteBuffer pathString) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathStringNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pathString); + nglPathStringNV(path, format, pathString.remaining(), MemoryUtil.getAddress(pathString), function_pointer); + } + static native void nglPathStringNV(int path, int format, int pathString_length, long pathString, long function_pointer); + + public static void glPathGlyphsNV(int firstPathName, int fontTarget, ByteBuffer fontName, int fontStyle, int type, ByteBuffer charcodes, int handleMissingGlyphs, int pathParameterTemplate, float emScale) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathGlyphsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(fontName); + BufferChecks.checkNullTerminated(fontName); + BufferChecks.checkDirect(charcodes); + nglPathGlyphsNV(firstPathName, fontTarget, MemoryUtil.getAddress(fontName), fontStyle, charcodes.remaining() / GLChecks.calculateBytesPerCharCode(type), type, MemoryUtil.getAddress(charcodes), handleMissingGlyphs, pathParameterTemplate, emScale, function_pointer); + } + static native void nglPathGlyphsNV(int firstPathName, int fontTarget, long fontName, int fontStyle, int charcodes_numGlyphs, int type, long charcodes, int handleMissingGlyphs, int pathParameterTemplate, float emScale, long function_pointer); + + public static void glPathGlyphRangeNV(int firstPathName, int fontTarget, ByteBuffer fontName, int fontStyle, int firstGlyph, int numGlyphs, int handleMissingGlyphs, int pathParameterTemplate, float emScale) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathGlyphRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(fontName); + BufferChecks.checkNullTerminated(fontName); + nglPathGlyphRangeNV(firstPathName, fontTarget, MemoryUtil.getAddress(fontName), fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale, function_pointer); + } + static native void nglPathGlyphRangeNV(int firstPathName, int fontTarget, long fontName, int fontStyle, int firstGlyph, int numGlyphs, int handleMissingGlyphs, int pathParameterTemplate, float emScale, long function_pointer); + + public static void glWeightPathsNV(int resultPath, IntBuffer paths, FloatBuffer weights) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glWeightPathsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + BufferChecks.checkBuffer(weights, paths.remaining()); + nglWeightPathsNV(resultPath, paths.remaining(), MemoryUtil.getAddress(paths), MemoryUtil.getAddress(weights), function_pointer); + } + static native void nglWeightPathsNV(int resultPath, int paths_numPaths, long paths, long weights, long function_pointer); + + public static void glCopyPathNV(int resultPath, int srcPath) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCopyPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCopyPathNV(resultPath, srcPath, function_pointer); + } + static native void nglCopyPathNV(int resultPath, int srcPath, long function_pointer); + + public static void glInterpolatePathsNV(int resultPath, int pathA, int pathB, float weight) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glInterpolatePathsNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglInterpolatePathsNV(resultPath, pathA, pathB, weight, function_pointer); + } + static native void nglInterpolatePathsNV(int resultPath, int pathA, int pathB, float weight, long function_pointer); + + public static void glTransformPathNV(int resultPath, int srcPath, int transformType, FloatBuffer transformValues) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + if (transformValues != null) + BufferChecks.checkBuffer(transformValues, GLChecks.calculateTransformPathValues(transformType)); + nglTransformPathNV(resultPath, srcPath, transformType, MemoryUtil.getAddressSafe(transformValues), function_pointer); + } + static native void nglTransformPathNV(int resultPath, int srcPath, int transformType, long transformValues, long function_pointer); + + public static void glPathParameterNV(int path, int pname, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglPathParameterivNV(path, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglPathParameterivNV(int path, int pname, long value, long function_pointer); + + public static void glPathParameteriNV(int path, int pname, int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathParameteriNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathParameteriNV(path, pname, value, function_pointer); + } + static native void nglPathParameteriNV(int path, int pname, int value, long function_pointer); + + public static void glPathParameterfNV(int path, int pname, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglPathParameterfvNV(path, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglPathParameterfvNV(int path, int pname, long value, long function_pointer); + + public static void glPathParameterfNV(int path, int pname, float value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathParameterfNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathParameterfNV(path, pname, value, function_pointer); + } + static native void nglPathParameterfNV(int path, int pname, float value, long function_pointer); + + public static void glPathDashArrayNV(int path, FloatBuffer dashArray) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathDashArrayNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(dashArray); + nglPathDashArrayNV(path, dashArray.remaining(), MemoryUtil.getAddress(dashArray), function_pointer); + } + static native void nglPathDashArrayNV(int path, int dashArray_dashCount, long dashArray, long function_pointer); + + public static int glGenPathsNV(int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenPathsNV; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGenPathsNV(range, function_pointer); + return __result; + } + static native int nglGenPathsNV(int range, long function_pointer); + + public static void glDeletePathsNV(int path, int range) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeletePathsNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeletePathsNV(path, range, function_pointer); + } + static native void nglDeletePathsNV(int path, int range, long function_pointer); + + public static boolean glIsPathNV(int path) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsPathNV(path, function_pointer); + return __result; + } + static native boolean nglIsPathNV(int path, long function_pointer); + + public static void glPathStencilFuncNV(int func, int ref, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathStencilFuncNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathStencilFuncNV(func, ref, mask, function_pointer); + } + static native void nglPathStencilFuncNV(int func, int ref, int mask, long function_pointer); + + public static void glPathStencilDepthOffsetNV(float factor, int units) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathStencilDepthOffsetNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathStencilDepthOffsetNV(factor, units, function_pointer); + } + static native void nglPathStencilDepthOffsetNV(float factor, int units, long function_pointer); + + public static void glStencilFillPathNV(int path, int fillMode, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilFillPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilFillPathNV(path, fillMode, mask, function_pointer); + } + static native void nglStencilFillPathNV(int path, int fillMode, int mask, long function_pointer); + + public static void glStencilStrokePathNV(int path, int reference, int mask) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilStrokePathNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglStencilStrokePathNV(path, reference, mask, function_pointer); + } + static native void nglStencilStrokePathNV(int path, int reference, int mask, long function_pointer); + + public static void glStencilFillPathInstancedNV(int pathNameType, ByteBuffer paths, int pathBase, int fillMode, int mask, int transformType, FloatBuffer transformValues) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilFillPathInstancedNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + if (transformValues != null) + BufferChecks.checkBuffer(transformValues, GLChecks.calculateTransformPathValues(transformType)); + nglStencilFillPathInstancedNV(paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType), pathNameType, MemoryUtil.getAddress(paths), pathBase, fillMode, mask, transformType, MemoryUtil.getAddressSafe(transformValues), function_pointer); + } + static native void nglStencilFillPathInstancedNV(int paths_numPaths, int pathNameType, long paths, int pathBase, int fillMode, int mask, int transformType, long transformValues, long function_pointer); + + public static void glStencilStrokePathInstancedNV(int pathNameType, ByteBuffer paths, int pathBase, int reference, int mask, int transformType, FloatBuffer transformValues) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glStencilStrokePathInstancedNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + if (transformValues != null) + BufferChecks.checkBuffer(transformValues, GLChecks.calculateTransformPathValues(transformType)); + nglStencilStrokePathInstancedNV(paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType), pathNameType, MemoryUtil.getAddress(paths), pathBase, reference, mask, transformType, MemoryUtil.getAddressSafe(transformValues), function_pointer); + } + static native void nglStencilStrokePathInstancedNV(int paths_numPaths, int pathNameType, long paths, int pathBase, int reference, int mask, int transformType, long transformValues, long function_pointer); + + public static void glPathCoverDepthFuncNV(int zfunc) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathCoverDepthFuncNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathCoverDepthFuncNV(zfunc, function_pointer); + } + static native void nglPathCoverDepthFuncNV(int zfunc, long function_pointer); + + public static void glPathColorGenNV(int color, int genMode, int colorFormat, FloatBuffer coeffs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathColorGenNV; + BufferChecks.checkFunctionAddress(function_pointer); + if (coeffs != null) + BufferChecks.checkBuffer(coeffs, GLChecks.calculatePathColorGenCoeffsCount(genMode, colorFormat)); + nglPathColorGenNV(color, genMode, colorFormat, MemoryUtil.getAddressSafe(coeffs), function_pointer); + } + static native void nglPathColorGenNV(int color, int genMode, int colorFormat, long coeffs, long function_pointer); + + public static void glPathTexGenNV(int texCoordSet, int genMode, FloatBuffer coeffs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathTexGenNV; + BufferChecks.checkFunctionAddress(function_pointer); + if (coeffs != null) + BufferChecks.checkDirect(coeffs); + nglPathTexGenNV(texCoordSet, genMode, GLChecks.calculatePathTextGenCoeffsPerComponent(coeffs, genMode), MemoryUtil.getAddressSafe(coeffs), function_pointer); + } + static native void nglPathTexGenNV(int texCoordSet, int genMode, int coeffs_components, long coeffs, long function_pointer); + + public static void glPathFogGenNV(int genMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPathFogGenNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPathFogGenNV(genMode, function_pointer); + } + static native void nglPathFogGenNV(int genMode, long function_pointer); + + public static void glCoverFillPathNV(int path, int coverMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCoverFillPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCoverFillPathNV(path, coverMode, function_pointer); + } + static native void nglCoverFillPathNV(int path, int coverMode, long function_pointer); + + public static void glCoverStrokePathNV(int name, int coverMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCoverStrokePathNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCoverStrokePathNV(name, coverMode, function_pointer); + } + static native void nglCoverStrokePathNV(int name, int coverMode, long function_pointer); + + public static void glCoverFillPathInstancedNV(int pathNameType, ByteBuffer paths, int pathBase, int coverMode, int transformType, FloatBuffer transformValues) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCoverFillPathInstancedNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + if (transformValues != null) + BufferChecks.checkBuffer(transformValues, GLChecks.calculateTransformPathValues(transformType)); + nglCoverFillPathInstancedNV(paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType), pathNameType, MemoryUtil.getAddress(paths), pathBase, coverMode, transformType, MemoryUtil.getAddressSafe(transformValues), function_pointer); + } + static native void nglCoverFillPathInstancedNV(int paths_numPaths, int pathNameType, long paths, int pathBase, int coverMode, int transformType, long transformValues, long function_pointer); + + public static void glCoverStrokePathInstancedNV(int pathNameType, ByteBuffer paths, int pathBase, int coverMode, int transformType, FloatBuffer transformValues) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCoverStrokePathInstancedNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + if (transformValues != null) + BufferChecks.checkBuffer(transformValues, GLChecks.calculateTransformPathValues(transformType)); + nglCoverStrokePathInstancedNV(paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType), pathNameType, MemoryUtil.getAddress(paths), pathBase, coverMode, transformType, MemoryUtil.getAddressSafe(transformValues), function_pointer); + } + static native void nglCoverStrokePathInstancedNV(int paths_numPaths, int pathNameType, long paths, int pathBase, int coverMode, int transformType, long transformValues, long function_pointer); + + public static void glGetPathParameterNV(int name, int param, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglGetPathParameterivNV(name, param, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathParameterivNV(int name, int param, long value, long function_pointer); + + /** Overloads glGetPathParameterivNV. */ + public static int glGetPathParameteriNV(int name, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer value = APIUtil.getBufferInt(caps); + nglGetPathParameterivNV(name, param, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static void glGetPathParameterfvNV(int name, int param, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 4); + nglGetPathParameterfvNV(name, param, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathParameterfvNV(int name, int param, long value, long function_pointer); + + /** Overloads glGetPathParameterfvNV. */ + public static float glGetPathParameterfNV(int name, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer value = APIUtil.getBufferFloat(caps); + nglGetPathParameterfvNV(name, param, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static void glGetPathCommandsNV(int name, ByteBuffer commands) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathCommandsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(commands); + nglGetPathCommandsNV(name, MemoryUtil.getAddress(commands), function_pointer); + } + static native void nglGetPathCommandsNV(int name, long commands, long function_pointer); + + public static void glGetPathCoordsNV(int name, FloatBuffer coords) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathCoordsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(coords); + nglGetPathCoordsNV(name, MemoryUtil.getAddress(coords), function_pointer); + } + static native void nglGetPathCoordsNV(int name, long coords, long function_pointer); + + public static void glGetPathDashArrayNV(int name, FloatBuffer dashArray) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathDashArrayNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(dashArray); + nglGetPathDashArrayNV(name, MemoryUtil.getAddress(dashArray), function_pointer); + } + static native void nglGetPathDashArrayNV(int name, long dashArray, long function_pointer); + + public static void glGetPathMetricsNV(int metricQueryMask, int pathNameType, ByteBuffer paths, int pathBase, int stride, FloatBuffer metrics) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathMetricsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paths); + BufferChecks.checkBuffer(metrics, GLChecks.calculateMetricsSize(metricQueryMask, stride)); + nglGetPathMetricsNV(metricQueryMask, paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType), pathNameType, MemoryUtil.getAddress(paths), pathBase, stride, MemoryUtil.getAddress(metrics), function_pointer); + } + static native void nglGetPathMetricsNV(int metricQueryMask, int paths_numPaths, int pathNameType, long paths, int pathBase, int stride, long metrics, long function_pointer); + + public static void glGetPathMetricRangeNV(int metricQueryMask, int fistPathName, int numPaths, int stride, FloatBuffer metrics) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathMetricRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(metrics, GLChecks.calculateMetricsSize(metricQueryMask, stride)); + nglGetPathMetricRangeNV(metricQueryMask, fistPathName, numPaths, stride, MemoryUtil.getAddress(metrics), function_pointer); + } + static native void nglGetPathMetricRangeNV(int metricQueryMask, int fistPathName, int numPaths, int stride, long metrics, long function_pointer); + + public static void glGetPathSpacingNV(int pathListMode, int pathNameType, ByteBuffer paths, int pathBase, float advanceScale, float kerningScale, int transformType, FloatBuffer returnedSpacing) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathSpacingNV; + BufferChecks.checkFunctionAddress(function_pointer); + int numPaths = paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType); + BufferChecks.checkDirect(paths); + BufferChecks.checkBuffer(returnedSpacing, numPaths - 1); + nglGetPathSpacingNV(pathListMode, numPaths, pathNameType, MemoryUtil.getAddress(paths), pathBase, advanceScale, kerningScale, transformType, MemoryUtil.getAddress(returnedSpacing), function_pointer); + } + static native void nglGetPathSpacingNV(int pathListMode, int paths_numPaths, int pathNameType, long paths, int pathBase, float advanceScale, float kerningScale, int transformType, long returnedSpacing, long function_pointer); + + public static void glGetPathColorGenNV(int color, int pname, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathColorGenivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 16); + nglGetPathColorGenivNV(color, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathColorGenivNV(int color, int pname, long value, long function_pointer); + + /** Overloads glGetPathColorGenivNV. */ + public static int glGetPathColorGeniNV(int color, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathColorGenivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer value = APIUtil.getBufferInt(caps); + nglGetPathColorGenivNV(color, pname, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static void glGetPathColorGenNV(int color, int pname, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathColorGenfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 16); + nglGetPathColorGenfvNV(color, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathColorGenfvNV(int color, int pname, long value, long function_pointer); + + /** Overloads glGetPathColorGenfvNV. */ + public static float glGetPathColorGenfNV(int color, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathColorGenfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer value = APIUtil.getBufferFloat(caps); + nglGetPathColorGenfvNV(color, pname, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static void glGetPathTexGenNV(int texCoordSet, int pname, IntBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathTexGenivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 16); + nglGetPathTexGenivNV(texCoordSet, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathTexGenivNV(int texCoordSet, int pname, long value, long function_pointer); + + /** Overloads glGetPathTexGenivNV. */ + public static int glGetPathTexGeniNV(int texCoordSet, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathTexGenivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer value = APIUtil.getBufferInt(caps); + nglGetPathTexGenivNV(texCoordSet, pname, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static void glGetPathTexGenNV(int texCoordSet, int pname, FloatBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathTexGenfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(value, 16); + nglGetPathTexGenfvNV(texCoordSet, pname, MemoryUtil.getAddress(value), function_pointer); + } + static native void nglGetPathTexGenfvNV(int texCoordSet, int pname, long value, long function_pointer); + + /** Overloads glGetPathTexGenfvNV. */ + public static float glGetPathTexGenfNV(int texCoordSet, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathTexGenfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer value = APIUtil.getBufferFloat(caps); + nglGetPathTexGenfvNV(texCoordSet, pname, MemoryUtil.getAddress(value), function_pointer); + return value.get(0); + } + + public static boolean glIsPointInFillPathNV(int path, int mask, float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsPointInFillPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsPointInFillPathNV(path, mask, x, y, function_pointer); + return __result; + } + static native boolean nglIsPointInFillPathNV(int path, int mask, float x, float y, long function_pointer); + + public static boolean glIsPointInStrokePathNV(int path, float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsPointInStrokePathNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsPointInStrokePathNV(path, x, y, function_pointer); + return __result; + } + static native boolean nglIsPointInStrokePathNV(int path, float x, float y, long function_pointer); + + public static float glGetPathLengthNV(int path, int startSegment, int numSegments) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetPathLengthNV; + BufferChecks.checkFunctionAddress(function_pointer); + float __result = nglGetPathLengthNV(path, startSegment, numSegments, function_pointer); + return __result; + } + static native float nglGetPathLengthNV(int path, int startSegment, int numSegments, long function_pointer); + + public static boolean glPointAlongPathNV(int path, int startSegment, int numSegments, float distance, FloatBuffer x, FloatBuffer y, FloatBuffer tangentX, FloatBuffer tangentY) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointAlongPathNV; + BufferChecks.checkFunctionAddress(function_pointer); + if (x != null) + BufferChecks.checkBuffer(x, 1); + if (y != null) + BufferChecks.checkBuffer(y, 1); + if (tangentX != null) + BufferChecks.checkBuffer(tangentX, 1); + if (tangentY != null) + BufferChecks.checkBuffer(tangentY, 1); + boolean __result = nglPointAlongPathNV(path, startSegment, numSegments, distance, MemoryUtil.getAddressSafe(x), MemoryUtil.getAddressSafe(y), MemoryUtil.getAddressSafe(tangentX), MemoryUtil.getAddressSafe(tangentY), function_pointer); + return __result; + } + static native boolean nglPointAlongPathNV(int path, int startSegment, int numSegments, float distance, long x, long y, long tangentX, long tangentY, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPixelDataRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPixelDataRange.java new file mode 100644 index 0000000..e48ab94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPixelDataRange.java @@ -0,0 +1,77 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPixelDataRange { + + /** + * Accepted by the &lt;target&gt; parameter of PixelDataRangeNV and + * FlushPixelDataRangeNV, and by the &lt;cap&gt; parameter of + * EnableClientState, DisableClientState, and IsEnabled: + */ + public static final int GL_WRITE_PIXEL_DATA_RANGE_NV = 0x8878, + GL_READ_PIXEL_DATA_RANGE_NV = 0x8879; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = 0x887A, + GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = 0x887B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = 0x887C, + GL_READ_PIXEL_DATA_RANGE_POINTER_NV = 0x887D; + + private NVPixelDataRange() {} + + public static void glPixelDataRangeNV(int target, ByteBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglPixelDataRangeNV(target, data.remaining(), MemoryUtil.getAddress(data), function_pointer); + } + public static void glPixelDataRangeNV(int target, DoubleBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglPixelDataRangeNV(target, (data.remaining() << 3), MemoryUtil.getAddress(data), function_pointer); + } + public static void glPixelDataRangeNV(int target, FloatBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglPixelDataRangeNV(target, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glPixelDataRangeNV(int target, IntBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglPixelDataRangeNV(target, (data.remaining() << 2), MemoryUtil.getAddress(data), function_pointer); + } + public static void glPixelDataRangeNV(int target, ShortBuffer data) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(data); + nglPixelDataRangeNV(target, (data.remaining() << 1), MemoryUtil.getAddress(data), function_pointer); + } + static native void nglPixelDataRangeNV(int target, int data_length, long data, long function_pointer); + + public static void glFlushPixelDataRangeNV(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushPixelDataRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlushPixelDataRangeNV(target, function_pointer); + } + static native void nglFlushPixelDataRangeNV(int target, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPointSprite.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPointSprite.java new file mode 100644 index 0000000..8602d80 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPointSprite.java @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPointSprite { + + public static final int GL_POINT_SPRITE_NV = 0x8861, + GL_COORD_REPLACE_NV = 0x8862, + GL_POINT_SPRITE_R_MODE_NV = 0x8863; + + private NVPointSprite() {} + + public static void glPointParameteriNV(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameteriNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPointParameteriNV(pname, param, function_pointer); + } + static native void nglPointParameteriNV(int pname, int param, long function_pointer); + + public static void glPointParameterNV(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPointParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglPointParameterivNV(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglPointParameterivNV(int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPresentVideo.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPresentVideo.java new file mode 100644 index 0000000..8f5a171 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPresentVideo.java @@ -0,0 +1,128 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPresentVideo { + + /** + * Accepted by the &lt;type&gt; parameter of PresentFrameKeyedNV and + * PresentFrameDualFillNV: + */ + public static final int GL_FRAME_NV = 0x8E26, + FIELDS_NV = 0x8E27; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVideoivNV, GetVideouivNV, + * GetVideoi64vNV, GetVideoui64vNV: + */ + public static final int GL_CURRENT_TIME_NV = 0x8E28, + GL_NUM_FILL_STREAMS_NV = 0x8E29; + + /** + * Accepted by the &lt;target&gt; parameter of GetQueryiv: + */ + public static final int GL_PRESENT_TIME_NV = 0x8E2A, + GL_PRESENT_DURATION_NV = 0x8E2B; + + /** + * Accepted by the &lt;attribute&gt; parameter of NVPresentVideoUtil.glQueryContextNV: + */ + public static final int GL_NUM_VIDEO_SLOTS_NV = 0x20F0; + + private NVPresentVideo() {} + + public static void glPresentFrameKeyedNV(int video_slot, long minPresentTime, int beginPresentTimeId, int presentDurationId, int type, int target0, int fill0, int key0, int target1, int fill1, int key1) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPresentFrameKeyedNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1, function_pointer); + } + static native void nglPresentFrameKeyedNV(int video_slot, long minPresentTime, int beginPresentTimeId, int presentDurationId, int type, int target0, int fill0, int key0, int target1, int fill1, int key1, long function_pointer); + + public static void glPresentFrameDualFillNV(int video_slot, long minPresentTime, int beginPresentTimeId, int presentDurationId, int type, int target0, int fill0, int target1, int fill1, int target2, int fill2, int target3, int fill3) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPresentFrameDualFillNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3, function_pointer); + } + static native void nglPresentFrameDualFillNV(int video_slot, long minPresentTime, int beginPresentTimeId, int presentDurationId, int type, int target0, int fill0, int target1, int fill1, int target2, int fill2, int target3, int fill3, long function_pointer); + + public static void glGetVideoNV(int video_slot, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoivNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoivNV(int video_slot, int pname, long params, long function_pointer); + + /** Overloads glGetVideoivNV. */ + public static int glGetVideoiNV(int video_slot, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetVideoivNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideouNV(int video_slot, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideouivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideouivNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideouivNV(int video_slot, int pname, long params, long function_pointer); + + /** Overloads glGetVideouivNV. */ + public static int glGetVideouiNV(int video_slot, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideouivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetVideouivNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideoNV(int video_slot, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoi64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoi64vNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoi64vNV(int video_slot, int pname, long params, long function_pointer); + + /** Overloads glGetVideoi64vNV. */ + public static long glGetVideoi64NV(int video_slot, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoi64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetVideoi64vNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideouNV(int video_slot, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoui64vNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoui64vNV(int video_slot, int pname, long params, long function_pointer); + + /** Overloads glGetVideoui64vNV. */ + public static long glGetVideoui64NV(int video_slot, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetVideoui64vNV(video_slot, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPrimitiveRestart.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPrimitiveRestart.java new file mode 100644 index 0000000..9dd77e3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVPrimitiveRestart.java @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPrimitiveRestart { + + /** + * Accepted by the &lt;array&gt; parameter of EnableClientState and + * DisableClientState, by the &lt;cap&gt; parameter of IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_PRIMITIVE_RESTART_NV = 0x8558; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PRIMITIVE_RESTART_INDEX_NV = 0x8559; + + private NVPrimitiveRestart() {} + + public static void glPrimitiveRestartNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPrimitiveRestartNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPrimitiveRestartNV(function_pointer); + } + static native void nglPrimitiveRestartNV(long function_pointer); + + public static void glPrimitiveRestartIndexNV(int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPrimitiveRestartIndexNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPrimitiveRestartIndexNV(index, function_pointer); + } + static native void nglPrimitiveRestartIndexNV(int index, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVProgram.java new file mode 100644 index 0000000..dfaf574 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVProgram.java @@ -0,0 +1,181 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public class NVProgram { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivNV: + */ + public static final int GL_PROGRAM_TARGET_NV = 0x8646, + GL_PROGRAM_LENGTH_NV = 0x8627, + GL_PROGRAM_RESIDENT_NV = 0x8647; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramStringNV: + */ + public static final int GL_PROGRAM_STRING_NV = 0x8628; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_PROGRAM_ERROR_POSITION_NV = 0x864B; + + /** + * Accepted by the &lt;name&gt; parameter of GetString: + */ + public static final int GL_PROGRAM_ERROR_STRING_NV = 0x8874; + + + public static void glLoadProgramNV(int target, int programID, ByteBuffer string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadProgramNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(string); + nglLoadProgramNV(target, programID, string.remaining(), MemoryUtil.getAddress(string), function_pointer); + } + static native void nglLoadProgramNV(int target, int programID, int string_length, long string, long function_pointer); + + /** Overloads glLoadProgramNV. */ + public static void glLoadProgramNV(int target, int programID, CharSequence string) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glLoadProgramNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglLoadProgramNV(target, programID, string.length(), APIUtil.getBuffer(caps, string), function_pointer); + } + + public static void glBindProgramNV(int target, int programID) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindProgramNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindProgramNV(target, programID, function_pointer); + } + static native void nglBindProgramNV(int target, int programID, long function_pointer); + + public static void glDeleteProgramsNV(IntBuffer programs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programs); + nglDeleteProgramsNV(programs.remaining(), MemoryUtil.getAddress(programs), function_pointer); + } + static native void nglDeleteProgramsNV(int programs_n, long programs, long function_pointer); + + /** Overloads glDeleteProgramsNV. */ + public static void glDeleteProgramsNV(int program) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteProgramsNV(1, APIUtil.getInt(caps, program), function_pointer); + } + + public static void glGenProgramsNV(IntBuffer programs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programs); + nglGenProgramsNV(programs.remaining(), MemoryUtil.getAddress(programs), function_pointer); + } + static native void nglGenProgramsNV(int programs_n, long programs, long function_pointer); + + /** Overloads glGenProgramsNV. */ + public static int glGenProgramsNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer programs = APIUtil.getBufferInt(caps); + nglGenProgramsNV(1, MemoryUtil.getAddress(programs), function_pointer); + return programs.get(0); + } + + public static void glGetProgramNV(int programID, int parameterName, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglGetProgramivNV(programID, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramivNV(int programID, int parameterName, long params, long function_pointer); + + /** + * Overloads glGetProgramivNV. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetProgramiNV} instead. + */ + @Deprecated + public static int glGetProgramNV(int programID, int parameterName) { + return NVProgram.glGetProgramiNV(programID, parameterName); + } + + /** Overloads glGetProgramivNV. */ + public static int glGetProgramiNV(int programID, int parameterName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetProgramivNV(programID, parameterName, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetProgramStringNV(int programID, int parameterName, ByteBuffer paramString) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStringNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(paramString); + nglGetProgramStringNV(programID, parameterName, MemoryUtil.getAddress(paramString), function_pointer); + } + static native void nglGetProgramStringNV(int programID, int parameterName, long paramString, long function_pointer); + + /** Overloads glGetProgramStringNV. */ + public static String glGetProgramStringNV(int programID, int parameterName) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramStringNV; + BufferChecks.checkFunctionAddress(function_pointer); + int programLength = glGetProgramiNV(programID, GL_PROGRAM_LENGTH_NV); + ByteBuffer paramString = APIUtil.getBufferByte(caps, programLength); + nglGetProgramStringNV(programID, parameterName, MemoryUtil.getAddress(paramString), function_pointer); + paramString.limit(programLength); + return APIUtil.getString(caps, paramString); + } + + public static boolean glIsProgramNV(int programID) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsProgramNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsProgramNV(programID, function_pointer); + return __result; + } + static native boolean nglIsProgramNV(int programID, long function_pointer); + + public static boolean glAreProgramsResidentNV(IntBuffer programIDs, ByteBuffer programResidences) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAreProgramsResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programIDs); + BufferChecks.checkBuffer(programResidences, programIDs.remaining()); + boolean __result = nglAreProgramsResidentNV(programIDs.remaining(), MemoryUtil.getAddress(programIDs), MemoryUtil.getAddress(programResidences), function_pointer); + return __result; + } + static native boolean nglAreProgramsResidentNV(int programIDs_n, long programIDs, long programResidences, long function_pointer); + + public static void glRequestResidentProgramsNV(IntBuffer programIDs) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRequestResidentProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(programIDs); + nglRequestResidentProgramsNV(programIDs.remaining(), MemoryUtil.getAddress(programIDs), function_pointer); + } + static native void nglRequestResidentProgramsNV(int programIDs_n, long programIDs, long function_pointer); + + /** Overloads glRequestResidentProgramsNV. */ + public static void glRequestResidentProgramsNV(int programID) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glRequestResidentProgramsNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglRequestResidentProgramsNV(1, APIUtil.getInt(caps, programID), function_pointer); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners.java new file mode 100644 index 0000000..ac64128 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners.java @@ -0,0 +1,235 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVRegisterCombiners { + + public static final int GL_REGISTER_COMBINERS_NV = 0x8522, + GL_COMBINER0_NV = 0x8550, + GL_COMBINER1_NV = 0x8551, + GL_COMBINER2_NV = 0x8552, + GL_COMBINER3_NV = 0x8553, + GL_COMBINER4_NV = 0x8554, + GL_COMBINER5_NV = 0x8555, + GL_COMBINER6_NV = 0x8556, + GL_COMBINER7_NV = 0x8557, + GL_VARIABLE_A_NV = 0x8523, + GL_VARIABLE_B_NV = 0x8524, + GL_VARIABLE_C_NV = 0x8525, + GL_VARIABLE_D_NV = 0x8526, + GL_VARIABLE_E_NV = 0x8527, + GL_VARIABLE_F_NV = 0x8528, + GL_VARIABLE_G_NV = 0x8529, + GL_CONSTANT_COLOR0_NV = 0x852A, + GL_CONSTANT_COLOR1_NV = 0x852B, + GL_PRIMARY_COLOR_NV = 0x852C, + GL_SECONDARY_COLOR_NV = 0x852D, + GL_SPARE0_NV = 0x852E, + GL_SPARE1_NV = 0x852F, + GL_UNSIGNED_IDENTITY_NV = 0x8536, + GL_UNSIGNED_INVERT_NV = 0x8537, + GL_EXPAND_NORMAL_NV = 0x8538, + GL_EXPAND_NEGATE_NV = 0x8539, + GL_HALF_BIAS_NORMAL_NV = 0x853A, + GL_HALF_BIAS_NEGATE_NV = 0x853B, + GL_SIGNED_IDENTITY_NV = 0x853C, + GL_SIGNED_NEGATE_NV = 0x853D, + GL_E_TIMES_F_NV = 0x8531, + GL_SPARE0_PLUS_SECONDARY_COLOR_NV = 0x8532, + GL_SCALE_BY_TWO_NV = 0x853E, + GL_SCALE_BY_FOUR_NV = 0x853F, + GL_SCALE_BY_ONE_HALF_NV = 0x8540, + GL_BIAS_BY_NEGATIVE_ONE_HALF_NV = 0x8541, + GL_DISCARD_NV = 0x8530, + GL_COMBINER_INPUT_NV = 0x8542, + GL_COMBINER_MAPPING_NV = 0x8543, + GL_COMBINER_COMPONENT_USAGE_NV = 0x8544, + GL_COMBINER_AB_DOT_PRODUCT_NV = 0x8545, + GL_COMBINER_CD_DOT_PRODUCT_NV = 0x8546, + GL_COMBINER_MUX_SUM_NV = 0x8547, + GL_COMBINER_SCALE_NV = 0x8548, + GL_COMBINER_BIAS_NV = 0x8549, + GL_COMBINER_AB_OUTPUT_NV = 0x854A, + GL_COMBINER_CD_OUTPUT_NV = 0x854B, + GL_COMBINER_SUM_OUTPUT_NV = 0x854C, + GL_NUM_GENERAL_COMBINERS_NV = 0x854E, + GL_COLOR_SUM_CLAMP_NV = 0x854F, + GL_MAX_GENERAL_COMBINERS_NV = 0x854D; + + private NVRegisterCombiners() {} + + public static void glCombinerParameterfNV(int pname, float param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerParameterfNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCombinerParameterfNV(pname, param, function_pointer); + } + static native void nglCombinerParameterfNV(int pname, float param, long function_pointer); + + public static void glCombinerParameterNV(int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglCombinerParameterfvNV(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglCombinerParameterfvNV(int pname, long params, long function_pointer); + + public static void glCombinerParameteriNV(int pname, int param) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerParameteriNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCombinerParameteriNV(pname, param, function_pointer); + } + static native void nglCombinerParameteriNV(int pname, int param, long function_pointer); + + public static void glCombinerParameterNV(int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglCombinerParameterivNV(pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglCombinerParameterivNV(int pname, long params, long function_pointer); + + public static void glCombinerInputNV(int stage, int portion, int variable, int input, int mapping, int componentUsage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerInputNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCombinerInputNV(stage, portion, variable, input, mapping, componentUsage, function_pointer); + } + static native void nglCombinerInputNV(int stage, int portion, int variable, int input, int mapping, int componentUsage, long function_pointer); + + public static void glCombinerOutputNV(int stage, int portion, int abOutput, int cdOutput, int sumOutput, int scale, int bias, boolean abDotProduct, boolean cdDotProduct, boolean muxSum) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerOutputNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum, function_pointer); + } + static native void nglCombinerOutputNV(int stage, int portion, int abOutput, int cdOutput, int sumOutput, int scale, int bias, boolean abDotProduct, boolean cdDotProduct, boolean muxSum, long function_pointer); + + public static void glFinalCombinerInputNV(int variable, int input, int mapping, int componentUsage) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFinalCombinerInputNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFinalCombinerInputNV(variable, input, mapping, componentUsage, function_pointer); + } + static native void nglFinalCombinerInputNV(int variable, int input, int mapping, int componentUsage, long function_pointer); + + public static void glGetCombinerInputParameterNV(int stage, int portion, int variable, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerInputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetCombinerInputParameterfvNV(stage, portion, variable, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetCombinerInputParameterfvNV(int stage, int portion, int variable, int pname, long params, long function_pointer); + + /** Overloads glGetCombinerInputParameterfvNV. */ + public static float glGetCombinerInputParameterfNV(int stage, int portion, int variable, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerInputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetCombinerInputParameterfvNV(stage, portion, variable, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetCombinerInputParameterNV(int stage, int portion, int variable, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerInputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetCombinerInputParameterivNV(stage, portion, variable, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetCombinerInputParameterivNV(int stage, int portion, int variable, int pname, long params, long function_pointer); + + /** Overloads glGetCombinerInputParameterivNV. */ + public static int glGetCombinerInputParameteriNV(int stage, int portion, int variable, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerInputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetCombinerInputParameterivNV(stage, portion, variable, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetCombinerOutputParameterNV(int stage, int portion, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerOutputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetCombinerOutputParameterfvNV(stage, portion, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetCombinerOutputParameterfvNV(int stage, int portion, int pname, long params, long function_pointer); + + /** Overloads glGetCombinerOutputParameterfvNV. */ + public static float glGetCombinerOutputParameterfNV(int stage, int portion, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerOutputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetCombinerOutputParameterfvNV(stage, portion, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetCombinerOutputParameterNV(int stage, int portion, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerOutputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetCombinerOutputParameterivNV(stage, portion, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetCombinerOutputParameterivNV(int stage, int portion, int pname, long params, long function_pointer); + + /** Overloads glGetCombinerOutputParameterivNV. */ + public static int glGetCombinerOutputParameteriNV(int stage, int portion, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerOutputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetCombinerOutputParameterivNV(stage, portion, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetFinalCombinerInputParameterNV(int variable, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFinalCombinerInputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetFinalCombinerInputParameterfvNV(variable, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFinalCombinerInputParameterfvNV(int variable, int pname, long params, long function_pointer); + + /** Overloads glGetFinalCombinerInputParameterfvNV. */ + public static float glGetFinalCombinerInputParameterfNV(int variable, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFinalCombinerInputParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetFinalCombinerInputParameterfvNV(variable, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetFinalCombinerInputParameterNV(int variable, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFinalCombinerInputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetFinalCombinerInputParameterivNV(variable, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetFinalCombinerInputParameterivNV(int variable, int pname, long params, long function_pointer); + + /** Overloads glGetFinalCombinerInputParameterivNV. */ + public static int glGetFinalCombinerInputParameteriNV(int variable, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetFinalCombinerInputParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetFinalCombinerInputParameterivNV(variable, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners2.java new file mode 100644 index 0000000..0e0d130 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVRegisterCombiners2.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVRegisterCombiners2 { + + public static final int GL_PER_STAGE_CONSTANTS_NV = 0x8535; + + private NVRegisterCombiners2() {} + + public static void glCombinerStageParameterNV(int stage, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glCombinerStageParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglCombinerStageParameterfvNV(stage, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglCombinerStageParameterfvNV(int stage, int pname, long params, long function_pointer); + + public static void glGetCombinerStageParameterNV(int stage, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetCombinerStageParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetCombinerStageParameterfvNV(stage, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetCombinerStageParameterfvNV(int stage, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferLoad.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferLoad.java new file mode 100644 index 0000000..fe75551 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferLoad.java @@ -0,0 +1,172 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVShaderBufferLoad { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferParameterui64vNV, + * GetNamedBufferParameterui64vNV: + */ + public static final int GL_BUFFER_GPU_ADDRESS_NV = 0x8F1D; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_GPU_ADDRESS_NV = 0x8F34; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerui64vNV: + */ + public static final int GL_MAX_SHADER_BUFFER_ADDRESS_NV = 0x8F35; + + private NVShaderBufferLoad() {} + + public static void glMakeBufferResidentNV(int target, int access) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeBufferResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeBufferResidentNV(target, access, function_pointer); + } + static native void nglMakeBufferResidentNV(int target, int access, long function_pointer); + + public static void glMakeBufferNonResidentNV(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeBufferNonResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeBufferNonResidentNV(target, function_pointer); + } + static native void nglMakeBufferNonResidentNV(int target, long function_pointer); + + public static boolean glIsBufferResidentNV(int target) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsBufferResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsBufferResidentNV(target, function_pointer); + return __result; + } + static native boolean nglIsBufferResidentNV(int target, long function_pointer); + + public static void glMakeNamedBufferResidentNV(int buffer, int access) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeNamedBufferResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeNamedBufferResidentNV(buffer, access, function_pointer); + } + static native void nglMakeNamedBufferResidentNV(int buffer, int access, long function_pointer); + + public static void glMakeNamedBufferNonResidentNV(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glMakeNamedBufferNonResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglMakeNamedBufferNonResidentNV(buffer, function_pointer); + } + static native void nglMakeNamedBufferNonResidentNV(int buffer, long function_pointer); + + public static boolean glIsNamedBufferResidentNV(int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsNamedBufferResidentNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsNamedBufferResidentNV(buffer, function_pointer); + return __result; + } + static native boolean nglIsNamedBufferResidentNV(int buffer, long function_pointer); + + public static void glGetBufferParameteruNV(int target, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameterui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetBufferParameterui64vNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetBufferParameterui64vNV(int target, int pname, long params, long function_pointer); + + /** Overloads glGetBufferParameterui64vNV. */ + public static long glGetBufferParameterui64NV(int target, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetBufferParameterui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetBufferParameterui64vNV(target, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetNamedBufferParameteruNV(int buffer, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferParameterui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetNamedBufferParameterui64vNV(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetNamedBufferParameterui64vNV(int buffer, int pname, long params, long function_pointer); + + /** Overloads glGetNamedBufferParameterui64vNV. */ + public static long glGetNamedBufferParameterui64NV(int buffer, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetNamedBufferParameterui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer params = APIUtil.getBufferLong(caps); + nglGetNamedBufferParameterui64vNV(buffer, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetIntegeruNV(int value, LongBuffer result) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(result, 1); + nglGetIntegerui64vNV(value, MemoryUtil.getAddress(result), function_pointer); + } + static native void nglGetIntegerui64vNV(int value, long result, long function_pointer); + + /** Overloads glGetIntegerui64vNV. */ + public static long glGetIntegerui64NV(int value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer result = APIUtil.getBufferLong(caps); + nglGetIntegerui64vNV(value, MemoryUtil.getAddress(result), function_pointer); + return result.get(0); + } + + public static void glUniformui64NV(int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglUniformui64NV(location, value, function_pointer); + } + static native void nglUniformui64NV(int location, long value, long function_pointer); + + public static void glUniformuNV(int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glUniformui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglUniformui64vNV(location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglUniformui64vNV(int location, int value_count, long value, long function_pointer); + + public static void glGetUniformuNV(int program, int location, LongBuffer params) { + NVGpuShader5.glGetUniformuNV(program, location, params); + } + + public static void glProgramUniformui64NV(int program, int location, long value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramUniformui64NV(program, location, value, function_pointer); + } + static native void nglProgramUniformui64NV(int program, int location, long value, long function_pointer); + + public static void glProgramUniformuNV(int program, int location, LongBuffer value) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramUniformui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(value); + nglProgramUniformui64vNV(program, location, value.remaining(), MemoryUtil.getAddress(value), function_pointer); + } + static native void nglProgramUniformui64vNV(int program, int location, int value_count, long value, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferStore.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferStore.java new file mode 100644 index 0000000..b088f11 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVShaderBufferStore.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVShaderBufferStore { + + /** + * Accepted by the &lt;barriers&gt; parameter of MemoryBarrierNV: + */ + public static final int GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV = 0x10; + + /** + * Accepted by the &lt;access&gt; parameter of MakeBufferResidentNV: + */ + public static final int GL_READ_WRITE = 0x88BA, + GL_WRITE_ONLY = 0x88B9; + + private NVShaderBufferStore() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTessellationProgram5.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTessellationProgram5.java new file mode 100644 index 0000000..40577ed --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTessellationProgram5.java @@ -0,0 +1,37 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTessellationProgram5 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4[df][v]ARB, + * ProgramLocalParameter4[df][v]ARB, GetProgramEnvParameter[df]vARB, + * GetProgramLocalParameter[df]vARB, GetProgramivARB and + * GetProgramStringARB: + */ + public static final int GL_TESS_CONTROL_PROGRAM_NV = 0x891E, + GL_TESS_EVALUATION_PROGRAM_NV = 0x891F; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + public static final int GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV = 0x8C74, + GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV = 0x8C75; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_MAX_PROGRAM_PATCH_ATTRIBS_NV = 0x86D8; + + private NVTessellationProgram5() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTexgenReflection.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTexgenReflection.java new file mode 100644 index 0000000..7afcc5e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTexgenReflection.java @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTexgenReflection { + + public static final int GL_NORMAL_MAP_NV = 0x8511, + GL_REFLECTION_MAP_NV = 0x8512; + + private NVTexgenReflection() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureBarrier.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureBarrier.java new file mode 100644 index 0000000..af1f707 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureBarrier.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureBarrier { + + private NVTextureBarrier() {} + + public static void glTextureBarrierNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureBarrierNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureBarrierNV(function_pointer); + } + static native void nglTextureBarrierNV(long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureCompressionVTC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureCompressionVTC.java new file mode 100644 index 0000000..61f2f7a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureCompressionVTC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureCompressionVTC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage3D and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB: + */ + public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + + private NVTextureCompressionVTC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureEnvCombine4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureEnvCombine4.java new file mode 100644 index 0000000..01395f4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureEnvCombine4.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureEnvCombine4 { + + public static final int GL_COMBINE4_NV = 0x8503, + GL_SOURCE3_RGB_NV = 0x8583, + GL_SOURCE3_ALPHA_NV = 0x858B, + GL_OPERAND3_RGB_NV = 0x8593, + GL_OPERAND3_ALPHA_NV = 0x859B; + + private NVTextureEnvCombine4() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureExpandNormal.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureExpandNormal.java new file mode 100644 index 0000000..23cc3c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureExpandNormal.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureExpandNormal { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameteriv, TexParameterf, TexParameterfv, GetTexParameteri, + * and GetTexParameteriv: + */ + public static final int GL_TEXTURE_UNSIGNED_REMAP_MODE_NV = 0x888F; + + private NVTextureExpandNormal() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureMultisample.java new file mode 100644 index 0000000..a8d03a1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureMultisample.java @@ -0,0 +1,65 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: + */ + public static final int GL_TEXTURE_COVERAGE_SAMPLES_NV = 0x9045, + GL_TEXTURE_COLOR_SAMPLES_NV = 0x9046; + + private NVTextureMultisample() {} + + public static void glTexImage2DMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage2DMultisampleCoverageNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexImage2DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations, function_pointer); + } + static native void nglTexImage2DMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, boolean fixedSampleLocations, long function_pointer); + + public static void glTexImage3DMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexImage3DMultisampleCoverageNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexImage3DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations, function_pointer); + } + static native void nglTexImage3DMultisampleCoverageNV(int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations, long function_pointer); + + public static void glTextureImage2DMultisampleNV(int texture, int target, int samples, int internalFormat, int width, int height, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DMultisampleNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations, function_pointer); + } + static native void nglTextureImage2DMultisampleNV(int texture, int target, int samples, int internalFormat, int width, int height, boolean fixedSampleLocations, long function_pointer); + + public static void glTextureImage3DMultisampleNV(int texture, int target, int samples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DMultisampleNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations, function_pointer); + } + static native void nglTextureImage3DMultisampleNV(int texture, int target, int samples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations, long function_pointer); + + public static void glTextureImage2DMultisampleCoverageNV(int texture, int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage2DMultisampleCoverageNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureImage2DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations, function_pointer); + } + static native void nglTextureImage2DMultisampleCoverageNV(int texture, int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, boolean fixedSampleLocations, long function_pointer); + + public static void glTextureImage3DMultisampleCoverageNV(int texture, int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTextureImage3DMultisampleCoverageNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTextureImage3DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations, function_pointer); + } + static native void nglTextureImage3DMultisampleCoverageNV(int texture, int target, int coverageSamples, int colorSamples, int internalFormat, int width, int height, int depth, boolean fixedSampleLocations, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureRectangle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureRectangle.java new file mode 100644 index 0000000..06dac6a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureRectangle.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureRectangle { + + public static final int GL_TEXTURE_RECTANGLE_NV = 0x84F5, + GL_TEXTURE_BINDING_RECTANGLE_NV = 0x84F6, + GL_PROXY_TEXTURE_RECTANGLE_NV = 0x84F7, + GL_MAX_RECTANGLE_TEXTURE_SIZE_NV = 0x84F8; + + private NVTextureRectangle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader.java new file mode 100644 index 0000000..51d0672 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader.java @@ -0,0 +1,149 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureShader { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of TexEnvf, TexEnvfv, + * TexEnvi, TexEnviv, GetTexEnvfv, and GetTexEnviv. + */ + public static final int GL_TEXTURE_SHADER_NV = 0x86DE; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, and GetTexEnviv is TEXTURE_SHADER_NV, then the value + * of &lt;pname&gt; may be: + */ + public static final int GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = 0x86D9, + GL_SHADER_OPERATION_NV = 0x86DF, + GL_OFFSET_TEXTURE_SCALE_NV = 0x86E2, + GL_OFFSET_TEXTURE_BIAS_NV = 0x86E3, + GL_OFFSET_TEXTURE_2D_SCALE_NV = 0x86E2, + GL_OFFSET_TEXTURE_2D_BIAS_NV = 0x86E3, + GL_PREVIOUS_TEXTURE_INPUT_NV = 0x86E4; + + /** + * When the &lt;target&gt; parameter of TexEnvfv, TexEnviv, GetTexEnvfv, and + * GetTexEnviv is TEXTURE_SHADER_NV, then the value of &lt;pname&gt; may be: + */ + public static final int GL_CULL_MODES_NV = 0x86E0, + GL_OFFSET_TEXTURE_MATRIX_NV = 0x86E1, + GL_OFFSET_TEXTURE_2D_MATRIX_NV = 0x86E1, + GL_CONST_EYE_NV = 0x86E5; + + /** + * When the &lt;target&gt; parameter GetTexEnvfv and GetTexEnviv is + * TEXTURE_SHADER_NV, then the value of &lt;pname&gt; may be: + */ + public static final int GL_SHADER_CONSISTENT_NV = 0x86DD; + + /** + * When the &lt;target&gt; and &lt;pname&gt; parameters of TexEnvf, TexEnvfv, + * TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and SHADER_OPERATION_NV + * respectively, then the value of &lt;param&gt; or the value pointed to by + * &lt;params&gt; may be: + */ + public static final int GL_PASS_THROUGH_NV = 0x86E6, + GL_CULL_FRAGMENT_NV = 0x86E7, + GL_OFFSET_TEXTURE_2D_NV = 0x86E8, + GL_OFFSET_TEXTURE_RECTANGLE_NV = 0x864C, + GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = 0x864D, + GL_DEPENDENT_AR_TEXTURE_2D_NV = 0x86E9, + GL_DEPENDENT_GB_TEXTURE_2D_NV = 0x86EA, + GL_DOT_PRODUCT_NV = 0x86EC, + GL_DOT_PRODUCT_DEPTH_REPLACE_NV = 0x86ED, + GL_DOT_PRODUCT_TEXTURE_2D_NV = 0x86EE, + GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = 0x864E, + GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = 0x86F0, + GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = 0x86F1, + GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = 0x86F2, + GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = 0x86F3; + + /** + * Accepted by the &lt;format&gt; parameter of GetTexImage, TexImage1D, + * TexImage2D, TexSubImage1D, and TexSubImage2D. + */ + public static final int GL_HILO_NV = 0x86F4, + GL_DSDT_NV = 0x86F5, + GL_DSDT_MAG_NV = 0x86F6, + GL_DSDT_MAG_VIB_NV = 0x86F7; + + /** + * Accepted by the &lt;type&gt; parameter of GetTexImage, TexImage1D, + * TexImage2D, TexSubImage1D, and TexSubImage2D. + */ + public static final int GL_UNSIGNED_INT_S8_S8_8_8_NV = 0x86DA, + GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = 0x86DB; + + /** + * Accepted by the &lt;internalformat&gt; parameter of CopyTexImage1D, + * CopyTexImage2D, TexImage1D, and TexImage2D. + */ + public static final int GL_SIGNED_RGBA_NV = 0x86FB, + GL_SIGNED_RGBA8_NV = 0x86FC, + GL_SIGNED_RGB_NV = 0x86FE, + GL_SIGNED_RGB8_NV = 0x86FF, + GL_SIGNED_LUMINANCE_NV = 0x8701, + GL_SIGNED_LUMINANCE8_NV = 0x8702, + GL_SIGNED_LUMINANCE_ALPHA_NV = 0x8703, + GL_SIGNED_LUMINANCE8_ALPHA8_NV = 0x8704, + GL_SIGNED_ALPHA_NV = 0x8705, + GL_SIGNED_ALPHA8_NV = 0x8706, + GL_SIGNED_INTENSITY_NV = 0x8707, + GL_SIGNED_INTENSITY8_NV = 0x8708, + GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = 0x870C, + GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = 0x870D; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D and + * TexImage2D. + */ + public static final int GL_HILO16_NV = 0x86F8, + GL_SIGNED_HILO_NV = 0x86F9, + GL_SIGNED_HILO16_NV = 0x86FA, + GL_DSDT8_NV = 0x8709, + GL_DSDT8_MAG8_NV = 0x870A, + GL_DSDT_MAG_INTENSITY_NV = 0x86DC, + GL_DSDT8_MAG8_INTENSITY8_NV = 0x870B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, PixelTransferf, and PixelTransferi. + */ + public static final int GL_HI_SCALE_NV = 0x870E, + GL_LO_SCALE_NV = 0x870F, + GL_DS_SCALE_NV = 0x8710, + GL_DT_SCALE_NV = 0x8711, + GL_MAGNITUDE_SCALE_NV = 0x8712, + GL_VIBRANCE_SCALE_NV = 0x8713, + GL_HI_BIAS_NV = 0x8714, + GL_LO_BIAS_NV = 0x8715, + GL_DS_BIAS_NV = 0x8716, + GL_DT_BIAS_NV = 0x8717, + GL_MAGNITUDE_BIAS_NV = 0x8718, + GL_VIBRANCE_BIAS_NV = 0x8719; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteriv, TexParameterfv, + * GetTexParameterfv and GetTexParameteriv. + */ + public static final int GL_TEXTURE_BORDER_VALUES_NV = 0x871A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv. + */ + public static final int GL_TEXTURE_HI_SIZE_NV = 0x871B, + GL_TEXTURE_LO_SIZE_NV = 0x871C, + GL_TEXTURE_DS_SIZE_NV = 0x871D, + GL_TEXTURE_DT_SIZE_NV = 0x871E, + GL_TEXTURE_MAG_SIZE_NV = 0x871F; + + private NVTextureShader() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader2.java new file mode 100644 index 0000000..0051a86 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader2.java @@ -0,0 +1,40 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureShader2 { + + public static final int GL_DOT_PRODUCT_TEXTURE_3D_NV = 0x86EF, + GL_HILO_NV = 0x86F4, + GL_DSDT_NV = 0x86F5, + GL_DSDT_MAG_NV = 0x86F6, + GL_DSDT_MAG_VIB_NV = 0x86F7, + GL_UNSIGNED_INT_S8_S8_8_8_NV = 0x86DA, + GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = 0x86DB, + GL_SIGNED_RGBA_NV = 0x86FB, + GL_SIGNED_RGBA8_NV = 0x86FC, + GL_SIGNED_RGB_NV = 0x86FE, + GL_SIGNED_RGB8_NV = 0x86FF, + GL_SIGNED_LUMINANCE_NV = 0x8701, + GL_SIGNED_LUMINANCE8_NV = 0x8702, + GL_SIGNED_LUMINANCE_ALPHA_NV = 0x8703, + GL_SIGNED_LUMINANCE8_ALPHA8_NV = 0x8704, + GL_SIGNED_ALPHA_NV = 0x8705, + GL_SIGNED_ALPHA8_NV = 0x8706, + GL_SIGNED_INTENSITY_NV = 0x8707, + GL_SIGNED_INTENSITY8_NV = 0x8708, + GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = 0x870C, + GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = 0x870D, + GL_HILO16_NV = 0x86F8, + GL_SIGNED_HILO_NV = 0x86F9, + GL_SIGNED_HILO16_NV = 0x86FA, + GL_DSDT8_NV = 0x8709, + GL_DSDT8_MAG8_NV = 0x870A, + GL_DSDT_MAG_INTENSITY_NV = 0x86DC, + GL_DSDT8_MAG8_INTENSITY8_NV = 0x870B; + + private NVTextureShader2() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader3.java new file mode 100644 index 0000000..ad9bab2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTextureShader3.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTextureShader3 { + + public static final int GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = 0x8850, + GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = 0x8851, + GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8852, + GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = 0x8853, + GL_OFFSET_HILO_TEXTURE_2D_NV = 0x8854, + GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = 0x8855, + GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = 0x8856, + GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8857, + GL_DEPENDENT_HILO_TEXTURE_2D_NV = 0x8858, + GL_DEPENDENT_RGB_TEXTURE_3D_NV = 0x8859, + GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = 0x885A, + GL_DOT_PRODUCT_PASS_THROUGH_NV = 0x885B, + GL_DOT_PRODUCT_TEXTURE_1D_NV = 0x885C, + GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = 0x885D, + GL_HILO8_NV = 0x885E, + GL_SIGNED_HILO8_NV = 0x885F, + GL_FORCE_BLUE_TO_ONE_NV = 0x8860; + + private NVTextureShader3() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback.java new file mode 100644 index 0000000..8464436 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback.java @@ -0,0 +1,278 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTransformFeedback { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRangeNV, BindBufferOffsetNV and + * BindBufferBaseNV: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_NV = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_START_NV = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV = 0x8C85, + GL_TRANSFORM_FEEDBACK_RECORD_NV = 0x8C86; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV = 0x8C8F; + + /** + * Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackAttribsNV and + * TransformFeedbackVaryingsNV: + */ + public static final int GL_INTERLEAVED_ATTRIBS_NV = 0x8C8C, + GL_SEPARATE_ATTRIBS_NV = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + public static final int GL_PRIMITIVES_GENERATED_NV = 0x8C87, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_RASTERIZER_DISCARD_NV = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV = 0x8C8B, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV = 0x8C80, + GL_TRANSFORM_FEEDBACK_ATTRIBS_NV = 0x8C7E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_ACTIVE_VARYINGS_NV = 0x8C81, + GL_ACTIVE_VARYING_MAX_LENGTH_NV = 0x8C82, + GL_TRANSFORM_FEEDBACK_VARYINGS_NV = 0x8C83; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * GetFloatv, and GetProgramiv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV = 0x8C7F; + + /** + * Accepted by the &lt;attribs&gt; parameter of TransformFeedbackAttribsNV: + */ + public static final int GL_BACK_PRIMARY_COLOR_NV = 0x8C77, + GL_BACK_SECONDARY_COLOR_NV = 0x8C78, + GL_TEXTURE_COORD_NV = 0x8C79, + GL_CLIP_DISTANCE_NV = 0x8C7A, + GL_VERTEX_ID_NV = 0x8C7B, + GL_PRIMITIVE_ID_NV = 0x8C7C, + GL_GENERIC_ATTRIB_NV = 0x8C7D, + GL_LAYER_NV = 0x8DAA; + + private NVTransformFeedback() {} + + public static void glBindBufferRangeNV(int target, int index, int buffer, long offset, long size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferRangeNV(target, index, buffer, offset, size, function_pointer); + } + static native void nglBindBufferRangeNV(int target, int index, int buffer, long offset, long size, long function_pointer); + + public static void glBindBufferOffsetNV(int target, int index, int buffer, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferOffsetNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferOffsetNV(target, index, buffer, offset, function_pointer); + } + static native void nglBindBufferOffsetNV(int target, int index, int buffer, long offset, long function_pointer); + + public static void glBindBufferBaseNV(int target, int index, int buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindBufferBaseNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindBufferBaseNV(target, index, buffer, function_pointer); + } + static native void nglBindBufferBaseNV(int target, int index, int buffer, long function_pointer); + + public static void glTransformFeedbackAttribsNV(IntBuffer attribs, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackAttribsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(attribs, 3); + nglTransformFeedbackAttribsNV(attribs.remaining() / 3, MemoryUtil.getAddress(attribs), bufferMode, function_pointer); + } + static native void nglTransformFeedbackAttribsNV(int count, long attribs, int bufferMode, long function_pointer); + + public static void glTransformFeedbackVaryingsNV(int program, IntBuffer locations, int bufferMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTransformFeedbackVaryingsNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(locations); + nglTransformFeedbackVaryingsNV(program, locations.remaining(), MemoryUtil.getAddress(locations), bufferMode, function_pointer); + } + static native void nglTransformFeedbackVaryingsNV(int program, int locations_count, long locations, int bufferMode, long function_pointer); + + public static void glBeginTransformFeedbackNV(int primitiveMode) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginTransformFeedbackNV(primitiveMode, function_pointer); + } + static native void nglBeginTransformFeedbackNV(int primitiveMode, long function_pointer); + + public static void glEndTransformFeedbackNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndTransformFeedbackNV(function_pointer); + } + static native void nglEndTransformFeedbackNV(long function_pointer); + + public static int glGetVaryingLocationNV(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVaryingLocationNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetVaryingLocationNV(program, MemoryUtil.getAddress(name), function_pointer); + return __result; + } + static native int nglGetVaryingLocationNV(int program, long name, long function_pointer); + + /** Overloads glGetVaryingLocationNV. */ + public static int glGetVaryingLocationNV(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVaryingLocationNV; + BufferChecks.checkFunctionAddress(function_pointer); + int __result = nglGetVaryingLocationNV(program, APIUtil.getBufferNT(caps, name), function_pointer); + return __result; + } + + public static void glGetActiveVaryingNV(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveVaryingNV(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name), function_pointer); + } + static native void nglGetActiveVaryingNV(int program, int index, int name_bufSize, long length, long size, long type, long name, long function_pointer); + + /** + * Overloads glGetActiveVaryingNV. + * <p> + * Overloads glGetActiveVaryingNV. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveVaryingNV(int program, int index, int bufSize, IntBuffer sizeType) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufSize); + nglGetActiveVaryingNV(program, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveVaryingNV. + * <p> + * Overloads glGetActiveVaryingNV. This version returns only the varying name. + */ + public static String glGetActiveVaryingNV(int program, int index, int bufSize) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer name_length = APIUtil.getLengths(caps); + ByteBuffer name = APIUtil.getBufferByte(caps, bufSize); + nglGetActiveVaryingNV(program, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1), MemoryUtil.getAddress(name), function_pointer); + name.limit(name_length.get(0)); + return APIUtil.getString(caps, name); + } + + /** + * Overloads glGetActiveVaryingNV. + * <p> + * Overloads glGetActiveVaryingNV. This version returns only the varying size. + */ + public static int glGetActiveVaryingSizeNV(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer size = APIUtil.getBufferInt(caps); + nglGetActiveVaryingNV(program, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0(caps), function_pointer); + return size.get(0); + } + + /** + * Overloads glGetActiveVaryingNV. + * <p> + * Overloads glGetActiveVaryingNV. This version returns only the varying type. + */ + public static int glGetActiveVaryingTypeNV(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer type = APIUtil.getBufferInt(caps); + nglGetActiveVaryingNV(program, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0(caps), function_pointer); + return type.get(0); + } + + public static void glActiveVaryingNV(int program, ByteBuffer name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglActiveVaryingNV(program, MemoryUtil.getAddress(name), function_pointer); + } + static native void nglActiveVaryingNV(int program, long name, long function_pointer); + + /** Overloads glActiveVaryingNV. */ + public static void glActiveVaryingNV(int program, CharSequence name) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glActiveVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglActiveVaryingNV(program, APIUtil.getBufferNT(caps, name), function_pointer); + } + + public static void glGetTransformFeedbackVaryingNV(int program, int index, IntBuffer location) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(location, 1); + nglGetTransformFeedbackVaryingNV(program, index, MemoryUtil.getAddress(location), function_pointer); + } + static native void nglGetTransformFeedbackVaryingNV(int program, int index, long location, long function_pointer); + + /** Overloads glGetTransformFeedbackVaryingNV. */ + public static int glGetTransformFeedbackVaryingNV(int program, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTransformFeedbackVaryingNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer location = APIUtil.getBufferInt(caps); + nglGetTransformFeedbackVaryingNV(program, index, MemoryUtil.getAddress(location), function_pointer); + return location.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback2.java new file mode 100644 index 0000000..4ab4be4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVTransformFeedback2.java @@ -0,0 +1,101 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVTransformFeedback2 { + + /** + * Accepted by the &lt;target&gt; parameter of BindTransformFeedbackNV: + */ + public static final int GL_TRANSFORM_FEEDBACK_NV = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV = 0x8E23, + GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING_NV = 0x8E25; + + private NVTransformFeedback2() {} + + public static void glBindTransformFeedbackNV(int target, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindTransformFeedbackNV(target, id, function_pointer); + } + static native void nglBindTransformFeedbackNV(int target, int id, long function_pointer); + + public static void glDeleteTransformFeedbacksNV(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTransformFeedbacksNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglDeleteTransformFeedbacksNV(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglDeleteTransformFeedbacksNV(int ids_n, long ids, long function_pointer); + + /** Overloads glDeleteTransformFeedbacksNV. */ + public static void glDeleteTransformFeedbacksNV(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDeleteTransformFeedbacksNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDeleteTransformFeedbacksNV(1, APIUtil.getInt(caps, id), function_pointer); + } + + public static void glGenTransformFeedbacksNV(IntBuffer ids) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTransformFeedbacksNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(ids); + nglGenTransformFeedbacksNV(ids.remaining(), MemoryUtil.getAddress(ids), function_pointer); + } + static native void nglGenTransformFeedbacksNV(int ids_n, long ids, long function_pointer); + + /** Overloads glGenTransformFeedbacksNV. */ + public static int glGenTransformFeedbacksNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGenTransformFeedbacksNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer ids = APIUtil.getBufferInt(caps); + nglGenTransformFeedbacksNV(1, MemoryUtil.getAddress(ids), function_pointer); + return ids.get(0); + } + + public static boolean glIsTransformFeedbackNV(int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIsTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + boolean __result = nglIsTransformFeedbackNV(id, function_pointer); + return __result; + } + static native boolean nglIsTransformFeedbackNV(int id, long function_pointer); + + public static void glPauseTransformFeedbackNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glPauseTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglPauseTransformFeedbackNV(function_pointer); + } + static native void nglPauseTransformFeedbackNV(long function_pointer); + + public static void glResumeTransformFeedbackNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glResumeTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglResumeTransformFeedbackNV(function_pointer); + } + static native void nglResumeTransformFeedbackNV(long function_pointer); + + public static void glDrawTransformFeedbackNV(int mode, int id) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glDrawTransformFeedbackNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglDrawTransformFeedbackNV(mode, id, function_pointer); + } + static native void nglDrawTransformFeedbackNV(int mode, int id, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange.java new file mode 100644 index 0000000..e8cd568 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange.java @@ -0,0 +1,80 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexArrayRange { + + public static final int GL_VERTEX_ARRAY_RANGE_NV = 0x851D, + GL_VERTEX_ARRAY_RANGE_LENGTH_NV = 0x851E, + GL_VERTEX_ARRAY_RANGE_VALID_NV = 0x851F, + GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = 0x8520, + GL_VERTEX_ARRAY_RANGE_POINTER_NV = 0x8521; + + private NVVertexArrayRange() {} + + public static void glVertexArrayRangeNV(ByteBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglVertexArrayRangeNV(pPointer.remaining(), MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glVertexArrayRangeNV(DoubleBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglVertexArrayRangeNV((pPointer.remaining() << 3), MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glVertexArrayRangeNV(FloatBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglVertexArrayRangeNV((pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glVertexArrayRangeNV(IntBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglVertexArrayRangeNV((pPointer.remaining() << 2), MemoryUtil.getAddress(pPointer), function_pointer); + } + public static void glVertexArrayRangeNV(ShortBuffer pPointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pPointer); + nglVertexArrayRangeNV((pPointer.remaining() << 1), MemoryUtil.getAddress(pPointer), function_pointer); + } + static native void nglVertexArrayRangeNV(int pPointer_size, long pPointer, long function_pointer); + + public static void glFlushVertexArrayRangeNV() { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFlushVertexArrayRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFlushVertexArrayRangeNV(function_pointer); + } + static native void nglFlushVertexArrayRangeNV(long function_pointer); + + public static ByteBuffer glAllocateMemoryNV(int size, float readFrequency, float writeFrequency, float priority) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glAllocateMemoryNV; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglAllocateMemoryNV(size, readFrequency, writeFrequency, priority, size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglAllocateMemoryNV(int size, float readFrequency, float writeFrequency, float priority, long result_size, long function_pointer); + + public static void glFreeMemoryNV(ByteBuffer pointer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFreeMemoryNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(pointer); + nglFreeMemoryNV(MemoryUtil.getAddress(pointer), function_pointer); + } + static native void nglFreeMemoryNV(long pointer, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange2.java new file mode 100644 index 0000000..fa59e59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexArrayRange2.java @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexArrayRange2 { + + public static final int GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = 0x8533; + + private NVVertexArrayRange2() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexAttribInteger64bit.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexAttribInteger64bit.java new file mode 100644 index 0000000..aa15fa9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexAttribInteger64bit.java @@ -0,0 +1,180 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexAttribInteger64bit { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribLPointerEXT, + * VertexArrayVertexAttribLOffsetEXT, and VertexAttribLFormatNV: + */ + public static final int GL_INT64_NV = 0x140E, + GL_UNSIGNED_INT64_NV = 0x140F; + + private NVVertexAttribInteger64bit() {} + + public static void glVertexAttribL1i64NV(int index, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL1i64NV(index, x, function_pointer); + } + static native void nglVertexAttribL1i64NV(int index, long x, long function_pointer); + + public static void glVertexAttribL2i64NV(int index, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL2i64NV(index, x, y, function_pointer); + } + static native void nglVertexAttribL2i64NV(int index, long x, long y, long function_pointer); + + public static void glVertexAttribL3i64NV(int index, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL3i64NV(index, x, y, z, function_pointer); + } + static native void nglVertexAttribL3i64NV(int index, long x, long y, long z, long function_pointer); + + public static void glVertexAttribL4i64NV(int index, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4i64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL4i64NV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribL4i64NV(int index, long x, long y, long z, long w, long function_pointer); + + public static void glVertexAttribL1NV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribL1i64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL1i64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL2NV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribL2i64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL2i64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL3NV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribL3i64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL3i64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL4NV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4i64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribL4i64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL4i64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL1ui64NV(int index, long x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL1ui64NV(index, x, function_pointer); + } + static native void nglVertexAttribL1ui64NV(int index, long x, long function_pointer); + + public static void glVertexAttribL2ui64NV(int index, long x, long y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL2ui64NV(index, x, y, function_pointer); + } + static native void nglVertexAttribL2ui64NV(int index, long x, long y, long function_pointer); + + public static void glVertexAttribL3ui64NV(int index, long x, long y, long z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL3ui64NV(index, x, y, z, function_pointer); + } + static native void nglVertexAttribL3ui64NV(int index, long x, long y, long z, long function_pointer); + + public static void glVertexAttribL4ui64NV(int index, long x, long y, long z, long w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4ui64NV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribL4ui64NV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttribL4ui64NV(int index, long x, long y, long z, long w, long function_pointer); + + public static void glVertexAttribL1uNV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL1ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 1); + nglVertexAttribL1ui64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL1ui64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL2uNV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL2ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 2); + nglVertexAttribL2ui64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL2ui64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL3uNV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL3ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 3); + nglVertexAttribL3ui64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL3ui64vNV(int index, long v, long function_pointer); + + public static void glVertexAttribL4uNV(int index, LongBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribL4ui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(v, 4); + nglVertexAttribL4ui64vNV(index, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribL4ui64vNV(int index, long v, long function_pointer); + + public static void glGetVertexAttribLNV(int index, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribLi64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribLi64vNV(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribLi64vNV(int index, int pname, long params, long function_pointer); + + public static void glGetVertexAttribLuNV(int index, int pname, LongBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribLui64vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribLui64vNV(index, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribLui64vNV(int index, int pname, long params, long function_pointer); + + public static void glVertexAttribLFormatNV(int index, int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribLFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribLFormatNV(index, size, type, stride, function_pointer); + } + static native void nglVertexAttribLFormatNV(int index, int size, int type, int stride, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java new file mode 100644 index 0000000..9225374 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexBufferUnifiedMemory.java @@ -0,0 +1,163 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexBufferUnifiedMemory { + + /** + * Accepted by the &lt;cap&gt; parameter of DisableClientState, + * EnableClientState, IsEnabled: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV = 0x8F1E, + GL_ELEMENT_ARRAY_UNIFIED_NV = 0x8F1F; + + /** + * Accepted by the &lt;pname&gt; parameter of BufferAddressRangeNV + * and the &lt;value&gt; parameter of GetIntegerui64i_vNV: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV = 0x8F20, + GL_TEXTURE_COORD_ARRAY_ADDRESS_NV = 0x8F25; + + /** + * Accepted by the &lt;pname&gt; parameter of BufferAddressRangeNV + * and the &lt;value&gt; parameter of GetIntegerui64vNV: + */ + public static final int GL_VERTEX_ARRAY_ADDRESS_NV = 0x8F21, + GL_NORMAL_ARRAY_ADDRESS_NV = 0x8F22, + GL_COLOR_ARRAY_ADDRESS_NV = 0x8F23, + GL_INDEX_ARRAY_ADDRESS_NV = 0x8F24, + GL_EDGE_FLAG_ARRAY_ADDRESS_NV = 0x8F26, + GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV = 0x8F27, + GL_FOG_COORD_ARRAY_ADDRESS_NV = 0x8F28, + GL_ELEMENT_ARRAY_ADDRESS_NV = 0x8F29; + + /** + * Accepted by the &lt;target&gt; parameter of GetIntegeri_vNV: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV = 0x8F2A, + GL_TEXTURE_COORD_ARRAY_LENGTH_NV = 0x8F2F; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv: + */ + public static final int GL_VERTEX_ARRAY_LENGTH_NV = 0x8F2B, + GL_NORMAL_ARRAY_LENGTH_NV = 0x8F2C, + GL_COLOR_ARRAY_LENGTH_NV = 0x8F2D, + GL_INDEX_ARRAY_LENGTH_NV = 0x8F2E, + GL_EDGE_FLAG_ARRAY_LENGTH_NV = 0x8F30, + GL_SECONDARY_COLOR_ARRAY_LENGTH_NV = 0x8F31, + GL_FOG_COORD_ARRAY_LENGTH_NV = 0x8F32, + GL_ELEMENT_ARRAY_LENGTH_NV = 0x8F33; + + private NVVertexBufferUnifiedMemory() {} + + public static void glBufferAddressRangeNV(int pname, int index, long address, long length) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBufferAddressRangeNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBufferAddressRangeNV(pname, index, address, length, function_pointer); + } + static native void nglBufferAddressRangeNV(int pname, int index, long address, long length, long function_pointer); + + public static void glVertexFormatNV(int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexFormatNV(size, type, stride, function_pointer); + } + static native void nglVertexFormatNV(int size, int type, int stride, long function_pointer); + + public static void glNormalFormatNV(int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glNormalFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglNormalFormatNV(type, stride, function_pointer); + } + static native void nglNormalFormatNV(int type, int stride, long function_pointer); + + public static void glColorFormatNV(int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glColorFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglColorFormatNV(size, type, stride, function_pointer); + } + static native void nglColorFormatNV(int size, int type, int stride, long function_pointer); + + public static void glIndexFormatNV(int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glIndexFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglIndexFormatNV(type, stride, function_pointer); + } + static native void nglIndexFormatNV(int type, int stride, long function_pointer); + + public static void glTexCoordFormatNV(int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTexCoordFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTexCoordFormatNV(size, type, stride, function_pointer); + } + static native void nglTexCoordFormatNV(int size, int type, int stride, long function_pointer); + + public static void glEdgeFlagFormatNV(int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEdgeFlagFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEdgeFlagFormatNV(stride, function_pointer); + } + static native void nglEdgeFlagFormatNV(int stride, long function_pointer); + + public static void glSecondaryColorFormatNV(int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glSecondaryColorFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglSecondaryColorFormatNV(size, type, stride, function_pointer); + } + static native void nglSecondaryColorFormatNV(int size, int type, int stride, long function_pointer); + + public static void glFogCoordFormatNV(int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glFogCoordFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglFogCoordFormatNV(type, stride, function_pointer); + } + static native void nglFogCoordFormatNV(int type, int stride, long function_pointer); + + public static void glVertexAttribFormatNV(int index, int size, int type, boolean normalized, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribFormatNV(index, size, type, normalized, stride, function_pointer); + } + static native void nglVertexAttribFormatNV(int index, int size, int type, boolean normalized, int stride, long function_pointer); + + public static void glVertexAttribIFormatNV(int index, int size, int type, int stride) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribIFormatNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttribIFormatNV(index, size, type, stride, function_pointer); + } + static native void nglVertexAttribIFormatNV(int index, int size, int type, int stride, long function_pointer); + + public static void glGetIntegeruNV(int value, int index, LongBuffer result) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerui64i_vNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(result, 1); + nglGetIntegerui64i_vNV(value, index, MemoryUtil.getAddress(result), function_pointer); + } + static native void nglGetIntegerui64i_vNV(int value, int index, long result, long function_pointer); + + /** Overloads glGetIntegerui64i_vNV. */ + public static long glGetIntegerui64NV(int value, int index) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetIntegerui64i_vNV; + BufferChecks.checkFunctionAddress(function_pointer); + LongBuffer result = APIUtil.getBufferLong(caps); + nglGetIntegerui64i_vNV(value, index, MemoryUtil.getAddress(result), function_pointer); + return result.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram.java new file mode 100644 index 0000000..6860a38 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram.java @@ -0,0 +1,545 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexProgram extends NVProgram { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of BindProgramNV, + * ExecuteProgramNV, GetProgramParameter[df]vNV, GetTrackMatrixivNV, + * LoadProgramNV, ProgramParameter[s]4[df][v]NV, and TrackMatrixNV: + */ + public static final int GL_VERTEX_PROGRAM_NV = 0x8620; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_VERTEX_PROGRAM_POINT_SIZE_NV = 0x8642, + GL_VERTEX_PROGRAM_TWO_SIDE_NV = 0x8643; + + /** + * Accepted by the &lt;target&gt; parameter of ExecuteProgramNV and + * LoadProgramNV: + */ + public static final int GL_VERTEX_STATE_PROGRAM_NV = 0x8621; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttrib[dfi]vNV: + */ + public static final int GL_ATTRIB_ARRAY_SIZE_NV = 0x8623, + GL_ATTRIB_ARRAY_STRIDE_NV = 0x8624, + GL_ATTRIB_ARRAY_TYPE_NV = 0x8625, + GL_CURRENT_ATTRIB_NV = 0x8626; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramParameterfvNV + * and GetProgramParameterdvNV: + */ + public static final int GL_PROGRAM_PARAMETER_NV = 0x8644; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervNV: + */ + public static final int GL_ATTRIB_ARRAY_POINTER_NV = 0x8645; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTrackMatrixivNV: + */ + public static final int GL_TRACK_MATRIX_NV = 0x8648, + GL_TRACK_MATRIX_TRANSFORM_NV = 0x8649; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV = 0x862E, + GL_MAX_TRACK_MATRICES_NV = 0x862F, + GL_CURRENT_MATRIX_STACK_DEPTH_NV = 0x8640, + GL_CURRENT_MATRIX_NV = 0x8641, + GL_VERTEX_PROGRAM_BINDING_NV = 0x864A; + + /** + * Accepted by the &lt;matrix&gt; parameter of TrackMatrixNV: + */ + public static final int GL_MODELVIEW_PROJECTION_NV = 0x8629; + + /** + * Accepted by the &lt;matrix&gt; parameter of TrackMatrixNV and by the + * &lt;mode&gt; parameter of MatrixMode: + */ + public static final int GL_MATRIX0_NV = 0x8630, + GL_MATRIX1_NV = 0x8631, + GL_MATRIX2_NV = 0x8632, + GL_MATRIX3_NV = 0x8633, + GL_MATRIX4_NV = 0x8634, + GL_MATRIX5_NV = 0x8635, + GL_MATRIX6_NV = 0x8636, + GL_MATRIX7_NV = 0x8637; + + /** + * Accepted by the &lt;transform&gt; parameter of TrackMatrixNV: + */ + public static final int GL_IDENTITY_NV = 0x862A, + GL_INVERSE_NV = 0x862B, + GL_TRANSPOSE_NV = 0x862C, + GL_INVERSE_TRANSPOSE_NV = 0x862D; + + /** + * Accepted by the &lt;array&gt; parameter of EnableClientState and + * DisableClientState, by the &lt;cap&gt; parameter of IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + public static final int GL_VERTEX_ATTRIB_ARRAY0_NV = 0x8650, + GL_VERTEX_ATTRIB_ARRAY1_NV = 0x8651, + GL_VERTEX_ATTRIB_ARRAY2_NV = 0x8652, + GL_VERTEX_ATTRIB_ARRAY3_NV = 0x8653, + GL_VERTEX_ATTRIB_ARRAY4_NV = 0x8654, + GL_VERTEX_ATTRIB_ARRAY5_NV = 0x8655, + GL_VERTEX_ATTRIB_ARRAY6_NV = 0x8656, + GL_VERTEX_ATTRIB_ARRAY7_NV = 0x8657, + GL_VERTEX_ATTRIB_ARRAY8_NV = 0x8658, + GL_VERTEX_ATTRIB_ARRAY9_NV = 0x8659, + GL_VERTEX_ATTRIB_ARRAY10_NV = 0x865A, + GL_VERTEX_ATTRIB_ARRAY11_NV = 0x865B, + GL_VERTEX_ATTRIB_ARRAY12_NV = 0x865C, + GL_VERTEX_ATTRIB_ARRAY13_NV = 0x865D, + GL_VERTEX_ATTRIB_ARRAY14_NV = 0x865E, + GL_VERTEX_ATTRIB_ARRAY15_NV = 0x865F; + + /** + * Accepted by the &lt;target&gt; parameter of GetMapdv, GetMapfv, GetMapiv, + * Map1d and Map1f and by the &lt;cap&gt; parameter of Enable, Disable, and + * IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAP1_VERTEX_ATTRIB0_4_NV = 0x8660, + GL_MAP1_VERTEX_ATTRIB1_4_NV = 0x8661, + GL_MAP1_VERTEX_ATTRIB2_4_NV = 0x8662, + GL_MAP1_VERTEX_ATTRIB3_4_NV = 0x8663, + GL_MAP1_VERTEX_ATTRIB4_4_NV = 0x8664, + GL_MAP1_VERTEX_ATTRIB5_4_NV = 0x8665, + GL_MAP1_VERTEX_ATTRIB6_4_NV = 0x8666, + GL_MAP1_VERTEX_ATTRIB7_4_NV = 0x8667, + GL_MAP1_VERTEX_ATTRIB8_4_NV = 0x8668, + GL_MAP1_VERTEX_ATTRIB9_4_NV = 0x8669, + GL_MAP1_VERTEX_ATTRIB10_4_NV = 0x866A, + GL_MAP1_VERTEX_ATTRIB11_4_NV = 0x866B, + GL_MAP1_VERTEX_ATTRIB12_4_NV = 0x866C, + GL_MAP1_VERTEX_ATTRIB13_4_NV = 0x866D, + GL_MAP1_VERTEX_ATTRIB14_4_NV = 0x866E, + GL_MAP1_VERTEX_ATTRIB15_4_NV = 0x866F; + + /** + * Accepted by the &lt;target&gt; parameter of GetMapdv, GetMapfv, GetMapiv, + * Map2d and Map2f and by the &lt;cap&gt; parameter of Enable, Disable, and + * IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAP2_VERTEX_ATTRIB0_4_NV = 0x8670, + GL_MAP2_VERTEX_ATTRIB1_4_NV = 0x8671, + GL_MAP2_VERTEX_ATTRIB2_4_NV = 0x8672, + GL_MAP2_VERTEX_ATTRIB3_4_NV = 0x8673, + GL_MAP2_VERTEX_ATTRIB4_4_NV = 0x8674, + GL_MAP2_VERTEX_ATTRIB5_4_NV = 0x8675, + GL_MAP2_VERTEX_ATTRIB6_4_NV = 0x8676, + GL_MAP2_VERTEX_ATTRIB7_4_NV = 0x8677, + GL_MAP2_VERTEX_ATTRIB8_4_NV = 0x8678, + GL_MAP2_VERTEX_ATTRIB9_4_NV = 0x8679, + GL_MAP2_VERTEX_ATTRIB10_4_NV = 0x867A, + GL_MAP2_VERTEX_ATTRIB11_4_NV = 0x867B, + GL_MAP2_VERTEX_ATTRIB12_4_NV = 0x867C, + GL_MAP2_VERTEX_ATTRIB13_4_NV = 0x867D, + GL_MAP2_VERTEX_ATTRIB14_4_NV = 0x867E, + GL_MAP2_VERTEX_ATTRIB15_4_NV = 0x867F; + + private NVVertexProgram() {} + + public static void glExecuteProgramNV(int target, int id, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glExecuteProgramNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglExecuteProgramNV(target, id, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglExecuteProgramNV(int target, int id, long params, long function_pointer); + + public static void glGetProgramParameterNV(int target, int index, int parameterName, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramParameterfvNV(target, index, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramParameterfvNV(int target, int index, int parameterName, long params, long function_pointer); + + public static void glGetProgramParameterNV(int target, int index, int parameterName, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetProgramParameterdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetProgramParameterdvNV(target, index, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetProgramParameterdvNV(int target, int index, int parameterName, long params, long function_pointer); + + public static void glGetTrackMatrixNV(int target, int address, int parameterName, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetTrackMatrixivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetTrackMatrixivNV(target, address, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetTrackMatrixivNV(int target, int address, int parameterName, long params, long function_pointer); + + public static void glGetVertexAttribNV(int index, int parameterName, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribfvNV(index, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribfvNV(int index, int parameterName, long params, long function_pointer); + + public static void glGetVertexAttribNV(int index, int parameterName, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribdvNV(index, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribdvNV(int index, int parameterName, long params, long function_pointer); + + public static void glGetVertexAttribNV(int index, int parameterName, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribivNV(index, parameterName, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVertexAttribivNV(int index, int parameterName, long params, long function_pointer); + + public static ByteBuffer glGetVertexAttribPointerNV(int index, int parameterName, long result_size) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVertexAttribPointervNV; + BufferChecks.checkFunctionAddress(function_pointer); + ByteBuffer __result = nglGetVertexAttribPointervNV(index, parameterName, result_size, function_pointer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexAttribPointervNV(int index, int parameterName, long result_size, long function_pointer); + + public static void glProgramParameter4fNV(int target, int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameter4fNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramParameter4fNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramParameter4fNV(int target, int index, float x, float y, float z, float w, long function_pointer); + + public static void glProgramParameter4dNV(int target, int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameter4dNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglProgramParameter4dNV(target, index, x, y, z, w, function_pointer); + } + static native void nglProgramParameter4dNV(int target, int index, double x, double y, double z, double w, long function_pointer); + + public static void glProgramParameters4NV(int target, int index, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameters4fvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramParameters4fvNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramParameters4fvNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glProgramParameters4NV(int target, int index, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glProgramParameters4dvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(params); + nglProgramParameters4dvNV(target, index, params.remaining() >> 2, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglProgramParameters4dvNV(int target, int index, int params_count, long params, long function_pointer); + + public static void glTrackMatrixNV(int target, int address, int matrix, int transform) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glTrackMatrixNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglTrackMatrixNV(target, address, matrix, transform, function_pointer); + } + static native void nglTrackMatrixNV(int target, int address, int matrix, int transform, long function_pointer); + + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, DoubleBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerNV(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, FloatBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerNV(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, ByteBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerNV(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, IntBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerNV(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, ShortBuffer buffer) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOdisabled(caps); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getReferences(caps).glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointerNV(index, size, type, stride, MemoryUtil.getAddress(buffer), function_pointer); + } + static native void nglVertexAttribPointerNV(int index, int size, int type, int stride, long buffer, long function_pointer); + public static void glVertexAttribPointerNV(int index, int size, int type, int stride, long buffer_buffer_offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribPointerNV; + BufferChecks.checkFunctionAddress(function_pointer); + GLChecks.ensureArrayVBOenabled(caps); + nglVertexAttribPointerNVBO(index, size, type, stride, buffer_buffer_offset, function_pointer); + } + static native void nglVertexAttribPointerNVBO(int index, int size, int type, int stride, long buffer_buffer_offset, long function_pointer); + + public static void glVertexAttrib1sNV(int index, short x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1sNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1sNV(index, x, function_pointer); + } + static native void nglVertexAttrib1sNV(int index, short x, long function_pointer); + + public static void glVertexAttrib1fNV(int index, float x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1fNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1fNV(index, x, function_pointer); + } + static native void nglVertexAttrib1fNV(int index, float x, long function_pointer); + + public static void glVertexAttrib1dNV(int index, double x) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib1dNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib1dNV(index, x, function_pointer); + } + static native void nglVertexAttrib1dNV(int index, double x, long function_pointer); + + public static void glVertexAttrib2sNV(int index, short x, short y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2sNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2sNV(index, x, y, function_pointer); + } + static native void nglVertexAttrib2sNV(int index, short x, short y, long function_pointer); + + public static void glVertexAttrib2fNV(int index, float x, float y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2fNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2fNV(index, x, y, function_pointer); + } + static native void nglVertexAttrib2fNV(int index, float x, float y, long function_pointer); + + public static void glVertexAttrib2dNV(int index, double x, double y) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib2dNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib2dNV(index, x, y, function_pointer); + } + static native void nglVertexAttrib2dNV(int index, double x, double y, long function_pointer); + + public static void glVertexAttrib3sNV(int index, short x, short y, short z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3sNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3sNV(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3sNV(int index, short x, short y, short z, long function_pointer); + + public static void glVertexAttrib3fNV(int index, float x, float y, float z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3fNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3fNV(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3fNV(int index, float x, float y, float z, long function_pointer); + + public static void glVertexAttrib3dNV(int index, double x, double y, double z) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib3dNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib3dNV(index, x, y, z, function_pointer); + } + static native void nglVertexAttrib3dNV(int index, double x, double y, double z, long function_pointer); + + public static void glVertexAttrib4sNV(int index, short x, short y, short z, short w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4sNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4sNV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4sNV(int index, short x, short y, short z, short w, long function_pointer); + + public static void glVertexAttrib4fNV(int index, float x, float y, float z, float w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4fNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4fNV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4fNV(int index, float x, float y, float z, float w, long function_pointer); + + public static void glVertexAttrib4dNV(int index, double x, double y, double z, double w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4dNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4dNV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4dNV(int index, double x, double y, double z, double w, long function_pointer); + + public static void glVertexAttrib4ubNV(int index, byte x, byte y, byte z, byte w) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttrib4ubNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglVertexAttrib4ubNV(index, x, y, z, w, function_pointer); + } + static native void nglVertexAttrib4ubNV(int index, byte x, byte y, byte z, byte w, long function_pointer); + + public static void glVertexAttribs1NV(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs1svNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs1svNV(index, v.remaining(), MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs1svNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs1NV(int index, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs1fvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs1fvNV(index, v.remaining(), MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs1fvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs1NV(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs1dvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs1dvNV(index, v.remaining(), MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs1dvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs2NV(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs2svNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs2svNV(index, v.remaining() >> 1, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs2svNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs2NV(int index, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs2fvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs2fvNV(index, v.remaining() >> 1, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs2fvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs2NV(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs2dvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs2dvNV(index, v.remaining() >> 1, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs2dvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs3NV(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs3svNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs3svNV(index, v.remaining() / 3, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs3svNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs3NV(int index, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs3fvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs3fvNV(index, v.remaining() / 3, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs3fvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs3NV(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs3dvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs3dvNV(index, v.remaining() / 3, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs3dvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs4NV(int index, ShortBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs4svNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs4svNV(index, v.remaining() >> 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs4svNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs4NV(int index, FloatBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs4fvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs4fvNV(index, v.remaining() >> 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs4fvNV(int index, int v_n, long v, long function_pointer); + + public static void glVertexAttribs4NV(int index, DoubleBuffer v) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVertexAttribs4dvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkDirect(v); + nglVertexAttribs4dvNV(index, v.remaining() >> 2, MemoryUtil.getAddress(v), function_pointer); + } + static native void nglVertexAttribs4dvNV(int index, int v_n, long v, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram2Option.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram2Option.java new file mode 100644 index 0000000..a14c512 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram2Option.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexProgram2Option { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + public static final int GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = 0x88F4, + GL_MAX_PROGRAM_CALL_DEPTH_NV = 0x88F5; + + private NVVertexProgram2Option() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram3.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram3.java new file mode 100644 index 0000000..756074b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVertexProgram3.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVertexProgram3 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = 0x8B4C; + + private NVVertexProgram3() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVideoCapture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVideoCapture.java new file mode 100644 index 0000000..e166562 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVVideoCapture.java @@ -0,0 +1,245 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVVideoCapture { + + /** + * Accepted by the &lt;target&gt; parameters of BindBufferARB, BufferDataARB, + * BufferSubDataARB, MapBufferARB, UnmapBufferARB, GetBufferSubDataARB, + * GetBufferParameterivARB, and GetBufferPointervARB: + */ + public static final int GL_VIDEO_BUFFER_NV = 0x9020; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_VIDEO_BUFFER_BINDING_NV = 0x9021; + + /** + * Accepted by the &lt;frame_region&gt; parameter of + * BindVideoCaptureStreamBufferNV, and BindVideoCaptureStreamTextureNV: + */ + public static final int GL_FIELD_UPPER_NV = 0x9022, + GL_FIELD_LOWER_NV = 0x9023; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVideoCaptureivNV: + */ + public static final int GL_NUM_VIDEO_CAPTURE_STREAMS_NV = 0x9024, + GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV = 0x9025; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetVideoCaptureStream{i,f,d}vNV: + */ + public static final int GL_LAST_VIDEO_CAPTURE_STATUS_NV = 0x9027, + GL_VIDEO_BUFFER_PITCH_NV = 0x9028, + GL_VIDEO_CAPTURE_FRAME_WIDTH_NV = 0x9038, + GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV = 0x9039, + GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV = 0x903A, + GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV = 0x903B, + GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV = 0x9026; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetVideoCaptureStream{i,f,d}vNV and as the &lt;pname&gt; parameter of + * VideoCaptureStreamParameter{i,f,d}vNV: + */ + public static final int GL_VIDEO_COLOR_CONVERSION_MATRIX_NV = 0x9029, + GL_VIDEO_COLOR_CONVERSION_MAX_NV = 0x902A, + GL_VIDEO_COLOR_CONVERSION_MIN_NV = 0x902B, + GL_VIDEO_COLOR_CONVERSION_OFFSET_NV = 0x902C, + GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV = 0x902D, + GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV = 0x903C; + + /** + * Returned by VideoCaptureNV: + */ + public static final int GL_PARTIAL_SUCCESS_NV = 0x902E; + + /** + * Returned by VideoCaptureNV and GetVideoCaptureStream{i,f,d}vNV + * when &lt;pname&gt; is LAST_VIDEO_CAPTURE_STATUS_NV: + */ + public static final int GL_SUCCESS_NV = 0x902F, + GL_FAILURE_NV = 0x9030; + + /** + * Accepted in the &lt;params&gt; parameter of + * VideoCaptureStreamParameter{i,f,d}vNV when &lt;pname&gt; is + * VIDEO_BUFFER_INTERNAL_FORMAT_NV and returned by + * GetVideoCaptureStream{i,f,d}vNV when &lt;pname&gt; is + * VIDEO_BUFFER_INTERNAL_FORMAT_NV: + */ + public static final int GL_YCBYCR8_422_NV = 0x9031, + GL_YCBAYCR8A_4224_NV = 0x9032, + GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV = 0x9033, + GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV = 0x9034, + GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV = 0x9035, + GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV = 0x9036, + GL_Z4Y12Z4CB12Z4CR12_444_NV = 0x9037; + + /** + * Accepted by the &lt;attribute&gt; parameter of NVPresentVideoUtil.glQueryContextNV: + */ + public static final int GL_NUM_VIDEO_CAPTURE_SLOTS_NV = 0x20CF; + + /** + * Accepted by the &lt;attribute&gt; parameter of + * glQueryVideoCaptureDeviceNV: + */ + public static final int GL_UNIQUE_ID_NV = 0x20CE; + + private NVVideoCapture() {} + + public static void glBeginVideoCaptureNV(int video_capture_slot) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBeginVideoCaptureNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBeginVideoCaptureNV(video_capture_slot, function_pointer); + } + static native void nglBeginVideoCaptureNV(int video_capture_slot, long function_pointer); + + public static void glBindVideoCaptureStreamBufferNV(int video_capture_slot, int stream, int frame_region, long offset) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVideoCaptureStreamBufferNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset, function_pointer); + } + static native void nglBindVideoCaptureStreamBufferNV(int video_capture_slot, int stream, int frame_region, long offset, long function_pointer); + + public static void glBindVideoCaptureStreamTextureNV(int video_capture_slot, int stream, int frame_region, int target, int texture) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glBindVideoCaptureStreamTextureNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglBindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture, function_pointer); + } + static native void nglBindVideoCaptureStreamTextureNV(int video_capture_slot, int stream, int frame_region, int target, int texture, long function_pointer); + + public static void glEndVideoCaptureNV(int video_capture_slot) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glEndVideoCaptureNV; + BufferChecks.checkFunctionAddress(function_pointer); + nglEndVideoCaptureNV(video_capture_slot, function_pointer); + } + static native void nglEndVideoCaptureNV(int video_capture_slot, long function_pointer); + + public static void glGetVideoCaptureNV(int video_capture_slot, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoCaptureivNV(video_capture_slot, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoCaptureivNV(int video_capture_slot, int pname, long params, long function_pointer); + + /** Overloads glGetVideoCaptureivNV. */ + public static int glGetVideoCaptureiNV(int video_capture_slot, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetVideoCaptureivNV(video_capture_slot, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideoCaptureStreamNV(int video_capture_slot, int stream, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoCaptureStreamivNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); + + /** Overloads glGetVideoCaptureStreamivNV. */ + public static int glGetVideoCaptureStreamiNV(int video_capture_slot, int stream, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamivNV; + BufferChecks.checkFunctionAddress(function_pointer); + IntBuffer params = APIUtil.getBufferInt(caps); + nglGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideoCaptureStreamNV(int video_capture_slot, int stream, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoCaptureStreamfvNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); + + /** Overloads glGetVideoCaptureStreamfvNV. */ + public static float glGetVideoCaptureStreamfNV(int video_capture_slot, int stream, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + FloatBuffer params = APIUtil.getBufferFloat(caps); + nglGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static void glGetVideoCaptureStreamNV(int video_capture_slot, int stream, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 1); + nglGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglGetVideoCaptureStreamdvNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); + + /** Overloads glGetVideoCaptureStreamdvNV. */ + public static double glGetVideoCaptureStreamdNV(int video_capture_slot, int stream, int pname) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glGetVideoCaptureStreamdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + DoubleBuffer params = APIUtil.getBufferDouble(caps); + nglGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + return params.get(0); + } + + public static int glVideoCaptureNV(int video_capture_slot, IntBuffer sequence_num, LongBuffer capture_time) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVideoCaptureNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(sequence_num, 1); + BufferChecks.checkBuffer(capture_time, 1); + int __result = nglVideoCaptureNV(video_capture_slot, MemoryUtil.getAddress(sequence_num), MemoryUtil.getAddress(capture_time), function_pointer); + return __result; + } + static native int nglVideoCaptureNV(int video_capture_slot, long sequence_num, long capture_time, long function_pointer); + + public static void glVideoCaptureStreamParameterNV(int video_capture_slot, int stream, int pname, IntBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVideoCaptureStreamParameterivNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglVideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglVideoCaptureStreamParameterivNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); + + public static void glVideoCaptureStreamParameterNV(int video_capture_slot, int stream, int pname, FloatBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVideoCaptureStreamParameterfvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglVideoCaptureStreamParameterfvNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); + + public static void glVideoCaptureStreamParameterNV(int video_capture_slot, int stream, int pname, DoubleBuffer params) { + ContextCapabilities caps = GLContext.getCapabilities(); + long function_pointer = caps.glVideoCaptureStreamParameterdvNV; + BufferChecks.checkFunctionAddress(function_pointer); + BufferChecks.checkBuffer(params, 16); + nglVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, MemoryUtil.getAddress(params), function_pointer); + } + static native void nglVideoCaptureStreamParameterdvNV(int video_capture_slot, int stream, int pname, long params, long function_pointer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVXGpuMemoryInfo.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVXGpuMemoryInfo.java new file mode 100644 index 0000000..0f5169b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/NVXGpuMemoryInfo.java @@ -0,0 +1,23 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +/** + * Experimental extension, may be removed/changed in the future. + */ +public final class NVXGpuMemoryInfo { + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv: + */ + public static final int GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = 0x9047, + GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = 0x9048, + GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = 0x9049, + GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX = 0x904A, + GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX = 0x904B; + + private NVXGpuMemoryInfo() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/References.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/References.java new file mode 100644 index 0000000..56f936a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/References.java @@ -0,0 +1,51 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +class References extends BaseReferences { + References(ContextCapabilities caps) { + super(caps); + } + java.nio.Buffer ARB_matrix_palette_glMatrixIndexPointerARB_pPointer; + java.nio.Buffer ARB_vertex_blend_glWeightPointerARB_pPointer; + java.nio.Buffer EXT_fog_coord_glFogCoordPointerEXT_data; + java.nio.Buffer EXT_secondary_color_glSecondaryColorPointerEXT_pPointer; + java.nio.Buffer EXT_vertex_shader_glVariantPointerEXT_pAddr; + java.nio.Buffer EXT_vertex_weighting_glVertexWeightPointerEXT_pPointer; + java.nio.Buffer GL11_glColorPointer_pointer; + java.nio.Buffer GL11_glEdgeFlagPointer_pointer; + java.nio.Buffer GL11_glNormalPointer_pointer; + java.nio.Buffer GL11_glVertexPointer_pointer; + java.nio.Buffer GL14_glFogCoordPointer_data; + + void copy(References references, int mask) { + super.copy(references, mask); + if ( (mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0 ) { + this.ARB_matrix_palette_glMatrixIndexPointerARB_pPointer = references.ARB_matrix_palette_glMatrixIndexPointerARB_pPointer; + this.ARB_vertex_blend_glWeightPointerARB_pPointer = references.ARB_vertex_blend_glWeightPointerARB_pPointer; + this.EXT_fog_coord_glFogCoordPointerEXT_data = references.EXT_fog_coord_glFogCoordPointerEXT_data; + this.EXT_secondary_color_glSecondaryColorPointerEXT_pPointer = references.EXT_secondary_color_glSecondaryColorPointerEXT_pPointer; + this.EXT_vertex_shader_glVariantPointerEXT_pAddr = references.EXT_vertex_shader_glVariantPointerEXT_pAddr; + this.EXT_vertex_weighting_glVertexWeightPointerEXT_pPointer = references.EXT_vertex_weighting_glVertexWeightPointerEXT_pPointer; + this.GL11_glColorPointer_pointer = references.GL11_glColorPointer_pointer; + this.GL11_glEdgeFlagPointer_pointer = references.GL11_glEdgeFlagPointer_pointer; + this.GL11_glNormalPointer_pointer = references.GL11_glNormalPointer_pointer; + this.GL11_glVertexPointer_pointer = references.GL11_glVertexPointer_pointer; + this.GL14_glFogCoordPointer_data = references.GL14_glFogCoordPointer_data; + } + } + void clear() { + super.clear(); + this.ARB_matrix_palette_glMatrixIndexPointerARB_pPointer = null; + this.ARB_vertex_blend_glWeightPointerARB_pPointer = null; + this.EXT_fog_coord_glFogCoordPointerEXT_data = null; + this.EXT_secondary_color_glSecondaryColorPointerEXT_pPointer = null; + this.EXT_vertex_shader_glVariantPointerEXT_pAddr = null; + this.EXT_vertex_weighting_glVertexWeightPointerEXT_pPointer = null; + this.GL11_glColorPointer_pointer = null; + this.GL11_glEdgeFlagPointer_pointer = null; + this.GL11_glNormalPointer_pointer = null; + this.GL11_glVertexPointer_pointer = null; + this.GL14_glFogCoordPointer_data = null; + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISGenerateMipmap.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISGenerateMipmap.java new file mode 100644 index 0000000..e1f13c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISGenerateMipmap.java @@ -0,0 +1,23 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class SGISGenerateMipmap { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. + */ + public static final int GL_GENERATE_MIPMAP_SGIS = 0x8191; + + /** + * Accepted by the &lt;target&gt; parameter of Hint, and by the <pname> + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + public static final int GL_GENERATE_MIPMAP_HINT_SGIS = 0x8192; + + private SGISGenerateMipmap() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISTextureLOD.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISTextureLOD.java new file mode 100644 index 0000000..72efc25 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SGISTextureLOD.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class SGISTextureLOD { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. + */ + public static final int GL_TEXTURE_MIN_LOD_SGIS = 0x813A, + GL_TEXTURE_MAX_LOD_SGIS = 0x813B, + GL_TEXTURE_BASE_LEVEL_SGIS = 0x813C, + GL_TEXTURE_MAX_LEVEL_SGIS = 0x813D; + + private SGISTextureLOD() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SUNSliceAccum.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SUNSliceAccum.java new file mode 100644 index 0000000..aa039e9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengl/SUNSliceAccum.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengl; + +import org.lwjgl.*; +import java.nio.*; + +public final class SUNSliceAccum { + + /** + * Accepted by the &lt;op&gt; parameter of Accum, + */ + public static final int GL_SLICE_ACCUM_SUN = 0x85CC; + + private SUNSliceAccum() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressed3DCTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressed3DCTexture.java new file mode 100644 index 0000000..7823eaa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressed3DCTexture.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDCompressed3DCTexture { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of CompressedTexImage2D and + * CompressedTexImage3DOES: + */ + public static final int GL_3DC_X_AMD = 0x87F9, + GL_3DC_XY_AMD = 0x87FA; + + private AMDCompressed3DCTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressedATCTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressedATCTexture.java new file mode 100644 index 0000000..a99f92f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDCompressedATCTexture.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDCompressedATCTexture { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D and + * CompressedTexImage3DOES. + */ + public static final int GL_ATC_RGB_AMD = 0x8C92, + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD = 0x8C93, + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD = 0x87EE; + + private AMDCompressedATCTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDPerformanceMonitor.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDPerformanceMonitor.java new file mode 100644 index 0000000..80cea55 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDPerformanceMonitor.java @@ -0,0 +1,149 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDPerformanceMonitor { + + /** + * Accepted by the &lt;pame&gt; parameter of GetPerfMonitorCounterInfoAMD + */ + public static final int GL_COUNTER_TYPE_AMD = 0x8BC0, + GL_COUNTER_RANGE_AMD = 0x8BC1; + + /** + * Returned as a valid value in &lt;data&gt; parameter of + * GetPerfMonitorCounterInfoAMD if &lt;pname&gt; = COUNTER_TYPE_AMD + */ + public static final int GL_UNSIGNED_INT64_AMD = 0x8BC2, + GL_PERCENTAGE_AMD = 0x8BC3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPerfMonitorCounterDataAMD + */ + public static final int GL_PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4, + GL_PERFMON_RESULT_SIZE_AMD = 0x8BC5, + GL_PERFMON_RESULT_AMD = 0x8BC6; + + private AMDPerformanceMonitor() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGetPerfMonitorGroupsAMD(IntBuffer numGroups, IntBuffer groups) { + if (numGroups != null) + BufferChecks.checkBuffer(numGroups, 1); + BufferChecks.checkDirect(groups); + nglGetPerfMonitorGroupsAMD(MemoryUtil.getAddressSafe(numGroups), groups.remaining(), MemoryUtil.getAddress(groups)); + } + static native void nglGetPerfMonitorGroupsAMD(long numGroups, int groups_groupsSize, long groups); + + public static void glGetPerfMonitorCountersAMD(int group, IntBuffer numCounters, IntBuffer maxActiveCounters, IntBuffer counters) { + BufferChecks.checkBuffer(numCounters, 1); + BufferChecks.checkBuffer(maxActiveCounters, 1); + BufferChecks.checkDirect(counters); + nglGetPerfMonitorCountersAMD(group, MemoryUtil.getAddress(numCounters), MemoryUtil.getAddress(maxActiveCounters), counters.remaining(), MemoryUtil.getAddress(counters)); + } + static native void nglGetPerfMonitorCountersAMD(int group, long numCounters, long maxActiveCounters, int counters_countersSize, long counters); + + public static void glGetPerfMonitorGroupStringAMD(int group, IntBuffer length, ByteBuffer groupString) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(groupString); + nglGetPerfMonitorGroupStringAMD(group, groupString.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(groupString)); + } + static native void nglGetPerfMonitorGroupStringAMD(int group, int groupString_bufSize, long length, long groupString); + + /** Overloads glGetPerfMonitorGroupStringAMD. */ + public static String glGetPerfMonitorGroupStringAMD(int group, int bufSize) { + IntBuffer groupString_length = APIUtil.getLengths(); + ByteBuffer groupString = APIUtil.getBufferByte(bufSize); + nglGetPerfMonitorGroupStringAMD(group, bufSize, MemoryUtil.getAddress0(groupString_length), MemoryUtil.getAddress(groupString)); + groupString.limit(groupString_length.get(0)); + return APIUtil.getString(groupString); + } + + public static void glGetPerfMonitorCounterStringAMD(int group, int counter, IntBuffer length, ByteBuffer counterString) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(counterString); + nglGetPerfMonitorCounterStringAMD(group, counter, counterString.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(counterString)); + } + static native void nglGetPerfMonitorCounterStringAMD(int group, int counter, int counterString_bufSize, long length, long counterString); + + /** Overloads glGetPerfMonitorCounterStringAMD. */ + public static String glGetPerfMonitorCounterStringAMD(int group, int counter, int bufSize) { + IntBuffer counterString_length = APIUtil.getLengths(); + ByteBuffer counterString = APIUtil.getBufferByte(bufSize); + nglGetPerfMonitorCounterStringAMD(group, counter, bufSize, MemoryUtil.getAddress0(counterString_length), MemoryUtil.getAddress(counterString)); + counterString.limit(counterString_length.get(0)); + return APIUtil.getString(counterString); + } + + public static void glGetPerfMonitorCounterInfoAMD(int group, int counter, int pname, ByteBuffer data) { + BufferChecks.checkBuffer(data, 16); + nglGetPerfMonitorCounterInfoAMD(group, counter, pname, MemoryUtil.getAddress(data)); + } + static native void nglGetPerfMonitorCounterInfoAMD(int group, int counter, int pname, long data); + + public static void glGenPerfMonitorsAMD(IntBuffer monitors) { + BufferChecks.checkDirect(monitors); + nglGenPerfMonitorsAMD(monitors.remaining(), MemoryUtil.getAddress(monitors)); + } + static native void nglGenPerfMonitorsAMD(int monitors_n, long monitors); + + /** Overloads glGenPerfMonitorsAMD. */ + public static int glGenPerfMonitorsAMD() { + IntBuffer monitors = APIUtil.getBufferInt(); + nglGenPerfMonitorsAMD(1, MemoryUtil.getAddress(monitors)); + return monitors.get(0); + } + + public static void glDeletePerfMonitorsAMD(IntBuffer monitors) { + BufferChecks.checkDirect(monitors); + nglDeletePerfMonitorsAMD(monitors.remaining(), MemoryUtil.getAddress(monitors)); + } + static native void nglDeletePerfMonitorsAMD(int monitors_n, long monitors); + + /** Overloads glDeletePerfMonitorsAMD. */ + public static void glDeletePerfMonitorsAMD(int monitor) { + nglDeletePerfMonitorsAMD(1, APIUtil.getInt(monitor)); + } + + public static void glSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, IntBuffer counterList) { + BufferChecks.checkDirect(counterList); + nglSelectPerfMonitorCountersAMD(monitor, enable, group, counterList.remaining(), MemoryUtil.getAddress(counterList)); + } + static native void nglSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, int counterList_numCounters, long counterList); + + /** Overloads glSelectPerfMonitorCountersAMD. */ + public static void glSelectPerfMonitorCountersAMD(int monitor, boolean enable, int group, int counter) { + nglSelectPerfMonitorCountersAMD(monitor, enable, group, 1, APIUtil.getInt(counter)); + } + + public static void glBeginPerfMonitorAMD(int monitor) { + nglBeginPerfMonitorAMD(monitor); + } + static native void nglBeginPerfMonitorAMD(int monitor); + + public static void glEndPerfMonitorAMD(int monitor) { + nglEndPerfMonitorAMD(monitor); + } + static native void nglEndPerfMonitorAMD(int monitor); + + public static void glGetPerfMonitorCounterDataAMD(int monitor, int pname, IntBuffer data, IntBuffer bytesWritten) { + BufferChecks.checkDirect(data); + if (bytesWritten != null) + BufferChecks.checkBuffer(bytesWritten, 1); + nglGetPerfMonitorCounterDataAMD(monitor, pname, data.remaining(), MemoryUtil.getAddress(data), MemoryUtil.getAddressSafe(bytesWritten)); + } + static native void nglGetPerfMonitorCounterDataAMD(int monitor, int pname, int data_dataSize, long data, long bytesWritten); + + /** Overloads glGetPerfMonitorCounterDataAMD. */ + public static int glGetPerfMonitorCounterDataAMD(int monitor, int pname) { + IntBuffer data = APIUtil.getBufferInt(); + nglGetPerfMonitorCounterDataAMD(monitor, pname, 4, MemoryUtil.getAddress(data), 0L); + return data.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDProgramBinaryZ400.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDProgramBinaryZ400.java new file mode 100644 index 0000000..c047eca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/AMDProgramBinaryZ400.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class AMDProgramBinaryZ400 { + + /** + * Accepted by the &lt;binaryFormat&gt; parameter of ProgramBinaryOES: + */ + public static final int GL_Z400_BINARY_AMD = 0x8740; + + private AMDProgramBinaryZ400() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferBlit.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferBlit.java new file mode 100644 index 0000000..98e984e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferBlit.java @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ANGLEFramebufferBlit { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_READ_FRAMEBUFFER_ANGLE = 0x8CA8, + GL_DRAW_FRAMEBUFFER_ANGLE = 0x8CA9; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv and GetFloatv: + */ + public static final int GL_DRAW_FRAMEBUFFER_BINDING_ANGLE = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING_ANGLE = 0x8CAA; + + private ANGLEFramebufferBlit() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + nglBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + static native void nglBlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferMultisample.java new file mode 100644 index 0000000..ed214a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ANGLEFramebufferMultisample.java @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ANGLEFramebufferMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_SAMPLES_ANGLE = 0x8CAB; + + /** + * Returned by CheckFramebufferStatus: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_SAMPLES_ANGLE = 0x8D57; + + private ANGLEFramebufferMultisample() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glRenderbufferStorageMultisampleANGLE(int target, int samples, int internalformat, int width, int height) { + nglRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); + } + static native void nglRenderbufferStorageMultisampleANGLE(int target, int samples, int internalformat, int width, int height); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLEFramebufferMultisample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLEFramebufferMultisample.java new file mode 100644 index 0000000..7b19cf3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLEFramebufferMultisample.java @@ -0,0 +1,54 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLEFramebufferMultisample { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_SAMPLES_APPLE = 0x8CAB; + + /** + * Returned by CheckFramebufferStatus: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_MAX_SAMPLES_APPLE = 0x8D57; + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture2D, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + public static final int GL_READ_FRAMEBUFFER_APPLE = 0x8CA8, + GL_DRAW_FRAMEBUFFER_APPLE = 0x8CA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_DRAW_FRAMEBUFFER_BINDING_APPLE = 0x8CA6, + GL_READ_FRAMEBUFFER_BINDING_APPLE = 0x8CAA; + + private APPLEFramebufferMultisample() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glRenderbufferStorageMultisampleAPPLE(int target, int samples, int internalformat, int width, int height) { + nglRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); + } + static native void nglRenderbufferStorageMultisampleAPPLE(int target, int samples, int internalformat, int width, int height); + + public static void glResolveMultisampleFramebufferAPPLE() { + nglResolveMultisampleFramebufferAPPLE(); + } + static native void nglResolveMultisampleFramebufferAPPLE(); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLERgb422.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLERgb422.java new file mode 100644 index 0000000..4b54b99 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLERgb422.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLERgb422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + public static final int GL_RGB_422_APPLE = 0x8A1F; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + public static final int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA, + GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + + private APPLERgb422() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLESync.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLESync.java new file mode 100644 index 0000000..494ecf4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLESync.java @@ -0,0 +1,122 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLESync { + + /** + * Accepted as the &lt;pname&gt; parameter of GetInteger64vAPPLE: + */ + public static final int GL_MAX_SERVER_WAIT_TIMEOUT_APPLE = 0x9111; + + /** + * Accepted as the &lt;pname&gt; parameter of GetSyncivAPPLE: + */ + public static final int GL_OBJECT_TYPE_APPLE = 0x9112, + SYNC_CONDITION_APPLE = 0x9113, + SYNC_STATUS_APPLE = 0x9114, + SYNC_FLAGS_APPLE = 0x9115; + + /** + * Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE_APPLE: + */ + public static final int GL_SYNC_FENCE_APPLE = 0x9116; + + /** + * Returned in &lt;values&gt; for GetSyncivAPPLE &lt;pname&gt; SYNC_CONDITION_APPLE: + */ + public static final int GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE = 0x9117; + + /** + * Returned in &lt;values&gt; for GetSyncivAPPLE &lt;pname&gt; SYNC_STATUS_APPLE: + */ + public static final int GL_UNSIGNALED_APPLE = 0x9118, + SIGNALED_APPLE = 0x9119; + + /** + * Accepted in the &lt;flags&gt; parameter of ClientWaitSyncAPPLE: + */ + public static final int GL_SYNC_FLUSH_COMMANDS_BIT_APPLE = 0x1; + + /** + * Accepted in the &lt;timeout&gt; parameter of WaitSyncAPPLE: + */ + public static final long GL_TIMEOUT_IGNORED_APPLE = 0xFFFFFFFFFFFFFFFFL; + + /** + * Returned by ClientWaitSyncAPPLE: + */ + public static final int GL_ALREADY_SIGNALED_APPLE = 0x911A, + TIMEOUT_EXPIRED_APPLE = 0x911B, + CONDITION_SATISFIED_APPLE = 0x911C, + WAIT_FAILED_APPLE = 0x911D; + + /** + * Accepted by the &lt;type&gt; parameter of LabelObjectEXT and + * GetObjectLabelEXT: + */ + public static final int GL_SYNC_OBJECT_APPLE = 0x8A53; + + private APPLESync() {} + + static native void initNativeStubs() throws LWJGLException; + + public static GLSync glFenceSyncAPPLE(int condition, int flags) { + GLSync __result = new GLSync(nglFenceSyncAPPLE(condition, flags)); + return __result; + } + static native long nglFenceSyncAPPLE(int condition, int flags); + + public static boolean glIsSyncAPPLE(GLSync sync) { + boolean __result = nglIsSyncAPPLE(sync.getPointer()); + return __result; + } + static native boolean nglIsSyncAPPLE(long sync); + + public static void glDeleteSyncAPPLE(GLSync sync) { + nglDeleteSyncAPPLE(sync.getPointer()); + } + static native void nglDeleteSyncAPPLE(long sync); + + public static int glClientWaitSyncAPPLE(GLSync sync, int flags, long timeout) { + int __result = nglClientWaitSyncAPPLE(sync.getPointer(), flags, timeout); + return __result; + } + static native int nglClientWaitSyncAPPLE(long sync, int flags, long timeout); + + public static void glWaitSyncAPPLE(GLSync sync, int flags, long timeout) { + nglWaitSyncAPPLE(sync.getPointer(), flags, timeout); + } + static native void nglWaitSyncAPPLE(long sync, int flags, long timeout); + + public static void glGetInteger64APPLE(int pname, LongBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetInteger64vAPPLE(pname, MemoryUtil.getAddress(params)); + } + static native void nglGetInteger64vAPPLE(int pname, long params); + + /** Overloads glGetInteger64vAPPLE. */ + public static long glGetInteger64APPLE(int pname) { + LongBuffer params = APIUtil.getBufferLong(); + nglGetInteger64vAPPLE(pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetSyncAPPLE(GLSync sync, int pname, IntBuffer length, IntBuffer values) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(values); + nglGetSyncivAPPLE(sync.getPointer(), pname, values.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(values)); + } + static native void nglGetSyncivAPPLE(long sync, int pname, int values_bufSize, long length, long values); + + /** Overloads glGetSyncivAPPLE. */ + public static int glGetSynciAPPLE(GLSync sync, int pname) { + IntBuffer values = APIUtil.getBufferInt(); + nglGetSyncivAPPLE(sync.getPointer(), pname, 1, 0L, MemoryUtil.getAddress(values)); + return values.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureFormatBGRA8888.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureFormatBGRA8888.java new file mode 100644 index 0000000..0366de6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureFormatBGRA8888.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLETextureFormatBGRA8888 { + + /** + * Accepted by the &lt;format&gt; parameters of TexImage2D and TexSubImage2D: + */ + public static final int GL_BGRA_EXT = 0x80E1; + + private APPLETextureFormatBGRA8888() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureMaxLevel.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureMaxLevel.java new file mode 100644 index 0000000..24f8bf9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/APPLETextureMaxLevel.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class APPLETextureMaxLevel { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv: + */ + public static final int GL_TEXTURE_MAX_LEVEL_APPLE = 0x813D; + + private APPLETextureMaxLevel() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBDrawBuffers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBDrawBuffers.java new file mode 100644 index 0000000..629f612 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBDrawBuffers.java @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBDrawBuffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv: + */ + public static final int GL_MAX_DRAW_BUFFERS_ARB = 0x8824, + GL_DRAW_BUFFER0_ARB = 0x8825, + GL_DRAW_BUFFER1_ARB = 0x8826, + GL_DRAW_BUFFER2_ARB = 0x8827, + GL_DRAW_BUFFER3_ARB = 0x8828, + GL_DRAW_BUFFER4_ARB = 0x8829, + GL_DRAW_BUFFER5_ARB = 0x882A, + GL_DRAW_BUFFER6_ARB = 0x882B, + GL_DRAW_BUFFER7_ARB = 0x882C, + GL_DRAW_BUFFER8_ARB = 0x882D, + GL_DRAW_BUFFER9_ARB = 0x882E, + GL_DRAW_BUFFER10_ARB = 0x882F, + GL_DRAW_BUFFER11_ARB = 0x8830, + GL_DRAW_BUFFER12_ARB = 0x8831, + GL_DRAW_BUFFER13_ARB = 0x8832, + GL_DRAW_BUFFER14_ARB = 0x8833, + GL_DRAW_BUFFER15_ARB = 0x8834; + + private ARBDrawBuffers() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glDrawBuffersARB(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nglDrawBuffersARB(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nglDrawBuffersARB(int buffers_size, long buffers); + + /** Overloads glDrawBuffersARB. */ + public static void glDrawBuffersARB(int buffer) { + nglDrawBuffersARB(1, APIUtil.getInt(buffer)); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBHalfFloatPixel.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBHalfFloatPixel.java new file mode 100644 index 0000000..fcc2868 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBHalfFloatPixel.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBHalfFloatPixel { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D: + */ + public static final int GL_HALF_FLOAT_ARB = 0x140B; + + private ARBHalfFloatPixel() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBTextureRectangle.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBTextureRectangle.java new file mode 100644 index 0000000..d0a84a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARBTextureRectangle.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARBTextureRectangle { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + * GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + * TexParameterfv and TexParameteriv: + * Accepted by the &lt;target&gt; parameter of GetTexImage, + * GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + * CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + public static final int GL_TEXTURE_RECTANGLE_ARB = 0x84F5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv and GetDoublev: + */ + public static final int GL_TEXTURE_BINDING_RECTANGLE_ARB = 0x84F6; + + /** + * Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + * GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + public static final int GL_PROXY_TEXTURE_RECTANGLE_ARB = 0x84F7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + public static final int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = 0x84F8; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + public static final int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + public static final int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + private ARBTextureRectangle() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMMaliShaderBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMMaliShaderBinary.java new file mode 100644 index 0000000..4437657 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMMaliShaderBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARMMaliShaderBinary { + + /** + * Accepted by the &lt;binaryFormat&gt; parameter of ShaderBinary: + */ + public static final int GL_MALI_SHADER_BINARY_ARM = 0x8F60; + + private ARMMaliShaderBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMRgba8.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMRgba8.java new file mode 100644 index 0000000..c2f36a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ARMRgba8.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class ARMRgba8 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage: + */ + public static final int GL_RGBA8_OES = 0x8058; + + private ARMRgba8() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ContextCapabilities.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ContextCapabilities.java new file mode 100644 index 0000000..75f7ad5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/ContextCapabilities.java @@ -0,0 +1,361 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import java.util.Set; +import java.util.HashSet; + +public class ContextCapabilities { + static final boolean DEBUG = false; + + private static boolean loaded_stubs; + public final boolean GL_AMD_compressed_3DC_texture; + public final boolean GL_AMD_compressed_ATC_texture; + public final boolean GL_AMD_performance_monitor; + public final boolean GL_AMD_program_binary_Z400; + public final boolean GL_ANGLE_framebuffer_blit; + public final boolean GL_ANGLE_framebuffer_multisample; + public final boolean GL_APPLE_framebuffer_multisample; + public final boolean GL_APPLE_rgb_422; + public final boolean GL_APPLE_sync; + public final boolean GL_APPLE_texture_format_BGRA8888; + public final boolean GL_APPLE_texture_max_level; + public final boolean GL_ARB_draw_buffers; + public final boolean GL_ARB_half_float_pixel; + public final boolean GL_ARB_texture_rectangle; + public final boolean GL_ARM_mali_shader_binary; + public final boolean GL_ARM_rgba8; + public final boolean GL_DMP_shader_binary; + public final boolean GL_EXT_Cg_shader; + public final boolean GL_EXT_bgra; + public final boolean GL_EXT_blend_minmax; + public final boolean GL_EXT_color_buffer_half_float; + public final boolean GL_EXT_copy_texture_levels; + public final boolean GL_EXT_debug_label; + public final boolean GL_EXT_debug_marker; + public final boolean GL_EXT_discard_framebuffer; + public final boolean GL_EXT_frag_depth; + public final boolean GL_EXT_map_buffer_range; + public final boolean GL_EXT_multi_draw_arrays; + public final boolean GL_EXT_multisampled_render_to_texture; + public final boolean GL_EXT_multiview_draw_buffers; + public final boolean GL_EXT_occlusion_query_boolean; + public final boolean GL_EXT_packed_float; + public final boolean GL_EXT_read_format_bgra; + public final boolean GL_EXT_robustness; + public final boolean GL_EXT_sRGB; + public final boolean GL_EXT_separate_shader_objects; + public final boolean GL_EXT_shader_framebuffer_fetch; + public final boolean GL_EXT_shader_texture_lod; + public final boolean GL_EXT_shadow_samplers; + public final boolean GL_EXT_texture_array; + public final boolean GL_EXT_texture_compression_dxt1; + public final boolean GL_EXT_texture_compression_latc; + public final boolean GL_EXT_texture_compression_s3tc; + public final boolean GL_EXT_texture_filter_anisotropic; + public final boolean GL_EXT_texture_format_BGRA8888; + public final boolean GL_EXT_texture_lod_bias; + public final boolean GL_EXT_texture_rg; + public final boolean GL_EXT_texture_storage; + public final boolean GL_EXT_texture_type_2_10_10_10_REV; + public final boolean GL_EXT_unpack_subimage; + public final boolean OpenGLES20; + public final boolean OpenGLES30; + public final boolean GL_IMG_multisampled_render_to_texture; + public final boolean GL_IMG_program_binary; + public final boolean GL_IMG_read_format; + public final boolean GL_IMG_shader_binary; + public final boolean GL_IMG_texture_compression_pvrtc; + public final boolean GL_KHR_debug; + public final boolean GL_KHR_texture_compression_astc_ldr; + public final boolean GL_NV_EGL_stream_consumer_external; + public final boolean GL_NV_coverage_sample; + public final boolean GL_NV_depth_nonlinear; + public final boolean GL_NV_draw_buffers; + public final boolean GL_NV_draw_path; + public final boolean GL_NV_draw_texture; + public final boolean GL_NV_fbo_color_attachments; + public final boolean GL_NV_fence; + public final boolean GL_NV_framebuffer_vertex_attrib_array; + public final boolean GL_NV_get_tex_image; + public final boolean GL_NV_platform_binary; + public final boolean GL_NV_read_buffer; + public final boolean GL_NV_read_depth_stencil; + public final boolean GL_NV_shader_framebuffer_fetch; + public final boolean GL_NV_system_time; + public final boolean GL_NV_texture_compression_s3tc_update; + public final boolean GL_NV_texture_npot_2D_mipmap; + public final boolean GL_OES_EGL_image; + public final boolean GL_OES_EGL_image_external; + public final boolean GL_OES_EGL_sync; + public final boolean GL_OES_blend_equation_separate; + public final boolean GL_OES_blend_func_separate; + public final boolean GL_OES_blend_subtract; + public final boolean GL_OES_compressed_ETC1_RGB8_texture; + public final boolean GL_OES_compressed_paletted_texture; + public final boolean GL_OES_depth24; + public final boolean GL_OES_depth32; + public final boolean GL_OES_depth_texture; + public final boolean GL_OES_element_index_uint; + public final boolean GL_OES_fbo_render_mipmap; + public final boolean GL_OES_framebuffer_object; + public final boolean GL_OES_get_program_binary; + public final boolean GL_OES_mapbuffer; + public final boolean GL_OES_packed_depth_stencil; + public final boolean GL_OES_required_internalformat; + public final boolean GL_OES_rgb8_rgba8; + public final boolean GL_OES_standard_derivatives; + public final boolean GL_OES_stencil1; + public final boolean GL_OES_stencil4; + public final boolean GL_OES_stencil8; + public final boolean GL_OES_surfaceless_context; + public final boolean GL_OES_texture_3D; + public final boolean GL_OES_texture_float; + public final boolean GL_OES_texture_float_linear; + public final boolean GL_OES_texture_half_float; + public final boolean GL_OES_texture_half_float_linear; + public final boolean GL_OES_texture_npot; + public final boolean GL_OES_vertex_array_object; + public final boolean GL_OES_vertex_half_float; + public final boolean GL_OES_vertex_type_10_10_10_2; + public final boolean GL_QCOM_binning_control; + public final boolean GL_QCOM_driver_control; + public final boolean GL_QCOM_extended_get; + public final boolean GL_QCOM_extended_get2; + public final boolean GL_QCOM_performance_monitor_global_mode; + public final boolean GL_QCOM_tiled_rendering; + public final boolean GL_QCOM_writeonly_rendering; + public final boolean GL_VIV_shader_binary; + + private Set<String> initAllStubs() throws LWJGLException { + GLContext.setCapabilities(this); + Set<String> supported_extensions = new HashSet<String>(256); + GLContext.doInitNativeStubs(GLES20.class); + GLContext.getSupportedExtensions(supported_extensions); + if (loaded_stubs) + return supported_extensions; + GLContext.initNativeStubs(AMDPerformanceMonitor.class, supported_extensions, "GL_AMD_performance_monitor"); + GLContext.initNativeStubs(ANGLEFramebufferBlit.class, supported_extensions, "GL_ANGLE_framebuffer_blit"); + GLContext.initNativeStubs(ANGLEFramebufferMultisample.class, supported_extensions, "GL_ANGLE_framebuffer_multisample"); + GLContext.initNativeStubs(APPLEFramebufferMultisample.class, supported_extensions, "GL_APPLE_framebuffer_multisample"); + GLContext.initNativeStubs(APPLESync.class, supported_extensions, "GL_APPLE_sync"); + GLContext.initNativeStubs(ARBDrawBuffers.class, supported_extensions, "GL_ARB_draw_buffers"); + GLContext.initNativeStubs(EXTBlendMinmax.class, supported_extensions, "GL_EXT_blend_minmax"); + GLContext.initNativeStubs(EXTCopyTextureLevels.class, supported_extensions, "GL_EXT_copy_texture_levels"); + GLContext.initNativeStubs(EXTDebugLabel.class, supported_extensions, "GL_EXT_debug_label"); + GLContext.initNativeStubs(EXTDebugMarker.class, supported_extensions, "GL_EXT_debug_marker"); + GLContext.initNativeStubs(EXTDiscardFramebuffer.class, supported_extensions, "GL_EXT_discard_framebuffer"); + GLContext.initNativeStubs(EXTMapBufferRange.class, supported_extensions, "GL_EXT_map_buffer_range"); + GLContext.initNativeStubs(EXTMultiDrawArrays.class, supported_extensions, "GL_EXT_multi_draw_arrays"); + GLContext.initNativeStubs(EXTMultisampledRenderToTexture.class, supported_extensions, "GL_EXT_multisampled_render_to_texture"); + GLContext.initNativeStubs(EXTMultiviewDrawBuffers.class, supported_extensions, "GL_EXT_multiview_draw_buffers"); + GLContext.initNativeStubs(EXTOcclusionQueryBoolean.class, supported_extensions, "GL_EXT_occlusion_query_boolean"); + GLContext.initNativeStubs(EXTRobustness.class, supported_extensions, "GL_EXT_robustness"); + GLContext.initNativeStubs(EXTSeparateShaderObjects.class, supported_extensions, "GL_EXT_separate_shader_objects"); + GLContext.initNativeStubs(EXTTextureArray.class, supported_extensions, "GL_EXT_texture_array"); + GLContext.initNativeStubs(EXTTextureStorage.class, supported_extensions, "GL_EXT_texture_storage"); + GLContext.initNativeStubs(GLES30.class, supported_extensions, "OpenGLES30"); + GLContext.initNativeStubs(IMGMultisampledRenderToTexture.class, supported_extensions, "GL_IMG_multisampled_render_to_texture"); + GLContext.initNativeStubs(KHRDebug.class, supported_extensions, "GL_KHR_debug"); + GLContext.initNativeStubs(NVCoverageSample.class, supported_extensions, "GL_NV_coverage_sample"); + GLContext.initNativeStubs(NVDrawBuffers.class, supported_extensions, "GL_NV_draw_buffers"); + GLContext.initNativeStubs(NVDrawPath.class, supported_extensions, "GL_NV_draw_path"); + GLContext.initNativeStubs(NVDrawTexture.class, supported_extensions, "GL_NV_draw_texture"); + GLContext.initNativeStubs(NVFence.class, supported_extensions, "GL_NV_fence"); + GLContext.initNativeStubs(NVFramebufferVertexAttribArray.class, supported_extensions, "GL_NV_framebuffer_vertex_attrib_array"); + GLContext.initNativeStubs(NVGetTexImage.class, supported_extensions, "GL_NV_get_tex_image"); + GLContext.initNativeStubs(NVReadBuffer.class, supported_extensions, "GL_NV_read_buffer"); + GLContext.initNativeStubs(NVSystemTime.class, supported_extensions, "GL_NV_system_time"); + GLContext.initNativeStubs(OESEGLImage.class, supported_extensions, "GL_OES_EGL_image"); + GLContext.initNativeStubs(OESEGLImageExternal.class, supported_extensions, "GL_OES_EGL_image_external"); + GLContext.initNativeStubs(OESBlendEquationSeparate.class, supported_extensions, "GL_OES_blend_equation_separate"); + GLContext.initNativeStubs(OESBlendFuncSeparate.class, supported_extensions, "GL_OES_blend_func_separate"); + GLContext.initNativeStubs(OESBlendSubtract.class, supported_extensions, "GL_OES_blend_subtract"); + GLContext.initNativeStubs(OESFramebufferObject.class, supported_extensions, "GL_OES_framebuffer_object"); + GLContext.initNativeStubs(OESGetProgramBinary.class, supported_extensions, "GL_OES_get_program_binary"); + GLContext.initNativeStubs(OESMapbuffer.class, supported_extensions, "GL_OES_mapbuffer"); + GLContext.initNativeStubs(OESTexture3D.class, supported_extensions, "GL_OES_texture_3D"); + GLContext.initNativeStubs(OESVertexArrayObject.class, supported_extensions, "GL_OES_vertex_array_object"); + GLContext.initNativeStubs(QCOMDriverControl.class, supported_extensions, "GL_QCOM_driver_control"); + GLContext.initNativeStubs(QCOMExtendedGet.class, supported_extensions, "GL_QCOM_extended_get"); + GLContext.initNativeStubs(QCOMExtendedGet2.class, supported_extensions, "GL_QCOM_extended_get2"); + GLContext.initNativeStubs(QCOMTiledRendering.class, supported_extensions, "GL_QCOM_tiled_rendering"); + loaded_stubs = true; + return supported_extensions; + } + + static void unloadAllStubs() { + if (!loaded_stubs) + return; + GLContext.resetNativeStubs(AMDPerformanceMonitor.class); + GLContext.resetNativeStubs(ANGLEFramebufferBlit.class); + GLContext.resetNativeStubs(ANGLEFramebufferMultisample.class); + GLContext.resetNativeStubs(APPLEFramebufferMultisample.class); + GLContext.resetNativeStubs(APPLESync.class); + GLContext.resetNativeStubs(ARBDrawBuffers.class); + GLContext.resetNativeStubs(EXTBlendMinmax.class); + GLContext.resetNativeStubs(EXTCopyTextureLevels.class); + GLContext.resetNativeStubs(EXTDebugLabel.class); + GLContext.resetNativeStubs(EXTDebugMarker.class); + GLContext.resetNativeStubs(EXTDiscardFramebuffer.class); + GLContext.resetNativeStubs(EXTMapBufferRange.class); + GLContext.resetNativeStubs(EXTMultiDrawArrays.class); + GLContext.resetNativeStubs(EXTMultisampledRenderToTexture.class); + GLContext.resetNativeStubs(EXTMultiviewDrawBuffers.class); + GLContext.resetNativeStubs(EXTOcclusionQueryBoolean.class); + GLContext.resetNativeStubs(EXTRobustness.class); + GLContext.resetNativeStubs(EXTSeparateShaderObjects.class); + GLContext.resetNativeStubs(EXTTextureArray.class); + GLContext.resetNativeStubs(EXTTextureStorage.class); + GLContext.resetNativeStubs(IMGMultisampledRenderToTexture.class); + GLContext.resetNativeStubs(KHRDebug.class); + GLContext.resetNativeStubs(NVCoverageSample.class); + GLContext.resetNativeStubs(NVDrawBuffers.class); + GLContext.resetNativeStubs(NVDrawPath.class); + GLContext.resetNativeStubs(NVDrawTexture.class); + GLContext.resetNativeStubs(NVFence.class); + GLContext.resetNativeStubs(NVFramebufferVertexAttribArray.class); + GLContext.resetNativeStubs(NVGetTexImage.class); + GLContext.resetNativeStubs(NVReadBuffer.class); + GLContext.resetNativeStubs(NVSystemTime.class); + GLContext.resetNativeStubs(OESEGLImage.class); + GLContext.resetNativeStubs(OESEGLImageExternal.class); + GLContext.resetNativeStubs(OESBlendEquationSeparate.class); + GLContext.resetNativeStubs(OESBlendFuncSeparate.class); + GLContext.resetNativeStubs(OESBlendSubtract.class); + GLContext.resetNativeStubs(OESFramebufferObject.class); + GLContext.resetNativeStubs(OESGetProgramBinary.class); + GLContext.resetNativeStubs(OESMapbuffer.class); + GLContext.resetNativeStubs(OESTexture3D.class); + GLContext.resetNativeStubs(OESVertexArrayObject.class); + GLContext.resetNativeStubs(QCOMDriverControl.class); + GLContext.resetNativeStubs(QCOMExtendedGet.class); + GLContext.resetNativeStubs(QCOMExtendedGet2.class); + GLContext.resetNativeStubs(QCOMTiledRendering.class); + loaded_stubs = false; + } + + ContextCapabilities() throws LWJGLException { + Set<String> supported_extensions = initAllStubs(); + this.GL_AMD_compressed_3DC_texture = supported_extensions.contains("GL_AMD_compressed_3DC_texture"); + this.GL_AMD_compressed_ATC_texture = supported_extensions.contains("GL_AMD_compressed_ATC_texture"); + this.GL_AMD_performance_monitor = supported_extensions.contains("GL_AMD_performance_monitor"); + this.GL_AMD_program_binary_Z400 = supported_extensions.contains("GL_AMD_program_binary_Z400"); + this.GL_ANGLE_framebuffer_blit = supported_extensions.contains("GL_ANGLE_framebuffer_blit"); + this.GL_ANGLE_framebuffer_multisample = supported_extensions.contains("GL_ANGLE_framebuffer_multisample"); + this.GL_APPLE_framebuffer_multisample = supported_extensions.contains("GL_APPLE_framebuffer_multisample"); + this.GL_APPLE_rgb_422 = supported_extensions.contains("GL_APPLE_rgb_422"); + this.GL_APPLE_sync = supported_extensions.contains("GL_APPLE_sync"); + this.GL_APPLE_texture_format_BGRA8888 = supported_extensions.contains("GL_APPLE_texture_format_BGRA8888"); + this.GL_APPLE_texture_max_level = supported_extensions.contains("GL_APPLE_texture_max_level"); + this.GL_ARB_draw_buffers = supported_extensions.contains("GL_ARB_draw_buffers"); + this.GL_ARB_half_float_pixel = supported_extensions.contains("GL_ARB_half_float_pixel"); + this.GL_ARB_texture_rectangle = supported_extensions.contains("GL_ARB_texture_rectangle"); + this.GL_ARM_mali_shader_binary = supported_extensions.contains("GL_ARM_mali_shader_binary"); + this.GL_ARM_rgba8 = supported_extensions.contains("GL_ARM_rgba8"); + this.GL_DMP_shader_binary = supported_extensions.contains("GL_DMP_shader_binary"); + this.GL_EXT_Cg_shader = supported_extensions.contains("GL_EXT_Cg_shader"); + this.GL_EXT_bgra = supported_extensions.contains("GL_EXT_bgra"); + this.GL_EXT_blend_minmax = supported_extensions.contains("GL_EXT_blend_minmax"); + this.GL_EXT_color_buffer_half_float = supported_extensions.contains("GL_EXT_color_buffer_half_float"); + this.GL_EXT_copy_texture_levels = supported_extensions.contains("GL_EXT_copy_texture_levels"); + this.GL_EXT_debug_label = supported_extensions.contains("GL_EXT_debug_label"); + this.GL_EXT_debug_marker = supported_extensions.contains("GL_EXT_debug_marker"); + this.GL_EXT_discard_framebuffer = supported_extensions.contains("GL_EXT_discard_framebuffer"); + this.GL_EXT_frag_depth = supported_extensions.contains("GL_EXT_frag_depth"); + this.GL_EXT_map_buffer_range = supported_extensions.contains("GL_EXT_map_buffer_range"); + this.GL_EXT_multi_draw_arrays = supported_extensions.contains("GL_EXT_multi_draw_arrays"); + this.GL_EXT_multisampled_render_to_texture = supported_extensions.contains("GL_EXT_multisampled_render_to_texture"); + this.GL_EXT_multiview_draw_buffers = supported_extensions.contains("GL_EXT_multiview_draw_buffers"); + this.GL_EXT_occlusion_query_boolean = supported_extensions.contains("GL_EXT_occlusion_query_boolean"); + this.GL_EXT_packed_float = supported_extensions.contains("GL_EXT_packed_float"); + this.GL_EXT_read_format_bgra = supported_extensions.contains("GL_EXT_read_format_bgra"); + this.GL_EXT_robustness = supported_extensions.contains("GL_EXT_robustness"); + this.GL_EXT_sRGB = supported_extensions.contains("GL_EXT_sRGB"); + this.GL_EXT_separate_shader_objects = supported_extensions.contains("GL_EXT_separate_shader_objects"); + this.GL_EXT_shader_framebuffer_fetch = supported_extensions.contains("GL_EXT_shader_framebuffer_fetch"); + this.GL_EXT_shader_texture_lod = supported_extensions.contains("GL_EXT_shader_texture_lod"); + this.GL_EXT_shadow_samplers = supported_extensions.contains("GL_EXT_shadow_samplers"); + this.GL_EXT_texture_array = supported_extensions.contains("GL_EXT_texture_array"); + this.GL_EXT_texture_compression_dxt1 = supported_extensions.contains("GL_EXT_texture_compression_dxt1"); + this.GL_EXT_texture_compression_latc = supported_extensions.contains("GL_EXT_texture_compression_latc"); + this.GL_EXT_texture_compression_s3tc = supported_extensions.contains("GL_EXT_texture_compression_s3tc"); + this.GL_EXT_texture_filter_anisotropic = supported_extensions.contains("GL_EXT_texture_filter_anisotropic"); + this.GL_EXT_texture_format_BGRA8888 = supported_extensions.contains("GL_EXT_texture_format_BGRA8888"); + this.GL_EXT_texture_lod_bias = supported_extensions.contains("GL_EXT_texture_lod_bias"); + this.GL_EXT_texture_rg = supported_extensions.contains("GL_EXT_texture_rg"); + this.GL_EXT_texture_storage = supported_extensions.contains("GL_EXT_texture_storage"); + this.GL_EXT_texture_type_2_10_10_10_REV = supported_extensions.contains("GL_EXT_texture_type_2_10_10_10_REV"); + this.GL_EXT_unpack_subimage = supported_extensions.contains("GL_EXT_unpack_subimage"); + this.OpenGLES20 = supported_extensions.contains("OpenGLES20"); + this.OpenGLES30 = supported_extensions.contains("OpenGLES30"); + this.GL_IMG_multisampled_render_to_texture = supported_extensions.contains("GL_IMG_multisampled_render_to_texture"); + this.GL_IMG_program_binary = supported_extensions.contains("GL_IMG_program_binary"); + this.GL_IMG_read_format = supported_extensions.contains("GL_IMG_read_format"); + this.GL_IMG_shader_binary = supported_extensions.contains("GL_IMG_shader_binary"); + this.GL_IMG_texture_compression_pvrtc = supported_extensions.contains("GL_IMG_texture_compression_pvrtc"); + this.GL_KHR_debug = supported_extensions.contains("GL_KHR_debug"); + this.GL_KHR_texture_compression_astc_ldr = supported_extensions.contains("GL_KHR_texture_compression_astc_ldr"); + this.GL_NV_EGL_stream_consumer_external = supported_extensions.contains("GL_NV_EGL_stream_consumer_external"); + this.GL_NV_coverage_sample = supported_extensions.contains("GL_NV_coverage_sample"); + this.GL_NV_depth_nonlinear = supported_extensions.contains("GL_NV_depth_nonlinear"); + this.GL_NV_draw_buffers = supported_extensions.contains("GL_NV_draw_buffers"); + this.GL_NV_draw_path = supported_extensions.contains("GL_NV_draw_path"); + this.GL_NV_draw_texture = supported_extensions.contains("GL_NV_draw_texture"); + this.GL_NV_fbo_color_attachments = supported_extensions.contains("GL_NV_fbo_color_attachments"); + this.GL_NV_fence = supported_extensions.contains("GL_NV_fence"); + this.GL_NV_framebuffer_vertex_attrib_array = supported_extensions.contains("GL_NV_framebuffer_vertex_attrib_array"); + this.GL_NV_get_tex_image = supported_extensions.contains("GL_NV_get_tex_image"); + this.GL_NV_platform_binary = supported_extensions.contains("GL_NV_platform_binary"); + this.GL_NV_read_buffer = supported_extensions.contains("GL_NV_read_buffer"); + this.GL_NV_read_depth_stencil = supported_extensions.contains("GL_NV_read_depth_stencil"); + this.GL_NV_shader_framebuffer_fetch = supported_extensions.contains("GL_NV_shader_framebuffer_fetch"); + this.GL_NV_system_time = supported_extensions.contains("GL_NV_system_time"); + this.GL_NV_texture_compression_s3tc_update = supported_extensions.contains("GL_NV_texture_compression_s3tc_update"); + this.GL_NV_texture_npot_2D_mipmap = supported_extensions.contains("GL_NV_texture_npot_2D_mipmap"); + this.GL_OES_EGL_image = supported_extensions.contains("GL_OES_EGL_image"); + this.GL_OES_EGL_image_external = supported_extensions.contains("GL_OES_EGL_image_external"); + this.GL_OES_EGL_sync = supported_extensions.contains("GL_OES_EGL_sync") + || supported_extensions.contains("GL_OES_egl_sync"); + this.GL_OES_blend_equation_separate = supported_extensions.contains("GL_OES_blend_equation_separate"); + this.GL_OES_blend_func_separate = supported_extensions.contains("GL_OES_blend_func_separate"); + this.GL_OES_blend_subtract = supported_extensions.contains("GL_OES_blend_subtract"); + this.GL_OES_compressed_ETC1_RGB8_texture = supported_extensions.contains("GL_OES_compressed_ETC1_RGB8_texture"); + this.GL_OES_compressed_paletted_texture = supported_extensions.contains("GL_OES_compressed_paletted_texture"); + this.GL_OES_depth24 = supported_extensions.contains("GL_OES_depth24"); + this.GL_OES_depth32 = supported_extensions.contains("GL_OES_depth32"); + this.GL_OES_depth_texture = supported_extensions.contains("GL_OES_depth_texture"); + this.GL_OES_element_index_uint = supported_extensions.contains("GL_OES_element_index_uint"); + this.GL_OES_fbo_render_mipmap = supported_extensions.contains("GL_OES_fbo_render_mipmap"); + this.GL_OES_framebuffer_object = supported_extensions.contains("GL_OES_framebuffer_object"); + this.GL_OES_get_program_binary = supported_extensions.contains("GL_OES_get_program_binary"); + this.GL_OES_mapbuffer = supported_extensions.contains("GL_OES_mapbuffer"); + this.GL_OES_packed_depth_stencil = supported_extensions.contains("GL_OES_packed_depth_stencil"); + this.GL_OES_required_internalformat = supported_extensions.contains("GL_OES_required_internalformat"); + this.GL_OES_rgb8_rgba8 = supported_extensions.contains("GL_OES_rgb8_rgba8"); + this.GL_OES_standard_derivatives = supported_extensions.contains("GL_OES_standard_derivatives"); + this.GL_OES_stencil1 = supported_extensions.contains("GL_OES_stencil1"); + this.GL_OES_stencil4 = supported_extensions.contains("GL_OES_stencil4"); + this.GL_OES_stencil8 = supported_extensions.contains("GL_OES_stencil8"); + this.GL_OES_surfaceless_context = supported_extensions.contains("GL_OES_surfaceless_context"); + this.GL_OES_texture_3D = supported_extensions.contains("GL_OES_texture_3D"); + this.GL_OES_texture_float = supported_extensions.contains("GL_OES_texture_float"); + this.GL_OES_texture_float_linear = supported_extensions.contains("GL_OES_texture_float_linear"); + this.GL_OES_texture_half_float = supported_extensions.contains("GL_OES_texture_half_float"); + this.GL_OES_texture_half_float_linear = supported_extensions.contains("GL_OES_texture_half_float_linear"); + this.GL_OES_texture_npot = supported_extensions.contains("GL_OES_texture_npot"); + this.GL_OES_vertex_array_object = supported_extensions.contains("GL_OES_vertex_array_object"); + this.GL_OES_vertex_half_float = supported_extensions.contains("GL_OES_vertex_half_float"); + this.GL_OES_vertex_type_10_10_10_2 = supported_extensions.contains("GL_OES_vertex_type_10_10_10_2"); + this.GL_QCOM_binning_control = supported_extensions.contains("GL_QCOM_binning_control"); + this.GL_QCOM_driver_control = supported_extensions.contains("GL_QCOM_driver_control"); + this.GL_QCOM_extended_get = supported_extensions.contains("GL_QCOM_extended_get"); + this.GL_QCOM_extended_get2 = supported_extensions.contains("GL_QCOM_extended_get2"); + this.GL_QCOM_performance_monitor_global_mode = supported_extensions.contains("GL_QCOM_performance_monitor_global_mode"); + this.GL_QCOM_tiled_rendering = supported_extensions.contains("GL_QCOM_tiled_rendering"); + this.GL_QCOM_writeonly_rendering = supported_extensions.contains("GL_QCOM_writeonly_rendering"); + this.GL_VIV_shader_binary = supported_extensions.contains("GL_VIV_shader_binary"); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/DMPShaderBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/DMPShaderBinary.java new file mode 100644 index 0000000..6d84858 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/DMPShaderBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class DMPShaderBinary { + + /** + * Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: + */ + public static final int GL_SHADER_BINARY_DMP = 0x9250; + + private DMPShaderBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBgra.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBgra.java new file mode 100644 index 0000000..ecae565 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBgra.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBgra { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, GetTexImage, + * ReadPixels, TexImage1D, and TexImage2D: + */ + public static final int GL_BGR_EXT = 0x80E0, + GL_BGRA_EXT = 0x80E1; + + private EXTBgra() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBlendMinmax.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBlendMinmax.java new file mode 100644 index 0000000..8b2596e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTBlendMinmax.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTBlendMinmax { + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquationEXT: + */ + public static final int GL_FUNC_ADD_EXT = 0x8006, + GL_MIN_EXT = 0x8007, + GL_MAX_EXT = 0x8008; + + private EXTBlendMinmax() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBlendEquationEXT(int mode) { + nglBlendEquationEXT(mode); + } + static native void nglBlendEquationEXT(int mode); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCgShader.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCgShader.java new file mode 100644 index 0000000..88ec842 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCgShader.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTCgShader { + + /** + * You can pass GL_CG_VERTEX_SHADER_EXT to glCreateShader instead of GL_VERTEX_SHADER to create a vertex shader + * that will parse and compile its shader source with the Cg compiler front-end rather than the GLSL front-end. Likewise, you + * can pass GL_CG_FRAGMENT_SHADER_EXT to glCreateShader instead of GL_FRAGMENT_SHADER to create a fragment shader object + * that will parse and compile its shader source with the Cg front-end rather than the GLSL front-end. + */ + public static final int GL_CG_VERTEX_SHADER_EXT = 0x890E, + GL_CG_FRAGMENT_SHADER_EXT = 0x890F; + + private EXTCgShader() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTColorBufferHalfFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTColorBufferHalfFloat.java new file mode 100644 index 0000000..abf9a64 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTColorBufferHalfFloat.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTColorBufferHalfFloat { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage and + * RenderbufferStorageMultisampleAPPLE: + */ + public static final int GL_RGBA16F_EXT = 0x881A, + GL_RGB16F_EXT = 0x881B, + GL_RG16F_EXT = 0x822F, + GL_R16F_EXT = 0x822D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211; + + /** + * Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: + */ + public static final int GL_UNSIGNED_NORMALIZED_EXT = 0x8C17; + + private EXTColorBufferHalfFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCopyTextureLevels.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCopyTextureLevels.java new file mode 100644 index 0000000..65f4131 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTCopyTextureLevels.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTCopyTextureLevels { + + private EXTCopyTextureLevels() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glCopyTextureLevelsAPPLE(int destinationTexture, int sourceTexture, int sourceBaseLevel, int sourceLevelCount) { + nglCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount); + } + static native void nglCopyTextureLevelsAPPLE(int destinationTexture, int sourceTexture, int sourceBaseLevel, int sourceLevelCount); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugLabel.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugLabel.java new file mode 100644 index 0000000..7cc3c4d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugLabel.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDebugLabel { + + /** + * Accepted by the &lt;type&gt; parameter of LabelObjectEXT and + * GetObjectLabelEXT: + */ + public static final int GL_BUFFER_OBJECT_EXT = 0x9151, + GL_SHADER_OBJECT_EXT = 0x8B48, + GL_PROGRAM_OBJECT_EXT = 0x8B40, + GL_VERTEX_ARRAY_OBJECT_EXT = 0x9154, + GL_QUERY_OBJECT_EXT = 0x9153, + GL_PROGRAM_PIPELINE_OBJECT_EXT = 0x8A4F; + + private EXTDebugLabel() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glLabelObjectEXT(int type, int object, ByteBuffer label) { + BufferChecks.checkDirect(label); + nglLabelObjectEXT(type, object, label.remaining(), MemoryUtil.getAddress(label)); + } + static native void nglLabelObjectEXT(int type, int object, int label_length, long label); + + /** Overloads glLabelObjectEXT. */ + public static void glLabelObjectEXT(int type, int object, CharSequence label) { + nglLabelObjectEXT(type, object, label.length(), APIUtil.getBuffer(label)); + } + + public static void glGetObjectLabelEXT(int type, int object, IntBuffer length, ByteBuffer label) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + if (label != null) + BufferChecks.checkDirect(label); + nglGetObjectLabelEXT(type, object, (label == null ? 0 : label.remaining()), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddressSafe(label)); + } + static native void nglGetObjectLabelEXT(int type, int object, int label_bufSize, long length, long label); + + /** Overloads glGetObjectLabelEXT. */ + public static String glGetObjectLabelEXT(int type, int object, int bufSize) { + IntBuffer label_length = APIUtil.getLengths(); + ByteBuffer label = APIUtil.getBufferByte(bufSize); + nglGetObjectLabelEXT(type, object, bufSize, MemoryUtil.getAddress0(label_length), MemoryUtil.getAddress(label)); + label.limit(label_length.get(0)); + return APIUtil.getString(label); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugMarker.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugMarker.java new file mode 100644 index 0000000..3405368 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDebugMarker.java @@ -0,0 +1,40 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDebugMarker { + + private EXTDebugMarker() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glInsertEventMarkerEXT(ByteBuffer marker) { + BufferChecks.checkDirect(marker); + nglInsertEventMarkerEXT(marker.remaining(), MemoryUtil.getAddress(marker)); + } + static native void nglInsertEventMarkerEXT(int marker_length, long marker); + + /** Overloads glInsertEventMarkerEXT. */ + public static void glInsertEventMarkerEXT(CharSequence marker) { + nglInsertEventMarkerEXT(marker.length(), APIUtil.getBuffer(marker)); + } + + public static void glPushGroupMarkerEXT(ByteBuffer marker) { + BufferChecks.checkDirect(marker); + nglPushGroupMarkerEXT(marker.remaining(), MemoryUtil.getAddress(marker)); + } + static native void nglPushGroupMarkerEXT(int marker_length, long marker); + + /** Overloads glPushGroupMarkerEXT. */ + public static void glPushGroupMarkerEXT(CharSequence marker) { + nglPushGroupMarkerEXT(marker.length(), APIUtil.getBuffer(marker)); + } + + public static void glPopGroupMarkerEXT() { + nglPopGroupMarkerEXT(); + } + static native void nglPopGroupMarkerEXT(); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDiscardFramebuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDiscardFramebuffer.java new file mode 100644 index 0000000..60c0d1e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTDiscardFramebuffer.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTDiscardFramebuffer { + + /** + * Accepted in the &lt;attachments&gt; parameter of DiscardFramebufferEXT when the + * default framebuffer is bound to &lt;target&gt;: + */ + public static final int GL_COLOR_EXT = 0x1800, + GL_DEPTH_EXT = 0x1801, + GL_STENCIL_EXT = 0x1802; + + private EXTDiscardFramebuffer() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glDiscardFramebufferEXT(int target, IntBuffer attachments) { + BufferChecks.checkDirect(attachments); + nglDiscardFramebufferEXT(target, attachments.remaining(), MemoryUtil.getAddress(attachments)); + } + static native void nglDiscardFramebufferEXT(int target, int attachments_numAttachments, long attachments); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMapBufferRange.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMapBufferRange.java new file mode 100644 index 0000000..4e80153 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMapBufferRange.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMapBufferRange { + + /** + * Accepted by the &lt;access&gt; parameter of MapBufferRangeEXT: + */ + public static final int GL_MAP_READ_BIT_EXT = 0x1, + GL_MAP_WRITE_BIT_EXT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT_EXT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT_EXT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT_EXT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT_EXT = 0x20; + + private EXTMapBufferRange() {} + + static native void initNativeStubs() throws LWJGLException; + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferRangeEXT(int target, long offset, long length, int access, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferRangeEXT(target, offset, length, access, old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBufferRangeEXT(int target, long offset, long length, int access, ByteBuffer old_buffer); + + public static void glFlushMappedBufferRangeEXT(int target, long offset, long length) { + nglFlushMappedBufferRangeEXT(target, offset, length); + } + static native void nglFlushMappedBufferRangeEXT(int target, long offset, long length); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiDrawArrays.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiDrawArrays.java new file mode 100644 index 0000000..3eae168 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiDrawArrays.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMultiDrawArrays { + + private EXTMultiDrawArrays() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glMultiDrawArraysEXT(int mode, IntBuffer first, IntBuffer count) { + BufferChecks.checkDirect(first); + BufferChecks.checkBuffer(count, first.remaining()); + nglMultiDrawArraysEXT(mode, MemoryUtil.getAddress(first), MemoryUtil.getAddress(count), first.remaining()); + } + static native void nglMultiDrawArraysEXT(int mode, long first, long count, int first_primcount); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultisampledRenderToTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultisampledRenderToTexture.java new file mode 100644 index 0000000..ec6c99d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultisampledRenderToTexture.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMultisampledRenderToTexture { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_SAMPLES_EXT = 0x9133; + + /** + * Returned by CheckFramebufferStatus: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x9134; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_MAX_SAMPLES_EXT = 0x9135; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C; + + private EXTMultisampledRenderToTexture() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) { + nglRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); + } + static native void nglRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height); + + public static void glFramebufferTexture2DMultisampleEXT(int target, int attachment, int textarget, int texture, int level, int samples) { + nglFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); + } + static native void nglFramebufferTexture2DMultisampleEXT(int target, int attachment, int textarget, int texture, int level, int samples); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiviewDrawBuffers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiviewDrawBuffers.java new file mode 100644 index 0000000..bbaadbd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTMultiviewDrawBuffers.java @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTMultiviewDrawBuffers { + + /** + * Accepted by the &lt;location&gt; parameter of DrawBuffersIndexedEXT: + */ + public static final int GL_COLOR_ATTACHMENT_EXT = 0x90F0, + GL_MULTIVIEW_EXT = 0x90F1; + + /** + * Accepted by the &lt;target&gt; parameter of GetIntegeri_EXT: + */ + public static final int GL_DRAW_BUFFER_EXT = 0xC01, + GL_READ_BUFFER_EXT = 0xC02; + + /** + * Accepted by the &lt;target&gt; parameter of GetInteger: + */ + public static final int GL_MAX_MULTIVIEW_BUFFERS_EXT = 0x90F2; + + private EXTMultiviewDrawBuffers() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glReadBufferIndexedEXT(int src, int index) { + nglReadBufferIndexedEXT(src, index); + } + static native void nglReadBufferIndexedEXT(int src, int index); + + public static void glDrawBuffersIndexedEXT(IntBuffer location, IntBuffer indices) { + BufferChecks.checkBuffer(location, indices.remaining()); + BufferChecks.checkDirect(indices); + nglDrawBuffersIndexedEXT(indices.remaining(), MemoryUtil.getAddress(location), MemoryUtil.getAddress(indices)); + } + static native void nglDrawBuffersIndexedEXT(int indices_n, long location, long indices); + + public static void glGetIntegerEXT(int target, int index, IntBuffer data) { + BufferChecks.checkBuffer(data, 4); + nglGetIntegeri_vEXT(target, index, MemoryUtil.getAddress(data)); + } + static native void nglGetIntegeri_vEXT(int target, int index, long data); + + /** Overloads glGetIntegeri_vEXT. */ + public static int glGetIntegerEXT(int value, int index) { + IntBuffer data = APIUtil.getBufferInt(); + nglGetIntegeri_vEXT(value, index, MemoryUtil.getAddress(data)); + return data.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTOcclusionQueryBoolean.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTOcclusionQueryBoolean.java new file mode 100644 index 0000000..b2c3c4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTOcclusionQueryBoolean.java @@ -0,0 +1,98 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTOcclusionQueryBoolean { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQueryEXT, EndQueryEXT, + * and GetQueryivEXT: + */ + public static final int GL_ANY_SAMPLES_PASSED_EXT = 0x8C2F, + GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT = 0x8D6A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryivEXT: + */ + public static final int GL_CURRENT_QUERY_EXT = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectivEXT and + * GetQueryObjectuivEXT: + */ + public static final int GL_QUERY_RESULT_EXT = 0x8866, + GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867; + + private EXTOcclusionQueryBoolean() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGenQueriesEXT(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglGenQueriesEXT(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglGenQueriesEXT(int ids_n, long ids); + + /** Overloads glGenQueriesEXT. */ + public static int glGenQueriesEXT() { + IntBuffer ids = APIUtil.getBufferInt(); + nglGenQueriesEXT(1, MemoryUtil.getAddress(ids)); + return ids.get(0); + } + + public static void glDeleteQueriesEXT(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglDeleteQueriesEXT(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglDeleteQueriesEXT(int ids_n, long ids); + + /** Overloads glDeleteQueriesEXT. */ + public static void glDeleteQueriesEXT(int id) { + nglDeleteQueriesEXT(1, APIUtil.getInt(id)); + } + + public static boolean glIsQueryEXT(int id) { + boolean __result = nglIsQueryEXT(id); + return __result; + } + static native boolean nglIsQueryEXT(int id); + + public static void glBeginQueryEXT(int target, int id) { + nglBeginQueryEXT(target, id); + } + static native void nglBeginQueryEXT(int target, int id); + + public static void glEndQueryEXT(int target) { + nglEndQueryEXT(target); + } + static native void nglEndQueryEXT(int target); + + public static void glGetQueryEXT(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetQueryivEXT(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetQueryivEXT(int target, int pname, long params); + + /** Overloads glGetQueryivEXT. */ + public static int glGetQueryiEXT(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetQueryivEXT(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetQueryObjectuEXT(int id, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectuivEXT(id, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetQueryObjectuivEXT(int id, int pname, long params); + + /** Overloads glGetQueryObjectuivEXT. */ + public static int glGetQueryObjectuiEXT(int id, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetQueryObjectuivEXT(id, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTPackedFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTPackedFloat.java new file mode 100644 index 0000000..8a9a98d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTPackedFloat.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTPackedFloat { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + public static final int GL_R11F_G11F_B10F_EXT = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D: + */ + public static final int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv and GetFloatv: + */ + public static final int GL_RGBA_SIGNED_COMPONENTS_EXT = 0x8C3C; + + private EXTPackedFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTReadFormatBgra.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTReadFormatBgra.java new file mode 100644 index 0000000..e950ddd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTReadFormatBgra.java @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTReadFormatBgra { + + /** + * Accepted by the &lt;format&gt; parameter of ReadPixels: + */ + public static final int GL_BGRA_EXT = 0x80E1; + + /** + * Accepted by the &lt;type&gt; parameter of ReadPixels: + */ + public static final int GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT = 0x8365, + GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT = 0x8366; + + private EXTReadFormatBgra() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTRobustness.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTRobustness.java new file mode 100644 index 0000000..e046899 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTRobustness.java @@ -0,0 +1,71 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTRobustness { + + /** + * Returned by GetGraphicsResetStatusEXT: + */ + public static final int GL_NO_ERROR = 0x0, + GL_GUILTY_CONTEXT_RESET_EXT = 0x8253, + GL_INNOCENT_CONTEXT_RESET_EXT = 0x8254, + GL_UNKNOWN_CONTEXT_RESET_EXT = 0x8255; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_CONTEXT_ROBUST_ACCESS_EXT = 0x90F3, + GL_RESET_NOTIFICATION_STRATEGY_EXT = 0x8256; + + /** + * Returned by GetIntegerv and related simple queries when &lt;value&gt; is + * RESET_NOTIFICATION_STRATEGY_EXT : + */ + public static final int GL_LOSE_CONTEXT_ON_RESET_EXT = 0x8252, + GL_NO_RESET_NOTIFICATION_EXT = 0x8261; + + private EXTRobustness() {} + + static native void initNativeStubs() throws LWJGLException; + + public static int glGetGraphicsResetStatusEXT() { + int __result = nglGetGraphicsResetStatusEXT(); + return __result; + } + static native int nglGetGraphicsResetStatusEXT(); + + public static void glReadnPixelsEXT(int x, int y, int width, int height, int format, int type, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglReadnPixelsEXT(x, y, width, height, format, type, data.remaining(), MemoryUtil.getAddress(data)); + } + public static void glReadnPixelsEXT(int x, int y, int width, int height, int format, int type, FloatBuffer data) { + BufferChecks.checkDirect(data); + nglReadnPixelsEXT(x, y, width, height, format, type, (data.remaining() << 2), MemoryUtil.getAddress(data)); + } + public static void glReadnPixelsEXT(int x, int y, int width, int height, int format, int type, IntBuffer data) { + BufferChecks.checkDirect(data); + nglReadnPixelsEXT(x, y, width, height, format, type, (data.remaining() << 2), MemoryUtil.getAddress(data)); + } + public static void glReadnPixelsEXT(int x, int y, int width, int height, int format, int type, ShortBuffer data) { + BufferChecks.checkDirect(data); + nglReadnPixelsEXT(x, y, width, height, format, type, (data.remaining() << 1), MemoryUtil.getAddress(data)); + } + static native void nglReadnPixelsEXT(int x, int y, int width, int height, int format, int type, int data_bufSize, long data); + + public static void glGetnUniformEXT(int program, int location, FloatBuffer params) { + BufferChecks.checkDirect(params); + nglGetnUniformfvEXT(program, location, params.remaining(), MemoryUtil.getAddress(params)); + } + static native void nglGetnUniformfvEXT(int program, int location, int params_bufSize, long params); + + public static void glGetnUniformEXT(int program, int location, IntBuffer params) { + BufferChecks.checkDirect(params); + nglGetnUniformivEXT(program, location, params.remaining(), MemoryUtil.getAddress(params)); + } + static native void nglGetnUniformivEXT(int program, int location, int params_bufSize, long params); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSRGB.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSRGB.java new file mode 100644 index 0000000..726c9e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSRGB.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSRGB { + + /** + * Accepted by the &lt;format&gt; and &lt;internalformat&gt; parameter of TexImage2D, and + * TexImage3DOES. These are also accepted by &lt;format&gt; parameter of + * TexSubImage2D and TexSubImage3DOES: + */ + public static final int GL_SRGB_EXT = 0x8C40, + GL_SRGB_ALPHA_EXT = 0x8C42; + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage: + */ + public static final int GL_SRGB8_ALPHA8_EXT = 0x8C43; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210; + + private EXTSRGB() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSeparateShaderObjects.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSeparateShaderObjects.java new file mode 100644 index 0000000..cae87cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTSeparateShaderObjects.java @@ -0,0 +1,273 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTSeparateShaderObjects { + + /** + * Accepted by &lt;stages&gt; parameter to UseProgramStagesEXT: + */ + public static final int GL_VERTEX_SHADER_BIT_EXT = 0x1, + GL_FRAGMENT_SHADER_BIT_EXT = 0x2, + GL_ALL_SHADER_BITS_EXT = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + public static final int GL_PROGRAM_SEPARABLE_EXT = 0x8258; + + /** + * Accepted by &lt;type&gt; parameter to GetProgramPipelineivEXT: + */ + public static final int GL_ACTIVE_PROGRAM_EXT = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_PROGRAM_PIPELINE_BINDING_EXT = 0x825A; + + private EXTSeparateShaderObjects() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glUseProgramStagesEXT(int pipeline, int stages, int program) { + nglUseProgramStagesEXT(pipeline, stages, program); + } + static native void nglUseProgramStagesEXT(int pipeline, int stages, int program); + + public static void glActiveShaderProgramEXT(int pipeline, int program) { + nglActiveShaderProgramEXT(pipeline, program); + } + static native void nglActiveShaderProgramEXT(int pipeline, int program); + + /** + * Single null-terminated source code string. + */ + public static int glCreateShaderProgramEXT(int type, ByteBuffer string) { + BufferChecks.checkDirect(string); + BufferChecks.checkNullTerminated(string); + int __result = nglCreateShaderProgramvEXT(type, 1, MemoryUtil.getAddress(string)); + return __result; + } + static native int nglCreateShaderProgramvEXT(int type, int count, long string); + + /** + * Overloads glCreateShaderProgramvEXT. + * <p> + * Multiple null-terminated source code strings, one after the other. + */ + public static int glCreateShaderProgramEXT(int type, int count, ByteBuffer strings) { + BufferChecks.checkDirect(strings); + BufferChecks.checkNullTerminated(strings, count); + int __result = nglCreateShaderProgramvEXT2(type, count, MemoryUtil.getAddress(strings)); + return __result; + } + static native int nglCreateShaderProgramvEXT2(int type, int count, long strings); + + /** Overloads glCreateShaderProgramvEXT. */ + public static int glCreateShaderProgramEXT(int type, ByteBuffer[] strings) { + BufferChecks.checkArray(strings, 1); + int __result = nglCreateShaderProgramvEXT3(type, strings.length, strings); + return __result; + } + static native int nglCreateShaderProgramvEXT3(int type, int count, ByteBuffer[] strings); + + /** Overloads glCreateShaderProgramvEXT. */ + public static int glCreateShaderProgramEXT(int type, CharSequence string) { + int __result = nglCreateShaderProgramvEXT(type, 1, APIUtil.getBufferNT(string)); + return __result; + } + + /** Overloads glCreateShaderProgramvEXT. */ + public static int glCreateShaderProgramEXT(int type, CharSequence[] strings) { + BufferChecks.checkArray(strings); + int __result = nglCreateShaderProgramvEXT2(type, strings.length, APIUtil.getBufferNT(strings)); + return __result; + } + + public static void glBindProgramPipelineEXT(int pipeline) { + nglBindProgramPipelineEXT(pipeline); + } + static native void nglBindProgramPipelineEXT(int pipeline); + + public static void glDeleteProgramPipelinesEXT(IntBuffer pipelines) { + BufferChecks.checkDirect(pipelines); + nglDeleteProgramPipelinesEXT(pipelines.remaining(), MemoryUtil.getAddress(pipelines)); + } + static native void nglDeleteProgramPipelinesEXT(int pipelines_n, long pipelines); + + /** Overloads glDeleteProgramPipelinesEXT. */ + public static void glDeleteProgramPipelinesEXT(int pipeline) { + nglDeleteProgramPipelinesEXT(1, APIUtil.getInt(pipeline)); + } + + public static void glGenProgramPipelinesEXT(IntBuffer pipelines) { + BufferChecks.checkDirect(pipelines); + nglGenProgramPipelinesEXT(pipelines.remaining(), MemoryUtil.getAddress(pipelines)); + } + static native void nglGenProgramPipelinesEXT(int pipelines_n, long pipelines); + + /** Overloads glGenProgramPipelinesEXT. */ + public static int glGenProgramPipelinesEXT() { + IntBuffer pipelines = APIUtil.getBufferInt(); + nglGenProgramPipelinesEXT(1, MemoryUtil.getAddress(pipelines)); + return pipelines.get(0); + } + + public static boolean glIsProgramPipelineEXT(int pipeline) { + boolean __result = nglIsProgramPipelineEXT(pipeline); + return __result; + } + static native boolean nglIsProgramPipelineEXT(int pipeline); + + public static void glProgramParameteriEXT(int program, int pname, int value) { + nglProgramParameteriEXT(program, pname, value); + } + static native void nglProgramParameteriEXT(int program, int pname, int value); + + public static void glGetProgramPipelineEXT(int pipeline, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetProgramPipelineivEXT(pipeline, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetProgramPipelineivEXT(int pipeline, int pname, long params); + + /** Overloads glGetProgramPipelineivEXT. */ + public static int glGetProgramPipelineiEXT(int pipeline, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetProgramPipelineivEXT(pipeline, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glProgramUniform1iEXT(int program, int location, int v0) { + nglProgramUniform1iEXT(program, location, v0); + } + static native void nglProgramUniform1iEXT(int program, int location, int v0); + + public static void glProgramUniform2iEXT(int program, int location, int v0, int v1) { + nglProgramUniform2iEXT(program, location, v0, v1); + } + static native void nglProgramUniform2iEXT(int program, int location, int v0, int v1); + + public static void glProgramUniform3iEXT(int program, int location, int v0, int v1, int v2) { + nglProgramUniform3iEXT(program, location, v0, v1, v2); + } + static native void nglProgramUniform3iEXT(int program, int location, int v0, int v1, int v2); + + public static void glProgramUniform4iEXT(int program, int location, int v0, int v1, int v2, int v3) { + nglProgramUniform4iEXT(program, location, v0, v1, v2, v3); + } + static native void nglProgramUniform4iEXT(int program, int location, int v0, int v1, int v2, int v3); + + public static void glProgramUniform1fEXT(int program, int location, float v0) { + nglProgramUniform1fEXT(program, location, v0); + } + static native void nglProgramUniform1fEXT(int program, int location, float v0); + + public static void glProgramUniform2fEXT(int program, int location, float v0, float v1) { + nglProgramUniform2fEXT(program, location, v0, v1); + } + static native void nglProgramUniform2fEXT(int program, int location, float v0, float v1); + + public static void glProgramUniform3fEXT(int program, int location, float v0, float v1, float v2) { + nglProgramUniform3fEXT(program, location, v0, v1, v2); + } + static native void nglProgramUniform3fEXT(int program, int location, float v0, float v1, float v2); + + public static void glProgramUniform4fEXT(int program, int location, float v0, float v1, float v2, float v3) { + nglProgramUniform4fEXT(program, location, v0, v1, v2, v3); + } + static native void nglProgramUniform4fEXT(int program, int location, float v0, float v1, float v2, float v3); + + public static void glProgramUniform1EXT(int program, int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform1ivEXT(program, location, value.remaining(), MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform1ivEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform2EXT(int program, int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform2ivEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform2ivEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform3EXT(int program, int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform3ivEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform3ivEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform4EXT(int program, int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform4ivEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform4ivEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform1EXT(int program, int location, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform1fvEXT(program, location, value.remaining(), MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform1fvEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform2EXT(int program, int location, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform2fvEXT(program, location, value.remaining() >> 1, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform2fvEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform3EXT(int program, int location, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform3fvEXT(program, location, value.remaining() / 3, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform3fvEXT(int program, int location, int value_count, long value); + + public static void glProgramUniform4EXT(int program, int location, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniform4fvEXT(program, location, value.remaining() >> 2, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniform4fvEXT(int program, int location, int value_count, long value); + + public static void glProgramUniformMatrix2EXT(int program, int location, boolean transpose, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniformMatrix2fvEXT(program, location, value.remaining() >> 2, transpose, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniformMatrix2fvEXT(int program, int location, int value_count, boolean transpose, long value); + + public static void glProgramUniformMatrix3EXT(int program, int location, boolean transpose, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniformMatrix3fvEXT(program, location, value.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniformMatrix3fvEXT(int program, int location, int value_count, boolean transpose, long value); + + public static void glProgramUniformMatrix4EXT(int program, int location, boolean transpose, FloatBuffer value) { + BufferChecks.checkDirect(value); + nglProgramUniformMatrix4fvEXT(program, location, value.remaining() >> 4, transpose, MemoryUtil.getAddress(value)); + } + static native void nglProgramUniformMatrix4fvEXT(int program, int location, int value_count, boolean transpose, long value); + + public static void glValidateProgramPipelineEXT(int pipeline) { + nglValidateProgramPipelineEXT(pipeline); + } + static native void nglValidateProgramPipelineEXT(int pipeline); + + public static void glGetProgramPipelineInfoLogEXT(int pipeline, IntBuffer length, ByteBuffer infoLog) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetProgramPipelineInfoLogEXT(pipeline, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog)); + } + static native void nglGetProgramPipelineInfoLogEXT(int pipeline, int infoLog_bufSize, long length, long infoLog); + + /** Overloads glGetProgramPipelineInfoLogEXT. */ + public static String glGetProgramPipelineInfoLogEXT(int pipeline, int bufSize) { + IntBuffer infoLog_length = APIUtil.getLengths(); + ByteBuffer infoLog = APIUtil.getBufferByte(bufSize); + nglGetProgramPipelineInfoLogEXT(pipeline, bufSize, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog)); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(infoLog); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShaderFramebufferFetch.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShaderFramebufferFetch.java new file mode 100644 index 0000000..256c072 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShaderFramebufferFetch.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTShaderFramebufferFetch { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT = 0x8A52; + + private EXTShaderFramebufferFetch() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShadowSamplers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShadowSamplers.java new file mode 100644 index 0000000..06be7de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTShadowSamplers.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTShadowSamplers { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + public static final int GL_TEXTURE_COMPARE_MODE_EXT = 0x884C, + GL_TEXTURE_COMPARE_FUNC_EXT = 0x884D; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_EXT: + */ + public static final int GL_COMPARE_REF_TO_TEXTURE_EXT = 0x884E; + + private EXTShadowSamplers() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureArray.java new file mode 100644 index 0000000..75808ee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureArray.java @@ -0,0 +1,58 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureArray { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + public static final int GL_TEXTURE_1D_ARRAY_EXT = 0x8C18, + GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + public static final int GL_PROXY_TEXTURE_2D_ARRAY_EXT = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + public static final int GL_PROXY_TEXTURE_1D_ARRAY_EXT = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + public static final int GL_TEXTURE_BINDING_1D_ARRAY_EXT = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY_EXT = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = 0x88FF; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * Returned by the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1; + + private EXTTextureArray() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) { + nglFramebufferTextureLayerEXT(target, attachment, texture, level, layer); + } + static native void nglFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionDXT1.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionDXT1.java new file mode 100644 index 0000000..c151d0b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionDXT1.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionDXT1 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D + * and the &lt;format&gt; parameter of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; + + private EXTTextureCompressionDXT1() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionLATC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionLATC.java new file mode 100644 index 0000000..4494197 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionLATC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionLATC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_LUMINANCE_LATC1_EXT = 0x8C70, + GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = 0x8C71, + GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C72, + GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C73; + + private EXTTextureCompressionLATC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionS3TC.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionS3TC.java new file mode 100644 index 0000000..43fcb33 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureCompressionS3TC.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureCompressionS3TC { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, CopyTexImage2D, + * and CompressedTexImage2D and the &lt;format&gt; parameter of + * CompressedTexSubImage2D: + */ + public static final int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + + private EXTTextureCompressionS3TC() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFilterAnisotropic.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFilterAnisotropic.java new file mode 100644 index 0000000..5003993 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFilterAnisotropic.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureFilterAnisotropic { + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv, + * GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, + * and TexParameteriv: + */ + public static final int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, + * GetFloatv, and GetIntegerv: + */ + public static final int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; + + private EXTTextureFilterAnisotropic() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFormatBGRA8888.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFormatBGRA8888.java new file mode 100644 index 0000000..90e5fab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureFormatBGRA8888.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureFormatBGRA8888 { + + /** + * Accepted by the &lt;format> and &lt;internalformat&gt; parameters of TexImage2D + * and the &lt;format&gt; parameter of TexSubImage2D: + */ + public static final int GL_BGRA_EXT = 0x80E1; + + private EXTTextureFormatBGRA8888() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureLODBias.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureLODBias.java new file mode 100644 index 0000000..127e326 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureLODBias.java @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureLODBias { + + /** + * Accepted by the &lt;target&gt; parameters of GetTexEnvfv, GetTexEnviv, + * TexEnvi, TexEnvf, Texenviv, and TexEnvfv: + */ + public static final int GL_TEXTURE_FILTER_CONTROL_EXT = 0x8500; + + /** + * When the &lt;target&gt; parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, + * TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL_EXT, then + * the value of &lt;pname&gt; may be: + */ + public static final int GL_TEXTURE_LOD_BIAS_EXT = 0x8501; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_TEXTURE_LOD_BIAS_EXT = 0x84FD; + + private EXTTextureLODBias() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureRg.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureRg.java new file mode 100644 index 0000000..80c0dfe --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureRg.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureRg { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D and CopyTexImage2D, + * and the &lt;format&gt; parameter of TexImage2D, TexSubImage2D, and ReadPixels: + */ + public static final int GL_RED_EXT = 0x1903, + GL_RG_EXT = 0x8227; + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage and + * RenderbufferStorageMultisampleAPPLE: + */ + public static final int GL_R8_EXT = 0x8229, + GL_RG8_EXT = 0x822B; + + private EXTTextureRg() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureStorage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureStorage.java new file mode 100644 index 0000000..98d0e31 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureStorage.java @@ -0,0 +1,69 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureStorage { + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: + */ + public static final int GL_TEXTURE_IMMUTABLE_FORMAT_EXT = 0x912F; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexStorage* when + * implemented on OpenGL ES: + */ + public static final int GL_ALPHA8_EXT = 0x803C, + GL_LUMINANCE8_EXT = 0x8040, + GL_LUMINANCE8_ALPHA8_EXT = 0x8045, + GL_RGBA32F_EXT = 0x8814, + GL_RGB32F_EXT = 0x8815, + GL_ALPHA32F_EXT = 0x8816, + GL_LUMINANCE32F_EXT = 0x8818, + GL_LUMINANCE_ALPHA32F_EXT = 0x8819, + GL_RGBA16F_EXT = 0x881A, + GL_RGB16F_EXT = 0x881B, + GL_ALPHA16F_EXT = 0x881C, + GL_LUMINANCE16F_EXT = 0x881E, + GL_LUMINANCE_ALPHA16F_EXT = 0x881F, + GL_RGB10_A2_EXT = 0x8059, + GL_RGB10_EXT = 0x8052, + GL_BGRA8_EXT = 0x93A1; + + private EXTTextureStorage() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glTexStorage1DEXT(int target, int levels, int internalformat, int width) { + nglTexStorage1DEXT(target, levels, internalformat, width); + } + static native void nglTexStorage1DEXT(int target, int levels, int internalformat, int width); + + public static void glTexStorage2DEXT(int target, int levels, int internalformat, int width, int height) { + nglTexStorage2DEXT(target, levels, internalformat, width, height); + } + static native void nglTexStorage2DEXT(int target, int levels, int internalformat, int width, int height); + + public static void glTexStorage3DEXT(int target, int levels, int internalformat, int width, int height, int depth) { + nglTexStorage3DEXT(target, levels, internalformat, width, height, depth); + } + static native void nglTexStorage3DEXT(int target, int levels, int internalformat, int width, int height, int depth); + + public static void glTextureStorage1DEXT(int texture, int target, int levels, int internalformat, int width) { + nglTextureStorage1DEXT(texture, target, levels, internalformat, width); + } + static native void nglTextureStorage1DEXT(int texture, int target, int levels, int internalformat, int width); + + public static void glTextureStorage2DEXT(int texture, int target, int levels, int internalformat, int width, int height) { + nglTextureStorage2DEXT(texture, target, levels, internalformat, width, height); + } + static native void nglTextureStorage2DEXT(int texture, int target, int levels, int internalformat, int width, int height); + + public static void glTextureStorage3DEXT(int texture, int target, int levels, int internalformat, int width, int height, int depth) { + nglTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); + } + static native void nglTextureStorage3DEXT(int texture, int target, int levels, int internalformat, int width, int height, int depth); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureType2101010REV.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureType2101010REV.java new file mode 100644 index 0000000..1c34c05 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTTextureType2101010REV.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTTextureType2101010REV { + + /** + * Accepted by the &lt;type&gt; parameter of TexImage2D and TexImage3D: + */ + public static final int GL_UNSIGNED_INT_2_10_10_10_REV_EXT = 0x8368; + + private EXTTextureType2101010REV() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTUnpackSubimage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTUnpackSubimage.java new file mode 100644 index 0000000..0192127 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/EXTUnpackSubimage.java @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class EXTUnpackSubimage { + + /** + * Accepted by the &lt;pname&gt; parameters of PixelStorei, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_UNPACK_ROW_LENGTH = 0xCF2, + GL_UNPACK_SKIP_ROWS = 0xCF3, + GL_UNPACK_SKIP_PIXELS = 0xCF4; + + private EXTUnpackSubimage() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES20.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES20.java new file mode 100644 index 0000000..876bdca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES20.java @@ -0,0 +1,1715 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class GLES20 { + + /** + * ClearBufferMask + */ + public static final int GL_DEPTH_BUFFER_BIT = 0x100, + GL_STENCIL_BUFFER_BIT = 0x400, + GL_COLOR_BUFFER_BIT = 0x4000; + + /** + * Boolean + */ + public static final int GL_FALSE = 0x0, + GL_TRUE = 0x1; + + /** + * BeginMode + */ + public static final int GL_POINTS = 0x0, + GL_LINES = 0x1, + GL_LINE_LOOP = 0x2, + GL_LINE_STRIP = 0x3, + GL_TRIANGLES = 0x4, + GL_TRIANGLE_STRIP = 0x5, + GL_TRIANGLE_FAN = 0x6; + + /** + * BlendingFactorDest + */ + public static final int GL_ZERO = 0x0, + GL_ONE = 0x1, + GL_SRC_COLOR = 0x300, + GL_ONE_MINUS_SRC_COLOR = 0x301, + GL_SRC_ALPHA = 0x302, + GL_ONE_MINUS_SRC_ALPHA = 0x303, + GL_DST_ALPHA = 0x304, + GL_ONE_MINUS_DST_ALPHA = 0x305; + + /** + * BlendingFactorSrc + */ + public static final int GL_DST_COLOR = 0x306, + GL_ONE_MINUS_DST_COLOR = 0x307, + GL_SRC_ALPHA_SATURATE = 0x308; + + /** + * BlendEquationSeparate + */ + public static final int GL_FUNC_ADD = 0x8006, + GL_BLEND_EQUATION = 0x8009, + GL_BLEND_EQUATION_RGB = 0x8009, + GL_BLEND_EQUATION_ALPHA = 0x883D; + + /** + * BlendSubtract + */ + public static final int GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B; + + /** + * Separate Blend Functions + */ + public static final int GL_BLEND_DST_RGB = 0x80C8, + GL_BLEND_SRC_RGB = 0x80C9, + GL_BLEND_DST_ALPHA = 0x80CA, + GL_BLEND_SRC_ALPHA = 0x80CB, + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_BLEND_COLOR = 0x8005; + + /** + * Buffer Objects + */ + public static final int GL_ARRAY_BUFFER = 0x8892, + GL_ELEMENT_ARRAY_BUFFER = 0x8893, + GL_ARRAY_BUFFER_BINDING = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895, + GL_STREAM_DRAW = 0x88E0, + GL_STATIC_DRAW = 0x88E4, + GL_DYNAMIC_DRAW = 0x88E8, + GL_BUFFER_SIZE = 0x8764, + GL_BUFFER_USAGE = 0x8765, + GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** + * CullFaceMode + */ + public static final int GL_FRONT = 0x404, + GL_BACK = 0x405, + GL_FRONT_AND_BACK = 0x408; + + /** + * EnableCap + */ + public static final int GL_TEXTURE_2D = 0xDE1, + GL_CULL_FACE = 0xB44, + GL_BLEND = 0xBE2, + GL_DITHER = 0xBD0, + GL_STENCIL_TEST = 0xB90, + GL_DEPTH_TEST = 0xB71, + GL_SCISSOR_TEST = 0xC11, + GL_POLYGON_OFFSET_FILL = 0x8037, + GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E, + GL_SAMPLE_COVERAGE = 0x80A0; + + /** + * ErrorCode + */ + public static final int GL_NO_ERROR = 0x0, + GL_INVALID_ENUM = 0x500, + GL_INVALID_VALUE = 0x501, + GL_INVALID_OPERATION = 0x502, + GL_OUT_OF_MEMORY = 0x505; + + /** + * FrontFaceDirection + */ + public static final int GL_CW = 0x900, + GL_CCW = 0x901; + + /** + * GetPName + */ + public static final int GL_LINE_WIDTH = 0xB21, + GL_ALIASED_POINT_SIZE_RANGE = 0x846D, + GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, + GL_CULL_FACE_MODE = 0xB45, + GL_FRONT_FACE = 0xB46, + GL_DEPTH_RANGE = 0xB70, + GL_DEPTH_WRITEMASK = 0xB72, + GL_DEPTH_CLEAR_VALUE = 0xB73, + GL_DEPTH_FUNC = 0xB74, + GL_STENCIL_CLEAR_VALUE = 0xB91, + GL_STENCIL_FUNC = 0xB92, + GL_STENCIL_FAIL = 0xB94, + GL_STENCIL_PASS_DEPTH_FAIL = 0xB95, + GL_STENCIL_PASS_DEPTH_PASS = 0xB96, + GL_STENCIL_REF = 0xB97, + GL_STENCIL_VALUE_MASK = 0xB93, + GL_STENCIL_WRITEMASK = 0xB98, + GL_STENCIL_BACK_FUNC = 0x8800, + GL_STENCIL_BACK_FAIL = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + GL_STENCIL_BACK_REF = 0x8CA3, + GL_STENCIL_BACK_VALUE_MASK = 0x8CA4, + GL_STENCIL_BACK_WRITEMASK = 0x8CA5, + GL_VIEWPORT = 0xBA2, + GL_SCISSOR_BOX = 0xC10, + GL_COLOR_CLEAR_VALUE = 0xC22, + GL_COLOR_WRITEMASK = 0xC23, + GL_UNPACK_ALIGNMENT = 0xCF5, + GL_PACK_ALIGNMENT = 0xD05, + GL_MAX_TEXTURE_SIZE = 0xD33, + GL_MAX_VIEWPORT_DIMS = 0xD3A, + GL_SUBPIXEL_BITS = 0xD50, + GL_RED_BITS = 0xD52, + GL_GREEN_BITS = 0xD53, + GL_BLUE_BITS = 0xD54, + GL_ALPHA_BITS = 0xD55, + GL_DEPTH_BITS = 0xD56, + GL_STENCIL_BITS = 0xD57, + GL_POLYGON_OFFSET_UNITS = 0x2A00, + GL_POLYGON_OFFSET_FACTOR = 0x8038, + GL_TEXTURE_BINDING_2D = 0x8069, + GL_SAMPLE_BUFFERS = 0x80A8, + GL_SAMPLES = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT = 0x80AB; + + /** + * GetTextureParameter + */ + public static final int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + /** + * HintMode + */ + public static final int GL_DONT_CARE = 0x1100, + GL_FASTEST = 0x1101, + GL_NICEST = 0x1102; + + /** + * HintTarget + */ + public static final int GL_GENERATE_MIPMAP_HINT = 0x8192; + + /** + * DataType + */ + public static final int GL_BYTE = 0x1400, + GL_UNSIGNED_BYTE = 0x1401, + GL_SHORT = 0x1402, + GL_UNSIGNED_SHORT = 0x1403, + GL_INT = 0x1404, + GL_UNSIGNED_INT = 0x1405, + GL_FLOAT = 0x1406, + GL_FIXED = 0x140C; + + /** + * PixelFormat + */ + public static final int GL_DEPTH_COMPONENT = 0x1902, + GL_ALPHA = 0x1906, + GL_RGB = 0x1907, + GL_RGBA = 0x1908, + GL_LUMINANCE = 0x1909, + GL_LUMINANCE_ALPHA = 0x190A; + + /** + * PixelType + */ + public static final int GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363; + + /** + * Shaders + */ + public static final int GL_FRAGMENT_SHADER = 0x8B30, + GL_VERTEX_SHADER = 0x8B31, + GL_MAX_VERTEX_ATTRIBS = 0x8869, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C, + GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_SHADER_TYPE = 0x8B4F, + GL_DELETE_STATUS = 0x8B80, + GL_LINK_STATUS = 0x8B82, + GL_VALIDATE_STATUS = 0x8B83, + GL_ATTACHED_SHADERS = 0x8B85, + GL_ACTIVE_UNIFORMS = 0x8B86, + GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, + GL_ACTIVE_ATTRIBUTES = 0x8B89, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A, + GL_SHADING_LANGUAGE_VERSION = 0x8B8C, + GL_CURRENT_PROGRAM = 0x8B8D; + + /** + * StencilFunction + */ + public static final int GL_NEVER = 0x200, + GL_LESS = 0x201, + GL_EQUAL = 0x202, + GL_LEQUAL = 0x203, + GL_GREATER = 0x204, + GL_NOTEQUAL = 0x205, + GL_GEQUAL = 0x206, + GL_ALWAYS = 0x207; + + /** + * StencilOp + */ + public static final int GL_KEEP = 0x1E00, + GL_REPLACE = 0x1E01, + GL_INCR = 0x1E02, + GL_DECR = 0x1E03, + GL_INVERT = 0x150A, + GL_INCR_WRAP = 0x8507, + GL_DECR_WRAP = 0x8508; + + /** + * StringName + */ + public static final int GL_VENDOR = 0x1F00, + GL_RENDERER = 0x1F01, + GL_VERSION = 0x1F02, + GL_EXTENSIONS = 0x1F03; + + /** + * TextureMagFilter + */ + public static final int GL_NEAREST = 0x2600, + GL_LINEAR = 0x2601; + + /** + * TextureMinFilter + */ + public static final int GL_NEAREST_MIPMAP_NEAREST = 0x2700, + GL_LINEAR_MIPMAP_NEAREST = 0x2701, + GL_NEAREST_MIPMAP_LINEAR = 0x2702, + GL_LINEAR_MIPMAP_LINEAR = 0x2703; + + /** + * TextureParameterName + */ + public static final int GL_TEXTURE_MAG_FILTER = 0x2800, + GL_TEXTURE_MIN_FILTER = 0x2801, + GL_TEXTURE_WRAP_S = 0x2802, + GL_TEXTURE_WRAP_T = 0x2803; + + /** + * TextureTarget + */ + public static final int GL_TEXTURE = 0x1702, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_BINDING_CUBE_MAP = 0x8514, + GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A, + GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + /** + * TextureUnit + */ + public static final int GL_TEXTURE0 = 0x84C0, + GL_TEXTURE1 = 0x84C1, + GL_TEXTURE2 = 0x84C2, + GL_TEXTURE3 = 0x84C3, + GL_TEXTURE4 = 0x84C4, + GL_TEXTURE5 = 0x84C5, + GL_TEXTURE6 = 0x84C6, + GL_TEXTURE7 = 0x84C7, + GL_TEXTURE8 = 0x84C8, + GL_TEXTURE9 = 0x84C9, + GL_TEXTURE10 = 0x84CA, + GL_TEXTURE11 = 0x84CB, + GL_TEXTURE12 = 0x84CC, + GL_TEXTURE13 = 0x84CD, + GL_TEXTURE14 = 0x84CE, + GL_TEXTURE15 = 0x84CF, + GL_TEXTURE16 = 0x84D0, + GL_TEXTURE17 = 0x84D1, + GL_TEXTURE18 = 0x84D2, + GL_TEXTURE19 = 0x84D3, + GL_TEXTURE20 = 0x84D4, + GL_TEXTURE21 = 0x84D5, + GL_TEXTURE22 = 0x84D6, + GL_TEXTURE23 = 0x84D7, + GL_TEXTURE24 = 0x84D8, + GL_TEXTURE25 = 0x84D9, + GL_TEXTURE26 = 0x84DA, + GL_TEXTURE27 = 0x84DB, + GL_TEXTURE28 = 0x84DC, + GL_TEXTURE29 = 0x84DD, + GL_TEXTURE30 = 0x84DE, + GL_TEXTURE31 = 0x84DF, + GL_ACTIVE_TEXTURE = 0x84E0; + + /** + * TextureWrapMode + */ + public static final int GL_REPEAT = 0x2901, + GL_CLAMP_TO_EDGE = 0x812F, + GL_MIRRORED_REPEAT = 0x8370; + + /** + * Uniform Types + */ + public static final int GL_FLOAT_VEC2 = 0x8B50, + GL_FLOAT_VEC3 = 0x8B51, + GL_FLOAT_VEC4 = 0x8B52, + GL_INT_VEC2 = 0x8B53, + GL_INT_VEC3 = 0x8B54, + GL_INT_VEC4 = 0x8B55, + GL_BOOL = 0x8B56, + GL_BOOL_VEC2 = 0x8B57, + GL_BOOL_VEC3 = 0x8B58, + GL_BOOL_VEC4 = 0x8B59, + GL_FLOAT_MAT2 = 0x8B5A, + GL_FLOAT_MAT3 = 0x8B5B, + GL_FLOAT_MAT4 = 0x8B5C, + GL_SAMPLER_2D = 0x8B5E, + GL_SAMPLER_CUBE = 0x8B60; + + /** + * Vertex Arrays + */ + public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A, + GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645, + GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + + /** + * Read Format + */ + public static final int GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** + * Shader Source + */ + public static final int GL_COMPILE_STATUS = 0x8B81, + GL_INFO_LOG_LENGTH = 0x8B84, + GL_SHADER_SOURCE_LENGTH = 0x8B88, + GL_SHADER_COMPILER = 0x8DFA; + + /** + * Shader Binary + */ + public static final int GL_SHADER_BINARY_FORMATS = 0x8DF8, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9; + + /** + * Shader Precision-Specified Types + */ + public static final int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** + * Framebuffer Object. + */ + public static final int GL_FRAMEBUFFER = 0x8D40, + GL_RENDERBUFFER = 0x8D41, + GL_RGBA4 = 0x8056, + GL_RGB5_A1 = 0x8057, + GL_RGB565 = 0x8D62, + GL_DEPTH_COMPONENT16 = 0x81A5, + GL_STENCIL_INDEX = 0x1901, + GL_STENCIL_INDEX8 = 0x8D48, + GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_NONE = 0x0, + GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8, + GL_INVALID_FRAMEBUFFER_OPERATION = 0x506; + + private GLES20() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glActiveTexture(int texture) { + nglActiveTexture(texture); + } + static native void nglActiveTexture(int texture); + + public static void glAttachShader(int program, int shader) { + nglAttachShader(program, shader); + } + static native void nglAttachShader(int program, int shader); + + public static void glBindAttribLocation(int program, int index, ByteBuffer name) { + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + nglBindAttribLocation(program, index, MemoryUtil.getAddress(name)); + } + static native void nglBindAttribLocation(int program, int index, long name); + + /** Overloads glBindAttribLocation. */ + public static void glBindAttribLocation(int program, int index, CharSequence name) { + nglBindAttribLocation(program, index, APIUtil.getBufferNT(name)); + } + + public static void glBindBuffer(int target, int buffer) { + StateTracker.bindBuffer(target, buffer); + nglBindBuffer(target, buffer); + } + static native void nglBindBuffer(int target, int buffer); + + public static void glBindFramebuffer(int target, int framebuffer) { + nglBindFramebuffer(target, framebuffer); + } + static native void nglBindFramebuffer(int target, int framebuffer); + + public static void glBindRenderbuffer(int target, int renderbuffer) { + nglBindRenderbuffer(target, renderbuffer); + } + static native void nglBindRenderbuffer(int target, int renderbuffer); + + public static void glBindTexture(int target, int texture) { + nglBindTexture(target, texture); + } + static native void nglBindTexture(int target, int texture); + + public static void glBlendColor(float red, float green, float blue, float alpha) { + nglBlendColor(red, green, blue, alpha); + } + static native void nglBlendColor(float red, float green, float blue, float alpha); + + public static void glBlendEquation(int mode) { + nglBlendEquation(mode); + } + static native void nglBlendEquation(int mode); + + public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) { + nglBlendEquationSeparate(modeRGB, modeAlpha); + } + static native void nglBlendEquationSeparate(int modeRGB, int modeAlpha); + + public static void glBlendFunc(int sfactor, int dfactor) { + nglBlendFunc(sfactor, dfactor); + } + static native void nglBlendFunc(int sfactor, int dfactor); + + public static void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + nglBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); + } + static native void nglBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha); + + public static void glBufferData(int target, long data_size, int usage) { + nglBufferData(target, data_size, 0L, usage); + } + public static void glBufferData(int target, ByteBuffer data, int usage) { + BufferChecks.checkDirect(data); + nglBufferData(target, data.remaining(), MemoryUtil.getAddress(data), usage); + } + public static void glBufferData(int target, FloatBuffer data, int usage) { + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage); + } + public static void glBufferData(int target, IntBuffer data, int usage) { + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 2), MemoryUtil.getAddress(data), usage); + } + public static void glBufferData(int target, ShortBuffer data, int usage) { + BufferChecks.checkDirect(data); + nglBufferData(target, (data.remaining() << 1), MemoryUtil.getAddress(data), usage); + } + static native void nglBufferData(int target, long data_size, long data, int usage); + + public static void glBufferSubData(int target, long offset, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, data.remaining(), MemoryUtil.getAddress(data)); + } + public static void glBufferSubData(int target, long offset, FloatBuffer data) { + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data)); + } + public static void glBufferSubData(int target, long offset, IntBuffer data) { + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 2), MemoryUtil.getAddress(data)); + } + public static void glBufferSubData(int target, long offset, ShortBuffer data) { + BufferChecks.checkDirect(data); + nglBufferSubData(target, offset, (data.remaining() << 1), MemoryUtil.getAddress(data)); + } + static native void nglBufferSubData(int target, long offset, long data_size, long data); + + public static int glCheckFramebufferStatus(int target) { + int __result = nglCheckFramebufferStatus(target); + return __result; + } + static native int nglCheckFramebufferStatus(int target); + + public static void glClear(int mask) { + nglClear(mask); + } + static native void nglClear(int mask); + + public static void glClearColor(float red, float green, float blue, float alpha) { + nglClearColor(red, green, blue, alpha); + } + static native void nglClearColor(float red, float green, float blue, float alpha); + + public static void glClearDepthf(float depth) { + nglClearDepthf(depth); + } + static native void nglClearDepthf(float depth); + + public static void glClearStencil(int s) { + nglClearStencil(s); + } + static native void nglClearStencil(int s); + + public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { + nglColorMask(red, green, blue, alpha); + } + static native void nglColorMask(boolean red, boolean green, boolean blue, boolean alpha); + + public static void glCompileShader(int shader) { + nglCompileShader(shader); + } + static native void nglCompileShader(int shader); + + public static void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglCompressedTexImage2D(target, level, internalformat, width, height, border, data.remaining(), MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, int data_imageSize, long data); + + public static void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data.remaining(), MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int data_imageSize, long data); + + public static void glCopyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) { + nglCopyTexImage2D(target, level, internalformat, x, y, width, height, border); + } + static native void nglCopyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border); + + public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { + nglCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + } + static native void nglCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height); + + public static int glCreateProgram() { + int __result = nglCreateProgram(); + return __result; + } + static native int nglCreateProgram(); + + public static int glCreateShader(int type) { + int __result = nglCreateShader(type); + return __result; + } + static native int nglCreateShader(int type); + + public static void glCullFace(int mode) { + nglCullFace(mode); + } + static native void nglCullFace(int mode); + + public static void glDeleteBuffers(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nglDeleteBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nglDeleteBuffers(int buffers_n, long buffers); + + /** Overloads glDeleteBuffers. */ + public static void glDeleteBuffers(int buffer) { + nglDeleteBuffers(1, APIUtil.getInt(buffer)); + } + + public static void glDeleteFramebuffers(IntBuffer framebuffers) { + BufferChecks.checkDirect(framebuffers); + nglDeleteFramebuffers(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers)); + } + static native void nglDeleteFramebuffers(int framebuffers_n, long framebuffers); + + /** Overloads glDeleteFramebuffers. */ + public static void glDeleteFramebuffers(int framebuffer) { + nglDeleteFramebuffers(1, APIUtil.getInt(framebuffer)); + } + + public static void glDeleteProgram(int program) { + nglDeleteProgram(program); + } + static native void nglDeleteProgram(int program); + + public static void glDeleteRenderbuffers(IntBuffer renderbuffers) { + BufferChecks.checkDirect(renderbuffers); + nglDeleteRenderbuffers(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers)); + } + static native void nglDeleteRenderbuffers(int renderbuffers_n, long renderbuffers); + + /** Overloads glDeleteRenderbuffers. */ + public static void glDeleteRenderbuffers(int renderbuffer) { + nglDeleteRenderbuffers(1, APIUtil.getInt(renderbuffer)); + } + + public static void glDeleteShader(int shader) { + nglDeleteShader(shader); + } + static native void nglDeleteShader(int shader); + + public static void glDeleteTextures(IntBuffer textures) { + BufferChecks.checkDirect(textures); + nglDeleteTextures(textures.remaining(), MemoryUtil.getAddress(textures)); + } + static native void nglDeleteTextures(int textures_n, long textures); + + /** Overloads glDeleteTextures. */ + public static void glDeleteTextures(int texture) { + nglDeleteTextures(1, APIUtil.getInt(texture)); + } + + public static void glDepthFunc(int func) { + nglDepthFunc(func); + } + static native void nglDepthFunc(int func); + + public static void glDepthMask(boolean flag) { + nglDepthMask(flag); + } + static native void nglDepthMask(boolean flag); + + public static void glDepthRangef(float zNear, float zFar) { + nglDepthRangef(zNear, zFar); + } + static native void nglDepthRangef(float zNear, float zFar); + + public static void glDetachShader(int program, int shader) { + nglDetachShader(program, shader); + } + static native void nglDetachShader(int program, int shader); + + public static void glDisable(int cap) { + nglDisable(cap); + } + static native void nglDisable(int cap); + + public static void glDisableVertexAttribArray(int index) { + nglDisableVertexAttribArray(index); + } + static native void nglDisableVertexAttribArray(int index); + + public static void glDrawArrays(int mode, int first, int count) { + nglDrawArrays(mode, first, count); + } + static native void nglDrawArrays(int mode, int first, int count); + + public static void glDrawElements(int mode, ByteBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GLES20.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices)); + } + public static void glDrawElements(int mode, IntBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GLES20.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices)); + } + public static void glDrawElements(int mode, ShortBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElements(mode, indices.remaining(), GLES20.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices)); + } + static native void nglDrawElements(int mode, int indices_count, int type, long indices); + public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) { + GLChecks.ensureElementVBOenabled(); + nglDrawElementsBO(mode, indices_count, type, indices_buffer_offset); + } + static native void nglDrawElementsBO(int mode, int indices_count, int type, long indices_buffer_offset); + + public static void glEnable(int cap) { + nglEnable(cap); + } + static native void nglEnable(int cap); + + public static void glEnableVertexAttribArray(int index) { + nglEnableVertexAttribArray(index); + } + static native void nglEnableVertexAttribArray(int index); + + public static void glFinish() { + nglFinish(); + } + static native void nglFinish(); + + public static void glFlush() { + nglFlush(); + } + static native void nglFlush(); + + public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) { + nglFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + } + static native void nglFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer); + + public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { + nglFramebufferTexture2D(target, attachment, textarget, texture, level); + } + static native void nglFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level); + + public static void glFrontFace(int mode) { + nglFrontFace(mode); + } + static native void nglFrontFace(int mode); + + public static void glGenBuffers(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nglGenBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nglGenBuffers(int buffers_n, long buffers); + + /** Overloads glGenBuffers. */ + public static int glGenBuffers() { + IntBuffer buffers = APIUtil.getBufferInt(); + nglGenBuffers(1, MemoryUtil.getAddress(buffers)); + return buffers.get(0); + } + + public static void glGenerateMipmap(int target) { + nglGenerateMipmap(target); + } + static native void nglGenerateMipmap(int target); + + public static void glGenFramebuffers(IntBuffer framebuffers) { + BufferChecks.checkDirect(framebuffers); + nglGenFramebuffers(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers)); + } + static native void nglGenFramebuffers(int framebuffers_n, long framebuffers); + + /** Overloads glGenFramebuffers. */ + public static int glGenFramebuffers() { + IntBuffer framebuffers = APIUtil.getBufferInt(); + nglGenFramebuffers(1, MemoryUtil.getAddress(framebuffers)); + return framebuffers.get(0); + } + + public static void glGenRenderbuffers(IntBuffer renderbuffers) { + BufferChecks.checkDirect(renderbuffers); + nglGenRenderbuffers(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers)); + } + static native void nglGenRenderbuffers(int renderbuffers_n, long renderbuffers); + + /** Overloads glGenRenderbuffers. */ + public static int glGenRenderbuffers() { + IntBuffer renderbuffers = APIUtil.getBufferInt(); + nglGenRenderbuffers(1, MemoryUtil.getAddress(renderbuffers)); + return renderbuffers.get(0); + } + + public static void glGenTextures(IntBuffer textures) { + BufferChecks.checkDirect(textures); + nglGenTextures(textures.remaining(), MemoryUtil.getAddress(textures)); + } + static native void nglGenTextures(int textures_n, long textures); + + /** Overloads glGenTextures. */ + public static int glGenTextures() { + IntBuffer textures = APIUtil.getBufferInt(); + nglGenTextures(1, MemoryUtil.getAddress(textures)); + return textures.get(0); + } + + public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveAttrib(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name)); + } + static native void nglGetActiveAttrib(int program, int index, int name_bufsize, long length, long size, long type, long name); + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveAttrib(int program, int index, int bufsize, IntBuffer sizeType) { + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(); + ByteBuffer name = APIUtil.getBufferByte(bufsize); + nglGetActiveAttrib(program, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name)); + name.limit(name_length.get(0)); + return APIUtil.getString(name); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns only the attrib name. + */ + public static String glGetActiveAttrib(int program, int index, int bufsize) { + IntBuffer name_length = APIUtil.getLengths(); + ByteBuffer name = APIUtil.getBufferByte(bufsize); + nglGetActiveAttrib(program, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt()), MemoryUtil.getAddress(APIUtil.getBufferInt(), 1), MemoryUtil.getAddress(name)); + name.limit(name_length.get(0)); + return APIUtil.getString(name); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns only the attrib size. + */ + public static int glGetActiveAttribSize(int program, int index) { + IntBuffer size = APIUtil.getBufferInt(); + nglGetActiveAttrib(program, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0()); + return size.get(0); + } + + /** + * Overloads glGetActiveAttrib. + * <p> + * Overloads glGetActiveAttrib. This version returns only the attrib type. + */ + public static int glGetActiveAttribType(int program, int index) { + IntBuffer type = APIUtil.getBufferInt(); + nglGetActiveAttrib(program, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0()); + return type.get(0); + } + + public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetActiveUniform(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name)); + } + static native void nglGetActiveUniform(int program, int index, int name_bufsize, long length, long size, long type, long name); + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). + */ + public static String glGetActiveUniform(int program, int index, int bufsize, IntBuffer sizeType) { + BufferChecks.checkBuffer(sizeType, 2); + IntBuffer name_length = APIUtil.getLengths(); + ByteBuffer name = APIUtil.getBufferByte(bufsize); + nglGetActiveUniform(program, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(sizeType), MemoryUtil.getAddress(sizeType, sizeType.position() + 1), MemoryUtil.getAddress(name)); + name.limit(name_length.get(0)); + return APIUtil.getString(name); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniformARB. This version returns only the uniform name. + */ + public static String glGetActiveUniform(int program, int index, int bufsize) { + IntBuffer name_length = APIUtil.getLengths(); + ByteBuffer name = APIUtil.getBufferByte(bufsize); + nglGetActiveUniform(program, index, bufsize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt()), MemoryUtil.getAddress(APIUtil.getBufferInt(), 1), MemoryUtil.getAddress(name)); + name.limit(name_length.get(0)); + return APIUtil.getString(name); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns only the uniform size. + */ + public static int glGetActiveUniformSize(int program, int index) { + IntBuffer size = APIUtil.getBufferInt(); + nglGetActiveUniform(program, index, 0, 0L, MemoryUtil.getAddress(size), MemoryUtil.getAddress(size, 1), APIUtil.getBufferByte0()); + return size.get(0); + } + + /** + * Overloads glGetActiveUniform. + * <p> + * Overloads glGetActiveUniform. This version returns only the uniform type. + */ + public static int glGetActiveUniformType(int program, int index) { + IntBuffer type = APIUtil.getBufferInt(); + nglGetActiveUniform(program, index, 0, 0L, MemoryUtil.getAddress(type, 1), MemoryUtil.getAddress(type), APIUtil.getBufferByte0()); + return type.get(0); + } + + public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) { + if (count != null) + BufferChecks.checkBuffer(count, 1); + BufferChecks.checkDirect(shaders); + nglGetAttachedShaders(program, shaders.remaining(), MemoryUtil.getAddressSafe(count), MemoryUtil.getAddress(shaders)); + } + static native void nglGetAttachedShaders(int program, int shaders_maxCount, long count, long shaders); + + public static int glGetAttribLocation(int program, ByteBuffer name) { + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetAttribLocation(program, MemoryUtil.getAddress(name)); + return __result; + } + static native int nglGetAttribLocation(int program, long name); + + /** Overloads glGetAttribLocation. */ + public static int glGetAttribLocation(int program, CharSequence name) { + int __result = nglGetAttribLocation(program, APIUtil.getBufferNT(name)); + return __result; + } + + public static void glGetBoolean(int pname, ByteBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetBooleanv(pname, MemoryUtil.getAddress(params)); + } + static native void nglGetBooleanv(int pname, long params); + + /** Overloads glGetBooleanv. */ + public static boolean glGetBoolean(int pname) { + ByteBuffer params = APIUtil.getBufferByte(1); + nglGetBooleanv(pname, MemoryUtil.getAddress(params)); + return params.get(0) == 1; + } + + public static void glGetBufferParameter(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetBufferParameteriv(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetBufferParameteriv(int target, int pname, long params); + + /** + * Overloads glGetBufferParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri} instead. + */ + @Deprecated + public static int glGetBufferParameter(int target, int pname) { + return GLES20.glGetBufferParameteri(target, pname); + } + + /** Overloads glGetBufferParameteriv. */ + public static int glGetBufferParameteri(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetBufferParameteriv(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static int glGetError() { + int __result = nglGetError(); + return __result; + } + static native int nglGetError(); + + public static void glGetFloat(int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetFloatv(pname, MemoryUtil.getAddress(params)); + } + static native void nglGetFloatv(int pname, long params); + + /** Overloads glGetFloatv. */ + public static float glGetFloat(int pname) { + FloatBuffer params = APIUtil.getBufferFloat(); + nglGetFloatv(pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetFramebufferAttachmentParameter(int target, int attachment, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetFramebufferAttachmentParameteriv(int target, int attachment, int pname, long params); + + /** + * Overloads glGetFramebufferAttachmentParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. + */ + @Deprecated + public static int glGetFramebufferAttachmentParameter(int target, int attachment, int pname) { + return GLES20.glGetFramebufferAttachmentParameteri(target, attachment, pname); + } + + /** Overloads glGetFramebufferAttachmentParameteriv. */ + public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetFramebufferAttachmentParameteriv(target, attachment, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetInteger(int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetIntegerv(pname, MemoryUtil.getAddress(params)); + } + static native void nglGetIntegerv(int pname, long params); + + /** Overloads glGetIntegerv. */ + public static int glGetInteger(int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetIntegerv(pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetProgram(int program, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetProgramiv(program, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetProgramiv(int program, int pname, long params); + + /** + * Overloads glGetProgramiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetProgrami} instead. + */ + @Deprecated + public static int glGetProgram(int program, int pname) { + return GLES20.glGetProgrami(program, pname); + } + + /** Overloads glGetProgramiv. */ + public static int glGetProgrami(int program, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetProgramiv(program, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetProgramInfoLog(int program, IntBuffer length, ByteBuffer infoLog) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetProgramInfoLog(program, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog)); + } + static native void nglGetProgramInfoLog(int program, int infoLog_bufsize, long length, long infoLog); + + /** Overloads glGetProgramInfoLog. */ + public static String glGetProgramInfoLog(int program, int bufsize) { + IntBuffer infoLog_length = APIUtil.getLengths(); + ByteBuffer infoLog = APIUtil.getBufferByte(bufsize); + nglGetProgramInfoLog(program, bufsize, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog)); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(infoLog); + } + + public static void glGetRenderbufferParameter(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetRenderbufferParameteriv(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetRenderbufferParameteriv(int target, int pname, long params); + + /** + * Overloads glGetRenderbufferParameteriv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. + */ + @Deprecated + public static int glGetRenderbufferParameter(int target, int pname) { + return GLES20.glGetRenderbufferParameteri(target, pname); + } + + /** Overloads glGetRenderbufferParameteriv. */ + public static int glGetRenderbufferParameteri(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetRenderbufferParameteriv(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetShader(int shader, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetShaderiv(shader, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetShaderiv(int shader, int pname, long params); + + /** + * Overloads glGetShaderiv. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetShaderi} instead. + */ + @Deprecated + public static int glGetShader(int shader, int pname) { + return GLES20.glGetShaderi(shader, pname); + } + + /** Overloads glGetShaderiv. */ + public static int glGetShaderi(int shader, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetShaderiv(shader, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetShaderInfoLog(int shader, IntBuffer length, ByteBuffer infoLog) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(infoLog); + nglGetShaderInfoLog(shader, infoLog.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(infoLog)); + } + static native void nglGetShaderInfoLog(int shader, int infoLog_bufsize, long length, long infoLog); + + /** Overloads glGetShaderInfoLog. */ + public static String glGetShaderInfoLog(int shader, int bufsize) { + IntBuffer infoLog_length = APIUtil.getLengths(); + ByteBuffer infoLog = APIUtil.getBufferByte(bufsize); + nglGetShaderInfoLog(shader, bufsize, MemoryUtil.getAddress0(infoLog_length), MemoryUtil.getAddress(infoLog)); + infoLog.limit(infoLog_length.get(0)); + return APIUtil.getString(infoLog); + } + + public static void glGetShaderPrecisionFormat(int shadertype, int precisiontype, IntBuffer range, IntBuffer precision) { + BufferChecks.checkBuffer(range, 2); + BufferChecks.checkBuffer(precision, 1); + nglGetShaderPrecisionFormat(shadertype, precisiontype, MemoryUtil.getAddress(range), MemoryUtil.getAddress(precision)); + } + static native void nglGetShaderPrecisionFormat(int shadertype, int precisiontype, long range, long precision); + + public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(source); + nglGetShaderSource(shader, source.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(source)); + } + static native void nglGetShaderSource(int shader, int source_bufsize, long length, long source); + + /** Overloads glGetShaderSource. */ + public static String glGetShaderSource(int shader, int bufsize) { + IntBuffer source_length = APIUtil.getLengths(); + ByteBuffer source = APIUtil.getBufferByte(bufsize); + nglGetShaderSource(shader, bufsize, MemoryUtil.getAddress0(source_length), MemoryUtil.getAddress(source)); + source.limit(source_length.get(0)); + return APIUtil.getString(source); + } + + public static String glGetString(int name) { + String __result = nglGetString(name); + return __result; + } + static native String nglGetString(int name); + + public static void glGetTexParameter(int target, int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetTexParameterfv(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetTexParameterfv(int target, int pname, long params); + + /** Overloads glGetTexParameterfv. */ + public static float glGetTexParameterf(int target, int pname) { + FloatBuffer params = APIUtil.getBufferFloat(); + nglGetTexParameterfv(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetTexParameter(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetTexParameteriv(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetTexParameteriv(int target, int pname, long params); + + /** Overloads glGetTexParameteriv. */ + public static int glGetTexParameteri(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetTexParameteriv(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetUniform(int program, int location, FloatBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetUniformfv(program, location, MemoryUtil.getAddress(params)); + } + static native void nglGetUniformfv(int program, int location, long params); + + public static void glGetUniform(int program, int location, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetUniformiv(program, location, MemoryUtil.getAddress(params)); + } + static native void nglGetUniformiv(int program, int location, long params); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a + * <b>null-terminated</b> string. + * <p> + * @param program + * @param name + */ + public static int glGetUniformLocation(int program, ByteBuffer name) { + BufferChecks.checkBuffer(name, 1); + BufferChecks.checkNullTerminated(name); + int __result = nglGetUniformLocation(program, MemoryUtil.getAddress(name)); + return __result; + } + static native int nglGetUniformLocation(int program, long name); + + /** Overloads glGetUniformLocation. */ + public static int glGetUniformLocation(int program, CharSequence name) { + int __result = nglGetUniformLocation(program, APIUtil.getBufferNT(name)); + return __result; + } + + public static void glGetVertexAttrib(int index, int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribfv(index, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetVertexAttribfv(int index, int pname, long params); + + public static void glGetVertexAttrib(int index, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribiv(index, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetVertexAttribiv(int index, int pname, long params); + + public static ByteBuffer glGetVertexAttribPointer(int index, int pname, long result_size) { + ByteBuffer __result = nglGetVertexAttribPointerv(index, pname, result_size); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetVertexAttribPointerv(int index, int pname, long result_size); + + public static void glHint(int target, int mode) { + nglHint(target, mode); + } + static native void nglHint(int target, int mode); + + public static boolean glIsBuffer(int buffer) { + boolean __result = nglIsBuffer(buffer); + return __result; + } + static native boolean nglIsBuffer(int buffer); + + public static boolean glIsEnabled(int cap) { + boolean __result = nglIsEnabled(cap); + return __result; + } + static native boolean nglIsEnabled(int cap); + + public static boolean glIsFramebuffer(int framebuffer) { + boolean __result = nglIsFramebuffer(framebuffer); + return __result; + } + static native boolean nglIsFramebuffer(int framebuffer); + + public static boolean glIsProgram(int program) { + boolean __result = nglIsProgram(program); + return __result; + } + static native boolean nglIsProgram(int program); + + public static boolean glIsRenderbuffer(int renderbuffer) { + boolean __result = nglIsRenderbuffer(renderbuffer); + return __result; + } + static native boolean nglIsRenderbuffer(int renderbuffer); + + public static boolean glIsShader(int shader) { + boolean __result = nglIsShader(shader); + return __result; + } + static native boolean nglIsShader(int shader); + + public static boolean glIsTexture(int texture) { + boolean __result = nglIsTexture(texture); + return __result; + } + static native boolean nglIsTexture(int texture); + + public static void glLineWidth(float width) { + nglLineWidth(width); + } + static native void nglLineWidth(float width); + + public static void glLinkProgram(int program) { + nglLinkProgram(program); + } + static native void nglLinkProgram(int program); + + public static void glPixelStorei(int pname, int param) { + nglPixelStorei(pname, param); + } + static native void nglPixelStorei(int pname, int param); + + public static void glPolygonOffset(float factor, float units) { + nglPolygonOffset(factor, units); + } + static native void nglPolygonOffset(float factor, float units); + + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ShortBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglReadPixels(x, y, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + static native void nglReadPixels(int x, int y, int width, int height, int format, int type, long pixels); + + public static void glReleaseShaderCompiler() { + nglReleaseShaderCompiler(); + } + static native void nglReleaseShaderCompiler(); + + public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { + nglRenderbufferStorage(target, internalformat, width, height); + } + static native void nglRenderbufferStorage(int target, int internalformat, int width, int height); + + public static void glSampleCoverage(float value, boolean invert) { + nglSampleCoverage(value, invert); + } + static native void nglSampleCoverage(float value, boolean invert); + + public static void glScissor(int x, int y, int width, int height) { + nglScissor(x, y, width, height); + } + static native void nglScissor(int x, int y, int width, int height); + + public static void glShaderBinary(IntBuffer shaders, int binaryformat, ByteBuffer binary) { + BufferChecks.checkDirect(shaders); + BufferChecks.checkDirect(binary); + nglShaderBinary(shaders.remaining(), MemoryUtil.getAddress(shaders), binaryformat, MemoryUtil.getAddress(binary), binary.remaining()); + } + static native void nglShaderBinary(int shaders_n, long shaders, int binaryformat, long binary, int binary_length); + + /** + * glShaderSource allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + * <p> + * @param shader + * @param string + */ + public static void glShaderSource(int shader, ByteBuffer string) { + BufferChecks.checkDirect(string); + nglShaderSource(shader, 1, MemoryUtil.getAddress(string), string.remaining()); + } + static native void nglShaderSource(int shader, int count, long string, int string_length); + + /** Overloads glShaderSource. */ + public static void glShaderSource(int shader, CharSequence string) { + nglShaderSource(shader, 1, APIUtil.getBuffer(string), string.length()); + } + + /** Overloads glShaderSource. */ + public static void glShaderSource(int shader, CharSequence[] strings) { + BufferChecks.checkArray(strings); + nglShaderSource3(shader, strings.length, APIUtil.getBuffer(strings), APIUtil.getLengths(strings)); + } + static native void nglShaderSource3(int shader, int count, long strings, long length); + + public static void glStencilFunc(int func, int ref, int mask) { + nglStencilFunc(func, ref, mask); + } + static native void nglStencilFunc(int func, int ref, int mask); + + public static void glStencilFuncSeparate(int face, int func, int ref, int mask) { + nglStencilFuncSeparate(face, func, ref, mask); + } + static native void nglStencilFuncSeparate(int face, int func, int ref, int mask); + + public static void glStencilMask(int mask) { + nglStencilMask(mask); + } + static native void nglStencilMask(int mask); + + public static void glStencilMaskSeparate(int face, int mask) { + nglStencilMaskSeparate(face, mask); + } + static native void nglStencilMaskSeparate(int face, int mask); + + public static void glStencilOp(int fail, int zfail, int zpass) { + nglStencilOp(fail, zfail, zpass); + } + static native void nglStencilOp(int fail, int zfail, int zpass); + + public static void glStencilOpSeparate(int face, int fail, int zfail, int zpass) { + nglStencilOpSeparate(face, fail, zfail, zpass); + } + static native void nglStencilOpSeparate(int face, int fail, int zfail, int zpass); + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ShortBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)); + nglTexImage2D(target, level, internalformat, width, height, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + static native void nglTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels); + + public static void glTexParameterf(int target, int pname, float param) { + nglTexParameterf(target, pname, param); + } + static native void nglTexParameterf(int target, int pname, float param); + + public static void glTexParameter(int target, int pname, FloatBuffer param) { + BufferChecks.checkBuffer(param, 4); + nglTexParameterfv(target, pname, MemoryUtil.getAddress(param)); + } + static native void nglTexParameterfv(int target, int pname, long param); + + public static void glTexParameteri(int target, int pname, int param) { + nglTexParameteri(target, pname, param); + } + static native void nglTexParameteri(int target, int pname, int param); + + public static void glTexParameter(int target, int pname, IntBuffer param) { + BufferChecks.checkBuffer(param, 4); + nglTexParameteriv(target, pname, MemoryUtil.getAddress(param)); + } + static native void nglTexParameteriv(int target, int pname, long param); + + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, FloatBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ShortBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)); + nglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, MemoryUtil.getAddress(pixels)); + } + static native void nglTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels); + + public static void glUniform1f(int location, float x) { + nglUniform1f(location, x); + } + static native void nglUniform1f(int location, float x); + + public static void glUniform1(int location, FloatBuffer v) { + BufferChecks.checkDirect(v); + nglUniform1fv(location, v.remaining(), MemoryUtil.getAddress(v)); + } + static native void nglUniform1fv(int location, int v_count, long v); + + public static void glUniform1i(int location, int x) { + nglUniform1i(location, x); + } + static native void nglUniform1i(int location, int x); + + public static void glUniform1(int location, IntBuffer v) { + BufferChecks.checkDirect(v); + nglUniform1iv(location, v.remaining(), MemoryUtil.getAddress(v)); + } + static native void nglUniform1iv(int location, int v_count, long v); + + public static void glUniform2f(int location, float x, float y) { + nglUniform2f(location, x, y); + } + static native void nglUniform2f(int location, float x, float y); + + public static void glUniform2(int location, FloatBuffer v) { + BufferChecks.checkDirect(v); + nglUniform2fv(location, v.remaining() >> 1, MemoryUtil.getAddress(v)); + } + static native void nglUniform2fv(int location, int v_count, long v); + + public static void glUniform2i(int location, int x, int y) { + nglUniform2i(location, x, y); + } + static native void nglUniform2i(int location, int x, int y); + + public static void glUniform2(int location, IntBuffer v) { + BufferChecks.checkDirect(v); + nglUniform2iv(location, v.remaining() >> 1, MemoryUtil.getAddress(v)); + } + static native void nglUniform2iv(int location, int v_count, long v); + + public static void glUniform3f(int location, float x, float y, float z) { + nglUniform3f(location, x, y, z); + } + static native void nglUniform3f(int location, float x, float y, float z); + + public static void glUniform3(int location, FloatBuffer v) { + BufferChecks.checkDirect(v); + nglUniform3fv(location, v.remaining() / 3, MemoryUtil.getAddress(v)); + } + static native void nglUniform3fv(int location, int v_count, long v); + + public static void glUniform3i(int location, int x, int y, int z) { + nglUniform3i(location, x, y, z); + } + static native void nglUniform3i(int location, int x, int y, int z); + + public static void glUniform3(int location, IntBuffer v) { + BufferChecks.checkDirect(v); + nglUniform3iv(location, v.remaining() / 3, MemoryUtil.getAddress(v)); + } + static native void nglUniform3iv(int location, int v_count, long v); + + public static void glUniform4f(int location, float x, float y, float z, float w) { + nglUniform4f(location, x, y, z, w); + } + static native void nglUniform4f(int location, float x, float y, float z, float w); + + public static void glUniform4(int location, FloatBuffer v) { + BufferChecks.checkDirect(v); + nglUniform4fv(location, v.remaining() >> 2, MemoryUtil.getAddress(v)); + } + static native void nglUniform4fv(int location, int v_count, long v); + + public static void glUniform4i(int location, int x, int y, int z, int w) { + nglUniform4i(location, x, y, z, w); + } + static native void nglUniform4i(int location, int x, int y, int z, int w); + + public static void glUniform4(int location, IntBuffer v) { + BufferChecks.checkDirect(v); + nglUniform4iv(location, v.remaining() >> 2, MemoryUtil.getAddress(v)); + } + static native void nglUniform4iv(int location, int v_count, long v); + + public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix2fv(location, matrices.remaining() >> 2, transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix2fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix3fv(location, matrices.remaining() / (3 * 3), transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix3fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix4fv(location, matrices.remaining() >> 4, transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix4fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUseProgram(int program) { + nglUseProgram(program); + } + static native void nglUseProgram(int program); + + public static void glValidateProgram(int program) { + nglValidateProgram(program); + } + static native void nglValidateProgram(int program); + + public static void glVertexAttrib1f(int indx, float x) { + nglVertexAttrib1f(indx, x); + } + static native void nglVertexAttrib1f(int indx, float x); + + public static void glVertexAttrib1(int indx, FloatBuffer values) { + BufferChecks.checkBuffer(values, 1); + nglVertexAttrib1fv(indx, MemoryUtil.getAddress(values)); + } + static native void nglVertexAttrib1fv(int indx, long values); + + public static void glVertexAttrib2f(int indx, float x, float y) { + nglVertexAttrib2f(indx, x, y); + } + static native void nglVertexAttrib2f(int indx, float x, float y); + + public static void glVertexAttrib2(int indx, FloatBuffer values) { + BufferChecks.checkBuffer(values, 2); + nglVertexAttrib2fv(indx, MemoryUtil.getAddress(values)); + } + static native void nglVertexAttrib2fv(int indx, long values); + + public static void glVertexAttrib3f(int indx, float x, float y, float z) { + nglVertexAttrib3f(indx, x, y, z); + } + static native void nglVertexAttrib3f(int indx, float x, float y, float z); + + public static void glVertexAttrib3(int indx, FloatBuffer values) { + BufferChecks.checkBuffer(values, 3); + nglVertexAttrib3fv(indx, MemoryUtil.getAddress(values)); + } + static native void nglVertexAttrib3fv(int indx, long values); + + public static void glVertexAttrib4f(int indx, float x, float y, float z, float w) { + nglVertexAttrib4f(indx, x, y, z, w); + } + static native void nglVertexAttrib4f(int indx, float x, float y, float z, float w); + + public static void glVertexAttrib4(int indx, FloatBuffer values) { + BufferChecks.checkBuffer(values, 4); + nglVertexAttrib4fv(indx, MemoryUtil.getAddress(values)); + } + static native void nglVertexAttrib4fv(int indx, long values); + + public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, GLES20.GL_FLOAT, normalized, stride, MemoryUtil.getAddress(buffer)); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, ByteBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GLES20.GL_UNSIGNED_BYTE : GLES20.GL_BYTE, normalized, stride, MemoryUtil.getAddress(buffer)); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, IntBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GLES20.GL_UNSIGNED_INT : GLES20.GL_INT, normalized, stride, MemoryUtil.getAddress(buffer)); + } + public static void glVertexAttribPointer(int index, int size, boolean unsigned, boolean normalized, int stride, ShortBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribPointer(index, size, unsigned ? GLES20.GL_UNSIGNED_SHORT : GLES20.GL_SHORT, normalized, stride, MemoryUtil.getAddress(buffer)); + } + static native void nglVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long buffer); + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset) { + GLChecks.ensureArrayVBOenabled(); + nglVertexAttribPointerBO(index, size, type, normalized, stride, buffer_buffer_offset); + } + static native void nglVertexAttribPointerBO(int index, int size, int type, boolean normalized, int stride, long buffer_buffer_offset); + + public static void glViewport(int x, int y, int width, int height) { + nglViewport(x, y, width, height); + } + static native void nglViewport(int x, int y, int width, int height); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES30.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES30.java new file mode 100644 index 0000000..6a3be0b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/GLES30.java @@ -0,0 +1,1261 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class GLES30 { + + public static final int GL_READ_BUFFER = 0xC02, + GL_UNPACK_ROW_LENGTH = 0xCF2, + GL_UNPACK_SKIP_ROWS = 0xCF3, + GL_UNPACK_SKIP_PIXELS = 0xCF4, + GL_PACK_ROW_LENGTH = 0xD02, + GL_PACK_SKIP_ROWS = 0xD03, + GL_PACK_SKIP_PIXELS = 0xD04, + GL_COLOR = 0x1800, + GL_DEPTH = 0x1801, + GL_STENCIL = 0x1802, + GL_RED = 0x1903, + GL_RGB8 = 0x8051, + GL_RGBA8 = 0x8058, + GL_RGB10_A2 = 0x8059, + GL_TEXTURE_BINDING_3D = 0x806A, + GL_PACK_SKIP_IMAGES = 0x806B, + GL_PACK_IMAGE_HEIGHT = 0x806C, + GL_UNPACK_SKIP_IMAGES = 0x806D, + GL_UNPACK_IMAGE_HEIGHT = 0x806E, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_WRAP_R = 0x8072, + GL_MAX_3D_TEXTURE_SIZE = 0x8073, + GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368, + GL_MAX_ELEMENTS_VERTICES = 0x80E8, + GL_MAX_ELEMENTS_INDICES = 0x80E9, + GL_TEXTURE_MIN_LOD = 0x813A, + GL_TEXTURE_MAX_LOD = 0x813B, + GL_TEXTURE_BASE_LEVEL = 0x813C, + GL_TEXTURE_MAX_LEVEL = 0x813D, + GL_MIN = 0x8007, + GL_MAX = 0x8008, + GL_DEPTH_COMPONENT24 = 0x81A6, + GL_MAX_TEXTURE_LOD_BIAS = 0x84FD, + GL_TEXTURE_COMPARE_MODE = 0x884C, + GL_TEXTURE_COMPARE_FUNC = 0x884D, + GL_CURRENT_QUERY = 0x8865, + GL_QUERY_RESULT = 0x8866, + GL_QUERY_RESULT_AVAILABLE = 0x8867, + GL_BUFFER_MAPPED = 0x88BC, + GL_BUFFER_MAP_POINTER = 0x88BD, + GL_STREAM_READ = 0x88E1, + GL_STREAM_COPY = 0x88E2, + GL_STATIC_READ = 0x88E5, + GL_STATIC_COPY = 0x88E6, + GL_DYNAMIC_READ = 0x88E9, + GL_DYNAMIC_COPY = 0x88EA, + GL_MAX_DRAW_BUFFERS = 0x8824, + GL_DRAW_BUFFER0 = 0x8825, + GL_DRAW_BUFFER1 = 0x8826, + GL_DRAW_BUFFER2 = 0x8827, + GL_DRAW_BUFFER3 = 0x8828, + GL_DRAW_BUFFER4 = 0x8829, + GL_DRAW_BUFFER5 = 0x882A, + GL_DRAW_BUFFER6 = 0x882B, + GL_DRAW_BUFFER7 = 0x882C, + GL_DRAW_BUFFER8 = 0x882D, + GL_DRAW_BUFFER9 = 0x882E, + GL_DRAW_BUFFER10 = 0x882F, + GL_DRAW_BUFFER11 = 0x8830, + GL_DRAW_BUFFER12 = 0x8831, + GL_DRAW_BUFFER13 = 0x8832, + GL_DRAW_BUFFER14 = 0x8833, + GL_DRAW_BUFFER15 = 0x8834, + GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49, + GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A, + GL_SAMPLER_3D = 0x8B5F, + GL_SAMPLER_2D_SHADOW = 0x8B62, + GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B, + GL_PIXEL_PACK_BUFFER = 0x88EB, + GL_PIXEL_UNPACK_BUFFER = 0x88EC, + GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED, + GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF, + GL_FLOAT_MAT2x3 = 0x8B65, + GL_FLOAT_MAT2x4 = 0x8B66, + GL_FLOAT_MAT3x2 = 0x8B67, + GL_FLOAT_MAT3x4 = 0x8B68, + GL_FLOAT_MAT4x2 = 0x8B69, + GL_FLOAT_MAT4x3 = 0x8B6A, + GL_SRGB = 0x8C40, + GL_SRGB8 = 0x8C41, + GL_SRGB8_ALPHA8 = 0x8C43, + GL_COMPARE_REF_TO_TEXTURE = 0x884E, + GL_MAJOR_VERSION = 0x821B, + GL_MINOR_VERSION = 0x821C, + GL_NUM_EXTENSIONS = 0x821D, + GL_RGBA32F = 0x8814, + GL_RGB32F = 0x8815, + GL_RGBA16F = 0x881A, + GL_RGB16F = 0x881B, + GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD, + GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF, + GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904, + GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905, + GL_MAX_VARYING_COMPONENTS = 0x8B4B, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D, + GL_R11F_G11F_B10F = 0x8C3A, + GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B, + GL_RGB9_E5 = 0x8C3D, + GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E, + GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76, + GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80, + GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83, + GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84, + GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85, + GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88, + GL_RASTERIZER_DISCARD = 0x8C89, + GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A, + GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B, + GL_INTERLEAVED_ATTRIBS = 0x8C8C, + GL_SEPARATE_ATTRIBS = 0x8C8D, + GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E, + GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F, + GL_RGBA32UI = 0x8D70, + GL_RGB32UI = 0x8D71, + GL_RGBA16UI = 0x8D76, + GL_RGB16UI = 0x8D77, + GL_RGBA8UI = 0x8D7C, + GL_RGB8UI = 0x8D7D, + GL_RGBA32I = 0x8D82, + GL_RGB32I = 0x8D83, + GL_RGBA16I = 0x8D88, + GL_RGB16I = 0x8D89, + GL_RGBA8I = 0x8D8E, + GL_RGB8I = 0x8D8F, + GL_RED_INTEGER = 0x8D94, + GL_RGB_INTEGER = 0x8D98, + GL_RGBA_INTEGER = 0x8D99, + GL_SAMPLER_2D_ARRAY = 0x8DC1, + GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4, + GL_SAMPLER_CUBE_SHADOW = 0x8DC5, + GL_UNSIGNED_INT_VEC2 = 0x8DC6, + GL_UNSIGNED_INT_VEC3 = 0x8DC7, + GL_UNSIGNED_INT_VEC4 = 0x8DC8, + GL_INT_SAMPLER_2D = 0x8DCA, + GL_INT_SAMPLER_3D = 0x8DCB, + GL_INT_SAMPLER_CUBE = 0x8DCC, + GL_INT_SAMPLER_2D_ARRAY = 0x8DCF, + GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2, + GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3, + GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4, + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7, + GL_BUFFER_ACCESS_FLAGS = 0x911F, + GL_BUFFER_MAP_LENGTH = 0x9120, + GL_BUFFER_MAP_OFFSET = 0x9121, + GL_DEPTH_COMPONENT32F = 0x8CAC, + GL_DEPTH32F_STENCIL8 = 0x8CAD, + GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210, + GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211, + GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212, + GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213, + GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214, + GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215, + GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216, + GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217, + GL_FRAMEBUFFER_DEFAULT = 0x8218, + GL_FRAMEBUFFER_UNDEFINED = 0x8219, + GL_DEPTH_STENCIL_ATTACHMENT = 0x821A, + GL_DEPTH_STENCIL = 0x84F9, + GL_UNSIGNED_INT_24_8 = 0x84FA, + GL_DEPTH24_STENCIL8 = 0x88F0, + GL_UNSIGNED_NORMALIZED = 0x8C17, + GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6, + GL_READ_FRAMEBUFFER = 0x8CA8, + GL_DRAW_FRAMEBUFFER = 0x8CA9, + GL_READ_FRAMEBUFFER_BINDING = 0x8CAA, + GL_RENDERBUFFER_SAMPLES = 0x8CAB, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4, + GL_MAX_COLOR_ATTACHMENTS = 0x8CDF, + GL_COLOR_ATTACHMENT1 = 0x8CE1, + GL_COLOR_ATTACHMENT2 = 0x8CE2, + GL_COLOR_ATTACHMENT3 = 0x8CE3, + GL_COLOR_ATTACHMENT4 = 0x8CE4, + GL_COLOR_ATTACHMENT5 = 0x8CE5, + GL_COLOR_ATTACHMENT6 = 0x8CE6, + GL_COLOR_ATTACHMENT7 = 0x8CE7, + GL_COLOR_ATTACHMENT8 = 0x8CE8, + GL_COLOR_ATTACHMENT9 = 0x8CE9, + GL_COLOR_ATTACHMENT10 = 0x8CEA, + GL_COLOR_ATTACHMENT11 = 0x8CEB, + GL_COLOR_ATTACHMENT12 = 0x8CEC, + GL_COLOR_ATTACHMENT13 = 0x8CED, + GL_COLOR_ATTACHMENT14 = 0x8CEE, + GL_COLOR_ATTACHMENT15 = 0x8CEF, + GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56, + GL_MAX_SAMPLES = 0x8D57, + GL_HALF_FLOAT = 0x140B, + GL_MAP_READ_BIT = 0x1, + GL_MAP_WRITE_BIT = 0x2, + GL_MAP_INVALIDATE_RANGE_BIT = 0x4, + GL_MAP_INVALIDATE_BUFFER_BIT = 0x8, + GL_MAP_FLUSH_EXPLICIT_BIT = 0x10, + GL_MAP_UNSYNCHRONIZED_BIT = 0x20, + GL_RG = 0x8227, + GL_RG_INTEGER = 0x8228, + GL_R8 = 0x8229, + GL_RG8 = 0x822B, + GL_R16F = 0x822D, + GL_R32F = 0x822E, + GL_RG16F = 0x822F, + GL_RG32F = 0x8230, + GL_R8I = 0x8231, + GL_R8UI = 0x8232, + GL_R16I = 0x8233, + GL_R16UI = 0x8234, + GL_R32I = 0x8235, + GL_R32UI = 0x8236, + GL_RG8I = 0x8237, + GL_RG8UI = 0x8238, + GL_RG16I = 0x8239, + GL_RG16UI = 0x823A, + GL_RG32I = 0x823B, + GL_RG32UI = 0x823C, + GL_VERTEX_ARRAY_BINDING = 0x85B5, + GL_R8_SNORM = 0x8F94, + GL_RG8_SNORM = 0x8F95, + GL_RGB8_SNORM = 0x8F96, + GL_RGBA8_SNORM = 0x8F97, + GL_SIGNED_NORMALIZED = 0x8F9C, + GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69, + GL_COPY_READ_BUFFER = 0x8F36, + GL_COPY_WRITE_BUFFER = 0x8F37, + GL_COPY_READ_BUFFER_BINDING = 0x8F36, + GL_COPY_WRITE_BUFFER_BINDING = 0x8F37, + GL_UNIFORM_BUFFER = 0x8A11, + GL_UNIFORM_BUFFER_BINDING = 0x8A28, + GL_UNIFORM_BUFFER_START = 0x8A29, + GL_UNIFORM_BUFFER_SIZE = 0x8A2A, + GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B, + GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D, + GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E, + GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F, + GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30, + GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31, + GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33, + GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34, + GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35, + GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36, + GL_UNIFORM_TYPE = 0x8A37, + GL_UNIFORM_SIZE = 0x8A38, + GL_UNIFORM_NAME_LENGTH = 0x8A39, + GL_UNIFORM_BLOCK_INDEX = 0x8A3A, + GL_UNIFORM_OFFSET = 0x8A3B, + GL_UNIFORM_ARRAY_STRIDE = 0x8A3C, + GL_UNIFORM_MATRIX_STRIDE = 0x8A3D, + GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E, + GL_UNIFORM_BLOCK_BINDING = 0x8A3F, + GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40, + GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42, + GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43, + GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44, + GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46, + GL_INVALID_INDEX = 0xFFFFFFFF, + GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122, + GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125, + GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111, + GL_OBJECT_TYPE = 0x9112, + GL_SYNC_CONDITION = 0x9113, + GL_SYNC_STATUS = 0x9114, + GL_SYNC_FLAGS = 0x9115, + GL_SYNC_FENCE = 0x9116, + GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117, + GL_UNSIGNALED = 0x9118, + GL_SIGNALED = 0x9119, + GL_ALREADY_SIGNALED = 0x911A, + GL_TIMEOUT_EXPIRED = 0x911B, + GL_CONDITION_SATISFIED = 0x911C, + GL_WAIT_FAILED = 0x911D, + GL_SYNC_FLUSH_COMMANDS_BIT = 0x1; + + public static final long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFL; + + public static final int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE, + GL_ANY_SAMPLES_PASSED = 0x8C2F, + GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A, + GL_SAMPLER_BINDING = 0x8919, + GL_RGB10_A2UI = 0x906F, + GL_TEXTURE_SWIZZLE_R = 0x8E42, + GL_TEXTURE_SWIZZLE_G = 0x8E43, + GL_TEXTURE_SWIZZLE_B = 0x8E44, + GL_TEXTURE_SWIZZLE_A = 0x8E45, + GL_GREEN = 0x1904, + GL_BLUE = 0x1905, + GL_INT_2_10_10_10_REV = 0x8D9F, + GL_TRANSFORM_FEEDBACK = 0x8E22, + GL_TRANSFORM_FEEDBACK_PAUSED = 0x8E23, + GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8E24, + GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25, + GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257, + GL_PROGRAM_BINARY_LENGTH = 0x8741, + GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273, + GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F, + GL_MAX_ELEMENT_INDEX = 0x8D6B, + GL_NUM_SAMPLE_COUNTS = 0x9380; + + private GLES30() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glReadBuffer(int mode) { + nglReadBuffer(mode); + } + static native void nglReadBuffer(int mode); + + public static void glDrawRangeElements(int mode, int start, int end, ByteBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GLES20.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices)); + } + public static void glDrawRangeElements(int mode, int start, int end, IntBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GLES20.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices)); + } + public static void glDrawRangeElements(int mode, int start, int end, ShortBuffer indices) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawRangeElements(mode, start, end, indices.remaining(), GLES20.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices)); + } + static native void nglDrawRangeElements(int mode, int start, int end, int indices_count, int type, long indices); + public static void glDrawRangeElements(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset) { + GLChecks.ensureElementVBOenabled(); + nglDrawRangeElementsBO(mode, start, end, indices_count, type, indices_buffer_offset); + } + static native void nglDrawRangeElementsBO(int mode, int start, int end, int indices_count, int type, long indices_buffer_offset); + + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, FloatBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ShortBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + static native void nglTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels); + public static void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset) { + GLChecks.ensureUnpackPBOenabled(); + nglTexImage3DBO(target, level, internalFormat, width, height, depth, border, format, type, pixels_buffer_offset); + } + static native void nglTexImage3DBO(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels_buffer_offset); + + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer pixels) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + static native void nglTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset) { + GLChecks.ensureUnpackPBOenabled(); + nglTexSubImage3DBO(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_buffer_offset); + } + static native void nglTexSubImage3DBO(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels_buffer_offset); + + public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + nglCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); + } + static native void nglCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height); + + public static void glCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, ByteBuffer data) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkDirect(data); + nglCompressedTexImage3D(target, level, internalformat, width, height, depth, border, data.remaining(), MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data); + public static void glCompressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset) { + GLChecks.ensureUnpackPBOenabled(); + nglCompressedTexImage3DBO(target, level, internalformat, width, height, depth, border, data_imageSize, data_buffer_offset); + } + static native void nglCompressedTexImage3DBO(int target, int level, int internalformat, int width, int height, int depth, int border, int data_imageSize, long data_buffer_offset); + + public static void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, ByteBuffer data) { + GLChecks.ensureUnpackPBOdisabled(); + BufferChecks.checkDirect(data); + nglCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data.remaining(), MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data); + public static void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset) { + GLChecks.ensureUnpackPBOenabled(); + nglCompressedTexSubImage3DBO(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data_imageSize, data_buffer_offset); + } + static native void nglCompressedTexSubImage3DBO(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int data_imageSize, long data_buffer_offset); + + public static void glGenQueries(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglGenQueries(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglGenQueries(int ids_n, long ids); + + /** Overloads glGenQueries. */ + public static int glGenQueries() { + IntBuffer ids = APIUtil.getBufferInt(); + nglGenQueries(1, MemoryUtil.getAddress(ids)); + return ids.get(0); + } + + public static void glDeleteQueries(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglDeleteQueries(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglDeleteQueries(int ids_n, long ids); + + /** Overloads glDeleteQueries. */ + public static void glDeleteQueries(int id) { + nglDeleteQueries(1, APIUtil.getInt(id)); + } + + public static boolean glIsQuery(int id) { + boolean __result = nglIsQuery(id); + return __result; + } + static native boolean nglIsQuery(int id); + + public static void glBeginQuery(int target, int id) { + nglBeginQuery(target, id); + } + static native void nglBeginQuery(int target, int id); + + public static void glEndQuery(int target) { + nglEndQuery(target); + } + static native void nglEndQuery(int target); + + public static void glGetQuery(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetQueryiv(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetQueryiv(int target, int pname, long params); + + /** Overloads glGetQueryiv. */ + public static int glGetQueryi(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetQueryiv(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetQueryObjectu(int id, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetQueryObjectuiv(id, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetQueryObjectuiv(int id, int pname, long params); + + /** Overloads glGetQueryObjectuiv. */ + public static int glGetQueryObjectui(int id, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetQueryObjectuiv(id, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static boolean glUnmapBuffer(int target) { + boolean __result = nglUnmapBuffer(target); + return __result; + } + static native boolean nglUnmapBuffer(int target); + + public static ByteBuffer glGetBufferPointer(int target, int pname) { + ByteBuffer __result = nglGetBufferPointerv(target, pname, GLChecks.getBufferObjectSize(target)); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetBufferPointerv(int target, int pname, long result_size); + + public static void glDrawBuffers(IntBuffer buffers) { + BufferChecks.checkDirect(buffers); + nglDrawBuffers(buffers.remaining(), MemoryUtil.getAddress(buffers)); + } + static native void nglDrawBuffers(int buffers_size, long buffers); + + /** Overloads glDrawBuffers. */ + public static void glDrawBuffers(int buffer) { + nglDrawBuffers(1, APIUtil.getInt(buffer)); + } + + public static void glUniformMatrix2x3(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix2x3fv(location, matrices.remaining() / (2 * 3), transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix2x3fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix3x2(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix3x2fv(location, matrices.remaining() / (3 * 2), transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix3x2fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix2x4(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix2x4fv(location, matrices.remaining() >> 3, transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix2x4fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix4x2(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix4x2fv(location, matrices.remaining() >> 3, transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix4x2fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix3x4(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix3x4fv(location, matrices.remaining() / (3 * 4), transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix3x4fv(int location, int matrices_count, boolean transpose, long matrices); + + public static void glUniformMatrix4x3(int location, boolean transpose, FloatBuffer matrices) { + BufferChecks.checkDirect(matrices); + nglUniformMatrix4x3fv(location, matrices.remaining() / (4 * 3), transpose, MemoryUtil.getAddress(matrices)); + } + static native void nglUniformMatrix4x3fv(int location, int matrices_count, boolean transpose, long matrices); + + /** + * Transfers a rectangle of pixel values from one + * region of the read framebuffer to another in the draw framebuffer. + * &lt;mask&gt; is the bitwise OR of a number of values indicating which + * buffers are to be copied. The values are COLOR_BUFFER_BIT, + * DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + * The pixels corresponding to these buffers are + * copied from the source rectangle, bound by the locations (srcX0, + * srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + * bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + * inclusive. + * If the source and destination rectangle dimensions do not match, + * the source image is stretched to fit the destination + * rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + * method of interpolation to be applied if the image is + * stretched. + */ + public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + nglBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + static native void nglBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter); + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { + nglRenderbufferStorageMultisample(target, samples, internalformat, width, height); + } + static native void nglRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height); + + public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) { + nglFramebufferTextureLayer(target, attachment, texture, level, layer); + } + static native void nglFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer); + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferRange(target, offset, length, access, old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer); + + public static void glFlushMappedBufferRange(int target, long offset, long length) { + nglFlushMappedBufferRange(target, offset, length); + } + static native void nglFlushMappedBufferRange(int target, long offset, long length); + + public static void glBindVertexArray(int array) { + StateTracker.bindVAO(array); + nglBindVertexArray(array); + } + static native void nglBindVertexArray(int array); + + public static void glDeleteVertexArrays(IntBuffer arrays) { + StateTracker.deleteVAO(arrays); + BufferChecks.checkDirect(arrays); + nglDeleteVertexArrays(arrays.remaining(), MemoryUtil.getAddress(arrays)); + } + static native void nglDeleteVertexArrays(int arrays_n, long arrays); + + /** Overloads glDeleteVertexArrays. */ + public static void glDeleteVertexArrays(int array) { + StateTracker.deleteVAO(array); + nglDeleteVertexArrays(1, APIUtil.getInt(array)); + } + + public static void glGenVertexArrays(IntBuffer arrays) { + BufferChecks.checkDirect(arrays); + nglGenVertexArrays(arrays.remaining(), MemoryUtil.getAddress(arrays)); + } + static native void nglGenVertexArrays(int arrays_n, long arrays); + + /** Overloads glGenVertexArrays. */ + public static int glGenVertexArrays() { + IntBuffer arrays = APIUtil.getBufferInt(); + nglGenVertexArrays(1, MemoryUtil.getAddress(arrays)); + return arrays.get(0); + } + + public static boolean glIsVertexArray(int array) { + boolean __result = nglIsVertexArray(array); + return __result; + } + static native boolean nglIsVertexArray(int array); + + public static void glGetInteger(int value, int index, IntBuffer data) { + BufferChecks.checkBuffer(data, 4); + nglGetIntegeri_v(value, index, MemoryUtil.getAddress(data)); + } + static native void nglGetIntegeri_v(int value, int index, long data); + + /** Overloads glGetIntegeri_v. */ + public static int glGetInteger(int value, int index) { + IntBuffer data = APIUtil.getBufferInt(); + nglGetIntegeri_v(value, index, MemoryUtil.getAddress(data)); + return data.get(0); + } + + public static void glBeginTransformFeedback(int primitiveMode) { + nglBeginTransformFeedback(primitiveMode); + } + static native void nglBeginTransformFeedback(int primitiveMode); + + public static void glEndTransformFeedback() { + nglEndTransformFeedback(); + } + static native void nglEndTransformFeedback(); + + public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) { + nglBindBufferRange(target, index, buffer, offset, size); + } + static native void nglBindBufferRange(int target, int index, int buffer, long offset, long size); + + public static void glBindBufferBase(int target, int index, int buffer) { + nglBindBufferBase(target, index, buffer); + } + static native void nglBindBufferBase(int target, int index, int buffer); + + public static void glTransformFeedbackVaryings(int program, int count, ByteBuffer varyings, int bufferMode) { + BufferChecks.checkDirect(varyings); + BufferChecks.checkNullTerminated(varyings, count); + nglTransformFeedbackVaryings(program, count, MemoryUtil.getAddress(varyings), bufferMode); + } + static native void nglTransformFeedbackVaryings(int program, int count, long varyings, int bufferMode); + + /** Overloads glTransformFeedbackVaryings. */ + public static void glTransformFeedbackVaryings(int program, CharSequence[] varyings, int bufferMode) { + BufferChecks.checkArray(varyings); + nglTransformFeedbackVaryings(program, varyings.length, APIUtil.getBufferNT(varyings), bufferMode); + } + + public static void glGetTransformFeedbackVarying(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + BufferChecks.checkDirect(name); + nglGetTransformFeedbackVarying(program, index, name.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name)); + } + static native void nglGetTransformFeedbackVarying(int program, int index, int name_bufSize, long length, long size, long type, long name); + + /** Overloads glGetTransformFeedbackVarying. */ + public static String glGetTransformFeedbackVarying(int program, int index, int bufSize, IntBuffer size, IntBuffer type) { + BufferChecks.checkBuffer(size, 1); + BufferChecks.checkBuffer(type, 1); + IntBuffer name_length = APIUtil.getLengths(); + ByteBuffer name = APIUtil.getBufferByte(bufSize); + nglGetTransformFeedbackVarying(program, index, bufSize, MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress(size), MemoryUtil.getAddress(type), MemoryUtil.getAddress(name)); + name.limit(name_length.get(0)); + return APIUtil.getString(name); + } + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer)); + } + public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer)); + } + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer buffer) { + GLChecks.ensureArrayVBOdisabled(); + BufferChecks.checkDirect(buffer); + if ( LWJGLUtil.CHECKS ) StateTracker.getTracker().glVertexAttribPointer_buffer[index] = buffer; + nglVertexAttribIPointer(index, size, type, stride, MemoryUtil.getAddress(buffer)); + } + static native void nglVertexAttribIPointer(int index, int size, int type, int stride, long buffer); + public static void glVertexAttribIPointer(int index, int size, int type, int stride, long buffer_buffer_offset) { + GLChecks.ensureArrayVBOenabled(); + nglVertexAttribIPointerBO(index, size, type, stride, buffer_buffer_offset); + } + static native void nglVertexAttribIPointerBO(int index, int size, int type, int stride, long buffer_buffer_offset); + + public static void glGetVertexAttribI(int index, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIiv(index, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetVertexAttribIiv(int index, int pname, long params); + + public static void glGetVertexAttribIu(int index, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetVertexAttribIuiv(index, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetVertexAttribIuiv(int index, int pname, long params); + + public static void glVertexAttribI4i(int index, int x, int y, int z, int w) { + nglVertexAttribI4i(index, x, y, z, w); + } + static native void nglVertexAttribI4i(int index, int x, int y, int z, int w); + + public static void glVertexAttribI4ui(int index, int x, int y, int z, int w) { + nglVertexAttribI4ui(index, x, y, z, w); + } + static native void nglVertexAttribI4ui(int index, int x, int y, int z, int w); + + public static void glVertexAttribI4(int index, IntBuffer v) { + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4iv(index, MemoryUtil.getAddress(v)); + } + static native void nglVertexAttribI4iv(int index, long v); + + public static void glVertexAttribI4u(int index, IntBuffer v) { + BufferChecks.checkBuffer(v, 4); + nglVertexAttribI4uiv(index, MemoryUtil.getAddress(v)); + } + static native void nglVertexAttribI4uiv(int index, long v); + + public static void glGetUniformu(int program, int location, IntBuffer params) { + BufferChecks.checkDirect(params); + nglGetUniformuiv(program, location, MemoryUtil.getAddress(params)); + } + static native void nglGetUniformuiv(int program, int location, long params); + + public static int glGetFragDataLocation(int program, ByteBuffer name) { + BufferChecks.checkDirect(name); + BufferChecks.checkNullTerminated(name); + int __result = nglGetFragDataLocation(program, MemoryUtil.getAddress(name)); + return __result; + } + static native int nglGetFragDataLocation(int program, long name); + + /** Overloads glGetFragDataLocation. */ + public static int glGetFragDataLocation(int program, CharSequence name) { + int __result = nglGetFragDataLocation(program, APIUtil.getBufferNT(name)); + return __result; + } + + public static void glUniform1ui(int location, int v0) { + nglUniform1ui(location, v0); + } + static native void nglUniform1ui(int location, int v0); + + public static void glUniform2ui(int location, int v0, int v1) { + nglUniform2ui(location, v0, v1); + } + static native void nglUniform2ui(int location, int v0, int v1); + + public static void glUniform3ui(int location, int v0, int v1, int v2) { + nglUniform3ui(location, v0, v1, v2); + } + static native void nglUniform3ui(int location, int v0, int v1, int v2); + + public static void glUniform4ui(int location, int v0, int v1, int v2, int v3) { + nglUniform4ui(location, v0, v1, v2, v3); + } + static native void nglUniform4ui(int location, int v0, int v1, int v2, int v3); + + public static void glUniform1u(int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglUniform1uiv(location, value.remaining(), MemoryUtil.getAddress(value)); + } + static native void nglUniform1uiv(int location, int value_count, long value); + + public static void glUniform2u(int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglUniform2uiv(location, value.remaining() >> 1, MemoryUtil.getAddress(value)); + } + static native void nglUniform2uiv(int location, int value_count, long value); + + public static void glUniform3u(int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglUniform3uiv(location, value.remaining() / 3, MemoryUtil.getAddress(value)); + } + static native void nglUniform3uiv(int location, int value_count, long value); + + public static void glUniform4u(int location, IntBuffer value) { + BufferChecks.checkDirect(value); + nglUniform4uiv(location, value.remaining() >> 2, MemoryUtil.getAddress(value)); + } + static native void nglUniform4uiv(int location, int value_count, long value); + + public static void glClearBuffer(int buffer, int drawbuffer, FloatBuffer value) { + BufferChecks.checkBuffer(value, 4); + nglClearBufferfv(buffer, drawbuffer, MemoryUtil.getAddress(value)); + } + static native void nglClearBufferfv(int buffer, int drawbuffer, long value); + + public static void glClearBuffer(int buffer, int drawbuffer, IntBuffer value) { + BufferChecks.checkBuffer(value, 4); + nglClearBufferiv(buffer, drawbuffer, MemoryUtil.getAddress(value)); + } + static native void nglClearBufferiv(int buffer, int drawbuffer, long value); + + public static void glClearBufferu(int buffer, int drawbuffer, IntBuffer value) { + BufferChecks.checkBuffer(value, 4); + nglClearBufferuiv(buffer, drawbuffer, MemoryUtil.getAddress(value)); + } + static native void nglClearBufferuiv(int buffer, int drawbuffer, long value); + + public static void glClearBufferfi(int buffer, int drawbuffer, float depth, int stencil) { + nglClearBufferfi(buffer, drawbuffer, depth, stencil); + } + static native void nglClearBufferfi(int buffer, int drawbuffer, float depth, int stencil); + + public static String glGetStringi(int name, int index) { + String __result = nglGetStringi(name, index); + return __result; + } + static native String nglGetStringi(int name, int index); + + public static void glCopyBufferSubData(int readtarget, int writetarget, long readoffset, long writeoffset, long size) { + nglCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size); + } + static native void nglCopyBufferSubData(int readtarget, int writetarget, long readoffset, long writeoffset, long size); + + public static void glGetUniformIndices(int program, ByteBuffer uniformNames, IntBuffer uniformIndices) { + BufferChecks.checkDirect(uniformNames); + BufferChecks.checkNullTerminated(uniformNames, uniformIndices.remaining()); + BufferChecks.checkDirect(uniformIndices); + nglGetUniformIndices(program, uniformIndices.remaining(), MemoryUtil.getAddress(uniformNames), MemoryUtil.getAddress(uniformIndices)); + } + static native void nglGetUniformIndices(int program, int uniformIndices_uniformCount, long uniformNames, long uniformIndices); + + /** Overloads glGetUniformIndices. */ + public static void glGetUniformIndices(int program, CharSequence[] uniformNames, IntBuffer uniformIndices) { + BufferChecks.checkArray(uniformNames); + BufferChecks.checkBuffer(uniformIndices, uniformNames.length); + nglGetUniformIndices(program, uniformNames.length, APIUtil.getBufferNT(uniformNames), MemoryUtil.getAddress(uniformIndices)); + } + + public static void glGetActiveUniforms(int program, IntBuffer uniformIndices, int pname, IntBuffer params) { + BufferChecks.checkDirect(uniformIndices); + BufferChecks.checkBuffer(params, uniformIndices.remaining()); + nglGetActiveUniformsiv(program, uniformIndices.remaining(), MemoryUtil.getAddress(uniformIndices), pname, MemoryUtil.getAddress(params)); + } + static native void nglGetActiveUniformsiv(int program, int uniformIndices_uniformCount, long uniformIndices, int pname, long params); + + /** Overloads glGetActiveUniformsiv. */ + public static int glGetActiveUniformsi(int program, int uniformIndex, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetActiveUniformsiv(program, 1, MemoryUtil.getAddress(params.put(1, uniformIndex), 1), pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static int glGetUniformBlockIndex(int program, ByteBuffer uniformBlockName) { + BufferChecks.checkDirect(uniformBlockName); + BufferChecks.checkNullTerminated(uniformBlockName); + int __result = nglGetUniformBlockIndex(program, MemoryUtil.getAddress(uniformBlockName)); + return __result; + } + static native int nglGetUniformBlockIndex(int program, long uniformBlockName); + + /** Overloads glGetUniformBlockIndex. */ + public static int glGetUniformBlockIndex(int program, CharSequence uniformBlockName) { + int __result = nglGetUniformBlockIndex(program, APIUtil.getBufferNT(uniformBlockName)); + return __result; + } + + public static void glGetActiveUniformBlock(int program, int uniformBlockIndex, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 16); + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetActiveUniformBlockiv(int program, int uniformBlockIndex, int pname, long params); + + /** Overloads glGetActiveUniformBlockiv. */ + public static int glGetActiveUniformBlocki(int program, int uniformBlockIndex, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetActiveUniformBlockiv(program, uniformBlockIndex, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetActiveUniformBlockName(int program, int uniformBlockIndex, IntBuffer length, ByteBuffer uniformBlockName) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(uniformBlockName); + nglGetActiveUniformBlockName(program, uniformBlockIndex, uniformBlockName.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(uniformBlockName)); + } + static native void nglGetActiveUniformBlockName(int program, int uniformBlockIndex, int uniformBlockName_bufSize, long length, long uniformBlockName); + + /** Overloads glGetActiveUniformBlockName. */ + public static String glGetActiveUniformBlockName(int program, int uniformBlockIndex, int bufSize) { + IntBuffer uniformBlockName_length = APIUtil.getLengths(); + ByteBuffer uniformBlockName = APIUtil.getBufferByte(bufSize); + nglGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, MemoryUtil.getAddress0(uniformBlockName_length), MemoryUtil.getAddress(uniformBlockName)); + uniformBlockName.limit(uniformBlockName_length.get(0)); + return APIUtil.getString(uniformBlockName); + } + + public static void glUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding) { + nglUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } + static native void nglUniformBlockBinding(int program, int uniformBlockIndex, int uniformBlockBinding); + + public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) { + nglDrawArraysInstanced(mode, first, count, primcount); + } + static native void nglDrawArraysInstanced(int mode, int first, int count, int primcount); + + public static void glDrawElementsInstanced(int mode, ByteBuffer indices, int primcount) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GLES20.GL_UNSIGNED_BYTE, MemoryUtil.getAddress(indices), primcount); + } + public static void glDrawElementsInstanced(int mode, IntBuffer indices, int primcount) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GLES20.GL_UNSIGNED_INT, MemoryUtil.getAddress(indices), primcount); + } + public static void glDrawElementsInstanced(int mode, ShortBuffer indices, int primcount) { + GLChecks.ensureElementVBOdisabled(); + BufferChecks.checkDirect(indices); + nglDrawElementsInstanced(mode, indices.remaining(), GLES20.GL_UNSIGNED_SHORT, MemoryUtil.getAddress(indices), primcount); + } + static native void nglDrawElementsInstanced(int mode, int indices_count, int type, long indices, int primcount); + public static void glDrawElementsInstanced(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { + GLChecks.ensureElementVBOenabled(); + nglDrawElementsInstancedBO(mode, indices_count, type, indices_buffer_offset, primcount); + } + static native void nglDrawElementsInstancedBO(int mode, int indices_count, int type, long indices_buffer_offset, int primcount); + + public static GLSync glFenceSync(int condition, int flags) { + GLSync __result = new GLSync(nglFenceSync(condition, flags)); + return __result; + } + static native long nglFenceSync(int condition, int flags); + + public static boolean glIsSync(GLSync sync) { + boolean __result = nglIsSync(sync.getPointer()); + return __result; + } + static native boolean nglIsSync(long sync); + + public static void glDeleteSync(GLSync sync) { + nglDeleteSync(sync.getPointer()); + } + static native void nglDeleteSync(long sync); + + public static int glClientWaitSync(GLSync sync, int flags, long timeout) { + int __result = nglClientWaitSync(sync.getPointer(), flags, timeout); + return __result; + } + static native int nglClientWaitSync(long sync, int flags, long timeout); + + public static void glWaitSync(GLSync sync, int flags, long timeout) { + nglWaitSync(sync.getPointer(), flags, timeout); + } + static native void nglWaitSync(long sync, int flags, long timeout); + + public static void glGetInteger64(int pname, LongBuffer data) { + BufferChecks.checkBuffer(data, 1); + nglGetInteger64v(pname, MemoryUtil.getAddress(data)); + } + static native void nglGetInteger64v(int pname, long data); + + /** Overloads glGetInteger64v. */ + public static long glGetInteger64(int pname) { + LongBuffer data = APIUtil.getBufferLong(); + nglGetInteger64v(pname, MemoryUtil.getAddress(data)); + return data.get(0); + } + + public static void glGetInteger64(int value, int index, LongBuffer data) { + BufferChecks.checkBuffer(data, 4); + nglGetInteger64i_v(value, index, MemoryUtil.getAddress(data)); + } + static native void nglGetInteger64i_v(int value, int index, long data); + + /** Overloads glGetInteger64i_v. */ + public static long glGetInteger64(int value, int index) { + LongBuffer data = APIUtil.getBufferLong(); + nglGetInteger64i_v(value, index, MemoryUtil.getAddress(data)); + return data.get(0); + } + + public static void glGetSync(GLSync sync, int pname, IntBuffer length, IntBuffer values) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(values); + nglGetSynciv(sync.getPointer(), pname, values.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(values)); + } + static native void nglGetSynciv(long sync, int pname, int values_bufSize, long length, long values); + + /** Overloads glGetSynciv. */ + public static int glGetSynci(GLSync sync, int pname) { + IntBuffer values = APIUtil.getBufferInt(); + nglGetSynciv(sync.getPointer(), pname, 1, 0L, MemoryUtil.getAddress(values)); + return values.get(0); + } + + public static void glGetBufferParameter(int target, int pname, LongBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetBufferParameteri64v(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetBufferParameteri64v(int target, int pname, long params); + + /** Overloads glGetBufferParameteri64v. */ + public static long glGetBufferParameteri64(int target, int pname) { + LongBuffer params = APIUtil.getBufferLong(); + nglGetBufferParameteri64v(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGenSamplers(IntBuffer samplers) { + BufferChecks.checkDirect(samplers); + nglGenSamplers(samplers.remaining(), MemoryUtil.getAddress(samplers)); + } + static native void nglGenSamplers(int samplers_count, long samplers); + + /** Overloads glGenSamplers. */ + public static int glGenSamplers() { + IntBuffer samplers = APIUtil.getBufferInt(); + nglGenSamplers(1, MemoryUtil.getAddress(samplers)); + return samplers.get(0); + } + + public static void glDeleteSamplers(IntBuffer samplers) { + BufferChecks.checkDirect(samplers); + nglDeleteSamplers(samplers.remaining(), MemoryUtil.getAddress(samplers)); + } + static native void nglDeleteSamplers(int samplers_count, long samplers); + + /** Overloads glDeleteSamplers. */ + public static void glDeleteSamplers(int sampler) { + nglDeleteSamplers(1, APIUtil.getInt(sampler)); + } + + public static boolean glIsSampler(int sampler) { + boolean __result = nglIsSampler(sampler); + return __result; + } + static native boolean nglIsSampler(int sampler); + + public static void glBindSampler(int unit, int sampler) { + nglBindSampler(unit, sampler); + } + static native void nglBindSampler(int unit, int sampler); + + public static void glSamplerParameteri(int sampler, int pname, int param) { + nglSamplerParameteri(sampler, pname, param); + } + static native void nglSamplerParameteri(int sampler, int pname, int param); + + public static void glSamplerParameterf(int sampler, int pname, float param) { + nglSamplerParameterf(sampler, pname, param); + } + static native void nglSamplerParameterf(int sampler, int pname, float param); + + public static void glSamplerParameter(int sampler, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params)); + } + static native void nglSamplerParameteriv(int sampler, int pname, long params); + + public static void glSamplerParameter(int sampler, int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params)); + } + static native void nglSamplerParameterfv(int sampler, int pname, long params); + + public static void glGetSamplerParameter(int sampler, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetSamplerParameteriv(int sampler, int pname, long params); + + /** Overloads glGetSamplerParameteriv. */ + public static int glGetSamplerParameteri(int sampler, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetSamplerParameteriv(sampler, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetSamplerParameter(int sampler, int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 4); + nglGetSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetSamplerParameterfv(int sampler, int pname, long params); + + /** Overloads glGetSamplerParameterfv. */ + public static float glGetSamplerParameterf(int sampler, int pname) { + FloatBuffer params = APIUtil.getBufferFloat(); + nglGetSamplerParameterfv(sampler, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glVertexAttribDivisor(int index, int divisor) { + nglVertexAttribDivisor(index, divisor); + } + static native void nglVertexAttribDivisor(int index, int divisor); + + public static void glBindTransformFeedback(int target, int id) { + nglBindTransformFeedback(target, id); + } + static native void nglBindTransformFeedback(int target, int id); + + public static void glDeleteTransformFeedbacks(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglDeleteTransformFeedbacks(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglDeleteTransformFeedbacks(int ids_n, long ids); + + /** Overloads glDeleteTransformFeedbacks. */ + public static void glDeleteTransformFeedbacks(int id) { + nglDeleteTransformFeedbacks(1, APIUtil.getInt(id)); + } + + public static void glGenTransformFeedbacks(IntBuffer ids) { + BufferChecks.checkDirect(ids); + nglGenTransformFeedbacks(ids.remaining(), MemoryUtil.getAddress(ids)); + } + static native void nglGenTransformFeedbacks(int ids_n, long ids); + + /** Overloads glGenTransformFeedbacks. */ + public static int glGenTransformFeedbacks() { + IntBuffer ids = APIUtil.getBufferInt(); + nglGenTransformFeedbacks(1, MemoryUtil.getAddress(ids)); + return ids.get(0); + } + + public static boolean glIsTransformFeedback(int id) { + boolean __result = nglIsTransformFeedback(id); + return __result; + } + static native boolean nglIsTransformFeedback(int id); + + public static void glPauseTransformFeedback() { + nglPauseTransformFeedback(); + } + static native void nglPauseTransformFeedback(); + + public static void glResumeTransformFeedback() { + nglResumeTransformFeedback(); + } + static native void nglResumeTransformFeedback(); + + public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(binaryFormat, 1); + BufferChecks.checkDirect(binary); + nglGetProgramBinary(program, binary.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(binaryFormat), MemoryUtil.getAddress(binary)); + } + static native void nglGetProgramBinary(int program, int binary_bufSize, long length, long binaryFormat, long binary); + + public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) { + BufferChecks.checkDirect(binary); + nglProgramBinary(program, binaryFormat, MemoryUtil.getAddress(binary), binary.remaining()); + } + static native void nglProgramBinary(int program, int binaryFormat, long binary, int binary_length); + + public static void glProgramParameteri(int program, int pname, int value) { + nglProgramParameteri(program, pname, value); + } + static native void nglProgramParameteri(int program, int pname, int value); + + public static void glInvalidateFramebuffer(int target, IntBuffer attachments) { + BufferChecks.checkDirect(attachments); + nglInvalidateFramebuffer(target, attachments.remaining(), MemoryUtil.getAddress(attachments)); + } + static native void nglInvalidateFramebuffer(int target, int attachments_numAttachments, long attachments); + + public static void glInvalidateSubFramebuffer(int target, IntBuffer attachments, int x, int y, int width, int height) { + BufferChecks.checkDirect(attachments); + nglInvalidateSubFramebuffer(target, attachments.remaining(), MemoryUtil.getAddress(attachments), x, y, width, height); + } + static native void nglInvalidateSubFramebuffer(int target, int attachments_numAttachments, long attachments, int x, int y, int width, int height); + + public static void glTexStorage2D(int target, int levels, int internalformat, int width, int height) { + nglTexStorage2D(target, levels, internalformat, width, height); + } + static native void nglTexStorage2D(int target, int levels, int internalformat, int width, int height); + + public static void glTexStorage3D(int target, int levels, int internalformat, int width, int height, int depth) { + nglTexStorage3D(target, levels, internalformat, width, height, depth); + } + static native void nglTexStorage3D(int target, int levels, int internalformat, int width, int height, int depth); + + public static void glGetInternalformat(int target, int internalformat, int pname, IntBuffer params) { + BufferChecks.checkDirect(params); + nglGetInternalformativ(target, internalformat, pname, params.remaining(), MemoryUtil.getAddress(params)); + } + static native void nglGetInternalformativ(int target, int internalformat, int pname, int params_bufSize, long params); + + /** Overloads glGetInternalformativ. */ + public static int glGetInternalformat(int target, int internalformat, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetInternalformativ(target, internalformat, pname, 1, MemoryUtil.getAddress(params)); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGMultisampledRenderToTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGMultisampledRenderToTexture.java new file mode 100644 index 0000000..5bb9378 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGMultisampledRenderToTexture.java @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class IMGMultisampledRenderToTexture { + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: + */ + public static final int GL_RENDERBUFFER_SAMPLES_IMG = 0x9133; + + /** + * Returned by CheckFramebufferStatus: + */ + public static final int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG = 0x9134; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + public static final int GL_MAX_SAMPLES_IMG = 0x9135; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: + */ + public static final int GL_TEXTURE_SAMPLES_IMG = 0x9136; + + private IMGMultisampledRenderToTexture() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glRenderbufferStorageMultisampleIMG(int target, int samples, int internalformat, int width, int height) { + nglRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); + } + static native void nglRenderbufferStorageMultisampleIMG(int target, int samples, int internalformat, int width, int height); + + public static void glFramebufferTexture2DMultisampleIMG(int target, int attachment, int textarget, int texture, int level, int samples) { + nglFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples); + } + static native void nglFramebufferTexture2DMultisampleIMG(int target, int attachment, int textarget, int texture, int level, int samples); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGProgramBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGProgramBinary.java new file mode 100644 index 0000000..7bd6e4f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGProgramBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class IMGProgramBinary { + + /** + * Accepted by the &lt;binaryFormat&gt; parameter of ProgramBinaryOES: + */ + public static final int GL_SGX_PROGRAM_BINARY_IMG = 0x9130; + + private IMGProgramBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGReadFormat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGReadFormat.java new file mode 100644 index 0000000..e77670a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGReadFormat.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class IMGReadFormat { + + /** + * Accepted by the &lt;format&gt; parameter of ReadPixels: + */ + public static final int GL_BGRA_IMG = 0x80E1, + GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG = 0x8365; + + private IMGReadFormat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGShaderBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGShaderBinary.java new file mode 100644 index 0000000..112e1c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGShaderBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class IMGShaderBinary { + + /** + * Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: + */ + public static final int GL_SGX_BINARY_IMG = 0x8C0A; + + private IMGShaderBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGTextureCompressionPvrtc.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGTextureCompressionPvrtc.java new file mode 100644 index 0000000..1bbcd4f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/IMGTextureCompressionPvrtc.java @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class IMGTextureCompressionPvrtc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2DARB + * and the &lt;format&gt; parameter of CompressedTexSubImage2DARB: + */ + public static final int GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00, + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01, + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02, + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03; + + private IMGTextureCompressionPvrtc() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRDebug.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRDebug.java new file mode 100644 index 0000000..5a346b1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRDebug.java @@ -0,0 +1,228 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRDebug { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + public static final int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** + * Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: + */ + public static final int GL_CONTEXT_FLAG_DEBUG_BIT = 0x2; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + public static final int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** + * Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + public static final int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + public static final int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + public static final int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** + * Returned by GetError: + */ + public static final int GL_STACK_UNDERFLOW = 0x504, + GL_STACK_OVERFLOW = 0x503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + public static final int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + private KHRDebug() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { + if (ids != null) + BufferChecks.checkDirect(ids); + nglDebugMessageControl(source, type, severity, (ids == null ? 0 : ids.remaining()), MemoryUtil.getAddressSafe(ids), enabled); + } + static native void nglDebugMessageControl(int source, int type, int severity, int ids_count, long ids, boolean enabled); + + public static void glDebugMessageInsert(int source, int type, int id, int severity, ByteBuffer buf) { + BufferChecks.checkDirect(buf); + nglDebugMessageInsert(source, type, id, severity, buf.remaining(), MemoryUtil.getAddress(buf)); + } + static native void nglDebugMessageInsert(int source, int type, int id, int severity, int buf_length, long buf); + + /** Overloads glDebugMessageInsert. */ + public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { + nglDebugMessageInsert(source, type, id, severity, buf.length(), APIUtil.getBuffer(buf)); + } + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * <p> + * @param callback the callback function to use + */ + public static void glDebugMessageCallback(KHRDebugCallback callback) { + long userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler()); + CallbackUtil.registerContextCallbackKHR(userParam); + nglDebugMessageCallback(callback == null ? 0 : callback.getPointer(), userParam); + } + static native void nglDebugMessageCallback(long callback, long userParam); + + public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { + if (sources != null) + BufferChecks.checkBuffer(sources, count); + if (types != null) + BufferChecks.checkBuffer(types, count); + if (ids != null) + BufferChecks.checkBuffer(ids, count); + if (severities != null) + BufferChecks.checkBuffer(severities, count); + if (lengths != null) + BufferChecks.checkBuffer(lengths, count); + if (messageLog != null) + BufferChecks.checkDirect(messageLog); + int __result = nglGetDebugMessageLog(count, (messageLog == null ? 0 : messageLog.remaining()), MemoryUtil.getAddressSafe(sources), MemoryUtil.getAddressSafe(types), MemoryUtil.getAddressSafe(ids), MemoryUtil.getAddressSafe(severities), MemoryUtil.getAddressSafe(lengths), MemoryUtil.getAddressSafe(messageLog)); + return __result; + } + static native int nglGetDebugMessageLog(int count, int messageLog_bufsize, long sources, long types, long ids, long severities, long lengths, long messageLog); + + public static void glPushDebugGroup(int source, int id, ByteBuffer message) { + BufferChecks.checkDirect(message); + nglPushDebugGroup(source, id, message.remaining(), MemoryUtil.getAddress(message)); + } + static native void nglPushDebugGroup(int source, int id, int message_length, long message); + + /** Overloads glPushDebugGroup. */ + public static void glPushDebugGroup(int source, int id, CharSequence message) { + nglPushDebugGroup(source, id, message.length(), APIUtil.getBuffer(message)); + } + + public static void glPopDebugGroup() { + nglPopDebugGroup(); + } + static native void nglPopDebugGroup(); + + public static void glObjectLabel(int identifier, int name, ByteBuffer label) { + if (label != null) + BufferChecks.checkDirect(label); + nglObjectLabel(identifier, name, (label == null ? 0 : label.remaining()), MemoryUtil.getAddressSafe(label)); + } + static native void nglObjectLabel(int identifier, int name, int label_length, long label); + + /** Overloads glObjectLabel. */ + public static void glObjectLabel(int identifier, int name, CharSequence label) { + nglObjectLabel(identifier, name, label.length(), APIUtil.getBuffer(label)); + } + + public static void glGetObjectLabel(int identifier, int name, IntBuffer length, ByteBuffer label) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(label); + nglGetObjectLabel(identifier, name, label.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(label)); + } + static native void nglGetObjectLabel(int identifier, int name, int label_bufSize, long length, long label); + + /** Overloads glGetObjectLabel. */ + public static String glGetObjectLabel(int identifier, int name, int bufSize) { + IntBuffer label_length = APIUtil.getLengths(); + ByteBuffer label = APIUtil.getBufferByte(bufSize); + nglGetObjectLabel(identifier, name, bufSize, MemoryUtil.getAddress0(label_length), MemoryUtil.getAddress(label)); + label.limit(label_length.get(0)); + return APIUtil.getString(label); + } + + public static void glObjectPtrLabel(PointerWrapper ptr, ByteBuffer label) { + if (label != null) + BufferChecks.checkDirect(label); + nglObjectPtrLabel(ptr.getPointer(), (label == null ? 0 : label.remaining()), MemoryUtil.getAddressSafe(label)); + } + static native void nglObjectPtrLabel(long ptr, int label_length, long label); + + /** Overloads glObjectPtrLabel. */ + public static void glObjectPtrLabel(PointerWrapper ptr, CharSequence label) { + nglObjectPtrLabel(ptr.getPointer(), label.length(), APIUtil.getBuffer(label)); + } + + public static void glGetObjectPtrLabel(PointerWrapper ptr, IntBuffer length, ByteBuffer label) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkDirect(label); + nglGetObjectPtrLabel(ptr.getPointer(), label.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(label)); + } + static native void nglGetObjectPtrLabel(long ptr, int label_bufSize, long length, long label); + + /** Overloads glGetObjectPtrLabel. */ + public static String glGetObjectPtrLabel(PointerWrapper ptr, int bufSize) { + IntBuffer label_length = APIUtil.getLengths(); + ByteBuffer label = APIUtil.getBufferByte(bufSize); + nglGetObjectPtrLabel(ptr.getPointer(), bufSize, MemoryUtil.getAddress0(label_length), MemoryUtil.getAddress(label)); + label.limit(label_length.get(0)); + return APIUtil.getString(label); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRTextureCompressionAstcLdr.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRTextureCompressionAstcLdr.java new file mode 100644 index 0000000..8ff1eed --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/KHRTextureCompressionAstcLdr.java @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class KHRTextureCompressionAstcLdr { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D, + * CompressedTexSubImage2D, TexStorage2D, TextureStorage2D, TexStorage3D, + * and TextureStorage3D: + */ + public static final int GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, + GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, + GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, + GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, + GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, + GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, + GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, + GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, + GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, + GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, + GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, + GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, + GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD; + + private KHRTextureCompressionAstcLdr() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVCoverageSample.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVCoverageSample.java new file mode 100644 index 0000000..f64d802 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVCoverageSample.java @@ -0,0 +1,67 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVCoverageSample { + + /** + * Accepted by the &lt;attrib_list&gt; parameter of eglChooseConfig + * and eglCreatePbufferSurface, and by the &lt;attribute&gt; + * parameter of eglGetConfigAttrib: + */ + public static final int EGL_COVERAGE_BUFFERS_NV = 0x30E0, + EGL_COVERAGE_SAMPLES_NV = 0x30E1; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT and the &lt;format&gt; parameter of ReadPixels: + */ + public static final int GL_COVERAGE_COMPONENT_NV = 0x8522; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT: + */ + public static final int GL_COVERAGE_COMPONENT4_NV = 0x8523; + + /** + * Accepted by the &lt;operation&gt; parameter of CoverageOperationNV: + */ + public static final int GL_COVERAGE_ALL_FRAGMENTS_NV = 0x8524, + GL_COVERAGE_EDGE_FRAGMENTS_NV = 0x8525, + GL_COVERAGE_AUTOMATIC_NV = 0x8526; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv: + */ + public static final int GL_COVERAGE_ATTACHMENT_NV = 0x8527; + + /** + * Accepted by the &lt;buf&gt; parameter of Clear: + */ + public static final int GL_COVERAGE_BUFFER_BIT_NV = 0x8000; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv: + */ + public static final int GL_COVERAGE_BUFFERS_NV = 0x8528, + GL_COVERAGE_SAMPLES_NV = 0x8529; + + private NVCoverageSample() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glCoverageMaskNV(boolean mask) { + nglCoverageMaskNV(mask); + } + static native void nglCoverageMaskNV(boolean mask); + + public static void glCoverageOperationNV(int operation) { + nglCoverageOperationNV(operation); + } + static native void nglCoverageOperationNV(int operation); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDepthNonlinear.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDepthNonlinear.java new file mode 100644 index 0000000..5b07f66 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDepthNonlinear.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDepthNonlinear { + + /** + * Accepted as a valid sized internal format by all functions accepting + * sized internal formats with a base format of DEPTH_COMPONENT: + */ + public static final int GL_DEPTH_COMPONENT16_NONLINEAR_NV = 0x8553; + + /** + * Accepted by the &lt;attrib_list&gt; parameter of eglChooseConfig, + * and by the &lt;attribute&gt; parameter of eglGetConfigAttrib: + */ + public static final int EGL_DEPTH_ENCODING_NV = 0x30E2; + + /** + * Accepted as a value in the &lt;attrib_list&gt; parameter of eglChooseConfig + * and eglCreatePbufferSurface, and returned in the &lt;value&gt; parameter + * of eglGetConfigAttrib: + */ + public static final int EGL_DEPTH_ENCODING_NONE_NV = 0x0, + EGL_DEPTH_ENCODING_NONLINEAR_NV = 0x30E3; + + private NVDepthNonlinear() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawBuffers.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawBuffers.java new file mode 100644 index 0000000..d9cbaa7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawBuffers.java @@ -0,0 +1,66 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDrawBuffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + public static final int GL_MAX_DRAW_BUFFERS_NV = 0x8824, + GL_DRAW_BUFFER0_NV = 0x8825, + GL_DRAW_BUFFER1_NV = 0x8826, + GL_DRAW_BUFFER2_NV = 0x8827, + GL_DRAW_BUFFER3_NV = 0x8828, + GL_DRAW_BUFFER4_NV = 0x8829, + GL_DRAW_BUFFER5_NV = 0x882A, + GL_DRAW_BUFFER6_NV = 0x882B, + GL_DRAW_BUFFER7_NV = 0x882C, + GL_DRAW_BUFFER8_NV = 0x882D, + GL_DRAW_BUFFER9_NV = 0x882E, + GL_DRAW_BUFFER10_NV = 0x882F, + GL_DRAW_BUFFER11_NV = 0x8830, + GL_DRAW_BUFFER12_NV = 0x8831, + GL_DRAW_BUFFER13_NV = 0x8832, + GL_DRAW_BUFFER14_NV = 0x8833, + GL_DRAW_BUFFER15_NV = 0x8834; + + /** + * Accepted by the &lt;bufs&gt; parameter of DrawBuffersNV: + */ + public static final int GL_COLOR_ATTACHMENT0_NV = 0x8CE0, + GL_COLOR_ATTACHMENT1_NV = 0x8CE1, + GL_COLOR_ATTACHMENT2_NV = 0x8CE2, + GL_COLOR_ATTACHMENT3_NV = 0x8CE3, + GL_COLOR_ATTACHMENT4_NV = 0x8CE4, + GL_COLOR_ATTACHMENT5_NV = 0x8CE5, + GL_COLOR_ATTACHMENT6_NV = 0x8CE6, + GL_COLOR_ATTACHMENT7_NV = 0x8CE7, + GL_COLOR_ATTACHMENT8_NV = 0x8CE8, + GL_COLOR_ATTACHMENT9_NV = 0x8CE9, + GL_COLOR_ATTACHMENT10_NV = 0x8CEA, + GL_COLOR_ATTACHMENT11_NV = 0x8CEB, + GL_COLOR_ATTACHMENT12_NV = 0x8CEC, + GL_COLOR_ATTACHMENT13_NV = 0x8CED, + GL_COLOR_ATTACHMENT14_NV = 0x8CEE, + GL_COLOR_ATTACHMENT15_NV = 0x8CEF; + + private NVDrawBuffers() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glDrawBuffersNV(IntBuffer bufs) { + BufferChecks.checkDirect(bufs); + nglDrawBuffersNV(bufs.remaining(), MemoryUtil.getAddress(bufs)); + } + static native void nglDrawBuffersNV(int bufs_n, long bufs); + + /** Overloads glDrawBuffersNV. */ + public static void glDrawBuffersNV(int buf) { + nglDrawBuffersNV(1, APIUtil.getInt(buf)); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawPath.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawPath.java new file mode 100644 index 0000000..0f9aa3d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawPath.java @@ -0,0 +1,148 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDrawPath { + + /** + * Accepted as the &lt;paramType&gt; parameter of PathParameterNV: + */ + public static final int GL_PATH_QUALITY_NV = 0x8ED8, + GL_FILL_RULE_NV = 0x8ED9, + GL_STROKE_CAP0_STYLE_NV = 0x8EE0, + GL_STROKE_CAP1_STYLE_NV = 0x8EE1, + GL_STROKE_CAP2_STYLE_NV = 0x8EE2, + GL_STROKE_CAP3_STYLE_NV = 0x8EE3, + GL_STROKE_JOIN_STYLE_NV = 0x8EE8, + GL_STROKE_MITER_LIMIT_NV = 0x8EE9; + + /** + * Values for the ILL_RULE_NV path parameter: + */ + public static final int GL_EVEN_ODD_NV = 0x8EF0, + GL_NON_ZERO_NV = 0x8EF1; + + /** + * Values for the CAP[0-3]_STYLE_NV path parameter: + */ + public static final int GL_CAP_BUTT_NV = 0x8EF4, + GL_CAP_ROUND_NV = 0x8EF5, + GL_CAP_SQUARE_NV = 0x8EF6, + GL_CAP_TRIANGLE_NV = 0x8EF7; + + /** + * Values for the JOIN_STYLE_NV path parameter: + */ + public static final int GL_JOIN_MITER_NV = 0x8EFC, + GL_JOIN_ROUND_NV = 0x8EFD, + GL_JOIN_BEVEL_NV = 0x8EFE, + GL_JOIN_CLIPPED_MITER_NV = 0x8EFF; + + /** + * Accepted as the &lt;target&gt; parameter of PathMatrixNV: + */ + public static final int GL_MATRIX_PATH_TO_CLIP_NV = 0x8F04, + GL_MATRIX_STROKE_TO_PATH_NV = 0x8F05, + GL_MATRIX_PATH_COORD0_NV = 0x8F08, + GL_MATRIX_PATH_COORD1_NV = 0x8F09, + GL_MATRIX_PATH_COORD2_NV = 0x8F0A, + GL_MATRIX_PATH_COORD3_NV = 0x8F0B; + + /** + * Accepted as the &lt;mode&gt; parameter of DrawPathbufferNV: + */ + public static final int GL_FILL_PATH_NV = 0x8F18, + GL_STROKE_PATH_NV = 0x8F19; + + /** + * Accepted as path commands by CreatePathNV: + */ + public static final byte GL_MOVE_TO_NV = 0x0, + GL_LINE_TO_NV = 0x1, + GL_QUADRATIC_BEZIER_TO_NV = 0x2, + GL_CUBIC_BEZIER_TO_NV = 0x3, + GL_START_MARKER_NV = 0x20, + GL_CLOSE_NV = 0x21, + GL_STROKE_CAP0_NV = 0x40, + GL_STROKE_CAP1_NV = 0x41, + GL_STROKE_CAP2_NV = 0x42, + GL_STROKE_CAP3_NV = 0x43; + + private NVDrawPath() {} + + static native void initNativeStubs() throws LWJGLException; + + public static int glCreatePathNV(int datatype, ByteBuffer commands) { + BufferChecks.checkDirect(commands); + int __result = nglCreatePathNV(datatype, commands.remaining(), MemoryUtil.getAddress(commands)); + return __result; + } + static native int nglCreatePathNV(int datatype, int commands_numCommands, long commands); + + public static void glDeletePathNV(int path) { + nglDeletePathNV(path); + } + static native void nglDeletePathNV(int path); + + public static void glPathVerticesNV(int path, ByteBuffer vertices) { + BufferChecks.checkDirect(vertices); + nglPathVerticesNV(path, MemoryUtil.getAddress(vertices)); + } + static native void nglPathVerticesNV(int path, long vertices); + + public static void glPathParameterfNV(int path, int paramType, float param) { + nglPathParameterfNV(path, paramType, param); + } + static native void nglPathParameterfNV(int path, int paramType, float param); + + public static void glPathParameteriNV(int path, int paramType, int param) { + nglPathParameteriNV(path, paramType, param); + } + static native void nglPathParameteriNV(int path, int paramType, int param); + + public static int glCreatePathProgramNV() { + int __result = nglCreatePathProgramNV(); + return __result; + } + static native int nglCreatePathProgramNV(); + + public static void glPathMatrixNV(int target, FloatBuffer value) { + BufferChecks.checkBuffer(value, 16); + nglPathMatrixNV(target, MemoryUtil.getAddress(value)); + } + static native void nglPathMatrixNV(int target, long value); + + public static void glDrawPathNV(int path, int mode) { + nglDrawPathNV(path, mode); + } + static native void nglDrawPathNV(int path, int mode); + + public static int glCreatePathbufferNV(int capacity) { + int __result = nglCreatePathbufferNV(capacity); + return __result; + } + static native int nglCreatePathbufferNV(int capacity); + + public static void glDeletePathbufferNV(int buffer) { + nglDeletePathbufferNV(buffer); + } + static native void nglDeletePathbufferNV(int buffer); + + public static void glPathbufferPathNV(int buffer, int index, int path) { + nglPathbufferPathNV(buffer, index, path); + } + static native void nglPathbufferPathNV(int buffer, int index, int path); + + public static void glPathbufferPositionNV(int buffer, int index, float x, float y) { + nglPathbufferPositionNV(buffer, index, x, y); + } + static native void nglPathbufferPositionNV(int buffer, int index, float x, float y); + + public static void glDrawPathbufferNV(int buffer, int mode) { + nglDrawPathbufferNV(buffer, mode); + } + static native void nglDrawPathbufferNV(int buffer, int mode); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawTexture.java new file mode 100644 index 0000000..7272898 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVDrawTexture.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVDrawTexture { + + private NVDrawTexture() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glDrawTextureNV(int texture, int sampler, float x0, float y0, float x1, float y1, float z, float s0, float t0, float s1, float t1) { + nglDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); + } + static native void nglDrawTextureNV(int texture, int sampler, float x0, float y0, float x1, float y1, float z, float s0, float t0, float s1, float t1); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVEGLStreamConsumerExternal.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVEGLStreamConsumerExternal.java new file mode 100644 index 0000000..f59bfe5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVEGLStreamConsumerExternal.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVEGLStreamConsumerExternal { + + /** + * Accepted as a target in the &lt;target&gt; parameter of BindTexture: + */ + public static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65; + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_EXTERNAL_OES = 0x8D66; + + /** + * Accepted as &lt;value&gt; in GetIntegerv() and GetFloatv() queries: + */ + public static final int GL_TEXTURE_BINDING_EXTERNAL_OES = 0x8D67; + + /** + * Accepted as &lt;value&gt; in GetTexParameter*() queries: + */ + public static final int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 0x8D68; + + private NVEGLStreamConsumerExternal() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFboColorAttachments.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFboColorAttachments.java new file mode 100644 index 0000000..e3e89c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFboColorAttachments.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFboColorAttachments { + + public static final int GL_MAX_COLOR_ATTACHMENTS_NV = 0x8CDF, + GL_COLOR_ATTACHMENT0_NV = 0x8CE0, + GL_COLOR_ATTACHMENT1_NV = 0x8CE1, + GL_COLOR_ATTACHMENT2_NV = 0x8CE2, + GL_COLOR_ATTACHMENT3_NV = 0x8CE3, + GL_COLOR_ATTACHMENT4_NV = 0x8CE4, + GL_COLOR_ATTACHMENT5_NV = 0x8CE5, + GL_COLOR_ATTACHMENT6_NV = 0x8CE6, + GL_COLOR_ATTACHMENT7_NV = 0x8CE7, + GL_COLOR_ATTACHMENT8_NV = 0x8CE8, + GL_COLOR_ATTACHMENT9_NV = 0x8CE9, + GL_COLOR_ATTACHMENT10_NV = 0x8CEA, + GL_COLOR_ATTACHMENT11_NV = 0x8CEB, + GL_COLOR_ATTACHMENT12_NV = 0x8CEC, + GL_COLOR_ATTACHMENT13_NV = 0x8CED, + GL_COLOR_ATTACHMENT14_NV = 0x8CEE, + GL_COLOR_ATTACHMENT15_NV = 0x8CEF; + + private NVFboColorAttachments() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFence.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFence.java new file mode 100644 index 0000000..d2595e2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFence.java @@ -0,0 +1,76 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFence { + + /** + * Accepted by the &lt;condition&gt; parameter of SetFenceNV: + */ + public static final int GL_ALL_COMPLETED_NV = 0x84F2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFenceivNV: + */ + public static final int GL_FENCE_STATUS_NV = 0x84F3, + GL_FENCE_CONDITION_NV = 0x84F4; + + private NVFence() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGenFencesNV(IntBuffer fences) { + BufferChecks.checkDirect(fences); + nglGenFencesNV(fences.remaining(), MemoryUtil.getAddress(fences)); + } + static native void nglGenFencesNV(int fences_n, long fences); + + /** Overloads glGenFencesNV. */ + public static int glGenFencesNV() { + IntBuffer fences = APIUtil.getBufferInt(); + nglGenFencesNV(1, MemoryUtil.getAddress(fences)); + return fences.get(0); + } + + public static void glDeleteFencesNV(IntBuffer fences) { + BufferChecks.checkDirect(fences); + nglDeleteFencesNV(fences.remaining(), MemoryUtil.getAddress(fences)); + } + static native void nglDeleteFencesNV(int fences_n, long fences); + + /** Overloads glDeleteFencesNV. */ + public static void glDeleteFencesNV(int fence) { + nglDeleteFencesNV(1, APIUtil.getInt(fence)); + } + + public static void glSetFenceNV(int fence, int condition) { + nglSetFenceNV(fence, condition); + } + static native void nglSetFenceNV(int fence, int condition); + + public static boolean glTestFenceNV(int fence) { + boolean __result = nglTestFenceNV(fence); + return __result; + } + static native boolean nglTestFenceNV(int fence); + + public static void glFinishFenceNV(int fence) { + nglFinishFenceNV(fence); + } + static native void nglFinishFenceNV(int fence); + + public static boolean glIsFenceNV(int fence) { + boolean __result = nglIsFenceNV(fence); + return __result; + } + static native boolean nglIsFenceNV(int fence); + + public static void glGetFenceivNV(int fence, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetFenceivNV(fence, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetFenceivNV(int fence, int pname, long params); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFramebufferVertexAttribArray.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFramebufferVertexAttribArray.java new file mode 100644 index 0000000..795cdf4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVFramebufferVertexAttribArray.java @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVFramebufferVertexAttribArray { + + public static final int GL_FRAMEBUFFER_ATTACHABLE_NV = 0x852A, + GL_VERTEX_ATTRIB_ARRAY_NV = 0x852B, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_SIZE_NV = 0x852C, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_TYPE_NV = 0x852D, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_NORMALIZED_NV = 0x852E, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_OFFSET_NV = 0x852F, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_WIDTH_NV = 0x8530, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_STRIDE_NV = 0x8531, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_HEIGHT_NV = 0x8532; + + private NVFramebufferVertexAttribArray() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glFramebufferVertexAttribArrayNV(int target, int attachment, int buffertarget, int bufferobject, int size, int type, boolean normalized, long offset, long width, long height, int stride) { + nglFramebufferVertexAttribArrayNV(target, attachment, buffertarget, bufferobject, size, type, normalized, offset, width, height, stride); + } + static native void nglFramebufferVertexAttribArrayNV(int target, int attachment, int buffertarget, int bufferobject, int size, int type, boolean normalized, long offset, long width, long height, int stride); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVGetTexImage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVGetTexImage.java new file mode 100644 index 0000000..7f8cf93 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVGetTexImage.java @@ -0,0 +1,79 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVGetTexImage { + + public static final int GL_TEXTURE_WIDTH_NV = 0x1000, + GL_TEXTURE_HEIGHT_NV = 0x1001, + GL_TEXTURE_INTERNAL_FORMAT_NV = 0x1003, + GL_TEXTURE_COMPONENTS_NV = 0x1003, + GL_TEXTURE_BORDER_NV = 0x1005, + GL_TEXTURE_RED_SIZE_NV = 0x805C, + GL_TEXTURE_GREEN_SIZE_NV = 0x805D, + GL_TEXTURE_BLUE_SIZE_NV = 0x805E, + GL_TEXTURE_ALPHA_SIZE_NV = 0x805F, + GL_TEXTURE_LUMINANCE_SIZE_NV = 0x8060, + GL_TEXTURE_INTENSITY_SIZE_NV = 0x8061, + GL_TEXTURE_DEPTH_NV = 0x8071, + GL_TEXTURE_COMPRESSED_IMAGE_SIZE_NV = 0x86A0, + GL_TEXTURE_COMPRESSED_NV = 0x86A1, + GL_TEXTURE_DEPTH_SIZE_NV = 0x884A; + + private NVGetTexImage() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGetTexImageNV(int target, int level, int format, int type, ByteBuffer img) { + BufferChecks.checkBuffer(img, GLChecks.calculateImageStorage(img, format, type, 1, 1, 1)); + nglGetTexImageNV(target, level, format, type, MemoryUtil.getAddress(img)); + } + public static void glGetTexImageNV(int target, int level, int format, int type, FloatBuffer img) { + BufferChecks.checkBuffer(img, GLChecks.calculateImageStorage(img, format, type, 1, 1, 1)); + nglGetTexImageNV(target, level, format, type, MemoryUtil.getAddress(img)); + } + public static void glGetTexImageNV(int target, int level, int format, int type, IntBuffer img) { + BufferChecks.checkBuffer(img, GLChecks.calculateImageStorage(img, format, type, 1, 1, 1)); + nglGetTexImageNV(target, level, format, type, MemoryUtil.getAddress(img)); + } + public static void glGetTexImageNV(int target, int level, int format, int type, ShortBuffer img) { + BufferChecks.checkBuffer(img, GLChecks.calculateImageStorage(img, format, type, 1, 1, 1)); + nglGetTexImageNV(target, level, format, type, MemoryUtil.getAddress(img)); + } + static native void nglGetTexImageNV(int target, int level, int format, int type, long img); + + public static void glGetCompressedTexImageNV(int target, int level, ByteBuffer img) { + BufferChecks.checkDirect(img); + nglGetCompressedTexImageNV(target, level, MemoryUtil.getAddress(img)); + } + static native void nglGetCompressedTexImageNV(int target, int level, long img); + + public static void glGetTexLevelParameterNV(int target, int level, int pname, FloatBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetTexLevelParameterfvNV(target, level, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetTexLevelParameterfvNV(int target, int level, int pname, long params); + + /** Overloads glGetTexLevelParameterfvNV. */ + public static float glGetTexLevelParameterfNV(int target, int level, int pname) { + FloatBuffer params = APIUtil.getBufferFloat(); + nglGetTexLevelParameterfvNV(target, level, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGetTexLevelParameterNV(int target, int level, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetTexLevelParameterivNV(target, level, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetTexLevelParameterivNV(int target, int level, int pname, long params); + + /** Overloads glGetTexLevelParameterivNV. */ + public static int glGetTexLevelParameteriNV(int target, int level, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetTexLevelParameterivNV(target, level, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVPlatformBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVPlatformBinary.java new file mode 100644 index 0000000..e592093 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVPlatformBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVPlatformBinary { + + /** + * Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: + */ + public static final int GL_NVIDIA_PLATFORM_BINARY_NV = 0x890B; + + private NVPlatformBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVReadBuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVReadBuffer.java new file mode 100644 index 0000000..bb20ca4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVReadBuffer.java @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVReadBuffer { + + public static final int GL_READ_BUFFER_NV = 0xC02, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_NV = 0x8CDC; + + private NVReadBuffer() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glReadBufferNV(int mode) { + nglReadBufferNV(mode); + } + static native void nglReadBufferNV(int mode); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVSystemTime.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVSystemTime.java new file mode 100644 index 0000000..60db574 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/NVSystemTime.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class NVSystemTime { + + private NVSystemTime() {} + + static native void initNativeStubs() throws LWJGLException; + + public static long glGetSystemTimeFrequencyNV() { + long __result = nglGetSystemTimeFrequencyNV(); + return __result; + } + static native long nglGetSystemTimeFrequencyNV(); + + public static long glGetSystemTimeNV() { + long __result = nglGetSystemTimeNV(); + return __result; + } + static native long nglGetSystemTimeNV(); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendEquationSeparate.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendEquationSeparate.java new file mode 100644 index 0000000..9ba11da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendEquationSeparate.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESBlendEquationSeparate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_BLEND_EQUATION_RGB_OES = 0x8009, + GL_BLEND_EQUATION_ALPHA_OES = 0x883D; + + private OESBlendEquationSeparate() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBlendEquationSeparateOES(int modeRGB, int modeAlpha) { + nglBlendEquationSeparateOES(modeRGB, modeAlpha); + } + static native void nglBlendEquationSeparateOES(int modeRGB, int modeAlpha); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendFuncSeparate.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendFuncSeparate.java new file mode 100644 index 0000000..acb15a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendFuncSeparate.java @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESBlendFuncSeparate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_BLEND_DST_RGB_OES = 0x80C8, + BLEND_SRC_RGB_OES = 0x80C9, + BLEND_DST_ALPHA_OES = 0x80CA, + BLEND_SRC_ALPHA_OES = 0x80CB; + + private OESBlendFuncSeparate() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBlendFuncSeparateOES(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha) { + nglBlendFuncSeparateOES(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); + } + static native void nglBlendFuncSeparateOES(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendSubtract.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendSubtract.java new file mode 100644 index 0000000..bb29e0c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESBlendSubtract.java @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESBlendSubtract { + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquationOES: + */ + public static final int GL_FUNC_ADD_OES = 0x8006, + GL_FUNC_SUBTRACT_OES = 0x800A, + GL_FUNC_REVERSE_SUBTRACT_OES = 0x800B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_BLEND_EQUATION_OES = 0x8009; + + private OESBlendSubtract() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBlendEquationOES(int mode) { + nglBlendEquationOES(mode); + } + static native void nglBlendEquationOES(int mode); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedETC1RGB8Texture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedETC1RGB8Texture.java new file mode 100644 index 0000000..7edd8b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedETC1RGB8Texture.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESCompressedETC1RGB8Texture { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D: + */ + public static final int GL_ETC1_RGB8_OES = 0x8D64; + + private OESCompressedETC1RGB8Texture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedPalettedTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedPalettedTexture.java new file mode 100644 index 0000000..17c9573 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESCompressedPalettedTexture.java @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESCompressedPalettedTexture { + + /** + * Accepted by the &lt;internalformat&gt; paramter of CompressedTexImage2D + */ + public static final int GL_PALETTE4_RGB8_OES = 0x8B90, + GL_PALETTE4_RGBA8_OES = 0x8B91, + GL_PALETTE4_R5_G6_B5_OES = 0x8B92, + GL_PALETTE4_RGBA4_OES = 0x8B93, + GL_PALETTE4_RGB5_A1_OES = 0x8B94, + GL_PALETTE8_RGB8_OES = 0x8B95, + GL_PALETTE8_RGBA8_OES = 0x8B96, + GL_PALETTE8_R5_G6_B5_OES = 0x8B97, + GL_PALETTE8_RGBA4_OES = 0x8B98, + GL_PALETTE8_RGB5_A1_OES = 0x8B99; + + private OESCompressedPalettedTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth24.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth24.java new file mode 100644 index 0000000..3f323f4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth24.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESDepth24 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_DEPTH_COMPONENT24_OES = 0x81A6; + + private OESDepth24() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth32.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth32.java new file mode 100644 index 0000000..d4067ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepth32.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESDepth32 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_DEPTH_COMPONENT32_OES = 0x81A7; + + private OESDepth32() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepthTexture.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepthTexture.java new file mode 100644 index 0000000..144dc8b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESDepthTexture.java @@ -0,0 +1,23 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESDepthTexture { + + /** + * Accepted by the &lt;format&gt; parameter of TexImage2D and TexSubImage2D and + * &lt;internalFormat&gt; parameter of TexImage2D: + */ + public static final int GL_DEPTH_COMPONENT = 0x1902; + + /** + * Accepted by the &lt;type&gt; parameter of TexImage2D, TexSubImage2D: + */ + public static final int GL_UNSIGNED_SHORT = 0x1403, + GL_UNSIGNED_INT = 0x1405; + + private OESDepthTexture() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImage.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImage.java new file mode 100644 index 0000000..084f9e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImage.java @@ -0,0 +1,23 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESEGLImage { + + private OESEGLImage() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glEGLImageTargetTexture2DOES(int target, EGLImageOES image) { + nglEGLImageTargetTexture2DOES(target, image.getPointer()); + } + static native void nglEGLImageTargetTexture2DOES(int target, long image); + + public static void glEGLImageTargetRenderbufferStorageOES(int target, EGLImageOES image) { + nglEGLImageTargetRenderbufferStorageOES(target, image.getPointer()); + } + static native void nglEGLImageTargetRenderbufferStorageOES(int target, long image); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImageExternal.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImageExternal.java new file mode 100644 index 0000000..b4e0b96 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESEGLImageExternal.java @@ -0,0 +1,39 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESEGLImageExternal { + + /** + * Accepted as a target in the &lt;target&gt; parameter of BindTexture and + * EGLImageTargetTexture2DOES: + */ + public static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65; + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform: + */ + public static final int GL_SAMPLER_EXTERNAL_OES = 0x8D66; + + /** + * Accepted as &lt;value&gt; in GetIntegerv() and GetFloatv() queries: + */ + public static final int GL_TEXTURE_BINDING_EXTERNAL_OES = 0x8D67; + + /** + * Accepted as &lt;value&gt; in GetTexParameter*() queries: + */ + public static final int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 0x8D68; + + private OESEGLImageExternal() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glEGLImageTargetTexture2DOES(int target, EGLImageOES image) { + nglEGLImageTargetTexture2DOES(target, image.getPointer()); + } + static native void nglEGLImageTargetTexture2DOES(int target, long image); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESElementIndexUint.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESElementIndexUint.java new file mode 100644 index 0000000..a683fc0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESElementIndexUint.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESElementIndexUint { + + /** + * Accepted by the &lt;type&gt; parameter of DrawElements: + */ + public static final int GL_UNSIGNED_INT = 0x1405; + + private OESElementIndexUint() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESFramebufferObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESFramebufferObject.java new file mode 100644 index 0000000..4f0d355 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESFramebufferObject.java @@ -0,0 +1,244 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESFramebufferObject { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebufferOES, + * CheckFramebufferStatusOES, FramebufferTexture{2D|3D}OES, + * FramebufferRenderbufferOES, and + * GetFramebufferAttachmentParameterivOES: + */ + public static final int GL_FRAMEBUFFER_OES = 0x8D40; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbufferOES, + * RenderbufferStorageOES, and GetRenderbufferParameterivOES, and + * returned by GetFramebufferAttachmentParameterivOES: + */ + public static final int GL_RENDERBUFFER_OES = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageOES: + */ + public static final int GL_DEPTH_COMPONENT16_OES = 0x81A5, + GL_RGBA4_OES = 0x8056, + GL_RGB5_A1_OES = 0x8057, + GL_RGB565_OES = 0x8D62, + GL_STENCIL_INDEX1_OES = 0x8D46, + GL_STENCIL_INDEX4_OES = 0x8D47, + GL_STENCIL_INDEX8_OES = 0x8D48; + + /** + * Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivOES: + */ + public static final int GL_RENDERBUFFER_WIDTH_OES = 0x8D42, + GL_RENDERBUFFER_HEIGHT_OES = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT_OES = 0x8D44, + GL_RENDERBUFFER_RED_SIZE_OES = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE_OES = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE_OES = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE_OES = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE_OES = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE_OES = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivOES: + */ + public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES = 0x8CD4; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{2D|3D}OES, FramebufferRenderbufferOES, and + * GetFramebufferAttachmentParameterivOES + */ + public static final int GL_COLOR_ATTACHMENT0_OES = 0x8CE0, + GL_DEPTH_ATTACHMENT_OES = 0x8D00, + GL_STENCIL_ATTACHMENT_OES = 0x8D20; + + /** + * Returned by GetFramebufferAttachmentParameterivOES when the + * &lt;pname&gt; parameter is FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES: + */ + public static final int GL_NONE_OES = 0x0; + + /** + * Returned by CheckFramebufferStatusOES(): + */ + public static final int GL_FRAMEBUFFER_COMPLETE_OES = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES = 0x8CD9, + GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES = 0x8CDA, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED_OES = 0x8CDD; + + /** + * Accepted by GetIntegerv(): + */ + public static final int GL_FRAMEBUFFER_BINDING_OES = 0x8CA6, + GL_RENDERBUFFER_BINDING_OES = 0x8CA7, + GL_MAX_RENDERBUFFER_SIZE_OES = 0x84E8; + + /** + * Returned by GetError(): + */ + public static final int GL_INVALID_FRAMEBUFFER_OPERATION_OES = 0x506; + + private OESFramebufferObject() {} + + static native void initNativeStubs() throws LWJGLException; + + public static boolean glIsRenderbufferOES(int renderbuffer) { + boolean __result = nglIsRenderbufferOES(renderbuffer); + return __result; + } + static native boolean nglIsRenderbufferOES(int renderbuffer); + + public static void glBindRenderbufferOES(int target, int renderbuffer) { + nglBindRenderbufferOES(target, renderbuffer); + } + static native void nglBindRenderbufferOES(int target, int renderbuffer); + + public static void glDeleteRenderbuffersOES(IntBuffer renderbuffers) { + BufferChecks.checkDirect(renderbuffers); + nglDeleteRenderbuffersOES(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers)); + } + static native void nglDeleteRenderbuffersOES(int renderbuffers_n, long renderbuffers); + + /** Overloads glDeleteRenderbuffersOES. */ + public static void glDeleteRenderbuffersOES(int renderbuffer) { + nglDeleteRenderbuffersOES(1, APIUtil.getInt(renderbuffer)); + } + + public static void glGenRenderbuffersOES(IntBuffer renderbuffers) { + BufferChecks.checkDirect(renderbuffers); + nglGenRenderbuffersOES(renderbuffers.remaining(), MemoryUtil.getAddress(renderbuffers)); + } + static native void nglGenRenderbuffersOES(int renderbuffers_n, long renderbuffers); + + /** Overloads glGenRenderbuffersOES. */ + public static int glGenRenderbuffersOES() { + IntBuffer renderbuffers = APIUtil.getBufferInt(); + nglGenRenderbuffersOES(1, MemoryUtil.getAddress(renderbuffers)); + return renderbuffers.get(0); + } + + public static void glRenderbufferStorageOES(int target, int internalformat, int width, int height) { + nglRenderbufferStorageOES(target, internalformat, width, height); + } + static native void nglRenderbufferStorageOES(int target, int internalformat, int width, int height); + + public static void glGetRenderbufferParameterOES(int target, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetRenderbufferParameterivOES(target, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetRenderbufferParameterivOES(int target, int pname, long params); + + /** + * Overloads glGetRenderbufferParameterivOES. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteriOES} instead. + */ + @Deprecated + public static int glGetRenderbufferParameterOES(int target, int pname) { + return OESFramebufferObject.glGetRenderbufferParameteriOES(target, pname); + } + + /** Overloads glGetRenderbufferParameterivOES. */ + public static int glGetRenderbufferParameteriOES(int target, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetRenderbufferParameterivOES(target, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static boolean glIsFramebufferOES(int framebuffer) { + boolean __result = nglIsFramebufferOES(framebuffer); + return __result; + } + static native boolean nglIsFramebufferOES(int framebuffer); + + public static void glBindFramebufferOES(int target, int framebuffer) { + nglBindFramebufferOES(target, framebuffer); + } + static native void nglBindFramebufferOES(int target, int framebuffer); + + public static void glDeleteFramebuffersOES(IntBuffer framebuffers) { + BufferChecks.checkDirect(framebuffers); + nglDeleteFramebuffersOES(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers)); + } + static native void nglDeleteFramebuffersOES(int framebuffers_n, long framebuffers); + + /** Overloads glDeleteFramebuffersOES. */ + public static void glDeleteFramebuffersOES(int framebuffer) { + nglDeleteFramebuffersOES(1, APIUtil.getInt(framebuffer)); + } + + public static void glGenFramebuffersOES(IntBuffer framebuffers) { + BufferChecks.checkDirect(framebuffers); + nglGenFramebuffersOES(framebuffers.remaining(), MemoryUtil.getAddress(framebuffers)); + } + static native void nglGenFramebuffersOES(int framebuffers_n, long framebuffers); + + /** Overloads glGenFramebuffersOES. */ + public static int glGenFramebuffersOES() { + IntBuffer framebuffers = APIUtil.getBufferInt(); + nglGenFramebuffersOES(1, MemoryUtil.getAddress(framebuffers)); + return framebuffers.get(0); + } + + public static int glCheckFramebufferStatusOES(int target) { + int __result = nglCheckFramebufferStatusOES(target); + return __result; + } + static native int nglCheckFramebufferStatusOES(int target); + + public static void glFramebufferTexture2DOES(int target, int attachment, int textarget, int texture, int level) { + nglFramebufferTexture2DOES(target, attachment, textarget, texture, level); + } + static native void nglFramebufferTexture2DOES(int target, int attachment, int textarget, int texture, int level); + + public static void glFramebufferRenderbufferOES(int target, int attachment, int renderbuffertarget, int renderbuffer) { + nglFramebufferRenderbufferOES(target, attachment, renderbuffertarget, renderbuffer); + } + static native void nglFramebufferRenderbufferOES(int target, int attachment, int renderbuffertarget, int renderbuffer); + + public static void glGetFramebufferAttachmentParameterOES(int target, int attachment, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglGetFramebufferAttachmentParameterivOES(target, attachment, pname, MemoryUtil.getAddress(params)); + } + static native void nglGetFramebufferAttachmentParameterivOES(int target, int attachment, int pname, long params); + + /** + * Overloads glGetFramebufferAttachmentParameterivOES. + * <p> + * @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteriOES} instead. + */ + @Deprecated + public static int glGetFramebufferAttachmentParameterOES(int target, int attachment, int pname) { + return OESFramebufferObject.glGetFramebufferAttachmentParameteriOES(target, attachment, pname); + } + + /** Overloads glGetFramebufferAttachmentParameterivOES. */ + public static int glGetFramebufferAttachmentParameteriOES(int target, int attachment, int pname) { + IntBuffer params = APIUtil.getBufferInt(); + nglGetFramebufferAttachmentParameterivOES(target, attachment, pname, MemoryUtil.getAddress(params)); + return params.get(0); + } + + public static void glGenerateMipmapOES(int target) { + nglGenerateMipmapOES(target); + } + static native void nglGenerateMipmapOES(int target); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESGetProgramBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESGetProgramBinary.java new file mode 100644 index 0000000..5b3904c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESGetProgramBinary.java @@ -0,0 +1,40 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESGetProgramBinary { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramiv: + */ + public static final int GL_PROGRAM_BINARY_LENGTH_OES = 0x8741; + + /** + * Accepted by the &lt;pname&lt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_NUM_PROGRAM_BINARY_FORMATS_OES = 0x87FE, + GL_PROGRAM_BINARY_FORMATS_OES = 0x87FF; + + private OESGetProgramBinary() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGetProgramBinaryOES(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + BufferChecks.checkBuffer(binaryFormat, 1); + BufferChecks.checkDirect(binary); + nglGetProgramBinaryOES(program, binary.remaining(), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddress(binaryFormat), MemoryUtil.getAddress(binary)); + } + static native void nglGetProgramBinaryOES(int program, int binary_bufSize, long length, long binaryFormat, long binary); + + public static void glProgramBinaryOES(int program, int binaryFormat, ByteBuffer binary) { + BufferChecks.checkDirect(binary); + nglProgramBinaryOES(program, binaryFormat, MemoryUtil.getAddress(binary), binary.remaining()); + } + static native void nglProgramBinaryOES(int program, int binaryFormat, long binary, int binary_length); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESMapbuffer.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESMapbuffer.java new file mode 100644 index 0000000..d9321aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESMapbuffer.java @@ -0,0 +1,107 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESMapbuffer { + + /** + * Accepted by the &lt;access&gt; parameter of MapBufferOES: + */ + public static final int GL_WRITE_ONLY_OES = 0x88B9; + + /** + * Accepted by the &lt;value&gt; parameter of GetBufferParameteriv: + */ + public static final int GL_BUFFER_ACCESS_OES = 0x88BB, + GL_BUFFER_MAPPED_OES = 0x88BC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferPointervOES: + */ + public static final int GL_BUFFER_MAP_POINTER_OES = 0x88BD; + + private OESMapbuffer() {} + + static native void initNativeStubs() throws LWJGLException; + + public static ByteBuffer glGetBufferPointerOES(int target, int pname, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglGetBufferPointervOES(target, pname, GLChecks.getBufferObjectSize(target), old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + public static ByteBuffer glGetBufferPointervOES(int target, int pname, long length, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglGetBufferPointervOES(target, pname, length, old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglGetBufferPointervOES(int target, int pname, long result_size, ByteBuffer old_buffer); + + /** + * glMapBufferOES maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferOES(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferOES(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferOES(int target, int access, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferOES(target, access, GLChecks.getBufferObjectSize(target), old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + /** + * glMapBufferOES maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferOES(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferOES(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * <p> + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * <p> + * @return A ByteBuffer representing the mapped buffer memory. + */ + public static ByteBuffer glMapBufferOES(int target, int access, long length, ByteBuffer old_buffer) { + if (old_buffer != null) + BufferChecks.checkDirect(old_buffer); + ByteBuffer __result = nglMapBufferOES(target, access, length, old_buffer); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglMapBufferOES(int target, int access, long result_size, ByteBuffer old_buffer); + + public static boolean glUnmapBufferOES(int target) { + boolean __result = nglUnmapBufferOES(target); + return __result; + } + static native boolean nglUnmapBufferOES(int target); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESPackedDepthStencil.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESPackedDepthStencil.java new file mode 100644 index 0000000..37eef33 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESPackedDepthStencil.java @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESPackedDepthStencil { + + /** + * Accepted by the &lt;format&gt; parameter of TexImage2D and TexSubImage2D and by the + * &lt;internalformat&gt; parameter of TexImage2D: + */ + public static final int GL_DEPTH_STENCIL_OES = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of TexImage2D and TexSubImage2D: + */ + public static final int GL_UNSIGNED_INT_24_8_OES = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage, and + * returned in the &lt;params&gt; parameter of GetRenderbufferParameteriv when + * &lt;pname&gt; is RENDERBUFFER_INTERNAL_FORMAT: + */ + public static final int GL_DEPTH24_STENCIL8_OES = 0x88F0; + + private OESPackedDepthStencil() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESRGB8RGBA8.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESRGB8RGBA8.java new file mode 100644 index 0000000..2a295d5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESRGB8RGBA8.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESRGB8RGBA8 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_RGB8_OES = 0x8051, + GL_RGBA8_OES = 0x8058; + + private OESRGB8RGBA8() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStandardDerivatives.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStandardDerivatives.java new file mode 100644 index 0000000..49fd4cf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStandardDerivatives.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESStandardDerivatives { + + /** + * Accepted by the &lt;target&gt; parameter of Hint and by the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B; + + private OESStandardDerivatives() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil1.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil1.java new file mode 100644 index 0000000..2f499f4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil1.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESStencil1 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_STENCIL_INDEX1_OES = 0x8D46; + + private OESStencil1() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil4.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil4.java new file mode 100644 index 0000000..8e69635 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil4.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESStencil4 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_STENCIL_INDEX4_OES = 0x8D47; + + private OESStencil4() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil8.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil8.java new file mode 100644 index 0000000..c442bd1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESStencil8.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESStencil8 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: + */ + public static final int GL_STENCIL_INDEX8_OES = 0x8D48; + + private OESStencil8() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESSurfacelessContext.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESSurfacelessContext.java new file mode 100644 index 0000000..05e7eee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESSurfacelessContext.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESSurfacelessContext { + + /** + * Returned by glCheckFramebufferStatusOES and glCheckFramebufferStatus: + */ + public static final int GL_FRAMEBUFFER_UNDEFINED_OES = 0x8219; + + private OESSurfacelessContext() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTexture3D.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTexture3D.java new file mode 100644 index 0000000..73a7c6f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTexture3D.java @@ -0,0 +1,95 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESTexture3D { + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3DOES, TexSubImage3DOES, + * CopyTexSubImage3DOES, CompressedTexImage3DOES and + * CompressedTexSubImage3DOES, GetTexParameteriv, and GetTexParameterfv: + */ + public static final int GL_TEXTURE_3D_OES = 0x806F; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteriv, TexParameterfv, + * GetTexParameteriv, and GetTexParameterfv: + */ + public static final int GL_TEXTURE_WRAP_R_OES = 0x8072; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + public static final int GL_MAX_3D_TEXTURE_SIZE_OES = 0x8073, + GL_TEXTURE_BINDING_3D_OES = 0x806A; + + private OESTexture3D() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glTexImage3DOES(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3DOES(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3DOES(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, FloatBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3DOES(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3DOES(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3DOES(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + public static void glTexImage3DOES(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, ShortBuffer pixels) { + if (pixels != null) + BufferChecks.checkBuffer(pixels, GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)); + nglTexImage3DOES(target, level, internalFormat, width, height, depth, border, format, type, MemoryUtil.getAddressSafe(pixels)); + } + static native void nglTexImage3DOES(int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, long pixels); + + public static void glTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + public static void glTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer pixels) { + BufferChecks.checkBuffer(pixels, GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)); + nglTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(pixels)); + } + static native void nglTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long pixels); + + public static void glCopyTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + nglCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height); + } + static native void nglCopyTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height); + + public static void glCompressedTexImage3DOES(int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexImage3DOES(int target, int level, int internalformat, int width, int height, int depth, int border, int imageSize, long data); + + public static void glCompressedTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, ByteBuffer data) { + BufferChecks.checkDirect(data); + nglCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, MemoryUtil.getAddress(data)); + } + static native void nglCompressedTexSubImage3DOES(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int imageSize, long data); + + public static void glFramebufferTexture3DOES(int target, int attachment, int textarget, int texture, int level, int zoffset) { + nglFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); + } + static native void nglFramebufferTexture3DOES(int target, int attachment, int textarget, int texture, int level, int zoffset); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTextureHalfFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTextureHalfFloat.java new file mode 100644 index 0000000..e81a5c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESTextureHalfFloat.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESTextureHalfFloat { + + /** + * Accepted by the &lt;type&gt; parameter of TexImage2D, TexSubImage2D, + * TexImage3D, and TexSubImage3D: + */ + public static final int GL_HALF_FLOAT_OES = 0x8D61; + + private OESTextureHalfFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexArrayObject.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexArrayObject.java new file mode 100644 index 0000000..efed36d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexArrayObject.java @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESVertexArrayObject { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv: + */ + public static final int GL_VERTEX_ARRAY_BINDING_OES = 0x85B5; + + private OESVertexArrayObject() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glBindVertexArrayOES(int array) { + nglBindVertexArrayOES(array); + } + static native void nglBindVertexArrayOES(int array); + + public static void glDeleteVertexArraysOES(IntBuffer arrays) { + BufferChecks.checkDirect(arrays); + nglDeleteVertexArraysOES(arrays.remaining(), MemoryUtil.getAddress(arrays)); + } + static native void nglDeleteVertexArraysOES(int arrays_n, long arrays); + + /** Overloads glDeleteVertexArraysOES. */ + public static void glDeleteVertexArraysOES(int array) { + nglDeleteVertexArraysOES(1, APIUtil.getInt(array)); + } + + public static void glGenVertexArraysOES(IntBuffer arrays) { + BufferChecks.checkDirect(arrays); + nglGenVertexArraysOES(arrays.remaining(), MemoryUtil.getAddress(arrays)); + } + static native void nglGenVertexArraysOES(int arrays_n, long arrays); + + /** Overloads glGenVertexArraysOES. */ + public static int glGenVertexArraysOES() { + IntBuffer arrays = APIUtil.getBufferInt(); + nglGenVertexArraysOES(1, MemoryUtil.getAddress(arrays)); + return arrays.get(0); + } + + public static boolean glIsVertexArrayOES(int array) { + boolean __result = nglIsVertexArrayOES(array); + return __result; + } + static native boolean nglIsVertexArrayOES(int array); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexHalfFloat.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexHalfFloat.java new file mode 100644 index 0000000..f8cc639 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexHalfFloat.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESVertexHalfFloat { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer: + */ + public static final int GL_HALF_FLOAT_OES = 0x8D61; + + private OESVertexHalfFloat() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexType1010102.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexType1010102.java new file mode 100644 index 0000000..2956ee5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/OESVertexType1010102.java @@ -0,0 +1,17 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class OESVertexType1010102 { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer + */ + public static final int GL_UNSIGNED_INT_10_10_10_2_OES = 0x8DF6, + GL_INT_10_10_10_2_OES = 0x8DF7; + + private OESVertexType1010102() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMBinningControl.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMBinningControl.java new file mode 100644 index 0000000..fd32372 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMBinningControl.java @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMBinningControl { + + /** + * Accepted by the &lt;target&gt; parameter of Hint: + */ + public static final int GL_BINNING_CONTROL_HINT_QCOM = 0x8FB0; + + /** + * Accepted by the &lt;hint&gt; parameter of Hint: + */ + public static final int GL_CPU_OPTIMIZED_QCOM = 0x8FB1, + GL_GPU_OPTIMIZED_QCOM = 0x8FB2, + GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM = 0x8FB3, + GL_DONT_CARE = 0x1100; + + private QCOMBinningControl() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMDriverControl.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMDriverControl.java new file mode 100644 index 0000000..2264276 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMDriverControl.java @@ -0,0 +1,50 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMDriverControl { + + private QCOMDriverControl() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glGetDriverControlsQCOM(IntBuffer num, IntBuffer driverControls) { + if (num != null) + BufferChecks.checkBuffer(num, 1); + if (driverControls != null) + BufferChecks.checkDirect(driverControls); + nglGetDriverControlsQCOM(MemoryUtil.getAddressSafe(num), (driverControls == null ? 0 : driverControls.remaining()), MemoryUtil.getAddressSafe(driverControls)); + } + static native void nglGetDriverControlsQCOM(long num, int driverControls_size, long driverControls); + + public static void glGetDriverControlStringQCOM(int driverControl, IntBuffer length, ByteBuffer driverControlString) { + if (length != null) + BufferChecks.checkBuffer(length, 1); + if (driverControlString != null) + BufferChecks.checkDirect(driverControlString); + nglGetDriverControlStringQCOM(driverControl, (driverControlString == null ? 0 : driverControlString.remaining()), MemoryUtil.getAddressSafe(length), MemoryUtil.getAddressSafe(driverControlString)); + } + static native void nglGetDriverControlStringQCOM(int driverControl, int driverControlString_bufSize, long length, long driverControlString); + + /** Overloads glGetDriverControlStringQCOM. */ + public static String glGetDriverControlStringQCOM(int driverControl, int bufSize) { + IntBuffer driverControlString_length = APIUtil.getLengths(); + ByteBuffer driverControlString = APIUtil.getBufferByte(bufSize); + nglGetDriverControlStringQCOM(driverControl, bufSize, MemoryUtil.getAddress0(driverControlString_length), MemoryUtil.getAddress(driverControlString)); + driverControlString.limit(driverControlString_length.get(0)); + return APIUtil.getString(driverControlString); + } + + public static void glEnableDriverControlQCOM(int driverControl) { + nglEnableDriverControlQCOM(driverControl); + } + static native void nglEnableDriverControlQCOM(int driverControl); + + public static void glDisableDriverControlQCOM(int driverControl) { + nglDisableDriverControlQCOM(driverControl); + } + static native void nglDisableDriverControlQCOM(int driverControl); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet.java new file mode 100644 index 0000000..95c5565 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet.java @@ -0,0 +1,95 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMExtendedGet { + + /** + * Accepted by the &lt;pname&gt; parameter of ExtGetTexLevelParameterivQCOM + */ + public static final int GL_TEXTURE_WIDTH_QCOM = 0x8BD2, + GL_TEXTURE_HEIGHT_QCOM = 0x8BD3, + GL_TEXTURE_DEPTH_QCOM = 0x8BD4, + GL_TEXTURE_INTERNAL_FORMAT_QCOM = 0x8BD5, + GL_TEXTURE_FORMAT_QCOM = 0x8BD6, + GL_TEXTURE_TYPE_QCOM = 0x8BD7, + GL_TEXTURE_IMAGE_VALID_QCOM = 0x8BD8, + GL_TEXTURE_NUM_LEVELS_QCOM = 0x8BD9, + GL_TEXTURE_TARGET_QCOM = 0x8BDA, + GL_TEXTURE_OBJECT_VALID_QCOM = 0x8BDB; + + /** + * Accepted by the &lt;pname&gt; parameter of ExtTexObjectStateOverrideiQCOM + */ + public static final int GL_STATE_RESTORE = 0x8BDC; + + private QCOMExtendedGet() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glExtGetTexturesQCOM(IntBuffer textures, IntBuffer numTextures) { + BufferChecks.checkBuffer(textures, 1); + BufferChecks.checkBuffer(numTextures, 1); + nglExtGetTexturesQCOM(MemoryUtil.getAddress(textures), textures.remaining(), MemoryUtil.getAddress(numTextures)); + } + static native void nglExtGetTexturesQCOM(long textures, int textures_maxTextures, long numTextures); + + public static void glExtGetBuffersQCOM(IntBuffer buffers, IntBuffer numBuffers) { + BufferChecks.checkBuffer(buffers, 1); + BufferChecks.checkBuffer(numBuffers, 1); + nglExtGetBuffersQCOM(MemoryUtil.getAddress(buffers), buffers.remaining(), MemoryUtil.getAddress(numBuffers)); + } + static native void nglExtGetBuffersQCOM(long buffers, int buffers_maxBuffers, long numBuffers); + + public static void glExtGetRenderbuffersQCOM(IntBuffer renderbuffers, IntBuffer numRenderbuffers) { + BufferChecks.checkBuffer(renderbuffers, 1); + BufferChecks.checkBuffer(numRenderbuffers, 1); + nglExtGetRenderbuffersQCOM(MemoryUtil.getAddress(renderbuffers), renderbuffers.remaining(), MemoryUtil.getAddress(numRenderbuffers)); + } + static native void nglExtGetRenderbuffersQCOM(long renderbuffers, int renderbuffers_maxRenderbuffers, long numRenderbuffers); + + public static void glExtGetFramebuffersQCOM(IntBuffer framebuffers, IntBuffer numFramebuffers) { + BufferChecks.checkBuffer(framebuffers, 1); + BufferChecks.checkBuffer(numFramebuffers, 1); + nglExtGetFramebuffersQCOM(MemoryUtil.getAddress(framebuffers), framebuffers.remaining(), MemoryUtil.getAddress(numFramebuffers)); + } + static native void nglExtGetFramebuffersQCOM(long framebuffers, int framebuffers_maxFramebuffers, long numFramebuffers); + + public static void glExtGetTexLevelParameterivQCOM(int texture, int face, int level, int pname, IntBuffer params) { + BufferChecks.checkBuffer(params, 1); + nglExtGetTexLevelParameterivQCOM(texture, face, level, pname, MemoryUtil.getAddress(params)); + } + static native void nglExtGetTexLevelParameterivQCOM(int texture, int face, int level, int pname, long params); + + public static void glExtTexObjectStateOverrideiQCOM(int target, int pname, int param) { + nglExtTexObjectStateOverrideiQCOM(target, pname, param); + } + static native void nglExtTexObjectStateOverrideiQCOM(int target, int pname, int param); + + public static void glExtGetTexSubImageQCOM(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer texels) { + BufferChecks.checkBuffer(texels, GLChecks.calculateImageStorage(texels, format, type, width, height, depth)); + nglExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(texels)); + } + public static void glExtGetTexSubImageQCOM(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, FloatBuffer texels) { + BufferChecks.checkBuffer(texels, GLChecks.calculateImageStorage(texels, format, type, width, height, depth)); + nglExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(texels)); + } + public static void glExtGetTexSubImageQCOM(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, IntBuffer texels) { + BufferChecks.checkBuffer(texels, GLChecks.calculateImageStorage(texels, format, type, width, height, depth)); + nglExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(texels)); + } + public static void glExtGetTexSubImageQCOM(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ShortBuffer texels) { + BufferChecks.checkBuffer(texels, GLChecks.calculateImageStorage(texels, format, type, width, height, depth)); + nglExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, MemoryUtil.getAddress(texels)); + } + static native void nglExtGetTexSubImageQCOM(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, long texels); + + public static ByteBuffer glExtGetBufferPointervQCOM(int target, long result_size) { + ByteBuffer __result = nglExtGetBufferPointervQCOM(target, result_size); + return LWJGLUtil.CHECKS && __result == null ? null : __result.order(ByteOrder.nativeOrder()); + } + static native ByteBuffer nglExtGetBufferPointervQCOM(int target, long result_size); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet2.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet2.java new file mode 100644 index 0000000..d688dfe --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMExtendedGet2.java @@ -0,0 +1,40 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMExtendedGet2 { + + private QCOMExtendedGet2() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glExtGetShadersQCOM(IntBuffer shaders, IntBuffer numShaders) { + BufferChecks.checkBuffer(shaders, 1); + BufferChecks.checkBuffer(numShaders, 1); + nglExtGetShadersQCOM(MemoryUtil.getAddress(shaders), shaders.remaining(), MemoryUtil.getAddress(numShaders)); + } + static native void nglExtGetShadersQCOM(long shaders, int shaders_maxShaders, long numShaders); + + public static void glExtGetProgramsQCOM(IntBuffer programs, IntBuffer numPrograms) { + BufferChecks.checkBuffer(programs, 1); + BufferChecks.checkBuffer(numPrograms, 1); + nglExtGetProgramsQCOM(MemoryUtil.getAddress(programs), programs.remaining(), MemoryUtil.getAddress(numPrograms)); + } + static native void nglExtGetProgramsQCOM(long programs, int programs_maxPrograms, long numPrograms); + + public static boolean glExtIsProgramBinaryQCOM(int program) { + boolean __result = nglExtIsProgramBinaryQCOM(program); + return __result; + } + static native boolean nglExtIsProgramBinaryQCOM(int program); + + public static void glExtGetProgramBinarySourceQCOM(int program, int shadertype, ByteBuffer source, IntBuffer length) { + BufferChecks.checkDirect(source); + BufferChecks.checkBuffer(length, 1); + nglExtGetProgramBinarySourceQCOM(program, shadertype, MemoryUtil.getAddress(source), MemoryUtil.getAddress(length)); + } + static native void nglExtGetProgramBinarySourceQCOM(int program, int shadertype, long source, long length); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMPerformanceMonitorGlobalMode.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMPerformanceMonitorGlobalMode.java new file mode 100644 index 0000000..fc0e459 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMPerformanceMonitorGlobalMode.java @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMPerformanceMonitorGlobalMode { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable and Disable, and + * IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + public static final int GL_PERFMON_GLOBAL_MODE_QCOM = 0x8FA0; + + private QCOMPerformanceMonitorGlobalMode() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMTiledRendering.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMTiledRendering.java new file mode 100644 index 0000000..fc87335 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMTiledRendering.java @@ -0,0 +1,60 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMTiledRendering { + + /** + * Accepted by the &lt;preserveMask&gt; parameter of StartTilingQCOM and + * EndTilingQCOM + */ + public static final int GL_COLOR_BUFFER_BIT0_QCOM = 0x1, + GL_COLOR_BUFFER_BIT1_QCOM = 0x2, + GL_COLOR_BUFFER_BIT2_QCOM = 0x4, + GL_COLOR_BUFFER_BIT3_QCOM = 0x8, + GL_COLOR_BUFFER_BIT4_QCOM = 0x10, + GL_COLOR_BUFFER_BIT5_QCOM = 0x20, + GL_COLOR_BUFFER_BIT6_QCOM = 0x40, + GL_COLOR_BUFFER_BIT7_QCOM = 0x80, + GL_DEPTH_BUFFER_BIT0_QCOM = 0x100, + GL_DEPTH_BUFFER_BIT1_QCOM = 0x200, + GL_DEPTH_BUFFER_BIT2_QCOM = 0x400, + GL_DEPTH_BUFFER_BIT3_QCOM = 0x800, + GL_DEPTH_BUFFER_BIT4_QCOM = 0x1000, + GL_DEPTH_BUFFER_BIT5_QCOM = 0x2000, + GL_DEPTH_BUFFER_BIT6_QCOM = 0x4000, + GL_DEPTH_BUFFER_BIT7_QCOM = 0x8000, + GL_STENCIL_BUFFER_BIT0_QCOM = 0x10000, + GL_STENCIL_BUFFER_BIT1_QCOM = 0x20000, + GL_STENCIL_BUFFER_BIT2_QCOM = 0x40000, + GL_STENCIL_BUFFER_BIT3_QCOM = 0x80000, + GL_STENCIL_BUFFER_BIT4_QCOM = 0x100000, + GL_STENCIL_BUFFER_BIT5_QCOM = 0x200000, + GL_STENCIL_BUFFER_BIT6_QCOM = 0x400000, + GL_STENCIL_BUFFER_BIT7_QCOM = 0x800000, + GL_MULTISAMPLE_BUFFER_BIT0_QCOM = 0x1000000, + GL_MULTISAMPLE_BUFFER_BIT1_QCOM = 0x2000000, + GL_MULTISAMPLE_BUFFER_BIT2_QCOM = 0x4000000, + GL_MULTISAMPLE_BUFFER_BIT3_QCOM = 0x8000000, + GL_MULTISAMPLE_BUFFER_BIT4_QCOM = 0x10000000, + GL_MULTISAMPLE_BUFFER_BIT5_QCOM = 0x20000000, + GL_MULTISAMPLE_BUFFER_BIT6_QCOM = 0x40000000, + GL_MULTISAMPLE_BUFFER_BIT7_QCOM = 0x80000000; + + private QCOMTiledRendering() {} + + static native void initNativeStubs() throws LWJGLException; + + public static void glStartTilingQCOM(int x, int y, int width, int height, int preserveMask) { + nglStartTilingQCOM(x, y, width, height, preserveMask); + } + static native void nglStartTilingQCOM(int x, int y, int width, int height, int preserveMask); + + public static void glEndTilingQCOM(int preserveMask) { + nglEndTilingQCOM(preserveMask); + } + static native void nglEndTilingQCOM(int preserveMask); +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMWriteonlyRendering.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMWriteonlyRendering.java new file mode 100644 index 0000000..ed43e2f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/QCOMWriteonlyRendering.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class QCOMWriteonlyRendering { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable. + */ + public static final int GL_WRITEONLY_RENDERING_QCOM = 0x8823; + + private QCOMWriteonlyRendering() {} +} diff --git a/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/VIVShaderBinary.java b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/VIVShaderBinary.java new file mode 100644 index 0000000..82083a1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/generated/org/lwjgl/opengles/VIVShaderBinary.java @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +package org.lwjgl.opengles; + +import org.lwjgl.*; +import java.nio.*; + +public final class VIVShaderBinary { + + /** + * Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: + */ + public static final int GL_SHADER_BINARY_VIV = 0x8FC4; + + private VIVShaderBinary() {} +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferChecks.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferChecks.java new file mode 100644 index 0000000..df3c0cd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferChecks.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.nio.*; + +/** + * <p>A class to check buffer boundaries in general. If there is unsufficient space + * in the buffer when the call is made then a buffer overflow would otherwise + * occur and cause unexpected behaviour, a crash, or worse, a security risk. + * + * Internal class, don't use. + * </p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class BufferChecks { + /** Static methods only! */ + private BufferChecks() { + } + + /** + * Helper methods to ensure a function pointer is not-null (0) + */ + public static void checkFunctionAddress(long pointer) { + if (LWJGLUtil.CHECKS && pointer == 0) { + throw new IllegalStateException("Function is not supported"); + } + } + + /** + * Helper methods to ensure a ByteBuffer is null-terminated + */ + public static void checkNullTerminated(ByteBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + public static void checkNullTerminated(ByteBuffer buf, int count) { + if ( LWJGLUtil.CHECKS ) { + int nullFound = 0; + for ( int i = buf.position(); i < buf.limit(); i++ ) { + if ( buf.get(i) == 0 ) + nullFound++; + } + + if ( nullFound < count ) + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure an IntBuffer is null-terminated */ + public static void checkNullTerminated(IntBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure a LongBuffer is null-terminated */ + public static void checkNullTerminated(LongBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + /** Helper method to ensure a PointerBuffer is null-terminated */ + public static void checkNullTerminated(PointerBuffer buf) { + if ( LWJGLUtil.CHECKS && buf.get(buf.limit() - 1) != 0 ) { + throw new IllegalArgumentException("Missing null termination"); + } + } + + public static void checkNotNull(Object o) { + if ( LWJGLUtil.CHECKS && o == null) + throw new IllegalArgumentException("Null argument"); + } + + /** + * Helper methods to ensure a buffer is direct (and, implicitly, non-null). + */ + public static void checkDirect(ByteBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("ByteBuffer is not direct"); + } + } + + public static void checkDirect(ShortBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("ShortBuffer is not direct"); + } + } + + public static void checkDirect(IntBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("IntBuffer is not direct"); + } + } + + public static void checkDirect(LongBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("LongBuffer is not direct"); + } + } + + public static void checkDirect(FloatBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("FloatBuffer is not direct"); + } + } + + public static void checkDirect(DoubleBuffer buf) { + if ( LWJGLUtil.CHECKS && !buf.isDirect()) { + throw new IllegalArgumentException("DoubleBuffer is not direct"); + } + } + + public static void checkDirect(PointerBuffer buf) { + // NO-OP, PointerBuffer is always direct. + } + + public static void checkArray(Object[] array) { + if ( LWJGLUtil.CHECKS && (array == null || array.length == 0) ) + throw new IllegalArgumentException("Invalid array"); + } + + /** + * This is a separate call to help inline checkBufferSize. + */ + private static void throwBufferSizeException(Buffer buf, int size) { + throw new IllegalArgumentException("Number of remaining buffer elements is " + buf.remaining() + ", must be at least " + size + ". Because at most " + size + " elements can be returned, a buffer with at least " + size + " elements is required, regardless of actual returned element count"); + } + + private static void throwBufferSizeException(PointerBuffer buf, int size) { + throw new IllegalArgumentException("Number of remaining pointer buffer elements is " + buf.remaining() + ", must be at least " + size); + } + + private static void throwArraySizeException(Object[] array, int size) { + throw new IllegalArgumentException("Number of array elements is " + array.length + ", must be at least " + size); + } + + private static void throwArraySizeException(long[] array, int size) { + throw new IllegalArgumentException("Number of array elements is " + array.length + ", must be at least " + size); + } + + /** + * Helper method to ensure a buffer is big enough to receive data from a + * glGet* operation. + * + * @param buf + * The buffer to check + * @param size + * The minimum buffer size + * @throws IllegalArgumentException + */ + public static void checkBufferSize(Buffer buf, int size) { + if ( LWJGLUtil.CHECKS && buf.remaining() < size) { + throwBufferSizeException(buf, size); + } + } + + /** + * Detects the buffer type and performs the corresponding check + * and also returns the buffer position in bytes. + * + * @param buffer the buffer to check + * @param size the size to check + * + * @return the buffer position in bytes + */ + public static int checkBuffer(final Buffer buffer, final int size) { + final int posShift; + if ( buffer instanceof ByteBuffer ) { + BufferChecks.checkBuffer((ByteBuffer)buffer, size); + posShift = 0; + } else if ( buffer instanceof ShortBuffer ) { + BufferChecks.checkBuffer((ShortBuffer)buffer, size); + posShift = 1; + } else if ( buffer instanceof IntBuffer ) { + BufferChecks.checkBuffer((IntBuffer)buffer, size); + posShift = 2; + } else if ( buffer instanceof LongBuffer ) { + BufferChecks.checkBuffer((LongBuffer)buffer, size); + posShift = 4; + } else if ( buffer instanceof FloatBuffer ) { + BufferChecks.checkBuffer((FloatBuffer)buffer, size); + posShift = 2; + } else if ( buffer instanceof DoubleBuffer ) { + BufferChecks.checkBuffer((DoubleBuffer)buffer, size); + posShift = 4; + } else + throw new IllegalArgumentException("Unsupported Buffer type specified: " + buffer.getClass()); + + return buffer.position() << posShift; + } + + public static void checkBuffer(ByteBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(ShortBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(IntBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(LongBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(FloatBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(DoubleBuffer buf, int size) { + if ( LWJGLUtil.CHECKS ) { + checkBufferSize(buf, size); + checkDirect(buf); + } + } + + public static void checkBuffer(PointerBuffer buf, int size) { + if ( LWJGLUtil.CHECKS && buf.remaining() < size ) { + throwBufferSizeException(buf, size); + } + } + + public static void checkArray(Object[] array, int size) { + if ( LWJGLUtil.CHECKS && array.length < size ) + throwArraySizeException(array, size); + } + + public static void checkArray(long[] array, int size) { + if ( LWJGLUtil.CHECKS && array.length < size ) + throwArraySizeException(array, size); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferUtils.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferUtils.java new file mode 100644 index 0000000..537ced3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/BufferUtils.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.CharBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; + +/** + * Some often-used Buffer code for creating native buffers of the appropriate size. + * + * @author $Author$ + * @version $Revision$ + * $Id$ + */ + +public final class BufferUtils { + + /** + * Construct a direct native-ordered bytebuffer with the specified size. + * @param size The size, in bytes + * @return a ByteBuffer + */ + public static ByteBuffer createByteBuffer(int size) { + return ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()); + } + + /** + * Construct a direct native-order shortbuffer with the specified number + * of elements. + * @param size The size, in shorts + * @return a ShortBuffer + */ + public static ShortBuffer createShortBuffer(int size) { + return createByteBuffer(size << 1).asShortBuffer(); + } + + /** + * Construct a direct native-order charbuffer with the specified number + * of elements. + * @param size The size, in chars + * @return an CharBuffer + */ + public static CharBuffer createCharBuffer(int size) { + return createByteBuffer(size << 1).asCharBuffer(); + } + + /** + * Construct a direct native-order intbuffer with the specified number + * of elements. + * @param size The size, in ints + * @return an IntBuffer + */ + public static IntBuffer createIntBuffer(int size) { + return createByteBuffer(size << 2).asIntBuffer(); + } + + /** + * Construct a direct native-order longbuffer with the specified number + * of elements. + * @param size The size, in longs + * @return an LongBuffer + */ + public static LongBuffer createLongBuffer(int size) { + return createByteBuffer(size << 3).asLongBuffer(); + } + + /** + * Construct a direct native-order floatbuffer with the specified number + * of elements. + * @param size The size, in floats + * @return a FloatBuffer + */ + public static FloatBuffer createFloatBuffer(int size) { + return createByteBuffer(size << 2).asFloatBuffer(); + } + + /** + * Construct a direct native-order doublebuffer with the specified number + * of elements. + * @param size The size, in floats + * @return a FloatBuffer + */ + public static DoubleBuffer createDoubleBuffer(int size) { + return createByteBuffer(size << 3).asDoubleBuffer(); + } + + /** + * Construct a PointerBuffer with the specified number + * of elements. + * @param size The size, in memory addresses + * @return a PointerBuffer + */ + public static PointerBuffer createPointerBuffer(int size) { + return PointerBuffer.allocateDirect(size); + } + + /** + * @return n, where buffer_element_size=2^n. + */ + public static int getElementSizeExponent(Buffer buf) { + if (buf instanceof ByteBuffer) + return 0; + else if (buf instanceof ShortBuffer || buf instanceof CharBuffer) + return 1; + else if (buf instanceof FloatBuffer || buf instanceof IntBuffer) + return 2; + else if (buf instanceof LongBuffer || buf instanceof DoubleBuffer) + return 3; + else + throw new IllegalStateException("Unsupported buffer type: " + buf); + } + + /** + * A helper function which is used to get the byte offset in an arbitrary buffer + * based on its position + * @return the position of the buffer, in BYTES + */ + public static int getOffset(Buffer buffer) { + return buffer.position() << getElementSizeExponent(buffer); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(ByteBuffer b) { + zeroBuffer0(b, b.position(), b.remaining()); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(ShortBuffer b) { + zeroBuffer0(b, b.position()*2L, b.remaining()*2L); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(CharBuffer b) { + zeroBuffer0(b, b.position()*2L, b.remaining()*2L); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(IntBuffer b) { + zeroBuffer0(b, b.position()*4L, b.remaining()*4L); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(FloatBuffer b) { + zeroBuffer0(b, b.position()*4L, b.remaining()*4L); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(LongBuffer b) { + zeroBuffer0(b, b.position()*8L, b.remaining()*8L); + } + + /** Fill buffer with zeros from position to remaining */ + public static void zeroBuffer(DoubleBuffer b) { + zeroBuffer0(b, b.position()*8L, b.remaining()*8L); + } + + /** Fill buffer with zeros from position to remaining */ + private static native void zeroBuffer0(Buffer b, long off, long size); + + /** + * Returns the memory address of the specified buffer. + * + * @param buffer the buffer + * + * @return the memory address + */ + static native long getBufferAddress(Buffer buffer); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/DefaultSysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/DefaultSysImplementation.java new file mode 100644 index 0000000..a903a48 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/DefaultSysImplementation.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +abstract class DefaultSysImplementation implements SysImplementation { + public native int getJNIVersion(); + public native int getPointerSize(); + public native void setDebug(boolean debug); + + public long getTimerResolution() { + return 1000; + } + + public boolean has64Bit() { + return false; + } + + public abstract long getTime(); + public abstract void alert(String title, String message); + public abstract String getClipboard(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/J2SESysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/J2SESysImplementation.java new file mode 100644 index 0000000..2564e10 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/J2SESysImplementation.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import javax.swing.JOptionPane; +import javax.swing.UIManager; + +/** + * A SysImplementation which delegates as much as it can to J2SE. + * <p> + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +abstract class J2SESysImplementation extends DefaultSysImplementation { + + public long getTime() { + return System.currentTimeMillis(); + } + + public void alert(String title, String message) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch(Exception e) { + LWJGLUtil.log("Caught exception while setting LAF: " + e); + } + JOptionPane.showMessageDialog(null, message, title, JOptionPane.WARNING_MESSAGE); + } + + public String getClipboard() { + try { + java.awt.datatransfer.Clipboard clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); + java.awt.datatransfer.Transferable transferable = clipboard.getContents(null); + if (transferable.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.stringFlavor)) { + return (String)transferable.getTransferData(java.awt.datatransfer.DataFlavor.stringFlavor); + } + } catch (Exception e) { + LWJGLUtil.log("Exception while getting clipboard: " + e); + } + return null; + } + + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLException.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLException.java new file mode 100644 index 0000000..981c170 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLException.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +/** + * <p> + * This exception is supplied to make exception handling more generic for LWJGL + * specific exceptions + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class LWJGLException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Plain c'tor + */ + public LWJGLException() { + super(); + } + + /** + * Creates a new LWJGLException + * + * @param msg + * String identifier for exception + */ + public LWJGLException(String msg) { + super(msg); + } + + /** + * @param message + * @param cause + */ + public LWJGLException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param cause + */ + public LWJGLException(Throwable cause) { + super(cause); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLUtil.java new file mode 100644 index 0000000..dd0729b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LWJGLUtil.java @@ -0,0 +1,614 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.*; + +/** + * <p> + * Internal library methods + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class LWJGLUtil { + public static final int PLATFORM_LINUX = 1; + public static final int PLATFORM_MACOSX = 2; + public static final int PLATFORM_WINDOWS = 3; + public static final String PLATFORM_LINUX_NAME = "linux"; + public static final String PLATFORM_MACOSX_NAME = "macosx"; + public static final String PLATFORM_WINDOWS_NAME = "windows"; + + private static final String LWJGL_ICON_DATA_16x16 = + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\377\377\377\302\327\350\377" + + "\164\244\313\377\120\213\275\377\124\216\277\377\206\257\322\377" + + "\347\357\366\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\365\365\365\377\215\217\221\377\166\202\215\377" + + "\175\215\233\377\204\231\252\377\224\267\325\377\072\175\265\377" + + "\110\206\272\377\332\347\361\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\364\370\373\377\234\236\240\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\344\344\344\377\204\255\320\377" + + "\072\175\265\377\133\222\301\377\374\375\376\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\221\266\325\377\137\137\137\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\042\042\042\377\377\377\377\377\350\360\366\377" + + "\071\174\265\377\072\175\265\377\304\330\351\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\306\331\351\377" + + "\201\253\316\377\035\035\035\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\146\146\146\377\377\377\377\377\320\340\355\377" + + "\072\175\265\377\072\175\265\377\215\264\324\377\377\377\377\377" + + "\362\362\362\377\245\245\245\377\337\337\337\377\242\301\334\377" + + "\260\305\326\377\012\012\012\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\250\250\250\377\377\377\377\377\227\272\330\377" + + "\072\175\265\377\072\175\265\377\161\241\312\377\377\377\377\377" + + "\241\241\241\377\000\000\000\377\001\001\001\377\043\043\043\377" + + "\314\314\314\377\320\320\320\377\245\245\245\377\204\204\204\377" + + "\134\134\134\377\357\357\357\377\377\377\377\377\140\226\303\377" + + "\072\175\265\377\072\175\265\377\155\236\310\377\377\377\377\377" + + "\136\136\136\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\317\317\317\377\037\037\037\377\003\003\003\377\053\053\053\377" + + "\154\154\154\377\306\306\306\377\372\374\375\377\236\277\332\377" + + "\167\245\314\377\114\211\274\377\174\250\316\377\377\377\377\377" + + "\033\033\033\377\000\000\000\377\000\000\000\377\027\027\027\377" + + "\326\326\326\377\001\001\001\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\122\122\122\377\345\345\345\377\075\075\075\377" + + "\150\150\150\377\246\246\247\377\332\336\341\377\377\377\377\377" + + "\164\164\164\377\016\016\016\377\000\000\000\377\131\131\131\377" + + "\225\225\225\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\221\221\221\377\233\233\233\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\002\002\002\377\103\103\103\377" + + "\377\377\377\377\356\356\356\377\214\214\214\377\277\277\277\377" + + "\126\126\126\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\323\323\323\377\130\130\130\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\063\063\063\377" + + "\377\377\377\377\377\377\377\377\374\375\376\377\377\377\377\377" + + "\300\300\300\377\100\100\100\377\002\002\002\377\000\000\000\377" + + "\033\033\033\377\373\373\373\377\027\027\027\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\170\170\170\377" + + "\377\377\377\377\377\377\377\377\322\341\356\377\176\251\316\377" + + "\340\352\363\377\377\377\377\377\324\324\324\377\155\155\155\377" + + "\204\204\204\377\323\323\323\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\275\275\275\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\146\232\305\377" + + "\075\177\266\377\202\254\320\377\344\355\365\377\377\377\377\377" + + "\377\377\377\377\345\345\345\377\055\055\055\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\014\014\014\377\366\366\366\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\342\354\364\377" + + "\115\211\274\377\072\175\265\377\076\200\266\377\207\260\322\377" + + "\347\357\366\377\377\377\377\377\376\376\376\377\274\274\274\377" + + "\117\117\117\377\003\003\003\377\112\112\112\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\353\362\370\377\214\263\324\377\126\220\300\377\120\214\275\377" + + "\167\245\314\377\355\363\370\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\337\337\337\377\346\346\346\377\377\377\377\377"; + + private static final String LWJGL_ICON_DATA_32x32 = + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\374\375\377" + + "\313\335\354\377\223\267\326\377\157\240\311\377\134\223\302\377\140\226\303\377\172\247\315\377\254\310\340\377\355\363\370\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\375\376\377\265\316\343\377\132\222\301\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\105\205\271\377" + + "\241\301\334\377\374\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\374\374\377\342\352\361\377\270\317\343\377\256\311\340\377" + + "\243\302\334\377\230\272\330\377\214\263\323\377\201\254\317\377\156\237\310\377\075\177\266\377\072\175\265\377\072\175\265\377" + + "\072\175\265\377\162\242\312\377\365\370\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\330\330\330\377\061\061\061\377\044\044\044\377\061\061\061\377\100\100\100\377" + + "\122\122\122\377\145\145\145\377\164\164\164\377\217\217\217\377\367\370\370\377\254\310\337\377\073\175\265\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\171\247\315\377\374\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\150\150\150\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\266\266\266\377\376\376\376\377\206\256\321\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\256\312\341\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\323\342\356\377\341\352\362\377\050\050\050\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\002\002\002\377\336\336\336\377\377\377\377\377\365\370\373\377\133\222\301\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\110\206\272\377\364\370\373\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\354\363\370\377\144\231\305\377\327\331\333\377\005\005\005\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\044\044\044\377\376\376\376\377\377\377\377\377\377\377\377\377\300\325\347\377" + + "\071\174\265\377\072\175\265\377\072\175\265\377\072\175\265\377\253\310\340\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + + "\170\246\314\377\173\247\315\377\236\236\236\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\145\145\145\377\377\377\377\377\377\377\377\377\377\377\377\377\342\354\364\377" + + "\067\173\264\377\072\175\265\377\072\175\265\377\072\175\265\377\146\232\305\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\327\350\377" + + "\071\175\265\377\262\314\341\377\130\130\130\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\251\251\251\377\377\377\377\377\377\377\377\377\377\377\377\377\274\322\345\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\100\201\267\377\356\364\371\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\374\375\377\132\222\301\377" + + "\075\177\266\377\335\345\355\377\034\034\034\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\007\007\007\377\347\347\347\377\377\377\377\377\377\377\377\377\377\377\377\377\205\256\321\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\071\175\265\377\314\336\354\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\377\272\322\345\377\072\175\265\377" + + "\127\220\277\377\320\321\321\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\063\063\063\377\375\375\375\377\377\377\377\377\377\377\377\377\373\374\375\377\120\213\275\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\071\175\265\377\261\314\342\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\312\312\312\377\067\067\067\377\141\141\141\377\242\242\242\377\335\335\335\377\344\354\363\377\261\313\341\377" + + "\264\315\342\377\346\346\346\377\043\043\043\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\162\162\162\377\377\377\377\377\377\377\377\377\377\377\377\377\330\345\360\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\240\300\333\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\146\146\146\377\000\000\000\377\000\000\000\377\000\000\000\377\006\006\006\377\047\047\047\377\146\146\146\377" + + "\324\324\324\377\377\377\377\377\366\366\366\377\320\320\320\377\227\227\227\377\136\136\136\377\047\047\047\377\004\004\004\377" + + "\000\000\000\377\003\003\003\377\300\300\300\377\377\377\377\377\377\377\377\377\377\377\377\377\242\301\333\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\236\277\332\377\377\377\377\377\377\377\377\377" + + "\373\373\373\377\045\045\045\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\134\134\134\377\377\377\377\377\352\352\352\377\217\217\217\377\265\265\265\377\351\351\351\377\375\375\375\377\347\347\347\377" + + "\262\262\262\377\275\275\275\377\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\377\153\235\307\377\072\175\265\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\241\301\334\377\377\377\377\377\377\377\377\377" + + "\333\333\333\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\203\203\203\377\377\377\377\377\137\137\137\377\000\000\000\377\000\000\000\377\013\013\013\377\067\067\067\377\166\166\166\377" + + "\267\267\267\377\360\360\360\377\377\377\377\377\377\377\377\377\377\377\377\377\360\365\371\377\113\210\273\377\075\177\266\377" + + "\071\174\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\262\314\342\377\377\377\377\377\377\377\377\377" + + "\232\232\232\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\305\305\305\377\367\367\367\377\035\035\035\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\007\007\007\377\074\074\074\377\337\337\337\377\377\377\377\377\373\374\375\377\374\375\376\377\363\367\372\377" + + "\314\335\353\377\236\276\332\377\162\241\311\377\114\211\273\377\072\175\265\377\311\334\353\377\377\377\377\377\377\377\377\377" + + "\126\126\126\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\017\017\017\377" + + "\371\371\371\377\321\321\321\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\216\216\216\377\377\377\377\377\371\371\371\377\204\204\204\377\160\160\160\377" + + "\260\260\260\377\352\352\352\377\377\377\377\377\371\373\374\377\334\350\362\377\366\371\374\377\377\377\377\377\377\377\377\377" + + "\025\025\025\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\116\116\116\377" + + "\377\377\377\377\221\221\221\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\273\273\273\377\377\377\377\377\236\236\236\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\004\004\004\377\057\057\057\377\160\160\160\377\260\260\260\377\346\346\346\377\376\376\376\377\377\377\377\377" + + "\071\071\071\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\220\220\220\377" + + "\377\377\377\377\115\115\115\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\020\020\020\377\360\360\360\377\377\377\377\377\132\132\132\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\011\011\011\377\062\062\062\377\261\261\261\377" + + "\366\366\366\377\241\241\241\377\065\065\065\377\002\002\002\377\000\000\000\377\000\000\000\377\002\002\002\377\321\321\321\377" + + "\365\365\365\377\023\023\023\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\105\105\105\377\376\376\376\377\370\370\370\377\035\035\035\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\053\053\053\377" + + "\377\377\377\377\377\377\377\377\374\374\374\377\276\276\276\377\120\120\120\377\005\005\005\377\045\045\045\377\371\371\371\377" + + "\302\302\302\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\206\206\206\377\377\377\377\377\322\322\322\377\001\001\001\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\103\103\103\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377\334\334\334\377\340\340\340\377\377\377\377\377" + + "\225\225\225\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\001\001\001\377\310\310\310\377\377\377\377\377\216\216\216\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\210\210\210\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\337\337\337\377\051\051\051\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\030\030\030\377\365\365\365\377\377\377\377\377\112\112\112\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\317\317\317\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\361\366\372\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\371\371\371\377\265\265\265\377\113\113\113\377\006\006\006\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\122\122\122\377\377\377\377\377\370\370\370\377\020\020\020\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\034\034\034\377\370\370\370\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\206\257\321\377\220\265\325\377\352\361\367\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\333\333\333\377\170\170\170\377\033\033\033\377\000\000\000\377" + + "\000\000\000\377\226\226\226\377\377\377\377\377\306\306\306\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\132\132\132\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\330\351\377\072\175\265\377\103\203\270\377" + + "\224\270\326\377\355\363\370\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\364\364\364\377\247\247\247\377" + + "\205\205\205\377\364\364\364\377\377\377\377\377\206\206\206\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\235\235\235\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\373\375\377\135\224\302\377\072\175\265\377" + + "\072\175\265\377\106\205\271\377\230\273\330\377\357\364\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\233\233\233\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\005\005\005\377\335\335\335\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\305\331\351\377\073\176\266\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\110\206\272\377\236\276\332\377\362\366\372\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\373\373\373\377\216\216\216\377\045\045\045\377\001\001\001\377\000\000\000\377" + + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\054\054\054\377\374\374\374\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\217\265\325\377" + + "\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\112\207\273\377\243\302\334\377\363\367\372\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\372\372\377\260\260\260\377\105\105\105\377" + + "\004\004\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\156\156\156\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\375\376\377" + + "\205\257\321\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\115\211\274\377" + + "\250\305\336\377\366\371\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\376\376\377" + + "\322\322\322\377\150\150\150\377\016\016\016\377\000\000\000\377\001\001\001\377\270\270\270\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\376\376\377\377\261\313\342\377\114\211\274\377\071\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377\072\175\265\377" + + "\072\175\265\377\115\211\274\377\277\324\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\354\354\354\377\223\223\223\377\233\233\233\377\375\375\375\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\363\367\372\377\265\316\343\377\201\254\320\377\145\231\305\377\141\227\304\377\154\236\310\377" + + "\217\265\325\377\305\331\351\377\367\372\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"; + + /** LWJGL Logo - 16 by 16 pixels */ + public static final ByteBuffer LWJGLIcon16x16 = loadIcon(LWJGL_ICON_DATA_16x16); + + /** LWJGL Logo - 32 by 32 pixels */ + public static final ByteBuffer LWJGLIcon32x32 = loadIcon(LWJGL_ICON_DATA_32x32); + + /** Debug flag. */ + public static final boolean DEBUG = getPrivilegedBoolean("org.lwjgl.util.Debug"); + + public static final boolean CHECKS = !getPrivilegedBoolean("org.lwjgl.util.NoChecks"); + + private static final int PLATFORM; + + static { + final String osName = getPrivilegedProperty("os.name"); + if ( osName.startsWith("Windows") ) + PLATFORM = PLATFORM_WINDOWS; + else if ( osName.startsWith("Linux") || osName.startsWith("FreeBSD") || osName.startsWith("SunOS") || osName.startsWith("Unix") ) + PLATFORM = PLATFORM_LINUX; + else if ( osName.startsWith("Mac OS X") || osName.startsWith("Darwin") ) + PLATFORM = PLATFORM_MACOSX; + else + throw new LinkageError("Unknown platform: " + osName); + } + + private static ByteBuffer loadIcon(String data) { + int len = data.length(); + ByteBuffer bb = BufferUtils.createByteBuffer(len); + for(int i=0 ; i<len ; i++) { + bb.put(i, (byte)data.charAt(i)); + } + return bb.asReadOnlyBuffer(); + } + + /** + * @see #PLATFORM_WINDOWS + * @see #PLATFORM_LINUX + * @see #PLATFORM_MACOSX + * @return the current platform type + */ + public static int getPlatform() { + return PLATFORM; + } + + + /** + * @see #PLATFORM_WINDOWS_NAME + * @see #PLATFORM_LINUX_NAME + * @see #PLATFORM_MACOSX_NAME + * @return current platform name + */ + public static String getPlatformName() { + switch (LWJGLUtil.getPlatform()) { + case LWJGLUtil.PLATFORM_LINUX: + return PLATFORM_LINUX_NAME; + case LWJGLUtil.PLATFORM_MACOSX: + return PLATFORM_MACOSX_NAME; + case LWJGLUtil.PLATFORM_WINDOWS: + return PLATFORM_WINDOWS_NAME; + default: + return "unknown"; + } + } + + /** + * Locates the paths required by a library. + * + * @param libname Local Library Name to search the classloader with ("openal"). + * @param platform_lib_name The native library name ("libopenal.so") + * @param classloader The classloader to ask for library paths + * @return Paths to located libraries, if any + */ + public static String[] getLibraryPaths(String libname, String platform_lib_name, ClassLoader classloader) { + return getLibraryPaths(libname, new String[]{platform_lib_name}, classloader); + } + + /** + * Locates the paths required by a library. + * + * @param libname Local Library Name to search the classloader with ("openal"). + * @param platform_lib_names The list of possible library names ("libopenal.so") + * @param classloader The classloader to ask for library paths + * @return Paths to located libraries, if any + */ + public static String[] getLibraryPaths(String libname, String[] platform_lib_names, ClassLoader classloader) { + // need to pass path of possible locations of library to native side + List<String> possible_paths = new ArrayList<String>(); + + String classloader_path = getPathFromClassLoader(libname, classloader); + if (classloader_path != null) { + log("getPathFromClassLoader: Path found: " + classloader_path); + possible_paths.add(classloader_path); + } + + for ( String platform_lib_name : platform_lib_names ) { + String lwjgl_classloader_path = getPathFromClassLoader("lwjgl", classloader); + if ( lwjgl_classloader_path != null ) { + log("getPathFromClassLoader: Path found: " + lwjgl_classloader_path); + possible_paths.add(lwjgl_classloader_path.substring(0, lwjgl_classloader_path.lastIndexOf(File.separator)) + + File.separator + platform_lib_name); + } + + // add Installer path + String alternative_path = getPrivilegedProperty("org.lwjgl.librarypath"); + if ( alternative_path != null ) { + possible_paths.add(alternative_path + File.separator + platform_lib_name); + } + + // Add all possible paths from java.library.path + String java_library_path = getPrivilegedProperty("java.library.path"); + + StringTokenizer st = new StringTokenizer(java_library_path, File.pathSeparator); + while ( st.hasMoreTokens() ) { + String path = st.nextToken(); + possible_paths.add(path + File.separator + platform_lib_name); + } + + //add current path + String current_dir = getPrivilegedProperty("user.dir"); + possible_paths.add(current_dir + File.separator + platform_lib_name); + + //add pure library (no path, let OS search) + possible_paths.add(platform_lib_name); + } + + //create needed string array + return possible_paths.toArray(new String[possible_paths.size()]); + } + + static void execPrivileged(final String[] cmd_array) throws Exception { + try { + Process process = AccessController.doPrivileged(new PrivilegedExceptionAction<Process>() { + public Process run() throws Exception { + return Runtime.getRuntime().exec(cmd_array); + } + }); + // Close unused streams to make sure the child process won't hang + process.getInputStream().close(); + process.getOutputStream().close(); + process.getErrorStream().close(); + } catch (PrivilegedActionException e) { + throw (Exception)e.getCause(); + } + } + + private static String getPrivilegedProperty(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction<String>() { + public String run() { + return System.getProperty(property_name); + } + }); + } + + /** + * Tries to locate named library from the current ClassLoader + * This method exists because native libraries are loaded from native code, and as such + * is exempt from ClassLoader library loading rutines. It therefore always fails. + * We therefore invoke the protected method of the ClassLoader to see if it can + * locate it. + * + * @param libname Name of library to search for + * @param classloader Classloader to use + * @return Absolute path to library if found, otherwise null + */ + private static String getPathFromClassLoader(final String libname, final ClassLoader classloader) { + Class<?> c = null; + + try { + log("getPathFromClassLoader: searching for: " + libname); + c = classloader.getClass(); + while (c != null) { + final Class<?> clazz = c; + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction<String>() { + public String run() throws Exception { + Method findLibrary = clazz.getDeclaredMethod("findLibrary", String.class); + findLibrary.setAccessible(true); + String path = (String)findLibrary.invoke(classloader, libname); + return path; + } + }); + } catch (PrivilegedActionException e) { + log("Failed to locate findLibrary method: " + e.getCause()); + c = c.getSuperclass(); + } + } + } catch (Exception e) { + log("Failure locating " + e + " using classloader:" + c); + } + return null; + } + + /** + * Gets a boolean property as a privileged action. + */ + public static boolean getPrivilegedBoolean(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + public Boolean run() { + return Boolean.getBoolean(property_name); + } + }); + } + + /** + * Gets an integer property as a privileged action. + * + * @param property_name the integer property name + * + * @return the property value + */ + public static Integer getPrivilegedInteger(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction<Integer>() { + public Integer run() { + return Integer.getInteger(property_name); + } + }); + } + + /** + * Gets an integer property as a privileged action. + * + * @param property_name the integer property name + * @param default_val the default value to use if the property is not defined + * + * @return the property value + */ + public static Integer getPrivilegedInteger(final String property_name, final int default_val) { + return AccessController.doPrivileged(new PrivilegedAction<Integer>() { + public Integer run() { + return Integer.getInteger(property_name, default_val); + } + }); + } + + /** + * Prints the given message to System.err if DEBUG is true. + * + * @param msg Message to print + */ + public static void log(CharSequence msg) { + if (DEBUG) { + System.err.println("[LWJGL] " + msg); + } + } + + /** + * Method to determine if the current system is running a version of + * Mac OS X better than the given version. This is only useful for Mac OS X + * specific code and will not work for any other platform. + */ + public static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) { + String os_version = getPrivilegedProperty("os.version"); + StringTokenizer version_tokenizer = new StringTokenizer(os_version, "."); + int major; + int minor; + try { + String major_str = version_tokenizer.nextToken(); + String minor_str = version_tokenizer.nextToken(); + major = Integer.parseInt(major_str); + minor = Integer.parseInt(minor_str); + } catch (Exception e) { + LWJGLUtil.log("Exception occurred while trying to determine OS version: " + e); + // Best guess, no + return false; + } + return major > major_required || (major == major_required && minor >= minor_required); + } + + /** + * Returns a map of public static final integer fields in the specified classes, to their String representations. + * An optional filter can be specified to only include specific fields. The target map may be null, in which + * case a new map is allocated and returned. + * <p> + * This method is useful when debugging to quickly identify values returned from the AL/GL/CL APIs. + * + * @param filter the filter to use (optional) + * @param target the target map (optional) + * @param tokenClasses an array of classes to get tokens from + * + * @return the token map + */ + + public static Map<Integer, String> getClassTokens(final TokenFilter filter, final Map<Integer, String> target, final Class ... tokenClasses) { + return getClassTokens(filter, target, Arrays.asList(tokenClasses)); + } + + /** + * Returns a map of public static final integer fields in the specified classes, to their String representations. + * An optional filter can be specified to only include specific fields. The target map may be null, in which + * case a new map is allocated and returned. + * <p> + * This method is useful when debugging to quickly identify values returned from the AL/GL/CL APIs. + * + * @param filter the filter to use (optional) + * @param target the target map (optional) + * @param tokenClasses the classes to get tokens from + * + * @return the token map + */ + public static Map<Integer, String> getClassTokens(final TokenFilter filter, Map<Integer, String> target, final Iterable<Class> tokenClasses) { + if ( target == null ) + target = new HashMap<Integer, String>(); + + final int TOKEN_MODIFIERS = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL; + + for ( final Class tokenClass : tokenClasses ) { + for ( final Field field : tokenClass.getDeclaredFields() ) { + // Get only <public static final int> fields. + if ( (field.getModifiers() & TOKEN_MODIFIERS) == TOKEN_MODIFIERS && field.getType() == int.class ) { + try { + final int value = field.getInt(null); + if ( filter != null && !filter.accept(field, value) ) + continue; + + if ( target.containsKey(value) ) // Print colliding tokens in their hex representation. + target.put(value, toHexString(value)); + else + target.put(value, field.getName()); + } catch (IllegalAccessException e) { + // Ignore + } + } + } + } + + return target; + } + + /** + * Returns a string representation of the integer argument as an + * unsigned integer in base&nbsp;16. The string will be uppercase + * and will have a leading '0x'. + * + * @param value the integer value + * + * @return the hex string representation + */ + public static String toHexString(final int value) { + return "0x" + Integer.toHexString(value).toUpperCase(); + } + + /** Simple interface for Field filtering. */ + public interface TokenFilter { + + /** + * Should return true if the specified Field passes the filter. + * + * @param field the Field to test + * @param value the integer value of the field + * + * @result true if the Field is accepted + */ + boolean accept(Field field, int value); + + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/LinuxSysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LinuxSysImplementation.java new file mode 100644 index 0000000..33ad031 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/LinuxSysImplementation.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.lang.UnsatisfiedLinkError; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxSysImplementation extends J2SESysImplementation { + private static final int JNI_VERSION = 19; + + static { + // Load libawt.so and libmawt.so, needed for libjawt.so + java.awt.Toolkit.getDefaultToolkit(); + + // manually load libjawt.so into vm, needed since Java 7 + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + try { + System.loadLibrary("jawt"); + } catch (UnsatisfiedLinkError e) { + // catch and ignore an already loaded in another classloader + // exception, as vm already has it loaded + } + return null; + } + }); + } + + public int getRequiredJNIVersion() { + return JNI_VERSION; + } + + public boolean openURL(final String url) { + // Linux may as well resort to pure Java hackery, as there's no Linux native way of doing it + // right anyway. + + String[] browsers = {"sensible-browser", "xdg-open", "google-chrome", "chromium", "firefox", "iceweasel", "mozilla", "opera", "konqueror", "nautilus", "galeon", "netscape"}; + + for ( final String browser : browsers ) { + try { + LWJGLUtil.execPrivileged(new String[] { browser, url }); + return true; + } catch (Exception e) { + // Ignore + e.printStackTrace(System.err); + } + } + + // Seems to have failed + return false; + } + + public boolean has64Bit() { + return true; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/MacOSXSysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MacOSXSysImplementation.java new file mode 100644 index 0000000..4ba8d55 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MacOSXSysImplementation.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import com.apple.eio.FileManager; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.lang.UnsatisfiedLinkError; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXSysImplementation extends J2SESysImplementation { + private static final int JNI_VERSION = 25; + + static { + // Manually start the AWT Application Loop + java.awt.Toolkit.getDefaultToolkit(); + } + + public int getRequiredJNIVersion() { + return JNI_VERSION; + } + + public boolean openURL(String url) { + try { + FileManager.openURL(url); + return true; + } catch (Exception e) { + LWJGLUtil.log("Exception occurred while trying to invoke browser: " + e); + return false; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtil.java new file mode 100644 index 0000000..6dda563 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtil.java @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.lang.reflect.Field; +import java.nio.*; +import java.nio.charset.*; + +/** + * [INTERNAL USE ONLY] + * <p/> + * This class provides utility methods for passing buffers to JNI API calls. + * + * @author Spasi + */ +public final class MemoryUtil { + + private static final Charset ascii; + private static final Charset utf8; + private static final Charset utf16; + + static { + ascii = Charset.forName("ISO-8859-1"); + utf8 = Charset.forName("UTF-8"); + utf16 = Charset.forName("UTF-16LE"); + } + + private static final Accessor memUtil; + + static { + Accessor util; + try { + // Depends on java.nio.Buffer#address and sun.misc.Unsafe + util = loadAccessor("org.lwjgl.MemoryUtilSun$AccessorUnsafe"); + } catch (Exception e0) { + try { + // Depends on java.nio.Buffer#address and sun.reflect.FieldAccessor + util = loadAccessor("org.lwjgl.MemoryUtilSun$AccessorReflectFast"); + } catch (Exception e1) { + try { + // Depends on java.nio.Buffer#address + util = new AccessorReflect(); + } catch (Exception e2) { + LWJGLUtil.log("Unsupported JVM detected, this will likely result in low performance. Please inform LWJGL developers."); + util = new AccessorJNI(); + } + } + } + + LWJGLUtil.log("MemoryUtil Accessor: " + util.getClass().getSimpleName()); + memUtil = util; + + /* + BENCHMARK RESULTS - Oracle Server VM: + + Unsafe: 4ns + ReflectFast: 8ns + Reflect: 10ns + JNI: 82ns + + BENCHMARK RESULTS - Oracle Client VM: + + Unsafe: 5ns + ReflectFast: 81ns + Reflect: 85ns + JNI: 87ns + + On non-Oracle VMs, Unsafe should be the fastest implementation as well. In the absence + of Unsafe, performance will depend on how reflection and JNI are implemented. For now + we'll go with what we see on the Oracle VM (that is, we'll prefer reflection over JNI). + */ + } + + private MemoryUtil() { + } + + /** + * Returns the memory address of the specified buffer. [INTERNAL USE ONLY] + * + * @param buffer the buffer + * + * @return the memory address + */ + public static long getAddress0(Buffer buffer) { return memUtil.getAddress(buffer); } + + public static long getAddress0Safe(Buffer buffer) { return buffer == null ? 0L : memUtil.getAddress(buffer); } + + public static long getAddress0(PointerBuffer buffer) { return memUtil.getAddress(buffer.getBuffer()); } + + public static long getAddress0Safe(PointerBuffer buffer) { return buffer == null ? 0L : memUtil.getAddress(buffer.getBuffer()); } + + // --- [ API utilities ] --- + + public static long getAddress(ByteBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(ByteBuffer buffer, int position) { return getAddress0(buffer) + position; } + + public static long getAddress(ShortBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(ShortBuffer buffer, int position) { return getAddress0(buffer) + (position << 1); } + + public static long getAddress(CharBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(CharBuffer buffer, int position) { return getAddress0(buffer) + (position << 1); } + + public static long getAddress(IntBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(IntBuffer buffer, int position) { return getAddress0(buffer) + (position << 2); } + + public static long getAddress(FloatBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(FloatBuffer buffer, int position) { return getAddress0(buffer) + (position << 2); } + + public static long getAddress(LongBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(LongBuffer buffer, int position) { return getAddress0(buffer) + (position << 3); } + + public static long getAddress(DoubleBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(DoubleBuffer buffer, int position) { return getAddress0(buffer) + (position << 3); } + + public static long getAddress(PointerBuffer buffer) { return getAddress(buffer, buffer.position()); } + + public static long getAddress(PointerBuffer buffer, int position) { return getAddress0(buffer) + (position * PointerBuffer.getPointerSize()); } + + // --- [ API utilities - Safe ] --- + + public static long getAddressSafe(ByteBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(ByteBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(ShortBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(ShortBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(CharBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(CharBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(IntBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(IntBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(FloatBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(FloatBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(LongBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(LongBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(DoubleBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(DoubleBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + public static long getAddressSafe(PointerBuffer buffer) { return buffer == null ? 0L : getAddress(buffer); } + + public static long getAddressSafe(PointerBuffer buffer, int position) { return buffer == null ? 0L : getAddress(buffer, position); } + + // --- [ String utilities ] --- + + /** + * Returns a ByteBuffer containing the specified text ASCII encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text or null + * + * @see String#getBytes() + */ + public static ByteBuffer encodeASCII(final CharSequence text) { + return encode(text, ascii); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-8 encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text or null + * + * @see String#getBytes() + */ + public static ByteBuffer encodeUTF8(final CharSequence text) { + return encode(text, utf8); + } + + /** + * Returns a ByteBuffer containing the specified text UTF-16LE encoded and null-terminated. + * If text is null, null is returned. + * + * @param text the text to encode + * + * @return the encoded text + */ + public static ByteBuffer encodeUTF16(final CharSequence text) { + return encode(text, utf16); + } + + /** + * Wraps the specified text in a null-terminated CharBuffer and encodes it using the specified Charset. + * + * @param text the text to encode + * @param charset the charset to use for encoding + * + * @return the encoded text + */ + private static ByteBuffer encode(final CharSequence text, final Charset charset) { + if ( text == null ) + return null; + + return encode(CharBuffer.wrap(new CharSequenceNT(text)), charset); + } + + /** + * A {@link CharsetEncoder#encode(java.nio.CharBuffer)} implementation that uses {@link BufferUtils#createByteBuffer(int)} + * instead of {@link ByteBuffer#allocate(int)}. + * + * @see CharsetEncoder#encode(java.nio.CharBuffer) + */ + private static ByteBuffer encode(final CharBuffer in, final Charset charset) { + final CharsetEncoder encoder = charset.newEncoder(); // encoders are not thread-safe, create a new one on every call + + int n = (int)(in.remaining() * encoder.averageBytesPerChar()); + ByteBuffer out = BufferUtils.createByteBuffer(n); + + if ( n == 0 && in.remaining() == 0 ) + return out; + + encoder.reset(); + while ( true ) { + CoderResult cr = in.hasRemaining() ? encoder.encode(in, out, true) : CoderResult.UNDERFLOW; + if ( cr.isUnderflow() ) + cr = encoder.flush(out); + + if ( cr.isUnderflow() ) + break; + + if ( cr.isOverflow() ) { + n = 2 * n + 1; // Ensure progress; n might be 0! + ByteBuffer o = BufferUtils.createByteBuffer(n); + out.flip(); + o.put(out); + out = o; + continue; + } + + try { + cr.throwException(); + } catch (CharacterCodingException e) { + throw new RuntimeException(e); + } + } + out.flip(); + return out; + } + + public static String decodeASCII(final ByteBuffer buffer) { + return decode(buffer, ascii); + } + + public static String decodeUTF8(final ByteBuffer buffer) { + return decode(buffer, utf8); + } + + public static String decodeUTF16(final ByteBuffer buffer) { + return decode(buffer, utf16); + } + + private static String decode(final ByteBuffer buffer, final Charset charset) { + if ( buffer == null ) + return null; + + return decodeImpl(buffer, charset); + } + + private static String decodeImpl(final ByteBuffer in, final Charset charset) { + final CharsetDecoder decoder = charset.newDecoder(); // decoders are not thread-safe, create a new one on every call + + int n = (int)(in.remaining() * decoder.averageCharsPerByte()); + CharBuffer out = BufferUtils.createCharBuffer(n); + + if ( (n == 0) && (in.remaining() == 0) ) + return ""; + + decoder.reset(); + for (; ; ) { + CoderResult cr = in.hasRemaining() ? decoder.decode(in, out, true) : CoderResult.UNDERFLOW; + if ( cr.isUnderflow() ) + cr = decoder.flush(out); + + if ( cr.isUnderflow() ) + break; + if ( cr.isOverflow() ) { + n = 2 * n + 1; // Ensure progress; n might be 0! + CharBuffer o = BufferUtils.createCharBuffer(n); + out.flip(); + o.put(out); + out = o; + continue; + } + try { + cr.throwException(); + } catch (CharacterCodingException e) { + throw new RuntimeException(e); + } + } + out.flip(); + return out.toString(); + } + + /** A null-terminated CharSequence. */ + private static class CharSequenceNT implements CharSequence { + + final CharSequence source; + + CharSequenceNT(CharSequence source) { + this.source = source; + } + + public int length() { + return source.length() + 1; + + } + + public char charAt(final int index) { + return index == source.length() ? '\0' : source.charAt(index); + + } + + public CharSequence subSequence(final int start, final int end) { + return new CharSequenceNT(source.subSequence(start, Math.min(end, source.length()))); + } + + } + + interface Accessor { + + long getAddress(Buffer buffer); + + } + + private static Accessor loadAccessor(final String className) throws Exception { + return (Accessor)Class.forName(className).newInstance(); + } + + /** Default implementation. */ + private static class AccessorJNI implements Accessor { + + public long getAddress(final Buffer buffer) { + return BufferUtils.getBufferAddress(buffer); + } + + } + + /** Implementation using reflection on ByteBuffer. */ + private static class AccessorReflect implements Accessor { + + private final Field address; + + AccessorReflect() { + try { + address = getAddressField(); + } catch (NoSuchFieldException e) { + throw new UnsupportedOperationException(e); + } + address.setAccessible(true); + } + + public long getAddress(final Buffer buffer) { + try { + return address.getLong(buffer); + } catch (IllegalAccessException e) { + // cannot happen + return 0L; + } + } + + } + + static Field getAddressField() throws NoSuchFieldException { + return getDeclaredFieldRecursive(ByteBuffer.class, "address"); + } + + private static Field getDeclaredFieldRecursive(final Class<?> root, final String fieldName) throws NoSuchFieldException { + Class<?> type = root; + + do { + try { + return type.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + type = type.getSuperclass(); + } + } while ( type != null ); + + throw new NoSuchFieldException(fieldName + " does not exist in " + root.getSimpleName() + " or any of its superclasses."); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtilSun.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtilSun.java new file mode 100644 index 0000000..3a1cd31 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/MemoryUtilSun.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.Buffer; + +import sun.misc.Unsafe; +import sun.reflect.FieldAccessor; + +/** + * MemoryUtil.Accessor implementations that depend on sun.misc. + * We use reflection to grab these, so that we can compile on JDKs + * that do not support sun.misc. + * + * @author Spasi + */ +final class MemoryUtilSun { + + private MemoryUtilSun() { + } + + /** Implementation using sun.misc.Unsafe. */ + private static class AccessorUnsafe implements MemoryUtil.Accessor { + + private final Unsafe unsafe; + private final long address; + + AccessorUnsafe() { + try { + unsafe = getUnsafeInstance(); + address = unsafe.objectFieldOffset(MemoryUtil.getAddressField()); + } catch (Exception e) { + throw new UnsupportedOperationException(e); + } + } + + public long getAddress(final Buffer buffer) { + return unsafe.getLong(buffer, address); + } + + private static Unsafe getUnsafeInstance() { + final Field[] fields = Unsafe.class.getDeclaredFields(); + + /* + Different runtimes use different names for the Unsafe singleton, + so we cannot use .getDeclaredField and we scan instead. For example: + + Oracle: theUnsafe + PERC : m_unsafe_instance + Android: THE_ONE + */ + for ( Field field : fields ) { + if ( !field.getType().equals(Unsafe.class) ) + continue; + + final int modifiers = field.getModifiers(); + if ( !(Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) ) + continue; + + field.setAccessible(true); + try { + return (Unsafe)field.get(null); + } catch (IllegalAccessException e) { + // ignore + } + break; + } + + throw new UnsupportedOperationException(); + } + + } + + /** Implementation using reflection on ByteBuffer, FieldAccessor is used directly. */ + private static class AccessorReflectFast implements MemoryUtil.Accessor { + + private final FieldAccessor addressAccessor; + + AccessorReflectFast() { + Field address; + try { + address = MemoryUtil.getAddressField(); + } catch (NoSuchFieldException e) { + throw new UnsupportedOperationException(e); + } + address.setAccessible(true); + + try { + Method m = Field.class.getDeclaredMethod("acquireFieldAccessor", boolean.class); + m.setAccessible(true); + addressAccessor = (FieldAccessor)m.invoke(address, true); + } catch (Exception e) { + throw new UnsupportedOperationException(e); + } + } + + public long getAddress(final Buffer buffer) { + return addressAccessor.getLong(buffer); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerBuffer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerBuffer.java new file mode 100644 index 0000000..2989114 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerBuffer.java @@ -0,0 +1,960 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.lang.reflect.Method; +import java.nio.*; + +/** + * This class is a container for architecture independent pointer data. + * The interface mirrors the NIO LongBuffer API for convenience. + * + * @author Spasi + */ +public class PointerBuffer implements Comparable { + + private static final boolean is64Bit; + + static { + // Use reflection so that we can compile this class for the Generator. + boolean is64 = false; + try { + Method m = Class.forName("org.lwjgl.Sys").getDeclaredMethod("is64Bit", (Class[])null); + is64 = (Boolean)m.invoke(null, (Object[])null); + } catch (Throwable t) { + // ignore + } finally { + is64Bit = is64; + } + } + + protected final ByteBuffer pointers; + + protected final Buffer view; + protected final IntBuffer view32; + protected final LongBuffer view64; + + /** + * Creates a new PointerBuffer with the specified capacity. + * + * @param capacity the PointerBuffer size, in number of pointers + */ + public PointerBuffer(final int capacity) { + this(BufferUtils.createByteBuffer(capacity * getPointerSize())); + } + + /** + * Creates a new PointerBuffer using the specified ByteBuffer as its pointer + * data source. This is useful for users that do their own memory management + * over a big ByteBuffer, instead of allocating many small ones. + * + * @param source the source buffer + */ + public PointerBuffer(final ByteBuffer source) { + if ( LWJGLUtil.CHECKS ) + checkSource(source); + + pointers = source.slice().order(source.order()); + + if ( is64Bit ) { + view32 = null; + view = view64 = pointers.asLongBuffer(); + } else { + view = view32 = pointers.asIntBuffer(); + view64 = null; + } + } + + private static void checkSource(final ByteBuffer source) { + if ( !source.isDirect() ) + throw new IllegalArgumentException("The source buffer is not direct."); + + final int alignment = is64Bit ? 8 : 4; + if ( (MemoryUtil.getAddress0(source) + source.position()) % alignment != 0 || source.remaining() % alignment != 0 ) + throw new IllegalArgumentException("The source buffer is not aligned to " + alignment + " bytes."); + } + + /** + * Returns the ByteBuffer that backs this PointerBuffer. + * + * @return the pointer ByteBuffer + */ + public ByteBuffer getBuffer() { + return pointers; + } + + /** Returns true if the underlying architecture is 64bit. */ + public static boolean is64Bit() { + return is64Bit; + } + + /** + * Returns the pointer size in bytes, based on the underlying architecture. + * + * @return The pointer size in bytes + */ + public static int getPointerSize() { + return is64Bit ? 8 : 4; + } + + /** + * Returns this buffer's capacity. </p> + * + * @return The capacity of this buffer + */ + public final int capacity() { + return view.capacity(); + } + + /** + * Returns this buffer's position. </p> + * + * @return The position of this buffer + */ + public final int position() { + return view.position(); + } + + /** + * Returns this buffer's position, in bytes. </p> + * + * @return The position of this buffer in bytes. + */ + public final int positionByte() { + return position() * getPointerSize(); + } + + /** + * Sets this buffer's position. If the mark is defined and larger than the + * new position then it is discarded. </p> + * + * @param newPosition The new position value; must be non-negative + * and no larger than the current limit + * + * @return This buffer + * + * @throws IllegalArgumentException If the preconditions on <tt>newPosition</tt> do not hold + */ + public final PointerBuffer position(int newPosition) { + view.position(newPosition); + return this; + } + + /** + * Returns this buffer's limit. </p> + * + * @return The limit of this buffer + */ + public final int limit() { + return view.limit(); + } + + /** + * Sets this buffer's limit. If the position is larger than the new limit + * then it is set to the new limit. If the mark is defined and larger than + * the new limit then it is discarded. </p> + * + * @param newLimit The new limit value; must be non-negative + * and no larger than this buffer's capacity + * + * @return This buffer + * + * @throws IllegalArgumentException If the preconditions on <tt>newLimit</tt> do not hold + */ + public final PointerBuffer limit(int newLimit) { + view.limit(newLimit); + return this; + } + + /** + * Sets this buffer's mark at its position. </p> + * + * @return This buffer + */ + public final PointerBuffer mark() { + view.mark(); + return this; + } + + /** + * Resets this buffer's position to the previously-marked position. + * <p/> + * <p> Invoking this method neither changes nor discards the mark's + * value. </p> + * + * @return This buffer + * + * @throws java.nio.InvalidMarkException If the mark has not been set + */ + public final PointerBuffer reset() { + view.reset(); + return this; + } + + /** + * Clears this buffer. The position is set to zero, the limit is set to + * the capacity, and the mark is discarded. + * <p/> + * <p> Invoke this method before using a sequence of channel-read or + * <i>put</i> operations to fill this buffer. For example: + * <p/> + * <blockquote><pre> + * buf.clear(); // Prepare buffer for reading + * in.read(buf); // Read data</pre></blockquote> + * <p/> + * <p> This method does not actually erase the data in the buffer, but it + * is named as if it did because it will most often be used in situations + * in which that might as well be the case. </p> + * + * @return This buffer + */ + public final PointerBuffer clear() { + view.clear(); + return this; + } + + /** + * Flips this buffer. The limit is set to the current position and then + * the position is set to zero. If the mark is defined then it is + * discarded. + * <p/> + * <p> After a sequence of channel-read or <i>put</i> operations, invoke + * this method to prepare for a sequence of channel-write or relative + * <i>get</i> operations. For example: + * <p/> + * <blockquote><pre> + * buf.put(magic); // Prepend header + * in.read(buf); // Read data into rest of buffer + * buf.flip(); // Flip buffer + * out.write(buf); // Write header + data to channel</pre></blockquote> + * <p/> + * <p> This method is often used in conjunction with the {@link + * java.nio.ByteBuffer#compact compact} method when transferring data from + * one place to another. </p> + * + * @return This buffer + */ + public final PointerBuffer flip() { + view.flip(); + return this; + } + + /** + * Rewinds this buffer. The position is set to zero and the mark is + * discarded. + * <p/> + * <p> Invoke this method before a sequence of channel-write or <i>get</i> + * operations, assuming that the limit has already been set + * appropriately. For example: + * <p/> + * <blockquote><pre> + * out.write(buf); // Write remaining data + * buf.rewind(); // Rewind buffer + * buf.get(array); // Copy data into array</pre></blockquote> + * + * @return This buffer + */ + public final PointerBuffer rewind() { + view.rewind(); + return this; + } + + /** + * Returns the number of elements between the current position and the + * limit. </p> + * + * @return The number of elements remaining in this buffer + */ + public final int remaining() { + return view.remaining(); + } + + /** + * Returns the number of bytes between the current position and the + * limit. </p> + * + * @return The number of bytes remaining in this buffer + */ + public final int remainingByte() { + return remaining() * getPointerSize(); + } + + /** + * Tells whether there are any elements between the current position and + * the limit. </p> + * + * @return <tt>true</tt> if, and only if, there is at least one element + * remaining in this buffer + */ + public final boolean hasRemaining() { + return view.hasRemaining(); + } + + /** + * Allocates a new pointer buffer. + * <p/> + * <p> The new buffer's position will be zero, its limit will be its + * capacity, and its mark will be undefined. </p> + * + * @param capacity The new buffer's capacity, in pointers + * + * @return The new pointer buffer + * + * @throws IllegalArgumentException If the <tt>capacity</tt> is a negative integer + */ + public static PointerBuffer allocateDirect(int capacity) { + return new PointerBuffer(capacity); + } + + /** + * This method is used in slice and duplicate instead of normal object construction, + * so that subclasses can return themselves. + * + * @param source + * + * @return A new PointerBuffer instance + */ + protected PointerBuffer newInstance(final ByteBuffer source) { + return new PointerBuffer(source); + } + + /** + * Creates a new pointer buffer whose content is a shared subsequence of + * this buffer's content. + * <p/> + * <p> The content of the new buffer will start at this buffer's current + * position. Changes to this buffer's content will be visible in the new + * buffer, and vice versa; the two buffers' position, limit, and mark + * values will be independent. + * <p/> + * <p> The new buffer's position will be zero, its capacity and its limit + * will be the number of longs remaining in this buffer, and its mark + * will be undefined. The new buffer will be direct if, and only if, this + * buffer is direct, and it will be read-only if, and only if, this buffer + * is read-only. </p> + * + * @return The new pointer buffer + */ + public PointerBuffer slice() { + final int pointerSize = getPointerSize(); + + pointers.position(view.position() * pointerSize); + pointers.limit(view.limit() * pointerSize); + + try { + // We're slicing in the constructor. + return newInstance(pointers); + } finally { + pointers.clear(); + } + } + + /** + * Creates a new pointer buffer that shares this buffer's content. + * <p/> + * <p> The content of the new buffer will be that of this buffer. Changes + * to this buffer's content will be visible in the new buffer, and vice + * versa; the two buffers' position, limit, and mark values will be + * independent. + * <p/> + * <p> The new buffer's capacity, limit and position will be + * identical to those of this buffer. The new buffer will be direct if, + * and only if, this buffer is direct, and it will be read-only if, and + * only if, this buffer is read-only. </p> + * + * @return The new pointer buffer + */ + public PointerBuffer duplicate() { + final PointerBuffer buffer = newInstance(pointers); + + buffer.position(view.position()); + buffer.limit(view.limit()); + + return buffer; + } + + /** + * Creates a new, read-only pointer buffer that shares this buffer's + * content. + * <p/> + * <p> The content of the new buffer will be that of this buffer. Changes + * to this buffer's content will be visible in the new buffer; the new + * buffer itself, however, will be read-only and will not allow the shared + * content to be modified. The two buffers' position, limit, and mark + * values will be independent. + * <p/> + * <p> The new buffer's capacity, limit and position will be + * identical to those of this buffer. + * <p/> + * <p> If this buffer is itself read-only then this method behaves in + * exactly the same way as the {@link #duplicate duplicate} method. </p> + * + * @return The new, read-only pointer buffer + */ + public PointerBuffer asReadOnlyBuffer() { + final PointerBuffer buffer = new PointerBufferR(pointers); + + buffer.position(view.position()); + buffer.limit(view.limit()); + + return buffer; + } + + public boolean isReadOnly() { + return false; + } + + /** + * Relative <i>get</i> method. Reads the long at this buffer's + * current position, and then increments the position. </p> + * + * @return The long at the buffer's current position + * + * @throws BufferUnderflowException If the buffer's current position is not smaller than its limit + */ + public long get() { + if ( is64Bit ) + return view64.get(); + else + return view32.get() & 0x00000000FFFFFFFFL; + } + + /** + * Relative <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> Writes the given long into this buffer at the current + * position, and then increments the position. </p> + * + * @param l The long to be written + * + * @return This buffer + * + * @throws BufferOverflowException If this buffer's current position is not smaller than its limit + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public PointerBuffer put(long l) { + if ( is64Bit ) + view64.put(l); + else + view32.put((int)l); + return this; + } + + /** + * Convenience put that accepts PointerWrapper objects. + * + * @see #put(long) + */ + public PointerBuffer put(final PointerWrapper pointer) { + return put(pointer.getPointer()); + } + + /** + * Convenience put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param l the long value to be written + */ + public static void put(final ByteBuffer target, long l) { + if ( is64Bit ) + target.putLong(l); + else + target.putInt((int)l); + } + + /** + * Absolute <i>get</i> method. Reads the long at the given + * index. </p> + * + * @param index The index from which the long will be read + * + * @return The long at the given index + * + * @throws IndexOutOfBoundsException If <tt>index</tt> is negative + * or not smaller than the buffer's limit + */ + public long get(int index) { + if ( is64Bit ) + return view64.get(index); + else + return view32.get(index) & 0x00000000FFFFFFFFL; + } + + /** + * Absolute <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> Writes the given long into this buffer at the given + * index. </p> + * + * @param index The index at which the long will be written + * @param l The long value to be written + * + * @return This buffer + * + * @throws IndexOutOfBoundsException If <tt>index</tt> is negative + * or not smaller than the buffer's limit + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public PointerBuffer put(int index, long l) { + if ( is64Bit ) + view64.put(index, l); + else + view32.put(index, (int)l); + return this; + } + + /** + * Convenience put that accepts PointerWrapper objects. + * + * @see #put(int, long) + */ + public PointerBuffer put(int index, PointerWrapper pointer) { + return put(index, pointer.getPointer()); + } + + /** + * Convenience put on a target ByteBuffer. + * + * @param target the target ByteBuffer + * @param index the index at which the long will be written + * @param l the long value to be written + */ + public static void put(final ByteBuffer target, int index, long l) { + if ( is64Bit ) + target.putLong(index, l); + else + target.putInt(index, (int)l); + } + + // -- Bulk get operations -- + + /** + * Relative bulk <i>get</i> method. + * <p/> + * <p> This method transfers longs from this buffer into the given + * destination array. If there are fewer longs remaining in the + * buffer than are required to satisfy the request, that is, if + * <tt>length</tt>&nbsp;<tt>&gt;</tt>&nbsp;<tt>remaining()</tt>, then no + * longs are transferred and a {@link BufferUnderflowException} is + * thrown. + * <p/> + * <p> Otherwise, this method copies <tt>length</tt> longs from this + * buffer into the given array, starting at the current position of this + * buffer and at the given offset in the array. The position of this + * buffer is then incremented by <tt>length</tt>. + * <p/> + * <p> In other words, an invocation of this method of the form + * <tt>src.get(dst,&nbsp;off,&nbsp;len)</tt> has exactly the same effect as + * the loop + * <p/> + * <pre> + * for (int i = off; i < off + len; i++) + * dst[i] = src.get(); </pre> + * <p/> + * except that it first checks that there are sufficient longs in + * this buffer and it is potentially much more efficient. </p> + * + * @param dst The array into which longs are to be written + * @param offset The offset within the array of the first long to be + * written; must be non-negative and no larger than + * <tt>dst.length</tt> + * @param length The maximum number of longs to be written to the given + * array; must be non-negative and no larger than + * <tt>dst.length - offset</tt> + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than <tt>length</tt> longs + * remaining in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the <tt>offset</tt> and <tt>length</tt> + * parameters do not hold + */ + public PointerBuffer get(long[] dst, int offset, int length) { + if ( is64Bit ) + view64.get(dst, offset, length); + else { + checkBounds(offset, length, dst.length); + if ( length > view32.remaining() ) + throw new BufferUnderflowException(); + int end = offset + length; + for ( int i = offset; i < end; i++ ) + dst[i] = view32.get() & 0x00000000FFFFFFFFL; + } + + return this; + } + + /** + * Relative bulk <i>get</i> method. + * <p/> + * <p> This method transfers longs from this buffer into the given + * destination array. An invocation of this method of the form + * <tt>src.get(a)</tt> behaves in exactly the same way as the invocation + * <p/> + * <pre> + * src.get(a, 0, a.length) </pre> + * + * @return This buffer + * + * @throws BufferUnderflowException If there are fewer than <tt>length</tt> longs + * remaining in this buffer + */ + public PointerBuffer get(long[] dst) { + return get(dst, 0, dst.length); + } + + /** + * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> This method transfers the longs remaining in the given source + * buffer into this buffer. If there are more longs remaining in the + * source buffer than in this buffer, that is, if + * <tt>src.remaining()</tt>&nbsp;<tt>&gt;</tt>&nbsp;<tt>remaining()</tt>, + * then no longs are transferred and a {@link + * BufferOverflowException} is thrown. + * <p/> + * <p> Otherwise, this method copies + * <i>n</i>&nbsp;=&nbsp;<tt>src.remaining()</tt> longs from the given + * buffer into this buffer, starting at each buffer's current position. + * The positions of both buffers are then incremented by <i>n</i>. + * <p/> + * <p> In other words, an invocation of this method of the form + * <tt>dst.put(src)</tt> has exactly the same effect as the loop + * <p/> + * <pre> + * while (src.hasRemaining()) + * dst.put(src.get()); </pre> + * <p/> + * except that it first checks that there is sufficient space in this + * buffer and it is potentially much more efficient. </p> + * + * @param src The source buffer from which longs are to be read; + * must not be this buffer + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + * for the remaining longs in the source buffer + * @throws IllegalArgumentException If the source buffer is this buffer + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public PointerBuffer put(PointerBuffer src) { + if ( is64Bit ) + view64.put(src.view64); + else + view32.put(src.view32); + return this; + } + + /** + * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> This method transfers longs into this buffer from the given + * source array. If there are more longs to be copied from the array + * than remain in this buffer, that is, if + * <tt>length</tt>&nbsp;<tt>&gt;</tt>&nbsp;<tt>remaining()</tt>, then no + * longs are transferred and a {@link BufferOverflowException} is + * thrown. + * <p/> + * <p> Otherwise, this method copies <tt>length</tt> longs from the + * given array into this buffer, starting at the given offset in the array + * and at the current position of this buffer. The position of this buffer + * is then incremented by <tt>length</tt>. + * <p/> + * <p> In other words, an invocation of this method of the form + * <tt>dst.put(src,&nbsp;off,&nbsp;len)</tt> has exactly the same effect as + * the loop + * <p/> + * <pre> + * for (int i = off; i < off + len; i++) + * dst.put(a[i]); </pre> + * <p/> + * except that it first checks that there is sufficient space in this + * buffer and it is potentially much more efficient. </p> + * + * @param src The array from which longs are to be read + * @param offset The offset within the array of the first long to be read; + * must be non-negative and no larger than <tt>array.length</tt> + * @param length The number of longs to be read from the given array; + * must be non-negative and no larger than + * <tt>array.length - offset</tt> + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + * @throws IndexOutOfBoundsException If the preconditions on the <tt>offset</tt> and <tt>length</tt> + * parameters do not hold + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public PointerBuffer put(long[] src, int offset, int length) { + if ( is64Bit ) + view64.put(src, offset, length); + else { + checkBounds(offset, length, src.length); + if ( length > view32.remaining() ) + throw new BufferOverflowException(); + int end = offset + length; + for ( int i = offset; i < end; i++ ) + view32.put((int)src[i]); + } + + return this; + } + + /** + * Relative bulk <i>put</i> method&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> This method transfers the entire content of the given source + * long array into this buffer. An invocation of this method of the + * form <tt>dst.put(a)</tt> behaves in exactly the same way as the + * invocation + * <p/> + * <pre> + * dst.put(a, 0, a.length) </pre> + * + * @return This buffer + * + * @throws BufferOverflowException If there is insufficient space in this buffer + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public final PointerBuffer put(long[] src) { + return put(src, 0, src.length); + } + + /** + * Compacts this buffer&nbsp;&nbsp;<i>(optional operation)</i>. + * <p/> + * <p> The longs between the buffer's current position and its limit, + * if any, are copied to the beginning of the buffer. That is, the + * long at index <i>p</i>&nbsp;=&nbsp;<tt>position()</tt> is copied + * to index zero, the long at index <i>p</i>&nbsp;+&nbsp;1 is copied + * to index one, and so forth until the long at index + * <tt>limit()</tt>&nbsp;-&nbsp;1 is copied to index + * <i>n</i>&nbsp;=&nbsp;<tt>limit()</tt>&nbsp;-&nbsp;<tt>1</tt>&nbsp;-&nbsp;<i>p</i>. + * The buffer's position is then set to <i>n+1</i> and its limit is set to + * its capacity. The mark, if defined, is discarded. + * <p/> + * <p> The buffer's position is set to the number of longs copied, + * rather than to zero, so that an invocation of this method can be + * followed immediately by an invocation of another relative <i>put</i> + * method. </p> + * + * @return This buffer + * + * @throws ReadOnlyBufferException If this buffer is read-only + */ + public PointerBuffer compact() { + if ( is64Bit ) + view64.compact(); + else + view32.compact(); + return this; + } + + /** + * Retrieves this buffer's byte order. + * <p/> + * <p> The byte order of a pointer buffer created by allocation or by + * wrapping an existing <tt>long</tt> array is the {@link + * ByteOrder#nativeOrder </code>native order<code>} of the underlying + * hardware. The byte order of a pointer buffer created as a <a + * href="ByteBuffer.html#views">view</a> of a byte buffer is that of the + * byte buffer at the moment that the view is created. </p> + * + * @return This buffer's byte order + */ + public ByteOrder order() { + if ( is64Bit ) + return view64.order(); + else + return view32.order(); + } + + /** + * Returns a string summarizing the state of this buffer. </p> + * + * @return A summary string + */ + public String toString() { + StringBuilder sb = new StringBuilder(48); + sb.append(getClass().getName()); + sb.append("[pos="); + sb.append(position()); + sb.append(" lim="); + sb.append(limit()); + sb.append(" cap="); + sb.append(capacity()); + sb.append("]"); + return sb.toString(); + } + + /** + * Returns the current hash code of this buffer. + * <p/> + * <p> The hash code of a pointer buffer depends only upon its remaining + * elements; that is, upon the elements from <tt>position()</tt> up to, and + * including, the element at <tt>limit()</tt>&nbsp;-&nbsp;<tt>1</tt>. + * <p/> + * <p> Because buffer hash codes are content-dependent, it is inadvisable + * to use buffers as keys in hash maps or similar data structures unless it + * is known that their contents will not change. </p> + * + * @return The current hash code of this buffer + */ + public int hashCode() { + int h = 1; + int p = position(); + for ( int i = limit() - 1; i >= p; i-- ) + h = 31 * h + (int)get(i); + return h; + } + + /** + * Tells whether or not this buffer is equal to another object. + * <p/> + * <p> Two pointer buffers are equal if, and only if, + * <p/> + * <p><ol> + * <p/> + * <li><p> They have the same element type, </p></li> + * <p/> + * <li><p> They have the same number of remaining elements, and + * </p></li> + * <p/> + * <li><p> The two sequences of remaining elements, considered + * independently of their starting positions, are pointwise equal. + * </p></li> + * <p/> + * </ol> + * <p/> + * <p> A pointer buffer is not equal to any other type of object. </p> + * + * @param ob The object to which this buffer is to be compared + * + * @return <tt>true</tt> if, and only if, this buffer is equal to the + * given object + */ + public boolean equals(Object ob) { + if ( !(ob instanceof PointerBuffer) ) + return false; + PointerBuffer that = (PointerBuffer)ob; + if ( this.remaining() != that.remaining() ) + return false; + int p = this.position(); + for ( int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j-- ) { + long v1 = this.get(i); + long v2 = that.get(j); + if ( v1 != v2 ) { + return false; + } + } + return true; + } + + /** + * Compares this buffer to another. + * <p/> + * <p> Two pointer buffers are compared by comparing their sequences of + * remaining elements lexicographically, without regard to the starting + * position of each sequence within its corresponding buffer. + * <p/> + * <p> A pointer buffer is not comparable to any other type of object. + * + * @return A negative integer, zero, or a positive integer as this buffer + * is less than, equal to, or greater than the given buffer + */ + public int compareTo(Object o) { + final PointerBuffer that = (PointerBuffer)o; + int n = this.position() + Math.min(this.remaining(), that.remaining()); + for ( int i = this.position(), j = that.position(); i < n; i++, j++ ) { + long v1 = this.get(i); + long v2 = that.get(j); + if ( v1 == v2 ) + continue; + if ( v1 < v2 ) + return -1; + return +1; + } + return this.remaining() - that.remaining(); + } + + private static void checkBounds(int off, int len, int size) { + if ( (off | len | (off + len) | (size - (off + len))) < 0 ) + throw new IndexOutOfBoundsException(); + } + + /** + * Read-only version of PointerBuffer. + * + * @author Spasi + */ + private static final class PointerBufferR extends PointerBuffer { + + PointerBufferR(final ByteBuffer source) { + super(source); + } + + public boolean isReadOnly() { + return true; + } + + protected PointerBuffer newInstance(final ByteBuffer source) { + return new PointerBufferR(source); + } + + public PointerBuffer asReadOnlyBuffer() { + return duplicate(); + } + + public PointerBuffer put(final long l) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final int index, final long l) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final PointerBuffer src) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer put(final long[] src, final int offset, final int length) { + throw new ReadOnlyBufferException(); + } + + public PointerBuffer compact() { + throw new ReadOnlyBufferException(); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapper.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapper.java new file mode 100644 index 0000000..26b7f19 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +/** + * A common interface for classes that wrap pointer addresses. + * + * @author Spasi + */ +public interface PointerWrapper { + + long getPointer(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapperAbstract.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapperAbstract.java new file mode 100644 index 0000000..5a0591d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/PointerWrapperAbstract.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +/** + * Base PointerWrapper implementation. + * + * @author Spasi + */ +public abstract class PointerWrapperAbstract implements PointerWrapper { + + protected final long pointer; + + protected PointerWrapperAbstract(final long pointer) { + this.pointer = pointer; + } + + /** + * Returns true if this object represents a valid pointer. + * The pointer might be invalid because it is NULL or because + * some other action has deleted the object that this pointer + * represents. + * + * @return true if the pointer is valid + */ + public boolean isValid() { + return pointer != 0; + } + + /** + * Checks if the pointer is valid and throws an IllegalStateException if + * it is not. This method is a NO-OP, unless the org.lwjgl.util.Debug + * property has been set to true. + */ + public final void checkValid() { + if ( LWJGLUtil.DEBUG && !isValid() ) + throw new IllegalStateException("This " + getClass().getSimpleName() + " pointer is not valid."); + } + + public final long getPointer() { + checkValid(); + return pointer; + } + + public boolean equals(final Object o) { + if ( this == o ) return true; + if ( !(o instanceof PointerWrapperAbstract) ) return false; + + final PointerWrapperAbstract that = (PointerWrapperAbstract)o; + + if ( pointer != that.pointer ) return false; + + return true; + } + + public int hashCode() { + return (int)(pointer ^ (pointer >>> 32)); + } + + public String toString() { + return getClass().getSimpleName() + " pointer (0x" + Long.toHexString(pointer).toUpperCase() + ")"; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/Sys.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/Sys.java new file mode 100644 index 0000000..6e6b09a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/Sys.java @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.io.File; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; + +import org.lwjgl.input.Mouse; + +/** + * <p> + * System class (named Sys so as not to conflict with java.lang.System) + * </p> + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class Sys { + /** The native library name */ + private static final String JNI_LIBRARY_NAME = "lwjgl"; + + /** Current version of library */ + private static final String VERSION = "2.9.1"; + + private static final String POSTFIX64BIT = "64"; + + /** The implementation instance to delegate platform specific behavior to */ + private static final SysImplementation implementation; + private static final boolean is64Bit; + + private static void doLoadLibrary(final String lib_name) { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + String library_path = System.getProperty("org.lwjgl.librarypath"); + if (library_path != null) { + System.load(library_path + File.separator + + System.mapLibraryName(lib_name)); + } else { + System.loadLibrary(lib_name); + } + return null; + } + }); + } + + private static void loadLibrary(final String lib_name) { + // actively try to load 64bit libs on 64bit architectures first + String osArch = System.getProperty("os.arch"); + boolean is64bit = "amd64".equals(osArch) || "x86_64".equals(osArch); + if(is64bit) { + try { + doLoadLibrary(lib_name + POSTFIX64BIT); + return; + } catch (UnsatisfiedLinkError e) { + LWJGLUtil.log("Failed to load 64 bit library: " + e.getMessage()); + } + } + + // fallback to loading the "old way" + try { + doLoadLibrary(lib_name); + } catch (UnsatisfiedLinkError e) { + if (implementation.has64Bit()) { + try { + doLoadLibrary(lib_name + POSTFIX64BIT); + return; + } catch (UnsatisfiedLinkError e2) { + LWJGLUtil.log("Failed to load 64 bit library: " + e2.getMessage()); + } + } + // Throw original error + throw e; + } + } + + static { + implementation = createImplementation(); + loadLibrary(JNI_LIBRARY_NAME); + is64Bit = implementation.getPointerSize() == 8; + + int native_jni_version = implementation.getJNIVersion(); + int required_version = implementation.getRequiredJNIVersion(); + if (native_jni_version != required_version) + throw new LinkageError("Version mismatch: jar version is '" + required_version + + "', native library version is '" + native_jni_version + "'"); + implementation.setDebug(LWJGLUtil.DEBUG); + } + + private static SysImplementation createImplementation() { + switch (LWJGLUtil.getPlatform()) { + case LWJGLUtil.PLATFORM_LINUX: + return new LinuxSysImplementation(); + case LWJGLUtil.PLATFORM_WINDOWS: + return new WindowsSysImplementation(); + case LWJGLUtil.PLATFORM_MACOSX: + return new MacOSXSysImplementation(); + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + /** + * No constructor for Sys. + */ + private Sys() { + } + + /** + * Return the version of the core LWJGL libraries as a String. + */ + public static String getVersion() { + return VERSION; + } + + /** + * Initialization. This is just a dummy method to trigger the static constructor. + */ + public static void initialize() { + } + + /** Returns true if a 64bit implementation was loaded. */ + public static boolean is64Bit() { + return is64Bit; + } + + /** + * Obtains the number of ticks that the hires timer does in a second. This method is fast; + * it should be called as frequently as possible, as it recalibrates the timer. + * + * @return timer resolution in ticks per second or 0 if no timer is present. + */ + public static long getTimerResolution() { + return implementation.getTimerResolution(); + } + + /** + * Gets the current value of the hires timer, in ticks. When the Sys class is first loaded + * the hires timer is reset to 0. If no hires timer is present then this method will always + * return 0.<p><strong>NOTEZ BIEN</strong> that the hires timer WILL wrap around. + * + * @return the current hires time, in ticks (always >= 0) + */ + public static long getTime() { + return implementation.getTime() & 0x7FFFFFFFFFFFFFFFL; + } + + /** + * Attempt to display a modal alert to the user. This method should be used + * when a game fails to initialize properly or crashes out losing its display + * in the process. It is provided because AWT may not be available on the target + * platform, although on Mac and Linux and other platforms supporting AWT we + * delegate the task to AWT instead of doing it ourselves. + * <p> + * The alert should display the title and the message and then the current + * thread should block until the user dismisses the alert - typically with an + * OK button click. + * <p> + * It may be that the user's system has no windowing system installed for some + * reason, in which case this method may do nothing at all, or attempt to provide + * some console output. + * + * @param title The title of the alert. We suggest using the title of your game. + * @param message The message text for the alert. + */ + public static void alert(String title, String message) { + boolean grabbed = Mouse.isGrabbed(); + if (grabbed) { + Mouse.setGrabbed(false); + } + if (title == null) + title = ""; + if (message == null) + message = ""; + implementation.alert(title, message); + if (grabbed) { + Mouse.setGrabbed(true); + } + } + + /** + * Open the system web browser and point it at the specified URL. It is recommended + * that this not be called whilst your game is running, but on application exit in + * a shutdown hook, as the screen resolution will not be reset when the browser is + * brought into view. + * <p> + * There is no guarantee that this will work, nor that we can detect if it has + * failed - hence we don't return success code or throw an Exception. This is just a + * best attempt at opening the URL given - don't rely on it to work! + * <p> + * @param url The URL. Ensure that the URL is properly encoded. + * @return false if we are CERTAIN the call has failed + */ + public static boolean openURL(String url) { + // Attempt to use Webstart if we have it available + try { + // Lookup the javax.jnlp.BasicService object + final Class<?> serviceManagerClass = Class.forName("javax.jnlp.ServiceManager"); + Method lookupMethod = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() { + public Method run() throws Exception { + return serviceManagerClass.getMethod("lookup", String.class); + } + }); + Object basicService = lookupMethod.invoke(serviceManagerClass, new Object[] {"javax.jnlp.BasicService"}); + final Class<?> basicServiceClass = Class.forName("javax.jnlp.BasicService"); + Method showDocumentMethod = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() { + public Method run() throws Exception { + return basicServiceClass.getMethod("showDocument", URL.class); + } + }); + try { + Boolean ret = (Boolean)showDocumentMethod.invoke(basicService, new URL(url)); + return ret; + } catch (MalformedURLException e) { + e.printStackTrace(System.err); + return false; + } + } catch (Exception ue) { + return implementation.openURL(url); + } + } + + /** + * Get the contents of the system clipboard. The system might not have a + * clipboard (particularly if it doesn't even have a keyboard) in which case + * we return null. Otherwise we return a String, which may be the empty + * string "". + * + * @return a String, or null if there is no system clipboard. + */ + public static String getClipboard() { + return implementation.getClipboard(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/SysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/SysImplementation.java new file mode 100644 index 0000000..3526675 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/SysImplementation.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +/** + * + * System class platform specific method interface + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +interface SysImplementation { + /** + * Return the required version of the native library + */ + int getRequiredJNIVersion(); + + /** + * Return the version of the native library + */ + int getJNIVersion(); + + /** + * Returns the platform's pointer size in bytes + */ + int getPointerSize(); + + void setDebug(boolean debug); + + /** + * Obtains the number of ticks that the hires timer does in a second. + * + * @return timer resolution in ticks per second or 0 if no timer is present. + */ + long getTimerResolution(); + + long getTime(); + + void alert(String title, String message); + + boolean openURL(String url); + + String getClipboard(); + + /** + * Returns true there exists a separate 64 bit library + * on the platform + */ + boolean has64Bit(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/WindowsSysImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/WindowsSysImplementation.java new file mode 100644 index 0000000..b8ca9f3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/WindowsSysImplementation.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl; + +import java.nio.ByteBuffer; +import java.security.PrivilegedExceptionAction; +import java.security.PrivilegedActionException; +import java.security.AccessController; +import java.lang.reflect.Method; + +import org.lwjgl.opengl.Display; + +/** + * <p> + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +final class WindowsSysImplementation extends DefaultSysImplementation { + private static final int JNI_VERSION = 24; + + static { + Sys.initialize(); + } + + public int getRequiredJNIVersion() { + return JNI_VERSION; + } + + public long getTimerResolution() { + return 1000; + } + + public long getTime() { + return nGetTime(); + } + private static native long nGetTime(); + + public boolean has64Bit() { + return true; + } + + private static long getHwnd() { + if (!Display.isCreated()) + return 0; + /* Use reflection since we can't make Display.getImplementation + * public + */ + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction<Long>() { + public Long run() throws Exception { + Method getImplementation_method = Display.class.getDeclaredMethod("getImplementation"); + getImplementation_method.setAccessible(true); + Object display_impl = getImplementation_method.invoke(null); + Class<?> WindowsDisplay_class = Class.forName("org.lwjgl.opengl.WindowsDisplay"); + Method getHwnd_method = WindowsDisplay_class.getDeclaredMethod("getHwnd"); + getHwnd_method.setAccessible(true); + return (Long)getHwnd_method.invoke(display_impl); + } + }); + } catch (PrivilegedActionException e) { + throw new Error(e); + } + } + + public void alert(String title, String message) { + if(!Display.isCreated()) { + initCommonControls(); + } + + LWJGLUtil.log(String.format("*** Alert *** %s\n%s\n", title, message)); + + final ByteBuffer titleText = MemoryUtil.encodeUTF16(title); + final ByteBuffer messageText = MemoryUtil.encodeUTF16(message); + nAlert(getHwnd(), MemoryUtil.getAddress(titleText), MemoryUtil.getAddress(messageText)); + } + private static native void nAlert(long parent_hwnd, long title, long message); + private static native void initCommonControls(); + + public boolean openURL(final String url) { + try { + LWJGLUtil.execPrivileged(new String[]{"rundll32", "url.dll,FileProtocolHandler", url}); + return true; + } catch (Exception e) { + LWJGLUtil.log("Failed to open url (" + url + "): " + e.getMessage()); + return false; + } + } + + public String getClipboard() { + return nGetClipboard(); + } + private static native String nGetClipboard(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/Game.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/Game.java new file mode 100644 index 0000000..1840699 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/Game.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples; + +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.openal.AL; +import org.lwjgl.opengl.Display; + +import static org.lwjgl.opengl.GL11.*; + +/** + * + * This is a <em>very basic</em> skeleton to init a game and run it. + * + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public class Game { + + /** Game title */ + public static final String GAME_TITLE = "My Game"; + + /** Desired frame time */ + private static final int FRAMERATE = 60; + + /** Exit the game */ + private static boolean finished; + + /** A rotating square! */ + private static float angle; + + /** + * No constructor needed - this class is static + */ + private Game() {} + + /** + * Application init + * @param args Commandline args + */ + public static void main(String[] args) { + try { + init(); + run(); + } catch (Exception e) { + e.printStackTrace(System.err); + Sys.alert(GAME_TITLE, "An error occured and the game will exit."); + } finally { + cleanup(); + } + + System.exit(0); + } + + /** + * Initialise the game + * @throws Exception if init fails + */ + private static void init() throws Exception { + // Create a fullscreen window with 1:1 orthographic 2D projection, and with + // mouse, keyboard, and gamepad inputs. + Display.setTitle(GAME_TITLE); + Display.setFullscreen(true); + + // Enable vsync if we can + Display.setVSyncEnabled(true); + + Display.create(); + + // Start up the sound system + AL.create(); + + // TODO: Load in your textures etc here + + // Put the window into orthographic projection mode with 1:1 pixel ratio. + // We haven't used GLU here to do this to avoid an unnecessary dependency. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, Display.getDisplayMode().getWidth(), 0.0, Display.getDisplayMode().getHeight(), -1.0, 1.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + } + + /** + * Runs the game (the "main loop") + */ + private static void run() { + while (!finished) { + // Always call Window.update(), all the time + Display.update(); + + if (Display.isCloseRequested()) { + // Check for O/S close requests + finished = true; + } else if (Display.isActive()) { + // The window is in the foreground, so we should play the game + logic(); + render(); + Display.sync(FRAMERATE); + } else { + // The window is not in the foreground, so we can allow other stuff to run and + // infrequently update + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + logic(); + if (Display.isVisible() || Display.isDirty()) { + // Only bother rendering if the window is visible or dirty + render(); + } + } + } + } + + /** + * Do any game-specific cleanup + */ + private static void cleanup() { + // TODO: save anything you want to disk here + + // Stop the sound + AL.destroy(); + + // Close the window + Display.destroy(); + } + + /** + * Do all calculations, handle input, etc. + */ + private static void logic() { + // Example input handler: we'll check for the ESC key and finish the game instantly when it's pressed + if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { + finished = true; + } + + // TODO: all your game logic goes here. + angle += 2.0f % 360; + } + + /** + * Render the current frame + */ + private static void render() { + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // TODO: all your rendering goes here + glClear(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + glTranslatef(Display.getDisplayMode().getWidth() / 2, Display.getDisplayMode().getHeight() / 2, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + glBegin(GL_QUADS); + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + glEnd(); + glPopMatrix(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/AlienEntity.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/AlienEntity.java new file mode 100644 index 0000000..f1db4b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/AlienEntity.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +/** + * An entity which represents one of our space invader aliens. + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class AlienEntity extends Entity { + + /** Movement made downwards when a border is hit */ + private static final int DOWNWARD_MOVEMENT = 10; + + /** Border at which player dies */ + private static final int BOTTOM_BORDER = 570; + + /** Right border at which to shift direction */ + private static final int RIGHT_BORDER = 750; + + /** Left border at which to shift direction */ + private static final int LEFT_BORDER = 10; + + /** The speed at which the alient moves horizontally */ + private float moveSpeed = 75; + + /** The game in which the entity exists */ + private Game game; + + /** The animation frames */ + private Sprite[] frames = new Sprite[4]; + + /** The time since the last frame change took place */ + private long lastFrameChange; + + /** The frame duration in milliseconds, i.e. how long any given frame of animation lasts */ + private long frameDuration = 250; + + /** The current frame of animation being displayed */ + private int frameNumber; + + /** + * Create a new alien entity + * + * @param game The game in which this entity is being created + * @param x The intial x location of this alien + * @param y The intial y location of this alient + */ + public AlienEntity(Game game, int x, int y) { + super(game.getSprite("alien.gif"), x, y); + + // setup the animatin frames + frames[0] = sprite; + frames[1] = game.getSprite("alien2.gif"); + frames[2] = sprite; + frames[3] = game.getSprite("alien3.gif"); + + this.game = game; + dx = -moveSpeed; + } + + /** + * Request that this alien moved based on time elapsed + * + * @param delta The time that has elapsed since last move + */ + public void move(long delta) { + // since the move tells us how much time has passed + // by we can use it to drive the animation, however + // its the not the prettiest solution + lastFrameChange += delta; + + // if we need to change the frame, update the frame number + // and flip over the sprite in use + if (lastFrameChange > frameDuration) { + // reset our frame change time counter + lastFrameChange = 0; + + // update the frame + frameNumber++; + if (frameNumber >= frames.length) { + frameNumber = 0; + } + + sprite = frames[frameNumber]; + } + + // if we have reached the left hand side of the screen and + // are moving left then request a logic update + if ((dx < 0) && (x < LEFT_BORDER)) { + game.updateLogic(); + } + // and vice vesa, if we have reached the right hand side of + // the screen and are moving right, request a logic update + if ((dx > 0) && (x > RIGHT_BORDER)) { + game.updateLogic(); + } + + // proceed with normal move + super.move(delta); + } + + /** + * Update the game logic related to aliens + */ + public void doLogic() { + // swap over horizontal movement and move down the + // screen a bit + dx = -dx; + y += DOWNWARD_MOVEMENT; + + // if we've reached the bottom of the screen then the player + // dies + if (y > BOTTOM_BORDER) { + game.notifyDeath(); + } + } + + /** + * Notification that this alien has collided with another entity + * + * @param other The other entity + */ + public void collidedWith(Entity other) { + // collisions with aliens are handled elsewhere + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Entity.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Entity.java new file mode 100644 index 0000000..19f3231 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Entity.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import java.awt.Rectangle; + +/** + * An entity represents any element that appears in the game. The + * entity is responsible for resolving collisions and movement + * based on a set of properties defined either by subclass or externally. + * + * Note that doubles are used for positions. This may seem strange + * given that pixels locations are integers. However, using double means + * that an entity can move a partial pixel. It doesn't of course mean that + * they will be display half way through a pixel but allows us not lose + * accuracy as we move. + * + * @author Kevin Glass + */ +public abstract class Entity { + + /** The current x location of this entity */ + protected float x; + + /** The current y location of this entity */ + protected float y; + + /** The sprite that represents this entity */ + protected Sprite sprite; + + /** The current speed of this entity horizontally (pixels/sec) */ + protected float dx; + + /** The current speed of this entity vertically (pixels/sec) */ + protected float dy; + + /** The rectangle used for this entity during collisions resolution */ + private Rectangle me = new Rectangle(); + + /** The rectangle used for other entities during collision resolution */ + private Rectangle him = new Rectangle(); + + /** + * Construct a entity based on a sprite image and a location. + * + * @param sprite The reference to the image to be displayed for this entity + * @param x The initial x location of this entity + * @param y The initial y location of this entity + */ + protected Entity(Sprite sprite, int x, int y) { + this.sprite = sprite; + this.x = x; + this.y = y; + } + + /** + * Request that this entity move itself based on a certain ammount + * of time passing. + * + * @param delta The ammount of time that has passed in milliseconds + */ + public void move(long delta) { + // update the location of the entity based on move speeds + x += (delta * dx) / 1000; + y += (delta * dy) / 1000; + } + + /** + * Set the horizontal speed of this entity + * + * @param dx The horizontal speed of this entity (pixels/sec) + */ + public void setHorizontalMovement(float dx) { + this.dx = dx; + } + + /** + * Set the vertical speed of this entity + * + * @param dy The vertical speed of this entity (pixels/sec) + */ + public void setVerticalMovement(float dy) { + this.dy = dy; + } + + /** + * Get the horizontal speed of this entity + * + * @return The horizontal speed of this entity (pixels/sec) + */ + public float getHorizontalMovement() { + return dx; + } + + /** + * Get the vertical speed of this entity + * + * @return The vertical speed of this entity (pixels/sec) + */ + public float getVerticalMovement() { + return dy; + } + + /** + * Draw this entity to the graphics context provided + */ + public void draw() { + sprite.draw((int) x, (int) y); + } + + /** + * Do the logic associated with this entity. This method + * will be called periodically based on game events + */ + public void doLogic() { + } + + /** + * Get the x location of this entity + * + * @return The x location of this entity + */ + public int getX() { + return (int) x; + } + + /** + * Get the y location of this entity + * + * @return The y location of this entity + */ + public int getY() { + return (int) y; + } + + /** + * Check if this entity collised with another. + * + * @param other The other entity to check collision against + * @return True if the entities collide with each other + */ + public boolean collidesWith(Entity other) { + me.setBounds((int) x, (int) y, sprite.getWidth(), sprite.getHeight()); + him.setBounds((int) other.x, (int) other.y, other.sprite.getWidth(), other.sprite.getHeight()); + + return me.intersects(him); + } + + /** + * Notification that this entity collided with another. + * + * @param other The entity with which this entity collided. + */ + public abstract void collidedWith(Entity other); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Game.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Game.java new file mode 100644 index 0000000..11aceb2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Game.java @@ -0,0 +1,609 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import java.util.ArrayList; + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; + +import static org.lwjgl.opengl.GL11.*; + +/** + * The main hook of our game. This class with both act as a manager + * for the display and central mediator for the game logic. + * + * Display management will consist of a loop that cycles round all + * entities in the game asking them to move and then drawing them + * in the appropriate place. With the help of an inner class it + * will also allow the player to control the main ship. + * + * As a mediator it will be informed when entities within our game + * detect events (e.g. alient killed, played died) and will take + * appropriate game actions. + * + * <p> + * NOTE:<br> + * This game is a LWJGLized implementation of the Space Invaders game by Kevin + * Glass. The original implementation is renderer agnostic and supports other + * OpenGL implementations as well as Java2D. This version has been made specific + * for LWJGL, and has added input control as well as sound (which the original doesn't, + * at the time of writing). + * You can find the original article here:<br> + * <a href="http://www.cokeandcode.com/" target="_blank">http://www.cokeandcode.com</a> + * </p> + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class Game { + + /** The normal title of the window */ + private String WINDOW_TITLE = "Space Invaders 104 (for LWJGL)"; + + /** The width of the game display area */ + private int width = 800; + + /** The height of the game display area */ + private int height = 600; + + /** The loader responsible for converting images into OpenGL textures */ + private TextureLoader textureLoader; + + /** The list of all the entities that exist in our game */ + private ArrayList<Entity> entities = new ArrayList<Entity>(); + + /** The list of entities that need to be removed from the game this loop */ + private ArrayList<Entity> removeList = new ArrayList<Entity>(); + + /** The entity representing the player */ + private ShipEntity ship; + + /** List of shots */ + private ShotEntity[] shots; + + /** The message to display which waiting for a key press */ + private Sprite message; + + /** The sprite containing the "Press Any Key" message */ + private Sprite pressAnyKey; + + /** The sprite containing the "You win!" message */ + private Sprite youWin; + + /** The sprite containing the "You lose!" message */ + private Sprite gotYou; + + /** Last shot index */ + private int shotIndex; + + /** The speed at which the player's ship should move (pixels/sec) */ + private float moveSpeed = 300; + + /** The time at which last fired a shot */ + private long lastFire; + + /** The interval between our players shot (ms) */ + private long firingInterval = 500; + + /** The number of aliens left on the screen */ + private int alienCount; + + /** True if we're holding up game play until a key has been pressed */ + private boolean waitingForKeyPress = true; + + /** True if game logic needs to be applied this loop, normally as a result of a game event */ + private boolean logicRequiredThisLoop; + + /** The time at which the last rendering looped started from the point of view of the game logic */ + private long lastLoopTime = getTime(); + + /** True if the fire key has been released */ + private boolean fireHasBeenReleased; + + /** The time since the last record of fps */ + private long lastFpsTime; + + /** The recorded fps */ + private int fps; + + private static long timerTicksPerSecond = Sys.getTimerResolution(); + + /** True if the game is currently "running", i.e. the game loop is looping */ + public static boolean gameRunning = true; + + /** SoundManager to make sound with */ + private SoundManager soundManager; + + /** Whether we're running in fullscreen mode */ + private boolean fullscreen; + + /** ID of shot effect */ + private int SOUND_SHOT; + + /** ID of hit effect */ + private int SOUND_HIT; + + /** ID of start sound */ + private int SOUND_START; + + /** ID of win sound */ + private int SOUND_WIN; + + /** ID of loose sound */ + private int SOUND_LOOSE; + + /** Mouse movement on x axis */ + private int mouseX; + + /** Is this an application or applet */ + private static boolean isApplication; + + /** + * Construct our game and set it running. + * @param fullscreen + * + */ + public Game(boolean fullscreen) { + this.fullscreen = fullscreen; + initialize(); + } + + /** + * Get the high resolution time in milliseconds + * + * @return The high resolution time in milliseconds + */ + public static long getTime() { + // we get the "timer ticks" from the high resolution timer + // multiply by 1000 so our end result is in milliseconds + // then divide by the number of ticks in a second giving + // us a nice clear time in milliseconds + return (Sys.getTime() * 1000) / timerTicksPerSecond; + } + + /** + * Sleep for a fixed number of milliseconds. + * + * @param duration The amount of time in milliseconds to sleep for + */ + public static void sleep(long duration) { + try { + Thread.sleep((duration * timerTicksPerSecond) / 1000); + } catch (InterruptedException inte) { + } + } + + /** + * Intialise the common elements for the game + */ + public void initialize() { + // initialize the window beforehand + try { + setDisplayMode(); + Display.setTitle(WINDOW_TITLE); + Display.setFullscreen(fullscreen); + Display.create(); + + // grab the mouse, dont want that hideous cursor when we're playing! + if (isApplication) { + Mouse.setGrabbed(true); + } + + // enable textures since we're going to use these for our sprites + glEnable(GL_TEXTURE_2D); + + // disable the OpenGL depth test since we're rendering 2D graphics + glDisable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glOrtho(0, width, height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, width, height); + + textureLoader = new TextureLoader(); + + // create our sound manager, and initialize it with 7 channels + // 1 channel for sounds, 6 for effects - this should be enough + // since we have a most 4 shots on screen at any one time, which leaves + // us with 2 channels for explosions. + soundManager = new SoundManager(); + soundManager.initialize(8); + + // load our sound data + SOUND_SHOT = soundManager.addSound("shot.wav"); + SOUND_HIT = soundManager.addSound("hit.wav"); + SOUND_START = soundManager.addSound("start.wav"); + SOUND_WIN = soundManager.addSound("win.wav"); + SOUND_LOOSE = soundManager.addSound("loose.wav"); + } catch (LWJGLException le) { + System.out.println("Game exiting - exception in initialization:"); + le.printStackTrace(); + Game.gameRunning = false; + return; + } + + // get our sprites + gotYou = getSprite("gotyou.gif"); + pressAnyKey = getSprite("pressanykey.gif"); + youWin = getSprite("youwin.gif"); + + message = pressAnyKey; + + // setup 5 shots + shots = new ShotEntity[5]; + for (int i = 0; i < shots.length; i++) { + shots[i] = new ShotEntity(this, "shot.gif", 0, 0); + } + + // setup the initial game state + startGame(); + } + + /** + * Sets the display mode for fullscreen mode + */ + private boolean setDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(width, height, -1, -1, -1, -1, 60, 60); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { + "width=" + width, + "height=" + height, + "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() + }); + return true; + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Unable to enter fullscreen, continuing in windowed mode"); + } + + return false; + } + + /** + * Start a fresh game, this should clear out any old data and + * create a new set. + */ + private void startGame() { + // clear out any existing entities and intialise a new set + entities.clear(); + initEntities(); + } + + /** + * Initialise the starting state of the entities (ship and aliens). Each + * entitiy will be added to the overall list of entities in the game. + */ + private void initEntities() { + // create the player ship and place it roughly in the center of the screen + ship = new ShipEntity(this, "ship.gif", 370, 550); + entities.add(ship); + + // create a block of aliens (5 rows, by 12 aliens, spaced evenly) + alienCount = 0; + for (int row = 0; row < 5; row++) { + for (int x = 0; x < 12; x++) { + Entity alien = new AlienEntity(this, 100 + (x * 50), (50) + row * 30); + entities.add(alien); + alienCount++; + } + } + } + + /** + * Notification from a game entity that the logic of the game + * should be run at the next opportunity (normally as a result of some + * game event) + */ + public void updateLogic() { + logicRequiredThisLoop = true; + } + + /** + * Remove an entity from the game. The entity removed will + * no longer move or be drawn. + * + * @param entity The entity that should be removed + */ + public void removeEntity(Entity entity) { + removeList.add(entity); + } + + /** + * Notification that the player has died. + */ + public void notifyDeath() { + if (!waitingForKeyPress) { + soundManager.playSound(SOUND_LOOSE); + } + message = gotYou; + waitingForKeyPress = true; + } + + /** + * Notification that the player has won since all the aliens + * are dead. + */ + public void notifyWin() { + message = youWin; + waitingForKeyPress = true; + soundManager.playSound(SOUND_WIN); + } + + /** + * Notification that an alien has been killed + */ + public void notifyAlienKilled() { + // reduce the alient count, if there are none left, the player has won! + alienCount--; + + if (alienCount == 0) { + notifyWin(); + } + + // if there are still some aliens left then they all need to get faster, so + // speed up all the existing aliens + for ( Entity entity : entities ) { + if ( entity instanceof AlienEntity ) { + // speed up by 2% + entity.setHorizontalMovement(entity.getHorizontalMovement() * 1.02f); + } + } + + soundManager.playEffect(SOUND_HIT); + } + + /** + * Attempt to fire a shot from the player. Its called "try" + * since we must first check that the player can fire at this + * point, i.e. has he/she waited long enough between shots + */ + public void tryToFire() { + // check that we have waiting long enough to fire + if (System.currentTimeMillis() - lastFire < firingInterval) { + return; + } + + // if we waited long enough, create the shot entity, and record the time. + lastFire = System.currentTimeMillis(); + ShotEntity shot = shots[shotIndex++ % shots.length]; + shot.reinitialize(ship.getX() + 10, ship.getY() - 30); + entities.add(shot); + + soundManager.playEffect(SOUND_SHOT); + } + + /** + * Run the main game loop. This method keeps rendering the scene + * and requesting that the callback update its screen. + */ + private void gameLoop() { + while (Game.gameRunning) { + // clear screen + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // let subsystem paint + frameRendering(); + + // update window contents + Display.update(); + } + + // clean up + soundManager.destroy(); + Display.destroy(); + } + + /** + * Notification that a frame is being rendered. Responsible for + * running game logic and rendering the scene. + */ + public void frameRendering() { + //SystemTimer.sleep(lastLoopTime+10-SystemTimer.getTime()); + Display.sync(60); + + // work out how long its been since the last update, this + // will be used to calculate how far the entities should + // move this loop + long delta = getTime() - lastLoopTime; + lastLoopTime = getTime(); + lastFpsTime += delta; + fps++; + + // update our FPS counter if a second has passed + if (lastFpsTime >= 1000) { + Display.setTitle(WINDOW_TITLE + " (FPS: " + fps + ")"); + lastFpsTime = 0; + fps = 0; + } + + // cycle round asking each entity to move itself + if (!waitingForKeyPress && !soundManager.isPlayingSound()) { + for ( Entity entity : entities ) { + entity.move(delta); + } + } + + // cycle round drawing all the entities we have in the game + for ( Entity entity : entities ) { + entity.draw(); + } + + // brute force collisions, compare every entity against + // every other entity. If any of them collide notify + // both entities that the collision has occured + for (int p = 0; p < entities.size(); p++) { + for (int s = p + 1; s < entities.size(); s++) { + Entity me = entities.get(p); + Entity him = entities.get(s); + + if (me.collidesWith(him)) { + me.collidedWith(him); + him.collidedWith(me); + } + } + } + + // remove any entity that has been marked for clear up + entities.removeAll(removeList); + removeList.clear(); + + // if a game event has indicated that game logic should + // be resolved, cycle round every entity requesting that + // their personal logic should be considered. + if (logicRequiredThisLoop) { + for ( Entity entity : entities ) { + entity.doLogic(); + } + + logicRequiredThisLoop = false; + } + + // if we're waiting for an "any key" press then draw the + // current message + if (waitingForKeyPress) { + message.draw(325, 250); + } + + // resolve the movemfent of the ship. First assume the ship + // isn't moving. If either cursor key is pressed then + // update the movement appropraitely + ship.setHorizontalMovement(0); + + // get mouse movement on x axis. We need to get it now, since + // we can only call getDX ONCE! - secondary calls will yield 0, since + // there haven't been any movement since last call. + mouseX = Mouse.getDX(); + + // we delegate input checking to submethod since we want to check + // for keyboard, mouse & controller + boolean leftPressed = hasInput(Keyboard.KEY_LEFT); + boolean rightPressed = hasInput(Keyboard.KEY_RIGHT); + boolean firePressed = hasInput(Keyboard.KEY_SPACE); + + if (!waitingForKeyPress && !soundManager.isPlayingSound()) { + if ((leftPressed) && (!rightPressed)) { + ship.setHorizontalMovement(-moveSpeed); + } else if ((rightPressed) && (!leftPressed)) { + ship.setHorizontalMovement(moveSpeed); + } + + // if we're pressing fire, attempt to fire + if (firePressed) { + tryToFire(); + } + } else { + if (!firePressed) { + fireHasBeenReleased = true; + } + if ((firePressed) && (fireHasBeenReleased) && !soundManager.isPlayingSound()) { + waitingForKeyPress = false; + fireHasBeenReleased = false; + startGame(); + soundManager.playSound(SOUND_START); + } + } + + // if escape has been pressed, stop the game + if ((Display.isCloseRequested() || Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) && isApplication) { + Game.gameRunning = false; + } + } + + /** + * @param direction + * @return + */ + private boolean hasInput(int direction) { + switch(direction) { + case Keyboard.KEY_LEFT: + return + Keyboard.isKeyDown(Keyboard.KEY_LEFT) || + mouseX < 0; + + case Keyboard.KEY_RIGHT: + return + Keyboard.isKeyDown(Keyboard.KEY_RIGHT) || + mouseX > 0; + + case Keyboard.KEY_SPACE: + return + Keyboard.isKeyDown(Keyboard.KEY_SPACE) || + Mouse.isButtonDown(0); + } + return false; + } + + /** + * The entry point into the game. We'll simply create an + * instance of class which will start the display and game + * loop. + * + * @param argv The arguments that are passed into our game + */ + public static void main(String argv[]) { + isApplication = true; + System.out.println("Use -fullscreen for fullscreen mode"); + new Game((argv.length > 0 && "-fullscreen".equalsIgnoreCase(argv[0]))).execute(); + System.exit(0); + } + + /** + * + */ + public void execute() { + gameLoop(); + } + + /** + * Create or get a sprite which displays the image that is pointed + * to in the classpath by "ref" + * + * @param ref A reference to the image to load + * @return A sprite that can be drawn onto the current graphics context. + */ + public Sprite getSprite(String ref) { + return new Sprite(textureLoader, ref); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java new file mode 100644 index 0000000..0e2d016 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/GameApplet.java @@ -0,0 +1,104 @@ +package org.lwjgl.examples.spaceinvaders; + + +import java.applet.Applet; +import java.awt.BorderLayout; +import java.awt.Canvas; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; + +public class GameApplet extends Applet { + + /** The Canvas where the LWJGL Display is added */ + Canvas display_parent; + + /** Thread which runs the main game loop */ + Thread gameThread; + + /** The Game instance */ + Game game; + + /** + * Once the Canvas is created its add notify method will call this method to + * start the LWJGL Display and game loop in another thread. + */ + public void startLWJGL() { + gameThread = new Thread() { + public void run() { + + try { + Display.setParent(display_parent); + + } catch (LWJGLException e) { + e.printStackTrace(); + } + // start game + game = new Game(false); + game.execute(); + } + }; + gameThread.start(); + } + + + /** + * Tell game loop to stop running, after which the LWJGL Display will be destoryed. + * The main thread will wait for the Display.destroy() to complete + */ + private void stopLWJGL() { + Game.gameRunning = false; + try { + gameThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public void start() { + + } + + public void stop() { + + } + + /** + * Applet Destroy method will remove the canvas, before canvas is destroyed it will notify + * stopLWJGL() to stop main game loop and to destroy the Display + */ + public void destroy() { + remove(display_parent); + super.destroy(); + System.out.println("Clear up"); + } + + /** + * initialise applet by adding a canvas to it, this canvas will start the LWJGL Display and game loop + * in another thread. It will also stop the game loop and destroy the display on canvas removal when + * applet is destroyed. + */ + public void init() { + setLayout(new BorderLayout()); + try { + display_parent = new Canvas() { + public void addNotify() { + super.addNotify(); + startLWJGL(); + } + public void removeNotify() { + stopLWJGL(); + super.removeNotify(); + } + }; + display_parent.setSize(getWidth(),getHeight()); + add(display_parent); + display_parent.setFocusable(true); + display_parent.requestFocus(); + display_parent.setIgnoreRepaint(true); + setVisible(true); + } catch (Exception e) { + System.err.println(e); + throw new RuntimeException("Unable to create display"); + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShipEntity.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShipEntity.java new file mode 100644 index 0000000..0e33a3b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShipEntity.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +/** + * The entity that represents the players ship + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class ShipEntity extends Entity { + + /** Right border at which to disallow further movement */ + private static final int RIGHT_BORDER = 750; + + /** Left border at which to disallow further movement */ + private static final int LEFT_BORDER = 10; + + /** The game in which the ship exists */ + private Game game; + + /** + * Create a new entity to represent the players ship + * + * @param game The game in which the ship is being created + * @param ref The reference to the sprite to show for the ship + * @param x The initial x location of the player's ship + * @param y The initial y location of the player's ship + */ + public ShipEntity(Game game,String ref,int x,int y) { + super(game.getSprite(ref), x, y); + + this.game = game; + } + + /** + * Request that the ship move itself based on an elapsed ammount of + * time + * + * @param delta The time that has elapsed since last move (ms) + */ + public void move(long delta) { + // if we're moving left and have reached the left hand side + // of the screen, don't move + if ((dx < 0) && (x < LEFT_BORDER)) { + return; + } + // if we're moving right and have reached the right hand side + // of the screen, don't move + if ((dx > 0) && (x > RIGHT_BORDER)) { + return; + } + + super.move(delta); + } + + /** + * Notification that the player's ship has collided with something + * + * @param other The entity with which the ship has collided + */ + public void collidedWith(Entity other) { + // if its an alien, notify the game that the player + // is dead + if (other instanceof AlienEntity) { + game.notifyDeath(); + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShotEntity.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShotEntity.java new file mode 100644 index 0000000..efff69e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/ShotEntity.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +/** + * An entity representing a shot fired by the player's ship + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class ShotEntity extends Entity { + + /** Top border at which shots are outside */ + private static final int TOP_BORDER = -100; + + /** The vertical speed at which the players shot moves */ + private float moveSpeed = -300; + + /** The game in which this entity exists */ + private Game game; + + /** True if this shot has been "used", i.e. its hit something */ + private boolean used; + + /** + * Create a new shot from the player + * + * @param game The game in which the shot has been created + * @param sprite The sprite representing this shot + * @param x The initial x location of the shot + * @param y The initial y location of the shot + */ + public ShotEntity(Game game, String sprite, int x, int y) { + super(game.getSprite(sprite), x, y); + + this.game = game; + dy = moveSpeed; + } + + /** + * Reinitializes this entity, for reuse + * + * @param x new x coordinate + * @param y new y coordinate + */ + public void reinitialize(int x, int y) { + this.x = x; + this.y = y; + used = false; + } + + /** + * Request that this shot moved based on time elapsed + * + * @param delta The time that has elapsed since last move + */ + public void move(long delta) { + // proceed with normal move + super.move(delta); + + // if we shot off the screen, remove ourselfs + if (y < TOP_BORDER) { + game.removeEntity(this); + } + } + + /** + * Notification that this shot has collided with another + * entity + * + * @param other The other entity with which we've collided + */ + public void collidedWith(Entity other) { + // prevents double kills, if we've already hit something, + // don't collide + if (used) { + return; + } + + // if we've hit an alien, kill it! + if (other instanceof AlienEntity) { + // remove the affected entities + game.removeEntity(this); + game.removeEntity(other); + + // notify the game that the alien has been killed + game.notifyAlienKilled(); + used = true; + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/SoundManager.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/SoundManager.java new file mode 100644 index 0000000..04d309b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/SoundManager.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.util.WaveData; + + +/** + * <p> + * Simple sound manager for OpenAL using n sources accessed in + * a round robin schedule. Source n is reserved for a single buffer and checking for + * whether it's playing. + * </p> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class SoundManager { + + /** We support at most 256 buffers*/ + private int[] buffers = new int[256]; + + /** Number of sources is limited tby user (and hardware) */ + private int[] sources; + + /** Our internal scratch buffer */ + private IntBuffer scratchBuffer = BufferUtils.createIntBuffer(256); + + /** Whether we're running in no sound mode */ + private boolean soundOutput; + + /** Current index in our buffers */ + private int bufferIndex; + + /** Current index in our source list */ + private int sourceIndex; + + /** + * Creates a new SoundManager + */ + public SoundManager() { + } + + /** + * Plays a sound effect + * @param buffer Buffer index to play gotten from addSound + */ + public void playEffect(int buffer) { + if(soundOutput) { + // make sure we never choose last channel, since it is used for special sounds + int channel = sources[(sourceIndex++ % (sources.length-1))]; + + // link buffer and source, and play it + AL10.alSourcei(channel, AL10.AL_BUFFER, buffers[buffer]); + AL10.alSourcePlay(channel); + } + } + + /** + * Plays a sound on last source + * @param buffer Buffer index to play gotten from addSound + */ + public void playSound(int buffer) { + if(soundOutput) { + AL10.alSourcei(sources[sources.length-1], AL10.AL_BUFFER, buffers[buffer]); + AL10.alSourcePlay(sources[sources.length-1]); + } + } + + /** + * Whether a sound is playing on last source + * @return true if a source is playing right now on source n + */ + public boolean isPlayingSound() { + return AL10.alGetSourcei(sources[sources.length-1], AL10.AL_SOURCE_STATE) == AL10.AL_PLAYING; + } + + /** + * Initializes the SoundManager + * + * @param channels Number of channels to create + */ + public void initialize(int channels) { + try { + AL.create(); + + // allocate sources + scratchBuffer.limit(channels); + AL10.alGenSources(scratchBuffer); + scratchBuffer.rewind(); + scratchBuffer.get(sources = new int[channels]); + + // could we allocate all channels? + if(AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new LWJGLException("Unable to allocate " + channels + " sources"); + } + + // we have sound + soundOutput = true; + } catch (LWJGLException le) { + le.printStackTrace(); + System.out.println("Sound disabled"); + } + } + + /** + * Adds a sound to the Sound Managers pool + * + * @param path Path to file to load + * @return index into SoundManagers buffer list + */ + public int addSound(String path) { + // Generate 1 buffer entry + scratchBuffer.rewind().position(0).limit(1); + AL10.alGenBuffers(scratchBuffer); + buffers[bufferIndex] = scratchBuffer.get(0); + + // load wave data from buffer + WaveData wavefile = WaveData.create("spaceinvaders/" + path); + + // copy to buffers + AL10.alBufferData(buffers[bufferIndex], wavefile.format, wavefile.data, wavefile.samplerate); + + // unload file again + wavefile.dispose(); + + // return index for this sound + return bufferIndex++; + } + + /** + * Destroy this SoundManager + */ + public void destroy() { + if(soundOutput) { + + // stop playing sounds + scratchBuffer.position(0).limit(sources.length); + scratchBuffer.put(sources).flip(); + AL10.alSourceStop(scratchBuffer); + + // destroy sources + AL10.alDeleteSources(scratchBuffer); + + // destroy buffers + scratchBuffer.position(0).limit(bufferIndex); + scratchBuffer.put(buffers, 0, bufferIndex).flip(); + AL10.alDeleteBuffers(scratchBuffer); + + // destory OpenAL + AL.destroy(); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Sprite.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Sprite.java new file mode 100644 index 0000000..823d6aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Sprite.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import java.io.IOException; + +import static org.lwjgl.opengl.GL11.*; + +/** + * Implementation of sprite that uses an OpenGL quad and a texture + * to render a given image to the screen. + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class Sprite { + + /** The texture that stores the image for this sprite */ + private Texture texture; + + /** The width in pixels of this sprite */ + private int width; + + /** The height in pixels of this sprite */ + private int height; + + /** + * Create a new sprite from a specified image. + * + * @param loader the texture loader to use + * @param ref A reference to the image on which this sprite should be based + */ + public Sprite(TextureLoader loader, String ref) { + try { + texture = loader.getTexture("spaceinvaders/" + ref); + width = texture.getImageWidth(); + height = texture.getImageHeight(); + } catch (IOException ioe) { + ioe.printStackTrace(); + System.exit(-1); + } + } + + /** + * Get the width of this sprite in pixels + * + * @return The width of this sprite in pixels + */ + public int getWidth() { + return texture.getImageWidth(); + } + + /** + * Get the height of this sprite in pixels + * + * @return The height of this sprite in pixels + */ + public int getHeight() { + return texture.getImageHeight(); + } + + /** + * Draw the sprite at the specified location + * + * @param x The x location at which to draw this sprite + * @param y The y location at which to draw this sprite + */ + public void draw(int x, int y) { + // store the current model matrix + glPushMatrix(); + + // bind to the appropriate texture for this sprite + texture.bind(); + + // translate to the right location and prepare to draw + glTranslatef(x, y, 0); + + // draw a quad textured to match the sprite + glBegin(GL_QUADS); + { + glTexCoord2f(0, 0); + glVertex2f(0, 0); + + glTexCoord2f(0, texture.getHeight()); + glVertex2f(0, height); + + glTexCoord2f(texture.getWidth(), texture.getHeight()); + glVertex2f(width, height); + + glTexCoord2f(texture.getWidth(), 0); + glVertex2f(width, 0); + } + glEnd(); + + // restore the model view matrix to prevent contamination + glPopMatrix(); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Texture.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Texture.java new file mode 100644 index 0000000..6a3b42b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/Texture.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import static org.lwjgl.opengl.GL11.*; + +/** + * A texture to be bound within OpenGL. This object is responsible for + * keeping track of a given OpenGL texture and for calculating the + * texturing mapping coordinates of the full image. + * + * Since textures need to be powers of 2 the actual texture may be + * considerably bigged that the source image and hence the texture + * mapping coordinates need to be adjusted to matchup drawing the + * sprite against the texture. + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class Texture { + + /** The GL target type */ + private int target; + + /** The GL texture ID */ + private int textureID; + + /** The height of the image */ + private int height; + + /** The width of the image */ + private int width; + + /** The width of the texture */ + private int texWidth; + + /** The height of the texture */ + private int texHeight; + + /** The ratio of the width of the image to the texture */ + private float widthRatio; + + /** The ratio of the height of the image to the texture */ + private float heightRatio; + + /** + * Create a new texture + * + * @param target The GL target + * @param textureID The GL texture ID + */ + public Texture(int target, int textureID) { + this.target = target; + this.textureID = textureID; + } + + /** + * Bind the specified GL context to a texture + */ + public void bind() { + glBindTexture(target, textureID); + } + + /** + * Set the height of the image + * + * @param height The height of the image + */ + public void setHeight(int height) { + this.height = height; + setHeight(); + } + + /** + * Set the width of the image + * + * @param width The width of the image + */ + public void setWidth(int width) { + this.width = width; + setWidth(); + } + + /** + * Get the height of the original image + * + * @return The height of the original image + */ + public int getImageHeight() { + return height; + } + + /** + * Get the width of the original image + * + * @return The width of the original image + */ + public int getImageWidth() { + return width; + } + + /** + * Get the height of the physical texture + * + * @return The height of physical texture + */ + public float getHeight() { + return heightRatio; + } + + /** + * Get the width of the physical texture + * + * @return The width of physical texture + */ + public float getWidth() { + return widthRatio; + } + + /** + * Set the height of this texture + * + * @param texHeight The height of the texture + */ + public void setTextureHeight(int texHeight) { + this.texHeight = texHeight; + setHeight(); + } + + /** + * Set the width of this texture + * + * @param texWidth The width of the texture + */ + public void setTextureWidth(int texWidth) { + this.texWidth = texWidth; + setWidth(); + } + + /** + * Set the height of the texture. This will update the + * ratio also. + */ + private void setHeight() { + if (texHeight != 0) { + heightRatio = ((float) height) / texHeight; + } + } + + /** + * Set the width of the texture. This will update the + * ratio also. + */ + private void setWidth() { + if (texWidth != 0) { + widthRatio = ((float) width) / texWidth; + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/TextureLoader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/TextureLoader.java new file mode 100644 index 0000000..51e9148 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/examples/spaceinvaders/TextureLoader.java @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.examples.spaceinvaders; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; +import java.io.IOException; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.util.HashMap; +import java.util.Hashtable; + +import javax.swing.ImageIcon; + +import org.lwjgl.BufferUtils; + +import static org.lwjgl.opengl.GL11.*; + +/** + * A utility class to load textures for OpenGL. This source is based + * on a texture that can be found in the Java Gaming (www.javagaming.org) + * Wiki. It has been simplified slightly for explicit 2D graphics use. + * + * OpenGL uses a particular image format. Since the images that are + * loaded from disk may not match this format this loader introduces + * a intermediate image which the source image is copied into. In turn, + * this image is used as source for the OpenGL texture. + * + * @author Kevin Glass + * @author Brian Matzon + */ +public class TextureLoader { + /** The table of textures that have been loaded in this loader */ + private HashMap<String, Texture> table = new HashMap<String, Texture>(); + + /** The colour model including alpha for the GL image */ + private ColorModel glAlphaColorModel; + + /** The colour model for the GL image */ + private ColorModel glColorModel; + + /** Scratch buffer for texture ID's */ + private IntBuffer textureIDBuffer = BufferUtils.createIntBuffer(1); + + /** + * Create a new texture loader based on the game panel + */ + public TextureLoader() { + glAlphaColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[] {8,8,8,8}, + true, + false, + ComponentColorModel.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + + glColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[] {8,8,8,0}, + false, + false, + ComponentColorModel.OPAQUE, + DataBuffer.TYPE_BYTE); + } + + /** + * Create a new texture ID + * + * @return A new texture ID + */ + private int createTextureID() { + glGenTextures(textureIDBuffer); + return textureIDBuffer.get(0); + } + + /** + * Load a texture + * + * @param resourceName The location of the resource to load + * @return The loaded texture + * @throws IOException Indicates a failure to access the resource + */ + public Texture getTexture(String resourceName) throws IOException { + Texture tex = table.get(resourceName); + + if (tex != null) { + return tex; + } + + tex = getTexture(resourceName, + GL_TEXTURE_2D, // target + GL_RGBA, // dst pixel format + GL_LINEAR, // min filter (unused) + GL_LINEAR); + + table.put(resourceName,tex); + + return tex; + } + + /** + * Load a texture into OpenGL from a image reference on + * disk. + * + * @param resourceName The location of the resource to load + * @param target The GL target to load the texture against + * @param dstPixelFormat The pixel format of the screen + * @param minFilter The minimising filter + * @param magFilter The magnification filter + * @return The loaded texture + * @throws IOException Indicates a failure to access the resource + */ + public Texture getTexture(String resourceName, + int target, + int dstPixelFormat, + int minFilter, + int magFilter) throws IOException { + int srcPixelFormat; + + // create the texture ID for this texture + int textureID = createTextureID(); + Texture texture = new Texture(target,textureID); + + // bind this texture + glBindTexture(target, textureID); + + BufferedImage bufferedImage = loadImage(resourceName); + texture.setWidth(bufferedImage.getWidth()); + texture.setHeight(bufferedImage.getHeight()); + + if (bufferedImage.getColorModel().hasAlpha()) { + srcPixelFormat = GL_RGBA; + } else { + srcPixelFormat = GL_RGB; + } + + // convert that image into a byte buffer of texture data + ByteBuffer textureBuffer = convertImageData(bufferedImage,texture); + + if (target == GL_TEXTURE_2D) { + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter); + } + + // produce a texture from the byte buffer + glTexImage2D(target, + 0, + dstPixelFormat, + get2Fold(bufferedImage.getWidth()), + get2Fold(bufferedImage.getHeight()), + 0, + srcPixelFormat, + GL_UNSIGNED_BYTE, + textureBuffer ); + + return texture; + } + + /** + * Get the closest greater power of 2 to the fold number + * + * @param fold The target number + * @return The power of 2 + */ + private static int get2Fold(int fold) { + int ret = 2; + while (ret < fold) { + ret *= 2; + } + return ret; + } + + /** + * Convert the buffered image to a texture + * + * @param bufferedImage The image to convert to a texture + * @param texture The texture to store the data into + * @return A buffer containing the data + */ + private ByteBuffer convertImageData(BufferedImage bufferedImage,Texture texture) { + ByteBuffer imageBuffer; + WritableRaster raster; + BufferedImage texImage; + + int texWidth = 2; + int texHeight = 2; + + // find the closest power of 2 for the width and height + // of the produced texture + while (texWidth < bufferedImage.getWidth()) { + texWidth *= 2; + } + while (texHeight < bufferedImage.getHeight()) { + texHeight *= 2; + } + + texture.setTextureHeight(texHeight); + texture.setTextureWidth(texWidth); + + // create a raster that can be used by OpenGL as a source + // for a texture + if (bufferedImage.getColorModel().hasAlpha()) { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,texWidth,texHeight,4,null); + texImage = new BufferedImage(glAlphaColorModel,raster,false,new Hashtable()); + } else { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,texWidth,texHeight,3,null); + texImage = new BufferedImage(glColorModel,raster,false,new Hashtable()); + } + + // copy the source image into the produced image + Graphics g = texImage.getGraphics(); + g.setColor(new Color(0f,0f,0f,0f)); + g.fillRect(0,0,texWidth,texHeight); + g.drawImage(bufferedImage,0,0,null); + + // build a byte buffer from the temporary image + // that be used by OpenGL to produce a texture. + byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); + + imageBuffer = ByteBuffer.allocateDirect(data.length); + imageBuffer.order(ByteOrder.nativeOrder()); + imageBuffer.put(data, 0, data.length); + imageBuffer.flip(); + + return imageBuffer; + } + + /** + * Load a given resource as a buffered image + * + * @param ref The location of the resource to load + * @return The loaded buffered image + * @throws IOException Indicates a failure to find a resource + */ + private BufferedImage loadImage(String ref) throws IOException { + URL url = TextureLoader.class.getClassLoader().getResource(ref); + + if (url == null) { + throw new IOException("Cannot find: " + ref); + } + + // due to an issue with ImageIO and mixed signed code + // we are now using good oldfashioned ImageIcon to load + // images and the paint it on top of a new BufferedImage + Image img = new ImageIcon(url).getImage(); + BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB); + Graphics g = bufferedImage.getGraphics(); + g.drawImage(img, 0, 0, null); + g.dispose(); + + return bufferedImage; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controller.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controller.java new file mode 100644 index 0000000..8135f85 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controller.java @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +/** + * A game controller of some sort that will provide input. The controller + * presents buttons and axes. Buttons are either pressed or not pressed. Axis + * provide analogue values. + * + * @author Kevin Glass + */ +public interface Controller { + /** + * Get the name assigned to this controller. + * + * @return The name assigned to this controller + */ + String getName(); + + /** + * Get the index of this controller in the collection + * + * @return The index of this controller in the collection + */ + int getIndex(); + + /** + * Retrieve the number of buttons available on this controller + * + * @return The number of butotns available on this controller + */ + int getButtonCount(); + + /** + * Get the name of the specified button. Be warned, often this is + * as exciting as "Button X" + * + * @param index The index of the button whose name should be retrieved + * @return The name of the button requested + */ + String getButtonName(int index); + + /** + * Check if a button is currently pressed + * + * @param index The button to check + * @return True if the button is currently pressed + */ + boolean isButtonPressed(int index); + + /** + * Poll the controller for new data. This will also update + * events + */ + void poll(); + + /** + * Get the X-Axis value of the POV on this controller + * + * @return The X-Axis value of the POV on this controller + */ + float getPovX(); + + /** + * Get the Y-Axis value of the POV on this controller + * + * @return The Y-Axis value of the POV on this controller + */ + float getPovY(); + + /** + * Get the dead zone for a specified axis + * + * @param index The index of the axis for which to retrieve the dead zone + * @return The dead zone for the specified axis + */ + float getDeadZone(int index); + + /** + * Set the dead zone for the specified axis + * + * @param index The index of hte axis for which to set the dead zone + * @param zone The dead zone to use for the specified axis + */ + void setDeadZone(int index,float zone); + + /** + * Retrieve the number of axes available on this controller. + * + * @return The number of axes available on this controller. + */ + int getAxisCount(); + + /** + * Get the name that's given to the specified axis + * + * @param index The index of the axis whose name should be retrieved + * @return The name of the specified axis. + */ + String getAxisName(int index); + + /** + * Retrieve the value thats currently available on a specified axis. The + * value will always be between 1.0 and -1.0 and will calibrate as values + * are passed read. It may be useful to get the player to wiggle the joystick + * from side to side to get the calibration right. + * + * @param index The index of axis to be read + * @return The value from the specified axis. + */ + float getAxisValue(int index); + + /** + * Get the value from the X axis if there is one. If no X axis is + * defined a zero value will be returned. + * + * @return The value from the X axis + */ + float getXAxisValue(); + + /** + * Get the dead zone for the X axis. + * + * @return The dead zone for the X axis + */ + float getXAxisDeadZone(); + + /** + * Set the dead zone for the X axis + * + * @param zone The dead zone to use for the X axis + */ + void setXAxisDeadZone(float zone); + + /** + * Get the value from the Y axis if there is one. If no Y axis is + * defined a zero value will be returned. + * + * @return The value from the Y axis + */ + float getYAxisValue(); + + /** + * Get the dead zone for the Y axis. + * + * @return The dead zone for the Y axis + */ + float getYAxisDeadZone(); + + /** + * Set the dead zone for the Y axis + * + * @param zone The dead zone to use for the Y axis + */ + void setYAxisDeadZone(float zone); + + /** + * Get the value from the Z axis if there is one. If no Z axis is + * defined a zero value will be returned. + * + * @return The value from the Z axis + */ + float getZAxisValue(); + + /** + * Get the dead zone for the Z axis. + * + * @return The dead zone for the Z axis + */ + float getZAxisDeadZone(); + + /** + * Set the dead zone for the Z axis + * + * @param zone The dead zone to use for the Z axis + */ + void setZAxisDeadZone(float zone); + + /** + * Get the value from the RX axis if there is one. If no RX axis is + * defined a zero value will be returned. + * + * @return The value from the RX axis + */ + float getRXAxisValue(); + + /** + * Get the dead zone for the RX axis. + * + * @return The dead zone for the RX axis + */ + float getRXAxisDeadZone(); + + /** + * Set the dead zone for the RX axis + * + * @param zone The dead zone to use for the RX axis + */ + void setRXAxisDeadZone(float zone); + + /** + * Get the value from the RY axis if there is one. If no RY axis is + * defined a zero value will be returned. + * + * @return The value from the RY axis + */ + float getRYAxisValue(); + + /** + * Get the dead zone for the RY axis. + * + * @return The dead zone for the RY axis + */ + float getRYAxisDeadZone(); + + /** + * Set the dead zone for the RY axis + * + * @param zone The dead zone to use for the RY axis + */ + void setRYAxisDeadZone(float zone); + + /** + * Get the value from the RZ axis if there is one. If no RZ axis is + * defined a zero value will be returned. + * + * @return The value from the RZ axis + */ + float getRZAxisValue(); + + /** + * Get the dead zone for the RZ axis. + * + * @return The dead zone for the RZ axis + */ + float getRZAxisDeadZone(); + + /** + * Set the dead zone for the RZ axis + * + * @param zone The dead zone to use for the RZ axis + */ + void setRZAxisDeadZone(float zone); + + + /** Returns the number of rumblers this controller supports */ + int getRumblerCount(); + + /** Returns the name of the specified rumbler + * + * @param index The rumbler index + */ + String getRumblerName(int index); + + /** Sets the vibration strength of the specified rumbler + * + * @param index The index of the rumbler + * @param strength The strength to vibrate at + */ + void setRumblerStrength(int index, float strength); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/ControllerEvent.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/ControllerEvent.java new file mode 100644 index 0000000..35ed82c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/ControllerEvent.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +/** + * An event occuring on a controller. + * + * @author Kevin Glass + */ +class ControllerEvent { + /** Indicates the event was caused by a button */ + public static final int BUTTON = 1; + /** Indicates the event was caused by a axis */ + public static final int AXIS = 2; + /** Indicates the event was caused by a pov X */ + public static final int POVX = 3; + /** Indicates the event was caused by a pov Y */ + public static final int POVY = 4; + + /** The controller generating the event */ + private Controller source; + /** The index of the input (axis or button) that generated the event */ + private int index; + /** Type of control that generated the event */ + private int type; + /** True when a button is pressed, if this event was caused by the button */ + private boolean buttonState; + /** True if this event was caused by the x axis */ + private boolean xaxis; + /** True if this event was caused by the y axis */ + private boolean yaxis; + /** The time stamp of this event */ + private long timeStamp; + /** The value on a specified axis, if this event was caused by the x-axis */ + private float xaxisValue; + /** The value on a specified axis, if this event was caused by the y-axis */ + private float yaxisValue; + + /** + * Create a new event + * + * @param source The source of the event + * @param timeStamp The time stamp given for this event + * @param type The type of control generating this event + * @param index The index of the input that generated the event + * @param xaxis True if this event was caused by the x-axis + * @param yaxis True if this event was caused by the y-axis + */ + ControllerEvent(Controller source,long timeStamp, int type,int index,boolean xaxis,boolean yaxis) { + this(source, timeStamp, type, index, false, xaxis, yaxis, 0, 0); + } + + /** + * Create a new event + * + * @param source The source of the event + * @param timeStamp The time stamp given for this event + * @param type The type of control generating this event + * @param index The index of the input that generated the event + * @param buttonState True when a button is pressed, if this event was caused by the button + * @param xaxis True if this event was caused by the x-axis + * @param yaxis True if this event was caused by the y-axis + * @param xaxisValue The value on a specified axis, if this event was caused by the x-axis + * @param yaxisValue The value on a specified axis, if this event was caused by the y-axis + */ + ControllerEvent(Controller source,long timeStamp, int type,int index,boolean buttonState,boolean xaxis,boolean yaxis,float xaxisValue,float yaxisValue) { + this.source = source; + this.timeStamp = timeStamp; + this.type = type; + this.index = index; + this.buttonState = buttonState; + this.xaxis = xaxis; + this.yaxis = yaxis; + this.xaxisValue = xaxisValue; + this.yaxisValue = yaxisValue; + } + + /** + * Get the time stamp given for this event. As with nanoTime() + * this value means nothing other than giving ordering + * + * @return The time stamp given for this event + */ + public long getTimeStamp() { + return timeStamp; + } + + /** + * Get the controller that generated this event + * + * @return The controller that generated this event + */ + public Controller getSource() { + return source; + } + + /** + * Get the index of the control generating this event + * + * @return The index of the control generating this event + */ + public int getControlIndex() { + return index; + } + + /** + * Check if this event was generated by a button + * + * @return True if this event was generated by a button + */ + public boolean isButton() { + return type == BUTTON; + } + + /** + * Check the button is pressed or not, when this event was caused + * + * @return True when a button is pressed, if this event was caused by the button + */ + public boolean getButtonState() { + return buttonState; + } + + /** + * Check if this event was generated by a axis + * + * @return True if this event was generated by a axis + */ + public boolean isAxis() { + return type == AXIS; + } + + /** + * Check if this event was generated by a pov + * + * @return True if this event was generated by a pov + */ + public boolean isPovY() { + return type == POVY; + } + /** + * + * Check if this event was generated by a pov + * + * @return True if this event was generated by a pov + */ + public boolean isPovX() { + return type == POVX; + } + + /** + * Check if this event was caused by the X axis + * + * @return True if this event was caused by the X axis + */ + public boolean isXAxis() { + return xaxis; + } + + /** + * Check if this event was caused by the Y axis + * + * @return True if this event was caused by the Y axis + */ + public boolean isYAxis() { + return yaxis; + } + + /** + * Get the value on an X axis when this event was caused + * + * @return The value on a specified axis, if this event was caused by the x-axis + */ + public float getXAxisValue() { + return xaxisValue; + } + + /** + * Get the value on an Y axis when this event was caused + * + * @return The value on a specified axis, if this event was caused by the y-axis + */ + public float getYAxisValue() { + return yaxisValue; + } + + /* + * @see java.lang.Object#toString() + */ + public String toString() { + return "["+source+" type="+type+" xaxis="+xaxis+" yaxis="+yaxis+"]"; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controllers.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controllers.java new file mode 100644 index 0000000..db0a5c5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Controllers.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import java.util.ArrayList; + +import net.java.games.input.ControllerEnvironment; + +import org.lwjgl.LWJGLException; + +/** + * The collection of controllers currently connected. + * + * @author Kevin Glass + */ +public class Controllers { + /** The controllers available */ + private static ArrayList<JInputController> controllers = new ArrayList<JInputController>(); + /** The number of controllers */ + private static int controllerCount; + + /** The current list of events */ + private static ArrayList<ControllerEvent> events = new ArrayList<ControllerEvent>(); + /** The current event */ + private static ControllerEvent event; + + /** Whether controllers were created */ + private static boolean created; + + /** + * Initialise the controllers collection + * + * @throws LWJGLException Indicates a failure to initialise the controller library. + */ + public static void create() throws LWJGLException { + if (created) + return; + + try { + ControllerEnvironment env = ControllerEnvironment.getDefaultEnvironment(); + + net.java.games.input.Controller[] found = env.getControllers(); + ArrayList<net.java.games.input.Controller> lollers = new ArrayList<net.java.games.input.Controller>(); + for ( net.java.games.input.Controller c : found ) { + if ( (!c.getType().equals(net.java.games.input.Controller.Type.KEYBOARD)) && + (!c.getType().equals(net.java.games.input.Controller.Type.MOUSE)) ) { + lollers.add(c); + } + } + + for ( net.java.games.input.Controller c : lollers ) { + createController(c); + } + + created = true; + } catch (Throwable e) { + throw new LWJGLException("Failed to initialise controllers",e); + } + } + + /** + * Utility to create a controller based on its potential sub-controllers + * + * @param c The controller to add + */ + private static void createController(net.java.games.input.Controller c) { + net.java.games.input.Controller[] subControllers = c.getControllers(); + if (subControllers.length == 0) { + JInputController controller = new JInputController(controllerCount,c); + + controllers.add(controller); + controllerCount++; + } else { + for ( net.java.games.input.Controller sub : subControllers ) { + createController(sub); + } + } + } + + /** + * Get a controller from the collection + * + * @param index The index of the controller to retrieve + * @return The controller requested + */ + public static Controller getController(int index) { + return controllers.get(index); + } + + /** + * Retrieve a count of the number of controllers + * + * @return The number of controllers available + */ + public static int getControllerCount() { + return controllers.size(); + } + + /** + * Poll the controllers available. This will both update their state + * and generate events that must be cleared. + */ + public static void poll() { + for (int i=0;i<controllers.size();i++) { + getController(i).poll(); + } + } + + /** + * Clear any events stored for the controllers in this set + */ + public static void clearEvents() { + events.clear(); + } + + /** + * Move to the next event that has been stored. + * + * @return True if there is still an event to process + */ + public static boolean next() { + if (events.size() == 0) { + event = null; + return false; + } + + event = events.remove(0); + + return event != null; + } + + /** + * @return True if Controllers has been created + */ + public static boolean isCreated() { + return created; + } + + /** + * Destroys any resources used by the controllers + */ + public static void destroy() { +// FIXME! not currently possible to destroy a controller + +// if (!created) +// return; +// created = false; +// +// // nuke each controller +// for (int i=0;i<controllers.size();i++) { +// // +// } +// +// // cleanup +// event = null; +// events.clear(); +// controllers.clear(); +// controllerCount = 0; + } + + /** + * Get the source of the current event + * + * @return The source of the current event + */ + public static Controller getEventSource() { + return event.getSource(); + } + + /** + * Get the index of the control that caused the current event + * + * @return The index of the control that cause the current event + */ + public static int getEventControlIndex() { + return event.getControlIndex(); + } + + /** + * Check if the current event was caused by a button + * + * @return True if the current event was caused by a button + */ + public static boolean isEventButton() { + return event.isButton(); + } + + /** + * Check if the current event was caused by a axis + * + * @return True if the current event was caused by a axis + */ + public static boolean isEventAxis() { + return event.isAxis(); + } + + /** + * Check if the current event was caused by movement on the x-axis + * + * @return True if the current event was cause by movement on the x-axis + */ + public static boolean isEventXAxis() { + return event.isXAxis(); + } + + /** + * Check if the current event was caused by movement on the y-axis + * + * @return True if the current event was caused by movement on the y-axis + */ + public static boolean isEventYAxis() { + return event.isYAxis(); + } + + /** + * Check if the current event was cause by the POV x-axis + * + * @return True if the current event was caused by the POV x-axis + */ + public static boolean isEventPovX() { + return event.isPovX(); + } + + /** + * Check if the current event was cause by the POV x-axis + * + * @return True if the current event was caused by the POV x-axis + */ + public static boolean isEventPovY() { + return event.isPovY(); + } + + /** + * Get the timestamp assigned to the current event + * + * @return The timestamp assigned to the current event + */ + public static long getEventNanoseconds() { + return event.getTimeStamp(); + } + + /** + * Gets the state of the button that generated the current event + * + * @return True if button was down, or false if released + */ + public static boolean getEventButtonState() { + return event.getButtonState(); + } + + /** + * Get the value on an X axis of the current event + * + * @return The value on a x axis of the current event + */ + public static float getEventXAxisValue() { + return event.getXAxisValue(); + } + + /** + * Get the value on an Y axis of the current event + * + * @return The value on a y axis of the current event + */ + public static float getEventYAxisValue() { + return event.getYAxisValue(); + } + + /** + * Add an event to the stack of events that have been caused + * + * @param event The event to add to the list + */ + static void addEvent(ControllerEvent event) { + if (event != null) { + events.add(event); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Cursor.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Cursor.java new file mode 100644 index 0000000..9d094a1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Cursor.java @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferChecks; +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; + +/** + * + * A class representing a native cursor. Instances of this + * class can be used with Mouse.setCursor(), if available. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Cursor { + /** 1 bit transparency for native cursor */ + public static final int CURSOR_ONE_BIT_TRANSPARENCY = 1; + + /** 8 bit alhpa native cursor */ + public static final int CURSOR_8_BIT_ALPHA = 2; + + /** animation native cursor */ + public static final int CURSOR_ANIMATION = 4; + + /** First element to display */ + private final CursorElement[] cursors; + + /** Index into list of cursors */ + private int index; + + private boolean destroyed; + + /** + * Constructs a new Cursor, with the given parameters. Mouse must have been created before you can create + * Cursor objects. Cursor images are in ARGB format, but only one bit transparancy is guaranteed to be supported. + * So to maximize portability, lwjgl applications should only create cursor images with 0x00 or 0xff as alpha values. + * The constructor will copy the images and delays, so there's no need to keep them around. + * + * @param width cursor image width + * @param height cursor image height + * @param xHotspot the x coordinate of the cursor hotspot + * @param yHotspot the y coordinate of the cursor hotspot + * @param numImages number of cursor images specified. Must be 1 if animations are not supported. + * @param images A buffer containing the images. The origin is at the lower left corner, like OpenGL. + * @param delays An int buffer of animation frame delays, if numImages is greater than 1, else null + * @throws LWJGLException if the cursor could not be created for any reason + */ + public Cursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + synchronized (OpenGLPackageAccess.global_lock) { + if ((getCapabilities() & CURSOR_ONE_BIT_TRANSPARENCY) == 0) + throw new LWJGLException("Native cursors not supported"); + BufferChecks.checkBufferSize(images, width*height*numImages); + if (delays != null) + BufferChecks.checkBufferSize(delays, numImages); + if (!Mouse.isCreated()) + throw new IllegalStateException("Mouse must be created before creating cursor objects"); + if (width*height*numImages > images.remaining()) + throw new IllegalArgumentException("width*height*numImages > images.remaining()"); + if (xHotspot >= width || xHotspot < 0) + throw new IllegalArgumentException("xHotspot > width || xHotspot < 0"); + if (yHotspot >= height || yHotspot < 0) + throw new IllegalArgumentException("yHotspot > height || yHotspot < 0"); + + Sys.initialize(); + + // Hmm + yHotspot = height - 1 - yHotspot; + + // create cursor (or cursors if multiple images supplied) + cursors = createCursors(width, height, xHotspot, yHotspot, numImages, images, delays); + } + } + + /** + * Gets the minimum size of a native cursor. Can only be called if + * The Mouse is created and cursor caps includes at least + * CURSOR_ONE_BIT_TRANSPARANCY. + * + * @return the maximum size of a native cursor + */ + public static int getMinCursorSize() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!Mouse.isCreated()) + throw new IllegalStateException("Mouse must be created."); + return Mouse.getImplementation().getMinCursorSize(); + } + } + + /** + * Gets the maximum size of a native cursor. Can only be called if + * The Mouse is created and cursor caps includes at least + * CURSOR_ONE_BIT_TRANSPARANCY. + * + * @return the maximum size of a native cursor + */ + public static int getMaxCursorSize() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!Mouse.isCreated()) + throw new IllegalStateException("Mouse must be created."); + return Mouse.getImplementation().getMaxCursorSize(); + } + } + + /** + * Get the capabilities of the native cursor. Return a bit mask of the native cursor capabilities. + * The CURSOR_ONE_BIT_TRANSPARANCY indicates support for cursors with one bit transparancy, + * the CURSOR_8_BIT_ALPHA indicates support for 8 bit alpha and CURSOR_ANIMATION indicates + * support for cursor animations. + * + * @return A bit mask with native cursor capabilities. + */ + public static int getCapabilities() { + synchronized (OpenGLPackageAccess.global_lock) { + if (Mouse.getImplementation() != null) + return Mouse.getImplementation().getNativeCursorCapabilities(); + else + return OpenGLPackageAccess.createImplementation().getNativeCursorCapabilities(); + } + } + + /** + * Creates the actual cursor, using a platform specific class + */ + private static CursorElement[] createCursors(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + // create copy and flip images to match ogl + IntBuffer images_copy = BufferUtils.createIntBuffer(images.remaining()); + flipImages(width, height, numImages, images, images_copy); + + // Mac and Windows doesn't (afaik) allow for animation based cursors, except in the .ani + // format on Windows, which we don't support. + // The cursor animation was therefor developed using java side time tracking. + // unfortunately X flickers when changing cursor. We therefore check for either + // Windows, Mac or X and do accordingly. + // we might want to split it into a X/Win/Mac cursor if it gets too cluttered + + CursorElement[] cursors; + switch (LWJGLUtil.getPlatform()) { + case LWJGLUtil.PLATFORM_MACOSX: + + // OS X requires the image format to be in ABGR format + convertARGBtoABGR(images_copy); + + // create our cursor elements + cursors = new CursorElement[numImages]; + for(int i=0; i<numImages; i++) { + Object handle = Mouse.getImplementation().createCursor(width, height, xHotspot, yHotspot, 1, images_copy, null); + long delay = (delays != null) ? delays.get(i) : 0; + long timeout = System.currentTimeMillis(); + cursors[i] = new CursorElement(handle, delay, timeout); + + // offset to next image + images_copy.position(width*height*(i+1)); + } + break; + case LWJGLUtil.PLATFORM_WINDOWS: + // create our cursor elements + cursors = new CursorElement[numImages]; + for(int i=0; i<numImages; i++) { + + // iterate through the images, and make sure that the pixels are either 0xffxxxxxx or 0x00000000 + int size = width * height; + for(int j=0; j<size; j++) { + int index = j + (i*size); + int alpha = images_copy.get(index) >> 24 & 0xff; + if(alpha != 0xff) { + images_copy.put(index, 0); + } + } + + Object handle = Mouse.getImplementation().createCursor(width, height, xHotspot, yHotspot, 1, images_copy, null); + long delay = (delays != null) ? delays.get(i) : 0; + long timeout = System.currentTimeMillis(); + cursors[i] = new CursorElement(handle, delay, timeout); + + // offset to next image + images_copy.position(width*height*(i+1)); + } + break; + case LWJGLUtil.PLATFORM_LINUX: + // create our cursor elements + Object handle = Mouse.getImplementation().createCursor(width, height, xHotspot, yHotspot, numImages, images_copy, delays); + CursorElement cursor_element = new CursorElement(handle, -1, -1); + cursors = new CursorElement[]{cursor_element}; + break; + default: + throw new RuntimeException("Unknown OS"); + } + return cursors; + } + + /** + * Convert an IntBuffer image of ARGB format into ABGR + * + * @param imageBuffer image to convert + */ + private static void convertARGBtoABGR(IntBuffer imageBuffer) { + for (int i = 0; i < imageBuffer.limit(); i++) { + int argbColor = imageBuffer.get(i); + + byte alpha = (byte)(argbColor >>> 24); + byte blue = (byte)(argbColor >>> 16); + byte green = (byte)(argbColor >>> 8); + byte red = (byte)argbColor; + + int abgrColor = ((alpha & 0xff) << 24 ) + ((red & 0xff) << 16 ) + ((green & 0xff) << 8 ) + ((blue & 0xff) ); + + imageBuffer.put(i, abgrColor); + } + } + + /** + * Flips the images so they're oriented according to opengl + * + * @param width Width of image + * @param height Height of images + * @param numImages How many images to flip + * @param images Source images + * @param images_copy Destination images + */ + private static void flipImages(int width, int height, int numImages, IntBuffer images, IntBuffer images_copy) { + for (int i = 0; i < numImages; i++) { + int start_index = i*width*height; + flipImage(width, height, start_index, images, images_copy); + } + } + + /** + * @param width Width of image + * @param height Height of images + * @param start_index index into source buffer to copy to + * @param images Source images + * @param images_copy Destination images + */ + private static void flipImage(int width, int height, int start_index, IntBuffer images, IntBuffer images_copy) { + for (int y = 0; y < height>>1; y++) { + int index_y_1 = y*width + start_index; + int index_y_2 = (height - y - 1)*width + start_index; + for (int x = 0; x < width; x++) { + int index1 = index_y_1 + x; + int index2 = index_y_2 + x; + int temp_pixel = images.get(index1 + images.position()); + images_copy.put(index1, images.get(index2 + images.position())); + images_copy.put(index2, temp_pixel); + } + } + } + + /** + * Gets the native handle associated with the cursor object. + */ + Object getHandle() { + checkValid(); + return cursors[index].cursorHandle; + } + + private void checkValid() { + if (destroyed) + throw new IllegalStateException("The cursor is destroyed"); + } + + /** + * Destroy the native cursor. If the cursor is current, + * the current native cursor is set to null (the default + * OS cursor) + */ + public void destroy() { + synchronized (OpenGLPackageAccess.global_lock) { + if (destroyed) + return; + if (Mouse.getNativeCursor() == this) { + try { + Mouse.setNativeCursor(null); + } catch (LWJGLException e) { + // ignore + } + } + for ( CursorElement cursor : cursors ) { + Mouse.getImplementation().destroyCursor(cursor.cursorHandle); + } + destroyed = true; + } + } + + /** + * Sets the timout property to the time it should be changed + */ + protected void setTimeout() { + checkValid(); + cursors[index].timeout = System.currentTimeMillis() + cursors[index].delay; + } + + /** + * Determines whether this cursor has timed out + * @return true if the this cursor has timed out, false if not + */ + protected boolean hasTimedOut() { + checkValid(); + return cursors.length > 1 && cursors[index].timeout < System.currentTimeMillis(); + } + + /** + * Changes to the next cursor + */ + protected void nextCursor() { + checkValid(); + index = ++index % cursors.length; + } + + /** + * A single cursor element, used when animating + */ + private static class CursorElement { + /** Handle to cursor */ + final Object cursorHandle; + + /** How long a delay this element should have */ + final long delay; + + /** Absolute time this element times out */ + long timeout; + + CursorElement(Object cursorHandle, long delay, long timeout) { + this.cursorHandle = cursorHandle; + this.delay = delay; + this.timeout = timeout; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/JInputController.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/JInputController.java new file mode 100644 index 0000000..71f2997 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/JInputController.java @@ -0,0 +1,537 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import java.util.ArrayList; + +import net.java.games.input.Component; +import net.java.games.input.Component.Identifier.Axis; +import net.java.games.input.Component.Identifier.Button; +import net.java.games.input.Event; +import net.java.games.input.EventQueue; +import net.java.games.input.Rumbler; + +/** + * A wrapper round a JInput controller that attempts to make the interface + * more useable. + * + * @author Kevin Glass + */ +class JInputController implements Controller { + /** The JInput controller this class is wrapping */ + private net.java.games.input.Controller target; + /** The index that has been assigned to this controller */ + private int index; + /** The Buttons that have been detected on the JInput controller */ + private ArrayList<Component> buttons = new ArrayList<Component>(); + /** The Axes that have been detected on the JInput controller */ + private ArrayList<Component> axes = new ArrayList<Component>(); + /** The POVs that have been detected on the JInput controller */ + private ArrayList<Component> pov = new ArrayList<Component>(); + /** The rumblers exposed by the controller */ + private Rumbler[] rumblers; + /** The state of the buttons last check */ + private boolean[] buttonState; + /** The values that were read from the pov last check */ + private float[] povValues; + /** The values that were read from the axes last check */ + private float[] axesValue; + /** The maximum values read for each axis */ + private float[] axesMax; + /** The dead zones for each axis */ + private float[] deadZones; + /** The index of the X axis or -1 if no X axis is defined */ + private int xaxis = -1; + /** The index of the Y axis or -1 if no Y axis is defined */ + private int yaxis = -1; + /** The index of the X axis or -1 if no Z axis is defined */ + private int zaxis = -1; + /** The index of the RX axis or -1 if no RX axis is defined */ + private int rxaxis = -1; + /** The index of the RY axis or -1 if no RY axis is defined */ + private int ryaxis = -1; + /** The index of the RZ axis or -1 if no RZ axis is defined */ + private int rzaxis = -1; + + /** + * Create a new controller that wraps round a JInput controller and hopefully + * makes it easier to use. + * + * @param index The index this controller has been assigned to + * @param target The target JInput controller this class is wrapping + */ + JInputController(int index, net.java.games.input.Controller target) { + this.target = target; + this.index = index; + + Component[] sourceAxes = target.getComponents(); + + for ( Component sourceAxis : sourceAxes ) { + if ( sourceAxis.getIdentifier() instanceof Button ) { + buttons.add(sourceAxis); + } else if ( sourceAxis.getIdentifier().equals(Axis.POV) ) { + pov.add(sourceAxis); + } else { + axes.add(sourceAxis); + } + } + + buttonState = new boolean[buttons.size()]; + povValues = new float[pov.size()]; + axesValue = new float[axes.size()]; + int buttonsCount = 0; + int axesCount = 0; + + // initialise the state + for ( Component sourceAxis : sourceAxes ) { + if ( sourceAxis.getIdentifier() instanceof Button ) { + buttonState[buttonsCount] = sourceAxis.getPollData() != 0; + buttonsCount++; + } else if ( sourceAxis.getIdentifier().equals(Axis.POV) ) { + // no account for POV yet + // pov.add(sourceAxes[i]); + } else { + axesValue[axesCount] = sourceAxis.getPollData(); + if ( sourceAxis.getIdentifier().equals(Axis.X) ) { + xaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.Y) ) { + yaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.Z) ) { + zaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RX) ) { + rxaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RY) ) { + ryaxis = axesCount; + } + if ( sourceAxis.getIdentifier().equals(Axis.RZ) ) { + rzaxis = axesCount; + } + + axesCount++; + } + } + + axesMax = new float[axes.size()]; + deadZones = new float[axes.size()]; + + for (int i=0;i<axesMax.length;i++) { + axesMax[i] = 1.0f; + deadZones[i] = 0.05f; + } + + rumblers = target.getRumblers(); + } + + /* + * @see org.lwjgl.input.Controller#getName() + */ + public String getName() { + String name = target.getName(); + return name; + } + + /* + * @see org.lwjgl.input.Controller#getIndex() + */ + public int getIndex() { + return index; + } + + /* + * @see org.lwjgl.input.Controller#getButtonCount() + */ + public int getButtonCount() { + return buttons.size(); + } + + /* + * @see org.lwjgl.input.Controller#getButtonName(int) + */ + public String getButtonName(int index) { + return buttons.get(index).getName(); + } + + /* + * @see org.lwjgl.input.Controller#isButtonPressed(int) + */ + public boolean isButtonPressed(int index) { + return buttonState[index]; + } + + /* + * @see org.lwjgl.input.Controller#poll() + */ + public void poll() { + target.poll(); + + Event event = new Event(); + EventQueue queue = target.getEventQueue(); + + while (queue.getNextEvent(event)) { + // handle button event + if (buttons.contains(event.getComponent())) { + Component button = event.getComponent(); + int buttonIndex = buttons.indexOf(button); + buttonState[buttonIndex] = event.getValue() != 0; + + // fire button pressed event + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.BUTTON,buttonIndex, + buttonState[buttonIndex],false,false,0,0)); + } + + // handle pov events + if (pov.contains(event.getComponent())) { + Component povComponent = event.getComponent(); + int povIndex = pov.indexOf(povComponent); + float prevX = getPovX(); + float prevY = getPovY(); + povValues[povIndex] = event.getValue(); + + if (prevX != getPovX()) { + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.POVX,0,false,false)); + } + if (prevY != getPovY()) { + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.POVY,0,false,false)); + } + } + + // handle axis updates + if (axes.contains(event.getComponent())) { + Component axis = event.getComponent(); + int axisIndex = axes.indexOf(axis); + float value = axis.getPollData(); + float xaxisValue = 0; + float yaxisValue = 0; + + // fixed dead zone since most axis don't report it :( + if (Math.abs(value) < deadZones[axisIndex]) { + value = 0; + } + if (Math.abs(value) < axis.getDeadZone()) { + value = 0; + } + if (Math.abs(value) > axesMax[axisIndex]) { + axesMax[axisIndex] = Math.abs(value); + } + + // normalize the value based on maximum value read in the past + value /= axesMax[axisIndex]; + + if (axisIndex == xaxis) { + xaxisValue = value; + } + if (axisIndex == yaxis) { + yaxisValue = value; + } + + // fire event + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.AXIS,axisIndex,false, + axisIndex == xaxis,axisIndex == yaxis,xaxisValue,yaxisValue)); + axesValue[axisIndex] = value; + } + } + } + + /* + * @see org.lwjgl.input.Controller#getAxisCount() + */ + public int getAxisCount() { + return axes.size(); + } + + /* + * @see org.lwjgl.input.Controller#getAxisName(int) + */ + public String getAxisName(int index) { + return axes.get(index).getName(); + } + + /* + * @see org.lwjgl.input.Controller#getAxisValue(int) + */ + public float getAxisValue(int index) { + return axesValue[index]; + } + + /* + * @see org.lwjgl.input.Controller#getXAxisValue() + */ + public float getXAxisValue() { + if (xaxis == -1) { + return 0; + } + + return getAxisValue(xaxis); + } + + /* + * @see org.lwjgl.input.Controller#getYAxisValue() + */ + public float getYAxisValue() { + if (yaxis == -1) { + return 0; + } + + return getAxisValue(yaxis); + } + + /* + * @see org.lwjgl.input.Controller#getXAxisDeadZone() + */ + public float getXAxisDeadZone() { + if (xaxis == -1) { + return 0; + } + + return getDeadZone(xaxis); + } + + /* + * @see org.lwjgl.input.Controller#getYAxisDeadZone() + */ + public float getYAxisDeadZone() { + if (yaxis == -1) { + return 0; + } + + return getDeadZone(yaxis); + } + + /* + * @see org.lwjgl.input.Controller#setXAxisDeadZone(float) + */ + public void setXAxisDeadZone(float zone) { + setDeadZone(xaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#setYAxisDeadZone(float) + */ + public void setYAxisDeadZone(float zone) { + setDeadZone(yaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getDeadZone(int) + */ + public float getDeadZone(int index) { + return deadZones[index]; + } + + /* + * @see org.lwjgl.input.Controller#setDeadZone(int, float) + */ + public void setDeadZone(int index, float zone) { + deadZones[index] = zone; + } + + /* + * @see org.lwjgl.input.Controller#getZAxisValue() + */ + public float getZAxisValue() { + if (zaxis == -1) { + return 0; + } + + return getAxisValue(zaxis); + } + + /* + * @see org.lwjgl.input.Controller#getZAxisDeadZone() + */ + public float getZAxisDeadZone() { + if (zaxis == -1) { + return 0; + } + + return getDeadZone(zaxis); + } + + /* + * @see org.lwjgl.input.Controller#setZAxisDeadZone(float) + */ + public void setZAxisDeadZone(float zone) { + setDeadZone(zaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRXAxisValue() + */ + public float getRXAxisValue() { + if (rxaxis == -1) { + return 0; + } + + return getAxisValue(rxaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRXAxisDeadZone() + */ + public float getRXAxisDeadZone() { + if (rxaxis == -1) { + return 0; + } + + return getDeadZone(rxaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRXAxisDeadZone(float) + */ + public void setRXAxisDeadZone(float zone) { + setDeadZone(rxaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRYAxisValue() + */ + public float getRYAxisValue() { + if (ryaxis == -1) { + return 0; + } + + return getAxisValue(ryaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRYAxisDeadZone() + */ + public float getRYAxisDeadZone() { + if (ryaxis == -1) { + return 0; + } + + return getDeadZone(ryaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRYAxisDeadZone(float) + */ + public void setRYAxisDeadZone(float zone) { + setDeadZone(ryaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getRZAxisValue() + */ + public float getRZAxisValue() { + if (rzaxis == -1) { + return 0; + } + + return getAxisValue(rzaxis); + } + + /* + * @see org.lwjgl.input.Controller#getRZAxisDeadZone() + */ + public float getRZAxisDeadZone() { + if (rzaxis == -1) { + return 0; + } + + return getDeadZone(rzaxis); + } + + /* + * @see org.lwjgl.input.Controller#setRZAxisDeadZone(float) + */ + public void setRZAxisDeadZone(float zone) { + setDeadZone(rzaxis,zone); + } + + /* + * @see org.lwjgl.input.Controller#getPovX() + */ + public float getPovX() { + if (pov.size() == 0) { + return 0; + } + + float value = povValues[0]; + + if ((value == Component.POV.DOWN_LEFT) || + (value == Component.POV.UP_LEFT) || + (value == Component.POV.LEFT)) { + return -1; + } + if ((value == Component.POV.DOWN_RIGHT) || + (value == Component.POV.UP_RIGHT) || + (value == Component.POV.RIGHT)) { + return 1; + } + + return 0; + } + + /* + * @see org.lwjgl.input.Controller#getPovY() + */ + public float getPovY() { + if (pov.size() == 0) { + return 0; + } + + float value = povValues[0]; + + if ((value == Component.POV.DOWN_LEFT) || + (value == Component.POV.DOWN_RIGHT) || + (value == Component.POV.DOWN)) { + return 1; + } + if ((value == Component.POV.UP_LEFT) || + (value == Component.POV.UP_RIGHT) || + (value == Component.POV.UP)) { + return -1; + } + + return 0; + } + + public int getRumblerCount() { + return rumblers.length; + } + + public String getRumblerName(int index) { + return rumblers[index].getAxisName(); + } + + public void setRumblerStrength(int index, float strength) { + rumblers[index].rumble(strength); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Keyboard.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Keyboard.java new file mode 100644 index 0000000..054a718 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Keyboard.java @@ -0,0 +1,610 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.InputImplementation; + +/** + * <br> + * A raw Keyboard interface. This can be used to poll the current state of the + * keys, or read all the keyboard presses / releases since the last read. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class Keyboard { + /** Internal use - event size in bytes */ + public static final int EVENT_SIZE = 4 + 1 + 4 + 8 + 1; + + /** + * The special character meaning that no + * character was translated for the event. + */ + public static final int CHAR_NONE = '\0'; + + /** + * The special keycode meaning that only the + * translated character is valid. + */ + public static final int KEY_NONE = 0x00; + + public static final int KEY_ESCAPE = 0x01; + public static final int KEY_1 = 0x02; + public static final int KEY_2 = 0x03; + public static final int KEY_3 = 0x04; + public static final int KEY_4 = 0x05; + public static final int KEY_5 = 0x06; + public static final int KEY_6 = 0x07; + public static final int KEY_7 = 0x08; + public static final int KEY_8 = 0x09; + public static final int KEY_9 = 0x0A; + public static final int KEY_0 = 0x0B; + public static final int KEY_MINUS = 0x0C; /* - on main keyboard */ + public static final int KEY_EQUALS = 0x0D; + public static final int KEY_BACK = 0x0E; /* backspace */ + public static final int KEY_TAB = 0x0F; + public static final int KEY_Q = 0x10; + public static final int KEY_W = 0x11; + public static final int KEY_E = 0x12; + public static final int KEY_R = 0x13; + public static final int KEY_T = 0x14; + public static final int KEY_Y = 0x15; + public static final int KEY_U = 0x16; + public static final int KEY_I = 0x17; + public static final int KEY_O = 0x18; + public static final int KEY_P = 0x19; + public static final int KEY_LBRACKET = 0x1A; + public static final int KEY_RBRACKET = 0x1B; + public static final int KEY_RETURN = 0x1C; /* Enter on main keyboard */ + public static final int KEY_LCONTROL = 0x1D; + public static final int KEY_A = 0x1E; + public static final int KEY_S = 0x1F; + public static final int KEY_D = 0x20; + public static final int KEY_F = 0x21; + public static final int KEY_G = 0x22; + public static final int KEY_H = 0x23; + public static final int KEY_J = 0x24; + public static final int KEY_K = 0x25; + public static final int KEY_L = 0x26; + public static final int KEY_SEMICOLON = 0x27; + public static final int KEY_APOSTROPHE = 0x28; + public static final int KEY_GRAVE = 0x29; /* accent grave */ + public static final int KEY_LSHIFT = 0x2A; + public static final int KEY_BACKSLASH = 0x2B; + public static final int KEY_Z = 0x2C; + public static final int KEY_X = 0x2D; + public static final int KEY_C = 0x2E; + public static final int KEY_V = 0x2F; + public static final int KEY_B = 0x30; + public static final int KEY_N = 0x31; + public static final int KEY_M = 0x32; + public static final int KEY_COMMA = 0x33; + public static final int KEY_PERIOD = 0x34; /* . on main keyboard */ + public static final int KEY_SLASH = 0x35; /* / on main keyboard */ + public static final int KEY_RSHIFT = 0x36; + public static final int KEY_MULTIPLY = 0x37; /* * on numeric keypad */ + public static final int KEY_LMENU = 0x38; /* left Alt */ + public static final int KEY_SPACE = 0x39; + public static final int KEY_CAPITAL = 0x3A; + public static final int KEY_F1 = 0x3B; + public static final int KEY_F2 = 0x3C; + public static final int KEY_F3 = 0x3D; + public static final int KEY_F4 = 0x3E; + public static final int KEY_F5 = 0x3F; + public static final int KEY_F6 = 0x40; + public static final int KEY_F7 = 0x41; + public static final int KEY_F8 = 0x42; + public static final int KEY_F9 = 0x43; + public static final int KEY_F10 = 0x44; + public static final int KEY_NUMLOCK = 0x45; + public static final int KEY_SCROLL = 0x46; /* Scroll Lock */ + public static final int KEY_NUMPAD7 = 0x47; + public static final int KEY_NUMPAD8 = 0x48; + public static final int KEY_NUMPAD9 = 0x49; + public static final int KEY_SUBTRACT = 0x4A; /* - on numeric keypad */ + public static final int KEY_NUMPAD4 = 0x4B; + public static final int KEY_NUMPAD5 = 0x4C; + public static final int KEY_NUMPAD6 = 0x4D; + public static final int KEY_ADD = 0x4E; /* + on numeric keypad */ + public static final int KEY_NUMPAD1 = 0x4F; + public static final int KEY_NUMPAD2 = 0x50; + public static final int KEY_NUMPAD3 = 0x51; + public static final int KEY_NUMPAD0 = 0x52; + public static final int KEY_DECIMAL = 0x53; /* . on numeric keypad */ + public static final int KEY_F11 = 0x57; + public static final int KEY_F12 = 0x58; + public static final int KEY_F13 = 0x64; /* (NEC PC98) */ + public static final int KEY_F14 = 0x65; /* (NEC PC98) */ + public static final int KEY_F15 = 0x66; /* (NEC PC98) */ + public static final int KEY_F16 = 0x67; /* Extended Function keys - (Mac) */ + public static final int KEY_F17 = 0x68; + public static final int KEY_F18 = 0x69; + public static final int KEY_KANA = 0x70; /* (Japanese keyboard) */ + public static final int KEY_F19 = 0x71; /* Extended Function keys - (Mac) */ + public static final int KEY_CONVERT = 0x79; /* (Japanese keyboard) */ + public static final int KEY_NOCONVERT = 0x7B; /* (Japanese keyboard) */ + public static final int KEY_YEN = 0x7D; /* (Japanese keyboard) */ + public static final int KEY_NUMPADEQUALS = 0x8D; /* = on numeric keypad (NEC PC98) */ + public static final int KEY_CIRCUMFLEX = 0x90; /* (Japanese keyboard) */ + public static final int KEY_AT = 0x91; /* (NEC PC98) */ + public static final int KEY_COLON = 0x92; /* (NEC PC98) */ + public static final int KEY_UNDERLINE = 0x93; /* (NEC PC98) */ + public static final int KEY_KANJI = 0x94; /* (Japanese keyboard) */ + public static final int KEY_STOP = 0x95; /* (NEC PC98) */ + public static final int KEY_AX = 0x96; /* (Japan AX) */ + public static final int KEY_UNLABELED = 0x97; /* (J3100) */ + public static final int KEY_NUMPADENTER = 0x9C; /* Enter on numeric keypad */ + public static final int KEY_RCONTROL = 0x9D; + public static final int KEY_SECTION = 0xA7; /* Section symbol (Mac) */ + public static final int KEY_NUMPADCOMMA = 0xB3; /* , on numeric keypad (NEC PC98) */ + public static final int KEY_DIVIDE = 0xB5; /* / on numeric keypad */ + public static final int KEY_SYSRQ = 0xB7; + public static final int KEY_RMENU = 0xB8; /* right Alt */ + public static final int KEY_FUNCTION = 0xC4; /* Function (Mac) */ + public static final int KEY_PAUSE = 0xC5; /* Pause */ + public static final int KEY_HOME = 0xC7; /* Home on arrow keypad */ + public static final int KEY_UP = 0xC8; /* UpArrow on arrow keypad */ + public static final int KEY_PRIOR = 0xC9; /* PgUp on arrow keypad */ + public static final int KEY_LEFT = 0xCB; /* LeftArrow on arrow keypad */ + public static final int KEY_RIGHT = 0xCD; /* RightArrow on arrow keypad */ + public static final int KEY_END = 0xCF; /* End on arrow keypad */ + public static final int KEY_DOWN = 0xD0; /* DownArrow on arrow keypad */ + public static final int KEY_NEXT = 0xD1; /* PgDn on arrow keypad */ + public static final int KEY_INSERT = 0xD2; /* Insert on arrow keypad */ + public static final int KEY_DELETE = 0xD3; /* Delete on arrow keypad */ + public static final int KEY_CLEAR = 0xDA; /* Clear key (Mac) */ + public static final int KEY_LMETA = 0xDB; /* Left Windows/Option key */ + /** + * The left windows key, mapped to KEY_LMETA + * + * @deprecated Use KEY_LMETA instead + */ + public static final int KEY_LWIN = KEY_LMETA; /* Left Windows key */ + public static final int KEY_RMETA = 0xDC; /* Right Windows/Option key */ + /** + * The right windows key, mapped to KEY_RMETA + * + * @deprecated Use KEY_RMETA instead + */ + public static final int KEY_RWIN = KEY_RMETA; /* Right Windows key */ + public static final int KEY_APPS = 0xDD; /* AppMenu key */ + public static final int KEY_POWER = 0xDE; + public static final int KEY_SLEEP = 0xDF; + +/* public static final int STATE_ON = 0; + public static final int STATE_OFF = 1; + public static final int STATE_UNKNOWN = 2; +*/ + public static final int KEYBOARD_SIZE = 256; + + /** Buffer size in events */ + private static final int BUFFER_SIZE = 50; + + /** Key names */ + private static final String[] keyName = new String[KEYBOARD_SIZE]; + private static final Map<String, Integer> keyMap = new HashMap<String, Integer>(253); + private static int counter; + + static { + // Use reflection to find out key names + Field[] fields = Keyboard.class.getFields(); + try { + for ( Field field : fields ) { + if ( Modifier.isStatic(field.getModifiers()) + && Modifier.isPublic(field.getModifiers()) + && Modifier.isFinal(field.getModifiers()) + && field.getType().equals(int.class) + && field.getName().startsWith("KEY_") + && !field.getName().endsWith("WIN") ) { /* Don't use deprecated names */ + + int key = field.getInt(null); + String name = field.getName().substring(4); + keyName[key] = name; + keyMap.put(name, key); + counter++; + } + + } + } catch (Exception e) { + } + + } + + /** The number of keys supported */ + private static final int keyCount = counter; + + /** Has the keyboard been created? */ + private static boolean created; + + /** Are repeat events enabled? */ + private static boolean repeat_enabled; + + /** The keys status from the last poll */ + private static final ByteBuffer keyDownBuffer = BufferUtils.createByteBuffer(KEYBOARD_SIZE); + + /** + * The key events from the last read: a sequence of pairs of key number, + * followed by state. The state is followed by + * a 4 byte code point representing the translated character. + */ + private static ByteBuffer readBuffer; + + /** current event */ + private static KeyEvent current_event = new KeyEvent(); + + /** scratch event */ + private static KeyEvent tmp_event = new KeyEvent(); + + /** One time initialization */ + private static boolean initialized; + + private static InputImplementation implementation; + + /** + * Keyboard cannot be constructed. + */ + private Keyboard() { + } + + /** + * Static initialization + */ + private static void initialize() { + if (initialized) + return; + Sys.initialize(); + initialized = true; + } + + /** + * "Create" the keyboard with the given implementation. This is used + * reflectively from AWTInputAdapter. + * + * @throws LWJGLException if the keyboard could not be created for any reason + */ + private static void create(InputImplementation impl) throws LWJGLException { + if (created) + return; + if (!initialized) + initialize(); + implementation = impl; + implementation.createKeyboard(); + created = true; + readBuffer = ByteBuffer.allocate(EVENT_SIZE*BUFFER_SIZE); + reset(); + } + + /** + * "Create" the keyboard. The display must first have been created. The + * reason for this is so the keyboard has a window to "focus" in. + * + * @throws LWJGLException if the keyboard could not be created for any reason + */ + public static void create() throws LWJGLException { + synchronized (OpenGLPackageAccess.global_lock) { + if (!Display.isCreated()) throw new IllegalStateException("Display must be created."); + + create(OpenGLPackageAccess.createImplementation()); + } + } + + private static void reset() { + readBuffer.limit(0); + for (int i = 0; i < keyDownBuffer.remaining(); i++) + keyDownBuffer.put(i, (byte)0); + current_event.reset(); + } + + /** + * @return true if the keyboard has been created + */ + public static boolean isCreated() { + synchronized (OpenGLPackageAccess.global_lock) { + return created; + } + } + + /** + * "Destroy" the keyboard + */ + public static void destroy() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) + return; + created = false; + implementation.destroyKeyboard(); + reset(); + } + } + + /** + * Polls the keyboard for its current state. Access the polled values using the + * <code>isKeyDown</code> method. + * By using this method, it is possible to "miss" keyboard keys if you don't + * poll fast enough. + * + * To use buffered values, you have to call <code>next</code> for each event you + * want to read. You can query which key caused the event by using + * <code>getEventKey</code>. To get the state of that key, for that event, use + * <code>getEventKeyState</code> - finally use <code>getEventCharacter</code> to get the + * character for that event. + * + * NOTE: This method does not query the operating system for new events. To do that, + * Display.processMessages() (or Display.update()) must be called first. + * + * @see org.lwjgl.input.Keyboard#isKeyDown(int key) + * @see org.lwjgl.input.Keyboard#next() + * @see org.lwjgl.input.Keyboard#getEventKey() + * @see org.lwjgl.input.Keyboard#getEventKeyState() + * @see org.lwjgl.input.Keyboard#getEventCharacter() + */ + public static void poll() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can poll the device"); + implementation.pollKeyboard(keyDownBuffer); + read(); + } + } + + private static void read() { + readBuffer.compact(); + implementation.readKeyboard(readBuffer); + readBuffer.flip(); + } + + /** + * Checks to see if a key is down. + * @param key Keycode to check + * @return true if the key is down according to the last poll() + */ + public static boolean isKeyDown(int key) { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can query key state"); + return keyDownBuffer.get(key) != 0; + } + } + + /** + * Checks whether one of the state keys are "active" + * + * @param key State key to test (KEY_CAPITAL | KEY_NUMLOCK | KEY_SYSRQ) + * @return STATE_ON if on, STATE_OFF if off and STATE_UNKNOWN if the state is unknown + */ +/* public static int isStateKeySet(int key) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can query key state"); + return implementation.isStateKeySet(key); + } +*/ + /** + * Gets a key's name + * @param key The key + * @return a String with the key's human readable name in it or null if the key is unnamed + */ + public static synchronized String getKeyName(int key) { + return keyName[key]; + } + + /** + * Get's a key's index. If the key is unrecognised then KEY_NONE is returned. + * @param keyName The key name + */ + public static synchronized int getKeyIndex(String keyName) { + Integer ret = keyMap.get(keyName); + if (ret == null) + return KEY_NONE; + else + return ret; + } + + /** + * Gets the number of keyboard events waiting after doing a buffer enabled poll(). + * @return the number of keyboard events + */ + public static int getNumKeyboardEvents() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can read events"); + int old_position = readBuffer.position(); + int num_events = 0; + while (readNext(tmp_event) && (!tmp_event.repeat || repeat_enabled)) + num_events++; + readBuffer.position(old_position); + return num_events; + } + } + + /** + * Gets the next keyboard event. You can query which key caused the event by using + * <code>getEventKey</code>. To get the state of that key, for that event, use + * <code>getEventKeyState</code> - finally use <code>getEventCharacter</code> to get the + * character for that event. + * + * @see org.lwjgl.input.Keyboard#getEventKey() + * @see org.lwjgl.input.Keyboard#getEventKeyState() + * @see org.lwjgl.input.Keyboard#getEventCharacter() + * @return true if a keyboard event was read, false otherwise + */ + public static boolean next() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) + throw new IllegalStateException("Keyboard must be created before you can read events"); + + boolean result; + while ((result = readNext(current_event)) && current_event.repeat && !repeat_enabled) + ; + return result; + } + } + + /** + * Controls whether repeat events are reported or not. If repeat events + * are enabled, key down events are reported when a key is pressed and held for + * a OS dependent amount of time. To distinguish a repeat event from a normal event, + * use isRepeatEvent(). + * + * @see org.lwjgl.input.Keyboard#getEventKey() + */ + public static void enableRepeatEvents(boolean enable) { + synchronized (OpenGLPackageAccess.global_lock) { + repeat_enabled = enable; + } + } + + /** + * Check whether repeat events are currently reported or not. + * + * @return true is repeat events are reported, false if not. + * @see org.lwjgl.input.Keyboard#getEventKey() + */ + public static boolean areRepeatEventsEnabled() { + synchronized (OpenGLPackageAccess.global_lock) { + return repeat_enabled; + } + } + + private static boolean readNext(KeyEvent event) { + if (readBuffer.hasRemaining()) { + event.key = readBuffer.getInt() & 0xFF; + event.state = readBuffer.get() != 0; + event.character = readBuffer.getInt(); + event.nanos = readBuffer.getLong(); + event.repeat = readBuffer.get() == 1; + return true; + } else + return false; + } + + /** + * @return Number of keys on this keyboard + */ + public static int getKeyCount() { + return keyCount; + } + + /** + * @return The character from the current event + */ + public static char getEventCharacter() { + synchronized (OpenGLPackageAccess.global_lock) { + return (char)current_event.character; + } + } + + /** + * Please note that the key code returned is NOT valid against the + * current keyboard layout. To get the actual character pressed call + * getEventCharacter + * + * @return The key from the current event + */ + public static int getEventKey() { + synchronized (OpenGLPackageAccess.global_lock) { + return current_event.key; + } + } + + /** + * Gets the state of the key that generated the + * current event + * + * @return True if key was down, or false if released + */ + public static boolean getEventKeyState() { + synchronized (OpenGLPackageAccess.global_lock) { + return current_event.state; + } + } + + /** + * Gets the time in nanoseconds of the current event. + * Only useful for relative comparisons with other + * Keyboard events, as the absolute time has no defined + * origin. + * @return The time in nanoseconds of the current event + */ + public static long getEventNanoseconds() { + synchronized (OpenGLPackageAccess.global_lock) { + return current_event.nanos; + } + } + + /** + * @see org.lwjgl.input.Keyboard#enableRepeatEvents(boolean) + * @return true if the current event is a repeat event, false if + * the current event is not a repeat even or if repeat events are disabled. + */ + public static boolean isRepeatEvent() { + synchronized (OpenGLPackageAccess.global_lock) { + return current_event.repeat; + } + } + + private static final class KeyEvent { + /** The current keyboard character being examined */ + private int character; + + /** The current keyboard event key being examined */ + private int key; + + /** The current state of the key being examined in the event queue */ + private boolean state; + + /** The current event time */ + private long nanos; + + /** Is the current event a repeated event? */ + private boolean repeat; + + private void reset() { + character = 0; + key = 0; + state = false; + repeat = false; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Mouse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Mouse.java new file mode 100644 index 0000000..b256346 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/Mouse.java @@ -0,0 +1,712 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.HashMap; +import java.util.Map; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.InputImplementation; + + +/** + * <br> + * A raw Mouse interface. This can be used to poll the current state of the + * mouse buttons, and determine the mouse movement delta since the last poll. + * + * n buttons supported, n being a native limit. A scrolly wheel is also + * supported, if one such is available. Movement is reported as delta from + * last position or as an absolute position. If the window has been created + * the absolute position will be clamped to 0 - width | height. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class Mouse { + /** Internal use - event size in bytes */ + public static final int EVENT_SIZE = 1 + 1 + 4 + 4 + 4 + 8; + + /** Has the mouse been created? */ + private static boolean created; + + /** The mouse buttons status from the last poll */ + private static ByteBuffer buttons; + + /** Mouse absolute X position in pixels */ + private static int x; + + /** Mouse absolute Y position in pixels */ + private static int y; + + /** Mouse absolute X position in pixels without any clipping */ + private static int absolute_x; + + /** Mouse absolute Y position in pixels without any clipping */ + private static int absolute_y; + + /** Buffer to hold the deltas dx, dy and dwheel */ + private static IntBuffer coord_buffer; + + /** Delta X */ + private static int dx; + + /** Delta Y */ + private static int dy; + + /** Delta Z */ + private static int dwheel; + + /** Number of buttons supported by the mouse */ + private static int buttonCount = -1; + + /** Does this mouse support a scroll wheel */ + private static boolean hasWheel; + + /** The current native cursor, if any */ + private static Cursor currentCursor; + + /** Button names. These are set upon create(), to names like BUTTON0, BUTTON1, etc. */ + private static String[] buttonName; + + /** hashmap of button names, for fast lookup */ + private static final Map<String, Integer> buttonMap = new HashMap<String, Integer>(16); + + /** Lazy initialization */ + private static boolean initialized; + + /** The mouse button events from the last read */ + private static ByteBuffer readBuffer; + + /** The current mouse event button being examined */ + private static int eventButton; + + /** The current state of the button being examined in the event queue */ + private static boolean eventState; + + /** The current delta of the mouse in the event queue */ + private static int event_dx; + private static int event_dy; + private static int event_dwheel; + /** The current absolute position of the mouse in the event queue */ + private static int event_x; + private static int event_y; + private static long event_nanos; + /** The position of the mouse it was grabbed at */ + private static int grab_x; + private static int grab_y; + /** The last absolute mouse event position (before clipping) for delta computation */ + private static int last_event_raw_x; + private static int last_event_raw_y; + + /** Buffer size in events */ + private static final int BUFFER_SIZE = 50; + + private static boolean isGrabbed; + + private static InputImplementation implementation; + + /** Whether we need cursor animation emulation */ + private static final boolean emulateCursorAnimation = LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_WINDOWS || + LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX; + + private static boolean clipMouseCoordinatesToWindow = !getPrivilegedBoolean("org.lwjgl.input.Mouse.allowNegativeMouseCoords"); + + /** + * Mouse cannot be constructed. + */ + private Mouse() { + } + + /** + * Gets the currently bound native cursor, if any. + * + * @return the currently bound native cursor, if any. + */ + public static Cursor getNativeCursor() { + synchronized (OpenGLPackageAccess.global_lock) { + return currentCursor; + } + } + + /** + * Binds a native cursor. If the cursor argument is null, any + * currently bound native cursor is disabled, and the cursor reverts + * to the default operating system supplied cursor. + * + * NOTE: The native cursor is not constrained to the window, but + * relative events will not be generated if the cursor is outside. + * + * @param cursor the native cursor object to bind. May be null. + * @return The previous Cursor object set, or null. + * @throws LWJGLException if the cursor could not be set for any reason + */ + public static Cursor setNativeCursor(Cursor cursor) throws LWJGLException { + synchronized (OpenGLPackageAccess.global_lock) { + if ((Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) == 0) + throw new IllegalStateException("Mouse doesn't support native cursors"); + Cursor oldCursor = currentCursor; + currentCursor = cursor; + if (isCreated()) { + if (currentCursor != null) { + implementation.setNativeCursor(currentCursor.getHandle()); + currentCursor.setTimeout(); + } else { + implementation.setNativeCursor(null); + } + } + return oldCursor; + } + } + + public static boolean isClipMouseCoordinatesToWindow() { + return clipMouseCoordinatesToWindow; + } + + public static void setClipMouseCoordinatesToWindow(boolean clip) { + clipMouseCoordinatesToWindow = clip; + } + + /** + * Set the position of the cursor. If the cursor is not grabbed, + * the native cursor is moved to the new position. + * + * @param new_x The x coordinate of the new cursor position in OpenGL coordinates relative + * to the window origin. + * @param new_y The y coordinate of the new cursor position in OpenGL coordinates relative + * to the window origin. + */ + public static void setCursorPosition(int new_x, int new_y) { + synchronized (OpenGLPackageAccess.global_lock) { + if (!isCreated()) + throw new IllegalStateException("Mouse is not created"); + x = event_x = new_x; + y = event_y = new_y; + if (!isGrabbed() && (Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) != 0) { + implementation.setCursorPosition(x, y); + } + else { + grab_x = new_x; + grab_y = new_y; + } + } + } + + /** + * Static initialization + */ + private static void initialize() { + Sys.initialize(); + + // Assign names to all the buttons + buttonName = new String[16]; + for (int i = 0; i < 16; i++) { + buttonName[i] = "BUTTON" + i; + buttonMap.put(buttonName[i], i); + } + + initialized = true; + } + + private static void resetMouse() { + dx = dy = dwheel = 0; + readBuffer.position(readBuffer.limit()); + } + + static InputImplementation getImplementation() { + return implementation; + } + + /** + * "Create" the mouse with the given custom implementation. This is used + * reflectively by AWTInputAdapter. + * + * @throws LWJGLException if the mouse could not be created for any reason + */ + private static void create(InputImplementation impl) throws LWJGLException { + if (created) + return; + if (!initialized) + initialize(); + implementation = impl; + implementation.createMouse(); + hasWheel = implementation.hasWheel(); + created = true; + + // set mouse buttons + buttonCount = implementation.getButtonCount(); + buttons = BufferUtils.createByteBuffer(buttonCount); + coord_buffer = BufferUtils.createIntBuffer(3); + if (currentCursor != null && implementation.getNativeCursorCapabilities() != 0) + setNativeCursor(currentCursor); + readBuffer = ByteBuffer.allocate(EVENT_SIZE * BUFFER_SIZE); + readBuffer.limit(0); + setGrabbed(isGrabbed); + } + + /** + * "Create" the mouse. The display must first have been created. + * Initially, the mouse is not grabbed and the delta values are reported + * with respect to the center of the display. + * + * @throws LWJGLException if the mouse could not be created for any reason + */ + public static void create() throws LWJGLException { + synchronized (OpenGLPackageAccess.global_lock) { + if (!Display.isCreated()) throw new IllegalStateException("Display must be created."); + + create(OpenGLPackageAccess.createImplementation()); + } + } + + /** + * @return true if the mouse has been created + */ + public static boolean isCreated() { + synchronized (OpenGLPackageAccess.global_lock) { + return created; + } + } + + /** + * "Destroy" the mouse. + */ + public static void destroy() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) return; + created = false; + buttons = null; + coord_buffer = null; + + implementation.destroyMouse(); + } + } + + /** + * Polls the mouse for its current state. Access the polled values using the + * get<value> methods. + * By using this method, it is possible to "miss" mouse click events if you don't + * poll fast enough. + * + * To use buffered values, you have to call <code>next</code> for each event you + * want to read. You can query which button caused the event by using + * <code>getEventButton</code>. To get the state of that button, for that event, use + * <code>getEventButtonState</code>. + * + * NOTE: This method does not query the operating system for new events. To do that, + * Display.processMessages() (or Display.update()) must be called first. + * + * @see org.lwjgl.input.Mouse#next() + * @see org.lwjgl.input.Mouse#getEventButton() + * @see org.lwjgl.input.Mouse#getEventButtonState() + * @see org.lwjgl.input.Mouse#isButtonDown(int button) + * @see org.lwjgl.input.Mouse#getX() + * @see org.lwjgl.input.Mouse#getY() + * @see org.lwjgl.input.Mouse#getDX() + * @see org.lwjgl.input.Mouse#getDY() + * @see org.lwjgl.input.Mouse#getDWheel() + */ + public static void poll() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) throw new IllegalStateException("Mouse must be created before you can poll it"); + implementation.pollMouse(coord_buffer, buttons); + + /* If we're grabbed, poll returns mouse deltas, if not it returns absolute coordinates */ + int poll_coord1 = coord_buffer.get(0); + int poll_coord2 = coord_buffer.get(1); + /* The wheel is always relative */ + int poll_dwheel = coord_buffer.get(2); + + if (isGrabbed()) { + dx += poll_coord1; + dy += poll_coord2; + x += poll_coord1; + y += poll_coord2; + absolute_x += poll_coord1; + absolute_y += poll_coord2; + } else { + dx = poll_coord1 - absolute_x; + dy = poll_coord2 - absolute_y; + absolute_x = x = poll_coord1; + absolute_y = y = poll_coord2; + } + + if(clipMouseCoordinatesToWindow) { + x = Math.min(Display.getWidth() - 1, Math.max(0, x)); + y = Math.min(Display.getHeight() - 1, Math.max(0, y)); + } + + dwheel += poll_dwheel; + read(); + } + } + + private static void read() { + readBuffer.compact(); + implementation.readMouse(readBuffer); + readBuffer.flip(); + } + + /** + * See if a particular mouse button is down. + * + * @param button The index of the button you wish to test (0..getButtonCount-1) + * @return true if the specified button is down + */ + public static boolean isButtonDown(int button) { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) throw new IllegalStateException("Mouse must be created before you can poll the button state"); + if (button >= buttonCount || button < 0) + return false; + else + return buttons.get(button) == 1; + } + } + + /** + * Gets a button's name + * @param button The button + * @return a String with the button's human readable name in it or null if the button is unnamed + */ + public static String getButtonName(int button) { + synchronized (OpenGLPackageAccess.global_lock) { + if (button >= buttonName.length || button < 0) + return null; + else + return buttonName[button]; + } + } + + /** + * Get's a button's index. If the button is unrecognised then -1 is returned. + * @param buttonName The button name + */ + public static int getButtonIndex(String buttonName) { + synchronized (OpenGLPackageAccess.global_lock) { + Integer ret = buttonMap.get(buttonName); + if (ret == null) + return -1; + else + return ret; + } + } + + /** + * Gets the next mouse event. You can query which button caused the event by using + * <code>getEventButton()</code> (if any). To get the state of that key, for that event, use + * <code>getEventButtonState</code>. To get the current mouse delta values use <code>getEventDX()</code> + * and <code>getEventDY()</code>. + * @see org.lwjgl.input.Mouse#getEventButton() + * @see org.lwjgl.input.Mouse#getEventButtonState() + * @return true if a mouse event was read, false otherwise + */ + public static boolean next() { + synchronized (OpenGLPackageAccess.global_lock) { + if (!created) throw new IllegalStateException("Mouse must be created before you can read events"); + if (readBuffer.hasRemaining()) { + eventButton = readBuffer.get(); + eventState = readBuffer.get() != 0; + if (isGrabbed()) { + event_dx = readBuffer.getInt(); + event_dy = readBuffer.getInt(); + event_x += event_dx; + event_y += event_dy; + last_event_raw_x = event_x; + last_event_raw_y = event_y; + } else { + int new_event_x = readBuffer.getInt(); + int new_event_y = readBuffer.getInt(); + event_dx = new_event_x - last_event_raw_x; + event_dy = new_event_y - last_event_raw_y; + event_x = new_event_x; + event_y = new_event_y; + last_event_raw_x = new_event_x; + last_event_raw_y = new_event_y; + } + if(clipMouseCoordinatesToWindow) { + event_x = Math.min(Display.getWidth() - 1, Math.max(0, event_x)); + event_y = Math.min(Display.getHeight() - 1, Math.max(0, event_y)); + } + event_dwheel = readBuffer.getInt(); + event_nanos = readBuffer.getLong(); + return true; + } else + return false; + } + } + + /** + * @return Current events button. Returns -1 if no button state was changed + */ + public static int getEventButton() { + synchronized (OpenGLPackageAccess.global_lock) { + return eventButton; + } + } + + /** + * Get the current events button state. + * @return Current events button state. + */ + public static boolean getEventButtonState() { + synchronized (OpenGLPackageAccess.global_lock) { + return eventState; + } + } + + /** + * @return Current events delta x. + */ + public static int getEventDX() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_dx; + } + } + + /** + * @return Current events delta y. + */ + public static int getEventDY() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_dy; + } + } + + /** + * @return Current events absolute x. + */ + public static int getEventX() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_x; + } + } + + /** + * @return Current events absolute y. + */ + public static int getEventY() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_y; + } + } + + /** + * @return Current events delta z + */ + public static int getEventDWheel() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_dwheel; + } + } + + /** + * Gets the time in nanoseconds of the current event. + * Only useful for relative comparisons with other + * Mouse events, as the absolute time has no defined + * origin. + * + * @return The time in nanoseconds of the current event + */ + public static long getEventNanoseconds() { + synchronized (OpenGLPackageAccess.global_lock) { + return event_nanos; + } + } + + /** + * Retrieves the absolute position. It will be clamped to + * 0...width-1. + * + * @return Absolute x axis position of mouse + */ + public static int getX() { + synchronized (OpenGLPackageAccess.global_lock) { + return x; + } + } + + /** + * Retrieves the absolute position. It will be clamped to + * 0...height-1. + * + * @return Absolute y axis position of mouse + */ + public static int getY() { + synchronized (OpenGLPackageAccess.global_lock) { + return y; + } + } + + /** + * @return Movement on the x axis since last time getDX() was called. + */ + public static int getDX() { + synchronized (OpenGLPackageAccess.global_lock) { + int result = dx; + dx = 0; + return result; + } + } + + /** + * @return Movement on the y axis since last time getDY() was called. + */ + public static int getDY() { + synchronized (OpenGLPackageAccess.global_lock) { + int result = dy; + dy = 0; + return result; + } + } + + /** + * @return Movement of the wheel since last time getDWheel() was called + */ + public static int getDWheel() { + synchronized (OpenGLPackageAccess.global_lock) { + int result = dwheel; + dwheel = 0; + return result; + } + } + + /** + * @return Number of buttons on this mouse + */ + public static int getButtonCount() { + synchronized (OpenGLPackageAccess.global_lock) { + return buttonCount; + } + } + + /** + * @return Whether or not this mouse has wheel support + */ + public static boolean hasWheel() { + synchronized (OpenGLPackageAccess.global_lock) { + return hasWheel; + } + } + + /** + * @return whether or not the mouse has grabbed the cursor + */ + public static boolean isGrabbed() { + synchronized (OpenGLPackageAccess.global_lock) { + return isGrabbed; + } + } + + /** + * Sets whether or not the mouse has grabbed the cursor + * (and thus hidden). If grab is false, the getX() and getY() + * will return delta movement in pixels clamped to the display + * dimensions, from the center of the display. + * + * @param grab whether the mouse should be grabbed + */ + public static void setGrabbed(boolean grab) { + synchronized (OpenGLPackageAccess.global_lock) { + boolean grabbed = isGrabbed; + isGrabbed = grab; + if (isCreated()) { + if (grab && !grabbed) { + // store location mouse was grabbed + grab_x = x; + grab_y = y; + } + else if (!grab && grabbed) { + // move mouse back to location it was grabbed before ungrabbing + if ((Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) != 0) + implementation.setCursorPosition(grab_x, grab_y); + } + + implementation.grabMouse(grab); + // Get latest values from native side + poll(); + event_x = x; + event_y = y; + last_event_raw_x = x; + last_event_raw_y = y; + resetMouse(); + } + } + } + + /** + * Updates the cursor, so that animation can be changed if needed. + * This method is called automatically by the window on its update, and + * shouldn't be called otherwise + */ + public static void updateCursor() { + synchronized (OpenGLPackageAccess.global_lock) { + if (emulateCursorAnimation && currentCursor != null && currentCursor.hasTimedOut() && Mouse.isInsideWindow()) { + currentCursor.nextCursor(); + try { + setNativeCursor(currentCursor); + } catch (LWJGLException e) { + if (LWJGLUtil.DEBUG) e.printStackTrace(); + } + } + } + } + + /** Gets a boolean property as a privileged action. */ + static boolean getPrivilegedBoolean(final String property_name) { + Boolean value = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + public Boolean run() { + return Boolean.getBoolean(property_name); + } + }); + return value; + } + + /** + * Retrieves whether or not the mouse cursor is within the bounds of the window. + * If the mouse cursor was moved outside the display during a drag, then the result of calling + * this method will be true until the button is released. + * @return true if mouse is inside display, false otherwise. + */ + public static boolean isInsideWindow() { + return implementation.isInsideWindow(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/OpenGLPackageAccess.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/OpenGLPackageAccess.java new file mode 100644 index 0000000..9f1b442 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/input/OpenGLPackageAccess.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.input; + +import org.lwjgl.opengl.InputImplementation; +import org.lwjgl.opengl.Display; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; +import java.security.PrivilegedActionException; + +/** + * This class contains utilities for accessing the org.lwjgl.opengl + * package through (privileged) reflection. + */ +final class OpenGLPackageAccess { + static final Object global_lock; + + static { + try { + global_lock = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { + public Object run() throws Exception { + Field lock_field = Class.forName("org.lwjgl.opengl.GlobalLock").getDeclaredField("lock"); + lock_field.setAccessible(true); + return lock_field.get(null); + } + }); + } catch (PrivilegedActionException e) { + throw new Error(e); + } + } + + static InputImplementation createImplementation() { + /* Use reflection since we can't make Display.getImplementation + * public + */ + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction<InputImplementation>() { + public InputImplementation run() throws Exception { + Method getImplementation_method = Display.class.getDeclaredMethod("getImplementation"); + getImplementation_method.setAccessible(true); + return (InputImplementation)getImplementation_method.invoke(null); + } + }); + } catch (PrivilegedActionException e) { + throw new Error(e); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/AL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/AL.java new file mode 100644 index 0000000..3e997b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/AL.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; + +/** + * <p> + * The AL class implements the actual creation code for linking to the native library + * OpenAL. + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public final class AL { + /** ALCdevice instance. */ + static ALCdevice device; + + /** Current ALCcontext. */ + static ALCcontext context; + + /** Have we been created? */ + private static boolean created; + + static { + Sys.initialize(); + } + + private AL() { + } + + /** + * Native method to create AL instance + * + * @param oalPath Path to search for OpenAL library + */ + private static native void nCreate(String oalPath) throws LWJGLException; + + /** + * Native method to create AL instance from the Mac OS X 10.4 OpenAL framework. + * It is only defined in the Mac OS X native library. + */ + private static native void nCreateDefault() throws LWJGLException; + + /** + * Native method the destroy the AL + */ + private static native void nDestroy(); + + /** + * @return true if AL has been created + */ + public static boolean isCreated() { + return created; + } + + /** + * Creates an OpenAL instance. Using this constructor will cause OpenAL to + * open the device using supplied device argument, and create a context using the context values + * supplied. + * + * @param deviceArguments Arguments supplied to native device + * @param contextFrequency Frequency for mixing output buffer, in units of Hz (Common values include 11025, 22050, and 44100). + * @param contextRefresh Refresh intervalls, in units of Hz. + * @param contextSynchronized Flag, indicating a synchronous context.* + */ + public static void create(String deviceArguments, int contextFrequency, int contextRefresh, boolean contextSynchronized) + throws LWJGLException { + create(deviceArguments, contextFrequency, contextRefresh, contextSynchronized, true); + } + + /** + * @param openDevice Whether to automatically open the device + * @see #create(String, int, int, boolean) + */ + public static void create(String deviceArguments, int contextFrequency, int contextRefresh, boolean contextSynchronized, boolean openDevice) + throws LWJGLException { + + if (created) + throw new IllegalStateException("Only one OpenAL context may be instantiated at any one time."); + String libname; + String[] library_names; + switch (LWJGLUtil.getPlatform()) { + case LWJGLUtil.PLATFORM_WINDOWS: + libname = "OpenAL32"; + library_names = new String[]{"OpenAL64.dll", "OpenAL32.dll"}; + break; + case LWJGLUtil.PLATFORM_LINUX: + libname = "openal"; + library_names = new String[]{"libopenal64.so", "libopenal.so", "libopenal.so.0"}; + break; + case LWJGLUtil.PLATFORM_MACOSX: + libname = "openal"; + library_names = new String[]{"openal.dylib"}; + break; + default: + throw new LWJGLException("Unknown platform: " + LWJGLUtil.getPlatform()); + } + String[] oalPaths = LWJGLUtil.getLibraryPaths(libname, library_names, AL.class.getClassLoader()); + LWJGLUtil.log("Found " + oalPaths.length + " OpenAL paths"); + for ( String oalPath : oalPaths ) { + try { + nCreate(oalPath); + created = true; + init(deviceArguments, contextFrequency, contextRefresh, contextSynchronized, openDevice); + break; + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to load " + oalPath + ": " + e.getMessage()); + } + } + if (!created && LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX) { + // Try to load OpenAL from the framework instead + nCreateDefault(); + created = true; + init(deviceArguments, contextFrequency, contextRefresh, contextSynchronized, openDevice); + } + if (!created) + throw new LWJGLException("Could not locate OpenAL library."); + } + + private static void init(String deviceArguments, int contextFrequency, int contextRefresh, boolean contextSynchronized, boolean openDevice) throws LWJGLException { + try { + AL10.initNativeStubs(); + ALC10.initNativeStubs(); + + if(openDevice) { + device = ALC10.alcOpenDevice(deviceArguments); + if (device == null) { + throw new LWJGLException("Could not open ALC device"); + } + + if (contextFrequency == -1) { + context = ALC10.alcCreateContext(device, null); + } else { + context = ALC10.alcCreateContext(device, + ALCcontext.createAttributeList(contextFrequency, contextRefresh, + contextSynchronized ? ALC10.ALC_TRUE : ALC10.ALC_FALSE)); + } + ALC10.alcMakeContextCurrent(context); + } + } catch (LWJGLException e) { + destroy(); + throw e; + } + + ALC11.initialize(); + + // Load EFX10 native stubs if ALC_EXT_EFX is supported. + // Is there any situation where the current device supports ALC_EXT_EFX and one + // later created by the user does not? + // Do we have to call resetNativeStubs(EFX10.class); somewhere? Not done for AL11 + // either. + // This can either be here or in ALC11, since ALC_EXT_EFX indirectly requires AL 1.1 + // for functions like alSource3i. + if (ALC10.alcIsExtensionPresent(device, EFX10.ALC_EXT_EFX_NAME)){ + EFX10.initNativeStubs(); + } + } + + /** + * Creates an OpenAL instance. The empty create will cause OpenAL to + * open the default device, and create a context using default values. + * This method used to use default values that the OpenAL implementation + * chose but this produces unexpected results on some systems; so now + * it defaults to 44100Hz mixing @ 60Hz refresh. + */ + public static void create() throws LWJGLException { + create(null, 44100, 60, false); + } + + /** + * Exit cleanly by calling destroy. + */ + public static void destroy() { + if (context != null) { + ALC10.alcMakeContextCurrent(null); + ALC10.alcDestroyContext(context); + context = null; + } + if (device != null) { + boolean result = ALC10.alcCloseDevice(device); + device = null; + } + resetNativeStubs(AL10.class); + resetNativeStubs(AL11.class); + resetNativeStubs(ALC10.class); + resetNativeStubs(ALC11.class); + resetNativeStubs(EFX10.class); + + if (created) + nDestroy(); + created = false; + } + + private static native void resetNativeStubs(Class clazz); + + /** + * @return handle to the default AL context. + */ + public static ALCcontext getContext() { + return context; + } + + /** + * @return handle to the default AL device. + */ + public static ALCdevice getDevice() { + return device; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC10.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC10.java new file mode 100644 index 0000000..bd6f5dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC10.java @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.HashMap; + +import org.lwjgl.BufferChecks; +import org.lwjgl.LWJGLException; +import org.lwjgl.MemoryUtil; + +/** + * + * <p> + * ALC introduces the notion of a Device. A Device can be, depending on the + * implementation, a hardware device, or a daemon/OS service/actual server. This + * mechanism also permits different drivers (and hardware) to coexist within the same + * system, as well as allowing several applications to share system resources for audio, + * including a single hardware output device. The details are left to the + * implementation, which has to map the available backends to unique device + * specifiers (represented as strings). + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2286 $ + * $Id: ALC.java 2286 2006-03-23 19:32:21 +0000 (to, 23 mar 2006) matzon $ + */ +public final class ALC10 { + + /** List of active contexts */ + static final HashMap<Long, ALCcontext> contexts = new HashMap<Long, ALCcontext>(); + + /** List of active devices */ + static final HashMap<Long, ALCdevice> devices = new HashMap<Long, ALCdevice>(); + + /** Bad value */ + public static final int ALC_INVALID = 0; + + /** Boolean False */ + public static final int ALC_FALSE = 0; + + /** Boolean True */ + public static final int ALC_TRUE = 1; + + /** Errors: No Error */ + public static final int ALC_NO_ERROR = ALC_FALSE; + + /** Major version query. */ + public static final int ALC_MAJOR_VERSION = 0x1000; + + /** Minor version query. */ + public static final int ALC_MINOR_VERSION = 0x1001; + + /** + * The size required for the zero-terminated attributes list, for the current context. + **/ + public static final int ALC_ATTRIBUTES_SIZE = 0x1002; + + /** + * Expects a destination of ALC_CURRENT_ATTRIBUTES_SIZE, + * and provides the attribute list for the current context of the specified device. + */ + public static final int ALC_ALL_ATTRIBUTES = 0x1003; + + /** The specifier string for the default device */ + public static final int ALC_DEFAULT_DEVICE_SPECIFIER = 0x1004; + + /** The specifier string for the device */ + public static final int ALC_DEVICE_SPECIFIER = 0x1005; + + /** The extensions string for diagnostics and printing */ + public static final int ALC_EXTENSIONS = 0x1006; + + /** Frequency for mixing output buffer, in units of Hz. */ + public static final int ALC_FREQUENCY = 0x1007; + + /** Refresh intervalls, in units of Hz. */ + public static final int ALC_REFRESH = 0x1008; + + /** Flag, indicating a synchronous context. */ + public static final int ALC_SYNC = 0x1009; + + /** The device argument does not name a valid device */ + public static final int ALC_INVALID_DEVICE = 0xA001; + + /** The context argument does not name a valid context */ + public static final int ALC_INVALID_CONTEXT = 0xA002; + + /** + * A function was called at inappropriate time, or in an inappropriate way, + * causing an illegal state. This can be an incompatible ALenum, object ID, + * and/or function. + */ + public static final int ALC_INVALID_ENUM = 0xA003; + + /** + * Illegal value passed as an argument to an AL call. + * Applies to parameter values, but not to enumerations. + */ + public static final int ALC_INVALID_VALUE = 0xA004; + + /** + * A function could not be completed, because there is not enough + * memory available. + */ + public static final int ALC_OUT_OF_MEMORY = 0xA005; + + static native void initNativeStubs() throws LWJGLException; + + /** + * The application can obtain certain strings from ALC. + * + * <code>ALC_DEFAULT_DEVICE_SPECIFIER</code> - The specifer string for the default device + * <code>ALC_DEVICE_SPECIFIER</code> - The specifer string for the device + * <code>ALC_EXTENSIONS</code> - The extensions string for diagnostics and printing. + * + * In addition, printable error message strings are provided for all valid error tokens, + * including <code>ALC_NO_ERROR</code>,<code>ALC_INVALID_DEVICE</code>, <code>ALC_INVALID_CONTEXT</code>, + * <code>ALC_INVALID_ENUM</code>, <code>ALC_INVALID_VALUE</code>. + * + * @param pname Property to get + * @return String property from device + */ + public static String alcGetString(ALCdevice device, int pname) { + ByteBuffer buffer = nalcGetString(getDevice(device), pname); + Util.checkALCError(device); + return MemoryUtil.decodeUTF8(buffer); + } + static native ByteBuffer nalcGetString(long device, int pname); + + /** + * The application can query ALC for information using an integer query function. + * For some tokens, <code>null</code> is a legal deviceHandle. In other cases, specifying a <code>null</code> + * device will generate an <code>ALC_INVALID_DEVICE</code> error. The application has to + * specify the size of the destination buffer provided. A <code>null</code> destination or a zero + * size parameter will cause ALC to ignore the query. + * + * <code>ALC_MAJOR_VERSION</code> - Major version query. + * <code>ALC_MINOR_VERSION</code> - Minor version query. + * <code>ALC_ATTRIBUTES_SIZE</code> - The size required for the zero-terminated attributes list, + * for the current context. <code>null</code> is an invalid device. <code>null</code> (no current context + * for the specified device) is legal. + * <code>ALC_ALL_ATTRIBUTES</code> - Expects a destination of <code>ALC_CURRENT_ATTRIBUTES_SIZE</code>, + * and provides the attribute list for the current context of the specified device. + * <code>null</code> is an invalid device. <code>null</code> (no current context for the specified device) + * will return the default attributes defined by the specified device. + * + * @param pname Property to get + * @param integerdata ByteBuffer to write integers to + */ + public static void alcGetInteger(ALCdevice device, int pname, IntBuffer integerdata) { + BufferChecks.checkDirect(integerdata); + nalcGetIntegerv(getDevice(device), pname, integerdata.remaining(), MemoryUtil.getAddress(integerdata)); + Util.checkALCError(device); + } + static native void nalcGetIntegerv(long device, int pname, int size, long integerdata); + + /** + * The <code>alcOpenDevice</code> function allows the application (i.e. the client program) to + * connect to a device (i.e. the server). + * + * If the function returns <code>null</code>, then no sound driver/device has been found. The + * argument is a null terminated string that requests a certain device or device + * configuration. If <code>null</code> is specified, the implementation will provide an + * implementation specific default. + * + * @param devicename name of device to open + * @return opened device, or null + */ + public static ALCdevice alcOpenDevice(String devicename) { + ByteBuffer buffer = MemoryUtil.encodeUTF8(devicename); + long device_address = nalcOpenDevice(MemoryUtil.getAddressSafe(buffer)); + if(device_address != 0) { + ALCdevice device = new ALCdevice(device_address); + synchronized (ALC10.devices) { + devices.put(device_address, device); + } + return device; + } + return null; + } + static native long nalcOpenDevice(long devicename); + + /** + * The <code>alcCloseDevice</code> function allows the application (i.e. the client program) to + * disconnect from a device (i.e. the server). + * + * If deviceHandle is <code>null</code> or invalid, an <code>ALC_INVALID_DEVICE</code> error will be + * generated. Once closed, a deviceHandle is invalid. + * + * @param device address of native device to close + */ + public static boolean alcCloseDevice(ALCdevice device) { + boolean result = nalcCloseDevice(getDevice(device)); + synchronized (devices) { + device.setInvalid(); + devices.remove(new Long(device.device)); + } + return result; + + } + static native boolean nalcCloseDevice(long device); + + /** + * A context is created using <code>alcCreateContext</code>. The device parameter has to be a valid + * device. The attribute list can be <code>null</code>, or a zero terminated list of integer pairs + * composed of valid ALC attribute tokens and requested values. + * + * Context creation will fail if the application requests attributes that, by themselves, + * can not be provided. Context creation will fail if the combination of specified + * attributes can not be provided. Context creation will fail if a specified attribute, or + * the combination of attributes, does not match the default values for unspecified + * attributes. + * + * @param device address of device to associate context to + * @param attrList Buffer to read attributes from + * @return New context, or null if creation failed + */ + public static ALCcontext alcCreateContext(ALCdevice device, IntBuffer attrList) { + long context_address = nalcCreateContext(getDevice(device), MemoryUtil.getAddressSafe(attrList)); + Util.checkALCError(device); + + if(context_address != 0) { + ALCcontext context = new ALCcontext(context_address); + synchronized (ALC10.contexts) { + contexts.put(context_address, context); + device.addContext(context); + } + return context; + } + return null; + } + static native long nalcCreateContext(long device, long attrList); + + /** + * To make a Context current with respect to AL Operation (state changes by issueing + * commands), <code>alcMakeContextCurrent</code> is used. The context parameter can be <code>null</code> + * or a valid context pointer. The operation will apply to the device that the context + * was created for. + * + * For each OS process (usually this means for each application), only one context can + * be current at any given time. All AL commands apply to the current context. + * Commands that affect objects shared among contexts (e.g. buffers) have side effects + * on other contexts. + * + * @param context address of context to make current + * @return true if successfull, false if not + */ + public static int alcMakeContextCurrent(ALCcontext context) { + return nalcMakeContextCurrent(getContext(context)); + } + static native int nalcMakeContextCurrent(long context); + + /** + * The current context is the only context accessible to state changes by AL commands + * (aside from state changes affecting shared objects). However, multiple contexts can + * be processed at the same time. To indicate that a context should be processed (i.e. + * that internal execution state like offset increments are supposed to be performed), + * the application has to use <code>alcProcessContext</code>. + * + * Repeated calls to <code>alcProcessContext</code> are legal, and do not affect a context that is + * already marked as processing. The default state of a context created by + * alcCreateContext is that it is not marked as processing. + */ + public static void alcProcessContext(ALCcontext context) { + nalcProcessContext(getContext(context)); + } + static native void nalcProcessContext(long context); + + /** + * The application can query for, and obtain an handle to, the current context for the + * application. If there is no current context, <code>null</code> is returned. + * + * @return Current ALCcontext + */ + public static ALCcontext alcGetCurrentContext() { + ALCcontext context = null; + long context_address = nalcGetCurrentContext(); + if(context_address != 0) { + synchronized (ALC10.contexts) { + context = ALC10.contexts.get(context_address); + } + } + return context; + } + static native long nalcGetCurrentContext(); + + /** + * The application can query for, and obtain an handle to, the device of a given context. + * + * @param context address of context to get device for + */ + public static ALCdevice alcGetContextsDevice(ALCcontext context) { + ALCdevice device = null; + long device_address = nalcGetContextsDevice(getContext(context)); + if (device_address != 0) { + synchronized (ALC10.devices) { + device = ALC10.devices.get(device_address); + } + } + return device; + } + static native long nalcGetContextsDevice(long context); + + /** + * The application can suspend any context from processing (including the current + * one). To indicate that a context should be suspended from processing (i.e. that + * internal execution state like offset increments is not supposed to be changed), the + * application has to use <code>alcSuspendContext</code>. + * + * Repeated calls to <code>alcSuspendContext</code> are legal, and do not affect a context that is + * already marked as suspended. The default state of a context created by + * <code>alcCreateContext</code> is that it is marked as suspended. + * + * @param context address of context to suspend + */ + public static void alcSuspendContext(ALCcontext context) { + nalcSuspendContext(getContext(context)); + } + static native void nalcSuspendContext(long context); + + /** + * The correct way to destroy a context is to first release it using <code>alcMakeCurrent</code> and + * <code>null</code>. Applications should not attempt to destroy a current context. + * + * @param context address of context to Destroy + */ + public static void alcDestroyContext(ALCcontext context) { + synchronized(ALC10.contexts) { + ALCdevice device = alcGetContextsDevice(context); + nalcDestroyContext(getContext(context)); + device.removeContext(context); + context.setInvalid(); + } + } + static native void nalcDestroyContext(long context); + + /** + * ALC uses the same conventions and mechanisms as AL for error handling. In + * particular, ALC does not use conventions derived from X11 (GLX) or Windows + * (WGL). The <code>alcGetError</code> function can be used to query ALC errors. + * + * Error conditions are specific to the device. + * + * ALC_NO_ERROR - The device handle or specifier does name an accessible driver/server. + * <code>ALC_INVALID_DEVICE</code> - The Context argument does not name a valid context. + * <code>ALC_INVALID_CONTEXT</code> - The Context argument does not name a valid context. + * <code>ALC_INVALID_ENUM</code> - A token used is not valid, or not applicable. + * <code>ALC_INVALID_VALUE</code> - An value (e.g. attribute) is not valid, or not applicable. + * + * @return Errorcode from ALC statemachine + */ + public static int alcGetError(ALCdevice device) { + return nalcGetError(getDevice(device)); + } + static native int nalcGetError(long device); + + /** + * Verify that a given extension is available for the current context and the device it + * is associated with. + * A <code>null</code> name argument returns <code>ALC_FALSE</code>, as do invalid and unsupported string + * tokens. + * + * @param extName name of extension to find + * @return true if extension is available, false if not + */ + public static boolean alcIsExtensionPresent(ALCdevice device, String extName) { + ByteBuffer buffer = MemoryUtil.encodeASCII(extName); + boolean result = nalcIsExtensionPresent(getDevice(device), MemoryUtil.getAddress(buffer)); + Util.checkALCError(device); + return result; + } + private static native boolean nalcIsExtensionPresent(long device, long extName); + + /** + * Enumeration/token values are device independend, but tokens defined for + * extensions might not be present for a given device. But only the tokens defined + * by the AL core are guaranteed. Availability of extension tokens dependends on the ALC extension. + * + * Specifying a <code>null</code> name parameter will cause an <code>ALC_INVALID_VALUE</code> error. + * + * @param enumName name of enum to find + * @return value of enumeration + */ + public static int alcGetEnumValue(ALCdevice device, String enumName) { + ByteBuffer buffer = MemoryUtil.encodeASCII(enumName); + int result = nalcGetEnumValue(getDevice(device), MemoryUtil.getAddress(buffer)); + Util.checkALCError(device); + return result; + } + private static native int nalcGetEnumValue(long device, long enumName); + + static long getDevice(ALCdevice device) { + if(device != null) { + Util.checkALCValidDevice(device); + return device.device; + } + return 0L; + } + + static long getContext(ALCcontext context) { + if(context != null) { + Util.checkALCValidContext(context); + return context.context; + } + return 0L; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC11.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC11.java new file mode 100644 index 0000000..ae849a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALC11.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +/** + * <p> + * The ALC11 class implements features in OpenAL 1.1, specifically + * ALC methods and properties. + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @see ALC10 + * @version $Revision: 2286 $ + * $Id: ALC.java 2286 2006-03-23 19:32:21 +0000 (to, 23 mar 2006) matzon $ + */ +public final class ALC11 { + + public static final int ALC_DEFAULT_ALL_DEVICES_SPECIFIER = 0x1012; + public static final int ALC_ALL_DEVICES_SPECIFIER = 0x1013; + + public static final int ALC_CAPTURE_DEVICE_SPECIFIER = 0x310; + public static final int ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x311; + public static final int ALC_CAPTURE_SAMPLES = 0x312; + + public static final int ALC_MONO_SOURCES = 0x1010; + public static final int ALC_STEREO_SOURCES = 0x1011; + + /** + * The alcCaptureOpenDevice function allows the application to connect to a capture + * device. To obtain a list of all available capture devices, use getCaptureDevices a list of all + * capture devices will be returned. Retrieving ALC_CAPTURE_DEVICE_SPECIFIER with a valid capture device specified will result + * in the name of that device being returned as a single string. + * + * If the function returns null, then no sound driver/device has been found, or the + * requested format could not be fulfilled. + * The "deviceName" argument is a string that requests a certain device or + * device configuration. If null is specified, the implementation will provide an + * implementation specific default. The "frequency" and "format" arguments specify the format that + * audio data will be presented to the application, and match the values that can be passed to + * alBufferData. The implementation is expected to convert and resample to this format on + * behalf of the application. The "buffersize" argument specifies the number of sample frames + * to buffer in the AL, for example, requesting a format of AL_FORMAT_STEREO16 and + * a buffer size of 1024 would require the AL to store up to 1024 * 4 bytes of audio data. + * Note that the implementation may use a larger buffer than requested if it needs to, but the + * implementation will set up a buffer of at least the requested size. + * Specifying a compressed or extension-supplied format may result in failure, even if the + * extension is supplied for rendering. + * + * <i>LWJGL SPECIFIC: the actual created device is managed internally in lwjgl</i> + * + * @param devicename Name of device to open for capture + * @param frequency Frequency of samples to capture + * @param format Format of samples to capture + * @param buffersize Size of buffer to capture to + * @return ALCdevice if it was possible to open a device + */ + public static ALCdevice alcCaptureOpenDevice(String devicename, int frequency, int format, int buffersize) { + ByteBuffer buffer = MemoryUtil.encodeASCII(devicename); + long device_address = nalcCaptureOpenDevice(MemoryUtil.getAddressSafe(buffer), frequency, format, buffersize); + if(device_address != 0) { + ALCdevice device = new ALCdevice(device_address); + synchronized (ALC10.devices) { + ALC10.devices.put(device_address, device); + } + return device; + } + return null; + } + private static native long nalcCaptureOpenDevice(long devicename, int frequency, int format, int buffersize); + + /** + * The alcCaptureCloseDevice function allows the application to disconnect from a capture + * device. + * + * The return code will be true or false, indicating success or failure. If + * the device is null or invalid, an ALC_INVALID_DEVICE error will be generated. + * Once closed, a capture device is invalid. + * @return true if device was successfully closed + */ + public static boolean alcCaptureCloseDevice(ALCdevice device) { + boolean result = nalcCaptureCloseDevice(ALC10.getDevice(device)); + synchronized (ALC10.devices) { + device.setInvalid(); + ALC10.devices.remove(new Long(device.device)); + } + return result; + } + static native boolean nalcCaptureCloseDevice(long device); + + /** + * Once a capture device has been opened via alcCaptureOpenDevice, it is made to start + * recording audio via the alcCaptureStart entry point: + * + * Once started, the device will record audio to an internal ring buffer, the size of which was + * specified when opening the device. + * The application may query the capture device to discover how much data is currently + * available via the alcGetInteger with the ALC_CAPTURE_SAMPLES token. This will + * report the number of sample frames currently available. + */ + public static void alcCaptureStart(ALCdevice device) { + nalcCaptureStart(ALC10.getDevice(device)); + } + static native void nalcCaptureStart(long device); + + /** + * If the application doesn't need to capture more audio for an amount of time, they can halt + * the device without closing it via the alcCaptureStop entry point. + * The implementation is encouraged to optimize for this case. The amount of audio + * samples available after restarting a stopped capture device is reset to zero. The + * application does not need to stop the capture device to read from it. + */ + public static void alcCaptureStop(ALCdevice device) { + nalcCaptureStop(ALC10.getDevice(device)); + } + static native void nalcCaptureStop(long device); + + /** + * When the application feels there are enough samples available to process, it can obtain + * them from the AL via the alcCaptureSamples entry point. + * + * The "buffer" argument specifies an application-allocated buffer that can contain at least + * "samples" sample frames. The implementation may defer conversion and resampling until + * this point. Requesting more sample frames than are currently available is an error. + * + * @param buffer Buffer to store samples in + * @param samples Number of samples to request + */ + public static void alcCaptureSamples(ALCdevice device, ByteBuffer buffer, int samples ) { + nalcCaptureSamples(ALC10.getDevice(device), MemoryUtil.getAddress(buffer), samples); + } + static native void nalcCaptureSamples(long device, long buffer, int samples ); + + static native void initNativeStubs() throws LWJGLException; + + /** + * Initializes ALC11, including any extensions + * @return true if initialization was successfull + */ + static boolean initialize() { + try { + IntBuffer ib = BufferUtils.createIntBuffer(2); + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MAJOR_VERSION, ib); + ib.position(1); + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MINOR_VERSION, ib); + + int major = ib.get(0); + int minor = ib.get(1); + + // checking for version 1.x+ + if(major >= 1) { + + // checking for version 1.1+ + if(major > 1 || minor >= 1) { + ALC11.initNativeStubs(); + AL11.initNativeStubs(); + } + } + } catch (LWJGLException le) { + LWJGLUtil.log("failed to initialize ALC11: " + le); + return false; + } + return true; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCcontext.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCcontext.java new file mode 100644 index 0000000..2122b5b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCcontext.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; + +/** + * The ALCcontext class represents a context opened in OpenAL space. + * + * All operations of the AL core API affect a current AL context. Within the scope of AL, + * the ALC is implied - it is not visible as a handle or function parameter. Only one AL + * Context per process can be current at a time. Applications maintaining multiple AL + * Contexts, whether threaded or not, have to set the current context accordingly. + * Applications can have multiple threads that share one more or contexts. In other words, + * AL and ALC are threadsafe. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public final class ALCcontext { + + /** Address of actual context */ + final long context; + + /** Whether this context is valid */ + private boolean valid; + + /** + * Creates a new instance of ALCcontext + * + * @param context address of actual context + */ + ALCcontext(long context) { + this.context = context; + this.valid = true; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object context) { + if(context instanceof ALCcontext) { + return ((ALCcontext)context).context == this.context; + } + return super.equals(context); + } + + /** + * Creates an attribute list in a ByteBuffer + * @param contextFrequency Frequency to add + * @param contextRefresh Refresh rate to add + * @param contextSynchronized Whether to synchronize the context + * @return + */ + static IntBuffer createAttributeList(int contextFrequency, int contextRefresh, int contextSynchronized) { + IntBuffer attribList = BufferUtils.createIntBuffer(7); + + attribList.put(ALC10.ALC_FREQUENCY); + attribList.put(contextFrequency); + attribList.put(ALC10.ALC_REFRESH); + attribList.put(contextRefresh); + attribList.put(ALC10.ALC_SYNC); + attribList.put(contextSynchronized); + attribList.put(0); //terminating int + + return attribList; + } + + /** + * Marks this context as invalid + * + */ + void setInvalid() { + valid = false; + } + + /** + * @return true if this context is still valid + */ + public boolean isValid() { + return valid; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCdevice.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCdevice.java new file mode 100644 index 0000000..1c3c1c7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/ALCdevice.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.util.HashMap; +import java.util.Iterator; + +/** + * The ALCdevice class represents a device opened in OpenAL space. + * + * ALC introduces the notion of a Device. A Device can be, depending on the + * implementation, a hardware device, or a daemon/OS service/actual server. This + * mechanism also permits different drivers (and hardware) to coexist within the same + * system, as well as allowing several applications to share system resources for audio, + * including a single hardware output device. The details are left to the implementation, + * which has to map the available backends to unique device specifiers. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public final class ALCdevice { + + /** Address of actual device */ + final long device; + + /** Whether this device is valid */ + private boolean valid; + + /** List of contexts belonging to the device */ + private final HashMap<Long, ALCcontext> contexts = new HashMap<Long, ALCcontext>(); + + /** + * Creates a new instance of ALCdevice + * + * @param device address of actual device + */ + ALCdevice(long device) { + this.device = device; + this.valid = true; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object device) { + if(device instanceof ALCdevice) { + return ((ALCdevice)device).device == this.device; + } + return super.equals(device); + } + + /** + * Adds a context to the device + * + * @param context context to add to the list of contexts for this device + */ + void addContext(ALCcontext context) { + synchronized (contexts) { + contexts.put(context.context, context); + } + } + + /** + * Remove context associated with device + * + * @param context Context to disassociate with device + */ + void removeContext(ALCcontext context) { + synchronized (contexts) { + contexts.remove(context.context); + } + } + + /** + * Marks this device and all of its contexts invalid + */ + void setInvalid() { + valid = false; + synchronized (contexts) { + for ( ALCcontext context : contexts.values() ) + context.setInvalid(); + } + contexts.clear(); + } + + /** + * @return true if this device is still valid + */ + public boolean isValid() { + return valid; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/EFXUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/EFXUtil.java new file mode 100644 index 0000000..bf1c23b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/EFXUtil.java @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import static org.lwjgl.openal.AL10.*; +import static org.lwjgl.openal.EFX10.*; + +/** + * Utility class for the OpenAL extension ALC_EXT_EFX. Provides functions to check for the extension + * and support of various effects and filters. + * <p> + * Currently supports ALC_EXT_EFX version 1.0 effects and filters. + * + * @author Ciardhubh <ciardhubh[at]ciardhubh.de> + * @version $Revision$ + * $Id$ + */ +public final class EFXUtil { + + /** Constant for testSupportGeneric to check an effect. */ + private static final int EFFECT = 1111; + /** Constant for testSupportGeneric to check a filter. */ + private static final int FILTER = 2222; + + /** Utility class, hidden contructor. */ + private EFXUtil() { + } + + /** + * Checks if OpenAL implementation is loaded and supports ALC_EXT_EFX. + * + * @return True if ALC_EXT_EFX is supported, false if not. + * @throws OpenALException If OpenAL has not been created yet. + */ + public static boolean isEfxSupported() { + if (!AL.isCreated()) { + throw new OpenALException("OpenAL has not been created."); + } + return ALC10.alcIsExtensionPresent(AL.getDevice(), ALC_EXT_EFX_NAME); + } + + /** + * Tests OpenAL to see whether the given effect type is supported. This is done by creating an + * effect of the given type. If creation succeeds the effect is supported. + * + * @param effectType Type of effect whose support is to be tested, e.g. AL_EFFECT_REVERB. + * @return True if it is supported, false if not. + * @throws OpenALException If the request fails due to an AL_OUT_OF_MEMORY error or OpenAL has + * not been created yet. + * @throws IllegalArgumentException effectType is not a valid effect type. + */ + public static boolean isEffectSupported(final int effectType) { + // Make sure type is a real effect. + switch (effectType) { + case AL_EFFECT_NULL: + case AL_EFFECT_EAXREVERB: + case AL_EFFECT_REVERB: + case AL_EFFECT_CHORUS: + case AL_EFFECT_DISTORTION: + case AL_EFFECT_ECHO: + case AL_EFFECT_FLANGER: + case AL_EFFECT_FREQUENCY_SHIFTER: + case AL_EFFECT_VOCAL_MORPHER: + case AL_EFFECT_PITCH_SHIFTER: + case AL_EFFECT_RING_MODULATOR: + case AL_EFFECT_AUTOWAH: + case AL_EFFECT_COMPRESSOR: + case AL_EFFECT_EQUALIZER: + break; + default: + throw new IllegalArgumentException("Unknown or invalid effect type: " + effectType); + } + + return testSupportGeneric(EFFECT, effectType); + } + + /** + * Tests OpenAL to see whether the given filter type is supported. This is done by creating a + * filter of the given type. If creation succeeds the filter is supported. + * + * @param filterType Type of filter whose support is to be tested, e.g. AL_FILTER_LOWPASS. + * @return True if it is supported, false if not. + * @throws OpenALException If the request fails due to an AL_OUT_OF_MEMORY error or OpenAL has + * not been created yet. + * @throws IllegalArgumentException filterType is not a valid filter type. + */ + public static boolean isFilterSupported(final int filterType) { + // Make sure type is a real filter. + switch (filterType) { + case AL_FILTER_NULL: + case AL_FILTER_LOWPASS: + case AL_FILTER_HIGHPASS: + case AL_FILTER_BANDPASS: + break; + default: + throw new IllegalArgumentException("Unknown or invalid filter type: " + filterType); + } + + return testSupportGeneric(FILTER, filterType); + } + + /** + * Generic test function to see if an EFX object supports a given kind of type. Works for + * effects and filters. + * + * @param objectType Type of object to test. Must be either EFXUtil.EFFECT or EFXUtil.FILTER. + * @param typeValue OpenAL type the object should be tested for support, e.g. AL_FILTER_LOWPASS + * or AL_EFFECT_REVERB. + * @return True if object supports typeValue, false else. + */ + private static boolean testSupportGeneric(final int objectType, final int typeValue) { + // Check for supported objectType. + switch (objectType) { + case EFFECT: + case FILTER: + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + + boolean supported = false; + if (isEfxSupported()) { + + // Try to create object in order to check AL's response. + alGetError(); + int genError; + int testObject = 0; + try { + switch (objectType) { // Create object based on type + case EFFECT: + testObject = alGenEffects(); + break; + case FILTER: + testObject = alGenFilters(); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + genError = alGetError(); + } catch (final OpenALException debugBuildException) { + // Hack because OpenALException hides the original error code (short of parsing the + // error message String which would break if it gets changed). + if (debugBuildException.getMessage().contains("AL_OUT_OF_MEMORY")) { + genError = AL_OUT_OF_MEMORY; + } else { + genError = AL_INVALID_OPERATION; + } + } + + if (genError == AL_NO_ERROR) { + // Successfully created, now try to set type. + alGetError(); + int setError; + try { + switch (objectType) { // Set based on object type + case EFFECT: + alEffecti(testObject, AL_EFFECT_TYPE, typeValue); + break; + case FILTER: + alFilteri(testObject, AL_FILTER_TYPE, typeValue); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + setError = alGetError(); + } catch (final OpenALException debugBuildException) { + // Hack because OpenALException hides the original error code (short of parsing + // the error message String which would break when it gets changed). + setError = AL_INVALID_VALUE; + } + + if (setError == AL_NO_ERROR) { + supported = true; + } + + // Cleanup + try { + switch (objectType) { // Set based on object type + case EFFECT: + alDeleteEffects(testObject); + break; + case FILTER: + alDeleteFilters(testObject); + break; + default: + throw new IllegalArgumentException("Invalid objectType: " + objectType); + } + } catch (final OpenALException debugBuildException) { + // Don't care about cleanup errors. + } + + } else if (genError == AL_OUT_OF_MEMORY) { + throw new OpenALException(genError); + } + } + + return supported; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/OpenALException.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/OpenALException.java new file mode 100644 index 0000000..504fc62 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/OpenALException.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +/** + * <br> + * Thrown by the debug build library of the LWJGL if any OpenAL operation + * causes an error. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class OpenALException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * Constructor for OpenALException. + */ + public OpenALException() { + super(); + } + + /** + * Constructor that takes an AL error number + */ + public OpenALException(int error_code) { + super("OpenAL error: " + AL10.alGetString(error_code) + " (" + error_code + ")"); + } + + /** + * Constructor for OpenALException. + * @param message + */ + public OpenALException(String message) { + super(message); + } + + /** + * Constructor for OpenALException. + * @param message + * @param cause + */ + public OpenALException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructor for OpenALException. + * @param cause + */ + public OpenALException(Throwable cause) { + super(cause); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/Util.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/Util.java new file mode 100644 index 0000000..c23c588 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/openal/Util.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + + +/** + * Simple utility class for checking AL/ALC errors + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + */ + +public final class Util { + /** No c'tor */ + private Util() { + } + + /** + * Checks for any ALC errors and throws an unchecked exception on errors + * @param device Device for which to check ALC errors + */ + public static void checkALCError(ALCdevice device) { + int err = ALC10.alcGetError(device); + if (err != ALC10.ALC_NO_ERROR) + throw new OpenALException(ALC10.alcGetString(AL.getDevice(), err)); + } + + /** + * Checks for any AL errors and throws an unchecked exception on errors + */ + public static void checkALError() { + int err = AL10.alGetError(); + if (err != AL10.AL_NO_ERROR) + throw new OpenALException(err); + } + + /** + * Checks for a valid device + * @param device ALCdevice to check the validity of + */ + public static void checkALCValidDevice(ALCdevice device) { + if(!device.isValid()) { + throw new OpenALException("Invalid device: " + device); + } + } + + /** + * Checks for a valid context + * @param context ALCcontext to check the validity of + */ + public static void checkALCValidContext(ALCcontext context) { + if(!context.isValid()) { + throw new OpenALException("Invalid context: " + context); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APIUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APIUtil.java new file mode 100644 index 0000000..426581f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APIUtil.java @@ -0,0 +1,550 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.*; +import org.lwjgl.opencl.FastLongMap.Entry; + +import java.nio.*; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +import static org.lwjgl.opencl.APPLEGLSharing.*; +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.EXTDeviceFission.*; +import static org.lwjgl.opencl.KHRGLSharing.*; + +/** + * Utility class for OpenCL API calls. + * + * @author spasi + */ +final class APIUtil { + + private static final int INITIAL_BUFFER_SIZE = 256; + private static final int INITIAL_LENGTHS_SIZE = 4; + + private static final int BUFFERS_SIZE = 32; + + private static final ThreadLocal<char[]> arrayTL = new ThreadLocal<char[]>() { + protected char[] initialValue() { return new char[INITIAL_BUFFER_SIZE]; } + }; + + private static final ThreadLocal<ByteBuffer> bufferByteTL = new ThreadLocal<ByteBuffer>() { + protected ByteBuffer initialValue() { return BufferUtils.createByteBuffer(INITIAL_BUFFER_SIZE); } + }; + + private static final ThreadLocal<PointerBuffer> bufferPointerTL = new ThreadLocal<PointerBuffer>() { + protected PointerBuffer initialValue() { return BufferUtils.createPointerBuffer(INITIAL_BUFFER_SIZE); } + }; + + private static final ThreadLocal<PointerBuffer> lengthsTL = new ThreadLocal<PointerBuffer>() { + protected PointerBuffer initialValue() { return BufferUtils.createPointerBuffer(INITIAL_LENGTHS_SIZE); } + }; + + private static final ThreadLocal<Buffers> buffersTL = new ThreadLocal<Buffers>() { + protected Buffers initialValue() { return new Buffers(); } + }; + + private APIUtil() { + } + + private static char[] getArray(final int size) { + char[] array = arrayTL.get(); + + if ( array.length < size ) { + int sizeNew = array.length << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + array = new char[size]; + arrayTL.set(array); + } + + return array; + } + + static ByteBuffer getBufferByte(final int size) { + ByteBuffer buffer = bufferByteTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + buffer = BufferUtils.createByteBuffer(size); + bufferByteTL.set(buffer); + } else + buffer.clear(); + + return buffer; + } + + private static ByteBuffer getBufferByteOffset(final int size) { + ByteBuffer buffer = bufferByteTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + final ByteBuffer bufferNew = BufferUtils.createByteBuffer(size); + bufferNew.put(buffer); + bufferByteTL.set(buffer = bufferNew); + } else { + buffer.position(buffer.limit()); + buffer.limit(buffer.capacity()); + } + + return buffer; + } + + static PointerBuffer getBufferPointer(final int size) { + PointerBuffer buffer = bufferPointerTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + buffer = BufferUtils.createPointerBuffer(size); + bufferPointerTL.set(buffer); + } else + buffer.clear(); + + return buffer; + } + + static ShortBuffer getBufferShort() { return buffersTL.get().shorts; } + + static IntBuffer getBufferInt() { return buffersTL.get().ints; } + + static IntBuffer getBufferIntDebug() { return buffersTL.get().intsDebug; } + + static LongBuffer getBufferLong() { return buffersTL.get().longs; } + + static FloatBuffer getBufferFloat() { return buffersTL.get().floats; } + + static DoubleBuffer getBufferDouble() { return buffersTL.get().doubles; } + + static PointerBuffer getBufferPointer() { return buffersTL.get().pointers; } + + static PointerBuffer getLengths() { + return getLengths(1); + } + + static PointerBuffer getLengths(final int size) { + PointerBuffer lengths = lengthsTL.get(); + + if ( lengths.capacity() < size ) { + int sizeNew = lengths.capacity(); + while ( sizeNew < size ) + sizeNew <<= 1; + + lengths = BufferUtils.createPointerBuffer(size); + lengthsTL.set(lengths); + } else + lengths.clear(); + + return lengths; + } + + /** + * Simple ASCII encoding. + * + * @param buffer The target buffer + * @param string The source string + */ + private static ByteBuffer encode(final ByteBuffer buffer, final CharSequence string) { + for ( int i = 0; i < string.length(); i++ ) { + final char c = string.charAt(i); + if ( LWJGLUtil.DEBUG && 0x80 <= c ) // Silently ignore and map to 0x1A. + buffer.put((byte)0x1A); + else + buffer.put((byte)c); + } + + return buffer; + } + + /** + * Reads a byte string from the specified buffer. + * + * @param buffer + * + * @return the buffer as a String. + */ + static String getString(final ByteBuffer buffer) { + final int length = buffer.remaining(); + final char[] charArray = getArray(length); + + for ( int i = buffer.position(); i < buffer.limit(); i++ ) + charArray[i - buffer.position()] = (char)buffer.get(i); + + return new String(charArray, 0, length); + } + + /** + * Returns a buffer containing the specified string as bytes. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, starting at the specified offset. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final CharSequence string, final int offset) { + final ByteBuffer buffer = encode(getBufferByteOffset(offset + string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, including null-termination. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBufferNT(final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(string.length() + 1), string); + buffer.put((byte)0); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + static int getTotalLength(final CharSequence[] strings) { + int length = 0; + for ( CharSequence string : strings ) + length += string.length(); + + return length; + } + + /** + * Returns a buffer containing the specified strings as bytes. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBuffer(final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(getTotalLength(strings)); + + for ( CharSequence string : strings ) + encode(buffer, string); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified strings as bytes, including null-termination. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBufferNT(final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(getTotalLength(strings) + strings.length); + + for ( CharSequence string : strings ) { + encode(buffer, string); + buffer.put((byte)0); + } + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the lengths of the specified strings. + * + * @param strings + * + * @return the String lengths in a PointerBuffer + */ + static long getLengths(final CharSequence[] strings) { + PointerBuffer buffer = getLengths(strings.length); + + for ( CharSequence string : strings ) + buffer.put(string.length()); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the lengths of the specified buffers. + * + * @param buffers the buffer array + * + * @return the buffer lengths in a PointerBuffer + */ + static long getLengths(final ByteBuffer[] buffers) { + PointerBuffer lengths = getLengths(buffers.length); + + for ( ByteBuffer buffer : buffers ) + lengths.put(buffer.remaining()); + + lengths.flip(); + return MemoryUtil.getAddress0(lengths); + } + + static int getSize(final PointerBuffer lengths) { + long size = 0; + for ( int i = lengths.position(); i < lengths.limit(); i++ ) + size += lengths.get(i); + + return (int)size; + } + + static long getPointer(final PointerWrapper pointer) { + return MemoryUtil.getAddress0(getBufferPointer().put(0, pointer)); + } + + static long getPointerSafe(final PointerWrapper pointer) { + return MemoryUtil.getAddress0(getBufferPointer().put(0, pointer == null ? 0L : pointer.getPointer())); + } + + private static class Buffers { + + final ShortBuffer shorts; + final IntBuffer ints; + final IntBuffer intsDebug; + final LongBuffer longs; + + final FloatBuffer floats; + final DoubleBuffer doubles; + + final PointerBuffer pointers; + + Buffers() { + shorts = BufferUtils.createShortBuffer(BUFFERS_SIZE); + ints = BufferUtils.createIntBuffer(BUFFERS_SIZE); + intsDebug = BufferUtils.createIntBuffer(1); + longs = BufferUtils.createLongBuffer(BUFFERS_SIZE); + + floats = BufferUtils.createFloatBuffer(BUFFERS_SIZE); + doubles = BufferUtils.createDoubleBuffer(BUFFERS_SIZE); + + pointers = BufferUtils.createPointerBuffer(BUFFERS_SIZE); + } + + } + + /* ------------------------------------------------------------------------ + --------------------------------------------------------------------------- + OPENCL API UTILITIES BELOW + --------------------------------------------------------------------------- + ------------------------------------------------------------------------ */ + + static Set<String> getExtensions(final String extensionList) { + final Set<String> extensions = new HashSet<String>(); + + if ( extensionList != null ) { + final StringTokenizer tokenizer = new StringTokenizer(extensionList); + while ( tokenizer.hasMoreTokens() ) + extensions.add(tokenizer.nextToken()); + } + + return extensions; + } + + static boolean isDevicesParam(final int param_name) { + switch ( param_name ) { + case CL_CONTEXT_DEVICES: + case CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR: + case CL_DEVICES_FOR_GL_CONTEXT_KHR: + case CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE: + case CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE: + return true; + } + + return false; + } + + static CLPlatform getCLPlatform(final PointerBuffer properties) { + long platformID = 0; + + final int keys = properties.remaining() / 2; + for ( int k = 0; k < keys; k++ ) { + final long key = properties.get(k << 1); + if ( key == 0 ) + break; + + if ( key == CL_CONTEXT_PLATFORM ) { + platformID = properties.get((k << 1) + 1); + break; + } + } + + if ( platformID == 0 ) + throw new IllegalArgumentException("Could not find CL_CONTEXT_PLATFORM in cl_context_properties."); + + final CLPlatform platform = CLPlatform.getCLPlatform(platformID); + if ( platform == null ) + throw new IllegalStateException("Could not find a valid CLPlatform. Make sure clGetPlatformIDs has been used before."); + + return platform; + } + + static ByteBuffer getNativeKernelArgs(final long user_func_ref, final CLMem[] clMems, final long[] sizes) { + final ByteBuffer args = getBufferByte(8 + 4 + (clMems == null ? 0 : clMems.length * (4 + PointerBuffer.getPointerSize()))); + + args.putLong(0, user_func_ref); + if ( clMems == null ) + args.putInt(8, 0); + else { + args.putInt(8, clMems.length); + int byteIndex = 12; + for ( int i = 0; i < clMems.length; i++ ) { + if ( LWJGLUtil.DEBUG && !clMems[i].isValid() ) + throw new IllegalArgumentException("An invalid CLMem object was specified."); + args.putInt(byteIndex, (int)sizes[i]); // CLMem size + byteIndex += (4 + PointerBuffer.getPointerSize()); // Skip size and make room for the pointer + } + } + + return args; + } + + // ------------------------------------------------------------------------------------ + + /** + * Releases all sub-devices created from the specified CLDevice. + * + * @param device the CLDevice to clear + */ + static void releaseObjects(final CLDevice device) { + // Release objects only if we're about to hit 0. + if ( !device.isValid() || device.getReferenceCount() > 1 ) + return; + + releaseObjects(device.getSubCLDeviceRegistry(), DESTRUCTOR_CLSubDevice); + } + + /** + * Releases all objects contained in the specified CLContext. + * + * @param context the CLContext to clear + */ + static void releaseObjects(final CLContext context) { + // Release objects only if we're about to hit 0. + if ( !context.isValid() || context.getReferenceCount() > 1 ) + return; + + releaseObjects(context.getCLEventRegistry(), DESTRUCTOR_CLEvent); + releaseObjects(context.getCLProgramRegistry(), DESTRUCTOR_CLProgram); + releaseObjects(context.getCLSamplerRegistry(), DESTRUCTOR_CLSampler); + releaseObjects(context.getCLMemRegistry(), DESTRUCTOR_CLMem); + releaseObjects(context.getCLCommandQueueRegistry(), DESTRUCTOR_CLCommandQueue); + } + + /** + * Releases all objects contained in the specified CLProgram. + * + * @param program the CLProgram to clear + */ + static void releaseObjects(final CLProgram program) { + // Release objects only if we're about to hit 0. + if ( !program.isValid() || program.getReferenceCount() > 1 ) + return; + + releaseObjects(program.getCLKernelRegistry(), DESTRUCTOR_CLKernel); + } + + /** + * Releases all objects contained in the specified CLCommandQueue. + * + * @param queue the CLCommandQueue to clear + */ + static void releaseObjects(final CLCommandQueue queue) { + // Release objects only if we're about to hit 0. + if ( !queue.isValid() || queue.getReferenceCount() > 1 ) + return; + + releaseObjects(queue.getCLEventRegistry(), DESTRUCTOR_CLEvent); + } + + private static <T extends CLObjectChild> void releaseObjects(final CLObjectRegistry<T> registry, final ObjectDestructor<T> destructor) { + if ( registry.isEmpty() ) + return; + + for ( Entry<T> entry : registry.getAll() ) { + final T object = entry.value; + while ( object.isValid() ) + destructor.release(object); + } + } + + private static final ObjectDestructor<CLDevice> DESTRUCTOR_CLSubDevice = new ObjectDestructor<CLDevice>() { + public void release(final CLDevice object) { clReleaseDeviceEXT(object); } + }; + private static final ObjectDestructor<CLMem> DESTRUCTOR_CLMem = new ObjectDestructor<CLMem>() { + public void release(final CLMem object) { clReleaseMemObject(object); } + }; + private static final ObjectDestructor<CLCommandQueue> DESTRUCTOR_CLCommandQueue = new ObjectDestructor<CLCommandQueue>() { + public void release(final CLCommandQueue object) { clReleaseCommandQueue(object); } + }; + private static final ObjectDestructor<CLSampler> DESTRUCTOR_CLSampler = new ObjectDestructor<CLSampler>() { + public void release(final CLSampler object) { clReleaseSampler(object); } + }; + private static final ObjectDestructor<CLProgram> DESTRUCTOR_CLProgram = new ObjectDestructor<CLProgram>() { + public void release(final CLProgram object) { clReleaseProgram(object); } + }; + private static final ObjectDestructor<CLKernel> DESTRUCTOR_CLKernel = new ObjectDestructor<CLKernel>() { + public void release(final CLKernel object) { clReleaseKernel(object); } + }; + private static final ObjectDestructor<CLEvent> DESTRUCTOR_CLEvent = new ObjectDestructor<CLEvent>() { + public void release(final CLEvent object) { clReleaseEvent(object); } + }; + + private interface ObjectDestructor<T extends CLObjectChild> { + + void release(T object); + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APPLEContextLoggingUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APPLEContextLoggingUtil.java new file mode 100644 index 0000000..c2d9b28 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/APPLEContextLoggingUtil.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import java.nio.ByteBuffer; + +/** + * Utility class that provides CLContextCallback implementations that use + * the APPLE_ContextLoggingFunctions callback functions. + * <p/> + * TODO: Test this class + * + * @author Spasi + */ +public final class APPLEContextLoggingUtil { + + /** Sends all log messages to the Apple System Logger. */ + public static final CLContextCallback SYSTEM_LOG_CALLBACK; + + /** Sends all log messages to the file descriptor stdout. */ + public static final CLContextCallback STD_OUT_CALLBACK; + + /** Sends all log messages to the file descriptor stderr. */ + public static final CLContextCallback STD_ERR_CALLBACK; + + static { + if ( CLCapabilities.CL_APPLE_ContextLoggingFunctions ) { + SYSTEM_LOG_CALLBACK = new CLContextCallback(CallbackUtil.getLogMessageToSystemLogAPPLE()) { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { throw new UnsupportedOperationException(); } + }; + + STD_OUT_CALLBACK = new CLContextCallback(CallbackUtil.getLogMessageToStdoutAPPLE()) { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { throw new UnsupportedOperationException(); } + }; + + STD_ERR_CALLBACK = new CLContextCallback(CallbackUtil.getLogMessageToStderrAPPLE()) { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { throw new UnsupportedOperationException(); } + }; + } else { + SYSTEM_LOG_CALLBACK = null; + STD_OUT_CALLBACK = null; + STD_ERR_CALLBACK = null; + } + } + + private APPLEContextLoggingUtil() {} + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CL.java new file mode 100644 index 0000000..169ae8a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CL.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.Sys; + +import java.nio.ByteBuffer; + +/** + * LWJGL users must use this class to initialize OpenCL + * before using any other class in the org.lwjgl.opencl package. + * + * @author Spasi + */ +public final class CL { + + private static boolean created; + + static { + Sys.initialize(); + } + + private CL() { + } + + /** + * Native method to create CL instance + * + * @param oclPaths Array of strings containing paths to search for OpenCL library + */ + private static native void nCreate(String oclPaths) throws LWJGLException; + + /** + * Native method to create CL instance from the Mac OS X 10.4 OpenCL framework. + * It is only defined in the Mac OS X native library. + */ + private static native void nCreateDefault() throws LWJGLException; + + /** Native method the destroy the CL */ + private static native void nDestroy(); + + /** @return true if CL has been created */ + public static boolean isCreated() { + return created; + } + + public static void create() throws LWJGLException { + if ( created ) + return; + //throw new IllegalStateException("OpenCL has already been created."); + + final String libname; + final String[] library_names; + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_WINDOWS: + libname = "OpenCL"; + library_names = new String[] { "OpenCL.dll" }; + break; + case LWJGLUtil.PLATFORM_LINUX: + libname = "OpenCL"; + library_names = new String[] { "libOpenCL64.so", "libOpenCL.so" }; // TODO: Fix this + break; + case LWJGLUtil.PLATFORM_MACOSX: + libname = "OpenCL"; + library_names = new String[] { "OpenCL.dylib" }; // TODO: Fix this + break; + default: + throw new LWJGLException("Unknown platform: " + LWJGLUtil.getPlatform()); + } + + final String[] oclPaths = LWJGLUtil.getLibraryPaths(libname, library_names, CL.class.getClassLoader()); + LWJGLUtil.log("Found " + oclPaths.length + " OpenCL paths"); + for ( String oclPath : oclPaths ) { + try { + nCreate(oclPath); + created = true; + break; + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to load " + oclPath + ": " + e.getMessage()); + } + } + + if ( !created && LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX ) { + // Try to load OpenCL from the framework instead + nCreateDefault(); + created = true; + } + + if ( !created ) + throw new LWJGLException("Could not locate OpenCL library."); + + if ( !CLCapabilities.OpenCL10 ) + throw new RuntimeException("OpenCL 1.0 not supported."); + } + + public static void destroy() { + } + + /** + * Helper method to get a pointer to a named function with aliases in the OpenCL library. + * + * @param aliases the function name aliases. + * + * @return the function pointer address + */ + static long getFunctionAddress(String[] aliases) { + for ( String aliase : aliases ) { + long address = getFunctionAddress(aliase); + if ( address != 0 ) + return address; + } + return 0; + } + + /** Helper method to get a pointer to a named function in the OpenCL library. */ + static long getFunctionAddress(String name) { + ByteBuffer buffer = MemoryUtil.encodeASCII(name); + return ngetFunctionAddress(MemoryUtil.getAddress(buffer)); + } + private static native long ngetFunctionAddress(long name); + + static native ByteBuffer getHostBuffer(final long address, final int size); + + private static native void resetNativeStubs(Class clazz); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLBuildProgramCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLBuildProgramCallback.java new file mode 100644 index 0000000..c1d3a76 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLBuildProgramCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * Instances of this class can be used to receive OpenCL program build notifications. + * A single CLBuildProgramCallback instance should only be used with programs created + * in the same CLContext. + * + * @author Spasi + */ +public abstract class CLBuildProgramCallback extends CLProgramCallback { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLChecks.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLChecks.java new file mode 100644 index 0000000..0a5b079 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLChecks.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.ByteBuffer; + +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL11.*; + +/** + * Utility class that provides runtime checks for OpenCL method calls. + * TODO: Revisit this when Java 7.0 is released, there will be new Buffer API with 64bit indices/sizes. + * + * @author Spasi + */ +final class CLChecks { + + private CLChecks() { + } + + /** + * Calculates the number of bytes in the specified cl_mem buffer rectangle region. + * + * @param offset the host offset + * @param region the rectangle region + * @param row_pitch the host row pitch + * @param slice_pitch the host slice pitch + * + * @return the region size in bytes + */ + static int calculateBufferRectSize(final PointerBuffer offset, final PointerBuffer region, long row_pitch, long slice_pitch) { + if ( !LWJGLUtil.CHECKS ) + return 0; + + final long x = offset.get(0); + final long y = offset.get(1); + final long z = offset.get(2); + + if ( LWJGLUtil.DEBUG && (x < 0 || y < 0 || z < 0) ) + throw new IllegalArgumentException("Invalid cl_mem host offset: " + x + ", " + y + ", " + z); + + final long w = region.get(0); + final long h = region.get(1); + final long d = region.get(2); + + if ( LWJGLUtil.DEBUG && (w < 1 || h < 1 || d < 1) ) + throw new IllegalArgumentException("Invalid cl_mem rectangle region dimensions: " + w + " x " + h + " x " + d); + + if ( row_pitch == 0 ) + row_pitch = w; + else if ( LWJGLUtil.DEBUG && row_pitch < w ) + throw new IllegalArgumentException("Invalid host row pitch specified: " + row_pitch); + + if ( slice_pitch == 0 ) + slice_pitch = row_pitch * h; + else if ( LWJGLUtil.DEBUG && slice_pitch < (row_pitch * h) ) + throw new IllegalArgumentException("Invalid host slice pitch specified: " + slice_pitch); + + return (int)((z * slice_pitch + y * row_pitch + x) + (w * h * d)); + } + + /** + * Calculates the number of bytes in the specified cl_mem image region. + * This implementation assumes 1 byte per element, because we cannot the + * image type. + * + * @param region the image region + * @param row_pitch the row pitch + * @param slice_pitch the slice pitch + * + * @return the region size in bytes + */ + static int calculateImageSize(final PointerBuffer region, long row_pitch, long slice_pitch) { + if ( !LWJGLUtil.CHECKS ) + return 0; + + final long w = region.get(0); + final long h = region.get(1); + final long d = region.get(2); + + if ( LWJGLUtil.DEBUG && (w < 1 || h < 1 || d < 1) ) + throw new IllegalArgumentException("Invalid cl_mem image region dimensions: " + w + " x " + h + " x " + d); + + if ( row_pitch == 0 ) + row_pitch = w; + else if ( LWJGLUtil.DEBUG && row_pitch < w ) + throw new IllegalArgumentException("Invalid row pitch specified: " + row_pitch); + + if ( slice_pitch == 0 ) + slice_pitch = row_pitch * h; + else if ( LWJGLUtil.DEBUG && slice_pitch < (row_pitch * h) ) + throw new IllegalArgumentException("Invalid slice pitch specified: " + slice_pitch); + + return (int)(slice_pitch * d); + + } + + /** + * Calculates the number of bytes in the specified 2D image. + * + * @param format the cl_image_format struct + * @param w the image width + * @param h the image height + * @param row_pitch the image row pitch + * + * @return the 2D image size in bytes + */ + static int calculateImage2DSize(final ByteBuffer format, final long w, final long h, long row_pitch) { + if ( !LWJGLUtil.CHECKS ) + return 0; + + if ( LWJGLUtil.DEBUG && (w < 1 || h < 1) ) + throw new IllegalArgumentException("Invalid 2D image dimensions: " + w + " x " + h); + + final int elementSize = getElementSize(format); + + if ( row_pitch == 0 ) + row_pitch = w * elementSize; + else if ( LWJGLUtil.DEBUG && ((row_pitch < w * elementSize) || (row_pitch % elementSize != 0)) ) + throw new IllegalArgumentException("Invalid image_row_pitch specified: " + row_pitch); + + return (int)(row_pitch * h); + } + + /** + * Calculates the number of bytes in the specified 3D image. + * + * @param format the cl_image_format struct + * @param w the image width + * @param h the image height + * @param d the image depth + * @param row_pitch the image row pitch + * @param slice_pitch the image slice pitch + * + * @return the 3D image size in bytes + */ + static int calculateImage3DSize(final ByteBuffer format, final long w, final long h, final long d, long row_pitch, long slice_pitch) { + if ( !LWJGLUtil.CHECKS ) + return 0; + + if ( LWJGLUtil.DEBUG && (w < 1 || h < 1 || d < 2) ) + throw new IllegalArgumentException("Invalid 3D image dimensions: " + w + " x " + h + " x " + d); + + final int elementSize = getElementSize(format); + + if ( row_pitch == 0 ) + row_pitch = w * elementSize; + else if ( LWJGLUtil.DEBUG && ((row_pitch < w * elementSize) || (row_pitch % elementSize != 0)) ) + throw new IllegalArgumentException("Invalid image_row_pitch specified: " + row_pitch); + + if ( slice_pitch == 0 ) + slice_pitch = row_pitch * h; + else if ( LWJGLUtil.DEBUG && ((row_pitch < row_pitch * h) || (slice_pitch % row_pitch != 0)) ) + throw new IllegalArgumentException("Invalid image_slice_pitch specified: " + row_pitch); + + return (int)(slice_pitch * d); + } + + /** + * Returns the number of bytes per element for the specified image format. + * + * @param format a cl_image_format struct. + * + * @return the number of bytes per image element + */ + private static int getElementSize(final ByteBuffer format) { + final int channelOrder = format.getInt(format.position() + 0); + final int channelType = format.getInt(format.position() + 4); + + return getChannelCount(channelOrder) * getChannelSize(channelType); + } + + /** + * Returns the number of channels in the specified cl_channel_order. + * + * @param channelOrder the cl_channel_order + * + * @return the number of channels + */ + private static int getChannelCount(final int channelOrder) { + switch ( channelOrder ) { + case CL_R: + case CL_A: + case CL_INTENSITY: + case CL_LUMINANCE: + case CL_Rx: + return 1; + case CL_RG: + case CL_RA: + case CL_RGx: + return 2; + case CL_RGB: + case CL_RGBx: + return 3; + case CL_RGBA: + case CL_BGRA: + case CL_ARGB: + return 4; + default: + throw new IllegalArgumentException("Invalid cl_channel_order specified: " + LWJGLUtil.toHexString(channelOrder)); + } + } + + /** + * Returns the number of bytes in the specified cl_channel_type. + * + * @param channelType the cl_channel_type + * + * @return the number of bytes + */ + private static int getChannelSize(final int channelType) { + switch ( channelType ) { + case CL_SNORM_INT8: + case CL_UNORM_INT8: + case CL_SIGNED_INT8: + case CL_UNSIGNED_INT8: + return 1; + case CL_SNORM_INT16: + case CL_UNORM_INT16: + case CL_UNORM_SHORT_565: + case CL_UNORM_SHORT_555: + case CL_SIGNED_INT16: + case CL_UNSIGNED_INT16: + case CL_HALF_FLOAT: + return 2; + case CL_UNORM_INT_101010: + case CL_SIGNED_INT32: + case CL_UNSIGNED_INT32: + case CL_FLOAT: + return 4; + default: + throw new IllegalArgumentException("Invalid cl_channel_type specified: " + LWJGLUtil.toHexString(channelType)); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCommandQueue.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCommandQueue.java new file mode 100644 index 0000000..4aa4427 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCommandQueue.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; + +/** + * This class is a wrapper around a cl_command_queue pointer. + * + * @author Spasi + */ +public final class CLCommandQueue extends CLObjectChild<CLContext> { + + private static final InfoUtil<CLCommandQueue> util = CLPlatform.getInfoUtilInstance(CLCommandQueue.class, "CL_COMMAND_QUEUE_UTIL"); + + private final CLDevice device; + + private final CLObjectRegistry<CLEvent> clEvents; + + CLCommandQueue(final long pointer, final CLContext context, final CLDevice device) { + super(pointer, context); + if ( isValid() ) { + this.device = device; + this.clEvents = new CLObjectRegistry<CLEvent>(); + context.getCLCommandQueueRegistry().registerObject(this); + } else { + this.device = null; + this.clEvents = null; + } + } + + public CLDevice getCLDevice() { + return device; + } + + /** + * Returns a CLEvent associated with this command-queue. + * + * @param id the event object id + * + * @return the CLEvent object + */ + public CLEvent getCLEvent(final long id) { + return clEvents.getObject(id); + } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(int param_name) { + return util.getInfoInt(this, param_name); + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + CLObjectRegistry<CLEvent> getCLEventRegistry() { return clEvents; } + + /** + * Called from OpenCL methods that generate CLEvents. + * + * @param event a buffer containing a CLEvent pointer. + */ + void registerCLEvent(final PointerBuffer event) { + if ( event != null ) + new CLEvent(event.get(event.position()), this); + } + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().getCLCommandQueueRegistry().unregisterObject(this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCompileProgramCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCompileProgramCallback.java new file mode 100644 index 0000000..d8a534d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLCompileProgramCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * Instances of this class can be used to receive OpenCL program compilation notifications. + * A single CLCompileProgramCallback instance should only be used with programs created + * in the same CLContext. + * + * @author Spasi + */ +public abstract class CLCompileProgramCallback extends CLProgramCallback { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContext.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContext.java new file mode 100644 index 0000000..ff85cde --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContext.java @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opencl.api.CLImageFormat; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.Drawable; + +import java.nio.IntBuffer; +import java.util.List; + +/** + * This class is a wrapper around a cl_context pointer. + * + * @author Spasi + */ +public final class CLContext extends CLObjectChild<CLPlatform> { + + private static final CLContextUtil util = (CLContextUtil)CLPlatform.getInfoUtilInstance(CLContext.class, "CL_CONTEXT_UTIL"); + + private final CLObjectRegistry<CLCommandQueue> clCommandQueues; + private final CLObjectRegistry<CLMem> clMems; + private final CLObjectRegistry<CLSampler> clSamplers; + private final CLObjectRegistry<CLProgram> clPrograms; + private final CLObjectRegistry<CLEvent> clEvents; + + private long + contextCallback, + printfCallback; + + CLContext(final long pointer, final CLPlatform platform) { + super(pointer, platform); + + // We do not need to register the context with the platform, + // there is no API that returns cl_context, except clCreateContext. + + if ( isValid() ) { + clCommandQueues = new CLObjectRegistry<CLCommandQueue>(); + clMems = new CLObjectRegistry<CLMem>(); + clSamplers = new CLObjectRegistry<CLSampler>(); + clPrograms = new CLObjectRegistry<CLProgram>(); + clEvents = new CLObjectRegistry<CLEvent>(); + } else { + clCommandQueues = null; + clMems = null; + clSamplers = null; + clPrograms = null; + clEvents = null; + } + } + + /** + * Returns a CLCommandQueue associated with this context. + * + * @param id the command queue object id + * + * @return the CLCommandQueue object + */ + public CLCommandQueue getCLCommandQueue(final long id) { return clCommandQueues.getObject(id); } + + /** + * Returns a CLMem associated with this context. + * + * @param id the memory object id + * + * @return the CLMem object + */ + public CLMem getCLMem(final long id) { return clMems.getObject(id); } + + /** + * Returns a CLSampler associated with this context. + * + * @param id the sampler object id + * + * @return the CLSampler object + */ + public CLSampler getCLSampler(final long id) { return clSamplers.getObject(id); } + + /** + * Returns a CLProgram associated with this context. + * + * @param id the program object id + * + * @return the CLProgram object + */ + public CLProgram getCLProgram(final long id) { return clPrograms.getObject(id); } + + /** + * Returns a user CLEvent associated with this context. + * + * @param id the event object id + * + * @return the CLEvent object + */ + public CLEvent getCLEvent(final long id) { return clEvents.getObject(id); } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param devices the devices to use + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext create(final CLPlatform platform, final List<CLDevice> devices, final IntBuffer errcode_ret) throws LWJGLException { + return create(platform, devices, null, null, errcode_ret); + } + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param devices the devices to use + * @param pfn_notify the context callback function + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext create(final CLPlatform platform, final List<CLDevice> devices, final CLContextCallback pfn_notify, final IntBuffer errcode_ret) throws LWJGLException { + return create(platform, devices, pfn_notify, null, errcode_ret); + } + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param devices the devices to use + * @param share_drawable the OpenGL drawable to share objects with + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext create(final CLPlatform platform, final List<CLDevice> devices, final CLContextCallback pfn_notify, final Drawable share_drawable, final IntBuffer errcode_ret) throws LWJGLException { + return util.create(platform, devices, pfn_notify, share_drawable, errcode_ret); + } + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param device_type the device type to use + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext createFromType(final CLPlatform platform, final long device_type, final IntBuffer errcode_ret) throws LWJGLException { + return util.createFromType(platform, device_type, null, null, errcode_ret); + } + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param device_type the device type to use + * @param pfn_notify the context callback function + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext createFromType(final CLPlatform platform, final long device_type, final CLContextCallback pfn_notify, final IntBuffer errcode_ret) throws LWJGLException { + return util.createFromType(platform, device_type, pfn_notify, null, errcode_ret); + } + + /** + * Creates a new CLContext. + * + * @param platform the platform to use + * @param device_type the device type to use + * @param share_drawable the OpenGL drawable to share objects with + * @param errcode_ret the error code result + * + * @return the new CLContext + * + * @throws LWJGLException if an exception occurs while creating the context + */ + public static CLContext createFromType(final CLPlatform platform, final long device_type, final CLContextCallback pfn_notify, final Drawable share_drawable, final IntBuffer errcode_ret) throws LWJGLException { + return util.createFromType(platform, device_type, pfn_notify, share_drawable, errcode_ret); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(int param_name) { + return util.getInfoInt(this, param_name); + } + + /** + * Returns the list of devices in context. + * + * @return the list of devices + */ + public List<CLDevice> getInfoDevices() { + return util.getInfoDevices(this); + } + + public List<CLImageFormat> getSupportedImageFormats(final long flags, final int image_type) { + return getSupportedImageFormats(flags, image_type, null); + } + + public List<CLImageFormat> getSupportedImageFormats(final long flags, final int image_type, final Filter<CLImageFormat> filter) { + return util.getSupportedImageFormats(this, flags, image_type, filter); + } + + /** CLContext utility methods interface. */ + interface CLContextUtil extends InfoUtil<CLContext> { + + List<CLDevice> getInfoDevices(CLContext context); + + CLContext create(CLPlatform platform, List<CLDevice> devices, CLContextCallback pfn_notify, Drawable share_drawable, IntBuffer errcode_ret) throws LWJGLException; + + CLContext createFromType(CLPlatform platform, long device_type, CLContextCallback pfn_notify, Drawable share_drawable, IntBuffer errcode_ret) throws LWJGLException; + + List<CLImageFormat> getSupportedImageFormats(CLContext context, final long flags, final int image_type, Filter<CLImageFormat> filter); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + CLObjectRegistry<CLCommandQueue> getCLCommandQueueRegistry() { return clCommandQueues; } + + CLObjectRegistry<CLMem> getCLMemRegistry() { return clMems; } + + CLObjectRegistry<CLSampler> getCLSamplerRegistry() { return clSamplers; } + + CLObjectRegistry<CLProgram> getCLProgramRegistry() { return clPrograms; } + + CLObjectRegistry<CLEvent> getCLEventRegistry() { return clEvents; } + + private boolean checkCallback(final long callback, final int result) { + if ( result == 0 && (callback == 0 || isValid()) ) + return true; + + if ( callback != 0 ) + CallbackUtil.deleteGlobalRef(callback); + return false; + } + + /** + * Associates this context with the specified context callback reference. If the context + * is invalid, the callback reference is deleted. NO-OP if user_data is 0. + * + * @param callback the context callback pointer + */ + void setContextCallback(final long callback) { + if ( checkCallback(callback, 0) ) + this.contextCallback = callback; + } + + /** + * Associates this context with the specified printf callback reference. If the context + * is invalid, the callback reference is deleted. NO-OP if user_data is 0. + * + * @param callback the printf callback pointer + */ + void setPrintfCallback(final long callback, final int result) { + if ( checkCallback(callback, result) ) + this.printfCallback = callback; + } + + /** + * Decrements the context's reference count. If the reference + * count hits zero, it also deletes + * any callback objects associated with it. + */ + void releaseImpl() { + if ( release() > 0 ) + return; + + if ( contextCallback != 0 ) + CallbackUtil.deleteGlobalRef(contextCallback); + if ( printfCallback != 0 ) + CallbackUtil.deleteGlobalRef(printfCallback); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContextCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContextCallback.java new file mode 100644 index 0000000..4893a97 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLContextCallback.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +import java.nio.ByteBuffer; + +/** + * Instances of this class can be used to receive OpenCL context error notifications. + * + * @author Spasi + */ +public abstract class CLContextCallback extends PointerWrapperAbstract { + + private final boolean custom; + + protected CLContextCallback() { + super(CallbackUtil.getContextCallback()); + custom = false; + } + + /** + * This constructor allows non-LWJGL implementations. + * + * @param pointer + */ + protected CLContextCallback(final long pointer) { + super(pointer); + + if ( pointer == 0 ) + throw new RuntimeException("Invalid callback function pointer specified."); + + custom = true; + } + + final boolean isCustom() { + return custom; + } + + /** + * The callback method. + * + * @param errinfo the error description + * @param private_info optional error data (may be null) + */ + protected abstract void handleMessage(String errinfo, ByteBuffer private_info); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLDevice.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLDevice.java new file mode 100644 index 0000000..72535e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLDevice.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; + +/** + * This class is a wrapper around a cl_device_id pointer. + * + * @author Spasi + */ +public final class CLDevice extends CLObjectChild<CLDevice> { + + private static final InfoUtil<CLDevice> util = CLPlatform.getInfoUtilInstance(CLDevice.class, "CL_DEVICE_UTIL"); + + private final CLPlatform platform; + private final CLObjectRegistry<CLDevice> subCLDevices; + + private Object caps; + + CLDevice(final long pointer, final CLPlatform platform) { + this(pointer, null, platform); + } + + /** + * EXT_device_fission constructor. + * + * @param pointer the sub-device pointer + * @param parent the parent CLDevice + */ + CLDevice(final long pointer, final CLDevice parent) { + this(pointer, parent, parent.getPlatform()); + } + + CLDevice(final long pointer, final CLDevice parent, final CLPlatform platform) { + super(pointer, parent); + + if ( isValid() ) { + this.platform = platform; + platform.getCLDeviceRegistry().registerObject(this); + + this.subCLDevices = new CLObjectRegistry<CLDevice>(); + if ( parent != null ) + parent.subCLDevices.registerObject(this); + } else { + this.platform = null; + this.subCLDevices = null; + } + } + + public CLPlatform getPlatform() { + return platform; + } + + /** + * Returns a sub-device of this device. + * + * @param id the sub-device object id + * + * @return the CLDevice object + */ + public CLDevice getSubCLDevice(final long id) { return subCLDevices.getObject(id); } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Returns the value of the specified String parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public String getInfoString(int param_name) { + return util.getInfoString(this, param_name); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(int param_name) { + return util.getInfoInt(this, param_name); + } + + /** + * Returns the boolean value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public boolean getInfoBoolean(int param_name) { + return util.getInfoInt(this, param_name) != 0; + } + + /** + * Returns the size_t value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getInfoSize(int param_name) { + return util.getInfoSize(this, param_name); + } + + /** + * Returns an array of size_t values of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter values + */ + public long[] getInfoSizeArray(int param_name) { + return util.getInfoSizeArray(this, param_name); + } + + /** + * Returns the long value of the specified parameter. Can be used + * for both cl_ulong and cl_bitfield parameters. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getInfoLong(int param_name) { + return util.getInfoLong(this, param_name); + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + void setCapabilities(final Object caps) { + this.caps = caps; + } + + Object getCapabilities() { + return caps; + } + + int retain() { + if ( getParent() == null ) + return getReferenceCount(); // NO-OP, root devices cannot be retained + + return super.retain(); + } + + int release() { + if ( getParent() == null ) + return getReferenceCount(); // NO-OP, root devices cannot be released + + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().subCLDevices.unregisterObject(this); + } + } + + CLObjectRegistry<CLDevice> getSubCLDeviceRegistry() { return subCLDevices; } + + /** + * Called from clCreateSubDevicesEXT to register new sub-devices. + * + * @param devices a buffer containing CLDevice pointers. + */ + void registerSubCLDevices(final PointerBuffer devices) { + for ( int i = devices.position(); i < devices.limit(); i++ ) { + final long pointer = devices.get(i); + if ( pointer != 0 ) + new CLDevice(pointer, this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEvent.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEvent.java new file mode 100644 index 0000000..3bcfeb9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEvent.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * This class is a wrapper around a cl_mem pointer. + * + * @author Spasi + */ +public final class CLEvent extends CLObjectChild<CLContext> { + + private static final CLEventUtil util = (CLEventUtil)CLPlatform.getInfoUtilInstance(CLEvent.class, "CL_EVENT_UTIL"); + + private final CLCommandQueue queue; + + CLEvent(final long pointer, final CLContext context) { + this(pointer, context, null); + } + + CLEvent(final long pointer, final CLCommandQueue queue) { + this(pointer, queue.getParent(), queue); + } + + CLEvent(final long pointer, final CLContext context, final CLCommandQueue queue) { + super(pointer, context); + if ( isValid() ) { + this.queue = queue; + if ( queue == null ) + context.getCLEventRegistry().registerObject(this); + else + queue.getCLEventRegistry().registerObject(this); + } else + this.queue = null; + } + + /** + * Returns the command-queue associated with this event. For + * user events this method returns null. + * + * @return the command-queue or null if this is a user event + */ + public CLCommandQueue getCLCommandQueue() { + return queue; + } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(final int param_name) { + return util.getInfoInt(this, param_name); + } + + // clGetEventProfilingInfo methods + + /** + * Returns the long value of the specified parameter. Can be used + * for both cl_ulong and cl_bitfield parameters. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getProfilingInfoLong(int param_name) { + return util.getProfilingInfoLong(this, param_name); + } + + /** CLEvent utility methods interface. */ + interface CLEventUtil extends InfoUtil<CLEvent> { + + long getProfilingInfoLong(CLEvent event, int param_name); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + CLObjectRegistry<CLEvent> getParentRegistry() { + if ( queue == null ) + return getParent().getCLEventRegistry(); + else + return queue.getCLEventRegistry(); + } + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) { + if ( queue == null ) + getParent().getCLEventRegistry().unregisterObject(this); + else + queue.getCLEventRegistry().unregisterObject(this); + } + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEventCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEventCallback.java new file mode 100644 index 0000000..3734606 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLEventCallback.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class can be used to handle OpenCL event callbacks. A single + * CLEventCallback instance should only be used on events generated from the same + * CLCommandQueue or on user events associated with the same CLContext. + * + * @author Spasi + */ +public abstract class CLEventCallback extends PointerWrapperAbstract { + + private CLObjectRegistry<CLEvent> eventRegistry; + + protected CLEventCallback() { + super(CallbackUtil.getEventCallback()); + } + + /** + * Sets the eventRegistry that contains the CLEvents to which we're registered. + * + * @param eventRegistry the CLEvent object registry + */ + void setRegistry(final CLObjectRegistry<CLEvent> eventRegistry) { + this.eventRegistry = eventRegistry; + } + + /** + * Called from native code. + * + * @param event_address the CLEvent object pointer + */ + private void handleMessage(long event_address, int event_command_exec_status) { + handleMessage(eventRegistry.getObject(event_address), event_command_exec_status); + } + + /** + * The callback method. + * + * @param event the CLEvent object + * @param event_command_exec_status the execution status + */ + protected abstract void handleMessage(CLEvent event, int event_command_exec_status); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLFunctionAddress.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLFunctionAddress.java new file mode 100644 index 0000000..1b4976a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLFunctionAddress.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * This class is a wrapper around an OpenCL extension function pointer. + * + * @author Spasi + */ +final class CLFunctionAddress extends PointerWrapperAbstract { + + CLFunctionAddress(final long pointer) { + super(pointer); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLKernel.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLKernel.java new file mode 100644 index 0000000..18eecc0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLKernel.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * This class is a wrapper around a cl_kernel pointer. + * + * @author Spasi + */ +public final class CLKernel extends CLObjectChild<CLProgram> { + + private static final CLKernelUtil util = (CLKernelUtil)CLPlatform.getInfoUtilInstance(CLKernel.class, "CL_KERNEL_UTIL"); + + CLKernel(final long pointer, final CLProgram program) { + super(pointer, program); + if ( isValid() ) + program.getCLKernelRegistry().registerObject(this); + } + + // ---------------[ UTILITY METHODS ]--------------- + + // clSetKernelArg methods + + /** + * Sets a kernel argument at the specified index to the specified + * byte value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final byte value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * byte value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final short value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * int value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final int value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * long value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final long value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * float value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final float value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * double value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final double value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets a kernel argument at the specified index to the specified + * pointer value. + * + * @param index the argument index + * @param value the argument value + * + * @return this CLKernel object + */ + public CLKernel setArg(final int index, final CLObject value) { + util.setArg(this, index, value); + return this; + } + + /** + * Sets the size of a __local kernel argument at the specified index. + * + * @param index the argument index + * @param size the argument size + * + * @return this CLKernel object + */ + public CLKernel setArgSize(final int index, final long size) { + util.setArgSize(this, index, size); + return this; + } + + // clGetKernelInfo methods + + /** + * Returns the String value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public String getInfoString(final int param_name) { + return util.getInfoString(this, param_name); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(final int param_name) { + return util.getInfoInt(this, param_name); + } + + // clGetKernelWorkGroupInfo methods + + /** + * Returns the size_t value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getWorkGroupInfoSize(final CLDevice device, int param_name) { + return util.getWorkGroupInfoSize(this, device, param_name); + } + + /** + * Returns an array of size_t values of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter values + */ + public long[] getWorkGroupInfoSizeArray(final CLDevice device, int param_name) { + return util.getWorkGroupInfoSizeArray(this, device, param_name); + } + + /** + * Returns the long value of the specified parameter. Can be used + * for both cl_ulong and cl_bitfield parameters. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getWorkGroupInfoLong(final CLDevice device, int param_name) { + return util.getWorkGroupInfoLong(this, device, param_name); + } + + /** CLKernel utility methods interface. */ + interface CLKernelUtil extends InfoUtil<CLKernel> { + + void setArg(CLKernel kernel, int index, byte value); + + void setArg(CLKernel kernel, int index, short value); + + void setArg(CLKernel kernel, int index, int value); + + void setArg(CLKernel kernel, int index, long value); + + void setArg(CLKernel kernel, int index, float value); + + void setArg(CLKernel kernel, int index, double value); + + void setArg(CLKernel kernel, int index, CLObject pointer); + + void setArgSize(CLKernel kernel, int index, long size); + + long getWorkGroupInfoSize(CLKernel kernel, CLDevice device, int param_name); + + long[] getWorkGroupInfoSizeArray(CLKernel kernel, CLDevice device, int param_name); + + long getWorkGroupInfoLong(CLKernel kernel, CLDevice device, int param_name); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().getCLKernelRegistry().unregisterObject(this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLLinkProgramCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLLinkProgramCallback.java new file mode 100644 index 0000000..ea30657 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLLinkProgramCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * Instances of this class can be used to receive OpenCL program linkage notifications. + * A single CLLinkProgramCallback instance should only be used with programs created + * in the same CLContext. + * + * @author Spasi + */ +public abstract class CLLinkProgramCallback extends CLProgramCallback { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMem.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMem.java new file mode 100644 index 0000000..9275b0f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMem.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.opencl.api.CLBufferRegion; +import org.lwjgl.opencl.api.CLImageFormat; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** + * This class is a wrapper around a cl_mem pointer. + * + * @author Spasi + */ +public final class CLMem extends CLObjectChild<CLContext> { + + private static final CLMemUtil util = (CLMemUtil)CLPlatform.getInfoUtilInstance(CLMem.class, "CL_MEM_UTIL"); + + CLMem(final long pointer, final CLContext context) { + super(pointer, context); + if ( isValid() ) + context.getCLMemRegistry().registerObject(this); + } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Creates a new 2D image object. + * + * @param context the context on which to create the image object + * @param flags the memory object flags + * @param image_format the image format + * @param image_width the image width + * @param image_height the image height + * @param image_row_pitch the image row pitch + * @param host_ptr the host buffer from which to read image data (optional) + * @param errcode_ret the error code result + * + * @return the new CLMem object + */ + public static CLMem createImage2D(final CLContext context, final long flags, final CLImageFormat image_format, + final long image_width, final long image_height, final long image_row_pitch, + final Buffer host_ptr, final IntBuffer errcode_ret) { + return util.createImage2D(context, flags, image_format, image_width, image_height, image_row_pitch, host_ptr, errcode_ret); + } + + /** + * Creates a new 3D image object. + * + * @param context the context on which to create the image object + * @param flags the memory object flags + * @param image_format the image format + * @param image_width the image width + * @param image_height the image height + * @param image_depth the image depth + * @param image_row_pitch the image row pitch + * @param image_slice_pitch the image slice pitch + * @param host_ptr the host buffer from which to read image data (optional) + * @param errcode_ret the error code result + * + * @return the new CLMem object + */ + public static CLMem createImage3D(final CLContext context, final long flags, final CLImageFormat image_format, + final long image_width, final long image_height, final long image_depth, final long image_row_pitch, final long image_slice_pitch, + final Buffer host_ptr, final IntBuffer errcode_ret) { + return util.createImage3D(context, flags, image_format, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr, errcode_ret); + } + + public CLMem createSubBuffer(final long flags, final int buffer_create_type, final CLBufferRegion buffer_create_info, final IntBuffer errcode_ret) { + return util.createSubBuffer(this, flags, buffer_create_type, buffer_create_info, errcode_ret); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(int param_name) { + return util.getInfoInt(this, param_name); + } + + /** + * Returns the size_t value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getInfoSize(int param_name) { + return util.getInfoSize(this, param_name); + } + + /** + * Returns the long value of the specified parameter. Can be used + * for both cl_ulong and cl_bitfield parameters. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getInfoLong(int param_name) { + return util.getInfoLong(this, param_name); + } + + /** + * Returns a direct ByteBuffer instance that points to the host + * memory that backs this CLMem object. Applicable only to CLMem + * objects that were created with the CL_MEM_USE_HOST_PTR flag. + * + * @return the host memory ByteBuffer + */ + public ByteBuffer getInfoHostBuffer() { + return util.getInfoHostBuffer(this); + } + + // clGetImageInfo methods + + /** + * Returns the size_t value of the specified parameter. Applicable to image objects only. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getImageInfoSize(int param_name) { + return util.getImageInfoSize(this, param_name); + } + + /** + * Returns the image format. Applicable to image objects only. + * + * @return the parameter value + */ + public CLImageFormat getImageFormat() { + return util.getImageInfoFormat(this); + } + + /** + * Returns the image channel order. Applicable to image objects only. + * + * @return the parameter value + */ + public int getImageChannelOrder() { + return util.getImageInfoFormat(this, 0); + } + + /** + * Returns the image channel type. Applicable to image objects only. + * + * @return the parameter value + */ + public int getImageChannelType() { + return util.getImageInfoFormat(this, 1); + } + + // clGetGLObjectInfo methods + + /** + * Returns the GL object type. Applicable to CLMem objects + * that have been created GL objects only. + * + * @return the parameter value + */ + public int getGLObjectType() { + return util.getGLObjectType(this); + } + + /** + * Returns the GL object name. Applicable to CLMem objects + * that have been created GL objects only. + * + * @return the parameter value + */ + public int getGLObjectName() { + return util.getGLObjectName(this); + } + + // clGetGLTextureInfo methods + + /** + * Returns the int value of the specified parameter. Applicable to CLMem objects + * that have been created by GL textures only. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getGLTextureInfoInt(int param_name) { + return util.getGLTextureInfoInt(this, param_name); + } + + /** CLMem utility methods interface. */ + interface CLMemUtil extends InfoUtil<CLMem> { + + CLMem createImage2D(CLContext context, long flags, CLImageFormat image_format, long image_width, long image_height, long image_row_pitch, Buffer host_ptr, IntBuffer errcode_ret); + + CLMem createImage3D(CLContext context, long flags, CLImageFormat image_format, long image_width, long image_height, long image_depth, long image_row_pitch, long image_slice_pitch, Buffer host_ptr, IntBuffer errcode_ret); + + CLMem createSubBuffer(CLMem mem, long flags, int buffer_create_type, CLBufferRegion buffer_create_info, IntBuffer errcode_ret); + + ByteBuffer getInfoHostBuffer(CLMem mem); + + long getImageInfoSize(CLMem mem, int param_name); + + CLImageFormat getImageInfoFormat(CLMem mem); + + int getImageInfoFormat(CLMem mem, int index); + + int getGLObjectType(CLMem mem); + + int getGLObjectName(CLMem mem); + + int getGLTextureInfoInt(CLMem mem, int param_name); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + /** + * Sub-buffer factory. clCreateSubBuffer may return an existing CLMem. + * + * @param pointer the sub-buffer id + * @param context the context in which the sub-buffer was created + * + * @return the CLMem that represents the sub-buffer + */ + static CLMem create(final long pointer, final CLContext context) { + CLMem clMem = context.getCLMemRegistry().getObject(pointer); + if ( clMem == null ) + clMem = new CLMem(pointer, context); + else + clMem.retain(); + + return clMem; + } + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().getCLMemRegistry().unregisterObject(this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMemObjectDestructorCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMemObjectDestructorCallback.java new file mode 100644 index 0000000..944fdcf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLMemObjectDestructorCallback.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class can be used to receive OpenCL memory object destruction notifications. + * + * @author Spasi + */ +public abstract class CLMemObjectDestructorCallback extends PointerWrapperAbstract { + + protected CLMemObjectDestructorCallback() { + super(CallbackUtil.getMemObjectDestructorCallback()); + } + + /** + * The callback method. + * + * @param memobj id of the CLMem object that was destroyed + */ + protected abstract void handleMessage(long memobj); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLNativeKernel.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLNativeKernel.java new file mode 100644 index 0000000..ed853c4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLNativeKernel.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +import java.nio.ByteBuffer; + +/** + * Instances of this class can be used to execute native kernels. clEnqueueNativeKernel will build + * the its arguments automatically, in a way that allows <code>execute</code> to receive an array + * of ByteBuffers, pointing to cl_mem objects in global memory. The ByteBuffer objects should not + * be used outside the handleMessage method. + * + * @author Spasi + * @see CL10#clEnqueueNativeKernel + * @see #execute(java.nio.ByteBuffer[]) + */ +public abstract class CLNativeKernel extends PointerWrapperAbstract { + + protected CLNativeKernel() { + super(CallbackUtil.getNativeKernelCallback()); + } + + /** + * Implement this method to execute an action on cl_mem objects in global memory. + * + * @param memobjs an array of ByteBuffers pointing to cl_mem global memory. + */ + protected abstract void execute(ByteBuffer[] memobjs); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObject.java new file mode 100644 index 0000000..8efd386 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObject.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Base class for all OpenCL objects. + * + * @author Spasi + */ +abstract class CLObject extends PointerWrapperAbstract { + + protected CLObject(final long pointer) { + super(pointer); + } + + final long getPointerUnsafe() { + return pointer; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectChild.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectChild.java new file mode 100644 index 0000000..452566e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectChild.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLUtil; + +/** + * Base class for all CLObjects that are associated with a parent CLObject. + * + * @author Spasi + */ +abstract class CLObjectChild<P extends CLObject> extends CLObjectRetainable { + + private final P parent; + + protected CLObjectChild(final long pointer, final P parent) { + super(pointer); + + if ( LWJGLUtil.DEBUG && parent != null && !parent.isValid() ) + throw new IllegalStateException("The parent specified is not a valid CL object."); + + this.parent = parent; + } + + public P getParent() { + return parent; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRegistry.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRegistry.java new file mode 100644 index 0000000..39272a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRegistry.java @@ -0,0 +1,54 @@ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLUtil; + +/** + * A CLObjectChild container. + * + * @author Spasi + */ +class CLObjectRegistry<T extends CLObjectChild> { + + private FastLongMap<T> registry; + + CLObjectRegistry() { + } + + final boolean isEmpty() { + return registry == null || registry.isEmpty(); + } + + final T getObject(final long id) { + return registry == null ? null : registry.get(id); + } + + final boolean hasObject(final long id) { + return registry != null && registry.containsKey(id); + } + + final Iterable<FastLongMap.Entry<T>> getAll() { + return registry; + } + + void registerObject(final T object) { + final FastLongMap<T> map = getMap(); + final Long key = object.getPointer(); + + if ( LWJGLUtil.DEBUG && map.containsKey(key) ) + throw new IllegalStateException("Duplicate object found: " + object.getClass() + " - " + key); + + getMap().put(object.getPointer(), object); + } + + void unregisterObject(final T object) { + getMap().remove(object.getPointerUnsafe()); + } + + private FastLongMap<T> getMap() { + if ( registry == null ) + registry = new FastLongMap<T>(); + + return registry; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRetainable.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRetainable.java new file mode 100644 index 0000000..c6ebe7b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLObjectRetainable.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * Base class for all retainable OpenCL objects. + * + * @author Spasi + */ +abstract class CLObjectRetainable extends CLObject { + + private int refCount; + + protected CLObjectRetainable(final long pointer) { + super(pointer); + + if ( super.isValid() ) + this.refCount = 1; + } + + public final int getReferenceCount() { + return refCount; + } + + public final boolean isValid() { + return refCount > 0; + } + + int retain() { + checkValid(); + //System.out.println(getClass().getSimpleName() + " REF COUNT: " + pointer + " - " + (refCount + 1)); + return ++refCount; + } + + int release() { + checkValid(); + //System.out.println(getClass().getSimpleName() + " REF COUNT: " + pointer + " - " + (refCount - 1)); + return --refCount; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPlatform.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPlatform.java new file mode 100644 index 0000000..2082052 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPlatform.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.opencl.api.Filter; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.List; + +import static java.lang.Math.*; + +/** + * This class is a wrapper around a cl_platform_id pointer. + * + * @author Spasi + */ +public final class CLPlatform extends CLObject { + + private static final CLPlatformUtil util = (CLPlatformUtil)getInfoUtilInstance(CLPlatform.class, "CL_PLATFORM_UTIL"); + + private static final FastLongMap<CLPlatform> clPlatforms = new FastLongMap<CLPlatform>(); + + private final CLObjectRegistry<CLDevice> clDevices; + + private Object caps; + + CLPlatform(final long pointer) { + super(pointer); + + if ( isValid() ) { + clPlatforms.put(pointer, this); + clDevices = new CLObjectRegistry<CLDevice>(); + } else + clDevices = null; + } + + /** + * Returns a CLPlatform with the specified id. + * + * @param id the platform object id + * + * @return the CLPlatform object + */ + public static CLPlatform getCLPlatform(final long id) { return clPlatforms.get(id); } + + /** + * Returns a CLDevice that is available on this platform. + * + * @param id the device object id + * + * @return the CLDevice object + */ + public CLDevice getCLDevice(final long id) { return clDevices.getObject(id); } + + // ---------------[ UTILITY METHODS ]--------------- + + @SuppressWarnings("unchecked") + static <T extends CLObject> InfoUtil<T> getInfoUtilInstance(final Class<T> clazz, final String fieldName) { + InfoUtil<T> instance = null; + try { + final Class<?> infoUtil = Class.forName("org.lwjgl.opencl.InfoUtilFactory"); + instance = (InfoUtil<T>)infoUtil.getDeclaredField(fieldName).get(null); + } catch (Exception e) { + // Ignore + } + return instance; + } + + /** + * Returns a list of all the available platforms. + * + * @return the available platforms + */ + public static List<CLPlatform> getPlatforms() { + return getPlatforms(null); + } + + /** + * Returns a list of the available platforms, filtered by the specified filter. + * + * @param filter the platform filter + * + * @return the available platforms + */ + public static List<CLPlatform> getPlatforms(final Filter<CLPlatform> filter) { + return util.getPlatforms(filter); + } + + /** + * Returns the String value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public String getInfoString(int param_name) { + return util.getInfoString(this, param_name); + } + + /** + * Returns a list of the available devices on this platform that + * match the specified type. + * + * @param device_type the device type + * + * @return the available devices + */ + public List<CLDevice> getDevices(final int device_type) { + return getDevices(device_type, null); + } + + /** + * Returns a list of the available devices on this platform that + * match the specified type, filtered by the specified filter. + * + * @param device_type the device type + * @param filter the device filter + * + * @return the available devices + */ + public List<CLDevice> getDevices(final int device_type, final Filter<CLDevice> filter) { + return util.getDevices(this, device_type, filter); + } + + /** CLPlatform utility methods interface. */ + interface CLPlatformUtil extends InfoUtil<CLPlatform> { + + List<CLPlatform> getPlatforms(Filter<CLPlatform> filter); + + List<CLDevice> getDevices(CLPlatform platform, int device_type, final Filter<CLDevice> filter); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + void setCapabilities(final Object caps) { + this.caps = caps; + } + + Object getCapabilities() { + return caps; + } + + /** + * Called from clGetPlatformIDs to register new platforms. + * + * @param platforms a buffer containing CLPlatform pointers. + */ + static void registerCLPlatforms(final PointerBuffer platforms, final IntBuffer num_platforms) { + if ( platforms == null ) + return; + + final int pos = platforms.position(); + final int count = min(num_platforms.get(0), platforms.remaining()); // We can't depend on .remaining() + for ( int i = 0; i < count; i++ ) { + final long id = platforms.get(pos + i); + if ( !clPlatforms.containsKey(id) ) + new CLPlatform(id); + } + } + + CLObjectRegistry<CLDevice> getCLDeviceRegistry() { return clDevices; } + + /** + * Called from <code>clGetDeviceIDs</code> to register new devices. + * + * @param devices a buffer containing CLDevice pointers. + */ + void registerCLDevices(final PointerBuffer devices, final IntBuffer num_devices) { + final int pos = devices.position(); + final int count = min(num_devices.get(num_devices.position()), devices.remaining()); // We can't depend on .remaining() + for ( int i = 0; i < count; i++ ) { + final long id = devices.get(pos + i); + if ( !clDevices.hasObject(id) ) + new CLDevice(id, this); + } + } + + /** + * Called from <code>clGetContextInfo</code> to register new devices. + * + * @param devices a buffer containing CLDevice pointers. + */ + void registerCLDevices(final ByteBuffer devices, final PointerBuffer num_devices) { + final int pos = devices.position(); + final int count = min((int)num_devices.get(num_devices.position()), devices.remaining()) / PointerBuffer.getPointerSize(); // We can't depend on .remaining() + for ( int i = 0; i < count; i++ ) { + final int offset = pos + (i * PointerBuffer.getPointerSize()); + final long id = PointerBuffer.is64Bit() ? devices.getLong(offset) : devices.getInt(offset); + if ( !clDevices.hasObject(id) ) + new CLDevice(id, this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPrintfCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPrintfCallback.java new file mode 100644 index 0000000..9355f30 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLPrintfCallback.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class can be used to receive OpenCL printf messages. + * Different CLContexts should use different CLPrintfCallback instances. + * + * @author Spasi + */ +public abstract class CLPrintfCallback extends PointerWrapperAbstract { + + protected CLPrintfCallback() { + super(CallbackUtil.getPrintfCallback()); + } + + /** The callback method. */ + protected abstract void handleMessage(String data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgram.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgram.java new file mode 100644 index 0000000..1c651ed --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgram.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; + +import java.nio.ByteBuffer; + +/** + * This class is a wrapper around a cl_program pointer. + * + * @author Spasi + */ +public final class CLProgram extends CLObjectChild<CLContext> { + + private static final CLProgramUtil util = (CLProgramUtil)CLPlatform.getInfoUtilInstance(CLProgram.class, "CL_PROGRAM_UTIL"); + + private final CLObjectRegistry<CLKernel> clKernels; + + CLProgram(final long pointer, final CLContext context) { + super(pointer, context); + + if ( isValid() ) { + context.getCLProgramRegistry().registerObject(this); + clKernels = new CLObjectRegistry<CLKernel>(); + } else + clKernels = null; + } + + /** + * Returns a CLKernel associated with this program. + * + * @param id the kernel id + * + * @return the CLKernel object + */ + public CLKernel getCLKernel(final long id) { + return clKernels.getObject(id); + } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Creates kernel objects for all kernels functions in this program. + * + * @return a CLKernel array + */ + public CLKernel[] createKernelsInProgram() { + return util.createKernelsInProgram(this); + } + + /** + * Returns the String value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public String getInfoString(final int param_name) { + return util.getInfoString(this, param_name); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(final int param_name) { + return util.getInfoInt(this, param_name); + } + + /** + * Returns an array of size_t values of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter values + */ + public long[] getInfoSizeArray(final int param_name) { + return util.getInfoSizeArray(this, param_name); + } + + /** + * Returns an array of CLDevices associated with this program. + * + * @return the array of devices + */ + public CLDevice[] getInfoDevices() { + return util.getInfoDevices(this); + } + + /** + * Returns the program binaries for all devices associated with program, + * written sequentially in the target ByteBuffer. If the <code>target</code> + * parameter is null, a new ByteBuffer will be allocated. If not, the + * target ByteBuffer must be big enough to hold the program binaries, as + * returned by CL_PROGRAM_BINARY_SIZES. + * + * @param target the target ByteBuffer array. + * + * @return the array of devices + */ + public ByteBuffer getInfoBinaries(final ByteBuffer target) { + return util.getInfoBinaries(this, target); + } + + /** + * Returns the program binaries for all devices associated with program, + * as a ByteBuffer array. If the <code>target</code> parameter is null, + * a new ByteBuffer array will be allocated. If not, the target ByteBuffers + * must be big enough to hold the program binaries, as returned by + * CL_PROGRAM_BINARY_SIZES. + * + * @param target the target ByteBuffer array. + * + * @return the array of devices + */ + public ByteBuffer[] getInfoBinaries(final ByteBuffer[] target) { + return util.getInfoBinaries(this, target); + } + + // clGetProgramBuildInfo methods + + /** + * Returns the String value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public String getBuildInfoString(final CLDevice device, final int param_name) { + return util.getBuildInfoString(this, device, param_name); + } + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getBuildInfoInt(final CLDevice device, final int param_name) { + return util.getBuildInfoInt(this, device, param_name); + } + + /** CLProgram utility methods interface. */ + interface CLProgramUtil extends InfoUtil<CLProgram> { + + CLKernel[] createKernelsInProgram(CLProgram program); + + CLDevice[] getInfoDevices(CLProgram program); + + ByteBuffer getInfoBinaries(CLProgram program, ByteBuffer target); + + ByteBuffer[] getInfoBinaries(CLProgram program, ByteBuffer[] target); + + String getBuildInfoString(CLProgram program, final CLDevice device, int param_name); + + int getBuildInfoInt(CLProgram program, final CLDevice device, int param_name); + + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + CLObjectRegistry<CLKernel> getCLKernelRegistry() { return clKernels; } + + /** + * Called from clCreateKernelsInProgram to register new CLKernels. + * + * @param kernels a buffer containing CLKernel pointers. + */ + void registerCLKernels(final PointerBuffer kernels) { + for ( int i = kernels.position(); i < kernels.limit(); i++ ) { + final long pointer = kernels.get(i); + if ( pointer != 0 ) + new CLKernel(pointer, this); + } + } + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().getCLProgramRegistry().unregisterObject(this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgramCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgramCallback.java new file mode 100644 index 0000000..675eafc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLProgramCallback.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Base class for OpenCL program action notifications. + * + * @author Spasi + */ +abstract class CLProgramCallback extends PointerWrapperAbstract { + + private CLContext context; + + protected CLProgramCallback() { + super(CallbackUtil.getProgramCallback()); + } + + /** + * Sets the context that contains the CLPrograms to which we're registered. + * + * @param context the CLContext object + */ + final void setContext(final CLContext context) { + this.context = context; + } + + /** + * Called from native code. + * + * @param program_address the CLProgram object pointer + */ + private void handleMessage(long program_address) { + handleMessage(context.getCLProgram(program_address)); + } + + /** + * The callback method. + * + * @param program the CLProgram object affected + */ + protected abstract void handleMessage(CLProgram program); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLSampler.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLSampler.java new file mode 100644 index 0000000..eeba203 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CLSampler.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * This class is a wrapper around a cl_sampler pointer. + * + * @author Spasi + */ +public final class CLSampler extends CLObjectChild<CLContext> { + + private static final InfoUtil<CLSampler> util = CLPlatform.getInfoUtilInstance(CLSampler.class, "CL_SAMPLER_UTIL"); + + CLSampler(final long pointer, final CLContext context) { + super(pointer, context); + if ( isValid() ) + context.getCLSamplerRegistry().registerObject(this); + } + + // ---------------[ UTILITY METHODS ]--------------- + + /** + * Returns the integer value of the specified parameter. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public int getInfoInt(int param_name) { + return util.getInfoInt(this, param_name); + } + + /** + * Returns the long value of the specified parameter. Can be used + * for both cl_ulong and cl_bitfield parameters. + * + * @param param_name the parameter + * + * @return the parameter value + */ + public long getInfoLong(int param_name) { + return util.getInfoLong(this, param_name); + } + + // -------[ IMPLEMENTATION STUFF BELOW ]------- + + int release() { + try { + return super.release(); + } finally { + if ( !isValid() ) + getParent().getCLSamplerRegistry().unregisterObject(this); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CallbackUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CallbackUtil.java new file mode 100644 index 0000000..6fb6f09 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/CallbackUtil.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class that handles OpenCL API callbacks. + * + * @author Spasi + */ +final class CallbackUtil { + + private static final Map<CLContext, Long> contextUserData = new HashMap<CLContext, Long>(); + + private CallbackUtil() {} + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address or 0 if the Object is null. + */ + static long createGlobalRef(final Object obj) { + return obj == null ? 0 : ncreateGlobalRef(obj); + } + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address. + */ + private static native long ncreateGlobalRef(Object obj); + + /** + * Deletes a global reference. + * + * @param ref the GlobalRef memory address. + */ + static native void deleteGlobalRef(long ref); + + /** + * Deletes the global reference represented by user_data if an OpenCL error occured. + * + * @param errcode the error code + * @param user_data the GlobalRef memory address + */ + static void checkCallback(final int errcode, final long user_data) { + if ( errcode != 0x0 && user_data != 0 ) + deleteGlobalRef(user_data); + } + + /* [ Context callback functionality ] + This is a little weird, so here's an explanation of what's happening for future reference: + Before making the clCreateContext call we create a global reference to the CLContextCallback object (using JNI's NewGlobalRef function). + We pass that global reference to the user_data parameter of clCreateContext. If clCreateContext returns anything but CL_SUCCESS, we + immediately destroy the global reference to avoid the memory leak. If the new context was created successfully, we associate the context + with the global reference in the contextUserData HashMap. On a future call to clReleaseContext, we clear that association and destroy the + global reference (if the reference count is 0). + */ + + /** + * Returns the memory address of the native function we pass to clCreateContext(FromType). + * + * @return the callback function address + */ + static native long getContextCallback(); + + /* [ Other callback functionality ] + The other callbacks are simpler. We create the GlobalRef before passing the callback, + we delete it when we receive the callback call. + */ + + /** + * Returns the memory address of the native function we pass to clSetMemObjectDestructorCallback. + * + * @return the callback function address + */ + static native long getMemObjectDestructorCallback(); + + /** + * Returns the memory address of the native function we pass to clBuildProgram. + * + * @return the callback function address + */ + static native long getProgramCallback(); + + /** + * Returns the memory address of the native function we pass to clEnqueueNativeKernel. + * + * @return the callback function address + */ + static native long getNativeKernelCallback(); + + /** + * Returns the memory address of the native function we pass to clSetEventCallback. + * + * @return the callback function address + */ + static native long getEventCallback(); + + /** + * Returns the memory address of the native function we pass to clSetPrintfCallback. + * + * @return the callback function address + */ + static native long getPrintfCallback(); + + /** + * Returns the memory address of the native function we pass to clCreateContext(FromType), + * when <code>APPLEContextLoggingUtil.SYSTEM_LOG_CALLBACK</code> is used. + * + * @return the callback function address + * + * @see APPLEContextLoggingUtil#SYSTEM_LOG_CALLBACK + */ + static native long getLogMessageToSystemLogAPPLE(); + + /** + * Returns the memory address of the native function we pass to clCreateContext(FromType), + * when <code>APPLEContextLoggingUtil.STD_OUT_CALLBACK</code> is used. + * + * @return the callback function address + * + * @see APPLEContextLoggingUtil#STD_OUT_CALLBACK + */ + static native long getLogMessageToStdoutAPPLE(); + + /** + * Returns the memory address of the native function we pass to clCreateContext(FromType), + * when <code>APPLEContextLoggingUtil.STD_ERR_CALLBACK</code> is used. + * + * @return the callback function address + * + * @see APPLEContextLoggingUtil#STD_ERR_CALLBACK + */ + static native long getLogMessageToStderrAPPLE(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/FastLongMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/FastLongMap.java new file mode 100644 index 0000000..c1c6aab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/FastLongMap.java @@ -0,0 +1,239 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.lwjgl.opencl; + +import java.util.Iterator; + +/** + * A hash map using primitive longs as keys rather than objects. + * + * @author Justin Couch + * @author Alex Chaffee (alex@apache.org) + * @author Stephen Colebourne + * @author Nathan Sweet + */ +final class FastLongMap<V> implements Iterable<FastLongMap.Entry<V>> { + + private Entry[] table; + private int size, mask, capacity, threshold; + + /** Same as: FastLongMap(16, 0.75f); */ + FastLongMap() { + this(16, 0.75f); + } + + /** Same as: FastLongMap(initialCapacity, 0.75f); */ + FastLongMap(int initialCapacity) { + this(initialCapacity, 0.75f); + } + + FastLongMap(int initialCapacity, float loadFactor) { + if ( initialCapacity > 1 << 30 ) throw new IllegalArgumentException("initialCapacity is too large."); + if ( initialCapacity < 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + if ( loadFactor <= 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + capacity = 1; + while ( capacity < initialCapacity ) + capacity <<= 1; + this.threshold = (int)(capacity * loadFactor); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + private int index(final long key) { + return index(key, mask); + } + + private static int index(final long key, final int mask) { + final int hash = (int)(key ^ (key >>> 32)); + return hash & mask; + } + + public V put(long key, V value) { + final Entry<V>[] table = this.table; + int index = index(key); + + // Check if key already exists. + for ( Entry<V> e = table[index]; e != null; e = e.next ) { + if ( e.key != key ) continue; + V oldValue = e.value; + e.value = value; + return oldValue; + } + + table[index] = new Entry<V>(key, value, table[index]); + + if ( size++ >= threshold ) + rehash(table); + + return null; + } + + private void rehash(final Entry<V>[] table) { + final int newCapacity = 2 * capacity; + final int newMask = newCapacity - 1; + + final Entry<V>[] newTable = new Entry[newCapacity]; + + for ( int i = 0, index; i < table.length; i++ ) { + Entry<V> e = table[i]; + if ( e == null ) continue; + do { + final Entry<V> next = e.next; + index = index(e.key, newMask); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } while ( e != null ); + } + + this.table = newTable; + capacity = newCapacity; + mask = newMask; + threshold *= 2; + } + + public V get(long key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return e.value; + return null; + } + + public boolean containsValue(Object value) { + final Entry<V>[] table = this.table; + for ( int i = table.length - 1; i >= 0; i-- ) + for ( Entry<V> e = table[i]; e != null; e = e.next ) + if ( e.value.equals(value) ) return true; + return false; + } + + public boolean containsKey(long key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return true; + return false; + } + + public V remove(long key) { + final int index = index(key); + + Entry<V> prev = table[index]; + Entry<V> e = prev; + while ( e != null ) { + Entry<V> next = e.next; + if ( e.key == key ) { + size--; + if ( prev == e ) + table[index] = next; + else + prev.next = next; + return e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void clear() { + final Entry<V>[] table = this.table; + for ( int index = table.length - 1; index >= 0; index-- ) + table[index] = null; + size = 0; + } + + public EntryIterator iterator() { + return new EntryIterator(); + } + + public class EntryIterator implements Iterator<Entry<V>> { + + private int nextIndex; + private Entry<V> current; + + EntryIterator() { + reset(); + } + + public void reset() { + current = null; + // Find first bucket. + final Entry<V>[] table = FastLongMap.this.table; + int i; + for ( i = table.length - 1; i >= 0; i-- ) + if ( table[i] != null ) break; + nextIndex = i; + } + + public boolean hasNext() { + if ( nextIndex >= 0 ) return true; + Entry e = current; + return e != null && e.next != null; + } + + public Entry<V> next() { + // Next entry in current bucket. + Entry<V> e = current; + if ( e != null ) { + e = e.next; + if ( e != null ) { + current = e; + return e; + } + } + // Use the bucket at nextIndex and find the next nextIndex. + final Entry<V>[] table = FastLongMap.this.table; + int i = nextIndex; + e = current = table[i]; + while ( --i >= 0 ) + if ( table[i] != null ) break; + nextIndex = i; + return e; + } + + public void remove() { + FastLongMap.this.remove(current.key); + } + } + + static final class Entry<T> { + + final long key; + T value; + Entry<T> next; + + Entry(long key, T value, Entry<T> next) { + this.key = key; + this.value = value; + this.next = next; + } + + public long getKey() { + return key; + } + + public T getValue() { + return value; + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtil.java new file mode 100644 index 0000000..c94b59a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtil.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +/** + * Base interface for information utility classes. + * + * @author Spasi + */ +interface InfoUtil<T extends CLObject> { + + int getInfoInt(final T object, final int param_name); + + long getInfoSize(final T object, final int param_name); + + long[] getInfoSizeArray(final T object, final int param_name); + + long getInfoLong(final T object, final int param_name); + + String getInfoString(final T object, final int param_name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilAbstract.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilAbstract.java new file mode 100644 index 0000000..44d9f90 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilAbstract.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.ByteBuffer; + +import static org.lwjgl.opencl.CL10.*; + +/** + * Base implementation of information utility classes. + * + * @author Spasi + */ +abstract class InfoUtilAbstract<T extends CLObject> implements InfoUtil<T> { + + protected InfoUtilAbstract() { + } + + protected abstract int getInfo(T object, int param_name, ByteBuffer param_value, PointerBuffer param_value_size_ret); + + // Optional + + protected int getInfoSizeArraySize(final T object, final int param_name) { + throw new UnsupportedOperationException(); + } + + protected PointerBuffer getSizesBuffer(final T object, final int param_name) { + final int size = getInfoSizeArraySize(object, param_name); + + final PointerBuffer buffer = APIUtil.getBufferPointer(size); + buffer.limit(size); + + getInfo(object, param_name, buffer.getBuffer(), null); + + return buffer; + } + + public int getInfoInt(final T object, final int param_name) { + object.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(4); + getInfo(object, param_name, buffer, null); + + return buffer.getInt(0); + } + + public long getInfoSize(final T object, final int param_name) { + object.checkValid(); + + final PointerBuffer buffer = APIUtil.getBufferPointer(); + getInfo(object, param_name, buffer.getBuffer(), null); + + return buffer.get(0); + } + + public long[] getInfoSizeArray(final T object, final int param_name) { + object.checkValid(); + + final int size = getInfoSizeArraySize(object, param_name); + final PointerBuffer buffer = APIUtil.getBufferPointer(size); + + getInfo(object, param_name, buffer.getBuffer(), null); + + final long[] array = new long[size]; + for ( int i = 0; i < size; i++ ) + array[i] = buffer.get(i); + + return array; + } + + public long getInfoLong(final T object, final int param_name) { + object.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(8); + getInfo(object, param_name, buffer, null); + + return buffer.getLong(0); + } + + public String getInfoString(final T object, final int param_name) { + object.checkValid(); + + final int bytes = getSizeRet(object, param_name); + if ( bytes <= 1 ) + return null; + + final ByteBuffer buffer = APIUtil.getBufferByte(bytes); + getInfo(object, param_name, buffer, null); + + buffer.limit(bytes - 1); // Exclude null-termination + return APIUtil.getString(buffer); + } + + protected final int getSizeRet(final T object, final int param_name) { + final PointerBuffer bytes = APIUtil.getBufferPointer(); + final int errcode = getInfo(object, param_name, null, bytes); + if ( errcode != CL_SUCCESS ) + throw new IllegalArgumentException("Invalid parameter specified: " + LWJGLUtil.toHexString(param_name)); + + return (int)bytes.get(0); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilFactory.java new file mode 100644 index 0000000..66bacde --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/InfoUtilFactory.java @@ -0,0 +1,606 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.*; +import org.lwjgl.opencl.api.CLBufferRegion; +import org.lwjgl.opencl.api.CLImageFormat; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.Drawable; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.List; + +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL10GL.*; +import static org.lwjgl.opencl.CL11.*; + +/** + * This class contains concrete InfoUtil implementations for our CLObject + * class. The public CLObject classes are grabbing these via reflection, + * so that they can be compiled for the generator. + * + * @author Spasi + */ +final class InfoUtilFactory { + + private InfoUtilFactory() {} + + static final InfoUtil<CLCommandQueue> CL_COMMAND_QUEUE_UTIL = new InfoUtilAbstract<CLCommandQueue>() { + protected int getInfo(final CLCommandQueue object, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetCommandQueueInfo(object, param_name, param_value, null); + } + }; + + static final CLContext.CLContextUtil CL_CONTEXT_UTIL = new CLContextUtil(); + private static final class CLContextUtil extends InfoUtilAbstract<CLContext> implements CLContext.CLContextUtil { + + protected int getInfo(final CLContext context, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetContextInfo(context, param_name, param_value, param_value_size_ret); + } + + public List<CLDevice> getInfoDevices(final CLContext context) { + context.checkValid(); + + final int num_devices; + + if ( CLCapabilities.getPlatformCapabilities(context.getParent()).OpenCL11 ) + num_devices = getInfoInt(context, CL_CONTEXT_NUM_DEVICES); + else { + final PointerBuffer size_ret = APIUtil.getBufferPointer(); + clGetContextInfo(context, CL_CONTEXT_DEVICES, null, size_ret); + num_devices = (int)(size_ret.get(0) / PointerBuffer.getPointerSize()); + } + + final PointerBuffer deviceIDs = APIUtil.getBufferPointer(num_devices); + clGetContextInfo(context, CL_CONTEXT_DEVICES, deviceIDs.getBuffer(), null); + + final List<CLDevice> devices = new ArrayList<CLDevice>(num_devices); + for ( int i = 0; i < num_devices; i++ ) + devices.add(context.getParent().getCLDevice(deviceIDs.get(i))); + + return devices.size() == 0 ? null : devices; + + } + + /** Custom clCreateContext implementation (reuses APIUtil.getBufferPointer) */ + public CLContext create(final CLPlatform platform, final List<CLDevice> devices, final CLContextCallback pfn_notify, final Drawable share_drawable, IntBuffer errcode_ret) throws LWJGLException { + final int propertyCount = 2 + (share_drawable == null ? 0 : 4) + 1; + + final PointerBuffer properties = APIUtil.getBufferPointer(propertyCount + devices.size()); + properties.put(CL_CONTEXT_PLATFORM).put(platform); + if ( share_drawable != null ) + share_drawable.setCLSharingProperties(properties); + properties.put(0); + + properties.position(propertyCount); // Make sure we're at the right offset, setCLSharingProperties might not use all 4 positions. + for ( CLDevice device : devices ) + properties.put(device); + + final long function_pointer = CLCapabilities.clCreateContext; + BufferChecks.checkFunctionAddress(function_pointer); + if ( errcode_ret != null ) + BufferChecks.checkBuffer(errcode_ret, 1); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); + final long user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify); + CLContext __result = null; + try { + __result = new CLContext(nclCreateContext(MemoryUtil.getAddress0(properties.getBuffer()), devices.size(), MemoryUtil.getAddress(properties, propertyCount), pfn_notify == null ? 0 : pfn_notify.getPointer(), user_data, MemoryUtil.getAddressSafe(errcode_ret), function_pointer), platform); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); + return __result; + } finally { + if ( __result != null ) __result.setContextCallback(user_data); + } + } + + public CLContext createFromType(final CLPlatform platform, final long device_type, final CLContextCallback pfn_notify, final Drawable share_drawable, final IntBuffer errcode_ret) throws LWJGLException { + final int propertyCount = 2 + (share_drawable == null ? 0 : 4) + 1; + + final PointerBuffer properties = APIUtil.getBufferPointer(propertyCount); + properties.put(CL_CONTEXT_PLATFORM).put(platform); + if ( share_drawable != null ) + share_drawable.setCLSharingProperties(properties); + properties.put(0); + properties.flip(); + + return clCreateContextFromType(properties, device_type, pfn_notify, errcode_ret); + } + + public List<CLImageFormat> getSupportedImageFormats(final CLContext context, final long flags, final int image_type, final Filter<CLImageFormat> filter) { + final IntBuffer numBuffer = APIUtil.getBufferInt(); + clGetSupportedImageFormats(context, flags, image_type, null, numBuffer); + + final int num_image_formats = numBuffer.get(0); + if ( num_image_formats == 0 ) + return null; + + final ByteBuffer formatBuffer = BufferUtils.createByteBuffer(num_image_formats * CLImageFormat.STRUCT_SIZE); + clGetSupportedImageFormats(context, flags, image_type, formatBuffer, null); + + final List<CLImageFormat> formats = new ArrayList<CLImageFormat>(num_image_formats); + for ( int i = 0; i < num_image_formats; i++ ) { + final int offset = num_image_formats * CLImageFormat.STRUCT_SIZE; + final CLImageFormat format = new CLImageFormat( + formatBuffer.getInt(offset), + formatBuffer.getInt(offset + 4) + ); + if ( filter == null || filter.accept(format) ) + formats.add(format); + } + + return formats.size() == 0 ? null : formats; + } + + } + + static final InfoUtil<CLDevice> CL_DEVICE_UTIL = new CLDeviceUtil(); + private static final class CLDeviceUtil extends InfoUtilAbstract<CLDevice> { + + protected int getInfo(final CLDevice device, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetDeviceInfo(device, param_name, param_value, param_value_size_ret); + } + + protected int getInfoSizeArraySize(final CLDevice device, final int param_name) { + switch ( param_name ) { + case CL_DEVICE_MAX_WORK_ITEM_SIZES: + return getInfoInt(device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS); + default: + throw new IllegalArgumentException("Unsupported parameter: " + LWJGLUtil.toHexString(param_name)); + } + } + + } + + static final CLEvent.CLEventUtil CL_EVENT_UTIL = new CLEventUtil(); + private static final class CLEventUtil extends InfoUtilAbstract<CLEvent> implements CLEvent.CLEventUtil { + + protected int getInfo(final CLEvent event, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetEventInfo(event, param_name, param_value, param_value_size_ret); + } + + public long getProfilingInfoLong(final CLEvent event, final int param_name) { + event.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(8); + clGetEventProfilingInfo(event, param_name, buffer, null); + + return buffer.getLong(0); + } + + } + + static final CLKernel.CLKernelUtil CL_KERNEL_UTIL = new CLKernelUtil(); + private static final class CLKernelUtil extends InfoUtilAbstract<CLKernel> implements CLKernel.CLKernelUtil { + + public void setArg(final CLKernel kernel, final int index, final byte value) { + clSetKernelArg(kernel, index, 1, APIUtil.getBufferByte(1).put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final short value) { + clSetKernelArg(kernel, index, 2, APIUtil.getBufferShort().put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final int value) { + clSetKernelArg(kernel, index, 4, APIUtil.getBufferInt().put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final long value) { + clSetKernelArg(kernel, index, 8, APIUtil.getBufferLong().put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final float value) { + clSetKernelArg(kernel, index, 4, APIUtil.getBufferFloat().put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final double value) { + clSetKernelArg(kernel, index, 8, APIUtil.getBufferDouble().put(0, value)); + } + + public void setArg(final CLKernel kernel, final int index, final CLObject value) { + clSetKernelArg(kernel, index, value); + } + + public void setArgSize(final CLKernel kernel, final int index, final long size) { + clSetKernelArg(kernel, index, size); + } + + protected int getInfo(final CLKernel kernel, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetKernelInfo(kernel, param_name, param_value, param_value_size_ret); + } + + public long getWorkGroupInfoSize(final CLKernel kernel, final CLDevice device, final int param_name) { + device.checkValid(); + + final PointerBuffer buffer = APIUtil.getBufferPointer(); + clGetKernelWorkGroupInfo(kernel, device, param_name, buffer.getBuffer(), null); + + return buffer.get(0); + } + + public long[] getWorkGroupInfoSizeArray(final CLKernel kernel, final CLDevice device, final int param_name) { + device.checkValid(); + + final int size; + switch ( param_name ) { + case CL_KERNEL_COMPILE_WORK_GROUP_SIZE: + size = 3; + break; + default: + throw new IllegalArgumentException("Unsupported parameter: " + LWJGLUtil.toHexString(param_name)); + } + + final PointerBuffer buffer = APIUtil.getBufferPointer(size); + + clGetKernelWorkGroupInfo(kernel, device, param_name, buffer.getBuffer(), null); + + final long[] array = new long[size]; + for ( int i = 0; i < size; i++ ) + array[i] = buffer.get(i); + + return array; + } + + public long getWorkGroupInfoLong(final CLKernel kernel, final CLDevice device, final int param_name) { + device.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(8); + clGetKernelWorkGroupInfo(kernel, device, param_name, buffer, null); + + return buffer.getLong(0); + } + + } + + static final CLMem.CLMemUtil CL_MEM_UTIL = new CLMemUtil(); + private static final class CLMemUtil extends InfoUtilAbstract<CLMem> implements CLMem.CLMemUtil { + + protected int getInfo(final CLMem mem, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetMemObjectInfo(mem, param_name, param_value, param_value_size_ret); + } + + public CLMem createImage2D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_row_pitch, final Buffer host_ptr, IntBuffer errcode_ret) { + final ByteBuffer formatBuffer = APIUtil.getBufferByte(2 * 4); + formatBuffer.putInt(0, image_format.getChannelOrder()); + formatBuffer.putInt(4, image_format.getChannelType()); + + final long function_pointer = CLCapabilities.clCreateImage2D; + BufferChecks.checkFunctionAddress(function_pointer); + if ( errcode_ret != null ) + BufferChecks.checkBuffer(errcode_ret, 1); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); + + CLMem __result = new CLMem(nclCreateImage2D(context.getPointer(), flags, MemoryUtil.getAddress(formatBuffer, 0), image_width, image_height, image_row_pitch, MemoryUtil.getAddress0Safe(host_ptr) + + (host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage2DSize(formatBuffer, image_width, image_height, image_row_pitch)) : 0), + MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); + return __result; + } + + public CLMem createImage3D(final CLContext context, final long flags, final CLImageFormat image_format, final long image_width, final long image_height, final long image_depth, final long image_row_pitch, final long image_slice_pitch, final Buffer host_ptr, IntBuffer errcode_ret) { + final ByteBuffer formatBuffer = APIUtil.getBufferByte(2 * 4); + formatBuffer.putInt(0, image_format.getChannelOrder()); + formatBuffer.putInt(4, image_format.getChannelType()); + + final long function_pointer = CLCapabilities.clCreateImage3D; + BufferChecks.checkFunctionAddress(function_pointer); + if ( errcode_ret != null ) + BufferChecks.checkBuffer(errcode_ret, 1); + else if ( LWJGLUtil.DEBUG ) + errcode_ret = APIUtil.getBufferInt(); + + CLMem __result = new CLMem(nclCreateImage3D(context.getPointer(), flags, MemoryUtil.getAddress(formatBuffer, 0), image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, MemoryUtil.getAddress0Safe(host_ptr) + + (host_ptr != null ? BufferChecks.checkBuffer(host_ptr, CLChecks.calculateImage3DSize(formatBuffer, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch)) : 0), + MemoryUtil.getAddressSafe(errcode_ret), function_pointer), context); + if ( LWJGLUtil.DEBUG ) + Util.checkCLError(errcode_ret.get(0)); + return __result; + } + + public CLMem createSubBuffer(final CLMem mem, final long flags, final int buffer_create_type, final CLBufferRegion buffer_create_info, final IntBuffer errcode_ret) { + final PointerBuffer infoBuffer = APIUtil.getBufferPointer(2); + + infoBuffer.put(buffer_create_info.getOrigin()); + infoBuffer.put(buffer_create_info.getSize()); + + return clCreateSubBuffer(mem, flags, buffer_create_type, infoBuffer.getBuffer(), errcode_ret); + } + + public ByteBuffer getInfoHostBuffer(final CLMem mem) { + mem.checkValid(); + + if ( LWJGLUtil.DEBUG ) { + final long mem_flags = getInfoLong(mem, CL_MEM_FLAGS); + if ( (mem_flags & CL_MEM_USE_HOST_PTR) != CL_MEM_USE_HOST_PTR ) + throw new IllegalArgumentException("The specified CLMem object does not use host memory."); + } + + final long size = getInfoSize(mem, CL_MEM_SIZE); + if ( size == 0 ) + return null; + + final long address = getInfoSize(mem, CL_MEM_HOST_PTR); + + return CL.getHostBuffer(address, (int)size); + } + + public long getImageInfoSize(final CLMem mem, final int param_name) { + mem.checkValid(); + + final PointerBuffer buffer = APIUtil.getBufferPointer(); + clGetImageInfo(mem, param_name, buffer.getBuffer(), null); + + return buffer.get(0); + } + + public CLImageFormat getImageInfoFormat(final CLMem mem) { + mem.checkValid(); + + final ByteBuffer format = APIUtil.getBufferByte(2 * 4); + + clGetImageInfo(mem, CL_IMAGE_FORMAT, format, null); + + return new CLImageFormat(format.getInt(0), format.getInt(4)); + } + + public int getImageInfoFormat(final CLMem mem, final int index) { + mem.checkValid(); + + final ByteBuffer format = APIUtil.getBufferByte(2 * 4); + + clGetImageInfo(mem, CL_IMAGE_FORMAT, format, null); + + return format.getInt(index << 2); + } + + public int getGLObjectType(final CLMem mem) { + mem.checkValid(); + + final IntBuffer buffer = APIUtil.getBufferInt(); + clGetGLObjectInfo(mem, buffer, null); + + return buffer.get(0); + } + + public int getGLObjectName(final CLMem mem) { + mem.checkValid(); + + final IntBuffer buffer = APIUtil.getBufferInt(); + clGetGLObjectInfo(mem, null, buffer); + + return buffer.get(0); + } + + public int getGLTextureInfoInt(final CLMem mem, final int param_name) { + mem.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(4); + clGetGLTextureInfo(mem, param_name, buffer, null); + + return buffer.getInt(0); + } + + } + + static final CLPlatform.CLPlatformUtil CL_PLATFORM_UTIL = new CLPlatformUtil(); + private static final class CLPlatformUtil extends InfoUtilAbstract<CLPlatform> implements CLPlatform.CLPlatformUtil { + + protected int getInfo(final CLPlatform platform, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetPlatformInfo(platform, param_name, param_value, param_value_size_ret); + } + + public List<CLPlatform> getPlatforms(final Filter<CLPlatform> filter) { + final IntBuffer numBuffer = APIUtil.getBufferInt(); + clGetPlatformIDs(null, numBuffer); + + final int num_platforms = numBuffer.get(0); + if ( num_platforms == 0 ) + return null; + + final PointerBuffer platformIDs = APIUtil.getBufferPointer(num_platforms); + clGetPlatformIDs(platformIDs, null); + + final List<CLPlatform> platforms = new ArrayList<CLPlatform>(num_platforms); + for ( int i = 0; i < num_platforms; i++ ) { + final CLPlatform platform = CLPlatform.getCLPlatform(platformIDs.get(i)); + if ( filter == null || filter.accept(platform) ) + platforms.add(platform); + } + + return platforms.size() == 0 ? null : platforms; + } + + public List<CLDevice> getDevices(final CLPlatform platform, final int device_type, final Filter<CLDevice> filter) { + platform.checkValid(); + + final IntBuffer numBuffer = APIUtil.getBufferInt(); + clGetDeviceIDs(platform, device_type, null, numBuffer); + + final int num_devices = numBuffer.get(0); + if ( num_devices == 0 ) + return null; + + final PointerBuffer deviceIDs = APIUtil.getBufferPointer(num_devices); + clGetDeviceIDs(platform, device_type, deviceIDs, null); + + final List<CLDevice> devices = new ArrayList<CLDevice>(num_devices); + for ( int i = 0; i < num_devices; i++ ) { + final CLDevice device = platform.getCLDevice(deviceIDs.get(i)); + if ( filter == null || filter.accept(device) ) + devices.add(device); + } + + return devices.size() == 0 ? null : devices; + } + + } + + static final CLProgram.CLProgramUtil CL_PROGRAM_UTIL = new CLProgramUtil(); + private static final class CLProgramUtil extends InfoUtilAbstract<CLProgram> implements CLProgram.CLProgramUtil { + + protected int getInfo(final CLProgram program, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetProgramInfo(program, param_name, param_value, param_value_size_ret); + } + + protected int getInfoSizeArraySize(final CLProgram program, final int param_name) { + switch ( param_name ) { + case CL_PROGRAM_BINARY_SIZES: + return getInfoInt(program, CL_PROGRAM_NUM_DEVICES); + default: + throw new IllegalArgumentException("Unsupported parameter: " + LWJGLUtil.toHexString(param_name)); + } + } + + public CLKernel[] createKernelsInProgram(final CLProgram program) { + final IntBuffer numBuffer = APIUtil.getBufferInt(); + clCreateKernelsInProgram(program, null, numBuffer); + + final int num_kernels = numBuffer.get(0); + if ( num_kernels == 0 ) + return null; + + final PointerBuffer kernelIDs = APIUtil.getBufferPointer(num_kernels); + clCreateKernelsInProgram(program, kernelIDs, null); + + final CLKernel[] kernels = new CLKernel[num_kernels]; + for ( int i = 0; i < num_kernels; i++ ) + kernels[i] = program.getCLKernel(kernelIDs.get(i)); + + return kernels; + } + + public CLDevice[] getInfoDevices(final CLProgram program) { + program.checkValid(); + + final int size = getInfoInt(program, CL_PROGRAM_NUM_DEVICES); + final PointerBuffer buffer = APIUtil.getBufferPointer(size); + + clGetProgramInfo(program, CL_PROGRAM_DEVICES, buffer.getBuffer(), null); + + final CLPlatform platform = program.getParent().getParent(); + final CLDevice[] array = new CLDevice[size]; + for ( int i = 0; i < size; i++ ) + array[i] = platform.getCLDevice(buffer.get(i)); + + return array; + } + + public ByteBuffer getInfoBinaries(final CLProgram program, ByteBuffer target) { + program.checkValid(); + + final PointerBuffer sizes = getSizesBuffer(program, CL_PROGRAM_BINARY_SIZES); + + int totalSize = 0; + for ( int i = 0; i < sizes.limit(); i++ ) + totalSize += sizes.get(i); + + if ( target == null ) + target = BufferUtils.createByteBuffer(totalSize); + else if ( LWJGLUtil.DEBUG ) + BufferChecks.checkBuffer(target, totalSize); + + clGetProgramInfo(program, sizes, target, null); + + return target; + } + + public ByteBuffer[] getInfoBinaries(final CLProgram program, ByteBuffer[] target) { + program.checkValid(); + + if ( target == null ) { + final PointerBuffer sizes = getSizesBuffer(program, CL_PROGRAM_BINARY_SIZES); + + target = new ByteBuffer[sizes.remaining()]; + for ( int i = 0; i < sizes.remaining(); i++ ) + target[i] = BufferUtils.createByteBuffer((int)sizes.get(i)); + } else if ( LWJGLUtil.DEBUG ) { + final PointerBuffer sizes = getSizesBuffer(program, CL_PROGRAM_BINARY_SIZES); + + if ( target.length < sizes.remaining() ) + throw new IllegalArgumentException("The target array is not big enough: " + sizes.remaining() + " buffers are required."); + + for ( int i = 0; i < target.length; i++ ) + BufferChecks.checkBuffer(target[i], (int)sizes.get(i)); + } + + clGetProgramInfo(program, target, null); + + return target; + } + + public String getBuildInfoString(final CLProgram program, final CLDevice device, final int param_name) { + program.checkValid(); + + final int bytes = getBuildSizeRet(program, device, param_name); + if ( bytes <= 1 ) + return null; + + final ByteBuffer buffer = APIUtil.getBufferByte(bytes); + clGetProgramBuildInfo(program, device, param_name, buffer, null); + + buffer.limit(bytes - 1); // Exclude null-termination + return APIUtil.getString(buffer); + } + + public int getBuildInfoInt(final CLProgram program, final CLDevice device, final int param_name) { + program.checkValid(); + + final ByteBuffer buffer = APIUtil.getBufferByte(4); + clGetProgramBuildInfo(program, device, param_name, buffer, null); + + return buffer.getInt(0); + } + + private static int getBuildSizeRet(final CLProgram program, final CLDevice device, final int param_name) { + final PointerBuffer bytes = APIUtil.getBufferPointer(); + final int errcode = clGetProgramBuildInfo(program, device, param_name, null, bytes); + if ( errcode != CL_SUCCESS ) + throw new IllegalArgumentException("Invalid parameter specified: " + LWJGLUtil.toHexString(param_name)); + + return (int)bytes.get(0); + } + + } + + static final InfoUtil<CLSampler> CL_SAMPLER_UTIL = new InfoUtilAbstract<CLSampler>() { + protected int getInfo(final CLSampler sampler, final int param_name, final ByteBuffer param_value, final PointerBuffer param_value_size_ret) { + return clGetSamplerInfo(sampler, param_name, param_value, param_value_size_ret); + } + }; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/OpenCLException.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/OpenCLException.java new file mode 100644 index 0000000..fe1e903 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/OpenCLException.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +public class OpenCLException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public OpenCLException() { + super(); + } + + public OpenCLException(final String message) { + super(message); + } + + public OpenCLException(final String message, final Throwable cause) { + super(message, cause); + } + + public OpenCLException(final Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/Util.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/Util.java new file mode 100644 index 0000000..acb0380 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/Util.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.LWJGLUtil; + +import java.lang.reflect.Field; +import java.util.Map; + +/** + * Utility methods for OpenCL + * + * @author Spasi + */ +public final class Util { + + /** Maps OpenCL error token values to their String representations. */ + private static final Map<Integer, String> CL_ERROR_TOKENS = LWJGLUtil.getClassTokens(new LWJGLUtil.TokenFilter() { + public boolean accept(final Field field, final int value) { + return value < 0; // Currently, all OpenCL errors have negative values. + } + }, null, CL10.class, CL11.class, KHRGLSharing.class, KHRICD.class, APPLEGLSharing.class, EXTDeviceFission.class); + + private Util() { + } + + public static void checkCLError(final int errcode) { + if ( errcode != CL10.CL_SUCCESS ) + throwCLError(errcode); + } + + private static void throwCLError(final int errcode) { + String errname = CL_ERROR_TOKENS.get(errcode); + if ( errname == null ) + errname = "UNKNOWN"; + throw new OpenCLException("Error Code: " + errname + " (" + LWJGLUtil.toHexString(errcode) + ")"); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLBufferRegion.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLBufferRegion.java new file mode 100644 index 0000000..39ca4ec --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLBufferRegion.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl.api; + +import org.lwjgl.PointerBuffer; + +/** + * Simple container for cl_buffer_region struct values. + * + * @author Spasi + */ +public final class CLBufferRegion { + + /** The cl_buffer_region struct size in bytes. */ + public static final int STRUCT_SIZE = 2 * PointerBuffer.getPointerSize(); + + private final int origin; + private final int size; + + public CLBufferRegion(final int origin, final int size) { + this.origin = origin; + this.size = size; + } + + public int getOrigin() { + return origin; + } + + public int getSize() { + return size; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLImageFormat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLImageFormat.java new file mode 100644 index 0000000..eded198 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/CLImageFormat.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl.api; + +/** + * Simple container for cl_image_format struct values. + * + * @author Spasi + */ +public final class CLImageFormat { + + /** The cl_image_format struct size in bytes. */ + public static final int STRUCT_SIZE = 2 * 4; + + private final int channelOrder; + private final int channelType; + + public CLImageFormat(final int channelOrder, final int channelType) { + this.channelOrder = channelOrder; + this.channelType = channelType; + } + + public int getChannelOrder() { + return channelOrder; + } + + public int getChannelType() { + return channelType; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/Filter.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/Filter.java new file mode 100644 index 0000000..e27b0f6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opencl/api/Filter.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.opencl.api; + +/** + * Simple filter interface. + * + * @author Spasi + */ +public interface Filter<T> { + + /** + * Returns true if the specified object passes the filter. + * + * @param object the object to test + * + * @return true if the object is accepted + */ + boolean accept(T object); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AMDDebugOutputCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AMDDebugOutputCallback.java new file mode 100644 index 0000000..0237d63 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AMDDebugOutputCallback.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class are needed to use the callback functionality of the AMD_debug_output extension. + * A debug context must be current before creating instances of this class. Users of this class may provide + * implementations of the {@code Handler} interface to receive notifications. The same {@code Handler} + * instance may be used by different contexts but it is not recommended. Handler notifications are synchronized. + * + * @author Spasi + */ +public final class AMDDebugOutputCallback extends PointerWrapperAbstract { + + /** Severity levels. */ + private static final int GL_DEBUG_SEVERITY_HIGH_AMD = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_AMD = 0x9147, + GL_DEBUG_SEVERITY_LOW_AMD = 0x9148; + + /** Categories */ + private static final int GL_DEBUG_CATEGORY_API_ERROR_AMD = 0x9149, + GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD = 0x914A, + GL_DEBUG_CATEGORY_DEPRECATION_AMD = 0x914B, + GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD = 0x914C, + GL_DEBUG_CATEGORY_PERFORMANCE_AMD = 0x914D, + GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD = 0x914E, + GL_DEBUG_CATEGORY_APPLICATION_AMD = 0x914F, + GL_DEBUG_CATEGORY_OTHER_AMD = 0x9150; + + private static final long CALLBACK_POINTER; + + static { + long pointer = 0; + try { + // Call reflectively so that we can compile this class for the Generator. + pointer = (Long)Class.forName("org.lwjgl.opengl.CallbackUtil").getDeclaredMethod("getDebugOutputCallbackAMD").invoke(null); + } catch (Exception e) { + // ignore + } + CALLBACK_POINTER = pointer; + } + + private final Handler handler; + + /** + * Creates an AMDDebugOutputCallback with a default callback handler. + * The default handler will simply print the message on System.err. + */ + public AMDDebugOutputCallback() { + this(new Handler() { + public void handleMessage(final int id, final int category, final int severity, final String message) { + System.err.println("[LWJGL] AMD_debug_output message"); + System.err.println("\tID: " + id); + + String description; + switch ( category ) { + case GL_DEBUG_CATEGORY_API_ERROR_AMD: + description = "API ERROR"; + break; + case GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD: + description = "WINDOW SYSTEM"; + break; + case GL_DEBUG_CATEGORY_DEPRECATION_AMD: + description = "DEPRECATION"; + break; + case GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD: + description = "UNDEFINED BEHAVIOR"; + break; + case GL_DEBUG_CATEGORY_PERFORMANCE_AMD: + description = "PERFORMANCE"; + break; + case GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD: + description = "SHADER COMPILER"; + break; + case GL_DEBUG_CATEGORY_APPLICATION_AMD: + description = "APPLICATION"; + break; + case GL_DEBUG_CATEGORY_OTHER_AMD: + description = "OTHER"; + break; + default: + description = printUnknownToken(category); + } + System.err.println("\tCategory: " + description); + + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH_AMD: + description = "HIGH"; + break; + case GL_DEBUG_SEVERITY_MEDIUM_AMD: + description = "MEDIUM"; + break; + case GL_DEBUG_SEVERITY_LOW_AMD: + description = "LOW"; + break; + default: + description = printUnknownToken(severity); + } + System.err.println("\tSeverity: " + description); + + System.err.println("\tMessage: " + message); + } + + private String printUnknownToken(final int token) { + return "Unknown (0x" + Integer.toHexString(token).toUpperCase() + ")"; + } + }); + } + + /** + * Creates an AMDDebugOutputCallback with the specified callback handler. + * The handler's {@code handleMessage} method will be called whenever + * debug output is generated by the GL. + * + * @param handler the callback handler + */ + public AMDDebugOutputCallback(final Handler handler) { + super(CALLBACK_POINTER); + + this.handler = handler; + } + + Handler getHandler() { + return handler; + } + + /** Implementations of this interface can be used to receive AMD_debug_output notifications. */ + public interface Handler { + + /** + * This method will be called when an AMD_debug_output message is generated. + * + * @param id the message ID + * @param category the message category + * @param severity the message severity + * @param message the string representation of the message. + */ + void handleMessage(int id, int category, int severity, String message); + + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/APIUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/APIUtil.java new file mode 100644 index 0000000..5687fc6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/APIUtil.java @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.*; + +/** + * Utility class for OpenGL API calls. Instances of APIUtil are created in ContextCapabilities, + * so we have an instance per OpenGL context. + * + * @author spasi + */ +final class APIUtil { + + private static final int INITIAL_BUFFER_SIZE = 256; + private static final int INITIAL_LENGTHS_SIZE = 4; + + private static final int BUFFERS_SIZE = 32; + + private char[] array; + private ByteBuffer buffer; + private IntBuffer lengths; + + private final IntBuffer ints; + private final LongBuffer longs; + private final FloatBuffer floats; + private final DoubleBuffer doubles; + + APIUtil() { + array = new char[INITIAL_BUFFER_SIZE]; + buffer = BufferUtils.createByteBuffer(INITIAL_BUFFER_SIZE); + lengths = BufferUtils.createIntBuffer(INITIAL_LENGTHS_SIZE); + + ints = BufferUtils.createIntBuffer(BUFFERS_SIZE); + longs = BufferUtils.createLongBuffer(BUFFERS_SIZE); + + floats = BufferUtils.createFloatBuffer(BUFFERS_SIZE); + doubles = BufferUtils.createDoubleBuffer(BUFFERS_SIZE); + } + + private static char[] getArray(final ContextCapabilities caps, final int size) { + char[] array = caps.util.array; + + if ( array.length < size ) { + int sizeNew = array.length << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + array = new char[size]; + caps.util.array = array; + } + + return array; + } + + static ByteBuffer getBufferByte(final ContextCapabilities caps, final int size) { + ByteBuffer buffer = caps.util.buffer; + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + buffer = BufferUtils.createByteBuffer(size); + caps.util.buffer = buffer; + } else + buffer.clear(); + + return buffer; + } + + private static ByteBuffer getBufferByteOffset(final ContextCapabilities caps, final int size) { + ByteBuffer buffer = caps.util.buffer; + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + final ByteBuffer bufferNew = BufferUtils.createByteBuffer(size); + bufferNew.put(buffer); + caps.util.buffer = (buffer = bufferNew); + } else { + buffer.position(buffer.limit()); + buffer.limit(buffer.capacity()); + } + + return buffer; + } + + static IntBuffer getBufferInt(final ContextCapabilities caps) { return caps.util.ints; } + + static LongBuffer getBufferLong(final ContextCapabilities caps) { return caps.util.longs; } + + static FloatBuffer getBufferFloat(final ContextCapabilities caps) { return caps.util.floats; } + + static DoubleBuffer getBufferDouble(final ContextCapabilities caps) { return caps.util.doubles; } + + static IntBuffer getLengths(final ContextCapabilities caps) { + return getLengths(caps, 1); + } + + static IntBuffer getLengths(final ContextCapabilities caps, final int size) { + IntBuffer lengths = caps.util.lengths; + + if ( lengths.capacity() < size ) { + int sizeNew = lengths.capacity(); + while ( sizeNew < size ) + sizeNew <<= 1; + + lengths = BufferUtils.createIntBuffer(size); + caps.util.lengths = lengths; + } else + lengths.clear(); + + return lengths; + } + + /** + * Simple ASCII encoding. + * + * @param buffer The target buffer + * @param string The source string + */ + private static ByteBuffer encode(final ByteBuffer buffer, final CharSequence string) { + for ( int i = 0; i < string.length(); i++ ) { + final char c = string.charAt(i); + if ( LWJGLUtil.DEBUG && 0x80 <= c ) // Silently ignore and map to 0x1A. + buffer.put((byte)0x1A); + else + buffer.put((byte)c); + } + + return buffer; + } + + /** + * Reads a byte string from the specified buffer. + * + * @param buffer + * + * @return the buffer as a String. + */ + static String getString(final ContextCapabilities caps, final ByteBuffer buffer) { + final int length = buffer.remaining(); + final char[] charArray = getArray(caps, length); + + for ( int i = buffer.position(); i < buffer.limit(); i++ ) + charArray[i - buffer.position()] = (char)buffer.get(i); + + return new String(charArray, 0, length); + } + + /** + * Returns a buffer containing the specified string as bytes. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final ContextCapabilities caps, final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(caps, string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, starting at the specified offset. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final ContextCapabilities caps, final CharSequence string, final int offset) { + final ByteBuffer buffer = encode(getBufferByteOffset(caps, offset + string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, including null-termination. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBufferNT(final ContextCapabilities caps, final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(caps, string.length() + 1), string); + buffer.put((byte)0); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + static int getTotalLength(final CharSequence[] strings) { + int length = 0; + for ( CharSequence string : strings ) + length += string.length(); + + return length; + } + + /** + * Returns a buffer containing the specified strings as bytes. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBuffer(final ContextCapabilities caps, final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(caps, getTotalLength(strings)); + + for ( CharSequence string : strings ) + encode(buffer, string); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified strings as bytes, including null-termination. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBufferNT(final ContextCapabilities caps, final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(caps, getTotalLength(strings) + strings.length); + + for ( CharSequence string : strings ) { + encode(buffer, string); + buffer.put((byte)0); + } + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the lengths of the specified strings. + * + * @param strings + * + * @return the String lengths in an IntBuffer + */ + static long getLengths(final ContextCapabilities caps, final CharSequence[] strings) { + IntBuffer buffer = getLengths(caps, strings.length); + + for ( CharSequence string : strings ) + buffer.put(string.length()); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + static long getInt(final ContextCapabilities caps, final int value) { + return MemoryUtil.getAddress0(getBufferInt(caps).put(0, value)); + } + + static long getBufferByte0(final ContextCapabilities caps) { + return MemoryUtil.getAddress0(getBufferByte(caps, 0)); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ARBDebugOutputCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ARBDebugOutputCallback.java new file mode 100644 index 0000000..68ca8ea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ARBDebugOutputCallback.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class are needed to use the callback functionality of the ARB_debug_output extension. + * A debug context must be current before creating instances of this class. Users of this class may provide + * implementations of the {@code Handler} interface to receive notifications. The same {@code Handler} + * instance may be used by different contexts but it is not recommended. Handler notifications are synchronized. + * + * @author Spasi + */ +public final class ARBDebugOutputCallback extends PointerWrapperAbstract { + + /** Severity levels. */ + private static final int + GL_DEBUG_SEVERITY_HIGH_ARB = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_ARB = 0x9147, + GL_DEBUG_SEVERITY_LOW_ARB = 0x9148; + + /** Sources. */ + private static final int + GL_DEBUG_SOURCE_API_ARB = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY_ARB = 0x8249, + GL_DEBUG_SOURCE_APPLICATION_ARB = 0x824A, + GL_DEBUG_SOURCE_OTHER_ARB = 0x824B; + + /** Types. */ + private static final int + GL_DEBUG_TYPE_ERROR_ARB = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E, + GL_DEBUG_TYPE_PORTABILITY_ARB = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE_ARB = 0x8250, + GL_DEBUG_TYPE_OTHER_ARB = 0x8251; + + private static final long CALLBACK_POINTER; + + static { + long pointer = 0; + try { + // Call reflectively so that we can compile this class for the Generator. + pointer = (Long)Class.forName("org.lwjgl.opengl.CallbackUtil").getDeclaredMethod("getDebugOutputCallbackARB").invoke(null); + } catch (Exception e) { + // ignore + } + CALLBACK_POINTER = pointer; + } + + private final Handler handler; + + /** + * Creates an ARBDebugOutputCallback with a default callback handler. + * The default handler will simply print the message on System.err. + */ + public ARBDebugOutputCallback() { + this(new Handler() { + public void handleMessage(final int source, final int type, final int id, final int severity, final String message) { + System.err.println("[LWJGL] ARB_debug_output message"); + System.err.println("\tID: " + id); + + String description; + switch ( source ) { + case GL_DEBUG_SOURCE_API_ARB: + description = "API"; + break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: + description = "WINDOW SYSTEM"; + break; + case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: + description = "SHADER COMPILER"; + break; + case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: + description = "THIRD PARTY"; + break; + case GL_DEBUG_SOURCE_APPLICATION_ARB: + description = "APPLICATION"; + break; + case GL_DEBUG_SOURCE_OTHER_ARB: + description = "OTHER"; + break; + default: + description = printUnknownToken(source); + } + System.err.println("\tSource: " + description); + + switch ( type ) { + case GL_DEBUG_TYPE_ERROR_ARB: + description = "ERROR"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: + description = "DEPRECATED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: + description = "UNDEFINED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_PORTABILITY_ARB: + description = "PORTABILITY"; + break; + case GL_DEBUG_TYPE_PERFORMANCE_ARB: + description = "PERFORMANCE"; + break; + case GL_DEBUG_TYPE_OTHER_ARB: + description = "OTHER"; + break; + default: + description = printUnknownToken(type); + } + System.err.println("\tType: " + description); + + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH_ARB: + description = "HIGH"; + break; + case GL_DEBUG_SEVERITY_MEDIUM_ARB: + description = "MEDIUM"; + break; + case GL_DEBUG_SEVERITY_LOW_ARB: + description = "LOW"; + break; + default: + description = printUnknownToken(severity); + } + System.err.println("\tSeverity: " + description); + + System.err.println("\tMessage: " + message); + } + + private String printUnknownToken(final int token) { + return "Unknown (0x" + Integer.toHexString(token).toUpperCase() + ")"; + } + }); + } + + /** + * Creates an ARBDebugOutputCallback with the specified callback handler. + * The handler's {@code handleMessage} method will be called whenever + * debug output is generated by the GL. + * + * @param handler the callback handler + */ + public ARBDebugOutputCallback(final Handler handler) { + super(CALLBACK_POINTER); + + this.handler = handler; + } + + Handler getHandler() { + return handler; + } + + /** Implementations of this interface can be used to receive ARB_debug_output notifications. */ + public interface Handler { + + /** + * This method will be called when an ARB_debug_output message is generated. + * + * @param source the message source + * @param type the message type + * @param id the message ID + * @param severity the message severity + * @param message the string representation of the message. + */ + void handleMessage(int source, int type, int id, int severity, String message); + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTCanvasImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTCanvasImplementation.java new file mode 100644 index 0000000..accd947 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTCanvasImplementation.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Canvas; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +interface AWTCanvasImplementation { + /** + * Return an opaque handle to the canvas peer information required to create a context from it. + */ + PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException; + + /** + * Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat. + * + * @return A GraphicsConfiguration matching the given GraphicsConfiguration and PixelFormat. + * @throws LWJGLException if no suitable configuration could be found. + */ + GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTGLCanvas.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTGLCanvas.java new file mode 100644 index 0000000..110a85f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTGLCanvas.java @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.Sys; + +import java.awt.*; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; + +import static org.lwjgl.opengl.GL11.*; + +/** + * <p/> + * An AWT rendering context. + * <p/> + * + * @author $Author$ + * $Id$ + * @version $Revision$ + */ +public class AWTGLCanvas extends Canvas implements DrawableLWJGL, ComponentListener, HierarchyListener { + + private static final long serialVersionUID = 1L; + + private static final AWTCanvasImplementation implementation; + private boolean update_context; + private Object SYNC_LOCK = new Object(); + + /** The requested pixel format */ + private final PixelFormat pixel_format; + + /** The drawable to share context with */ + private final Drawable drawable; + + /** The ContextAttribs to use when creating the context */ + private final ContextAttribs attribs; + + /** Context handle */ + private PeerInfo peer_info; + private ContextGL context; + + /** + * re-entry counter for support for re-entrant + * redrawing in paint(). It happens when using dialog boxes. + */ + private int reentry_count; + + /** Tracks whether initGL() needs to be called */ + private boolean first_run; + + static { + Sys.initialize(); + implementation = createImplementation(); + } + + static AWTCanvasImplementation createImplementation() { + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_LINUX: + return new LinuxCanvasImplementation(); + case LWJGLUtil.PLATFORM_WINDOWS: + return new WindowsCanvasImplementation(); + case LWJGLUtil.PLATFORM_MACOSX: + return new MacOSXCanvasImplementation(); + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + private void setUpdate() { + synchronized ( SYNC_LOCK ) { + update_context = true; + } + } + + public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public PixelFormatLWJGL getPixelFormat() { + return pixel_format; + } + + /** This method should only be called internally. */ + public ContextGL getContext() { + return context; + } + + /** This method should only be called internally. */ + public ContextGL createSharedContext() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) throw new IllegalStateException("Canvas not yet displayable"); + + return new ContextGL(peer_info, context.getContextAttribs(), context); + } + } + + public void checkGLError() { + Util.checkGLError(); + } + + public void initContext(final float r, final float g, final float b) { + // set background clear color + glClearColor(r, g, b, 0.0f); + // Clear window to avoid the desktop "showing through" + glClear(GL_COLOR_BUFFER_BIT); + } + + /** Constructor using the default PixelFormat. */ + public AWTGLCanvas() throws LWJGLException { + this(new PixelFormat()); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the default GraphicsDevice. + * + * @param pixel_format The desired pixel format. May not be null + */ + public AWTGLCanvas(PixelFormat pixel_format) throws LWJGLException { + this(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(), pixel_format); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the default GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException { + this(device, pixel_format, null); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the specified GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + * @param drawable The Drawable to share context with + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format, Drawable drawable) throws LWJGLException { + this(device, pixel_format, drawable, null); + } + + /** + * Create an AWTGLCanvas with the requested PixelFormat on the specified GraphicsDevice. + * + * @param device the device to create the canvas on. + * @param pixel_format The desired pixel format. May not be null + * @param drawable The Drawable to share context with + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + */ + public AWTGLCanvas(GraphicsDevice device, PixelFormat pixel_format, Drawable drawable, ContextAttribs attribs) throws LWJGLException { + super(implementation.findConfiguration(device, pixel_format)); + if ( pixel_format == null ) + throw new NullPointerException("Pixel format must be non-null"); + addHierarchyListener(this); + addComponentListener(this); + this.drawable = drawable; + this.pixel_format = pixel_format; + this.attribs = attribs; + } + + /* (non-Javadoc) + * @see java.awt.Canvas#addNotify() + */ + public void addNotify() { + super.addNotify(); + } + + /* (non-Javadoc) + * @see java.awt.Component#removeNotify() + */ + public void removeNotify() { + synchronized ( SYNC_LOCK ) { + destroy(); + super.removeNotify(); + } + } + + /** Set swap interval. */ + public void setSwapInterval(int swap_interval) { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + ContextGL.setSwapInterval(swap_interval); + } + } + + /** Enable vsync */ + public void setVSyncEnabled(boolean enabled) { + setSwapInterval(enabled ? 1 : 0); + } + + /** Swap the canvas' buffer */ + public void swapBuffers() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + ContextGL.swapBuffers(); + } + } + + public boolean isCurrent() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) throw new IllegalStateException("Canvas not yet displayable"); + + return context.isCurrent(); + } + } + + /** + * Make the canvas' context current. It is highly recommended that the context + * is only made current inside the AWT thread (for example in an overridden paintGL()). + */ + public void makeCurrent() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + context.makeCurrent(); + } + } + + public void releaseContext() throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + if ( context.isCurrent() ) + context.releaseCurrent(); + } + } + + /** Destroy the OpenGL context. This happens when the component becomes undisplayable */ + public final void destroy() { + synchronized ( SYNC_LOCK ) { + try { + if ( context != null ) { + context.forceDestroy(); + context = null; + reentry_count = 0; + peer_info.destroy(); + peer_info = null; + } + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + } + + public final void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + synchronized ( SYNC_LOCK ) { + if ( context == null ) + throw new IllegalStateException("Canvas not yet displayable"); + context.setCLSharingProperties(properties); + } + } + + /** + * Override this to do initialising of the context. + * It will be called once from paint(), immediately after + * the context is created and made current. + */ + protected void initGL() { + } + + /** Override this to do painting */ + protected void paintGL() { + } + + /** + * The default paint() operation makes the context current and calls paintGL() which should + * be overridden to do GL operations. + */ + public final void paint(Graphics g) { + LWJGLException exception = null; + synchronized ( SYNC_LOCK ) { + if ( !isDisplayable() ) + return; + try { + if ( peer_info == null ) { + this.peer_info = implementation.createPeerInfo(this, pixel_format, attribs); + } + peer_info.lockAndGetHandle(); + try { + if ( context == null ) { + this.context = new ContextGL(peer_info, attribs, drawable != null ? (ContextGL)((DrawableLWJGL)drawable).getContext() : null); + first_run = true; + } + + if ( reentry_count == 0 ) + context.makeCurrent(); + reentry_count++; + try { + if ( update_context ) { + context.update(); + update_context = false; + } + if ( first_run ) { + first_run = false; + initGL(); + } + paintGL(); + } finally { + reentry_count--; + if ( reentry_count == 0 ) + context.releaseCurrent(); + } + } finally { + peer_info.unlock(); + } + } catch (LWJGLException e) { + exception = e; + } + } + if ( exception != null ) + exceptionOccurred(exception); + } + + /** + * This method will be called if an unhandled LWJGLException occurs in paint(). + * Override this method to be notified of this. + * + * @param exception The exception that occurred. + */ + protected void exceptionOccurred(LWJGLException exception) { + LWJGLUtil.log("Unhandled exception occurred, skipping paint(): " + exception); + } + + /** override update to avoid clearing */ + public void update(Graphics g) { + paint(g); + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + setUpdate(); + } + + public void componentMoved(ComponentEvent e) { + setUpdate(); + } + + public void setLocation(int x, int y) { + super.setLocation(x, y); + setUpdate(); + } + + public void setLocation(Point p) { + super.setLocation(p); + setUpdate(); + } + + public void setSize(Dimension d) { + super.setSize(d); + setUpdate(); + } + + public void setSize(int width, int height) { + super.setSize(width, height); + setUpdate(); + } + + public void setBounds(int x, int y, int width, int height) { + super.setBounds(x, y, width, height); + setUpdate(); + } + + public void hierarchyChanged(HierarchyEvent e) { + setUpdate(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTSurfaceLock.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTSurfaceLock.java new file mode 100644 index 0000000..3e45554 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTSurfaceLock.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.Canvas; +import java.awt.Component; +import java.applet.Applet; +import java.nio.ByteBuffer; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class AWTSurfaceLock { + + private static final int WAIT_DELAY_MILLIS = 100; + + private final ByteBuffer lock_buffer; + + private boolean firstLockSucceeded; + + AWTSurfaceLock() { + lock_buffer = createHandle(); + } + + private static native ByteBuffer createHandle(); + + public ByteBuffer lockAndGetHandle(Canvas component) throws LWJGLException { + while (!privilegedLockAndInitHandle(component)) { + LWJGLUtil.log("Could not get drawing surface info, retrying..."); + try { + Thread.sleep(WAIT_DELAY_MILLIS); + } catch (InterruptedException e) { + LWJGLUtil.log("Interrupted while retrying: " + e); + } + } + + return lock_buffer; + } + + private boolean privilegedLockAndInitHandle(final Canvas component) throws LWJGLException { + // Workaround for Sun JDK bug 4796548 which still exists in java for OS X + // We need to elevate privileges because of an AWT bug. Please see + // http://192.18.37.44/forums/index.php?topic=10572 for a discussion. + // It is only needed on first call, so we avoid it on all subsequent calls + // due to performance.. + + if (firstLockSucceeded) + return lockAndInitHandle(lock_buffer, component); + else + try { + firstLockSucceeded = AccessController.doPrivileged(new PrivilegedExceptionAction<Boolean>() { + public Boolean run() throws LWJGLException { + return lockAndInitHandle(lock_buffer, component); + } + }); + return firstLockSucceeded; + } catch (PrivilegedActionException e) { + throw (LWJGLException) e.getException(); + } + } + + private static native boolean lockAndInitHandle(ByteBuffer lock_buffer, Canvas component) throws LWJGLException; + + void unlock() throws LWJGLException { + nUnlock(lock_buffer); + } + + private static native void nUnlock(ByteBuffer lock_buffer) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTUtil.java new file mode 100644 index 0000000..c1eee83 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/AWTUtil.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.IllegalComponentStateException; +import java.awt.MouseInfo; +import java.awt.Point; +import java.awt.PointerInfo; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.image.BufferedImage; +import java.nio.IntBuffer; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +final class AWTUtil { + public static boolean hasWheel() { + return true; + } + + public static int getButtonCount() { + return MouseEventQueue.NUM_BUTTONS; + } + + public static int getNativeCursorCapabilities() { + if (LWJGLUtil.getPlatform() != LWJGLUtil.PLATFORM_MACOSX || LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 4)) { + int cursor_colors = Toolkit.getDefaultToolkit().getMaximumCursorColors(); + boolean supported = cursor_colors >= Short.MAX_VALUE && getMaxCursorSize() > 0; + int caps = supported ? org.lwjgl.input.Cursor.CURSOR_8_BIT_ALPHA | org.lwjgl.input.Cursor.CURSOR_ONE_BIT_TRANSPARENCY: 0 | org.lwjgl.input.Cursor.CURSOR_ANIMATION; + return caps; + } else { + /* Return no capability in Mac OS X 10.3 and earlier , as there are two unsolved bugs (both reported to apple along with + minimal test case): + 1. When a custom cursor (or some standard) java.awt.Cursor is assigned to a + Componennt, it is reset to the default pointer cursor when the window is de- + activated and the re-activated. The Cursor can not be reset to the custom cursor, + with another setCursor. + 2. When the cursor is moving in the top pixel row (y = 0 in AWT coordinates) in fullscreen + mode, no mouse moved events are reported, even though mouse pressed/released and dragged + events are reported + */ + return 0; + } + } + + public static Robot createRobot(final Component component) { + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction<Robot>() { + public Robot run() throws Exception { + return new Robot(component.getGraphicsConfiguration().getDevice()); + } + }); + } catch (PrivilegedActionException e) { + LWJGLUtil.log("Got exception while creating robot: " + e.getCause()); + return null; + } + } + + private static int transformY(Component component, int y) { + return component.getHeight() - 1 - y; + } + + /** + * Use reflection to access the JDK 1.5 pointer location, if possible and + * only if the given component is on the same screen as the cursor. Return + * null otherwise. + */ + private static Point getPointerLocation(final Component component) { + try { + final GraphicsConfiguration config = component.getGraphicsConfiguration(); + if (config != null) { + PointerInfo pointer_info = AccessController.doPrivileged(new PrivilegedExceptionAction<PointerInfo>() { + public PointerInfo run() throws Exception { + return MouseInfo.getPointerInfo(); + } + }); + GraphicsDevice device = pointer_info.getDevice(); + if (device == config.getDevice()) { + return pointer_info.getLocation(); + } + return null; + } + } catch (Exception e) { + LWJGLUtil.log("Failed to query pointer location: " + e.getCause()); + } + return null; + } + + /** + * Use the 1.5 API to get the cursor position relative to the component. Return null + * if it fails (JDK <= 1.4). + */ + public static Point getCursorPosition(Component component) { + try { + Point pointer_location = getPointerLocation(component); + if (pointer_location != null) { + Point location = component.getLocationOnScreen(); + pointer_location.translate(-location.x, -location.y); + pointer_location.move(pointer_location.x, transformY(component, pointer_location.y)); + return pointer_location; + } + } catch (IllegalComponentStateException e) { + LWJGLUtil.log("Failed to set cursor position: " + e); + } catch (NoClassDefFoundError e) { // Not JDK 1.5 + LWJGLUtil.log("Failed to query cursor position: " + e); + } + return null; + } + + public static void setCursorPosition(Component component, Robot robot, int x, int y) { + if (robot != null) { + try { + Point location = component.getLocationOnScreen(); + int transformed_x = location.x + x; + int transformed_y = location.y + transformY(component, y); + robot.mouseMove(transformed_x, transformed_y); + } catch (IllegalComponentStateException e) { + LWJGLUtil.log("Failed to set cursor position: " + e); + } + } + } + + public static int getMinCursorSize() { + Dimension min_size = Toolkit.getDefaultToolkit().getBestCursorSize(0, 0); + return Math.max(min_size.width, min_size.height); + } + + public static int getMaxCursorSize() { + Dimension max_size = Toolkit.getDefaultToolkit().getBestCursorSize(10000, 10000); + return Math.min(max_size.width, max_size.height); + } + + /** Native cursor handles */ + public static Cursor createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + BufferedImage cursor_image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + int[] pixels = new int[images.remaining()]; + int old_position = images.position(); + images.get(pixels); + images.position(old_position); + cursor_image.setRGB(0, 0, width, height, pixels, 0, width); + return Toolkit.getDefaultToolkit().createCustomCursor(cursor_image, new Point(xHotspot, yHotspot), "LWJGL Custom cursor"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/BaseReferences.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/BaseReferences.java new file mode 100644 index 0000000..8f862fe --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/BaseReferences.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.Buffer; +import java.util.Arrays; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL13.*; +import static org.lwjgl.opengl.GL20.*; + +class BaseReferences { + + int elementArrayBuffer; + int arrayBuffer; + final Buffer[] glVertexAttribPointer_buffer; + final Buffer[] glTexCoordPointer_buffer; + int glClientActiveTexture; + + int vertexArrayObject; + + int pixelPackBuffer; + int pixelUnpackBuffer; + + int indirectBuffer; + + BaseReferences(ContextCapabilities caps) { + int max_vertex_attribs; + if ( caps.OpenGL20 || caps.GL_ARB_vertex_shader ) + max_vertex_attribs = glGetInteger(GL_MAX_VERTEX_ATTRIBS); + else + max_vertex_attribs = 0; + glVertexAttribPointer_buffer = new Buffer[max_vertex_attribs]; + + int max_texture_units; + if ( caps.OpenGL20 ) + max_texture_units = glGetInteger(GL_MAX_TEXTURE_IMAGE_UNITS); + else if ( caps.OpenGL13 || caps.GL_ARB_multitexture ) + max_texture_units = glGetInteger(GL_MAX_TEXTURE_UNITS); + else + max_texture_units = 1; + glTexCoordPointer_buffer = new Buffer[max_texture_units]; + } + + void clear() { + this.elementArrayBuffer = 0; + this.arrayBuffer = 0; + this.glClientActiveTexture = 0; + Arrays.fill(glVertexAttribPointer_buffer, null); + Arrays.fill(glTexCoordPointer_buffer, null); + + this.vertexArrayObject = 0; + + this.pixelPackBuffer = 0; + this.pixelUnpackBuffer = 0; + + this.indirectBuffer = 0; + } + + void copy(BaseReferences references, int mask) { + if ( (mask & GL_CLIENT_VERTEX_ARRAY_BIT) != 0 ) { + this.elementArrayBuffer = references.elementArrayBuffer; + this.arrayBuffer = references.arrayBuffer; + this.glClientActiveTexture = references.glClientActiveTexture; + System.arraycopy(references.glVertexAttribPointer_buffer, 0, glVertexAttribPointer_buffer, 0, glVertexAttribPointer_buffer.length); + System.arraycopy(references.glTexCoordPointer_buffer, 0, glTexCoordPointer_buffer, 0, glTexCoordPointer_buffer.length); + + this.vertexArrayObject = references.vertexArrayObject; + + this.indirectBuffer = references.indirectBuffer; + } + + if ( (mask & GL_CLIENT_PIXEL_STORE_BIT) != 0 ) { + this.pixelPackBuffer = references.pixelPackBuffer; + this.pixelUnpackBuffer = references.pixelUnpackBuffer; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/CallbackUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/CallbackUtil.java new file mode 100644 index 0000000..afbbd69 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/CallbackUtil.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class that handles OpenGL API callbacks. + * + * @author Spasi + */ +final class CallbackUtil { + + /** Context -> Long */ + private static final Map<ContextCapabilities, Long> contextUserParamsARB = new HashMap<ContextCapabilities, Long>(); + /** Context -> Long */ + private static final Map<ContextCapabilities, Long> contextUserParamsAMD = new HashMap<ContextCapabilities, Long>(); + /** Context -> Long */ + private static final Map<ContextCapabilities, Long> contextUserParamsKHR = new HashMap<ContextCapabilities, Long>(); + + private CallbackUtil() {} + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address or 0 if the Object is null. + */ + static long createGlobalRef(final Object obj) { + return obj == null ? 0 : ncreateGlobalRef(obj); + } + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address. + */ + private static native long ncreateGlobalRef(Object obj); + + /** + * Deletes a global reference. + * + * @param ref the GlobalRef memory address. + */ + private static native void deleteGlobalRef(long ref); + + // --------- [ XXX_debug_output ] --------- + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + private static void registerContextCallback(final long userParam, final Map<ContextCapabilities, Long> contextUserData) { + ContextCapabilities caps = GLContext.getCapabilities(); + if ( caps == null ) { + deleteGlobalRef(userParam); + throw new IllegalStateException("No context is current."); + } + + final Long userParam_old = contextUserData.remove(caps); + if ( userParam_old != null ) + deleteGlobalRef(userParam_old); + + if ( userParam != 0 ) + contextUserData.put(caps, userParam); + } + + /** + * Releases references to any callbacks associated with the specified GL context. + * + * @param context the Context to unregister + */ + static void unregisterCallbacks(final Object context) { + // TODO: This is never called for custom contexts. Need to fix for LWJGL 3.0 + final ContextCapabilities caps = GLContext.getCapabilities(context); + + Long userParam = contextUserParamsARB.remove(caps); + if ( userParam != null ) + deleteGlobalRef(userParam); + + userParam = contextUserParamsAMD.remove(caps); + if ( userParam != null ) + deleteGlobalRef(userParam); + + userParam = contextUserParamsKHR.remove(caps); + if ( userParam != null ) + deleteGlobalRef(userParam); + } + + // --------- [ ARB_debug_output ] --------- + + /** + * Returns the memory address of the native function we pass to glDebugMessageCallbackARB. + * + * @return the callback function address + */ + static native long getDebugOutputCallbackARB(); + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + static void registerContextCallbackARB(final long userParam) { + registerContextCallback(userParam, contextUserParamsARB); + } + + // --------- [ AMD_debug_output ] --------- + + /** + * Returns the memory address of the native function we pass to glDebugMessageCallbackAMD. + * + * @return the callback function address + */ + static native long getDebugOutputCallbackAMD(); + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + static void registerContextCallbackAMD(final long userParam) { + registerContextCallback(userParam, contextUserParamsAMD); + } + + // --------- [ KHR_debug ] --------- + + /** + * Returns the memory address of the native function we pass to glDebugMessageCallback. + * + * @return the callback function address + */ + static native long getDebugCallbackKHR(); + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + static void registerContextCallbackKHR(final long userParam) { + registerContextCallback(userParam, contextUserParamsKHR); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Context.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Context.java new file mode 100644 index 0000000..4379ae8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Context.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +/** + * @author Spasi + * @since 14/5/2011 + */ +interface Context { + + boolean isCurrent() throws LWJGLException; + + void makeCurrent() throws LWJGLException; + + void releaseCurrent() throws LWJGLException; + + void releaseDrawable() throws LWJGLException; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribs.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribs.java new file mode 100644 index 0000000..b385251 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribs.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; + +import java.nio.IntBuffer; + +/** + * This class represents the context attributes passed to CreateContextAttribs of the ARB_create_context and + * ARB_create_context_profile extensions. + * These attributes can be used to indicate at context creation which OpenGL interface will be used. This includes the + * OpenGL version, the layer plane on which rendering takes place and also optional debug and forward combatibility modes. + * (read the ARB_create_context spec for details) + * <p/> + * Use of this class is optional. If an OpenGL context is created without passing an instance of this class + * (or ARB_create_context is not supported), the old context creation code will be used. Support for debug and forward + * compatible mobes is not guaranteed by the OpenGL implementation. Developers may encounter debug contexts being the same + * as non-debug contexts or forward compatible contexts having support for deprecated functionality. + * <p/> + * If the forwardCompatible + * attribute is used, LWJGL will not load the deprecated functionality (as defined in the OpenGL 3.0 specification). This + * means that developers can start working on cleaning up their applications without an OpenGL 3.0 complaint driver. + * <p/> + * This extension is not supported on MacOS X. However, in order to enable the GL 3.2 context on MacOS X 10.7 or newer, an + * instance of this class must be passed to LWJGL. The only valid configuration is <code>new ContextAttribs(3, 2).withProfileCore()</code>, + * anything else will be ignored. + * + * @author spasi <spasi@users.sourceforge.net> + */ +public final class ContextAttribs { + + // Same values for GLX & WGL + private static final int CONTEXT_ES2_PROFILE_BIT_EXT = 0x00000004; + + private static final int CONTEXT_ROBUST_ACCESS_BIT_ARB = 0x00000004; + private static final int CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + private static final int + NO_RESET_NOTIFICATION_ARB = 0x8261, + LOSE_CONTEXT_ON_RESET_ARB = 0x8252; + + private static final int CONTEXT_RESET_ISOLATION_BIT_ARB = 0x00000008; + + private int majorVersion; + private int minorVersion; + + private int layerPlane; + + private boolean debug; + private boolean forwardCompatible; + private boolean robustAccess; + + private boolean profileCore; + private boolean profileCompatibility; + private boolean profileES; + + private boolean loseContextOnReset; + private boolean contextResetIsolation; + + public ContextAttribs() { + this(1, 0); + } + + public ContextAttribs(final int majorVersion, final int minorVersion) { + if ( majorVersion < 0 || 4 < majorVersion || + minorVersion < 0 || + (majorVersion == 4 && 4 < minorVersion) || + (majorVersion == 3 && 3 < minorVersion) || + (majorVersion == 2 && 1 < minorVersion) || + (majorVersion == 1 && 5 < minorVersion) ) + throw new IllegalArgumentException("Invalid OpenGL version specified: " + majorVersion + '.' + minorVersion); + + this.majorVersion = majorVersion; + this.minorVersion = minorVersion; + } + + private ContextAttribs(final ContextAttribs attribs) { + this.majorVersion = attribs.majorVersion; + this.minorVersion = attribs.minorVersion; + + this.layerPlane = attribs.layerPlane; + + this.debug = attribs.debug; + this.forwardCompatible = attribs.forwardCompatible; + this.robustAccess = attribs.robustAccess; + + this.profileCore = attribs.profileCore; + this.profileCompatibility = attribs.profileCompatibility; + this.profileES = attribs.profileES; + + this.loseContextOnReset = attribs.loseContextOnReset; + } + + public int getMajorVersion() { + return majorVersion; + } + + public int getMinorVersion() { + return minorVersion; + } + + public int getLayerPlane() { + return layerPlane; + } + + public boolean isDebug() { + return debug; + } + + public boolean isForwardCompatible() { + return forwardCompatible; + } + + public boolean isProfileCore() { + return profileCore; + } + + public boolean isProfileCompatibility() { + return profileCompatibility; + } + + public boolean isProfileES() { + return profileES; + } + + public ContextAttribs withLayer(final int layerPlane) { + if ( layerPlane < 0 ) + throw new IllegalArgumentException("Invalid layer plane specified: " + layerPlane); + + if ( layerPlane == this.layerPlane ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.layerPlane = layerPlane; + return attribs; + } + + public ContextAttribs withDebug(final boolean debug) { + if ( debug == this.debug ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.debug = debug; + return attribs; + } + + public ContextAttribs withForwardCompatible(final boolean forwardCompatible) { + if ( forwardCompatible == this.forwardCompatible ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.forwardCompatible = forwardCompatible; + return attribs; + } + + public ContextAttribs withProfileCore(final boolean profileCore) { + if ( majorVersion < 3 || (majorVersion == 3 && minorVersion < 2) ) + throw new IllegalArgumentException("Profiles are only supported on OpenGL version 3.2 or higher."); + + if ( profileCore == this.profileCore ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.profileCore = profileCore; + if ( profileCore ) + attribs.profileCompatibility = false; + + return attribs; + } + + public ContextAttribs withProfileCompatibility(final boolean profileCompatibility) { + if ( majorVersion < 3 || (majorVersion == 3 && minorVersion < 2) ) + throw new IllegalArgumentException("Profiles are only supported on OpenGL version 3.2 or higher."); + + if ( profileCompatibility == this.profileCompatibility ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.profileCompatibility = profileCompatibility; + if ( profileCompatibility ) + attribs.profileCore = false; + + return attribs; + } + + public ContextAttribs withProfileES(final boolean profileES) { + if ( !(majorVersion == 2 && minorVersion == 0) ) + throw new IllegalArgumentException("The OpenGL ES profiles is only supported for OpenGL version 2.0."); + + if ( profileES == this.profileES ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.profileES = profileES; + + return attribs; + } + + /** + * Returns a ContextAttribs instance with CONTEXT_RESET_NOTIFICATION_STRATEGY set + * to LOSE_CONTEXT_ON_RESET if the parameter is true or to NO_RESET_NOTIFICATION + * if the parameter is false. + * + * @param loseContextOnReset + * + * @return the new ContextAttribs + */ + public ContextAttribs withLoseContextOnReset(final boolean loseContextOnReset) { + if ( loseContextOnReset == this.loseContextOnReset ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.loseContextOnReset = loseContextOnReset; + return attribs; + } + + public ContextAttribs withContextResetIsolation(final boolean contextResetIsolation) { + if ( contextResetIsolation == this.contextResetIsolation ) + return this; + + final ContextAttribs attribs = new ContextAttribs(this); + attribs.contextResetIsolation = contextResetIsolation; + return attribs; + } + + private static ContextAttribsImplementation getImplementation() { + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_LINUX: + return new LinuxContextAttribs(); + case LWJGLUtil.PLATFORM_WINDOWS: + return new WindowsContextAttribs(); + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + IntBuffer getAttribList() { + if ( LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX ) + return null; + + ContextAttribsImplementation implementation = getImplementation(); + + int attribCount = 0; + + if ( !(majorVersion == 1 && minorVersion == 0) ) + attribCount += 2; + if ( 0 < layerPlane ) + attribCount++; + + int flags = 0; + if ( debug ) + flags |= implementation.getDebugBit(); + if ( forwardCompatible ) + flags |= implementation.getForwardCompatibleBit(); + if ( robustAccess ) + flags |= CONTEXT_ROBUST_ACCESS_BIT_ARB; + if ( contextResetIsolation ) + flags |= CONTEXT_RESET_ISOLATION_BIT_ARB; + if ( 0 < flags ) + attribCount++; + + int profileMask = 0; + if ( profileCore ) + profileMask |= implementation.getProfileCoreBit(); + else if ( profileCompatibility ) + profileMask |= implementation.getProfileCompatibilityBit(); + else if ( profileES ) + profileMask |= CONTEXT_ES2_PROFILE_BIT_EXT; + if ( 0 < profileMask ) + attribCount++; + + if ( loseContextOnReset ) + attribCount++; + + if ( attribCount == 0 ) + return null; + + final IntBuffer attribs = BufferUtils.createIntBuffer((attribCount * 2) + 1); + + if ( !(majorVersion == 1 && minorVersion == 0) ) { + attribs.put(implementation.getMajorVersionAttrib()).put(majorVersion); + attribs.put(implementation.getMinorVersionAttrib()).put(minorVersion); + } + if ( 0 < layerPlane ) + attribs.put(implementation.getLayerPlaneAttrib()).put(layerPlane); + if ( 0 < flags ) + attribs.put(implementation.getFlagsAttrib()).put(flags); + if ( 0 < profileMask ) + attribs.put(implementation.getProfileMaskAttrib()).put(profileMask); + if ( loseContextOnReset ) + attribs.put(CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB).put(LOSE_CONTEXT_ON_RESET_ARB); + + attribs.put(0); + attribs.rewind(); + return attribs; + } + + public String toString() { + StringBuilder sb = new StringBuilder(32); + + sb.append("ContextAttribs:"); + sb.append(" Version=").append(majorVersion).append('.').append(minorVersion); + sb.append(" - Layer=").append(layerPlane); + sb.append(" - Debug=").append(debug); + sb.append(" - ForwardCompatible=").append(forwardCompatible); + sb.append(" - RobustAccess=").append(robustAccess); + if ( robustAccess ) + sb.append(" (").append(loseContextOnReset ? "LOSE_CONTEXT_ON_RESET" : "NO_RESET_NOTIFICATION"); + sb.append(" - Profile="); + if ( profileCore ) + sb.append("Core"); + else if ( profileCompatibility ) + sb.append("Compatibility"); + else + sb.append("None"); + + return sb.toString(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribsImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribsImplementation.java new file mode 100644 index 0000000..d47a423 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextAttribsImplementation.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.opengl; + +/** @author spasi <spasi@users.sourceforge.net> */ +interface ContextAttribsImplementation { + + int getMajorVersionAttrib(); + + int getMinorVersionAttrib(); + + int getLayerPlaneAttrib(); + + int getFlagsAttrib(); + + int getDebugBit(); + + int getForwardCompatibleBit(); + + int getProfileMaskAttrib(); + + int getProfileCoreBit(); + + int getProfileCompatibilityBit(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGL.java new file mode 100644 index 0000000..8822f5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGL.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.Sys; +import org.lwjgl.opencl.KHRGLSharing; +import org.lwjgl.opencl.APPLEGLSharing; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import static org.lwjgl.opengl.GL11.*; + +/** + * <p/> + * Context encapsulates an OpenGL context. + * <p/> + * <p/> + * This class is thread-safe. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class ContextGL implements Context { + + /** The platform specific implementation of context methods */ + private static final ContextImplementation implementation; + + /** The current Context */ + private static final ThreadLocal<ContextGL> current_context_local = new ThreadLocal<ContextGL>(); + + /** Handle to the native GL rendering context */ + private final ByteBuffer handle; + private final PeerInfo peer_info; + + private final ContextAttribs contextAttribs; + private final boolean forwardCompatible; + + /** Whether the context has been destroyed */ + private boolean destroyed; + + private boolean destroy_requested; + + /** The thread that has this context current, or null. */ + private Thread thread; + + static { + Sys.initialize(); + implementation = createImplementation(); + } + + private static ContextImplementation createImplementation() { + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_LINUX: + return new LinuxContextImplementation(); + case LWJGLUtil.PLATFORM_WINDOWS: + return new WindowsContextImplementation(); + case LWJGLUtil.PLATFORM_MACOSX: + return new MacOSXContextImplementation(); + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + PeerInfo getPeerInfo() { + return peer_info; + } + + ContextAttribs getContextAttribs() { + return contextAttribs; + } + + static ContextGL getCurrentContext() { + return current_context_local.get(); + } + + /** Create a context with the specified peer info and shared context */ + ContextGL(PeerInfo peer_info, ContextAttribs attribs, ContextGL shared_context) throws LWJGLException { + ContextGL context_lock = shared_context != null ? shared_context : this; + // If shared_context is not null, synchronize on it to make sure it is not deleted + // while this context is created. Otherwise, simply synchronize on ourself to avoid NPE + synchronized ( context_lock ) { + if ( shared_context != null && shared_context.destroyed ) + throw new IllegalArgumentException("Shared context is destroyed"); + GLContext.loadOpenGLLibrary(); + try { + this.peer_info = peer_info; + this.contextAttribs = attribs; + + IntBuffer attribList; + if ( attribs != null ) { + attribList = attribs.getAttribList(); + forwardCompatible = attribs.isForwardCompatible(); + } else { + attribList = null; + forwardCompatible = false; + } + + this.handle = implementation.create(peer_info, attribList, shared_context != null ? shared_context.handle : null); + } catch (LWJGLException e) { + GLContext.unloadOpenGLLibrary(); + throw e; + } + } + } + + /** Release the current context (if any). After this call, no context is current. */ + public void releaseCurrent() throws LWJGLException { + ContextGL current_context = getCurrentContext(); + if ( current_context != null ) { + implementation.releaseCurrentContext(); + GLContext.useContext(null); + current_context_local.set(null); + synchronized ( current_context ) { + current_context.thread = null; + current_context.checkDestroy(); + } + } + } + + /** + * Release the context from its drawable. This is necessary on some platforms, + * like Mac OS X, where binding the context to a drawable and binding the context + * for rendering are two distinct actions and where calling releaseDrawable + * on every releaseCurrentContext results in artifacts. + */ + public synchronized void releaseDrawable() throws LWJGLException { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + implementation.releaseDrawable(getHandle()); + } + + /** Update the context. Should be called whenever it's drawable is moved or resized */ + public synchronized void update() { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + implementation.update(getHandle()); + } + + /** Swap the buffers on the current context. Only valid for double-buffered contexts */ + public static void swapBuffers() throws LWJGLException { + implementation.swapBuffers(); + } + + private boolean canAccess() { + return thread == null || Thread.currentThread() == thread; + } + + private void checkAccess() { + if ( !canAccess() ) + throw new IllegalStateException("From thread " + Thread.currentThread() + ": " + thread + " already has the context current"); + } + + /** Make the context current */ + public synchronized void makeCurrent() throws LWJGLException { + checkAccess(); + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + thread = Thread.currentThread(); + current_context_local.set(this); + implementation.makeCurrent(peer_info, handle); + GLContext.useContext(this, forwardCompatible); + } + + ByteBuffer getHandle() { + return handle; + } + + /** Query whether the context is current */ + public synchronized boolean isCurrent() throws LWJGLException { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + return implementation.isCurrent(handle); + } + + private void checkDestroy() { + if ( !destroyed && destroy_requested ) { + try { + releaseDrawable(); + implementation.destroy(peer_info, handle); + CallbackUtil.unregisterCallbacks(this); + destroyed = true; + thread = null; + GLContext.unloadOpenGLLibrary(); + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying context: " + e); + } + } + } + + /** + * Set the buffer swap interval. This call is a best-attempt at changing + * the monitor swap interval, which is the minimum periodicity of color buffer swaps, + * measured in video frame periods, and is not guaranteed to be successful. + * <p/> + * A video frame period is the time required to display a full frame of video data. + */ + public static void setSwapInterval(int value) { + implementation.setSwapInterval(value); + } + + /** + * Destroy the context. This method behaves the same as destroy() with the extra + * requirement that the context must be either current to the current thread or not + * current at all. + */ + public synchronized void forceDestroy() throws LWJGLException { + checkAccess(); + destroy(); + } + + /** + * Request destruction of the Context. If the context is current, no context will be current after this call. + * The context is destroyed when no thread has it current. + */ + public synchronized void destroy() throws LWJGLException { + if ( destroyed ) + return; + destroy_requested = true; + boolean was_current = isCurrent(); + int error = GL_NO_ERROR; + if ( was_current ) { + if ( GLContext.getCapabilities() != null && GLContext.getCapabilities().OpenGL11 ) + error = glGetError(); + releaseCurrent(); + } + checkDestroy(); + if ( was_current && error != GL_NO_ERROR ) + throw new OpenGLException(error); + } + + public synchronized void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + final ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_WINDOWS: + final WindowsContextImplementation implWindows = (WindowsContextImplementation)implementation; + properties.put(KHRGLSharing.CL_GL_CONTEXT_KHR).put(implWindows.getHGLRC(handle)); + properties.put(KHRGLSharing.CL_WGL_HDC_KHR).put(implWindows.getHDC(peer_handle)); + break; + case LWJGLUtil.PLATFORM_LINUX: + final LinuxContextImplementation implLinux = (LinuxContextImplementation)implementation; + properties.put(KHRGLSharing.CL_GL_CONTEXT_KHR).put(implLinux.getGLXContext(handle)); + properties.put(KHRGLSharing.CL_GLX_DISPLAY_KHR).put(implLinux.getDisplay(peer_handle)); + break; + case LWJGLUtil.PLATFORM_MACOSX: + if (LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 6)) { // only supported on OS X 10.6+ + // http://oscarbg.blogspot.com/2009/10/about-opencl-opengl-interop.html + final MacOSXContextImplementation implMacOSX = (MacOSXContextImplementation)implementation; + final long CGLShareGroup = implMacOSX.getCGLShareGroup(handle); + properties.put(APPLEGLSharing.CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE).put(CGLShareGroup); + break; + } + default: + throw new UnsupportedOperationException("CL/GL context sharing is not supported on this platform."); + } + } finally { + peer_info.unlock(); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGLES.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGLES.java new file mode 100644 index 0000000..ed1cb20 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextGLES.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengles.EGLContext; +import org.lwjgl.opengles.GLContext; +import org.lwjgl.opengles.GLES20; +import org.lwjgl.opengles.PowerManagementEventException; + +import static org.lwjgl.opengles.EGL.*; + +/** + * <p/> + * Context encapsulates an OpenGL ES context. + * <p/> + * <p/> + * This class is thread-safe. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3332 $ + * $Id: Context.java 3332 2010-04-20 18:21:05Z spasi $ + */ +final class ContextGLES implements org.lwjgl.opengl.Context { + + /** The current Context */ + private static final ThreadLocal<ContextGLES> current_context_local = new ThreadLocal<ContextGLES>(); + + /** Handle to the native GL rendering context */ + private final DrawableGLES drawable; + private final EGLContext eglContext; + + private final org.lwjgl.opengles.ContextAttribs contextAttribs; + + /** Whether the context has been destroyed */ + private boolean destroyed; + + private boolean destroy_requested; + + /** The thread that has this context current, or null. */ + private Thread thread; + + static { + Sys.initialize(); + } + + public EGLContext getEGLContext() { + return eglContext; + } + + org.lwjgl.opengles.ContextAttribs getContextAttribs() { + return contextAttribs; + } + + static ContextGLES getCurrentContext() { + return current_context_local.get(); + } + + /** Create a context with the specified peer info and shared context */ + ContextGLES(DrawableGLES drawable, org.lwjgl.opengles.ContextAttribs attribs, ContextGLES shared_context) throws LWJGLException { + if ( drawable == null ) + throw new IllegalArgumentException(); + + ContextGLES context_lock = shared_context != null ? shared_context : this; + // If shared_context is not null, synchronize on it to make sure it is not deleted + // while this context is created. Otherwise, simply synchronize on ourself to avoid NPE + synchronized ( context_lock ) { + if ( shared_context != null && shared_context.destroyed ) + throw new IllegalArgumentException("Shared context is destroyed"); + + this.drawable = drawable; + this.contextAttribs = attribs; + this.eglContext = drawable.getEGLDisplay().createContext(drawable.getEGLConfig(), + shared_context == null ? null : shared_context.eglContext, + attribs == null ? new org.lwjgl.opengles.ContextAttribs(2).getAttribList() : attribs.getAttribList()); + } + } + + /** Release the current context (if any). After this call, no context is current. */ + public void releaseCurrent() throws LWJGLException, PowerManagementEventException { + eglReleaseCurrent(drawable.getEGLDisplay()); + org.lwjgl.opengles.GLContext.useContext(null); + current_context_local.set(null); + + synchronized ( this ) { + thread = null; + checkDestroy(); + } + } + + /** Swap the buffers on the current context. Only valid for double-buffered contexts */ + public static void swapBuffers() throws LWJGLException, PowerManagementEventException { + ContextGLES current_context = getCurrentContext(); + if ( current_context != null ) + current_context.drawable.getEGLSurface().swapBuffers(); + } + + private boolean canAccess() { + return thread == null || Thread.currentThread() == thread; + } + + private void checkAccess() { + if ( !canAccess() ) + throw new IllegalStateException("From thread " + Thread.currentThread() + ": " + thread + " already has the context current"); + } + + /** Make the context current */ + public synchronized void makeCurrent() throws LWJGLException, PowerManagementEventException { + checkAccess(); + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + thread = Thread.currentThread(); + current_context_local.set(this); + eglContext.makeCurrent(drawable.getEGLSurface()); + org.lwjgl.opengles.GLContext.useContext(this); + } + + /** Query whether the context is current */ + public synchronized boolean isCurrent() throws LWJGLException { + if ( destroyed ) + throw new IllegalStateException("Context is destroyed"); + return eglIsCurrentContext(eglContext); + } + + private void checkDestroy() { + if ( !destroyed && destroy_requested ) { + try { + eglContext.destroy(); + destroyed = true; + thread = null; + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying context: " + e); + } + } + } + + /** + * Set the buffer swap interval. This call is a best-attempt at changing + * the monitor swap interval, which is the minimum periodicity of color buffer swaps, + * measured in video frame periods, and is not guaranteed to be successful. + * <p/> + * A video frame period is the time required to display a full frame of video data. + */ + public static void setSwapInterval(int value) { + ContextGLES current_context = getCurrentContext(); + if ( current_context != null ) { + try { + current_context.drawable.getEGLDisplay().setSwapInterval(value); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to set swap interval. Reason: " + e.getMessage()); + } + } + } + + /** + * Destroy the context. This method behaves the same as destroy() with the extra + * requirement that the context must be either current to the current thread or not + * current at all. + */ + public synchronized void forceDestroy() throws LWJGLException { + checkAccess(); + destroy(); + } + + /** + * Request destruction of the Context. If the context is current, no context will be current after this call. + * The context is destroyed when no thread has it current. + */ + public synchronized void destroy() throws LWJGLException { + if ( destroyed ) + return; + destroy_requested = true; + boolean was_current = isCurrent(); + int error = GLES20.GL_NO_ERROR; + if ( was_current ) { + if ( org.lwjgl.opengles.GLContext.getCapabilities() != null && GLContext.getCapabilities().OpenGLES20 ) + error = GLES20.glGetError(); + + try { + releaseCurrent(); + } catch (PowerManagementEventException e) { + // Ignore + } + } + checkDestroy(); + if ( was_current && error != GLES20.GL_NO_ERROR ) + throw new OpenGLException(error); + } + + public void releaseDrawable() throws LWJGLException { + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextImplementation.java new file mode 100644 index 0000000..0a5a42a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ContextImplementation.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.LWJGLException; + +/** + * <p/> + * Context implementation interface. + * <p/> + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +interface ContextImplementation { + /** + * Create a context. + */ + ByteBuffer create(PeerInfo peer_info, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException; + + /** + * Swap the buffers of the current context. Only valid for double-buffered contexts. + */ + void swapBuffers() throws LWJGLException; + + /** + * Release the context from its drawable, if any. + */ + void releaseDrawable(ByteBuffer context_handle) throws LWJGLException; + + /** + * Release the current context (if any). After this call, no context is current. + */ + void releaseCurrentContext() throws LWJGLException; + + /** + * Update the context. Should be called whenever it's drawable is moved or resized + */ + void update(ByteBuffer context_handle); + + /** + * Query whether the context is current + */ + void makeCurrent(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException; + + /** + * Query whether the context is current + */ + boolean isCurrent(ByteBuffer handle) throws LWJGLException; + + void setSwapInterval(int value); + + /** + * Destroys the Context. + */ + void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Display.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Display.java new file mode 100644 index 0000000..7d5686b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Display.java @@ -0,0 +1,1375 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the abstract class for a Display in LWJGL. LWJGL displays have some + * peculiar characteristics: + * + * - the display may be closeable by the user or operating system, and may be minimized + * by the user or operating system + * - only one display may ever be open at once + * - the operating system may or may not be able to do fullscreen or windowed displays. + * + * @author foo + */ + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.input.Controllers; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Arrays; +import java.util.HashSet; + +public final class Display { + + private static final Thread shutdown_hook = new Thread() { + public void run() { + reset(); + } + }; + + /** The display implementor */ + private static final DisplayImplementation display_impl; + + /** The initial display mode */ + private static final DisplayMode initial_mode; + + /** The parent, if any */ + private static Canvas parent; + + /** The current display mode, if created */ + private static DisplayMode current_mode; + + /** X coordinate of the window */ + private static int x = -1; + + /** Cached window icons, for when Display is recreated */ + private static ByteBuffer[] cached_icons; + + /** + * Y coordinate of the window. Y in window coordinates is from the top of the display down, + * unlike GL, where it is typically at the bottom of the display. + */ + private static int y = -1; + + /** the width of the Display window */ + private static int width = 0; + + /** the height of the Display window */ + private static int height = 0; + + /** Title of the window (never null) */ + private static String title = "Game"; + + /** Fullscreen */ + private static boolean fullscreen; + + /** Swap interval */ + private static int swap_interval; + + /** The Drawable instance that tracks the current Display context */ + private static DrawableLWJGL drawable; + + private static boolean window_created; + + private static boolean parent_resized; + + private static boolean window_resized; + + private static boolean window_resizable; + + /** Initial Background Color of Display */ + private static float r, g, b; + + private static final ComponentListener component_listener = new ComponentAdapter() { + public void componentResized(ComponentEvent e) { + synchronized ( GlobalLock.lock ) { + parent_resized = true; + } + } + }; + + static { + Sys.initialize(); + display_impl = createDisplayImplementation(); + try { + current_mode = initial_mode = display_impl.init(); + LWJGLUtil.log("Initial mode: " + initial_mode); + } catch (LWJGLException e) { + throw new RuntimeException(e); + }; + } + + /** + * Fetch the Drawable from the Display. + * + * @return the Drawable corresponding to the Display context + */ + public static Drawable getDrawable() { + return drawable; + } + + private static DisplayImplementation createDisplayImplementation() { + switch ( LWJGLUtil.getPlatform() ) { + case LWJGLUtil.PLATFORM_LINUX: + return new LinuxDisplay(); + case LWJGLUtil.PLATFORM_WINDOWS: + return new WindowsDisplay(); + case LWJGLUtil.PLATFORM_MACOSX: + return new MacOSXDisplay(); + default: + throw new IllegalStateException("Unsupported platform"); + } + } + + /** Only constructed by ourselves */ + private Display() { + } + + /** + * Returns the entire list of possible fullscreen display modes as an array, in no + * particular order. Although best attempts to filter out invalid modes are done, any + * given mode is not guaranteed to be available nor is it guaranteed to be within the + * current monitor specs (this is especially a problem with the frequency parameter). + * Furthermore, it is not guaranteed that create() will detect an illegal display mode. + * <p/> + * The only certain way to check + * is to call create() and make sure it works. + * Only non-palette-indexed modes are returned (ie. bpp will be 16, 24, or 32). + * Only DisplayModes from this call can be used when the Display is in fullscreen + * mode. + * + * @return an array of all display modes the system reckons it can handle. + */ + public static DisplayMode[] getAvailableDisplayModes() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + DisplayMode[] unfilteredModes = display_impl.getAvailableDisplayModes(); + + if ( unfilteredModes == null ) { + return new DisplayMode[0]; + } + + // We'll use a HashSet to filter out the duplicated modes + HashSet<DisplayMode> modes = new HashSet<DisplayMode>(unfilteredModes.length); + + modes.addAll(Arrays.asList(unfilteredModes)); + DisplayMode[] filteredModes = new DisplayMode[modes.size()]; + modes.toArray(filteredModes); + + LWJGLUtil.log("Removed " + (unfilteredModes.length - filteredModes.length) + " duplicate displaymodes"); + + return filteredModes; + } + } + + /** + * Return the initial desktop display mode. + * + * @return The desktop display mode + */ + public static DisplayMode getDesktopDisplayMode() { + return initial_mode; + } + + /** + * Return the current display mode, as set by setDisplayMode(). + * + * @return The current display mode + */ + public static DisplayMode getDisplayMode() { + return current_mode; + } + + /** + * Set the current display mode. If no OpenGL context has been created, the given mode will apply to + * the context when create() is called, and no immediate mode switching will happen. If there is a + * context already, it will be resized according to the given mode. If the context is also a + * fullscreen context, the mode will also be switched immediately. The native cursor position + * is also reset. + * + * @param mode The new display mode to set + * + * @throws LWJGLException if the display mode could not be set + */ + public static void setDisplayMode(DisplayMode mode) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( mode == null ) + throw new NullPointerException("mode must be non-null"); + boolean was_fullscreen = isFullscreen(); + current_mode = mode; + if ( isCreated() ) { + destroyWindow(); + // If mode is not fullscreen capable, make sure we are in windowed mode + try { + if ( was_fullscreen && !isFullscreen() ) + display_impl.resetDisplayMode(); + else if ( isFullscreen() ) + switchDisplayMode(); + createWindow(); + makeCurrentAndSetSwapInterval(); + } catch (LWJGLException e) { + drawable.destroy(); + display_impl.resetDisplayMode(); + throw e; + } + } + } + } + + private static DisplayMode getEffectiveMode() { + return !isFullscreen() && parent != null ? new DisplayMode(parent.getWidth(), parent.getHeight()) : current_mode; + } + + private static int getWindowX() { + if ( !isFullscreen() && parent == null ) { + // if no display location set, center window + if ( x == -1 ) { + return Math.max(0, (initial_mode.getWidth() - current_mode.getWidth()) / 2); + } else { + return x; + } + } else { + return 0; + } + } + + private static int getWindowY() { + if ( !isFullscreen() && parent == null ) { + // if no display location set, center window + if ( y == -1 ) { + return Math.max(0, (initial_mode.getHeight() - current_mode.getHeight()) / 2); + } else { + return y; + } + } else { + return 0; + } + } + + /** + * Create the native window peer from the given mode and fullscreen flag. + * A native context must exist, and it will be attached to the window. + */ + private static void createWindow() throws LWJGLException { + if ( window_created ) { + return; + } + Canvas tmp_parent = isFullscreen() ? null : parent; + if ( tmp_parent != null && !tmp_parent.isDisplayable() ) // Only a best effort check, since the parent can turn undisplayable hereafter + throw new LWJGLException("Parent.isDisplayable() must be true"); + if ( tmp_parent != null ) { + tmp_parent.addComponentListener(component_listener); + } + DisplayMode mode = getEffectiveMode(); + display_impl.createWindow(drawable, mode, tmp_parent, getWindowX(), getWindowY()); + window_created = true; + + width = Display.getDisplayMode().getWidth(); + height = Display.getDisplayMode().getHeight(); + + setTitle(title); + initControls(); + + // set cached window icon if exists + if ( cached_icons != null ) { + setIcon(cached_icons); + } else { + setIcon(new ByteBuffer[] { LWJGLUtil.LWJGLIcon32x32, LWJGLUtil.LWJGLIcon16x16 }); + } + } + + private static void releaseDrawable() { + try { + Context context = drawable.getContext(); + if ( context != null && context.isCurrent() ) { + context.releaseCurrent(); + context.releaseDrawable(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while trying to release context: " + e); + } + } + + private static void destroyWindow() { + if ( !window_created ) { + return; + } + if ( parent != null ) { + parent.removeComponentListener(component_listener); + } + releaseDrawable(); + + // Automatically destroy keyboard & mouse + if ( Mouse.isCreated() ) { + Mouse.destroy(); + } + if ( Keyboard.isCreated() ) { + Keyboard.destroy(); + } + display_impl.destroyWindow(); + window_created = false; + } + + private static void switchDisplayMode() throws LWJGLException { + if ( !current_mode.isFullscreenCapable() ) { + throw new IllegalStateException("Only modes acquired from getAvailableDisplayModes() can be used for fullscreen display"); + } + display_impl.switchDisplayMode(current_mode); + } + + /** + * Set the display configuration to the specified gamma, brightness and contrast. + * The configuration changes will be reset when destroy() is called. + * + * @param gamma The gamma value + * @param brightness The brightness value between -1.0 and 1.0, inclusive + * @param contrast The contrast, larger than 0.0. + */ + public static void setDisplayConfiguration(float gamma, float brightness, float contrast) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) { + throw new LWJGLException("Display not yet created."); + } + if ( brightness < -1.0f || brightness > 1.0f ) + throw new IllegalArgumentException("Invalid brightness value"); + if ( contrast < 0.0f ) + throw new IllegalArgumentException("Invalid contrast value"); + int rampSize = display_impl.getGammaRampLength(); + if ( rampSize == 0 ) { + throw new LWJGLException("Display configuration not supported"); + } + FloatBuffer gammaRamp = BufferUtils.createFloatBuffer(rampSize); + for ( int i = 0; i < rampSize; i++ ) { + float intensity = (float)i / (rampSize - 1); + // apply gamma + float rampEntry = (float)java.lang.Math.pow(intensity, gamma); + // apply brightness + rampEntry += brightness; + // apply contrast + rampEntry = (rampEntry - 0.5f) * contrast + 0.5f; + // Clamp entry to [0, 1] + if ( rampEntry > 1.0f ) + rampEntry = 1.0f; + else if ( rampEntry < 0.0f ) + rampEntry = 0.0f; + gammaRamp.put(i, rampEntry); + } + display_impl.setGammaRamp(gammaRamp); + LWJGLUtil.log("Gamma set, gamma = " + gamma + ", brightness = " + brightness + ", contrast = " + contrast); + } + } + + /** + * An accurate sync method that will attempt to run at a constant frame rate. + * It should be called once every frame. + * + * @param fps - the desired frame rate, in frames per second + */ + public static void sync(int fps) { + Sync.sync(fps); + } + + /** @return the title of the window */ + public static String getTitle() { + synchronized ( GlobalLock.lock ) { + return title; + } + } + + /** Return the last parent set with setParent(). */ + public static Canvas getParent() { + synchronized ( GlobalLock.lock ) { + return parent; + } + } + + /** + * Set the parent of the Display. If parent is null, the Display will appear as a top level window. + * If parent is not null, the Display is made a child of the parent. A parent's isDisplayable() must be true when + * setParent() is called and remain true until setParent() is called again with + * null or a different parent. This generally means that the parent component must remain added to it's parent container.<p> + * It is not advisable to call this method from an AWT thread, since the context will be made current on the thread + * and it is difficult to predict which AWT thread will process any given AWT event.<p> + * While the Display is in fullscreen mode, the current parent will be ignored. Additionally, when a non null parent is specified, + * the Dispaly will inherit the size of the parent, disregarding the currently set display mode.<p> + */ + public static void setParent(Canvas parent) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( Display.parent != parent ) { + Display.parent = parent; + if ( !isCreated() ) + return; + destroyWindow(); + try { + if ( isFullscreen() ) { + switchDisplayMode(); + } else { + display_impl.resetDisplayMode(); + } + createWindow(); + makeCurrentAndSetSwapInterval(); + } catch (LWJGLException e) { + drawable.destroy(); + display_impl.resetDisplayMode(); + throw e; + } + } + } + } + + /** + * Set the fullscreen mode of the context. If no context has been created through create(), + * the mode will apply when create() is called. If fullscreen is true, the context will become + * a fullscreen context and the display mode is switched to the mode given by getDisplayMode(). If + * fullscreen is false, the context will become a windowed context with the dimensions given in the + * mode returned by getDisplayMode(). The native cursor position is also reset. + * + * @param fullscreen Specify the fullscreen mode of the context. + * + * @throws LWJGLException If fullscreen is true, and the current DisplayMode instance is not + * from getAvailableDisplayModes() or if the mode switch fails. + */ + public static void setFullscreen(boolean fullscreen) throws LWJGLException { + setDisplayModeAndFullscreenInternal(fullscreen, current_mode); + } + + /** + * Set the mode of the context. If no context has been created through create(), + * the mode will apply when create() is called. If mode.isFullscreenCapable() is true, the context will become + * a fullscreen context and the display mode is switched to the mode given by getDisplayMode(). If + * mode.isFullscreenCapable() is false, the context will become a windowed context with the dimensions given in the + * mode returned by getDisplayMode(). The native cursor position is also reset. + * + * @param mode The new display mode to set. Must be non-null. + * + * @throws LWJGLException If the mode switch fails. + */ + public static void setDisplayModeAndFullscreen(DisplayMode mode) throws LWJGLException { + setDisplayModeAndFullscreenInternal(mode.isFullscreenCapable(), mode); + } + + private static void setDisplayModeAndFullscreenInternal(boolean fullscreen, DisplayMode mode) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( mode == null ) + throw new NullPointerException("mode must be non-null"); + DisplayMode old_mode = current_mode; + current_mode = mode; + boolean was_fullscreen = isFullscreen(); + Display.fullscreen = fullscreen; + if ( was_fullscreen != isFullscreen() || !mode.equals(old_mode) ) { + if ( !isCreated() ) + return; + destroyWindow(); + try { + if ( isFullscreen() ) { + switchDisplayMode(); + } else { + display_impl.resetDisplayMode(); + } + createWindow(); + makeCurrentAndSetSwapInterval(); + } catch (LWJGLException e) { + drawable.destroy(); + display_impl.resetDisplayMode(); + throw e; + } + } + } + } + + /** @return whether the Display is in fullscreen mode */ + public static boolean isFullscreen() { + synchronized ( GlobalLock.lock ) { + return fullscreen && current_mode.isFullscreenCapable(); + } + } + + /** + * Set the title of the window. This may be ignored by the underlying OS. + * + * @param newTitle The new window title + */ + public static void setTitle(String newTitle) { + synchronized ( GlobalLock.lock ) { + if ( newTitle == null ) { + newTitle = ""; + } + title = newTitle; + if ( isCreated() ) + display_impl.setTitle(title); + } + } + + /** @return true if the user or operating system has asked the window to close */ + public static boolean isCloseRequested() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Cannot determine close requested state of uncreated window"); + return display_impl.isCloseRequested(); + } + } + + /** @return true if the window is visible, false if not */ + public static boolean isVisible() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Cannot determine minimized state of uncreated window"); + return display_impl.isVisible(); + } + } + + /** @return true if window is active, that is, the foreground display of the operating system. */ + public static boolean isActive() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Cannot determine focused state of uncreated window"); + return display_impl.isActive(); + } + } + + /** + * Determine if the window's contents have been damaged by external events. + * If you are writing a straightforward game rendering loop and simply paint + * every frame regardless, you can ignore this flag altogether. If you are + * trying to be kind to other processes you can check this flag and only + * redraw when it returns true. The flag is cleared when update() or isDirty() is called. + * + * @return true if the window has been damaged by external changes + * and needs to repaint itself + */ + public static boolean isDirty() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Cannot determine dirty state of uncreated window"); + return display_impl.isDirty(); + } + } + + /** + * Process operating system events. Call this to update the Display's state and to receive new + * input device events. This method is called from update(), so it is not necessary to call + * this method if update() is called periodically. + */ + public static void processMessages() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Display not created"); + + display_impl.update(); + } + pollDevices(); + } + + /** + * Swap the display buffers. This method is called from update(), and should normally not be called by + * the application. + * + * @throws OpenGLException if an OpenGL error has occured since the last call to glGetError() + */ + public static void swapBuffers() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Display not created"); + + if ( LWJGLUtil.DEBUG ) + drawable.checkGLError(); + drawable.swapBuffers(); + } + } + + /** + * Update the window. If the window is visible clears + * the dirty flag and calls swapBuffers() and finally + * polls the input devices. + */ + public static void update() { + update(true); + } + + /** + * Update the window. If the window is visible clears + * the dirty flag and calls swapBuffers() and finally + * polls the input devices if processMessages is true. + * + * @param processMessages Poll input devices if true + */ + public static void update(boolean processMessages) { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + throw new IllegalStateException("Display not created"); + + // We paint only when the window is visible or dirty + if ( display_impl.isVisible() || display_impl.isDirty() ) { + try { + swapBuffers(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + + window_resized = !isFullscreen() && parent == null && display_impl.wasResized(); + + if ( window_resized ) { + width = display_impl.getWidth(); + height = display_impl.getHeight(); + } + + if ( parent_resized ) { + reshape(); + parent_resized = false; + window_resized = true; + } + + if ( processMessages ) + processMessages(); + } + } + + static void pollDevices() { + // Poll the input devices while we're here + if ( Mouse.isCreated() ) { + Mouse.poll(); + Mouse.updateCursor(); + } + + if ( Keyboard.isCreated() ) { + Keyboard.poll(); + } + + if ( Controllers.isCreated() ) { + Controllers.poll(); + } + } + + /** + * Release the Display context. + * + * @throws LWJGLException If the context could not be released + */ + public static void releaseContext() throws LWJGLException { + drawable.releaseContext(); + } + + /** Returns true if the Display's context is current in the current thread. */ + public static boolean isCurrent() throws LWJGLException { + return drawable.isCurrent(); + } + + /** + * Make the Display the current rendering context for GL calls. + * + * @throws LWJGLException If the context could not be made current + */ + public static void makeCurrent() throws LWJGLException { + drawable.makeCurrent(); + } + + private static void removeShutdownHook() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + Runtime.getRuntime().removeShutdownHook(shutdown_hook); + return null; + } + }); + } + + private static void registerShutdownHook() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + Runtime.getRuntime().addShutdownHook(shutdown_hook); + return null; + } + }); + } + + /** + * Create the OpenGL context. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @throws LWJGLException + */ + public static void create() throws LWJGLException { + create(new PixelFormat()); + } + + /** + * Create the OpenGL context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. + * + * @throws LWJGLException + */ + public static void create(PixelFormat pixel_format) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, null, (ContextAttribs)null); + } + } + + /** + * Create the OpenGL context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. + * @param shared_drawable The Drawable to share context with. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormat pixel_format, Drawable shared_drawable) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, shared_drawable, (ContextAttribs)null); + } + } + + /** + * Create the OpenGL context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, null, attribs); + } + } + + /** + * Create the OpenGL context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. + * @param shared_drawable The Drawable to share context with. (optional, may be null) + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormat pixel_format, Drawable shared_drawable, ContextAttribs attribs) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( isCreated() ) + throw new IllegalStateException("Only one LWJGL context may be instantiated at any one time."); + if ( pixel_format == null ) + throw new NullPointerException("pixel_format cannot be null"); + removeShutdownHook(); + registerShutdownHook(); + if ( isFullscreen() ) + switchDisplayMode(); + + final DrawableGL drawable = new DrawableGL() { + public void destroy() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + return; + + releaseDrawable(); + super.destroy(); + destroyWindow(); + x = y = -1; + cached_icons = null; + reset(); + removeShutdownHook(); + } + } + }; + Display.drawable = drawable; + + try { + drawable.setPixelFormat(pixel_format, attribs); + try { + createWindow(); + try { + drawable.context = new ContextGL(drawable.peer_info, attribs, shared_drawable != null ? ((DrawableGL)shared_drawable).getContext() : null); + try { + makeCurrentAndSetSwapInterval(); + initContext(); + } catch (LWJGLException e) { + drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + destroyWindow(); + throw e; + } + } catch (LWJGLException e) { + drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + display_impl.resetDisplayMode(); + throw e; + } + } + } + + /** + * Create the OpenGL ES context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. Must be an instance of org.lwjgl.opengles.PixelFormat. + * + * @throws LWJGLException + */ + + public static void create(PixelFormatLWJGL pixel_format) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, null, null); + } + } + + /** + * Create the OpenGL ES context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. Must be an instance of org.lwjgl.opengles.PixelFormat. + * @param shared_drawable The Drawable to share context with. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormatLWJGL pixel_format, Drawable shared_drawable) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, shared_drawable, null); + } + } + + /** + * Create the OpenGL ES context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. Must be an instance of org.lwjgl.opengles.PixelFormat. + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormatLWJGL pixel_format, org.lwjgl.opengles.ContextAttribs attribs) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + create(pixel_format, null, attribs); + } + } + + /** + * Create the OpenGL ES context with the given minimum parameters. If isFullscreen() is true or if windowed + * context are not supported on the platform, the display mode will be switched to the mode returned by + * getDisplayMode(), and a fullscreen context will be created. If isFullscreen() is false, a windowed context + * will be created with the dimensions given in the mode returned by getDisplayMode(). If a context can't be + * created with the given parameters, a LWJGLException will be thrown. + * <p/> + * <p>The window created will be set up in orthographic 2D projection, with 1:1 pixel ratio with GL coordinates. + * + * @param pixel_format Describes the minimum specifications the context must fulfill. Must be an instance of org.lwjgl.opengles.PixelFormat. + * @param shared_drawable The Drawable to share context with. (optional, may be null) + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + * + * @throws LWJGLException + */ + public static void create(PixelFormatLWJGL pixel_format, Drawable shared_drawable, org.lwjgl.opengles.ContextAttribs attribs) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( isCreated() ) + throw new IllegalStateException("Only one LWJGL context may be instantiated at any one time."); + if ( pixel_format == null ) + throw new NullPointerException("pixel_format cannot be null"); + removeShutdownHook(); + registerShutdownHook(); + if ( isFullscreen() ) + switchDisplayMode(); + + final DrawableGLES drawable = new DrawableGLES() { + + public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public void destroy() { + synchronized ( GlobalLock.lock ) { + if ( !isCreated() ) + return; + + releaseDrawable(); + super.destroy(); + destroyWindow(); + x = y = -1; + cached_icons = null; + reset(); + removeShutdownHook(); + } + } + }; + Display.drawable = drawable; + + try { + drawable.setPixelFormat(pixel_format); + try { + createWindow(); + try { + drawable.createContext(attribs, shared_drawable); + try { + makeCurrentAndSetSwapInterval(); + initContext(); + } catch (LWJGLException e) { + drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + destroyWindow(); + throw e; + } + } catch (LWJGLException e) { + drawable.destroy(); + throw e; + } + } catch (LWJGLException e) { + display_impl.resetDisplayMode(); + throw e; + } + } + } + + /** + * Set the initial color of the Display. This method is called before the Display is created and will set the + * background color to the one specified in this method. + * + * @param red - color value between 0 - 1 + * @param green - color value between 0 - 1 + * @param blue - color value between 0 - 1 + */ + public static void setInitialBackground(float red, float green, float blue) { + r = red; + g = green; + b = blue; + } + + private static void makeCurrentAndSetSwapInterval() throws LWJGLException { + makeCurrent(); + try { + drawable.checkGLError(); + } catch (OpenGLException e) { + LWJGLUtil.log("OpenGL error during context creation: " + e.getMessage()); + } + setSwapInterval(swap_interval); + } + + private static void initContext() { + drawable.initContext(r, g, b); + update(); + } + + static DisplayImplementation getImplementation() { + return display_impl; + } + + /** Gets a boolean property as a privileged action. */ + static boolean getPrivilegedBoolean(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + public Boolean run() { + return Boolean.getBoolean(property_name); + } + }); + } + + /** Gets a string property as a privileged action. */ + static String getPrivilegedString(final String property_name) { + return AccessController.doPrivileged(new PrivilegedAction<String>() { + public String run() { + return System.getProperty(property_name); + } + }); + } + + private static void initControls() { + // Automatically create mouse, keyboard and controller + if ( !getPrivilegedBoolean("org.lwjgl.opengl.Display.noinput") ) { + if ( !Mouse.isCreated() && !getPrivilegedBoolean("org.lwjgl.opengl.Display.nomouse") ) { + try { + Mouse.create(); + } catch (LWJGLException e) { + if ( LWJGLUtil.DEBUG ) { + e.printStackTrace(System.err); + } else { + LWJGLUtil.log("Failed to create Mouse: " + e); + } + } + } + if ( !Keyboard.isCreated() && !getPrivilegedBoolean("org.lwjgl.opengl.Display.nokeyboard") ) { + try { + Keyboard.create(); + } catch (LWJGLException e) { + if ( LWJGLUtil.DEBUG ) { + e.printStackTrace(System.err); + } else { + LWJGLUtil.log("Failed to create Keyboard: " + e); + } + } + } + } + } + + /** + * Destroy the Display. After this call, there will be no current GL rendering context, + * regardless of whether the Display was the current rendering context. + */ + public static void destroy() { + if(isCreated()) { + drawable.destroy(); + } + } + + /* + * Reset display mode if fullscreen. This method is also called from the shutdown hook added + * in the static constructor + */ + + private static void reset() { + display_impl.resetDisplayMode(); + current_mode = initial_mode; + } + + /** @return true if the window's native peer has been created */ + public static boolean isCreated() { + synchronized ( GlobalLock.lock ) { + return window_created; + } + } + + /** + * Set the buffer swap interval. This call is a best-attempt at changing + * the monitor swap interval, which is the minimum periodicity of color buffer swaps, + * measured in video frame periods, and is not guaranteed to be successful. + * <p/> + * A video frame period is the time required to display a full frame of video data. + * + * @param value The swap interval in frames, 0 to disable + */ + public static void setSwapInterval(int value) { + synchronized ( GlobalLock.lock ) { + swap_interval = value; + if ( isCreated() ) + drawable.setSwapInterval(swap_interval); + + } + } + + /** + * Enable or disable vertical monitor synchronization. This call is a best-attempt at changing + * the vertical refresh synchronization of the monitor, and is not guaranteed to be successful. + * + * @param sync true to synchronize; false to ignore synchronization + */ + public static void setVSyncEnabled(boolean sync) { + synchronized ( GlobalLock.lock ) { + setSwapInterval(sync ? 1 : 0); + } + } + + /** + * Set the window's location. This is a no-op on fullscreen windows or when getParent() != null. + * The window is clamped to remain entirely on the screen. If you attempt + * to position the window such that it would extend off the screen, the window + * is simply placed as close to the edge as possible. + * <br><b>note</b>If no location has been specified (or x == y == -1) the window will be centered + * + * @param new_x The new window location on the x axis + * @param new_y The new window location on the y axis + */ + public static void setLocation(int new_x, int new_y) { + synchronized ( GlobalLock.lock ) { + // cache position + x = new_x; + y = new_y; + + // offset if already created + if ( isCreated() && !isFullscreen() ) { + reshape(); + } + } + } + + private static void reshape() { + DisplayMode mode = getEffectiveMode(); + display_impl.reshape(getWindowX(), getWindowY(), mode.getWidth(), mode.getHeight()); + } + + /** + * Get the driver adapter string. This is a unique string describing the actual card's hardware, eg. "Geforce2", "PS2", + * "Radeon9700". If the adapter cannot be determined, this function returns null. + * + * @return a String + */ + public static String getAdapter() { + synchronized ( GlobalLock.lock ) { + return display_impl.getAdapter(); + } + } + + /** + * Get the driver version. This is a vendor/adapter specific version string. If the version cannot be determined, + * this function returns null. + * + * @return a String + */ + public static String getVersion() { + synchronized ( GlobalLock.lock ) { + return display_impl.getVersion(); + } + } + + /** + * Sets one or more icons for the Display. + * <ul> + * <li>On Windows you should supply at least one 16x16 icon and one 32x32.</li> + * <li>Linux (and similar platforms) expect one 32x32 icon.</li> + * <li>Mac OS X should be supplied one 128x128 icon</li> + * </ul> + * The implementation will use the supplied ByteBuffers with image data in RGBA (size must be a power of two) and perform any conversions nescesarry for the specific platform. + * <p/> + * <b>NOTE:</b> The display will make a deep copy of the supplied byte buffer array, for the purpose + * of recreating the icons when you go back and forth fullscreen mode. You therefore only need to + * set the icon once per instance. + * + * @param icons Array of icons in RGBA mode. Pass the icons in order of preference. + * + * @return number of icons used, or 0 if display hasn't been created + */ + public static int setIcon(ByteBuffer[] icons) { + synchronized ( GlobalLock.lock ) { + // make deep copy so we dont rely on the supplied buffers later on + // don't recache! + if ( cached_icons != icons ) { + cached_icons = new ByteBuffer[icons.length]; + for ( int i = 0; i < icons.length; i++ ) { + cached_icons[i] = BufferUtils.createByteBuffer(icons[i].capacity()); + int old_position = icons[i].position(); + cached_icons[i].put(icons[i]); + icons[i].position(old_position); + cached_icons[i].flip(); + } + } + + if ( Display.isCreated() && parent == null ) { + return display_impl.setIcon(cached_icons); + } else { + return 0; + } + } + } + + /** + * Enable or disable the Display window to be resized. + * + * @param resizable set to true to make the Display window resizable; + * false to disable resizing on the Display window. + */ + public static void setResizable(boolean resizable) { + window_resizable = resizable; + if ( isCreated() ) { + display_impl.setResizable(resizable); + } + } + + /** + * @return true if the Display window is resizable. + */ + public static boolean isResizable() { + return window_resizable; + } + + /** + * @return true if the Display window has been resized. + * This value will be updated after a call to Display.update(). + * + * This will return false if running in fullscreen or with Display.setParent(Canvas parent) + */ + public static boolean wasResized() { + return window_resized; + } + + /** + * @return this method will return the x position (top-left) of the Display window. + * + * If running in fullscreen mode it will return 0. + * If Display.setParent(Canvas parent) is being used, the x position of + * the parent will be returned. + */ + public static int getX() { + + if (Display.isFullscreen()) { + return 0; + } + + if (parent != null) { + return parent.getX(); + } + + return display_impl.getX(); + } + + /** + * @return this method will return the y position (top-left) of the Display window. + * + * If running in fullscreen mode it will return 0. + * If Display.setParent(Canvas parent) is being used, the y position of + * the parent will be returned. + */ + public static int getY() { + + if (Display.isFullscreen()) { + return 0; + } + + if (parent != null) { + return parent.getY(); + } + + return display_impl.getY(); + } + + /** + * @return this method will return the width of the Display window. + * + * If running in fullscreen mode it will return the width of the current set DisplayMode. + * If Display.setParent(Canvas parent) is being used, the width of the parent + * will be returned. + * + * This value will be updated after a call to Display.update(). + */ + public static int getWidth() { + + if (Display.isFullscreen()) { + return Display.getDisplayMode().getWidth(); + } + + if (parent != null) { + return parent.getWidth(); + } + + return width; + } + + /** + * @return this method will return the height of the Display window. + * + * If running in fullscreen mode it will return the height of the current set DisplayMode. + * If Display.setParent(Canvas parent) is being used, the height of the parent + * will be returned. + * + * This value will be updated after a call to Display.update(). + */ + public static int getHeight() { + + if (Display.isFullscreen()) { + return Display.getDisplayMode().getHeight(); + } + + if (parent != null) { + return parent.getHeight(); + } + + return height; + } + + /** + * @return this method will return the pixel scale factor of the Display window. + * + * This method should be used when running in high DPI mode. In such modes Operating + * Systems will scale the Display window to avoid the window shrinking due to high + * resolutions. The OpenGL frame buffer will however use the higher resolution and + * not be scaled to match the Display window size. + * + * OpenGL methods that require pixel dependent values e.g. glViewport, glTexImage2D, + * glReadPixels, glScissor, glLineWidth, glRenderbufferStorage, etc can convert the + * scaled Display and Mouse coordinates to the correct high resolution value by + * multiplying them by the pixel scale factor. + * + * e.g. Display.getWidth() * Display.getPixelScaleFactor() will return the high DPI + * width of the OpenGL frame buffer. Whereas Display.getWidth() will be the same as + * the OpenGL frame buffer in non high DPI mode. + * + * Where high DPI mode is not available this method will just return 1.0f therefore + * not have any effect on values that are multiplied by it. + */ + public static float getPixelScaleFactor() { + return display_impl.getPixelScaleFactor(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayImplementation.java new file mode 100644 index 0000000..816f995 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayImplementation.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Display implementation interface. Display delegates + * to implementors of this interface. There is one DisplayImplementation + * for each supported platform. + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.awt.Canvas; + +import org.lwjgl.LWJGLException; + +interface DisplayImplementation extends InputImplementation { + + void createWindow(DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException; + + void destroyWindow(); + + void switchDisplayMode(DisplayMode mode) throws LWJGLException; + + /** + * Reset the display mode to whatever it was when LWJGL was initialized. + * Fails silently. + */ + void resetDisplayMode(); + + /** + * Return the length of the gamma ramp arrays. Returns 0 if gamma settings are + * unsupported. + * + * @return the length of each gamma ramp array, or 0 if gamma settings are unsupported. + */ + int getGammaRampLength(); + + /** + * Method to set the gamma ramp. + */ + void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException; + + /** + * Get the driver adapter string. This is a unique string describing the actual card's hardware, eg. "Geforce2", "PS2", + * "Radeon9700". If the adapter cannot be determined, this function returns null. + * @return a String + */ + String getAdapter(); + + /** + * Get the driver version. This is a vendor/adapter specific version string. If the version cannot be determined, + * this function returns null. + * @return a String + */ + String getVersion(); + + /** + * Initialize and return the current display mode. + */ + DisplayMode init() throws LWJGLException; + + /** + * Implementation of setTitle(). This will read the window's title member + * and stash it in the native title of the window. + */ + void setTitle(String title); + + boolean isCloseRequested(); + + boolean isVisible(); + boolean isActive(); + + boolean isDirty(); + + /** + * Create the native PeerInfo. + * @throws LWJGLException + */ + PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException; + +// void destroyPeerInfo(); + + /** + * Updates the windows internal state. This must be called at least once per video frame + * to handle window close requests, moves, paints, etc. + */ + void update(); + + void reshape(int x, int y, int width, int height); + + /** + * Method for getting displaymodes + */ + DisplayMode[] getAvailableDisplayModes() throws LWJGLException; + + /* Pbuffer */ + int getPbufferCapabilities(); + + /** + * Method to test for buffer integrity + */ + boolean isBufferLost(PeerInfo handle); + + /** + * Method to create a Pbuffer + */ + PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, + IntBuffer pixelFormatCaps, + IntBuffer pBufferAttribs) throws LWJGLException; + + void setPbufferAttrib(PeerInfo handle, int attrib, int value); + + void bindTexImageToPbuffer(PeerInfo handle, int buffer); + + void releaseTexImageFromPbuffer(PeerInfo handle, int buffer); + + /** + * Sets one or more icons for the Display. + * <ul> + * <li>On Windows you should supply at least one 16x16 icon and one 32x32.</li> + * <li>Linux (and similar platforms) expect one 32x32 icon.</li> + * <li>Mac OS X should be supplied one 128x128 icon</li> + * </ul> + * The implementation will use the supplied ByteBuffers with image data in RGBA and perform any conversions nescesarry for the specific platform. + * + * @param icons Array of icons in RGBA mode + * @return number of icons used. + */ + int setIcon(ByteBuffer[] icons); + + /** + * Enable or disable the Display window to be resized. + * + * @param resizable set to true to make the Display window resizable; + * false to disable resizing on the Display window. + */ + void setResizable(boolean resizable); + + /** + * @return true if the Display window has been resized since this method was last called. + */ + boolean wasResized(); + + /** + * @return this method will return the width of the Display window. + */ + int getWidth(); + + /** + * @return this method will return the height of the Display window. + */ + int getHeight(); + + /** + * @return this method will return the top-left x position of the Display window. + */ + int getX(); + + /** + * @return this method will return the top-left y position of the Display window. + */ + int getY(); + + /** + * @return this method will return the pixel scale factor of the Display window useful for high resolution modes. + */ + float getPixelScaleFactor(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayMode.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayMode.java new file mode 100644 index 0000000..4e51175 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DisplayMode.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * + * This class encapsulates the properties for a given display mode. + * This class is not instantiable, and is aquired from the <code>Display. + * getAvailableDisplayModes()</code> method. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public final class DisplayMode { + + /** properties of the display mode */ + private final int width, height, bpp, freq; + /** If true, this instance can be used for fullscreen modes */ + private final boolean fullscreen; + + /** + * Construct a display mode. DisplayModes constructed through the + * public constructor can only be used to specify the dimensions of + * the Display in windowed mode. To get the available DisplayModes for + * fullscreen modes, use Display.getAvailableDisplayModes(). + * + * @param width The Display width. + * @param height The Display height. + * @see Display + */ + public DisplayMode(int width, int height) { + this(width, height, 0, 0, false); + } + + DisplayMode(int width, int height, int bpp, int freq) { + this(width, height, bpp, freq, true); + } + + private DisplayMode(int width, int height, int bpp, int freq, boolean fullscreen) { + this.width = width; + this.height = height; + this.bpp = bpp; + this.freq = freq; + this.fullscreen = fullscreen; + } + + /** True iff this instance can be used for fullscreen modes */ + public boolean isFullscreenCapable() { + return fullscreen; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getBitsPerPixel() { + return bpp; + } + + public int getFrequency() { + return freq; + } + + /** + * Tests for <code>DisplayMode</code> equality + * + * @see java.lang.Object#equals(Object) + */ + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof DisplayMode)) { + return false; + } + + DisplayMode dm = (DisplayMode) obj; + return dm.width == width + && dm.height == height + && dm.bpp == bpp + && dm.freq == freq; + } + + /** + * Retrieves the hashcode for this object + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return width ^ height ^ freq ^ bpp; + } + + /** + * Retrieves a String representation of this <code>DisplayMode</code> + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(32); + sb.append(width); + sb.append(" x "); + sb.append(height); + sb.append(" x "); + sb.append(bpp); + sb.append(" @"); + sb.append(freq); + sb.append("Hz"); + return sb.toString(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Drawable.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Drawable.java new file mode 100644 index 0000000..c93a236 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Drawable.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerBuffer; + +/** + * The Drawable interface describes an OpenGL drawable with an associated + * Context. + * + * @author elias_naur + */ + +public interface Drawable { + + /** Returns true if the Drawable's context is current in the current thread. */ + boolean isCurrent() throws LWJGLException; + + /** + * Makes the Drawable's context current in the current thread. + * + * @throws LWJGLException + */ + void makeCurrent() throws LWJGLException; + + /** + * If the Drawable's context is current in the current thread, no context will be current after a call to this method. + * + * @throws LWJGLException + */ + void releaseContext() throws LWJGLException; + + /** Destroys the Drawable. */ + void destroy(); + + /** + * Sets the appropriate khr_gl_sharing properties in the target <code>PointerBuffer</code>, + * so that if it is used in a <code>clCreateContext(FromType)</code> call, the created CL + * context will be sharing objects with this <code>Drawable</code>'s GL context. After a + * call to this method, the target buffer position will have advanced by 2 to 4 positions, + * depending on the implementation. + * + * @param properties The target properties buffer. It must have at least 4 positions remaining. + */ + void setCLSharingProperties(PointerBuffer properties) throws LWJGLException; + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGL.java new file mode 100644 index 0000000..5fbd85e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGL.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; + +import static org.lwjgl.opengl.GL11.*; + +/** @author Spasi */ +abstract class DrawableGL implements DrawableLWJGL { + + /** The PixelFormat used to create the drawable. */ + protected PixelFormat pixel_format; + + /** Handle to the native GL rendering context */ + protected PeerInfo peer_info; + + /** The OpenGL Context. */ + protected ContextGL context; + + protected DrawableGL() { + } + + public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException { + throw new UnsupportedOperationException(); + } + + public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException { + this.pixel_format = (PixelFormat)pf; + this.peer_info = Display.getImplementation().createPeerInfo(pixel_format, attribs); + } + + public PixelFormatLWJGL getPixelFormat() { + return pixel_format; + } + + public ContextGL getContext() { + synchronized ( GlobalLock.lock ) { + return context; + } + } + + public ContextGL createSharedContext() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return new ContextGL(peer_info, context.getContextAttribs(), context); + } + } + + public void checkGLError() { + Util.checkGLError(); + } + + public void setSwapInterval(final int swap_interval) { + ContextGL.setSwapInterval(swap_interval); + } + + public void swapBuffers() throws LWJGLException { + ContextGL.swapBuffers(); + } + + public void initContext(final float r, final float g, final float b) { + // set background clear color + glClearColor(r, g, b, 0.0f); + // Clear window to avoid the desktop "showing through" + glClear(GL_COLOR_BUFFER_BIT); + } + + public boolean isCurrent() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return context.isCurrent(); + } + } + + public void makeCurrent() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + context.makeCurrent(); + } + } + + public void releaseContext() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + if ( context.isCurrent() ) + context.releaseCurrent(); + } + } + + public void destroy() { + synchronized ( GlobalLock.lock ) { + if ( context == null ) + return; + + try { + releaseContext(); + + context.forceDestroy(); + context = null; + + if ( peer_info != null ) { + peer_info.destroy(); + peer_info = null; + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying Drawable: " + e); + } + } + } + + public void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + context.setCLSharingProperties(properties); + } + } + + protected final void checkDestroyed() { + if ( context == null ) + throw new IllegalStateException("The Drawable has no context available."); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGLES.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGLES.java new file mode 100644 index 0000000..c5b1fca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableGLES.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.opengles.ContextAttribs; +import org.lwjgl.opengles.*; +import org.lwjgl.opengles.Util; + +import static org.lwjgl.opengles.EGL.*; +import static org.lwjgl.opengles.GLES20.*; + +/** + * @author Spasi + * @since 14/5/2011 + */ +abstract class DrawableGLES implements DrawableLWJGL { + + /** The PixelFormat used to create the EGLDisplay. */ + protected org.lwjgl.opengles.PixelFormat pixel_format; + + protected EGLDisplay eglDisplay; + protected EGLConfig eglConfig; + protected EGLSurface eglSurface; + + /** The OpenGL Context. */ + protected ContextGLES context; + + /** The Drawable that shares objects with this Drawable. */ + protected Drawable shared_drawable; + + protected DrawableGLES() { + } + + public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + this.pixel_format = (org.lwjgl.opengles.PixelFormat)pf; + } + } + + public PixelFormatLWJGL getPixelFormat() { + synchronized ( GlobalLock.lock ) { + return pixel_format; + } + } + + public void initialize(final long window, final long display_id, final int eglSurfaceType, final org.lwjgl.opengles.PixelFormat pf) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + if ( eglSurface != null ) { + eglSurface.destroy(); + eglSurface = null; + } + + if ( eglDisplay != null ) { + eglDisplay.terminate(); + eglDisplay = null; + } + + final EGLDisplay eglDisplay = eglGetDisplay((int)display_id); + + int[] attribs = { + EGL_LEVEL, 0, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NATIVE_RENDERABLE, EGL_FALSE, + }; + + final EGLConfig[] configs = eglDisplay.chooseConfig(pf.getAttribBuffer(eglDisplay, eglSurfaceType, attribs), null, BufferUtils.createIntBuffer(1)); + if ( configs.length == 0 ) + throw new LWJGLException("No EGLConfigs found for the specified PixelFormat."); + + final EGLConfig eglConfig = pf.getBestMatch(configs); + final EGLSurface eglSurface = eglDisplay.createWindowSurface(eglConfig, window, null); + pf.setSurfaceAttribs(eglSurface); + + this.eglDisplay = eglDisplay; + this.eglConfig = eglConfig; + this.eglSurface = eglSurface; + + // This can happen when switching in and out of full-screen mode. + if ( context != null ) + context.getEGLContext().setDisplay(eglDisplay); + } + } + + public void createContext(final ContextAttribs attribs, final Drawable shared_drawable) throws LWJGLException { + synchronized ( GlobalLock.lock ) { + this.context = new ContextGLES(this, attribs, shared_drawable != null ? ((DrawableGLES)shared_drawable).getContext() : null); + this.shared_drawable = shared_drawable; + } + } + + Drawable getSharedDrawable() { + synchronized ( GlobalLock.lock ) { + return shared_drawable; + } + } + + public EGLDisplay getEGLDisplay() { + synchronized ( GlobalLock.lock ) { + return eglDisplay; + } + } + + public EGLConfig getEGLConfig() { + synchronized ( GlobalLock.lock ) { + return eglConfig; + } + } + + public EGLSurface getEGLSurface() { + synchronized ( GlobalLock.lock ) { + return eglSurface; + } + } + + public ContextGLES getContext() { + synchronized ( GlobalLock.lock ) { + return context; + } + } + + public org.lwjgl.opengl.Context createSharedContext() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return new ContextGLES(this, context.getContextAttribs(), context); + } + } + + public void checkGLError() { + Util.checkGLError(); + } + + public void setSwapInterval(final int swap_interval) { + ContextGLES.setSwapInterval(swap_interval); + } + + public void swapBuffers() throws LWJGLException { + ContextGLES.swapBuffers(); + } + + public void initContext(final float r, final float g, final float b) { + // set background clear color + glClearColor(r, g, b, 0.0f); + // Clear window to avoid the desktop "showing through" + glClear(GL_COLOR_BUFFER_BIT); + } + + public boolean isCurrent() throws LWJGLException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + return context.isCurrent(); + } + } + + public void makeCurrent() throws LWJGLException, PowerManagementEventException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + context.makeCurrent(); + } + } + + public void releaseContext() throws LWJGLException, PowerManagementEventException { + synchronized ( GlobalLock.lock ) { + checkDestroyed(); + if ( context.isCurrent() ) + context.releaseCurrent(); + } + } + + public void destroy() { + synchronized ( GlobalLock.lock ) { + try { + if ( context != null ) { + try { + releaseContext(); + } catch (PowerManagementEventException e) { + // Ignore + } + + context.forceDestroy(); + context = null; + } + + if ( eglSurface != null ) { + eglSurface.destroy(); + eglSurface = null; + } + + if ( eglDisplay != null ) { + eglDisplay.terminate(); + eglDisplay = null; + } + + pixel_format = null; + shared_drawable = null; + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while destroying Drawable: " + e); + } + } + } + + protected void checkDestroyed() { + if ( context == null ) + throw new IllegalStateException("The Drawable has no context available."); + } + + public void setCLSharingProperties(final PointerBuffer properties) throws LWJGLException { + throw new UnsupportedOperationException(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableLWJGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableLWJGL.java new file mode 100644 index 0000000..d87a916 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/DrawableLWJGL.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +/** + * [INTERNAL USE ONLY] + * + * @author Spasi + */ +interface DrawableLWJGL extends Drawable { + + void setPixelFormat(PixelFormatLWJGL pf) throws LWJGLException; + + void setPixelFormat(PixelFormatLWJGL pf, ContextAttribs attribs) throws LWJGLException; + + PixelFormatLWJGL getPixelFormat(); + + /** + * [INTERNAL USE ONLY] Returns the Drawable's Context. + * + * @return the Drawable's Context + */ + Context getContext(); + + /** + * [INTERNAL USE ONLY] Creates a new Context that is shared with the Drawable's Context. + * + * @return a Context shared with the Drawable's Context. + */ + Context createSharedContext() throws LWJGLException; + + void checkGLError(); + + void setSwapInterval(int swap_interval); + + void swapBuffers() throws LWJGLException; + + void initContext(final float r, final float g, final float b); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/EventQueue.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/EventQueue.java new file mode 100644 index 0000000..60ec1f2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/EventQueue.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * A java implementation of a LWJGL compatible event queue. + * @author elias_naur + */ + +import java.nio.ByteBuffer; + +class EventQueue { + private static final int QUEUE_SIZE = 200; + + private final int event_size; + + private final ByteBuffer queue; + + protected EventQueue(int event_size) { + this.event_size = event_size; + this.queue = ByteBuffer.allocate(QUEUE_SIZE*event_size); + } + + protected synchronized void clearEvents() { + queue.clear(); + } + + /** + * Copy available events into the specified buffer. + */ + public synchronized void copyEvents(ByteBuffer dest) { + queue.flip(); + int old_limit = queue.limit(); + if (dest.remaining() < queue.remaining()) + queue.limit(dest.remaining() + queue.position()); + dest.put(queue); + queue.limit(old_limit); + queue.compact(); + } + + /** + * Put an event into the queue. + * @return true if the event fitted into the queue, false otherwise + */ + public synchronized boolean putEvent(ByteBuffer event) { + if (event.remaining() != event_size) + throw new IllegalArgumentException("Internal error: event size " + event_size + " does not equal the given event size " + event.remaining()); + if (queue.remaining() >= event.remaining()) { + queue.put(event); + return true; + } else + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/FastIntMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/FastIntMap.java new file mode 100644 index 0000000..6ce6c9b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/FastIntMap.java @@ -0,0 +1,238 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.lwjgl.opengl; + +import java.util.Iterator; + +/** + * A hash map using primitive ints as keys rather than objects. + * + * @author Justin Couch + * @author Alex Chaffee (alex@apache.org) + * @author Stephen Colebourne + * @author Nathan Sweet + */ +final class FastIntMap<V> implements Iterable<FastIntMap.Entry<V>> { + + private Entry[] table; + private int size, mask, capacity, threshold; + + /** Same as: FastIntMap(16, 0.75f); */ + FastIntMap() { + this(16, 0.75f); + } + + /** Same as: FastIntMap(initialCapacity, 0.75f); */ + FastIntMap(int initialCapacity) { + this(initialCapacity, 0.75f); + } + + FastIntMap(int initialCapacity, float loadFactor) { + if ( initialCapacity > 1 << 30 ) throw new IllegalArgumentException("initialCapacity is too large."); + if ( initialCapacity < 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + if ( loadFactor <= 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + capacity = 1; + while ( capacity < initialCapacity ) + capacity <<= 1; + this.threshold = (int)(capacity * loadFactor); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + private int index(final int key) { + return index(key, mask); + } + + private static int index(final int key, final int mask) { + return key & mask; + } + + public V put(int key, V value) { + final Entry<V>[] table = this.table; + int index = index(key); + + // Check if key already exists. + for ( Entry<V> e = table[index]; e != null; e = e.next ) { + if ( e.key != key ) continue; + V oldValue = e.value; + e.value = value; + return oldValue; + } + + table[index] = new Entry<V>(key, value, table[index]); + + if ( size++ >= threshold ) + rehash(table); + + return null; + } + + private void rehash(final Entry<V>[] table) { + final int newCapacity = 2 * capacity; + final int newMask = newCapacity - 1; + + final Entry<V>[] newTable = new Entry[newCapacity]; + + for ( int i = 0, index; i < table.length; i++ ) { + Entry<V> e = table[i]; + if ( e == null ) continue; + do { + final Entry<V> next = e.next; + index = index(e.key, newMask); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } while ( e != null ); + } + + this.table = newTable; + capacity = newCapacity; + mask = newMask; + threshold *= 2; + } + + public V get(int key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return e.value; + return null; + } + + public boolean containsValue(Object value) { + final Entry<V>[] table = this.table; + for ( int i = table.length - 1; i >= 0; i-- ) + for ( Entry<V> e = table[i]; e != null; e = e.next ) + if ( e.value.equals(value) ) return true; + return false; + } + + public boolean containsKey(int key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return true; + return false; + } + + public V remove(int key) { + final int index = index(key); + + Entry<V> prev = table[index]; + Entry<V> e = prev; + while ( e != null ) { + Entry<V> next = e.next; + if ( e.key == key ) { + size--; + if ( prev == e ) + table[index] = next; + else + prev.next = next; + return e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void clear() { + final Entry<V>[] table = this.table; + for ( int index = table.length - 1; index >= 0; index-- ) + table[index] = null; + size = 0; + } + + public EntryIterator iterator() { + return new EntryIterator(); + } + + public class EntryIterator implements Iterator<Entry<V>> { + + private int nextIndex; + private Entry<V> current; + + EntryIterator() { + reset(); + } + + public void reset() { + current = null; + // Find first bucket. + final Entry<V>[] table = FastIntMap.this.table; + int i; + for ( i = table.length - 1; i >= 0; i-- ) + if ( table[i] != null ) break; + nextIndex = i; + } + + public boolean hasNext() { + if ( nextIndex >= 0 ) return true; + Entry e = current; + return e != null && e.next != null; + } + + public Entry<V> next() { + // Next entry in current bucket. + Entry<V> e = current; + if ( e != null ) { + e = e.next; + if ( e != null ) { + current = e; + return e; + } + } + // Use the bucket at nextIndex and find the next nextIndex. + final Entry<V>[] table = FastIntMap.this.table; + int i = nextIndex; + e = current = table[i]; + while ( --i >= 0 ) + if ( table[i] != null ) break; + nextIndex = i; + return e; + } + + public void remove() { + FastIntMap.this.remove(current.key); + } + } + + static final class Entry<T> { + + final int key; + T value; + Entry<T> next; + + Entry(int key, T value, Entry<T> next) { + this.key = key; + this.value = value; + this.next = next; + } + + public int getKey() { + return key; + } + + public T getValue() { + return value; + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLChecks.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLChecks.java new file mode 100644 index 0000000..8bce078 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLChecks.java @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; + +import java.nio.Buffer; +import java.nio.FloatBuffer; + +import static org.lwjgl.opengl.ARBBufferObject.*; +import static org.lwjgl.opengl.ATIVertexArrayObject.*; +import static org.lwjgl.opengl.EXTAbgr.*; +import static org.lwjgl.opengl.EXTBgra.*; +import static org.lwjgl.opengl.EXTDirectStateAccess.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.NVPathRendering.*; + +/** + * A class to check buffer boundaries in GL methods. Many GL + * methods read data from the GL into a native Buffer at its current position. If there is unsufficient space in the buffer when + * the call is made then a buffer overflow would otherwise occur and cause unexpected behaviour, a crash, or worse, a security + * risk. Therefore in those methods where GL reads data back into a buffer, we will call a bounds check method from this class + * to ensure that there is sufficient space in the buffer. + * <p/> + * Thrown by the debug build library of the LWJGL if any OpenGL operation causes an error. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +class GLChecks { + + /** Static methods only! */ + private GLChecks() { + } + + static int getBufferObjectSize(ContextCapabilities caps, int buffer_enum) { + return glGetBufferParameteri(buffer_enum, GL_BUFFER_SIZE); + } + + static int getBufferObjectSizeARB(ContextCapabilities caps, int buffer_enum) { + return glGetBufferParameteriARB(buffer_enum, GL_BUFFER_SIZE_ARB); + } + + static int getBufferObjectSizeATI(ContextCapabilities caps, int buffer) { + return glGetObjectBufferiATI(buffer, GL_OBJECT_BUFFER_SIZE_ATI); + } + + static int getNamedBufferObjectSize(ContextCapabilities caps, int buffer) { + return glGetNamedBufferParameterEXT(buffer, GL_BUFFER_SIZE); + } + + /** Helper method to ensure that array buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureArrayVBOdisabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).arrayBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Array Buffer Object is enabled"); + } + + /** Helper method to ensure that array buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureArrayVBOenabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).arrayBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Array Buffer Object is disabled"); + } + + /** Helper method to ensure that element array buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureElementVBOdisabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getElementArrayBufferBound(caps) != 0 ) + throw new OpenGLException("Cannot use Buffers when Element Array Buffer Object is enabled"); + } + + /** Helper method to ensure that element array buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureElementVBOenabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getElementArrayBufferBound(caps) == 0 ) + throw new OpenGLException("Cannot use offsets when Element Array Buffer Object is disabled"); + } + + /** Helper method to ensure that array buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureIndirectBOdisabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).indirectBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Draw Indirect Object is enabled"); + } + + /** Helper method to ensure that array buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureIndirectBOenabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).indirectBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Draw Indirect Object is disabled"); + } + + /** Helper method to ensure that pixel pack buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensurePackPBOdisabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).pixelPackBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Pixel Pack Buffer Object is enabled"); + } + + /** Helper method to ensure that pixel pack buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensurePackPBOenabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).pixelPackBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Pixel Pack Buffer Object is disabled"); + } + + /** Helper method to ensure that pixel unpack buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureUnpackPBOdisabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).pixelUnpackBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Pixel Unpack Buffer Object is enabled"); + } + + /** Helper method to ensure that pixel unpack buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureUnpackPBOenabled(ContextCapabilities caps) { + if ( LWJGLUtil.CHECKS && StateTracker.getReferences(caps).pixelUnpackBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Pixel Unpack Buffer Object is disabled"); + } + + /** + * Calculate the storage required for an image in elements + * + * @param format The format of the image (example: GL_RGBA) + * @param type The type of the image elements (example: GL_UNSIGNED_BYTE) + * @param width The width of the image + * @param height The height of the image (1 for 1D images) + * @param depth The depth of the image (1 for 2D images) + * + * @return the size, in elements, of the image + */ + static int calculateImageStorage(Buffer buffer, int format, int type, int width, int height, int depth) { + return LWJGLUtil.CHECKS ? calculateImageStorage(format, type, width, height, depth) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage1DStorage(Buffer buffer, int format, int type, int width) { + return LWJGLUtil.CHECKS ? calculateTexImage1DStorage(format, type, width) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage2DStorage(Buffer buffer, int format, int type, int width, int height) { + return LWJGLUtil.CHECKS ? calculateTexImage2DStorage(format, type, width, height) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage3DStorage(Buffer buffer, int format, int type, int width, int height, int depth) { + return LWJGLUtil.CHECKS ? calculateTexImage3DStorage(format, type, width, height, depth) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + /** + * Calculate the storage required for an image in bytes. + * + * @param format The format of the image (example: GL_RGBA) + * @param type The type of the image elements (example: GL_UNSIGNED_BYTE) + * @param width The width of the image + * @param height The height of the image (1 for 1D images) + * @param depth The depth of the image (1 for 2D images) + * + * @return the size, in bytes, of the image + */ + private static int calculateImageStorage(int format, int type, int width, int height, int depth) { + return calculateBytesPerPixel(format, type) * width * height * depth; + } + + private static int calculateTexImage1DStorage(int format, int type, int width) { + return calculateBytesPerPixel(format, type) * width; + } + + private static int calculateTexImage2DStorage(int format, int type, int width, int height) { + return calculateTexImage1DStorage(format, type, width) * height; + } + + private static int calculateTexImage3DStorage(int format, int type, int width, int height, int depth) { + return calculateTexImage2DStorage(format, type, width, height) * depth; + } + + private static int calculateBytesPerPixel(int format, int type) { + int bpe; + switch ( type ) { + case GL_UNSIGNED_BYTE: + case GL_BYTE: + bpe = 1; + break; + case GL_UNSIGNED_SHORT: + case GL_SHORT: + bpe = 2; + break; + case GL_UNSIGNED_INT: + case GL_INT: + case GL_FLOAT: + bpe = 4; + break; + default: + // TODO: Add more types (like the GL12 types GL_UNSIGNED_INT_8_8_8_8 + return 0; + // throw new IllegalArgumentException("Unknown type " + type); + } + int epp; + switch ( format ) { + case GL_LUMINANCE: + case GL_ALPHA: + epp = 1; + break; + + case GL_LUMINANCE_ALPHA: + epp = 2; + break; + case GL_RGB: + case GL_BGR_EXT: + epp = 3; + break; + case GL_RGBA: + case GL_ABGR_EXT: + case GL_BGRA_EXT: + epp = 4; + break; + default: + // TODO: Add more formats. Assuming 4 is too wasteful on buffer sizes where e.g. 1 is enough (like GL_DEPTH_COMPONENT) + return 0; +/* // Assume 4 elements per pixel + epp = 4;*/ + } + + return bpe * epp; + } + + // NV_path_rendering checks + + static int calculateBytesPerCharCode(int type) { + switch ( type ) { + case GL_UNSIGNED_BYTE: + case GL_UTF8_NV: + return 1; + case GL_UNSIGNED_SHORT: + case GL_2_BYTES: + case GL_UTF16_NV: + return 2; + case GL_3_BYTES: + return 3; + case GL_4_BYTES: + return 4; + default: + throw new IllegalArgumentException("Unsupported charcode type: " + type); + } + } + + static int calculateBytesPerPathName(int pathNameType) { + switch ( pathNameType ) { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_UTF8_NV: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_2_BYTES: + case GL_UTF16_NV: + return 2; + case GL_3_BYTES: + return 3; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + case GL_4_BYTES: + return 4; + default: + throw new IllegalArgumentException("Unsupported path name type: " + pathNameType); + } + } + + static int calculateTransformPathValues(int transformType) { + switch ( transformType ) { + case GL_NONE: + return 0; + case GL_TRANSLATE_X_NV: + case GL_TRANSLATE_Y_NV: + return 1; + case GL_TRANSLATE_2D_NV: + return 2; + case GL_TRANSLATE_3D_NV: + return 3; + case GL_AFFINE_2D_NV: + case GL_TRANSPOSE_AFFINE_2D_NV: + return 6; + case GL_AFFINE_3D_NV: + case GL_TRANSPOSE_AFFINE_3D_NV: + return 12; + default: + throw new IllegalArgumentException("Unsupported transform type: " + transformType); + } + } + + static int calculatePathColorGenCoeffsCount(int genMode, int colorFormat) { + final int coeffsPerComponent = calculatePathGenCoeffsPerComponent(genMode); + + switch ( colorFormat ) { + case GL_RGB: + return 3 * coeffsPerComponent; + case GL_RGBA: + return 4 * coeffsPerComponent; + default: + return coeffsPerComponent; + } + } + + static int calculatePathTextGenCoeffsPerComponent(FloatBuffer coeffs, int genMode) { + if ( genMode == GL_NONE ) + return 0; + + return coeffs.remaining() / calculatePathGenCoeffsPerComponent(genMode); + } + + private static int calculatePathGenCoeffsPerComponent(int genMode) { + switch ( genMode ) { + case GL_NONE: + return 0; + case GL_OBJECT_LINEAR: + case GL_PATH_OBJECT_BOUNDING_BOX_NV: + return 3; + case GL_EYE_LINEAR: + return 4; + default: + throw new IllegalArgumentException("Unsupported gen mode: " + genMode); + } + } + + static int calculateMetricsSize(int metricQueryMask, int stride) { + if ( LWJGLUtil.DEBUG && (stride < 0 || (stride % 4) != 0) ) + throw new IllegalArgumentException("Invalid stride value: " + stride); + + final int metrics = Integer.bitCount(metricQueryMask); + + if ( LWJGLUtil.DEBUG && (stride >> 2) < metrics ) + throw new IllegalArgumentException("The queried metrics do not fit in the specified stride: " + stride); + + return stride == 0 ? metrics : (stride >> 2); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLContext.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLContext.java new file mode 100644 index 0000000..91728bf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLContext.java @@ -0,0 +1,415 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.Sys; + +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.util.*; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL30.*; +import static org.lwjgl.opengl.GL32.*; + +/** + * <p/> + * Manages GL contexts. Before any rendering is done by a LWJGL system, a call should be made to GLContext.useContext() with a + * context. This will ensure that GLContext has an accurate reflection of the current context's capabilities and function + * pointers. + * <p/> + * This class is thread-safe in the sense that multiple threads can safely call all public methods. The class is also + * thread-aware in the sense that it tracks a per-thread current context (including capabilities and function pointers). + * That way, multiple threads can have multiple contexts current and render to them concurrently. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class GLContext { + + /** Maps threads to their current context's ContextCapabilities, if any */ + private static final ThreadLocal<ContextCapabilities> current_capabilities = new ThreadLocal<ContextCapabilities>(); + + /** + * The getCapabilities() method is a potential hot spot in any LWJGL application, since + * it is needed for context capability discovery (e.g. is OpenGL 2.0 supported?), and + * for the function pointers of gl functions. However, the 'current_capabilities' ThreadLocal + * is (relatively) expensive to look up, and since most OpenGL applications use are single threaded + * rendering, the following two is an optimization for this case. + * <p/> + * ThreadLocals can be thought of as a mapping between threads and values, so the idea + * is to use a lock-less cache of mappings between threads and the current ContextCapabilities. The cache + * could be any size, but in our case, we want a single sized cache for optimal performance + * in the single threaded case. + * <p/> + * 'fast_path_cache' is the most recent ContextCapabilities (potentially null) and its owner. By + * recent I mean the last thread setting the value in setCapabilities(). When getCapabilities() + * is called, a check to see if the current is the owner of the ContextCapabilities instance in + * fast_path_cache. If so, the instance is returned, if not, some thread has since taken ownership + * of the cache entry and the slower current_capabilities ThreadLocal is queried instead. + * <p/> + * No locks are needed in get/setCapabilities, because even though fast_path_cache can be accessed + * from multiple threads at once, we are guaranteed by the JVM spec that its value is always valid. + * Furthermore, if the ownership test in getCapabilities() succeeds, the cache entry can only contain + * the correct ContextCapabilites (that is, the one from getThreadLocalCapabilites()), + * since no other thread can set the owner to anyone else than itself. + */ + private static CapabilitiesCacheEntry fast_path_cache = new CapabilitiesCacheEntry(); + + /** + * Simple lock-free cache of CapabilitesEntryCache to avoid allocating more than one + * cache entry per thread + */ + private static final ThreadLocal<CapabilitiesCacheEntry> thread_cache_entries = new ThreadLocal<CapabilitiesCacheEntry>(); + + /** + * The weak mapping from context Object instances to ContextCapabilities. Used + * to avoid recreating a ContextCapabilities every time a context is made current. + */ + private static final Map<Object, ContextCapabilities> capability_cache = new WeakHashMap<Object, ContextCapabilities>(); + + /** Reference count of the native opengl implementation library */ + private static int gl_ref_count; + private static boolean did_auto_load; + + static { + Sys.initialize(); + } + + /** + * Get the current capabilities instance. It contains the flags used + * to test for support of a particular extension. + * + * @return The current capabilities instance. + */ + public static ContextCapabilities getCapabilities() { + ContextCapabilities caps = getCapabilitiesImpl(); + if ( caps == null ) + throw new RuntimeException("No OpenGL context found in the current thread."); + + return caps; + } + + private static ContextCapabilities getCapabilitiesImpl() { + CapabilitiesCacheEntry recent_cache_entry = fast_path_cache; + // Check owner of cache entry + if ( recent_cache_entry.owner == Thread.currentThread() ) { + /* The owner ship test succeeded, so the cache must contain the current ContextCapabilities instance + * assert recent_cache_entry.capabilities == getThreadLocalCapabilities(); + */ + return recent_cache_entry.capabilities; + } else // Some other thread has written to the cache since, and we fall back to the slower path + return getThreadLocalCapabilities(); + } + + /** + * Returns the capabilities instance associated with the specified context object. + * + * @param context the context object + * + * @return the capabilities instance + */ + static ContextCapabilities getCapabilities(Object context) { + return capability_cache.get(context); + } + + private static ContextCapabilities getThreadLocalCapabilities() { + return current_capabilities.get(); + } + + /** + * Set the current capabilities instance. It contains the flags used + * to test for support of a particular extension. + * + * @return The current capabilities instance. + */ + static void setCapabilities(ContextCapabilities capabilities) { + current_capabilities.set(capabilities); + + CapabilitiesCacheEntry thread_cache_entry = thread_cache_entries.get(); + if ( thread_cache_entry == null ) { + thread_cache_entry = new CapabilitiesCacheEntry(); + thread_cache_entries.set(thread_cache_entry); + } + thread_cache_entry.owner = Thread.currentThread(); + thread_cache_entry.capabilities = capabilities; + + fast_path_cache = thread_cache_entry; + } + + /** + * Helper method to get a pointer to a named function in the OpenGL library + * with a name dependent on the current platform + */ + static long getPlatformSpecificFunctionAddress(String function_prefix, String[] os_prefixes, String[] os_function_prefixes, String function) { + String os_name = AccessController.doPrivileged(new PrivilegedAction<String>() { + public String run() { + return System.getProperty("os.name"); + } + }); + for ( int i = 0; i < os_prefixes.length; i++ ) + if ( os_name.startsWith(os_prefixes[i]) ) { + String platform_function_name = function.replaceFirst(function_prefix, os_function_prefixes[i]); + long address = getFunctionAddress(platform_function_name); + return address; + } + return 0; + } + + /** + * Helper method to get a pointer to a named function with aliases in the OpenGL library. + * + * @param aliases the function name aliases. + * + * @return the function pointer address + */ + static long getFunctionAddress(String[] aliases) { + for ( String alias : aliases ) { + long address = getFunctionAddress(alias); + if ( address != 0 ) + return address; + } + return 0; + } + + /** Helper method to get a pointer to a named function in the OpenGL library. */ + static long getFunctionAddress(String name) { + ByteBuffer buffer = MemoryUtil.encodeASCII(name); + return ngetFunctionAddress(MemoryUtil.getAddress(buffer)); + } + private static native long ngetFunctionAddress(long name); + + /** + * Determine which extensions are available and returns the context profile mask. Helper method to ContextCapabilities. + * + * @param supported_extensions the Set to fill with the available extension names + * + * @return the context profile mask, will be 0 for any version < 3.2 + */ + static int getSupportedExtensions(final Set<String> supported_extensions) { + // Detect OpenGL version first + + final String version = glGetString(GL_VERSION); + if ( version == null ) + throw new IllegalStateException("glGetString(GL_VERSION) returned null - possibly caused by missing current context."); + + final StringTokenizer version_tokenizer = new StringTokenizer(version, ". "); + final String major_string = version_tokenizer.nextToken(); + final String minor_string = version_tokenizer.nextToken(); + + int majorVersion = 0; + int minorVersion = 0; + try { + majorVersion = Integer.parseInt(major_string); + minorVersion = Integer.parseInt(minor_string); + } catch (NumberFormatException e) { + LWJGLUtil.log("The major and/or minor OpenGL version is malformed: " + e.getMessage()); + } + + final int[][] GL_VERSIONS = { + { 1, 2, 3, 4, 5 }, // OpenGL 1 + { 0, 1 }, // OpenGL 2 + { 0, 1, 2, 3 }, // OpenGL 3 + { 0, 1, 2, 3, 4 }, // OpenGL 4 + }; + + for ( int major = 1; major <= GL_VERSIONS.length; major++ ) { + int[] minors = GL_VERSIONS[major - 1]; + for ( int minor : minors ) { + if ( major < majorVersion || (major == majorVersion && minor <= minorVersion) ) + supported_extensions.add("OpenGL" + Integer.toString(major) + Integer.toString(minor)); + } + } + + int profileMask = 0; + + if ( majorVersion < 3 ) { + // Parse EXTENSIONS string + final String extensions_string = glGetString(GL_EXTENSIONS); + if ( extensions_string == null ) + throw new IllegalStateException("glGetString(GL_EXTENSIONS) returned null - is there a context current?"); + + final StringTokenizer tokenizer = new StringTokenizer(extensions_string); + while ( tokenizer.hasMoreTokens() ) + supported_extensions.add(tokenizer.nextToken()); + } else { + // Use forward compatible indexed EXTENSIONS + final int extensionCount = glGetInteger(GL_NUM_EXTENSIONS); + + for ( int i = 0; i < extensionCount; i++ ) + supported_extensions.add(glGetStringi(GL_EXTENSIONS, i)); + + // Get the context profile mask for versions >= 3.2 + if ( 3 < majorVersion || 2 <= minorVersion ) { + Util.checkGLError(); // Make sure we have no errors up to this point + + try { + profileMask = glGetInteger(GL_CONTEXT_PROFILE_MASK); + // Retrieving GL_CONTEXT_PROFILE_MASK may generate an INVALID_OPERATION error on certain implementations, ignore. + // Happens on pre10.1 ATI drivers, when ContextAttribs.withProfileCompatibility is not used + Util.checkGLError(); + } catch (OpenGLException e) { + LWJGLUtil.log("Failed to retrieve CONTEXT_PROFILE_MASK"); + } + } + } + + return profileMask; + } + + /** + * Helper method to ContextCapabilities. It will try to initialize the native stubs, + * and remove the given extension name from the extension set if the initialization fails. + */ + static void initNativeStubs(final Class<?> extension_class, Set supported_extensions, String ext_name) { + resetNativeStubs(extension_class); + if ( supported_extensions.contains(ext_name) ) { + try { + AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { + public Object run() throws Exception { + Method init_stubs_method = extension_class.getDeclaredMethod("initNativeStubs"); + init_stubs_method.invoke(null); + return null; + } + }); + } catch (Exception e) { + LWJGLUtil.log("Failed to initialize extension " + extension_class + " - exception: " + e); + supported_extensions.remove(ext_name); + } + } + } + + /** + * Makes a GL context the current LWJGL context by loading GL function pointers. The context must be current before a call to + * this method! Instead it simply ensures that the current context is reflected accurately by GLContext's extension caps and + * function pointers. Use useContext(null) when no context is active. <p>If the context is the same as last time, then this is + * a no-op. <p>If the context has not been encountered before it will be fully initialized from scratch. Otherwise a cached set + * of caps and function pointers will be used. <p>The reference to the context is held in a weak reference; therefore if no + * strong reference exists to the GL context it will automatically be forgotten by the VM at an indeterminate point in the + * future, freeing up a little RAM. + * + * @param context The context object, which uniquely identifies a GL context. If context is null, the native stubs are + * unloaded. + * + * @throws LWJGLException if context non-null, and the gl library can't be loaded or the basic GL11 functions can't be loaded + */ + public static synchronized void useContext(Object context) throws LWJGLException { + useContext(context, false); + } + + /** + * Makes a GL context the current LWJGL context by loading GL function pointers. The context must be current before a call to + * this method! Instead it simply ensures that the current context is reflected accurately by GLContext's extension caps and + * function pointers. Use useContext(null) when no context is active. <p>If the context is the same as last time, then this is + * a no-op. <p>If the context has not been encountered before it will be fully initialized from scratch. Otherwise a cached set + * of caps and function pointers will be used. <p>The reference to the context is held in a weak reference; therefore if no + * strong reference exists to the GL context it will automatically be forgotten by the VM at an indeterminate point in the + * future, freeing up a little RAM. + * <p>If forwardCompatible is true, function pointers of deprecated GL11-GL21 functionality will not be loaded. Calling a deprecated + * function using the specified context will result in an <code>IllegalStateException</code>. + * + * @param context The context object, which uniquely identifies a GL context. If context is null, the native stubs are + * unloaded. + * @param forwardCompatible If the context is a forward compatible context (does not expose deprecated functionality, see XGL_ARB_create_context) + * + * @throws LWJGLException if context non-null, and the gl library can't be loaded or the basic GL11 functions can't be loaded + */ + public static synchronized void useContext(Object context, boolean forwardCompatible) throws LWJGLException { + if ( context == null ) { + ContextCapabilities.unloadAllStubs(); + setCapabilities(null); + if ( did_auto_load ) + unloadOpenGLLibrary(); + return; + } + if ( gl_ref_count == 0 ) { + loadOpenGLLibrary(); + did_auto_load = true; + } + try { + ContextCapabilities capabilities = capability_cache.get(context); + if ( capabilities == null ) { + /* + * The capabilities object registers itself as current. This behaviour is caused + * by a chicken-and-egg situation where the constructor needs to call GL functions + * as part of its capability discovery, but GL functions cannot be called before + * a capabilities object has been set. + */ + new ContextCapabilities(forwardCompatible); + capability_cache.put(context, getCapabilities()); + } else + setCapabilities(capabilities); + } catch (LWJGLException e) { + if ( did_auto_load ) + unloadOpenGLLibrary(); + throw e; + } + } + + /** If the OpenGL reference count is 0, the library is loaded. The reference count is then incremented. */ + public static synchronized void loadOpenGLLibrary() throws LWJGLException { + if ( gl_ref_count == 0 ) + nLoadOpenGLLibrary(); + gl_ref_count++; + } + + private static native void nLoadOpenGLLibrary() throws LWJGLException; + + /** The OpenGL library reference count is decremented, and if it reaches 0, the library is unloaded. */ + public static synchronized void unloadOpenGLLibrary() { + gl_ref_count--; + /* + * Unload the native OpenGL library unless we're on linux, since + * some drivers (NVIDIA proprietary) crash on exit when unloading the library. + */ + if ( gl_ref_count == 0 && LWJGLUtil.getPlatform() != LWJGLUtil.PLATFORM_LINUX ) + nUnloadOpenGLLibrary(); + } + + private static native void nUnloadOpenGLLibrary(); + + /** Native method to clear native stub bindings */ + static native void resetNativeStubs(Class clazz); + + private static final class CapabilitiesCacheEntry { + + Thread owner; + ContextCapabilities capabilities; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLSync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLSync.java new file mode 100644 index 0000000..cda0f2f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLSync.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * This class is a wrapper around a GLsync pointer. + * + * @author spasi <spasi@users.sourceforge.net> + */ +public final class GLSync extends PointerWrapperAbstract { + + GLSync(final long sync) { + super(sync); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLUConstants.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLUConstants.java new file mode 100644 index 0000000..e3ae535 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GLUConstants.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import static org.lwjgl.opengl.GL11.*; + +/** + * <p/> + * GLU constants. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public interface GLUConstants { + + /* Errors: (return value 0 = no error) */ + int GLU_INVALID_ENUM = 100900; + int GLU_INVALID_VALUE = 100901; + int GLU_OUT_OF_MEMORY = 100902; + int GLU_INCOMPATIBLE_GL_VERSION = 100903; + + /* StringName */ + int GLU_VERSION = 100800; + int GLU_EXTENSIONS = 100801; + + /* Boolean */ + int GLU_TRUE = GL_TRUE; + int GLU_FALSE = GL_FALSE; + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GlobalLock.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GlobalLock.java new file mode 100644 index 0000000..4f2a83d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/GlobalLock.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This class contains the global lock that LWJGL will use to + * synchronize access to Display. + */ +final class GlobalLock { + static final Object lock = new Object(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/InputImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/InputImplementation.java new file mode 100644 index 0000000..cf680a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/InputImplementation.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the input implementation interface. Mouse and Keyboard delegates + * to implementors of this interface. There is one InputImplementation + * for each supported platform. + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.LWJGLException; + +public interface InputImplementation { + /* + * Mouse methods + */ + /** Query of wheel support */ + boolean hasWheel(); + + /** Query of button count */ + int getButtonCount(); + + /** + * Method to create the mouse. + */ + void createMouse() throws LWJGLException; + + /** + * Method the destroy the mouse + */ + void destroyMouse(); + + /** + * Method to poll the mouse + */ + void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons); + + /** + * Method to read the keyboard buffer + */ + void readMouse(ByteBuffer buffer); + + void grabMouse(boolean grab); + + /** + * Function to determine native cursor support + */ + int getNativeCursorCapabilities(); + + /** Method to set the native cursor position */ + void setCursorPosition(int x, int y); + + /** Method to set the native cursor */ + void setNativeCursor(Object handle) throws LWJGLException; + + /** Method returning the minimum cursor size */ + int getMinCursorSize(); + + /** Method returning the maximum cursor size */ + int getMaxCursorSize(); + + /* + * Keyboard methods + */ + + /** + * Method to create the keyboard + */ + void createKeyboard() throws LWJGLException; + + /** + * Method to destroy the keyboard + */ + void destroyKeyboard(); + + /** + * Method to poll the keyboard. + * + * @param keyDownBuffer the address of a 256-byte buffer to place + * key states in. + */ + void pollKeyboard(ByteBuffer keyDownBuffer); + + /** + * Method to read the keyboard buffer + */ + void readKeyboard(ByteBuffer buffer); + +// int isStateKeySet(int key); + + /** Native cursor handles */ + Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException; + + void destroyCursor(Object cursor_handle); + + int getWidth(); + + int getHeight(); + + boolean isInsideWindow(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KHRDebugCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KHRDebugCallback.java new file mode 100644 index 0000000..223df59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KHRDebugCallback.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class are needed to use the callback functionality of the KHR_debug extension. + * Users of this class may provide implementations of the {@code Handler} interface to receive notifications. + * The same {@code Handler} instance may be used by different contexts but it is not recommended. + * Handler notifications are synchronized. + * + * @author Spasi + */ +public final class KHRDebugCallback extends PointerWrapperAbstract { + + /** Severity levels. */ + private static final int + GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Sources. */ + private static final int + GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** Types. */ + private static final int + GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + private static final long CALLBACK_POINTER; + + static { + long pointer = 0; + try { + // Call reflectively so that we can compile this class for the Generator. + pointer = (Long)Class.forName("org.lwjgl.opengl.CallbackUtil").getDeclaredMethod("getDebugCallbackKHR").invoke(null); + } catch (Exception e) { + // ignore + } + CALLBACK_POINTER = pointer; + } + + private final Handler handler; + + /** + * Creates an KHRebugCallback with a default callback handler. + * The default handler will simply print the message on System.err. + */ + public KHRDebugCallback() { + this(new Handler() { + public void handleMessage(final int source, final int type, final int id, final int severity, final String message) { + System.err.println("[LWJGL] KHR_debug message"); + System.err.println("\tID: " + id); + + String description; + switch ( source ) { + case GL_DEBUG_SOURCE_API: + description = "API"; + break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + description = "WINDOW SYSTEM"; + break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + description = "SHADER COMPILER"; + break; + case GL_DEBUG_SOURCE_THIRD_PARTY: + description = "THIRD PARTY"; + break; + case GL_DEBUG_SOURCE_APPLICATION: + description = "APPLICATION"; + break; + case GL_DEBUG_SOURCE_OTHER: + description = "OTHER"; + break; + default: + description = printUnknownToken(source); + } + System.err.println("\tSource: " + description); + + switch ( type ) { + case GL_DEBUG_TYPE_ERROR: + description = "ERROR"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + description = "DEPRECATED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + description = "UNDEFINED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_PORTABILITY: + description = "PORTABILITY"; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + description = "PERFORMANCE"; + break; + case GL_DEBUG_TYPE_OTHER: + description = "OTHER"; + break; + case GL_DEBUG_TYPE_MARKER: + description = "MARKER"; + break; + default: + description = printUnknownToken(type); + } + System.err.println("\tType: " + description); + + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH: + description = "HIGH"; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + description = "MEDIUM"; + break; + case GL_DEBUG_SEVERITY_LOW: + description = "LOW"; + break; + case GL_DEBUG_SEVERITY_NOTIFICATION: + description = "NOTIFICATION"; + break; + default: + description = printUnknownToken(severity); + } + System.err.println("\tSeverity: " + description); + + System.err.println("\tMessage: " + message); + } + + private String printUnknownToken(final int token) { + return "Unknown (0x" + Integer.toHexString(token).toUpperCase() + ")"; + } + }); + } + + /** + * Creates an ARBDebugOutputCallback with the specified callback handler. + * The handler's {@code handleMessage} method will be called whenever + * debug output is generated by the GL. + * + * @param handler the callback handler + */ + public KHRDebugCallback(final Handler handler) { + super(CALLBACK_POINTER); + + this.handler = handler; + } + + Handler getHandler() { + return handler; + } + + /** Implementations of this interface can be used to receive ARB_debug_output notifications. */ + public interface Handler { + + /** + * This method will be called when an ARB_debug_output message is generated. + * + * @param source the message source + * @param type the message type + * @param id the message ID + * @param severity the message severity + * @param message the string representation of the message. + */ + void handleMessage(int source, int type, int id, int severity, String message); + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KeyboardEventQueue.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KeyboardEventQueue.java new file mode 100644 index 0000000..12a2a5c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/KeyboardEventQueue.java @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * An AWT implementation of a LWJGL compatible Keyboard event queue. + * @author elias_naur + */ + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.Component; +import java.nio.ByteBuffer; + +import org.lwjgl.input.Keyboard; + +final class KeyboardEventQueue extends EventQueue implements KeyListener { + private static final int[] KEY_MAP = new int[0xffff]; + + private final byte[] key_states = new byte[Keyboard.KEYBOARD_SIZE]; + + /** Event scratch array */ + private final ByteBuffer event = ByteBuffer.allocate(Keyboard.EVENT_SIZE); + + private final Component component; + + private boolean has_deferred_event; + private long deferred_nanos; + private int deferred_key_code; + private int deferred_key_location; + private byte deferred_key_state; + private int deferred_character; + + static { + KEY_MAP[KeyEvent.VK_0] = Keyboard.KEY_0; + KEY_MAP[KeyEvent.VK_1] = Keyboard.KEY_1; + KEY_MAP[KeyEvent.VK_2] = Keyboard.KEY_2; + KEY_MAP[KeyEvent.VK_3] = Keyboard.KEY_3; + KEY_MAP[KeyEvent.VK_4] = Keyboard.KEY_4; + KEY_MAP[KeyEvent.VK_5] = Keyboard.KEY_5; + KEY_MAP[KeyEvent.VK_6] = Keyboard.KEY_6; + KEY_MAP[KeyEvent.VK_7] = Keyboard.KEY_7; + KEY_MAP[KeyEvent.VK_8] = Keyboard.KEY_8; + KEY_MAP[KeyEvent.VK_9] = Keyboard.KEY_9; + KEY_MAP[KeyEvent.VK_A] = Keyboard.KEY_A; +// KEY_MAP[KeyEvent.VK_ACCEPT] = Keyboard.KEY_ACCEPT; + KEY_MAP[KeyEvent.VK_ADD] = Keyboard.KEY_ADD; +// KEY_MAP[KeyEvent.VK_AGAIN] = Keyboard.KEY_AGAIN; +// KEY_MAP[KeyEvent.VK_ALL_CANDIDATES] = Keyboard.KEY_ALL_CANDIDATES; +// KEY_MAP[KeyEvent.VK_ALPHANUMERIC] = Keyboard.KEY_ALPHANUMERIC; +// KEY_MAP[KeyEvent.VK_ALT] = Keyboard.KEY_LMENU; manually mapped + KEY_MAP[KeyEvent.VK_ALT_GRAPH] = Keyboard.KEY_RMENU; +// KEY_MAP[KeyEvent.VK_AMPERSAND] = Keyboard.KEY_AMPERSAND; +// KEY_MAP[KeyEvent.VK_ASTERISK] = Keyboard.KEY_ASTERISK; + KEY_MAP[KeyEvent.VK_AT] = Keyboard.KEY_AT; + KEY_MAP[KeyEvent.VK_B] = Keyboard.KEY_B; +// KEY_MAP[KeyEvent.VK_BACK_QUOTE] = Keyboard.KEY_BACK_QUOTE; + KEY_MAP[KeyEvent.VK_BACK_SLASH] = Keyboard.KEY_BACKSLASH; + KEY_MAP[KeyEvent.VK_BACK_SPACE] = Keyboard.KEY_BACK; +// KEY_MAP[KeyEvent.VK_BRACELEFT] = Keyboard.KEY_BRACELEFT; +// KEY_MAP[KeyEvent.VK_BRACERIGHT] = Keyboard.KEY_BRACERIGHT; + KEY_MAP[KeyEvent.VK_C] = Keyboard.KEY_C; +// KEY_MAP[KeyEvent.VK_CANCEL] = Keyboard.KEY_CANCEL; + KEY_MAP[KeyEvent.VK_CAPS_LOCK] = Keyboard.KEY_CAPITAL; + KEY_MAP[KeyEvent.VK_CIRCUMFLEX] = Keyboard.KEY_CIRCUMFLEX; +// KEY_MAP[KeyEvent.VK_CLEAR] = Keyboard.KEY_CLEAR; + KEY_MAP[KeyEvent.VK_CLOSE_BRACKET] = Keyboard.KEY_RBRACKET; +// KEY_MAP[KeyEvent.VK_CODE_INPUT] = Keyboard.KEY_CODE_INPUT; + KEY_MAP[KeyEvent.VK_COLON] = Keyboard.KEY_COLON; + KEY_MAP[KeyEvent.VK_COMMA] = Keyboard.KEY_COMMA; +// KEY_MAP[KeyEvent.VK_COMPOSE] = Keyboard.KEY_COMPOSE; +// KEY_MAP[KeyEvent.VK_CONTROL] = Keyboard.KEY_LCONTROL; manually mapped + KEY_MAP[KeyEvent.VK_CONVERT] = Keyboard.KEY_CONVERT; +// KEY_MAP[KeyEvent.VK_COPY] = Keyboard.KEY_COPY; +// KEY_MAP[KeyEvent.VK_CUT] = Keyboard.KEY_CUT; + KEY_MAP[KeyEvent.VK_D] = Keyboard.KEY_D; +// KEY_MAP[KeyEvent.VK_DEAD_ABOVEDOT] = Keyboard.KEY_DEAD_ABOVEDOT; +// KEY_MAP[KeyEvent.VK_DEAD_ABOVERING] = Keyboard.KEY_DEAD_ABOVERING; +// KEY_MAP[KeyEvent.VK_DEAD_ACUTE] = Keyboard.KEY_DEAD_ACUTE; +// KEY_MAP[KeyEvent.VK_DEAD_BREVE] = Keyboard.KEY_DEAD_BREVE; +// KEY_MAP[KeyEvent.VK_DEAD_CARON] = Keyboard.KEY_DEAD_CARON; +// KEY_MAP[KeyEvent.VK_DEAD_CEDILLA] = Keyboard.KEY_DEAD_CEDILLA; +// KEY_MAP[KeyEvent.VK_DEAD_CIRCUMFLEX] = Keyboard.KEY_DEAD_CIRCUMFLEX; +// KEY_MAP[KeyEvent.VK_DEAD_DIAERESIS] = Keyboard.KEY_DEAD_DIAERESIS; +// KEY_MAP[KeyEvent.VK_DEAD_DOUBLEACUTE] = Keyboard.KEY_DEAD_DOUBLEACUTE; +// KEY_MAP[KeyEvent.VK_DEAD_GRAVE] = Keyboard.KEY_DEAD_GRAVE; +// KEY_MAP[KeyEvent.VK_DEAD_IOTA] = Keyboard.KEY_DEAD_IOTA; +// KEY_MAP[KeyEvent.VK_DEAD_MACRON] = Keyboard.KEY_DEAD_MACRON; +// KEY_MAP[KeyEvent.VK_DEAD_OGONEK] = Keyboard.KEY_DEAD_OGONEK; +// KEY_MAP[KeyEvent.VK_DEAD_SEMIVOICED_SOUND] = Keyboard.KEY_DEAD_SEMIVOICED_SOUND; +// KEY_MAP[KeyEvent.VK_DEAD_TILDE] = Keyboard.KEY_DEAD_TILDE; +// KEY_MAP[KeyEvent.VK_DEAD_VOICED_SOUND] = Keyboard.KEY_DEAD_VOICED_SOUND; + KEY_MAP[KeyEvent.VK_DECIMAL] = Keyboard.KEY_DECIMAL; + KEY_MAP[KeyEvent.VK_DELETE] = Keyboard.KEY_DELETE; + KEY_MAP[KeyEvent.VK_DIVIDE] = Keyboard.KEY_DIVIDE; +// KEY_MAP[KeyEvent.VK_DOLLAR] = Keyboard.KEY_DOLLAR; + KEY_MAP[KeyEvent.VK_DOWN] = Keyboard.KEY_DOWN; + KEY_MAP[KeyEvent.VK_E] = Keyboard.KEY_E; + KEY_MAP[KeyEvent.VK_END] = Keyboard.KEY_END; + KEY_MAP[KeyEvent.VK_ENTER] = Keyboard.KEY_RETURN; + KEY_MAP[KeyEvent.VK_EQUALS] = Keyboard.KEY_EQUALS; + KEY_MAP[KeyEvent.VK_ESCAPE] = Keyboard.KEY_ESCAPE; +// KEY_MAP[KeyEvent.VK_EURO_SIGN] = Keyboard.KEY_EURO_SIGN; +// KEY_MAP[KeyEvent.VK_EXCLAMATION_MARK] = Keyboard.KEY_EXCLAMATION_MARK; + KEY_MAP[KeyEvent.VK_F] = Keyboard.KEY_F; + KEY_MAP[KeyEvent.VK_F1] = Keyboard.KEY_F1; + KEY_MAP[KeyEvent.VK_F10] = Keyboard.KEY_F10; + KEY_MAP[KeyEvent.VK_F11] = Keyboard.KEY_F11; + KEY_MAP[KeyEvent.VK_F12] = Keyboard.KEY_F12; + KEY_MAP[KeyEvent.VK_F13] = Keyboard.KEY_F13; + KEY_MAP[KeyEvent.VK_F14] = Keyboard.KEY_F14; + KEY_MAP[KeyEvent.VK_F15] = Keyboard.KEY_F15; +// KEY_MAP[KeyEvent.VK_F16] = Keyboard.KEY_F16; +// KEY_MAP[KeyEvent.VK_F17] = Keyboard.KEY_F17; +// KEY_MAP[KeyEvent.VK_F18] = Keyboard.KEY_F18; +// KEY_MAP[KeyEvent.VK_F19] = Keyboard.KEY_F19; + KEY_MAP[KeyEvent.VK_F2] = Keyboard.KEY_F2; +// KEY_MAP[KeyEvent.VK_F20] = Keyboard.KEY_F20; +// KEY_MAP[KeyEvent.VK_F21] = Keyboard.KEY_F21; +// KEY_MAP[KeyEvent.VK_F22] = Keyboard.KEY_F22; +// KEY_MAP[KeyEvent.VK_F23] = Keyboard.KEY_F23; +// KEY_MAP[KeyEvent.VK_F24] = Keyboard.KEY_F24; + KEY_MAP[KeyEvent.VK_F3] = Keyboard.KEY_F3; + KEY_MAP[KeyEvent.VK_F4] = Keyboard.KEY_F4; + KEY_MAP[KeyEvent.VK_F5] = Keyboard.KEY_F5; + KEY_MAP[KeyEvent.VK_F6] = Keyboard.KEY_F6; + KEY_MAP[KeyEvent.VK_F7] = Keyboard.KEY_F7; + KEY_MAP[KeyEvent.VK_F8] = Keyboard.KEY_F8; + KEY_MAP[KeyEvent.VK_F9] = Keyboard.KEY_F9; +// KEY_MAP[KeyEvent.VK_FINAL] = Keyboard.KEY_FINAL; +// KEY_MAP[KeyEvent.VK_FIND] = Keyboard.KEY_FIND; +// KEY_MAP[KeyEvent.VK_FULL_WIDTH] = Keyboard.KEY_FULL_WIDTH; + KEY_MAP[KeyEvent.VK_G] = Keyboard.KEY_G; +// KEY_MAP[KeyEvent.VK_GREATER] = Keyboard.KEY_GREATER; + KEY_MAP[KeyEvent.VK_H] = Keyboard.KEY_H; +// KEY_MAP[KeyEvent.VK_HALF_WIDTH] = Keyboard.KEY_HALF_WIDTH; +// KEY_MAP[KeyEvent.VK_HELP] = Keyboard.KEY_HELP; +// KEY_MAP[KeyEvent.VK_HIRAGANA] = Keyboard.KEY_HIRAGANA; + KEY_MAP[KeyEvent.VK_HOME] = Keyboard.KEY_HOME; + KEY_MAP[KeyEvent.VK_I] = Keyboard.KEY_I; +// KEY_MAP[KeyEvent.VK_INPUT_METHOD_ON_OFF] = Keyboard.KEY_INPUT_METHOD_ON_OFF; + KEY_MAP[KeyEvent.VK_INSERT] = Keyboard.KEY_INSERT; +// KEY_MAP[KeyEvent.VK_INVERTED_EXCLAMATION_MARK] = Keyboard.KEY_INVERTED_EXCLAMATION_MARK; + KEY_MAP[KeyEvent.VK_J] = Keyboard.KEY_J; +// KEY_MAP[KeyEvent.VK_JAPANESE_HIRAGANA] = Keyboard.KEY_JAPANESE_HIRAGANA; +// KEY_MAP[KeyEvent.VK_JAPANESE_KATAKANA] = Keyboard.KEY_JAPANESE_KATAKANA; +// KEY_MAP[KeyEvent.VK_JAPANESE_ROMAN] = Keyboard.KEY_JAPANESE_ROMAN; + KEY_MAP[KeyEvent.VK_K] = Keyboard.KEY_K; + KEY_MAP[KeyEvent.VK_KANA] = Keyboard.KEY_KANA; +// KEY_MAP[KeyEvent.VK_KANA_LOCK] = Keyboard.KEY_KANA_LOCK; + KEY_MAP[KeyEvent.VK_KANJI] = Keyboard.KEY_KANJI; +// KEY_MAP[KeyEvent.VK_KATAKANA] = Keyboard.KEY_KATAKANA; +// KEY_MAP[KeyEvent.VK_KP_DOWN] = Keyboard.KEY_KP_DOWN; +// KEY_MAP[KeyEvent.VK_KP_LEFT] = Keyboard.KEY_KP_LEFT; +// KEY_MAP[KeyEvent.VK_KP_RIGHT] = Keyboard.KEY_KP_RIGHT; +// KEY_MAP[KeyEvent.VK_KP_UP] = Keyboard.KEY_KP_UP; + KEY_MAP[KeyEvent.VK_L] = Keyboard.KEY_L; + KEY_MAP[KeyEvent.VK_LEFT] = Keyboard.KEY_LEFT; +// KEY_MAP[KeyEvent.VK_LEFT_PARENTHESIS] = Keyboard.KEY_LEFT_PARENTHESIS; +// KEY_MAP[KeyEvent.VK_LESS] = Keyboard.KEY_LESS; + KEY_MAP[KeyEvent.VK_M] = Keyboard.KEY_M; +// KEY_MAP[KeyEvent.VK_META] = Keyboard.KEY_LMENU; manually mapped + KEY_MAP[KeyEvent.VK_MINUS] = Keyboard.KEY_MINUS; +// KEY_MAP[KeyEvent.VK_MODECHANGE] = Keyboard.KEY_MODECHANGE; + KEY_MAP[KeyEvent.VK_MULTIPLY] = Keyboard.KEY_MULTIPLY; + KEY_MAP[KeyEvent.VK_N] = Keyboard.KEY_N; +// KEY_MAP[KeyEvent.VK_NONCONVERT] = Keyboard.KEY_NONCONVERT; + KEY_MAP[KeyEvent.VK_NUM_LOCK] = Keyboard.KEY_NUMLOCK; +// KEY_MAP[KeyEvent.VK_NUMBER_SIGN] = Keyboard.KEY_NUMBER_SIGN; + KEY_MAP[KeyEvent.VK_NUMPAD0] = Keyboard.KEY_NUMPAD0; + KEY_MAP[KeyEvent.VK_NUMPAD1] = Keyboard.KEY_NUMPAD1; + KEY_MAP[KeyEvent.VK_NUMPAD2] = Keyboard.KEY_NUMPAD2; + KEY_MAP[KeyEvent.VK_NUMPAD3] = Keyboard.KEY_NUMPAD3; + KEY_MAP[KeyEvent.VK_NUMPAD4] = Keyboard.KEY_NUMPAD4; + KEY_MAP[KeyEvent.VK_NUMPAD5] = Keyboard.KEY_NUMPAD5; + KEY_MAP[KeyEvent.VK_NUMPAD6] = Keyboard.KEY_NUMPAD6; + KEY_MAP[KeyEvent.VK_NUMPAD7] = Keyboard.KEY_NUMPAD7; + KEY_MAP[KeyEvent.VK_NUMPAD8] = Keyboard.KEY_NUMPAD8; + KEY_MAP[KeyEvent.VK_NUMPAD9] = Keyboard.KEY_NUMPAD9; + KEY_MAP[KeyEvent.VK_O] = Keyboard.KEY_O; + KEY_MAP[KeyEvent.VK_OPEN_BRACKET] = Keyboard.KEY_LBRACKET; + KEY_MAP[KeyEvent.VK_P] = Keyboard.KEY_P; + KEY_MAP[KeyEvent.VK_PAGE_DOWN] = Keyboard.KEY_NEXT; + KEY_MAP[KeyEvent.VK_PAGE_UP] = Keyboard.KEY_PRIOR; +// KEY_MAP[KeyEvent.VK_PASTE] = Keyboard.KEY_PASTE; + KEY_MAP[KeyEvent.VK_PAUSE] = Keyboard.KEY_PAUSE; + KEY_MAP[KeyEvent.VK_PERIOD] = Keyboard.KEY_PERIOD; +// KEY_MAP[KeyEvent.VK_PLUS] = Keyboard.KEY_PLUS; +// KEY_MAP[KeyEvent.VK_PREVIOUS_CANDIDATE] = Keyboard.KEY_PREVIOUS_CANDIDATE; +// KEY_MAP[KeyEvent.VK_PRINTSCREEN] = Keyboard.KEY_PRINTSCREEN; +// KEY_MAP[KeyEvent.VK_PROPS] = Keyboard.KEY_PROPS; + KEY_MAP[KeyEvent.VK_Q] = Keyboard.KEY_Q; +// KEY_MAP[KeyEvent.VK_QUOTE] = Keyboard.KEY_QUOTE; +// KEY_MAP[KeyEvent.VK_QUOTEDBL] = Keyboard.KEY_QUOTEDBL; + KEY_MAP[KeyEvent.VK_R] = Keyboard.KEY_R; + KEY_MAP[KeyEvent.VK_RIGHT] = Keyboard.KEY_RIGHT; +// KEY_MAP[KeyEvent.VK_RIGHT_PARENTHESIS] = Keyboard.KEY_RIGHT_PARENTHESIS; +// KEY_MAP[KeyEvent.VK_ROMAN_CHARACTERS] = Keyboard.KEY_ROMAN_CHARACTERS; + KEY_MAP[KeyEvent.VK_S] = Keyboard.KEY_S; + KEY_MAP[KeyEvent.VK_SCROLL_LOCK] = Keyboard.KEY_SCROLL; + KEY_MAP[KeyEvent.VK_SEMICOLON] = Keyboard.KEY_SEMICOLON; + KEY_MAP[KeyEvent.VK_SEPARATOR] = Keyboard.KEY_DECIMAL; +// KEY_MAP[KeyEvent.VK_SHIFT] = Keyboard.KEY_LSHIFT; manually mapped + KEY_MAP[KeyEvent.VK_SLASH] = Keyboard.KEY_SLASH; + KEY_MAP[KeyEvent.VK_SPACE] = Keyboard.KEY_SPACE; + KEY_MAP[KeyEvent.VK_STOP] = Keyboard.KEY_STOP; + KEY_MAP[KeyEvent.VK_SUBTRACT] = Keyboard.KEY_SUBTRACT; + KEY_MAP[KeyEvent.VK_T] = Keyboard.KEY_T; + KEY_MAP[KeyEvent.VK_TAB] = Keyboard.KEY_TAB; + KEY_MAP[KeyEvent.VK_U] = Keyboard.KEY_U; +// KEY_MAP[KeyEvent.VK_UNDERSCORE] = Keyboard.KEY_UNDERSCORE; +// KEY_MAP[KeyEvent.VK_UNDO] = Keyboard.KEY_UNDO; + KEY_MAP[KeyEvent.VK_UP] = Keyboard.KEY_UP; + KEY_MAP[KeyEvent.VK_V] = Keyboard.KEY_V; + KEY_MAP[KeyEvent.VK_W] = Keyboard.KEY_W; + KEY_MAP[KeyEvent.VK_X] = Keyboard.KEY_X; + KEY_MAP[KeyEvent.VK_Y] = Keyboard.KEY_Y; + KEY_MAP[KeyEvent.VK_Z] = Keyboard.KEY_Z; + } + + KeyboardEventQueue(Component component) { + super(Keyboard.EVENT_SIZE); + this.component = component; + } + + public void register() { + component.addKeyListener(this); + } + + public void unregister() { + /* + * This line is commented out to work around AWT bug 4867453: + * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4867453 + */ + //component.removeKeyListener(this); + } + + private void putKeyboardEvent(int key_code, byte state, int character, long nanos, boolean repeat) { + event.clear(); + event.putInt(key_code).put(state).putInt(character).putLong(nanos).put(repeat ? (byte)1 : (byte)0); + event.flip(); + putEvent(event); + } + + public synchronized void poll(ByteBuffer key_down_buffer) { + flushDeferredEvent(); + int old_position = key_down_buffer.position(); + key_down_buffer.put(key_states); + key_down_buffer.position(old_position); + } + + public synchronized void copyEvents(ByteBuffer dest) { + flushDeferredEvent(); + super.copyEvents(dest); + } + + private synchronized void handleKey(int key_code, int key_location, byte state, int character, long nanos) { + if (character == KeyEvent.CHAR_UNDEFINED) + character = Keyboard.CHAR_NONE; + if (state == 1) { + boolean repeat = false; + if (has_deferred_event) { + if ((nanos == deferred_nanos && deferred_key_code == key_code && + deferred_key_location == key_location)) { + has_deferred_event = false; + repeat = true; // Repeat event + } else + flushDeferredEvent(); + } + putKeyEvent(key_code, key_location, state, character, nanos, repeat); + } else { + flushDeferredEvent(); + has_deferred_event = true; + deferred_nanos = nanos; + deferred_key_code = key_code; + deferred_key_location = key_location; + deferred_key_state = state; + deferred_character = character; + } + } + + private void flushDeferredEvent() { + if (has_deferred_event) { + putKeyEvent(deferred_key_code, deferred_key_location, deferred_key_state, deferred_character, deferred_nanos, false); + has_deferred_event = false; + } + } + + private void putKeyEvent(int key_code, int key_location, byte state, int character, long nanos, boolean repeat) { + int key_code_mapped = getMappedKeyCode(key_code, key_location); + /* Ignore repeating presses */ + if ( key_states[key_code_mapped] == state ) + repeat = true; + key_states[key_code_mapped] = state; + int key_int_char = character & 0xffff; + putKeyboardEvent(key_code_mapped, state, key_int_char, nanos, repeat); + } + + private int getMappedKeyCode(int key_code, int position) { + // manually map positioned keys + switch (key_code) { + case KeyEvent.VK_ALT: // fall through + if (position == KeyEvent.KEY_LOCATION_RIGHT) + return Keyboard.KEY_RMENU; + else + return Keyboard.KEY_LMENU; + case KeyEvent.VK_META: + if (position == KeyEvent.KEY_LOCATION_RIGHT) + return Keyboard.KEY_RMETA; + else + return Keyboard.KEY_LMETA; + case KeyEvent.VK_SHIFT: + if (position == KeyEvent.KEY_LOCATION_RIGHT) + return Keyboard.KEY_RSHIFT; + else + return Keyboard.KEY_LSHIFT; + case KeyEvent.VK_CONTROL: + if (position == KeyEvent.KEY_LOCATION_RIGHT) + return Keyboard.KEY_RCONTROL; + else + return Keyboard.KEY_LCONTROL; + default: + return KEY_MAP[key_code]; + } + } + + public void keyPressed(KeyEvent e) { + handleKey(e.getKeyCode(), e.getKeyLocation(), (byte)1, e.getKeyChar(), e.getWhen()*1000000); + } + + public void keyReleased(KeyEvent e) { + handleKey(e.getKeyCode(), e.getKeyLocation(), (byte)0, Keyboard.CHAR_NONE, e.getWhen()*1000000); + } + + public void keyTyped(KeyEvent e) { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxAWTGLCanvasPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxAWTGLCanvasPeerInfo.java new file mode 100644 index 0000000..61e545b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxAWTGLCanvasPeerInfo.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import java.awt.Canvas; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxAWTGLCanvasPeerInfo extends LinuxPeerInfo { + private final Canvas component; + private final AWTSurfaceLock awt_surface = new AWTSurfaceLock(); + private int screen = -1; + + LinuxAWTGLCanvasPeerInfo(Canvas component) { + this.component = component; + } + + protected void doLockAndInitHandle() throws LWJGLException { + ByteBuffer surface_handle = awt_surface.lockAndGetHandle(component); + if (screen == -1) { + try { + screen = getScreenFromSurfaceInfo(surface_handle); + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while trying to determine screen: " + e); + screen = 0; + } + } + nInitHandle(screen, surface_handle, getHandle()); + } + private static native int getScreenFromSurfaceInfo(ByteBuffer surface_handle) throws LWJGLException; + private static native void nInitHandle(int screen, ByteBuffer surface_buffer, ByteBuffer peer_info_handle) throws LWJGLException; + + protected void doUnlock() throws LWJGLException { + awt_surface.unlock(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxCanvasImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxCanvasImplementation.java new file mode 100644 index 0000000..0514bf2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxCanvasImplementation.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Canvas; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedExceptionAction; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxCanvasImplementation implements AWTCanvasImplementation { + static int getScreenFromDevice(final GraphicsDevice device) throws LWJGLException { + try { + Method getScreen_method = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() { + public Method run() throws Exception { + return device.getClass().getMethod("getScreen"); + } + }); + Integer screen = (Integer)getScreen_method.invoke(device); + return screen; + } catch (Exception e) { + throw new LWJGLException(e); + } + } + + private static int getVisualIDFromConfiguration(final GraphicsConfiguration configuration) throws LWJGLException { + try { + Method getVisual_method = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>() { + public Method run() throws Exception { + return configuration.getClass().getMethod("getVisual"); + } + }); + Integer visual = (Integer)getVisual_method.invoke(configuration); + return visual; + } catch (Exception e) { + throw new LWJGLException(e); + } + } + + public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + return new LinuxAWTGLCanvasPeerInfo(component); + } + + /** + * Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat. + * + * @return The GraphicsConfiguration corresponding to a visual that matches the pixel format. + */ + public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException { + try { + int screen = getScreenFromDevice(device); + int visual_id_matching_format = findVisualIDFromFormat(screen, pixel_format); + GraphicsConfiguration[] configurations = device.getConfigurations(); + for ( GraphicsConfiguration configuration : configurations ) { + int visual_id = getVisualIDFromConfiguration(configuration); + if ( visual_id == visual_id_matching_format ) + return configuration; + } + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while trying to determine configuration: " + e); + } + return null; // In case we failed to locate the visual, or if we're not on a SUN JDK + } + + private static int findVisualIDFromFormat(int screen, PixelFormat pixel_format) throws LWJGLException { + try { + LinuxDisplay.lockAWT(); + try { + GLContext.loadOpenGLLibrary(); + try { + LinuxDisplay.incDisplay(); + return nFindVisualIDFromFormat(LinuxDisplay.getDisplay(), screen, pixel_format); + } finally { + LinuxDisplay.decDisplay(); + } + } finally { + GLContext.unloadOpenGLLibrary(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + private static native int nFindVisualIDFromFormat(long display, int screen, PixelFormat pixel_format) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextAttribs.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextAttribs.java new file mode 100644 index 0000000..af3b8ef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextAttribs.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * An implementation of ContextAttribs using GLX_create_context. + * + * @author spasi <spasi@users.sourceforge.net> + */ +final class LinuxContextAttribs implements ContextAttribsImplementation { + + private static final int GLX_CONTEXT_MAJOR_VERSION_ARB = 0x2091; + private static final int GLX_CONTEXT_MINOR_VERSION_ARB = 0x2092; + private static final int GLX_CONTEXT_FLAGS_ARB = 0x2094; + private static final int GLX_CONTEXT_PROFILE_MASK_ARB = 0x9126; + + private static final int GLX_CONTEXT_DEBUG_BIT_ARB = 0x0001; + private static final int GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002; + + private static final int GLX_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001; + private static final int GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002; + + LinuxContextAttribs() { + } + + public int getMajorVersionAttrib() { + return GLX_CONTEXT_MAJOR_VERSION_ARB; + } + + public int getMinorVersionAttrib() { + return GLX_CONTEXT_MINOR_VERSION_ARB; + } + + public int getLayerPlaneAttrib() { + throw new UnsupportedOperationException(); + } + + public int getFlagsAttrib() { + return GLX_CONTEXT_FLAGS_ARB; + } + + public int getDebugBit() { + return GLX_CONTEXT_DEBUG_BIT_ARB; + } + + public int getForwardCompatibleBit() { + return GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; + } + + public int getProfileMaskAttrib() { + return GLX_CONTEXT_PROFILE_MASK_ARB; + } + + public int getProfileCoreBit() { + return GLX_CONTEXT_CORE_PROFILE_BIT_ARB; + } + + public int getProfileCompatibilityBit() { + return GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextImplementation.java new file mode 100644 index 0000000..4f1f9a6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxContextImplementation.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxContextImplementation implements ContextImplementation { + + public ByteBuffer create(PeerInfo peer_info, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + return nCreate(peer_handle, attribs, shared_context_handle); + } finally { + peer_info.unlock(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + + private static native ByteBuffer nCreate(ByteBuffer peer_handle, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException; + + native long getGLXContext(ByteBuffer context_handle); + + native long getDisplay(ByteBuffer peer_info_handle); + + public void releaseDrawable(ByteBuffer context_handle) throws LWJGLException { + } + + public void swapBuffers() throws LWJGLException { + ContextGL current_context = ContextGL.getCurrentContext(); + if ( current_context == null ) + throw new IllegalStateException("No context is current"); + synchronized ( current_context ) { + PeerInfo current_peer_info = current_context.getPeerInfo(); + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = current_peer_info.lockAndGetHandle(); + try { + nSwapBuffers(peer_handle); + } finally { + current_peer_info.unlock(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + } + + private static native void nSwapBuffers(ByteBuffer peer_info_handle) throws LWJGLException; + + public void releaseCurrentContext() throws LWJGLException { + ContextGL current_context = ContextGL.getCurrentContext(); + if ( current_context == null ) + throw new IllegalStateException("No context is current"); + synchronized ( current_context ) { + PeerInfo current_peer_info = current_context.getPeerInfo(); + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = current_peer_info.lockAndGetHandle(); + try { + nReleaseCurrentContext(peer_handle); + } finally { + current_peer_info.unlock(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + } + + private static native void nReleaseCurrentContext(ByteBuffer peer_info_handle) throws LWJGLException; + + public void update(ByteBuffer context_handle) { + } + + public void makeCurrent(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + nMakeCurrent(peer_handle, handle); + } finally { + peer_info.unlock(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + + private static native void nMakeCurrent(ByteBuffer peer_handle, ByteBuffer context_handle) throws LWJGLException; + + public boolean isCurrent(ByteBuffer handle) throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + boolean result = nIsCurrent(handle); + return result; + } finally { + LinuxDisplay.unlockAWT(); + } + } + + private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; + + public void setSwapInterval(int value) { + ContextGL current_context = ContextGL.getCurrentContext(); + PeerInfo peer_info = current_context.getPeerInfo(); + + if ( current_context == null ) + throw new IllegalStateException("No context is current"); + synchronized ( current_context ) { + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + nSetSwapInterval(peer_handle, current_context.getHandle(), value); + } finally { + peer_info.unlock(); + } + } catch (LWJGLException e) { + // API CHANGE - this methods should throw LWJGLException + e.printStackTrace(); + } finally { + LinuxDisplay.unlockAWT(); + } + } + } + + private static native void nSetSwapInterval(ByteBuffer peer_handle, ByteBuffer context_handle, int value); + + public void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + nDestroy(peer_handle, handle); + } finally { + peer_info.unlock(); + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + + private static native void nDestroy(ByteBuffer peer_handle, ByteBuffer context_handle) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplay.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplay.java new file mode 100644 index 0000000..a5b6a58 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplay.java @@ -0,0 +1,1653 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Display implementation interface. Display delegates + * to implementors of this interface. There is one DisplayImplementation + * for each supported platform. + * @author elias_naur + */ + +import java.awt.Canvas; +import java.awt.event.FocusListener; +import java.awt.event.FocusEvent; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.ByteOrder; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.lang.reflect.InvocationTargetException; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.opengl.XRandR.Screen; +import org.lwjgl.opengles.EGL; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.List; + +final class LinuxDisplay implements DisplayImplementation { + /* X11 constants */ + public static final int CurrentTime = 0; + public static final int GrabSuccess = 0; + public static final int AutoRepeatModeOff = 0; + public static final int AutoRepeatModeOn = 1; + public static final int AutoRepeatModeDefault = 2; + public static final int None = 0; + + private static final int KeyPressMask = 1 << 0; + private static final int KeyReleaseMask = 1 << 1; + private static final int ButtonPressMask = 1 << 2; + private static final int ButtonReleaseMask = 1 << 3; + + private static final int NotifyAncestor = 0; + private static final int NotifyNonlinear = 3; + private static final int NotifyPointer = 5; + private static final int NotifyPointerRoot = 6; + private static final int NotifyDetailNone = 7; + + private static final int SetModeInsert = 0; + private static final int SaveSetRoot = 1; + private static final int SaveSetUnmap = 1; + + private static final int X_SetInputFocus = 42; + + /** Window mode enum */ + private static final int FULLSCREEN_LEGACY = 1; + private static final int FULLSCREEN_NETWM = 2; + private static final int WINDOWED = 3; + + /** Current window mode */ + private static int current_window_mode = WINDOWED; + + /** Display mode switching API */ + private static final int XRANDR = 10; + private static final int XF86VIDMODE = 11; + private static final int NONE = 12; + + /** Current X11 Display pointer */ + private static long display; + private static long current_window; + private static long saved_error_handler; + + private static int display_connection_usage_count; + + /** Event buffer */ + private final LinuxEvent event_buffer = new LinuxEvent(); + private final LinuxEvent tmp_event_buffer = new LinuxEvent(); + + /** Current mode swithcing API */ + private int current_displaymode_extension = NONE; + + /** Atom used for the pointer warp messages */ + private long delete_atom; + + private PeerInfo peer_info; + + /** Saved gamma used to restore display settings */ + private ByteBuffer saved_gamma; + private ByteBuffer current_gamma; + + /** Saved mode to restore with */ + private DisplayMode saved_mode; + private DisplayMode current_mode; + + private Screen[] savedXrandrConfig; + + private boolean keyboard_grabbed; + private boolean pointer_grabbed; + private boolean input_released; + private boolean grab; + private boolean focused; + private boolean minimized; + private boolean dirty; + private boolean close_requested; + private long current_cursor; + private long blank_cursor; + private boolean mouseInside = true; + private boolean resizable; + private boolean resized; + + private int window_x; + private int window_y; + private int window_width; + private int window_height; + + private Canvas parent; + private long parent_window; + private static boolean xembedded; + private long parent_proxy_focus_window; + private boolean parent_focused; + private boolean parent_focus_changed; + private long last_window_focus = 0; + + private LinuxKeyboard keyboard; + private LinuxMouse mouse; + + private String wm_class; + + private final FocusListener focus_listener = new FocusListener() { + public void focusGained(FocusEvent e) { + synchronized (GlobalLock.lock) { + parent_focused = true; + parent_focus_changed = true; + } + } + public void focusLost(FocusEvent e) { + synchronized (GlobalLock.lock) { + parent_focused = false; + parent_focus_changed = true; + } + } + }; + + private static ByteBuffer getCurrentGammaRamp() throws LWJGLException { + lockAWT(); + try { + incDisplay(); + try { + if (isXF86VidModeSupported()) + return nGetCurrentGammaRamp(getDisplay(), getDefaultScreen()); + else + return null; + } finally { + decDisplay(); + } + } finally { + unlockAWT(); + } + } + private static native ByteBuffer nGetCurrentGammaRamp(long display, int screen) throws LWJGLException; + + private static int getBestDisplayModeExtension() { + int result; + if (isXrandrSupported()) { + LWJGLUtil.log("Using Xrandr for display mode switching"); + result = XRANDR; + } else if (isXF86VidModeSupported()) { + LWJGLUtil.log("Using XF86VidMode for display mode switching"); + result = XF86VIDMODE; + } else { + LWJGLUtil.log("No display mode extensions available"); + result = NONE; + } + return result; + } + + private static boolean isXrandrSupported() { + if (Display.getPrivilegedBoolean("LWJGL_DISABLE_XRANDR")) + return false; + lockAWT(); + try { + incDisplay(); + try { + return nIsXrandrSupported(getDisplay()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while querying Xrandr support: " + e); + return false; + } finally { + unlockAWT(); + } + } + private static native boolean nIsXrandrSupported(long display) throws LWJGLException; + + private static boolean isXF86VidModeSupported() { + lockAWT(); + try { + incDisplay(); + try { + return nIsXF86VidModeSupported(getDisplay()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while querying XF86VM support: " + e); + return false; + } finally { + unlockAWT(); + } + } + private static native boolean nIsXF86VidModeSupported(long display) throws LWJGLException; + + private static boolean isNetWMFullscreenSupported() throws LWJGLException { + if (Display.getPrivilegedBoolean("LWJGL_DISABLE_NETWM")) + return false; + lockAWT(); + try { + incDisplay(); + try { + return nIsNetWMFullscreenSupported(getDisplay(), getDefaultScreen()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while querying NetWM support: " + e); + return false; + } finally { + unlockAWT(); + } + } + private static native boolean nIsNetWMFullscreenSupported(long display, int screen) throws LWJGLException; + + /* Since Xlib is not guaranteed to be thread safe, we need a way to synchronize LWJGL + * Xlib calls with AWT Xlib calls. Fortunately, JAWT implements Lock()/Unlock() to + * do just that. + */ + static void lockAWT() { + try { + nLockAWT(); + } catch (LWJGLException e) { + LWJGLUtil.log("Caught exception while locking AWT: " + e); + } + } + private static native void nLockAWT() throws LWJGLException; + + static void unlockAWT() { + try { + nUnlockAWT(); + } catch (LWJGLException e) { + LWJGLUtil.log("Caught exception while unlocking AWT: " + e); + } + } + private static native void nUnlockAWT() throws LWJGLException; + + /** + * increment and decrement display usage. + */ + static void incDisplay() throws LWJGLException { + if (display_connection_usage_count == 0) { + try { + // TODO: Can we know if we're on desktop or ES? + GLContext.loadOpenGLLibrary(); + org.lwjgl.opengles.GLContext.loadOpenGLLibrary(); + } catch (Throwable t) { + } + saved_error_handler = setErrorHandler(); + display = openDisplay(); +// synchronize(display, true); + } + display_connection_usage_count++; + } + private static native int callErrorHandler(long handler, long display, long error_ptr); + private static native long setErrorHandler(); + private static native long resetErrorHandler(long handler); + private static native void synchronize(long display, boolean synchronize); + + private static int globalErrorHandler(long display, long event_ptr, long error_display, long serial, long error_code, long request_code, long minor_code) throws LWJGLException { + if (xembedded && request_code == X_SetInputFocus) return 0; // ignore X error in xembeded mode to fix a browser issue when dragging or switching tabs + + if (display == getDisplay()) { + String error_msg = getErrorText(display, error_code); + throw new LWJGLException("X Error - disp: 0x" + Long.toHexString(error_display) + " serial: " + serial + " error: " + error_msg + " request_code: " + request_code + " minor_code: " + minor_code); + } else if (saved_error_handler != 0) + return callErrorHandler(saved_error_handler, display, event_ptr); + return 0; + } + private static native String getErrorText(long display, long error_code); + + static void decDisplay() { + /* + * Some drivers (at least some versions of the radeon dri driver) + * don't like it when the display is closed and later re-opened, + * so we'll just let the singleton display connection leak. + */ +/* display_connection_usage_count--; + if (display_connection_usage_count < 0) + throw new InternalError("display_connection_usage_count < 0: " + display_connection_usage_count); + if (display_connection_usage_count == 0) { + closeDisplay(display); + resetErrorHandler(saved_error_handler); + display = 0; + GLContext.unloadOpenGLLibrary(); + }*/ + } + + static native long openDisplay() throws LWJGLException; + static native void closeDisplay(long display); + + private int getWindowMode(boolean fullscreen) throws LWJGLException { + if (fullscreen) { + if (current_displaymode_extension == XRANDR && isNetWMFullscreenSupported()) { + LWJGLUtil.log("Using NetWM for fullscreen window"); + return FULLSCREEN_NETWM; + } else { + LWJGLUtil.log("Using legacy mode for fullscreen window"); + return FULLSCREEN_LEGACY; + } + } else + return WINDOWED; + } + + static long getDisplay() { + if (display_connection_usage_count <= 0) + throw new InternalError("display_connection_usage_count = " + display_connection_usage_count); + return display; + } + + static int getDefaultScreen() { + return nGetDefaultScreen(getDisplay()); + } + static native int nGetDefaultScreen(long display); + + static long getWindow() { + return current_window; + } + + private void ungrabKeyboard() { + if (keyboard_grabbed) { + nUngrabKeyboard(getDisplay()); + keyboard_grabbed = false; + } + } + static native int nUngrabKeyboard(long display); + + private void grabKeyboard() { + if (!keyboard_grabbed) { + int res = nGrabKeyboard(getDisplay(), getWindow()); + if (res == GrabSuccess) + keyboard_grabbed = true; + } + } + static native int nGrabKeyboard(long display, long window); + + private void grabPointer() { + if (!pointer_grabbed) { + int result = nGrabPointer(getDisplay(), getWindow(), None); + if (result == GrabSuccess) { + pointer_grabbed = true; + // make sure we have a centered window + if (isLegacyFullscreen()) { + nSetViewPort(getDisplay(), getWindow(), getDefaultScreen()); + } + } + } + } + static native int nGrabPointer(long display, long window, long cursor); + private static native void nSetViewPort(long display, long window, int screen); + + private void ungrabPointer() { + if (pointer_grabbed) { + pointer_grabbed = false; + nUngrabPointer(getDisplay()); + } + } + static native int nUngrabPointer(long display); + + private static boolean isFullscreen() { + return current_window_mode == FULLSCREEN_LEGACY || current_window_mode == FULLSCREEN_NETWM; + } + + private boolean shouldGrab() { + return !input_released && grab && mouse != null; + } + + private void updatePointerGrab() { + if (isFullscreen() || shouldGrab()) { + grabPointer(); + } else { + ungrabPointer(); + } + updateCursor(); + } + + private void updateCursor() { + long cursor; + if (shouldGrab()) { + cursor = blank_cursor; + } else { + cursor = current_cursor; + } + nDefineCursor(getDisplay(), getWindow(), cursor); + } + private static native void nDefineCursor(long display, long window, long cursor_handle); + + private static boolean isLegacyFullscreen() { + return current_window_mode == FULLSCREEN_LEGACY; + } + + private void updateKeyboardGrab() { + if (isLegacyFullscreen()) + grabKeyboard(); + else + ungrabKeyboard(); + } + + public void createWindow(final DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException { + lockAWT(); + try { + incDisplay(); + try { + if ( drawable instanceof DrawableGLES ) + peer_info = new LinuxDisplayPeerInfo(); + + ByteBuffer handle = peer_info.lockAndGetHandle(); + try { + current_window_mode = getWindowMode(Display.isFullscreen()); + + // Try to enable Lecagy FullScreen Support in Compiz, else + // we may have trouble with stuff overlapping our fullscreen window. + if ( current_window_mode != WINDOWED ) + Compiz.setLegacyFullscreenSupport(true); + + // Setting _MOTIF_WM_HINTS in fullscreen mode is problematic for certain window + // managers. We do not set MWM_HINTS_DECORATIONS in fullscreen mode anymore, + // unless org.lwjgl.opengl.Window.undecorated_fs has been specified. + // See native/linux/org_lwjgl_opengl_Display.c, createWindow function. + boolean undecorated = Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.undecorated") || (current_window_mode != WINDOWED && Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.undecorated_fs")); + + this.parent = parent; + parent_window = parent != null ? getHandle(parent) : getRootWindow(getDisplay(), getDefaultScreen()); + resizable = Display.isResizable(); + resized = false; + window_x = x; + window_y = y; + window_width = mode.getWidth(); + window_height = mode.getHeight(); + + current_window = nCreateWindow(getDisplay(), getDefaultScreen(), handle, mode, current_window_mode, x, y, undecorated, parent_window, resizable); + + // Set the WM_CLASS hint which is needed by some WM's e.g. Gnome Shell + wm_class = Display.getPrivilegedString("LWJGL_WM_CLASS"); + if (wm_class == null) wm_class = Display.getTitle(); + setClassHint(Display.getTitle(), wm_class); + + mapRaised(getDisplay(), current_window); + xembedded = parent != null && isAncestorXEmbedded(parent_window); + blank_cursor = createBlankCursor(); + current_cursor = None; + focused = false; + input_released = false; + pointer_grabbed = false; + keyboard_grabbed = false; + close_requested = false; + grab = false; + minimized = false; + dirty = true; + + if ( drawable instanceof DrawableGLES ) + ((DrawableGLES)drawable).initialize(current_window, getDisplay(), EGL.EGL_WINDOW_BIT, (org.lwjgl.opengles.PixelFormat)drawable.getPixelFormat()); + + if (parent != null) { + parent.addFocusListener(focus_listener); + parent_focused = parent.isFocusOwner(); + parent_focus_changed = true; + } + } finally { + peer_info.unlock(); + } + } catch (LWJGLException e) { + decDisplay(); + throw e; + } + } finally { + unlockAWT(); + } + } + private static native long nCreateWindow(long display, int screen, ByteBuffer peer_info_handle, DisplayMode mode, int window_mode, int x, int y, boolean undecorated, long parent_handle, boolean resizable) throws LWJGLException; + private static native long getRootWindow(long display, int screen); + private static native boolean hasProperty(long display, long window, long property); + private static native long getParentWindow(long display, long window) throws LWJGLException; + private static native int getChildCount(long display, long window) throws LWJGLException; + private static native void mapRaised(long display, long window); + private static native void reparentWindow(long display, long window, long parent, int x, int y); + private static native long nGetInputFocus(long display) throws LWJGLException; + private static native void nSetInputFocus(long display, long window, long time); + private static native void nSetWindowSize(long display, long window, int width, int height, boolean resizable); + private static native int nGetX(long display, long window); + private static native int nGetY(long display, long window); + private static native int nGetWidth(long display, long window); + private static native int nGetHeight(long display, long window); + + private static boolean isAncestorXEmbedded(long window) throws LWJGLException { + long xembed_atom = internAtom("_XEMBED_INFO", true); + if (xembed_atom != None) { + long w = window; + while (w != None) { + if (hasProperty(getDisplay(), w, xembed_atom)) + return true; + w = getParentWindow(getDisplay(), w); + } + } + return false; + } + + private static long getHandle(Canvas parent) throws LWJGLException { + AWTCanvasImplementation awt_impl = AWTGLCanvas.createImplementation(); + LinuxPeerInfo parent_peer_info = (LinuxPeerInfo)awt_impl.createPeerInfo(parent, null, null); + ByteBuffer parent_peer_info_handle = parent_peer_info.lockAndGetHandle(); + try { + return parent_peer_info.getDrawable(); + } finally { + parent_peer_info.unlock(); + } + } + + private void updateInputGrab() { + updatePointerGrab(); + updateKeyboardGrab(); + } + + public void destroyWindow() { + lockAWT(); + try { + if (parent != null) { + parent.removeFocusListener(focus_listener); + } + try { + setNativeCursor(null); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to reset cursor: " + e.getMessage()); + } + nDestroyCursor(getDisplay(), blank_cursor); + blank_cursor = None; + ungrabKeyboard(); + nDestroyWindow(getDisplay(), getWindow()); + decDisplay(); + + if ( current_window_mode != WINDOWED ) + Compiz.setLegacyFullscreenSupport(false); + } finally { + unlockAWT(); + } + } + static native void nDestroyWindow(long display, long window); + + public void switchDisplayMode(DisplayMode mode) throws LWJGLException { + lockAWT(); + try { + switchDisplayModeOnTmpDisplay(mode); + current_mode = mode; + } finally { + unlockAWT(); + } + } + + private void switchDisplayModeOnTmpDisplay(DisplayMode mode) throws LWJGLException { + incDisplay(); + try { + nSwitchDisplayMode(getDisplay(), getDefaultScreen(), current_displaymode_extension, mode); + } finally { + decDisplay(); + } + } + private static native void nSwitchDisplayMode(long display, int screen, int extension, DisplayMode mode) throws LWJGLException; + + private static long internAtom(String atom_name, boolean only_if_exists) throws LWJGLException { + incDisplay(); + try { + return nInternAtom(getDisplay(), atom_name, only_if_exists); + } finally { + decDisplay(); + } + } + static native long nInternAtom(long display, String atom_name, boolean only_if_exists); + + public void resetDisplayMode() { + lockAWT(); + try { + if( current_displaymode_extension == XRANDR && savedXrandrConfig.length > 0 ) + { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + XRandR.setConfiguration( savedXrandrConfig ); + return null; + } + }); + } + else + { + switchDisplayMode(saved_mode); + } + if (isXF86VidModeSupported()) + doSetGamma(saved_gamma); + + Compiz.setLegacyFullscreenSupport(false); + } catch (LWJGLException e) { + LWJGLUtil.log("Caught exception while resetting mode: " + e); + } finally { + unlockAWT(); + } + } + + public int getGammaRampLength() { + if (!isXF86VidModeSupported()) + return 0; + lockAWT(); + try { + try { + incDisplay(); + try { + return nGetGammaRampLength(getDisplay(), getDefaultScreen()); + } catch (LWJGLException e) { + LWJGLUtil.log("Got exception while querying gamma length: " + e); + return 0; + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to get gamma ramp length: " + e); + return 0; + } + } finally { + unlockAWT(); + } + } + private static native int nGetGammaRampLength(long display, int screen) throws LWJGLException; + + public void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException { + if (!isXF86VidModeSupported()) + throw new LWJGLException("No gamma ramp support (Missing XF86VM extension)"); + doSetGamma(convertToNativeRamp(gammaRamp)); + } + + private void doSetGamma(ByteBuffer native_gamma) throws LWJGLException { + lockAWT(); + try { + setGammaRampOnTmpDisplay(native_gamma); + current_gamma = native_gamma; + } finally { + unlockAWT(); + } + } + + private static void setGammaRampOnTmpDisplay(ByteBuffer native_gamma) throws LWJGLException { + incDisplay(); + try { + nSetGammaRamp(getDisplay(), getDefaultScreen(), native_gamma); + } finally { + decDisplay(); + } + } + private static native void nSetGammaRamp(long display, int screen, ByteBuffer gammaRamp) throws LWJGLException; + + private static ByteBuffer convertToNativeRamp(FloatBuffer ramp) throws LWJGLException { + return nConvertToNativeRamp(ramp, ramp.position(), ramp.remaining()); + } + private static native ByteBuffer nConvertToNativeRamp(FloatBuffer ramp, int offset, int length) throws LWJGLException; + + public String getAdapter() { + return null; + } + + public String getVersion() { + return null; + } + + public DisplayMode init() throws LWJGLException { + lockAWT(); + try { + Compiz.init(); + + delete_atom = internAtom("WM_DELETE_WINDOW", false); + current_displaymode_extension = getBestDisplayModeExtension(); + if (current_displaymode_extension == NONE) + throw new LWJGLException("No display mode extension is available"); + DisplayMode[] modes = getAvailableDisplayModes(); + if (modes == null || modes.length == 0) + throw new LWJGLException("No modes available"); + switch (current_displaymode_extension) { + case XRANDR: + savedXrandrConfig = AccessController.doPrivileged(new PrivilegedAction<Screen[]>() { + public Screen[] run() { + return XRandR.getConfiguration(); + } + }); + saved_mode = getCurrentXRandrMode(); + break; + case XF86VIDMODE: + saved_mode = modes[0]; + break; + default: + throw new LWJGLException("Unknown display mode extension: " + current_displaymode_extension); + } + current_mode = saved_mode; + saved_gamma = getCurrentGammaRamp(); + current_gamma = saved_gamma; + return saved_mode; + } finally { + unlockAWT(); + } + } + + private static DisplayMode getCurrentXRandrMode() throws LWJGLException { + lockAWT(); + try { + incDisplay(); + try { + return nGetCurrentXRandrMode(getDisplay(), getDefaultScreen()); + } finally { + decDisplay(); + } + } finally { + unlockAWT(); + } + } + + /** Assumes extension == XRANDR */ + private static native DisplayMode nGetCurrentXRandrMode(long display, int screen) throws LWJGLException; + + public void setTitle(String title) { + lockAWT(); + try { + final ByteBuffer titleText = MemoryUtil.encodeUTF8(title); + nSetTitle(getDisplay(), getWindow(), MemoryUtil.getAddress(titleText), titleText.remaining() - 1); + } finally { + unlockAWT(); + } + + // also update the class hint value as some WM's use it for the window title + if (Display.isCreated()) setClassHint(title, wm_class); + } + private static native void nSetTitle(long display, long window, long title, int len); + + /** the WM_CLASS hint is needed by some WM's e.g. gnome shell */ + private void setClassHint(String wm_name, String wm_class) { + lockAWT(); + try { + final ByteBuffer nameText = MemoryUtil.encodeUTF8(wm_name); + final ByteBuffer classText = MemoryUtil.encodeUTF8(wm_class); + + nSetClassHint(getDisplay(), getWindow(), MemoryUtil.getAddress(nameText), MemoryUtil.getAddress(classText)); + } finally { + unlockAWT(); + } + } + private static native void nSetClassHint(long display, long window, long wm_name, long wm_class); + + public boolean isCloseRequested() { + boolean result = close_requested; + close_requested = false; + return result; + } + + public boolean isVisible() { + return !minimized; + } + + public boolean isActive() { + return focused || isLegacyFullscreen(); + } + + public boolean isDirty() { + boolean result = dirty; + dirty = false; + return result; + } + + public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + peer_info = new LinuxDisplayPeerInfo(pixel_format); + return peer_info; + } + + private void relayEventToParent(LinuxEvent event_buffer, int event_mask) { + tmp_event_buffer.copyFrom(event_buffer); + tmp_event_buffer.setWindow(parent_window); + tmp_event_buffer.sendEvent(getDisplay(), parent_window, true, event_mask); + } + + private void relayEventToParent(LinuxEvent event_buffer) { + if (parent == null) + return; + switch (event_buffer.getType()) { + case LinuxEvent.KeyPress: + relayEventToParent(event_buffer, KeyPressMask); + break; + case LinuxEvent.KeyRelease: + relayEventToParent(event_buffer, KeyPressMask); + break; + case LinuxEvent.ButtonPress: + if (xembedded || !focused) relayEventToParent(event_buffer, KeyPressMask); + break; + case LinuxEvent.ButtonRelease: + if (xembedded || !focused) relayEventToParent(event_buffer, KeyPressMask); + break; + default: + break; + } + } + + private void processEvents() { + while (LinuxEvent.getPending(getDisplay()) > 0) { + event_buffer.nextEvent(getDisplay()); + long event_window = event_buffer.getWindow(); + relayEventToParent(event_buffer); + if (event_window != getWindow() || event_buffer.filterEvent(event_window) || + (mouse != null && mouse.filterEvent(grab, shouldWarpPointer(), event_buffer)) || + (keyboard != null && keyboard.filterEvent(event_buffer))) + continue; + switch (event_buffer.getType()) { + case LinuxEvent.FocusIn: + setFocused(true, event_buffer.getFocusDetail()); + break; + case LinuxEvent.FocusOut: + setFocused(false, event_buffer.getFocusDetail()); + break; + case LinuxEvent.ClientMessage: + if ((event_buffer.getClientFormat() == 32) && (event_buffer.getClientData(0) == delete_atom)) + close_requested = true; + break; + case LinuxEvent.MapNotify: + dirty = true; + minimized = false; + break; + case LinuxEvent.UnmapNotify: + dirty = true; + minimized = true; + break; + case LinuxEvent.Expose: + dirty = true; + break; + case LinuxEvent.ConfigureNotify: + int x = nGetX(getDisplay(), getWindow()); + int y = nGetY(getDisplay(), getWindow()); + + int width = nGetWidth(getDisplay(), getWindow()); + int height = nGetHeight(getDisplay(), getWindow()); + + window_x = x; + window_y = y; + + if (window_width != width || window_height != height) { + resized = true; + window_width = width; + window_height = height; + } + + break; + case LinuxEvent.EnterNotify: + mouseInside = true; + break; + case LinuxEvent.LeaveNotify: + mouseInside = false; + break; + default: + break; + } + } + } + + public void update() { + lockAWT(); + try { + processEvents(); + checkInput(); + } finally { + unlockAWT(); + } + } + + public void reshape(int x, int y, int width, int height) { + lockAWT(); + try { + nReshape(getDisplay(), getWindow(), x, y, width, height); + } finally { + unlockAWT(); + } + } + private static native void nReshape(long display, long window, int x, int y, int width, int height); + + public DisplayMode[] getAvailableDisplayModes() throws LWJGLException { + lockAWT(); + try { + incDisplay(); + try { + DisplayMode[] modes = nGetAvailableDisplayModes(getDisplay(), getDefaultScreen(), current_displaymode_extension); + return modes; + } finally { + decDisplay(); + } + } finally { + unlockAWT(); + } + } + private static native DisplayMode[] nGetAvailableDisplayModes(long display, int screen, int extension) throws LWJGLException; + + /* Mouse */ + public boolean hasWheel() { + return true; + } + + public int getButtonCount() { + return mouse.getButtonCount(); + } + + public void createMouse() throws LWJGLException { + lockAWT(); + try { + mouse = new LinuxMouse(getDisplay(), getWindow(), getWindow()); + } finally { + unlockAWT(); + } + } + + public void destroyMouse() { + mouse = null; + updateInputGrab(); + } + + public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons) { + lockAWT(); + try { + mouse.poll(grab, coord_buffer, buttons); + } finally { + unlockAWT(); + } + } + + public void readMouse(ByteBuffer buffer) { + lockAWT(); + try { + mouse.read(buffer); + } finally { + unlockAWT(); + } + } + + public void setCursorPosition(int x, int y) { + lockAWT(); + try { + mouse.setCursorPosition(x, y); + } finally { + unlockAWT(); + } + } + + private void checkInput() { + if (parent == null) return; + + if (xembedded) { + long current_focus_window = 0; + + if (last_window_focus != current_focus_window || parent_focused != focused) { + if (isParentWindowActive(current_focus_window)) { + if (parent_focused) { + nSetInputFocus(getDisplay(), current_window, CurrentTime); + last_window_focus = current_window; + focused = true; + } + else { + // return focus to the parent proxy focus window + nSetInputFocus(getDisplay(), parent_proxy_focus_window, CurrentTime); + last_window_focus = parent_proxy_focus_window; + focused = false; + } + } + else { + last_window_focus = current_focus_window; + focused = false; + } + } + } + else { + if (parent_focus_changed && parent_focused) { + setInputFocusUnsafe(getWindow()); + parent_focus_changed = false; + } + } + } + + private void setInputFocusUnsafe(long window) { + try { + nSetInputFocus(getDisplay(), window, CurrentTime); + nSync(getDisplay(), false); + } catch (LWJGLException e) { + // Since we don't have any event timings for XSetInputFocus, a race condition might give a BadMatch, which we'll catch and ignore + LWJGLUtil.log("Got exception while trying to focus: " + e); + } + } + + private static native void nSync(long display, boolean throw_away_events) throws LWJGLException; + + /** + * This method will check if the parent window is active when running + * in xembed mode. Every xembed embedder window has a focus proxy + * window that recieves all the input. This method will test whether + * the provided window handle is the focus proxy, if so it will get its + * parent window and then test whether this is an ancestor to our + * current_window. If so then parent window is active. + * + * @param window - the window handle to test + */ + private boolean isParentWindowActive(long window) { + try { + // parent window already active as window is current_window + if (window == current_window) return true; + + // xembed focus proxy will have no children + if (getChildCount(getDisplay(), window) != 0) return false; + + // get parent, will be xembed embedder window and ancestor of current_window + long parent_window = getParentWindow(getDisplay(), window); + + // parent must not be None + if (parent_window == None) return false; + + // scroll current_window's ancestors to find parent_window + long w = current_window; + + while (w != None) { + w = getParentWindow(getDisplay(), w); + if (w == parent_window) { + parent_proxy_focus_window = window; // save focus proxy window + return true; + } + } + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to detect if parent window is active: " + e.getMessage()); + return true; // on failure assume still active + } + + return false; // failed to find an active parent window + } + + private void setFocused(boolean got_focus, int focus_detail) { + if (focused == got_focus || focus_detail == NotifyDetailNone || focus_detail == NotifyPointer || focus_detail == NotifyPointerRoot || xembedded) + return; + focused = got_focus; + + if (focused) { + acquireInput(); + } + else { + releaseInput(); + } + } + + private void releaseInput() { + if (isLegacyFullscreen() || input_released) + return; + input_released = true; + updateInputGrab(); + if (current_window_mode == FULLSCREEN_NETWM) { + nIconifyWindow(getDisplay(), getWindow(), getDefaultScreen()); + try { + if( current_displaymode_extension == XRANDR && savedXrandrConfig.length > 0 ) + { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + XRandR.setConfiguration( savedXrandrConfig ); + return null; + } + }); + } + else + { + switchDisplayModeOnTmpDisplay(saved_mode); + } + setGammaRampOnTmpDisplay(saved_gamma); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to restore saved mode: " + e.getMessage()); + } + } + } + private static native void nIconifyWindow(long display, long window, int screen); + + private void acquireInput() { + if (isLegacyFullscreen() || !input_released) + return; + input_released = false; + updateInputGrab(); + if (current_window_mode == FULLSCREEN_NETWM) { + try { + switchDisplayModeOnTmpDisplay(current_mode); + setGammaRampOnTmpDisplay(current_gamma); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to restore mode: " + e.getMessage()); + } + } + } + + public void grabMouse(boolean new_grab) { + lockAWT(); + try { + if (new_grab != grab) { + grab = new_grab; + updateInputGrab(); + mouse.changeGrabbed(grab, shouldWarpPointer()); + } + } finally { + unlockAWT(); + } + } + + private boolean shouldWarpPointer() { + return pointer_grabbed && shouldGrab(); + } + + public int getNativeCursorCapabilities() { + lockAWT(); + try { + incDisplay(); + try { + return nGetNativeCursorCapabilities(getDisplay()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + throw new RuntimeException(e); + } finally { + unlockAWT(); + } + } + private static native int nGetNativeCursorCapabilities(long display) throws LWJGLException; + + public void setNativeCursor(Object handle) throws LWJGLException { + current_cursor = getCursorHandle(handle); + lockAWT(); + try { + updateCursor(); + } finally { + unlockAWT(); + } + } + + public int getMinCursorSize() { + lockAWT(); + try { + incDisplay(); + try { + return nGetMinCursorSize(getDisplay(), getWindow()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred in getMinCursorSize: " + e); + return 0; + } finally { + unlockAWT(); + } + } + private static native int nGetMinCursorSize(long display, long window); + + public int getMaxCursorSize() { + lockAWT(); + try { + incDisplay(); + try { + return nGetMaxCursorSize(getDisplay(), getWindow()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred in getMaxCursorSize: " + e); + return 0; + } finally { + unlockAWT(); + } + } + private static native int nGetMaxCursorSize(long display, long window); + + /* Keyboard */ + public void createKeyboard() throws LWJGLException { + lockAWT(); + try { + keyboard = new LinuxKeyboard(getDisplay(), getWindow()); + } finally { + unlockAWT(); + } + } + + public void destroyKeyboard() { + lockAWT(); + try { + keyboard.destroy(getDisplay()); + keyboard = null; + } finally { + unlockAWT(); + } + } + + public void pollKeyboard(ByteBuffer keyDownBuffer) { + lockAWT(); + try { + keyboard.poll(keyDownBuffer); + } finally { + unlockAWT(); + } + } + + public void readKeyboard(ByteBuffer buffer) { + lockAWT(); + try { + keyboard.read(buffer); + } finally { + unlockAWT(); + } + } + + private static native long nCreateCursor(long display, int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, int images_offset, IntBuffer delays, int delays_offset) throws LWJGLException; + + private static long createBlankCursor() { + return nCreateBlankCursor(getDisplay(), getWindow()); + } + static native long nCreateBlankCursor(long display, long window); + + public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + lockAWT(); + try { + incDisplay(); + try { + long cursor = nCreateCursor(getDisplay(), width, height, xHotspot, yHotspot, numImages, images, images.position(), delays, delays != null ? delays.position() : -1); + return cursor; + } catch (LWJGLException e) { + decDisplay(); + throw e; + } + } finally { + unlockAWT(); + } + } + + private static long getCursorHandle(Object cursor_handle) { + return cursor_handle != null ? (Long)cursor_handle : None; + } + + public void destroyCursor(Object cursorHandle) { + lockAWT(); + try { + nDestroyCursor(getDisplay(), getCursorHandle(cursorHandle)); + decDisplay(); + } finally { + unlockAWT(); + } + } + static native void nDestroyCursor(long display, long cursorHandle); + + public int getPbufferCapabilities() { + lockAWT(); + try { + incDisplay(); + try { + return nGetPbufferCapabilities(getDisplay(), getDefaultScreen()); + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred in getPbufferCapabilities: " + e); + return 0; + } finally { + unlockAWT(); + } + } + private static native int nGetPbufferCapabilities(long display, int screen); + + public boolean isBufferLost(PeerInfo handle) { + return false; + } + + public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, + IntBuffer pixelFormatCaps, + IntBuffer pBufferAttribs) throws LWJGLException { + return new LinuxPbufferPeerInfo(width, height, pixel_format); + } + + public void setPbufferAttrib(PeerInfo handle, int attrib, int value) { + throw new UnsupportedOperationException(); + } + + public void bindTexImageToPbuffer(PeerInfo handle, int buffer) { + throw new UnsupportedOperationException(); + } + + public void releaseTexImageFromPbuffer(PeerInfo handle, int buffer) { + throw new UnsupportedOperationException(); + } + + /** + * This method will convert icon bytebuffers into a single bytebuffer + * as the icon format required by _NET_WM_ICON should be in a cardinal + * 32 bit ARGB format i.e. all icons in a single buffer the data starting + * with 32 bit width & height followed by the color data as 32bit ARGB. + * + * @param icons Array of icons in RGBA format + */ + private static ByteBuffer convertIcons(ByteBuffer[] icons) { + + int bufferSize = 0; + + // calculate size of bytebuffer + for ( ByteBuffer icon : icons ) { + int size = icon.limit() / 4; + int dimension = (int)Math.sqrt(size); + if ( dimension > 0 ) { + bufferSize += 2 * 4; // add 32 bit width & height, 4 bytes each + bufferSize += dimension * dimension * 4; + } + } + + if (bufferSize == 0) return null; + + ByteBuffer icon_argb = BufferUtils.createByteBuffer(bufferSize);//icon.capacity()+(2*4)); + icon_argb.order(ByteOrder.BIG_ENDIAN); + + for ( ByteBuffer icon : icons ) { + int size = icon.limit() / 4; + int dimension = (int)Math.sqrt(size); + + icon_argb.putInt(dimension); // width + icon_argb.putInt(dimension); // height + + for (int y = 0; y < dimension; y++) { + for (int x = 0; x < dimension; x++) { + + byte r = icon.get((x*4)+(y*dimension*4)); + byte g = icon.get((x*4)+(y*dimension*4)+1); + byte b = icon.get((x*4)+(y*dimension*4)+2); + byte a = icon.get((x*4)+(y*dimension*4)+3); + + icon_argb.put(a); + icon_argb.put(r); + icon_argb.put(g); + icon_argb.put(b); + } + } + } + + return icon_argb; + } + + /** + * Sets one or more icons for the Display. + * <ul> + * <li>On Windows you should supply at least one 16x16 icon and one 32x32.</li> + * <li>Linux (and similar platforms) expect one 32x32 icon.</li> + * <li>Mac OS X should be supplied one 128x128 icon</li> + * </ul> + * The implementation will use the supplied ByteBuffers with image data in RGBA and perform any conversions necessary for the specific platform. + * + * @param icons Array of icons in RGBA mode + * @return number of icons used. + */ + public int setIcon(ByteBuffer[] icons) { + lockAWT(); + try { + incDisplay(); + try { + // get icons as cardinal ARGB format + ByteBuffer icons_data = convertIcons(icons); + if (icons_data == null) return 0; + nSetWindowIcon(getDisplay(), getWindow(), icons_data, icons_data.capacity());//, icon_mask, icon_mask.capacity(), dimension, dimension); + return icons.length; + } finally { + decDisplay(); + } + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to set display icon: " + e); + return 0; + } finally { + unlockAWT(); + } + } + + private static native void nSetWindowIcon(long display, long window, ByteBuffer icons_data, int icons_size); + + public int getX() { + return window_x; + } + + public int getY() { + return window_y; + } + + public int getWidth() { + return window_width; + } + + public int getHeight() { + return window_height; + } + + public boolean isInsideWindow() { + return mouseInside; + } + + public void setResizable(boolean resizable) { + if (this.resizable == resizable) { + return; + } + + this.resizable = resizable; + nSetWindowSize(getDisplay(), getWindow(), window_width, window_height, resizable); + } + + public boolean wasResized() { + if (resized) { + resized = false; + return true; + } + + return false; + } + + public float getPixelScaleFactor() { + return 1f; + } + + /** + * Helper class for managing Compiz's workarounds. We need this to enable Legacy + * Fullscreen Support in Compiz, else we'll have trouble with fullscreen windows + * when Compiz effects are enabled. + * + * Implementation Note: This code is probably too much for an inner class, but + * keeping it here until we're sure we cannot find a better solution. + */ + private static final class Compiz { + + private static boolean applyFix; + + private static Provider provider; + + private Compiz() { + } + + static void init() { + if ( Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.nocompiz_lfs") ) + return; + + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + try { + // Check if Compiz is active + if ( !isProcessActive("compiz") ) + return null; + + provider = null; + + String providerName = null; + + // Check if Dbus is available + if ( isProcessActive("dbus-daemon") ) { + providerName = "Dbus"; + provider = new Provider() { + + private static final String KEY = "/org/freedesktop/compiz/workarounds/allscreens/legacy_fullscreen"; + + public boolean hasLegacyFullscreenSupport() throws LWJGLException { + final List output = Compiz.run( + "dbus-send", "--print-reply", "--type=method_call", "--dest=org.freedesktop.compiz", KEY, "org.freedesktop.compiz.get" + ); + + if ( output == null || output.size() < 2 ) + throw new LWJGLException("Invalid Dbus reply."); + + String line = (String)output.get(0); + + if ( !line.startsWith("method return") ) + throw new LWJGLException("Invalid Dbus reply."); + + line = ((String)output.get(1)).trim(); // value + if ( !line.startsWith("boolean") || line.length() < 12) + throw new LWJGLException("Invalid Dbus reply."); + + return "true".equalsIgnoreCase(line.substring("boolean".length() + 1)); + } + + public void setLegacyFullscreenSupport(final boolean state) throws LWJGLException { + if ( Compiz.run( + "dbus-send", "--type=method_call", "--dest=org.freedesktop.compiz", KEY, "org.freedesktop.compiz.set", "boolean:" + Boolean.toString(state) + ) == null ) + throw new LWJGLException("Failed to apply Compiz LFS workaround."); + } + }; + } else { + try { + // Check if Gconf is available + Runtime.getRuntime().exec("gconftool"); + + providerName = "gconftool"; + provider = new Provider() { + + private static final String KEY = "/apps/compiz/plugins/workarounds/allscreens/options/legacy_fullscreen"; + + public boolean hasLegacyFullscreenSupport() throws LWJGLException { + final List output = Compiz.run(new String[] { + "gconftool", "-g", KEY + }); + + if ( output == null || output.size() == 0 ) + throw new LWJGLException("Invalid gconftool reply."); + + return Boolean.parseBoolean(((String)output.get(0)).trim()); + } + + public void setLegacyFullscreenSupport(final boolean state) throws LWJGLException { + if ( Compiz.run(new String[] { + "gconftool", "-s", KEY, "-s", Boolean.toString(state), "-t", "bool" + }) == null ) + throw new LWJGLException("Failed to apply Compiz LFS workaround."); + + if ( state ) { + try { + // gconftool will not apply the workaround immediately, sleep a bit + // to make sure it will be ok when we create the window. + Thread.sleep(200); // 100 is too low, 150 works, set to 200 to be safe. + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }; + } catch (IOException e) { + // Ignore + } + } + + if ( provider != null && !provider.hasLegacyFullscreenSupport() ) { // No need to do anything if LFS is already enabled. + applyFix = true; + LWJGLUtil.log("Using " + providerName + " to apply Compiz LFS workaround."); + } + } catch (LWJGLException e) { + // Ignore + } finally { + return null; + } + } + }); + } + + static void setLegacyFullscreenSupport(final boolean enabled) { + if ( !applyFix ) + return; + + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + try { + provider.setLegacyFullscreenSupport(enabled); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to change Compiz Legacy Fullscreen Support. Reason: " + e.getMessage()); + } + return null; + } + }); + } + + private static List<String> run(final String... command) throws LWJGLException { + final List<String> output = new ArrayList<String>(); + + try { + final Process p = Runtime.getRuntime().exec(command); + try { + final int exitValue = p.waitFor(); + if ( exitValue != 0 ) + return null; + } catch (InterruptedException e) { + throw new LWJGLException("Process interrupted.", e); + } + + final BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); + + String line; + while ( (line = br.readLine()) != null ) + output.add(line); + + br.close(); + } catch (final IOException e) { + throw new LWJGLException("Process failed.", e); + } + + return output; + } + + private static boolean isProcessActive(final String processName) throws LWJGLException { + final List<String> output = run(new String[] { "ps", "-C", processName }); + if ( output == null ) + return false; + + for ( final String line : output ) { + if ( line.contains(processName) ) + return true; + } + + return false; + } + + private interface Provider { + + boolean hasLegacyFullscreenSupport() throws LWJGLException; + + void setLegacyFullscreenSupport(boolean state) throws LWJGLException; + + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplayPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplayPeerInfo.java new file mode 100644 index 0000000..d304064 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxDisplayPeerInfo.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxDisplayPeerInfo extends LinuxPeerInfo { + + final boolean egl; + + LinuxDisplayPeerInfo() throws LWJGLException { + egl = true; + org.lwjgl.opengles.GLContext.loadOpenGLLibrary(); + } + + LinuxDisplayPeerInfo(PixelFormat pixel_format) throws LWJGLException { + egl = false; + LinuxDisplay.lockAWT(); + try { + GLContext.loadOpenGLLibrary(); + try { + LinuxDisplay.incDisplay(); + try { + initDefaultPeerInfo(LinuxDisplay.getDisplay(), LinuxDisplay.getDefaultScreen(), getHandle(), pixel_format); + } catch (LWJGLException e) { + LinuxDisplay.decDisplay(); + throw e; + } + } catch (LWJGLException e) { + GLContext.unloadOpenGLLibrary(); + throw e; + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + private static native void initDefaultPeerInfo(long display, int screen, ByteBuffer peer_info_handle, PixelFormat pixel_format) throws LWJGLException; + + protected void doLockAndInitHandle() throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + initDrawable(LinuxDisplay.getWindow(), getHandle()); + } finally { + LinuxDisplay.unlockAWT(); + } + } + private static native void initDrawable(long window, ByteBuffer peer_info_handle); + + protected void doUnlock() throws LWJGLException { + // NO-OP + } + + public void destroy() { + super.destroy(); + + if ( egl ) + org.lwjgl.opengles.GLContext.unloadOpenGLLibrary(); + else { + LinuxDisplay.lockAWT(); + LinuxDisplay.decDisplay(); + GLContext.unloadOpenGLLibrary(); + LinuxDisplay.unlockAWT(); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxEvent.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxEvent.java new file mode 100644 index 0000000..15dd527 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxEvent.java @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +/** + * Wrapper class for X11 events. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2286 $ + * $Id: LinuxPeerInfo.java 2286 2006-03-23 19:32:21Z matzon $ + */ +final class LinuxEvent { + public static final int FocusIn = 9; + public static final int FocusOut = 10; + public static final int KeyPress = 2; + public static final int KeyRelease = 3; + public static final int ButtonPress = 4; + public static final int ButtonRelease = 5; + public static final int MotionNotify = 6; + public static final int EnterNotify = 7; + public static final int LeaveNotify = 8; + public static final int UnmapNotify = 18; + public static final int MapNotify = 19; + public static final int Expose = 12; + public static final int ConfigureNotify = 22; + public static final int ClientMessage = 33; + + private final ByteBuffer event_buffer; + + LinuxEvent() { + this.event_buffer = createEventBuffer(); + } + private static native ByteBuffer createEventBuffer(); + + public void copyFrom(LinuxEvent event) { + int pos = event_buffer.position(); + int event_pos = event.event_buffer.position(); + event_buffer.put(event.event_buffer); + event_buffer.position(pos); + event.event_buffer.position(event_pos); + } + + public static native int getPending(long display); + + public void sendEvent(long display, long window, boolean propagate, long event_mask) { + nSendEvent(event_buffer, display, window, propagate, event_mask); + } + private static native void nSendEvent(ByteBuffer event_buffer, long display, long window, boolean propagate, long event_mask); + + public boolean filterEvent(long window) { + return nFilterEvent(event_buffer, window); + } + private static native boolean nFilterEvent(ByteBuffer event_buffer, long window); + + public void nextEvent(long display) { + nNextEvent(display, event_buffer); + } + private static native void nNextEvent(long display, ByteBuffer event_buffer); + + public int getType() { + return nGetType(event_buffer); + } + private static native int nGetType(ByteBuffer event_buffer); + + public long getWindow() { + return nGetWindow(event_buffer); + } + private static native long nGetWindow(ByteBuffer event_buffer); + + public void setWindow(long window) { + nSetWindow(event_buffer, window); + } + private static native void nSetWindow(ByteBuffer event_buffer, long window); + + /* Focus methods */ + + public int getFocusMode() { + return nGetFocusMode(event_buffer); + } + private static native int nGetFocusMode(ByteBuffer event_buffer); + + public int getFocusDetail() { + return nGetFocusDetail(event_buffer); + } + private static native int nGetFocusDetail(ByteBuffer event_buffer); + + /* ClientMessage methods */ + + public long getClientMessageType() { + return nGetClientMessageType(event_buffer); + } + private static native long nGetClientMessageType(ByteBuffer event_buffer); + + public int getClientData(int index) { + return nGetClientData(event_buffer, index); + } + private static native int nGetClientData(ByteBuffer event_buffer, int index); + + public int getClientFormat() { + return nGetClientFormat(event_buffer); + } + private static native int nGetClientFormat(ByteBuffer event_buffer); + + /* Button methods */ + + public long getButtonTime() { + return nGetButtonTime(event_buffer); + } + private static native long nGetButtonTime(ByteBuffer event_buffer); + + public int getButtonState() { + return nGetButtonState(event_buffer); + } + private static native int nGetButtonState(ByteBuffer event_buffer); + + public int getButtonType() { + return nGetButtonType(event_buffer); + } + private static native int nGetButtonType(ByteBuffer event_buffer); + + public int getButtonButton() { + return nGetButtonButton(event_buffer); + } + private static native int nGetButtonButton(ByteBuffer event_buffer); + + public long getButtonRoot() { + return nGetButtonRoot(event_buffer); + } + private static native long nGetButtonRoot(ByteBuffer event_buffer); + + public int getButtonXRoot() { + return nGetButtonXRoot(event_buffer); + } + private static native int nGetButtonXRoot(ByteBuffer event_buffer); + + public int getButtonYRoot() { + return nGetButtonYRoot(event_buffer); + } + private static native int nGetButtonYRoot(ByteBuffer event_buffer); + + public int getButtonX() { + return nGetButtonX(event_buffer); + } + private static native int nGetButtonX(ByteBuffer event_buffer); + + public int getButtonY() { + return nGetButtonY(event_buffer); + } + private static native int nGetButtonY(ByteBuffer event_buffer); + + /* Key methods */ + + public long getKeyAddress() { + return nGetKeyAddress(event_buffer); + } + private static native long nGetKeyAddress(ByteBuffer event_buffer); + + public long getKeyTime() { + return nGetKeyTime(event_buffer); + } + private static native int nGetKeyTime(ByteBuffer event_buffer); + + public int getKeyType() { + return nGetKeyType(event_buffer); + } + private static native int nGetKeyType(ByteBuffer event_buffer); + + public int getKeyKeyCode() { + return nGetKeyKeyCode(event_buffer); + } + private static native int nGetKeyKeyCode(ByteBuffer event_buffer); + + public int getKeyState() { + return nGetKeyState(event_buffer); + } + private static native int nGetKeyState(ByteBuffer event_buffer); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeyboard.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeyboard.java new file mode 100644 index 0000000..2777671 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeyboard.java @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.input.Keyboard; + +final class LinuxKeyboard { + private static final int LockMapIndex = 1; + private static final long NoSymbol = 0; + private static final long ShiftMask = 1 << 0; + private static final long LockMask = 1 << 1; + private static final int XLookupChars = 2; + private static final int XLookupBoth = 4; + + private static final int KEYBOARD_BUFFER_SIZE = 50; + + private final long xim; + private final long xic; + + private final int numlock_mask; + private final int modeswitch_mask; + private final int caps_lock_mask; + private final int shift_lock_mask; + + private final ByteBuffer compose_status; + + private final byte[] key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE]; + private final EventQueue event_queue = new EventQueue(Keyboard.EVENT_SIZE); + + private final ByteBuffer tmp_event = ByteBuffer.allocate(Keyboard.EVENT_SIZE); + private final int[] temp_translation_buffer = new int[KEYBOARD_BUFFER_SIZE]; + private final ByteBuffer native_translation_buffer = BufferUtils.createByteBuffer(KEYBOARD_BUFFER_SIZE); + private final CharsetDecoder utf8_decoder = Charset.forName("UTF-8").newDecoder(); + private final CharBuffer char_buffer = CharBuffer.allocate(KEYBOARD_BUFFER_SIZE); + + // Deferred key released event, to detect key repeat + private boolean has_deferred_event; + private int deferred_keycode; + private int deferred_event_keycode; + private long deferred_nanos; + private byte deferred_key_state; + + LinuxKeyboard(long display, long window) { + long modifier_map = getModifierMapping(display); + int tmp_numlock_mask = 0; + int tmp_modeswitch_mask = 0; + int tmp_caps_lock_mask = 0; + int tmp_shift_lock_mask = 0; + if (modifier_map != 0) { + int max_keypermod = getMaxKeyPerMod(modifier_map); + // Find modifier masks + int i, j; + for (i = 0; i < 8; i++) { + for (j = 0; j < max_keypermod; j++) { + int key_code = lookupModifierMap(modifier_map, i*max_keypermod + j); + int key_sym = (int)keycodeToKeySym(display, key_code); + int mask = 1 << i; + switch (key_sym) { + case LinuxKeycodes.XK_Num_Lock: + tmp_numlock_mask |= mask; + break; + case LinuxKeycodes.XK_Mode_switch: + tmp_modeswitch_mask |= mask; + break; + case LinuxKeycodes.XK_Caps_Lock: + if (i == LockMapIndex) { + tmp_caps_lock_mask = mask; + tmp_shift_lock_mask = 0; + } + break; + case LinuxKeycodes.XK_Shift_Lock: + if (i == LockMapIndex && tmp_caps_lock_mask == 0) + tmp_shift_lock_mask = mask; + break; + default: + break; + } + } + } + freeModifierMapping(modifier_map); + } + numlock_mask = tmp_numlock_mask; + modeswitch_mask = tmp_modeswitch_mask; + caps_lock_mask = tmp_caps_lock_mask; + shift_lock_mask = tmp_shift_lock_mask; + setDetectableKeyRepeat(display, true); + xim = openIM(display); + if (xim != 0) { + xic = createIC(xim, window); + if (xic != 0) { + setupIMEventMask(display, window, xic); + } else { + destroy(display); + } + } else { + xic = 0; + } + compose_status = allocateComposeStatus(); + } + private static native long getModifierMapping(long display); + private static native void freeModifierMapping(long modifier_map); + private static native int getMaxKeyPerMod(long modifier_map); + private static native int lookupModifierMap(long modifier_map, int index); + private static native long keycodeToKeySym(long display, int key_code); + + private static native long openIM(long display); + private static native long createIC(long xim, long window); + private static native void setupIMEventMask(long display, long window, long xic); + private static native ByteBuffer allocateComposeStatus(); + + private static void setDetectableKeyRepeat(long display, boolean enabled) { + boolean success = nSetDetectableKeyRepeat(display, enabled); + if (!success) + LWJGLUtil.log("Failed to set detectable key repeat to " + enabled); + } + private static native boolean nSetDetectableKeyRepeat(long display, boolean enabled); + + public void destroy(long display) { + if (xic != 0) + destroyIC(xic); + if (xim != 0) + closeIM(xim); + setDetectableKeyRepeat(display, false); + } + private static native void destroyIC(long xic); + private static native void closeIM(long xim); + + public void read(ByteBuffer buffer) { + flushDeferredEvent(); + event_queue.copyEvents(buffer); + } + + public void poll(ByteBuffer keyDownBuffer) { + flushDeferredEvent(); + int old_position = keyDownBuffer.position(); + keyDownBuffer.put(key_down_buffer); + keyDownBuffer.position(old_position); + } + + private void putKeyboardEvent(int keycode, byte state, int ch, long nanos, boolean repeat) { + tmp_event.clear(); + tmp_event.putInt(keycode).put(state).putInt(ch).putLong(nanos).put(repeat ? (byte)1 : (byte)0); + tmp_event.flip(); + event_queue.putEvent(tmp_event); + } + + private int lookupStringISO88591(long event_ptr, int[] translation_buffer) { + int i; + + int num_chars = lookupString(event_ptr, native_translation_buffer, compose_status); + for (i = 0; i < num_chars; i++) { + translation_buffer[i] = ((int)native_translation_buffer.get(i)) & 0xff; + } + return num_chars; + } + private static native int lookupString(long event_ptr, ByteBuffer buffer, ByteBuffer compose_status); + + private int lookupStringUnicode(long event_ptr, int[] translation_buffer) { + int status = utf8LookupString(xic, event_ptr, native_translation_buffer, native_translation_buffer.position(), native_translation_buffer.remaining()); + if (status != XLookupChars && status != XLookupBoth) + return 0; + native_translation_buffer.flip(); + utf8_decoder.decode(native_translation_buffer, char_buffer, true); + native_translation_buffer.compact(); + char_buffer.flip(); + int i = 0; + while (char_buffer.hasRemaining() && i < translation_buffer.length) { + translation_buffer[i++] = char_buffer.get(); + } + char_buffer.compact(); + return i; + } + private static native int utf8LookupString(long xic, long event_ptr, ByteBuffer buffer, int pos, int size); + + private int lookupString(long event_ptr, int[] translation_buffer) { + if (xic != 0) { + return lookupStringUnicode(event_ptr, translation_buffer); + } else + return lookupStringISO88591(event_ptr, translation_buffer); + } + + private void translateEvent(long event_ptr, int keycode, byte key_state, long nanos, boolean repeat) { + int num_chars, i; + int ch; + + num_chars = lookupString(event_ptr, temp_translation_buffer); + if (num_chars > 0) { + ch = temp_translation_buffer[0]; + putKeyboardEvent(keycode, key_state, ch, nanos, repeat); + for (i = 1; i < num_chars; i++) { + ch = temp_translation_buffer[i]; + putKeyboardEvent(0, (byte)0, ch, nanos, repeat); + } + } else { + putKeyboardEvent(keycode, key_state, 0, nanos, repeat); + } + } + + private static boolean isKeypadKeysym(long keysym) { + return (0xFF80 <= keysym && keysym <= 0xFFBD) || + (0x11000000 <= keysym && keysym <= 0x1100FFFF); + } + + private static boolean isNoSymbolOrVendorSpecific(long keysym) { + return keysym == NoSymbol || (keysym & (1 << 28)) != 0; + } + + private static long getKeySym(long event_ptr, int group, int index) { + long keysym = lookupKeysym(event_ptr, group*2 + index); + if (isNoSymbolOrVendorSpecific(keysym) && index == 1) { + keysym = lookupKeysym(event_ptr, group*2 + 0); + } + if (isNoSymbolOrVendorSpecific(keysym) && group == 1) + keysym = getKeySym(event_ptr, 0, index); + return keysym; + } + private static native long lookupKeysym(long event_ptr, int index); + private static native long toUpper(long keysym); + + private long mapEventToKeySym(long event_ptr, int event_state) { + int group; + long keysym; + if ((event_state & modeswitch_mask) != 0) + group = 1; + else + group = 0; + if ((event_state & numlock_mask) != 0 && isKeypadKeysym(keysym = getKeySym(event_ptr, group, 1))) { + if ((event_state & (ShiftMask | shift_lock_mask)) != 0) { + return getKeySym(event_ptr, group, 0); + } else { + return keysym; + } + } else if ((event_state & (ShiftMask | LockMask)) == 0) { + return getKeySym(event_ptr, group, 0); + } else if ((event_state & ShiftMask) == 0) { + keysym = getKeySym(event_ptr, group, 0); + if ((event_state & caps_lock_mask) != 0) + keysym = toUpper(keysym); + return keysym; + } else { + keysym = getKeySym(event_ptr, group, 1); + if ((event_state & caps_lock_mask) != 0) + keysym = toUpper(keysym); + return keysym; + } + } + + private int getKeycode(long event_ptr, int event_state) { + long keysym = mapEventToKeySym(event_ptr, event_state); + int keycode = LinuxKeycodes.mapKeySymToLWJGLKeyCode(keysym); + if (keycode == Keyboard.KEY_NONE) { + // Try unshifted keysym mapping + keysym = lookupKeysym(event_ptr, 0); + keycode = LinuxKeycodes.mapKeySymToLWJGLKeyCode(keysym); + } + return keycode; + } + + private byte getKeyState(int event_type) { + switch (event_type) { + case LinuxEvent.KeyPress: + return 1; + case LinuxEvent.KeyRelease: + return 0; + default: + throw new IllegalArgumentException("Unknown event_type: " + event_type); + } + } + + private void handleKeyEvent(long event_ptr, long millis, int event_type, int event_keycode, int event_state) { + int keycode = getKeycode(event_ptr, event_state); + byte key_state = getKeyState(event_type); + boolean repeat = key_state == key_down_buffer[keycode]; + key_down_buffer[keycode] = key_state; + long nanos = millis*1000000; + if (event_type == LinuxEvent.KeyPress) { + if (has_deferred_event) { + if (nanos == deferred_nanos && event_keycode == deferred_event_keycode) { + has_deferred_event = false; + repeat = true; // Repeated event + } else + flushDeferredEvent(); + } + translateEvent(event_ptr, keycode, key_state, nanos, repeat); + } else { + flushDeferredEvent(); + has_deferred_event = true; + deferred_keycode = keycode; + deferred_event_keycode = event_keycode; + deferred_nanos = nanos; + deferred_key_state = key_state; + } + } + + private void flushDeferredEvent() { + if (has_deferred_event) { + putKeyboardEvent(deferred_keycode, deferred_key_state, 0, deferred_nanos, false); + has_deferred_event = false; + } + } + + public boolean filterEvent(LinuxEvent event) { + switch (event.getType()) { + case LinuxEvent.KeyPress: /* Fall through */ + case LinuxEvent.KeyRelease: + handleKeyEvent(event.getKeyAddress(), event.getKeyTime(), event.getKeyType(), event.getKeyKeyCode(), event.getKeyState()); + return true; + default: + break; + } + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeycodes.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeycodes.java new file mode 100644 index 0000000..99c49e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxKeycodes.java @@ -0,0 +1,763 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +import org.lwjgl.input.Keyboard; + +final class LinuxKeycodes { + public static final int XK_Kanji = 0xff21; + + public static final int XK_ISO_Left_Tab = 0xfe20; + + public static final int XK_dead_grave = 0xfe50; + public static final int XK_dead_acute = 0xfe51; + public static final int XK_dead_circumflex = 0xfe52; + public static final int XK_dead_tilde = 0xfe53; + public static final int XK_dead_macron = 0xfe54; + public static final int XK_dead_breve = 0xfe55; + public static final int XK_dead_abovedot = 0xfe56; + public static final int XK_dead_diaeresis = 0xfe57; + public static final int XK_dead_abovering = 0xfe58; + public static final int XK_dead_doubleacute = 0xfe59; + public static final int XK_dead_caron = 0xfe5a; + public static final int XK_dead_cedilla = 0xfe5b; + public static final int XK_dead_ogonek = 0xfe5c; + public static final int XK_dead_iota = 0xfe5d; + public static final int XK_dead_voiced_sound = 0xfe5e; + public static final int XK_dead_semivoiced_sound = 0xfe5f; + public static final int XK_dead_belowdot = 0xfe60; + public static final int XK_dead_hook = 0xfe61; + public static final int XK_dead_horn = 0xfe62; + + public static final int XK_BackSpace = 0xff08; + public static final int XK_Tab = 0xff09; + public static final int XK_Linefeed = 0xff0a; + public static final int XK_Clear = 0xff0b; + public static final int XK_Return = 0xff0d; + public static final int XK_Pause = 0xff13; + public static final int XK_Scroll_Lock = 0xff14; + public static final int XK_Sys_Req = 0xff15; + public static final int XK_Escape = 0xff1b; + public static final int XK_Delete = 0xffff; + + public static final int XK_Home = 0xff50; + public static final int XK_Left = 0xff51; + public static final int XK_Up = 0xff52; + public static final int XK_Right = 0xff53; + public static final int XK_Down = 0xff54; + public static final int XK_Prior = 0xff55; + public static final int XK_Page_Up = 0xff55; + public static final int XK_Next = 0xff56; + public static final int XK_Page_Down = 0xff56; + public static final int XK_End = 0xff57; + public static final int XK_Begin = 0xff58; + + +/* Misc functions */ + + public static final int XK_Select = 0xff60; + public static final int XK_Print = 0xff61; + public static final int XK_Execute = 0xff62; + public static final int XK_Insert = 0xff63; + public static final int XK_Undo = 0xff65; + public static final int XK_Redo = 0xff66; + public static final int XK_Menu = 0xff67; + public static final int XK_Find = 0xff68; + public static final int XK_Cancel = 0xff69; + public static final int XK_Help = 0xff6a; + public static final int XK_Break = 0xff6b; + public static final int XK_Mode_switch = 0xff7e; + public static final int XK_script_switch = 0xff7e; + public static final int XK_Num_Lock = 0xff7f; + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + + public static final int XK_KP_Space = 0xff80; + public static final int XK_KP_Tab = 0xff89; + public static final int XK_KP_Enter = 0xff8d; + public static final int XK_KP_F1 = 0xff91; + public static final int XK_KP_F2 = 0xff92; + public static final int XK_KP_F3 = 0xff93; + public static final int XK_KP_F4 = 0xff94; + public static final int XK_KP_Home = 0xff95; + public static final int XK_KP_Left = 0xff96; + public static final int XK_KP_Up = 0xff97; + public static final int XK_KP_Right = 0xff98; + public static final int XK_KP_Down = 0xff99; + public static final int XK_KP_Prior = 0xff9a; + public static final int XK_KP_Page_Up = 0xff9a; + public static final int XK_KP_Next = 0xff9b; + public static final int XK_KP_Page_Down = 0xff9b; + public static final int XK_KP_End = 0xff9c; + public static final int XK_KP_Begin = 0xff9d; + public static final int XK_KP_Insert = 0xff9e; + public static final int XK_KP_Delete = 0xff9f; + public static final int XK_KP_Equal = 0xffbd; + public static final int XK_KP_Multiply = 0xffaa; + public static final int XK_KP_Add = 0xffab; + public static final int XK_KP_Separator = 0xffac; + public static final int XK_KP_Subtract = 0xffad; + public static final int XK_KP_Decimal = 0xffae; + public static final int XK_KP_Divide = 0xffaf; + + public static final int XK_KP_0 = 0xffb0; + public static final int XK_KP_1 = 0xffb1; + public static final int XK_KP_2 = 0xffb2; + public static final int XK_KP_3 = 0xffb3; + public static final int XK_KP_4 = 0xffb4; + public static final int XK_KP_5 = 0xffb5; + public static final int XK_KP_6 = 0xffb6; + public static final int XK_KP_7 = 0xffb7; + public static final int XK_KP_8 = 0xffb8; + public static final int XK_KP_9 = 0xffb9; + + + +/* + * Auxilliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + + public static final int XK_F1 = 0xffbe; + public static final int XK_F2 = 0xffbf; + public static final int XK_F3 = 0xffc0; + public static final int XK_F4 = 0xffc1; + public static final int XK_F5 = 0xffc2; + public static final int XK_F6 = 0xffc3; + public static final int XK_F7 = 0xffc4; + public static final int XK_F8 = 0xffc5; + public static final int XK_F9 = 0xffc6; + public static final int XK_F10 = 0xffc7; + public static final int XK_F11 = 0xffc8; + public static final int XK_L1 = 0xffc8; + public static final int XK_F12 = 0xffc9; + public static final int XK_L2 = 0xffc9; + public static final int XK_F13 = 0xffca; + public static final int XK_L3 = 0xffca; + public static final int XK_F14 = 0xffcb; + public static final int XK_L4 = 0xffcb; + public static final int XK_F15 = 0xffcc; + public static final int XK_L5 = 0xffcc; + public static final int XK_F16 = 0xffcd; + public static final int XK_L6 = 0xffcd; + public static final int XK_F17 = 0xffce; + public static final int XK_L7 = 0xffce; + public static final int XK_F18 = 0xffcf; + public static final int XK_L8 = 0xffcf; + public static final int XK_F19 = 0xffd0; + public static final int XK_L9 = 0xffd0; + public static final int XK_F20 = 0xffd1; + public static final int XK_L10 = 0xffd1; + public static final int XK_F21 = 0xffd2; + public static final int XK_R1 = 0xffd2; + public static final int XK_F22 = 0xffd3; + public static final int XK_R2 = 0xffd3; + public static final int XK_F23 = 0xffd4; + public static final int XK_R3 = 0xffd4; + public static final int XK_F24 = 0xffd5; + public static final int XK_R4 = 0xffd5; + public static final int XK_F25 = 0xffd6; + public static final int XK_R5 = 0xffd6; + public static final int XK_F26 = 0xffd7; + public static final int XK_R6 = 0xffd7; + public static final int XK_F27 = 0xffd8; + public static final int XK_R7 = 0xffd8; + public static final int XK_F28 = 0xffd9; + public static final int XK_R8 = 0xffd9; + public static final int XK_F29 = 0xffda; + public static final int XK_R9 = 0xffda; + public static final int XK_F30 = 0xffdb; + public static final int XK_R10 = 0xffdb; + public static final int XK_F31 = 0xffdc; + public static final int XK_R11 = 0xffdc; + public static final int XK_F32 = 0xffdd; + public static final int XK_R12 = 0xffdd; + public static final int XK_F33 = 0xffde; + public static final int XK_R13 = 0xffde; + public static final int XK_F34 = 0xffdf; + public static final int XK_R14 = 0xffdf; + public static final int XK_F35 = 0xffe0; + public static final int XK_R15 = 0xffe0; + +/* Modifiers */ + + public static final int XK_Shift_L = 0xffe1; + public static final int XK_Shift_R = 0xffe2; + public static final int XK_Control_L = 0xffe3; + public static final int XK_Control_R = 0xffe4; + public static final int XK_Caps_Lock = 0xffe5; + public static final int XK_Shift_Lock = 0xffe6; + + public static final int XK_Meta_L = 0xffe7; + public static final int XK_Meta_R = 0xffe8; + public static final int XK_Alt_L = 0xffe9; + public static final int XK_Alt_R = 0xffea; + public static final int XK_Super_L = 0xffeb; + public static final int XK_Super_R = 0xffec; + public static final int XK_Hyper_L = 0xffed; + public static final int XK_Hyper_R = 0xffee; + public static final int XK_space = 0x0020; + public static final int XK_exclam = 0x0021; + public static final int XK_quotedbl = 0x0022; + public static final int XK_numbersign = 0x0023; + public static final int XK_dollar = 0x0024; + public static final int XK_percent = 0x0025; + public static final int XK_ampersand = 0x0026; + public static final int XK_apostrophe = 0x0027; + public static final int XK_quoteright = 0x0027; + public static final int XK_parenleft = 0x0028; + public static final int XK_parenright = 0x0029; + public static final int XK_asterisk = 0x002a; + public static final int XK_plus = 0x002b; + public static final int XK_comma = 0x002c; + public static final int XK_minus = 0x002d; + public static final int XK_period = 0x002e; + public static final int XK_slash = 0x002f; + + public static final int XK_0 = 0x0030; + public static final int XK_1 = 0x0031; + public static final int XK_2 = 0x0032; + public static final int XK_3 = 0x0033; + public static final int XK_4 = 0x0034; + public static final int XK_5 = 0x0035; + public static final int XK_6 = 0x0036; + public static final int XK_7 = 0x0037; + public static final int XK_8 = 0x0038; + public static final int XK_9 = 0x0039; + public static final int XK_colon = 0x003a; + public static final int XK_semicolon = 0x003b; + public static final int XK_less = 0x003c; + public static final int XK_equal = 0x003d; + public static final int XK_greater = 0x003e; + public static final int XK_question = 0x003f; + public static final int XK_at = 0x0040; + public static final int XK_A = 0x0041; + public static final int XK_B = 0x0042; + public static final int XK_C = 0x0043; + public static final int XK_D = 0x0044; + public static final int XK_E = 0x0045; + public static final int XK_F = 0x0046; + public static final int XK_G = 0x0047; + public static final int XK_H = 0x0048; + public static final int XK_I = 0x0049; + public static final int XK_J = 0x004a; + public static final int XK_K = 0x004b; + public static final int XK_L = 0x004c; + public static final int XK_M = 0x004d; + public static final int XK_N = 0x004e; + public static final int XK_O = 0x004f; + public static final int XK_P = 0x0050; + public static final int XK_Q = 0x0051; + public static final int XK_R = 0x0052; + public static final int XK_S = 0x0053; + public static final int XK_T = 0x0054; + public static final int XK_U = 0x0055; + public static final int XK_V = 0x0056; + public static final int XK_W = 0x0057; + public static final int XK_X = 0x0058; + public static final int XK_Y = 0x0059; + public static final int XK_Z = 0x005a; + public static final int XK_bracketleft = 0x005b; + public static final int XK_backslash = 0x005c; + public static final int XK_bracketright = 0x005d; + public static final int XK_asciicircum = 0x005e; + public static final int XK_underscore = 0x005f; + public static final int XK_grave = 0x0060; + public static final int XK_quoteleft = 0x0060; + public static final int XK_a = 0x0061; + public static final int XK_b = 0x0062; + public static final int XK_c = 0x0063; + public static final int XK_d = 0x0064; + public static final int XK_e = 0x0065; + public static final int XK_f = 0x0066; + public static final int XK_g = 0x0067; + public static final int XK_h = 0x0068; + public static final int XK_i = 0x0069; + public static final int XK_j = 0x006a; + public static final int XK_k = 0x006b; + public static final int XK_l = 0x006c; + public static final int XK_m = 0x006d; + public static final int XK_n = 0x006e; + public static final int XK_o = 0x006f; + public static final int XK_p = 0x0070; + public static final int XK_q = 0x0071; + public static final int XK_r = 0x0072; + public static final int XK_s = 0x0073; + public static final int XK_t = 0x0074; + public static final int XK_u = 0x0075; + public static final int XK_v = 0x0076; + public static final int XK_w = 0x0077; + public static final int XK_x = 0x0078; + public static final int XK_y = 0x0079; + public static final int XK_z = 0x007a; + public static final int XK_braceleft = 0x007b; + public static final int XK_bar = 0x007c; + public static final int XK_braceright = 0x007d; + public static final int XK_asciitilde = 0x007e; + + public static final int XK_nobreakspace = 0x00a0; + public static final int XK_exclamdown = 0x00a1; + public static final int XK_cent = 0x00a2; + public static final int XK_sterling = 0x00a3; + public static final int XK_currency = 0x00a4; + public static final int XK_yen = 0x00a5; + public static final int XK_brokenbar = 0x00a6; + public static final int XK_section = 0x00a7; + public static final int XK_diaeresis = 0x00a8; + public static final int XK_copyright = 0x00a9; + public static final int XK_ordfeminine = 0x00aa; + public static final int XK_guillemotleft = 0x00ab; + public static final int XK_notsign = 0x00ac; + public static final int XK_hyphen = 0x00ad; + public static final int XK_registered = 0x00ae; + public static final int XK_macron = 0x00af; + public static final int XK_degree = 0x00b0; + public static final int XK_plusminus = 0x00b1; + public static final int XK_twosuperior = 0x00b2; + public static final int XK_threesuperior = 0x00b3; + public static final int XK_acute = 0x00b4; + public static final int XK_mu = 0x00b5; + public static final int XK_paragraph = 0x00b6; + public static final int XK_periodcentered = 0x00b7; + public static final int XK_cedilla = 0x00b8; + public static final int XK_onesuperior = 0x00b9; + public static final int XK_masculine = 0x00ba; + public static final int XK_guillemotright = 0x00bb; + public static final int XK_onequarter = 0x00bc; + public static final int XK_onehalf = 0x00bd; + public static final int XK_threequarters = 0x00be; + public static final int XK_questiondown = 0x00bf; + public static final int XK_Agrave = 0x00c0; + public static final int XK_Aacute = 0x00c1; + public static final int XK_Acircumflex = 0x00c2; + public static final int XK_Atilde = 0x00c3; + public static final int XK_Adiaeresis = 0x00c4; + public static final int XK_Aring = 0x00c5; + public static final int XK_AE = 0x00c6; + public static final int XK_Ccedilla = 0x00c7; + public static final int XK_Egrave = 0x00c8; + public static final int XK_Eacute = 0x00c9; + public static final int XK_Ecircumflex = 0x00ca; + public static final int XK_Ediaeresis = 0x00cb; + public static final int XK_Igrave = 0x00cc; + public static final int XK_Iacute = 0x00cd; + public static final int XK_Icircumflex = 0x00ce; + public static final int XK_Idiaeresis = 0x00cf; + public static final int XK_ETH = 0x00d0; + public static final int XK_Eth = 0x00d0; + public static final int XK_Ntilde = 0x00d1; + public static final int XK_Ograve = 0x00d2; + public static final int XK_Oacute = 0x00d3; + public static final int XK_Ocircumflex = 0x00d4; + public static final int XK_Otilde = 0x00d5; + public static final int XK_Odiaeresis = 0x00d6; + public static final int XK_multiply = 0x00d7; + public static final int XK_Oslash = 0x00d8; + public static final int XK_Ooblique = 0x00d8; + public static final int XK_Ugrave = 0x00d9; + public static final int XK_Uacute = 0x00da; + public static final int XK_Ucircumflex = 0x00db; + public static final int XK_Udiaeresis = 0x00dc; + public static final int XK_Yacute = 0x00dd; + public static final int XK_THORN = 0x00de; + public static final int XK_Thorn = 0x00de; + public static final int XK_ssharp = 0x00df; + public static final int XK_agrave = 0x00e0; + public static final int XK_aacute = 0x00e1; + public static final int XK_acircumflex = 0x00e2; + public static final int XK_atilde = 0x00e3; + public static final int XK_adiaeresis = 0x00e4; + public static final int XK_aring = 0x00e5; + public static final int XK_ae = 0x00e6; + public static final int XK_ccedilla = 0x00e7; + public static final int XK_egrave = 0x00e8; + public static final int XK_eacute = 0x00e9; + public static final int XK_ecircumflex = 0x00ea; + public static final int XK_ediaeresis = 0x00eb; + public static final int XK_igrave = 0x00ec; + public static final int XK_iacute = 0x00ed; + public static final int XK_icircumflex = 0x00ee; + public static final int XK_idiaeresis = 0x00ef; + public static final int XK_eth = 0x00f0; + public static final int XK_ntilde = 0x00f1; + public static final int XK_ograve = 0x00f2; + public static final int XK_oacute = 0x00f3; + public static final int XK_ocircumflex = 0x00f4; + public static final int XK_otilde = 0x00f5; + public static final int XK_odiaeresis = 0x00f6; + public static final int XK_division = 0x00f7; + public static final int XK_oslash = 0x00f8; + public static final int XK_ooblique = 0x00f8; + public static final int XK_ugrave = 0x00f9; + public static final int XK_uacute = 0x00fa; + public static final int XK_ucircumflex = 0x00fb; + public static final int XK_udiaeresis = 0x00fc; + public static final int XK_yacute = 0x00fd; + public static final int XK_thorn = 0x00fe; + public static final int XK_ydiaeresis = 0x00ff; + + public static final int XK_ISO_Level3_Shift = 0xfe03; + + public static int mapKeySymToLWJGLKeyCode(long keysym) { + switch ((int)keysym) { + case XK_BackSpace: + return Keyboard.KEY_BACK; + case XK_ISO_Left_Tab: + case XK_Tab: + return Keyboard.KEY_TAB; + case XK_Return: + return Keyboard.KEY_RETURN; + case XK_Pause: + return Keyboard.KEY_PAUSE; + case XK_Scroll_Lock: + return Keyboard.KEY_SCROLL; + case XK_Sys_Req: + return Keyboard.KEY_SYSRQ; + case XK_Escape: + return Keyboard.KEY_ESCAPE; + case XK_Delete: + return Keyboard.KEY_DELETE; + + /* Japanese keyboard support */ + + case XK_Kanji: + return Keyboard.KEY_KANJI; + + /* Cursor control & motion */ + + case XK_Home: + return Keyboard.KEY_HOME; + case XK_Left: + return Keyboard.KEY_LEFT; + case XK_Up: + return Keyboard.KEY_UP; + case XK_Right: + return Keyboard.KEY_RIGHT; + case XK_Down: + return Keyboard.KEY_DOWN; + case XK_Page_Up: + return Keyboard.KEY_PRIOR; + case XK_Page_Down: + return Keyboard.KEY_NEXT; + case XK_End: + return Keyboard.KEY_END; + + + /* Misc Functions */ + + case XK_Break: + return Keyboard.KEY_PAUSE; + case XK_Insert: + return Keyboard.KEY_INSERT; + case XK_Num_Lock: + return Keyboard.KEY_NUMLOCK; + + /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + + case XK_KP_Space: + return Keyboard.KEY_SPACE; + case XK_KP_Tab: + return Keyboard.KEY_TAB; + case XK_KP_Enter: + return Keyboard.KEY_NUMPADENTER; + case XK_KP_F1: + return Keyboard.KEY_F1; + case XK_KP_F2: + return Keyboard.KEY_F2; + case XK_KP_F3: + return Keyboard.KEY_F3; + case XK_KP_F4: + return Keyboard.KEY_F4; + case XK_KP_Home: + return Keyboard.KEY_HOME; + case XK_KP_Left: + return Keyboard.KEY_LEFT; + case XK_KP_Up: + return Keyboard.KEY_UP; + case XK_KP_Right: + return Keyboard.KEY_RIGHT; + case XK_KP_Down: + return Keyboard.KEY_DOWN; + case XK_KP_Page_Up: + return Keyboard.KEY_PRIOR; + case XK_KP_Page_Down: + return Keyboard.KEY_NEXT; + case XK_KP_End: + return Keyboard.KEY_END; + case XK_KP_Insert: + return Keyboard.KEY_INSERT; + case XK_KP_Delete: + return Keyboard.KEY_DELETE; + case XK_KP_Equal: + return Keyboard.KEY_NUMPADEQUALS; + case XK_KP_Multiply: + return Keyboard.KEY_MULTIPLY; + case XK_KP_Add: + return Keyboard.KEY_ADD; + case XK_KP_Subtract: + return Keyboard.KEY_SUBTRACT; + case XK_KP_Decimal: + return Keyboard.KEY_DECIMAL; + case XK_KP_Divide: + return Keyboard.KEY_DIVIDE; + + case XK_KP_0: + return Keyboard.KEY_NUMPAD0; + case XK_KP_1: + return Keyboard.KEY_NUMPAD1; + case XK_KP_2: + return Keyboard.KEY_NUMPAD2; + case XK_KP_3: + return Keyboard.KEY_NUMPAD3; + case XK_KP_4: + return Keyboard.KEY_NUMPAD4; + case XK_KP_5: + return Keyboard.KEY_NUMPAD5; + case XK_KP_6: + return Keyboard.KEY_NUMPAD6; + case XK_KP_7: + return Keyboard.KEY_NUMPAD7; + case XK_KP_8: + return Keyboard.KEY_NUMPAD8; + case XK_KP_9: + return Keyboard.KEY_NUMPAD9; + + /* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + + case XK_F1: + return Keyboard.KEY_F1; + case XK_F2: + return Keyboard.KEY_F2; + case XK_F3: + return Keyboard.KEY_F3; + case XK_F4: + return Keyboard.KEY_F4; + case XK_F5: + return Keyboard.KEY_F5; + case XK_F6: + return Keyboard.KEY_F6; + case XK_F7: + return Keyboard.KEY_F7; + case XK_F8: + return Keyboard.KEY_F8; + case XK_F9: + return Keyboard.KEY_F9; + case XK_F10: + return Keyboard.KEY_F10; + case XK_F11: + return Keyboard.KEY_F11; + case XK_F12: + return Keyboard.KEY_F12; + case XK_F13: + return Keyboard.KEY_F13; + case XK_F14: + return Keyboard.KEY_F14; + case XK_F15: + return Keyboard.KEY_F15; + + /* Modifiers */ + + case XK_Shift_L: + return Keyboard.KEY_LSHIFT; + case XK_Shift_R: + return Keyboard.KEY_RSHIFT; + case XK_Control_L: + return Keyboard.KEY_LCONTROL; + case XK_Control_R: + return Keyboard.KEY_RCONTROL; + case XK_Caps_Lock: + return Keyboard.KEY_CAPITAL; + + case XK_Meta_L: + return Keyboard.KEY_LMENU; + case XK_ISO_Level3_Shift: + case XK_Meta_R: + return Keyboard.KEY_RMENU; + case XK_Alt_L: + return Keyboard.KEY_LMENU; + case XK_Alt_R: + return Keyboard.KEY_RMENU; + + case XK_dead_grave: + return Keyboard.KEY_GRAVE; + case XK_dead_circumflex: + return Keyboard.KEY_CIRCUMFLEX; + + /* + * Latin 1 + * Byte 3 = 0 + */ + case XK_space: + return Keyboard.KEY_SPACE; + case XK_apostrophe: + return Keyboard.KEY_APOSTROPHE; + case XK_comma: + return Keyboard.KEY_COMMA; + case XK_minus: + return Keyboard.KEY_MINUS; + case XK_period: + return Keyboard.KEY_PERIOD; + case XK_slash: + return Keyboard.KEY_SLASH; + case XK_0: + return Keyboard.KEY_0; + case XK_1: + return Keyboard.KEY_1; + case XK_2: + return Keyboard.KEY_2; + case XK_3: + return Keyboard.KEY_3; + case XK_4: + return Keyboard.KEY_4; + case XK_5: + return Keyboard.KEY_5; + case XK_6: + return Keyboard.KEY_6; + case XK_7: + return Keyboard.KEY_7; + case XK_8: + return Keyboard.KEY_8; + case XK_9: + return Keyboard.KEY_9; + case XK_colon: + return Keyboard.KEY_COLON; + case XK_semicolon: + return Keyboard.KEY_SEMICOLON; + case XK_equal: + return Keyboard.KEY_EQUALS; + case XK_at: + return Keyboard.KEY_AT; + case XK_bracketleft: + return Keyboard.KEY_LBRACKET; + case XK_bracketright: + return Keyboard.KEY_RBRACKET; + case XK_asciicircum: + return Keyboard.KEY_CIRCUMFLEX; + case XK_underscore: + return Keyboard.KEY_UNDERLINE; + case XK_grave: + return Keyboard.KEY_GRAVE; + case XK_a: + case XK_A: + return Keyboard.KEY_A; + case XK_b: + case XK_B: + return Keyboard.KEY_B; + case XK_c: + case XK_C: + return Keyboard.KEY_C; + case XK_d: + case XK_D: + return Keyboard.KEY_D; + case XK_e: + case XK_E: + return Keyboard.KEY_E; + case XK_f: + case XK_F: + return Keyboard.KEY_F; + case XK_g: + case XK_G: + return Keyboard.KEY_G; + case XK_h: + case XK_H: + return Keyboard.KEY_H; + case XK_i: + case XK_I: + return Keyboard.KEY_I; + case XK_j: + case XK_J: + return Keyboard.KEY_J; + case XK_k: + case XK_K: + return Keyboard.KEY_K; + case XK_l: + case XK_L: + return Keyboard.KEY_L; + case XK_m: + case XK_M: + return Keyboard.KEY_M; + case XK_n: + case XK_N: + return Keyboard.KEY_N; + case XK_o: + case XK_O: + return Keyboard.KEY_O; + case XK_p: + case XK_P: + return Keyboard.KEY_P; + case XK_q: + case XK_Q: + return Keyboard.KEY_Q; + case XK_r: + case XK_R: + return Keyboard.KEY_R; + case XK_s: + case XK_S: + return Keyboard.KEY_S; + case XK_t: + case XK_T: + return Keyboard.KEY_T; + case XK_u: + case XK_U: + return Keyboard.KEY_U; + case XK_v: + case XK_V: + return Keyboard.KEY_V; + case XK_w: + case XK_W: + return Keyboard.KEY_W; + case XK_x: + case XK_X: + return Keyboard.KEY_X; + case XK_y: + case XK_Y: + return Keyboard.KEY_Y; + case XK_z: + case XK_Z: + return Keyboard.KEY_Z; + default: + return Keyboard.KEY_NONE; + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxMouse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxMouse.java new file mode 100644 index 0000000..cbac910 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxMouse.java @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Mouse; + +final class LinuxMouse { + private static final int POINTER_WARP_BORDER = 10; + // scale the mouse wheel according to DirectInput + private static final int WHEEL_SCALE = 120; + + private int button_count; + + /* X11 constants */ + private static final int Button1 = 1; + private static final int Button2 = 2; + private static final int Button3 = 3; + private static final int Button4 = 4; + private static final int Button5 = 5; + + private static final int Button6 = 6; // wheel tilt left *rare* + private static final int Button7 = 7; // wheel tilt right *rare* + private static final int Button8 = 8; // back button + private static final int Button9 = 9; // forward button + + private static final int ButtonPress = 4; + private static final int ButtonRelease = 5; + + private final long display; + private final long window; + private final long input_window; + private final long warp_atom; + private final IntBuffer query_pointer_buffer = BufferUtils.createIntBuffer(4); + private final ByteBuffer event_buffer = ByteBuffer.allocate(Mouse.EVENT_SIZE); + + private int last_x; + private int last_y; + private int accum_dx; + private int accum_dy; + private int accum_dz; + private byte[] buttons; + private EventQueue event_queue; + private long last_event_nanos; + + LinuxMouse(long display, long window, long input_window) throws LWJGLException { + this.display = display; + this.window = window; + this.input_window = input_window; + this.warp_atom = LinuxDisplay.nInternAtom(display, "_LWJGL", false); + button_count = nGetButtonCount(display); + buttons = new byte[button_count]; + reset(false, false); + } + + private void reset(boolean grab, boolean warp_pointer) { + event_queue = new EventQueue(event_buffer.capacity()); + accum_dx = accum_dy = 0; + long root_window = nQueryPointer(display, window, query_pointer_buffer); + + int root_x = query_pointer_buffer.get(0); + int root_y = query_pointer_buffer.get(1); + int win_x = query_pointer_buffer.get(2); + int win_y = query_pointer_buffer.get(3); + // Pretend that the cursor never moved + last_x = win_x; + last_y = transformY(win_y); + doHandlePointerMotion(grab, warp_pointer, root_window, root_x, root_y, win_x, win_y, last_event_nanos); + } + + public void read(ByteBuffer buffer) { + event_queue.copyEvents(buffer); + } + + public void poll(boolean grab, IntBuffer coord_buffer, ByteBuffer buttons_buffer) { + if (grab) { + coord_buffer.put(0, accum_dx); + coord_buffer.put(1, accum_dy); + } else { + coord_buffer.put(0, last_x); + coord_buffer.put(1, last_y); + } + coord_buffer.put(2, accum_dz); + accum_dx = accum_dy = accum_dz = 0; + for (int i = 0; i < buttons.length; i++) + buttons_buffer.put(i, buttons[i]); + } + + private void putMouseEventWithCoords(byte button, byte state, int coord1, int coord2, int dz, long nanos) { + event_buffer.clear(); + event_buffer.put(button).put(state).putInt(coord1).putInt(coord2).putInt(dz).putLong(nanos); + event_buffer.flip(); + event_queue.putEvent(event_buffer); + last_event_nanos = nanos; + } + + private void setCursorPos(boolean grab, int x, int y, long nanos) { + y = transformY(y); + int dx = x - last_x; + int dy = y - last_y; + if (dx != 0 || dy != 0) { + accum_dx += dx; + accum_dy += dy; + last_x = x; + last_y = y; + if (grab) { + putMouseEventWithCoords((byte)-1, (byte)0, dx, dy, 0, nanos); + } else { + putMouseEventWithCoords((byte)-1, (byte)0, x, y, 0, nanos); + } + } + } + + private void doWarpPointer(int center_x, int center_y) { + nSendWarpEvent(display, input_window, warp_atom, center_x, center_y); + nWarpCursor(display, window, center_x, center_y); + } + private static native void nSendWarpEvent(long display, long window, long warp_atom, int center_x, int center_y); + + private void doHandlePointerMotion(boolean grab, boolean warp_pointer, long root_window, int root_x, int root_y, int win_x, int win_y, long nanos) { + setCursorPos(grab, win_x, win_y, nanos); + if (!warp_pointer) + return; + int root_window_height = nGetWindowHeight(display, root_window); + int root_window_width = nGetWindowWidth(display, root_window); + int window_height = nGetWindowHeight(display, window); + int window_width = nGetWindowWidth(display, window); + + // find the window position in root coordinates + int win_left = root_x - win_x; + int win_top = root_y - win_y; + int win_right = win_left + window_width; + int win_bottom = win_top + window_height; + // cap the window position to the screen dimensions + int border_left = Math.max(0, win_left); + int border_top = Math.max(0, win_top); + int border_right = Math.min(root_window_width, win_right); + int border_bottom = Math.min(root_window_height, win_bottom); + // determine whether the cursor is outside the bounds + boolean outside_limits = root_x < border_left + POINTER_WARP_BORDER || root_y < border_top + POINTER_WARP_BORDER || + root_x > border_right - POINTER_WARP_BORDER || root_y > border_bottom - POINTER_WARP_BORDER; + if (outside_limits) { + // Find the center of the limits in window coordinates + int center_x = (border_right - border_left)/2; + int center_y = (border_bottom - border_top)/2; + doWarpPointer(center_x, center_y); + } + } + + public void changeGrabbed(boolean grab, boolean warp_pointer) { + reset(grab, warp_pointer); + } + + public int getButtonCount() { + return buttons.length; + } + + private int transformY(int y) { + return nGetWindowHeight(display, window) - 1 - y; + } + private static native int nGetWindowHeight(long display, long window); + private static native int nGetWindowWidth(long display, long window); + + private static native int nGetButtonCount(long display); + + private static native long nQueryPointer(long display, long window, IntBuffer result); + + public void setCursorPosition(int x, int y) { + nWarpCursor(display, window, x, transformY(y)); + } + private static native void nWarpCursor(long display, long window, int x, int y); + + private void handlePointerMotion(boolean grab, boolean warp_pointer, long millis, long root_window, int x_root, int y_root, int x, int y) { + doHandlePointerMotion(grab, warp_pointer, root_window, x_root, y_root, x, y, millis*1000000); + } + + private void handleButton(boolean grab, int button, byte state, long nanos) { + byte button_num; + switch (button) { + case Button1: + button_num = (byte)0; + break; + case Button2: + button_num = (byte)2; + break; + case Button3: + button_num = (byte)1; + break; + case Button6: + button_num = (byte)5; + break; + case Button7: + button_num = (byte)6; + break; + case Button8: + button_num = (byte)3; // back button + break; + case Button9: + button_num = (byte)4; // forward button + break; + default: + if (button > Button9 && button <= button_count) { + button_num = (byte)(button-1); + break; + } + return; + } + buttons[button_num] = state; + putMouseEvent(grab, button_num, state, 0, nanos); + } + + private void putMouseEvent(boolean grab, byte button, byte state, int dz, long nanos) { + if (grab) + putMouseEventWithCoords(button, state, 0, 0, dz, nanos); + else + putMouseEventWithCoords(button, state, last_x, last_y, dz, nanos); + } + + private void handleButtonPress(boolean grab, byte button, long nanos) { + int delta = 0; + switch (button) { + case Button4: + delta = WHEEL_SCALE; + putMouseEvent(grab, (byte)-1, (byte)0, delta, nanos); + accum_dz += delta; + break; + case Button5: + delta = -WHEEL_SCALE; + putMouseEvent(grab, (byte)-1, (byte)0, delta, nanos); + accum_dz += delta; + break; + default: + handleButton(grab, button, (byte)1, nanos); + break; + } + } + + private void handleButtonEvent(boolean grab, long millis, int type, byte button) { + long nanos = millis*1000000; + switch (type) { + case ButtonRelease: + handleButton(grab, button, (byte)0, nanos); + break; + case ButtonPress: + handleButtonPress(grab, button, nanos); + break; + default: + break; + } + } + + private void resetCursor(int x, int y) { + last_x = x; + last_y = transformY(y); + } + + private void handleWarpEvent(int x, int y) { + resetCursor(x, y); + } + + public boolean filterEvent(boolean grab, boolean warp_pointer, LinuxEvent event) { + switch (event.getType()) { + case LinuxEvent.ClientMessage: + if (event.getClientMessageType() == warp_atom) { + handleWarpEvent(event.getClientData(0), event.getClientData(1)); + return true; + } + break; + case LinuxEvent.ButtonPress: /* Fall through */ + case LinuxEvent.ButtonRelease: + handleButtonEvent(grab, event.getButtonTime(), event.getButtonType(), (byte)event.getButtonButton()); + return true; + case LinuxEvent.MotionNotify: + handlePointerMotion(grab, warp_pointer, event.getButtonTime(), event.getButtonRoot(), event.getButtonXRoot(), event.getButtonYRoot(), event.getButtonX(), event.getButtonY()); + return true; + default: + break; + } + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPbufferPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPbufferPeerInfo.java new file mode 100644 index 0000000..afcbc95 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPbufferPeerInfo.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class LinuxPbufferPeerInfo extends LinuxPeerInfo { + LinuxPbufferPeerInfo(int width, int height, PixelFormat pixel_format) throws LWJGLException { + LinuxDisplay.lockAWT(); + try { + GLContext.loadOpenGLLibrary(); + try { + LinuxDisplay.incDisplay(); + try { + nInitHandle(LinuxDisplay.getDisplay(), LinuxDisplay.getDefaultScreen(), getHandle(), width, height, pixel_format); + } catch (LWJGLException e) { + LinuxDisplay.decDisplay(); + throw e; + } + } catch (LWJGLException e) { + GLContext.unloadOpenGLLibrary(); + throw e; + } + } finally { + LinuxDisplay.unlockAWT(); + } + } + private static native void nInitHandle(long display, int screen, ByteBuffer handle, int width, int height, PixelFormat pixel_format) throws LWJGLException; + + public void destroy() { + LinuxDisplay.lockAWT(); + nDestroy(getHandle()); + LinuxDisplay.decDisplay(); + GLContext.unloadOpenGLLibrary(); + LinuxDisplay.unlockAWT(); + } + private static native void nDestroy(ByteBuffer handle); + + protected void doLockAndInitHandle() throws LWJGLException { + // NO-OP + } + + protected void doUnlock() throws LWJGLException { + // NO-OP + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPeerInfo.java new file mode 100644 index 0000000..6747d76 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/LinuxPeerInfo.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +abstract class LinuxPeerInfo extends PeerInfo { + LinuxPeerInfo() { + super(createHandle()); + } + private static native ByteBuffer createHandle(); + + public final long getDisplay() { + return nGetDisplay(getHandle()); + } + private static native long nGetDisplay(ByteBuffer handle); + + public final long getDrawable() { + return nGetDrawable(getHandle()); + } + private static native long nGetDrawable(ByteBuffer handle); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXAWTGLCanvasPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXAWTGLCanvasPeerInfo.java new file mode 100644 index 0000000..2831923 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXAWTGLCanvasPeerInfo.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +import java.awt.Canvas; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXAWTGLCanvasPeerInfo extends MacOSXCanvasPeerInfo { + private final Canvas component; + + MacOSXAWTGLCanvasPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException { + super(pixel_format, attribs, support_pbuffer); + this.component = component; + } + + protected void doLockAndInitHandle() throws LWJGLException { + initHandle(component); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasImplementation.java new file mode 100644 index 0000000..0009fd4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasImplementation.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Canvas; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXCanvasImplementation implements AWTCanvasImplementation { + public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + try { + return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, attribs, true); + } catch (LWJGLException e) { + return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, attribs, false); + } + } + + /** + * Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat. + * + * @return The GraphicsConfiguration corresponding to a visual that matches the pixel format. + */ + public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException { + /* + * It seems like the best way is to simply return null + */ + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java new file mode 100644 index 0000000..ad955c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * The AWT compatible Canvas for Mac OS X. + * @author elias_naur + */ + +import java.awt.Canvas; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; + +final class MacOSXCanvasListener implements ComponentListener, HierarchyListener { + private final Canvas canvas; + private int width; + private int height; + private boolean context_update; + private boolean resized; + + MacOSXCanvasListener(Canvas canvas) { + this.canvas = canvas; + canvas.addComponentListener(this); + canvas.addHierarchyListener(this); + setUpdate(); + } + + public void disableListeners() { + // Mac OS X applets will hang in Display.destroy() when parented when removing the listeners directly + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + canvas.removeComponentListener(MacOSXCanvasListener.this); + canvas.removeHierarchyListener(MacOSXCanvasListener.this); + } + }); + } + + public boolean syncShouldUpdateContext() { + boolean should_update; + synchronized ( this ) { + should_update = context_update; + context_update = false; + } + return should_update; + } + + private synchronized void setUpdate() { + synchronized ( this ) { + width = canvas.getWidth(); + height = canvas.getHeight(); + context_update = true; + } + } + + public int syncGetWidth() { + synchronized ( this ) { + return width; + } + } + + public int syncGetHeight() { + synchronized ( this ) { + return height; + } + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + setUpdate(); + resized = true; + } + + public void componentMoved(ComponentEvent e) { + setUpdate(); + } + + public void hierarchyChanged(HierarchyEvent e) { + setUpdate(); + } + + public boolean wasResized() { + if (resized) { + resized = false; + return true; + } + + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java new file mode 100644 index 0000000..412a7da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.Canvas; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.Insets; +import java.awt.Container; +import java.awt.Component; +import java.awt.Point; +import java.awt.Window; +import java.nio.ByteBuffer; + +import javax.swing.SwingUtilities; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + * $Id$ + */ +abstract class MacOSXCanvasPeerInfo extends MacOSXPeerInfo { + private final AWTSurfaceLock awt_surface = new AWTSurfaceLock(); + public ByteBuffer window_handle; + + protected MacOSXCanvasPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException { + super(pixel_format, attribs, true, true, support_pbuffer, true); + } + + protected void initHandle(Canvas component) throws LWJGLException { + boolean forceCALayer = true; + boolean autoResizable = true; // set the CALayer to autoResize + + String javaVersion = System.getProperty("java.version"); + + if (javaVersion.startsWith("1.5") || javaVersion.startsWith("1.6")) { + // On Java 7 and newer CALayer mode is the only way to use OpenGL with AWT + // therefore force it on all JVM's except for the older Java 5 and Java 6 + // where the older cocoaViewRef NSView method maybe be available. + forceCALayer = false; + } + else if (javaVersion.startsWith("1.7")) { + autoResizable = false; + } + + Insets insets = getInsets(component); + + int top = insets != null ? insets.top : 0; + int left = insets != null ? insets.left : 0; + + window_handle = nInitHandle(awt_surface.lockAndGetHandle(component), getHandle(), window_handle, forceCALayer, autoResizable, component.getX()-left, component.getY()-top); + + if (javaVersion.startsWith("1.7")) { + // fix for CALayer position not covering Canvas due to a Java 7 bug + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7172187 + addComponentListener(component); + + if (SwingUtilities.getWindowAncestor(component.getParent()) != null) { + Point componentPosition = SwingUtilities.convertPoint(component, component.getLocation(), null); + Point parentPosition = SwingUtilities.convertPoint(component.getParent(), component.getLocation(), null); + + if (componentPosition.getX() == parentPosition.getX() && componentPosition.getY() == parentPosition.getY()) { + insets = getWindowInsets(component); + + top = insets != null ? insets.top : 0; + left = insets != null ? insets.left : 0; + + int x = (int)componentPosition.getX()-left; + int y = (int)-componentPosition.getY()+top-component.getHeight(); + + int width = component.getWidth(); + int height = component.getHeight(); + + nSetLayerBounds(getHandle(), x, y, width, height); + } + } + } + } + + private void addComponentListener(final Canvas component) { + + ComponentListener[] components = component.getComponentListeners(); + + // avoid adding duplicate listners by checking if one has already been added + for (int i = 0; i < components.length; i++) { + ComponentListener c = components[i]; + if (c.toString() == "CanvasPeerInfoListener") { + return; // already contains the listner below return without adding + } + } + + ComponentListener comp = new ComponentListener() { + public void componentHidden(ComponentEvent e) { + + } + + public void componentMoved(ComponentEvent e) { + + if (SwingUtilities.getWindowAncestor(component.getParent()) != null) { + Point componentPosition = SwingUtilities.convertPoint(component, component.getLocation(), null); + Point parentPosition = SwingUtilities.convertPoint(component.getParent(), component.getLocation(), null); + + if (componentPosition.getX() == parentPosition.getX() && componentPosition.getY() == parentPosition.getY()) { + Insets insets = getWindowInsets(component); + + int top = insets != null ? insets.top : 0; + int left = insets != null ? insets.left : 0; + + nSetLayerBounds(getHandle(), (int)componentPosition.getX()-left, (int)componentPosition.getY()-top, component.getWidth(), component.getHeight()); + return; + } + } + + Insets insets = getInsets(component); + + int top = insets != null ? insets.top : 0; + int left = insets != null ? insets.left : 0; + + //nSetLayerPosition(getHandle(), component.getX() - left, component.getY() - top); + nSetLayerBounds(getHandle(), component.getX() - left, component.getY() - top, component.getWidth(), component.getHeight()); + } + + public void componentResized(ComponentEvent e) { + + if (SwingUtilities.getWindowAncestor(component.getParent()) != null) { + Point componentPosition = SwingUtilities.convertPoint(component, component.getLocation(), null); + Point parentPosition = SwingUtilities.convertPoint(component.getParent(), component.getLocation(), null); + + if (componentPosition.getX() == parentPosition.getX() && componentPosition.getY() == parentPosition.getY()) { + Insets insets = getWindowInsets(component); + + int top = insets != null ? insets.top : 0; + int left = insets != null ? insets.left : 0; + + nSetLayerBounds(getHandle(), (int)componentPosition.getX()-left, (int)componentPosition.getY()-top, component.getWidth(), component.getHeight()); + return; + } + } + + Insets insets = getInsets(component); + + int top = insets != null ? insets.top : 0; + int left = insets != null ? insets.left : 0; + + //nSetLayerPosition(getHandle(), component.getX() - left, component.getY() - top); + nSetLayerBounds(getHandle(), component.getX() - left, component.getY() - top, component.getWidth(), component.getHeight()); + } + + public void componentShown(ComponentEvent e) { + + } + + public String toString() { + return "CanvasPeerInfoListener"; + } + }; + + component.addComponentListener(comp); + } + + private static native ByteBuffer nInitHandle(ByteBuffer surface_buffer, ByteBuffer peer_info_handle, ByteBuffer window_handle, boolean forceCALayer, boolean autoResizable, int x, int y) throws LWJGLException; + + private static native void nSetLayerPosition(ByteBuffer peer_info_handle, int x, int y); + + private static native void nSetLayerBounds(ByteBuffer peer_info_handle, int x, int y, int width, int height); + + protected void doUnlock() throws LWJGLException { + awt_surface.unlock(); + } + + /** + * Return the Insets of the Window holding the Canvas + */ + private Insets getWindowInsets(Canvas canvas) { + Container parent = canvas.getParent(); + + while (parent != null) { + if(parent instanceof Window || parent instanceof java.applet.Applet) { + return parent.getInsets(); + } + + parent = parent.getParent(); + } + + // if no parent Window or Applet found, return null + return null; + } + + private Insets getInsets(Canvas component) { + Component parent = component.getParent(); + + while (parent != null) { + if (parent instanceof Container) { + return ((Container)parent).getInsets(); + } + parent = parent.getParent(); + } + + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java new file mode 100644 index 0000000..c782d8b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXContextImplementation implements ContextImplementation { + + public ByteBuffer create(PeerInfo peer_info, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + return nCreate(peer_handle, shared_context_handle); + } finally { + peer_info.unlock(); + } + } + + private static native ByteBuffer nCreate(ByteBuffer peer_handle, ByteBuffer shared_context_handle) throws LWJGLException; + + public void swapBuffers() throws LWJGLException { + ContextGL current_context = ContextGL.getCurrentContext(); + if ( current_context == null ) + throw new IllegalStateException("No context is current"); + synchronized ( current_context ) { + nSwapBuffers(current_context.getHandle()); + } + } + + native long getCGLShareGroup(ByteBuffer context_handle); + + private static native void nSwapBuffers(ByteBuffer context_handle) throws LWJGLException; + + public void update(ByteBuffer context_handle) { + nUpdate(context_handle); + } + + private static native void nUpdate(ByteBuffer context_handle); + + public void releaseCurrentContext() throws LWJGLException { + nReleaseCurrentContext(); + } + + private static native void nReleaseCurrentContext() throws LWJGLException; + + public void releaseDrawable(ByteBuffer context_handle) throws LWJGLException { + clearDrawable(context_handle); + } + + private static native void clearDrawable(ByteBuffer handle) throws LWJGLException; + + static void resetView(PeerInfo peer_info, ContextGL context) throws LWJGLException { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + synchronized ( context ) { + clearDrawable(context.getHandle()); + setView(peer_handle, context.getHandle()); + } + } finally { + peer_info.unlock(); + } + } + + public void makeCurrent(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + setView(peer_handle, handle); + nMakeCurrent(handle); + } finally { + peer_info.unlock(); + } + } + + private static native void setView(ByteBuffer peer_handle, ByteBuffer context_handle) throws LWJGLException; + + private static native void nMakeCurrent(ByteBuffer context_handle) throws LWJGLException; + + public boolean isCurrent(ByteBuffer handle) throws LWJGLException { + boolean result = nIsCurrent(handle); + return result; + } + + private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; + + public void setSwapInterval(int value) { + ContextGL current_context = ContextGL.getCurrentContext(); + synchronized ( current_context ) { + nSetSwapInterval(current_context.getHandle(), value); + } + } + + private static native void nSetSwapInterval(ByteBuffer context_handle, int value); + + public void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + nDestroy(handle); + } + + private static native void nDestroy(ByteBuffer context_handle) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplay.java new file mode 100644 index 0000000..612f2eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -0,0 +1,641 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Display implementation interface. Display delegates + * to implementors of this interface. There is one DisplayImplementation + * for each supported platform. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author mojang + * @author kappaOne <one.kappa@gmail.com> + */ + +import java.awt.Canvas; +import java.awt.Robot; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Cursor; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.BufferUtils; +import org.lwjgl.MemoryUtil; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +import static org.lwjgl.opengl.GL11.*; + +final class MacOSXDisplay implements DisplayImplementation { + private static final int PBUFFER_HANDLE_SIZE = 24; + private static final int GAMMA_LENGTH = 256; + + //private MacOSXCanvasListener canvas_listener; + private Canvas canvas; + private Robot robot; + private MacOSXMouseEventQueue mouse_queue; + private KeyboardEventQueue keyboard_queue; + private DisplayMode requested_mode; + + /* Members for native window use */ + private MacOSXNativeMouse mouse; + private MacOSXNativeKeyboard keyboard; + private ByteBuffer window; + private ByteBuffer context; + + private boolean skipViewportValue = false; + private static final IntBuffer current_viewport = BufferUtils.createIntBuffer(16); + + private boolean mouseInsideWindow; + + private boolean close_requested; + + private boolean native_mode = true; + + private boolean updateNativeCursor = false; + + private long currentNativeCursor = 0; + + private boolean enableHighDPI = false; + + private float scaleFactor = 1.0f; + + MacOSXDisplay() { + + } + + private native ByteBuffer nCreateWindow(int x, int y, int width, int height, boolean fullscreen, boolean undecorated, boolean resizable, boolean parented, boolean enableFullscreenModeAPI, boolean enableHighDPI, ByteBuffer peer_info_handle, ByteBuffer window_handle) throws LWJGLException; + + private native Object nGetCurrentDisplayMode(); + + private native void nGetDisplayModes(Object modesList); + + private native boolean nIsMiniaturized(ByteBuffer window_handle); + + private native boolean nIsFocused(ByteBuffer window_handle); + + private native void nSetResizable(ByteBuffer window_handle, boolean resizable); + + private native void nResizeWindow(ByteBuffer window_handle, int x, int y, int width, int height); + + private native boolean nWasResized(ByteBuffer window_handle); + + private native int nGetX(ByteBuffer window_handle); + + private native int nGetY(ByteBuffer window_handle); + + private native int nGetWidth(ByteBuffer window_handle); + + private native int nGetHeight(ByteBuffer window_handle); + + private native boolean nIsNativeMode(ByteBuffer peer_info_handle); + + private static boolean isUndecorated() { + return Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.undecorated"); + } + + public void createWindow(final DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException { + boolean fullscreen = Display.isFullscreen(); + boolean resizable = Display.isResizable(); + boolean parented = (parent != null) && !fullscreen; + + // OS X fullscreen mode API is only available on OS X 10.7+ + boolean enableFullscreenModeAPI = LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 7) && parent == null && + !Display.getPrivilegedBoolean("org.lwjgl.opengl.Display.disableOSXFullscreenModeAPI"); + + // OS X high DPI mode is only available on OS X 10.7+ + enableHighDPI = LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 7) && parent == null && + (Display.getPrivilegedBoolean("org.lwjgl.opengl.Display.enableHighDPI") || fullscreen); + + if (parented) this.canvas = parent; + else this.canvas = null; + + close_requested = false; + + DrawableGL gl_drawable = (DrawableGL)Display.getDrawable(); + PeerInfo peer_info = gl_drawable.peer_info; + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + ByteBuffer window_handle = parented ? ((MacOSXCanvasPeerInfo)peer_info).window_handle : window; + + try { + + window = nCreateWindow(x, y, mode.getWidth(), mode.getHeight(), + fullscreen, isUndecorated(), resizable, + parented, enableFullscreenModeAPI, enableHighDPI, peer_handle, window_handle); + + if (fullscreen) { + // when going to fullscreen viewport is set to screen size by Cocoa, ignore this value + skipViewportValue = true; + // if starting in fullscreen then set initial viewport to displaymode size + if (current_viewport.get(2) == 0 && current_viewport.get(3) == 0) { + current_viewport.put(2, mode.getWidth()); + current_viewport.put(3, mode.getHeight()); + } + } + + native_mode = nIsNativeMode(peer_handle); + + if (!native_mode) { + robot = AWTUtil.createRobot(canvas); + } + + } catch (LWJGLException e) { + destroyWindow(); + throw e; + } finally { + peer_info.unlock(); + } + } + + public void doHandleQuit() { + synchronized (this) { + close_requested = true; + } + } + + public void mouseInsideWindow(boolean inside) { + synchronized (this) { + mouseInsideWindow = inside; + } + updateNativeCursor = true; + } + + public void setScaleFactor(float scale) { + synchronized (this) { + scaleFactor = scale; + } + } + + public native void nDestroyCALayer(ByteBuffer peer_info_handle); + + public native void nDestroyWindow(ByteBuffer window_handle); + + public void destroyWindow() { + + if (!native_mode) { + DrawableGL gl_drawable = (DrawableGL)Display.getDrawable(); + PeerInfo peer_info = gl_drawable.peer_info; + if (peer_info != null) { + ByteBuffer peer_handle = peer_info.getHandle(); + nDestroyCALayer(peer_handle); + } + robot = null; + } + + nDestroyWindow(window); + } + + public int getGammaRampLength() { + return GAMMA_LENGTH; + } + + public native void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException; + + public String getAdapter() { + return null; + } + + public String getVersion() { + return null; + } + + private static boolean equals(DisplayMode mode1, DisplayMode mode2) { + return mode1.getWidth() == mode2.getWidth() && mode1.getHeight() == mode2.getHeight() + && mode1.getBitsPerPixel() == mode2.getBitsPerPixel() && mode1.getFrequency() == mode2.getFrequency(); + } + + public void switchDisplayMode(DisplayMode mode) throws LWJGLException { + DisplayMode[] modes = getAvailableDisplayModes(); + + for (DisplayMode available_mode : modes) { + if (equals(available_mode, mode)) { + requested_mode = available_mode; + return; + } + } + + throw new LWJGLException(mode + " is not supported"); + } + + public void resetDisplayMode() { + requested_mode = null; + restoreGamma(); + } + + private native void restoreGamma(); + + public Object createDisplayMode(int width, int height, int bitsPerPixel, int refreshRate) { + return new DisplayMode(width, height, bitsPerPixel, refreshRate); + } + + public DisplayMode init() throws LWJGLException { + return (DisplayMode) nGetCurrentDisplayMode(); + } + + public void addDisplayMode(Object modesList, int width, int height, int bitsPerPixel, int refreshRate) { + List<DisplayMode> modes = (List<DisplayMode>) modesList; + DisplayMode displayMode = new DisplayMode(width, height, bitsPerPixel, refreshRate); + modes.add(displayMode); + } + + public DisplayMode[] getAvailableDisplayModes() throws LWJGLException { + List<DisplayMode> modes = new ArrayList<DisplayMode>(); + nGetDisplayModes(modes); // will populate the above list + modes.add(Display.getDesktopDisplayMode()); // add desktop resolution as scaled resolutions do not appear + return modes.toArray(new DisplayMode[modes.size()]); + } + + private native void nSetTitle(ByteBuffer window_handle, ByteBuffer title_buffer); + + public void setTitle(String title) { + ByteBuffer buffer = MemoryUtil.encodeUTF8(title); + nSetTitle(window, buffer); + } + + public boolean isCloseRequested() { + boolean result; + synchronized (this) { + result = close_requested; + close_requested = false; + } + return result; + } + + public boolean isVisible() { + return true; + } + + public boolean isActive() { + if (native_mode) { + return nIsFocused(window); + } + else { + return Display.getParent().hasFocus(); + } + } + + public Canvas getCanvas() { + return canvas; + } + + public boolean isDirty() { + return false; + } + + public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + try { + return new MacOSXDisplayPeerInfo(pixel_format, attribs, true); + } catch (LWJGLException e) { + return new MacOSXDisplayPeerInfo(pixel_format, attribs, false); + } + } + + public void update() { + boolean should_update = true; + + DrawableGL drawable = (DrawableGL)Display.getDrawable(); + if (should_update) { + drawable.context.update(); + /* This is necessary to make sure the context won't "forget" about the view size */ + if (skipViewportValue) skipViewportValue = false; + else glGetInteger(GL_VIEWPORT, current_viewport); + glViewport(current_viewport.get(0), current_viewport.get(1), current_viewport.get(2), current_viewport.get(3)); + } + + if (native_mode && updateNativeCursor) { + updateNativeCursor = false; + try { + setNativeCursor(currentNativeCursor); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + } + + public void reshape(int x, int y, int width, int height) { + //if (native_mode) { + // nResizeWindow(window, x, y, width, height); + //} + } + + /* Mouse */ + public boolean hasWheel() { + return AWTUtil.hasWheel(); + } + + public int getButtonCount() { + return AWTUtil.getButtonCount(); + } + + public void createMouse() throws LWJGLException { + if (native_mode) { + mouse = new MacOSXNativeMouse(this, window); + mouse.register(); + } + else { + this.mouse_queue = new MacOSXMouseEventQueue(canvas); + mouse_queue.register(); + } + } + + public void destroyMouse() { + if (native_mode) { + // restore default native cursor + try { + MacOSXNativeMouse.setCursor(0); + } catch (LWJGLException e) {}; + + // release any mouse grab + grabMouse(false); + + if (mouse != null) { + mouse.unregister(); + } + mouse = null; + } + else { + if (mouse_queue != null) { + MacOSXMouseEventQueue.nGrabMouse(false); + mouse_queue.unregister(); + } + this.mouse_queue = null; + } + } + + public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons_buffer) { + if (native_mode) { + mouse.poll(coord_buffer, buttons_buffer); + } + else { + mouse_queue.poll(coord_buffer, buttons_buffer); + } + } + + public void readMouse(ByteBuffer buffer) { + if (native_mode) { + mouse.copyEvents(buffer); + } + else { + mouse_queue.copyEvents(buffer); + } + } + + public void grabMouse(boolean grab) { + if (native_mode) { + mouse.setGrabbed(grab); + } + else { + mouse_queue.setGrabbed(grab); + } + } + + public int getNativeCursorCapabilities() { + if (native_mode) { + return Cursor.CURSOR_ONE_BIT_TRANSPARENCY | Cursor.CURSOR_8_BIT_ALPHA | Cursor.CURSOR_ANIMATION; + } + + return AWTUtil.getNativeCursorCapabilities(); + } + + public void setCursorPosition(int x, int y) { + if (native_mode) { + if (mouse != null) { + mouse.setCursorPosition(x, y); + } + } + //else { + //MacOSXMouseEventQueue.nWarpCursor(x, y); + //} + } + + public void setNativeCursor(Object handle) throws LWJGLException { + if (native_mode) { + currentNativeCursor = getCursorHandle(handle); + if (Display.isCreated()) { + if (mouseInsideWindow) MacOSXNativeMouse.setCursor(currentNativeCursor); + else MacOSXNativeMouse.setCursor(0); // restore default cursor if outside Display + } + } + } + + public int getMinCursorSize() { + return 1; + } + + public int getMaxCursorSize() { + // as there is no max cursor size limit on OS X + // return the max cursor size as half the screen resolution + DisplayMode dm = Display.getDesktopDisplayMode(); + return Math.min(dm.getWidth(), dm.getHeight()) / 2; + } + + /* Keyboard */ + public void createKeyboard() throws LWJGLException { + if (native_mode) { + this.keyboard = new MacOSXNativeKeyboard(window); + keyboard.register(); + } + else { + this.keyboard_queue = new KeyboardEventQueue(canvas); + keyboard_queue.register(); + } + } + + public void destroyKeyboard() { + if (native_mode) { + if (keyboard != null) { + keyboard.unregister(); + } + keyboard = null; + } + else { + if (keyboard_queue != null) { + keyboard_queue.unregister(); + } + this.keyboard_queue = null; + } + } + + public void pollKeyboard(ByteBuffer keyDownBuffer) { + if (native_mode) { + keyboard.poll(keyDownBuffer); + } + else { + keyboard_queue.poll(keyDownBuffer); + } + } + + public void readKeyboard(ByteBuffer buffer) { + if (native_mode) { + keyboard.copyEvents(buffer); + } + else { + keyboard_queue.copyEvents(buffer); + } + } + + /** Native cursor handles */ + public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + if (native_mode) { + long cursor = MacOSXNativeMouse.createCursor(width, height, xHotspot, yHotspot, numImages, images, delays); + return cursor; + } + else { + return AWTUtil.createCursor(width, height, xHotspot, yHotspot, numImages, images, delays); + } + } + + public void destroyCursor(Object cursor_handle) { + long handle = getCursorHandle(cursor_handle); + + // reset current cursor if same + if (currentNativeCursor == handle) { + currentNativeCursor = 0; + } + + MacOSXNativeMouse.destroyCursor(handle); + } + + private static long getCursorHandle(Object cursor_handle) { + return cursor_handle != null ? (Long)cursor_handle : 0; + } + + public int getPbufferCapabilities() { + return Pbuffer.PBUFFER_SUPPORTED; + } + + public boolean isBufferLost(PeerInfo handle) { + return false; + } + + public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, + IntBuffer pixelFormatCaps, + IntBuffer pBufferAttribs) throws LWJGLException { + return new MacOSXPbufferPeerInfo(width, height, pixel_format, attribs); + } + + public void setPbufferAttrib(PeerInfo handle, int attrib, int value) { + throw new UnsupportedOperationException(); + } + + public void bindTexImageToPbuffer(PeerInfo handle, int buffer) { + throw new UnsupportedOperationException(); + } + + public void releaseTexImageFromPbuffer(PeerInfo handle, int buffer) { + throw new UnsupportedOperationException(); + } + + /** + * Sets one or more icons for the Display. + * <ul> + * <li>On Windows you should supply at least one 16x16 icon and one 32x32.</li> + * <li>Linux (and similar platforms) expect one 32x32 icon.</li> + * <li>Mac OS X should be supplied one 128x128 icon</li> + * </ul> + * The implementation will use the supplied ByteBuffers with image data in RGBA and perform any conversions nescesarry for the specific platform. + * + * @param icons Array of icons in RGBA mode + * @return number of icons used. + */ + public int setIcon(ByteBuffer[] icons) { + /*int size = 0; + int biggest = -1; + + for (int i=0;i<icons.length;i++) { + if (icons[i].remaining() > size) { + biggest = i; + size = icons[i].remaining(); + } + } + + if (biggest == -1) { + return 0; + } + + int width; + int height; + + IntBuffer biggest_icon = icons[biggest].asIntBuffer(); + int[] imageData = new int[biggest_icon.remaining()]; + width = height = (int) Math.sqrt(imageData.length); + biggest_icon.get(imageData); + + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + img.setRGB(0, 0, width, height, imageData, 0, width); + frame.setIconImage(img); + + return 1;*/ + // Don't use any icon, since Mac OS X windows don't have window icons + return 0; + } + + public int getX() { + return nGetX(window); + } + + public int getY() { + return nGetY(window); + } + + public int getWidth() { + return nGetWidth(window); + } + + public int getHeight() { + return nGetHeight(window); + } + + public boolean isInsideWindow() { + return mouseInsideWindow; + } + + public void setResizable(boolean resizable) { + nSetResizable(window, resizable); + } + + public boolean wasResized() { + return nWasResized(window); + } + + public float getPixelScaleFactor() { + return (enableHighDPI && !Display.isFullscreen()) ? scaleFactor : 1f; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplayPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplayPeerInfo.java new file mode 100644 index 0000000..e663e80 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXDisplayPeerInfo.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.Canvas; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXDisplayPeerInfo extends MacOSXCanvasPeerInfo { + private boolean locked; + + MacOSXDisplayPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException { + super(pixel_format, attribs, support_pbuffer); + } + + protected void doLockAndInitHandle() throws LWJGLException { + if (locked) + throw new RuntimeException("Already locked"); + Canvas canvas = ((MacOSXDisplay)Display.getImplementation()).getCanvas(); + if (canvas != null) { + initHandle(canvas); + locked = true; + } + } + + protected void doUnlock() throws LWJGLException { + if (locked) { + super.doUnlock(); + locked = false; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java new file mode 100644 index 0000000..39f8050 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * The AWT compatible Canvas for Mac OS X. + * @author elias_naur + */ + +import java.awt.Canvas; +import java.awt.Graphics; + +final class MacOSXGLCanvas extends Canvas { + + private static final long serialVersionUID = 6916664741667434870L; + + private boolean canvas_painted; + private boolean dirty; + + public void update(Graphics g) { + paint(g); + } + + public void paint(Graphics g) { + synchronized ( this ) { + dirty = true; + canvas_painted = true; + } + } + + public boolean syncCanvasPainted() { + boolean result; + synchronized (this) { + result = canvas_painted; + canvas_painted = false; + } + return result; + } + + public boolean syncIsDirty() { + boolean result; + synchronized ( this ) { + result = dirty; + dirty = false; + } + return result; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java new file mode 100644 index 0000000..e584aa3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * An AWT implementation of a LWJGL compatible Mouse event queue. + * @author elias_naur + */ + +import java.awt.Component; +import java.awt.Point; +import java.awt.Rectangle; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; + +final class MacOSXMouseEventQueue extends MouseEventQueue { + private final IntBuffer delta_buffer = BufferUtils.createIntBuffer(2); + + private boolean skip_event; + private static boolean is_grabbed; + + MacOSXMouseEventQueue(Component component) { + super(component); + } + + public void setGrabbed(boolean grab) { + if (is_grabbed != grab) { + super.setGrabbed(grab); + warpCursor(); + grabMouse(grab); + } + } + + private static synchronized void grabMouse(boolean grab) { + is_grabbed = grab; + if (!grab) + nGrabMouse(grab); + } + + protected void resetCursorToCenter() { + super.resetCursorToCenter(); + /* Clear accumulated deltas */ + getMouseDeltas(delta_buffer); + } + + protected void updateDeltas(long nanos) { + super.updateDeltas(nanos); + synchronized ( this ) { + getMouseDeltas(delta_buffer); + int dx = delta_buffer.get(0); + int dy = -delta_buffer.get(1); + if (skip_event) { + skip_event = false; + nGrabMouse(isGrabbed()); + return; + } + if ( dx != 0 || dy != 0 ) { + putMouseEventWithCoords((byte)-1, (byte)0, dx, dy, 0, nanos); + addDelta(dx, dy); + } + } + } + + void warpCursor() { + synchronized (this) { + // If we're going to warp the cursor position, we'll skip the next event to avoid bogus delta values + skip_event = isGrabbed(); + } + if (isGrabbed()) { + Rectangle bounds = getComponent().getBounds(); + Point location_on_screen = getComponent().getLocationOnScreen(); + int x = location_on_screen.x + bounds.width/2; + int y = location_on_screen.y + bounds.height/2; + nWarpCursor(x, y); + } + } + + private static native void getMouseDeltas(IntBuffer delta_buffer); + + private static native void nWarpCursor(int x, int y); + + static native void nGrabMouse(boolean grab); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java new file mode 100644 index 0000000..e2574c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeKeyboard.java @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * A native implementation of a LWJGL compatible Keyboard event queue. + * @author elias_naur + * @author mojang + */ + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.HashMap; +import java.awt.Component; +import java.nio.ByteBuffer; + +import org.lwjgl.input.Keyboard; + +final class MacOSXNativeKeyboard extends EventQueue { + private final byte[] key_states = new byte[Keyboard.KEYBOARD_SIZE]; + + /** Event scratch array */ + private final ByteBuffer event = ByteBuffer.allocate(Keyboard.EVENT_SIZE); + + private ByteBuffer window_handle; + + private boolean has_deferred_event; + private long deferred_nanos; + private int deferred_key_code; + private byte deferred_key_state; + private int deferred_character; + + private HashMap<Short, Integer> nativeToLwjglMap; + + MacOSXNativeKeyboard(ByteBuffer window_handle) { + super(Keyboard.EVENT_SIZE); + nativeToLwjglMap = new HashMap<Short, Integer>(); + initKeyboardMappings(); + this.window_handle = window_handle; + } + + private native void nRegisterKeyListener(ByteBuffer window_handle); + + private native void nUnregisterKeyListener(ByteBuffer window_handle); + + // These are from: <HIToolbox/Events.h> + private void initKeyboardMappings() { + nativeToLwjglMap.put((Short)(short)0x1D, Keyboard.KEY_0); + nativeToLwjglMap.put((Short)(short)0x12, Keyboard.KEY_1); + nativeToLwjglMap.put((Short)(short)0x13, Keyboard.KEY_2); + nativeToLwjglMap.put((Short)(short)0x14, Keyboard.KEY_3); + nativeToLwjglMap.put((Short)(short)0x15, Keyboard.KEY_4); + nativeToLwjglMap.put((Short)(short)0x17, Keyboard.KEY_5); + nativeToLwjglMap.put((Short)(short)0x16, Keyboard.KEY_6); + nativeToLwjglMap.put((Short)(short)0x1A, Keyboard.KEY_7); + nativeToLwjglMap.put((Short)(short)0x1C, Keyboard.KEY_8); + nativeToLwjglMap.put((Short)(short)0x19, Keyboard.KEY_9); + nativeToLwjglMap.put((Short)(short)0x00, Keyboard.KEY_A); + nativeToLwjglMap.put((Short)(short)0x0B, Keyboard.KEY_B); + nativeToLwjglMap.put((Short)(short)0x08, Keyboard.KEY_C); + nativeToLwjglMap.put((Short)(short)0x02, Keyboard.KEY_D); + nativeToLwjglMap.put((Short)(short)0x0E, Keyboard.KEY_E); + nativeToLwjglMap.put((Short)(short)0x03, Keyboard.KEY_F); + nativeToLwjglMap.put((Short)(short)0x05, Keyboard.KEY_G); + nativeToLwjglMap.put((Short)(short)0x04, Keyboard.KEY_H); + nativeToLwjglMap.put((Short)(short)0x22, Keyboard.KEY_I); + nativeToLwjglMap.put((Short)(short)0x26, Keyboard.KEY_J); + nativeToLwjglMap.put((Short)(short)0x28, Keyboard.KEY_K); + nativeToLwjglMap.put((Short)(short)0x25, Keyboard.KEY_L); + nativeToLwjglMap.put((Short)(short)0x2E, Keyboard.KEY_M); + nativeToLwjglMap.put((Short)(short)0x2D, Keyboard.KEY_N); + nativeToLwjglMap.put((Short)(short)0x1F, Keyboard.KEY_O); + nativeToLwjglMap.put((Short)(short)0x23, Keyboard.KEY_P); + nativeToLwjglMap.put((Short)(short)0x0C, Keyboard.KEY_Q); + nativeToLwjglMap.put((Short)(short)0x0F, Keyboard.KEY_R); + nativeToLwjglMap.put((Short)(short)0x01, Keyboard.KEY_S); + nativeToLwjglMap.put((Short)(short)0x11, Keyboard.KEY_T); + nativeToLwjglMap.put((Short)(short)0x20, Keyboard.KEY_U); + nativeToLwjglMap.put((Short)(short)0x09, Keyboard.KEY_V); + nativeToLwjglMap.put((Short)(short)0x0D, Keyboard.KEY_W); + nativeToLwjglMap.put((Short)(short)0x07, Keyboard.KEY_X); + nativeToLwjglMap.put((Short)(short)0x10, Keyboard.KEY_Y); + nativeToLwjglMap.put((Short)(short)0x06, Keyboard.KEY_Z); + + nativeToLwjglMap.put((Short)(short)0x2A, Keyboard.KEY_BACKSLASH); + nativeToLwjglMap.put((Short)(short)0x2B, Keyboard.KEY_COMMA); + nativeToLwjglMap.put((Short)(short)0x18, Keyboard.KEY_EQUALS); + nativeToLwjglMap.put((Short)(short)0x21, Keyboard.KEY_LBRACKET); + nativeToLwjglMap.put((Short)(short)0x1B, Keyboard.KEY_MINUS); + nativeToLwjglMap.put((Short)(short)0x27, Keyboard.KEY_APOSTROPHE); + nativeToLwjglMap.put((Short)(short)0x1E, Keyboard.KEY_RBRACKET); + nativeToLwjglMap.put((Short)(short)0x29, Keyboard.KEY_SEMICOLON); + nativeToLwjglMap.put((Short)(short)0x2C, Keyboard.KEY_SLASH); + nativeToLwjglMap.put((Short)(short)0x2F, Keyboard.KEY_PERIOD); + nativeToLwjglMap.put((Short)(short)0x32, Keyboard.KEY_CIRCUMFLEX); + + nativeToLwjglMap.put((Short)(short)0x41, Keyboard.KEY_DECIMAL); + nativeToLwjglMap.put((Short)(short)0x43, Keyboard.KEY_MULTIPLY); + nativeToLwjglMap.put((Short)(short)0x45, Keyboard.KEY_ADD); + nativeToLwjglMap.put((Short)(short)0x47, Keyboard.KEY_CLEAR); + nativeToLwjglMap.put((Short)(short)0x4B, Keyboard.KEY_DIVIDE); + nativeToLwjglMap.put((Short)(short)0x4C, Keyboard.KEY_NUMPADENTER); + nativeToLwjglMap.put((Short)(short)0x4E, Keyboard.KEY_SUBTRACT); + nativeToLwjglMap.put((Short)(short)0x51, Keyboard.KEY_NUMPADEQUALS); + + nativeToLwjglMap.put((Short)(short)0x52, Keyboard.KEY_NUMPAD0); + nativeToLwjglMap.put((Short)(short)0x53, Keyboard.KEY_NUMPAD1); + nativeToLwjglMap.put((Short)(short)0x54, Keyboard.KEY_NUMPAD2); + nativeToLwjglMap.put((Short)(short)0x55, Keyboard.KEY_NUMPAD3); + nativeToLwjglMap.put((Short)(short)0x56, Keyboard.KEY_NUMPAD4); + nativeToLwjglMap.put((Short)(short)0x57, Keyboard.KEY_NUMPAD5); + nativeToLwjglMap.put((Short)(short)0x58, Keyboard.KEY_NUMPAD6); + nativeToLwjglMap.put((Short)(short)0x59, Keyboard.KEY_NUMPAD7); + nativeToLwjglMap.put((Short)(short)0x5B, Keyboard.KEY_NUMPAD8); + nativeToLwjglMap.put((Short)(short)0x5C, Keyboard.KEY_NUMPAD9); + + + nativeToLwjglMap.put((Short)(short)0x24, Keyboard.KEY_RETURN); + nativeToLwjglMap.put((Short)(short)0x30, Keyboard.KEY_TAB); + nativeToLwjglMap.put((Short)(short)0x31, Keyboard.KEY_SPACE); + nativeToLwjglMap.put((Short)(short)0x33, Keyboard.KEY_BACK); + nativeToLwjglMap.put((Short)(short)0x35, Keyboard.KEY_ESCAPE); + nativeToLwjglMap.put((Short)(short)0x36, Keyboard.KEY_RMETA); // not in Events.h - works on MBP + nativeToLwjglMap.put((Short)(short)0x37, Keyboard.KEY_LMETA); + nativeToLwjglMap.put((Short)(short)0x38, Keyboard.KEY_LSHIFT); + nativeToLwjglMap.put((Short)(short)0x39, Keyboard.KEY_CAPITAL); + nativeToLwjglMap.put((Short)(short)0x3A, Keyboard.KEY_LMENU); + nativeToLwjglMap.put((Short)(short)0x3B, Keyboard.KEY_LCONTROL); + nativeToLwjglMap.put((Short)(short)0x3C, Keyboard.KEY_RSHIFT); + nativeToLwjglMap.put((Short)(short)0x3D, Keyboard.KEY_RMENU); + nativeToLwjglMap.put((Short)(short)0x3E, Keyboard.KEY_RCONTROL); + + nativeToLwjglMap.put((Short)(short)0x3F, Keyboard.KEY_FUNCTION); + nativeToLwjglMap.put((Short)(short)0x77, Keyboard.KEY_END); + + nativeToLwjglMap.put((Short)(short)0x7A, Keyboard.KEY_F1); + nativeToLwjglMap.put((Short)(short)0x78, Keyboard.KEY_F2); + nativeToLwjglMap.put((Short)(short)0x63, Keyboard.KEY_F3); + nativeToLwjglMap.put((Short)(short)0x76, Keyboard.KEY_F4); + nativeToLwjglMap.put((Short)(short)0x60, Keyboard.KEY_F5); + nativeToLwjglMap.put((Short)(short)0x61, Keyboard.KEY_F6); + nativeToLwjglMap.put((Short)(short)0x62, Keyboard.KEY_F7); + nativeToLwjglMap.put((Short)(short)0x64, Keyboard.KEY_F8); + nativeToLwjglMap.put((Short)(short)0x65, Keyboard.KEY_F9); + nativeToLwjglMap.put((Short)(short)0x6D, Keyboard.KEY_F10); + nativeToLwjglMap.put((Short)(short)0x67, Keyboard.KEY_F11); + nativeToLwjglMap.put((Short)(short)0x6F, Keyboard.KEY_F12); + nativeToLwjglMap.put((Short)(short)0x69, Keyboard.KEY_F13); + nativeToLwjglMap.put((Short)(short)0x6B, Keyboard.KEY_F14); + nativeToLwjglMap.put((Short)(short)0x71, Keyboard.KEY_F15); + nativeToLwjglMap.put((Short)(short)0x6A, Keyboard.KEY_F16); + nativeToLwjglMap.put((Short)(short)0x40, Keyboard.KEY_F17); + nativeToLwjglMap.put((Short)(short)0x4F, Keyboard.KEY_F18); + nativeToLwjglMap.put((Short)(short)0x50, Keyboard.KEY_F19); + // nativeToLwjglMap.put((Short)(short)0x5A, Keyboard.KEY_F20); + + nativeToLwjglMap.put((Short)(short)0x75, Keyboard.KEY_DELETE); + nativeToLwjglMap.put((Short)(short)0x72, Keyboard.KEY_INSERT); // 'Help' in Events.h + nativeToLwjglMap.put((Short)(short)0x73, Keyboard.KEY_HOME); + // nativeToLwjglMap.put((Short)(short)0xA4, Keyboard.KEY_MUTE); + nativeToLwjglMap.put((Short)(short)0x79, Keyboard.KEY_NEXT); + nativeToLwjglMap.put((Short)(short)0x74, Keyboard.KEY_PRIOR); + // nativeToLwjglMap.put((Short)(short)0x49, Keyboard.KEY_VOLUMEDOWN); + // nativeToLwjglMap.put((Short)(short)0x48, Keyboard.KEY_VOLUMEUP); + nativeToLwjglMap.put((Short)(short)0x7B, Keyboard.KEY_LEFT); + nativeToLwjglMap.put((Short)(short)0x7C, Keyboard.KEY_RIGHT); + nativeToLwjglMap.put((Short)(short)0x7D, Keyboard.KEY_DOWN); + nativeToLwjglMap.put((Short)(short)0x7E, Keyboard.KEY_UP); + + nativeToLwjglMap.put((Short)(short)0x0A, Keyboard.KEY_SECTION); + + nativeToLwjglMap.put((Short)(short)0x6E, Keyboard.KEY_APPS); // not in Events.h + nativeToLwjglMap.put((Short)(short)0x129, Keyboard.KEY_COLON); // not in Events.h -- do we need it? + } + + public void register() { + nRegisterKeyListener(window_handle); + } + + public void unregister() { + nUnregisterKeyListener(window_handle); + } + + public void putKeyboardEvent(int key_code, byte state, int character, long nanos, boolean repeat) { + event.clear(); + event.putInt(key_code).put(state).putInt(character).putLong(nanos).put(repeat ? (byte)1 : (byte)0); + event.flip(); + putEvent(event); + } + + public synchronized void poll(ByteBuffer key_down_buffer) { + flushDeferredEvent(); + int old_position = key_down_buffer.position(); + key_down_buffer.put(key_states); + key_down_buffer.position(old_position); + } + + public synchronized void copyEvents(ByteBuffer dest) { + flushDeferredEvent(); + super.copyEvents(dest); + } + + private synchronized void handleKey(int key_code, byte state, int character, long nanos) { + if (character == KeyEvent.CHAR_UNDEFINED) + character = Keyboard.CHAR_NONE; + if (state == 1) { + boolean repeat = false; + if (has_deferred_event) { + if ((nanos == deferred_nanos && deferred_key_code == key_code)) { + has_deferred_event = false; + repeat = true; // Repeat event + } else + flushDeferredEvent(); + } + putKeyEvent(key_code, state, character, nanos, repeat); + } else { + flushDeferredEvent(); + has_deferred_event = true; + deferred_nanos = nanos; + deferred_key_code = key_code; + deferred_key_state = state; + deferred_character = character; + } + } + + private void flushDeferredEvent() { + if (has_deferred_event) { + putKeyEvent(deferred_key_code, deferred_key_state, deferred_character, deferred_nanos, false); + has_deferred_event = false; + } + } + + public void putKeyEvent(int key_code, byte state, int character, long nanos, boolean repeat) { + /* Ignore repeating presses */ + int mapped_code = getMappedKeyCode((short)key_code); + if (mapped_code < 0) { + System.out.println("Unrecognized keycode: " + key_code); + /* Unrecognized / unmapped code, do nothing */ + return; + } + if ( key_states[mapped_code] == state ) + repeat = true; + key_states[mapped_code] = state; + int key_int_char = character & 0xffff; + putKeyboardEvent(mapped_code, state, key_int_char, nanos, repeat); + } + + private int getMappedKeyCode(short key_code) { + if (nativeToLwjglMap.containsKey(key_code)) { + return nativeToLwjglMap.get(key_code); + } + return -1; + } + + public void keyPressed(int key_code, String chars, long nanos) { + // use only first character of chars returned for key press + int character = (chars == null || chars.length() == 0) ? 0 : (int)chars.charAt(0); + handleKey(key_code, (byte)1, character, nanos); + } + + public void keyReleased(int key_code, String chars, long nanos) { + // use only first character of chars returned for key release + int character = (chars == null || chars.length() == 0) ? 0 : (int)chars.charAt(0); + handleKey(key_code, (byte)0, character, nanos); + } + + public void keyTyped(KeyEvent e) { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeMouse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeMouse.java new file mode 100644 index 0000000..96a2df6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXNativeMouse.java @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * A Cocoa implementation of a LWJGL compatible Mouse. + * @author mojang + * @author kappaOne <one.kappa@gmail.com> + */ + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.input.Mouse; +import org.lwjgl.LWJGLException; + +import java.lang.reflect.*; +import java.lang.Integer; +import java.lang.Long; + +import org.lwjgl.BufferUtils; + +final class MacOSXNativeMouse extends EventQueue { + private static final int WHEEL_SCALE = 120; + private static final int NUM_BUTTONS = 3; + + private ByteBuffer window_handle; + private MacOSXDisplay display; + + private boolean grabbed; + + /** The accumulated mouse deltas returned by poll() */ + private float accum_dx; + private float accum_dy; + private int accum_dz; + + /** The last mouse position */ + private float last_x; + private float last_y; + + /** Saved control key state for ctrl-click right button emulation */ + private boolean saved_control_state; + + private final ByteBuffer event = ByteBuffer.allocate(Mouse.EVENT_SIZE); + private IntBuffer delta_buffer = BufferUtils.createIntBuffer(2); + private int skip_event; + + private final byte[] buttons = new byte[NUM_BUTTONS]; + + MacOSXNativeMouse(MacOSXDisplay display, ByteBuffer window_handle) { + super(Mouse.EVENT_SIZE); + this.display = display; + this.window_handle = window_handle; + } + + private native void nSetCursorPosition(ByteBuffer window_handle, int x, int y); + + public static native void nGrabMouse(boolean grab); + + private native void nRegisterMouseListener(ByteBuffer window_handle); + + private native void nUnregisterMouseListener(ByteBuffer window_handle); + + private static native long nCreateCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, int images_offset, IntBuffer delays, int delays_offset) throws LWJGLException; + + private static native void nDestroyCursor(long cursor_handle); + + private static native void nSetCursor(long cursor_handle) throws LWJGLException; + + public synchronized void register() { + nRegisterMouseListener(window_handle); + } + + public static long createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + try { + return nCreateCursor(width, height, xHotspot, yHotspot, numImages, images, images.position(), delays, delays != null ? delays.position() : -1); + } catch (LWJGLException e) { + throw e; + } + } + + public static void destroyCursor(long cursor_handle) { + nDestroyCursor(cursor_handle); + } + + public static void setCursor(long cursor_handle) throws LWJGLException { + try { + nSetCursor(cursor_handle); + } catch (LWJGLException e) { + throw e; + } + } + + public synchronized void setCursorPosition(int x, int y) { + nSetCursorPosition(window_handle, x, y); + } + + public synchronized void unregister() { + nUnregisterMouseListener(window_handle); + } + + public synchronized void setGrabbed(boolean grabbed) { + this.grabbed = grabbed; + nGrabMouse(grabbed); + skip_event = 1; + accum_dx = accum_dy = 0; + } + + public synchronized boolean isGrabbed() { + return grabbed; + } + + protected void resetCursorToCenter() { + clearEvents(); + accum_dx = accum_dy = 0; + if (display != null) { + last_x = display.getWidth() / 2; + last_y = display.getHeight() / 2; + } + } + + private void putMouseEvent(byte button, byte state, int dz, long nanos) { + if (grabbed) + putMouseEventWithCoords(button, state, 0, 0, dz, nanos); + else + putMouseEventWithCoords(button, state, (int)last_x, (int)last_y, dz, nanos); + } + + protected void putMouseEventWithCoords(byte button, byte state, int coord1, int coord2, int dz, long nanos) { + event.clear(); + event.put(button).put(state).putInt(coord1).putInt(coord2).putInt(dz).putLong(nanos); + event.flip(); + putEvent(event); + } + + public synchronized void poll(IntBuffer coord_buffer, ByteBuffer buttons_buffer) { + if (grabbed) { + coord_buffer.put(0, (int)accum_dx); + coord_buffer.put(1, (int)accum_dy); + } else { + coord_buffer.put(0, (int)last_x); + coord_buffer.put(1, (int)last_y); + } + coord_buffer.put(2, accum_dz); + accum_dx = accum_dy = accum_dz = 0; + int old_position = buttons_buffer.position(); + buttons_buffer.put(buttons, 0, buttons.length); + buttons_buffer.position(old_position); + } + + private void setCursorPos(float x, float y, long nanos) { + if ( grabbed ) + return; + float dx = x - last_x; + float dy = y - last_y; + addDelta(dx, dy); + last_x = x; + last_y = y; + putMouseEventWithCoords((byte)-1, (byte)0, (int)x, (int)y, 0, nanos); + } + + protected void addDelta(float dx, float dy) { + accum_dx += dx; + accum_dy += -dy; + } + + public synchronized void setButton(int button, int state, long nanos) { + buttons[button] = (byte)state; + putMouseEvent((byte)button, (byte)state, 0, nanos); + } + + public synchronized void mouseMoved(float x, float y, float dx, float dy, float dz, long nanos) { + if (skip_event > 0) { + skip_event--; + if (skip_event == 0) { + last_x = x; + last_y = y; + } + return; + } + + if ( dz != 0 ) { // if scroll wheel event + // if no vertical wheel events, then map the horizontal wheel event to it + if (dy == 0) dy = dx; + + int wheel_amount = (int)(dy * WHEEL_SCALE); + accum_dz += wheel_amount; + putMouseEvent((byte)-1, (byte)0, wheel_amount, nanos); + } + else if (grabbed) { + if ( dx != 0 || dy != 0 ) { + putMouseEventWithCoords((byte)-1, (byte)0, (int)dx, (int)-dy, 0, nanos); + addDelta(dx, dy); + } + } else { + setCursorPos(x, y, nanos); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPbufferPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPbufferPeerInfo.java new file mode 100644 index 0000000..b3e5873 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPbufferPeerInfo.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class MacOSXPbufferPeerInfo extends MacOSXPeerInfo { + MacOSXPbufferPeerInfo(int width, int height, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + super(pixel_format, attribs, false, false, true, false); + nCreate(getHandle(), width, height); + } + private static native void nCreate(ByteBuffer handle, int width, int height) throws LWJGLException; + + public void destroy() { + nDestroy(getHandle()); + } + private static native void nDestroy(ByteBuffer handle); + + protected void doLockAndInitHandle() throws LWJGLException { + // NO-OP + } + + protected void doUnlock() throws LWJGLException { + // NO-OP + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPeerInfo.java new file mode 100644 index 0000000..ee6a697 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MacOSXPeerInfo.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +abstract class MacOSXPeerInfo extends PeerInfo { + MacOSXPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException { + super(createHandle()); + + boolean gl32 = attribs != null && attribs.getMajorVersion() == 3 && attribs.getMinorVersion() == 2 && attribs.isProfileCore(); + if ( gl32 && !LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 7) ) + throw new LWJGLException("OpenGL 3.2 requested, but it requires MacOS X 10.7 or newer"); + + choosePixelFormat(pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered); + } + private static native ByteBuffer createHandle(); + + private void choosePixelFormat(PixelFormat pixel_format, boolean gl32, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException { + nChoosePixelFormat(getHandle(), pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered); + } + private static native void nChoosePixelFormat(ByteBuffer peer_info_handle, PixelFormat pixel_format, boolean gl32, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException; + + public void destroy() { + nDestroy(getHandle()); + } + private static native void nDestroy(ByteBuffer handle); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MouseEventQueue.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MouseEventQueue.java new file mode 100644 index 0000000..c96f0ea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/MouseEventQueue.java @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * An AWT implementation of a LWJGL compatible Mouse event queue. + * @author elias_naur + */ + +import java.awt.Component; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.input.Mouse; + +class MouseEventQueue extends EventQueue implements MouseListener, MouseMotionListener, MouseWheelListener { + private static final int WHEEL_SCALE = 120; + public static final int NUM_BUTTONS = 3; + + private final Component component; + + private boolean grabbed; + + /** The accumulated mouse deltas returned by poll() */ + private int accum_dx; + private int accum_dy; + private int accum_dz; + + /** The last mouse position */ + private int last_x; + private int last_y; + + /** Saved control key state for ctrl-click right button emulation */ + private boolean saved_control_state; + + /** Event scratch array */ + private final ByteBuffer event = ByteBuffer.allocate(Mouse.EVENT_SIZE); + + /** Buttons array */ + private final byte[] buttons = new byte[NUM_BUTTONS]; + + MouseEventQueue(Component component) { + super(Mouse.EVENT_SIZE); + this.component = component; + } + + public synchronized void register() { + resetCursorToCenter(); + if (component != null) { + component.addMouseListener(this); + component.addMouseMotionListener(this); + component.addMouseWheelListener(this); + } + } + + public synchronized void unregister() { + if (component != null) { + component.removeMouseListener(this); + component.removeMouseMotionListener(this); + component.removeMouseWheelListener(this); + } + } + + protected Component getComponent() { + return component; + } + + public synchronized void setGrabbed(boolean grabbed) { + this.grabbed = grabbed; + resetCursorToCenter(); + } + + public synchronized boolean isGrabbed() { + return grabbed; + } + + protected int transformY(int y) { + if (component != null) { + return component.getHeight() - 1 - y; + } + return y; + } + + protected void resetCursorToCenter() { + clearEvents(); + accum_dx = accum_dy = 0; + if (component != null) { + Point cursor_location = AWTUtil.getCursorPosition(component); + if (cursor_location != null) { + last_x = cursor_location.x; + last_y = cursor_location.y; + } + } + } + + private void putMouseEvent(byte button, byte state, int dz, long nanos) { + if (grabbed) + putMouseEventWithCoords(button, state, 0, 0, dz, nanos); + else + putMouseEventWithCoords(button, state, last_x, last_y, dz, nanos); + } + + protected void putMouseEventWithCoords(byte button, byte state, int coord1, int coord2, int dz, long nanos) { + event.clear(); + event.put(button).put(state).putInt(coord1).putInt(coord2).putInt(dz).putLong(nanos); + event.flip(); + putEvent(event); + } + + public synchronized void poll(IntBuffer coord_buffer, ByteBuffer buttons_buffer) { + if ( grabbed ) { + coord_buffer.put(0, accum_dx); + coord_buffer.put(1, accum_dy); + } else { + coord_buffer.put(0, last_x); + coord_buffer.put(1, last_y); + } + coord_buffer.put(2, accum_dz); + accum_dx = accum_dy = accum_dz = 0; + int old_position = buttons_buffer.position(); + buttons_buffer.put(buttons, 0, buttons.length); + buttons_buffer.position(old_position); + } + + private void setCursorPos(int x, int y, long nanos) { + y = transformY(y); + if ( grabbed ) + return; + int dx = x - last_x; + int dy = y - last_y; + addDelta(dx, dy); + last_x = x; + last_y = y; + putMouseEventWithCoords((byte)-1, (byte)0, x, y, 0, nanos); + } + + protected void addDelta(int dx, int dy) { + accum_dx += dx; + accum_dy += dy; + } + + public void mouseClicked(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + private void handleButton(MouseEvent e) { + byte state; + switch (e.getID()) { + case MouseEvent.MOUSE_PRESSED: + state = 1; + break; + case MouseEvent.MOUSE_RELEASED: + state = 0; + break; + default: + throw new IllegalArgumentException("Not a valid event ID: " + e.getID()); + } + byte button; + switch (e.getButton()) { + case MouseEvent.NOBUTTON: + // Nothing to do, so return + return; + case MouseEvent.BUTTON1: + // Emulate right click if ctrl is down + if (state == 1) + saved_control_state = e.isControlDown(); + if (saved_control_state) { + if (buttons[1] == state) + return; // ignore + button = (byte)1; + } else { + button = (byte)0; + } + break; + case MouseEvent.BUTTON2: + button = (byte)2; + break; + case MouseEvent.BUTTON3: + if (buttons[1] == state) + return; // ignore + button = (byte)1; + break; + default: + throw new IllegalArgumentException("Not a valid button: " + e.getButton()); + } + setButton(button, state, e.getWhen()*1000000); + } + + public synchronized void mousePressed(MouseEvent e) { + handleButton(e); + } + + private void setButton(byte button, byte state, long nanos) { + buttons[button] = state; + putMouseEvent(button, state, 0, nanos); + } + + public synchronized void mouseReleased(MouseEvent e) { + handleButton(e); + } + + private void handleMotion(MouseEvent e) { + if (grabbed) { + updateDeltas(e.getWhen()*1000000); + } else { + setCursorPos(e.getX(), e.getY(), e.getWhen()*1000000); + } + } + + public synchronized void mouseDragged(MouseEvent e) { + handleMotion(e); + } + + public synchronized void mouseMoved(MouseEvent e) { + handleMotion(e); + } + + private void handleWheel(int amount, long nanos) { + accum_dz += amount; + putMouseEvent((byte)-1, (byte)0, amount, nanos); + } + + protected void updateDeltas(long nanos) { + } + + public synchronized void mouseWheelMoved(MouseWheelEvent e) { + int wheel_amount = -e.getWheelRotation() * WHEEL_SCALE; + handleWheel(wheel_amount, e.getWhen()*1000000); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVPresentVideoUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVPresentVideoUtil.java new file mode 100644 index 0000000..3b60481 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVPresentVideoUtil.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.opengl; + +import org.lwjgl.BufferChecks; +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +/** + * This class exposes the platform specific functionality present in the + * NV_present_video extension. + * + * @author Spasi + * @since 20/5/2011 + */ +public final class NVPresentVideoUtil { + + private NVPresentVideoUtil() {} + + private static void checkExtension() { + if ( LWJGLUtil.CHECKS && !GLContext.getCapabilities().GL_NV_present_video ) + throw new IllegalStateException("NV_present_video is not supported"); + } + + private static ByteBuffer getPeerInfo() { + return ContextGL.getCurrentContext().getPeerInfo().getHandle(); + } + + /** + * Enumerate the available video output devices. This method is the cross-platform + * equivalent of glXEnumerateVideoDevicesNV and wglEnumerateVideoDevicesNV. Since they are + * not really compatible, this method works like the WGL version. That is, you first + * call it with a null devices buffer, get the number of devices, then call it again + * with an appropriately sized buffer. + * + * @param devices the buffer to store devices in + * + * @return the number of available video output devices + */ + public static int glEnumerateVideoDevicesNV(LongBuffer devices) { + checkExtension(); + + if ( devices != null ) + BufferChecks.checkBuffer(devices, 1); + return nglEnumerateVideoDevicesNV(getPeerInfo(), devices, devices == null ? 0 : devices.position()); + } + + private static native int nglEnumerateVideoDevicesNV(ByteBuffer peer_info, LongBuffer devices, int devices_position); + + /** + * Binds the video output device specified to one of the context's available video output slots. + * This method is the cross-platform equivalent of glXBindVideoDeviceNV and wglBindVideoDeviceNV. + * To release a video device without binding another device to the same slot, call it with + * video_device set to 0 (will use INVALID_HANDLE_VALUE on WGL). + * + * @param video_slot the video slot + * @param video_device the video device + * @param attrib_list the attributes to use + * + * @return true if the binding was successful + */ + public static boolean glBindVideoDeviceNV(int video_slot, long video_device, IntBuffer attrib_list) { + checkExtension(); + + if ( attrib_list != null ) + BufferChecks.checkNullTerminated(attrib_list); + return nglBindVideoDeviceNV(getPeerInfo(), video_slot, video_device, attrib_list, attrib_list == null ? 0 : attrib_list.position()); + } + + private static native boolean nglBindVideoDeviceNV(ByteBuffer peer_info, int video_slot, long video_device, IntBuffer attrib_list, int attrib_list_position); + + /** + * Queries an attribute associated with the current context. This method is the cross-platform + * equivalent of glXQueryContext and wglQueryCurrentContextNV. + * + * @param attrib the attribute to query + * @param value the buffer to store the value in + */ + public static boolean glQueryContextNV(int attrib, IntBuffer value) { + checkExtension(); + + BufferChecks.checkBuffer(value, 1); + ContextGL ctx = ContextGL.getCurrentContext(); + return nglQueryContextNV(ctx.getPeerInfo().getHandle(), ctx.getHandle(), attrib, value, value.position()); + } + + private static native boolean nglQueryContextNV(ByteBuffer peer_info, ByteBuffer context_handle, int attrib, IntBuffer value, int value_position); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVVideoCaptureUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVVideoCaptureUtil.java new file mode 100644 index 0000000..34484e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/NVVideoCaptureUtil.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.opengl; + +import org.lwjgl.BufferChecks; +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +/** + * This class exposes the platform specific functionality present in the + * NV_video_capture extension. + * + * @author Spasi + * @since 20/5/2011 + */ +public final class NVVideoCaptureUtil { + + private NVVideoCaptureUtil() {} + + private static void checkExtension() { + if ( LWJGLUtil.CHECKS && !GLContext.getCapabilities().GL_NV_video_capture ) + throw new IllegalStateException("NV_video_capture is not supported"); + } + + private static ByteBuffer getPeerInfo() { + return ContextGL.getCurrentContext().getPeerInfo().getHandle(); + } + + /** + * After successfully locking a video capture device, use this method to bind it + * to the capture slot specified in the current context. This method is the cross- + * platform equivalent of glXBindVideoCaptureDeviceNV and wglBindVideoCaptureDeviceNV. + * + * @param video_slot the video slot + * @param device the video capture device + * + * @return true if the binding was successful + */ + public static boolean glBindVideoCaptureDeviceNV(int video_slot, long device) { + checkExtension(); + return nglBindVideoCaptureDeviceNV(getPeerInfo(), video_slot, device); + } + + private static native boolean nglBindVideoCaptureDeviceNV(ByteBuffer peer_info, int video_slot, long device); + + /** + * Enumerate the available video capture devices. This method is the cross-platform + * equivalent of glXEnumerateVideoCaptureDevicesNV and wglEnumerateVideoCaptureDevicesNV. + * Since they are not really compatible, this method works like the WGL version. That is, + * you first call it with a null devices buffer, get the number of devices, then call it + * again with an appropriately sized buffer. + * + * @param devices the buffer to store devices in + * + * @return the number of available video capture devices + */ + public static int glEnumerateVideoCaptureDevicesNV(LongBuffer devices) { + checkExtension(); + + if ( devices != null ) + BufferChecks.checkBuffer(devices, 1); + return nglEnumerateVideoCaptureDevicesNV(getPeerInfo(), devices, devices == null ? 0 : devices.position()); + } + + private static native int nglEnumerateVideoCaptureDevicesNV(ByteBuffer peer_info, LongBuffer devices, int devices_position); + + /** + * To lock a video capture device to a display connection, use this method. + * Before using a video capture device, it must be locked. Once a + * video capture device is locked by a process, no other process can + * lock a video capture device with the same unique ID until the lock + * is released or the process ends. + * + * @param device the device to lock + * + * @return true if the lock was successful + */ + public static boolean glLockVideoCaptureDeviceNV(long device) { + checkExtension(); + return nglLockVideoCaptureDeviceNV(getPeerInfo(), device); + } + + private static native boolean nglLockVideoCaptureDeviceNV(ByteBuffer peer_info, long device); + + /** + * Use this method to query the unique ID of the physical device backing a + * video capture device handle. + * + * @param device the device + * @param attribute the attribute to query + * @param value the buffer to store the value in + * + * @return true if the query was successful + */ + public static boolean glQueryVideoCaptureDeviceNV(long device, int attribute, IntBuffer value) { + checkExtension(); + + BufferChecks.checkBuffer(value, 1); + return nglQueryVideoCaptureDeviceNV(getPeerInfo(), device, attribute, value, value.position()); + } + + private static native boolean nglQueryVideoCaptureDeviceNV(ByteBuffer peer_info, long device, int attribute, IntBuffer value, int value_position); + + /** + * Use this method when finished capturing data on a locked video capture device + * to unlock it. + * + * @param device the device + * + * @return true if the device was unlocked successfully + */ + public static boolean glReleaseVideoCaptureDeviceNV(long device) { + checkExtension(); + return nglReleaseVideoCaptureDeviceNV(getPeerInfo(), device); + } + + private static native boolean nglReleaseVideoCaptureDeviceNV(ByteBuffer peer_info, long device); + +} + diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/OpenGLException.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/OpenGLException.java new file mode 100644 index 0000000..a1eb2b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/OpenGLException.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * <p/> + * Thrown by the debug build library of the LWJGL if any OpenGL operation causes an error. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class OpenGLException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** Constructor for OpenGLException. */ + public OpenGLException(int gl_error_code) { + this(createErrorMessage(gl_error_code)); + } + + private static String createErrorMessage(int gl_error_code) { + String error_string = Util.translateGLErrorString(gl_error_code); + return error_string + " (" + gl_error_code + ")"; + } + + /** Constructor for OpenGLException. */ + public OpenGLException() { + super(); + } + + /** + * Constructor for OpenGLException. + * + * @param message + */ + public OpenGLException(String message) { + super(message); + } + + /** + * Constructor for OpenGLException. + * + * @param message + * @param cause + */ + public OpenGLException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructor for OpenGLException. + * + * @param cause + */ + public OpenGLException(Throwable cause) { + super(cause); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Pbuffer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Pbuffer.java new file mode 100644 index 0000000..07af6d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Pbuffer.java @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; + +/** + * <p/> + * Pbuffer encapsulates an OpenGL pbuffer. + * <p/> + * + * This class is thread-safe. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class Pbuffer extends DrawableGL { + /** + * Indicates that Pbuffers can be created. + */ + public static final int PBUFFER_SUPPORTED = 1 << 0; + + /** + * Indicates that Pbuffers can be used as render-textures. + */ + public static final int RENDER_TEXTURE_SUPPORTED = 1 << 1; + + /** + * Indicates that Pbuffers can be used as non-power-of-two render-textures. + */ + public static final int RENDER_TEXTURE_RECTANGLE_SUPPORTED = 1 << 2; + + /** + * Indicates that Pbuffers can be used as depth render-textures. + */ + public static final int RENDER_DEPTH_TEXTURE_SUPPORTED = 1 << 3; + + /** + * The render-to-texture mipmap level attribute. + */ + public static final int MIPMAP_LEVEL = RenderTexture.WGL_MIPMAP_LEVEL_ARB; + + /** + * The render-to-texture cube map face attribute. + */ + public static final int CUBE_MAP_FACE = RenderTexture.WGL_CUBE_MAP_FACE_ARB; + + /** + * The render-to-texture cube map positive X face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_X = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; + + /** + * The render-to-texture cube map negative X face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_X = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; + + /** + * The render-to-texture cube map positive Y face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_Y = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; + + /** + * The render-to-texture cube map negative Y face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_Y = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; + + /** + * The render-to-texture cube map positive Z face value. + */ + public static final int TEXTURE_CUBE_MAP_POSITIVE_Z = RenderTexture.WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; + + /** + * The render-to-texture cube map negative Z face value. + */ + public static final int TEXTURE_CUBE_MAP_NEGATIVE_Z = RenderTexture.WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; + + /** + * The Pbuffer front left buffer. + */ + public static final int FRONT_LEFT_BUFFER = RenderTexture.WGL_FRONT_LEFT_ARB; + + /** + * The Pbuffer front right buffer. + */ + public static final int FRONT_RIGHT_BUFFER = RenderTexture.WGL_FRONT_RIGHT_ARB; + + /** + * The Pbuffer back left buffer. + */ + public static final int BACK_LEFT_BUFFER = RenderTexture.WGL_BACK_LEFT_ARB; + + /** + * The Pbuffer back right buffer. + */ + public static final int BACK_RIGHT_BUFFER = RenderTexture.WGL_BACK_RIGHT_ARB; + + /** + * The Pbuffer depth buffer. + */ + public static final int DEPTH_BUFFER = RenderTexture.WGL_DEPTH_COMPONENT_NV; + + /** + * Width + */ + private final int width; + + /** + * Height + */ + private final int height; + + static { + Sys.initialize(); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + * <p/> + * NOTE: The Pbuffer will have its own context that shares display lists and textures with <code>shared_context</code>, + * or, if <code>shared_context</code> is <code>null</code>, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + * <p/> + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, Drawable shared_drawable) throws LWJGLException { + this(width, height, pixel_format, null, shared_drawable); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + * <p/> + * NOTE: The Pbuffer will have its own context that shares display lists and textures with <code>shared_context</code>, + * or, if <code>shared_context</code> is <code>null</code>, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + * <p/> + * The renderTexture parameter defines the necessary state for enabling render-to-texture. When this parameter is null, + * render-to-texture is not available. Before using render-to-texture, the Pbuffer capabilities must be queried to ensure that + * it is supported. Currently only windows platform can support this feature, so it is recommended that EXT_framebuffer_object + * or similar is used if available, for maximum portability. + * <p/> + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param renderTexture + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, Drawable shared_drawable) throws LWJGLException { + this(width, height, pixel_format, renderTexture, shared_drawable, null); + } + + /** + * Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered. + * <p/> + * NOTE: The Pbuffer will have its own context that shares display lists and textures with <code>shared_context</code>, + * or, if <code>shared_context</code> is <code>null</code>, the Display context if it is created. The Pbuffer + * will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa. + * <p/> + * The renderTexture parameter defines the necessary state for enabling render-to-texture. When this parameter is null, + * render-to-texture is not available. Before using render-to-texture, the Pbuffer capabilities must be queried to ensure that + * it is supported. Currently only windows platform can support this feature, so it is recommended that EXT_framebuffer_object + * or similar is used if available, for maximum portability. + * <p/> + * + * @param width Pbuffer width + * @param height Pbuffer height + * @param pixel_format Minimum Pbuffer context properties + * @param renderTexture + * @param shared_drawable If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share + * with the Display context (if created). + * @param attribs The ContextAttribs to use when creating the context. (optional, may be null) + */ + public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, Drawable shared_drawable, ContextAttribs attribs) throws LWJGLException { + if (pixel_format == null) + throw new NullPointerException("Pixel format must be non-null"); + this.width = width; + this.height = height; + this.peer_info = createPbuffer(width, height, pixel_format, attribs, renderTexture); + Context shared_context = null; + if ( shared_drawable == null ) + shared_drawable = Display.getDrawable(); // May be null + if (shared_drawable != null) + shared_context = ((DrawableLWJGL)shared_drawable).getContext(); + this.context = new ContextGL(peer_info, attribs, (ContextGL)shared_context); + } + + private static PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, RenderTexture renderTexture) throws LWJGLException { + if ( renderTexture == null ) { + // Though null is a perfectly valid argument, Matrox Parhelia drivers expect + // a 0 terminated list, or else they crash. Supplying NULL or 0, should + // cause the drivers to use default settings + IntBuffer defaultAttribs = BufferUtils.createIntBuffer(1); + return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs, null, defaultAttribs); + } else + return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs, + renderTexture.pixelFormatCaps, + renderTexture.pBufferAttribs); + } + + /** + * Method to test for validity of the buffer. If this function returns true, the buffer contents is lost. The buffer can still + * be used, but the results are undefined. The application is expected to release the buffer if needed, destroy it and recreate + * a new buffer. + * + * @return true if the buffer is lost and destroyed, false if the buffer is valid. + */ + public synchronized boolean isBufferLost() { + checkDestroyed(); + return Display.getImplementation().isBufferLost(peer_info); + } + + /** + * Gets the Pbuffer capabilities. + * + * @return a bitmask of Pbuffer capabilities. + */ + public static int getCapabilities() { + return Display.getImplementation().getPbufferCapabilities(); + } + + // ----------------------------------------------------------------------------------------- + // ------------------------------- Render-to-Texture Methods ------------------------------- + // ----------------------------------------------------------------------------------------- + + /** + * Sets a render-to-texture attribute. + * <p/> + * The attrib parameter can be one of MIPMAP_LEVEL and CUBE_MAP_FACE. When the attrib parameter is CUBE_MAP_FACE then the value + * parameter can be on of the following: + * <p/> + * TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y + * TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z + * + * @param attrib + * @param value + */ + public synchronized void setAttrib(int attrib, int value) { + checkDestroyed(); + Display.getImplementation().setPbufferAttrib(peer_info, attrib, value); + } + + /** + * Binds the currently bound texture to the buffer specified. The buffer can be one of the following: + * <p/> + * FRONT_LEFT_BUFFER FRONT_RIGHT_BUFFER BACK_LEFT_BUFFER BACK_RIGHT_BUFFER DEPTH_BUFFER + * + * @param buffer + */ + public synchronized void bindTexImage(int buffer) { + checkDestroyed(); + Display.getImplementation().bindTexImageToPbuffer(peer_info, buffer); + } + + /** + * Releases the currently bound texture from the buffer specified. + * + * @param buffer + */ + public synchronized void releaseTexImage(int buffer) { + checkDestroyed(); + Display.getImplementation().releaseTexImageFromPbuffer(peer_info, buffer); + } + + /** + * @return Returns the height. + */ + public synchronized int getHeight() { + checkDestroyed(); + return height; + } + + /** + * @return Returns the width. + */ + public synchronized int getWidth() { + checkDestroyed(); + return width; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PeerInfo.java new file mode 100644 index 0000000..3985bf9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PeerInfo.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +abstract class PeerInfo { + private final ByteBuffer handle; + private Thread locking_thread; // Thread that has locked this PeerInfo + private int lock_count; + + protected PeerInfo(ByteBuffer handle) { + this.handle = handle; + } + + private void lockAndInitHandle() throws LWJGLException { + doLockAndInitHandle(); + } + + public final synchronized void unlock() throws LWJGLException { + if (lock_count <= 0) + throw new IllegalStateException("PeerInfo not locked!"); + if (Thread.currentThread() != locking_thread) + throw new IllegalStateException("PeerInfo already locked by " + locking_thread); + lock_count--; + if (lock_count == 0) { + doUnlock(); + locking_thread = null; + notify(); + } + } + + protected abstract void doLockAndInitHandle() throws LWJGLException; + protected abstract void doUnlock() throws LWJGLException; + + public final synchronized ByteBuffer lockAndGetHandle() throws LWJGLException { + Thread this_thread = Thread.currentThread(); + while (locking_thread != null && locking_thread != this_thread) { + try { + wait(); + } catch (InterruptedException e) { + LWJGLUtil.log("Interrupted while waiting for PeerInfo lock: " + e); + } + } + if (lock_count == 0) { + locking_thread = this_thread; + doLockAndInitHandle(); + } + lock_count++; + return getHandle(); + } + + protected final ByteBuffer getHandle() { + return handle; + } + + public void destroy() { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormat.java new file mode 100644 index 0000000..2f03f21 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormat.java @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This class describes pixel format properties for an OpenGL context. Instances + * of this class is used as arguments to Display.create(), Pbuffer.create() and + * AWTGLCanvas, to indicate minimum required properties. + * <p/> + * Instants of this class are immutable. An example of the expected way to set + * the PixelFormat property values is the following: + * <code>PixelFormat pf = new PixelFormat().withDepthBits(24).withSamples(4).withSRGB(true);</code> + * <p/> + * WARNING: Some pixel formats are known to cause troubles on certain buggy drivers. + * Example: Under Windows, specifying samples != 0 will enable the ARB + * pixel format selection path, which could trigger a crash. + * + * @author elias_naur@sourceforge.net + * @version $Revision$ + */ +public final class PixelFormat implements PixelFormatLWJGL { + + /** + * The number of bits per pixel, exluding alpha. + * This parameter is ignored in Display.create(). + */ + private int bpp; + /** The number of alpha bits. */ + private int alpha; + /** The number of depth buffer bits */ + private int depth; + /** The number of stencil bits */ + private int stencil; + /** + * The number of samples to use in anti-aliasing. + * 0 means that anti-aliasing is disabled. + */ + private int samples; + /** + * The number of COLOR_SAMPLES_NV to use for Coverage Sample Anti-aliasing (CSAA). + * When this number is greater than 0, the {@code samples} property will be treated + * as if it were the COVERAGE_SAMPLES_NV property. + * <p/> + * This property is currently a no-op for the MacOS implementation. + */ + private int colorSamples; + /** The number of auxiliary buffers */ + private int num_aux_buffers; + /** The number of bits per pixel in the accumulation buffer */ + private int accum_bpp; + /** The number of alpha bits in the accumulation buffer */ + private int accum_alpha; + /** Whether this format requires a stereo buffer */ + private boolean stereo; + /** Whether this format specifies a floating point format */ + private boolean floating_point; + /** + * Whether this format specifies a packed floating point format (32 bit unsigned - R11F_G11F_B10F) + * This property is currently a no-op for the MacOS implementation. + */ + private boolean floating_point_packed; + /** + * Whether this format specifies an sRGB format + * This property is currently a no-op for the MacOS implementation. + */ + private boolean sRGB; + + /** + * Default pixel format is minimum 8 bits depth, and no alpha + * nor stencil requirements. + */ + public PixelFormat() { + this(0, 8, 0); + } + + public PixelFormat(int alpha, int depth, int stencil) { + this(alpha, depth, stencil, 0); + } + + public PixelFormat(int alpha, int depth, int stencil, int samples) { + this(0, alpha, depth, stencil, samples); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples) { + this(bpp, alpha, depth, stencil, samples, 0, 0, 0, false); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples, int num_aux_buffers, int accum_bpp, int accum_alpha, boolean stereo) { + this(bpp, alpha, depth, stencil, samples, num_aux_buffers, accum_bpp, accum_alpha, stereo, false); + } + + public PixelFormat(int bpp, int alpha, int depth, int stencil, int samples, int num_aux_buffers, int accum_bpp, int accum_alpha, boolean stereo, boolean floating_point) { + this.bpp = bpp; + this.alpha = alpha; + this.depth = depth; + this.stencil = stencil; + + this.samples = samples; + + this.num_aux_buffers = num_aux_buffers; + + this.accum_bpp = accum_bpp; + this.accum_alpha = accum_alpha; + + this.stereo = stereo; + + this.floating_point = floating_point; + this.floating_point_packed = false; + this.sRGB = false; + } + + private PixelFormat(final PixelFormat pf) { + this.bpp = pf.bpp; + this.alpha = pf.alpha; + this.depth = pf.depth; + this.stencil = pf.stencil; + + this.samples = pf.samples; + this.colorSamples = pf.colorSamples; + + this.num_aux_buffers = pf.num_aux_buffers; + + this.accum_bpp = pf.accum_bpp; + this.accum_alpha = pf.accum_alpha; + + this.stereo = pf.stereo; + + this.floating_point = pf.floating_point; + this.floating_point_packed = pf.floating_point_packed; + this.sRGB = pf.sRGB; + } + + public int getBitsPerPixel() { + return bpp; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new bits per pixel value. + * + * @param bpp the new bits per pixel value. + * + * @return the new PixelFormat + */ + public PixelFormat withBitsPerPixel(final int bpp) { + if ( bpp < 0 ) + throw new IllegalArgumentException("Invalid number of bits per pixel specified: " + bpp); + + final PixelFormat pf = new PixelFormat(this); + pf.bpp = bpp; + return pf; + } + + public int getAlphaBits() { + return alpha; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new alpha bits value. + * + * @param alpha the new alpha bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withAlphaBits(final int alpha) { + if ( alpha < 0 ) + throw new IllegalArgumentException("Invalid number of alpha bits specified: " + alpha); + + final PixelFormat pf = new PixelFormat(this); + pf.alpha = alpha; + return pf; + } + + public int getDepthBits() { + return depth; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new depth bits value. + * + * @param depth the new depth bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withDepthBits(final int depth) { + if ( depth < 0 ) + throw new IllegalArgumentException("Invalid number of depth bits specified: " + depth); + + final PixelFormat pf = new PixelFormat(this); + pf.depth = depth; + return pf; + } + + public int getStencilBits() { + return stencil; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new stencil bits value. + * + * @param stencil the new stencil bits value. + * + * @return the new PixelFormat + */ + public PixelFormat withStencilBits(final int stencil) { + if ( stencil < 0 ) + throw new IllegalArgumentException("Invalid number of stencil bits specified: " + stencil); + + final PixelFormat pf = new PixelFormat(this); + pf.stencil = stencil; + return pf; + } + + public int getSamples() { + return samples; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new samples value. + * + * @param samples the new samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withSamples(final int samples) { + if ( samples < 0 ) + throw new IllegalArgumentException("Invalid number of samples specified: " + samples); + + final PixelFormat pf = new PixelFormat(this); + pf.samples = samples; + return pf; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new color samples values. + * A value greater than 0 is valid only if the {@code samples} property is also greater than 0. Additionally, the + * color samples value needs to be lower than or equal to the {@code samples} property. + * + * @param colorSamples the new color samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withCoverageSamples(final int colorSamples) { + return withCoverageSamples(colorSamples, samples); + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new color samples + * and coverage samples values. + * + * @param colorSamples the new color samples value. This value must be lower than or equal to the coverage samples value. + * @param coverageSamples the new coverage samples value. + * + * @return the new PixelFormat + */ + public PixelFormat withCoverageSamples(final int colorSamples, final int coverageSamples) { + if ( coverageSamples < 0 || colorSamples < 0 || (coverageSamples == 0 && 0 < colorSamples) || coverageSamples < colorSamples ) + throw new IllegalArgumentException("Invalid number of coverage samples specified: " + coverageSamples + " - " + colorSamples); + + final PixelFormat pf = new PixelFormat(this); + pf.samples = coverageSamples; + pf.colorSamples = colorSamples; + return pf; + } + + public int getAuxBuffers() { + return num_aux_buffers; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new auxiliary buffers value. + * + * @param num_aux_buffers the new auxiliary buffers value. + * + * @return the new PixelFormat + */ + public PixelFormat withAuxBuffers(final int num_aux_buffers) { + if ( num_aux_buffers < 0 ) + throw new IllegalArgumentException("Invalid number of auxiliary buffers specified: " + num_aux_buffers); + + final PixelFormat pf = new PixelFormat(this); + pf.num_aux_buffers = num_aux_buffers; + return pf; + } + + public int getAccumulationBitsPerPixel() { + return accum_bpp; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new bits per pixel in the accumulation buffer value. + * + * @param accum_bpp the new bits per pixel in the accumulation buffer value. + * + * @return the new PixelFormat + */ + public PixelFormat withAccumulationBitsPerPixel(final int accum_bpp) { + if ( accum_bpp < 0 ) + throw new IllegalArgumentException("Invalid number of bits per pixel in the accumulation buffer specified: " + accum_bpp); + + final PixelFormat pf = new PixelFormat(this); + pf.accum_bpp = accum_bpp; + return pf; + } + + public int getAccumulationAlpha() { + return accum_alpha; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new alpha bits in the accumulation buffer value. + * + * @param accum_alpha the new alpha bits in the accumulation buffer value. + * + * @return the new PixelFormat + */ + public PixelFormat withAccumulationAlpha(final int accum_alpha) { + if ( accum_alpha < 0 ) + throw new IllegalArgumentException("Invalid number of alpha bits in the accumulation buffer specified: " + accum_alpha); + + final PixelFormat pf = new PixelFormat(this); + pf.accum_alpha = accum_alpha; + return pf; + } + + public boolean isStereo() { + return stereo; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new stereo value. + * + * @param stereo the new stereo value. + * + * @return the new PixelFormat + */ + public PixelFormat withStereo(final boolean stereo) { + final PixelFormat pf = new PixelFormat(this); + pf.stereo = stereo; + return pf; + } + + public boolean isFloatingPoint() { + return floating_point; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new floating point value. + * If floating_point is true, floating_point_packed will be reset to false. + * + * @param floating_point the new floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withFloatingPoint(final boolean floating_point) { + final PixelFormat pf = new PixelFormat(this); + pf.floating_point = floating_point; + if ( floating_point ) + pf.floating_point_packed = false; + return pf; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new packed floating point value. + * If floating_point_packed is true, floating_point will be reset to false. + * + * @param floating_point_packed the new packed floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withFloatingPointPacked(final boolean floating_point_packed) { + final PixelFormat pf = new PixelFormat(this); + pf.floating_point_packed = floating_point_packed; + if ( floating_point_packed ) + pf.floating_point = false; + return pf; + } + + public boolean isSRGB() { + return sRGB; + } + + /** + * Returns a new PixelFormat object with the same properties as this PixelFormat and the new sRGB value. + * + * @param sRGB the new floating point value. + * + * @return the new PixelFormat + */ + public PixelFormat withSRGB(final boolean sRGB) { + final PixelFormat pf = new PixelFormat(this); + pf.sRGB = sRGB; + return pf; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormatLWJGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormatLWJGL.java new file mode 100644 index 0000000..81ff7bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/PixelFormatLWJGL.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * [INTERNAL USE ONLY] + * + * @author Spasi + */ +public interface PixelFormatLWJGL { + // Marker interface +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ReferencesStack.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ReferencesStack.java new file mode 100644 index 0000000..47df373 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/ReferencesStack.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import static org.lwjgl.opengl.GL11.*; + +class ReferencesStack { + private References[] references_stack; + private int stack_pos; + + public References getReferences() { + return references_stack[stack_pos]; + } + + public void pushState() { + int pos = ++stack_pos; + if (pos == references_stack.length) { + growStack(); + } + references_stack[pos].copy(references_stack[pos - 1], GL_ALL_CLIENT_ATTRIB_BITS); + } + + public References popState(int mask) { + References result = references_stack[stack_pos--]; + + references_stack[stack_pos].copy(result, ~mask); + result.clear(); + + return result; + } + + private void growStack() { + References[] new_references_stack = new References[references_stack.length + 1]; + System.arraycopy(references_stack, 0, new_references_stack, 0, references_stack.length); + references_stack = new_references_stack; + references_stack[references_stack.length - 1] = new References(GLContext.getCapabilities()); + } + + ReferencesStack() { + ContextCapabilities caps = GLContext.getCapabilities(); + references_stack = new References[1]; + stack_pos = 0; + for (int i = 0; i < references_stack.length; i++) + references_stack[i] = new References(caps); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/RenderTexture.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/RenderTexture.java new file mode 100644 index 0000000..08c4d36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/RenderTexture.java @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; + +import static org.lwjgl.opengl.GL11.*; + +/** This class represents the state necessary for render-to-texture. */ +public final class RenderTexture { + + // ---------------------------------------------------------------------------------- + // ----------------------------- WGL_ARB_render_texture ----------------------------- + // ---------------------------------------------------------------------------------- + + /* + Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList> + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_RGB_ARB = 0x2070; + private static final int WGL_BIND_TO_TEXTURE_RGBA_ARB = 0x2071; + + /* + Accepted by the <piAttribList> parameter of wglCreatePbufferARB and + by the <iAttribute> parameter of wglQueryPbufferARB: + */ + private static final int WGL_TEXTURE_FORMAT_ARB = 0x2072; + private static final int WGL_TEXTURE_TARGET_ARB = 0x2073; + private static final int WGL_MIPMAP_TEXTURE_ARB = 0x2074; + + /* + Accepted as a value in the <piAttribList> parameter of + wglCreatePbufferARB and returned in the value parameter of + wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_FORMAT_ARB: + */ + private static final int WGL_TEXTURE_RGB_ARB = 0x2075; + private static final int WGL_TEXTURE_RGBA_ARB = 0x2076; + + /* + Accepted as a value in the <piAttribList> parameter of + wglCreatePbufferARB and returned in the value parameter of + wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_TARGET_ARB: + */ + private static final int WGL_TEXTURE_CUBE_MAP_ARB = 0x2078; + private static final int WGL_TEXTURE_1D_ARB = 0x2079; + private static final int WGL_TEXTURE_2D_ARB = 0x207A; + private static final int WGL_NO_TEXTURE_ARB = 0x2077; + + /* + Accepted by the <piAttribList> parameter of wglSetPbufferAttribARB and + by the <iAttribute> parameter of wglQueryPbufferARB: + */ + static final int WGL_MIPMAP_LEVEL_ARB = 0x207B; + static final int WGL_CUBE_MAP_FACE_ARB = 0x207C; + + /* + Accepted as a value in the <piAttribList> parameter of + wglSetPbufferAttribARB and returned in the value parameter of + wglQueryPbufferARB when <iAttribute> is WGL_CUBE_MAP_FACE_ARB: + */ + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x207D; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x207E; + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x207F; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x2080; + static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x2081; + static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x2082; + + /* + Accepted by the <iBuffer> parameter of wglBindTexImageARB and + wglReleaseTexImageARB: + */ + static final int WGL_FRONT_LEFT_ARB = 0x2083; + static final int WGL_FRONT_RIGHT_ARB = 0x2084; + static final int WGL_BACK_LEFT_ARB = 0x2085; + static final int WGL_BACK_RIGHT_ARB = 0x2086; + + /* + private static final int WGL_AUX0_ARB = 0x2087; + private static final int WGL_AUX1_ARB = 0x2088; + private static final int WGL_AUX2_ARB = 0x2089; + private static final int WGL_AUX3_ARB = 0x208A; + private static final int WGL_AUX4_ARB = 0x208B; + private static final int WGL_AUX5_ARB = 0x208C; + private static final int WGL_AUX6_ARB = 0x208D; + private static final int WGL_AUX7_ARB = 0x208E; + private static final int WGL_AUX8_ARB = 0x208F; + private static final int WGL_AUX9_ARB = 0x2090; + */ + + // ------------------------------------------------------------------------------------------- + // ----------------------------- WGL_NV_render_texture_rectangle ----------------------------- + // ------------------------------------------------------------------------------------------- + + /* + Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList> + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = 0x20A0; + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = 0x20A1; + + /* + Accepted as a value in the <piAttribList> parameter of wglCreatePbufferARB + and returned in the value parameter of wglQueryPbufferARB when + <iAttribute> is WGL_TEXTURE_TARGET_ARB: + */ + private static final int WGL_TEXTURE_RECTANGLE_NV = 0x20A2; + + // --------------------------------------------------------------------------------------- + // ----------------------------- WGL_NV_render_depth_texture ----------------------------- + // --------------------------------------------------------------------------------------- + + /* + Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB, + wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList> + parameters of wglChoosePixelFormatARB: + */ + private static final int WGL_BIND_TO_TEXTURE_DEPTH_NV = 0x20A3; + private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV = 0x20A4; + + /* + Accepted by the <piAttribList> parameter of wglCreatePbufferARB and + by the <iAttribute> parameter of wglQueryPbufferARB: + */ + private static final int WGL_DEPTH_TEXTURE_FORMAT_NV = 0x20A5; + + /* + Accepted as a value in the <piAttribList> parameter of wglCreatePbufferARB + and returned in the value parameter of wglQueryPbufferARB when + <iAttribute> is WGL_DEPTH_TEXTURE_FORMAT_NV: + */ + private static final int WGL_TEXTURE_DEPTH_COMPONENT_NV = 0x20A6; + + /* + Accepted by the <iBuffer> parameter of wglBindTexImageARB: + */ + static final int WGL_DEPTH_COMPONENT_NV = 0x20A7; + + /** The TEXTURE_1D target. */ + public static final int RENDER_TEXTURE_1D = WGL_TEXTURE_1D_ARB; + + /** The TEXTURE_2D target. */ + public static final int RENDER_TEXTURE_2D = WGL_TEXTURE_2D_ARB; + + /** The TEXTURE_RECTANGLE target. */ + public static final int RENDER_TEXTURE_RECTANGLE = WGL_TEXTURE_RECTANGLE_NV; + + /** The TEXTURE_CUBE_MAP target. */ + public static final int RENDER_TEXTURE_CUBE_MAP = WGL_TEXTURE_CUBE_MAP_ARB; + + IntBuffer pixelFormatCaps; + IntBuffer pBufferAttribs; + + /** + * Creates a RenderTexture object for enabling render-to-texture on a P-buffer. + * <p/> + * NOTE: Only one of useRGB and useRGBA can be true at the same time. + * <p/> + * NOTE: useRGB(A) and useDepth can be true at the same time, thus allowing two different render textures. + * <p/> + * NOTE: The target parameter can be one of the following: + * <p/> + * RENDER_TEXTURE_1D RENDER_TEXTURE_2D RENDER_TEXTURE_RECTANGLE RENDER_TEXTURE_CUBE_MAP + * + * @param useRGB - When true the P-buffer can be used as an RGB render texture. + * @param useRGBA - When true the P-buffer can be used as an RGBA render texture. + * @param useDepth - When true the P-buffer can be used as a depth render texture. + * @param isRectangle - When true rectangle textures will be allowed on the P-buffer. + * @param target - The texture target of the render texture. + * @param mipmaps - How many mipmap levels to allocate on the P-buffer. + */ + public RenderTexture(boolean useRGB, boolean useRGBA, boolean useDepth, boolean isRectangle, int target, int mipmaps) { + if ( useRGB && useRGBA ) + throw new IllegalArgumentException("A RenderTexture can't be both RGB and RGBA."); + + if ( mipmaps < 0 ) + throw new IllegalArgumentException("The mipmap levels can't be negative."); + + if ( isRectangle && target != RENDER_TEXTURE_RECTANGLE ) + throw new IllegalArgumentException("When the RenderTexture is rectangle the target must be RENDER_TEXTURE_RECTANGLE."); + + pixelFormatCaps = BufferUtils.createIntBuffer(4); + pBufferAttribs = BufferUtils.createIntBuffer(8); + + if ( useRGB ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV : WGL_BIND_TO_TEXTURE_RGB_ARB); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB); + pBufferAttribs.put(WGL_TEXTURE_RGB_ARB); + } else if ( useRGBA ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV : WGL_BIND_TO_TEXTURE_RGBA_ARB); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB); + pBufferAttribs.put(WGL_TEXTURE_RGBA_ARB); + } + + if ( useDepth ) { + pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV : WGL_BIND_TO_TEXTURE_DEPTH_NV); + pixelFormatCaps.put(GL_TRUE); + + pBufferAttribs.put(WGL_DEPTH_TEXTURE_FORMAT_NV); + pBufferAttribs.put(WGL_TEXTURE_DEPTH_COMPONENT_NV); + } + + pBufferAttribs.put(WGL_TEXTURE_TARGET_ARB); + pBufferAttribs.put(target); + + if ( mipmaps != 0 ) { + pBufferAttribs.put(WGL_MIPMAP_TEXTURE_ARB); + pBufferAttribs.put(mipmaps); + } + + pixelFormatCaps.flip(); + pBufferAttribs.flip(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/SharedDrawable.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/SharedDrawable.java new file mode 100644 index 0000000..aacd32d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/SharedDrawable.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; + +/** + * @author Spasi + */ + +/** + * A Drawable implementation that shares its context with another Drawable. This is useful + * for background loading of resources. See org.lwjgl.test.opengl.multithread.BackgroundLoad + * for an example. + * + * @author Spasi + */ +public final class SharedDrawable extends DrawableGL { + + public SharedDrawable(final Drawable drawable) throws LWJGLException { + this.context = (ContextGL)((DrawableLWJGL)drawable).createSharedContext(); + } + + public ContextGL createSharedContext() { + throw new UnsupportedOperationException(); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateStack.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateStack.java new file mode 100644 index 0000000..9d7755d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateStack.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +class StateStack { + private int[] state_stack; + private int stack_pos; + + public int getState() { + return state_stack[stack_pos]; + } + + public void pushState(int new_state) { + int pos = ++stack_pos; + if (pos == state_stack.length) { + growState(); + } + state_stack[pos] = new_state; + } + + public int popState() { + return state_stack[stack_pos--]; + } + + public void growState() { + int[] new_state_stack = new int[state_stack.length + 1]; + System.arraycopy(state_stack, 0, new_state_stack, 0, state_stack.length); + state_stack = new_state_stack; + } + + StateStack(int initial_value) { + state_stack = new int[1]; + stack_pos = 0; + state_stack[stack_pos] = initial_value; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateTracker.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateTracker.java new file mode 100644 index 0000000..6c222eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/StateTracker.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL21.*; +import static org.lwjgl.opengl.GL40.*; + +final class StateTracker { + + private ReferencesStack references_stack; + private final StateStack attrib_stack; + + private boolean insideBeginEnd; + + // VAOs are not shareable between contexts, no need to sync or make this static. + private final FastIntMap<VAOState> vaoMap = new FastIntMap<VAOState>(); + + StateTracker() { + attrib_stack = new StateStack(0); + } + + /** This is called after getting function addresses. */ + void init() { + references_stack = new ReferencesStack(); + } + + static void setBeginEnd(ContextCapabilities caps, boolean inside) { + caps.tracker.insideBeginEnd = inside; + } + + boolean isBeginEnd() { + return insideBeginEnd; + } + + static void popAttrib(ContextCapabilities caps) { + caps.tracker.doPopAttrib(); + } + + private void doPopAttrib() { + references_stack.popState(attrib_stack.popState()); + } + + static void pushAttrib(ContextCapabilities caps, int mask) { + caps.tracker.doPushAttrib(mask); + } + + private void doPushAttrib(int mask) { + attrib_stack.pushState(mask); + references_stack.pushState(); + } + + static References getReferences(ContextCapabilities caps) { + return caps.tracker.references_stack.getReferences(); + } + + static void bindBuffer(ContextCapabilities caps, int target, int buffer) { + final BaseReferences references = getReferences(caps); + switch ( target ) { + case GL_ARRAY_BUFFER: + references.arrayBuffer = buffer; + break; + case GL_ELEMENT_ARRAY_BUFFER: + // When a vertex array object is currently bound, update + // the VAO state instead of client state. + if ( references.vertexArrayObject != 0 ) + caps.tracker.vaoMap.get(references.vertexArrayObject).elementArrayBuffer = buffer; + else + references.elementArrayBuffer = buffer; + break; + case GL_PIXEL_PACK_BUFFER: + references.pixelPackBuffer = buffer; + break; + case GL_PIXEL_UNPACK_BUFFER: + references.pixelUnpackBuffer = buffer; + break; + case GL_DRAW_INDIRECT_BUFFER: + references.indirectBuffer = buffer; + break; + } + } + + static void bindVAO(final ContextCapabilities caps, final int array) { + final FastIntMap<VAOState> vaoMap = caps.tracker.vaoMap; + if ( !vaoMap.containsKey(array) ) + vaoMap.put(array, new VAOState()); + + getReferences(caps).vertexArrayObject = array; + } + + static void deleteVAO(final ContextCapabilities caps, final IntBuffer arrays) { + for ( int i = arrays.position(); i < arrays.limit(); i++ ) + deleteVAO(caps, arrays.get(i)); + } + + static void deleteVAO(final ContextCapabilities caps, final int array) { + caps.tracker.vaoMap.remove(array); + + final BaseReferences references = getReferences(caps); + if ( references.vertexArrayObject == array ) + references.vertexArrayObject = 0; + } + + /** + * Returns the currently bound ELEMENT_ARRAY_BUFFER. If a vertex array + * object is currently bound, then the VAO state is returned instead + * of the client state. + * + * @return the currently bound ELEMENT_ARRAY_BUFFER. + */ + static int getElementArrayBufferBound(final ContextCapabilities caps) { + final BaseReferences references = getReferences(caps); + + if ( references.vertexArrayObject == 0 ) + return references.elementArrayBuffer; + else + return caps.tracker.vaoMap.get(references.vertexArrayObject).elementArrayBuffer; + } + + /** + * Simple class to help us track VAO state. Currently + * only ELEMENT_ARRAY_BUFFER_BINDING is tracked, since + * that's the only state we check from tables 6.6-6.9. + */ + private static class VAOState { + + int elementArrayBuffer; + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Sync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Sync.java new file mode 100644 index 0000000..830f8d4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Sync.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.Sys; + +/** +* A highly accurate sync method that continually adapts to the system +* it runs on to provide reliable results. +* +* @author Riven +* @author kappaOne +*/ +class Sync { + + /** number of nano seconds in a second */ + private static final long NANOS_IN_SECOND = 1000L * 1000L * 1000L; + + /** The time to sleep/yield until the next frame */ + private static long nextFrame = 0; + + /** whether the initialisation code has run */ + private static boolean initialised = false; + + /** for calculating the averages the previous sleep/yield times are stored */ + private static RunningAvg sleepDurations = new RunningAvg(10); + private static RunningAvg yieldDurations = new RunningAvg(10); + + + /** + * An accurate sync method that will attempt to run at a constant frame rate. + * It should be called once every frame. + * + * @param fps - the desired frame rate, in frames per second + */ + public static void sync(int fps) { + if (fps <= 0) return; + if (!initialised) initialise(); + + try { + // sleep until the average sleep time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > sleepDurations.avg(); t0 = t1) { + Thread.sleep(1); + sleepDurations.add((t1 = getTime()) - t0); // update average sleep time + } + + // slowly dampen sleep average if too high to avoid yielding too much + sleepDurations.dampenForLowResTicker(); + + // yield until the average yield time is greater than the time remaining till nextFrame + for (long t0 = getTime(), t1; (nextFrame - t0) > yieldDurations.avg(); t0 = t1) { + Thread.yield(); + yieldDurations.add((t1 = getTime()) - t0); // update average yield time + } + } catch (InterruptedException e) { + + } + + // schedule next frame, drop frame(s) if already too late for next frame + nextFrame = Math.max(nextFrame + NANOS_IN_SECOND / fps, getTime()); + } + + /** + * This method will initialise the sync method by setting initial + * values for sleepDurations/yieldDurations and nextFrame. + * + * If running on windows it will start the sleep timer fix. + */ + private static void initialise() { + initialised = true; + + sleepDurations.init(1000 * 1000); + yieldDurations.init((int) (-(getTime() - getTime()) * 1.333)); + + nextFrame = getTime(); + + String osName = System.getProperty("os.name"); + + if (osName.startsWith("Win")) { + // On windows the sleep functions can be highly inaccurate by + // over 10ms making in unusable. However it can be forced to + // be a bit more accurate by running a separate sleeping daemon + // thread. + Thread timerAccuracyThread = new Thread(new Runnable() { + public void run() { + try { + Thread.sleep(Long.MAX_VALUE); + } catch (Exception e) {} + } + }); + + timerAccuracyThread.setName("LWJGL Timer"); + timerAccuracyThread.setDaemon(true); + timerAccuracyThread.start(); + } + } + + /** + * Get the system time in nano seconds + * + * @return will return the current time in nano's + */ + private static long getTime() { + return (Sys.getTime() * NANOS_IN_SECOND) / Sys.getTimerResolution(); + } + + private static class RunningAvg { + private final long[] slots; + private int offset; + + private static final long DAMPEN_THRESHOLD = 10 * 1000L * 1000L; // 10ms + private static final float DAMPEN_FACTOR = 0.9f; // don't change: 0.9f is exactly right! + + public RunningAvg(int slotCount) { + this.slots = new long[slotCount]; + this.offset = 0; + } + + public void init(long value) { + while (this.offset < this.slots.length) { + this.slots[this.offset++] = value; + } + } + + public void add(long value) { + this.slots[this.offset++ % this.slots.length] = value; + this.offset %= this.slots.length; + } + + public long avg() { + long sum = 0; + for (int i = 0; i < this.slots.length; i++) { + sum += this.slots[i]; + } + return sum / this.slots.length; + } + + public void dampenForLowResTicker() { + if (this.avg() > DAMPEN_THRESHOLD) { + for (int i = 0; i < this.slots.length; i++) { + this.slots[i] *= DAMPEN_FACTOR; + } + } + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Util.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Util.java new file mode 100644 index 0000000..2417e1c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/Util.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import static org.lwjgl.opengl.ARBImaging.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * Simple utility class. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +public final class Util { + /** No c'tor */ + private Util() { + } + + /** + * Throws OpenGLException if glGetError() returns anything else than GL_NO_ERROR + * + */ + public static void checkGLError() throws OpenGLException { + if ( ContextCapabilities.DEBUG && GLContext.getCapabilities().tracker.isBeginEnd() ) // Do not call GetError inside a Begin/End pair. + return; + int err = glGetError(); + if ( err != GL_NO_ERROR ) { + throw new OpenGLException(err); + } + } + + /** + * Translate a GL error code to a String describing the error + */ + public static String translateGLErrorString(int error_code) { + switch (error_code) { + case GL_NO_ERROR: + return "No error"; + case GL_INVALID_ENUM: + return "Invalid enum"; + case GL_INVALID_VALUE: + return "Invalid value"; + case GL_INVALID_OPERATION: + return "Invalid operation"; + case GL_STACK_OVERFLOW: + return "Stack overflow"; + case GL_STACK_UNDERFLOW: + return "Stack underflow"; + case GL_OUT_OF_MEMORY: + return "Out of memory"; + case GL_TABLE_TOO_LARGE: + return "Table too large"; + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "Invalid framebuffer operation"; + default: + return null; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsAWTGLCanvasPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsAWTGLCanvasPeerInfo.java new file mode 100644 index 0000000..1f61b1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsAWTGLCanvasPeerInfo.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; + +import java.awt.Canvas; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class WindowsAWTGLCanvasPeerInfo extends WindowsPeerInfo { + private final Canvas component; + private final AWTSurfaceLock awt_surface = new AWTSurfaceLock(); + private final PixelFormat pixel_format; + private boolean has_pixel_format; + + WindowsAWTGLCanvasPeerInfo(Canvas component, PixelFormat pixel_format) { + this.component = component; + this.pixel_format = pixel_format; + } + + protected void doLockAndInitHandle() throws LWJGLException { + nInitHandle(awt_surface.lockAndGetHandle(component), getHandle()); + if (!has_pixel_format && pixel_format != null) { + // If we haven't applied a pixel format yet, do it now + int format = choosePixelFormat(getHdc(), component.getX(), component.getY(), pixel_format, null, true, true, false, true); + setPixelFormat(getHdc(), format); + has_pixel_format = true; + } + } + private static native void nInitHandle(ByteBuffer surface_buffer, ByteBuffer peer_info_handle) throws LWJGLException; + + protected void doUnlock() throws LWJGLException { + awt_surface.unlock(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsCanvasImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsCanvasImplementation.java new file mode 100644 index 0000000..cb817c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsCanvasImplementation.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.Toolkit; +import java.awt.Canvas; +import java.security.PrivilegedAction; +import java.security.AccessController; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class WindowsCanvasImplementation implements AWTCanvasImplementation { + static { + // Make sure the awt stuff is properly initialised (the jawt library in particular) + Toolkit.getDefaultToolkit(); + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + try { + System.loadLibrary("jawt"); + } catch (UnsatisfiedLinkError e) { + /* It is probably already loaded, potentially by a different ClassLoader + * so just log the exception and continue + */ + LWJGLUtil.log("Failed to load jawt: " + e.getMessage()); + } + return null; + } + }); + } + + public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + return new WindowsAWTGLCanvasPeerInfo(component, pixel_format); + } + + /** + * Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat. + * + * @return The GraphicsConfiguration corresponding to a visual that matches the pixel format. + */ + public GraphicsConfiguration findConfiguration(GraphicsDevice device, PixelFormat pixel_format) throws LWJGLException { + /* + * It seems like the best way is to simply return null and + * use SetPixelFormat in JNI later. + */ + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextAttribs.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextAttribs.java new file mode 100644 index 0000000..5367c15 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextAttribs.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * An implementation of ContextAttribs using WGL_create_context. + * + * @author spasi <spasi@users.sourceforge.net> + */ +final class WindowsContextAttribs implements ContextAttribsImplementation { + + private static final int WGL_CONTEXT_MAJOR_VERSION_ARB = 0x2091; + private static final int WGL_CONTEXT_MINOR_VERSION_ARB = 0x2092; + private static final int WGL_CONTEXT_LAYER_PLANE_ARB = 0x2093; + private static final int WGL_CONTEXT_FLAGS_ARB = 0x2094; + private static final int WGL_CONTEXT_PROFILE_MASK_ARB = 0x9126; + + private static final int WGL_CONTEXT_DEBUG_BIT_ARB = 0x0001; + private static final int WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002; + + private static final int WGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001; + private static final int WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002; + + WindowsContextAttribs() { + } + + public int getMajorVersionAttrib() { + return WGL_CONTEXT_MAJOR_VERSION_ARB; + } + + public int getMinorVersionAttrib() { + return WGL_CONTEXT_MINOR_VERSION_ARB; + } + + public int getLayerPlaneAttrib() { + return WGL_CONTEXT_LAYER_PLANE_ARB; + } + + public int getFlagsAttrib() { + return WGL_CONTEXT_FLAGS_ARB; + } + + public int getDebugBit() { + return WGL_CONTEXT_DEBUG_BIT_ARB; + } + + public int getForwardCompatibleBit() { + return WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; + } + + public int getProfileMaskAttrib() { + return WGL_CONTEXT_PROFILE_MASK_ARB; + } + + public int getProfileCoreBit() { + return WGL_CONTEXT_CORE_PROFILE_BIT_ARB; + } + + public int getProfileCompatibilityBit() { + return WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextImplementation.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextImplementation.java new file mode 100644 index 0000000..08d0d9a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsContextImplementation.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class WindowsContextImplementation implements ContextImplementation { + + public ByteBuffer create(PeerInfo peer_info, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + return nCreate(peer_handle, attribs, shared_context_handle); + } finally { + peer_info.unlock(); + } + } + + private static native ByteBuffer nCreate(ByteBuffer peer_handle, IntBuffer attribs_handle, ByteBuffer shared_context_handle) throws LWJGLException; + + native long getHGLRC(ByteBuffer context_handle); + + native long getHDC(ByteBuffer peer_info_handle); + + public void swapBuffers() throws LWJGLException { + ContextGL current_context = ContextGL.getCurrentContext(); + if ( current_context == null ) + throw new IllegalStateException("No context is current"); + synchronized ( current_context ) { + PeerInfo current_peer_info = current_context.getPeerInfo(); + ByteBuffer peer_handle = current_peer_info.lockAndGetHandle(); + try { + nSwapBuffers(peer_handle); + } finally { + current_peer_info.unlock(); + } + } + } + + private static native void nSwapBuffers(ByteBuffer peer_info_handle) throws LWJGLException; + + public void releaseDrawable(ByteBuffer context_handle) throws LWJGLException { + } + + public void update(ByteBuffer context_handle) { + } + + public void releaseCurrentContext() throws LWJGLException { + nReleaseCurrentContext(); + } + + private static native void nReleaseCurrentContext() throws LWJGLException; + + public void makeCurrent(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + nMakeCurrent(peer_handle, handle); + } finally { + peer_info.unlock(); + } + } + + private static native void nMakeCurrent(ByteBuffer peer_handle, ByteBuffer context_handle) throws LWJGLException; + + public boolean isCurrent(ByteBuffer handle) throws LWJGLException { + boolean result = nIsCurrent(handle); + return result; + } + + private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; + + public void setSwapInterval(int value) { + boolean success = nSetSwapInterval(value); + if ( !success ) + LWJGLUtil.log("Failed to set swap interval"); + Util.checkGLError(); + } + + private static native boolean nSetSwapInterval(int value); + + public void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { + nDestroy(handle); + } + + private static native void nDestroy(ByteBuffer context_handle) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplay.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplay.java new file mode 100644 index 0000000..0771063 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -0,0 +1,1234 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Display implementation interface. Display delegates + * to implementors of this interface. There is one DisplayImplementation + * for each supported platform. + * @author elias_naur + */ + +import java.awt.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.lang.reflect.Method; +import java.nio.*; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.BufferUtils; +import org.lwjgl.MemoryUtil; +import org.lwjgl.input.Cursor; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengles.EGL; + +import javax.swing.*; + +final class WindowsDisplay implements DisplayImplementation { + private static final int GAMMA_LENGTH = 256; + + private static final int WM_WINDOWPOSCHANGED = 0x0047; + private static final int WM_MOVE = 0x0003; + private static final int WM_CANCELMODE = 0x001F; + private static final int WM_MOUSEMOVE = 0x0200; + private static final int WM_LBUTTONDOWN = 0x0201; + private static final int WM_LBUTTONUP = 0x0202; + private static final int WM_LBUTTONDBLCLK = 0x0203; + private static final int WM_RBUTTONDOWN = 0x0204; + private static final int WM_RBUTTONUP = 0x0205; + private static final int WM_RBUTTONDBLCLK = 0x0206; + private static final int WM_MBUTTONDOWN = 0x0207; + private static final int WM_MBUTTONUP = 0x0208; + private static final int WM_MBUTTONDBLCLK = 0x0209; + private static final int WM_XBUTTONDOWN = 0x020B; + private static final int WM_XBUTTONUP = 0x020C; + private static final int WM_XBUTTONDBLCLK = 0x020D; + private static final int WM_MOUSEWHEEL = 0x020A; + private static final int WM_CAPTURECHANGED = 0x0215; + private static final int WM_MOUSELEAVE = 0x02A3; + private static final int WM_ENTERSIZEMOVE = 0x0231; + private static final int WM_EXITSIZEMOVE = 0x0232; + private static final int WM_SIZING = 0x0214; + private static final int WM_KEYDOWN = 256; + private static final int WM_KEYUP = 257; + private static final int WM_SYSKEYUP = 261; + private static final int WM_SYSKEYDOWN = 260; + private static final int WM_SYSCHAR = 262; + private static final int WM_CHAR = 258; + private static final int WM_GETICON = 0x007F; + private static final int WM_SETICON = 0x0080; + private static final int WM_SETCURSOR = 0x0020; + private static final int WM_MOUSEACTIVATE = 0x0021; + + private static final int WM_QUIT = 0x0012; + private static final int WM_SYSCOMMAND = 0x0112; + private static final int WM_PAINT = 0x000F; + private static final int WM_KILLFOCUS = 8; + private static final int WM_SETFOCUS = 7; + + private static final int SC_SIZE = 0xF000; + private static final int SC_MOVE = 0xF010; + private static final int SC_MINIMIZE = 0xF020; + private static final int SC_MAXIMIZE = 0xF030; + private static final int SC_NEXTWINDOW = 0xF040; + private static final int SC_PREVWINDOW = 0xF050; + private static final int SC_CLOSE = 0xF060; + private static final int SC_VSCROLL = 0xF070; + private static final int SC_HSCROLL = 0xF080; + private static final int SC_MOUSEMENU = 0xF090; + private static final int SC_KEYMENU = 0xF100; + private static final int SC_ARRANGE = 0xF110; + private static final int SC_RESTORE = 0xF120; + private static final int SC_TASKLIST = 0xF130; + private static final int SC_SCREENSAVE = 0xF140; + private static final int SC_HOTKEY = 0xF150; + private static final int SC_DEFAULT = 0xF160; + private static final int SC_MONITORPOWER = 0xF170; + private static final int SC_CONTEXTHELP = 0xF180; + private static final int SC_SEPARATOR = 0xF00F; + + static final int SM_CXCURSOR = 13; + static final int SM_CYCURSOR = 14; + static final int SM_CMOUSEBUTTONS = 43; + static final int SM_MOUSEWHEELPRESENT = 75; + + private static final int SIZE_RESTORED = 0; + private static final int SIZE_MINIMIZED = 1; + private static final int SIZE_MAXIMIZED = 2; + private static final int WM_SIZE = 0x0005; + private static final int WM_ACTIVATE = 0x0006; + private static final int WA_INACTIVE = 0; + private static final int WA_ACTIVE = 1; + private static final int WA_CLICKACTIVE = 2; + private static final int SW_NORMAL = 1; + private static final int SW_SHOWMINNOACTIVE = 7; + private static final int SW_SHOWDEFAULT = 10; + private static final int SW_RESTORE = 9; + private static final int SW_MAXIMIZE = 3; + + private static final int ICON_SMALL = 0; + private static final int ICON_BIG = 1; + + private static final IntBuffer rect_buffer = BufferUtils.createIntBuffer(4); + private static final Rect rect = new Rect(); + + private static final long HWND_TOP = 0; + private static final long HWND_BOTTOM = 1; + private static final long HWND_TOPMOST = -1; + private static final long HWND_NOTOPMOST = -2; + + private static final int SWP_NOSIZE = 0x0001; + private static final int SWP_NOMOVE = 0x0002; + private static final int SWP_NOZORDER = 0x0004; + private static final int SWP_FRAMECHANGED = 0x0020; + + private static final int GWL_STYLE = -16; + private static final int GWL_EXSTYLE = -20; + + private static final int WS_THICKFRAME = 0x00040000; + private static final int WS_MAXIMIZEBOX = 0x00010000; + + private static final int HTCLIENT = 0x01; + + private static final int MK_XBUTTON1 = 0x0020; + private static final int MK_XBUTTON2 = 0x0040; + private static final int XBUTTON1 = 0x0001; + private static final int XBUTTON2 = 0x0002; + + private static WindowsDisplay current_display; + + private static boolean cursor_clipped; + private WindowsDisplayPeerInfo peer_info; + private Object current_cursor; + + private static boolean hasParent; + + private Canvas parent; + private long parent_hwnd; + private FocusAdapter parent_focus_tracker; + private AtomicBoolean parent_focused; + + private WindowsKeyboard keyboard; + private WindowsMouse mouse; + + private boolean close_requested; + private boolean is_dirty; + + private ByteBuffer current_gamma; + private ByteBuffer saved_gamma; + private DisplayMode current_mode; + + private boolean mode_set; + private boolean isMinimized; + private boolean isFocused; + private boolean redoMakeContextCurrent; + private boolean inAppActivate; + private boolean resized; + private boolean resizable; + private boolean maximized; + private int x; + private int y; + private int width; + private int height; + + private long hwnd; + private long hdc; + + private long small_icon; + private long large_icon; + private boolean iconsLoaded; + + private int captureMouse = -1; + private boolean trackingMouse; + private boolean mouseInside; + + static { + try { + Method windowProc = WindowsDisplay.class.getDeclaredMethod("handleMessage", long.class, int.class, long.class, long.class, long.class); + setWindowProc(windowProc); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + WindowsDisplay() { + current_display = this; + } + + public void createWindow(DrawableLWJGL drawable, DisplayMode mode, Canvas parent, int x, int y) throws LWJGLException { + close_requested = false; + is_dirty = false; + isMinimized = false; + isFocused = false; + redoMakeContextCurrent = false; + maximized = false; + this.parent = parent; + hasParent = parent != null; + parent_hwnd = parent != null ? getHwnd(parent) : 0; + this.hwnd = nCreateWindow(x, y, mode.getWidth(), mode.getHeight(), Display.isFullscreen() || isUndecorated(), parent != null, parent_hwnd); + this.resizable=false; + if (hwnd == 0) { + throw new LWJGLException("Failed to create window"); + } + this.hdc = getDC(hwnd); + if (hdc == 0) { + nDestroyWindow(hwnd); + throw new LWJGLException("Failed to get dc"); + } + + try { + if ( drawable instanceof DrawableGL ) { + int format = WindowsPeerInfo.choosePixelFormat(getHdc(), 0, 0, (PixelFormat)drawable.getPixelFormat(), null, true, true, false, true); + WindowsPeerInfo.setPixelFormat(getHdc(), format); + } else { + peer_info = new WindowsDisplayPeerInfo(true); + ((DrawableGLES)drawable).initialize(hwnd, hdc, EGL.EGL_WINDOW_BIT, (org.lwjgl.opengles.PixelFormat)drawable.getPixelFormat()); + } + peer_info.initDC(getHwnd(), getHdc()); + showWindow(getHwnd(), SW_SHOWDEFAULT); + + updateWidthAndHeight(); + + if ( parent == null ) { + if(Display.isResizable()) { + setResizable(true); + } + setForegroundWindow(getHwnd()); + } else { + parent_focused = new AtomicBoolean(false); + parent.addFocusListener(parent_focus_tracker = new FocusAdapter() { + public void focusGained(FocusEvent e) { + parent_focused.set(true); + clearAWTFocus(); + } + }); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + clearAWTFocus(); + } + }); + } + grabFocus(); + } catch (LWJGLException e) { + nReleaseDC(hwnd, hdc); + nDestroyWindow(hwnd); + throw e; + } + } + + private void updateWidthAndHeight() { + getClientRect(hwnd, rect_buffer); + rect.copyFromBuffer(rect_buffer); + width = rect.right - rect.left; + height = rect.bottom - rect.top; + } + + private static native long nCreateWindow(int x, int y, int width, int height, boolean undecorated, boolean child_window, long parent_hwnd) throws LWJGLException; + + private static boolean isUndecorated() { + return Display.getPrivilegedBoolean("org.lwjgl.opengl.Window.undecorated"); + } + + private static long getHwnd(Canvas parent) throws LWJGLException { + AWTCanvasImplementation awt_impl = AWTGLCanvas.createImplementation(); + WindowsPeerInfo parent_peer_info = (WindowsPeerInfo)awt_impl.createPeerInfo(parent, null, null); + ByteBuffer parent_peer_info_handle = parent_peer_info.lockAndGetHandle(); + try { + return parent_peer_info.getHwnd(); + } finally { + parent_peer_info.unlock(); + } + } + + public void destroyWindow() { + if ( parent != null ) { + parent.removeFocusListener(parent_focus_tracker); + parent_focus_tracker = null; + } + + nReleaseDC(hwnd, hdc); + nDestroyWindow(hwnd); + freeLargeIcon(); + freeSmallIcon(); + resetCursorClipping(); + } + private static native void nReleaseDC(long hwnd, long hdc); + private static native void nDestroyWindow(long hwnd); + static void resetCursorClipping() { + if (cursor_clipped) { + try { + clipCursor(null); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to reset cursor clipping: " + e); + } + cursor_clipped = false; + } + } + + private static void getGlobalClientRect(long hwnd, Rect rect) { + rect_buffer.put(0, 0).put(1, 0); + clientToScreen(hwnd, rect_buffer); + int offset_x = rect_buffer.get(0); + int offset_y = rect_buffer.get(1); + getClientRect(hwnd, rect_buffer); + rect.copyFromBuffer(rect_buffer); + rect.offset(offset_x, offset_y); + } + + static void setupCursorClipping(long hwnd) throws LWJGLException { + cursor_clipped = true; + getGlobalClientRect(hwnd, rect); + rect.copyToBuffer(rect_buffer); + clipCursor(rect_buffer); + } + private static native void clipCursor(IntBuffer rect) throws LWJGLException; + + public void switchDisplayMode(DisplayMode mode) throws LWJGLException { + nSwitchDisplayMode(mode); + current_mode = mode; + mode_set = true; + } + private static native void nSwitchDisplayMode(DisplayMode mode) throws LWJGLException; + + /* + * Called when the application is alt-tabbed to or from + */ + private void appActivate(boolean active) { + if (inAppActivate) { + return; + } + inAppActivate = true; + isFocused = active; + if (active) { + if (Display.isFullscreen()) { + restoreDisplayMode(); + } + if (parent == null) { + setForegroundWindow(getHwnd()); + } + setFocus(getHwnd()); + redoMakeContextCurrent = true; + if (Display.isFullscreen()) + updateClipping(); + + if ( keyboard != null ) + keyboard.fireLostKeyEvents(); + } else if (Display.isFullscreen()) { + showWindow(getHwnd(), SW_SHOWMINNOACTIVE); + resetDisplayMode(); + } else + updateClipping(); + updateCursor(); + inAppActivate = false; + } + private static native void showWindow(long hwnd, int mode); + private static native void setForegroundWindow(long hwnd); + private static native void setFocus(long hwnd); + + private void clearAWTFocus() { + // This is needed so that the last focused component AWT remembers is NOT our Canvas + WindowsDisplay.this.parent.setFocusable(false); + WindowsDisplay.this.parent.setFocusable(true); + + // Clear AWT focus owner + KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner(); + } + + private void grabFocus() { + if ( parent == null ) + setFocus(getHwnd()); + else + SwingUtilities.invokeLater(new Runnable() { + public void run() { + parent.requestFocus(); + } + }); + } + + private void restoreDisplayMode() { + try { + doSetGammaRamp(current_gamma); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to restore gamma: " + e.getMessage()); + } + + if (!mode_set) { + mode_set = true; + try { + nSwitchDisplayMode(current_mode); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to restore display mode: " + e.getMessage()); + } + } + } + + public void resetDisplayMode() { + try { + doSetGammaRamp(saved_gamma); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to reset gamma ramp: " + e.getMessage()); + } + current_gamma = saved_gamma; + if (mode_set) { + mode_set = false; + nResetDisplayMode(); + } + resetCursorClipping(); + } + private static native void nResetDisplayMode(); + + public int getGammaRampLength() { + return GAMMA_LENGTH; + } + + public void setGammaRamp(FloatBuffer gammaRamp) throws LWJGLException { + doSetGammaRamp(convertToNativeRamp(gammaRamp)); + } + private static native ByteBuffer convertToNativeRamp(FloatBuffer gamma_ramp) throws LWJGLException; + private static native ByteBuffer getCurrentGammaRamp() throws LWJGLException; + + private void doSetGammaRamp(ByteBuffer native_gamma) throws LWJGLException { + nSetGammaRamp(native_gamma); + current_gamma = native_gamma; + } + private static native void nSetGammaRamp(ByteBuffer native_ramp) throws LWJGLException; + + public String getAdapter() { + try { + String maxObjNo = WindowsRegistry.queryRegistrationKey( + WindowsRegistry.HKEY_LOCAL_MACHINE, + "HARDWARE\\DeviceMap\\Video", + "MaxObjectNumber"); + int maxObjectNumber = maxObjNo.charAt(0); + String vga_driver_value = ""; + for(int i=0;i<maxObjectNumber;i++) { + String adapter_string = WindowsRegistry.queryRegistrationKey( + WindowsRegistry.HKEY_LOCAL_MACHINE, + "HARDWARE\\DeviceMap\\Video", + "\\Device\\Video" + i); + String root_key = "\\registry\\machine\\"; + if (adapter_string.toLowerCase().startsWith(root_key)) { + String driver_value = WindowsRegistry.queryRegistrationKey( + WindowsRegistry.HKEY_LOCAL_MACHINE, + adapter_string.substring(root_key.length()), + "InstalledDisplayDrivers"); + if(driver_value.toUpperCase().startsWith("VGA")) { + vga_driver_value = driver_value; + } else if(!driver_value.toUpperCase().startsWith("RDP") && !driver_value.toUpperCase().startsWith("NMNDD")) { + return driver_value; + } + } + } + if(!vga_driver_value.equals("")) { + return vga_driver_value; + } + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while querying registry: " + e); + } + return null; + } + + public String getVersion() { + String driver = getAdapter(); + if (driver != null) { + String[] drivers = driver.split(","); + if(drivers.length>0) { + WindowsFileVersion version = nGetVersion(drivers[0] + ".dll"); + if (version != null) + return version.toString(); + } + } + return null; + } + private native WindowsFileVersion nGetVersion(String driver); + + public DisplayMode init() throws LWJGLException { + current_gamma = saved_gamma = getCurrentGammaRamp(); + return current_mode = getCurrentDisplayMode(); + } + private static native DisplayMode getCurrentDisplayMode() throws LWJGLException; + + public void setTitle(String title) { + ByteBuffer buffer = MemoryUtil.encodeUTF16(title); + nSetTitle(hwnd, MemoryUtil.getAddress0(buffer)); + } + private static native void nSetTitle(long hwnd, long title); + + public boolean isCloseRequested() { + boolean saved = close_requested; + close_requested = false; + return saved; + } + + public boolean isVisible() { + return !isMinimized; + } + + public boolean isActive() { + return isFocused; + } + + public boolean isDirty() { + boolean saved = is_dirty; + is_dirty = false; + return saved; + } + + public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException { + peer_info = new WindowsDisplayPeerInfo(false); + return peer_info; + } + + public void update() { + nUpdate(); + + if ( !isFocused && parent != null && parent_focused.compareAndSet(true, false) ) { + setFocus(getHwnd()); + } + + if (redoMakeContextCurrent) { + redoMakeContextCurrent = false; + /** + * WORKAROUND: + * Making the context current (redundantly) when the window + * is maximized helps some gfx cards recover from fullscreen + */ + try { + Context context = ((DrawableLWJGL)Display.getDrawable()).getContext(); + if (context != null && context.isCurrent()) + context.makeCurrent(); + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while trying to make context current: " + e); + } + } + } + private static native void nUpdate(); + + public void reshape(int x, int y, int width, int height) { + nReshape(getHwnd(), x, y, width, height, Display.isFullscreen() || isUndecorated(), parent != null); + } + private static native void nReshape(long hwnd, int x, int y, int width, int height, boolean undecorated, boolean child); + public native DisplayMode[] getAvailableDisplayModes() throws LWJGLException; + + /* Mouse */ + public boolean hasWheel() { + return mouse.hasWheel(); + } + + public int getButtonCount() { + return mouse.getButtonCount(); + } + + public void createMouse() throws LWJGLException { + mouse = new WindowsMouse(getHwnd()); + } + + public void destroyMouse() { + if (mouse != null) + mouse.destroy(); + mouse = null; + } + + public void pollMouse(IntBuffer coord_buffer, ByteBuffer buttons) { + mouse.poll(coord_buffer, buttons); + } + + public void readMouse(ByteBuffer buffer) { + mouse.read(buffer); + } + + public void grabMouse(boolean grab) { + mouse.grab(grab, shouldGrab()); + updateCursor(); + } + + public int getNativeCursorCapabilities() { + return Cursor.CURSOR_ONE_BIT_TRANSPARENCY; + } + + public void setCursorPosition(int x, int y) { + getGlobalClientRect(getHwnd(), rect); + int transformed_x = rect.left + x; + int transformed_y = rect.bottom - 1 - y; + nSetCursorPosition(transformed_x, transformed_y); + setMousePosition(x, y); + } + private static native void nSetCursorPosition(int x, int y); + + public void setNativeCursor(Object handle) throws LWJGLException { + current_cursor = handle; + updateCursor(); + } + + private void updateCursor() { + try { + if (mouse != null && shouldGrab()) + nSetNativeCursor(getHwnd(), mouse.getBlankCursor()); + else + nSetNativeCursor(getHwnd(), current_cursor); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to update cursor: " + e); + } + } + static native void nSetNativeCursor(long hwnd, Object handle) throws LWJGLException; + + public int getMinCursorSize() { + return getSystemMetrics(SM_CXCURSOR); + } + + public int getMaxCursorSize() { + return getSystemMetrics(SM_CXCURSOR); + } + + static native int getSystemMetrics(int index); + + private static native long getDllInstance(); + + private long getHwnd() { + return hwnd; + } + + private long getHdc() { + return hdc; + } + + private static native long getDC(long hwnd); + private static native long getDesktopWindow(); + private static native long getForegroundWindow(); + + static void centerCursor(long hwnd) { + if (getForegroundWindow() != hwnd && !hasParent) + return; + getGlobalClientRect(hwnd, rect); + int local_offset_x = rect.left; + int local_offset_y = rect.top; + /* -- This is wrong on multi-monitor setups + getGlobalClientRect(getDesktopWindow(), rect2); + Rect.intersect(rect, rect2, rect); + */ + int center_x = (rect.left + rect.right)/2; + int center_y = (rect.top + rect.bottom)/2; + nSetCursorPosition(center_x, center_y); + int local_x = center_x - local_offset_x; + int local_y = center_y - local_offset_y; + if (current_display != null) + current_display.setMousePosition(local_x, transformY(hwnd, local_y)); + } + + private void setMousePosition(int x, int y) { + if (mouse != null) + mouse.setPosition(x, y); + } + + /* Keyboard */ + public void createKeyboard() throws LWJGLException { + keyboard = new WindowsKeyboard(); + } + + public void destroyKeyboard() { + keyboard = null; + } + + public void pollKeyboard(ByteBuffer keyDownBuffer) { + keyboard.poll(keyDownBuffer); + } + + public void readKeyboard(ByteBuffer buffer) { + keyboard.read(buffer); + } + +// public native int isStateKeySet(int key); + + public static native ByteBuffer nCreateCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, int images_offset, IntBuffer delays, int delays_offset) throws LWJGLException; + + public Object createCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + return doCreateCursor(width, height, xHotspot, yHotspot, numImages, images, delays); + } + + static Object doCreateCursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { + return nCreateCursor(width, height, xHotspot, yHotspot, numImages, images, images.position(), delays, delays != null ? delays.position() : -1); + } + + public void destroyCursor(Object cursorHandle) { + doDestroyCursor(cursorHandle); + } + static native void doDestroyCursor(Object cursorHandle); + + public int getPbufferCapabilities() { + try { + // Return the capabilities of a minimum pixel format + return nGetPbufferCapabilities(new PixelFormat(0, 0, 0, 0, 0, 0, 0, 0, false)); + } catch (LWJGLException e) { + LWJGLUtil.log("Exception occurred while determining pbuffer capabilities: " + e); + return 0; + } + } + private native int nGetPbufferCapabilities(PixelFormat format) throws LWJGLException; + + public boolean isBufferLost(PeerInfo handle) { + return ((WindowsPbufferPeerInfo)handle).isBufferLost(); + } + + public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, + IntBuffer pixelFormatCaps, + IntBuffer pBufferAttribs) throws LWJGLException { + return new WindowsPbufferPeerInfo(width, height, pixel_format, pixelFormatCaps, pBufferAttribs); + } + + public void setPbufferAttrib(PeerInfo handle, int attrib, int value) { + ((WindowsPbufferPeerInfo)handle).setPbufferAttrib(attrib, value); + } + + public void bindTexImageToPbuffer(PeerInfo handle, int buffer) { + ((WindowsPbufferPeerInfo)handle).bindTexImageToPbuffer(buffer); + } + + public void releaseTexImageFromPbuffer(PeerInfo handle, int buffer) { + ((WindowsPbufferPeerInfo)handle).releaseTexImageFromPbuffer(buffer); + } + + private void freeSmallIcon() { + if (small_icon != 0) { + destroyIcon(small_icon); + small_icon = 0; + } + } + + private void freeLargeIcon() { + if (large_icon != 0) { + destroyIcon(large_icon); + large_icon = 0; + } + } + + /** + * Sets one or more icons for the Display. + * <ul> + * <li>On Windows you should supply at least one 16x16 icon and one 32x32.</li> + * <li>Linux (and similar platforms) expect one 32x32 icon.</li> + * <li>Mac OS X should be supplied one 128x128 icon</li> + * </ul> + * The implementation will use the supplied ByteBuffers with image data in RGBA and perform any conversions nescesarry for the specific platform. + * + * @param icons Array of icons in RGBA mode + * @return number of icons used. + */ + public int setIcon(ByteBuffer[] icons) { + boolean done_small = false; + boolean done_large = false; + int used = 0; + + int small_icon_size = 16; + int large_icon_size = 32; + for ( ByteBuffer icon : icons ) { + int size = icon.limit() / 4; + + if ( (((int)Math.sqrt(size)) == small_icon_size) && (!done_small) ) { + long small_new_icon = createIcon(small_icon_size, small_icon_size, icon.asIntBuffer()); + sendMessage(hwnd, WM_SETICON, ICON_SMALL, small_new_icon); + freeSmallIcon(); + small_icon = small_new_icon; + used++; + done_small = true; + } + if ( (((int)Math.sqrt(size)) == large_icon_size) && (!done_large) ) { + long large_new_icon = createIcon(large_icon_size, large_icon_size, icon.asIntBuffer()); + sendMessage(hwnd, WM_SETICON, ICON_BIG, large_new_icon); + freeLargeIcon(); + large_icon = large_new_icon; + used++; + done_large = true; + + // Problem: The taskbar icon won't update until Windows sends a WM_GETICON to our window proc and we reply. But this method is usually called + // on init and it might take a while before the next call to nUpdate (because of resources being loaded, etc). So we wait for the next + // WM_GETICON message (usually received about 100ms after WM_SETICON) to make sure the taskbar icon has updated before we return to the user. + // (We wouldn't need to do this if the event loop was running continuously on its own thread.) + iconsLoaded = false; + + // Track how long the wait takes and give up at 500ms, just in case. + long time = System.nanoTime(); + long MAX_WAIT = 500L * 1000L * 1000L; + while ( true ) { + nUpdate(); + if ( iconsLoaded || MAX_WAIT < System.nanoTime() - time ) + break; + + Thread.yield(); + } + } + } + + return used; + } + private static native long createIcon(int width, int height, IntBuffer icon); + private static native void destroyIcon(long handle); + private static native long sendMessage(long hwnd, long msg, long wparam, long lparam); + private static native long setWindowLongPtr(long hwnd, int nindex, long longPtr); + private static native long getWindowLongPtr(long hwnd, int nindex); + private static native boolean setWindowPos(long hwnd, long hwnd_after, int x, int y, int cx, int cy, long uflags); + + private void handleMouseButton(int button, int state, long millis) { + if (mouse != null) { + mouse.handleMouseButton((byte)button, (byte)state, millis); + + // need to capture? + if (captureMouse == -1 && button != -1 && state == 1) { + captureMouse = button; + nSetCapture(hwnd); + } + + // done with capture? + if(captureMouse != -1 && button == captureMouse && state == 0) { + captureMouse = -1; + nReleaseCapture(); + } + } + } + + private boolean shouldGrab() { + return !isMinimized && isFocused && Mouse.isGrabbed(); + } + + private void handleMouseMoved(int x, int y, long millis) { + if (mouse != null) { + mouse.handleMouseMoved(x, y, millis, shouldGrab()); + } + } + + private static native long nSetCapture(long hwnd); + private static native boolean nReleaseCapture(); + + private void handleMouseScrolled(int amount, long millis) { + if (mouse != null) + mouse.handleMouseScrolled(amount, millis); + } + + private static native void getClientRect(long hwnd, IntBuffer rect); + + private void handleChar(long wParam, long lParam, long millis) { + byte previous_state = (byte)((lParam >>> 30) & 0x1); + byte state = (byte)(1 - ((lParam >>> 31) & 0x1)); + boolean repeat = state == previous_state; + if (keyboard != null) + keyboard.handleChar((int)(wParam & 0xFFFF), millis, repeat); + } + + private void handleKeyButton(long wParam, long lParam, long millis) { + if ( keyboard == null ) + return; + + byte previous_state = (byte)((lParam >>> 30) & 0x1); + byte state = (byte)(1 - ((lParam >>> 31) & 0x1)); + boolean repeat = state == previous_state; // Repeat message + byte extended = (byte)((lParam >>> 24) & 0x1); + int scan_code = (int)((lParam >>> 16) & 0xFF); + + keyboard.handleKey((int)wParam, scan_code, extended != 0, state, millis, repeat); + } + + private static int transformY(long hwnd, int y) { + getClientRect(hwnd, rect_buffer); + rect.copyFromBuffer(rect_buffer); + return (rect.bottom - rect.top) - 1 - y; + } + + private static native void clientToScreen(long hwnd, IntBuffer point); + + private static native void setWindowProc(Method windowProc); + + private static long handleMessage(long hwnd, int msg, long wParam, long lParam, long millis) { + if (current_display != null) + return current_display.doHandleMessage(hwnd, msg, wParam, lParam, millis); + else + return defWindowProc(hwnd, msg, wParam, lParam); + } + + private static native long defWindowProc(long hwnd, int msg, long wParam, long lParam); + + private void checkCursorState() { + updateClipping(); + } + + private void updateClipping() { + if ((Display.isFullscreen() || (mouse != null && mouse.isGrabbed())) && !isMinimized && isFocused && (getForegroundWindow() == getHwnd() || hasParent)) { + try { + setupCursorClipping(getHwnd()); + } catch (LWJGLException e) { + LWJGLUtil.log("setupCursorClipping failed: " + e.getMessage()); + } + } else { + resetCursorClipping(); + } + } + + private void setMinimized(boolean m) { + isMinimized = m; + checkCursorState(); + } + + private long doHandleMessage(long hwnd, int msg, long wParam, long lParam, long millis) { + /*switch ( msg ) { + case 0x0: + case 0x0020: + case 0x0084: + case WM_MOUSEMOVE: + break; + default: + WindowsEventDebug.printMessage(msg, wParam, lParam); + }*/ + + if ( parent != null && !isFocused ) { + switch ( msg ) { + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_XBUTTONDOWN: + sendMessage(parent_hwnd, msg, wParam, lParam); + } + } + + switch (msg) { + // disable screen saver and monitor power down messages which wreak havoc + case WM_ACTIVATE: + /*switch ((int)wParam) { + case WA_ACTIVE: + case WA_CLICKACTIVE: + appActivate(true); + break; + case WA_INACTIVE: + appActivate(false); + break; + }*/ + return 0L; + case WM_SIZE: + switch ((int)wParam) { + case SIZE_RESTORED: + case SIZE_MAXIMIZED: + maximized = ((int)wParam) == SIZE_MAXIMIZED; + resized = true; + updateWidthAndHeight(); + setMinimized(false); + break; + case SIZE_MINIMIZED: + setMinimized(true); + break; + } + break; + case WM_SIZING: + resized = true; + updateWidthAndHeight(); + break; + case WM_SETCURSOR: + if((lParam & 0xFFFF) == HTCLIENT) { + // if the cursor is inside the client area, reset it + // to the current LWJGL-cursor + updateCursor(); + return -1; //TRUE + } else { + // let Windows handle cursors outside the client area for resizing, etc. + return defWindowProc(hwnd, msg, wParam, lParam); + } + case WM_KILLFOCUS: + appActivate(false); + return 0L; + case WM_SETFOCUS: + appActivate(true); + return 0L; + case WM_MOUSEACTIVATE: + if ( parent != null ) { + if ( !isFocused ) + grabFocus(); + return 3L; // MA_NOACTIVATE + } + break; + case WM_MOUSEMOVE: + int xPos = (int)(short)(lParam & 0xFFFF); + int yPos = transformY(getHwnd(), (int)(short)((lParam >> 16) & 0xFFFF)); + handleMouseMoved(xPos, yPos, millis); + checkCursorState(); + mouseInside = true; + if(!trackingMouse) { + trackingMouse = nTrackMouseEvent(hwnd); + } + return 0L; + case WM_MOUSEWHEEL: + int dwheel = (int)(short)((wParam >> 16) & 0xFFFF); + handleMouseScrolled(dwheel, millis); + return 0L; + case WM_LBUTTONDOWN: + handleMouseButton(0, 1, millis); + return 0L; + case WM_LBUTTONUP: + handleMouseButton(0, 0, millis); + return 0L; + case WM_RBUTTONDOWN: + handleMouseButton(1, 1, millis); + return 0L; + case WM_RBUTTONUP: + handleMouseButton(1, 0, millis); + return 0L; + case WM_MBUTTONDOWN: + handleMouseButton(2, 1, millis); + return 0L; + case WM_MBUTTONUP: + handleMouseButton(2, 0, millis); + return 0L; + case WM_XBUTTONUP: + if((wParam >> 16) == XBUTTON1) { + handleMouseButton(3, 0, millis); + } else { + handleMouseButton(4, 0, millis); + } + return 1; + case WM_XBUTTONDOWN: + if((wParam & 0xFF) == MK_XBUTTON1) { + handleMouseButton(3, 1, millis); + } else { + handleMouseButton(4, 1, millis); + } + return 1; + case WM_SYSCHAR: + case WM_CHAR: + handleChar(wParam, lParam, millis); + return 0L; + case WM_SYSKEYUP: + /* Fall through */ + case WM_KEYUP: + // SysRq apparently only generates WM_KEYUP, so we'll fake a WM_KEYDOWN + if (wParam == WindowsKeycodes.VK_SNAPSHOT && keyboard != null && + !keyboard.isKeyDown(org.lwjgl.input.Keyboard.KEY_SYSRQ)) { + // Set key state to pressed + long fake_lparam = lParam & ~(1 << 31); + // Set key previous state to released + fake_lparam &= ~(1 << 30); + handleKeyButton(wParam, fake_lparam, millis); + } + /* Fall through */ + case WM_SYSKEYDOWN: + /* Fall through */ + case WM_KEYDOWN: + handleKeyButton(wParam, lParam, millis); + break; + case WM_QUIT: + close_requested = true; + return 0L; + case WM_SYSCOMMAND: + switch ((int)(wParam & 0xfff0)) { + case SC_KEYMENU: + case SC_MOUSEMENU: + case SC_SCREENSAVE: + case SC_MONITORPOWER: + return 0L; + case SC_CLOSE: + close_requested = true; + return 0L; + default: + break; + } + break; + case WM_PAINT: + is_dirty = true; + break; + case WM_MOUSELEAVE: + mouseInside = false; + trackingMouse = false; + break; + case WM_CANCELMODE: + nReleaseCapture(); + /* fall through */ + case WM_CAPTURECHANGED: + if(captureMouse != -1) { + handleMouseButton(captureMouse, 0, millis); + captureMouse = -1; + } + return 0L; + case WM_WINDOWPOSCHANGED: + if(getWindowRect(hwnd, rect_buffer)) { + rect.copyFromBuffer(rect_buffer); + x = rect.top; + y = rect.bottom; + } else { + LWJGLUtil.log("WM_WINDOWPOSCHANGED: Unable to get window rect"); + } + break; + case WM_GETICON: + iconsLoaded = true; + break; + } + + return defWindowProc(hwnd, msg, wParam, lParam); + } + + private native boolean getWindowRect(long hwnd, IntBuffer rectBuffer); + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + private native boolean nTrackMouseEvent(long hwnd); + + public boolean isInsideWindow() { + return mouseInside; + } + + public void setResizable(boolean resizable) { + if(this.resizable != resizable) { + int style = (int)getWindowLongPtr(hwnd, GWL_STYLE); + int styleex = (int)getWindowLongPtr(hwnd, GWL_EXSTYLE); + + // update frame style + if(resizable && !Display.isFullscreen()) { + setWindowLongPtr(hwnd, GWL_STYLE, style |= (WS_THICKFRAME | WS_MAXIMIZEBOX)); + } else { + setWindowLongPtr(hwnd, GWL_STYLE, style &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX)); + } + + // from the existing client rect, determine the new window rect + // based on the style changes - using AdjustWindowRectEx. + getClientRect(hwnd, rect_buffer); + rect.copyFromBuffer(rect_buffer); + adjustWindowRectEx(rect_buffer, style, false, styleex); + rect.copyFromBuffer(rect_buffer); + + // force a frame update and resize accordingly + setWindowPos(hwnd, HWND_TOP, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED); + + updateWidthAndHeight(); + resized = false; + } + this.resizable = resizable; + } + + private native boolean adjustWindowRectEx(IntBuffer rectBuffer, int style, boolean menu, int styleex); + + public boolean wasResized() { + if(resized) { + resized = false; + return true; + } + return false; + } + + public float getPixelScaleFactor() { + return 1f; + } + + private static final class Rect { + public int top; + public int bottom; + public int left; + public int right; + + public void copyToBuffer(IntBuffer buffer) { + buffer.put(0, top).put(1, bottom).put(2, left).put(3, right); + } + + public void copyFromBuffer(IntBuffer buffer) { + top = buffer.get(0); + bottom = buffer.get(1); + left = buffer.get(2); + right = buffer.get(3); + } + + public void offset(int offset_x, int offset_y) { + left += offset_x; + right += offset_x; + top += offset_y; + bottom += offset_y; + } + + public static void intersect(Rect r1, Rect r2, Rect dst) { + dst.top = Math.max(r1.top, r2.top); + dst.bottom = Math.min(r1.bottom, r2.bottom); + dst.left = Math.max(r1.left, r2.left); + dst.right = Math.min(r1.right, r2.right); + } + + public String toString() { + return "Rect: top = " + top + " bottom = " + bottom + " left = " + left + " right = " + right + ", width: " + (right - left) + ", height: " + (bottom - top); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplayPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplayPeerInfo.java new file mode 100644 index 0000000..4de8a1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsDisplayPeerInfo.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class WindowsDisplayPeerInfo extends WindowsPeerInfo { + + final boolean egl; + + WindowsDisplayPeerInfo(boolean egl) throws LWJGLException { + this.egl = egl; + + if ( egl) + org.lwjgl.opengles.GLContext.loadOpenGLLibrary(); + else + GLContext.loadOpenGLLibrary(); + } + + void initDC(long hwnd, long hdc) throws LWJGLException { + nInitDC(getHandle(), hwnd, hdc); + } + private static native void nInitDC(ByteBuffer peer_info_handle, long hwnd, long hdc); + + protected void doLockAndInitHandle() throws LWJGLException { + // NO-OP + } + + protected void doUnlock() throws LWJGLException { + // NO-OP + } + + public void destroy() { + super.destroy(); + + if ( egl ) + org.lwjgl.opengles.GLContext.unloadOpenGLLibrary(); + else + GLContext.unloadOpenGLLibrary(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsFileVersion.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsFileVersion.java new file mode 100644 index 0000000..8ed5cc4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsFileVersion.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +final class WindowsFileVersion { + private final int product_version_ms; + private final int product_version_ls; + + WindowsFileVersion(int product_version_ms, int product_version_ls) { + this.product_version_ms = product_version_ms; + this.product_version_ls = product_version_ls; + } + + public String toString() { + int f1 = (product_version_ms >> 16) & 0xFFFF; + int f2 = product_version_ms & 0xFFFF; + int f3 = (product_version_ls >> 16) & 0xFFFF; + int f4 = product_version_ls & 0xFFFF; + return f1 + "." + f2 + "." + f3 + "." + f4; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeyboard.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeyboard.java new file mode 100644 index 0000000..3a7d07e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeyboard.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Windows implementation of the Keyboard. + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; + +final class WindowsKeyboard { + + private final byte[] key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE]; + private final byte[] virt_key_down_buffer = new byte[Keyboard.KEYBOARD_SIZE]; + private final EventQueue event_queue = new EventQueue(Keyboard.EVENT_SIZE); + private final ByteBuffer tmp_event = ByteBuffer.allocate(Keyboard.EVENT_SIZE); + + private boolean has_retained_event; // Indicates if we're waiting for a WM_CHAR + private int retained_key_code; + private byte retained_state; + private int retained_char; + private long retained_millis; + private boolean retained_repeat; + + WindowsKeyboard() throws LWJGLException { + } + + private static native boolean isWindowsNT(); + + boolean isKeyDown(int lwjgl_keycode) { + return key_down_buffer[lwjgl_keycode] == 1; + } + + void poll(ByteBuffer keyDownBuffer) { + // Handle shift key release while both are pressed. + // Windows will not send an up event for the first button that was released in this case. + // There will only be one up event, for the last button only. We handle this problem + // here, using asynchronous state queries. + if ( isKeyDown(Keyboard.KEY_LSHIFT) && isKeyDown(Keyboard.KEY_RSHIFT) ) { + if ( !isKeyPressedAsync(WindowsKeycodes.VK_LSHIFT) ) handleKey(WindowsKeycodes.VK_SHIFT, Keyboard.KEY_LSHIFT, false, (byte)0, 0L, false); + if ( !isKeyPressedAsync(WindowsKeycodes.VK_RSHIFT) ) handleKey(WindowsKeycodes.VK_SHIFT, Keyboard.KEY_RSHIFT, false, (byte)0, 0L, false); + } + + int old_position = keyDownBuffer.position(); + keyDownBuffer.put(key_down_buffer); + keyDownBuffer.position(old_position); + } + + private static native int MapVirtualKey(int uCode, int uMapType); + private static native int ToUnicode(int wVirtKey, int wScanCode, ByteBuffer lpKeyState, CharBuffer pwszBuff, int cchBuff, int flags); + private static native int ToAscii(int wVirtKey, int wScanCode, ByteBuffer lpKeyState, ByteBuffer lpChar, int flags); + private static native int GetKeyboardState(ByteBuffer lpKeyState); + private static native short GetKeyState(int virt_key); + private static native short GetAsyncKeyState(int virt_key); + + private void putEvent(int keycode, byte state, int ch, long millis, boolean repeat) { + tmp_event.clear(); + tmp_event.putInt(keycode).put(state).putInt(ch).putLong(millis*1000000).put(repeat ? (byte)1 : (byte)0); + tmp_event.flip(); + event_queue.putEvent(tmp_event); + } + + private static int translateExtended(int virt_key, int scan_code, boolean extended) { + switch (virt_key) { + case WindowsKeycodes.VK_SHIFT: + return scan_code == 0x36 ? WindowsKeycodes.VK_RSHIFT : WindowsKeycodes.VK_LSHIFT; + case WindowsKeycodes.VK_CONTROL: + return extended ? WindowsKeycodes.VK_RCONTROL : WindowsKeycodes.VK_LCONTROL; + case WindowsKeycodes.VK_MENU: + return extended ? WindowsKeycodes.VK_RMENU : WindowsKeycodes.VK_LMENU; + default: + return virt_key; + } + } + + private void flushRetained() { + if (has_retained_event) { + has_retained_event = false; + putEvent(retained_key_code, retained_state, retained_char, retained_millis, retained_repeat); + } + } + + private static boolean isKeyPressed(int state) { + return (state & 1) == 1; + } + + private static boolean isKeyPressedAsync(int virt_key) { + return (GetAsyncKeyState(virt_key) & 0x8000) != 0; + } + + void handleKey(int virt_key, int scan_code, boolean extended, byte event_state, long millis, boolean repeat) { + virt_key = translateExtended(virt_key, scan_code, extended); + if ( !repeat && isKeyPressed(event_state) == isKeyPressed(virt_key_down_buffer[virt_key]) ) + return; + + flushRetained(); + has_retained_event = true; + int keycode = WindowsKeycodes.mapVirtualKeyToLWJGLCode(virt_key); + if (keycode < key_down_buffer.length) { + key_down_buffer[keycode] = event_state; + virt_key_down_buffer[virt_key] = event_state; + } + retained_key_code = keycode; + retained_state = event_state; + retained_millis = millis; + retained_char = 0; + retained_repeat = repeat; + } + + void fireLostKeyEvents() { + for ( int i = 0; i < virt_key_down_buffer.length; i++ ) { + if ( isKeyPressed(virt_key_down_buffer[i]) && !isKeyPressedAsync(i) ) + handleKey(i, 0, false, (byte)0, 0L, false); + } + } + + void handleChar(int event_char, long millis, boolean repeat) { + if (has_retained_event && retained_char != 0) + flushRetained(); + if (!has_retained_event) { + putEvent(0, (byte)0, event_char, millis, repeat); + } else + retained_char = event_char; + } + + void read(ByteBuffer buffer) { + flushRetained(); + event_queue.copyEvents(buffer); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeycodes.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeycodes.java new file mode 100644 index 0000000..39e8567 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsKeycodes.java @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +import org.lwjgl.input.Keyboard; + +final class WindowsKeycodes { + public static final int VK_LBUTTON = 0x01; + public static final int VK_RBUTTON = 0x02; + public static final int VK_CANCEL = 0x03; + public static final int VK_MBUTTON = 0x04; /* NOT contiguous with L & RBUTTON */ + + public static final int VK_XBUTTON1 = 0x05; /* NOT contiguous with L & RBUTTON */ + public static final int VK_XBUTTON2 = 0x06; /* NOT contiguous with L & RBUTTON */ + +/* + * 0x07 : unassigned + */ + + public static final int VK_BACK = 0x08; + public static final int VK_TAB = 0x09; + +/* + * 0x0A - 0x0B : reserved + */ + + public static final int VK_CLEAR = 0x0C; + public static final int VK_RETURN = 0x0D; + + public static final int VK_SHIFT = 0x10; + public static final int VK_CONTROL = 0x11; + public static final int VK_MENU = 0x12; + public static final int VK_PAUSE = 0x13; + public static final int VK_CAPITAL = 0x14; + + public static final int VK_KANA = 0x15; + public static final int VK_HANGEUL = 0x15; /* old name - should be here for compatibility */ + public static final int VK_HANGUL = 0x15; + public static final int VK_JUNJA = 0x17; + public static final int VK_FINAL = 0x18; + public static final int VK_HANJA = 0x19; + public static final int VK_KANJI = 0x19; + + public static final int VK_ESCAPE = 0x1B; + + public static final int VK_CONVERT = 0x1C; + public static final int VK_NONCONVERT = 0x1D; + public static final int VK_ACCEPT = 0x1E; + public static final int VK_MODECHANGE = 0x1F; + + public static final int VK_SPACE = 0x20; + public static final int VK_PRIOR = 0x21; + public static final int VK_NEXT = 0x22; + public static final int VK_END = 0x23; + public static final int VK_HOME = 0x24; + public static final int VK_LEFT = 0x25; + public static final int VK_UP = 0x26; + public static final int VK_RIGHT = 0x27; + public static final int VK_DOWN = 0x28; + public static final int VK_SELECT = 0x29; + public static final int VK_PRINT = 0x2A; + public static final int VK_EXECUTE = 0x2B; + public static final int VK_SNAPSHOT = 0x2C; + public static final int VK_INSERT = 0x2D; + public static final int VK_DELETE = 0x2E; + public static final int VK_HELP = 0x2F; +/* + * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39) + * 0x40 : unassigned + * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A) + */ +public static final int VK_0 = 0x30; + public static final int VK_1 = 0x31; + public static final int VK_2 = 0x32; + public static final int VK_3 = 0x33; + public static final int VK_4 = 0x34; + public static final int VK_5 = 0x35; + public static final int VK_6 = 0x36; + public static final int VK_7 = 0x37; + public static final int VK_8 = 0x38; + public static final int VK_9 = 0x39; + + public static final int VK_A = 0x41; + public static final int VK_B = 0x42; + public static final int VK_C = 0x43; + public static final int VK_D = 0x44; + public static final int VK_E = 0x45; + public static final int VK_F = 0x46; + public static final int VK_G = 0x47; + public static final int VK_H = 0x48; + public static final int VK_I = 0x49; + public static final int VK_J = 0x4A; + public static final int VK_K = 0x4B; + public static final int VK_L = 0x4C; + public static final int VK_M = 0x4D; + public static final int VK_N = 0x4E; + public static final int VK_O = 0x4F; + public static final int VK_P = 0x50; + public static final int VK_Q = 0x51; + public static final int VK_R = 0x52; + public static final int VK_S = 0x53; + public static final int VK_T = 0x54; + public static final int VK_U = 0x55; + public static final int VK_V = 0x56; + public static final int VK_W = 0x57; + public static final int VK_X = 0x58; + public static final int VK_Y = 0x59; + public static final int VK_Z = 0x5A; + + public static final int VK_LWIN = 0x5B; + public static final int VK_RWIN = 0x5C; + public static final int VK_APPS = 0x5D; +/* + * 0x5E : reserved; + */ + + public static final int VK_SLEEP = 0x5F; + + public static final int VK_NUMPAD0 = 0x60; + public static final int VK_NUMPAD1 = 0x61; + public static final int VK_NUMPAD2 = 0x62; + public static final int VK_NUMPAD3 = 0x63; + public static final int VK_NUMPAD4 = 0x64; + public static final int VK_NUMPAD5 = 0x65; + public static final int VK_NUMPAD6 = 0x66; + public static final int VK_NUMPAD7 = 0x67; + public static final int VK_NUMPAD8 = 0x68; + public static final int VK_NUMPAD9 = 0x69; + public static final int VK_MULTIPLY = 0x6A; + public static final int VK_ADD = 0x6B; + public static final int VK_SEPARATOR = 0x6C; + public static final int VK_SUBTRACT = 0x6D; + public static final int VK_DECIMAL = 0x6E; + public static final int VK_DIVIDE = 0x6F; + public static final int VK_F1 = 0x70; + public static final int VK_F2 = 0x71; + public static final int VK_F3 = 0x72; + public static final int VK_F4 = 0x73; + public static final int VK_F5 = 0x74; + public static final int VK_F6 = 0x75; + public static final int VK_F7 = 0x76; + public static final int VK_F8 = 0x77; + public static final int VK_F9 = 0x78; + public static final int VK_F10 = 0x79; + public static final int VK_F11 = 0x7A; + public static final int VK_F12 = 0x7B; + public static final int VK_F13 = 0x7C; + public static final int VK_F14 = 0x7D; + public static final int VK_F15 = 0x7E; + public static final int VK_F16 = 0x7F; + public static final int VK_F17 = 0x80; + public static final int VK_F18 = 0x81; + public static final int VK_F19 = 0x82; + public static final int VK_F20 = 0x83; + public static final int VK_F21 = 0x84; + public static final int VK_F22 = 0x85; + public static final int VK_F23 = 0x86; + public static final int VK_F24 = 0x87; + +/* + * 0x88 - 0x8F : unassigned; + */ + + public static final int VK_NUMLOCK = 0x90; + public static final int VK_SCROLL = 0x91; + +/* + * NEC PC-9800 kbd definitions + */ +public static final int VK_OEM_NEC_EQUAL = 0x92; // '=' key on numpad +/* + * Fujitsu/OASYS kbd definitions + */ +public static final int VK_OEM_FJ_JISHO = 0x92; // 'Dictionary' key + public static final int VK_OEM_FJ_MASSHOU = 0x93; // 'Unregister word' key + public static final int VK_OEM_FJ_TOUROKU = 0x94; // 'Register word' key + public static final int VK_OEM_FJ_LOYA = 0x95; // 'Left OYAYUBI' key + public static final int VK_OEM_FJ_ROYA = 0x96; // 'Right OYAYUBI' key + +/* + * 0x97 - 0x9F : unassigned + */ + +/* + * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys. + * Used only as parameters to GetAsyncKeyState() and GetKeyState(). + * No other API or message will distinguish left and right keys in this way. + */ +public static final int VK_LSHIFT = 0xA0; + public static final int VK_RSHIFT = 0xA1; + public static final int VK_LCONTROL = 0xA2; + public static final int VK_RCONTROL = 0xA3; + public static final int VK_LMENU = 0xA4; + public static final int VK_RMENU = 0xA5; + + public static final int VK_BROWSER_BACK = 0xA6; + public static final int VK_BROWSER_FORWARD = 0xA7; + public static final int VK_BROWSER_REFRESH = 0xA8; + public static final int VK_BROWSER_STOP = 0xA9; + public static final int VK_BROWSER_SEARCH = 0xAA; + public static final int VK_BROWSER_FAVORITES = 0xAB; + public static final int VK_BROWSER_HOME = 0xAC; + + public static final int VK_VOLUME_MUTE = 0xAD; + public static final int VK_VOLUME_DOWN = 0xAE; + public static final int VK_VOLUME_UP = 0xAF; + public static final int VK_MEDIA_NEXT_TRACK = 0xB0; + public static final int VK_MEDIA_PREV_TRACK = 0xB1; + public static final int VK_MEDIA_STOP = 0xB2; + public static final int VK_MEDIA_PLAY_PAUSE = 0xB3; + public static final int VK_LAUNCH_MAIL = 0xB4; + public static final int VK_LAUNCH_MEDIA_SELECT = 0xB5; + public static final int VK_LAUNCH_APP1 = 0xB6; + public static final int VK_LAUNCH_APP2 = 0xB7; + +/* + * 0xB8 - 0xB9 : reserved + */ + + public static final int VK_OEM_1 = 0xBA; // ';:' for US + public static final int VK_OEM_PLUS = 0xBB; // '+' any country + public static final int VK_OEM_COMMA = 0xBC; // ',' any country + public static final int VK_OEM_MINUS = 0xBD; // '-' any country + public static final int VK_OEM_PERIOD = 0xBE; // '.' any country + public static final int VK_OEM_2 = 0xBF; // '/?' for US + public static final int VK_OEM_3 = 0xC0; // '`~' for US + +/* + * 0xC1 - 0xD7 : reserved + */ + +/* + * 0xD8 - 0xDA : unassigned + */ + + public static final int VK_OEM_4 = 0xDB; // '[{' for US + public static final int VK_OEM_5 = 0xDC; // '\|' for US + public static final int VK_OEM_6 = 0xDD; // ']}' for US + public static final int VK_OEM_7 = 0xDE; // ''"' for US + public static final int VK_OEM_8 = 0xDF; + +/* + * 0xE0 : reserved + */ + +/* + * Various extended or enhanced keyboards + */ +public static final int VK_OEM_AX = 0xE1; // 'AX' key on Japanese AX kbd + public static final int VK_OEM_102 = 0xE2; // "<>" or "\|" on RT 102-key kbd. + public static final int VK_ICO_HELP = 0xE3; // Help key on ICO + public static final int VK_ICO_00 = 0xE4; // 00 key on ICO + + public static final int VK_PROCESSKEY = 0xE5; + + public static final int VK_ICO_CLEAR = 0xE6; + + + public static final int VK_PACKET = 0xE7; + +/* + * 0xE8 : unassigned + */ + +/* + * Nokia/Ericsson definitions + */ +public static final int VK_OEM_RESET = 0xE9; + public static final int VK_OEM_JUMP = 0xEA; + public static final int VK_OEM_PA1 = 0xEB; + public static final int VK_OEM_PA2 = 0xEC; + public static final int VK_OEM_PA3 = 0xED; + public static final int VK_OEM_WSCTRL = 0xEE; + public static final int VK_OEM_CUSEL = 0xEF; + public static final int VK_OEM_ATTN = 0xF0; + public static final int VK_OEM_FINISH = 0xF1; + public static final int VK_OEM_COPY = 0xF2; + public static final int VK_OEM_AUTO = 0xF3; + public static final int VK_OEM_ENLW = 0xF4; + public static final int VK_OEM_BACKTAB = 0xF5; + + public static final int VK_ATTN = 0xF6; + public static final int VK_CRSEL = 0xF7; + public static final int VK_EXSEL = 0xF8; + public static final int VK_EREOF = 0xF9; + public static final int VK_PLAY = 0xFA; + public static final int VK_ZOOM = 0xFB; + public static final int VK_NONAME = 0xFC; + public static final int VK_PA1 = 0xFD; + public static final int VK_OEM_CLEAR = 0xFE; + + public static int mapVirtualKeyToLWJGLCode(int virt_key) { + switch (virt_key) { + case VK_ESCAPE: + return Keyboard.KEY_ESCAPE; + case VK_1: + return Keyboard.KEY_1; + case VK_2: + return Keyboard.KEY_2; + case VK_3: + return Keyboard.KEY_3; + case VK_4: + return Keyboard.KEY_4; + case VK_5: + return Keyboard.KEY_5; + case VK_6: + return Keyboard.KEY_6; + case VK_7: + return Keyboard.KEY_7; + case VK_8: + return Keyboard.KEY_8; + case VK_9: + return Keyboard.KEY_9; + case VK_0: + return Keyboard.KEY_0; + case VK_OEM_MINUS: + return Keyboard.KEY_MINUS; + case VK_OEM_PLUS: + return Keyboard.KEY_EQUALS; + case VK_BACK: + return Keyboard.KEY_BACK; + case VK_TAB: + return Keyboard.KEY_TAB; + case VK_Q: + return Keyboard.KEY_Q; + case VK_W: + return Keyboard.KEY_W; + case VK_E: + return Keyboard.KEY_E; + case VK_R: + return Keyboard.KEY_R; + case VK_T: + return Keyboard.KEY_T; + case VK_Y: + return Keyboard.KEY_Y; + case VK_U: + return Keyboard.KEY_U; + case VK_I: + return Keyboard.KEY_I; + case VK_O: + return Keyboard.KEY_O; + case VK_P: + return Keyboard.KEY_P; + case VK_OEM_4: + return Keyboard.KEY_LBRACKET; + case VK_OEM_6: + return Keyboard.KEY_RBRACKET; + case VK_RETURN: + return Keyboard.KEY_RETURN; + case VK_LCONTROL: + return Keyboard.KEY_LCONTROL; + case VK_A: + return Keyboard.KEY_A; + case VK_S: + return Keyboard.KEY_S; + case VK_D: + return Keyboard.KEY_D; + case VK_F: + return Keyboard.KEY_F; + case VK_G: + return Keyboard.KEY_G; + case VK_H: + return Keyboard.KEY_H; + case VK_J: + return Keyboard.KEY_J; + case VK_K: + return Keyboard.KEY_K; + case VK_L: + return Keyboard.KEY_L; + case VK_OEM_1: + return Keyboard.KEY_SEMICOLON; + case VK_OEM_7: + return Keyboard.KEY_APOSTROPHE; + case VK_OEM_3: + case VK_OEM_8: + return Keyboard.KEY_GRAVE; + case VK_LSHIFT: + return Keyboard.KEY_LSHIFT; + case VK_OEM_5: + return Keyboard.KEY_BACKSLASH; + case VK_Z: + return Keyboard.KEY_Z; + case VK_X: + return Keyboard.KEY_X; + case VK_C: + return Keyboard.KEY_C; + case VK_V: + return Keyboard.KEY_V; + case VK_B: + return Keyboard.KEY_B; + case VK_N: + return Keyboard.KEY_N; + case VK_M: + return Keyboard.KEY_M; + case VK_OEM_COMMA: + return Keyboard.KEY_COMMA; + case VK_OEM_PERIOD: + return Keyboard.KEY_PERIOD; + case VK_OEM_2: + return Keyboard.KEY_SLASH; + case VK_RSHIFT: + return Keyboard.KEY_RSHIFT; + case VK_MULTIPLY: + return Keyboard.KEY_MULTIPLY; + case VK_LMENU: + return Keyboard.KEY_LMENU; + case VK_SPACE: + return Keyboard.KEY_SPACE; + case VK_CAPITAL: + return Keyboard.KEY_CAPITAL; + case VK_F1: + return Keyboard.KEY_F1; + case VK_F2: + return Keyboard.KEY_F2; + case VK_F3: + return Keyboard.KEY_F3; + case VK_F4: + return Keyboard.KEY_F4; + case VK_F5: + return Keyboard.KEY_F5; + case VK_F6: + return Keyboard.KEY_F6; + case VK_F7: + return Keyboard.KEY_F7; + case VK_F8: + return Keyboard.KEY_F8; + case VK_F9: + return Keyboard.KEY_F9; + case VK_F10: + return Keyboard.KEY_F10; + case VK_NUMLOCK: + return Keyboard.KEY_NUMLOCK; + case VK_SCROLL: + return Keyboard.KEY_SCROLL; + case VK_NUMPAD7: + return Keyboard.KEY_NUMPAD7; + case VK_NUMPAD8: + return Keyboard.KEY_NUMPAD8; + case VK_NUMPAD9: + return Keyboard.KEY_NUMPAD9; + case VK_SUBTRACT: + return Keyboard.KEY_SUBTRACT; + case VK_NUMPAD4: + return Keyboard.KEY_NUMPAD4; + case VK_NUMPAD5: + return Keyboard.KEY_NUMPAD5; + case VK_NUMPAD6: + return Keyboard.KEY_NUMPAD6; + case VK_ADD: + return Keyboard.KEY_ADD; + case VK_NUMPAD1: + return Keyboard.KEY_NUMPAD1; + case VK_NUMPAD2: + return Keyboard.KEY_NUMPAD2; + case VK_NUMPAD3: + return Keyboard.KEY_NUMPAD3; + case VK_NUMPAD0: + return Keyboard.KEY_NUMPAD0; + case VK_DECIMAL: + return Keyboard.KEY_DECIMAL; + case VK_F11: + return Keyboard.KEY_F11; + case VK_F12: + return Keyboard.KEY_F12; + case VK_F13: + return Keyboard.KEY_F13; + case VK_F14: + return Keyboard.KEY_F14; + case VK_F15: + return Keyboard.KEY_F15; + case VK_KANA: + return Keyboard.KEY_KANA; + case VK_CONVERT: + return Keyboard.KEY_CONVERT; + case VK_NONCONVERT: + return Keyboard.KEY_NOCONVERT; +/* case VK_YEN: + return Keyboard.KEY_YEN; + case VK_NUMPADEQUALS: + return Keyboard.KEY_NUMPADEQUALS; + case VK_CIRCUMFLEX: + return Keyboard.KEY_CIRCUMFLEX; + case VK_AT: + return Keyboard.KEY_AT; + case VK_COLON: + return Keyboard.KEY_COLON; + case VK_UNDERLINE: + return Keyboard.KEY_UNDERLINE;*/ + case VK_KANJI: + return Keyboard.KEY_KANJI; +/* case VK_STOP: + return Keyboard.KEY_STOP; + case VK_AX: + return Keyboard.KEY_AX; + case VK_UNLABELED: + return Keyboard.KEY_UNLABELED; + case VK_NUMPADENTER: + return Keyboard.KEY_NUMPADENTER;*/ + case VK_RCONTROL: + return Keyboard.KEY_RCONTROL; + case VK_SEPARATOR: + return Keyboard.KEY_NUMPADCOMMA; + case VK_DIVIDE: + return Keyboard.KEY_DIVIDE; + case VK_SNAPSHOT: + return Keyboard.KEY_SYSRQ; + case VK_RMENU: + return Keyboard.KEY_RMENU; + case VK_PAUSE: + return Keyboard.KEY_PAUSE; + case VK_HOME: + return Keyboard.KEY_HOME; + case VK_UP: + return Keyboard.KEY_UP; + case VK_PRIOR: + return Keyboard.KEY_PRIOR; + case VK_LEFT: + return Keyboard.KEY_LEFT; + case VK_RIGHT: + return Keyboard.KEY_RIGHT; + case VK_END: + return Keyboard.KEY_END; + case VK_DOWN: + return Keyboard.KEY_DOWN; + case VK_NEXT: + return Keyboard.KEY_NEXT; + case VK_INSERT: + return Keyboard.KEY_INSERT; + case VK_DELETE: + return Keyboard.KEY_DELETE; + case VK_LWIN: + return Keyboard.KEY_LMETA; + case VK_RWIN: + return Keyboard.KEY_RMETA; + case VK_APPS: + return Keyboard.KEY_APPS; +/* case VK_POWER: + return Keyboard.KEY_POWER;*/ + case VK_SLEEP: + return Keyboard.KEY_SLEEP; + default: + return Keyboard.KEY_NONE; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsMouse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsMouse.java new file mode 100644 index 0000000..e98e4cf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsMouse.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is the Windows implementation of the Mouse. + * @author elias_naur + */ + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.input.Mouse; + +final class WindowsMouse { + private final long hwnd; + + private final int mouse_button_count; + private final boolean has_wheel; + + private final EventQueue event_queue = new EventQueue(Mouse.EVENT_SIZE); + + private final ByteBuffer mouse_event = ByteBuffer.allocate(Mouse.EVENT_SIZE); + private final Object blank_cursor; + + private boolean mouse_grabbed; + private byte[] button_states; + private int accum_dx; + private int accum_dy; + private int accum_dwheel; + private int last_x; + private int last_y; + + WindowsMouse(long hwnd) throws LWJGLException { + this.hwnd = hwnd; + this.mouse_button_count = Math.min(5, WindowsDisplay.getSystemMetrics(WindowsDisplay.SM_CMOUSEBUTTONS)); + this.has_wheel = WindowsDisplay.getSystemMetrics(WindowsDisplay.SM_MOUSEWHEELPRESENT) != 0; + this.blank_cursor = createBlankCursor(); + this.button_states = new byte[mouse_button_count]; + } + + private Object createBlankCursor() throws LWJGLException { + int width = WindowsDisplay.getSystemMetrics(WindowsDisplay.SM_CXCURSOR); + int height = WindowsDisplay.getSystemMetrics(WindowsDisplay.SM_CYCURSOR); + IntBuffer pixels = BufferUtils.createIntBuffer(width*height); + return WindowsDisplay.doCreateCursor(width, height, 0, 0, 1, pixels, null); + } + + public boolean isGrabbed() { + return mouse_grabbed; + } + + public boolean hasWheel() { + return has_wheel; + } + + public int getButtonCount() { + return mouse_button_count; + } + + public void poll(IntBuffer coord_buffer, ByteBuffer buttons) { + for (int i = 0; i < coord_buffer.remaining(); i++) + coord_buffer.put(coord_buffer.position() + i, 0); + int num_buttons = mouse_button_count; + coord_buffer.put(coord_buffer.position() + 2, accum_dwheel); + if (num_buttons > button_states.length) + num_buttons = button_states.length; + for (int j = 0; j < num_buttons; j++) { + buttons.put(buttons.position() + j, button_states[j]); + } + if (isGrabbed()) { + coord_buffer.put(coord_buffer.position() + 0, accum_dx); + coord_buffer.put(coord_buffer.position() + 1, accum_dy); + } else { + coord_buffer.put(coord_buffer.position() + 0, last_x); + coord_buffer.put(coord_buffer.position() + 1, last_y); + } + accum_dx = accum_dy = accum_dwheel = 0; + } + + private void putMouseEventWithCoords(byte button, byte state, int coord1, int coord2, int dz, long nanos) { + mouse_event.clear(); + mouse_event.put(button).put(state).putInt(coord1).putInt(coord2).putInt(dz).putLong(nanos); + mouse_event.flip(); + event_queue.putEvent(mouse_event); + } + + private void putMouseEvent(byte button, byte state, int dz, long nanos) { + if (mouse_grabbed) + putMouseEventWithCoords(button, state, 0, 0, dz, nanos); + else + putMouseEventWithCoords(button, state, last_x, last_y, dz, nanos); + } + + public void read(ByteBuffer buffer) { + event_queue.copyEvents(buffer); + } + + public Object getBlankCursor() { + return blank_cursor; + } + + public void grab(boolean grab, boolean should_center) { + if (grab) { + if (!mouse_grabbed) { + mouse_grabbed = true; + if (should_center) { + try { + WindowsDisplay.setupCursorClipping(hwnd); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to setup cursor clipping: " + e); + } + centerCursor(); + } + } + } else { + if (mouse_grabbed) { + mouse_grabbed = false; + WindowsDisplay.resetCursorClipping(); + } + } + event_queue.clearEvents(); + } + + public void handleMouseScrolled(int event_dwheel, long millis) { + accum_dwheel += event_dwheel; + putMouseEvent((byte)-1, (byte)0, event_dwheel, millis*1000000); + } + + private void centerCursor() { + WindowsDisplay.centerCursor(hwnd); + } + + public void setPosition(int x, int y) { + this.last_x = x; + this.last_y = y; + } + + public void destroy() { + WindowsDisplay.doDestroyCursor(blank_cursor); + } + + public void handleMouseMoved(int x, int y, long millis, boolean should_center) { + int dx = x - last_x; + int dy = y - last_y; + if (dx != 0 || dy != 0) { + accum_dx += dx; + accum_dy += dy; + last_x = x; + last_y = y; + long nanos = millis*1000000; + if (mouse_grabbed) { + putMouseEventWithCoords((byte)-1, (byte)0, dx, dy, 0, nanos); + if (should_center) + centerCursor(); + } else { + putMouseEventWithCoords((byte)-1, (byte)0, x, y, 0, nanos); + } + } + } + + public void handleMouseButton(byte button, byte state, long millis) { + putMouseEvent(button, state, 0, millis*1000000); + if (button < button_states.length) + button_states[button] = state != 0 ? (byte)1 : (byte)0; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPbufferPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPbufferPeerInfo.java new file mode 100644 index 0000000..7bf010e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPbufferPeerInfo.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +final class WindowsPbufferPeerInfo extends WindowsPeerInfo { + WindowsPbufferPeerInfo(int width, int height, PixelFormat pixel_format, IntBuffer pixelFormatCaps, IntBuffer pBufferAttribs) throws LWJGLException { + nCreate(getHandle(), width, height, pixel_format, pixelFormatCaps, pBufferAttribs); + } + private static native void nCreate(ByteBuffer handle, int width, int height, PixelFormat pixel_format, IntBuffer pixelFormatCaps, IntBuffer pBufferAttribs) throws LWJGLException; + + public boolean isBufferLost() { + return nIsBufferLost(getHandle()); + } + private static native boolean nIsBufferLost(ByteBuffer handle); + + public void setPbufferAttrib(int attrib, int value) { + nSetPbufferAttrib(getHandle(), attrib, value); + } + private static native void nSetPbufferAttrib(ByteBuffer handle, int attrib, int value); + + public void bindTexImageToPbuffer(int buffer) { + nBindTexImageToPbuffer(getHandle(), buffer); + } + private static native void nBindTexImageToPbuffer(ByteBuffer handle, int buffer); + + public void releaseTexImageFromPbuffer(int buffer) { + nReleaseTexImageFromPbuffer(getHandle(), buffer); + } + private static native void nReleaseTexImageFromPbuffer(ByteBuffer handle, int buffer); + + public void destroy() { + nDestroy(getHandle()); + } + private static native void nDestroy(ByteBuffer handle); + + protected void doLockAndInitHandle() throws LWJGLException { + // NO-OP + } + + protected void doUnlock() throws LWJGLException { + // NO-OP + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPeerInfo.java new file mode 100644 index 0000000..6ad2937 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsPeerInfo.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.LWJGLException; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +abstract class WindowsPeerInfo extends PeerInfo { + protected WindowsPeerInfo() { + super(createHandle()); + } + private static native ByteBuffer createHandle(); + + protected static int choosePixelFormat(long hdc, int origin_x, int origin_y, PixelFormat pixel_format, IntBuffer pixel_format_caps, boolean use_hdc_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException { + return nChoosePixelFormat(hdc, origin_x, origin_y, pixel_format, pixel_format_caps, use_hdc_bpp, support_window, support_pbuffer, double_buffered); + } + private static native int nChoosePixelFormat(long hdc, int origin_x, int origin_y, PixelFormat pixel_format, IntBuffer pixel_format_caps, boolean use_hdc_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException; + protected static native void setPixelFormat(long hdc, int pixel_format) throws LWJGLException; + + public final long getHdc() { + return nGetHdc(getHandle()); + } + private static native long nGetHdc(ByteBuffer handle); + + public final long getHwnd() { + return nGetHwnd(getHandle()); + } + private static native long nGetHwnd(ByteBuffer handle); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsRegistry.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsRegistry.java new file mode 100644 index 0000000..b85b59c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/WindowsRegistry.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * This is an interface to the windows registry + * @author elias_naur + */ + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; + +final class WindowsRegistry { + static final int HKEY_CLASSES_ROOT = 1; + static final int HKEY_CURRENT_USER = 2; + static final int HKEY_LOCAL_MACHINE = 3; + static final int HKEY_USERS = 4; + + static { + Sys.initialize(); + } + + /** + * Query the registry value specified by the root key, subkey, value tuple + */ + static String queryRegistrationKey(int root_key, String subkey, String value) throws LWJGLException { + switch (root_key) { + case HKEY_CLASSES_ROOT: + case HKEY_CURRENT_USER: + case HKEY_LOCAL_MACHINE: + case HKEY_USERS: + break; + default: + throw new IllegalArgumentException("Invalid enum: " + root_key); + } + return nQueryRegistrationKey(root_key, subkey, value); + } + + private static native String nQueryRegistrationKey(int root_key, String subkey, String value) throws LWJGLException; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/XRandR.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/XRandR.java new file mode 100644 index 0000000..0ac1c7a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengl/XRandR.java @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project 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. * Neither the name of 'LWJGL' nor the names + * of its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +package org.lwjgl.opengl; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.lwjgl.LWJGLUtil; + +/** + * Utility for working with the xrandr commmand-line utility. Assumes + * xrandr v1.2 or higher. + * + * @author ryanm + */ +public class XRandR +{ + private static Screen[] current; + + private static Map<String, Screen[]> screens; + + private static void populate() + { + if( screens == null ) + { + screens = new HashMap<String, Screen[]>(); + + // ProcessBuilder pb = new ProcessBuilder( "xrandr", "-q" ); + // pb.redirectErrorStream(); + try + { + // Process p= pb.start(); + Process p = Runtime.getRuntime().exec( new String[] { "xrandr", "-q" } ); + + List<Screen> currentList = new ArrayList<Screen>(); + List<Screen> possibles = new ArrayList<Screen>(); + String name = null; + + BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream() ) ); + String line; + while( ( line = br.readLine() ) != null ) + { + line = line.trim(); + String[] sa = line.split( "\\s+" ); + + if( "connected".equals(sa[1]) ) + { + // found a new screen block + if( name != null ) + { + screens.put( name, possibles.toArray( new Screen[ possibles.size() ] ) ); + possibles.clear(); + } + name = sa[ 0 ]; + + // record the current config + parseScreen( currentList, name, "primary".equals(sa[ 2 ]) ? sa[ 3 ] : sa[ 2 ] ); + } + else if( Pattern.matches( "\\d*x\\d*", sa[ 0 ] ) ) + { + // found a new mode line + parseScreen( possibles, name, sa[ 0 ] ); + } + } + + screens.put( name, possibles.toArray( new Screen[ possibles.size() ] ) ); + + current = currentList.toArray(new Screen[currentList.size()]); + } + catch( Throwable e ) + { + LWJGLUtil.log( "Exception in XRandR.populate(): " + e.getMessage() ); + screens.clear(); + current = new Screen[ 0 ]; + } + } + } + + /** + * @return The current screen configuration, or an empty array if + * xrandr is not supported + */ + public static Screen[] getConfiguration() + { + populate(); + + return current.clone(); + } + + /** + * @param screens + * The desired screen set, may not be <code>null</code> + * @throws IllegalArgumentException + * if no screens are specified + */ + public static void setConfiguration(Screen... screens) + { + if( screens.length == 0 ) + throw new IllegalArgumentException( "Must specify at least one screen" ); + + List<String> cmd = new ArrayList<String>(); + cmd.add( "xrandr" ); + + // switch off those in the current set not in the new set + for ( Screen screen : current ) { + boolean found = false; + for ( Screen screen1 : screens ) { + if ( screen1.name.equals(screen.name) ) { + found = true; + break; + } + } + + if ( !found ) { + cmd.add("--output"); + cmd.add(screen.name); + cmd.add("--off"); + } + } + + // set up new set + for ( Screen screen : screens ) + screen.getArgs(cmd); + + try + { + // ProcessBuilder pb = new ProcessBuilder( cmd ); + // pb.redirectErrorStream(); + // Process p = pb.start(); + Process p = + Runtime.getRuntime().exec( cmd.toArray( new String[ cmd.size() ] ) ); + // no output is expected, but check anyway + BufferedReader br = new BufferedReader( new InputStreamReader( p.getInputStream() ) ); + String line; + while( ( line = br.readLine() ) != null ) + { + LWJGLUtil.log( "Unexpected output from xrandr process: " + line ); + } + current = screens; + } + catch( IOException e ) + { + LWJGLUtil.log( "XRandR exception in setConfiguration(): " + e.getMessage() ); + } + } + + /** + * @return the name of connected screens, or an empty array if + * xrandr is not supported + */ + public static String[] getScreenNames() + { + populate(); + return screens.keySet().toArray( new String[ screens.size() ] ); + } + + /** + * @param name + * @return the possible resolutions of the named screen, or + * <code>null</code> if there is no such screen + */ + public static Screen[] getResolutions( String name ) + { + populate(); + // clone the array to prevent held copies being altered + return screens.get(name).clone(); + } + + private static final Pattern SCREEN_PATTERN1 = + Pattern.compile( "^(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)$" ); + + private static final Pattern SCREEN_PATTERN2 = Pattern.compile( "^(\\d+)x(\\d+)$" ); + + /** + * Parses a screen configuration and adds it to the list if it's + * valid. + * + * @param list + * the list to add the Screen to if it's valid + * @param name + * the name of this screen + * @param what + * config string, format either widthxheight or + * widthxheight+xPos+yPos + */ + private static void parseScreen( List<Screen> list, String name, String what ) + { + Matcher m = SCREEN_PATTERN1.matcher( what ); + if( !m.matches() ) + { + m = SCREEN_PATTERN2.matcher( what ); + if( !m.matches() ) + { + LWJGLUtil.log( "Did not match: " + what ); + return; + } + } + int width = Integer.parseInt( m.group( 1 ) ); + int height = Integer.parseInt( m.group( 2 ) ); + int xpos, ypos; + if( m.groupCount() > 3 ) + { + xpos = Integer.parseInt( m.group( 3 ) ); + ypos = Integer.parseInt( m.group( 4 ) ); + } + else + { + xpos = 0; + ypos = 0; + } + list.add( new Screen( name, width, height, xpos, ypos ) ); + } + + /** + * Encapsulates the configuration of a monitor. Resolution is + * fixed, position is mutable + * + * @author ryanm + */ + public static class Screen implements Cloneable + { + /** + * Name for this output + */ + public final String name; + + /** + * Width in pixels + */ + public final int width; + + /** + * Height in pixels + */ + public final int height; + + /** + * Position on the x-axis, in pixels + */ + public int xPos; + + /** + * Position on the y-axis, in pixels + */ + public int yPos; + + private Screen( String name, int width, int height, int xPos, int yPos ) + { + this.name = name; + this.width = width; + this.height = height; + this.xPos = xPos; + this.yPos = yPos; + } + + private void getArgs( List<String> argList ) + { + argList.add( "--output" ); + argList.add( name ); + argList.add( "--mode" ); + argList.add( width + "x" + height ); + argList.add( "--pos" ); + argList.add( xPos + "x" + yPos ); + } + + //@Override + public String toString() + { + return name + " " + width + "x" + height + " @ " + xPos + "x" + yPos; + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/APIUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/APIUtil.java new file mode 100644 index 0000000..7ffdf52 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/APIUtil.java @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +/** + * Utility class for OpenGL ES API calls. + * + * @author spasi + */ +final class APIUtil { + + private static final int INITIAL_BUFFER_SIZE = 256; + private static final int INITIAL_LENGTHS_SIZE = 4; + + private static final int BUFFERS_SIZE = 32; + + private static final ThreadLocal<char[]> arrayTL = new ThreadLocal<char[]>() { + protected char[] initialValue() { return new char[INITIAL_BUFFER_SIZE]; } + }; + + private static final ThreadLocal<ByteBuffer> bufferTL = new ThreadLocal<ByteBuffer>() { + protected ByteBuffer initialValue() { return BufferUtils.createByteBuffer(INITIAL_BUFFER_SIZE); } + }; + + private static final ThreadLocal<PointerBuffer> bufferPointerTL = new ThreadLocal<PointerBuffer>() { + protected PointerBuffer initialValue() { return BufferUtils.createPointerBuffer(INITIAL_BUFFER_SIZE); } + }; + + private static final ThreadLocal<IntBuffer> lengthsTL = new ThreadLocal<IntBuffer>() { + protected IntBuffer initialValue() { return BufferUtils.createIntBuffer(INITIAL_LENGTHS_SIZE); } + }; + + private static final ThreadLocal<Buffers> buffersTL = new ThreadLocal<Buffers>() { + protected Buffers initialValue() { return new Buffers(); } + }; + + private APIUtil() { + } + + private static char[] getArray(final int size) { + char[] array = arrayTL.get(); + + if ( array.length < size ) { + int sizeNew = array.length << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + array = new char[size]; + arrayTL.set(array); + } + + return array; + } + + static ByteBuffer getBufferByte(final int size) { + ByteBuffer buffer = bufferTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + buffer = BufferUtils.createByteBuffer(size); + bufferTL.set(buffer); + } else + buffer.clear(); + + return buffer; + } + + private static ByteBuffer getBufferByteOffset(final int size) { + ByteBuffer buffer = bufferTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + final ByteBuffer bufferNew = BufferUtils.createByteBuffer(size); + bufferNew.put(buffer); + bufferTL.set(buffer = bufferNew); + } else { + buffer.position(buffer.limit()); + buffer.limit(buffer.capacity()); + } + + return buffer; + } + + static PointerBuffer getBufferPointer(final int size) { + PointerBuffer buffer = bufferPointerTL.get(); + + if ( buffer.capacity() < size ) { + int sizeNew = buffer.capacity() << 1; + while ( sizeNew < size ) + sizeNew <<= 1; + + buffer = BufferUtils.createPointerBuffer(size); + bufferPointerTL.set(buffer); + } else + buffer.clear(); + + return buffer; + } + + static IntBuffer getBufferInt() { return buffersTL.get().ints; } + + static LongBuffer getBufferLong() { return buffersTL.get().longs; } + + static FloatBuffer getBufferFloat() { return buffersTL.get().floats; } + + static IntBuffer getLengths() { + return getLengths(1); + } + + static IntBuffer getLengths(final int size) { + IntBuffer lengths = lengthsTL.get(); + + if ( lengths.capacity() < size ) { + int sizeNew = lengths.capacity(); + while ( sizeNew < size ) + sizeNew <<= 1; + + lengths = BufferUtils.createIntBuffer(size); + lengthsTL.set(lengths); + } else + lengths.clear(); + + return lengths; + } + + /** + * Simple ASCII encoding. + * + * @param buffer The target buffer + * @param string The source string + */ + private static ByteBuffer encode(final ByteBuffer buffer, final CharSequence string) { + for ( int i = 0; i < string.length(); i++ ) { + final char c = string.charAt(i); + if ( LWJGLUtil.DEBUG && 0x80 <= c ) // Silently ignore and map to 0x1A. + buffer.put((byte)0x1A); + else + buffer.put((byte)c); + } + + return buffer; + } + + /** + * Reads a byte string from the specified buffer. + * + * @param buffer + * + * @return the buffer as a String. + */ + static String getString(final ByteBuffer buffer) { + final int length = buffer.remaining(); + final char[] charArray = getArray(length); + + for ( int i = buffer.position(); i < buffer.limit(); i++ ) + charArray[i - buffer.position()] = (char)buffer.get(i); + + return new String(charArray, 0, length); + } + + /** + * Returns a buffer containing the specified string as bytes. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, starting at the specified offset. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBuffer(final CharSequence string, final int offset) { + final ByteBuffer buffer = encode(getBufferByteOffset(offset + string.length()), string); + buffer.flip(); + return MemoryUtil.getAddress(buffer); + } + + /** + * Returns a buffer containing the specified string as bytes, including null-termination. + * + * @param string + * + * @return the String as a ByteBuffer + */ + static long getBufferNT(final CharSequence string) { + final ByteBuffer buffer = encode(getBufferByte(string.length() + 1), string); + buffer.put((byte)0); + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + static int getTotalLength(final CharSequence[] strings) { + int length = 0; + for ( CharSequence string : strings ) + length += string.length(); + + return length; + } + + /** + * Returns a buffer containing the specified strings as bytes. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBuffer(final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(getTotalLength(strings)); + + for ( CharSequence string : strings ) + encode(buffer, string); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the specified strings as bytes, including null-termination. + * + * @param strings + * + * @return the Strings as a ByteBuffer + */ + static long getBufferNT(final CharSequence[] strings) { + final ByteBuffer buffer = getBufferByte(getTotalLength(strings) + strings.length); + + for ( CharSequence string : strings ) { + encode(buffer, string); + buffer.put((byte)0); + } + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + /** + * Returns a buffer containing the lengths of the specified strings. + * + * @param strings + * + * @return the String lengths in an IntBuffer + */ + static long getLengths(final CharSequence[] strings) { + IntBuffer buffer = getLengths(strings.length); + + for ( CharSequence string : strings ) + buffer.put(string.length()); + + buffer.flip(); + return MemoryUtil.getAddress0(buffer); + } + + static long getInt(final int value) { + return MemoryUtil.getAddress(getBufferInt().put(0, value), 0); + } + + static long getBufferByte0() { + return MemoryUtil.getAddress0(getBufferByte(0)); + } + + private static class Buffers { + + final IntBuffer ints; + final LongBuffer longs; + final FloatBuffer floats; + + Buffers() { + ints = BufferUtils.createIntBuffer(BUFFERS_SIZE); + longs = BufferUtils.createLongBuffer(BUFFERS_SIZE); + floats = BufferUtils.createFloatBuffer(BUFFERS_SIZE); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/CallbackUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/CallbackUtil.java new file mode 100644 index 0000000..f6e182b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/CallbackUtil.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class that handles OpenGL API callbacks. + * + * @author Spasi + */ +final class CallbackUtil { + + /** Context -> Long */ + private static final Map<ContextCapabilities, Long> contextUserParamsKHR = new HashMap<ContextCapabilities, Long>(); + + private CallbackUtil() {} + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address or 0 if the Object is null. + */ + static long createGlobalRef(final Object obj) { + return obj == null ? 0 : ncreateGlobalRef(obj); + } + + /** + * Creates a new global reference to the specified Object. + * + * @param obj the Object + * + * @return the GlobalRef memory address. + */ + private static native long ncreateGlobalRef(Object obj); + + /** + * Deletes a global reference. + * + * @param ref the GlobalRef memory address. + */ + private static native void deleteGlobalRef(long ref); + + // --------- [ XXX_debug_output ] --------- + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + private static void registerContextCallback(final long userParam, final Map<ContextCapabilities, Long> contextUserData) { + ContextCapabilities caps = GLContext.getCapabilities(); + if ( caps == null ) { + deleteGlobalRef(userParam); + throw new IllegalStateException("No context is current."); + } + + final Long userParam_old = contextUserData.remove(caps); + if ( userParam_old != null ) + deleteGlobalRef(userParam_old); + + if ( userParam != 0 ) + contextUserData.put(caps, userParam); + } + + /** + * Releases references to any callbacks associated with the specified GL context. + * + * @param context the Context to unregister + */ + static void unregisterCallbacks(final Object context) { + // TODO: This is never called for custom contexts. Need to fix for LWJGL 3.0 + final ContextCapabilities caps = GLContext.getCapabilities(); + + Long userParam = contextUserParamsKHR.remove(caps); + if ( userParam != null ) + deleteGlobalRef(userParam); + } + + // --------- [ KHR_debug ] --------- + + /** + * Returns the memory address of the native function we pass to glDebugMessageCallback. + * + * @return the callback function address + */ + static native long getDebugCallbackKHR(); + + /** + * Associates the current OpenGL context with the specified global reference. If there + * is no context current, the global reference is deleted and an exception is thrown. + * Any previous callback registrations will be cleared. + * + * @param userParam the global reference pointer + */ + static void registerContextCallbackKHR(final long userParam) { + registerContextCallback(userParam, contextUserParamsKHR); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/ContextAttribs.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/ContextAttribs.java new file mode 100644 index 0000000..5724cc0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/ContextAttribs.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.BufferUtils; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** + * This class represents the context attributes passed to EGL's eglCreateContext. + * The only attribute allowed is EGL_CONTEXT_CLIENT_VERSION and it must be 2 or 3 (LWJGL does not support GLES 1.x). + */ +public final class ContextAttribs { + + private int version; + + public ContextAttribs() { + this(2); + } + + public ContextAttribs(final int version) { + if ( 3 < version ) + throw new IllegalArgumentException("Invalid OpenGL ES version specified: " + version); + + this.version = version; + } + + private ContextAttribs(final ContextAttribs attribs) { + this.version = attribs.version; + } + + public int getVersion() { + return version; + } + + public IntBuffer getAttribList() { + int attribCount = 1; + + final IntBuffer attribs = BufferUtils.createIntBuffer((attribCount * 2) + 1); + + attribs.put(EGL_CONTEXT_CLIENT_VERSION).put(version); + + attribs.put(EGL_NONE); + attribs.rewind(); + return attribs; + } + + public String toString() { + StringBuilder sb = new StringBuilder(32); + + sb.append("ContextAttribs:"); + sb.append(" Version=").append(version); + + return sb.toString(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGL.java new file mode 100644 index 0000000..87ff08f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGL.java @@ -0,0 +1,922 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.BufferChecks; +import org.lwjgl.LWJGLException; +import org.lwjgl.MemoryUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.IntBuffer; + +/** EGL wrapper class. */ +public final class EGL { + + /** EGL aliases */ + public static final int + EGL_FALSE = 0, + EGL_TRUE = 1; + + /** Out-of-band handle values */ + public static final int + EGL_DEFAULT_DISPLAY = 0, + EGL_NO_CONTEXT = 0, + EGL_NO_DISPLAY = 0, + EGL_NO_SURFACE = 0; + + /** Out-of-band attribute value */ + public static final int EGL_DONT_CARE = -1; + + /** Errors / GetError return values */ + public static final int + EGL_SUCCESS = 0x3000, + EGL_NOT_INITIALIZED = 0x3001, + EGL_BAD_ACCESS = 0x3002, + EGL_BAD_ALLOC = 0x3003, + EGL_BAD_ATTRIBUTE = 0x3004, + EGL_BAD_CONFIG = 0x3005, + EGL_BAD_CONTEXT = 0x3006, + EGL_BAD_CURRENT_SURFACE = 0x3007, + EGL_BAD_DISPLAY = 0x3008, + EGL_BAD_MATCH = 0x3009, + EGL_BAD_NATIVE_PIXMAP = 0x300A, + EGL_BAD_NATIVE_WINDOW = 0x300B, + EGL_BAD_PARAMETER = 0x300C, + EGL_BAD_SURFACE = 0x300D, + EGL_CONTEXT_LOST = 0x300E; // EGL 1.1 - IMG_power_management + + /** Reserved =0x300F;-=0x301F; for additional errors */ + + /** Config attributes */ + public static final int + EGL_BUFFER_SIZE = 0x3020, + EGL_ALPHA_SIZE = 0x3021, + EGL_BLUE_SIZE = 0x3022, + EGL_GREEN_SIZE = 0x3023, + EGL_RED_SIZE = 0x3024, + EGL_DEPTH_SIZE = 0x3025, + EGL_STENCIL_SIZE = 0x3026, + EGL_CONFIG_CAVEAT = 0x3027, + EGL_CONFIG_ID = 0x3028, + EGL_LEVEL = 0x3029, + EGL_MAX_PBUFFER_HEIGHT = 0x302A, + EGL_MAX_PBUFFER_PIXELS = 0x302B, + EGL_MAX_PBUFFER_WIDTH = 0x302C, + EGL_NATIVE_RENDERABLE = 0x302D, + EGL_NATIVE_VISUAL_ID = 0x302E, + EGL_NATIVE_VISUAL_TYPE = 0x302F, + EGL_SAMPLES = 0x3031, + EGL_SAMPLE_BUFFERS = 0x3032, + EGL_SURFACE_TYPE = 0x3033, + EGL_TRANSPARENT_TYPE = 0x3034, + EGL_TRANSPARENT_BLUE_VALUE = 0x3035, + EGL_TRANSPARENT_GREEN_VALUE = 0x3036, + EGL_TRANSPARENT_RED_VALUE = 0x3037, + EGL_NONE = 0x3038, // Attrib list terminator + EGL_BIND_TO_TEXTURE_RGB = 0x3039, + EGL_BIND_TO_TEXTURE_RGBA = 0x303A, + EGL_MIN_SWAP_INTERVAL = 0x303B, + EGL_MAX_SWAP_INTERVAL = 0x303C, + EGL_LUMINANCE_SIZE = 0x303D, + EGL_ALPHA_MASK_SIZE = 0x303E, + EGL_COLOR_BUFFER_TYPE = 0x303F, + EGL_RENDERABLE_TYPE = 0x3040, + EGL_MATCH_NATIVE_PIXMAP = 0x3041, // Pseudo-attribute (not queryable) + EGL_CONFORMANT = 0x3042; + + /** Reserved =0x3041;-=0x304F; for additional config attributes */ + + /** Config attribute values */ + public static final int + EGL_SLOW_CONFIG = 0x3050, // EGL_CONFIG_CAVEAT value + EGL_NON_CONFORMANT_CONFIG = 0x3051, // EGL_CONFIG_CAVEAT value + EGL_TRANSPARENT_RGB = 0x3052, // EGL_TRANSPARENT_TYPE value + EGL_RGB_BUFFER = 0x308E, // EGL_COLOR_BUFFER_TYPE value + EGL_LUMINANCE_BUFFER = 0x308F; // EGL_COLOR_BUFFER_TYPE value + + /** More config attribute values, for EGL_TEXTURE_FORMAT */ + public static final int + EGL_NO_TEXTURE = 0x305C, + EGL_TEXTURE_RGB = 0x305D, + EGL_TEXTURE_RGBA = 0x305E, + EGL_TEXTURE_2D = 0x305F; + + /** EGL_SURFACE_TYPE mask bits */ + public static final int + EGL_PBUFFER_BIT = 0x0001, + EGL_PIXMAP_BIT = 0x0002, + EGL_WINDOW_BIT = 0x0004, + EGL_VG_COLORSPACE_LINEAR_BIT = 0x0020, + EGL_VG_ALPHA_FORMAT_PRE_BIT = 0x0040, + EGL_MULTISAMPLE_RESOLVE_BOX_BIT = 0x0200, + EGL_SWAP_BEHAVIOR_PRESERVED_BIT = 0x0400; + + /** EGL_RENDERABLE_TYPE mask bits */ + public static final int + EGL_OPENGL_ES_BIT = 0x0001, + EGL_OPENVG_BIT = 0x0002, + EGL_OPENGL_ES2_BIT = 0x0004, + EGL_OPENGL_BIT = 0x0008; + + /** QueryString targets */ + public static final int + EGL_VENDOR = 0x3053, + EGL_VERSION = 0x3054, + EGL_EXTENSIONS = 0x3055, + EGL_CLIENT_APIS = 0x308D; + + /** QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */ + public static final int + EGL_HEIGHT = 0x3056, + EGL_WIDTH = 0x3057, + EGL_LARGEST_PBUFFER = 0x3058, + EGL_TEXTURE_FORMAT = 0x3080, + EGL_TEXTURE_TARGET = 0x3081, + EGL_MIPMAP_TEXTURE = 0x3082, + EGL_MIPMAP_LEVEL = 0x3083, + EGL_RENDER_BUFFER = 0x3086, + EGL_VG_COLORSPACE = 0x3087, + EGL_VG_ALPHA_FORMAT = 0x3088, + EGL_HORIZONTAL_RESOLUTION = 0x3090, + EGL_VERTICAL_RESOLUTION = 0x3091, + EGL_PIXEL_ASPECT_RATIO = 0x3092, + EGL_SWAP_BEHAVIOR = 0x3093, + EGL_MULTISAMPLE_RESOLVE = 0x3099; + + /** EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */ + public static final int + EGL_BACK_BUFFER = 0x3084, + EGL_SINGLE_BUFFER = 0x3085; + + /** OpenVG color spaces */ + public static final int + EGL_VG_COLORSPACE_sRGB = 0x3089, // EGL_VG_COLORSPACE value + EGL_VG_COLORSPACE_LINEAR = 0x308A; // EGL_VG_COLORSPACE value + + /** OpenVG alpha formats */ + public static final int + EGL_VG_ALPHA_FORMAT_NONPRE = 0x308B, // EGL_ALPHA_FORMAT value + EGL_VG_ALPHA_FORMAT_PRE = 0x308C; // EGL_ALPHA_FORMAT + + /** + * Constant scale factor by which fractional display resolutions & + * aspect ratio are scaled when queried as integer values. + */ + public static final int EGL_DISPLAY_SCALING = 10000; + + /** Unknown display resolution/aspect ratio */ + public static final int EGL_UNKNOWN = -1; + + /** Back buffer swap behaviors */ + public static final int + EGL_BUFFER_PRESERVED = 0x3094, // EGL_SWAP_BEHAVIOR value + EGL_BUFFER_DESTROYED = 0x3095; // EGL_SWAP_BEHAVIOR value + + /** CreatePbufferFromClientBuffer buffer types */ + static final int EGL_OPENVG_IMAGE = 0x3096; + + /** QueryContext targets */ + public static final int EGL_CONTEXT_CLIENT_TYPE = 0x3097; + + /** CreateContext attributes */ + public static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + + /** Multisample resolution behaviors */ + public static final int + EGL_MULTISAMPLE_RESOLVE_DEFAULT = 0x309A, // EGL_MULTISAMPLE_RESOLVE value + EGL_MULTISAMPLE_RESOLVE_BOX = 0x309B; // EGL_MULTISAMPLE_RESOLVE value + + /** BindAPI/QueryAPI targets */ + public static final int + EGL_OPENGL_ES_API = 0x30A0, + EGL_OPENVG_API = 0x30A1, + EGL_OPENGL_API = 0x30A2; + + /** GetCurrentSurface targets */ + public static final int + EGL_DRAW = 0x3059, + EGL_READ = 0x305A; + + /** WaitNative engines */ + static final int EGL_CORE_NATIVE_ENGINE = 0x305B; + + private EGL() { + } + + public static native int eglGetError(); + + /** + * Obtains an EGL display from the specified native display and initializes it. + * + * @param display_id the handle to the native display. + * + * @return the EGL Display + * + * @throws org.lwjgl.LWJGLException if no display is available or an EGL error occurs + */ + public static EGLDisplay eglGetDisplay(long display_id) throws LWJGLException { + //LWJGLUtil.log("eglGetDisplay"); + final long pointer = neglGetDisplay(display_id); + + if ( pointer == EGL_NO_DISPLAY ) // No error is generated when this happens + throw new LWJGLException("Failed to get EGL display from native display handle: " + display_id); + + return new EGLDisplay(pointer); + } + + private static native long neglGetDisplay(long display_id); + + /** + * Initializes the specified EGL display. + * + * @param dpy the EGL display to initialize + * @param version the EGL major and minor version will be returned in this buffer. + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static void eglInitialize(EGLDisplay dpy, IntBuffer version) throws LWJGLException { + //LWJGLUtil.log("eglInitialize"); + BufferChecks.checkBuffer(version, 2); + if ( !neglInitialize(dpy.getPointer(), MemoryUtil.getAddress(version)) ) + throwEGLError("Failed to initialize EGL display."); + } + + private static native boolean neglInitialize(long dpy_ptr, long version); + + /** + * Release the resources associated with the specified EGL display. + * + * @param dpy the EGL display to terminate + */ + static void eglTerminate(EGLDisplay dpy) throws LWJGLException { + //LWJGLUtil.log("eglTerminate"); + if ( !neglTerminate(dpy.getPointer()) ) + throwEGLError("Failed to terminate EGL display."); + } + + private static native boolean neglTerminate(long dpy_ptr); + + /** + * Returns a string describing some aspect of the EGL implementation running on the specified display. + * + * @param dpy the EGL display to query + * @param name the value to query + * + * @return the description + */ + public static String eglQueryString(EGLDisplay dpy, int name) { + //LWJGLUtil.log("eglQueryString"); + return neglQueryString(dpy.getPointer(), name); + } + + private static native String neglQueryString(long dpy, int name); + + /** + * Returns the number of EGLConfigs that are available on the specified display. + * + * @param dpy the EGLDisplay + * + * @return the number of EGLConfigs available + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + * @see #eglGetConfigs(EGLDisplay, EGLConfig[], IntBuffer) + */ + static int eglGetConfigsNum(EGLDisplay dpy) throws LWJGLException { + //LWJGLUtil.log("eglGetConfigsNum"); + IntBuffer num_config = APIUtil.getBufferInt(); + + if ( !neglGetConfigs(dpy.getPointer(), 0L, 0, MemoryUtil.getAddress0(num_config)) ) + throwEGLError("Failed to get EGL configs."); + + return num_config.get(0); + } + + /** + * Returns the available EGLConfigs on the speficied display. The number of available EGLConfigs + * is returned in the num_config parameter. The configs array may be null. If it is null, a new + * array will be allocated, with size equal to the result of {@link #eglGetConfigsNum(EGLDisplay)} eglGetConfigsNum}. + * If it is not null, no more than {@code configs.length} EGLConfigs will be returned. If the array is bigger + * than the number of available EGLConfigs, the remaining array elements will not be affected. + * + * @param dpy the EGLDisplay + * @param configs the EGLConfigs array + * @param num_config the number of available EGLConfigs returned + * + * @return the available EGLConfigs + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static EGLConfig[] eglGetConfigs(EGLDisplay dpy, EGLConfig[] configs, IntBuffer num_config) throws LWJGLException { + //LWJGLUtil.log("eglGetConfigs"); + BufferChecks.checkBuffer(num_config, 1); + + if ( configs == null ) { + if ( !neglGetConfigs(dpy.getPointer(), 0L, 0, MemoryUtil.getAddress(num_config)) ) + throwEGLError("Failed to get number of available EGL configs."); + + configs = new EGLConfig[num_config.get(num_config.position())]; + } + + final PointerBuffer configs_buffer = APIUtil.getBufferPointer(configs.length); + if ( !neglGetConfigs(dpy.getPointer(), MemoryUtil.getAddress0(configs_buffer), configs.length, MemoryUtil.getAddress(num_config)) ) + throwEGLError("Failed to get EGL configs."); + + final int config_size = num_config.get(num_config.position()); + for ( int i = 0; i < config_size; i++ ) + configs[i] = new EGLConfig(dpy, configs_buffer.get(i)); + + return configs; + } + + private static native boolean neglGetConfigs(long dpy_ptr, long configs, int config_size, long num_config); + + /** + * Returns the number of EGLConfigs that are available on the specified display and + * match the speficied list of attributes. + * + * @param dpy the EGLDisplay + * @param attrib_list the attribute list (may be null) + * + * @return the number of EGLConfigs available that satisft the attribute list + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + * @see #eglChooseConfig(EGLDisplay, IntBuffer, EGLConfig[], IntBuffer) + */ + static int eglChooseConfigNum(EGLDisplay dpy, IntBuffer attrib_list) throws LWJGLException { + //LWJGLUtil.log("eglChooseConfigNum"); + checkAttribList(attrib_list); + IntBuffer num_config = APIUtil.getBufferInt(); + + if ( !neglChooseConfig(dpy.getPointer(), MemoryUtil.getAddressSafe(attrib_list), 0L, 0, MemoryUtil.getAddress0(num_config)) ) + throwEGLError("Failed to get EGL configs."); + + return num_config.get(0); + } + + /** + * Returns the available EGLConfigs on the speficied display that satisfy the specified list of attributes. + * The number of available EGLConfigs is returned in the num_config parameter. The configs array may be null. + * If it is null, a new array will be allocated, with size equal to the result of {@link #eglGetConfigsNum(EGLDisplay)} eglGetConfigsNum}. + * If it is not null, no more than {@code configs.length} EGLConfigs will be returned. If the array is bigger + * than the number of available EGLConfigs, the remaining array elements will not be affected. + * + * @param dpy the EGLDisplay + * @param attrib_list the attribute list (may be null) + * @param configs the EGLConfigs array + * @param num_config the number of available EGLConfigs returned + * + * @return the available EGLConfigs that satisfy the attribute list + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static EGLConfig[] eglChooseConfig(EGLDisplay dpy, IntBuffer attrib_list, EGLConfig[] configs, IntBuffer num_config) throws LWJGLException { + //LWJGLUtil.log("eglChooseConfig"); + checkAttribList(attrib_list); + BufferChecks.checkBuffer(num_config, 1); + + int config_size; + if ( configs == null ) { + if ( !neglChooseConfig(dpy.getPointer(), MemoryUtil.getAddressSafe(attrib_list), 0L, 0, MemoryUtil.getAddress(num_config)) ) + throwEGLError("Failed to get number of available EGL configs."); + + config_size = num_config.get(num_config.position()); + } else + config_size = configs.length; + + //LWJGLUtil.log("config_size = " + config_size); + PointerBuffer configs_buffer = APIUtil.getBufferPointer(config_size); + if ( !neglChooseConfig(dpy.getPointer(), MemoryUtil.getAddressSafe(attrib_list), MemoryUtil.getAddress0(configs_buffer), config_size, MemoryUtil.getAddress(num_config)) ) + throwEGLError("Failed to choose EGL config."); + + // Get the true number of configurations (the first neglChooseConfig call may return more than the second) + config_size = num_config.get(num_config.position()); + if ( configs == null ) + configs = new EGLConfig[config_size]; + for ( int i = 0; i < config_size; i++ ) + configs[i] = new EGLConfig(dpy, configs_buffer.get(i)); + + return configs; + } + + private static native boolean neglChooseConfig(long dpy_ptr, long attrib_list, long configs, int config_size, long num_config); + + /** + * Returns the value of an EGL config attribute. + * + * @param dpy the EGL display + * @param config the EGL config + * @param attribute the attribute + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static int eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, int attribute) throws LWJGLException { + //LWJGLUtil.log("eglGetConfigAttrib"); + final IntBuffer value = APIUtil.getBufferInt(); + + if ( !neglGetConfigAttrib(dpy.getPointer(), config.getPointer(), attribute, MemoryUtil.getAddress(value)) ) + throwEGLError("Failed to get EGL config attribute."); + + return value.get(0); + } + + private static native boolean neglGetConfigAttrib(long dpy_ptr, long config_ptr, int attribute, long value); + + /** + * Creates an on-screen rendering surface on the specified EGL display. + * + * @param dpy the EGL display + * @param config the EGL config + * @param win the native window handle + * @param attrib_list an attribute list (may be null) + * + * @return the created EGL surface + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, long win, IntBuffer attrib_list) throws LWJGLException { + //LWJGLUtil.log("eglCreateWindowSurface"); + checkAttribList(attrib_list); + final long pointer = neglCreateWindowSurface(dpy.getPointer(), config.getPointer(), win, MemoryUtil.getAddressSafe(attrib_list)); + + if ( pointer == EGL_NO_SURFACE ) + throwEGLError("Failed to create EGL window surface."); + + return new EGLSurface(dpy, config, pointer); + } + + private static native long neglCreateWindowSurface(long dpy_ptr, long config_ptr, long win, long attrib_list); + + /** + * Creates an off-screen rendering surface on the specified EGL display. + * + * @param dpy the EGL display + * @param config the EGL config + * @param attrib_list an attribute list (may be null) + * + * @return the created EGL surface + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, IntBuffer attrib_list) throws LWJGLException { + //LWJGLUtil.log("eglCreatePbufferSurface"); + checkAttribList(attrib_list); + final long pointer = neglCreatePbufferSurface(dpy.getPointer(), config.getPointer(), MemoryUtil.getAddressSafe(attrib_list)); + + if ( pointer == EGL_NO_SURFACE ) + throwEGLError("Failed to create EGL pbuffer surface."); + + return new EGLSurface(dpy, config, pointer); + } + + private static native long neglCreatePbufferSurface(long dpy_ptr, long config_ptr, long attrib_list); + + /* + EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); + */ + + /** + * Sets the specified EGL surface attribute to the specified value. + * + * @param dpy the EGL display + * @param surface the EGL surface + * @param attribute the attribute + * @param value the attribute value + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static void eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, int attribute, int value) throws LWJGLException { + //LWJGLUtil.log("eglSurfaceAttrib"); + if ( !neglSurfaceAttrib(dpy.getPointer(), surface.getPointer(), attribute, value) ) + throwEGLError("Failed to set surface attribute."); + } + + private static native boolean neglSurfaceAttrib(long dpy_ptr, long surface_ptr, int attribute, int value); + + /** + * Destroys the specified EGL surface. + * + * @param dpy the EGL display + * @param surface the EGL surface to destroy + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static void eglDestroySurface(EGLDisplay dpy, EGLSurface surface) throws LWJGLException { + //LWJGLUtil.log("eglDestroySurface"); + if ( !neglDestroySurface(dpy.getPointer(), surface.getPointer()) ) + throwEGLError("Failed to destroy EGL surface."); + } + + private static native boolean neglDestroySurface(long dpy_ptr, long surface_ptr); + + /** + * Returns the value of the specified EGL surface attribute in the value parameter. + * + * @param dpy the EGL display + * @param surface the EGL surface + * @param attribute the surface attribute + * @param value the attribute value will be returned here + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + public static void eglQuerySurface(EGLDisplay dpy, EGLSurface surface, int attribute, IntBuffer value) throws LWJGLException { + //LWJGLUtil.log("eglQuerySurface"); + BufferChecks.checkBuffer(value, 1); + if ( !neglQuerySurface(dpy.getPointer(), surface.getPointer(), attribute, MemoryUtil.getAddress(value)) ) + throwEGLError("Failed to query surface attribute."); + } + + private static native boolean neglQuerySurface(long dpy_ptr, long surface_ptr, int attribute, long value); + + /** + * Binds the specified rendering API to the current thread. + * + * @param api the API to bind + * + * @return true if the bind was successful, false if an EGL error occurs + */ + public static native boolean eglBindAPI(int api); + + /** + * Returns the current rendering API. + * + * @return the rendering API bound to the current thread + */ + public static native int eglQueryAPI(); + + /** + * Returns EGL to its state at thread initialization. This includes the following:<br> + * <p> + * For each client API supported by EGL, if there is a currently bound context, + * that context is released. This is equivalent to calling eglMakeCurrent + * with ctx set to EGL_NO_CONTEXT and both draw and read set to EGL_NO_SURFACE + * </p><br> + * <p>The current rendering API is reset to its value at thread initialization</p><br> + * <p>Any additional implementation-dependent per-thread state maintained by EGL + * is marked for deletion as soon as possible.</p> + * + * @return true if thread state was released successfully, false is an EGL error occurs + */ + static native boolean eglReleaseThread(); + + /* + EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); + EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); + EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); + */ + + /** + * Specifies the minimum number of video frame periods per buffer swap for + * the window associated with the current context. + * + * @param dpy the EGL display + * @param interval the frame interval + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static void eglSwapInterval(EGLDisplay dpy, int interval) throws LWJGLException { + //LWJGLUtil.log("eglSwapInterval"); + if ( !neglSwapInterval(dpy.getPointer(), interval) ) + throwEGLError("Failed to set swap interval."); + } + + private static native boolean neglSwapInterval(long dpy_ptr, int interval); + + /** + * Creates a new EGL context for the current rendering API. + * + * @param dpy the EGL display + * @param config the EGL config + * @param share_context the EGL context to share data with + * @param attrib_list the attribute list (may be null) + * + * @return the created EGL context + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, IntBuffer attrib_list) throws LWJGLException { + //LWJGLUtil.log("eglCreateContext"); + checkAttribList(attrib_list); + final long pointer = neglCreateContext(dpy.getPointer(), config.getPointer(), + share_context == null ? EGL_NO_CONTEXT : share_context.getPointer(), + MemoryUtil.getAddressSafe(attrib_list)); + + if ( pointer == EGL_NO_CONTEXT ) + throwEGLError("Failed to create EGL context."); + + return new EGLContext(dpy, config, pointer); + } + + private static native long neglCreateContext(long dpy_ptr, long config_ptr, long share_context_ptr, long attrib_list); + + /** + * Destroys a rendering context. + * + * @param dpy the EGL display + * @param ctx the EGL context + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + static void eglDestroyContext(EGLDisplay dpy, EGLContext ctx) throws LWJGLException { + //LWJGLUtil.log("eglDestroyContext"); + if ( !neglDestroyContext(dpy.getPointer(), ctx.getPointer()) ) + throwEGLError("Failed to destroy context."); + } + + private static native boolean neglDestroyContext(long dpy_ptr, long ctx_ptr); + + /** + * Binds the specified context to the current thread and to the draw and read surfaces. + * + * @param dpy the EGL display + * @param draw the draw EGL surface + * @param read the read EGL surface + * @param ctx the EGL context to make current + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + * @throws PowerManagementEventException if an EGL power management event occurs + */ + static void eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) throws LWJGLException, PowerManagementEventException { + //LWJGLUtil.log("eglMakeCurrent"); + if ( !neglMakeCurrent(dpy.getPointer(), + draw == null ? EGL_NO_SURFACE : draw.getPointer(), + read == null ? EGL_NO_SURFACE : read.getPointer(), + ctx == null ? EGL_NO_CONTEXT : ctx.getPointer()) ) { + final int error = eglGetError(); + if ( error == EGL_CONTEXT_LOST ) + throw new PowerManagementEventException(); + else + throwEGLError("Failed to change the current context.", error); + } + } + + /** + * Releases the current context without assigning a new one. + * + * @param dpy the EGL display + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + * @throws PowerManagementEventException if an EGL power management event occurs + * @see #eglMakeCurrent(EGLDisplay, EGLSurface, EGLSurface, EGLContext) + */ + public static void eglReleaseCurrent(EGLDisplay dpy) throws LWJGLException, PowerManagementEventException { + //LWJGLUtil.log("eglReleaseCurrent"); + eglMakeCurrent(dpy, null, null, null); + } + + private static native boolean neglMakeCurrent(long dpy_ptr, long draw_ptr, long read_ptr, long ctx_ptr); + + /** + * Returns the current EGL context for the current rendering API. + * If there is no context current, null is returned. + * + * @return the current context + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + public static EGLContext eglGetCurrentContext() throws LWJGLException { + //LWJGLUtil.log("eglGetCurrentContext"); + // Get current context + final long ctx = neglGetCurrentContext(); + if ( ctx == EGL_NO_CONTEXT ) + return null; + + // Get current display + final EGLDisplay display = eglGetCurrentDisplay(); + + // Query context's CONFIG_ID + final IntBuffer attrib_list = APIUtil.getBufferInt(); + neglQueryContext(display.getPointer(), ctx, EGL_CONFIG_ID, MemoryUtil.getAddress0(attrib_list)); + + final EGLConfig config = getEGLConfig(display, attrib_list); + + // Create the context handle + return new EGLContext(display, config, ctx); + } + + /** + * Returns true if the specified EGL context is the current context. + * This method is faster than using {@code #eglGetCurrentContext} + * and comparing the two EGLContext objects. + * + * @param context the EGL context + * + * @return true if the EGL context is current + * + * @see #eglGetCurrentContext() + */ + public static boolean eglIsCurrentContext(EGLContext context) { + //LWJGLUtil.log("eglIsCurrentContext"); + return neglGetCurrentContext() == context.getPointer(); + } + + private static native long neglGetCurrentContext(); + + /** + * Returns the EGL surfaces used for rendering by the current context. + * If there is no context current, null is returned. + * + * @param readdraw the read or draw surface + * + * @return the current surface + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + public static EGLSurface eglGetCurrentSurface(int readdraw) throws LWJGLException { + //LWJGLUtil.log("eglGetCurrentSurface"); + final long surface = neglGetCurrentSurface(readdraw); + if ( surface == EGL_NO_SURFACE ) + return null; + + // Get current display + EGLDisplay display = eglGetCurrentDisplay(); + + // Query context's CONFIG_ID + final IntBuffer attrib_list = APIUtil.getBufferInt(); + if ( !neglQuerySurface(display.getPointer(), surface, EGL_CONFIG_ID, MemoryUtil.getAddress0(attrib_list)) ) + throwEGLError("Failed to query surface EGL config ID."); + + final EGLConfig config = getEGLConfig(display, attrib_list); + + // Create the surface handle + return new EGLSurface(display, config, surface); + } + + private static native long neglGetCurrentSurface(int readdraw); + + /** + * Returns the EGL display associated with the current context. + * + * @return the current display + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + public static EGLDisplay eglGetCurrentDisplay() throws LWJGLException { + //LWJGLUtil.log("eglGetCurrentDisplay"); + return new EGLDisplay(neglGetCurrentDisplay()); + } + + private static native long neglGetCurrentDisplay(); + + /** + * Returns the value of the specified EGL context attribute in the value parameter. + * + * @param dpy the EGL display + * @param ctx the EGL context + * @param attribute the context attribute + * @param value the attribute value will be returned here + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + public static void eglQueryContext(EGLDisplay dpy, EGLContext ctx, int attribute, IntBuffer value) throws LWJGLException { + //LWJGLUtil.log("eglQueryContext"); + BufferChecks.checkBuffer(value, 1); + if ( !neglQueryContext(dpy.getPointer(), ctx.getPointer(), attribute, MemoryUtil.getAddress(value)) ) + throwEGLError("Failed to query context attribute."); + } + + private static native boolean neglQueryContext(long dpy_ptr, long ctx_ptr, int attribute, long value); + + /** + * Prevents native rendering API functions from executing until any + * outstanding client API rendering affecting the same surface is complete. + * + * @return true if the wait was successful, false is an EGL error occurs + */ + public static native boolean eglWaitClient(); + + /** + * This method does the equivalent of:<br> + * <code> + * EGLenum api = eglQueryAPI(); + * eglBindAPI(EGL_OPENGL_ES_API); + * eglWaitClient(); + * eglBindAPI(api); + * </code> + * + * @return true if the wait was successful, false if an EGL error occurs + */ + public static native boolean eglWaitGL(); + + /** + * Prevents a client API command sequence from executing until any outstanding + * native rendering affecting the same surface is complete. + * + * @param engine the native rendering engine + * + * @return true if the wait was successful, false if an EGL error occurs + */ + public static native boolean eglWaitNative(int engine); + + /** + * Posts the color buffer to the window. + * + * @param dpy the EGL display + * @param surface the EGL back-buffered window surface + * + * @throws org.lwjgl.LWJGLException if an EGL occurs + * @throws PowerManagementEventException if an EGL power management event occurs + */ + static void eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) throws LWJGLException, PowerManagementEventException { + //LWJGLUtil.log("eglSwapBuffers"); + if ( !neglSwapBuffers(dpy.getPointer(), surface.getPointer()) ) { + final int error = eglGetError(); + if ( error == EGL_CONTEXT_LOST ) + throw new PowerManagementEventException(); + else + throwEGLError("Failed to swap buffers.", error); + } + } + + private static native boolean neglSwapBuffers(long dpy_ptr, long surface_ptr); + + //EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); + + /* -------------------------------- + HELPER METHODS + -------------------------------- */ + + static void checkAttribList(IntBuffer attrib_list) { + if ( attrib_list == null ) + return; + + //BufferChecks.checkDirect(attrib_list); + if ( attrib_list.remaining() % 2 != 1 ) + throw new IllegalArgumentException("Invalid number of values in attribute list."); + if ( attrib_list.get(attrib_list.limit() - 1) != EGL_NONE ) + throw new IllegalArgumentException("The attribute list is not terminated with EGL_NONE."); + } + + private static EGLConfig getEGLConfig(final EGLDisplay dpy, final IntBuffer attrib_list) throws LWJGLException { + final int configID = attrib_list.get(0); + + // -- This fails on the emulator + // Get EGL config used by the context + attrib_list.put(0, EGL_CONFIG_ID).put(1, configID).put(2, EGL_NONE); + + final PointerBuffer configs_buffer = APIUtil.getBufferPointer(1); + if ( !neglChooseConfig(dpy.getPointer(), MemoryUtil.getAddress(attrib_list), MemoryUtil.getAddress0(configs_buffer), 1, MemoryUtil.getAddress(attrib_list, 3)) ) + throwEGLError("Failed to choose EGL config."); + + return new EGLConfig(dpy, configs_buffer.get(0)); + + // -- Emulator workaround + /* + EGLConfig config = null; + + final EGLConfig[] configs = eglGetConfigs(dpy, null, attrib_list); + final int config_size = attrib_list.get(0); + for ( int i = 0; i < config_size; i++ ) { + if ( configs[i].getConfigID() == configID ) { + config = configs[i]; + break; + } + } + + if ( config == null ) + throwEGLError("Failed to retrieve EGL config for current context."); + + return config; + //*/ + } + + static void throwEGLError(final String msg) throws LWJGLException { + throwEGLError(msg, eglGetError()); + } + + static void throwEGLError(String msg, final int error) throws LWJGLException { + if ( error != EGL_SUCCESS ) + msg += " EGL error: " + Util.translateEGLErrorString(error); + + throw new LWJGLException(msg); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLConfig.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLConfig.java new file mode 100644 index 0000000..a73b56b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLConfig.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerWrapperAbstract; + +import static org.lwjgl.opengles.EGL.*; + +/** EGLConfig wrapper class. */ +public final class EGLConfig extends PointerWrapperAbstract { + + private final EGLDisplay display; + + private final int configID; + + EGLConfig(final EGLDisplay display, final long pointer) throws LWJGLException { + super(pointer); + + this.display = display; + this.configID = getAttribute(EGL_CONFIG_ID); + } + + /** + * Returns the EGL display from which this EGL config was retrieved. + * + * @return the EGL display + */ + public EGLDisplay getDisplay() { + return display; + } + + /** + * Returns the EGL_CONFIG_ID attribute of this EGLConfig. + * + * @return the EGL_CONFIG_ID + */ + public int getConfigID() { + return configID; + } + + /** + * Returns the value of the specified EGL config attribute. + * + * @param attribute the attribute + * + * @return the attribute value + */ + public int getAttribute(final int attribute) throws LWJGLException { + return eglGetConfigAttrib(display, this, attribute); + } + + public boolean equals(final Object obj) { + if ( obj == null || !(obj instanceof EGLConfig) ) + return false; + + return getPointer() == ((EGLConfig)obj).getPointer(); + } + + public String toString() { + final StringBuilder sb = new StringBuilder(512); + + sb.append("EGLConfig (").append(configID).append(")"); + sb.append("\n------------"); + + try { + sb.append("\nEGL_LEVEL").append(": ").append(getAttribute(EGL_LEVEL)); + sb.append("\nEGL_RENDERABLE_TYPE").append(": ").append(Integer.toBinaryString(getAttribute(EGL_RENDERABLE_TYPE))); + sb.append("\nEGL_NATIVE_RENDERABLE").append(": ").append(getAttribute(EGL_NATIVE_RENDERABLE) == EGL_TRUE); + sb.append("\nEGL_SURFACE_TYPE").append(": ").append(Integer.toBinaryString(getAttribute(EGL_SURFACE_TYPE))); + } catch (LWJGLException e) { + } + + final PixelFormat.Attrib[] attribEnums = PixelFormat.Attrib.values(); + for ( PixelFormat.Attrib attribEnum : attribEnums ) { + if ( attribEnum.isSurfaceAttrib() ) + continue; + + try { + final int attrib = getAttribute(attribEnum.getEGLAttrib()); + sb.append("\nEGL_").append(attribEnum.name()).append(": ").append(attrib); + } catch (LWJGLException e) { + //System.out.println("Failed to retrieve: " + attribEnum.name()); + // Ignore, can happen when querying unsupported attributes (e.g. extension ones) + } + } + + return sb.toString(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLContext.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLContext.java new file mode 100644 index 0000000..54f48b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLContext.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerWrapperAbstract; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGLContext wrapper class. */ +public final class EGLContext extends PointerWrapperAbstract { + + private EGLDisplay display; + private final EGLConfig config; + + private boolean destroyed; + + EGLContext(final EGLDisplay display, final EGLConfig config, final long pointer) { + super(pointer); + + if ( !display.isInitialized() ) + throw new IllegalStateException("Invalid EGL display specified."); + + if ( config.getDisplay() != display ) + throw new IllegalStateException("Invalid EGL config specified."); + + this.display = display; + this.config = config; + } + + public void setDisplay(EGLDisplay display) { + this.display = display; + } + + EGLDisplay getDisplay() { + return display; + } + + EGLConfig getConfig() { + return config; + } + + private void checkDestroyed() { + if ( destroyed ) + throw new IllegalStateException("The EGL surface has been destroyed."); + } + + public void destroy() throws LWJGLException { + eglDestroyContext(display, this); + destroyed = true; + } + + /** + * Returns the value of the specified EGL context attribute. + * + * @param attribute the context attribute + * + * @return the attribute value + */ + int getAttribute(final int attribute) throws LWJGLException { + checkDestroyed(); + + IntBuffer value = APIUtil.getBufferInt(); + eglQueryContext(display, this, attribute, value); + return value.get(0); + } + + public void makeCurrent(final EGLSurface surface) throws LWJGLException, PowerManagementEventException { + makeCurrent(surface, surface); + } + + public void makeCurrent(final EGLSurface draw, final EGLSurface read) throws LWJGLException, PowerManagementEventException { + eglMakeCurrent(display, draw, read, this); + } + + public boolean equals(final Object obj) { + if ( obj == null || !(obj instanceof EGLContext) ) + return false; + + return getPointer() == ((EGLContext)obj).getPointer(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLDisplay.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLDisplay.java new file mode 100644 index 0000000..b654df6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLDisplay.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerWrapperAbstract; + +import java.nio.IntBuffer; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGLDisplay wrapper class. */ +public final class EGLDisplay extends PointerWrapperAbstract { + + private int majorVersion; + private int minorVersion; + + private Set<String> extensions; + + private boolean initialized; + + EGLDisplay(final long pointer) throws LWJGLException { + super(pointer); + + initialize(); + + /*final EGLConfig[] configs = eglGetConfigs(this, null, APIUtil.getBufferInt()); + for ( EGLConfig config : configs ) { + System.out.println(config); + System.out.println(""); + }*/ + } + + /** + * Returns the major EGL version of this EGL display. + * + * @return the major EGL version + */ + public int getMajorVersion() { + return majorVersion; + } + + /** + * Returns the minor EGL version of this EGL display. + * + * @return the minor EGL version + */ + public int getMinorVersion() { + return minorVersion; + } + + /** + * Returns true if the specified EGL extension is supported by this EGL display. + * + * @param eglExtension the EGL extension + * + * @return true if the extension is supported + */ + public boolean isExtensionSupported(final String eglExtension) { + checkInitialized(); + if ( extensions == null ) { + extensions = new HashSet<String>(16); + + final StringTokenizer tokenizer = new StringTokenizer(eglQueryString(this, EGL_EXTENSIONS)); + while ( tokenizer.hasMoreTokens() ) + extensions.add(tokenizer.nextToken()); + } + + return extensions.contains(eglExtension); + } + + boolean isInitialized() { + return initialized; + } + + private void initialize() throws LWJGLException { + IntBuffer version = APIUtil.getBufferInt(); + eglInitialize(this, version); + + majorVersion = version.get(0); + minorVersion = version.get(1); + + initialized = true; + } + + private void checkInitialized() { + if ( !initialized ) + throw new IllegalStateException("The EGL display needs to be initialized first."); + } + + /** Release the resources associated with this EGL display. */ + public void terminate() throws LWJGLException { + eglTerminate(this); + + majorVersion = 0; + minorVersion = 0; + + initialized = false; + } + + /** + * Returns a string describing some aspect of the EGL implementation running on the specified display. + * + * @param name the value to query + * + * @return the description + */ + public String query(int name) { + checkInitialized(); + return eglQueryString(this, name); + } + + int getConfigsNum() throws LWJGLException { + checkInitialized(); + return eglGetConfigsNum(this); + } + + EGLConfig[] getConfigs(EGLConfig[] configs, IntBuffer num_config) throws LWJGLException { + checkInitialized(); + return eglGetConfigs(this, configs, num_config); + } + + int getConfigNum(IntBuffer attrib_list) throws LWJGLException { + checkInitialized(); + return eglChooseConfigNum(this, attrib_list); + } + + /** Returns the available EGL configs on this display that satisfy the specified list of attributes. */ + public EGLConfig[] chooseConfig(IntBuffer attrib_list, EGLConfig[] configs, IntBuffer num_config) throws LWJGLException { + checkInitialized(); + return eglChooseConfig(this, attrib_list, configs, num_config); + } + + /** + * Creates an on-screen rendering surface on this EGL display. + * + * @param config the EGL config + * @param window the native window handle + * @param attrib_list an attribute list (may be null) + * + * @return the EGL surface + */ + public EGLSurface createWindowSurface(EGLConfig config, long window, IntBuffer attrib_list) throws LWJGLException { + checkInitialized(); + + if ( config.getDisplay() != this ) + throw new IllegalArgumentException("Invalid EGL config specified."); + + return eglCreateWindowSurface(this, config, window, attrib_list); + } + + EGLSurface createPbufferSurface(EGLConfig config, IntBuffer attrib_list) throws LWJGLException { + checkInitialized(); + + if ( config.getDisplay() != this ) + throw new IllegalArgumentException("Invalid EGL config specified."); + + return eglCreatePbufferSurface(this, config, attrib_list); + } + + public EGLContext createContext(EGLConfig config, EGLContext shareContext, IntBuffer attrib_list) throws LWJGLException { + checkInitialized(); + + if ( config.getDisplay() != this ) + throw new IllegalStateException("Invalid EGL config specified."); + + if ( shareContext != null && shareContext.getDisplay() != this ) + throw new IllegalStateException("Invalid shared EGL context specified."); + + return eglCreateContext(this, config, shareContext, attrib_list); + } + + public void setSwapInterval(final int interval) throws LWJGLException { + eglSwapInterval(this, interval); + } + + public boolean equals(final Object obj) { + if ( obj == null || !(obj instanceof EGLDisplay) ) + return false; + + return getPointer() == ((EGLDisplay)obj).getPointer(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLImageOES.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLImageOES.java new file mode 100644 index 0000000..18c6a1e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLImageOES.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.PointerWrapperAbstract; + +/** EGLImageOES wrapper class. */ +public final class EGLImageOES extends PointerWrapperAbstract { + + public EGLImageOES(final long pointer) { + super(pointer); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRFenceSync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRFenceSync.java new file mode 100644 index 0000000..8fffb57 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRFenceSync.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.MemoryUtil; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGL_KHR_fence_sync wrapper class. */ +public final class EGLKHRFenceSync { + + /** + * Accepted by the &lt;type&gt; parameter of eglCreateSyncKHR, and returned + * in &lt;value&gt; when eglGetSyncAttribKHR is called with &lt;attribute&gt; + * EGL_SYNC_TYPE_KHR: + */ + public static final int EGL_SYNC_FENCE_KHR = 0x30F9; + + /** Accepted by the &lt;attribute&gt; parameter of eglGetSyncAttribKHR: */ + public static final int EGL_SYNC_TYPE_KHR = 0x30F7, + EGL_SYNC_STATUS_KHR = 0x30F1, + EGL_SYNC_CONDITION_KHR = 0x30F8; + + /** + * Returned in &lt;value&gt; when eglGetSyncAttribKHR is called with + * &lt;attribute&gt; EGL_SYNC_STATUS_KHR: + */ + public static final int EGL_SIGNALED_KHR = 0x30F2, + EGL_UNSIGNALED_KHR = 0x30F3; + + /** + * Returned in &lt;value&gt; when eglGetSyncAttribKHR is called with + * &lt;attribute&gt; EGL_SYNC_CONDITION_KHR: + */ + public static final int EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR = 0x30F0; + + /** Accepted in the &lt;flags&gt; parameter of eglClientWaitSyncKHR: */ + public static final int EGL_SYNC_FLUSH_COMMANDS_BIT_KHR = 0x0001; + + /** Accepted in the &lt;timeout&gt; parameter of eglClientWaitSyncKHR: */ + public static final long EGL_FOREVER_KHR = 0xFFFFFFFFFFFFFFFFl; + + /** Returned by eglClientWaitSyncKHR: */ + public static final int EGL_TIMEOUT_EXPIRED_KHR = 0x30F5, + EGL_CONDITION_SATISFIED_KHR = 0x30F6; + + /** Returned by eglCreateSyncKHR in the event of an error: */ + public static final long EGL_NO_SYNC_KHR = 0; + + static { + initNativeStubs(); + } + + private EGLKHRFenceSync() { + } + + private static native void initNativeStubs(); + + /** + * Creates a fence sync object for the specified EGL display and returns + * a handle to the new object. + * + * @param dpy the EGL display + * @param type the sync type + * @param attrib_list an attribute list (may be null) + * + * @return the created fence sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, int type, IntBuffer attrib_list) throws LWJGLException { + checkAttribList(attrib_list); + + final long pointer = neglCreateSyncKHR(dpy.getPointer(), type, MemoryUtil.getAddressSafe(attrib_list)); + + if ( pointer == EGL_NO_SYNC_KHR ) + throwEGLError("Failed to create KHR fence sync object."); + + return new EGLSyncKHR(pointer); + } + + private static native long neglCreateSyncKHR(long dpy_ptr, int type, long attrib_list); + + /** + * Destroys an existing sync object. + * + * @param sync the sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) throws LWJGLException { + if ( !neglDestroySyncKHR(dpy.getPointer(), sync.getPointer()) ) + throwEGLError("Failed to destroy KHR fence sync object."); + } + + private static native boolean neglDestroySyncKHR(long dpy_ptr, long sync_ptr); + + /** + * Blocks the calling thread until the specified sync object is + * signaled, or until a specified timeout value expires. + * + * @param sync the sync object + * @param flags the block flags + * @param timeout the block timeout + * + * @return the sync object status + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, int flags, long timeout) throws LWJGLException { + final int status = neglClientWaitSyncKHR(dpy.getPointer(), sync.getPointer(), flags, timeout); + + if ( status == EGL_FALSE ) + throwEGLError("Failed to block on KHR fence sync object."); + + return status; + } + + private static native int neglClientWaitSyncKHR(long dpy_ptr, long sync_ptr, int flags, long timeout); + + /** + * Returns the value of the sync object attribute. + * + * @param sync the sync object + * @param attribute the attribute to query + * + * @return the attribute value + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, int attribute) throws LWJGLException { + final IntBuffer value = APIUtil.getBufferInt(); + + if ( !neglGetSyncAttribKHR(dpy.getPointer(), sync.getPointer(), attribute, MemoryUtil.getAddress(value)) ) + throwEGLError("Failed to get KHR fence sync object attribute."); + + return value.get(0); + } + + private static native boolean neglGetSyncAttribKHR(long dpy_ptr, long sync_ptr, int attribute, long value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRReusableSync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRReusableSync.java new file mode 100644 index 0000000..3ddca45 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLKHRReusableSync.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGL_KHR_reusable_sync wrapper class. */ +public final class EGLKHRReusableSync { + + /** + * Accepted by the &lt;type&gt; parameter of eglCreateSyncKHR, and returned + * in &lt;value&gt; when eglGetSyncAttribKHR is called with &lt;attribute&gt; + * EGL_SYNC_TYPE_KHR: + */ + public static final int EGL_SYNC_REUSABLE_KHR = 0x30FA; + + /** Accepted by the &lt;attribute&gt; parameter of eglGetSyncAttribKHR: */ + public static final int EGL_SYNC_TYPE_KHR = 0x30F7, + EGL_SYNC_STATUS_KHR = 0x30F1; + + /** + * Returned in &lt;value&gt; when eglGetSyncAttribKHR is called with + * &lt;attribute&gt; EGL_SYNC_STATUS_KHR: + */ + public static final int EGL_SIGNALED_KHR = 0x30F2, + EGL_UNSIGNALED_KHR = 0x30F3; + + /** Accepted in the &lt;flags&gt; parameter of eglClientWaitSyncKHR: */ + public static final int EGL_SYNC_FLUSH_COMMANDS_BIT_KHR = 0x0001; + + /** Accepted in the &lt;timeout&gt; parameter of eglClientWaitSyncKHR: */ + public static final long EGL_FOREVER_KHR = 0xFFFFFFFFFFFFFFFFl; + + /** Returned by eglClientWaitSyncKHR: */ + public static final int EGL_TIMEOUT_EXPIRED_KHR = 0x30F5, + EGL_CONDITION_SATISFIED_KHR = 0x30F6; + + /** Returned by eglCreateSyncKHR in the event of an error: */ + public static final long EGL_NO_SYNC_KHR = 0; + + static { + initNativeStubs(); + } + + private EGLKHRReusableSync() { + } + + private static native void initNativeStubs(); + + /** + * Creates a fence sync object for the specified EGL display and returns + * a handle to the new object. + * + * @param dpy the EGL display + * @param type the sync type + * @param attrib_list an attribute list (may be null) + * + * @return the created fence sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, int type, IntBuffer attrib_list) throws LWJGLException { + return EGLKHRFenceSync.eglCreateSyncKHR(dpy, type, attrib_list); + } + + /** + * Destroys an existing sync object. + * + * @param sync the sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) throws LWJGLException { + EGLKHRFenceSync.eglDestroySyncKHR(dpy, sync); + } + + /** + * Blocks the calling thread until the specified sync object is + * signaled, or until a specified timeout value expires. + * + * @param sync the sync object + * @param flags the block flags + * @param timeout the block timeout + * + * @return the sync object status + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, int flags, long timeout) throws LWJGLException { + return EGLKHRFenceSync.eglClientWaitSyncKHR(dpy, sync, flags, timeout); + } + + /** + * Signals or unsignals the sync object by changing its status to + * the specified mode. + * + * @param sync the sync object + * @param mode the mode + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, int mode) throws LWJGLException { + if ( !neglSignalSyncKHR(dpy.getPointer(), sync.getPointer(), mode) ) + throwEGLError("Failed to signal the KHR fence sync object."); + } + + private static native boolean neglSignalSyncKHR(long dpy_ptr, long sync_ptr, int mode); + + /** + * Returns the value of the sync object attribute. + * + * @param sync the sync object + * @param attribute the attribute to query + * + * @return the attribute value + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, int attribute) throws LWJGLException { + return EGLKHRFenceSync.eglGetSyncAttribKHR(dpy, sync, attribute); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLNVSync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLNVSync.java new file mode 100644 index 0000000..ccb0a79 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLNVSync.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.MemoryUtil; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGL_NV_sync wrapper class. */ +public final class EGLNVSync { + + /** + * Accepted in the &lt;condition&gt; parameter of eglCreateFenceSyncNV, and + * returned in &lt;value&gt; when eglGetSyncAttribNV is called with &lt;attribute&gt; + * EGL_SYNC_CONDITION_NV: + */ + public static final int EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV = 0x30E6; + + /** + * Accepted as an attribute name in the &lt;attrib_list&gt; parameter of + * eglCreateFenceSyncNV, and by the &lt;attribute&gt; parameter of + * eglGetSyncAttribNV: + */ + public static final int EGL_SYNC_STATUS_NV = 0x30E7; + + /** + * Accepted as an attribute value in the &lt;attrib_list&gt; parameter of + * eglCreateFenceSyncNV for the EGL_SYNC_STATUS_NV attribute, by + * the &lt;mode&gt; parameter of eglSignalSyncNV and returned in &lt;value&gt; + * when eglGetSyncAttribNV is called with &lt;attribute&gt; + * EGL_SYNC_STATUS_NV: + */ + public static final int EGL_SIGNALED_NV = 0x30E8, + EGL_UNSIGNALED_NV = 0x30E9; + + /** Accepted in the &lt;flags&gt; parameter of eglClientWaitSyncNV: */ + public static final int EGL_SYNC_FLUSH_COMMANDS_BIT_NV = 0x0001; + + /** Accepted in the &lt;timeout&gt; parameter of eglClientWaitSyncNV: */ + public static final long EGL_FOREVER_NV = 0xFFFFFFFFFFFFFFFFL; + + /** Returned by eglClientWaitSyncNV: */ + public static final int EGL_ALREADY_SIGNALED_NV = 0x30EA, + EGL_TIMEOUT_EXPIRED_NV = 0x30EB, + EGL_CONDITION_SATISFIED_NV = 0x30EC; + + /** Accepted in the &lt;attribute&gt; parameter of eglGetSyncAttribNV: */ + public static final int EGL_SYNC_TYPE_NV = 0x30ED, + EGL_SYNC_CONDITION_NV = 0x30EE; + + /** + * Returned in &lt;value&gt; when eglGetSyncAttribNV is called with + * &lt;attribute&gt; EGL_SYNC_TYPE_NV: + */ + public static final int EGL_SYNC_FENCE_NV = 0x30EF; + + /** Returned by eglCreateFenceSyncNV in the event of an error: */ + public static final long EGL_NO_SYNC_NV = 0; + + static { + initNativeStubs(); + } + + private EGLNVSync() { + } + + private static native void initNativeStubs(); + + /** + * Creates a fence sync object for the specified EGL display and returns + * a handle to the new object. + * + * @param dpy the EGL display + * @param condition the sync condition + * @param attrib_list an attribute list (may be null) + * + * @return the created fence sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static EGLSyncNV eglCreateFenceSyncNV(EGLDisplay dpy, int condition, IntBuffer attrib_list) throws LWJGLException { + checkAttribList(attrib_list); + + final long pointer = neglCreateFenceSyncNV(dpy.getPointer(), condition, MemoryUtil.getAddressSafe(attrib_list)); + + if ( pointer == EGL_NO_SYNC_NV ) + throwEGLError("Failed to create NV fence sync object."); + + return new EGLSyncNV(pointer); + } + + private static native long neglCreateFenceSyncNV(long dpy_ptr, int condition, long attrib_list); + + /** + * Destroys an existing sync object. + * + * @param sync the sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglDestroySyncNV(EGLSyncNV sync) throws LWJGLException { + if ( !neglDestroySyncNV(sync.getPointer()) ) + throwEGLError("Failed to destroy NV fence sync object."); + } + + private static native boolean neglDestroySyncNV(long sync_ptr); + + /** + * Inserts a fence command into the command stream of the bound API's current + * context and associates it with sync object. + * + * @param sync the sync object + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglFenceNV(EGLSyncNV sync) throws LWJGLException { + if ( !neglFenceNV(sync.getPointer()) ) + throwEGLError("Failed to insert NV fence command."); + } + + private static native boolean neglFenceNV(long sync_ptr); + + /** + * Blocks the calling thread until the specified sync object is + * signaled, or until a specified timeout value expires. + * + * @param sync the sync object + * @param flags the block flags + * @param timeout the block timeout + * + * @return the sync object status + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglClientWaitSyncNV(EGLSyncNV sync, int flags, long timeout) throws LWJGLException { + final int status = neglClientWaitSyncNV(sync.getPointer(), flags, timeout); + + if ( status == EGL_FALSE ) + throwEGLError("Failed to block on NV fence sync object."); + + return status; + } + + private static native int neglClientWaitSyncNV(long sync_ptr, int flags, long timeout); + + /** + * Signals or unsignals the sync object by changing its status to + * the specified mode. + * + * @param sync the sync object + * @param mode the mode + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static void eglSignalSyncNV(EGLSyncNV sync, int mode) throws LWJGLException { + if ( !neglSignalSyncNV(sync.getPointer(), mode) ) + throwEGLError("Failed to signal the NV fence sync object."); + } + + private static native boolean neglSignalSyncNV(long sync_ptr, int mode); + + /** + * Returns the value of the sync object attribute. + * + * @param sync the sync object + * @param attribute the attribute to query + * + * @return the attribute value + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs. + */ + public static int eglGetSyncAttribNV(EGLSyncNV sync, int attribute) throws LWJGLException { + final IntBuffer value = APIUtil.getBufferInt(); + + if ( !neglGetSyncAttribNV(sync.getPointer(), attribute, MemoryUtil.getAddress0(value)) ) + throwEGLError("Failed to get NV fence sync object attribute."); + + return value.get(0); + } + + private static native boolean neglGetSyncAttribNV(long sync_ptr, int attribute, long value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSurface.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSurface.java new file mode 100644 index 0000000..5464337 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSurface.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerWrapperAbstract; + +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.EGL.*; + +/** EGLSurface wrapper class. */ +public final class EGLSurface extends PointerWrapperAbstract { + + private final EGLDisplay display; + private final EGLConfig config; + + private boolean destroyed; + + EGLSurface(final EGLDisplay display, final EGLConfig config, final long pointer) { + super(pointer); + + if ( !display.isInitialized() ) + throw new IllegalStateException("Invalid EGL display specified."); + + this.display = display; + this.config = config; + } + + /** + * Returns the EGL display from which this EGL surface was created. + * + * @return the EGL display + */ + public EGLDisplay getDisplay() { + return display; + } + + /** + * Returns the EGL config associated with this EGL surface. + * + * @return the EGL config + */ + public EGLConfig getConfig() { + return config; + } + + private void checkDestroyed() { + if ( destroyed ) + throw new IllegalStateException("The EGL surface has been destroyed."); + } + + /** Destroys this EGL surface. */ + public void destroy() throws LWJGLException { + eglDestroySurface(display, this); + destroyed = true; + } + + void setAttribute(int attribute, int value) throws LWJGLException { + checkDestroyed(); + eglSurfaceAttrib(display, this, attribute, value); + } + + /** + * Returns the value of the specified EGL surface attribute. + * + * @param attribute the surface attribute + * + * @return the attribute value + */ + public int getAttribute(int attribute) throws LWJGLException { + checkDestroyed(); + + IntBuffer value = APIUtil.getBufferInt(); + eglQuerySurface(display, this, attribute, value); + return value.get(0); + } + + public void swapBuffers() throws LWJGLException, PowerManagementEventException { + checkDestroyed(); + eglSwapBuffers(display, this); + } + + public boolean equals(final Object obj) { + if ( obj == null || !(obj instanceof EGLSurface) ) + return false; + + return getPointer() == ((EGLSurface)obj).getPointer(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncKHR.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncKHR.java new file mode 100644 index 0000000..743d121 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncKHR.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.PointerWrapperAbstract; + +/** EGLSyncKHR wrapper class. */ +public class EGLSyncKHR extends PointerWrapperAbstract { + + public EGLSyncKHR(final long pointer) { + super(pointer); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncNV.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncNV.java new file mode 100644 index 0000000..6833adc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/EGLSyncNV.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.PointerWrapperAbstract; + +/** EGLSyncNV wrapper class. */ +public class EGLSyncNV extends PointerWrapperAbstract { + + public EGLSyncNV(final long pointer) { + super(pointer); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/FastIntMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/FastIntMap.java new file mode 100644 index 0000000..17776a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/FastIntMap.java @@ -0,0 +1,238 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" + * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.lwjgl.opengles; + +import java.util.Iterator; + +/** + * A hash map using primitive ints as keys rather than objects. + * + * @author Justin Couch + * @author Alex Chaffee (alex@apache.org) + * @author Stephen Colebourne + * @author Nathan Sweet + */ +final class FastIntMap<V> implements Iterable<FastIntMap.Entry<V>> { + + private Entry[] table; + private int size, mask, capacity, threshold; + + /** Same as: FastIntMap(16, 0.75f); */ + FastIntMap() { + this(16, 0.75f); + } + + /** Same as: FastIntMap(initialCapacity, 0.75f); */ + FastIntMap(int initialCapacity) { + this(initialCapacity, 0.75f); + } + + FastIntMap(int initialCapacity, float loadFactor) { + if ( initialCapacity > 1 << 30 ) throw new IllegalArgumentException("initialCapacity is too large."); + if ( initialCapacity < 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + if ( loadFactor <= 0 ) throw new IllegalArgumentException("initialCapacity must be greater than zero."); + capacity = 1; + while ( capacity < initialCapacity ) + capacity <<= 1; + this.threshold = (int)(capacity * loadFactor); + this.table = new Entry[capacity]; + this.mask = capacity - 1; + } + + private int index(final int key) { + return index(key, mask); + } + + private static int index(final int key, final int mask) { + return key & mask; + } + + public V put(int key, V value) { + final Entry<V>[] table = this.table; + int index = index(key); + + // Check if key already exists. + for ( Entry<V> e = table[index]; e != null; e = e.next ) { + if ( e.key != key ) continue; + V oldValue = e.value; + e.value = value; + return oldValue; + } + + table[index] = new Entry<V>(key, value, table[index]); + + if ( size++ >= threshold ) + rehash(table); + + return null; + } + + private void rehash(final Entry<V>[] table) { + final int newCapacity = 2 * capacity; + final int newMask = newCapacity - 1; + + final Entry<V>[] newTable = new Entry[newCapacity]; + + for ( int i = 0, index; i < table.length; i++ ) { + Entry<V> e = table[i]; + if ( e == null ) continue; + do { + final Entry<V> next = e.next; + index = index(e.key, newMask); + e.next = newTable[index]; + newTable[index] = e; + e = next; + } while ( e != null ); + } + + this.table = newTable; + capacity = newCapacity; + mask = newMask; + threshold *= 2; + } + + public V get(int key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return e.value; + return null; + } + + public boolean containsValue(Object value) { + final Entry<V>[] table = this.table; + for ( int i = table.length - 1; i >= 0; i-- ) + for ( Entry<V> e = table[i]; e != null; e = e.next ) + if ( e.value.equals(value) ) return true; + return false; + } + + public boolean containsKey(int key) { + final int index = index(key); + for ( Entry<V> e = table[index]; e != null; e = e.next ) + if ( e.key == key ) return true; + return false; + } + + public V remove(int key) { + final int index = index(key); + + Entry<V> prev = table[index]; + Entry<V> e = prev; + while ( e != null ) { + Entry<V> next = e.next; + if ( e.key == key ) { + size--; + if ( prev == e ) + table[index] = next; + else + prev.next = next; + return e.value; + } + prev = e; + e = next; + } + return null; + } + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public void clear() { + final Entry<V>[] table = this.table; + for ( int index = table.length - 1; index >= 0; index-- ) + table[index] = null; + size = 0; + } + + public EntryIterator iterator() { + return new EntryIterator(); + } + + public class EntryIterator implements Iterator<Entry<V>> { + + private int nextIndex; + private Entry<V> current; + + EntryIterator() { + reset(); + } + + public void reset() { + current = null; + // Find first bucket. + final Entry<V>[] table = FastIntMap.this.table; + int i; + for ( i = table.length - 1; i >= 0; i-- ) + if ( table[i] != null ) break; + nextIndex = i; + } + + public boolean hasNext() { + if ( nextIndex >= 0 ) return true; + Entry e = current; + return e != null && e.next != null; + } + + public Entry<V> next() { + // Next entry in current bucket. + Entry<V> e = current; + if ( e != null ) { + e = e.next; + if ( e != null ) { + current = e; + return e; + } + } + // Use the bucket at nextIndex and find the next nextIndex. + final Entry<V>[] table = FastIntMap.this.table; + int i = nextIndex; + e = current = table[i]; + while ( --i >= 0 ) + if ( table[i] != null ) break; + nextIndex = i; + return e; + } + + public void remove() { + FastIntMap.this.remove(current.key); + } + } + + static final class Entry<T> { + + final int key; + T value; + Entry<T> next; + + Entry(int key, T value, Entry<T> next) { + this.key = key; + this.value = value; + this.next = next; + } + + public int getKey() { + return key; + } + + public T getValue() { + return value; + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLChecks.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLChecks.java new file mode 100644 index 0000000..a7463e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLChecks.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.opengl.OpenGLException; + +import java.nio.Buffer; + +import static org.lwjgl.opengles.GLES20.*; + +/** + * A class to check buffer boundaries in GL methods. Many GL + * methods read data from the GL into a native Buffer at its current position. If there is unsufficient space in the buffer when + * the call is made then a buffer overflow would otherwise occur and cause unexpected behaviour, a crash, or worse, a security + * risk. Therefore in those methods where GL reads data back into a buffer, we will call a bounds check method from this class + * to ensure that there is sufficient space in the buffer. + * <p/> + * Thrown by the debug build library of the LWJGL if any OpenGL operation causes an error. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision: 3459 $ + * $Id: GLChecks.java 3459 2010-11-29 17:21:05Z spasi $ + */ +class GLChecks { + + /** Static methods only! */ + private GLChecks() { + } + + static int getBufferObjectSize(int buffer_enum) { + return glGetBufferParameteri(buffer_enum, GLES20.GL_BUFFER_SIZE); + } + + /** Helper method to ensure that array buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureArrayVBOdisabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().arrayBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Array Buffer Object is enabled"); + } + + /** Helper method to ensure that array buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureArrayVBOenabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().arrayBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Array Buffer Object is disabled"); + } + + /** Helper method to ensure that element array buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureElementVBOdisabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().elementArrayBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Element Array Buffer Object is enabled"); + } + + /** Helper method to ensure that element array buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureElementVBOenabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().elementArrayBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Element Array Buffer Object is disabled"); + } + + /** Helper method to ensure that pixel pack buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensurePackPBOdisabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().pixelPackBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Pixel Pack Buffer Object is enabled"); + } + + /** Helper method to ensure that pixel pack buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensurePackPBOenabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().pixelPackBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Pixel Pack Buffer Object is disabled"); + } + + /** Helper method to ensure that pixel unpack buffer objects are disabled. If they are enabled, we'll throw an OpenGLException */ + static void ensureUnpackPBOdisabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().pixelUnpackBuffer != 0 ) + throw new OpenGLException("Cannot use Buffers when Pixel Unpack Buffer Object is enabled"); + } + + /** Helper method to ensure that pixel unpack buffer objects are enabled. If they are disabled, we'll throw an OpenGLException */ + static void ensureUnpackPBOenabled() { + if ( LWJGLUtil.CHECKS && StateTracker.getTracker().pixelUnpackBuffer == 0 ) + throw new OpenGLException("Cannot use offsets when Pixel Unpack Buffer Object is disabled"); + } + + /** + * Calculate the storage required for an image in elements + * + * @param format The format of the image (example: GL_RGBA) + * @param type The type of the image elements (example: GL_UNSIGNED_BYTE) + * @param width The width of the image + * @param height The height of the image (1 for 1D images) + * @param depth The depth of the image (1 for 2D images) + * + * @return the size, in elements, of the image + */ + static int calculateImageStorage(Buffer buffer, int format, int type, int width, int height, int depth) { + return LWJGLUtil.CHECKS ? calculateImageStorage(format, type, width, height, depth) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage1DStorage(Buffer buffer, int format, int type, int width) { + return LWJGLUtil.CHECKS ? calculateTexImage1DStorage(format, type, width) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage2DStorage(Buffer buffer, int format, int type, int width, int height) { + return LWJGLUtil.CHECKS ? calculateTexImage2DStorage(format, type, width, height) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + static int calculateTexImage3DStorage(Buffer buffer, int format, int type, int width, int height, int depth) { + return LWJGLUtil.CHECKS ? calculateTexImage3DStorage(format, type, width, height, depth) >> BufferUtils.getElementSizeExponent(buffer) : 0; + } + + /** + * Calculate the storage required for an image in bytes. + * + * @param format The format of the image (example: GL_RGBA) + * @param type The type of the image elements (example: GL_UNSIGNED_BYTE) + * @param width The width of the image + * @param height The height of the image (1 for 1D images) + * @param depth The depth of the image (1 for 2D images) + * + * @return the size, in bytes, of the image + */ + private static int calculateImageStorage(int format, int type, int width, int height, int depth) { + return calculateBytesPerPixel(format, type) * width * height * depth; + } + + private static int calculateTexImage1DStorage(int format, int type, int width) { + return calculateBytesPerPixel(format, type) * width; + } + + private static int calculateTexImage2DStorage(int format, int type, int width, int height) { + return calculateTexImage1DStorage(format, type, width) * height; + } + + private static int calculateTexImage3DStorage(int format, int type, int width, int height, int depth) { + return calculateTexImage2DStorage(format, type, width, height) * depth; + } + + private static int calculateBytesPerPixel(int format, int type) { + int bpe; + switch ( type ) { + case GL_UNSIGNED_BYTE: + case GL_BYTE: + bpe = 1; + break; + case GL_UNSIGNED_SHORT: + case GL_SHORT: + bpe = 2; + break; + case GL_UNSIGNED_INT: + case GL_INT: + case GL_FLOAT: + bpe = 4; + break; + default: + // TODO: Add more types (like the GL12 types GL_UNSIGNED_INT_8_8_8_8 + return 0; + // throw new IllegalArgumentException("Unknown type " + type); + } + int epp; + switch ( format ) { + case GL_LUMINANCE: + case GL_ALPHA: + epp = 1; + break; + + case GL_LUMINANCE_ALPHA: + epp = 2; + break; + case GL_RGB: + epp = 3; + break; + case GL_RGBA: + epp = 4; + break; + default: + // TODO: Add more formats. Assuming 4 is too wasteful on buffer sizes where e.g. 1 is enough (like GL_DEPTH_COMPONENT) + return 0; + } + + return bpe * epp; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLContext.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLContext.java new file mode 100644 index 0000000..14f9e88 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLContext.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.WeakHashMap; + +import static org.lwjgl.opengles.GLES20.*; + +/** + * <p/> + * Manages GL contexts. Before any rendering is done by a LWJGL system, a call should be made to GLContext.useContext() with a + * context. This will ensure that GLContext has an accurate reflection of the current context's capabilities and function + * pointers. + * <p/> + * This class is thread-safe in the sense that multiple threads can safely call all public methods. The class is also + * thread-aware in the sense that it tracks a per-thread current context (including capabilities and function pointers). + * That way, multiple threads can have multiple contexts current and render to them concurrently. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3279 $ + * $Id: GLContext.java 3279 2010-03-11 21:06:49Z spasi $ + */ +public final class GLContext { + + /** Maps threads to their current context's ContextCapabilities, if any */ + private static final ThreadLocal<ContextCapabilities> current_capabilities = new ThreadLocal<ContextCapabilities>(); + + /** + * The getCapabilities() method is a potential hot spot in any LWJGL application, since + * it is needed for context capability discovery (e.g. is OpenGL 2.0 supported?), and + * for the function pointers of gl functions. However, the 'current_capabilities' ThreadLocal + * is (relatively) expensive to look up, and since most OpenGL applications use are single threaded + * rendering, the following two is an optimization for this case. + * <p/> + * ThreadLocals can be thought of as a mapping between threads and values, so the idea + * is to use a lock-less cache of mappings between threads and the current ContextCapabilities. The cache + * could be any size, but in our case, we want a single sized cache for optimal performance + * in the single threaded case. + * <p/> + * 'fast_path_cache' is the most recent ContextCapabilities (potentially null) and its owner. By + * recent I mean the last thread setting the value in setCapabilities(). When getCapabilities() + * is called, a check to see if the current is the owner of the ContextCapabilities instance in + * fast_path_cache. If so, the instance is returned, if not, some thread has since taken ownership + * of the cache entry and the slower current_capabilities ThreadLocal is queried instead. + * <p/> + * No locks are needed in get/setCapabilities, because even though fast_path_cache can be accessed + * from multiple threads at once, we are guaranteed by the JVM spec that its value is always valid. + * Furthermore, if the ownership test in getCapabilities() succeeds, the cache entry can only contain + * the correct ContextCapabilites (that is, the one from getThreadLocalCapabilites()), + * since no other thread can set the owner to anyone else than itself. + */ + private static CapabilitiesCacheEntry fast_path_cache = new CapabilitiesCacheEntry(); + + /** + * Simple lock-free cache of CapabilitesEntryCache to avoid allocating more than one + * cache entry per thread + */ + private static final ThreadLocal<CapabilitiesCacheEntry> thread_cache_entries = new ThreadLocal<CapabilitiesCacheEntry>(); + + /** + * The weak mapping from context Object instances to ContextCapabilities. Used + * to avoid recreating a ContextCapabilities every time a context is made current. + */ + private static final Map<Object, ContextCapabilities> capability_cache = new WeakHashMap<Object, ContextCapabilities>(); + + /** Reference count of the native opengl implementation library */ + private static int gl_ref_count; + private static boolean did_auto_load; + + static { + Sys.initialize(); + } + + /** + * Get the current capabilities instance. It contains the flags used + * to test for support of a particular extension. + * + * @return The current capabilities instance. + */ + public static ContextCapabilities getCapabilities() { + CapabilitiesCacheEntry recent_cache_entry = fast_path_cache; + // Check owner of cache entry + if ( recent_cache_entry.owner == Thread.currentThread() ) { + /* The owner ship test succeeded, so the cache must contain the current ContextCapabilities instance + * assert recent_cache_entry.capabilities == getThreadLocalCapabilities(); + */ + return recent_cache_entry.capabilities; + } else // Some other thread has written to the cache since, and we fall back to the slower path + return getThreadLocalCapabilities(); + } + + private static ContextCapabilities getThreadLocalCapabilities() { + return current_capabilities.get(); + } + + /** + * Set the current capabilities instance. It contains the flags used + * to test for support of a particular extension. + * + * @return The current capabilities instance. + */ + static void setCapabilities(ContextCapabilities capabilities) { + current_capabilities.set(capabilities); + + CapabilitiesCacheEntry thread_cache_entry = thread_cache_entries.get(); + if ( thread_cache_entry == null ) { + thread_cache_entry = new CapabilitiesCacheEntry(); + thread_cache_entries.set(thread_cache_entry); + } + thread_cache_entry.owner = Thread.currentThread(); + thread_cache_entry.capabilities = capabilities; + + fast_path_cache = thread_cache_entry; + } + + /** + * Determine which extensions are available and returns the context profile mask. Helper method to ContextCapabilities. + * + * @param supported_extensions the Set to fill with the available extension names + * + * @return the context profile mask, will be 0 for any version < 3.2 + */ + static void getSupportedExtensions(final Set<String> supported_extensions) { + // Detect OpenGL version first + final String version = glGetString(GL_VERSION); + if ( version == null ) + throw new IllegalStateException("glGetString(GL_VERSION) returned null - possibly caused by missing current context."); + + final String VERSION_PREFIX = "OpenGL ES "; + final StringTokenizer version_tokenizer = new StringTokenizer(version.substring(VERSION_PREFIX.length()), ". "); + + int majorVersion = 0; + int minorVersion = 0; + try { + majorVersion = Integer.parseInt(version_tokenizer.nextToken()); + minorVersion = Integer.parseInt(version_tokenizer.nextToken()); + } catch (NumberFormatException e) { + LWJGLUtil.log("The major and/or minor OpenGL version is malformed: " + e.getMessage()); + } + + // ----------------------[ 2.X ]---------------------- + if ( 3 <= majorVersion ) + supported_extensions.add("OpenGLES30"); + if ( 2 <= majorVersion ) + supported_extensions.add("OpenGLES20"); + + // Parse EXTENSIONS string + final String extensions_string = glGetString(GL_EXTENSIONS); + if ( extensions_string == null ) + throw new IllegalStateException("glGetString(GL_EXTENSIONS) returned null - is there a context current?"); + + final StringTokenizer tokenizer = new StringTokenizer(extensions_string); + while ( tokenizer.hasMoreTokens() ) + supported_extensions.add(tokenizer.nextToken()); + } + + /** + * Helper method to ContextCapabilities. It will try to initialize the native stubs, + * and remove the given extension name from the extension set if the initialization fails. + */ + static void initNativeStubs(final Class extension_class, Set<String> supported_extensions, String ext_name) { + //resetNativeStubs(extension_class); + if ( supported_extensions.contains(ext_name) ) { + try { + doInitNativeStubs(extension_class); + } catch (LWJGLException e) { + LWJGLUtil.log("Failed to initialize extension " + extension_class + " - exception: " + e); + supported_extensions.remove(ext_name); + } + } + } + + static void doInitNativeStubs(final Class<?> extension_class) throws LWJGLException { + try { + AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { + public Object run() throws Exception { + Method init_stubs_method = extension_class.getDeclaredMethod("initNativeStubs"); + init_stubs_method.invoke(null); + return null; + } + }); + } catch (PrivilegedActionException e) { + final Throwable c = e.getCause(); + if ( c instanceof InvocationTargetException ) + throw new LWJGLException(c.getCause()); + else + throw new LWJGLException(c); + } + } + + /** + * Makes a GL context the current LWJGL context by loading GL function pointers. The context must be current before a call to + * this method! Instead it simply ensures that the current context is reflected accurately by GLContext's extension caps and + * function pointers. Use useContext(null) when no context is active. <p>If the context is the same as last time, then this is + * a no-op. <p>If the context has not been encountered before it will be fully initialized from scratch. Otherwise a cached set + * of caps and function pointers will be used. <p>The reference to the context is held in a weak reference; therefore if no + * strong reference exists to the GL context it will automatically be forgotten by the VM at an indeterminate point in the + * future, freeing up a little RAM. + * + * @param context The context object, which uniquely identifies a GL context. If context is null, the native stubs are + * unloaded. + * + * @throws org.lwjgl.LWJGLException if context non-null, and the gl library can't be loaded or the basic GL11 functions can't be loaded + */ + public static synchronized void useContext(Object context) throws LWJGLException { + if ( context == null ) { + // Moved this to the shutdown hook + ContextCapabilities.unloadAllStubs(); + setCapabilities(null); + if ( did_auto_load ) + unloadOpenGLLibrary(); + return; + } + + if ( gl_ref_count == 0 ) { + loadOpenGLLibrary(); + did_auto_load = true; + } + + try { + ContextCapabilities capabilities = capability_cache.get(context); + if ( capabilities == null ) { + /* + * The capabilities object registers itself as current. This behaviour is caused + * by a chicken-and-egg situation where the constructor needs to call GL functions + * as part of its capability discovery, but GL functions cannot be called before + * a capabilities object has been set. + */ + new ContextCapabilities(); + capability_cache.put(context, getCapabilities()); + } else + setCapabilities(capabilities); + } catch (LWJGLException e) { + if ( did_auto_load ) + unloadOpenGLLibrary(); + throw e; + + } + } + + /** If the OpenGL reference count is 0, the library is loaded. The reference count is then incremented. */ + public static synchronized void loadOpenGLLibrary() throws LWJGLException { + if ( gl_ref_count == 0 ) + nLoadOpenGLLibrary(); + gl_ref_count++; + } + + private static native void nLoadOpenGLLibrary() throws LWJGLException; + + /** The OpenGL library reference count is decremented, and if it reaches 0, the library is unloaded. */ + public static synchronized void unloadOpenGLLibrary() { + gl_ref_count--; + /* + * Unload the native OpenGL library unless we're on linux, since + * some drivers (NVIDIA proprietary) crash on exit when unloading the library. + */ + if ( gl_ref_count == 0 && LWJGLUtil.getPlatform() != LWJGLUtil.PLATFORM_LINUX ) + nUnloadOpenGLLibrary(); + } + + private static native void nUnloadOpenGLLibrary(); + + /** Native method to clear native stub bindings */ + static native void resetNativeStubs(Class clazz); + + private static final class CapabilitiesCacheEntry { + + Thread owner; + ContextCapabilities capabilities; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLSync.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLSync.java new file mode 100644 index 0000000..05c343e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/GLSync.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * This class is a wrapper around a GLsync pointer. + * + * @author spasi <spasi@users.sourceforge.net> + */ +public final class GLSync extends PointerWrapperAbstract { + + GLSync(final long sync) { + super(sync); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/KHRDebugCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/KHRDebugCallback.java new file mode 100644 index 0000000..4762e74 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/KHRDebugCallback.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.PointerWrapperAbstract; + +/** + * Instances of this class are needed to use the callback functionality of the KHR_debug extension. + * Users of this class may provide implementations of the {@code Handler} interface to receive notifications. + * The same {@code Handler} instance may be used by different contexts but it is not recommended. + * Handler notifications are synchronized. + * + * @author Spasi + */ +public final class KHRDebugCallback extends PointerWrapperAbstract { + + /** Severity levels. */ + private static final int + GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Sources. */ + private static final int + GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** Types. */ + private static final int + GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + private static final long CALLBACK_POINTER; + + static { + long pointer = 0; + try { + // Call reflectively so that we can compile this class for the Generator. + pointer = (Long)Class.forName("org.lwjgl.opengles.CallbackUtil").getDeclaredMethod("getDebugCallbackKHR").invoke(null); + } catch (Exception e) { + // ignore + } + CALLBACK_POINTER = pointer; + } + + private final Handler handler; + + /** + * Creates an KHRebugCallback with a default callback handler. + * The default handler will simply print the message on System.err. + */ + public KHRDebugCallback() { + this(new Handler() { + public void handleMessage(final int source, final int type, final int id, final int severity, final String message) { + System.err.println("[LWJGL] KHR_debug message"); + System.err.println("\tID: " + id); + + String description; + switch ( source ) { + case GL_DEBUG_SOURCE_API: + description = "API"; + break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + description = "WINDOW SYSTEM"; + break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + description = "SHADER COMPILER"; + break; + case GL_DEBUG_SOURCE_THIRD_PARTY: + description = "THIRD PARTY"; + break; + case GL_DEBUG_SOURCE_APPLICATION: + description = "APPLICATION"; + break; + case GL_DEBUG_SOURCE_OTHER: + description = "OTHER"; + break; + default: + description = "Unknown (" + Integer.toHexString(source) + ")"; + } + System.err.println("\tSource: " + description); + + switch ( type ) { + case GL_DEBUG_TYPE_ERROR: + description = "ERROR"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + description = "DEPRECATED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + description = "UNDEFINED BEHAVIOR"; + break; + case GL_DEBUG_TYPE_PORTABILITY: + description = "PORTABILITY"; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + description = "PERFORMANCE"; + break; + case GL_DEBUG_TYPE_OTHER: + description = "OTHER"; + break; + case GL_DEBUG_TYPE_MARKER: + description = "MARKER"; + break; + default: + description = "Unknown (" + Integer.toHexString(source) + ")"; + } + System.err.println("\tType: " + description); + + switch ( severity ) { + case GL_DEBUG_SEVERITY_HIGH: + description = "HIGH"; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + description = "MEDIUM"; + break; + case GL_DEBUG_SEVERITY_LOW: + description = "LOW"; + break; + case GL_DEBUG_SEVERITY_NOTIFICATION: + description = "NOTIFICATION"; + break; + default: + description = "Unknown (" + Integer.toHexString(source) + ")"; + } + System.err.println("\tSeverity: " + description); + + System.err.println("\tMessage: " + message); + } + }); + } + + /** + * Creates an ARBDebugOutputCallback with the specified callback handler. + * The handler's {@code handleMessage} method will be called whenever + * debug output is generated by the GL. + * + * @param handler the callback handler + */ + public KHRDebugCallback(final Handler handler) { + super(CALLBACK_POINTER); + + this.handler = handler; + } + + Handler getHandler() { + return handler; + } + + /** Implementations of this interface can be used to receive ARB_debug_output notifications. */ + public interface Handler { + + /** + * This method will be called when an ARB_debug_output message is generated. + * + * @param id the message ID + * @param source the message source + * @param type the message type + * @param severity the message severity + * @param message the string representation of the message. + */ + void handleMessage(int source, int type, int id, int severity, String message); + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PeerInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PeerInfo.java new file mode 100644 index 0000000..c6d766e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PeerInfo.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3418 $ + * $Id: PeerInfo.java 3418 2010-09-28 21:11:35Z spasi $ + */ +abstract class PeerInfo { + private final ByteBuffer handle; + private Thread locking_thread; // Thread that has locked this PeerInfo + private int lock_count; + + protected PeerInfo(ByteBuffer handle) { + this.handle = handle; + } + + private void lockAndInitHandle() throws LWJGLException { + doLockAndInitHandle(); + } + + public final synchronized void unlock() throws LWJGLException { + if (lock_count <= 0) + throw new IllegalStateException("PeerInfo not locked!"); + if (Thread.currentThread() != locking_thread) + throw new IllegalStateException("PeerInfo already locked by " + locking_thread); + lock_count--; + if (lock_count == 0) { + doUnlock(); + locking_thread = null; + notify(); + } + } + + protected abstract void doLockAndInitHandle() throws LWJGLException; + protected abstract void doUnlock() throws LWJGLException; + + public final synchronized ByteBuffer lockAndGetHandle() throws LWJGLException { + Thread this_thread = Thread.currentThread(); + while (locking_thread != null && locking_thread != this_thread) { + try { + wait(); + } catch (InterruptedException e) { + LWJGLUtil.log("Interrupted while waiting for PeerInfo lock: " + e); + } + } + if (lock_count == 0) { + locking_thread = this_thread; + doLockAndInitHandle(); + } + lock_count++; + return getHandle(); + } + + final ByteBuffer getHandle() { + return handle; + } + + public void destroy() { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PixelFormat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PixelFormat.java new file mode 100644 index 0000000..0451898 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PixelFormat.java @@ -0,0 +1,767 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.opengl.PixelFormatLWJGL; + +import java.nio.IntBuffer; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import static org.lwjgl.opengles.EGL.*; +import static org.lwjgl.opengles.NVCoverageSample.*; +import static org.lwjgl.opengles.NVDepthNonlinear.*; +import static org.lwjgl.opengles.PixelFormat.Attrib.*; + +/** + * This class describes the configuration settings for an EGL surface. Instances + * of this class are used as arguments to Display.create(). The attributes specified + * in this class will be used to get EGLConfigs from an EGLDisplay. PixelFormat + * is not the best name for this class, but it matches the corresponding class + * in the official desktop LWJGL. + * <p/> + * Instances of this class are immutable. An example of the expected way to set + * the PixelFormat property values is the following: + * <code>PixelFormat pf = new PixelFormat().withDepth(24).withSamples(4);</code> + * <p/> + * Attributes that correspond to EGL extensions will be silently ignored if those + * extensions are not supported by the EGLDisplay. + */ +public final class PixelFormat implements PixelFormatLWJGL { + + public static enum Attrib { + // CORE ATTRIBUTES + + RED_SIZE(EGL_RED_SIZE, 0), + GREEN_SIZE(EGL_GREEN_SIZE, 0), + BLUE_SIZE(EGL_BLUE_SIZE, 0), + ALPHA_SIZE(EGL_ALPHA_SIZE, 0), + + LUMINANCE_SIZE(EGL_LUMINANCE_SIZE, 0), + + DEPTH_SIZE(EGL_DEPTH_SIZE, 0), + STENCIL_SIZE(EGL_STENCIL_SIZE, 0), + + MIN_SWAP_INTERVAL(EGL_MIN_SWAP_INTERVAL, EGL_DONT_CARE), + MAX_SWAP_INTERVAL(EGL_MAX_SWAP_INTERVAL, EGL_DONT_CARE), + + SAMPLES(EGL_SAMPLES, 0), + SAMPLE_BUFFERS(EGL_SAMPLE_BUFFERS, 0), + + TRANSPARENT_TYPE(EGL_TRANSPARENT_TYPE, EGL_NONE), + TRANSPARENT_RED_VALUE(EGL_TRANSPARENT_RED_VALUE, EGL_DONT_CARE), + TRANSPARENT_GREEN_VALUE(EGL_TRANSPARENT_GREEN_VALUE, EGL_DONT_CARE), + TRANSPARENT_BLUE_VALUE(EGL_TRANSPARENT_BLUE_VALUE, EGL_DONT_CARE), + + // SURFACE ATTRIBUTES + + MULTISAMPLE_RESOLVE(EGL_MULTISAMPLE_RESOLVE, EGL_MULTISAMPLE_RESOLVE_DEFAULT, true), + SWAP_BEHAVIOR(EGL_SWAP_BEHAVIOR, EGL_DONT_CARE, true), + + // EXTENSION ATTRIBUTES + + COVERAGE_SAMPLES_NV(EGL_COVERAGE_SAMPLES_NV, 0), + COVERAGE_BUFFERS_NV(EGL_COVERAGE_BUFFERS_NV, 0), + + DEPTH_ENCODING_NONLINEAR_NV(EGL_DEPTH_ENCODING_NONLINEAR_NV, EGL_DONT_CARE); + + private final int eglAttrib; + private final int defaultValue; + + private final boolean surfaceAttrib; + + Attrib(final int eglAttrib, final int defaultValue) { + this(eglAttrib, defaultValue, false); + } + + Attrib(final int eglAttrib, final int defaultValue, final boolean surfaceAttrib) { + this.eglAttrib = eglAttrib; + this.defaultValue = defaultValue; + + this.surfaceAttrib = surfaceAttrib; + } + + /** + * Returns the EGL token that corresponds to this attribute. + * + * @return the EGL attribute token + */ + public int getEGLAttrib() { + return eglAttrib; + } + + /** + * Returns the default value of this attribute. Attributes + * with default values will be ignored when choosing the EGLConfig. + * + * @return the default value + */ + public int getDefaultValue() { + return defaultValue; + } + + public boolean isSurfaceAttrib() { + return surfaceAttrib; + } + + } + + private final Map<Attrib, Integer> config = new HashMap<Attrib, Integer>(16); + + /** + * Creates a new PixelFormat with rgbSize = 8, alphaSize = 8 and depthSize = 16. + * + * @see #PixelFormat(int, int, int, int, int, int) + */ + public PixelFormat() { + this(8, 16, 0); + } + + /** + * Creates a new PixelFormat with rgbSize = 8 and the specified + * alphaSize, depthSize and stencilSize. + * + * @param alphaSize the EGL_ALPHA_SIZE value + * @param depthSize the EGL_DEPTH_SIZE value + * @param stencilSize the EGL_STENCIL_SIZE value + * + * @see #PixelFormat(int, int, int, int, int, int) + */ + public PixelFormat(int alphaSize, int depthSize, int stencilSize) { + this(alphaSize, depthSize, stencilSize, 0); + } + + /** + * Creates a new PixelFormat with rgbSize = 8 and the specified + * alphaSize, depthSize, stencilSize and samples. + * + * @param alphaSize the EGL_ALPHA_SIZE value + * @param depthSize the EGL_DEPTH_SIZE value + * @param stencilSize the EGL_STENCIL_SIZE value + * @param samples the EGL_SAMPLE_SIZE value + * + * @see #PixelFormat(int, int, int, int, int, int) + */ + public PixelFormat(int alphaSize, int depthSize, int stencilSize, int samples) { + this(8, alphaSize, 0, depthSize, stencilSize, samples); + } + + /** + * Creates a new PixelFormat with the specified RGB sizes, EGL_ALPHA_SIZE, + * EGL_LUMINANCE_SIZE, EGL_DEPTH_SIZE, EGL_STENCIL_SIZE, EGL_SAMPLES. + * All values must be greater than or equal to 0. rgbSize and luminanceSize + * cannot both be greater than 0. depthSize greater than 24 and stencilSize + * greater than 8 are not recommended. + * The corresponding EGL_SAMPLE_BUFFERS value will become 0 if samples is 0, + * or 1 if samples is greater than 0. + * + * @param rgbSize the RGB sizes + * @param alphaSize the EGL_ALPHA_SIZE value + * @param luminanceSize the EGL_LUMINANCE_SIZE value + * @param depthSize the EGL_DEPTH_SIZE value + * @param stencilSize the EGL_STENCIL_SIZE value + * @param samples the EGL_SAMPLE_SIZE value + */ + public PixelFormat(int rgbSize, int alphaSize, int luminanceSize, int depthSize, int stencilSize, int samples) { + if ( rgbSize < 0 ) + throw new IllegalArgumentException("Invalid RGB size specified: " + rgbSize); + + if ( alphaSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_ALPHA_SIZE specified: " + alphaSize); + + if ( luminanceSize < 0 || (0 < luminanceSize && 0 < rgbSize) ) + throw new IllegalArgumentException("Invalid EGL_LUMINANCE_SIZE specified: " + luminanceSize); + + if ( depthSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_DEPTH_SIZE specified: " + depthSize); + + if ( stencilSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_STENCIL_SIZE specified: " + stencilSize); + + if ( samples < 0 ) + throw new IllegalArgumentException("Invalid EGL_SAMPLES specified: " + samples); + + if ( 0 < rgbSize ) { + setAttrib(RED_SIZE, rgbSize); + setAttrib(GREEN_SIZE, rgbSize); + setAttrib(BLUE_SIZE, rgbSize); + } + setAttrib(ALPHA_SIZE, alphaSize); + + setAttrib(LUMINANCE_SIZE, luminanceSize); + + setAttrib(DEPTH_SIZE, depthSize); + setAttrib(STENCIL_SIZE, stencilSize); + + setAttrib(SAMPLES, samples); + setAttrib(SAMPLE_BUFFERS, samples == 0 ? 0 : 1); + } + + /** + * Creates a new PixelFormat that is a copy of the specified PixelFormat. + * + * @param pf the source PixelFormat + */ + private PixelFormat(final PixelFormat pf) { + config.clear(); + config.putAll(pf.config); + } + + /** + * Sets the value of an attribute to the current configuration. + * If the value matches the default attribute value, the + * attribute will be removed from the configuration. + * + * @param attrib the attribute + * @param value the new value + */ + private void setAttrib(final Attrib attrib, final int value) { + if ( attrib.defaultValue == value ) + config.remove(attrib); + else + config.put(attrib, value); + } + + /** + * Returns an IntBuffer that can be used to get/choose EGLConfigs. + * The contents of the IntBuffer will be the sum of the source + * LWJGL attributes and the user-defined attributes from this + * PixelFormat's configuration. + * <p/> + * The source LWJGL attributes should not contain the EGL_SURFACE_TYPE + * attirube, or any attributes that are handled by PixelFormat. + * <p/> + * Attributes that correspond to EGL extensions will be checked + * against the extensions supported in the specified EGLDisplay. + * Attributes that correspond to unsupported extensions will not + * be included in the final EGLConfig query. + * + * @param display the EGL display from which the EGLConfig is going to be retrieved + * @param lwjglAttribs the LWJGL attributes + * + * @return the IntBuffer + */ + public IntBuffer getAttribBuffer(final EGLDisplay display, int surfaceType, final int[] lwjglAttribs) { + // Create a copy of the configuration attributes + Set<Attrib> keys = new HashSet<Attrib>(config.keySet()); + + // Handle surface type bits + if ( keys.contains(MULTISAMPLE_RESOLVE) ) { + if ( display.getMajorVersion() == 1 && display.getMinorVersion() < 4 ) + keys.remove(MULTISAMPLE_RESOLVE); + else if ( getAttrib(MULTISAMPLE_RESOLVE) == EGL_MULTISAMPLE_RESOLVE_BOX ) + surfaceType |= EGL_MULTISAMPLE_RESOLVE_BOX_BIT; + } + + if ( keys.contains(SWAP_BEHAVIOR) ) { + if ( display.getMajorVersion() == 1 && display.getMinorVersion() < 4 ) + keys.remove(SWAP_BEHAVIOR); + else if ( getAttrib(SWAP_BEHAVIOR) == EGL_BUFFER_PRESERVED ) + surfaceType |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT; + } + + // Check NV_coverage_sample + if ( keys.contains(COVERAGE_BUFFERS_NV) && !display.isExtensionSupported("EGL_NV_coverage_sample") ) { + keys.remove(COVERAGE_BUFFERS_NV); + keys.remove(COVERAGE_SAMPLES_NV); + } + + // Check NV_depth_nonlinear + if ( keys.contains(DEPTH_ENCODING_NONLINEAR_NV) && !display.isExtensionSupported("EGL_NV_depth_nonlinear") ) + keys.remove(DEPTH_ENCODING_NONLINEAR_NV); + + // Create IntBuffer and insert the attributes + final IntBuffer attribs = BufferUtils.createIntBuffer( + 2 // SURFACE_TYPE + + lwjglAttribs.length // Source LWJGL attributes + + (keys.size() * 2) // PixelFormat attributes + + 1 // Termination + ); + + attribs.put(EGL_SURFACE_TYPE).put(surfaceType); + attribs.put(lwjglAttribs); + + for ( Attrib key : keys ) { + if ( !key.isSurfaceAttrib() ) + attribs.put(key.eglAttrib).put(config.get(key)); + } + + // Finish the attribute list + attribs.put(EGL_NONE); + attribs.flip(); + + return attribs; + } + + /** + * Returns true if the requested attribute matches the attribute in the specified EGL config. + * + * @param attrib the requested attribute + * @param config the EGL config + * + * @return true if the two attributes match + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + private boolean matches(final Attrib attrib, final EGLConfig config) throws LWJGLException { + return getAttrib(attrib) == config.getAttribute(attrib.getEGLAttrib()); + } + + /** + * Returns true if the requested attribute matches the attribute in the specified EGL config. + * If the requested attribute is equal to 1, then it will match with any EGL config attribute + * that is greater than 0. + * + * @param attrib the requested attribute + * @param config the EGL config + * + * @return true if the two attributes match + * + * @throws org.lwjgl.LWJGLException if an EGL error occurs + */ + private boolean matchesNonZero(final Attrib attrib, final EGLConfig config) throws LWJGLException { + final int reqValue = getAttrib(attrib); + final int cfgValue = config.getAttribute(attrib.getEGLAttrib()); + + return reqValue == cfgValue || (reqValue == 1 && cfgValue > 0); + } + + /** + * Returns the EGL config from the specified array that best matches this PixelFormat. + * + * @param configs the EGL configs + * + * @return the best match + */ + public EGLConfig getBestMatch(final EGLConfig[] configs) throws LWJGLException { + if ( configs == null || configs.length == 0 ) + throw new IllegalArgumentException("No EGLConfigs specified."); + + if ( configs.length == 1 ) + return configs[0]; + + /*System.out.println("\nASKED FOR:"); + for ( Attrib attrib : config.keySet() ) { + System.out.println("EGL_" + attrib.name() + ": " + getAttrib(attrib)); + } + + for ( EGLConfig config : configs ) { + if ( config == null ) + continue; + + System.out.println("\n----"); + System.out.println(config); + }*/ + + for ( EGLConfig config : configs ) { + if ( config == null ) + continue; + + if ( !(matches(ALPHA_SIZE, config) && matchesNonZero(DEPTH_SIZE, config) && matchesNonZero(STENCIL_SIZE, config)) ) + continue; + + final int luminance = getAttrib(LUMINANCE_SIZE); + if ( 0 < luminance && !matches(LUMINANCE_SIZE, config) ) + continue; + + if ( luminance == 0 && !(matches(RED_SIZE, config) && matches(GREEN_SIZE, config) && matches(BLUE_SIZE, config)) ) + continue; + + if ( !(matches(SAMPLE_BUFFERS, config) && matches(SAMPLES, config)) ) + continue; + + // TODO: Add more? NV's Tegra SDK checks a hardcoded 5 value for COVERAGE_SAMPLES_NV (nv_main.c, line: 1823) + + return config; + } + + // No match found, use the one recommended by the EGL implementation. + LWJGLUtil.log("Could not find an exact EGLConfig match for the PixelFormat requested, using first returned."); + return configs[0]; + } + + /** + * Applies this PixelFormat's surface attributes to the specified EGL surface. + * + * @param surface the EGL surface + */ + public void setSurfaceAttribs(final EGLSurface surface) throws LWJGLException { + setSurfaceAttrib(surface, SWAP_BEHAVIOR); + setSurfaceAttrib(surface, MULTISAMPLE_RESOLVE); + } + + private void setSurfaceAttrib(final EGLSurface surface, final Attrib attrib) throws LWJGLException { + final int value = getAttrib(attrib); + if ( value != attrib.getDefaultValue() ) + surface.setAttribute(attrib.getEGLAttrib(), value); + } + + /** + * Returns the value of the specified attribute. + * + * @param attrib the attribute to retrieve + * + * @return the attribute's value + */ + public int getAttrib(final Attrib attrib) { + final Integer value = config.get(attrib); + if ( value == null ) + return attrib.defaultValue; + + return value; + } + + /* ----------------------------------------- + CORE ATTRIBUTES + ----------------------------------------- */ + + /** + * Returns a new PixelFormat with the specified RGB sizes. + * + * @param rgb the new EGL_RED_SIZE, EGL_GREEN_SIZE and EGL_BLUE_SIZE + * + * @return the new PixelFormat + * + * @see #withRGBSize(int, int, int) + */ + public PixelFormat withRGBSize(final int rgb) { + return withRGBSize(rgb, rgb, rgb); + } + + /** + * Returns a new PixelFormat with the specified EGL_RED_SIZE, EGL_GREEN_SIZE and EGL_BLUE_SIZE. + * All 3 values must be greater than or equal to 0. If any of the 3 values is greater than 0, + * the luminanceSize will be set to 0. + * + * @param r the new EGL_RED_SIZE + * @param g the new EGL_GREEN_SIZE + * @param b the new EGL_BLUE_SIZE + * + * @return the new PixelFormat + */ + public PixelFormat withRGBSize(final int r, final int g, final int b) { + if ( r < 0 || g < 0 || b < 0 ) + throw new IllegalArgumentException("Invalid RGB sizes specified: " + r + ", " + g + ", " + b); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(RED_SIZE, r); + pf.setAttrib(GREEN_SIZE, g); + pf.setAttrib(BLUE_SIZE, b); + if ( 0 < r || 0 < g || 0 < b ) + pf.setAttrib(LUMINANCE_SIZE, 0); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_ALPHA_SIZE. + * The alphaSize value must be greater than or equal to 0. + * + * @param alphaSize the new EGL_ALPHA_SIZE + * + * @return the new PixelFormat + */ + public PixelFormat withAlphaSize(final int alphaSize) { + if ( alphaSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_ALPHA_SIZE specified: " + alphaSize); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(ALPHA_SIZE, alphaSize); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_LUMINANCE_SIZE. + * The luminanceSize value must be greater than or equal to 0. If + * luminanceSize is greater than 0, the RGB sizes will be set to 0. + * + * @param luminanceSize the new EGL_LUMINANCE_SIZE + * + * @return the new PixelFormat + */ + public PixelFormat withLuminanceSize(final int luminanceSize) { + if ( luminanceSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_LUMINANCE_SIZE specified: " + luminanceSize); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(LUMINANCE_SIZE, luminanceSize); + if ( 0 < luminanceSize ) { + pf.setAttrib(RED_SIZE, 0); + pf.setAttrib(GREEN_SIZE, 0); + pf.setAttrib(BLUE_SIZE, 0); + } + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_DEPTH_SIZE. + * The depthSize value must be greater than or equal to 0. + * Values greater than 24 are not recommended. + * + * @param depthSize the new EGL_DEPTH_SIZE + * + * @return the new PixelFormat + */ + public PixelFormat withDepthSize(final int depthSize) { + if ( depthSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_DEPTH_SIZE specified: " + depthSize); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(DEPTH_SIZE, depthSize); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_STENCIL_SIZE. + * The stencilSize value must be greater than or equal to 0. + * Values greater than 8 are not recommended. + * + * @param stencilSize the new EGL_STENCIL_SIZE + * + * @return the new PixelFormat + */ + public PixelFormat withStencilSize(final int stencilSize) { + if ( stencilSize < 0 ) + throw new IllegalArgumentException("Invalid EGL_STENCIL_SIZE specified: " + stencilSize); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(STENCIL_SIZE, stencilSize); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_MIN_SWAP_INTERVAL. + * The minSwapInterval value must be between 0 and this PixelFormat's EGL_MAX_SWAP_INTERVAL. + * + * @param minSwapInterval the new EGL_MIN_SWAP_INTERVAL value + * + * @return the new PixelFormat + */ + public PixelFormat withMinSwapInterval(final int minSwapInterval) { + final int maxSwapInterval = getAttrib(MAX_SWAP_INTERVAL); + if ( minSwapInterval != EGL_DONT_CARE && (minSwapInterval < 0 || (maxSwapInterval != EGL_DONT_CARE && maxSwapInterval < minSwapInterval)) ) + throw new IllegalArgumentException("Invalid EGL_MIN_SWAP_INTERVAL specified: " + minSwapInterval); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(MIN_SWAP_INTERVAL, minSwapInterval); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_MAX_SWAP_INTERVAL. + * The maxSwapInterval value must be greater than or equal to this PixelFormat's EGL_MIN_SWAP_INTERVAL. + * + * @param maxSwapInterval the new EGL_MAX_SWAP_INTERVAL value + * + * @return the new PixelFormat + */ + public PixelFormat withMaxSwapInterval(final int maxSwapInterval) { + if ( maxSwapInterval < getAttrib(MIN_SWAP_INTERVAL) ) + throw new IllegalArgumentException("Invalid EGL_MAX_SWAP_INTERVAL specified: " + maxSwapInterval); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(MAX_SWAP_INTERVAL, maxSwapInterval); + return pf; + } + + /** + * Returns a new PixelFormat with the specified number of EGL_SAMPLES. + * The samples value must be either 0 or greater than or equal to 2. The related + * EGL_SAMPLE_BUFFERS value will become 0 if samples is 0, or 1 if samples + * is greater than or equal to 2. + * + * @param samples the new EGL_SAMPLES value + * + * @return the new PixelFormat + */ + public PixelFormat withSamples(final int samples) { + if ( samples != 0 && samples < 2 ) + throw new IllegalArgumentException("Invalid number of EGL_SAMPLES specified: " + samples); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(SAMPLES, samples); + pf.setAttrib(SAMPLE_BUFFERS, samples == 0 ? 0 : 1); + return pf; + } + + private static int maxValue(final int bits) { + return (2 << bits) - 1; + } + + /** + * Returns a new PixelFormat with the specified EGL_TRANSPARENT_TYPE and + * the specified transparent RGB values. The transparentType must be + * either EGL_NONE or EGL_TRANSPARENT_RGB. When it is EGL_NONE, the RGB + * values are set to zero and ignored. When it is EGL_TRANSPARENT_RGB, + * the RGB values must be between 0 and 2^rgbSize - 1. + * + * @param transparentType the new EGL_TRANSPARENT_TYPE value + * @param r the new EGL_TRANSPARENT_RED_VALUE + * @param g the new EGL_TRANSPARENT_GREEN_VALUE + * @param b the new EGL_TRANSPARENT_BLUE_VALUE + * + * @return the new PixelFormat + */ + public PixelFormat withTransparentType(final int transparentType, int r, int g, int b) { + if ( transparentType == EGL_TRANSPARENT_RGB ) { + final int redSize = getAttrib(RED_SIZE); + final int greenSize = getAttrib(GREEN_SIZE); + final int blueSize = getAttrib(BLUE_SIZE); + if ( r < 0 || (0 < redSize && maxValue(redSize) < r) ) + throw new IllegalArgumentException("Invalid EGL_TRANSPARENT_RED_VALUE specified: " + r); + + if ( r < 0 || (0 < greenSize && maxValue(greenSize) < g) ) + throw new IllegalArgumentException("Invalid EGL_TRANSPARENT_GREEN_VALUE specified: " + g); + + if ( r < 0 || (0 < blueSize && maxValue(blueSize) < b) ) + throw new IllegalArgumentException("Invalid EGL_TRANSPARENT_BLUE_VALUE specified: " + b); + } else if ( transparentType != EGL_NONE ) + throw new IllegalArgumentException("Invalid EGL_TRANSPARENT_TYPE specified: " + transparentType); + else + r = g = b = EGL_DONT_CARE; + + final PixelFormat pf = new PixelFormat(this); + + pf.setAttrib(TRANSPARENT_TYPE, transparentType); + + pf.setAttrib(TRANSPARENT_RED_VALUE, r); + pf.setAttrib(TRANSPARENT_GREEN_VALUE, g); + pf.setAttrib(TRANSPARENT_BLUE_VALUE, b); + + return pf; + } + + /* ----------------------------------------- + SURFACE ATTRIBUTES + ----------------------------------------- */ + + /** + * Returns a new PixelFormat with the specified EGL_MULTISAMPLE_RESOLVE value. + * Valid values for multisampleResolve are EGL_MULTISAMPLE_RESOLVE_DEFAULT + * and EGL_MULTISAMPLE_RESOLVE_BOX. + * <p/> + * An IllegalStateException will be thrown if EGL_SAMPLES has not been previously defined + * to be greater than or equal to 2. + * + * @param multisampleResolve the new EGL_MULTISAMPLE_RESOLVE value + * + * @return the new PixelFormat + */ + public PixelFormat withMultisampleResolve(final int multisampleResolve) { + if ( multisampleResolve != EGL_MULTISAMPLE_RESOLVE_DEFAULT && multisampleResolve != EGL_MULTISAMPLE_RESOLVE_BOX ) + throw new IllegalArgumentException("Invalid EGL_MULTISAMPLE_RESOLVE value specified: " + multisampleResolve); + + if ( getAttrib(SAMPLE_BUFFERS) == 0 ) + throw new IllegalStateException("An EGL_MULTISAMPLE_RESOLVE value cannot be specified unless EGL_SAMPLE_BUFFERS is 1."); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(MULTISAMPLE_RESOLVE, multisampleResolve); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_SWAP_BEHAVIOR value. + * Valid values for swapBehavior are EGL_DONT_CARE, EGL_BUFFER_PRESERVED + * and EGL_BUFFER_DESTROYED. + * + * @param swapBehavior the new EGL_SWAP_BEHAVIOR value + * + * @return the new PixelFormat + */ + public PixelFormat withSwapBehavior(final int swapBehavior) { + switch ( swapBehavior ) { + case EGL_DONT_CARE: + case EGL_BUFFER_PRESERVED: + case EGL_BUFFER_DESTROYED: + break; + default: + throw new IllegalArgumentException("Invalid EGL_SWAP_BEHAVIOR value specified: " + swapBehavior); + } + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(SWAP_BEHAVIOR, swapBehavior); + return pf; + } + + /* ----------------------------------------- + EXTENSION ATTRIBUTES + ----------------------------------------- */ + + /** + * Returns a new PixelFormat with the specified number of EGL_COVERAGE_SAMPLES_NV. + * The samples value must be greater than or equal to 0. The related + * EGL_COVERAGE_BUFFERS_NV value will become 0 if samples is 0, or 1 if samples + * is greater than 0. + * + * @param samples the new EGL_SAMPLES value + * + * @return the new PixelFormat + */ + public PixelFormat withCoverageSamplesNV(final int samples) { + if ( samples < 0 ) + throw new IllegalArgumentException("Invalid number of EGL_COVERAGE_SAMPLES_NV specified: " + samples); + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(COVERAGE_SAMPLES_NV, samples); + pf.setAttrib(COVERAGE_BUFFERS_NV, samples == 0 ? 0 : 1); + return pf; + } + + /** + * Returns a new PixelFormat with the specified EGL_DEPTH_ENCODING_NONLINEAR_NV. + * Valid values for depthEncoding are EGL_DONT_CARE, EGL_DEPTH_ENCODING_NONE_NV + * and EGL_DEPTH_ENCODING_NONLINEAR_NV. + * + * @param depthEncoding the new EGL_DEPTH_ENCODING_NONLINEAR_NV value + * + * @return the new PixelFormat + */ + public PixelFormat withDepthEncodingNonlinearNV(final int depthEncoding) { + switch ( depthEncoding ) { + case EGL_DONT_CARE: + case EGL_DEPTH_ENCODING_NONE_NV: + case EGL_DEPTH_ENCODING_NONLINEAR_NV: + break; + default: + throw new IllegalArgumentException("Invalid EGL_DEPTH_ENCODING_NONLINEAR_NV value specified: " + depthEncoding); + } + + final PixelFormat pf = new PixelFormat(this); + pf.setAttrib(DEPTH_ENCODING_NONLINEAR_NV, depthEncoding); + return pf; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PowerManagementEventException.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PowerManagementEventException.java new file mode 100644 index 0000000..fc4083b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/PowerManagementEventException.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +/** + * A PowerManagementEventException exception will be thrown when a call + * to eglSwapBuffers, eglCopyBuffers or eglMakeCurrent returns EGL_FALSE + * and the EGL_ERROR generated is EGL_CONTEXT_LOST. + * <p/> + * On detection of this error, the application must destroy all contexts. + * To continue rendering the application must recreate any contexts it + * requires, and subsequently restore any client API state and objects + * it wishes to use. + * <p/> + * Note that not all implementations can be made to generate power management + * events, and developers should continue to refer to platform-specific + * documentation in this area. + */ +public class PowerManagementEventException extends RuntimeException { + + static final long serialVersionUID = -1L; + + public PowerManagementEventException() { + super(); + } + + public PowerManagementEventException(final String message) { + super(message); + } + + public PowerManagementEventException(final String message, final Throwable cause) { + super(message, cause); + } + + public PowerManagementEventException(final Throwable cause) { + super(cause); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/StateTracker.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/StateTracker.java new file mode 100644 index 0000000..2235871 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/StateTracker.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import java.nio.Buffer; +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.opengles.GLES30.*; + +final class StateTracker { + + private static StateTracker tracker = new StateTracker(); + + int elementArrayBuffer; + int arrayBuffer; + int pixelPackBuffer; + int pixelUnpackBuffer; + + Buffer[] glVertexAttribPointer_buffer; + + private final FastIntMap<VAOState> vaoMap = new FastIntMap<VAOState>(); + + int vertexArrayObject; + + StateTracker() { + } + + void init() { + glVertexAttribPointer_buffer = new Buffer[glGetInteger(GL_MAX_VERTEX_ATTRIBS)]; + } + + static StateTracker getTracker() { + return tracker; + } + + static void bindBuffer(int target, int buffer) { + final StateTracker tracker = getTracker(); + + switch ( target ) { + case GL_ARRAY_BUFFER: + tracker.arrayBuffer = buffer; + break; + case GL_ELEMENT_ARRAY_BUFFER: + tracker.elementArrayBuffer = buffer; + break; + case GL_PIXEL_PACK_BUFFER: + tracker.pixelPackBuffer = buffer; + break; + case GL_PIXEL_UNPACK_BUFFER: + tracker.pixelUnpackBuffer = buffer; + break; + } + } + + static void bindVAO(final int array) { + final FastIntMap<VAOState> vaoMap = tracker.vaoMap; + if ( !vaoMap.containsKey(array) ) + vaoMap.put(array, new VAOState()); + + tracker.vertexArrayObject = array; + } + + static void deleteVAO(final IntBuffer arrays) { + for ( int i = arrays.position(); i < arrays.limit(); i++ ) + deleteVAO(arrays.get(i)); + } + + static void deleteVAO(final int array) { + tracker.vaoMap.remove(array); + + if ( tracker.vertexArrayObject == array ) + tracker.vertexArrayObject = 0; + } + + /** + * Simple class to help us track VAO state. Currently + * only ELEMENT_ARRAY_BUFFER_BINDING is tracked, since + * that's the only state we check from tables 6.6-6.9. + */ + private static class VAOState { + + int elementArrayBuffer; + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/Util.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/Util.java new file mode 100644 index 0000000..98699d8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/opengles/Util.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.OpenGLException; + +import static org.lwjgl.opengles.EGL.*; +import static org.lwjgl.opengles.GLES20.*; + +/** + * Simple utility class. + * + * @author Spasi + */ +public final class Util { + + private Util() { + } + + /** + * Checks for OpenGL ES errors. + * + * @throws org.lwjgl.opengl.OpenGLException + * if GLES20.glGetError() returns anything else than GLES20.GL_NO_ERROR + */ + public static void checkGLError() throws OpenGLException { + int err = glGetError(); + if ( err != GL_NO_ERROR ) + throw new OpenGLException(err); + } + + /** + * Translates a GL error code to a String describing the error. + * + * @param error_code the OpenGL ES error code + * + * @return the error description + */ + public static String translateGLErrorString(int error_code) { + switch ( error_code ) { + case GL_NO_ERROR: + return "No error"; + case GL_INVALID_ENUM: + return "Invalid enum"; + case GL_INVALID_VALUE: + return "Invalid value"; + case GL_INVALID_OPERATION: + return "Invalid operation"; + case GL_OUT_OF_MEMORY: + return "Out of memory"; + default: + return null; + } + } + + /** + * Checks for EGL errors. + * + * @throws org.lwjgl.LWJGLException if EGL.eglGetError() returns anything else than EGL.EGL_SUCCESS + */ + static void checkEGLError() throws LWJGLException { + int err = eglGetError(); + if ( err != EGL_SUCCESS ) + throw new LWJGLException(translateEGLErrorString(err)); + } + + /** + * Translates an EGL error code to a String describing the error. + * + * @param error_code the EGL error code + * + * @return the error description + */ + static String translateEGLErrorString(int error_code) { + switch ( error_code ) { + case EGL_NOT_INITIALIZED: + return "EGL not initialized"; + case EGL_BAD_ACCESS: + return "Bad access"; + case EGL_BAD_ALLOC: + return "Bad allocation"; + case EGL_BAD_ATTRIBUTE: + return "Bad attribute"; + case EGL_BAD_CONFIG: + return "Bad config"; + case EGL_BAD_CONTEXT: + return "Bad EGL context"; + case EGL_BAD_CURRENT_SURFACE: + return "Bad current EGL surface"; + case EGL_BAD_DISPLAY: + return "Bad EGL display"; + case EGL_BAD_MATCH: + return "Bad match"; + case EGL_BAD_NATIVE_PIXMAP: + return "Bad native pixmap"; + case EGL_BAD_NATIVE_WINDOW: + return "Bad native window"; + case EGL_BAD_PARAMETER: + return "Bad parameter"; + case EGL_BAD_SURFACE: + return "Bad EGL surface"; + case EGL_CONTEXT_LOST: + return "EGL context lost"; + default: + return null; + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/DisplayTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/DisplayTest.java new file mode 100644 index 0000000..f0a67ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/DisplayTest.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; + +/** + * <br> + * Test class for Display & DisplayMode + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class DisplayTest { + + /** + * Creates a new DisplayTest + */ + public DisplayTest() { + } + + /** + * Runs the tests + */ + public void executeTest() throws LWJGLException { + currentTest(); + queryModesTest(); + setDisplayModeTest(); + setDisplayConfigurationTest(); + } + + /** + * Prints some info about the current mode + */ + private void currentTest() { + System.out.println("==== Test Current ===="); + + System.out.println("Info about current:"); + System.out.println("Graphics card: " + Display.getAdapter() + ", version: " + Display.getVersion()); + System.out.println("Resolution: " + + Display.getDisplayMode().getWidth() + "x" + + Display.getDisplayMode().getHeight() + "x" + + Display.getDisplayMode().getBitsPerPixel() + "@" + + Display.getDisplayMode().getFrequency() + "Hz"); + System.out.println("---- Test Current ----"); + } + + /** + * Tests querying for modes + */ + private void queryModesTest() throws LWJGLException { + DisplayMode[] modes = null; + + System.out.println("==== Test query ===="); + System.out.println("Retrieving available displaymodes"); + modes = Display.getAvailableDisplayModes(); + + // no modes check + if (modes == null) { + System.out.println("FATAL: unable to find any modes!"); + System.exit(-1); + } + + // write some info + System.out.println("Found " + modes.length + " modes"); + System.out.println("The first 5 are:"); + for(int i=0;i<modes.length; i++) { + System.out.println(modes[i]); + if (i == 5) { + break; + } + } + System.out.println("---- Test query ----"); + } + + + /** + * Tests setting display modes + */ + private void setDisplayModeTest() throws LWJGLException { + DisplayMode mode = null; + DisplayMode[] modes = null; + + System.out.println("==== Test setDisplayMode ===="); + System.out.println("Retrieving available displaymodes"); + modes = Display.getAvailableDisplayModes(); + + // no modes check + if (modes == null) { + System.out.println("FATAL: unable to find any modes!"); + System.exit(-1); + } + + // find a mode + System.out.print("Looking for 640x480..."); + for ( DisplayMode mode1 : modes ) { + if ( mode1.getWidth() == 640 && + mode1.getHeight() == 480 ) { + mode = mode1; + System.out.println("found!"); + break; + } + } + + // no mode check + if (mode == null) { + System.out.println("error\nFATAL: Unable to find basic mode."); + System.exit(-1); + } + + // change to mode, and wait a bit + System.out.print("Changing to mode..."); + try { + Display.setDisplayMode(mode); + Display.setFullscreen(true); + Display.create(); + } catch (Exception e) { + System.out.println("error\nFATAL: Error setting mode"); + System.exit(-1); + } + System.out.println("done"); + + System.out.println("Resolution: " + + Display.getDisplayMode().getWidth() + "x" + + Display.getDisplayMode().getHeight() + "x" + + Display.getDisplayMode().getBitsPerPixel() + "@" + + Display.getDisplayMode().getFrequency() + "Hz"); + + pause(5000); + + // reset + System.out.print("Resetting mode..."); + try { + Display.setFullscreen(false); + } catch (LWJGLException e) { + e.printStackTrace(); + } + System.out.println("done"); + + System.out.println("---- Test setDisplayMode ----"); + } + + /** + * Tests the DisplayConfiguration + */ + private void setDisplayConfigurationTest() { + System.out.println("==== Test setDisplayConfigurationTest ===="); + + System.out.println("Testing normal setting"); + changeConfig(1.0f, 0f, 1f); + + System.out.println("Testing gamma settings"); + changeConfig(5.0f, 0f, 1f); + changeConfig(0.5f, 0f, 1f); + + System.out.println("Testing brightness settings"); + changeConfig(1.0f, -1.0f, 1f); + changeConfig(1.0f, -0.5f, 1f); + changeConfig(1.0f, 0.5f, 1f); + changeConfig(1.0f, 1.0f, 1f); + + System.out.println("Testing contrast settings"); + changeConfig(1.0f, 0f, 0f); + changeConfig(1.0f, 0f, 0.5f); + changeConfig(1.0f, 0f, 10000.0f); + + System.out.print("resetting..."); + try { + Display.setFullscreen(false); + } catch (LWJGLException e) { + e.printStackTrace(); + } + System.out.println("done"); + + System.out.println("---- Test setDisplayConfigurationTest ----"); + } + + /** + * Changes the Displat configuration + * + * @param gamma gamma value to change to + * @param brightness brightness value to change to + * @param contrast contrast value to change to + */ + private void changeConfig(float gamma, float brightness, float contrast) { + try { + Display.setDisplayConfiguration(gamma, brightness, contrast); + System.out.println("Configuration changed, gamma = " + gamma + " brightness = " + brightness + " contrast = " + contrast); + } catch (Exception e) { + System.out.println("Failed on: gamma = " + gamma + " brightness = " + brightness + " contrast = " + contrast); + } + pause(3000); + } + + /** + * Pause current thread for a specified time + * + * @param time milliseconds to sleep + */ + private void pause(long time) { + int SLEEP_DELAY = 100; + for (int i = 0; i < time; i += SLEEP_DELAY) { + try { + Display.processMessages(); + Thread.sleep(SLEEP_DELAY); + } catch (InterruptedException inte) { + } + } + } + + /** + * Tests the Sys class, and serves as basic usage test + * + * @param args ignored + */ + public static void main(String[] args) throws LWJGLException { + new DisplayTest().executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/NativeTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/NativeTest.java new file mode 100644 index 0000000..c9ff73f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/NativeTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test; + +import org.lwjgl.Sys; +import java.awt.Toolkit; + +/** + * <br> + * Simple test that just checks that the native library loads + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2983 $ + * $Id: SysTest.java 2983 2008-04-07 18:36:09Z matzon $ + */ +public class NativeTest { + + public void invokeSys() { + Sys.getVersion(); + } + + /** + * Entry point for test + * + * @param args ignored + */ + public static void main(String[] args) { + // try to "load" awt - work around for headless issue on linux + Toolkit.getDefaultToolkit(); + new NativeTest().invokeSys(); + System.out.println("OK"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/SysTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/SysTest.java new file mode 100644 index 0000000..2accdbc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/SysTest.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; + +/** + * <br> + * Test class for Sys + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class SysTest { + + /** + * Creates a new SysTest + */ + public SysTest() { + } + + /** + * Runs the tests + */ + public void executeTest() { + testAlert(); + testDebug(); + testTimer(); + testUrl(); + testClipboard(); + } + + /** + * Tests debug mode + */ + private void testDebug() { + System.out.println("==== Test Debug ===="); + if (LWJGLUtil.DEBUG) { + LWJGLUtil.log("Debug is enabled, you should now see output from LWJGL during the following tests."); + } else { + System.out.println("Debug is not enabled. Please set the org.lwjgl.Sys.debug property to true to enable debugging"); + System.out.println("Example:\n java -Dorg.lwjgl.util.Debug=true ..."); + System.out.println("You will not see any debug output in the following tests."); + } + + // get some display modes, to force some debug info + try { + Display.getAvailableDisplayModes(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + System.out.println("---- Test Debug ----\n"); + } + + /** + * Tests the timer + */ + private void testTimer() { + long resolution = Sys.getTimerResolution(); + long time = Sys.getTime(); + + System.out.println("==== Test Timer ===="); + System.out.println("Resolution of timer (ticks per second): " + resolution); + System.out.println("Current time: " + time); + System.out.println("Sleeping for 2 seconds, using Thread.sleep()"); + + pause(2000); + + long time2 = Sys.getTime(); + System.out.println("Current time: " + time2); + System.out.println("Actually slept for: " + ((time2 - time) / (float) resolution) + " seconds"); + System.out.println("---- Test Timer ----\n"); + } + + /** + * Tests the alert + */ + private void testAlert() { + System.out.println("==== Test Alert ===="); + + System.out.println("Opening native alert window"); + Sys.alert("SysTest", "Hello World!"); + + System.out.println("---- Test Alert ----\n"); + } + + /** + * Tests the openUrl + */ + private void testUrl() { + System.out.println("==== Test URL ===="); + + System.out.println("Opening a browser window to http://www.lwjgl.org"); + Sys.openURL("http://www.lwjgl.org"); + + System.out.println("---- Test URL ----\n"); + } + + /** + * Busy waits for a specified number of seconds + * + * @param priority Priority to busy wait in + * @param seconds Number of seconds to busy wait + * @param message Message to print to user + */ + private void busyWait(int priority, int seconds, String message) { + long future = Sys.getTime() + (Sys.getTimerResolution() * seconds); + + System.out.print(message); + + // waste some cycles + while (Sys.getTime() < future) { + } + + System.out.println("done"); + } + + /** + * Pause current thread for a specified time + * + * @param time milliseconds to sleep + */ + private void pause(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException inte) { + } + } + + /** + * Tests the clipboard. Helps to have something in it first... + */ + private void testClipboard() { + System.out.println("Contents of clipboard: '"+Sys.getClipboard()+"'"); + } + + /** + * Tests the Sys class, and serves as basic usage test + * + * @param args ignored + */ + public static void main(String[] args) { + new SysTest().executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WaveDataTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WaveDataTest.java new file mode 100644 index 0000000..43abc99 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WaveDataTest.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test; + +import java.io.File; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +import org.lwjgl.LWJGLException; +import org.lwjgl.util.WaveData; + +/** + * <br> + * Test class WaveDataTest + * + * @author Brian Matzon <brian@matzon.dk> + */ +public class WaveDataTest { + + String filePath = "Footsteps.wav"; + + /** + * Creates a new DisplayTest + */ + public WaveDataTest() { + } + + /** + * Runs the tests + */ + public void executeTest() throws LWJGLException { + executeCreationTest(); + executeBrokenCreationTest(); + executeMidStreamCreationTest(); + } + + + private void executeCreationTest() { + WaveData wd = WaveData.create(filePath); + if(wd != null) { + System.out.println("executeCreationTest::success"); + } + } + + private void executeBrokenCreationTest() { + WaveData wd = WaveData.create(""); + if(wd == null) { + System.out.println("executeBrokenCreationTest::success"); + } + } + + private void executeStreamCreationTest() { + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(new File(filePath)); + WaveData wd = WaveData.create(ais); + if(wd == null) { + System.out.println("executeMidStreamCreationTest::success"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void executeMidStreamCreationTest() { + try { + + AudioInputStream ais = AudioSystem.getAudioInputStream(WaveDataTest.class.getClassLoader().getResource(filePath)); + int totalSize = ais.getFormat().getChannels() * (int) ais.getFrameLength() * ais.getFormat().getSampleSizeInBits() / 8; + + // skip 1/4 of the stream + int skip = totalSize / 4; + long skipped = ais.skip(skip); + + WaveData wd = WaveData.create(ais); + if(wd == null) { + System.out.println("executeMidStreamCreationTest::success"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Pause current thread for a specified time + * + * @param time milliseconds to sleep + */ + private void pause(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException inte) { + /* ignored */ + } + } + + /** + * Tests the Sys class, and serves as basic usage test + * + * @param args ignored + */ + public static void main(String[] args) throws LWJGLException { + new WaveDataTest().executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WindowCreationTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WindowCreationTest.java new file mode 100644 index 0000000..8ce779c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/WindowCreationTest.java @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GL11; + +import static org.lwjgl.opengl.GL11.*; + +/** + * Small class for testing that the Window is creatable + * If this class can't run, LWJGL wont work! + * + * @author Brian Matzon <brian@matzon.dk> + */ +public class WindowCreationTest { + + /** Locatable modes */ + private DisplayMode[] located_modes; + + /** Fixed selectable modes */ + private DisplayMode[] fixed_modes = new DisplayMode[10]; + + + /** Window position x */ + private int window_x; + + /** Window position y */ + private int window_y; + + /** Color being cleared to */ + private float color = 0f; + + /** Direction moving clearing color */ + private int direction = 1; + + /** Whether we're running */ + private boolean running; + + /** Whether we're in fullscreen mode */ + private boolean fullscreen; + + /** + * Initializes the test + * @return true if initialization was successfull + */ + public boolean initialize() { + try { + // get available modes, and print out + located_modes = Display.getAvailableDisplayModes(); + System.out.println("Found " + located_modes.length + " display modes"); + + // get 640x480, 800x600, 1024x768 modes + findFixedModes(); + + // create default windowed display 640*480 @ 100, 100 + setDefaultDisplayMode(); + + window_x = window_y = 100; + Display.setLocation(window_x, window_y); + + Display.create(); + return true; + } catch (LWJGLException le) { + le.printStackTrace(); + } + return false; + } + + /** Locate fixed modes */ + private void findFixedModes() { + // get 640*480 modes + fixed_modes[0] = getDisplayMode(640, 480, 16, -1); + fixed_modes[1] = getDisplayMode(640, 480, 24, -1); + fixed_modes[2] = getDisplayMode(640, 480, 32, -1); + + // get 800*600*16*60 + fixed_modes[3] = getDisplayMode(800, 600, 16, -1); + fixed_modes[4] = getDisplayMode(800, 600, 24, -1); + fixed_modes[5] = getDisplayMode(800, 600, 32, -1); + + // get 1024*768*16*60 + fixed_modes[6] = getDisplayMode(1024, 768, 16, -1); + fixed_modes[7] = getDisplayMode(1024, 768, 24, -1); + fixed_modes[8] = getDisplayMode(1024, 768, 32, -1); + } + + /** + * Executes the test + */ + private void execute() { + running = true; + + // wait for user to close window + while (!Display.isCloseRequested() && running) { + + // handle input accordingly + handleInput(); + + // render something + render(); + + // update display as needed + Display.update(); + + // no need to run at full speed + try { + Thread.sleep(100); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * Destroys any resources used while running test + */ + public void destroy() { + // nuke window and get out + Display.destroy(); + } + + /** + * Handles the input + */ + private void handleInput() { + while (Keyboard.next()) { + + // we only want key down events + if (!Keyboard.getEventKeyState()) { + continue; + } + + // check for exit + if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + running = false; + } + + // check for listing of modes + if (Keyboard.getEventKey() == Keyboard.KEY_L) { + for(int i=0;i<fixed_modes.length; i++) { + System.out.println("[" + i + "]: " + fixed_modes[i]); + } + } + + // check for display mode + // ================================ + if (Keyboard.getEventKey() == Keyboard.KEY_0) { setMode(0); } + if (Keyboard.getEventKey() == Keyboard.KEY_1) { setMode(1); } + if (Keyboard.getEventKey() == Keyboard.KEY_2) { setMode(2); } + if (Keyboard.getEventKey() == Keyboard.KEY_3) { setMode(3); } + if (Keyboard.getEventKey() == Keyboard.KEY_4) { setMode(4); } + if (Keyboard.getEventKey() == Keyboard.KEY_5) { setMode(5); } + if (Keyboard.getEventKey() == Keyboard.KEY_6) { setMode(6); } + if (Keyboard.getEventKey() == Keyboard.KEY_7) { setMode(7); } + if (Keyboard.getEventKey() == Keyboard.KEY_8) { setMode(8); } + // -------------------------------- + + // check for window move + // ================================ + if (Keyboard.getEventKey() == Keyboard.KEY_LEFT) { + if (!Display.isFullscreen()) { + Display.setLocation(window_x -= 10, window_y); + } + } + + if (Keyboard.getEventKey() == Keyboard.KEY_RIGHT) { + if (!Display.isFullscreen()) { + Display.setLocation(window_x += 10, window_y); + } + } + + if (Keyboard.getEventKey() == Keyboard.KEY_UP) { + if (!Display.isFullscreen()) { + Display.setLocation(window_x, window_y -= 10); + } + } + + if (Keyboard.getEventKey() == Keyboard.KEY_DOWN) { + if (!Display.isFullscreen()) { + Display.setLocation(window_x, window_y += 10); + } + } + // -------------------------------- + + // check for fullscreen + if (Keyboard.getEventKey() == Keyboard.KEY_F) { + try { + if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || + Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { + System.out.println("Performing Display.destroy()/create() cycle"); + DisplayMode saved_mode = Display.getDisplayMode(); + Display.destroy(); + Display.setDisplayMode(saved_mode); + Display.setFullscreen(fullscreen = !fullscreen); + Display.create(); + } else + Display.setFullscreen(fullscreen = !fullscreen); + } catch (LWJGLException lwjgle) { + lwjgle.printStackTrace(); + } + } + } + } + + private void setMode(int mode) { + if(fixed_modes[mode] == null) { + System.out.println("Unable to set mode. Not valid: " + mode); + return; + } + + try { + Display.setDisplayMode(fixed_modes[mode]); + } catch (LWJGLException le) { + le.printStackTrace(); + System.out.println("Exception while setting mode: " + fixed_modes[mode]); + } + } + + /** + * + */ + private void render() { + glClearColor(color, color, color, 1f); + glClear(GL_COLOR_BUFFER_BIT); + + color += direction * .05f; + + if (color > 1f) { + color = 1f; + direction = -1 * direction; + } else if (color < 0f) { + direction = -1 * direction; + color = 0f; + } + } + + /** + * Main entry point + * + * @param args ignored params to app + */ + public static void main(String[] args) throws LWJGLException { + + System.out.println("The following keys are available:\n" + + "ESCAPE:\t\tExit test\n" + + "ARROW Keys:\tMove window when in non-fullscreen mode\n" + + "L:\t\tList selectable display modes\n" + + "0-8:\t\tSelection of display modes\n" + + "F:\t\tToggle fullscreen\n" + + "SHIFT-F:\tToggle fullscreen with Display.destroy()/create() cycle"); + + WindowCreationTest wct = new WindowCreationTest(); + if (wct.initialize()) { + wct.execute(); + wct.destroy(); + } + System.exit(0); + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDefaultDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(640, 480, -1, -1, -1, -1, -1, -1); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { "width=" + 640, "height=" + 480, "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel()}); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * Gets a specific display mode + */ + private DisplayMode getDisplayMode(int width, int height, int bpp, int freq) { + DisplayMode[] dm = null; + try { + dm = org.lwjgl.util.Display.getAvailableDisplayModes(width, height, width, height, bpp, bpp, freq, freq); + if(dm == null || dm.length == 0) { + System.out.println("Problem retrieving mode with " + width + "x" + height + "x" + bpp + "@" + freq); + } + } catch (LWJGLException le) { + le.printStackTrace(); + System.out.println("Problem retrieving mode with " + width + "x" + height + "x" + bpp + "@" + freq); + } + return (dm != null && dm.length != 0) ? dm[0] : null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/AppletLoaderTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/AppletLoaderTest.java new file mode 100644 index 0000000..05ecfaa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/AppletLoaderTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + +import java.applet.Applet; +import java.awt.BorderLayout; +import java.awt.Canvas; + +public class AppletLoaderTest extends Applet { + + Test test; + + public void destroy() { + super.destroy(); + System.out.println("*** destroy ***"); + } + + public void start() { + super.start(); + System.out.println("*** start ***"); + } + + public void stop() { + super.stop(); + System.out.println("*** stop ***"); + test.stop(); + } + + public void init() { + System.out.println("*** init ***"); + + setLayout(new BorderLayout()); + try { + test = (Test) Class.forName(getParameter("test")).newInstance(); + Canvas canvas = (Canvas) test; + canvas.setSize(getWidth(), getHeight()); + add(canvas); + } catch (Exception e) { + e.printStackTrace(); + } + test.start(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/ControllersTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/ControllersTest.java new file mode 100644 index 0000000..7f39ad6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/ControllersTest.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + +import java.awt.Canvas; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Controllers; + +public class ControllersTest extends Canvas implements Test { + public void start() { + try { + Controllers.create(); + } catch (LWJGLException e) { + e.printStackTrace(); + return; + } + System.out.println("Controllers.getControllerCount() = " + Controllers.getControllerCount()); + } + + public void stop() { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/GearsApplet.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/GearsApplet.java new file mode 100644 index 0000000..63b646e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/GearsApplet.java @@ -0,0 +1,405 @@ +package org.lwjgl.test.applet; + +import java.applet.Applet; +import java.awt.BorderLayout; +import java.awt.Canvas; +import java.nio.FloatBuffer; +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GLContext; + +import static org.lwjgl.opengl.ARBTransposeMatrix.*; +import static org.lwjgl.opengl.GL11.*; + +public class GearsApplet extends Applet { + + /** The Canvas where the LWJGL Display is added */ + Canvas display_parent; + + /** Thread which runs the main game loop */ + Thread gameThread; + + /** is the game loop running */ + boolean running; + + /** variables used to rotate the view */ + private float view_rotx = 20.0f; + private float view_roty = 30.0f; + private float view_rotz; + + private int gear1; + private int gear2; + private int gear3; + private float angle; + + boolean keyDown; + + private int prevMouseX, prevMouseY; + private boolean mouseButtonDown; + + + /** + * Once the Canvas is created its add notify method will call this method to + * start the LWJGL Display and game loop in another thread. + */ + public void startLWJGL() { + gameThread = new Thread() { + public void run() { + running = true; + try { + Display.setParent(display_parent); + //Display.setVSyncEnabled(true); + Display.create(); + initGL(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + gameLoop(); + } + }; + gameThread.start(); + } + + + /** + * Tell game loop to stop running, after which the LWJGL Display will be destoryed. + * The main thread will wait for the Display.destroy() to complete + */ + private void stopLWJGL() { + running = false; + try { + gameThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public void start() { + + } + + public void stop() { + + } + + /** + * Applet Destroy method will remove the canvas, before canvas is destroyed it will notify + * stopLWJGL() to stop main game loop and to destroy the Display + */ + public void destroy() { + remove(display_parent); + super.destroy(); + System.out.println("Clear up"); + } + + /** + * initialise applet by adding a canvas to it, this canvas will start the LWJGL Display and game loop + * in another thread. It will also stop the game loop and destroy the display on canvas removal when + * applet is destroyed. + */ + public void init() { + setLayout(new BorderLayout()); + try { + display_parent = new Canvas() { + public void addNotify() { + super.addNotify(); + startLWJGL(); + } + public void removeNotify() { + stopLWJGL(); + super.removeNotify(); + } + }; + display_parent.setSize(getWidth(),getHeight()); + add(display_parent); + display_parent.setFocusable(true); + display_parent.requestFocus(); + display_parent.setIgnoreRepaint(true); + //setResizable(true); + setVisible(true); + } catch (Exception e) { + System.err.println(e); + throw new RuntimeException("Unable to create display"); + } + } + + public void gameLoop() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while(running) { + angle += 2.0f; + + // draw the gears + drawLoop(); + + Display.update(); + + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames 2 in " + timeUsed / 1000f + " seconds = " + + (fps / (timeUsed / 1000f))); + fps = 0; + } + + if (Mouse.isButtonDown(0)) { + if (!mouseButtonDown) { + prevMouseX = Mouse.getX(); + prevMouseY= Mouse.getY(); + } + mouseButtonDown = true; + } + else { + mouseButtonDown = false; + } + + if (mouseButtonDown) { + int x = Mouse.getX(); + int y = Mouse.getY(); + + float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)display_parent.getWidth()); + float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)display_parent.getHeight()); + + prevMouseX = x; + prevMouseY = y; + + view_rotx += thetaX; + view_roty += thetaY; + } + + // F Key Pressed (i.e. released) + if (keyDown && !Keyboard.isKeyDown(Keyboard.KEY_F)) { + keyDown = false; + + try { + if (Display.isFullscreen()) { + Display.setFullscreen(false); + } + else { + Display.setFullscreen(true); + } + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + } + + Display.destroy(); + } + + public void drawLoop() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + glPushMatrix(); + glTranslatef(-3.0f, -2.0f, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1f, -2.0f, 0.0f); + glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1f, 4.2f, 0.0f); + glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); + } + + protected void initGL() { + try { + // setup ogl + FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); + FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f}); + FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f}); + FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f}); + + pos.flip(); + red.flip(); + green.flip(); + blue.flip(); + + glLight(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + gear(1.0f, 4.0f, 1.0f, 20, 0.7f); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + gear(0.5f, 2.0f, 2.0f, 10, 0.7f); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + gear(1.3f, 2.0f, 0.5f, 10, 0.7f); + glEndList(); + glEnable(GL_NORMALIZE); + glMatrixMode(GL_PROJECTION); + + System.err.println("LWJGL: " + Sys.getVersion() + " / " + LWJGLUtil.getPlatformName()); + System.err.println("GL_VENDOR: " + glGetString(GL_VENDOR)); + System.err.println("GL_RENDERER: " + glGetString(GL_RENDERER)); + System.err.println("GL_VERSION: " + glGetString(GL_VERSION)); + System.err.println(); + System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix); + + if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) { + // --- not using extensions + glLoadIdentity(); + } else { + // --- using extensions + final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put( + new float[] { 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1}); + identityTranspose.flip(); + glLoadTransposeMatrixARB(identityTranspose); + } + float h = (float) display_parent.getHeight() / (float) display_parent.getWidth(); + glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -40.0f); + } catch (Exception e) { + System.err.println(e); + running = false; + } + } + + /** + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + */ + private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { + int i; + float r0, r1, r2; + float angle, da; + float u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0f; + r2 = outer_radius + tooth_depth / 2.0f; + da = 2.0f * (float) Math.PI / teeth / 4.0f; + glShadeModel(GL_FLAT); + glNormal3f(0.0f, 0.0f, 1.0f); + /* draw front face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + if (i < teeth) { + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), + width * 0.5f); + } + } + glEnd(); + + /* draw front sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f); + } + glEnd(); + + /* draw back face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw outward faces of teeth */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle); + v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle); + len = (float) Math.sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da); + v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da); + glNormal3f(v, -u, 0.0f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + } + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f); + glEnd(); + + glShadeModel(GL_SMOOTH); + /* draw inside radius cylinder */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + } + glEnd(); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenAL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenAL.java new file mode 100644 index 0000000..4ce774d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenAL.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.opengl.AWTGLCanvas; +import org.lwjgl.opengl.Display; +import org.lwjgl.util.WaveData; + +import static org.lwjgl.opengl.GL11.*; + +public class OpenAL extends AWTGLCanvas implements Test { + + float angle; + + // create 1 buffer and 1 source + IntBuffer buffers = BufferUtils.createIntBuffer(1); + IntBuffer sources = BufferUtils.createIntBuffer(1); + + public OpenAL() throws LWJGLException { + + try { + AL.create(); + } catch (Exception e) { + System.out.println("Unable to create OpenAL.\nPlease make sure that OpenAL is available on this system. Exception: " + e); + return; + } + + Thread t = new Thread() { + + public void run() { + while (true) { + if (isVisible()) + repaint(); + Display.sync(60); + } + } + }; + t.setDaemon(true); + t.start(); + } + + private void playOpenAL() { + int lastError; + + // al generate buffers and sources + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + sources.position(0).limit(1); + AL10.alGenSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + // load wave data from buffer + WaveData wavefile = WaveData.create(getClass().getClassLoader().getResourceAsStream("Footsteps.wav")); + + //copy to buffers + AL10.alBufferData(buffers.get(0), wavefile.format, wavefile.data, wavefile.samplerate); + + //unload file again + wavefile.dispose(); + + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //set up source input + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //lets loop the sound + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //play source 0 + AL10.alSourcePlay(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + } + + private void exit(int error) { + System.out.println("OpenAL Error: " + AL10.alGetString(error)); + } + + public void paintGL() { + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION_MATRIX); + glLoadIdentity(); + glOrtho(0, 640, 0, 480, 1, -1); + glMatrixMode(GL_MODELVIEW_MATRIX); + + glPushMatrix(); + glTranslatef(320, 240, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + glBegin(GL_QUADS); + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + glEnd(); + glPopMatrix(); + + angle += 1; + + try { + swapBuffers(); + } catch (Exception e) {/*OK*/ + } + } + + public void start() { + playOpenAL(); + } + + public void stop() { + int lastError; + + //stop source 0 + AL10.alSourceStop(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //delete buffers and sources + sources.position(0).limit(1); + AL10.alDeleteSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + buffers.position(0).limit(1); + AL10.alDeleteBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + AL.destroy(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenGL.java new file mode 100644 index 0000000..59d3dbc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/OpenGL.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.AWTGLCanvas; + +import static org.lwjgl.opengl.GL11.*; + +public class OpenGL extends AWTGLCanvas implements Test { + + float angle; + float x; + float y; + + public OpenGL() throws LWJGLException { + } + + public void initGL() { + glMatrixMode(GL_PROJECTION_MATRIX); + glLoadIdentity(); + glOrtho(0, 640, 0, 480, 1, -1); + x = 320; + y = 240; + glMatrixMode(GL_MODELVIEW_MATRIX); + setVSyncEnabled(true); + } + + public void paintGL() { + glClear(GL_COLOR_BUFFER_BIT); + + glPushMatrix(); + glTranslatef(x, y, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + glBegin(GL_QUADS); + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + glEnd(); + glPopMatrix(); + + angle += 1; + + if (Mouse.isCreated()) { + Mouse.poll(); + while (Mouse.next()) { + x += Mouse.getEventDX(); + y += Mouse.getEventDY(); + } + } + if (Keyboard.isCreated()) { + Keyboard.poll(); + } + while (Keyboard.isCreated() && Keyboard.next()) { + if (Keyboard.getEventKey() != Keyboard.KEY_NONE) { + String key_name = Keyboard.getKeyName(Keyboard.getEventKey()); + if (Keyboard.getEventKeyState()) { + switch (Keyboard.getEventKey()) { + case Keyboard.KEY_G: + Mouse.setGrabbed(!Mouse.isGrabbed()); + break; + default: + break; + } + System.out.println("Pressed: " + key_name); + } else + System.out.println("Released: " + key_name); + } + if (Keyboard.getEventCharacter() != Keyboard.CHAR_NONE) + System.out.println("Typed: " + Keyboard.getEventCharacter()); + } + if (Keyboard.isCreated()) { + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) + y += 5; + else if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) + y -= 5; + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) + x -= 5; + else if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) + x += 5; + } + try { + swapBuffers(); + if (isVisible()) { + Thread.yield(); // Helps input responsiveness on linux + repaint(); + } + } catch (Exception e) {/*OK*/ + } + } + + public void start() { + } + + public void stop() { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Speed.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Speed.java new file mode 100644 index 0000000..87317da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Speed.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.AWTGLCanvas; + +import static org.lwjgl.opengl.GL11.*; + +public class Speed extends AWTGLCanvas implements Test { + + private float angle; + private long startTime = System.currentTimeMillis() + 5000; + private long fps; + + public Speed() throws LWJGLException { + } + + public void paintGL() { + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION_MATRIX); + glLoadIdentity(); + glOrtho(0, 640, 0, 480, 1, -1); + glMatrixMode(GL_MODELVIEW_MATRIX); + + glPushMatrix(); + glTranslatef(320, 240, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + glBegin(GL_QUADS); + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + glEnd(); + glPopMatrix(); + + angle += 1; + + try { + swapBuffers(); + if (isVisible()) { + Thread.yield(); // Helps input responsiveness on linux + repaint(); + } + } catch (Exception e) {/*OK*/ + } + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in " + timeUsed / 1000f + " seconds = " + + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + + public void start() { + } + + public void stop() { + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Test.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Test.java new file mode 100644 index 0000000..18bea65 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/applet/Test.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.applet; + + +public interface Test { + void start(); + void stop(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessCallback.java new file mode 100644 index 0000000..3102454 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessCallback.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.glu.tessellation; + +import org.lwjgl.util.glu.GLUtessellatorCallbackAdapter; + +import static org.lwjgl.opengl.GL11.*; + +public class TessCallback extends GLUtessellatorCallbackAdapter { + + public void begin(int type) { + glBegin(type); + } + + public void combine(double[] coords, Object[] data, float[] weight, Object[] outData) { + for (int i=0;i<outData.length;i++) { + double[] combined = new double[6]; + combined[0] = coords[0]; + combined[1] = coords[1]; + combined[2] = coords[2]; + combined[3] = 1; + combined[4] = 1; + combined[5] = 1; + + outData[i] = new VertexData(combined); + } +// vertex[0] = coords[0]; +// vertex[1] = coords[1]; +// vertex[2] = coords[2]; +// +// for (int i = 3; i < 6; i++) +// { +// vertex[i] = weight[0] * vertex_data[0][i] + +// indent indweight[1] * vertex_data[1][i] + +// indent indweight[2] * vertex_data[2][i] + +// indent indweight[3] * vertex_data[3][i]; +// } +// +// *dataOut = vertex; + } + + public void end() { + glEnd(); + } + + public void vertex(Object vertexData) { + VertexData vertex = (VertexData) vertexData; + + glVertex3d(vertex.data[0], vertex.data[1], vertex.data[2]); + glColor3d(vertex.data[3], vertex.data[4], vertex.data[5]); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessellationTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessellationTest.java new file mode 100644 index 0000000..e6e8460 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/TessellationTest.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.glu.tessellation; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.util.glu.GLUtessellator; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +public class TessellationTest { + private GLUtessellator tesselator; + + void init() + { + // Create a new tessellation object + tesselator = gluNewTess(); + + // Set callback functions + TessCallback callback = new TessCallback(); + tesselator.gluTessCallback(GLU_TESS_VERTEX, callback); + tesselator.gluTessCallback(GLU_TESS_BEGIN, callback); + tesselator.gluTessCallback(GLU_TESS_END, callback); + tesselator.gluTessCallback(GLU_TESS_COMBINE, callback); + } + + void setWindingRule(int windingRule) + { + // Set the winding rule + tesselator.gluTessProperty(GLU_TESS_WINDING_RULE, windingRule); + } + + void renderContour(double obj_data[][], int num_vertices) + { + for (int x = 0; x < num_vertices; x++) //loop through the vertices + { + tesselator.gluTessVertex(obj_data[x], 0, new VertexData(obj_data[x])); //store the vertex + } + } + + void beginPolygon() + { + tesselator.gluTessBeginPolygon(null); + } + + void endPolygon() + { + tesselator.gluTessEndPolygon(); + } + + void beginContour() + { + tesselator.gluTessBeginContour(); + } + + void endContour() + { + tesselator.gluTessEndContour(); + } + + void end() + { + tesselator.gluDeleteTess(); + } + + private void createDisplay() throws LWJGLException { + int width = 300; + int height = 300; + + Display.setDisplayMode(new DisplayMode(width,height)); + Display.create(); + Display.setVSyncEnabled(true); + + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glViewport(0,0,width,height); + glMatrixMode(GL_MODELVIEW); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, width, height, 0, 1, -1); + glMatrixMode(GL_MODELVIEW); + } + + private void loop() { + while (true) { + render(); + Display.update(); + Display.sync(100); + + if (Display.isCloseRequested()) { + System.exit(0); + } + } + } + + private void render() { + glTranslatef(150,125,0); + + glScalef(50,50,1); + // first polygon: a star-5 vertices and color information + double star[][] = { {0.6f, -0.1f, 0f, 1.0f, 1.0f, 1.0f}, + {1.35f, 1.4f, 0f, 1.0f, 1.0f, 1.0f}, + {2.1f, -0.1f, 0f, 1.0f, 1.0f, 1.0f}, + {0.6f, 0.9f, 0f, 1.0f, 1.0f, 1.0f}, + {2.1f, 0.9f, 0f, 1.0f, 1.0f, 1.0f} }; + + //second polygon: a quad-4 vertices; first contour + double quad[][] = { {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f}, + {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f}, + {1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f}, + {0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; + + //second polygon: a triangle-3 vertices; second contour + double tri[][] = {{0.3f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.7f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f}, + {0.5f, 0.7f, 0.0f, 0.0f, 0.0f, 0.0f} }; + + // render the first polygon: the textured star + + // set winding rule to positive + setWindingRule(GLU_TESS_WINDING_POSITIVE); + beginPolygon(); + beginContour(); + renderContour(star, 5); + endContour(); + endPolygon(); + + // render the second polygon: triangle cut out of a quad + + glTranslatef(-2,0,0); + // set winding rule to odd + setWindingRule(GLU_TESS_WINDING_ODD); + // begin the new polygon + beginPolygon(); + beginContour(); + renderContour(quad, 4); + endContour(); + beginContour(); + renderContour(tri, 3); + endContour(); + endPolygon(); + // delete the tess object + end(); + } + + private void start() throws LWJGLException { + createDisplay(); + init(); + loop(); + } + + public static void main(String[] argv) throws LWJGLException { + TessellationTest test = new TessellationTest(); + test.start(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/VertexData.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/VertexData.java new file mode 100644 index 0000000..fbd84d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/glu/tessellation/VertexData.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.glu.tessellation; + +class VertexData { + public double[] data; + + VertexData(double[] data) { + this.data = data; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/HWCursorTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/HWCursorTest.java new file mode 100644 index 0000000..de952cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/HWCursorTest.java @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.input; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import org.lwjgl.input.Cursor; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * + * Tests switching between windowed and fullscreen - including hardware cursor test + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class HWCursorTest { + + /** The native cursor */ + private static Cursor[] cursors; + + /** The mouse cursor position */ + private static int mouse_x; + private static int mouse_y; + private static int mouse_btn; + + /** + * Executes the test + */ + public void execute() { + initialize(); + + mainLoop(); + + cleanup(); + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(640, 480, -1, -1, -1, -1, 60, 60); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { + "width=" + 640, + "height=" + 480, + "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() + }); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + /** + * Initializes the test + */ + private void initialize() { + try { + // start of in windowed mode + setDisplayMode(); + Display.create(); + + glInit(); + + initNativeCursors(); + + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + private static void initNativeCursors() throws Exception { + if ((Cursor.getCapabilities() & Cursor.CURSOR_ONE_BIT_TRANSPARENCY) == 0) { + System.out.println("No HW cursor support!"); + System.exit(0); + } + + cursors = new Cursor[3]; + + int cursorImageCount = 1; + int cursorWidth = Math.min(64, Cursor.getMaxCursorSize()); + int cursorHeight = cursorWidth; + IntBuffer cursorImages; + IntBuffer cursorDelays; + + + // Create a single cursor + // ================================== + cursorImages = ByteBuffer.allocateDirect(cursorWidth*cursorHeight*cursorImageCount*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + cursorDelays = null; + for(int j=0; j<cursorWidth; j++) { + for(int l=0; l<cursorHeight; l++) { + cursorImages.put(0xffffffff); + } + } + cursorImages.flip(); + cursors[0] = new Cursor(cursorWidth, cursorHeight, cursorWidth/2, cursorHeight/2, cursorImageCount, cursorImages, cursorDelays); + // ---------------------------------- + + // Create 3 piece animation + // ================================== + cursorImageCount = 3; + cursorImages = ByteBuffer.allocateDirect(cursorWidth*cursorHeight*cursorImageCount*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + cursorDelays = ByteBuffer.allocateDirect(cursorImageCount*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + for(int i=0; i<cursorImageCount; i++) { + + // make a colored square with a chocolate center + int offColor = 0x00000000; + int onColor = 0xffff0000; + + // change color according to cursor + if(i == 1) { + onColor = 0xff00ff00; + } else if (i == 2) { + onColor = 0xff0000ff; + } + + // calculate size of center + int centerSize = (cursorWidth / 5) * (i + 1); + int centerLeft = cursorWidth / 2 - centerSize / 2; + int centerRight = cursorWidth / 2 + centerSize / 2; + + // go! + for(int j=0; j<cursorWidth; j++) { + for(int l=0; l<cursorHeight; l++) { + if(j >= centerLeft && j < centerRight && l >= centerLeft && l < centerRight) { + cursorImages.put(offColor); + } else { + cursorImages.put(onColor); + } + } + } + } + cursorDelays.put(2000).put(2000).put(2000); + cursorDelays.flip(); + cursorImages.flip(); + + cursors[1] = new Cursor(cursorWidth, cursorHeight, cursorWidth/2, cursorHeight/2, cursorImageCount, cursorImages, cursorDelays); + // ---------------------------------- + + + // Create a 20 piece animation + // ================================== + cursorImageCount = 20; + cursorImages = ByteBuffer.allocateDirect(cursorWidth*cursorHeight*cursorImageCount*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + cursorDelays = ByteBuffer.allocateDirect(cursorImageCount*4).order(ByteOrder.nativeOrder()).asIntBuffer(); + cursorDelays.put( + new int[] { + 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100 + }); + + float step = 0xffffffff / 20.0f; + for(int i=0; i<cursorImageCount; i++) { + for(int j=0; j<cursorWidth; j++) { + for(int l=0; l<cursorHeight; l++) { + cursorImages.put((int)step); + } + } + step += step; + } + cursorImages.flip(); + cursorDelays.flip(); + cursors[2] = new Cursor(cursorWidth, cursorHeight, cursorWidth/2, cursorHeight/2, cursorImageCount, cursorImages, cursorDelays); + // ---------------------------------- + + Mouse.setNativeCursor(cursors[0]); + } + + /** + * Runs the main loop of the "test" + */ + private void mainLoop() { + while (!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) + && !Display.isCloseRequested()) { + // allow subsystem to get a chance to run too + Display.update(); + + if (Display.isVisible()) { + // check keyboard input + processKeyboard(); + processMouse(); + + render(); + } else { + + // no need to render/paint if nothing has changed (ie. window dragged over) + if (Display.isDirty()) { + render(); + } + + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + } + } + + /** + * Performs the logic + */ + private void render() { + //clear background + glClear(GL_COLOR_BUFFER_BIT); + + // draw white quad + glPushMatrix(); + { + glTranslatef(mouse_x, mouse_y, 0); + glColor3f(1.0f, 1.0f, 1.0f); + glBegin(GL_QUADS); + { + glColor3f(1.0f, 0.0f, 0.0f); glVertex2i(-50, -50); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2i(50, -50); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2i(50, 50); + glColor3f(1.0f, 0.0f, 1.0f); glVertex2i(-50, 50); + } + glEnd(); + } + glPopMatrix(); + } + + private void processMouse() { + mouse_x = Mouse.getX(); + mouse_y = Mouse.getY(); + + while(Mouse.next()) { + int button = Mouse.getEventButton(); + if(button >= 0 && button < 3 && Mouse.getEventButtonState()) { + mouse_btn = Mouse.getEventButton(); + switchCursor(); + } + } + } + + /** + * Processes keyboard input + */ + private void processKeyboard() { + //check for fullscreen key + if (Keyboard.isKeyDown(Keyboard.KEY_F)) { + + try { + try { + Mouse.setNativeCursor(null); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + for ( Cursor aCursor : cursors ) { + aCursor.destroy(); + } + Display.setFullscreen(true); + + glInit(); + + initNativeCursors(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //check for window key + if (Keyboard.isKeyDown(Keyboard.KEY_W)) { + try { + try { + Mouse.setNativeCursor(null); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + for ( Cursor cursor : cursors ) { + cursor.destroy(); + } + Display.setFullscreen(false); + glInit(); + + initNativeCursors(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (Keyboard.isKeyDown(Keyboard.KEY_M)) { + try { + Mouse.setNativeCursor(null); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (Keyboard.isKeyDown(Keyboard.KEY_N)) { + switchCursor(); + } + + while(Keyboard.next()) { + if(Keyboard.getEventKey() == Keyboard.KEY_SPACE && Keyboard.getEventKeyState()) { + Mouse.setGrabbed(!Mouse.isGrabbed()); + } + } + } + + private void switchCursor() { + try { + Mouse.setNativeCursor(cursors[mouse_btn]); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Cleans up the test + */ + private void cleanup() { + try { + Mouse.setNativeCursor(null); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + for ( Cursor cursor : cursors ) { + cursor.destroy(); + } + Display.destroy(); + } + + /** + * Initializes OGL + */ + private void glInit() { + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + //set clear color to black + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + //sync frame (only works on windows) + Display.setVSyncEnabled(true); + } + + /** + * Test entry point + */ + public static void main(String[] args) { + System.out.println("Change between fullscreen and windowed mode, by pressing F and W respectively. Enable hw cursor with N and disable it with M."); + HWCursorTest cursorTest = new HWCursorTest(); + cursorTest.execute(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/KeyboardTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/KeyboardTest.java new file mode 100644 index 0000000..e417902 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/KeyboardTest.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.input; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.util.vector.Vector2f; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <br> + * Keyboard test + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class KeyboardTest { + + /** position of quad to draw */ + private Vector2f position = new Vector2f(320.0f, 240.0f); + + /** Display mode selected */ + private DisplayMode displayMode; + + /** Creates a new instance of MouseTest */ + public KeyboardTest() { + } + + private void initialize() { + // create display and opengl + setupDisplay(false); + + try { + Keyboard.create(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(640, 480, -1, -1, -1, -1, 60, 60); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { + "width=" + 640, + "height=" + 480, + "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() + }); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + private void setupDisplay(boolean fullscreen) { + try { + setDisplayMode(); + Display.create(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + + initializeOpenGL(); + } + + private void initializeOpenGL() { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + public void executeTest() { + initialize(); + + createKeyboard(); + + wiggleKeyboard(); + + Keyboard.destroy(); + Display.destroy(); + } + + private void createKeyboard() { + try { + Keyboard.create(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + private void wiggleKeyboard() { + + while (!Display.isCloseRequested()) { + Display.update(); + + if (!Display.isVisible()) { + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + inte.printStackTrace(); + } + continue; + } + + //check keys, buffered + Keyboard.poll(); + + int count = Keyboard.getNumKeyboardEvents(); + while (Keyboard.next()) { + int character_code = ((int)Keyboard.getEventCharacter()) & 0xffff; + System.out.println("Checking key:" + Keyboard.getKeyName(Keyboard.getEventKey())); + System.out.println("Pressed:" + Keyboard.getEventKeyState()); + System.out.println("Key character code: 0x" + Integer.toHexString(character_code)); + System.out.println("Key character: " + Keyboard.getEventCharacter()); + System.out.println("Repeat event: " + Keyboard.isRepeatEvent()); + + if (Keyboard.getEventKey() == Keyboard.KEY_R && Keyboard.getEventKeyState()) { + Keyboard.enableRepeatEvents(!Keyboard.areRepeatEventsEnabled()); + } + if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + return; + } + } + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + position.x += 1; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + position.x -= 1; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { + position.y += 1; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { + position.y -= 1; + } + + if (count > 0) { + System.out.println(); + } + + if (position.x < 0) { + position.x = 0; + } else if (position.x > 640 - 60) { + position.x = 640 - 60; + } + + if (position.y < 0) { + position.y = 0; + } else if (position.y > 480 - 30) { + position.y = 480 - 30; + } + + render(); + + Display.sync(60); + } + } + + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_POLYGON); + { + float color = 1.0f; + glColor3f(color, color, color); + + glVertex2f(position.x + 0.0f, position.y + 0.0f); + glVertex2f(position.x + 0.0f, position.y + 30.0f); + glVertex2f(position.x + 40.0f, position.y + 30.0f); + glVertex2f(position.x + 60.0f, position.y + 15.f); + glVertex2f(position.x + 40.0f, position.y + 0.0f); + } + glEnd(); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + KeyboardTest kt = new KeyboardTest(); + kt.executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseCreationTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseCreationTest.java new file mode 100644 index 0000000..a37939f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseCreationTest.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.input; + +import org.lwjgl.Sys; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.util.vector.Vector2f; + +import static org.lwjgl.opengl.GL11.*; + +/** + * <br> + * Mouse test + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class MouseCreationTest { + /** position of quad to draw */ + private Vector2f position = new Vector2f(320.0f, 240.0f); + + /** Creates a new instance of MouseTest */ + public MouseCreationTest() { + } + + private void initialize(boolean fullscreen) { + try { + setDisplayMode(); + Display.setFullscreen(fullscreen); + Display.create(); + Mouse.setGrabbed(true); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + + initializeOpenGL(); + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(640, 480, -1, -1, -1, -1, 60, 60); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { + "width=" + 640, + "height=" + 480, + "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() + }); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + private void initializeOpenGL() { + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + // Put the window into orthographic projection mode with 1:1 pixel ratio. + // We haven't used GLU here to do this to avoid an unnecessary dependency. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, Display.getDisplayMode().getWidth(), 0.0, Display.getDisplayMode().getHeight(), -1.0, 1.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + } + + public void executeTest() { + initialize(false); + + System.out.println("Test ready:\n"); + + // windowed mode + System.out.println("=========== WINDOWED MODE =============="); + for(int i=0; i<2; i++) { + System.out.println("Test " + (i+1) + ":"); + wiggleMouse(); + System.out.println(""); + } + + // recreate display in fullscreen mode + System.out.print("Destroying display..."); + + System.out.println("success"); + + System.out.print("Entering fullscreen mode..."); + try { + Display.destroy(); + initialize(true); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("success"); + + + // fullscreen mode + System.out.println("=========== FULLSCREEN MODE =============="); + for(int i=0; i<2; i++) { + System.out.println("Test " + (i+3) + ":"); + wiggleMouse(); + System.out.println(""); + } + + System.out.println("Test completed successfully!"); + System.out.print("Shutting down..."); + Display.destroy(); + System.out.println("shutdown complete"); + } + + private void wiggleMouse() { + System.out.print("Please move the mouse around"); + + long statustime = Sys.getTime(); + long endtime = Sys.getTime() + Sys.getTimerResolution() * 5; + + while (Sys.getTime() < endtime) { + Display.update(); + + // empty mouse buffer + while(Mouse.next()); + + position.x += Mouse.getDX(); + position.y += Mouse.getDY(); + + if(position.x<0) { + position.x = 0; + } else if (position.x>640-60) { + position.x = 640-60; + } + + if(position.y < 0) { + position.y = 0; + } else if (position.y>480-30) { + position.y = 480-30; + } + + render(); + + if (Sys.getTime() - statustime > Sys.getTimerResolution()) { + System.out.print("."); + statustime = Sys.getTime(); + } + } + System.out.println("thank you"); + } + + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_POLYGON); + { + float color = 1.0f; + int buttonDown = 0; + + for(int i=0;i<Mouse.getButtonCount(); i++) { + if(Mouse.isButtonDown(i)) { + color = (1.0f / Mouse.getButtonCount()) * (i+1); + break; + } + } + glColor3f(color, color, color); + + glVertex2f(position.x + 0.0f, position.y + 0.0f); + glVertex2f(position.x + 0.0f, position.y + 30.0f); + glVertex2f(position.x + 40.0f, position.y + 30.0f); + glVertex2f(position.x + 60.0f, position.y + 15.f); + glVertex2f(position.x + 40.0f, position.y + 0.0f); + } + glEnd(); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + MouseCreationTest mt = new MouseCreationTest(); + mt.executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseTest.java new file mode 100644 index 0000000..46ef443 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/MouseTest.java @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.input; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.util.vector.Vector2f; +import org.lwjgl.util.vector.Vector3f; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <br> + * Mouse test + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class MouseTest { + /** Direction mouse has moved */ + private int direction; + + /** Last button pressed */ + private int lastButton; + + /** Last direction we scrolled in */ + private int lastScrollDirection = -1; + + /** Width of window */ + private static int WINDOW_WIDTH = 640; + + /** Height of window */ + private static int WINDOW_HEIGHT = 640; + + /** Triangle size */ + private Vector2f triangleSize = new Vector2f(120, 100); + + /** Triangle color */ + private Vector3f triangleColors[] = new Vector3f[] { + new Vector3f(1,1,1), + new Vector3f(1,0,0), + new Vector3f(0,1,0), + new Vector3f(0,0,1) + }; + + private Vector3f quadColors[] = new Vector3f[] { + new Vector3f(1,1,1), + new Vector3f(1,0,0), + new Vector3f(0,1,0), + new Vector3f(0,0,1) + }; + + /** Triangles to paint */ + private Vector2f[] triangles = { + new Vector2f(WINDOW_WIDTH/2, WINDOW_HEIGHT - triangleSize.y), + new Vector2f(triangleSize.y, WINDOW_HEIGHT/2), + new Vector2f(WINDOW_WIDTH/2, triangleSize.y), + new Vector2f(WINDOW_WIDTH-triangleSize.y, WINDOW_HEIGHT/2) + }; + + /** Whether the test is closing */ + private boolean closing; + + /** Fullscreen or not */ + public static final boolean FULLSCREEN = false; + + /** Creates a new instance of MouseTest */ + public MouseTest() { + } + + private void initialize() { + // create display and opengl + setupDisplay(); + + setupMouse(); + setupKeyboard(); + } + + /** + * Setup display + */ + private void setupDisplay() { + try { + setDisplayMode(); + Display.setFullscreen(FULLSCREEN); + Display.setVSyncEnabled(true); + Display.create(); + Mouse.setGrabbed(true); + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + + initializeOpenGL(); + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDisplayMode() { + // get modes + DisplayMode dm = new DisplayMode(WINDOW_WIDTH, WINDOW_HEIGHT); + + try { + Display.setDisplayMode(dm); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + /** + * Initializes OpenGL + * + */ + private void initializeOpenGL() { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + /** + * Executes the actual test + */ + public void executeTest() { + initialize(); + + runTest(); + + Display.destroy(); + } + + /** + * Creates the mouse + */ + private void setupMouse() { + } + + /** + * Creates the keyboard + */ + private void setupKeyboard() { + } + + /** + * Runs the test + */ + private void runTest() { + // while not exiting + while (!closing) { + handleWindow(); + + // secondary check + if(!closing) { + + // poll and check keyboard and mouse + handleKeyboard(); + handleMouse(); + + // pause and continue if minimized + if(!Display.isVisible()) { + if(Display.isDirty()) { + render(); + } + pause(100); + continue; + } + + // render and flip + logic(); + render(); + } + Thread.yield(); + } + } + + /** + * Pauses the current thread for a specified time + * + * @param time milliseconds to pause + */ + private void pause(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException inte) { + inte.printStackTrace(); + } + } + + /** + * Handles the window + */ + private void handleWindow() { + Display.update(); + closing = Display.isCloseRequested(); + } + + /** + * handles the mouse + */ + private void handleMouse() { + readBufferedMouse(); + + Display.setTitle("x: " + Mouse.getX() + ", y: " + Mouse.getY() + ", [0]: " + Mouse.isButtonDown(0) + ", [1]: " + Mouse.isButtonDown(1) + ", [2]: " + Mouse.isButtonDown(2) + ", inside: " + Mouse.isInsideWindow()); + } + + /** + * reads a mouse in buffered mode + */ + private void readBufferedMouse() { + // iterate all events, use the last button down + while(Mouse.next()) { + if(Mouse.getEventButton() != -1 && Mouse.getEventButtonState()) { + lastButton = Mouse.getEventButton(); + } + } + + updateState(); + } + + /** + * Updates our "model" + * + */ + private void updateState() { + direction = -1; + + int dx = Mouse.getDX(); + int dy = Mouse.getDY(); + int dw = Mouse.getDWheel(); + + + // get out if no movement + if (dx == dy && dx == 0 && dw == 0) { + return; + } + + // determine direction moved + // ============================ + if(dx > 0) { + direction = 3; + } + + if(dx < 0) { + direction = 1; + } + + if(dy > 0) { + direction = 0; + } + + if(dy < 0) { + direction = 2; + } + + // ---------------------------- + if(direction > -1) { + + // based on which button was last pushed, update model + switch(lastButton) { + case -1: + break; + case 1: + triangleColors[direction].y = 1; + break; + case 2: + triangleColors[direction].z = 1; + break; + case 3: + triangleColors[direction].x = 1; + triangleColors[direction].y = 1; + triangleColors[direction].z = 1; + break; + case 0: // fall through + default: + triangleColors[direction].x = 1; + break; + } + } + + // get direction to update in + if (dw > 0) { + lastScrollDirection++; + } else if (dw < 0) { + lastScrollDirection--; + } else if (dw == 0) { + return; + } + + // over/underflow + if(lastScrollDirection < 0) { + lastScrollDirection = 3; + } + if(lastScrollDirection > 3) { + lastScrollDirection = 0; + } + + // update colors + quadColors[lastScrollDirection].x = (float) Math.random(); + quadColors[lastScrollDirection].y = (float) Math.random(); + quadColors[lastScrollDirection].z = (float) Math.random(); + } + + /** + * Handles the keyboard + */ + private void handleKeyboard() { + + while(Keyboard.next()) { + // closing on ESCAPE + if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState()) { + closing = true; + } + + if(Keyboard.getEventKey() == Keyboard.KEY_SPACE && Keyboard.getEventKeyState()) { + Mouse.setGrabbed(!Mouse.isGrabbed()); + } + + if(Keyboard.getEventKey() == Keyboard.KEY_R && Keyboard.getEventKeyState()) { + Display.setResizable(!Display.isResizable()); + } + } + } + + /** + * Does the "model logic" + */ + private void logic() { + // "we fade to black" + // =========================================== + for ( Vector3f color : triangleColors ) { + color.x -= 0.01; + color.y -= 0.01; + color.z -= 0.01; + } + + for ( Vector3f color : quadColors ) { + color.x -= 0.01; + color.y -= 0.01; + color.z -= 0.01; + } + // ------------------------------------------- + } + + /** + * Render our triangles + */ + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + // for each triangle, render it at position, rotating degrees for each + for(int i=0; i<triangles.length; i++) { + glPushMatrix(); { + glTranslatef(triangles[i].x, triangles[i].y, 0); + glRotatef(i*90, 0, 0, 1); + + glColor3f(triangleColors[i].x, triangleColors[i].y, triangleColors[i].z); + + glBegin(GL_TRIANGLES); { + glVertex2f(0, triangleSize.y); + glVertex2f(-triangleSize.x, -triangleSize.y); + glVertex2f(+triangleSize.x, -triangleSize.y); + } + glEnd(); + } + glPopMatrix(); + } + + // paint quad in the middle (yes, wasting cpu cycles by not precalculating) + glBegin(GL_QUADS); { + glColor3f(quadColors[0].x, quadColors[0].y, quadColors[0].z); + glVertex2f(WINDOW_WIDTH/2-triangleSize.x, WINDOW_HEIGHT/2-triangleSize.x); + glColor3f(quadColors[1].x, quadColors[1].y, quadColors[1].z); + glVertex2f(WINDOW_WIDTH/2+triangleSize.x, WINDOW_HEIGHT/2-triangleSize.x); + glColor3f(quadColors[2].x, quadColors[2].y, quadColors[2].z); + glVertex2f(WINDOW_WIDTH/2+triangleSize.x, WINDOW_HEIGHT/2+triangleSize.x); + glColor3f(quadColors[3].x, quadColors[3].y, quadColors[3].z); + glVertex2f(WINDOW_WIDTH/2-triangleSize.x, WINDOW_HEIGHT/2+triangleSize.x); + } + glEnd(); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + MouseTest mt = new MouseTest(); + mt.executeTest(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/TestControllers.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/TestControllers.java new file mode 100644 index 0000000..7537a93 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/input/TestControllers.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.input; + +import java.awt.Dimension; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; + +import org.lwjgl.input.Controller; +import org.lwjgl.input.Controllers; + +/** + * Oops. Forgot to document this one. + * + * @author Kevin Glass + */ +public class TestControllers extends JPanel { + public static int total; + + private JTextField[] values; + private JTextField[] names; + private Controller controller; + private int buttonCount; + private int itemCount; + + public TestControllers(int index) { + controller = Controllers.getController(index); + setLayout(null); + + buttonCount = controller.getButtonCount(); + itemCount = controller.getButtonCount() + controller.getAxisCount() + 2; + values = new JTextField[itemCount]; + names = new JTextField[itemCount]; + + for (int i=0;i<controller.getButtonCount();i++) { + names[i] = new JTextField(); + names[i].setEditable(false); + names[i].setBounds(0,i*30,100,30); + names[i].setText(controller.getButtonName(i)); + add(names[i]); + values[i] = new JTextField(); + values[i].setEditable(false); + values[i].setBounds(100,i*30,100,30); + add(values[i]); + } + for (int i=buttonCount;i<buttonCount+controller.getAxisCount();i++) { + names[i] = new JTextField(); + names[i].setEditable(false); + names[i].setBounds(0,i*30,100,30); + names[i].setText(controller.getAxisName(i-buttonCount)); + add(names[i]); + values[i] = new JTextField(); + values[i].setEditable(false); + values[i].setBounds(100,i*30,100,30); + add(values[i]); + } + + int i = itemCount - 2; + names[i] = new JTextField(); + names[i].setEditable(false); + names[i].setBounds(0,i*30,100,30); + names[i].setText("POV X"); + add(names[i]); + values[i] = new JTextField(); + values[i].setEditable(false); + values[i].setBounds(100,i*30,100,30); + add(values[i]); + + i = itemCount - 1; + names[i] = new JTextField(); + names[i].setEditable(false); + names[i].setBounds(0,i*30,100,30); + names[i].setText("POV Y"); + add(names[i]); + values[i] = new JTextField(); + values[i].setEditable(false); + values[i].setBounds(100,i*30,100,30); + add(values[i]); + + total++; + + setPreferredSize(new Dimension(200,30*itemCount)); + JFrame frame = new JFrame(controller.getName()); + frame.setContentPane(new JScrollPane(this)); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + total--; + if (total == 0) { + System.exit(0); + } + } + }); + frame.setSize(230,400); + frame.setLocation(index*30,index*30); + frame.setVisible(true); + } + + public void updateDetails() { + for (int i=0;i<controller.getButtonCount();i++) { + values[i].setText(""+controller.isButtonPressed(i)); + } + for (int i=buttonCount;i<buttonCount+controller.getAxisCount();i++) { + values[i].setText(""+controller.getAxisValue(i-buttonCount)); + } + + values[itemCount-2].setText(""+controller.getPovX()); + values[itemCount-1].setText(""+controller.getPovY()); + } + + public static void main(String[] argv) { + try { + Controllers.create(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(0); + } + + int count = Controllers.getControllerCount(); + System.out.println(count+" Controllers Found"); + for (int i=0;i<count;i++) { + Controller controller = Controllers.getController(i); + System.out.println(controller.getName()); + } + + if (count == 0) { + System.exit(0); + } + + TestControllers[] controllerWindows = new TestControllers[count]; + for (int i=0;i<count;i++) { + controllerWindows[i] = new TestControllers(i); + } + + boolean running = true; + while (running) { + try { Thread.sleep(100); } catch (Exception e) {}; + + Controllers.poll(); + + while (Controllers.next()) { + System.out.println("Event Fired: "); + System.out.println("\t"+Controllers.getEventNanoseconds()); + System.out.println("\t"+Controllers.getEventSource()+":"+Controllers.getEventControlIndex()+":"+Controllers.isEventButton()); + System.out.println("\t"+Controllers.isEventXAxis()+":"+Controllers.isEventYAxis()); + } + + for (int i=0;i<count;i++) { + controllerWindows[i].updateDetails(); + } + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedFloat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedFloat.java new file mode 100644 index 0000000..592719e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedFloat.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.util.mapped.MappedObject; + +/** @author Riven */ +public class MappedFloat extends MappedObject { + + public MappedFloat() { + this.test(); + } + + public float value; + + public void test() { + this.value = 4; + } + + @Override + public String toString() { + return "MappedFloat[" + value + "]"; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectBench.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectBench.java new file mode 100644 index 0000000..4f057c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectBench.java @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.MemoryUtil; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import static org.lwjgl.util.mapped.MappedHelper.*; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class MappedObjectBench { + + static class InstanceVec3 { + + float x, y, z; + + @Override + public String toString() { + return "InstanceVec3[" + x + ", " + y + ", " + z + "]"; + } + } + + static class ArrayVec3 { + + float[] a; + int i; + + @Override + public String toString() { + return "ArrayVec3[" + a[i * 3 + 0] + ", " + a[i * 3 + 1] + ", " + a[i * 3 + 2] + "]"; + } + } + + static void benchmarkInstances() { + final int runs = 64; + final int iterations = 64 * 1024; + + InstanceVec3 vec1 = new InstanceVec3(); + InstanceVec3 vec2 = new InstanceVec3(); + InstanceVec3 vec3 = new InstanceVec3(); + + long[] took = new long[runs]; + for ( int run = 0; run < runs; run++ ) { + long t0 = System.nanoTime(); + for ( int iteration = 0; iteration < iterations; iteration++ ) { + vec1.x = 13; + vec1.y += vec1.y * vec1.x + 0.3f; + vec1.z += vec2.y + vec1.x + 0.3f; + vec2.z += vec2.y + vec1.x; + vec3.z += vec2.z + vec1.y; + } + long t1 = System.nanoTime(); + took[run] = t1 - t0; + } + + Arrays.sort(took); + System.out.println("instance took: " + took[took.length / 2] / 1024 + "us"); + + System.out.println(vec1); + System.out.println(vec2); + System.out.println(vec3); + } + + static void benchmarkMapped() { + final int runs = 64; + final int iterations = 64 * 1024; + + ByteBuffer bb = ByteBuffer.allocateDirect(200); + + MappedVec3 vecs = MappedVec3.map(bb); + + MappedVec3 vec1 = vecs.dup(); + MappedVec3 vec2 = vecs.dup(); + MappedVec3 vec3 = vecs.dup(); + + vec1.view = 0; + vec2.view = 1; + vec3.view = 2; + + long[] took = new long[runs]; + for ( int run = 0; run < runs; run++ ) { + long t0 = System.nanoTime(); + for ( int iteration = 0; iteration < iterations; iteration += 2 ) { + vec1.x = 13; + vec1.y += vec1.y * vec1.x + 0.3f; + vec1.z += vec2.y + vec1.x + 0.3f; + vec2.z += vec2.y + vec1.x; + vec3.z += vec2.z + vec1.y; + + vec1.x = 13; + vec1.y += vec1.y * vec1.x + 0.3f; + vec1.z += vec2.y + vec1.x + 0.3f; + vec2.z += vec2.y + vec1.x; + vec3.z += vec2.z + vec1.y; + } + long t1 = System.nanoTime(); + took[run] = t1 - t0; + } + + Arrays.sort(took); + System.out.println("mapped took: " + took[took.length / 2] / 1024 + "us"); + + System.out.println(vec1); + System.out.println(vec2); + System.out.println(vec3); + + System.out.println(bb); + } + + static void benchmarkIndirectArray() { + final int runs = 64; + final int iterations = 64 * 1024; + + float[] bb = new float[200]; + + ArrayVec3 vec1 = new ArrayVec3(); + ArrayVec3 vec2 = new ArrayVec3(); + ArrayVec3 vec3 = new ArrayVec3(); + + vec1.a = bb; + vec2.a = bb; + vec3.a = bb; + + vec1.i = 0; + vec2.i = 1; + vec3.i = 2; + + long[] took = new long[runs]; + for ( int run = 0; run < runs; run++ ) { + long t0 = System.nanoTime(); + for ( int iteration = 0; iteration < iterations; iteration++ ) { + vec1.a[vec1.i * 3 + 0] = 13; + vec1.a[vec1.i * 3 + 1] += vec1.a[vec1.i * 3 + 1] * vec1.a[vec1.i * 3 + 0] + 0.3f; + vec1.a[vec1.i * 3 + 2] += vec2.a[vec2.i * 3 + 1] + vec1.a[vec1.i * 3 + 0] + 0.3f; + vec2.a[vec2.i * 3 + 2] += vec2.a[vec2.i * 3 + 1] + vec1.a[vec1.i * 3 + 0]; + vec3.a[vec3.i * 3 + 2] += vec2.a[vec2.i * 3 + 2] + vec2.a[vec2.i * 3 + 1]; + } + long t1 = System.nanoTime(); + took[run] = t1 - t0; + } + + Arrays.sort(took); + System.out.println("array took: " + took[took.length / 2] / 1024 + "us"); + + System.out.println(vec1); + System.out.println(vec2); + System.out.println(vec3); + + System.out.println(bb); + } + + static void benchmarkDirectArray() { + final int runs = 64; + final int iterations = 64 * 1024; + + float[] bb = new float[200]; + + long[] took = new long[runs]; + for ( int run = 0; run < runs; run++ ) { + long t0 = System.nanoTime(); + for ( int iteration = 0; iteration < iterations; iteration++ ) { + bb[1 * 3 + 0] = 13; + bb[1 * 3 + 1] += bb[1 * 3 + 1] * bb[1 * 3 + 0] + 0.3f; + bb[1 * 3 + 2] += bb[2 * 3 + 1] + bb[1 * 3 + 0] + 0.3f; + bb[2 * 3 + 2] += bb[2 * 3 + 1] + bb[1 * 3 + 0]; + bb[3 * 3 + 2] += bb[2 * 3 + 2] + bb[2 * 3 + 1]; + } + long t1 = System.nanoTime(); + took[run] = t1 - t0; + } + + Arrays.sort(took); + System.out.println("array2 took: " + took[took.length / 2] / 1024 + "us"); + + System.out.println(bb); + } + + static void benchmarkUnsafe() { + final int runs = 64; + final int iterations = 64 * 1024; + + ByteBuffer bb = ByteBuffer.allocateDirect(200); + long addr = MemoryUtil.getAddress(bb); + + long[] took = new long[runs]; + for ( int run = 0; run < runs; run++ ) { + long t0 = System.nanoTime(); + for ( int iteration = 0; iteration < iterations; iteration++ ) { + fput(13, addr + (1 * 3 + 0) * 4); + fput(fget(addr + (1 * 3 + 1) * 4) + fget(addr + (1 * 3 + 1) * 4) * fget(addr + (1 * 3 + 0) * 4) + 0.3f, addr + (1 * 3 + 1) * 4); + fput(fget(addr + (1 * 3 + 2) * 4) + fget(addr + (2 * 3 + 1) * 4) + fget(addr + (1 * 3 + 0) * 4) + 0.3f, addr + (1 * 3 + 2) * 4); + fput(fget(addr + (2 * 3 + 2) * 4) + fget(addr + (2 * 3 + 1) * 4) + fget(addr + (1 * 3 + 0) * 4), addr + (2 * 3 + 2) * 4); + fput(fget(addr + (3 * 3 + 2) * 4) + fget(addr + (2 * 3 + 2) * 4) + fget(addr + (2 * 3 + 1) * 4), addr + (3 * 3 + 2) * 4); + } + long t1 = System.nanoTime(); + took[run] = t1 - t0; + } + + Arrays.sort(took); + System.out.println("unsafe took: " + took[took.length / 2] / 1024 + "us"); + + System.out.println(bb); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests1.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests1.java new file mode 100644 index 0000000..a920091 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests1.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.MemoryUtil; +import org.lwjgl.util.mapped.MappedHelper; + +import java.nio.ByteBuffer; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class MappedObjectTests1 { + + static class Test { + + int value; + } + + static void testViewField() { + Test test = new Test(); + test.value = 13; + test.value += 1; + test.value++; + System.out.println(test); + + ByteBuffer bb = ByteBuffer.allocateDirect(200); + MappedFloat vecs = MappedFloat.map(bb); + + // verify 'malloc', SIZEOF and capacity() + { + MappedFloat vecs1 = MappedFloat.malloc(1234); + + assert (vecs1.getSizeof() == MappedFloat.SIZEOF); + assert (vecs1.getSizeof() * 1234 == vecs1.backingByteBuffer().capacity()); + assert (MappedFloat.SIZEOF * 1234 == vecs1.backingByteBuffer().capacity()); + assert(vecs1.capacity() == vecs1.backingByteBuffer().capacity() / MappedFloat.SIZEOF); + + ByteBuffer buf = ByteBuffer.allocateDirect(200); + buf.position(10 * MappedFloat.SIZEOF); + + MappedFloat vecs2 = MappedFloat.map(buf); + assert(vecs2.capacity() == (vecs2.backingByteBuffer().capacity() / MappedFloat.SIZEOF) - 10); + } + + // manipulate 'mapped.value' + { + assert (vecs.value == 0.0f); // 4.0 is set in constructor, but runViewConstructor is not called + vecs.value = 1.1f; + assert (vecs.value == 1.1f); + } + + // manipulate 'view' with assignment + { + assert (vecs.view == 0); + vecs.view = 1; + assert (vecs.view == 1); + assert (vecs.value != 1.1f); // old view + vecs.view = 0; + } + + // manipulate 'view' with iinc + { + assert (vecs.view == 0); + vecs.view++; + assert (vecs.view == 1); + assert (vecs.value != 1.1f); // old view + vecs.view = 0; + } + + // manipulate 'view' with next() + { + assert (vecs.view == 0); + vecs.next(); + assert (vecs.view == 1); + assert (vecs.value != 1.1f); // old view + vecs.view = 0; + } + + // test bounds checking + { + assert (vecs.view == 0); + try { + vecs.view = 49; + assert vecs.view == 49; + vecs.view = 0; + vecs.view = 50; + System.out.println("org.lwjgl.util.mapped.Checks is false or there is a bug in bounds checking."); + vecs.view = 0; + } catch (IndexOutOfBoundsException e) { + // expected, ignore + } + + assert (vecs.view == 0); + + try { + vecs.view = 10; + MappedFloat vecs2 = vecs.slice(); + vecs.view = 0; + + vecs2.view = 39; + assert vecs2.view == 39; + vecs2.view = 40; + System.out.println("org.lwjgl.util.mapped.Checks is false or there is a bug in bounds checking."); + } catch (IndexOutOfBoundsException e) { + // expected, ignore + } + + try { + ByteBuffer posTest = ByteBuffer.allocateDirect(200); + posTest.position(10 * MappedFloat.SIZEOF); // position > 0 + + MappedFloat vecs2 = MappedFloat.map(posTest); + vecs2.view = 39; + assert vecs2.view == 39; + vecs2.view = 40; + System.out.println("org.lwjgl.util.mapped.Checks is false or there is a bug in bounds checking."); + } catch (IndexOutOfBoundsException e) { + // expected, ignore + } + } + + // test newBuffer + { + long addr1 = MemoryUtil.getAddress(bb); + ByteBuffer bb2 = MappedHelper.newBuffer(addr1, bb.capacity()); + long addr2 = MemoryUtil.getAddress(bb); + + System.out.println(bb); + System.out.println(bb2); + System.out.println(addr1); + System.out.println(addr2); + } + + // test 'copy' + { + vecs.value = 13.37f; + MappedFloat dec2 = vecs.dup(); + dec2.view = 1; + System.out.println(vecs); + System.out.println(dec2); + vecs.copyTo(dec2); + System.out.println(vecs); + System.out.println(dec2); + assert (dec2.value == 13.37f); + + vecs.value = 73.31f; + vecs.copyRange(dec2, 1); + assert (dec2.value == 73.31f); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests2.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests2.java new file mode 100644 index 0000000..c8daac7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests2.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import java.nio.ByteBuffer; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class MappedObjectTests2 { + + static void testWriteFieldAccess(MappedVec3 vecs) { + // write access results into a transform-time IllegalAccessException + + System.out.println(vecs.baseAddress); // test read-access + + System.out.println(vecs.viewAddress); // test read-access + + System.out.println(vecs.getAlign()); // test read-access + + System.out.println(MappedVec3.SIZEOF); // test read-access + } + + static void testFields() { + ByteBuffer bb = ByteBuffer.allocateDirect(200); + MappedVec3 vecs = MappedVec3.map(bb); + + testWriteFieldAccess(vecs); + + vecs.x = 13.13f; + vecs.y = 14.14f; + vecs.z = 15.15f; + + System.out.println(vecs.viewAddress); + + assert (vecs.x == 13.13f); + assert (vecs.y == 14.14f); + assert (vecs.z == 15.15f); + + vecs.view = 0; + + assert (vecs.x == 13.13f); + assert (vecs.y == 14.14f); + assert (vecs.z == 15.15f); + + System.out.println(vecs); + vecs.view = 1; + System.out.println(vecs); + + assert (vecs.x == 0.0f); + assert (vecs.y == 0.0f); + assert (vecs.z == 0.0f); + + // now it becomes weird: offsets and strides + + vecs.view = 1; + vecs.x = 0.1234f; + vecs.view = 0; + + // test stride & sizeof + { + long a1 = vecs.viewAddress; + vecs.view = 1; + long a2 = vecs.viewAddress; + assert (a2 - a1 == MappedVec3.SIZEOF); + assert (a2 - a1 == vecs.getSizeof()); + vecs.view = 0; + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java new file mode 100644 index 0000000..01ec9c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests3.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.MemoryUtil; +import org.lwjgl.util.mapped.MappedObject; +import org.lwjgl.util.mapped.MappedSet; +import org.lwjgl.util.mapped.MappedSet2; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import static org.lwjgl.util.mapped.MappedObject.*; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class MappedObjectTests3 { + + static void testMappedBuffer() { + int elementCount = 4; + + MappedSomething some = MappedSomething.malloc(elementCount); + + assert (some.data != some.data); + + long addr1 = MemoryUtil.getAddress(some.backingByteBuffer()); + + ByteBuffer mapped = some.data; // creates new ByteBuffer instance + long addr2 = MemoryUtil.getAddress(mapped); + + assert (addr2 - addr1 == 4); + assert (mapped.capacity() == MappedSomething.SIZEOF - 4); + + { + assert (some.shared == 0); + assert (mapped.getInt(8) == 0); + + some.shared = 1234; + + assert (some.shared == 1234); + assert (mapped.getInt(8) == 1234); + } + + some.view++; + mapped = some.data; // creates new ByteBuffer instance + + long addr3 = MemoryUtil.getAddress(mapped); + assert (addr3 - addr1 == 4 + MappedSomething.SIZEOF); + assert (addr3 - addr2 == 0 + MappedSomething.SIZEOF); + assert (mapped.capacity() == MappedSomething.SIZEOF - 4); + } + + static void testForeach() { + int elementCount = 10; + MappedSomething some = MappedSomething.malloc(elementCount); + + int i = 0; + for ( MappedSomething item : foreach(some, elementCount / 2) ) { + assert (item.view == i++); + } + assert (some.view == (elementCount / 2) - 1); + System.out.println("current.view=" + some.view + ", not " + (elementCount / 2) + ", as you might expect"); + + i = 0; + for ( MappedSomething item : foreach(some) ) { + assert (item.view == i++); + } + assert (some.view == elementCount - 1); + } + + public static class Xyz extends MappedObject { + + int x, y, z; + } + + static void testConstructor() { + int capacity = 1024; + ByteBuffer bb = ByteBuffer.allocateDirect(capacity).order(ByteOrder.nativeOrder()); + long address = MemoryUtil.getAddress(bb); + + MappedFloat mf = MappedFloat.map(address, capacity); + + assert (address == mf.baseAddress); + + assert (mf.value == 0.0f); + mf.view = 1; + assert (mf.value == 0.0f); + mf.runViewConstructor(); + assert (mf.value == 4.0f); + + Xyz.malloc(3); + } + + static void testMappedSet() { + MappedVec2 vec2 = MappedVec2.malloc(3); + MappedVec3 vec3 = MappedVec3.malloc(3); + + MappedSet2 set = MappedSet.create(vec2, vec3); + + assert (vec2.view == 0); + assert (vec3.view == 0); + + set.view = 2; + assert (vec2.view == 2); + assert (vec3.view == 2); + + set.view = 0; + assert (vec2.view == 0); + assert (vec3.view == 0); + + set.next(); + assert (vec2.view == 1); + assert (vec3.view == 1); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java new file mode 100644 index 0000000..f6ea670 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectTests4.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.MemoryUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.opengl.Display; +import org.lwjgl.util.mapped.*; + +import java.io.File; +import java.lang.reflect.Field; +import java.nio.ByteBuffer; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class MappedObjectTests4 { + + public static void testLWJGL() throws Exception { + System.out.println(new File(System.getProperty("java.library.path")).getCanonicalPath()); + Display.create(); + } + + public static void testLocalView() { + MappedFloat mapped1 = MappedFloat.malloc(5); + MappedFloat mapped2 = MappedFloat.malloc(5); + + testLocalView(mapped1); + testLocalView(mapped1, mapped2); + + MappedSomething some = MappedSomething.malloc(5); + testLocalView(some); + } + + private static void testLocalView(MappedFloat mapped1) { + final MappedFloat[] array = mapped1.asArray(); + + assert (array.length == 5); + + int l = 10 * array.length; + for ( int localView1 = 0; localView1 < 5; localView1++ ) { + array[localView1].value = localView1 * 5; + array[localView1].value *= 2.0f; + } + System.out.println(); + float x = 0.0f; + for ( int localView1 = 0; localView1 < 5; localView1++ ) { + System.out.println("[" + localView1 + "] =>" + array[localView1].value); + x += array[localView1].value; + } + System.out.println("x = " + x); + } + + private static void testLocalView(MappedFloat mo1, MappedFloat mo2) { + final MappedFloat[] array1 = mo1.<MappedFloat>asArray(); + for ( int v1 = 0; v1 < 5; v1++ ) { + array1[v1].value = (float)Math.random(); + array1[v1].value *= 2.0f; + } + final MappedFloat[] array2 = mo2.<MappedFloat>asArray(); + for ( int v2 = 0; v2 < 5; v2++ ) { + array2[v2].value = (float)Math.random(); + array2[v2].value *= 2.0f; + } + + System.out.println(); + + for ( int v1 = 0; v1 < 5; v1++ ) { + System.out.println("[" + v1 + "] =>" + array1[v1].value); + } + for ( int v2 = 0; v2 < 5; v2++ ) { + System.out.println("[" + v2 + "] =>" + array2[v2].value); + } + } + + private static void testLocalView(MappedSomething some) { + final MappedSomething[] array = some.asArray(); + + assert (array.length == 5); + + final long baseAddress = MemoryUtil.getAddress(some.backingByteBuffer()); + for ( int i = 0; i < array.length; i++ ) { + ByteBuffer data = array[i].data; + + assert (data.capacity() == (64 - 4)); + assert (MemoryUtil.getAddress(data) == baseAddress + i * MappedSomething.SIZEOF + 4); + } + } + + public static class MappedPointer extends MappedObject { + + int foo; + @Pointer long pointer; + int bar; + + } + + public static void testPointer() { + MappedPointer data = MappedPointer.malloc(100); + + assert (data.backingByteBuffer().capacity() == 100 * (4 + 4 + PointerBuffer.getPointerSize())); + + for ( int i = 0; i < 100; i++ ) { + data.view = i; + + data.foo = i; + data.pointer = i * 1000; + data.bar = i * 2; + } + + for ( int i = 0; i < 100; i++ ) { + data.view = i; + + assert (data.foo == i); + assert (data.pointer == i * 1000); + assert (data.bar == i * 2); + } + } + + @MappedType(cacheLinePadding = true) + public static class MappedCacheLinePadded extends MappedObject { + + int foo; + int bar; + + } + + public static void testCacheLineAlignment() { + MappedCacheLinePadded data = MappedCacheLinePadded.malloc(10); + + assert (data.backingByteBuffer().capacity() == 10 * CacheUtil.getCacheLineSize()); + assert (MemoryUtil.getAddress(data.backingByteBuffer()) % CacheUtil.getCacheLineSize() == 0); + + for ( int i = 0; i < 10; i++ ) { + data.view = i; + + data.foo = i; + data.bar = i * 2; + } + + for ( int i = 0; i < 10; i++ ) { + data.view = i; + + assert (data.foo == i); + assert (data.bar == i * 2); + } + } + + public static class MappedFieldCacheLinePadded extends MappedObject { + + // If we assume CacheUtil.getCacheLineSize() == 64 + // 0 - 63 + @CacheLinePad long longBar; + // 64 - 71 + long longFoo; + // 72 - 75 + int intFoo; + // 128 - 131 + @CacheLinePad(before = true) int intBar; + // 192 - 195 + int foo; + // 256 - 267 + @CacheLinePad(before = true, after = false) + @MappedField(byteLength = 12) + ByteBuffer buffer; + // 268 - 271 + int bar; + + } + + public static void testCacheLinePadding() { + MappedFieldCacheLinePadded data = MappedFieldCacheLinePadded.map(CacheUtil.createByteBuffer(10 * MappedFieldCacheLinePadded.SIZEOF)); + + final int sizeof = + CacheUtil.getCacheLineSize() + + 8 + + (CacheUtil.getCacheLineSize() - 8) + + CacheUtil.getCacheLineSize() + + 4 + + (CacheUtil.getCacheLineSize() - 4) + + 12 + + 4; + + assert (MappedFieldCacheLinePadded.SIZEOF == sizeof); + assert (data.backingByteBuffer().capacity() == sizeof * 10); + + for ( int i = 0; i < 10; i++ ) { + data.view = i; + + data.longFoo = i * 1000000000L; + data.longBar = i * 2000000000L; + data.intFoo = i * 1000; + data.intBar = i * 2000; + data.foo = i; + } + + for ( int i = 0; i < 10; i++ ) { + data.view = i; + + assert (data.longFoo == i * 1000000000L); + assert (data.longBar == i * 2000000000L); + assert (data.intFoo == i * 1000); + assert (data.intBar == i * 2000); + assert (data.foo == i); + } + } + + public static class POJOFieldCacheLinePadded { + + @CacheLinePad long longBar; + long longFoo; + int intFoo; + @CacheLinePad(before = true) int intBar; + int foo; + @CacheLinePad boolean bool; + int bar; + + } + + public static void testCacheLinePaddingPOJO() { + Field[] fields = new POJOFieldCacheLinePadded().getClass().getDeclaredFields(); + assert (fields.length == (1 + 7) + 1 + 1 + (15 + 1 + 15) + 1 + (1 + 63) + 1); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectWithLibrary.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectWithLibrary.java new file mode 100644 index 0000000..aec393f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedObjectWithLibrary.java @@ -0,0 +1,17 @@ +/* + * Created on Jul 12, 2011 + */ + +package org.lwjgl.test.mapped; + +import org.lwjgl.opengl.Display; + +import java.io.File; + +public class MappedObjectWithLibrary { + + public static void testLWJGL() throws Exception { + System.out.println(new File(System.getProperty("java.library.path")).getCanonicalPath()); + Display.create(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedSomething.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedSomething.java new file mode 100644 index 0000000..95590ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedSomething.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.util.mapped.MappedField; +import org.lwjgl.util.mapped.MappedObject; + +import java.nio.ByteBuffer; + +/** @author Riven */ +public class MappedSomething extends MappedObject { + + @MappedField(byteOffset = 0) + public int used; + + @MappedField(byteLength = 64 - 4) // optional byteOffset + public ByteBuffer data; + + @MappedField(byteOffset = 12) // inside data + public int shared; + + @Override + public String toString() { + return "MappedSomething[" + used + "]"; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec2.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec2.java new file mode 100644 index 0000000..74512f3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec2.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.util.mapped.MappedObject; + +/** @author Riven */ +public class MappedVec2 extends MappedObject { + + public float x; + + public float y; + + @Override + public String toString() { + return "MappedVec2[" + x + "," + y + "]"; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec3.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec3.java new file mode 100644 index 0000000..d0536be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/MappedVec3.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.util.mapped.MappedObject; + +/** @author Riven */ +public class MappedVec3 extends MappedObject { + + public float x; + + public float y; + + public float z; + + @Override + public String toString() { + return "[" + x + "," + y + "," + z + "]"; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/TestMappedObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/TestMappedObject.java new file mode 100644 index 0000000..0cee7f5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/mapped/TestMappedObject.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.mapped; + +import org.lwjgl.util.mapped.MappedObjectClassLoader; +import org.lwjgl.util.mapped.MappedObjectTransformer; + +/** @author Riven */ +@SuppressWarnings("static-access") +public class TestMappedObject { + + static { + boolean assertsEnabled = false; + assert assertsEnabled = true; // Intentional side effect!!! + if ( !assertsEnabled ) + throw new RuntimeException("Asserts must be enabled for this test."); + } + + public static void main(String[] args) throws Exception { + MappedObjectTransformer.register(MappedFloat.class); + MappedObjectTransformer.register(MappedVec2.class); + MappedObjectTransformer.register(MappedVec3.class); + MappedObjectTransformer.register(MappedSomething.class); + MappedObjectTransformer.register(MappedObjectTests3.Xyz.class); + MappedObjectTransformer.register(MappedObjectTests4.MappedPointer.class); + MappedObjectTransformer.register(MappedObjectTests4.MappedCacheLinePadded.class); + MappedObjectTransformer.register(MappedObjectTests4.MappedFieldCacheLinePadded.class); + + if ( MappedObjectClassLoader.fork(TestMappedObject.class, args) ) { + return; + } + + MappedObjectTests1.testViewField(); + + MappedObjectTests2.testFields(); + + // MappedObjectBench.benchmarkMapped(); + // MappedObjectBench.benchmarkInstances(); + // MappedObjectBench.benchmarkIndirectArray(); + // MappedObjectBench.benchmarkDirectArray(); + // MappedObjectBench.benchmarkUnsafe(); + + MappedObjectTests3.testMappedBuffer(); + MappedObjectTests3.testForeach(); + MappedObjectTests3.testConstructor(); + MappedObjectTests3.testMappedSet(); + + MappedObjectTests4.testLocalView(); + //MappedObjectTests4.testLWJGL(); + MappedObjectTests4.testPointer(); + MappedObjectTests4.testCacheLineAlignment(); + MappedObjectTests4.testCacheLinePadding(); + MappedObjectTests4.testCacheLinePaddingPOJO(); + + System.out.println("done"); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCCaptureTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCCaptureTest.java new file mode 100644 index 0000000..c3df9fb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCCaptureTest.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.ALC10; +import org.lwjgl.openal.ALC11; +import org.lwjgl.openal.ALCdevice; +import org.lwjgl.openal.OpenALException; + +/** + * + * This is a test for the ALC part of OpenAL + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2286 $ + * $Id: ALCTest.java 2286 2006-03-23 19:32:21Z matzon $ + */ +public class ALCCaptureTest extends BasicTest { + + /** + * Creates an instance of ALCTest + */ + public ALCCaptureTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + int lastError = ALC10.ALC_NO_ERROR; + IntBuffer sampleCount = BufferUtils.createIntBuffer(1); + + int state = AL10.AL_PLAYING; + int FMT = AL10.AL_FORMAT_MONO16; + int FMTSIZE = 16/8; + int FREQ = 44100; + int TIME = 5; + int SAMPS = (FREQ * TIME); + ByteBuffer buf = BufferUtils.createByteBuffer(SAMPS * FMTSIZE); + + // check that capture is available + if(!ALC10.alcIsExtensionPresent(AL.getDevice(), "ALC_EXT_CAPTURE")) { + throw new OpenALException("ALC_EXT_CAPTURE extension not available"); + } + + // get list of devices + String[] captureDevices = ALC10.alcGetString(null, ALC11.ALC_CAPTURE_DEVICE_SPECIFIER).split("\0"); + System.out.println("Available Capture Devices: "); + for(int i=0; i<captureDevices.length; i++) { + System.out.println(i + ": " + captureDevices[i]); + } + + String defaultRecorder = ALC10.alcGetString(AL.getDevice(), ALC11.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); + System.out.println("Default capture device: " + defaultRecorder); + + ALCdevice device = ALC11.alcCaptureOpenDevice(null, FREQ, FMT, SAMPS); + + if(device != null) { + // record some sound + // ===================================== + System.out.print("Recording using " + ALC10.alcGetString(device, ALC11.ALC_CAPTURE_DEVICE_SPECIFIER) + "..."); + ALC11.alcCaptureStart(device); + while (sampleCount.get(0) < SAMPS) { + pause(1000); + ALC10.alcGetInteger(device, ALC11.ALC_CAPTURE_SAMPLES, sampleCount); + } + System.out.println("done"); + ALC11.alcCaptureStop(device); + + // capure the samples + ALC11.alcCaptureSamples(device, buf, SAMPS); + ALC11.alcCaptureCloseDevice(device); + // ------------------------------------- + + // play back recording + // =================== + IntBuffer buffers = BufferUtils.createIntBuffer(1); + IntBuffer sources = BufferUtils.createIntBuffer(1); + + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + + sources.position(0).limit(1); + AL10.alGenSources(sources); + + System.out.print("Playing..."); + + AL10.alBufferData(buffers.get(0), FMT, buf, FREQ); + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_FALSE); + AL10.alSourcePlay(sources.get(0)); + + while (state == AL10.AL_PLAYING) + { + pause(100); + state = AL10.alGetSourcei(sources.get(0), AL10.AL_SOURCE_STATE); + } + + System.out.println("done"); + + AL10.alDeleteSources(sources); + AL10.alDeleteBuffers(buffers); + } + + alExit(); + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + ALCCaptureTest alcTest = new ALCCaptureTest(); + alcTest.execute(args); + System.exit(0); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCTest.java new file mode 100644 index 0000000..90ecf97 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/ALCTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.ALC10; + +/** + * + * This is a test for the ALC part of OpenAL + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class ALCTest extends BasicTest { + + /** + * Creates an instance of ALCTest + */ + public ALCTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + //error stuff + int lastError = ALC10.ALC_NO_ERROR; + + //create attribute list for context creation + IntBuffer buffer = BufferUtils.createIntBuffer(7); + + if ((lastError = ALC10.alcGetError(AL.getDevice())) != ALC10.ALC_NO_ERROR) { + System.out.println("ALC Error: " + ALC10.alcGetString(AL.getDevice(), lastError)); + System.exit(-1); + } + + //query + System.out.println( + "DEFAULT_DEVICE_SPECIFIER: " + + ALC10.alcGetString(AL.getDevice(), ALC10.ALC_DEFAULT_DEVICE_SPECIFIER)); + System.out.println( + "DEVICE_SPECIFIER: " + ALC10.alcGetString(AL.getDevice(), ALC10.ALC_DEVICE_SPECIFIER)); + System.out.println("EXTENSIONS: " + ALC10.alcGetString(AL.getDevice(), ALC10.ALC_EXTENSIONS)); + + //mo query + buffer.rewind(); + buffer.position(0); + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MAJOR_VERSION, buffer); + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MINOR_VERSION, (IntBuffer) buffer.position(1)); + + System.out.println("ALC_MAJOR_VERSION: " + buffer.get(0)); + System.out.println("ALC_MINOR_VERSION: " + buffer.get(1)); + + //no check for ALC_ALL_ATTRIBUTES / ALC_ATTRIBUTES_SIZE since it + //is buggy on win32 - my dev platform + + //get an enumerstion value + System.out.println( + "Value of ALC_MAJOR_VERSION: " + + ALC10.alcGetEnumValue(AL.getDevice(), "ALC_MAJOR_VERSION")); + + alExit(); + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + ALCTest alcTest = new ALCTest(); + alcTest.execute(args); + System.exit(0); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/BasicTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/BasicTest.java new file mode 100644 index 0000000..f8d2610 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/BasicTest.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.FloatBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.ALC10; +import org.lwjgl.opengl.DisplayMode; + +/** + * + * This is a basic test, which contains the most used stuff + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public abstract class BasicTest { + + /** + * Creates an instance of PlayTest + */ + protected BasicTest() { + try { + AL.create(); + + System.out.println("Default device: " + ALC10.alcGetString(null, ALC10.ALC_DEFAULT_DEVICE_SPECIFIER)); + + if(ALC10.alcIsExtensionPresent(null, "ALC_ENUMERATION_EXT")) { + String[] devices = ALC10.alcGetString(null, ALC10.ALC_DEVICE_SPECIFIER).split("\0"); + System.out.println("Available devices: "); + for(int i=0; i<devices.length; i++) { + System.out.println(i +": " + devices[i]); + } + } + } catch (Exception e) { + System.out.println("Unable to create OpenAL.\nPlease make sure that OpenAL is available on this system. Exception: " + e); + return; + } + } + + /** + * Shutdowns OpenAL + */ + protected void alExit() { + if(AL.isCreated()) { + AL.destroy(); + } + } + + /** + * Creates a float buffer to hold specified float array + * - strictly a utility method + * + * @param array to hold + * @return created FloatBuffer + */ + protected FloatBuffer createFloatBuffer(float[] data) { + FloatBuffer temp = BufferUtils.createFloatBuffer(data.length).put(data); + temp.flip(); + return temp; + } + + /** + * Pauses the invoking thread for specified milliseconds + * + * @param time Milliseconds to sleep + */ + protected void pause(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException inte) { + } + } + + /** + * Exits the test NOW, printing errorcode to stdout + * + * @param error Error code causing exit + */ + protected void exit(int error) { + System.out.println("OpenAL Error: " + AL10.alGetString(error)); + alExit(); + System.exit(-1); + } + + /** + * Sets the display mode for fullscreen mode + */ + protected boolean setDisplayMode() { + try { + // get modes + DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(640, 480, -1, -1, -1, -1, 60, 60); + + org.lwjgl.util.Display.setDisplayMode(dm, new String[] { + "width=" + 640, + "height=" + 480, + "freq=" + 60, + "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() + }); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/EFX10Test.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/EFX10Test.java new file mode 100644 index 0000000..9e6d187 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/EFX10Test.java @@ -0,0 +1,464 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.AL11; +import org.lwjgl.openal.ALC10; +import org.lwjgl.openal.ALCcontext; +import org.lwjgl.openal.ALCdevice; +import org.lwjgl.openal.EFX10; +import org.lwjgl.openal.EFXUtil; +import org.lwjgl.util.WaveData; + +/** + * Class with a few examples testing and demonstrating the use of the OpenAL extension ALC_EXT_EFX. + * <p> + * This class is not compatible with the LWJGL debug build (lwjgl-debug.jar), as the debug build + * throws exceptions instead of alGetError checks. The redundant exception handling code was not + * added in order to keep these examples simple. + * + * @author Ciardhubh <ciardhubh[at]ciardhubh.de> + * @version $Revision$ + * $Id$ + */ +public final class EFX10Test { + + public static void main(final String[] args) throws Exception { + silentTests(); + playbackTest(); + efxUtilTest(); + } + + /** + * Loads OpenAL and makes sure ALC_EXT_EFX is supported. + */ + private static void setupEfx() throws Exception { + // Load and create OpenAL + if (!AL.isCreated()) { + AL.create(); + } + // Query for Effect Extension + if (!ALC10.alcIsExtensionPresent(AL.getDevice(), EFX10.ALC_EXT_EFX_NAME)) { + throw new Exception("No ALC_EXT_EFX supported by driver."); + } + System.out.println("ALC_EXT_EFX found."); + } + + /** + * Runs a series of API calls similar to the tutorials in the Effects Extension Guide of the + * OpenAL SDK. Nothing is played in this method. + */ + private static void silentTests() throws Exception { + setupEfx(); + + final ALCdevice device = AL.getDevice(); + + // Create context (only necessary if LWJGL context isn't sufficient, done as example) + final IntBuffer contextAttribList = BufferUtils.createIntBuffer(8); + contextAttribList.put(ALC10.ALC_FREQUENCY); + contextAttribList.put(44100); + contextAttribList.put(ALC10.ALC_REFRESH); + contextAttribList.put(60); + contextAttribList.put(ALC10.ALC_SYNC); + contextAttribList.put(ALC10.ALC_FALSE); + contextAttribList.rewind(); + // ALC_MAX_AUXILIARY_SENDS won't go above compile-time max. Set to compile-time max if + // greater. + contextAttribList.put(EFX10.ALC_MAX_AUXILIARY_SENDS); + contextAttribList.put(2); + final ALCcontext newContext = ALC10.alcCreateContext(device, contextAttribList); + if (newContext == null) { + throw new Exception("Failed to create context."); + } + final int contextCurResult = ALC10.alcMakeContextCurrent(newContext); + if (contextCurResult == ALC10.ALC_FALSE) { + throw new Exception("Failed to make context current."); + } + + // Query EFX ALC values + System.out.println("AL_VERSION: " + AL10.alGetString(AL10.AL_VERSION)); + final IntBuffer buff = BufferUtils.createIntBuffer(1); + ALC10.alcGetInteger(device, EFX10.ALC_EFX_MAJOR_VERSION, buff); + System.out.println("ALC_EFX_MAJOR_VERSION: " + buff.get(0)); + ALC10.alcGetInteger(device, EFX10.ALC_EFX_MINOR_VERSION, buff); + System.out.println("ALC_EFX_MINOR_VERSION: " + buff.get(0)); + ALC10.alcGetInteger(device, EFX10.ALC_MAX_AUXILIARY_SENDS, buff); + final int maxAuxSends = buff.get(0); + System.out.println("ALC_MAX_AUXILIARY_SENDS: " + maxAuxSends); + + + // Try to create 4 Auxiliary Effect Slots + int numAuxSlots = 0; + final int[] auxEffectSlots = new int[4]; // try more to test + AL10.alGetError(); + for (numAuxSlots = 0; numAuxSlots < 4; numAuxSlots++) { + auxEffectSlots[numAuxSlots] = EFX10.alGenAuxiliaryEffectSlots(); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + break; + } + } + System.out.println("Created " + numAuxSlots + " aux effect slots."); + + // Try to create 2 Effects + int numEffects = 0; + final int[] effects = new int[2]; + for (numEffects = 0; numEffects < 2; numEffects++) { + effects[numEffects] = EFX10.alGenEffects(); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + break; + } + } + System.out.println("Created " + numEffects + " effects."); + + // Set first Effect Type to Reverb and change Decay Time + AL10.alGetError(); + if (EFX10.alIsEffect(effects[0])) { + EFX10.alEffecti(effects[0], EFX10.AL_EFFECT_TYPE, EFX10.AL_EFFECT_REVERB); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Reverb effect not supported."); + } else { + EFX10.alEffectf(effects[0], EFX10.AL_REVERB_DECAY_TIME, 5.0f); + System.out.println("Reverb effect created."); + } + } else { + throw new Exception("First effect not a valid effect."); + } + + // Set second Effect Type to Flanger and change Phase + AL10.alGetError(); + if (EFX10.alIsEffect(effects[1])) { + EFX10.alEffecti(effects[1], EFX10.AL_EFFECT_TYPE, EFX10.AL_EFFECT_FLANGER); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Flanger effect not support."); + } else { + EFX10.alEffecti(effects[1], EFX10.AL_FLANGER_PHASE, 180); + System.out.println("Flanger effect created."); + } + } else { + throw new Exception("Second effect not a valid effect."); + } + + // Try to create a Filter + AL10.alGetError(); + final int filter = EFX10.alGenFilters(); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new Exception("Failed to create filter."); + } + System.out.println("Generated a filter."); + if (EFX10.alIsFilter(filter)) { + // Set Filter type to Low-Pass and set parameters + EFX10.alFilteri(filter, EFX10.AL_FILTER_TYPE, EFX10.AL_FILTER_LOWPASS); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Low pass filter not supported."); + } else { + EFX10.alFilterf(filter, EFX10.AL_LOWPASS_GAIN, 0.5f); + EFX10.alFilterf(filter, EFX10.AL_LOWPASS_GAINHF, 0.5f); + System.out.println("Low pass filter created."); + } + } + + // Attach Effect to Auxiliary Effect Slot + AL10.alGetError(); + EFX10.alAuxiliaryEffectSloti(auxEffectSlots[0], EFX10.AL_EFFECTSLOT_EFFECT, effects[0]); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new Exception("Failed to attach effect to aux effect slot."); + } + System.out.println("Successfully loaded effect into effect slot."); + + // Configure Source Auxiliary Effect Slot Sends + final int source = AL10.alGenSources(); + // Set Source Send 0 to feed auxEffectSlots[0] without filtering + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, auxEffectSlots[0], 0, + EFX10.AL_FILTER_NULL); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new Exception("Failed to configure Source Send 0"); + } + System.out.println("Linked aux effect slot to soutce slot 0"); + // Set Source Send 1 to feed uiEffectSlot[1] with filter filter + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, auxEffectSlots[1], 1, filter); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + // e.g. if only 1 send per source is available + throw new Exception("Failed to configure Source Send 1"); + } + System.out.println("Linked aux effect slot to soutce slot 1"); + // Disable Send 0 + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, EFX10.AL_EFFECTSLOT_NULL, 0, + EFX10.AL_FILTER_NULL); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new Exception("Failed to disable Source Send 0"); + } + System.out.println("Disabled source send 0"); + // Disable Send 1 + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, EFX10.AL_EFFECTSLOT_NULL, 1, + EFX10.AL_FILTER_NULL); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + throw new Exception("Failed to disable Source Send 1"); + } + System.out.println("Disabled source send 1"); + + + // Filter 'source', a generated Source + AL10.alSourcei(source, EFX10.AL_DIRECT_FILTER, filter); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + { + System.out.println("Successfully applied a direct path filter"); + // Remove filter from 'source' + AL10.alSourcei(source, EFX10.AL_DIRECT_FILTER, EFX10.AL_FILTER_NULL); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + System.out.println("Successfully removed direct filter"); + } + } + // Filter the Source send 0 from 'source' to Auxiliary Effect Slot auxEffectSlot[0] + // using Filter uiFilter[0] + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, auxEffectSlots[0], 0, filter); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + { + System.out.println("Successfully applied aux send filter"); + // Remove Filter from Source Auxiliary Send + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, auxEffectSlots[0], 0, + EFX10.AL_FILTER_NULL); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + System.out.println("Successfully removed filter"); + } + } + } + } + + // Set Source Cone Outer Gain HF value + AL10.alSourcef(source, EFX10.AL_CONE_OUTER_GAINHF, 0.5f); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + System.out.println("Successfully set cone outside gain filter"); + } + + // Set distance units to be in feet + AL10.alListenerf(EFX10.AL_METERS_PER_UNIT, 0.3f); + if (AL10.alGetError() == AL10.AL_NO_ERROR) { + System.out.println("Successfully set distance units"); + } + + // Cleanup + final IntBuffer auxEffectSlotsBuf = (IntBuffer) BufferUtils.createIntBuffer( + auxEffectSlots.length).put(auxEffectSlots).rewind(); + EFX10.alDeleteAuxiliaryEffectSlots(auxEffectSlotsBuf); + final IntBuffer effectsBuf = (IntBuffer) BufferUtils.createIntBuffer( + effects.length).put(effects).rewind(); + EFX10.alDeleteEffects(effectsBuf); + EFX10.alDeleteFilters(filter); + AL.destroy(); + } + + /** + * Plays a sound with various effects applied to it. + */ + private static void playbackTest() throws Exception { + setupEfx(); + + // Create a source and buffer audio data + final int source = AL10.alGenSources(); + final int buffer = AL10.alGenBuffers(); + WaveData waveFile = WaveData.create("Footsteps.wav"); + if (waveFile == null) { + System.out.println("Failed to load Footsteps.wav! Skipping playback test."); + AL.destroy(); + return; + } + AL10.alBufferData(buffer, waveFile.format, waveFile.data, waveFile.samplerate); + waveFile.dispose(); + AL10.alSourcei(source, AL10.AL_BUFFER, buffer); + AL10.alSourcei(source, AL10.AL_LOOPING, AL10.AL_TRUE); + + System.out.println("Playing sound unaffected by EFX ..."); + AL10.alSourcePlay(source); + Thread.sleep(7500); + + // Add reverb effect + final int effectSlot = EFX10.alGenAuxiliaryEffectSlots(); + final int reverbEffect = EFX10.alGenEffects(); + EFX10.alEffecti(reverbEffect, EFX10.AL_EFFECT_TYPE, EFX10.AL_EFFECT_REVERB); + EFX10.alEffectf(reverbEffect, EFX10.AL_REVERB_DECAY_TIME, 5.0f); + EFX10.alAuxiliaryEffectSloti(effectSlot, EFX10.AL_EFFECTSLOT_EFFECT, reverbEffect); + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, effectSlot, 0, + EFX10.AL_FILTER_NULL); + + System.out.println("Playing sound with reverb ..."); + AL10.alSourcePlay(source); + Thread.sleep(7500); + + // Add low-pass filter directly to source + final int filter = EFX10.alGenFilters(); + EFX10.alFilteri(filter, EFX10.AL_FILTER_TYPE, EFX10.AL_FILTER_LOWPASS); + EFX10.alFilterf(filter, EFX10.AL_LOWPASS_GAIN, 0.5f); + EFX10.alFilterf(filter, EFX10.AL_LOWPASS_GAINHF, 0.5f); + AL10.alSourcei(source, EFX10.AL_DIRECT_FILTER, filter); + + System.out.println("Playing sound with reverb and direct low pass filter ..."); + AL10.alSourcePlay(source); + Thread.sleep(7500); + AL10.alSourcei(source, EFX10.AL_DIRECT_FILTER, EFX10.AL_FILTER_NULL); + + // Add low-pass filter to source send + //AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, effectSlot, 0, filter); + // + //System.out.println("Playing sound with reverb and aux send low pass filter ..."); + //AL10.alSourcePlay(source); + //Thread.sleep(7500); + + // Cleanup + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, EFX10.AL_EFFECTSLOT_NULL, 0, + EFX10.AL_FILTER_NULL); + EFX10.alAuxiliaryEffectSloti(effectSlot, EFX10.AL_EFFECTSLOT_EFFECT, EFX10.AL_EFFECT_NULL); + EFX10.alDeleteEffects(reverbEffect); + EFX10.alDeleteFilters(filter); + + // Echo effect + final int echoEffect = EFX10.alGenEffects(); + EFX10.alEffecti(echoEffect, EFX10.AL_EFFECT_TYPE, EFX10.AL_EFFECT_ECHO); + //EFX10.alEffectf(echoEffect, EFX10.AL_ECHO_DELAY, 5.0f); + EFX10.alAuxiliaryEffectSloti(effectSlot, EFX10.AL_EFFECTSLOT_EFFECT, echoEffect); + AL11.alSource3i(source, EFX10.AL_AUXILIARY_SEND_FILTER, effectSlot, 0, + EFX10.AL_FILTER_NULL); + + System.out.println("Playing sound with echo effect ..."); + AL10.alSourcePlay(source); + Thread.sleep(7500); + + AL.destroy(); + } + + /** + * Checks OpenAL for every EFX 1.0 effect and filter and prints the result to the console. + */ + private static void efxUtilTest() throws Exception { + setupEfx(); + + System.out.println(); + System.out.println("Checking supported effects ..."); + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_NULL)) { + System.out.println("AL_EFFECT_NULL is supported."); + } else { + System.out.println("AL_EFFECT_NULL is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_EAXREVERB)) { + System.out.println("AL_EFFECT_EAXREVERB is supported."); + } else { + System.out.println("AL_EFFECT_EAXREVERB is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_REVERB)) { + System.out.println("AL_EFFECT_REVERB is supported."); + } else { + System.out.println("AL_EFFECT_REVERB is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_CHORUS)) { + System.out.println("AL_EFFECT_CHORUS is supported."); + } else { + System.out.println("AL_EFFECT_CHORUS is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_DISTORTION)) { + System.out.println("AL_EFFECT_DISTORTION is supported."); + } else { + System.out.println("AL_EFFECT_DISTORTION is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_ECHO)) { + System.out.println("AL_EFFECT_ECHO is supported."); + } else { + System.out.println("AL_EFFECT_ECHO is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_FLANGER)) { + System.out.println("AL_EFFECT_FLANGER is supported."); + } else { + System.out.println("AL_EFFECT_FLANGER is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_FREQUENCY_SHIFTER)) { + System.out.println("AL_EFFECT_FREQUENCY_SHIFTER is supported."); + } else { + System.out.println("AL_EFFECT_FREQUENCY_SHIFTER is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_VOCAL_MORPHER)) { + System.out.println("AL_EFFECT_VOCAL_MORPHER is supported."); + } else { + System.out.println("AL_EFFECT_VOCAL_MORPHER is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_PITCH_SHIFTER)) { + System.out.println("AL_EFFECT_PITCH_SHIFTER is supported."); + } else { + System.out.println("AL_EFFECT_PITCH_SHIFTER is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_RING_MODULATOR)) { + System.out.println("AL_EFFECT_RING_MODULATOR is supported."); + } else { + System.out.println("AL_EFFECT_RING_MODULATOR is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_AUTOWAH)) { + System.out.println("AL_EFFECT_AUTOWAH is supported."); + } else { + System.out.println("AL_EFFECT_AUTOWAH is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_COMPRESSOR)) { + System.out.println("AL_EFFECT_COMPRESSOR is supported."); + } else { + System.out.println("AL_EFFECT_COMPRESSOR is NOT supported."); + } + if (EFXUtil.isEffectSupported(EFX10.AL_EFFECT_EQUALIZER)) { + System.out.println("AL_EFFECT_EQUALIZER is supported."); + } else { + System.out.println("AL_EFFECT_EQUALIZER is NOT supported."); + } + + System.out.println(); + System.out.println("Checking supported filters ..."); + if (EFXUtil.isFilterSupported(EFX10.AL_FILTER_NULL)) { + System.out.println("AL_FILTER_NULL is supported."); + } else { + System.out.println("AL_FILTER_NULL is NOT supported."); + } + if (EFXUtil.isFilterSupported(EFX10.AL_FILTER_LOWPASS)) { + System.out.println("AL_FILTER_LOWPASS is supported."); + } else { + System.out.println("AL_FILTER_LOWPASS is NOT supported."); + } + if (EFXUtil.isFilterSupported(EFX10.AL_FILTER_HIGHPASS)) { + System.out.println("AL_FILTER_HIGHPASS is supported."); + } else { + System.out.println("AL_FILTER_HIGHPASS is NOT supported."); + } + if (EFXUtil.isFilterSupported(EFX10.AL_FILTER_BANDPASS)) { + System.out.println("AL_FILTER_BANDPASS is supported."); + } else { + System.out.println("AL_FILTER_BANDPASS is NOT supported."); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/MovingSoundTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/MovingSoundTest.java new file mode 100644 index 0000000..c5bade7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/MovingSoundTest.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.input.Keyboard; +import org.lwjgl.openal.AL10; +import org.lwjgl.opengl.Display; +import org.lwjgl.util.WaveData; +import org.lwjgl.util.vector.Vector3f; + +/** + * + * This test simulates a listener positioned in the center, and + * a source moving around the listener using the keyboard + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class MovingSoundTest extends BasicTest { + + public static float MOVEMENT = 50.00f; + + /** + * Creates an instance of MovingSoundTest + */ + public MovingSoundTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + if (args.length < 1) { + System.out.println("no argument supplied, assuming Footsteps.wav"); + args = new String[] {"Footsteps.wav"}; + } + + try { + setDisplayMode(); + Display.create(); + } catch (Exception e) { + e.printStackTrace(); + } + + + int lastError; + Vector3f sourcePosition = new Vector3f(); + Vector3f listenerPosition = new Vector3f(); + + //initialize keyboard + try { + Keyboard.create(); + } catch (Exception e) { + e.printStackTrace(); + exit(-1); + } + + //create 1 buffer and 1 source + IntBuffer buffers = BufferUtils.createIntBuffer(1); + IntBuffer sources = BufferUtils.createIntBuffer(1); + + // al generate buffers and sources + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + sources.position(0).limit(1); + AL10.alGenSources(sources); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //load wave data + WaveData wavefile = WaveData.create(args[0]); + + //copy to buffers + AL10.alBufferData( + buffers.get(0), + wavefile.format, + wavefile.data, + wavefile.samplerate); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //unload file again + wavefile.dispose(); + + //set up source input + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + AL10.alSourcef(sources.get(0), AL10.AL_REFERENCE_DISTANCE, 1024.0f); + AL10.alSourcef(sources.get(0), AL10.AL_ROLLOFF_FACTOR, 0.5f); + + //lets loop the sound + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //play source 0 + AL10.alSourcePlay(sources.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + System.out.println("Move source with arrow keys\nMove listener with right shift and arrowkeys\nExit with ESC"); + + while(!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { + Display.update(); + + Keyboard.poll(); + if(Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + if(Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { + listenerPosition.x -= MOVEMENT; + AL10.alListener3f(AL10.AL_POSITION, listenerPosition.x, listenerPosition.y, listenerPosition.z); + System.out.println("listenerx: " + listenerPosition.x); + } else { + sourcePosition.x -= MOVEMENT; + AL10.alSource3f(sources.get(0), AL10.AL_POSITION, sourcePosition.x, sourcePosition.y, sourcePosition.z); + System.out.println("sourcex: " + sourcePosition.x); + } + } + if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + if(Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { + listenerPosition.x += MOVEMENT; + AL10.alListener3f(AL10.AL_POSITION, listenerPosition.x, listenerPosition.y, listenerPosition.z); + System.out.println("listenerx: " + listenerPosition.x); + } else { + sourcePosition.x += MOVEMENT; + AL10.alSource3f(sources.get(0), AL10.AL_POSITION, sourcePosition.x, sourcePosition.y, sourcePosition.z); + System.out.println("sourcex: " + sourcePosition.x); + } + } + + if(Display.isCloseRequested()) { + break; + } + + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + + //stop source 0 + AL10.alSourceStop(sources.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //delete buffers and sources + sources.position(0).limit(1); + AL10.alDeleteSources(sources); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + buffers.position(0).limit(1); + AL10.alDeleteBuffers(buffers); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //shutdown + alExit(); + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + MovingSoundTest movingSoundTest = new MovingSoundTest(); + movingSoundTest.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALCreationTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALCreationTest.java new file mode 100644 index 0000000..79b9fef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALCreationTest.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.util.WaveData; + +/** + * <br> + * Performs a creation test, by creating and destroying OpenAL twice. + * We cannot inherit from BasicTest since it follows another structure. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class OpenALCreationTest { + + /** + * Creates an instance of OpenALCreationTest + */ + public OpenALCreationTest() { + } + + public void alInitialize() { + try { + AL.create(); + } catch (Exception e) { + e.printStackTrace(); + return; + } + } + + public void alExit() { + AL.destroy(); + } + + /** + * Creates an integer buffer to hold specified ints + * - strictly a utility method + * + * @param size how many int to contain + * @return created IntBuffer + */ + protected IntBuffer createIntBuffer(int size) { + ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); + temp.order(ByteOrder.nativeOrder()); + + return temp.asIntBuffer(); + } + + /** + * Exits the test NOW, printing errorcode to stdout + * + * @param error Error code causing exit + */ + protected void exit(int error) { + System.out.println("OpenAL Error: " + AL10.alGetString(error)); + alExit(); + System.exit(-1); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + int lastError; + + //initialize AL, using ALC + System.out.print("initialize..."); + alInitialize(); + System.out.println("success"); + + //do some audio + executeAudioTest(); + + //shutdown + System.out.print("shutdown..."); + alExit(); + System.out.println("success"); + + //initialize AL, using ALC + System.out.print("initialize..."); + alInitialize(); + System.out.println("success"); + + //do some audio + executeAudioTest(); + + //shutdown + System.out.print("shutdown..."); + alExit(); + System.out.println("success"); + } + + /** + * Executes the audio test, which just plays some sound + */ + private void executeAudioTest() { + int lastError; + + //create 1 buffer and 1 source + IntBuffer buffers = createIntBuffer(1); + IntBuffer sources = createIntBuffer(1); + + // al generate buffers and sources + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + sources.position(0).limit(1); + AL10.alGenSources(sources); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //load wave data + WaveData wavefile = WaveData.create("Footsteps.wav"); + + //copy to buffers + AL10.alBufferData( + buffers.get(0), + wavefile.format, + wavefile.data, + wavefile.samplerate); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //unload file again + wavefile.dispose(); + + //set up source input + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //lets loop the sound + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //play source 0 + AL10.alSourcePlay(sources.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //wait 5 secs + try { + System.out.print("Playing 'Footsteps.wav' for 2 seconds..."); + Thread.sleep(2000); + } catch (InterruptedException inte) { + } + System.out.println("done"); + + //stop source 0 + AL10.alSourceStop(sources.get(0)); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //delete buffers and sources + sources.position(0).limit(1); + AL10.alDeleteSources(sources); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + buffers.position(0).limit(1); + AL10.alDeleteBuffers(buffers); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + OpenALCreationTest oalCreationTest = new OpenALCreationTest(); + oalCreationTest.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALInfo.java new file mode 100644 index 0000000..573275f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/OpenALInfo.java @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.openal.AL; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.ALC10; +import org.lwjgl.openal.ALC11; +import org.lwjgl.openal.ALCdevice; +import org.lwjgl.openal.EFX10; +import org.lwjgl.openal.EFXUtil; + +/** + * + * idea from openal-info + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2983 $ + * $Id$ + */ +public class OpenALInfo { + + /** + * Creates an instance of OpenALInfo + */ + public OpenALInfo() { + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + try { + AL.create(null, -1, 60, false); + checkForErrors(); + } catch (LWJGLException le) { + die("Init", le.getMessage()); + } + + printALCInfo(); + printALInfo(); + printEFXInfo(); + + checkForErrors(); + + AL.destroy(); + } + + private void printALCInfo() { + IntBuffer version = BufferUtils.createIntBuffer(2); + ALCdevice device; + + if(ALC10.alcIsExtensionPresent(null, "ALC_ENUMERATION_EXT")) { + if(ALC10.alcIsExtensionPresent(null, "ALC_ENUMERATE_ALL_EXT")) { + printDevices(ALC11.ALC_ALL_DEVICES_SPECIFIER, "playback"); + } else { + printDevices(ALC10.ALC_DEVICE_SPECIFIER, "playback"); + } + printDevices(ALC11.ALC_CAPTURE_DEVICE_SPECIFIER, "capture"); + } else { + System.out.println("No device enumeration available"); + } + + device = ALC10.alcGetContextsDevice(ALC10.alcGetCurrentContext()); + checkForErrors(); + + System.out.println("Default playback device: " + ALC10.alcGetString(device, ALC10.ALC_DEFAULT_DEVICE_SPECIFIER)); + + System.out.println("Default capture device: " + ALC10.alcGetString(device, ALC11.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER)); + + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MAJOR_VERSION, version); + ALC10.alcGetInteger(AL.getDevice(), ALC10.ALC_MINOR_VERSION, (IntBuffer) version.position(1)); + checkForErrors(); + + System.out.println("ALC version: " + version.get(0) + "." + version.get(1)); + + System.out.println("ALC extensions:"); + String[] extensions = ALC10.alcGetString(device, ALC10.ALC_EXTENSIONS).split(" "); + for ( String extension : extensions ) { + if ( extension.trim().length() == 0 ) { + continue; + } + System.out.println(" " + extension); + } + checkForErrors(); + } + + private void printALInfo() { + System.out.println("OpenAL vendor string: " + AL10.alGetString(AL10.AL_VENDOR)); + System.out.println("OpenAL renderer string: " + AL10.alGetString(AL10.AL_RENDERER)); + System.out.println("OpenAL version string: " + AL10.alGetString(AL10.AL_VERSION)); + System.out.println("AL extensions:"); + String[] extensions = AL10.alGetString(AL10.AL_EXTENSIONS).split(" "); + for ( String extension : extensions ) { + if ( extension.trim().length() == 0 ) { + continue; + } + System.out.println(" " + extension); + } + checkForErrors(); + } + + private void printEFXInfo() { + if(!EFXUtil.isEfxSupported()) { + System.out.println("EFX not available"); + return; + } + + ALCdevice device = AL.getDevice(); + IntBuffer major = BufferUtils.createIntBuffer(1); + IntBuffer minor = BufferUtils.createIntBuffer(1); + IntBuffer sends = BufferUtils.createIntBuffer(1); + ALC10.alcGetInteger(device, EFX10.ALC_EFX_MAJOR_VERSION, major); + ALC10.alcGetInteger(device, EFX10.ALC_EFX_MINOR_VERSION, minor); + if(ALC10.alcGetError(device) == ALC10.ALC_NO_ERROR) { + System.out.println("EFX version: " + major.get() + "." + minor.get()); + } + + ALC10.alcGetInteger(device, EFX10.ALC_MAX_AUXILIARY_SENDS, sends); + if(ALC10.alcGetError(device) == ALC10.ALC_NO_ERROR) { + System.out.println("Max auxiliary sends: " + sends.get()); + } + + System.out.println("Supported filters: "); + HashMap<String, Integer> filters = new HashMap<String, Integer>(); + filters.put("Low-pass", EFX10.AL_FILTER_LOWPASS); + filters.put("High-pass", EFX10.AL_FILTER_HIGHPASS); + filters.put("Band-pass", EFX10.AL_FILTER_BANDPASS); + + Set<Entry<String, Integer>> entries = filters.entrySet(); + for ( final Entry<String, Integer> entry : entries ) { + String key = entry.getKey(); + if ( EFXUtil.isFilterSupported(entry.getValue()) ) + System.out.println(" " + entry.getKey()); + } + + System.out.println("Supported effects: "); + HashMap<String, Integer> effects = new HashMap<String, Integer>(); + effects.put("EAX Reverb", EFX10.AL_EFFECT_EAXREVERB); + effects.put("Reverb", EFX10.AL_EFFECT_REVERB); + effects.put("Chorus", EFX10.AL_EFFECT_CHORUS); + effects.put("Distortion", EFX10.AL_EFFECT_DISTORTION); + effects.put("Echo", EFX10.AL_EFFECT_ECHO); + effects.put("Flanger", EFX10.AL_EFFECT_FLANGER); + effects.put("Frequency Shifter", EFX10.AL_EFFECT_FREQUENCY_SHIFTER); + effects.put("Vocal Morpher", EFX10.AL_EFFECT_VOCAL_MORPHER); + effects.put("Pitch Shifter", EFX10.AL_EFFECT_PITCH_SHIFTER); + effects.put("Ring Modulator", EFX10.AL_EFFECT_RING_MODULATOR); + effects.put("Autowah", EFX10.AL_EFFECT_AUTOWAH); + effects.put("Compressor", EFX10.AL_EFFECT_COMPRESSOR); + effects.put("Equalizer", EFX10.AL_EFFECT_EQUALIZER); + + entries = effects.entrySet(); + for ( final Entry<String, Integer> entry : entries ) { + if ( EFXUtil.isEffectSupported(entry.getValue()) ) + System.out.println(" " + entry.getKey()); + } + } + + private void printDevices(int which, String kind) { + String[] devices = ALC10.alcGetString(null, which).split("\0"); + checkForErrors(); + + System.out.println("Available " + kind + " devices: "); + for ( String device : devices ) { + System.out.println(" " + device); + } + } + + private void die(String kind, String description) { + System.out.println(kind + " error " + description + " occured"); + } + + private void checkForErrors() { + { + ALCdevice device = ALC10.alcGetContextsDevice(ALC10.alcGetCurrentContext()); + int error = ALC10.alcGetError(device); + if(error != ALC10.ALC_NO_ERROR) { + die("ALC", ALC10.alcGetString(device, error)); + } + } + { + int error = AL10.alGetError(); + if(error != AL10.AL_NO_ERROR) { + die("AL", AL10.alGetString(error)); + } + } + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + OpenALInfo openalInfo = new OpenALInfo(); + openalInfo.execute(args); + System.exit(0); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTest.java new file mode 100644 index 0000000..a632010 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTest.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL10; +import org.lwjgl.util.WaveData; + +/** + * + * This is a basic play test + * Yes, over zealous use of getError ;) + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class PlayTest extends BasicTest { + + private boolean usingVorbis; + + /** + * Creates an instance of PlayTest + */ + public PlayTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + if(args.length < 1) { + System.out.println("no argument supplied, assuming Footsteps.wav"); + args = new String[] {"Footsteps.wav"}; + } + + if(args[0].endsWith(".ogg")) { + System.out.print("Attempting to load Ogg Vorbis file, checking for extension..."); + if(AL10.alIsExtensionPresent("AL_EXT_vorbis")) { + System.out.println("found"); + usingVorbis = true; + } else { + System.out.println("not supported"); + alExit(); + System.exit(-1); + } + } + + int lastError; + + //create 1 buffer and 1 source + IntBuffer buffers = BufferUtils.createIntBuffer(1); + IntBuffer sources = BufferUtils.createIntBuffer(1); + + // al generate buffers and sources + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + sources.position(0).limit(1); + AL10.alGenSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + if(usingVorbis) { + ByteBuffer filebuffer = getData(args[0]); + + // pass directly to buffer data + AL10.alBufferData(buffers.get(0), AL10.AL_FORMAT_VORBIS_EXT, filebuffer, -1); + filebuffer.clear(); + } else { + // load wave data from buffer + WaveData wavefile = WaveData.create(args[0]); + + //copy to buffers + AL10.alBufferData(buffers.get(0), wavefile.format, wavefile.data, wavefile.samplerate); + + //unload file again + wavefile.dispose(); + } + + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //set up source input + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //lets loop the sound + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //play source 0 + AL10.alSourcePlay(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //wait 5 secs + try { + System.out.println("Waiting 5 seconds for sound to complete"); + Thread.sleep(5000); + } catch (InterruptedException inte) { + } + + //stop source 0 + AL10.alSourceStop(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //delete buffers and sources + sources.position(0).limit(1); + AL10.alDeleteSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + buffers.position(0).limit(1); + AL10.alDeleteBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //no errorchecking from now on, since our context is gone. + //shutdown + alExit(); + } + + /** + * Reads the file into a ByteBuffer + * + * @param filename Name of file to load + * @return ByteBuffer containing file data + */ + protected ByteBuffer getData(String filename) { + ByteBuffer buffer = null; + + System.out.println("Attempting to load: " + filename); + + try { + BufferedInputStream bis = new BufferedInputStream(WaveData.class.getClassLoader().getResourceAsStream(filename)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + int bufferLength = 4096; + byte[] readBuffer = new byte[bufferLength]; + int read = -1; + + while((read = bis.read(readBuffer, 0, bufferLength)) != -1) { + baos.write(readBuffer, 0, read); + } + + //done reading, close + bis.close(); + + // if ogg vorbis data, we need to pass it unmodified to alBufferData + buffer = ByteBuffer.allocateDirect(baos.size()); + buffer.order(ByteOrder.nativeOrder()); + buffer.put(baos.toByteArray()); + buffer.rewind(); + } catch (Exception ioe) { + ioe.printStackTrace(); + } + return buffer; + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + PlayTest playTest = new PlayTest(); + playTest.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTestMemory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTestMemory.java new file mode 100644 index 0000000..8cdfb04 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PlayTestMemory.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL10; +import org.lwjgl.util.WaveData; + +/** + * + * This is a basic play test + * Yes, over zealous use of getError ;) + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class PlayTestMemory extends BasicTest { + + private boolean usingVorbis; + + /** + * Creates an instance of PlayTestMemory + */ + public PlayTestMemory() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + if(args.length < 1) { + System.out.println("no argument supplied, assuming Footsteps.wav"); + args = new String[] {"Footsteps.wav"}; + } + + if(args[0].endsWith(".ogg")) { + System.out.print("Attempting to load Ogg Vorbis file, checking for extension..."); + if(AL10.alIsExtensionPresent("AL_EXT_vorbis")) { + System.out.println("found"); + usingVorbis = true; + } else { + System.out.println("not supported"); + alExit(); + System.exit(-1); + } + } + + int lastError; + + //create 1 buffer and 1 source + IntBuffer buffers = BufferUtils.createIntBuffer(1); + IntBuffer sources = BufferUtils.createIntBuffer(1); + + // al generate buffers and sources + buffers.position(0).limit(1); + AL10.alGenBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + sources.position(0).limit(1); + AL10.alGenSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //load wave data + ByteBuffer filebuffer = getData(args[0]); + if(filebuffer == null) { + System.out.println("Error loading file: " + args[0]); + System.exit(-1); + } + + System.out.println("loaded " + filebuffer.capacity()); + + //ALUTLoadWAVData file = alut.loadWAVMemory(Sys.getDirectBufferAddress(filebuffer)); + if(usingVorbis) { + // pass directly to buffer data + AL10.alBufferData(buffers.get(0), AL10.AL_FORMAT_VORBIS_EXT, filebuffer, -1); + filebuffer.clear(); + } else { + // load wave data from buffer + WaveData wavefile = WaveData.create(filebuffer.array()); + + //copy to buffers + AL10.alBufferData(buffers.get(0), wavefile.format, wavefile.data, wavefile.samplerate); + + //unload file again + wavefile.dispose(); + } + + // check for errors + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + + //set up source input + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //lets loop the sound + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //play source 0 + AL10.alSourcePlay(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //wait 5 secs + try { + System.out.println("Waiting 5 seconds for sound to complete"); + Thread.sleep(5000); + } catch (InterruptedException inte) { + } + + //stop source 0 + AL10.alSourceStop(sources.get(0)); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //delete buffers and sources + sources.position(0).limit(1); + AL10.alDeleteSources(sources); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + buffers.position(0).limit(1); + AL10.alDeleteBuffers(buffers); + if((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + exit(lastError); + } + + //no errorchecking from now on, since our context is gone. + alExit(); + } + + /** + * Reads the file into a ByteBuffer + * + * @param filename Name of file to load + * @return ByteBuffer containing file data + */ + protected ByteBuffer getData(String filename) { + ByteBuffer buffer = null; + + System.out.println("Attempting to load: " + filename); + + try { + BufferedInputStream bis = new BufferedInputStream(WaveData.class.getClassLoader().getResourceAsStream(filename)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + int bufferLength = 4096; + byte[] readBuffer = new byte[bufferLength]; + int read = -1; + + while((read = bis.read(readBuffer, 0, bufferLength)) != -1) { + baos.write(readBuffer, 0, read); + } + + //done reading, close + bis.close(); + + // if ogg vorbis data, we need to pass it unmodified to alBufferData + if(usingVorbis) { + buffer = ByteBuffer.allocateDirect(baos.size()); + } else { + buffer = ByteBuffer.allocate(baos.size()); + } + buffer.order(ByteOrder.nativeOrder()); + buffer.put(baos.toByteArray()); + buffer.rewind(); + } catch (Exception ioe) { + ioe.printStackTrace(); + } + return buffer; + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + PlayTestMemory playTestMemory = new PlayTestMemory(); + playTestMemory.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PositionTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PositionTest.java new file mode 100644 index 0000000..5487b19 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/PositionTest.java @@ -0,0 +1,553 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.openal.AL; +import org.lwjgl.opengl.Display; +import org.lwjgl.util.WaveData; + +import static org.lwjgl.openal.AL10.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <br> + * This test demonstrates OpenAL positioning Based on the example by Chad Armstrong + * (http://www.edenwaith.com/products/pige/tutorials/openal.php) + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class PositionTest extends BasicTest { + + /** *Small* glut implementation :) */ + private GLUT glut; + + /** Width of window */ + public static final int WINDOW_WIDTH = 640; + + /** Height of window */ + public static final int WINDOW_HEIGHT = 480; + + /** LEFT enumeration */ + public static final int LEFT = 0; + + /** CENTER enumeration */ + public static final int CENTER = 1; + + /** RIGHT enumeration */ + public static final int RIGHT = 2; + + /** Whether the demo is done */ + private boolean finished; + + /** Whether in pause mode */ + private boolean pauseMode; + + // OpenAL stuff + // =================================================== + + /** OpenAL buffers */ + private IntBuffer soundBuffers = BufferUtils.createIntBuffer(3); + + /** OpenAL sources */ + private IntBuffer soundSources = BufferUtils.createIntBuffer(3); + + /** Position of listener */ + private FloatBuffer listenerPosition = createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f }); + + /** Velocity of listener */ + private FloatBuffer listenerVelocity = createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f }); + + /** Orientation of listener */ + private FloatBuffer listenerOrientation = + createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }); + + /** Position of left sound */ + private FloatBuffer leftPosition = createFloatBuffer(new float[] { -2.0f, 0.0f, 0.0f }); + + /** Velocity of left sound */ + private FloatBuffer leftVelocity = createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f }); + + /** Position of center sound */ + private FloatBuffer centerPosition = createFloatBuffer(new float[] { 0.0f, 0.0f, -4.0f }); + + /** Velocity of center sound */ + private FloatBuffer centerVelocity = createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f }); + + /** Position of right sound */ + private FloatBuffer rightPosition = createFloatBuffer(new float[] { 2.0f, 0.0f, 0.0f }); + + /** Velocity of right sound */ + private FloatBuffer rightVelocity = createFloatBuffer(new float[] { 0.0f, 0.0f, 0.0f }); + // --------------------------------------------------- + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + // Setup needed stuff + try { + setup(); + } catch (Exception e) { + System.out.println("Error setting up demonstration: "); + e.printStackTrace(); + System.exit(-1); + } + + // run the actual demonstration + run(); + + // shutdown + shutdown(); + } + + /** + * Performs setup of demonstration + */ + private void setup() throws Exception { + + // Setup Window + // ===================================================== + LWJGLUtil.log("Setting up window"); + + // calc center + int centerX = (Display.getDisplayMode().getWidth() - WINDOW_WIDTH) / 2; + int centerY = (Display.getDisplayMode().getHeight() - WINDOW_HEIGHT) / 2; + + // setup window + setDisplayMode(); + Display.create(); + // ----------------------------------------------------- + + // Setup OpenGL + // ===================================================== + LWJGLUtil.log("Setting up OpenGL"); + + glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(50.0f, (float) WINDOW_WIDTH / WINDOW_HEIGHT, 0.0f, 50.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -6.6f); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glut = this.new GLUT(); + + Display.setVSyncEnabled(true); + // ----------------------------------------------------- + + // Setup OpenAL + // ===================================================== + LWJGLUtil.log("Setting up OpenAL"); + + alListener(AL_POSITION, listenerPosition); + alListener(AL_VELOCITY, listenerVelocity); + alListener(AL_ORIENTATION, listenerOrientation); + + // creating buffers + LWJGLUtil.log("Creating buffers"); + alGenBuffers(soundBuffers); + soundBuffers.rewind(); + + // creating sources + alGenSources(soundSources); + soundSources.rewind(); + + // load sound files (left, center, right).wav + LWJGLUtil.log("Loading soundfiles..."); + + LWJGLUtil.log("Loading left.wav"); + WaveData left = WaveData.create("left.wav"); + alBufferData(soundBuffers.get(LEFT), left.format, left.data, left.samplerate); + alSourcef(soundSources.get(LEFT), AL_PITCH, 1.0f); + alSourcef(soundSources.get(LEFT), AL_GAIN, 1.0f); + alSource(soundSources.get(LEFT), AL_POSITION, leftPosition); + alSource(soundSources.get(LEFT), AL_VELOCITY, leftVelocity); + alSourcei(soundSources.get(LEFT), AL_BUFFER, soundBuffers.get(LEFT)); + alSourcei(soundSources.get(LEFT), AL_LOOPING, AL_TRUE); + + LWJGLUtil.log("Loading center.wav"); + WaveData center = WaveData.create("center.wav"); + alBufferData(soundBuffers.get(CENTER), center.format, center.data, center.samplerate); + alSourcef(soundSources.get(CENTER), AL_PITCH, 1.0f); + alSourcef(soundSources.get(CENTER), AL_GAIN, 1.0f); + alSource(soundSources.get(CENTER), AL_POSITION, centerPosition); + alSource(soundSources.get(CENTER), AL_VELOCITY, centerVelocity); + alSourcei(soundSources.get(CENTER), AL_BUFFER, soundBuffers.get(CENTER)); + alSourcei(soundSources.get(CENTER), AL_LOOPING, AL_TRUE); + + LWJGLUtil.log("Loading right.wav"); + WaveData right = WaveData.create("right.wav"); + alBufferData(soundBuffers.get(RIGHT), right.format, right.data, right.samplerate); + alSourcef(soundSources.get(RIGHT), AL_PITCH, 1.0f); + alSourcef(soundSources.get(RIGHT), AL_GAIN, 1.0f); + alSource(soundSources.get(RIGHT), AL_POSITION, rightPosition); + alSource(soundSources.get(RIGHT), AL_VELOCITY, rightVelocity); + alSourcei(soundSources.get(RIGHT), AL_BUFFER, soundBuffers.get(RIGHT)); + alSourcei(soundSources.get(RIGHT), AL_LOOPING, AL_TRUE); + + LWJGLUtil.log("Soundfiles loaded successfully"); + // ----------------------------------------------------- + + Mouse.setGrabbed(true); + } + + /** + * Runs the actual demonstration + */ + private void run() { + boolean firstRun = true; + + System.out.println("Press 1/4 (left), 2/5 (center) or 3/6 (right) to toggle sound"); + System.out.println("Press LEFT/RIGHT to move along x axis"); + System.out.println("Press SHIFT and either UP/DOWN to move along y axis"); + System.out.println("Press UP/DOWN to move along z axis"); + System.out.println("Move along the x and y axis with the mouse"); + System.out.println("Press LEFT or RIGHT mouse button to move along z axis"); + System.out.println("Press ESC to exit demo"); + + LWJGLUtil.log( + "Listener position: " + + listenerPosition.get(0) + + ", " + + listenerPosition.get(1) + + ", " + + listenerPosition.get(2)); + LWJGLUtil.log("Left position: " + leftPosition.get(0) + ", " + leftPosition.get(1) + ", " + leftPosition.get(2)); + LWJGLUtil.log("Center position: " + centerPosition.get(0) + ", " + centerPosition.get(1) + ", " + centerPosition.get(2)); + LWJGLUtil.log("Right position: " + rightPosition.get(0) + ", " + rightPosition.get(1) + ", " + rightPosition.get(2)); + + while (!finished) { + // handle any input + handleInput(); + + // allow window to process internal messages + Display.update(); + + // render and paint if !minimized and not dirty + if(Display.isVisible()) { + render(); + } else { + // sleeeeeep + pause(100); + } + + // act on pause mode + paused(!(Display.isVisible() || Display.isActive())); + + // start sound after first paint, since we don't want + // the delay before something is painted on the screen + if (firstRun && !pauseMode) { + firstRun = false; + + // start sounds with delays + startSounds(); + } + } + } + + /** + * Starts playing the sounds at different times + */ + private void startSounds() { + alSourcePlay(soundSources.get(LEFT)); + pause(300); + alSourcePlay(soundSources.get(CENTER)); + pause(500); + alSourcePlay(soundSources.get(RIGHT)); + } + + /** + * Handles any changes in pause mode + * + * @param paused Which pause mode to enter + */ + private void paused(boolean paused) { + // if requesting pause, and not paused - pause and stop sound + if(paused && !pauseMode) { + pauseMode = true; + alSourcePause(soundSources); + System.out.println("pauseMode = true"); + } + + // else go out of pause mode and start sounds + else if(!paused && pauseMode) { + pauseMode = false; + startSounds(); + System.out.println("pauseMode = false"); + } + } + + /** + * Handles any input + */ + private void handleInput() { + // User wants to exit? + finished = Display.isCloseRequested() || Keyboard.isKeyDown(Keyboard.KEY_ESCAPE); + if (finished) { + return; + } + + boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); + + // Test for play + // ============================================ + if (Keyboard.isKeyDown(Keyboard.KEY_1)) { + alSourcePlay(soundSources.get(LEFT)); + LWJGLUtil.log("Playing left.wav"); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_2)) { + alSourcePlay(soundSources.get(CENTER)); + LWJGLUtil.log("Playing center.wav"); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_3)) { + alSourcePlay(soundSources.get(RIGHT)); + LWJGLUtil.log("Playing right.wav"); + } + // -------------------------------------------- + + // Test for stop + // ============================================ + if (Keyboard.isKeyDown(Keyboard.KEY_4)) { + alSourceStop(soundSources.get(LEFT)); + LWJGLUtil.log("Stopped left.wav"); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_5)) { + alSourceStop(soundSources.get(CENTER)); + LWJGLUtil.log("Stopped center.wav"); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_6)) { + alSourceStop(soundSources.get(RIGHT)); + LWJGLUtil.log("Stopped right.wav"); + } + // -------------------------------------------- + + // Test for movement with keyboard + // ============================================ + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + listenerPosition.put(0, listenerPosition.get(0) - 0.1f); + alListener(AL_POSITION, listenerPosition); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + listenerPosition.put(0, listenerPosition.get(0) + 0.1f); + alListener(AL_POSITION, listenerPosition); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { + if (shift) { + listenerPosition.put(1, listenerPosition.get(1) + 0.1f); + } else { + listenerPosition.put(2, listenerPosition.get(2) - 0.1f); + } + alListener(AL_POSITION, listenerPosition); + } + + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { + if (shift) { + listenerPosition.put(1, listenerPosition.get(1) - 0.1f); + } else { + listenerPosition.put(2, listenerPosition.get(2) + 0.1f); + } + alListener(AL_POSITION, listenerPosition); + } + // -------------------------------------------- + + // Test for movement with Mouse + // ============================================ + listenerPosition.put(0, listenerPosition.get(0) + (0.01f * Mouse.getDX())); + listenerPosition.put(1, listenerPosition.get(1) + (0.01f * Mouse.getDY())); + if (Mouse.isButtonDown(0)) { + listenerPosition.put(2, listenerPosition.get(2) - 0.1f); + } + if (Mouse.isButtonDown(1)) { + listenerPosition.put(2, listenerPosition.get(2) + 0.1f); + } + + alListener(AL_POSITION, listenerPosition); + + // empty mouse buffer + while(Mouse.next()); + } + + /** + * Render the scene + */ + private void render() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + { + glRotatef(20.0f, 1.0f, 1.0f, 0.0f); + + // left + glPushMatrix(); + { + glTranslatef(leftPosition.get(0), leftPosition.get(1), leftPosition.get(2)); + glColor3f(1.0f, 0.0f, 0.0f); + glut.glutWireCube(0.5f); + } + glPopMatrix(); + + // center + glPushMatrix(); + { + glTranslatef(centerPosition.get(0), centerPosition.get(1), centerPosition.get(2)); + glColor3f(0.0f, 0.0f, 1.0f); + glut.glutWireCube(0.5f); + } + glPopMatrix(); + + // right + glPushMatrix(); + { + glTranslatef(rightPosition.get(0), rightPosition.get(1), rightPosition.get(2)); + glColor3f(0.0f, 1.0f, 0.0f); + glut.glutWireCube(0.5f); + } + glPopMatrix(); + + // listener + glPushMatrix(); + { + glTranslatef(listenerPosition.get(0), listenerPosition.get(1), listenerPosition.get(2)); + glColor3f(1.0f, 1.0f, 1.0f); + glut.glutSolidCube(0.5f); + } + glPopMatrix(); + } + glPopMatrix(); + } + + /** + * Shutdown of demonstration + */ + private void shutdown() { + LWJGLUtil.log("Shutting down OpenAL"); + alSourceStop(soundSources); + alDeleteSources(soundSources); + alDeleteBuffers(soundBuffers); + AL.destroy(); + + LWJGLUtil.log("Shutting down Window"); + Display.destroy(); + } + + /** + * main entry point + * + * @param args + * String array containing arguments + */ + public static void main(String[] args) { + PositionTest positionTest = new PositionTest(); + positionTest.execute(args); + System.exit(0); + } + + /** + * Minute implementation of GLUT: <br>COPYRIGHT: + * + * The OpenGL Utility Toolkit distribution for Win32 (Windows NT & Windows + * 95) contains source code modified from the original source code for GLUT + * version 3.3 which was developed by Mark J. Kilgard. The original source + * code for GLUT is Copyright 1997 by Mark J. Kilgard. GLUT for Win32 is + * Copyright 1997 by Nate Robins and is not in the public domain, but it is + * freely distributable without licensing fees. It is provided without + * guarantee or warrantee expressed or implied. It was ported with the + * permission of Mark J. Kilgard by Nate Robins. + * + * THIS SOURCE CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OR MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + */ + class GLUT { + + float n[][] = new float[][] { { -1.0f, 0.0f, 0.0f }, { + 0.0f, 1.0f, 0.0f }, { + 1.0f, 0.0f, 0.0f }, { + 0.0f, -1.0f, 0.0f }, { + 0.0f, 0.0f, 1.0f }, { + 0.0f, 0.0f, -1.0f } + }; + + int faces[][] = new int[][] { { 0, 1, 2, 3 }, { + 3, 2, 6, 7 }, { + 7, 6, 5, 4 }, { + 4, 5, 1, 0 }, { + 5, 6, 2, 1 }, { + 7, 4, 0, 3 } + }; + float v[][] = new float[8][3]; + + public void glutWireCube(float size) { + drawBox(size, GL_LINE_LOOP); + } + + public void glutSolidCube(float size) { + drawBox(size, GL_QUADS); + } + + private void drawBox(float size, int type) { + + v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2; + v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2; + v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2; + v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2; + v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2; + v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2; + + for (int i = 5; i >= 0; i--) { + glBegin(type); + glNormal3f(n[i][0], n[i][1], n[i][2]); + glVertex3f(v[faces[i][0]][0], v[faces[i][0]][1], v[faces[i][0]][2]); + glVertex3f(v[faces[i][1]][0], v[faces[i][1]][1], v[faces[i][1]][2]); + glVertex3f(v[faces[i][2]][0], v[faces[i][2]][1], v[faces[i][2]][2]); + glVertex3f(v[faces[i][3]][0], v[faces[i][3]][1], v[faces[i][3]][2]); + glEnd(); + } + + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/SourceLimitTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/SourceLimitTest.java new file mode 100644 index 0000000..d25a4e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/SourceLimitTest.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL10; +import org.lwjgl.openal.OpenALException; + +/** + * + * Simple test for testing the number of available sources + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class SourceLimitTest extends BasicTest { + + /** Sources to create */ + protected int sourcesToCreate = 64; + + /** + * Creates an instance of SourceLimitTest + */ + public SourceLimitTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + //parse 1st arg to sourcecount + if (args.length > 0) { + try { + sourcesToCreate = Integer.parseInt(args[0]); + } catch (NumberFormatException nfe) { + System.out.println( + "Unable to parse parameter to integer. Defaulting to 64 sources."); + } + } + + System.out.print("Creating " + sourcesToCreate + " in one go..."); + try { + CreateAllSources(); + } catch(OpenALException oale) { + oale.printStackTrace(); + } + + + System.out.print("Creating " + sourcesToCreate + " one at a time..."); + try { + CreateSourcesStep(); + } catch(Exception e) { + e.printStackTrace(); + } + //shutdown + alExit(); + } + + /** + * Tests the creation of n sources in on go + */ + protected void CreateAllSources() { + int lastError; + + //make bytbuffer that can hold sourcesToCreate sources + IntBuffer sources = BufferUtils.createIntBuffer(sourcesToCreate); + + //Create sourcesToCreate sources in one fell swoop + try { + sources.position(0).limit(sourcesToCreate); + AL10.alGenSources(sources); + + //delete sources + sources.position(0).limit(sourcesToCreate); + AL10.alDeleteSources(sources); + + System.out.println("created " + sourcesToCreate + " sources successfully!"); + } catch (OpenALException oale) { + System.out.println("Unable to create " + sourcesToCreate + " sources"); + } + } + + /** + * Tests if n sources can be created one at a time + */ + protected void CreateSourcesStep() { + int lastError; + int sourcesCreated = 0; + + //make bytbuffer that can hold sourcesToCreate sources + IntBuffer[] sources = new IntBuffer[sourcesToCreate]; + + //create the sources + try { + for (int i = 0; i < sourcesToCreate; i++) { + sources[i] = BufferUtils.createIntBuffer(1); + sources[i].position(0).limit(1); + AL10.alGenSources(sources[i]); + if ((lastError = AL10.alGetError()) != AL10.AL_NO_ERROR) { + break; + } + sourcesCreated++; + } + } catch (OpenALException oale) { + System.out.println("failed to create source: " + (sourcesCreated + 1)); + } + + //delete allocated sources + for (int i = 0; i < sourcesCreated; i++) { + //delete buffers and sources + sources[i].position(0).limit(1); + AL10.alDeleteSources(sources[i]); + } + + if(sourcesCreated != sourcesToCreate) { + System.out.println("created " + sourcesCreated + " sources before failing"); + } else { + System.out.println("created " + sourcesCreated + " sources successfully!"); + } + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + SourceLimitTest sourceLimitTest = new SourceLimitTest(); + sourceLimitTest.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/StressTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/StressTest.java new file mode 100644 index 0000000..c9eec15 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/openal/StressTest.java @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.openal; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.openal.AL10; +import org.lwjgl.util.WaveData; + +/** + * + * Simple test for stresstesting OpenAL playing random samples ad nausea + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class StressTest extends BasicTest { + + /** Buffer containing sources */ + private IntBuffer sources; + + /** Buffer containing buffers */ + private IntBuffer buffers; + + /** + * Creates an instance of StressTest + */ + public StressTest() { + super(); + } + + /** + * Runs the actual test, using supplied arguments + */ + protected void execute(String[] args) { + + createSources(); + + createBuffers(); + + try { + loadSamples(); + runTest(); + } catch (Exception e) { + e.printStackTrace(); + } + + + alExit(); + } + + private void createSources() { + sources = BufferUtils.createIntBuffer(4); + sources.position(0).limit(4); + AL10.alGenSources(sources); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Unable to create 4 sources"); + alExit(); + } + } + + private void createBuffers() { + buffers = BufferUtils.createIntBuffer(10); + buffers.position(0).limit(10); + AL10.alGenBuffers(buffers); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Unable to create 10 buffers"); + sources.position(0).limit(4); + AL10.alDeleteSources(sources); + alExit(); + } + } + + private void loadSamples() throws Exception { + AL10.alGetError(); + WaveData data = WaveData.create("ding.wav"); + for (int i = 1; i <= 10; i++) { + AL10.alBufferData( + buffers.get(i - 1), + data.format, + data.data, + data.samplerate); + + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Failed to load " + i + ".wav into buffer"); + sources.position(0).limit(4); + AL10.alDeleteSources(sources); + buffers.position(0).limit(10); + AL10.alDeleteBuffers(buffers); + + alExit(); + } + } + data.dispose(); + } + + public void runTest() { + int iterations = 0; + int randomBuffer; + int startSlot = 1; + int nextSlot = startSlot; + long startTime = System.currentTimeMillis(); + + //mark background source as looping + AL10.alSourcei(sources.get(0), AL10.AL_LOOPING, AL10.AL_TRUE); + + //play background + AL10.alSourcei(sources.get(0), AL10.AL_BUFFER, buffers.get(0)); + AL10.alSourcePlay(sources.get(0)); + + while (System.currentTimeMillis() - startTime < (2000)) { + + randomBuffer = getRandomBuffer(); + System.out.println("random:" + randomBuffer); + + //stop source at slot + AL10.alSourceStop(sources.get(nextSlot)); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Error stopping source."); + } + System.out.println("Stopped source: " + nextSlot); + + //link source<->buffer + AL10.alSourcei(sources.get(nextSlot), AL10.AL_BUFFER, buffers.get(randomBuffer)); + if (AL10.alGetError() != AL10.AL_NO_ERROR) { + System.out.println("Error linking buffer and source."); + } + System.out.println("linked source " + nextSlot + " with buffer " + randomBuffer); + + //start playing + System.out.println("playing source " + nextSlot); + AL10.alSourcePlay(sources.get(nextSlot++)); + if (nextSlot == 4) { + nextSlot = startSlot; + } + + //pause + try { + Thread.sleep(500); + } catch (InterruptedException inte) { + } + + //debug info + if ((++iterations % 10) == 0) { + System.out.println("========================"); + System.out.println("MaxMemory: " + Runtime.getRuntime().maxMemory() / 1024); + System.out.println("FreeMemory: " + Runtime.getRuntime().freeMemory() / 1024); + System.out.println("TotalMemory: " + Runtime.getRuntime().totalMemory() / 1024); + System.out.println("========================"); + } + } + + //stop all sources + for (int i = 0; i < 4; i++) { + AL10.alSourceStop(sources.get(i)); + System.out.println("Stopping source " + (i+1)); + } + + //test done - ask for user input + try { + System.out.println("Test completed"); + System.out.println("========================"); + System.out.println("MaxMemory: " + Runtime.getRuntime().maxMemory() / 1024); + System.out.println("FreeMemory: " + Runtime.getRuntime().freeMemory() / 1024); + System.out.println("TotalMemory: " + Runtime.getRuntime().totalMemory() / 1024); + System.out.println("========================"); + System.out.println("Push any key to exit..."); + System.in.read(); + } catch (Exception e) { + } + + sources.position(0).limit(4); + AL10.alDeleteSources(sources); + buffers.position(0).limit(10); + AL10.alDeleteBuffers(buffers); + } + + private int getRandomBuffer() { + return (int) (Math.random() * 10.0); + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + StressTest stressTest = new StressTest(); + stressTest.execute(args); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/HelloOpenCL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/HelloOpenCL.java new file mode 100644 index 0000000..e3c36fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/HelloOpenCL.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opencl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.PointerBuffer; +import org.lwjgl.opencl.*; +import org.lwjgl.opencl.api.CLBufferRegion; + +import java.nio.ByteBuffer; +import java.util.List; + +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL11.*; + +/** Basic OpenCL test. */ +public class HelloOpenCL { + + public HelloOpenCL() { + } + + protected static void execute() { + try { + CL.create(); + + final List<CLPlatform> platforms = CLPlatform.getPlatforms(); + if ( platforms == null ) + throw new RuntimeException("No OpenCL platforms found."); + + for ( CLPlatform platform : platforms ) { + System.out.println("\n-------------------------"); + System.out.println("NEW PLATFORM: " + platform.getPointer()); + System.out.println(CLCapabilities.getPlatformCapabilities(platform)); + System.out.println("-------------------------"); + printPlatformInfo(platform, "CL_PLATFORM_PROFILE", CL_PLATFORM_PROFILE); + printPlatformInfo(platform, "CL_PLATFORM_VERSION", CL_PLATFORM_VERSION); + printPlatformInfo(platform, "CL_PLATFORM_NAME", CL_PLATFORM_NAME); + printPlatformInfo(platform, "CL_PLATFORM_VENDOR", CL_PLATFORM_VENDOR); + printPlatformInfo(platform, "CL_PLATFORM_EXTENSIONS", CL_PLATFORM_EXTENSIONS); + System.out.println(""); + + final PointerBuffer ctxProps = BufferUtils.createPointerBuffer(3); + ctxProps.put(CL_CONTEXT_PLATFORM).put(platform.getPointer()).put(0).flip(); + + final List<CLDevice> devices = platform.getDevices(CL_DEVICE_TYPE_ALL); + for ( CLDevice device : devices ) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + + System.out.println("\n\tNEW DEVICE: " + device.getPointer()); + System.out.println(caps); + System.out.println("\t-------------------------"); + + System.out.println("\tCL_DEVICE_TYPE = " + device.getInfoLong(CL_DEVICE_TYPE)); + System.out.println("\tCL_DEVICE_VENDOR_ID = " + device.getInfoInt(CL_DEVICE_VENDOR_ID)); + System.out.println("\tCL_DEVICE_MAX_COMPUTE_UNITS = " + device.getInfoInt(CL_DEVICE_MAX_COMPUTE_UNITS)); + System.out.println("\tCL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = " + device.getInfoInt(CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS)); + //CL10.clGetDeviceInfo(device, CL10.CL_DEVICE_MAX_WORK_ITEM_SIZES, info, size_ret); + //System.out.println("\tCL_DEVICE_MAX_WORK_ITEM_SIZES = " + info.getInt(0)); + System.out.println("\tCL_DEVICE_MAX_WORK_GROUP_SIZE = " + device.getInfoSize(CL_DEVICE_MAX_WORK_GROUP_SIZE)); + System.out.println("\tCL_DEVICE_MAX_CLOCK_FREQUENCY = " + device.getInfoInt(CL_DEVICE_MAX_CLOCK_FREQUENCY)); + System.out.println("\tCL_DEVICE_ADDRESS_BITS = " + device.getInfoInt(CL_DEVICE_ADDRESS_BITS)); + System.out.println("\tCL_DEVICE_AVAILABLE = " + device.getInfoBoolean(CL_DEVICE_AVAILABLE)); + System.out.println("\tCL_DEVICE_COMPILER_AVAILABLE = " + device.getInfoBoolean(CL_DEVICE_COMPILER_AVAILABLE)); + + printDeviceInfo(device, "CL_DEVICE_NAME", CL_DEVICE_NAME); + printDeviceInfo(device, "CL_DEVICE_VENDOR", CL_DEVICE_VENDOR); + printDeviceInfo(device, "CL_DRIVER_VERSION", CL_DRIVER_VERSION); + printDeviceInfo(device, "CL_DEVICE_PROFILE", CL_DEVICE_PROFILE); + printDeviceInfo(device, "CL_DEVICE_VERSION", CL_DEVICE_VERSION); + printDeviceInfo(device, "CL_DEVICE_EXTENSIONS", CL_DEVICE_EXTENSIONS); + if ( caps.OpenCL11 ) + printDeviceInfo(device, "CL_DEVICE_OPENCL_C_VERSION", CL_DEVICE_OPENCL_C_VERSION); + + CLContext context = clCreateContext(ctxProps, device, new CLContextCallback() { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { + System.out.println("IN CLContextCallback :: " + errinfo); + } + }, null); + + CLMem buffer = clCreateBuffer(context, CL_MEM_READ_ONLY, 128, null); + + if ( caps.OpenCL11 ) { + clSetMemObjectDestructorCallback(buffer, new CLMemObjectDestructorCallback() { + protected void handleMessage(final long memobj) { + System.out.println("FIRST Buffer destructed: " + memobj); + } + }); + + clSetMemObjectDestructorCallback(buffer, new CLMemObjectDestructorCallback() { + protected void handleMessage(final long memobj) { + System.out.println("SECOND Buffer destructed: " + memobj); + } + }); + } + + if ( caps.OpenCL11 ) { + CLMem subbuffer = buffer.createSubBuffer(CL_MEM_READ_ONLY, CL_BUFFER_CREATE_TYPE_REGION, new CLBufferRegion(0, 64), null); + + clSetMemObjectDestructorCallback(subbuffer, new CLMemObjectDestructorCallback() { + protected void handleMessage(final long memobj) { + System.out.println("Sub Buffer destructed: " + memobj); + } + }); + } + + clRetainMemObject(buffer); + + if ( LWJGLUtil.getPlatform() != LWJGLUtil.PLATFORM_MACOSX ) { + // TODO: Native kernels crash on MacOSX, disable this until we can debug properly. + final long exec_caps = device.getInfoLong(CL_DEVICE_EXECUTION_CAPABILITIES); + if ( (exec_caps & CL_EXEC_NATIVE_KERNEL) == CL_EXEC_NATIVE_KERNEL ) { + System.out.println("-TRYING TO EXEC NATIVE KERNEL-"); + final CLCommandQueue queue = clCreateCommandQueue(context, device, 0, null); + + final PointerBuffer ev = BufferUtils.createPointerBuffer(1); + + clEnqueueNativeKernel(queue, new CLNativeKernel() { + protected void execute(final ByteBuffer[] memobjs) { + System.out.println("\tmemobjs.length = " + memobjs.length); + for ( int k = 0; k < memobjs.length; k++ ) { + System.out.println("\tmemobjs[" + k + "].remaining() = " + memobjs[k].remaining()); + for ( int l = memobjs[k].position(); l < memobjs[k].limit(); l++ ) { + memobjs[k].put(l, (byte)l); + } + } + System.out.println("\tNative kernel done."); + } + }, new CLMem[] { buffer }, new long[] { 128 }, null, ev); + + final CLEvent e = queue.getCLEvent(ev.get(0)); + + clSetEventCallback(e, CL_COMPLETE, new CLEventCallback() { + protected void handleMessage(final CLEvent event, final int event_command_exec_status) { + System.out.println("\t\tEvent callback status: " + getEventStatusName(event_command_exec_status)); + } + }); + + int status = e.getInfoInt(CL_EVENT_COMMAND_EXECUTION_STATUS); + System.out.println("NATIVE KERNEL STATUS: " + getEventStatusName(status)); + clFlush(queue); + do { + int newStatus = e.getInfoInt(CL_EVENT_COMMAND_EXECUTION_STATUS); + if ( newStatus != status ) { + status = newStatus; + System.out.println("NATIVE KERNEL STATUS: " + getEventStatusName(status)); + } + } while ( status != CL_SUCCESS ); // Busy-spin until we're done + + clReleaseEvent(e); + } + } + + clReleaseMemObject(buffer); + clReleaseContext(context); + } + } + } catch (LWJGLException le) { + die("Init", le.getMessage()); + } + + CL.destroy(); + } + + private static void printPlatformInfo(final CLPlatform platform, final String param_name, final int param) { + System.out.println("\t" + param_name + " = " + platform.getInfoString(param)); + } + + private static void printDeviceInfo(final CLDevice device, final String param_name, final int param) { + System.out.println("\t" + param_name + " = " + device.getInfoString(param)); + } + + private static String getEventStatusName(final int status) { + switch ( status ) { + case CL_QUEUED: + return "CL_QUEUED"; + case CL_SUBMITTED: + return "CL_SUBMITTED"; + case CL_RUNNING: + return "CL_RUNNING"; + default: + return "CL_COMPLETE"; + } + } + + private static void die(String kind, String description) { + System.out.println(kind + " error " + description + " occured"); + } + + /** + * main entry point + * + * @param args String array containing arguments + */ + public static void main(String[] args) { + new HelloOpenCL().execute(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/DemoFractal.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/DemoFractal.java new file mode 100644 index 0000000..30b04f6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/DemoFractal.java @@ -0,0 +1,896 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opencl.gl; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerBuffer; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opencl.*; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.*; +import org.lwjgl.util.Color; +import org.lwjgl.util.ReadableColor; + +import java.io.*; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static java.lang.Math.*; +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL10GL.*; +import static org.lwjgl.opencl.KHRGLEvent.*; +import static org.lwjgl.opengl.AMDDebugOutput.*; +import static org.lwjgl.opengl.ARBCLEvent.*; +import static org.lwjgl.opengl.ARBDebugOutput.*; +import static org.lwjgl.opengl.ARBSync.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL21.*; + +/* + THIS DEMO USES CODE PORTED FROM JogAmp.org + Original code: http://github.com/mbien/jocl-demos + Original author: Michael Bien + + ___ ___ ___ + / /\ / /\ ___ / /\ http://jocl.jogamp.org/ + / /:/ / /::\ /__/\ / /::\ a http://jogamp.org/ project. + /__/::\ / /:/\:\ \ \:\ / /:/\:\ + \__\/\:\ / /:/~/::\ \ \:\ / /:/~/::\ + \ \:\ /__/:/ /:/\:\ ___ \__\:\/__/:/ /:/\:\ + \__\:\\ \:\/:/__\//__/\ | |:|\ \:\/:/__\/ + / /:/ \ \::/ \ \:\| |:| \ \::/ + /__/:/ \ \:\ \ \:\__|:| \ \:\ + \__\/ \ \:\ \__\::::/ \ \:\ + \__\/ ~~~~ \__\/ + ___ ___ ___ ___ ___ + / /\ / /\ / /\ /__/\ / /\ + / /::\ / /::\ / /:/_ \ \:\ / /:/ + / /:/\:\ / /:/\:\ / /:/ /\ \ \:\ / /:/ ___ ___ + / /:/ \:\ / /:/~/:// /:/ /:/_ _____\__\:\ / /:/ ___ /__/\ / /\ + /__/:/ \__\:\/__/:/ /://__/:/ /:/ /\/__/::::::::\/__/:/ / /\\ \:\ / /:/ + \ \:\ / /:/\ \:\/:/ \ \:\/:/ /:/\ \:\~~\~~\/\ \:\ / /:/ \ \:\ /:/ + \ \:\ /:/ \ \::/ \ \::/ /:/ \ \:\ ~~~ \ \:\ /:/ \ \:\/:/ + \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \ \::/ + \ \::/ \ \:\ \ \::/ \ \:\ \ \::/ \__\/ + \__\/ \__\/ \__\/ \__\/ \__\/ + + _____ ___ ___ ___ ___ + / /::\ / /\ /__/\ / /\ / /\ + / /:/\:\ / /:/_ | |::\ / /::\ / /:/_ + / /:/ \:\ / /:/ /\ | |:|:\ / /:/\:\ / /:/ /\ + /__/:/ \__\:| / /:/ /:/_ __|__|:|\:\ / /:/ \:\ / /:/ /::\ + \ \:\ / /:/ /__/:/ /:/ /\ /__/::::| \:\ /__/:/ \__\:\ /__/:/ /:/\:\ + \ \:\ /:/ \ \:\/:/ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\/:/~/:/ + \ \:\/:/ \ \::/ /:/ \ \:\ \ \:\ /:/ \ \::/ /:/ + \ \::/ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/ + \__\/ \ \::/ \ \:\ \ \::/ /__/:/ + \__\/ \__\/ \__\/ \__\/ +*/ + +/** + * Computes the Mandelbrot set with OpenCL using multiple GPUs and renders the result with OpenGL. + * A shared PBO is used as storage for the fractal image.<br/> + * http://en.wikipedia.org/wiki/Mandelbrot_set + * <p> + * controls:<br/> + * keys 1-9 control parallelism level<br/> + * space enables/disables slice seperator<br/> + * 'd' toggles between 32/64bit floatingpoint precision<br/> + * mouse/mousewheel to drag and zoom<br/> + * 'Home' to reset the viewport<br/> + * </p> + * + * @author Michael Bien, Spasi + */ +public class DemoFractal { + + // max number of used GPUs + private static final int MAX_PARALLELISM_LEVEL = 8; + + private static final int COLOR_MAP_SIZE = 32 * 2 * 4; + + private Set<String> params; + + private CLContext clContext; + private CLCommandQueue[] queues; + private CLKernel[] kernels; + private CLProgram[] programs; + + private CLMem[] glBuffers; + private IntBuffer glIDs; + + private boolean useTextures; + + // Texture rendering + private int dlist; + private int vsh; + private int fsh; + private int program; + + private CLMem[] colorMap; + + private final PointerBuffer kernel2DGlobalWorkSize; + + // max per pixel iterations to compute the fractal + private int maxIterations = 500; + + private int width = 512; + private int height = 512; + + private double minX = -2f; + private double minY = -1.2f; + private double maxX = 0.6f; + private double maxY = 1.3f; + + private boolean dragging; + private double dragX; + private double dragY; + private double dragMinX; + private double dragMinY; + private double dragMaxX; + private double dragMaxY; + + private int mouseX; + private int mouseY; + + private int slices; + + private boolean drawSeparator; + private boolean doublePrecision = true; + private boolean buffersInitialized; + private boolean rebuild; + + private boolean run = true; + + // EVENT SYNCING + + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); + + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private CLEvent[] clEvents; + private GLSync[] clSyncs; + + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private GLSync glSync; + private CLEvent glEvent; + + public DemoFractal(final String[] args) { + params = new HashSet<String>(); + + for ( int i = 0; i < args.length; i++ ) { + final String arg = args[i]; + + if ( arg.charAt(0) != '-' && arg.charAt(0) != '/' ) + throw new IllegalArgumentException("Invalid command-line argument: " + args[i]); + + final String param = arg.substring(1); + + if ( "forcePBO".equalsIgnoreCase(param) ) + params.add("forcePBO"); + else if ( "forceCPU".equalsIgnoreCase(param) ) + params.add("forceCPU"); + else if ( "debugGL".equalsIgnoreCase(param) ) + params.add("debugGL"); + else if ( "iterations".equalsIgnoreCase(param) ) { + if ( args.length < i + 1 + 1 ) + throw new IllegalArgumentException("Invalid iterations argument specified."); + + try { + this.maxIterations = Integer.parseInt(args[++i]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid number of iterations specified."); + } + } else if ( "res".equalsIgnoreCase(param) ) { + if ( args.length < i + 2 + 1 ) + throw new IllegalArgumentException("Invalid res argument specified."); + + try { + this.width = Integer.parseInt(args[++i]); + this.height = Integer.parseInt(args[++i]); + + if ( width < 1 || height < 1 ) + throw new IllegalArgumentException("Invalid res dimensions specified."); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid res dimensions specified."); + } + } + } + + kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); + } + + public static void main(String args[]) { + DemoFractal demo = new DemoFractal(args); + demo.init(); + demo.run(); + } + + public void init() { + try { + CL.create(); + Display.setDisplayMode(new DisplayMode(width, height)); + Display.setTitle("OpenCL Fractal Demo"); + Display.setSwapInterval(0); + Display.create(new PixelFormat(), new ContextAttribs().withDebug(params.contains("debugGL"))); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + try { + initCL(Display.getDrawable()); + } catch (Exception e) { + if ( clContext != null ) + clReleaseContext(clContext); + Display.destroy(); + throw new RuntimeException(e); + } + + glDisable(GL_DEPTH_TEST); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + initView(Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + initGLObjects(); + glFinish(); + + setKernelConstants(); + } + + private void initCL(Drawable drawable) throws Exception { + // Find a platform + List<CLPlatform> platforms = CLPlatform.getPlatforms(); + if ( platforms == null ) + throw new RuntimeException("No OpenCL platforms found."); + + final CLPlatform platform = platforms.get(0); // just grab the first one + + // Find devices with GL sharing support + final Filter<CLDevice> glSharingFilter = new Filter<CLDevice>() { + public boolean accept(final CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_gl_sharing; + } + }; + int device_type = params.contains("forceCPU") ? CL_DEVICE_TYPE_CPU : CL_DEVICE_TYPE_GPU; + List<CLDevice> devices = platform.getDevices(device_type, glSharingFilter); + if ( devices == null ) { + device_type = CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(device_type, glSharingFilter); + if ( devices == null ) + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + + // Create the context + clContext = CLContext.create(platform, devices, new CLContextCallback() { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { + System.out.println("[CONTEXT MESSAGE] " + errinfo); + } + }, drawable, null); + + slices = min(devices.size(), MAX_PARALLELISM_LEVEL); + + // create command queues for every GPU, setup colormap and init kernels + queues = new CLCommandQueue[slices]; + kernels = new CLKernel[slices]; + colorMap = new CLMem[slices]; + + for ( int i = 0; i < slices; i++ ) { + colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, COLOR_MAP_SIZE, null); + colorMap[i].checkValid(); + + // create command queue and upload color map buffer on each used device + queues[i] = clCreateCommandQueue(clContext, devices.get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + + final ByteBuffer colorMapBuffer = clEnqueueMapBuffer(queues[i], colorMap[i], CL_TRUE, CL_MAP_WRITE, 0, COLOR_MAP_SIZE, null, null, null); + initColorMap(colorMapBuffer.asIntBuffer(), 32, Color.BLUE, Color.GREEN, Color.RED); + clEnqueueUnmapMemObject(queues[i], colorMap[i], colorMapBuffer, null, null); + } + + // check if we have 64bit FP support on all devices + // if yes we can use only one program for all devices + one kernel per device. + // if not we will have to create (at least) one program for 32 and one for 64bit devices. + // since there are different vendor extensions for double FP we use one program per device. + // (OpenCL spec is not very clear about this usecases) + boolean all64bit = true; + for ( CLDevice device : devices ) { + if ( !isDoubleFPAvailable(device) ) { + all64bit = false; + break; + } + } + + // load program(s) + programs = new CLProgram[all64bit ? 1 : slices]; + + final ContextCapabilities caps = GLContext.getCapabilities(); + + if ( !caps.OpenGL20 ) + throw new RuntimeException("OpenGL 2.0 is required to run this demo."); + else if ( device_type == CL_DEVICE_TYPE_CPU && !caps.OpenGL21 ) + throw new RuntimeException("OpenGL 2.1 is required to run this demo."); + + if ( params.contains("debugGL") ) { + if ( caps.GL_ARB_debug_output ) + glDebugMessageCallbackARB(new ARBDebugOutputCallback()); + else if ( caps.GL_AMD_debug_output ) + glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + } + + if ( device_type == CL_DEVICE_TYPE_GPU ) + System.out.println("OpenCL Device Type: GPU (Use -forceCPU to use CPU)"); + else + System.out.println("OpenCL Device Type: CPU"); + for ( int i = 0; i < devices.size(); i++ ) + System.out.println("OpenCL Device #" + (i + 1) + " supports KHR_gl_event = " + CLCapabilities.getDeviceCapabilities(devices.get(i)).CL_KHR_gl_event); + + System.out.println("\nMax Iterations: " + maxIterations + " (Use -iterations <count> to change)"); + System.out.println("Display resolution: " + width + "x" + height + " (Use -res <width> <height> to change)"); + + System.out.println("\nOpenGL caps.GL_ARB_sync = " + caps.GL_ARB_sync); + System.out.println("OpenGL caps.GL_ARB_cl_event = " + caps.GL_ARB_cl_event); + + // Use PBO if we're on a CPU implementation + useTextures = device_type == CL_DEVICE_TYPE_GPU && (!caps.OpenGL21 || !params.contains("forcePBO")); + if ( useTextures ) { + System.out.println("\nCL/GL Sharing method: TEXTURES (use -forcePBO to use PBO + DrawPixels)"); + System.out.println("Rendering method: Shader on a fullscreen quad"); + } else { + System.out.println("\nCL/GL Sharing method: PIXEL BUFFER OBJECTS"); + System.out.println("Rendering method: DrawPixels"); + } + + buildPrograms(); + + // Detect GLtoCL synchronization method + syncGLtoCL = caps.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if ( syncGLtoCL ) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else + System.out.println("\nGL to CL sync: Using clFinish"); + + // Detect CLtoGL synchronization method + syncCLtoGL = caps.OpenGL32 || caps.GL_ARB_sync; + if ( syncCLtoGL ) { + for ( CLDevice device : devices ) { + if ( !CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event ) { + syncCLtoGL = false; + break; + } + } + } + if ( syncCLtoGL ) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else + System.out.println("CL to GL sync: Using glFinish"); + + if ( useTextures ) { + dlist = glGenLists(1); + + glNewList(dlist, GL_COMPILE); + glBegin(GL_QUADS); + { + glTexCoord2f(0.0f, 0.0f); + glVertex2f(0, 0); + + glTexCoord2f(0.0f, 1.0f); + glVertex2i(0, height); + + glTexCoord2f(1.0f, 1.0f); + glVertex2f(width, height); + + glTexCoord2f(1.0f, 0.0f); + glVertex2f(width, 0); + } + glEnd(); + glEndList(); + + vsh = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vsh, "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_Position = ftransform();\n" + + "\ttexCoord = gl_MultiTexCoord0.xy;\n" + + "}"); + glCompileShader(vsh); + + fsh = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fsh, "uniform sampler2D mandelbrot;\n" + + "\n" + + "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_FragColor = texture2D(mandelbrot, texCoord);" + + "}"); + glCompileShader(fsh); + + program = glCreateProgram(); + glAttachShader(program, vsh); + glAttachShader(program, fsh); + glLinkProgram(program); + + glUseProgram(program); + glUniform1i(glGetUniformLocation(program, "mandelbrot"), 0); + } + + System.out.println(""); + } + + private void buildPrograms() { + /* + * workaround: The driver keeps using the old binaries for some reason. + * to solve this we simple create a new program and release the old. + * however rebuilding programs should be possible -> remove when drivers are fixed. + * (again: the spec is not very clear about this kind of usages) + */ + if ( programs[0] != null ) { + for ( CLProgram program : programs ) + clReleaseProgram(program); + } + + try { + createPrograms(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // disable 64bit floating point math if not available + for ( int i = 0; i < programs.length; i++ ) { + final CLDevice device = queues[i].getCLDevice(); + + final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + if ( doublePrecision && isDoubleFPAvailable(device) ) { + //cl_khr_fp64 + options.append(" -D DOUBLE_FP"); + + //amd's verson of double precision floating point math + if ( !caps.CL_KHR_fp64 && caps.CL_AMD_fp64 ) + options.append(" -D AMD_FP"); + } + + System.out.println("\nOpenCL COMPILER OPTIONS: " + options); + + try { + clBuildProgram(programs[i], device, options, null); + } finally { + System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); + } + } + + rebuild = false; + + // init kernel with constants + for ( int i = 0; i < kernels.length; i++ ) + kernels[i] = clCreateKernel(programs[min(i, programs.length)], "mandelbrot", null); + } + + private void initGLObjects() { + if ( glBuffers == null ) { + glBuffers = new CLMem[slices]; + glIDs = BufferUtils.createIntBuffer(slices); + } else { + for ( CLMem mem : glBuffers ) + clReleaseMemObject(mem); + + if ( useTextures ) + glDeleteTextures(glIDs); + else + glDeleteBuffers(glIDs); + } + + if ( useTextures ) { + glGenTextures(glIDs); + + // Init textures + for ( int i = 0; i < slices; i++ ) { + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width / slices, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer)null); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glBuffers[i] = clCreateFromGLTexture2D(clContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, glIDs.get(i), null); + } + glBindTexture(GL_TEXTURE_2D, 0); + } else { + glGenBuffers(glIDs); + + // setup one empty PBO per slice + for ( int i = 0; i < slices; i++ ) { + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * 4 / slices, GL_STREAM_DRAW); + + glBuffers[i] = clCreateFromGLBuffer(clContext, CL_MEM_WRITE_ONLY, glIDs.get(i), null); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + buffersInitialized = true; + } + + // init kernels with constants + + private void setKernelConstants() { + for ( int i = 0; i < slices; i++ ) { + kernels[i] + .setArg(6, glBuffers[i]) + .setArg(7, colorMap[i]) + .setArg(8, COLOR_MAP_SIZE) + .setArg(9, maxIterations); + } + } + + // rendering cycle + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while ( run ) { + if ( !Display.isVisible() ) + Thread.yield(); + + handleIO(); + display(); + + Display.update(); + if ( Display.isCloseRequested() ) + break; + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in 5 seconds = " + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + + clReleaseContext(clContext); + + if ( useTextures ) { + glDeleteProgram(program); + glDeleteShader(fsh); + glDeleteShader(vsh); + + glDeleteLists(dlist, 1); + } + + CL.destroy(); + Display.destroy(); + } + + public void display() { + // TODO: Need to clean-up events, test when ARB_cl_events & KHR_gl_event are implemented. + + // make sure GL does not use our objects before we start computing + if ( syncCLtoGL && glEvent != null ) { + for ( final CLCommandQueue queue : queues ) + clEnqueueWaitForEvents(queue, glEvent); + } else + glFinish(); + + if ( !buffersInitialized ) { + initGLObjects(); + setKernelConstants(); + } + + if ( rebuild ) { + buildPrograms(); + setKernelConstants(); + } + compute(doublePrecision); + + render(); + } + + // OpenCL + + private void compute(final boolean is64bit) { + int sliceWidth = (int)(width / (float)slices); + double rangeX = (maxX - minX) / slices; + double rangeY = (maxY - minY); + + kernel2DGlobalWorkSize.put(0, sliceWidth).put(1, height); + + // start computation + for ( int i = 0; i < slices; i++ ) { + kernels[i].setArg(0, sliceWidth).setArg(1, height); + if ( !is64bit || !isDoubleFPAvailable(queues[i].getCLDevice()) ) { + kernels[i] + .setArg(2, (float)(minX + rangeX * i)).setArg(3, (float)minY) + .setArg(4, (float)rangeX).setArg(5, (float)rangeY); + } else { + kernels[i] + .setArg(2, minX + rangeX * i).setArg(3, minY) + .setArg(4, rangeX).setArg(5, rangeY); + } + + // acquire GL objects, and enqueue a kernel with a probe from the list + clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + + clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + null, + kernel2DGlobalWorkSize, + null, + null, null); + + clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + if ( syncGLtoCL ) { + clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); + clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); + } + } + + // block until done (important: finish before doing further gl work) + if ( !syncGLtoCL ) { + for ( int i = 0; i < slices; i++ ) + clFinish(queues[i]); + } + } + + // OpenGL + + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + if ( syncGLtoCL ) { + for ( int i = 0; i < slices; i++ ) + glWaitSync(clSyncs[i], 0, 0); + } + + //draw slices + int sliceWidth = width / slices; + + if ( useTextures ) { + for ( int i = 0; i < slices; i++ ) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glCallList(dlist); + } + } else { + for ( int i = 0; i < slices; i++ ) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glRasterPos2i(sliceWidth * i + seperatorOffset, 0); + + glDrawPixels(sliceWidth, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + if ( syncCLtoGL ) { + glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + glEvent = clCreateEventFromGLsyncKHR(clContext, glSync, null); + } + + //draw info text + /* + textRenderer.beginRendering(width, height, false); + + textRenderer.draw("device/time/precision", 10, height - 15); + + for ( int i = 0; i < slices; i++ ) { + CLDevice device = queues[i].getDevice(); + boolean doubleFP = doublePrecision && isDoubleFPAvailable(device); + CLEvent event = probes.getEvent(i); + long start = event.getProfilingInfo(START); + long end = event.getProfilingInfo(END); + textRenderer.draw(device.getType().toString() + i + " " + + (int)((end - start) / 1000000.0f) + "ms @" + + (doubleFP ? "64bit" : "32bit"), 10, height - (20 + 16 * (slices - i))); + } + + textRenderer.endRendering(); + */ + } + + private void handleIO() { + if ( Keyboard.getNumKeyboardEvents() != 0 ) { + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + final int key = Keyboard.getEventKey(); + + if ( Keyboard.KEY_1 <= key && key <= Keyboard.KEY_8 ) { + int number = key - Keyboard.KEY_1 + 1; + slices = min(number, min(queues.length, MAX_PARALLELISM_LEVEL)); + System.out.println("NEW PARALLELISM LEVEL: " + slices); + buffersInitialized = false; + } else { + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_SPACE: + drawSeparator = !drawSeparator; + System.out.println("SEPARATOR DRAWING IS NOW: " + (drawSeparator ? "ON" : "OFF")); + break; + case Keyboard.KEY_D: + doublePrecision = !doublePrecision; + System.out.println("DOUBLE PRECISION IS NOW: " + (doublePrecision ? "ON" : "OFF")); + rebuild = true; + break; + case Keyboard.KEY_HOME: + minX = -2f; + minY = -1.2f; + maxX = 0.6f; + maxY = 1.3f; + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + } + + while ( Mouse.next() ) { + final int eventBtn = Mouse.getEventButton(); + + final int x = Mouse.getX(); + final int y = Mouse.getY(); + + if ( Mouse.isButtonDown(0) && (x != mouseX || y != mouseY) ) { + if ( !dragging ) { + dragging = true; + + dragX = mouseX; + dragY = mouseY; + + dragMinX = minX; + dragMinY = minY; + dragMaxX = maxX; + dragMaxY = maxY; + } + + double offsetX = (x - dragX) * (maxX - minX) / width; + double offsetY = (y - dragY) * (maxY - minY) / height; + + minX = dragMinX - offsetX; + minY = dragMinY - offsetY; + + maxX = dragMaxX - offsetX; + maxY = dragMaxY - offsetY; + } else { + if ( dragging ) + dragging = false; + + if ( eventBtn == -1 ) { + final int dwheel = Mouse.getEventDWheel(); + if ( dwheel != 0 ) { + double scaleFactor = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ? 0.25 : 0.05; + double scale = dwheel > 0 ? scaleFactor : -scaleFactor; + + double deltaX = scale * (maxX - minX); + double deltaY = scale * (maxY - minY); + + // offset for "zoom to cursor" + double offsetX = (x / (double)width - 0.5) * deltaX * 2.0; + double offsetY = (y / (double)height - 0.5) * deltaY * 2.0; + + minX += deltaX + offsetX; + minY += deltaY - offsetY; + + maxX += -deltaX + offsetX; + maxY += -deltaY - offsetY; + } + } + } + + mouseX = x; + mouseY = y; + } + } + + private static boolean isDoubleFPAvailable(CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_fp64 || caps.CL_AMD_fp64; + } + + private void createPrograms() throws IOException { + final String source = getProgramSource("org/lwjgl/test/opencl/gl/Mandelbrot.cl"); + for ( int i = 0; i < programs.length; i++ ) + programs[i] = clCreateProgramWithSource(clContext, source, null); + } + + private String getProgramSource(final String file) throws IOException { + InputStream source = null; + URL sourceURL = Thread.currentThread().getContextClassLoader().getResource(file); + if(sourceURL != null) { + source = sourceURL.openStream(); + } + if ( source == null ) // dev-mode + source = new FileInputStream("src/java/" + file); + final BufferedReader reader = new BufferedReader(new InputStreamReader(source)); + + final StringBuilder sb = new StringBuilder(); + String line; + try { + while ( (line = reader.readLine()) != null ) + sb.append(line).append("\n"); + } finally { + source.close(); + } + + return sb.toString(); + } + + private static void initColorMap(IntBuffer colorMap, int stepSize, ReadableColor... colors) { + for ( int n = 0; n < colors.length - 1; n++ ) { + ReadableColor color = colors[n]; + int r0 = color.getRed(); + int g0 = color.getGreen(); + int b0 = color.getBlue(); + + color = colors[n + 1]; + int r1 = color.getRed(); + int g1 = color.getGreen(); + int b1 = color.getBlue(); + + int deltaR = r1 - r0; + int deltaG = g1 - g0; + int deltaB = b1 - b0; + + for ( int step = 0; step < stepSize; step++ ) { + float alpha = (float)step / (stepSize - 1); + int r = (int)(r0 + alpha * deltaR); + int g = (int)(g0 + alpha * deltaG); + int b = (int)(b0 + alpha * deltaB); + colorMap.put((r << 0) | (g << 8) | (b << 16)); + } + } + } + + private static void initView(int width, int height) { + glViewport(0, 0, width, height); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, width, 0.0, height, 0.0, 1.0); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/Mandelbrot.cl b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/Mandelbrot.cl new file mode 100644 index 0000000..8d05d61 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opencl/gl/Mandelbrot.cl @@ -0,0 +1,83 @@ +#ifdef DOUBLE_FP + #ifdef AMD_FP + #pragma OPENCL EXTENSION cl_amd_fp64 : enable + #else + #ifndef CL_VERSION_1_2 + #pragma OPENCL EXTENSION cl_khr_fp64 : enable + #endif + #endif + #define varfloat double + #define _255 255.0 +#else + #define varfloat float + #define _255 255.0f +#endif + +#ifdef USE_TEXTURE + #define OUTPUT_TYPE __write_only image2d_t +#else + #define OUTPUT_TYPE global uint * +#endif + +/** + * For a description of this algorithm please refer to + * http://en.wikipedia.org/wiki/Mandelbrot_set + * @author Michael Bien + */ +kernel void mandelbrot( + const int width, const int height, + const varfloat x0, const varfloat y0, + const varfloat rangeX, const varfloat rangeY, + OUTPUT_TYPE output, global uint *colorMap, + const int colorMapSize, const int maxIterations +) { + unsigned int ix = get_global_id(0); + unsigned int iy = get_global_id(1); + + varfloat r = x0 + ix * rangeX / width; + varfloat i = y0 + iy * rangeY / height; + + varfloat x = 0; + varfloat y = 0; + + varfloat magnitudeSquared = 0; + int iteration = 0; + + while ( magnitudeSquared < 4 && iteration < maxIterations ) { + varfloat x2 = x*x; + varfloat y2 = y*y; + y = 2 * x * y + i; + x = x2 - y2 + r; + magnitudeSquared = x2+y2; + iteration++; + } + + if ( iteration == maxIterations ) { + #ifdef USE_TEXTURE + write_imagef(output, (int2)(ix, iy), (float4)0); + #else + output[iy * width + ix] = 0; + #endif + } else { + float alpha = (float)iteration / maxIterations; + int colorIndex = (int)(alpha * colorMapSize); + #ifdef USE_TEXTURE + // We could have changed colorMap to a texture + sampler, but the + // unpacking below has minimal overhead and it's kinda interesting. + // We could also use an R32UI texture and do the unpacking in GLSL, + // but then we'd require OpenGL 3.0 (GLSL 1.30). + uint c = colorMap[colorIndex]; + float4 oc = (float4)( + (c & 0xFF) >> 0, + (c & 0xFF00) >> 8, + (c & 0xFF0000) >> 16, + 255.0f + ); + write_imagef(output, (int2)(ix, iy), oc / 255.0f); + #else + output[iy * width + ix] = colorMap[colorIndex]; + #endif + // monochrom + //output[iy * width + ix] = 255*iteration/maxIterations; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java new file mode 100644 index 0000000..f2d2547 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/FullScreenWindowedTest.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.util.vector.Vector2f; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * + * Tests switching between windowed and fullscreen + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class FullScreenWindowedTest { + /** Intended deiplay mode */ + private DisplayMode mode; + /** our quad moving around */ + private Vector2f quadPosition; + /** our quadVelocity */ + private Vector2f quadVelocity; + /** angle of quad */ + private float angle; + /** degrees to rotate per frame */ + private float angleRotation = 1.0f; + /** Max speed of all changable attributes */ + private static final float MAX_SPEED = 20.0f; + + /** + * Creates a FullScreenWindowedTest + */ + public FullScreenWindowedTest() { + } + /** + * Executes the test + */ + public void execute() { + initialize(); + mainLoop(); + cleanup(); + } + + private void switchMode() throws LWJGLException { + mode = findDisplayMode(800, 600, Display.getDisplayMode().getBitsPerPixel()); + Display.setDisplayModeAndFullscreen(mode); + } + + /** + * Initializes the test + */ + private void initialize() { + try { + //find displaymode + switchMode(); + // start of in windowed mode + Display.create(); + glInit(); + quadPosition = new Vector2f(100f, 100f); + quadVelocity = new Vector2f(1.0f, 1.0f); + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * Runs the main loop of the "test" + */ + private void mainLoop() { + while (!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) && !Display.isCloseRequested()) { + if (Display.isVisible()) { + // check keyboard input + processKeyboard(); + // do "game" logic, and render it + logic(); + render(); + } else { + // no need to render/paint if nothing has changed (ie. window + // dragged over) + if (Display.isDirty()) { + render(); + } + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + // Update window + Display.update(); + } + } + /** + * Performs the logic + */ + private void logic() { + angle += angleRotation; + if (angle > 90.0f) { + angle = 0.0f; + } + quadPosition.x += quadVelocity.x; + quadPosition.y += quadVelocity.y; + //check colision with vertical border border + if (quadPosition.x + 50 >= mode.getWidth() || quadPosition.x - 50 <= 0) { + quadVelocity.x *= -1; + } + //check collision with horizontal border + if (quadPosition.y + 50 >= mode.getHeight() || quadPosition.y - 50 <= 0) { + quadVelocity.y *= -1; + } + } + private void render() { + //clear background + glClear(GL_COLOR_BUFFER_BIT); + // draw white quad + glPushMatrix(); + { + glTranslatef(quadPosition.x, quadPosition.y, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glColor3f(1.0f, 1.0f, 1.0f); + glBegin(GL_QUADS); + { + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + } + glEnd(); + } + glPopMatrix(); + } + /** + * Processes keyboard input + */ + private void processKeyboard() { + //check for fullscreen key + if (Keyboard.isKeyDown(Keyboard.KEY_F)) { + try { + switchMode(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for window key + if (Keyboard.isKeyDown(Keyboard.KEY_W)) { + try { + mode = new DisplayMode(640, 480); + Display.setDisplayModeAndFullscreen(mode); + glInit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for speed changes + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { + quadVelocity.y += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { + quadVelocity.y -= 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + quadVelocity.x += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + quadVelocity.x -= 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_ADD)) { + angleRotation += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT)) { + angleRotation -= 0.1f; + } + //throttle + if (quadVelocity.x < -MAX_SPEED) { + quadVelocity.x = -MAX_SPEED; + } + if (quadVelocity.x > MAX_SPEED) { + quadVelocity.x = MAX_SPEED; + } + if (quadVelocity.y < -MAX_SPEED) { + quadVelocity.y = -MAX_SPEED; + } + if (quadVelocity.y > MAX_SPEED) { + quadVelocity.y = MAX_SPEED; + } + if (angleRotation < 0.0f) { + angleRotation = 0.0f; + } + if (angleRotation > MAX_SPEED) { + angleRotation = MAX_SPEED; + } + + while ( Mouse.next() ); + } + /** + * Cleans up the test + */ + private void cleanup() { + Display.destroy(); + } + + /** + * Retrieves a displaymode, if one such is available + * + * @param width + * Required width + * @param height + * Required height + * @param bpp + * Minimum required bits per pixel + * @return + */ + private DisplayMode findDisplayMode(int width, int height, int bpp) throws LWJGLException { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getBitsPerPixel() >= bpp && mode.getFrequency() <= 60 ) { + return mode; + } + } + return Display.getDesktopDisplayMode(); + } + /** + * Initializes OGL + */ + private void glInit() { + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, mode.getWidth(), 0, mode.getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, mode.getWidth(), mode.getHeight()); + //set clear color to black + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + //sync frame (only works on windows) + Display.setVSyncEnabled(true); + } + /** + * Test entry point + */ + public static void main(String[] args) { + System.out.println("Change between fullscreen and windowed mode, by pressing F and W respectively"); + System.out.println("Move quad using arrowkeys, and change rotation using +/-"); + FullScreenWindowedTest fswTest = new FullScreenWindowedTest(); + fswTest.execute(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/Gears.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/Gears.java new file mode 100644 index 0000000..38b81d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/Gears.java @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * 3-D gear wheels. Originally by Brian Paul + */ +package org.lwjgl.test.opengl; + +import java.nio.FloatBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.Sys; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GLContext; + +import static org.lwjgl.opengl.ARBTransposeMatrix.*; +import static org.lwjgl.opengl.GL11.*; + +/** + * <p> + * This is the OpenGL "standard" Gears demo, originally by Brian Paul + * </p> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class Gears { + + private float view_rotx = 20.0f; + + private float view_roty = 30.0f; + + private float view_rotz; + + private int gear1; + + private int gear2; + + private int gear3; + + private float angle; + + public static void main(String[] args) { + new Gears().execute(); + System.exit(0); + } + + /** + * + */ + private void execute() { + try { + init(); + } catch (LWJGLException le) { + le.printStackTrace(); + System.out.println("Failed to initialize Gears."); + return; + } + + loop(); + + destroy(); + } + + /** + * + */ + private void destroy() { + Display.destroy(); + } + + /** + * + */ + private void loop() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while (!Display.isCloseRequested()) { + angle += 2.0f; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + glPushMatrix(); + glTranslatef(-3.0f, -2.0f, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1f, -2.0f, 0.0f); + glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1f, 4.2f, 0.0f); + glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); + + Display.update(); + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in " + timeUsed / 1000f + " seconds = " + + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + } + + /** + * + */ + private void init() throws LWJGLException { + // create Window of size 300x300 + Display.setLocation((Display.getDisplayMode().getWidth() - 300) / 2, + (Display.getDisplayMode().getHeight() - 300) / 2); + Display.setDisplayMode(new DisplayMode(300, 300)); + Display.setTitle("Gears"); + Display.create(); + + // setup ogl + FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); + FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f}); + FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f}); + FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f}); + + pos.flip(); + red.flip(); + green.flip(); + blue.flip(); + + glLight(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + gear(1.0f, 4.0f, 1.0f, 20, 0.7f); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + gear(0.5f, 2.0f, 2.0f, 10, 0.7f); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + gear(1.3f, 2.0f, 0.5f, 10, 0.7f); + glEndList(); + + glEnable(GL_NORMALIZE); + + glMatrixMode(GL_PROJECTION); + + System.err.println("LWJGL: " + Sys.getVersion() + " / " + LWJGLUtil.getPlatformName()); + System.err.println("GL_VENDOR: " + glGetString(GL_VENDOR)); + System.err.println("GL_RENDERER: " + glGetString(GL_RENDERER)); + System.err.println("GL_VERSION: " + glGetString(GL_VERSION)); + System.err.println(); + System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix); + if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) { + // --- not using extensions + glLoadIdentity(); + } else { + // --- using extensions + final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put( + new float[] { 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1}); + identityTranspose.flip(); + glLoadTransposeMatrixARB(identityTranspose); + } + + float h = (float) 300 / (float) 300; + glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -40.0f); + } + + /** + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + */ + private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { + int i; + float r0, r1, r2; + float angle, da; + float u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0f; + r2 = outer_radius + tooth_depth / 2.0f; + + da = 2.0f * (float) Math.PI / teeth / 4.0f; + + glShadeModel(GL_FLAT); + + glNormal3f(0.0f, 0.0f, 1.0f); + + /* draw front face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + if (i < teeth) { + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), + width * 0.5f); + } + } + glEnd(); + + /* draw front sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f); + } + glEnd(); + + /* draw back face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw outward faces of teeth */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle); + v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle); + len = (float) Math.sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da); + v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da); + glNormal3f(v, -u, 0.0f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + } + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f); + glEnd(); + + glShadeModel(GL_SMOOTH); + + /* draw inside radius cylinder */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + } + glEnd(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/PbufferTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/PbufferTest.java new file mode 100644 index 0000000..44ebf58 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/PbufferTest.java @@ -0,0 +1,398 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.Pbuffer; +import org.lwjgl.opengl.PixelFormat; +import org.lwjgl.util.vector.Vector2f; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * + * Tests Pbuffers + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class PbufferTest { + + /** Intended deiplay mode */ + private DisplayMode mode; + + /** our quad moving around */ + private Vector2f quadPosition; + + /** our quadVelocity */ + private Vector2f quadVelocity; + + /** angle of quad */ + private float angle; + + /** degrees to rotate per frame */ + private float angleRotation = 1.0f; + + /** Max speed of all changable attributes */ + private static final float MAX_SPEED = 20.0f; + + /** Pbuffer instance */ + private static Pbuffer pbuffer; + + /** The shared texture */ + private static int tex_handle; + + /** + * Executes the test + */ + public void execute() { + initialize(); + + mainLoop(); + + cleanup(); + } + + /** + * Initializes the test + */ + private void initialize() { + try { + //find displaymode + pbuffer = new Pbuffer(512, 512, new PixelFormat(), null, null); + mode = findDisplayMode(800, 600, 16); + Display.setDisplayMode(mode); + // start of in windowed mode + Display.create(); +// gl = new GLWindow("Test", 50, 50, mode.width, mode.height, mode.bpp, 0, 0, 0); + if ((Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0) { + System.out.println("No Pbuffer support!"); + System.exit(1); + } + System.out.println("Pbuffer support detected"); + + glInit(); + initPbuffer(); + + Keyboard.create(); + + quadPosition = new Vector2f(100f, 100f); + quadVelocity = new Vector2f(1.0f, 1.0f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Runs the main loop of the "test" + */ + private void mainLoop() { + while (!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) && !Display.isCloseRequested()) { + if (Display.isVisible()) { + // check keyboard input + processKeyboard(); + // do "game" logic, and render it + logic(); + render(); + } else { + // no need to render/paint if nothing has changed (ie. window + // dragged over) + if (Display.isDirty()) { + render(); + } + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + // Update window + Display.update(); + } + } + + /** + * Performs the logic + */ + private void logic() { + angle += angleRotation; + if (angle > 90.0f) { + angle = 0.0f; + } + + quadPosition.x += quadVelocity.x; + quadPosition.y += quadVelocity.y; + + //check colision with vertical border border + if (quadPosition.x + 50 >= mode.getWidth() || quadPosition.x - 50 <= 0) { + quadVelocity.x *= -1; + } + + //check collision with horizontal border + if (quadPosition.y + 50 >= mode.getHeight() || quadPosition.y - 50 <= 0) { + quadVelocity.y *= -1; + } + } + + private void render() { + if (pbuffer.isBufferLost()) { + System.out.println("Buffer contents lost - will recreate the buffer"); + pbuffer.destroy(); + try { + pbuffer = new Pbuffer(512, 512, new PixelFormat(), null, null); + initPbuffer(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + try { + pbuffer.makeCurrent(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + // Pbuffer rendering + //clear background + glClear(GL_COLOR_BUFFER_BIT); + + // draw white quad + glPushMatrix(); + { + glTranslatef(quadPosition.x, quadPosition.y, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glColor3f(1.0f, 1.0f, 1.0f); + glBegin(GL_QUADS); + { + glVertex2i(-50, -50); + glVertex2i(50, -50); + glVertex2i(50, 50); + glVertex2i(-50, 50); + } + glEnd(); + } + glPopMatrix(); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 512, 512, 0); + try { + Display.makeCurrent(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + // OpenGL window rendering + glClear(GL_COLOR_BUFFER_BIT); + // draw white quad + glPushMatrix(); + { + glTranslatef(quadPosition.x, quadPosition.y, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glColor3f(1.0f, 1.0f, 0.0f); + glBegin(GL_QUADS); + { + glTexCoord2f(0f, 0f); + glVertex2i(-50, -50); + glTexCoord2f(1f, 0f); + glVertex2i(50, -50); + glTexCoord2f(1f, 1f); + glVertex2i(50, 50); + glTexCoord2f(0f, 1f); + glVertex2i(-50, 50); + } + glEnd(); + } + glPopMatrix(); + } + + private void initPbuffer() { + try { + pbuffer.makeCurrent(); + initGLState(256, 256, 0.5f); + glBindTexture(GL_TEXTURE_2D, tex_handle); + Display.makeCurrent(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Processes keyboard input + */ + private void processKeyboard() { + Keyboard.poll(); + + //check for fullscreen key + if (Keyboard.isKeyDown(Keyboard.KEY_F)) { + + try { + Display.setDisplayMode(mode); + Display.setFullscreen(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //check for window key + if (Keyboard.isKeyDown(Keyboard.KEY_W)) { + try { + Display.setFullscreen(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //check for speed changes + if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { + quadVelocity.y += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { + quadVelocity.y -= 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { + quadVelocity.x += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { + quadVelocity.x -= 0.1f; + } + + if (Keyboard.isKeyDown(Keyboard.KEY_ADD)) { + angleRotation += 0.1f; + } + if (Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT)) { + angleRotation -= 0.1f; + } + + //throttle + if (quadVelocity.x < -MAX_SPEED) { + quadVelocity.x = -MAX_SPEED; + } + if (quadVelocity.x > MAX_SPEED) { + quadVelocity.x = MAX_SPEED; + } + if (quadVelocity.y < -MAX_SPEED) { + quadVelocity.y = -MAX_SPEED; + } + if (quadVelocity.y > MAX_SPEED) { + quadVelocity.y = MAX_SPEED; + } + + if (angleRotation < 0.0f) { + angleRotation = 0.0f; + } + if (angleRotation > MAX_SPEED) { + angleRotation = MAX_SPEED; + } + } + + private void destroyTexture() { + IntBuffer buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); + buffer.put(0, tex_handle); + glDeleteTextures(buffer); + } + + /** + * Cleans up the test + */ + private void cleanup() { + destroyTexture(); + pbuffer.destroy(); + Display.destroy(); + } + + /** + * Retrieves a displaymode, if one such is available + * + * @param width Required width + * @param height Required height + * @param bpp Minimum required bits per pixel + * @return + */ + private DisplayMode findDisplayMode(int width, int height, int bpp) throws LWJGLException { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getBitsPerPixel() >= bpp ) + return mode; + } + return null; + } + + private void initGLState(int width, int height, float color) { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, mode.getWidth(), 0, mode.getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, width, height); + + //set clear color to black + glClearColor(color, color, color, 0.0f); + } + + /** + * Initializes OGL + */ + private void glInit() { + //sync frame (only works on windows) + Display.setVSyncEnabled(true); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glEnable(GL_TEXTURE_2D); + // Create shared texture + IntBuffer buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); + glGenTextures(buffer); + tex_handle = buffer.get(0); + glBindTexture(GL_TEXTURE_2D, tex_handle); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + initGLState(mode.getWidth(), mode.getHeight(), 0f); + } + + /** + * Test entry point + */ + public static void main(String[] args) { + System.out.println( + "Change between fullscreen and windowed mode, by pressing F and W respectively"); + System.out.println("Move quad using arrowkeys, and change rotation using +/-"); + PbufferTest fswTest = new PbufferTest(); + fswTest.execute(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/SyncTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/SyncTest.java new file mode 100644 index 0000000..47c9ac1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/SyncTest.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.opengl.*; + +import java.util.Random; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL32.*; + +/** @author spasi <spasi@users.sourceforge.net> */ +public final class SyncTest { + + private SyncTest() { + } + + public static void main(String[] args) { + runTest(args); + cleanup(); + System.exit(0); + } + + private static void runTest(String[] args) { + if ( args.length < 2 ) + argsError("Insufficient number of arguments."); + + int clears = 1; + int timeout = 0; + + try { + clears = Integer.parseInt(args[0]); + timeout = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + argsError("Invalid number format."); + } + + ContextAttribs ca = new ContextAttribs(); + + try { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + + DisplayMode displayMode = chooseMode(modes, 1024, 768); + if ( displayMode == null ) + displayMode = chooseMode(modes, 800, 600); + if ( displayMode == null ) + displayMode = chooseMode(modes, 640, 480); + if ( displayMode == null ) + kill("Failed to set an appropriate display mode."); + + System.out.println("Setting display mode to: " + displayMode); + Display.setDisplayMode(displayMode); + Display.create(new PixelFormat(8, 24, 0), ca); + } catch (LWJGLException e) { + kill(e.getMessage()); + } + + System.out.println("\n---------\n"); + + final String version = glGetString(GL_VERSION); + + System.out.println("GL Version: " + version); + System.out.println("ARB_sync: " + GLContext.getCapabilities().GL_ARB_sync); + + if ( !GLContext.getCapabilities().OpenGL32 && !GLContext.getCapabilities().GL_ARB_sync ) + kill("OpenGL3.2 or ARB_sync support is required for this test."); + + System.out.println("\n---------\n"); + + System.out.println("Clearing the framebuffer a gazillion times..."); + + Random rand = new Random(System.currentTimeMillis()); + for ( int i = 0; i < clears; i++ ) { + glClearColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + + GLSync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + System.out.println("\nWaiting on fence..."); + long time = Sys.getTime(); + int status = glClientWaitSync(sync, 0, timeout < 0 ? GL_TIMEOUT_IGNORED : timeout * 1000 * 1000); + System.out.println("\nFence sync complete after: " + ((Sys.getTime() - time) / (double)Sys.getTimerResolution()) + " seconds."); + System.out.print("\nWait Status: "); + switch ( status ) { + case GL_ALREADY_SIGNALED: + System.out.println("ALREADY_SIGNALED"); + break; + case GL_CONDITION_SATISFIED: + System.out.println("CONDITION_SATISFIED"); + break; + case GL_TIMEOUT_EXPIRED: + System.out.println("TIMEOUT_EXPIRED"); + break; + case GL_WAIT_FAILED: + System.out.println("WAIT_FAILED"); + break; + default: + System.out.println("Unexpected wait status: 0x" + Integer.toHexString(status)); + } + + System.out.println("Sync Status: " + (glGetSynci(sync, GL_SYNC_STATUS) == GL_UNSIGNALED ? "UNSIGNALED" : "SIGNALED")); + + glDeleteSync(sync); + + int error = glGetError(); + if ( error != 0 ) + System.out.println("\nTest failed with OpenGL error: " + error); + else + System.out.println("\nTest completed successfully."); + } + + private static DisplayMode chooseMode(DisplayMode[] modes, int width, int height) { + DisplayMode bestMode = null; + + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getFrequency() <= 85 ) { + if ( bestMode == null || (mode.getBitsPerPixel() >= bestMode.getBitsPerPixel() && mode.getFrequency() > bestMode.getFrequency()) ) + bestMode = mode; + } + } + + return bestMode; + } + + private static void cleanup() { + if ( Display.isCreated() ) + Display.destroy(); + } + + private static void argsError(final String msg) { + System.out.println("\nInvalid arguments error: " + msg); + System.out.println("\nUsage: SyncTest <clears> <timeout>:\n"); + System.out.println("clears\t- Number of times to clear the framebuffer."); + System.out.println("timeout\t- WaitSync timeout in milliseconds."); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason) { + System.out.println("The SyncTest program was terminated because an error occured.\n"); + System.out.println("Reason: " + (reason == null ? "Unknown" : reason)); + + cleanup(); + System.exit(-1); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOIndexTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOIndexTest.java new file mode 100644 index 0000000..6e2fc5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOIndexTest.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Simple java test program. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +package org.lwjgl.test.opengl; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GLContext; + +import static org.lwjgl.opengl.ARBBufferObject.*; +import static org.lwjgl.opengl.ARBVertexBufferObject.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +public final class VBOIndexTest { + + static { + try { + //find first display mode that allows us 640*480*16 + int mode = -1; + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( int i = 0; i < modes.length; i++ ) { + if ( modes[i].getWidth() == 640 + && modes[i].getHeight() == 480 + && modes[i].getBitsPerPixel() >= 16 ) { + mode = i; + break; + } + } + if ( mode != -1 ) { + //select above found displaymode + System.out.println("Setting display mode to " + modes[mode]); + Display.setDisplayMode(modes[mode]); + System.out.println("Created display."); + } + } catch (Exception e) { + System.err.println("Failed to create display due to " + e); + } + } + + static { + try { + Display.create(); + System.out.println("Created OpenGL."); + } catch (Exception e) { + System.err.println("Failed to create OpenGL due to " + e); + System.exit(1); + } + } + + /** + * Is the game finished? + */ + private static boolean finished; + + /** + * A rotating square! + */ + private static float angle; + private static int buffer_id; + private static int indices_buffer_id; + private static FloatBuffer vertices; + private static ByteBuffer mapped_buffer; + private static FloatBuffer mapped_float_buffer; + private static IntBuffer indices; + private static ByteBuffer mapped_indices_buffer; + private static IntBuffer mapped_indices_int_buffer; + + public static void main(String[] arguments) { + try { + init(); + while ( !finished ) { + Display.update(); + + if ( !Display.isVisible() ) + Thread.sleep(200); + else if ( Display.isCloseRequested() ) + System.exit(0); + + mainLoop(); + render(); + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + cleanup(); + } + System.exit(0); + } + + /** + * All calculations are done in here + */ + private static void mainLoop() { + angle += 1f; + if ( angle > 360.0f ) + angle = 0.0f; + + if ( Mouse.getDX() != 0 || Mouse.getDY() != 0 || Mouse.getDWheel() != 0 ) + System.out.println("Mouse moved " + Mouse.getDX() + " " + Mouse.getDY() + " " + Mouse.getDWheel()); + for ( int i = 0; i < Mouse.getButtonCount(); i++ ) + if ( Mouse.isButtonDown(i) ) + System.out.println("Button " + i + " down"); + if ( Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) ) + finished = true; + for ( int i = 0; i < Keyboard.getNumKeyboardEvents(); i++ ) { + Keyboard.next(); + if ( Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState() ) + finished = true; + if ( Keyboard.getEventKey() == Keyboard.KEY_T && Keyboard.getEventKeyState() ) + System.out.println("Current time: " + Sys.getTime()); + } + } + + /** + * All rendering is done in here + */ + private static void render() { + glClear(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + glTranslatef(Display.getDisplayMode().getWidth() / 2, Display.getDisplayMode().getHeight() / 2, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + + + ByteBuffer new_mapped_buffer = glMapBufferARB(GL_ARRAY_BUFFER_ARB, + GL_WRITE_ONLY_ARB, + mapped_buffer); + if ( new_mapped_buffer != mapped_buffer ) + mapped_float_buffer = new_mapped_buffer.order(ByteOrder.nativeOrder()).asFloatBuffer(); + mapped_buffer = new_mapped_buffer; + + new_mapped_buffer = glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, + GL_WRITE_ONLY_ARB, + mapped_indices_buffer); + if ( new_mapped_buffer != mapped_indices_buffer ) + mapped_indices_int_buffer = new_mapped_buffer.order(ByteOrder.nativeOrder()).asIntBuffer(); + mapped_indices_buffer = new_mapped_buffer; + + mapped_float_buffer.rewind(); + vertices.rewind(); + mapped_float_buffer.put(vertices); + + mapped_indices_int_buffer.rewind(); + indices.rewind(); + mapped_indices_int_buffer.put(indices); + if ( glUnmapBufferARB(GL_ARRAY_BUFFER_ARB) && + glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB) ) { + glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, 0); + } + glPopMatrix(); + } + + /** + * Initialize + */ + private static void init() throws Exception { + + System.out.println("Timer resolution: " + Sys.getTimerResolution()); + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + if ( !GLContext.getCapabilities().GL_ARB_vertex_buffer_object ) { + System.out.println("ARB VBO not supported!"); + System.exit(1); + } + IntBuffer int_buffer = ByteBuffer.allocateDirect(8).order(ByteOrder.nativeOrder()).asIntBuffer(); + glGenBuffersARB(int_buffer); + buffer_id = int_buffer.get(0); + indices_buffer_id = int_buffer.get(1); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer_id); + glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indices_buffer_id); + vertices = ByteBuffer.allocateDirect(2 * 4 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); + vertices.put(-50).put(-50).put(50).put(-50).put(50).put(50).put(-50).put(50); + vertices.rewind(); + indices = ByteBuffer.allocateDirect(4 * 4).order(ByteOrder.nativeOrder()).asIntBuffer(); + indices.put(0).put(1).put(2).put(3); + indices.rewind(); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, 2 * 4 * 4, GL_STREAM_DRAW_ARB); + glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 4 * 4, GL_STREAM_DRAW_ARB); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, 0); + } + + /** + * Cleanup + */ + private static void cleanup() { + IntBuffer int_buffer = ByteBuffer.allocateDirect(8).order(ByteOrder.nativeOrder()).asIntBuffer(); + int_buffer.put(0, buffer_id); + int_buffer.put(1, indices_buffer_id); + glDeleteBuffersARB(int_buffer); + Display.destroy(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOTest.java new file mode 100644 index 0000000..cdd303f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VBOTest.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Simple java test program. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +package org.lwjgl.test.opengl; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GLContext; + +import static org.lwjgl.opengl.ARBBufferObject.*; +import static org.lwjgl.opengl.ARBVertexBufferObject.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +public final class VBOTest { + + static { + try { + //find first display mode that allows us 640*480*16 + int mode = -1; + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( int i = 0; i < modes.length; i++ ) { + if ( modes[i].getWidth() == 640 + && modes[i].getHeight() == 480 + && modes[i].getBitsPerPixel() >= 16 ) { + mode = i; + break; + } + } + if ( mode != -1 ) { + //select above found displaymode + System.out.println("Setting display mode to " + modes[mode]); + Display.setDisplayMode(modes[mode]); + System.out.println("Created display."); + } + } catch (Exception e) { + System.err.println("Failed to create display due to " + e); + } + } + + static { + try { + Display.create(); + System.out.println("Created OpenGL."); + } catch (Exception e) { + System.err.println("Failed to create OpenGL due to " + e); + System.exit(1); + } + } + + /** + * Is the game finished? + */ + private static boolean finished; + + /** + * A rotating square! + */ + private static float angle; + private static int buffer_id; + private static FloatBuffer vertices; + private static ByteBuffer mapped_buffer; + private static FloatBuffer mapped_float_buffer; + + public static void main(String[] arguments) { + try { + init(); + while ( !finished ) { + Display.update(); + + if ( !Display.isVisible() ) + Thread.sleep(200); + else if ( Display.isCloseRequested() ) + System.exit(0); + + mainLoop(); + render(); + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + cleanup(); + } + System.exit(0); + } + + /** + * All calculations are done in here + */ + private static void mainLoop() { + angle += 1f; + if ( angle > 360.0f ) + angle = 0.0f; + + if ( Mouse.getDX() != 0 || Mouse.getDY() != 0 || Mouse.getDWheel() != 0 ) + System.out.println("Mouse moved " + Mouse.getDX() + " " + Mouse.getDY() + " " + Mouse.getDWheel()); + for ( int i = 0; i < Mouse.getButtonCount(); i++ ) + if ( Mouse.isButtonDown(i) ) + System.out.println("Button " + i + " down"); + if ( Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) ) + finished = true; + for ( int i = 0; i < Keyboard.getNumKeyboardEvents(); i++ ) { + Keyboard.next(); + if ( Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState() ) + finished = true; + if ( Keyboard.getEventKey() == Keyboard.KEY_T && Keyboard.getEventKeyState() ) + System.out.println("Current time: " + Sys.getTime()); + } + } + + /** + * All rendering is done in here + */ + private static void render() { + glClear(GL_COLOR_BUFFER_BIT); + glPushMatrix(); + glTranslatef(Display.getDisplayMode().getWidth() / 2, Display.getDisplayMode().getHeight() / 2, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + ByteBuffer new_mapped_buffer = glMapBufferARB(GL_ARRAY_BUFFER_ARB, + GL_WRITE_ONLY_ARB, + mapped_buffer); + if ( new_mapped_buffer != mapped_buffer ) + mapped_float_buffer = new_mapped_buffer.order(ByteOrder.nativeOrder()).asFloatBuffer(); + mapped_buffer = new_mapped_buffer; + mapped_float_buffer.rewind(); + vertices.rewind(); + mapped_float_buffer.put(vertices); + if ( glUnmapBufferARB(GL_ARRAY_BUFFER_ARB) ) + glDrawArrays(GL_QUADS, 0, 4); + glPopMatrix(); + } + + /** + * Initialize + */ + private static void init() throws Exception { + System.out.println("Timer resolution: " + Sys.getTimerResolution()); + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight()); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + if ( !GLContext.getCapabilities().GL_ARB_vertex_buffer_object ) { + System.out.println("ARB VBO not supported!"); + System.exit(1); + } + buffer_id = glGenBuffersARB(); + glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer_id); + vertices = ByteBuffer.allocateDirect(2 * 4 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); + vertices.put(-50).put(-50).put(50).put(-50).put(50).put(50).put(-50).put(50); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, 2 * 4 * 4, GL_STREAM_DRAW_ARB); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, 0); + } + + /** + * Cleanup + */ + private static void cleanup() { + glDeleteBuffersARB(buffer_id); + Display.destroy(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VersionTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VersionTest.java new file mode 100644 index 0000000..2255c5d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/VersionTest.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.*; + +import java.util.StringTokenizer; +import java.util.regex.Pattern; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL32.*; + +/** + * Tests the ARB_create_context extension through the use of the ContextAttribs class. + * + * @author Spasi + */ +public final class VersionTest { + + private VersionTest() { + } + + public static void main(String[] args) { + initialize(args); + cleanup(); + System.exit(0); + } + + private static void initialize(String[] args) { + if ( args.length < 2 ) + argsError("Insufficient number of arguments"); + + int majorInput = 1; + int minorInput = 0; + + try { + majorInput = Integer.parseInt(args[0]); + minorInput = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + argsError("Invalid number format"); + } + + ContextAttribs ca = new ContextAttribs(majorInput, minorInput); + + if ( 2 < args.length ) { + for ( int i = 2; i < args.length; i++ ) { + if ( Pattern.matches("[0-9]+", args[i]) ) + ca = ca.withLayer(Integer.parseInt(args[i])); + else if ( "debug".equalsIgnoreCase(args[i]) ) + ca = ca.withDebug(true); + else if ( "fc".equalsIgnoreCase(args[i]) ) + ca = ca.withForwardCompatible(true); + else if ( "core".equalsIgnoreCase(args[i]) ) + ca = ca.withProfileCore(true); + else if ( "compatibility".equalsIgnoreCase(args[i]) ) + ca = ca.withProfileCompatibility(true); + else if ( "es".equalsIgnoreCase(args[i]) ) + ca = ca.withProfileES(true); + else + argsError("Unknown argument: \'" + args[i] + "\'"); + } + } + + try { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + + DisplayMode displayMode; + + displayMode = chooseMode(modes, 1024, 768); + if ( displayMode == null ) + displayMode = chooseMode(modes, 800, 600); + if ( displayMode == null ) + displayMode = chooseMode(modes, 640, 480); + if ( displayMode == null ) + kill("Failed to set an appropriate display mode."); + + System.out.println("Setting display mode to: " + displayMode); + Display.setDisplayMode(displayMode); + Display.create(new PixelFormat(8, 24, 0), ca); + } catch (LWJGLException e) { + kill(e.getMessage()); + } + + System.out.println("\n---------\n"); + + System.out.println("Requested " + ca); + + final String version = glGetString(GL_VERSION); + + boolean deprecated = false; + try { + glVertex3f(0.0f, 0.0f, 0.0f); + Util.checkGLError(); + deprecated = true; + } catch (Throwable t) {} + + final StringTokenizer version_tokenizer = new StringTokenizer(version, ". "); + + int majorVersion = Integer.parseInt(version_tokenizer.nextToken()); + int minorVersion = Integer.parseInt(version_tokenizer.nextToken()); + + final boolean compatibilityProfile; + final boolean coreProfile; + + if ( 3 < majorVersion || (majorVersion == 3 && 2 <= minorVersion) ) { + final int profileMask = glGetInteger(GL_CONTEXT_PROFILE_MASK); + + compatibilityProfile = (profileMask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0; + coreProfile = (profileMask & GL_CONTEXT_CORE_PROFILE_BIT) != 0; + } else { + compatibilityProfile = false; + coreProfile = false; + } + + System.out.println("\nGL_VERSION returned : " + version); + System.out.println("\tCore profile: " + coreProfile); + System.out.println("\tCompatibility profile: " + compatibilityProfile); + System.out.println("ARB_compatibility present: " + GLContext.getCapabilities().GL_ARB_compatibility); + System.out.println("Deprecated functionality present: " + deprecated); + if ( !deprecated && GLContext.getCapabilities().GL_ARB_compatibility ) + System.out.println("\tARB_compatibility is present, but LWJGL has enabled pseudo-forward compatible mode."); + + System.out.println("\n---------"); + + boolean success = false; + boolean check; + if ( majorInput < 3 || (majorInput == 3 && minorInput == 0) ) { + System.out.println("\nA version less than or equal to 3.0 is requested, the context\n" + + "returned may implement any of the following versions:"); + + System.out.println("\n1) Any version no less than that requested and no greater than 3.0."); + check = (majorInput < majorVersion || (majorInput == majorVersion && minorInput <= minorVersion)) // Satisfies requested version + && (majorVersion < 3 || (majorVersion == 3 && minorVersion == 0)); // 3.0 or earlier + System.out.println("\t" + check); + success |= check; + + System.out.println("\n2) Version 3.1, if the GL_ARB_compatibility extension is also implemented."); + check = majorVersion == 3 && minorVersion == 1 && GLContext.getCapabilities().GL_ARB_compatibility; + System.out.println("\t" + check); + success |= check; + + System.out.println("\n3) The compatibility profile of version 3.2 or greater."); + check = compatibilityProfile; // No need to check version, profiles are only available with 3.2+. + System.out.println("\t" + check); + success |= check; + + System.out.println("\nTEST " + (success ? "SUCCEEDED" : "FAILED")); + if ( !success && ca.isForwardCompatible() ) + System.out.println("\t(probably because the forward compatible flag was set)"); + } else if ( majorInput == 3 && minorInput == 1 ) { + System.out.println("\nVersion 3.1 is requested, the context returned may implement\n" + + "any of the following versions:"); + + System.out.println("\n1) Version 3.1. The GL_ARB_compatibility extension may or may not\n" + + "be implemented, as determined by the implementation."); + check = majorVersion == 3 && minorVersion == 1; + System.out.println("\t" + check); + success |= check; + + System.out.println("\n2) The core profile of version 3.2 or greater."); + check = coreProfile; // No need to check version, profiles are only available with 3.2+. + System.out.println("\t" + check); + success |= check; + + System.out.println("\nTEST " + (success ? "SUCCEEDED" : "FAILED")); + } else { + System.out.println("\nVersion 3.2 or greater is requested, the context returned may\n" + + "implement any of the following versions:"); + + System.out.println("\n1) The requested profile of the requested version."); + check = majorInput == majorVersion && minorInput == minorVersion + && (!ca.isProfileCompatibility() || compatibilityProfile) + && (!ca.isProfileCore() || coreProfile); + System.out.println("\t" + check); + success |= check; + + System.out.println("\n2) The requested profile of any later version, so long as no\n" + + "features have been removed from that later version and profile."); + check = majorInput < majorVersion || (majorInput == majorVersion && minorInput < minorVersion) + && (!ca.isProfileCompatibility() || compatibilityProfile) + && (!ca.isProfileCore() || coreProfile); + System.out.println("\t" + check); + success |= check; + + System.out.println("\nTEST " + (success ? "SUCCEEDED" : "FAILED")); + } + } + + private static DisplayMode chooseMode(DisplayMode[] modes, int width, int height) { + DisplayMode bestMode = null; + + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getFrequency() <= 85 ) { + if ( bestMode == null || (mode.getBitsPerPixel() >= bestMode.getBitsPerPixel() && mode.getFrequency() > bestMode.getFrequency()) ) + bestMode = mode; + } + } + + return bestMode; + } + + private static void cleanup() { + if ( Display.isCreated() ) + Display.destroy(); + } + + private static void argsError(final String msg) { + System.out.println("\nInvalid arguments error: " + msg); + System.out.println("\nUsage: VersionTest <majorVersion> <minorVersion> {'core'|'compatibility', <layer>, 'debug', 'fc'}:\n"); + System.out.println("majorVersion\t- Major OpenGL version."); + System.out.println("majorVersion\t- Minor OpenGL version."); + System.out.println("core\t- Sets the Core Profile bit (optional, requires 3.2+)."); + System.out.println("compatibility\t- Sets the Compatibility Profile bit (optional, requires 3.2+)."); + System.out.println("ws\t- Sets the OpenGL ES Profile bit (optional, requires 2.0)."); + System.out.println("layer\t- Layer plane (optional)."); + System.out.println("debug\t- Enables debug mode (optional)."); + System.out.println("fc\t- Enables forward compatibility mode (optional, requires 3.0+)."); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason) { + System.out.println("The VersionTest program was terminated because an error occured.\n"); + System.out.println("Reason: " + (reason == null ? "Unknown" : reason)); + + cleanup(); + System.exit(-1); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGears.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGears.java new file mode 100644 index 0000000..fc9efc3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGears.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.awt; + +import java.awt.Frame; +import java.awt.Color; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import org.lwjgl.LWJGLException; + +/** + * <p> + * AWT version of the gears demo + * <p> + * @version $Revision$ + * @author Brian Matzon <brian@matzon.dk> + * $Id$ + */ +public class AWTGears extends Frame { + + /** + * C'tor + */ + public AWTGears() throws LWJGLException { + setTitle("Gears"); + setBackground(Color.BLACK); + AWTGearsCanvas canvas = new AWTGearsCanvas(); + canvas.setSize(300, 300); + add(canvas); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dispose(); + System.exit(0); + } + }); + setResizable(true); + pack(); + setVisible(true); + } + + public static void main(String[] args) throws LWJGLException { + new AWTGears(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java new file mode 100644 index 0000000..24b0bbb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTGearsCanvas.java @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.awt; + +import java.nio.FloatBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.AWTGLCanvas; +import org.lwjgl.opengl.GLContext; +import org.lwjgl.test.applet.Test; + +import static org.lwjgl.opengl.ARBTransposeMatrix.*; +import static org.lwjgl.opengl.GL11.*; + +/** + * <p> + * AWT version of the gears demo + * <p> + * @version $Revision$ + * @author Brian Matzon <brian@matzon.dk> + * $Id$ + */ +public class AWTGearsCanvas extends AWTGLCanvas implements Test { + + private float view_rotx = 20.0f; + + private float view_roty = 30.0f; + + private float view_rotz; + + private int gear1; + + private int gear2; + + private int gear3; + + private float angle; + + long startTime; + long fps; + int current_width; + int current_height; + + /** + * C'tor + */ + public AWTGearsCanvas() throws LWJGLException { + super(); + } + + public void paintGL() { + + if(startTime == 0) { + setup(); + startTime = System.currentTimeMillis() + 5000; + } + + try { + angle += 2.0f; + if (getWidth() != current_width || getHeight() != current_height) { + current_width = getWidth(); + current_height = getHeight(); + glViewport(0, 0, current_width, current_height); + } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + glPushMatrix(); + glTranslatef(-3.0f, -2.0f, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1f, -2.0f, 0.0f); + glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1f, 4.2f, 0.0f); + glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); + swapBuffers(); + repaint(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in " + timeUsed / 1000f + " seconds = " + + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + + private void setup() { + // setup ogl + FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); + FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f}); + FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f}); + FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f}); + pos.flip(); + red.flip(); + green.flip(); + blue.flip(); + + glLight(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + gear(1.0f, 4.0f, 1.0f, 20, 0.7f); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + gear(0.5f, 2.0f, 2.0f, 10, 0.7f); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + gear(1.3f, 2.0f, 0.5f, 10, 0.7f); + glEndList(); + + glEnable(GL_NORMALIZE); + + glMatrixMode(GL_PROJECTION); + + System.err.println("GL_VENDOR: " + glGetString(GL_VENDOR)); + System.err.println("GL_RENDERER: " + glGetString(GL_RENDERER)); + System.err.println("GL_VERSION: " + glGetString(GL_VERSION)); + System.err.println(); + System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix); + if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) { + // --- not using extensions + glLoadIdentity(); + } else { + // --- using extensions + final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put( + new float[] { 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1}); + identityTranspose.flip(); + glLoadTransposeMatrixARB(identityTranspose); + } + + float h = (float) 300 / (float) 300; + glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -40.0f); + } + + /** + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + */ + private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { + int i; + float r0, r1, r2; + float angle, da; + float u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0f; + r2 = outer_radius + tooth_depth / 2.0f; + + da = 2.0f * (float) Math.PI / teeth / 4.0f; + + glShadeModel(GL_FLAT); + + glNormal3f(0.0f, 0.0f, 1.0f); + + /* draw front face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + if (i < teeth) { + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), + width * 0.5f); + } + } + glEnd(); + + /* draw front sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f); + } + glEnd(); + + /* draw back face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw outward faces of teeth */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle); + v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle); + len = (float) Math.sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da); + v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da); + glNormal3f(v, -u, 0.0f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + } + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f); + glEnd(); + + glShadeModel(GL_SMOOTH); + + /* draw inside radius cylinder */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + } + glEnd(); + } + + /* + * @see org.lwjgl.test.applet.Test#start() + */ + public void start() { + } + + /* + * @see org.lwjgl.test.applet.Test#stop() + */ + public void stop() { + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTTest.java new file mode 100644 index 0000000..4e1abf4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/AWTTest.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.awt; + +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.AWTGLCanvas; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <p> + * Tests AWTGLCanvas functionality + * <p> + * @version $Revision$ + * @author $Author$ + * $Id$ + */ +public class AWTTest extends Frame { + + /** AWT GL canvas */ + private AWTGLCanvas canvas0, canvas1; + + private volatile float angle; + + /** + * C'tor + */ + public AWTTest() throws LWJGLException { + setTitle("LWJGL AWT Canvas Test"); + setSize(640, 320); + setLayout(new GridLayout(1, 2)); + add(canvas0 = new AWTGLCanvas() { + int current_height; + int current_width; + public void paintGL() { + try { + if (getWidth() != current_width || getHeight() != current_height) { + current_width = getWidth(); + current_height = getHeight(); + glViewport(0, 0, current_width, current_height); + } + glViewport(0, 0, getWidth(), getHeight()); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.0f, (float) getWidth(), 0.0f, (float) getHeight()); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glColor3f(1f, 1f, 0f); + glTranslatef(getWidth() / 2.0f, getHeight() / 2.0f, 0.0f); + glRotatef(angle, 0f, 0f, 1.0f); + glRectf(-50.0f, -50.0f, 50.0f, 50.0f); + glPopMatrix(); + swapBuffers(); + repaint(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + }); + add(canvas1 = new AWTGLCanvas() { + int current_height; + int current_width; + public void paintGL() { + try { + angle += 1.0f; + if (getWidth() != current_width || getHeight() != current_height) { + current_width = getWidth(); + current_height = getHeight(); + glViewport(0, 0, current_width, current_height); + } + glViewport(0, 0, getWidth(), getHeight()); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.0f, (float) getWidth(), 0.0f, (float) getHeight()); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(getWidth() / 2.0f, getHeight() / 2.0f, 0.0f); + glRotatef(2*angle, 0f, 0f, -1.0f); + glRectf(-50.0f, -50.0f, 50.0f, 50.0f); + glPopMatrix(); + swapBuffers(); + repaint(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + }); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dispose(); + System.exit(0); + } + }); + setResizable(true); + setVisible(true); + } + + public static void main(String[] args) throws LWJGLException { + new AWTTest(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DemoBox.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DemoBox.java new file mode 100644 index 0000000..93489c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DemoBox.java @@ -0,0 +1,639 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.awt; + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Label; +import java.awt.List; +import java.awt.Panel; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.nio.FloatBuffer; +import java.util.Enumeration; +import java.util.Hashtable; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.AWTGLCanvas; +import org.lwjgl.opengl.GLContext; + +import static org.lwjgl.opengl.ARBTransposeMatrix.*; +import static org.lwjgl.opengl.GL11.*; + +/** + * <p> + * </p> + * @version $Revision$ + * @author Brian Matzon <brian@matzon.dk> + * $Id$ + */ +public class DemoBox extends Frame { + + /** GL canvas */ + private DemoBoxGLCanvas demoCanvas; + + /** Demo selection panel */ + private Panel selectionPanel; + + /** Hashtable of demos */ + private Hashtable<String, Demo> selectableDemos; + + /** + * Creates a new demo box instance + */ + public DemoBox() { + selectableDemos = new Hashtable<String, Demo>(); + selectableDemos.put("default", new NullDemoBox()); + selectableDemos.put("clear_color", new ClearColorDemoBox()); + selectableDemos.put("gears", new GearsDemoBox()); + } + + /** + * @return + */ + public boolean initialize() { + setTitle("LWJGL - Demo Box"); + setSize(640, 480); + setLayout(new GridBagLayout()); + + // Setup selection panel + // ================================= + selectionPanel = new Panel(); + selectionPanel.setLayout(new BorderLayout()); + selectionPanel.add(new Label("Demo", Label.CENTER), BorderLayout.NORTH); + + Button fullScreen = new Button("Fullscreen"); + fullScreen.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent event) { + toggleFullscreen(); + } + }); + selectionPanel.add(fullScreen, BorderLayout.SOUTH); + + final List demos = new List(); + for (Enumeration e = selectableDemos.keys(); e.hasMoreElements();) { + demos.add(e.nextElement().toString()); + } + selectionPanel.add(demos, BorderLayout.CENTER); + + demos.addItemListener(new ItemListener() { + + public void itemStateChanged(ItemEvent event) { + demoSelected(event.getItemSelectable().getSelectedObjects()[0].toString()); + } + }); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.fill = java.awt.GridBagConstraints.BOTH; + gbc.weightx = 0.05; + gbc.weighty = 1.0; + add(selectionPanel, gbc); + // --------------------------------- + + // setup demo canvas + // ================================= + try { + demoCanvas = new DemoBoxGLCanvas(this); + + gbc = new GridBagConstraints(); + gbc.gridx = 1; + gbc.gridy = 0; + gbc.fill = java.awt.GridBagConstraints.BOTH; + gbc.weightx = 0.95; + gbc.weighty = 1.0; + add(demoCanvas, gbc); + } catch (LWJGLException le) { + le.printStackTrace(); + return false; + } + // --------------------------------- + + addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + demoCanvas.destroyCanvas(); + dispose(); + System.exit(0); + } + }); + + //demos.select(0); + //demoSelected(demos.getSelectedItem()); + return true; + } + + public void updateFPS(float fps) { + if(fps != -1) { + setTitle("LWJGL - Demo Box (FPS: " + fps + ")"); + } else { + setTitle("LWJGL - Demo Box"); + } + } + + /** + * Enter fullscreen mode for this demo + */ + protected void toggleFullscreen() { + System.out.println("Toggle Fullscreen"); + } + + /** + * Selected a demo + * @param demo Name of demo that was selected + */ + protected void demoSelected(String demo) { + System.out.println("Selecting demo: " + demo); + demoCanvas.setActiveDemo(selectableDemos.get(demo)); + } + + /** + * @param args + * @throws LWJGLException + */ + public static void main(String[] args) throws LWJGLException { + DemoBox demo = new DemoBox(); + demo.initialize(); + demo.setVisible(true); + } + + /** + * Interface for a demo + */ + public interface Demo { + boolean isInitialized(); + boolean initialize(); + void render(); + void destroy(); + } + + /** + * + */ + private class DemoBoxGLCanvas extends AWTGLCanvas implements Runnable { + + /** Parent demo box */ + DemoBox parent; + + /** Currently active demo */ + Demo activeDemo; + + /** last active demo */ + Demo lastActiveDemo; + + /** Render thread */ + private Thread renderThread; + + private DemoBoxGLCanvas(DemoBox parent) throws LWJGLException { + super(); + this.parent = parent; + } + + // FPS + long startTime; + long fps; + + protected void paintGL() { + synchronized (this) { + if (lastActiveDemo != null && lastActiveDemo != activeDemo) { + lastActiveDemo.destroy(); + lastActiveDemo = null; + if (activeDemo != null) { + activeDemo.initialize(); + startTime = System.currentTimeMillis() + 5000; + } else { + parent.updateFPS(-1); + } + } + + if (activeDemo != null) { + + if(!activeDemo.isInitialized()) { + activeDemo.initialize(); + } + + activeDemo.render(); + try { + swapBuffers(); + } catch (LWJGLException le) { + le.printStackTrace(); + } + + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + parent.updateFPS((fps / (timeUsed / 1000f))); + fps = 0; + } + } + } + } + + public void destroyCanvas() { + setActiveDemo(null); + renderThread = null; + } + + public void setActiveDemo(Demo activeDemo) { + synchronized (this) { + // setting no current demo + if (activeDemo == null) { + lastActiveDemo = this.activeDemo; + this.activeDemo = null; + return; + } + + // setting to new demo + lastActiveDemo = this.activeDemo; + this.activeDemo = activeDemo; + } + + if (renderThread == null) { + renderThread = new Thread(this); + renderThread.setName("DemoBox-Renderer"); + renderThread.start(); + } + } + + private DemoBoxGLCanvas() throws LWJGLException { + super(); + } + + public void run() { + long sleep_time = 1000; + while (renderThread != null) { + + // check for change of demo + synchronized (this) { + // if no demo set, just sleep + if (activeDemo == null) { + sleep_time = 1000; + } else { + // we have a demo! + sleep_time = 16; + repaint(); + } + } + sleep(sleep_time); + } + System.out.println("dead"); + } + + private void sleep(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException inte) { + } + } + } + + // Demo box demo + // ======================================================== + public class ClearColorDemoBox implements Demo { + + private boolean initialized; + + int direction = 1; + + float color; + + public boolean isInitialized() { + return initialized; + } + + public boolean initialize() { + return initialized = true; + } + + public void render() { + glClearColor(color, color, color, 1f); + glClear(GL_COLOR_BUFFER_BIT); + + color += direction * .05f; + + if (color > 1f) { + color = 1f; + direction = -1 * direction; + } else if (color < 0f) { + direction = -1 * direction; + color = 0f; + } + } + + public void destroy() { + initialized = false; + } + } + + // -------------------------------------------------------- + + // Demo box demo + // ======================================================== + public class NullDemoBox implements Demo { + + private boolean initialized; + + public boolean isInitialized() { + return initialized; + } + + public boolean initialize() { + glClearColor(0, 0, 0, 1f); + return true; + } + + public void render() { + glClear(GL_COLOR_BUFFER_BIT); + } + + public void destroy() { + initialized = false; + } + } + // -------------------------------------------------------- + + // Demo box demo + // ======================================================== + public class GearsDemoBox implements Demo { + + private boolean initialized; + + private float view_rotx = 20.0f; + + private float view_roty = 30.0f; + + private float view_rotz; + + private int gear1; + + private int gear2; + + private int gear3; + + private float angle; + + public boolean isInitialized() { + return initialized; + } + + public boolean initialize() { + // setup ogl + FloatBuffer pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f}); + FloatBuffer red = BufferUtils.createFloatBuffer(4).put(new float[] { 0.8f, 0.1f, 0.0f, 1.0f}); + FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0.0f, 0.8f, 0.2f, 1.0f}); + FloatBuffer blue = BufferUtils.createFloatBuffer(4).put(new float[] { 0.2f, 0.2f, 1.0f, 1.0f}); + pos.flip(); + red.flip(); + green.flip(); + blue.flip(); + + glClearColor(0, 0, 0, 1f); + + glLight(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + gear(1.0f, 4.0f, 1.0f, 20, 0.7f); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + gear(0.5f, 2.0f, 2.0f, 10, 0.7f); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + gear(1.3f, 2.0f, 0.5f, 10, 0.7f); + glEndList(); + + glEnable(GL_NORMALIZE); + + glMatrixMode(GL_PROJECTION); + + System.err.println("GL_VENDOR: " + glGetString(GL_VENDOR)); + System.err.println("GL_RENDERER: " + glGetString(GL_RENDERER)); + System.err.println("GL_VERSION: " + glGetString(GL_VERSION)); + System.err.println(); + System.err.println("glLoadTransposeMatrixfARB() supported: " + GLContext.getCapabilities().GL_ARB_transpose_matrix); + if (!GLContext.getCapabilities().GL_ARB_transpose_matrix) { + // --- not using extensions + glLoadIdentity(); + } else { + // --- using extensions + final FloatBuffer identityTranspose = BufferUtils.createFloatBuffer(16).put( + new float[] { 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1}); + identityTranspose.flip(); + glLoadTransposeMatrixARB(identityTranspose); + } + + float h = (float) 300 / (float) 300; + glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -40.0f); + return initialized = true; + } + + public void render() { + angle += 2.0f; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + glPushMatrix(); + glTranslatef(-3.0f, -2.0f, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1f, -2.0f, 0.0f); + glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1f, 4.2f, 0.0f); + glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); + } + + /** + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + */ + private void gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { + int i; + float r0, r1, r2; + float angle, da; + float u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0f; + r2 = outer_radius + tooth_depth / 2.0f; + + da = 2.0f * (float) Math.PI / teeth / 4.0f; + + glShadeModel(GL_FLAT); + + glNormal3f(0.0f, 0.0f, 1.0f); + + /* draw front face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + if (i < teeth) { + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), + width * 0.5f); + } + } + glEnd(); + + /* draw front sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2.0f * da), r2 * (float) Math.sin(angle + 2.0f * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3.0f * da), r1 * (float) Math.sin(angle + 3.0f * da), width * 0.5f); + } + glEnd(); + + /* draw back face */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin(GL_QUADS); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + } + glEnd(); + + /* draw outward faces of teeth */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle), r1 * (float) Math.sin(angle), -width * 0.5f); + u = r2 * (float) Math.cos(angle + da) - r1 * (float) Math.cos(angle); + v = r2 * (float) Math.sin(angle + da) - r1 * (float) Math.sin(angle); + len = (float) Math.sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + da), r2 * (float) Math.sin(angle + da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), width * 0.5f); + glVertex3f(r2 * (float) Math.cos(angle + 2 * da), r2 * (float) Math.sin(angle + 2 * da), -width * 0.5f); + u = r1 * (float) Math.cos(angle + 3 * da) - r2 * (float) Math.cos(angle + 2 * da); + v = r1 * (float) Math.sin(angle + 3 * da) - r2 * (float) Math.sin(angle + 2 * da); + glNormal3f(v, -u, 0.0f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(angle + 3 * da), r1 * (float) Math.sin(angle + 3 * da), -width * 0.5f); + glNormal3f((float) Math.cos(angle), (float) Math.sin(angle), 0.0f); + } + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), width * 0.5f); + glVertex3f(r1 * (float) Math.cos(0), r1 * (float) Math.sin(0), -width * 0.5f); + glEnd(); + + glShadeModel(GL_SMOOTH); + + /* draw inside radius cylinder */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0f * (float) Math.PI / teeth; + glNormal3f(-(float) Math.cos(angle), -(float) Math.sin(angle), 0.0f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) Math.cos(angle), r0 * (float) Math.sin(angle), width * 0.5f); + } + glEnd(); + } + + public void destroy() { + glDeleteLists(gear1, 1); + glDeleteLists(gear2, 1); + glDeleteLists(gear3, 1); + initialized = false; + } + } + // -------------------------------------------------------- +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DisplayParentTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DisplayParentTest.java new file mode 100644 index 0000000..5f041d2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/awt/DisplayParentTest.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.awt; + +import java.awt.Canvas; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <p> + * Tests Display.setParent() + * <p> + * @version $Revision$ + * @author $Author$ + * $Id$ + */ +public class DisplayParentTest extends Frame { + boolean killswitch; + public DisplayParentTest() throws LWJGLException { + setTitle("LWJGL Display Parent Test"); + setSize(640, 320); + setLayout(new GridLayout(1, 2)); + final Canvas display_parent = new Canvas(); + display_parent.setFocusable(true); + display_parent.setIgnoreRepaint(true); + add(display_parent); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + killswitch = true; + } + }); + setResizable(true); + setVisible(true); + Display.setParent(display_parent); + Display.setVSyncEnabled(true); + Display.create(); + float angle = 0f; + + while (isVisible() && !killswitch) { + angle += 1.0f; + int width; + int height; + if (!Display.isFullscreen()) { + width = display_parent.getWidth(); + height = display_parent.getHeight(); + } else { + width = Display.getDisplayMode().getWidth(); + height = Display.getDisplayMode().getHeight(); + } + + if(width < 1 || height < 1) { + continue; + } + + glViewport(0, 0, width, height); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.0f, (float) width, 0.0f, (float) height); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(width / 2.0f, height / 2.0f, 0.0f); + glRotatef(2*angle, 0f, 0f, -1.0f); + glRectf(-50.0f, -50.0f, 50.0f, 50.0f); + glPopMatrix(); + Display.update(); + while(Keyboard.next()) { + // closing on ESCAPE + if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState()) { + Display.destroy(); + dispose(); + break; + } + + if(Keyboard.getEventKey() == Keyboard.KEY_SPACE && Keyboard.getEventKeyState()) { + Mouse.setGrabbed(!Mouse.isGrabbed()); + } + if(Keyboard.getEventKey() == Keyboard.KEY_F && Keyboard.getEventKeyState()) { + Display.setFullscreen(!Display.isFullscreen()); + } + } +/* while (Mouse.next()) { +System.out.println(" Mouse.getEventX() = " + Mouse.getEventX() + " | Mouse.getEventY() = " + Mouse.getEventY()); + }*/ + } + Display.destroy(); + dispose(); + } + + public static void main(String[] args) throws LWJGLException { + new DisplayParentTest(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoadTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoadTest.java new file mode 100644 index 0000000..bf2326c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoadTest.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.multithread; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.*; +import org.lwjgl.util.glu.Sphere; + +import java.nio.FloatBuffer; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * A test of loading textures in a background thread. This can be achieved in 2 ways: + * <br> + * a) A dummy Pbuffer is created and its context shares the rendering context.<br> + * b) A SharedDrawable is used.<br> + * <br> + * When the test starts, there's no texture created and rendering is done with texturing disabled. + * 2 seconds later a "dummy" texture is created in the background thread and texturing is enabled. This dummy texture + * can by anything the developer wants to have as a placeholder while textures are being loaded. + * Finally, 5 seconds later the "true" texture is loaded and displayed. This texture will change every 5 seconds after + * that, until the test is terminated (ESC key). + * + * @author Spasi + */ +public final class BackgroundLoadTest { + + private static boolean run = true; + + private static BackgroundLoader backgroundLoader; + + private static Sphere sphere; + + private BackgroundLoadTest() { + } + + public static void main(String[] args) { + initialize(args); + + Util.checkGLError(); + + try { + backgroundLoader.start(); + } catch (LWJGLException e) { + kill("Failed to start background thread.", e); + } + + Util.checkGLError(); + + while ( run ) { + if ( !Display.isVisible() ) + Thread.yield(); + else { + handleIO(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderObject(); + + Util.checkGLError(); + + // Restore camera position. + glPopMatrix(); + glPushMatrix(); + } + + Display.update(); + + if ( Display.isCloseRequested() ) + break; + } + + cleanup(); + System.exit(0); + } + + private static void initialize(String[] args) { + if ( args.length != 1 ) + argsError(); + + DisplayMode displayMode = null; + + try { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + + displayMode = chooseMode(modes, 1024, 768); + if ( displayMode == null ) + displayMode = chooseMode(modes, 800, 600); + if ( displayMode == null ) + displayMode = chooseMode(modes, 640, 480); + if ( displayMode == null ) + kill("Failed to set an appropriate display mode."); + + System.out.println("Setting display mode to: " + displayMode); + Display.setDisplayMode(displayMode); + Display.setTitle("Background Loading Test"); + Display.create(new PixelFormat(8, 24, 0)); + } catch (LWJGLException e) { + kill(e.getMessage()); + } + + glViewport(0, 0, displayMode.getWidth(), displayMode.getHeight()); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, displayMode.getWidth() / (float)displayMode.getHeight(), 1.0f, 10.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // Setup camera position. + glTranslatef(0.0f, 0.0f, -4.0f); + glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + glPushMatrix(); + + glClearDepth(1.0f); + glDepthFunc(GL_LEQUAL); + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + glFrontFace(GL_CCW); + glPolygonMode(GL_FRONT, GL_FILL); + + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + glAlphaFunc(GL_GREATER, 0.0f); + glEnable(GL_ALPHA_TEST); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_BLEND); + + glShadeModel(GL_SMOOTH); + + final FloatBuffer vectorBuffer = BufferUtils.createFloatBuffer(4); + + vectorBuffer.clear(); + vectorBuffer.put(0, 1.0f).put(1, 1.0f).put(2, 1.0f).put(3, 1.0f); + glLight(GL_LIGHT0, GL_DIFFUSE, vectorBuffer); + + vectorBuffer.put(0, 1.0f).put(1, 1.0f).put(2, 1.0f).put(3, 1.0f); + glLight(GL_LIGHT0, GL_AMBIENT, vectorBuffer); + + vectorBuffer.put(0, 1.0f).put(1, 1.0f).put(2, 0.5f).put(3, 1.0f); + glLight(GL_LIGHT0, GL_SPECULAR, vectorBuffer); + + vectorBuffer.put(0, -1.0f / 3.0f).put(1, 1.0f / 3.0f).put(2, 1.0f / 3.0f).put(3, 0.0f); // Infinite + glLight(GL_LIGHT0, GL_POSITION, vectorBuffer); + + vectorBuffer.put(0, 0.2f).put(1, 0.2f).put(2, 0.2f).put(3, 1.0f); + glLightModel(GL_LIGHT_MODEL_AMBIENT, vectorBuffer); + + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + + sphere = new Sphere(); + + if ( "PB".equalsIgnoreCase(args[0]) ) { + backgroundLoader = new BackgroundLoader() { + Drawable getDrawable() throws LWJGLException { + return new Pbuffer(2, 2, new PixelFormat(8, 24, 0), Display.getDrawable()); + } + }; + } else if ( "SD".equalsIgnoreCase(args[0]) ) { + backgroundLoader = new BackgroundLoader() { + Drawable getDrawable() throws LWJGLException { + return new SharedDrawable(Display.getDrawable()); + } + }; + } else { + argsError(); + } + } + + private static void handleIO() { + if ( Keyboard.getNumKeyboardEvents() != 0 ) { + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + + while ( Mouse.next() ) ; + } + + static void renderObject() { + glColor3f(1.0f, 1.0f, 1.0f); + + int texID = backgroundLoader.getTexID(); + if ( texID == 0 ) { + sphere.setTextureFlag(false); + glDisable(GL_TEXTURE_2D); + } else { + sphere.setTextureFlag(true); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, texID); + } + + sphere.draw(1.0f, 32, 32); + + if ( texID != 0 ) { // Unbind so we can update from the background thread. + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + } + } + + private static DisplayMode chooseMode(DisplayMode[] modes, int width, int height) { + DisplayMode bestMode = null; + + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getFrequency() <= 85 ) { + if ( bestMode == null || (mode.getBitsPerPixel() >= bestMode.getBitsPerPixel() && mode.getFrequency() > bestMode.getFrequency()) ) + bestMode = mode; + } + } + + return bestMode; + } + + private static void cleanup() { + backgroundLoader.cleanup(); + + Thread.yield(); // Let background thread finish. + + if ( Display.isCreated() ) + Display.destroy(); + } + + private static void argsError() { + System.out.println("\nInvalid program arguments."); + System.out.println("\nUsage: BackgroundLoadTest <testType>, where <testType> argument can be one of the following:\n"); + System.out.println("PB\t- Use a Pbuffer context for the background thread."); + System.out.println("SD\t- Use a SharedDrawable context for the background thread."); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason) { + System.out.println("The BackgroundLoadTest program was terminated because an error occured.\n"); + System.out.println("Reason: " + (reason == null ? "Unknown" : reason)); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason, Throwable t) { + System.out.println("The BackgroundLoadTest program was terminated because an exception occured.\n"); + System.out.println("Reason: " + (reason == null ? "Unknown" : reason)); + + System.out.println("Exception message: " + t.getMessage()); + + cleanup(); + System.exit(-1); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoader.java new file mode 100644 index 0000000..c32f8d5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/multithread/BackgroundLoader.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 8:41:42 pm + */ +package org.lwjgl.test.opengl.multithread; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Drawable; +import org.lwjgl.opengl.GLContext; +import org.lwjgl.opengl.GLSync; +import org.lwjgl.util.Color; +import org.lwjgl.util.ReadableColor; + +import java.nio.ByteBuffer; +import java.util.concurrent.locks.ReentrantLock; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL32.*; + +abstract class BackgroundLoader { + + private static final int WIDTH = 32; + private static final int HEIGHT = 32; + + // CPU synchronization + private final ReentrantLock lock = new ReentrantLock(); + // GPU synchronization + private GLSync fence; + + private Drawable drawable; + + private boolean running; + + private ByteBuffer texture; + private int texID; + + protected BackgroundLoader() { + running = true; + texture = BufferUtils.createByteBuffer(WIDTH * HEIGHT * 3); + } + + abstract Drawable getDrawable() throws LWJGLException; + + void cleanup() { + running = false; + } + + void start() throws LWJGLException { + // The shared context must be created on the main thread. + drawable = getDrawable(); + + new Thread(new Runnable() { + public void run() { + System.out.println("-- Background Thread started --"); + + System.out.println("** Sleeping, no texture created yet **"); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + try { + // Make the shared context current in the worker thread + drawable.makeCurrent(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + System.out.println("** Drawable created **"); + + // Create a "dummy" texture while we wait for texture IO + createCheckerTexture(Color.RED, Color.WHITE, 2); + + lock.lock(); + + texID = glGenTextures(); + glBindTexture(GL_TEXTURE_2D, texID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glBindTexture(GL_TEXTURE_2D, 0); + + // OpenGL commands from different contexts may be executed in any order. So we need a way to synchronize + final boolean useFences = GLContext.getCapabilities().OpenGL32; + + if ( useFences ) + fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + else + glFlush(); // Best we can do without fences. This will force rendering on the main thread to happen after we upload the texture. + + lock.unlock(); + + System.out.println("** Dummy texture created **"); + + long lastTextureCreated = System.currentTimeMillis(); // Delay first texture creation + int count = 0; + while ( running ) { + long time = System.currentTimeMillis(); + if ( time - lastTextureCreated < 5000 ) { // Update the texture every 5 seconds + try { + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + continue; + } + + // Create the "true" texture + if ( count % 2 == 0 ) + createGradientTexture(Color.RED, Color.BLUE); + else + createGradientTexture(Color.GREEN, Color.YELLOW); + + lock.lock(); + + glBindTexture(GL_TEXTURE_2D, texID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glBindTexture(GL_TEXTURE_2D, 0); + + if ( useFences ) + fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + else + glFlush(); + + lock.unlock(); + + System.out.println("** Created new gradient texture **"); + + lastTextureCreated = System.currentTimeMillis(); + count++; + } + + drawable.destroy(); + + System.out.println("-- Background Thread finished --"); + } + }).start(); + } + + int getTexID() { + lock.lock(); + try { + if ( fence != null ) { + glWaitSync(fence, 0, GL_TIMEOUT_IGNORED); + fence = null; + } + return texID; + } finally { + lock.unlock(); + } + } + + private void createCheckerTexture(final ReadableColor a, final ReadableColor b, final int size) { + int i = 0; + for ( int y = 0; y < HEIGHT; y++ ) { + for ( int x = 0; x < WIDTH; x++ ) { + ReadableColor c = (x / size) % 2 == 0 ? ((y / size) % 2 == 0 ? a : b) : ((y / size) % 2 == 0 ? b : a); + texture.put(i + 0, c.getRedByte()); + texture.put(i + 1, c.getGreenByte()); + texture.put(i + 2, c.getBlueByte()); + i += 3; + } + } + } + + private void createGradientTexture(final ReadableColor a, final ReadableColor b) { + float l = 0.0f; + int i = 0; + for ( int y = 0; y < HEIGHT; y++ ) { + for ( int x = 0; x < WIDTH; x++ ) { + texture.put(i + 0, lerp(a.getRed(), b.getRed(), l)); + texture.put(i + 1, lerp(a.getGreen(), b.getGreen(), l)); + texture.put(i + 2, lerp(a.getBlue(), b.getBlue(), l)); + i += 3; + } + l += (1.0f / (HEIGHT - 1)); + } + } + + private static byte lerp(final int a, final int b, final float l) { + return (byte)Math.round(((1.0f - l) * a + l * b)); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/PbufferTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/PbufferTest.java new file mode 100644 index 0000000..f3ddea6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/PbufferTest.java @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.pbuffers; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.Pbuffer; +import org.lwjgl.opengl.PixelFormat; +import org.lwjgl.util.vector.Vector2f; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * <p/> + * Tests Pbuffers + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public final class PbufferTest { + + /** + * Texture and pbuffer size + */ + private static final int TEXTURE_SIZE = 512; + + /** + * Size of the animated quad + */ + private static final int QUAD_SIZE = 64; + + /** + * The renderer to use when rendering to texture. + */ + private TextureRenderer texRenderer; + + /** + * Intended deiplay mode + */ + private DisplayMode mode; + + /** + * our quad moving around + */ + private Vector2f quadPosition; + + /** + * For positioning our quad in the texture + */ + private float texScaleX, texScaleY; + + /** + * our quadVelocity + */ + private Vector2f quadVelocity; + + /** + * angle of quad + */ + private float angle; + + /** + * degrees to rotate per frame + */ + private float angleRotation = 1.0f; + + /** + * Max speed of all changable attributes + */ + private static final float MAX_SPEED = 20.0f; + + /** + * The shared texture + */ + private static int texID; + + public PbufferTest(final int renderMode) { + try { + //find displaymode + mode = findDisplayMode(800, 600, 16); + Display.setDisplayMode(mode); + Display.create(new PixelFormat(16, 0, 0, 0, 0)); + + glInit(); + + if ( (Pbuffer.getCapabilities() & Pbuffer.PBUFFER_SUPPORTED) == 0 ) { + System.out.println("No Pbuffer support!"); + System.exit(-1); + } + System.out.println("Pbuffer support detected. Initializing...\n"); + + switch ( renderMode ) { + case 1: + System.out.print("Creating pbuffer with unique context..."); + texRenderer = new UniqueRenderer(TEXTURE_SIZE, TEXTURE_SIZE, texID); + break; + case 2: + System.out.print("Creating render-to-texture pbuffer with unique context..."); + texRenderer = new UniqueRendererRTT(TEXTURE_SIZE, TEXTURE_SIZE, texID); + break; + } + + System.out.println("OK"); + + quadPosition = new Vector2f(100f, 100f); + quadVelocity = new Vector2f(1.0f, 1.0f); + + texScaleX = TEXTURE_SIZE / (float)mode.getWidth(); + texScaleY = TEXTURE_SIZE / (float)mode.getHeight(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Executes the test + */ + public void execute() { + mainLoop(); + cleanup(); + } + + /** + * Runs the main loop of the "test" + */ + private void mainLoop() { + while ( !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) && !Display.isCloseRequested() ) { + if ( Display.isVisible() ) { + // check keyboard input + processKeyboard(); + + // do "game" logic, and render it + logic(); + + render(); + } else { + // no need to render/paint if nothing has changed (ie. window dragged over) + if ( Display.isDirty() ) + render(); + + + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + // Update window + Display.update(); + // Sync + Display.sync(100); + } + } + + /** + * Performs the logic + */ + private void logic() { + angle += angleRotation; + if ( angle > 360.0f ) + angle -= 360.0f; + + quadPosition.x += quadVelocity.x; + quadPosition.y += quadVelocity.y; + + // check colision with vertical border border + if ( quadPosition.x + QUAD_SIZE >= mode.getWidth() || quadPosition.x - QUAD_SIZE <= 0 ) + quadVelocity.x *= -1; + + // check collision with horizontal border + if ( quadPosition.y + QUAD_SIZE >= mode.getHeight() || quadPosition.y - QUAD_SIZE <= 0 ) + quadVelocity.y *= -1; + } + + private void render() { + // ----------------------------------------------------------- + // -------------------- Pbuffer rendering -------------------- + // ----------------------------------------------------------- + // Tell the pbuffer to get ready for rendering + texRenderer.enable(); + + // Clear the background + glClear(GL_COLOR_BUFFER_BIT); + + // Draw quad with gradient + glPushMatrix(); + { + glTranslatef(quadPosition.x * texScaleX, quadPosition.y * texScaleY, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glBegin(GL_QUADS); + { + glColor3f(1.0f, 0.0f, 0.0f); + glVertex2i(-QUAD_SIZE, -QUAD_SIZE); + glVertex2i(QUAD_SIZE, -QUAD_SIZE); + glColor3f(0.0f, 0.0f, 1.0f); + glVertex2i(QUAD_SIZE, QUAD_SIZE); + glVertex2i(-QUAD_SIZE, QUAD_SIZE); + } + glEnd(); + } + glPopMatrix(); + + // Refresh the texture + texRenderer.updateTexture(); + + // ----------------------------------------------------------- + // -------------------- Display rendering -------------------- + // ----------------------------------------------------------- + try { + Display.makeCurrent(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + glClear(GL_COLOR_BUFFER_BIT); + + // draw white quad + glPushMatrix(); + { + glTranslatef(quadPosition.x, quadPosition.y, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + glColor3f(1.0f, 1.0f, 1.0f); + glBegin(GL_QUADS); + { + glTexCoord2f(0f, 0f); + glVertex2i(-QUAD_SIZE, -QUAD_SIZE); + glTexCoord2f(1f, 0f); + glVertex2i(QUAD_SIZE, -QUAD_SIZE); + glTexCoord2f(1f, 1f); + glVertex2i(QUAD_SIZE, QUAD_SIZE); + glTexCoord2f(0f, 1f); + glVertex2i(-QUAD_SIZE, QUAD_SIZE); + } + glEnd(); + } + glPopMatrix(); + } + + /** + * Processes keyboard input + */ + private void processKeyboard() { + Keyboard.poll(); + + //check for fullscreen key + if ( Keyboard.isKeyDown(Keyboard.KEY_F) ) { + try { + Display.setDisplayMode(mode); + Display.setFullscreen(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //check for window key + if ( Keyboard.isKeyDown(Keyboard.KEY_W) ) { + try { + Display.setFullscreen(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //check for speed changes + if ( Keyboard.isKeyDown(Keyboard.KEY_UP) ) + quadVelocity.y += 0.1f; + if ( Keyboard.isKeyDown(Keyboard.KEY_DOWN) ) + quadVelocity.y -= 0.1f; + if ( Keyboard.isKeyDown(Keyboard.KEY_RIGHT) ) + quadVelocity.x += 0.1f; + if ( Keyboard.isKeyDown(Keyboard.KEY_LEFT) ) + quadVelocity.x -= 0.1f; + + if ( Keyboard.isKeyDown(Keyboard.KEY_ADD) ) + angleRotation += 0.1f; + if ( Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT) ) + angleRotation -= 0.1f; + + //throttle + if ( quadVelocity.x < -MAX_SPEED ) + quadVelocity.x = -MAX_SPEED; + if ( quadVelocity.x > MAX_SPEED ) + quadVelocity.x = MAX_SPEED; + if ( quadVelocity.y < -MAX_SPEED ) + quadVelocity.y = -MAX_SPEED; + if ( quadVelocity.y > MAX_SPEED ) + quadVelocity.y = MAX_SPEED; + + if ( angleRotation < 0.0f ) + angleRotation = 0.0f; + if ( angleRotation > MAX_SPEED ) + angleRotation = MAX_SPEED; + } + + /** + * Cleans up the test + */ + private void cleanup() { + // Destroy texture + IntBuffer buffer = BufferUtils.createIntBuffer(1); + buffer.put(0, texID); + glDeleteTextures(buffer); + + texRenderer.destroy(); + Display.destroy(); + } + + /** + * Retrieves a displaymode, if one such is available + * + * @param width Required width + * @param height Required height + * @param bpp Minimum required bits per pixel + * + * @return + */ + private DisplayMode findDisplayMode(int width, int height, int bpp) throws LWJGLException { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getBitsPerPixel() >= bpp ) + return mode; + } + return null; + } + + static void initGLState(int width, int height, float color) { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, width, 0, height); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, width, height); + + //set clear color + glClearColor(color, color, color, 0.0f); + } + + /** + * Initializes OGL + */ + private void glInit() { + // Sync frame (only works on windows) + Display.setVSyncEnabled(true); + + // Create shared texture + IntBuffer buffer = BufferUtils.createIntBuffer(1); + glGenTextures(buffer); + texID = buffer.get(0); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texID); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + initGLState(mode.getWidth(), mode.getHeight(), 0.0f); + } + + /** + * Test entry point + */ + public static void main(String[] args) { + if ( args.length != 1 ) + kill("Invalid arguments length."); + + int mode = -1; + try { + mode = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + kill("Invalid mode."); + } + + if ( mode != 1 && mode != 2 ) + kill("Invalid mode."); + + System.out.println("Change between fullscreen and windowed mode, by pressing F and W respectively"); + System.out.println("Move quad using arrowkeys, and change rotation using +/-"); + + PbufferTest test = new PbufferTest(mode); + + test.execute(); + System.exit(0); + } + + private static void kill(final String msg) { + System.out.println(msg); + System.out.println("-------"); + System.out.println("Usage: java org.lwjgl.test.opengl.pbuffer.PbufferTest <mode>"); + System.out.println("\n<mode>."); + System.out.println("\t1: no render-to-texture"); + System.out.println("\t2: with render-to-texture"); + + System.exit(-1); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/TextureRenderer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/TextureRenderer.java new file mode 100644 index 0000000..a8a2f77 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/TextureRenderer.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.pbuffers; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Pbuffer; + +/** + * Implementations of this class should create a pbuffer and implement "render-to-texture" accordingly. + */ +abstract class TextureRenderer { + + protected final int width; + protected final int height; + private final int texID; + + protected Pbuffer pbuffer; + + protected TextureRenderer(final int width, final int height, final int texID) { + this.width = width; + this.height = height; + this.texID = texID; + + try { + pbuffer = init(width, height, texID); + } catch (LWJGLException e) { + e.printStackTrace(); + System.exit(-1); + } + } + + /** + * Create and initialize the pbuffer. + * + * @param width + * @param height + * @param texID + * @return + * @throws LWJGLException + */ + protected abstract Pbuffer init(int width, int height, int texID) throws LWJGLException; + + /** + * This will be called before rendering to the renderer. Implementations should setup the pbuffer context as necessary. + */ + void enable() { + try { + if ( pbuffer.isBufferLost() ) { + System.out.println("Buffer contents lost - recreating the pbuffer"); + pbuffer.destroy(); + pbuffer = init(width, height, texID); + } + + pbuffer.makeCurrent(); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + } + + /** + * Implementations should update the texture contents here. + */ + abstract void updateTexture(); + + /** + * Clean-up resources held by the renderer + */ + final void destroy() { + pbuffer.destroy(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRenderer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRenderer.java new file mode 100644 index 0000000..4a4d8cd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRenderer.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.pbuffers; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.Pbuffer; +import org.lwjgl.opengl.PixelFormat; + +import static org.lwjgl.opengl.GL11.*; + +final class UniqueRenderer extends TextureRenderer { + + UniqueRenderer(final int width, final int height, final int texID) { + super(width, height, texID); + } + + protected Pbuffer init(final int width, final int height, final int texID) { + Pbuffer pbuffer = null; + + try { + pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), null, null); + + // Initialise state of the pbuffer context. + pbuffer.makeCurrent(); + + PbufferTest.initGLState(width, height, 0.5f); + glBindTexture(GL_TEXTURE_2D, texID); + + Display.makeCurrent(); + } catch (LWJGLException e) { + e.printStackTrace(); + System.exit(-1); + } + + return pbuffer; + } + + public void updateTexture() { + // Copy the pbuffer contents to the texture. + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRendererRTT.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRendererRTT.java new file mode 100644 index 0000000..0bdee34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/pbuffers/UniqueRendererRTT.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.pbuffers; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.Pbuffer; +import org.lwjgl.opengl.PixelFormat; +import org.lwjgl.opengl.RenderTexture; + +import static org.lwjgl.opengl.GL11.*; + +final class UniqueRendererRTT extends TextureRenderer { + + UniqueRendererRTT(final int width, final int height, final int texID) { + super(width, height, texID); + } + + // Initialize texture renderer + protected Pbuffer init(final int width, final int height, final int texID) { + Pbuffer pbuffer = null; + + try { + final RenderTexture rt = new RenderTexture(true, false, false, false, RenderTexture.RENDER_TEXTURE_2D, 0); + pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), rt, null); + + // Initialise state of the pbuffer context. + pbuffer.makeCurrent(); + + PbufferTest.initGLState(width, height, 0.5f); + glBindTexture(GL_TEXTURE_2D, texID); + + Display.makeCurrent(); + } catch (LWJGLException e) { + e.printStackTrace(); + System.exit(-1); + } + + return pbuffer; + } + + void enable() { + super.enable(); + + // Put the renderer contents to the texture + pbuffer.releaseTexImage(Pbuffer.FRONT_LEFT_BUFFER); + } + + void updateTexture() { + // Bind the texture after rendering. + pbuffer.bindTexImage(Pbuffer.FRONT_LEFT_BUFFER); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/Shader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/Shader.java new file mode 100644 index 0000000..9251493 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/Shader.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 8:41:42 pm + */ +package org.lwjgl.test.opengl.shaders; + +import org.lwjgl.BufferUtils; + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +import static org.lwjgl.opengl.ARBProgram.*; +import static org.lwjgl.opengl.ARBShaderObjects.*; +import static org.lwjgl.opengl.GL11.*; + +abstract class Shader { + + protected static ByteBuffer fileBuffer = BufferUtils.createByteBuffer(1024 * 10); + + protected Shader() { + } + + abstract void render(); + + abstract void cleanup(); + + protected static String getShaderText(String file) { + String shader = null; + + try { + InputStream source = ShadersTest.class.getResourceAsStream(file); + if ( source == null ) // dev-mode + source = new FileInputStream("src/java/org/lwjgl/test/opengl/shaders/" + file); + + BufferedInputStream stream = new BufferedInputStream(source); + + byte character; + while ( (character = (byte)stream.read()) != -1 ) + fileBuffer.put(character); + + stream.close(); + + fileBuffer.flip(); + + byte[] array = new byte[fileBuffer.remaining()]; + fileBuffer.get(array); + shader = new String(array); + + fileBuffer.clear(); + } catch (IOException e) { + ShadersTest.kill("Failed to read the shader source file: " + file, e); + } + + return shader; + } + + protected static void checkProgramError(String programFile, String programSource) { + if ( glGetError() == GL_INVALID_OPERATION ) { + final int errorPos = glGetInteger(GL_PROGRAM_ERROR_POSITION_ARB); + int lineStart = 0; + int lineEnd = -1; + for ( int i = 0; i < programSource.length(); i++ ) { + if ( programSource.charAt(i) == '\n' ) { + if ( i <= errorPos ) { + lineStart = i + 1; + } else { + lineEnd = i; + break; + } + } + } + + if ( lineEnd == -1 ) + lineEnd = programSource.length(); + + ShadersTest.kill("Low-level program error in file: " + programFile + + "\n\tError line: " + programSource.substring(lineStart, lineEnd) + + "\n\tError message: " + glGetString(GL_PROGRAM_ERROR_STRING_ARB)); + } + } + + protected static int getUniformLocation(int ID, String name) { + final int location = glGetUniformLocationARB(ID, name); + + if ( location == -1 ) + throw new IllegalArgumentException("The uniform \"" + name + "\" does not exist in the Shader Program."); + + return location; + } + + protected static void printShaderObjectInfoLog(String file, int ID) { + final int logLength = glGetObjectParameteriARB(ID, GL_OBJECT_INFO_LOG_LENGTH_ARB); + if ( logLength <= 1 ) + return; + + System.out.println("\nInfo Log of Shader Object: " + file); + System.out.println("--------------------------"); + System.out.println(glGetInfoLogARB(ID, logLength)); + + } + + protected static void printShaderProgramInfoLog(int ID) { + final int logLength = glGetObjectParameteriARB(ID, GL_OBJECT_INFO_LOG_LENGTH_ARB); + if ( logLength <= 1 ) + return; + + System.out.println("\nShader Program Info Log: "); + System.out.println("--------------------------"); + System.out.println(glGetInfoLogARB(ID, logLength)); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java new file mode 100644 index 0000000..dea6999 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFP.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 9:55:38 pm + */ + +package org.lwjgl.test.opengl.shaders; + +import org.lwjgl.opengl.ARBFragmentProgram; +import org.lwjgl.opengl.ARBVertexProgram; + +import static org.lwjgl.opengl.ARBProgram.*; +import static org.lwjgl.opengl.GL11.*; + +final class ShaderFP extends Shader { + + final String vpFile; + final String vpSource; + + final int vpID; + + final String fpFile; + final String fpSource; + + final int fpID; + + ShaderFP(final String vpShaderFile, final String fpShaderFile) { + // Initialize the vertex program. + vpFile = vpShaderFile; + vpSource = getShaderText(vpShaderFile); + + vpID = glGenProgramsARB(); + + glBindProgramARB(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB, vpID); + glProgramStringARB(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, vpSource); + + checkProgramError(vpFile, vpSource); + + // Initialize the fragment program. + fpFile = fpShaderFile; + fpSource = getShaderText(fpShaderFile); + + fpID = glGenProgramsARB(); + + glBindProgramARB(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB, fpID); + glProgramStringARB(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, fpSource); + + checkProgramError(fpFile, fpSource); + } + + void render() { + glEnable(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB); + glBindProgramARB(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB, vpID); + + glEnable(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB); + glBindProgramARB(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB, fpID); + + glProgramLocalParameter4fARB(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB, 0, + ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f, 0.0f, 0.0f); + + glProgramLocalParameter4fARB(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB, 0, + ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f, + -ShadersTest.getDisplayWidth() * 0.5f, -ShadersTest.getDisplayHeight() * 0.5f); + + ShadersTest.renderObject(); + + glDisable(ARBVertexProgram.GL_VERTEX_PROGRAM_ARB); + glDisable(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB); + } + + void cleanup() { + glDeleteProgramsARB(vpID); + glDeleteProgramsARB(fpID); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java new file mode 100644 index 0000000..f094675 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderFSH.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 9:55:38 pm + */ + +package org.lwjgl.test.opengl.shaders; + +import static org.lwjgl.opengl.ARBFragmentShader.*; +import static org.lwjgl.opengl.ARBShaderObjects.*; +import static org.lwjgl.opengl.ARBVertexShader.*; +import static org.lwjgl.opengl.GL11.*; + +final class ShaderFSH extends Shader { + + final String vshFile; + final String vshSource; + + final int vshID; + + final String fshFile; + final String fshSource; + + final int fshID; + + final int programID; + + final int uniformLocation; + + ShaderFSH(final String vshFile, final String fshFile) { + // Initialize the vertex shader. + this.vshFile = vshFile; + vshSource = getShaderText(vshFile); + + vshID = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + glShaderSourceARB(vshID, vshSource); + glCompileShaderARB(vshID); + + printShaderObjectInfoLog(this.vshFile, vshID); + + if ( glGetObjectParameteriARB(vshID, GL_OBJECT_COMPILE_STATUS_ARB) == GL_FALSE ) + ShadersTest.kill("A compilation error occured in a vertex shader."); + + // Initialize the fragment shader. + this.fshFile = fshFile; + fshSource = getShaderText(fshFile); + + fshID = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + glShaderSourceARB(fshID, fshSource); + glCompileShaderARB(fshID); + + printShaderObjectInfoLog(this.fshFile, fshID); + + if ( glGetObjectParameteriARB(fshID, GL_OBJECT_COMPILE_STATUS_ARB) == GL_FALSE ) + ShadersTest.kill("A compilation error occured in a fragment shader."); + + // Initialize the shader program. + programID = glCreateProgramObjectARB(); + + glAttachObjectARB(programID, vshID); + glAttachObjectARB(programID, fshID); + + glLinkProgramARB(programID); + + printShaderProgramInfoLog(programID); + + if ( glGetObjectParameteriARB(programID, GL_OBJECT_LINK_STATUS_ARB) == GL_FALSE ) + ShadersTest.kill("A linking error occured in a shader program."); + + uniformLocation = getUniformLocation(programID, "UNIFORMS"); + } + + void render() { + glUseProgramObjectARB(programID); + + glUniform4fARB(uniformLocation, + ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f, + -ShadersTest.getDisplayWidth() * 0.5f, -ShadersTest.getDisplayHeight() * 0.5f); + + ShadersTest.renderObject(); + + glUseProgramObjectARB(0); + } + + void cleanup() { + glDetachObjectARB(programID, vshID); + glDetachObjectARB(programID, fshID); + + glDeleteObjectARB(vshID); + glDeleteObjectARB(fshID); + + glDeleteObjectARB(programID); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java new file mode 100644 index 0000000..41ab082 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderUNI.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2009-12-04 + */ + +package org.lwjgl.test.opengl.shaders; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.*; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static org.lwjgl.opengl.ARBUniformBufferObject.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; + +final class ShaderUNI extends Shader { + + final String file; + final String source; + + final int shaderID; + final int programID; + + final int bufferID; + final FloatBuffer buffer; + + final int uniformA_index; + final int uniformA_offset; + + final int uniformB_index; + final int uniformB_offset; + + ShaderUNI(final String shaderFile) { + file = shaderFile; + source = getShaderText(shaderFile); + + shaderID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(shaderID, source); + glCompileShader(shaderID); + + printShaderObjectInfoLog(file, shaderID); + + if ( glGetShaderi(shaderID, GL_COMPILE_STATUS) == GL_FALSE ) + ShadersTest.kill("A compilation error occured in a vertex shader."); + + programID = glCreateProgram(); + + glAttachShader(programID, shaderID); + glLinkProgram(programID); + + printShaderProgramInfoLog(programID); + + if ( glGetProgrami(programID, GL_LINK_STATUS) == GL_FALSE ) + ShadersTest.kill("A linking error occured in a shader program."); + + final String[] uniformNames = { "uniformA", "uniformB" }; + + // Get uniform block index and data size + final int blockIndex = glGetUniformBlockIndex(programID, "test"); + final int blockSize = glGetActiveUniformBlocki(programID, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE); + + System.out.println("blockSize = " + blockSize); + + // Create uniform buffer object and allocate a ByteBuffer + bufferID = glGenBuffers(); + glBindBuffer(GL_UNIFORM_BUFFER, bufferID); + glBufferData(GL_UNIFORM_BUFFER, blockSize, GL_DYNAMIC_DRAW); + buffer = BufferUtils.createFloatBuffer(blockSize); + + // Attach UBO and associate uniform block to binding point 0 + glBindBufferBase(GL_UNIFORM_BUFFER, 0, bufferID); + glUniformBlockBinding(programID, blockIndex, 0); + + // Get uniform information + IntBuffer indexes = BufferUtils.createIntBuffer(uniformNames.length); + IntBuffer params = BufferUtils.createIntBuffer(uniformNames.length); + + glGetUniformIndices(programID, uniformNames, indexes); + uniformA_index = indexes.get(0); + uniformB_index = indexes.get(1); + + glGetActiveUniforms(programID, indexes, GL_UNIFORM_OFFSET, params); + uniformA_offset = params.get(0); + uniformB_offset = params.get(1); + + System.out.println("\nuniformA index = " + uniformA_index); + System.out.println("uniformB index = " + uniformB_index); + + System.out.println("\nuniformA offset = " + uniformA_offset + " - should be 0 for std140"); + System.out.println("uniformB offset = " + uniformB_offset + " - should be 16 for std140"); + + Util.checkGLError(); + } + + void render() { + glUseProgram(programID); + + //* -- std140 layout + // Uniform A + buffer.put(0, ShadersTest.getSin()).put(1, ShadersTest.getSpecularity() * 8.0f); + // Uniform B - str140 alignment at 16 bytes + buffer.put(4, 0.0f).put(5, 0.7f).put(6, 0.0f); + + glBindBuffer(GL_UNIFORM_BUFFER, bufferID); + glBufferData(GL_UNIFORM_BUFFER, buffer, GL_DYNAMIC_DRAW); + //*/ + + /* -- non-std140 layout + // Uniform A + buffer.put(ShadersTest.getSin()).put(ShadersTest.getSpecularity() * 8.0f); + buffer.flip(); + glBufferSubData(GL_UNIFORM_BUFFER, uniformA_offset, buffer); + // Uniform B + buffer.clear(); + buffer.put(0.0f).put(0.7f).put(0.0f); + buffer.flip(); + glBufferSubData(GL_UNIFORM_BUFFER, uniformB_offset, buffer); + //*/ + + ShadersTest.renderObject(); + + glUseProgram(0); + } + + void cleanup() { + glDeleteBuffers(bufferID); + + glDetachShader(programID, shaderID); + + glDeleteShader(shaderID); + glDeleteProgram(programID); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java new file mode 100644 index 0000000..b8d8678 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVP.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 9:55:38 pm + */ + +package org.lwjgl.test.opengl.shaders; + +import static org.lwjgl.opengl.ARBVertexProgram.*; +import static org.lwjgl.opengl.GL11.*; + +final class ShaderVP extends Shader { + + final String file; + final String source; + + final int ID; + + ShaderVP(final String shaderFile) { + file = shaderFile; + source = getShaderText(shaderFile); + + ID = glGenProgramsARB(); + + glBindProgramARB(GL_VERTEX_PROGRAM_ARB, ID); + glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, source); + + checkProgramError(file, source); + } + + void render() { + glEnable(GL_VERTEX_PROGRAM_ARB); + glBindProgramARB(GL_VERTEX_PROGRAM_ARB, ID); + + glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 0, + ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f, 0.0f, 0.0f); + + ShadersTest.renderObject(); + + glDisable(GL_VERTEX_PROGRAM_ARB); + } + + void cleanup() { + glDeleteProgramsARB(ID); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java new file mode 100644 index 0000000..c8d0136 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShaderVSH.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 9:55:38 pm + */ + +package org.lwjgl.test.opengl.shaders; + +import static org.lwjgl.opengl.ARBShaderObjects.*; +import static org.lwjgl.opengl.ARBVertexShader.*; +import static org.lwjgl.opengl.GL11.*; + +final class ShaderVSH extends Shader { + + final String file; + final String source; + + final int shaderID; + final int programID; + + final int uniformLocation; + + ShaderVSH(final String shaderFile) { + file = shaderFile; + source = getShaderText(shaderFile); + + shaderID = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + glShaderSourceARB(shaderID, source); + glCompileShaderARB(shaderID); + + printShaderObjectInfoLog(file, shaderID); + + if ( glGetObjectParameteriARB(shaderID, GL_OBJECT_COMPILE_STATUS_ARB) == GL_FALSE ) + ShadersTest.kill("A compilation error occured in a vertex shader."); + + programID = glCreateProgramObjectARB(); + + glAttachObjectARB(programID, shaderID); + glLinkProgramARB(programID); + + printShaderProgramInfoLog(programID); + + if ( glGetObjectParameteriARB(programID, GL_OBJECT_LINK_STATUS_ARB) == GL_FALSE ) + ShadersTest.kill("A linking error occured in a shader program."); + + uniformLocation = getUniformLocation(programID, "UNIFORMS"); + } + + void render() { + glUseProgramObjectARB(programID); + + glUniform2fARB(uniformLocation, ShadersTest.getSin(), ShadersTest.getSpecularity() * 8.0f); + + ShadersTest.renderObject(); + + glUseProgramObjectARB(0); + } + + void cleanup() { + glDetachObjectARB(programID, shaderID); + + glDeleteObjectARB(shaderID); + glDeleteObjectARB(programID); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java new file mode 100644 index 0000000..dec42ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/ShadersTest.java @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * Created by LWJGL. + * User: spasi + * Date: 2004-03-30 + * Time: 8:41:42 pm + */ + +package org.lwjgl.test.opengl.shaders; + +import java.nio.FloatBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.*; +import org.lwjgl.util.glu.Sphere; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +public final class ShadersTest { + + private static DisplayMode displayMode; + + private static boolean run = true; + + private static final FloatBuffer vectorBuffer = BufferUtils.createFloatBuffer(4); + + private static Sphere sphere; + + private static Shader shader; + + private static float frameTime; + + private static float angle; + private static float sin; + private static int specularity = 4; + + private ShadersTest() { + } + + public static void main(String[] args) { + initialize(args); + + long frameStart; + long lastFrameTime = 0; + + while ( run ) { + if (!Display.isVisible() ) + Thread.yield(); + else { + // This is the current frame time. + frameStart = Sys.getTime(); + + // How many seconds passed since last frame. + frameTime = (float)((frameStart - lastFrameTime) / (double)Sys.getTimerResolution()); + + lastFrameTime = frameStart; + + //angle += frameTime * 90.0f; + angle += 0.1f; + sin = (float)Math.sin(Math.toRadians(angle)); + + handleIO(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if ( shader != null ) + shader.render(); + else + renderObject(); + + // Restore camera position. + glPopMatrix(); + glPushMatrix(); + } + + Display.update(); + + if ( Display.isCloseRequested() ) + break; + } + + cleanup(); + System.exit(0); + } + + private static void initialize(String[] args) { + if ( args.length != 1 ) + argsError(); + + try { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + + DisplayMode displayMode; + + displayMode = chooseMode(modes, 1024, 768); + if ( displayMode == null ) + displayMode = chooseMode(modes, 800, 600); + if ( displayMode == null ) + displayMode = chooseMode(modes, 640, 480); + if ( displayMode == null ) + kill("Failed to set an appropriate display mode."); + + System.out.println("Setting display mode to: " + displayMode); + Display.setDisplayMode(displayMode); + Display.create(new PixelFormat(8, 24, 0)); + ShadersTest.displayMode = displayMode; + } catch (LWJGLException e) { + kill(e.getMessage()); + } + + final ContextCapabilities caps = GLContext.getCapabilities(); + + if ( "NONE".equalsIgnoreCase(args[0]) ) { + shader = null; + } else if ( "VP".equalsIgnoreCase(args[0]) ) { + if ( !caps.GL_ARB_vertex_program ) + kill("The ARB_vertex_program extension is not supported."); + + shader = new ShaderVP("shaderVP.vp"); + } else if ( "FP".equalsIgnoreCase(args[0]) ) { + if ( !caps.GL_ARB_vertex_program ) + kill("The ARB_vertex_program extension is not supported."); + if ( !caps.GL_ARB_fragment_program ) + kill("The ARB_fragment_program extension is not supported."); + + shader = new ShaderFP("shaderFP.vp", "shaderFP.fp"); + } else if ( "VSH".equalsIgnoreCase(args[0]) ) { + if ( !caps.GL_ARB_vertex_shader ) + kill("The ARB_vertex_shader extension is not supported."); + + shader = new ShaderVSH("shaderVSH.vsh"); + } else if ( "FSH".equalsIgnoreCase(args[0]) ) { + if ( !caps.GL_ARB_vertex_shader ) + kill("The ARB_vertex_shader extension is not supported."); + if ( !caps.GL_ARB_fragment_shader ) + kill("The ARB_fragment_shader extension is not supported."); + + shader = new ShaderFSH("shaderFSH.vsh", "shaderFSH.fsh"); + } else if ("UNI".equalsIgnoreCase(args[0]) ) { + if ( !(caps.OpenGL31 || caps.GL_ARB_uniform_buffer_object) ) + kill("Neither OpenGL version 3.1 nor ARB_uniform_buffer_object are supported."); + + shader = new ShaderUNI("shaderUNI.vsh"); + } else { + argsError(); + } + + glViewport(0, 0, displayMode.getWidth(), displayMode.getHeight()); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, displayMode.getWidth() / (float)displayMode.getHeight(), 1.0f, 10.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // Setup camera position. + glTranslatef(0.0f, 0.0f, -4.0f); + glRotatef(15.0f, 1.0f, 0.0f, 0.0f); + glPushMatrix(); + + glClearDepth(1.0f); + glDepthFunc(GL_LEQUAL); + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + glFrontFace(GL_CCW); + glPolygonMode(GL_FRONT, GL_FILL); + + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + glAlphaFunc(GL_NOTEQUAL, 0.0f); + glEnable(GL_ALPHA_TEST); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + // Setup lighting for when we have fixed function fragment rendering. + glShadeModel(GL_SMOOTH); + + if ( shader == null ) { + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + } + + vectorBuffer.clear(); + vectorBuffer.put(1.0f).put(1.0f).put(1.0f).put(1.0f); + vectorBuffer.clear(); + glLight(GL_LIGHT0, GL_DIFFUSE, vectorBuffer); + + vectorBuffer.put(1.0f).put(1.0f).put(1.0f).put(1.0f); + vectorBuffer.clear(); + glLight(GL_LIGHT0, GL_AMBIENT, vectorBuffer); + + vectorBuffer.put(1.0f).put(1.0f).put(0.5f).put(1.0f); + vectorBuffer.clear(); + glLight(GL_LIGHT0, GL_SPECULAR, vectorBuffer); + + vectorBuffer.put(-1.0f / 3.0f).put(1.0f / 3.0f).put(1.0f / 3.0f).put(0.0f); // Infinite + vectorBuffer.clear(); + glLight(GL_LIGHT0, GL_POSITION, vectorBuffer); + + vectorBuffer.put(0.2f).put(0.2f).put(0.2f).put(1.0f); + vectorBuffer.clear(); + glLightModel(GL_LIGHT_MODEL_AMBIENT, vectorBuffer); + + sphere = new Sphere(); + } + + private static void handleIO() { + if ( Keyboard.getNumKeyboardEvents() != 0 ) { + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_EQUALS: + if ( specularity < 8 ) + specularity++; + break; + case Keyboard.KEY_MINUS: + if ( specularity > 1 ) + specularity--; + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + + while ( Mouse.next() ) ; + } + + static int getDisplayWidth() { + return displayMode.getWidth(); + } + + static int getDisplayHeight() { + return displayMode.getHeight(); + } + + static float getSin() { + return sin; + } + + static int getSpecularity() { + return specularity; + } + + static void renderObject() { + glColor3b((byte)255, (byte)255, (byte)255); + sphere.draw(1.0f, 32, 32); + } + + private static DisplayMode chooseMode(DisplayMode[] modes, int width, int height) { + DisplayMode bestMode = null; + + for ( DisplayMode mode : modes ) { + if ( mode.getWidth() == width && mode.getHeight() == height && mode.getFrequency() <= 85 ) { + if ( bestMode == null || (mode.getBitsPerPixel() >= bestMode.getBitsPerPixel() && mode.getFrequency() > bestMode.getFrequency()) ) + bestMode = mode; + } + } + + return bestMode; + } + + private static void cleanup() { + // This is not necessary, just showing how to properly delete a program/shader. + if ( shader != null ) + shader.cleanup(); + + if ( Display.isCreated() ) + Display.destroy(); + } + + private static void argsError() { + System.out.println("\nInvalid program arguments."); + System.out.println("\nUsage: ShadersTest <shaderType>, where <shaderType> argument can be one of the following:\n"); + System.out.println("none\t- Use fixed function rendering."); + System.out.println("vp\t- Use ARB_vertex_program (low-level) only."); + System.out.println("vsh\t- Use ARB_vertex_shader (GLSL) only."); + System.out.println("fp\t- Use ARB_vertex_program + ARB_fragment_program (low-level)."); + System.out.println("fsh\t- Use ARB_vertex_shader + ARB_fragment_shader (GLSL)."); + System.out.println("uni\t- Use ARB_uniform_buffer_object to update shader uniforms (GLSL)."); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason) { + System.out.println("The ShaderTest program was terminated because an error occured.\n"); + System.out.println("Reason: " + (reason == null ? "Unknown" : reason)); + + cleanup(); + System.exit(-1); + } + + static void kill(String reason, Throwable t) { + System.out.println("The ShaderTest program was terminated because an exception occured.\n"); + System.out.println("Reason: " + reason == null ? "Unknown" : reason); + + System.out.println("Exception message: " + t.getMessage()); + + cleanup(); + System.exit(-1); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.fp b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.fp new file mode 100644 index 0000000..bf11274 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.fp @@ -0,0 +1,40 @@ +!!ARBfp1.0 +OPTION ARB_precision_hint_fastest; + +ATTRIB winPos = fragment.position; +ATTRIB iDots = fragment.texcoord[0]; + +PARAM ambience = state.lightmodel.ambient; + +PARAM specularColor = state.light[0].specular; + +PARAM UNIFORMS = program.local[0]; + +TEMP temp; + +OUTPUT oColor = result.color; + +# Offset window-space fragment position. +ADD temp.xyz, winPos, UNIFORMS.zwxx; +# Normalize position. +DP3 temp.w, temp, temp; +RSQ temp.w, temp.w; +MUL temp.xy, temp, temp.w; + +# Multiply with current sin. +MUL temp.xy, temp, UNIFORMS.x; +# {-1..1} => {0..1} +MAD temp.xy, temp, 0.5, 0.5; +# Intensify colors. +MUL temp.xy, temp, 2.0; +MOV temp.z, 1.0; + +# Accumulate color contributions. +MAD temp.xyz, iDots.x, temp, ambience; +# Calculate <specular dot product>^<specular exponent> +POW temp.w, iDots.y, UNIFORMS.y; +MAD oColor.xyz, temp.w, specularColor, temp; + +MOV oColor.w, 1.0; + +END \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.vp b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.vp new file mode 100644 index 0000000..8b14a96 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFP.vp @@ -0,0 +1,37 @@ +!!ARBvp1.0 + +ATTRIB iPos = vertex.position; +ATTRIB iNormal = vertex.normal; + +PARAM mvp[4] = { state.matrix.mvp }; +PARAM mvIT[4] = { state.matrix.modelview.invtrans }; + +PARAM lightDir = state.light[0].position; +PARAM halfDir = state.light[0].half; + +PARAM UNIFORMS = program.local[0]; + +TEMP normal, dots; + +OUTPUT oPos = result.position; +OUTPUT oDots = result.texcoord[0]; + +# Transform the vertex to clip coordinates. +DP4 oPos.x, mvp[0], iPos; +DP4 oPos.y, mvp[1], iPos; +DP4 oPos.z, mvp[2], iPos; +DP4 oPos.w, mvp[3], iPos; + +# Transform the normal to eye coordinates. +DP3 normal.x, mvIT[0], iNormal; +DP3 normal.y, mvIT[1], iNormal; +DP3 normal.z, mvIT[2], iNormal; + +# Compute diffuse and specular dot products and clamp them. +DP3 dots.x, normal, lightDir; +MAX oDots.x, dots.x, 0.0; + +DP3 dots.y, normal, halfDir; +MAX oDots.y, dots.y, 0.0; + +END \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.fsh b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.fsh new file mode 100644 index 0000000..99567c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.fsh @@ -0,0 +1,21 @@ +uniform vec4 UNIFORMS; + +varying vec2 dots; + +void main(void) { + // Offset window-space fragment position. + vec3 color2D = vec3(gl_FragCoord + UNIFORMS.zwxx); + + // Normalize position. + // Multiply with current sin. + color2D.xy = normalize(color2D).xy * UNIFORMS.x; + // {-1..1} => {0..1} & Intensify colors. + color2D.xy = (vec2(color2D) * 0.5 + 0.5) * 2.0; + color2D.z = 1.0; + + // Accumulate color contributions. + // Hardcoded ambience and specular color, due to buggy drivers. + color2D = dots.x * color2D + vec3(0.2, 0.2, 0.2); + gl_FragColor.rgb = pow(dots.y, UNIFORMS.y) * vec3(1.0, 1.0, 0.5) + color2D; + gl_FragColor.a = 1.0; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.vsh b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.vsh new file mode 100644 index 0000000..4fc5db3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderFSH.vsh @@ -0,0 +1,13 @@ +uniform vec4 UNIFORMS; + +varying vec2 dots; + +void main(void) { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + + vec3 normal = gl_NormalMatrix * gl_Normal; + + // Pass the dot products to the fragment shader. + dots.x = max(dot(normal, vec3(gl_LightSource[0].position)), 0.0); + dots.y = max(dot(normal, vec3(gl_LightSource[0].halfVector)), 0.0); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh new file mode 100644 index 0000000..d1fbd74 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderUNI.vsh @@ -0,0 +1,28 @@ +#version 140 +#extension GL_ARB_uniform_buffer_object : enable + +layout(std140) uniform test { + vec2 uniformA; + vec3 uniformB; +}; + +void main(void) { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + + vec3 normal = gl_NormalMatrix * gl_Normal; + + float diffuseDot = max(dot(normal, vec3(gl_LightSource[0].position)), 0.0); + float specularDot = max(dot(normal, vec3(gl_LightSource[0].halfVector)), 0.0); + specularDot = pow(specularDot, uniformA.y); + + // Normalize position, to get a {-1..1} value for each vertex. + // Multiply with current sin. + vec3 color3D = normalize(vec3(gl_Vertex)) * uniformA.x; + // {-1..1} => {0..1} & Intensify colors. + color3D = (color3D * 0.5 + 0.5) * 2.0; + + // Accumulate color contributions. + color3D = diffuseDot * (uniformB + color3D) + vec3(gl_LightModel.ambient); + gl_FrontColor.rgb = specularDot * vec3(gl_LightSource[0].specular) + color3D; + gl_FrontColor.a = 1.0; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVP.vp b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVP.vp new file mode 100644 index 0000000..a410222 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVP.vp @@ -0,0 +1,59 @@ +!!ARBvp1.0 + +ATTRIB iPos = vertex.position; +ATTRIB iNormal = vertex.normal; + +PARAM mvp[4] = { state.matrix.mvp }; +PARAM mvIT[4] = { state.matrix.modelview.invtrans }; + +PARAM ambience = state.lightmodel.ambient; + +PARAM lightDir = state.light[0].position; +PARAM halfDir = state.light[0].half; +PARAM diffuseColor = state.light[0].diffuse; +PARAM specularColor = state.light[0].specular; + +PARAM UNIFORMS = program.local[0]; + +TEMP temp, temp2, normal, dots; + +OUTPUT oPos = result.position; +OUTPUT oColor = result.color; + +# Transform the vertex to clip coordinates. +DP4 oPos.x, mvp[0], iPos; +DP4 oPos.y, mvp[1], iPos; +DP4 oPos.z, mvp[2], iPos; +DP4 oPos.w, mvp[3], iPos; + +# Transform the normal to eye coordinates. +DP3 normal.x, mvIT[0], iNormal; +DP3 normal.y, mvIT[1], iNormal; +DP3 normal.z, mvIT[2], iNormal; + +# Compute diffuse and specular dot products and use LIT to compute +# lighting coefficients. +DP3 dots.x, normal, lightDir; +DP3 dots.y, normal, halfDir; +MOV dots.w, UNIFORMS.y; +LIT dots, dots; + +# Normalize position, to get a {-1..1} value for each vertex. +DP3 temp.w, iPos, iPos; +RSQ temp.w, temp.w; +MUL temp.xyz, iPos, temp.w; + +# Multiply with current sin. +MUL temp.xyz, temp, UNIFORMS.x; +# {-1..1} => {0..1} +MAD temp.xyz, temp, 0.5, 0.5; +# Intensify colors. +MUL temp.xyz, temp, 2.0; + +# Accumulate color contributions. +MAD temp.xyz, dots.y, temp, ambience; +MAD oColor.xyz, dots.z, specularColor, temp; +MOV oColor.w, 1.0; + + +END \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVSH.vsh b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVSH.vsh new file mode 100644 index 0000000..c34ae1b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/shaders/shaderVSH.vsh @@ -0,0 +1,22 @@ +uniform vec2 UNIFORMS; + +void main(void) { + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + + vec3 normal = gl_NormalMatrix * gl_Normal; + + float diffuseDot = max(dot(normal, vec3(gl_LightSource[0].position)), 0.0); + float specularDot = max(dot(normal, vec3(gl_LightSource[0].halfVector)), 0.0); + specularDot = pow(specularDot, UNIFORMS.y); + + // Normalize position, to get a {-1..1} value for each vertex. + // Multiply with current sin. + vec3 color3D = normalize(vec3(gl_Vertex)) * UNIFORMS.x; + // {-1..1} => {0..1} & Intensify colors. + color3D = (color3D * 0.5 + 0.5) * 2.0; + + // Accumulate color contributions. + color3D = diffuseDot * color3D + vec3(gl_LightModel.ambient); + gl_FrontColor.rgb = specularDot * vec3(gl_LightSource[0].specular) + color3D; + gl_FrontColor.a = 1.0; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout.java new file mode 100644 index 0000000..70c3ceb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout.java @@ -0,0 +1,752 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.sprites; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.*; + +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.util.Random; +import javax.imageio.ImageIO; + +import static org.lwjgl.opengl.EXTTransformFeedback.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * Sprite rendering demo. Three implementations are supported: + * a) CPU animation + BufferData VBO update. + * b) CPU animation + MapBufferRange VBO update. + * c) GPU animation using transform feedback with a vertex shader. + * + * @author Spasi + * @since 18/3/2011 + */ +public final class SpriteShootout { + + static final int SCREEN_WIDTH = 800; + static final int SCREEN_HEIGHT = 600; + + private static final int ANIMATION_TICKS = 60; + + private boolean run = true; + private boolean render = true; + private boolean colorMask = true; + private boolean animate = true; + private boolean smooth; + private boolean vsync; + + int ballSize = 42; + int ballCount = 100 * 1000; + + private SpriteRenderer renderer; + + // OpenGL stuff + private int texID; + private int texBigID; + private int texSmallID; + + long animateTime; + + private SpriteShootout() { + } + + public static void main(String[] args) { + try { + new SpriteShootout().start(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + private void start() throws LWJGLException { + try { + initGL(); + + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( caps.OpenGL30 || caps.GL_EXT_transform_feedback ) + renderer = new SpriteRendererTF(); + else if ( caps.GL_ARB_map_buffer_range ) + renderer = new SpriteRendererMapped(); + else + renderer = new SpriteRendererPlain(); + + updateBalls(ballCount); + run(); + } catch (Throwable t) { + t.printStackTrace(); + } finally { + destroy(); + } + } + + private void initGL() throws LWJGLException { + Display.setLocation((Display.getDisplayMode().getWidth() - SCREEN_WIDTH) / 2, + (Display.getDisplayMode().getHeight() - SCREEN_HEIGHT) / 2); + Display.setDisplayMode(new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT)); + Display.setTitle("Sprite Shootout"); + Display.create(); + //Display.create(new PixelFormat(), new ContextAttribs(4, 1).withProfileCompatibility(true).withDebug(true)); + //AMDDebugOutput.glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( !GLContext.getCapabilities().OpenGL20 ) + throw new RuntimeException("OpenGL 2.0 is required for this demo."); + + // Setup viewport + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, -1.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + + // Create textures + + try { + texSmallID = createTexture("res/ball_sm.png"); + texBigID = createTexture("res/ball.png"); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-1); + } + texID = texBigID; + + // Setup rendering state + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0f); + + glColorMask(colorMask, colorMask, colorMask, false); + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + if ( caps.GL_ARB_compatibility || !caps.OpenGL31 ) + glEnable(GL_POINT_SPRITE); + + // Setup geometry + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + Util.checkGLError(); + } + + private static int createTexture(final String path) throws IOException { + final BufferedImage img = ImageIO.read(SpriteShootout.class.getClassLoader().getResource(path)); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final ByteBuffer buffer = readImage(img); + + final int texID = glGenTextures(); + + glBindTexture(GL_TEXTURE_2D, texID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); + + return texID; + } + + private static ByteBuffer readImage(final BufferedImage img) throws IOException { + final Raster raster = img.getRaster(); + + final int bands = raster.getNumBands(); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final int size = w * h * bands; + + final byte[] pixels = new byte[size]; + raster.getDataElements(0, 0, w, h, pixels); + + final ByteBuffer pbuffer = BufferUtils.createByteBuffer(size); + + if ( bands == 4 ) { + for ( int i = 0; i < (w * h * 4); i += 4 ) { + // Pre-multiply alpha + final float a = unpackUByte01(pixels[i + 3]); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 2]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 1]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 0]) * a)); + pbuffer.put(pixels[i + 3]); + } + } else if ( bands == 3 ) { + for ( int i = 0; i < (w * h * 3); i += 3 ) { + pbuffer.put(pixels[i + 2]); + pbuffer.put(pixels[i + 1]); + pbuffer.put(pixels[i + 0]); + } + } else + pbuffer.put(pixels, 0, size); + + pbuffer.flip(); + + return pbuffer; + } + + private static float unpackUByte01(final byte x) { + return (x & 0xFF) / 255.0f; + } + + private static byte packUByte01(final float x) { + return (byte)(x * 255.0f); + } + + private void updateBalls(final int count) { + System.out.println("NUMBER OF BALLS: " + count); + renderer.updateBalls(ballCount); + } + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + long time = Sys.getTime(); + final int ticksPerUpdate = (int)(Sys.getTimerResolution() / ANIMATION_TICKS); + + renderer.render(false, true, 0); + + while ( run ) { + Display.processMessages(); + handleInput(); + + glClear(GL_COLOR_BUFFER_BIT); + + final long currTime = Sys.getTime(); + final int delta = (int)(currTime - time); + if ( smooth || delta >= ticksPerUpdate ) { + renderer.render(render, animate, delta); + time = currTime; + } else + renderer.render(render, false, 0); + + Display.update(false); + //Display.sync(60); + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println("FPS: " + (Math.round(fps / (timeUsed / 1000.0) * 10) / 10.0) + ", Balls: " + ballCount); + System.out.println("\tAnimation: " + (animateTime / fps / 1000) + "us"); + animateTime = 0; + fps = 0; + } + } + } + + private void handleInput() { + if ( Display.isCloseRequested() ) + run = false; + + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_1: + case Keyboard.KEY_2: + case Keyboard.KEY_3: + case Keyboard.KEY_4: + case Keyboard.KEY_5: + case Keyboard.KEY_6: + case Keyboard.KEY_7: + case Keyboard.KEY_8: + case Keyboard.KEY_9: + case Keyboard.KEY_0: + ballCount = 1 << (Keyboard.getEventKey() - Keyboard.KEY_1); + updateBalls(ballCount); + break; + case Keyboard.KEY_ADD: + case Keyboard.KEY_SUBTRACT: + int mult; + if ( Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ) + mult = 1000; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU) ) + mult = 100; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ) + mult = 10; + else + mult = 1; + if ( Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT ) + mult = -mult; + ballCount += mult * 100; + if ( ballCount <= 0 ) + ballCount = 1; + updateBalls(ballCount); + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + case Keyboard.KEY_A: + animate = !animate; + System.out.println("Animation is now " + (animate ? "on" : "off") + "."); + break; + case Keyboard.KEY_C: + colorMask = !colorMask; + glColorMask(colorMask, colorMask, colorMask, false); + System.out.println("Color mask is now " + (colorMask ? "on" : "off") + "."); + // Disable alpha test when color mask is off, else we get no benefit. + if ( colorMask ) { + glEnable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } else { + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); + } + break; + case Keyboard.KEY_R: + render = !render; + System.out.println("Rendering is now " + (render ? "on" : "off") + "."); + break; + case Keyboard.KEY_S: + smooth = !smooth; + System.out.println("Smooth animation is now " + (smooth ? "on" : "off") + "."); + break; + case Keyboard.KEY_T: + if ( texID == texBigID ) { + texID = texSmallID; + ballSize = 16; + } else { + texID = texBigID; + ballSize = 42; + } + renderer.updateBallSize(); + glBindTexture(GL_TEXTURE_2D, texID); + System.out.println("Now using the " + (texID == texBigID ? "big" : "small") + " texture."); + break; + case Keyboard.KEY_V: + vsync = !vsync; + Display.setVSyncEnabled(vsync); + System.out.println("VSYNC is now " + (vsync ? "enabled" : "disabled") + "."); + break; + } + } + + while ( Mouse.next() ) ; + } + + private void destroy() { + Display.destroy(); + } + + private abstract class SpriteRenderer { + + protected float[] transform = { }; + + protected int vshID; + protected int progID; + + protected void createProgram() { + final int fshID = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fshID, "uniform sampler2D COLOR_MAP;\n" + + "void main(void) {\n" + + " gl_FragColor = texture2D(COLOR_MAP, gl_PointCoord);\n" + + "}"); + glCompileShader(fshID); + if ( glGetShaderi(fshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(fshID, glGetShaderi(fshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile fragment shader."); + } + + progID = glCreateProgram(); + glAttachShader(progID, vshID); + glAttachShader(progID, fshID); + glLinkProgram(progID); + if ( glGetProgrami(progID, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progID, glGetProgrami(progID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progID); + glUniform1i(glGetUniformLocation(progID, "COLOR_MAP"), 0); + + updateBallSize(); + + glEnableClientState(GL_VERTEX_ARRAY); + } + + public void updateBallSize() { + glPointSize(ballSize); + } + + public void updateBalls(final int count) { + final Random random = new Random(); + + final float[] newTransform = new float[count * 4]; + System.arraycopy(transform, 0, newTransform, 0, Math.min(transform.length, newTransform.length)); + if ( newTransform.length > transform.length ) { + for ( int i = transform.length; i < newTransform.length; ) { + newTransform[i++] = (int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f); + newTransform[i++] = (int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f); + newTransform[i++] = random.nextFloat() * 0.4f - 0.2f; + newTransform[i++] = random.nextFloat() * 0.4f - 0.2f; + } + } + transform = newTransform; + } + + protected void animate( + final float[] sprites, + final FloatBuffer spritesRender, + final int ballSize, final int ballIndex, final int batchSize, final int delta + ) { + final float ballRadius = ballSize * 0.5f; + final float boundW = SCREEN_WIDTH - ballRadius; + final float boundH = SCREEN_HEIGHT - ballRadius; + + for ( int b = ballIndex * 4, len = (ballIndex + batchSize) * 4; b < len; b += 4 ) { + float x = sprites[b + 0]; + float dx = sprites[b + 2]; + + x += dx * delta; + if ( x < ballRadius ) { + x = ballRadius; + sprites[b + 2] = -dx; + } else if ( x > boundW ) { + x = boundW; + sprites[b + 2] = -dx; + } + sprites[b + 0] = x; + + float y = sprites[b + 1]; + float dy = sprites[b + 3]; + + y += dy * delta; + if ( y < ballRadius ) { + y = ballRadius; + sprites[b + 3] = -dy; + } else if ( y > boundH ) { + y = boundH; + sprites[b + 3] = -dy; + } + sprites[b + 1] = y; + + spritesRender.put(x).put(y); + } + spritesRender.clear(); + } + + protected abstract void render(boolean render, boolean animate, int delta); + + } + + private abstract class SpriteRendererBatched extends SpriteRenderer { + + protected static final int BALLS_PER_BATCH = 10 * 1000; + + SpriteRendererBatched() { + vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createProgram(); + } + + } + + private class SpriteRendererPlain extends SpriteRendererBatched { + + private final FloatBuffer geom; + + protected int[] animVBO; + + SpriteRendererPlain() { + System.out.println("Shootout Implementation: CPU animation & BufferData"); + geom = BufferUtils.createFloatBuffer(BALLS_PER_BATCH * 4 * 2); + } + + public void updateBalls(final int count) { + super.updateBalls(count); + + final int batchCount = count / BALLS_PER_BATCH + (count % BALLS_PER_BATCH == 0 ? 0 : 1); + if ( animVBO != null && batchCount == animVBO.length ) + return; + + final int[] newAnimVBO = new int[batchCount]; + if ( animVBO != null ) { + System.arraycopy(animVBO, 0, newAnimVBO, 0, Math.min(animVBO.length, newAnimVBO.length)); + for ( int i = newAnimVBO.length; i < animVBO.length; i++ ) + glDeleteBuffers(animVBO[i]); + } + for ( int i = animVBO == null ? 0 : animVBO.length; i < newAnimVBO.length; i++ ) { + newAnimVBO[i] = glGenBuffers(); + glBindBuffer(GL_ARRAY_BUFFER, newAnimVBO[i]); + } + + animVBO = newAnimVBO; + } + + public void render(final boolean render, final boolean animate, final int delta) { + int batchSize = Math.min(ballCount, BALLS_PER_BATCH); + int ballIndex = 0; + int vboIndex = 0; + while ( ballIndex < ballCount ) { + glBindBuffer(GL_ARRAY_BUFFER, animVBO[vboIndex++]); + + if ( animate ) + animate(ballIndex, batchSize, delta); + + if ( render ) { + glVertexPointer(2, GL_FLOAT, 0, 0); + glDrawArrays(GL_POINTS, 0, batchSize); + } + + ballIndex += batchSize; + batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH); + } + } + + private void animate(final int ballIndex, final int batchSize, final int delta) { + animate(transform, geom, ballSize, ballIndex, batchSize, delta); + + // Orphan current buffer and allocate a new one + glBufferData(GL_ARRAY_BUFFER, geom.capacity() * 4, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, geom); + } + } + + private class SpriteRendererMapped extends SpriteRendererBatched { + + private StreamVBO animVBO; + + SpriteRendererMapped() { + System.out.println("Shootout Implementation: CPU animation & MapBufferRange"); + } + + public void updateBalls(final int count) { + super.updateBalls(count); + + if ( animVBO != null ) + animVBO.destroy(); + + animVBO = new StreamVBO(GL_ARRAY_BUFFER, ballCount * (2 * 4)); + } + + public void render(final boolean render, final boolean animate, final int delta) { + int batchSize = Math.min(ballCount, BALLS_PER_BATCH); + int ballIndex = 0; + while ( ballIndex < ballCount ) { + if ( animate ) { + final ByteBuffer buffer = animVBO.map(batchSize * (2 * 4)); + + long t0 = System.nanoTime(); + animate(transform, buffer.asFloatBuffer(), ballSize, ballIndex, batchSize, delta); + long t1 = System.nanoTime(); + + animateTime += t1 - t0; + + animVBO.unmap(); + } + + if ( render ) { + glVertexPointer(2, GL_FLOAT, 0, ballIndex * (2 * 4)); + glDrawArrays(GL_POINTS, 0, batchSize); + } + + ballIndex += batchSize; + batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH); + } + } + } + + private class SpriteRendererTF extends SpriteRenderer { + + private int progIDTF; + private int ballSizeLoc; + private int deltaLoc; + + private int[] tfVBO = new int[2]; + private int currVBO; + + SpriteRendererTF() { + System.out.println("Shootout Implementation: TF GPU animation"); + + // Transform-feedback program + + final int vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "#version 130\n" + + "const float WIDTH = " + SCREEN_WIDTH + ";\n" + + "const float HEIGHT = " + SCREEN_HEIGHT + ";\n" + + "uniform float ballSize;\n" + // ballSize / 2 + "uniform float delta;\n" + + "void main(void) {\n" + + " vec4 anim = gl_Vertex;\n" + + " anim.xy = anim.xy + anim.zw * delta;\n" + + " vec2 animC = clamp(anim.xy, vec2(ballSize), vec2(WIDTH - ballSize, HEIGHT - ballSize));\n" + + " if ( anim.x != animC.x ) anim.z = -anim.z;\n" + + " if ( anim.y != animC.y ) anim.w = -anim.w;\n" + + " gl_Position = vec4(animC, anim.zw);\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + progIDTF = glCreateProgram(); + glAttachShader(progIDTF, vshID); + glTransformFeedbackVaryings(progIDTF, new CharSequence[] { "gl_Position" }, GL_SEPARATE_ATTRIBS); + glLinkProgram(progIDTF); + if ( glGetProgrami(progIDTF, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progIDTF, glGetProgrami(progIDTF, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progIDTF); + + ballSizeLoc = glGetUniformLocation(progIDTF, "ballSize"); + deltaLoc = glGetUniformLocation(progIDTF, "delta"); + + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + // ----------------- + + this.vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(this.vshID, "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + + "}"); + glCompileShader(this.vshID); + if ( glGetShaderi(this.vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(this.vshID, glGetShaderi(this.vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createProgram(); + } + + public void updateBallSize() { + glUseProgram(progIDTF); + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + glUseProgram(progID); + super.updateBallSize(); + } + + public void updateBalls(final int count) { + if ( tfVBO[0] != 0 ) { + // Fetch current animation state + final FloatBuffer state = BufferUtils.createFloatBuffer(transform.length); + glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, state); + state.get(transform); + } + + super.updateBalls(count); + + if ( tfVBO[0] != 0 ) { + for ( int i = 0; i < tfVBO.length; i++ ) + glDeleteBuffers(tfVBO[i]); + } + + final FloatBuffer state = BufferUtils.createFloatBuffer(count * 4); + state.put(transform); + state.flip(); + + for ( int i = 0; i < tfVBO.length; i++ ) { + tfVBO[i] = glGenBuffers(); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tfVBO[i]); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, state, GL_STATIC_DRAW); + } + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[0]); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + } + + public void render(final boolean render, final boolean animate, final int delta) { + if ( animate ) { + glUseProgram(progIDTF); + glUniform1f(deltaLoc, delta); + + final int vbo = currVBO; + currVBO = 1 - currVBO; + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[vbo]); + glVertexPointer(4, GL_FLOAT, 0, 0); + + glEnable(GL_RASTERIZER_DISCARD); + if ( GLContext.getCapabilities().OpenGL30 ) { + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedback(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount); + glEndTransformFeedback(); + } else { + glBindBufferBaseEXT(GL_TRANSFORM_FEEDBACK_BUFFER_EXT, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedbackEXT(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount); + glEndTransformFeedbackEXT(); + } + glDisable(GL_RASTERIZER_DISCARD); + + glUseProgram(progID); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + } + + if ( render ) + glDrawArrays(GL_POINTS, 0, ballCount); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout2P.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout2P.java new file mode 100644 index 0000000..e35219b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootout2P.java @@ -0,0 +1,625 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.sprites; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.*; + +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.util.Random; +import javax.imageio.ImageIO; + +import static org.lwjgl.opengl.EXTTransformFeedback.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * Sprite rendering demo. In this version we're doing the animation + * computations on the GPU, using transform feedback and a vertex + * shader, then rendering is performed in 2 passes, with depth testing + * enabled: + * 1) Sprites are rendered front-to-back, opaque fragments only, blending is disabled. + * 2) Sprites are rendered back-to-front, transparent fragments only, blending is enabled. + * Sorting is free, because we're animating double the amount of sprites rendered, the + * first batch is sorted f2b, the second is sorted b2f. Ordering is achieved by modifying + * the z-axis position of the sprites in the vertex shader. + * + * @author Spasi + * @since 18/3/2011 + */ +public final class SpriteShootout2P { + + private static final int SCREEN_WIDTH = 800; + private static final int SCREEN_HEIGHT = 600; + + private static final int ANIMATION_TICKS = 60; + + private boolean run = true; + private boolean render = true; + private boolean colorMask = true; + private boolean animate = true; + private boolean smooth; + private boolean vsync; + + private int ballSize = 42; + private int ballCount = 100 * 1000; + + private SpriteRenderer renderer; + + // OpenGL stuff + private int texID; + private int texBigID; + private int texSmallID; + + private SpriteShootout2P() { + } + + public static void main(String[] args) { + try { + new SpriteShootout2P().start(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + private void start() throws LWJGLException { + try { + initGL(); + + renderer = new SpriteRendererTF(); + + updateBalls(ballCount); + run(); + } catch (Throwable t) { + t.printStackTrace(); + } finally { + destroy(); + } + } + + private void initGL() throws LWJGLException { + Display.setLocation((Display.getDisplayMode().getWidth() - SCREEN_WIDTH) / 2, + (Display.getDisplayMode().getHeight() - SCREEN_HEIGHT) / 2); + Display.setDisplayMode(new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT)); + Display.setTitle("Sprite Shootout 2-pass"); + Display.create(new PixelFormat(0, 24, 0)); + //Display.create(new PixelFormat(), new ContextAttribs(4, 1).withProfileCompatibility(true).withDebug(true)); + //AMDDebugOutput.glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( !(caps.OpenGL30 || (caps.OpenGL20 && caps.GL_EXT_transform_feedback)) ) + throw new RuntimeException("OpenGL 3.0 or 2.0 + EXT_transform_feedback is required for this demo."); + + // Setup viewport + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, -1.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + + // Create textures + + try { + texSmallID = createTexture("res/ball_sm.png"); + texBigID = createTexture("res/ball.png"); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-1); + } + texID = texBigID; + + // Setup rendering state + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_ALPHA_TEST); + + glColorMask(colorMask, colorMask, colorMask, false); + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glClearDepth(1.0f); + + if ( caps.GL_ARB_compatibility || !caps.OpenGL31 ) + glEnable(GL_POINT_SPRITE); + + // Setup geometry + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + Util.checkGLError(); + } + + private static int createTexture(final String path) throws IOException { + final BufferedImage img = ImageIO.read(SpriteShootout2P.class.getClassLoader().getResource(path)); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final ByteBuffer buffer = readImage(img); + + final int texID = glGenTextures(); + + glBindTexture(GL_TEXTURE_2D, texID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); + + return texID; + } + + private static ByteBuffer readImage(final BufferedImage img) throws IOException { + final Raster raster = img.getRaster(); + + final int bands = raster.getNumBands(); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final int size = w * h * bands; + + final byte[] pixels = new byte[size]; + raster.getDataElements(0, 0, w, h, pixels); + + final ByteBuffer pbuffer = BufferUtils.createByteBuffer(size); + + if ( bands == 4 ) { + for ( int i = 0; i < (w * h * 4); i += 4 ) { + // Pre-multiply alpha + final float a = unpackUByte01(pixels[i + 3]); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 2]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 1]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 0]) * a)); + pbuffer.put(pixels[i + 3]); + } + } else if ( bands == 3 ) { + for ( int i = 0; i < (w * h * 3); i += 3 ) { + pbuffer.put(pixels[i + 2]); + pbuffer.put(pixels[i + 1]); + pbuffer.put(pixels[i + 0]); + } + } else + pbuffer.put(pixels, 0, size); + + pbuffer.flip(); + + return pbuffer; + } + + private static float unpackUByte01(final byte x) { + return (x & 0xFF) / 255.0f; + } + + private static byte packUByte01(final float x) { + return (byte)(x * 255.0f); + } + + private void updateBalls(final int count) { + System.out.println("NUMBER OF BALLS: " + count); + renderer.updateBalls(ballCount); + } + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + long time = Sys.getTime(); + final int ticksPerUpdate = (int)(Sys.getTimerResolution() / ANIMATION_TICKS); + + renderer.render(false, true, 0); + + while ( run ) { + Display.processMessages(); + handleInput(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + final long currTime = Sys.getTime(); + final int delta = (int)(currTime - time); + if ( smooth || delta >= ticksPerUpdate ) { + renderer.render(render, animate, delta); + time = currTime; + } else + renderer.render(render, false, 0); + + Display.update(false); + //Display.sync(60); + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println("FPS: " + (Math.round(fps / (timeUsed / 1000.0) * 10) / 10.0) + ", Balls: " + ballCount); + fps = 0; + } + } + } + + private void handleInput() { + if ( Display.isCloseRequested() ) + run = false; + + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_1: + case Keyboard.KEY_2: + case Keyboard.KEY_3: + case Keyboard.KEY_4: + case Keyboard.KEY_5: + case Keyboard.KEY_6: + case Keyboard.KEY_7: + case Keyboard.KEY_8: + case Keyboard.KEY_9: + case Keyboard.KEY_0: + ballCount = 1 << (Keyboard.getEventKey() - Keyboard.KEY_1); + updateBalls(ballCount); + break; + case Keyboard.KEY_ADD: + case Keyboard.KEY_SUBTRACT: + int mult; + if ( Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ) { + mult = 1000; + if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ) + mult *= 5; + } else if ( Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU) ) + mult = 100; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ) + mult = 10; + else + mult = 1; + if ( Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT ) + mult = -mult; + ballCount += mult * 100; + if ( ballCount <= 0 ) + ballCount = 1; + updateBalls(ballCount); + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + case Keyboard.KEY_A: + animate = !animate; + System.out.println("Animation is now " + (animate ? "on" : "off") + "."); + break; + case Keyboard.KEY_C: + colorMask = !colorMask; + glColorMask(colorMask, colorMask, colorMask, false); + System.out.println("Color mask is now " + (colorMask ? "on" : "off") + "."); + // Disable alpha test when color mask is off, else we get no benefit. + if ( colorMask ) { + glEnable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } else { + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); + } + break; + case Keyboard.KEY_R: + render = !render; + System.out.println("Rendering is now " + (render ? "on" : "off") + "."); + break; + case Keyboard.KEY_S: + smooth = !smooth; + System.out.println("Smooth animation is now " + (smooth ? "on" : "off") + "."); + break; + case Keyboard.KEY_T: + if ( texID == texBigID ) { + texID = texSmallID; + ballSize = 16; + } else { + texID = texBigID; + ballSize = 42; + } + renderer.updateBallSize(); + glBindTexture(GL_TEXTURE_2D, texID); + System.out.println("Now using the " + (texID == texBigID ? "big" : "small") + " texture."); + break; + case Keyboard.KEY_V: + vsync = !vsync; + Display.setVSyncEnabled(vsync); + System.out.println("VSYNC is now " + (vsync ? "enabled" : "disabled") + "."); + break; + } + } + + while ( Mouse.next() ) ; + } + + private void destroy() { + Display.destroy(); + } + + private abstract class SpriteRenderer { + + protected int progID; + + protected void createPrograms(final int vshID) { + // Opaque pass + + final int fshID = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fshID, "uniform sampler2D COLOR_MAP;\n" + + "void main(void) {\n" + + " gl_FragColor = texture2D(COLOR_MAP, gl_PointCoord);\n" + + "}"); + glCompileShader(fshID); + if ( glGetShaderi(fshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(fshID, glGetShaderi(fshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile fragment shader."); + } + + progID = glCreateProgram(); + glAttachShader(progID, vshID); + glAttachShader(progID, fshID); + glLinkProgram(progID); + if ( glGetProgrami(progID, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progID, glGetProgrami(progID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progID); + glUniform1i(glGetUniformLocation(progID, "COLOR_MAP"), 0); + + updateBallSize(); + + glEnableClientState(GL_VERTEX_ARRAY); + } + + public void updateBallSize() { + glPointSize(ballSize); + } + + protected abstract void updateBalls(final int count); + + protected abstract void render(boolean render, boolean animate, int delta); + + } + + private class SpriteRendererTF extends SpriteRenderer { + + private int progIDTF; + private int ballSizeLoc; + private int deltaLoc; + + private int[] tfVBO = new int[2]; + private int currVBO; + + private int depthVBO; + private int depthLoc; + + SpriteRendererTF() { + System.out.println("Shootout Implementation: TF GPU animation & 2-pass rendering"); + + // Transform-feedback program + + int vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "#version 130\n" + + "const float WIDTH = " + SCREEN_WIDTH + ";\n" + + "const float HEIGHT = " + SCREEN_HEIGHT + ";\n" + + "uniform float ballSize;\n" + // ballSize / 2 + "uniform float delta;\n" + + "void main(void) {\n" + + " vec4 anim = gl_Vertex;\n" + + " anim.xy = anim.xy + anim.zw * delta;\n" + + " vec2 animC = clamp(anim.xy, vec2(ballSize), vec2(WIDTH - ballSize, HEIGHT - ballSize));\n" + + " if ( anim.x != animC.x ) anim.z = -anim.z;\n" + + " if ( anim.y != animC.y ) anim.w = -anim.w;\n" + + " gl_Position = vec4(animC, anim.zw);\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + progIDTF = glCreateProgram(); + glAttachShader(progIDTF, vshID); + glTransformFeedbackVaryings(progIDTF, new CharSequence[] { "gl_Position" }, GL_SEPARATE_ATTRIBS); + glLinkProgram(progIDTF); + if ( glGetProgrami(progIDTF, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progIDTF, glGetProgrami(progIDTF, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progIDTF); + + ballSizeLoc = glGetUniformLocation(progIDTF, "ballSize"); + deltaLoc = glGetUniformLocation(progIDTF, "delta"); + + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + // ----------------- + + vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "#version 130\n" + + "in float depth;\n" + + "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xy, depth, gl_Vertex.w);\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createPrograms(vshID); + + depthLoc = glGetAttribLocation(progID, "depth"); + + // ----------------- + } + + public void updateBallSize() { + glUseProgram(progIDTF); + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + super.updateBallSize(); + } + + public void updateBalls(final int count) { + // Depth data + + final FloatBuffer depths = BufferUtils.createFloatBuffer(count * 2); + final float depthStep = 1.9f / count; + float depth = Float.parseFloat("0x1.fffffep-1"); + // Front-to-back + for ( int i = 0; i < count; i++ ) { + depths.put(depth); + depth -= depthStep; + } + // Back-to-front + for ( int i = 0; i < count; i++ ) + depths.put(depths.get(count - 1 - i)); + depths.flip(); + + if ( depthVBO != 0 ) + glDeleteBuffers(depthVBO); + + depthVBO = glGenBuffers(); + glBindBuffer(GL_ARRAY_BUFFER, depthVBO); + glBufferData(GL_ARRAY_BUFFER, depths, GL_STATIC_DRAW); + + glEnableVertexAttribArray(depthLoc); + glVertexAttribPointer(depthLoc, 1, GL_FLOAT, false, 0, 0); + + // Animation data + + final FloatBuffer transform = BufferUtils.createFloatBuffer(count * 2 * 4); + // Front-to-back + final Random random = new Random(); + for ( int i = 0; i < count; i++ ) { + transform.put((int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f)); + transform.put((int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f)); + transform.put(random.nextFloat() * 0.4f - 0.2f); + transform.put(random.nextFloat() * 0.4f - 0.2f); + } + // Back-to-front + for ( int i = 0; i < count; i++ ) { + final int offset = (count - 1 - i) * 4; + transform.put(transform.get(offset + 0)); + transform.put(transform.get(offset + 1)); + transform.put(transform.get(offset + 2)); + transform.put(transform.get(offset + 3)); + } + transform.flip(); + + if ( tfVBO[0] != 0 ) { + for ( int i = 0; i < tfVBO.length; i++ ) + glDeleteBuffers(tfVBO[i]); + } + + for ( int i = 0; i < tfVBO.length; i++ ) { + tfVBO[i] = glGenBuffers(); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tfVBO[i]); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, transform, GL_STATIC_DRAW); + } + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[0]); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + } + + public void render(final boolean render, final boolean animate, final int delta) { + if ( animate ) { + glDisableVertexAttribArray(depthLoc); + + final int vbo = currVBO; + currVBO = 1 - currVBO; + + glUseProgram(progIDTF); + glUniform1f(deltaLoc, delta); + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[vbo]); + glVertexPointer(4, GL_FLOAT, 0, 0); + + glEnable(GL_RASTERIZER_DISCARD); + if ( GLContext.getCapabilities().OpenGL30 ) { + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedback(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount * 2); + glEndTransformFeedback(); + } else { + glBindBufferBaseEXT(GL_TRANSFORM_FEEDBACK_BUFFER_EXT, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedbackEXT(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount * 2); + glEndTransformFeedbackEXT(); + } + glDisable(GL_RASTERIZER_DISCARD); + + glUseProgram(progID); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + + glEnableVertexAttribArray(depthLoc); + } + + if ( render ) { + // Render front-to-back opaque pass + glAlphaFunc(GL_EQUAL, 1.0f); + glDisable(GL_BLEND); + glDrawArrays(GL_POINTS, 0, ballCount); + glEnable(GL_BLEND); + + // Render back-to-front transparent pass + glAlphaFunc(GL_GREATER, 0.0f); // Fragments with alpha == 1.0 are early-depth-rejected. + glDepthMask(false); + glDrawArrays(GL_POINTS, ballCount, ballCount); + glDepthMask(true); + } + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutCL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutCL.java new file mode 100644 index 0000000..34d5d04 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutCL.java @@ -0,0 +1,598 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.sprites; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerBuffer; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opencl.*; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengl.GLContext; + +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.List; +import java.util.Random; +import javax.imageio.ImageIO; + +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL10GL.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; + +/** + * Sprite rendering demo. In this version OpenCL is used for the animation + * computations. CL_KHR_gl_sharing is required for sharing the animation + * data with OpenGL for rendering. + * + * @author Spasi + * @since 18/3/2011 + */ +public final class SpriteShootoutCL { + + private static final int SCREEN_WIDTH = 800; + private static final int SCREEN_HEIGHT = 600; + + private static final int ANIMATION_TICKS = 60; + + private boolean run = true; + private boolean render = true; + private boolean colorMask = true; + private boolean animate = true; + private boolean smooth; + private boolean vsync; + + private int ballSize = 42; + private int ballCount = 100 * 1000; + + private SpriteRenderer renderer; + + // OpenGL stuff + private int texID; + private int texBigID; + private int texSmallID; + + // OpenCL stuff + + private IntBuffer errorCode = BufferUtils.createIntBuffer(1); + + private CLDevice clDevice; + private CLContext clContext; + private CLCommandQueue queue; + private CLProgram program; + private CLKernel kernel; + private CLMem clTransform; + + private PointerBuffer kernelGlobalWorkSize; + + private SpriteShootoutCL() { + } + + public static void main(String[] args) { + try { + new SpriteShootoutCL().start(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + private void start() throws LWJGLException { + try { + initGL(); + initCL(); + + renderer = new SpriteRendererDefault(); + + updateBalls(ballCount); + run(); + } catch (Throwable t) { + t.printStackTrace(); + } finally { + destroy(); + } + } + + private void initCL() throws LWJGLException { + CL.create(); + + final List<CLPlatform> platforms = CLPlatform.getPlatforms(); + if ( platforms == null ) + throw new RuntimeException("No OpenCL platforms found."); + + final Filter<CLDevice> glSharingFilter = new Filter<CLDevice>() { + public boolean accept(final CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_gl_sharing; + } + }; + + CLPlatform platform = null; + List<CLDevice> devices = null; + for ( CLPlatform p : platforms ) { + // Find devices with GL sharing support + devices = p.getDevices(CL_DEVICE_TYPE_GPU, glSharingFilter); + if ( devices != null ) { + platform = p; + break; + } + } + + if ( devices == null ) + throw new RuntimeException("No OpenCL GPU device found."); + + clDevice = devices.get(0); + // Make sure we use only 1 device + devices.clear(); + devices.add(clDevice); + + clContext = CLContext.create(platform, devices, new CLContextCallback() { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { + System.out.println("[CONTEXT MESSAGE] " + errinfo); + } + }, Display.getDrawable(), errorCode); + checkCLError(errorCode); + + queue = clCreateCommandQueue(clContext, clDevice, 0, errorCode); + checkCLError(errorCode); + } + + private void initGL() throws LWJGLException { + Display.setLocation((Display.getDisplayMode().getWidth() - SCREEN_WIDTH) / 2, + (Display.getDisplayMode().getHeight() - SCREEN_HEIGHT) / 2); + Display.setDisplayMode(new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT)); + Display.setTitle("Sprite Shootout - CL"); + Display.create(); + + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( !caps.OpenGL20 ) + throw new RuntimeException("OpenGL 2.0 is required for this demo."); + + // Setup viewport + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, -1.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + + // Create textures + + try { + texSmallID = createTexture("res/ball_sm.png"); + texBigID = createTexture("res/ball.png"); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-1); + } + texID = texBigID; + + // Setup rendering state + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0f); + + glColorMask(colorMask, colorMask, colorMask, false); + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + if ( caps.GL_ARB_compatibility || !caps.OpenGL31 ) + glEnable(GL_POINT_SPRITE); + + // Setup geometry + + org.lwjgl.opengl.Util.checkGLError(); + } + + private static int createTexture(final String path) throws IOException { + final BufferedImage img = ImageIO.read(SpriteShootoutCL.class.getClassLoader().getResource(path)); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final ByteBuffer buffer = readImage(img); + + final int texID = glGenTextures(); + + glBindTexture(GL_TEXTURE_2D, texID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); + + return texID; + } + + private static ByteBuffer readImage(final BufferedImage img) throws IOException { + final Raster raster = img.getRaster(); + + final int bands = raster.getNumBands(); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final int size = w * h * bands; + + final byte[] pixels = new byte[size]; + raster.getDataElements(0, 0, w, h, pixels); + + final ByteBuffer pbuffer = BufferUtils.createByteBuffer(size); + + if ( bands == 4 ) { + for ( int i = 0; i < (w * h * 4); i += 4 ) { + // Pre-multiply alpha + final float a = unpackUByte01(pixels[i + 3]); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 2]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 1]) * a)); + pbuffer.put(packUByte01(unpackUByte01(pixels[i + 0]) * a)); + pbuffer.put(pixels[i + 3]); + } + } else if ( bands == 3 ) { + for ( int i = 0; i < (w * h * 3); i += 3 ) { + pbuffer.put(pixels[i + 2]); + pbuffer.put(pixels[i + 1]); + pbuffer.put(pixels[i + 0]); + } + } else + pbuffer.put(pixels, 0, size); + + pbuffer.flip(); + + return pbuffer; + } + + private static float unpackUByte01(final byte x) { + return (x & 0xFF) / 255.0f; + } + + private static byte packUByte01(final float x) { + return (byte)(x * 255.0f); + } + + private void updateBalls(final int count) { + System.out.println("NUMBER OF BALLS: " + count); + renderer.updateBalls(ballCount); + } + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + long time = Sys.getTime(); + final int ticksPerUpdate = (int)(Sys.getTimerResolution() / ANIMATION_TICKS); + + renderer.render(false, true, 0); + + while ( run ) { + Display.processMessages(); + handleInput(); + + glClear(GL_COLOR_BUFFER_BIT); + + final long currTime = Sys.getTime(); + final int delta = (int)(currTime - time); + if ( smooth || delta >= ticksPerUpdate ) { + renderer.render(render, animate, delta); + time = currTime; + } else + renderer.render(render, false, 0); + + Display.update(false); + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println("FPS: " + (Math.round(fps / (timeUsed / 1000.0) * 10) / 10.0) + ", Balls: " + ballCount); + fps = 0; + } + } + } + + private void handleInput() { + if ( Display.isCloseRequested() ) + run = false; + + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_1: + case Keyboard.KEY_2: + case Keyboard.KEY_3: + case Keyboard.KEY_4: + case Keyboard.KEY_5: + case Keyboard.KEY_6: + case Keyboard.KEY_7: + case Keyboard.KEY_8: + case Keyboard.KEY_9: + case Keyboard.KEY_0: + ballCount = 1 << (Keyboard.getEventKey() - Keyboard.KEY_1); + updateBalls(ballCount); + break; + case Keyboard.KEY_ADD: + case Keyboard.KEY_SUBTRACT: + int mult; + if ( Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ) + mult = 1000; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU) ) + mult = 100; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ) + mult = 10; + else + mult = 1; + if ( Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT ) + mult = -mult; + ballCount += mult * 100; + if ( ballCount <= 0 ) + ballCount = 1; + updateBalls(ballCount); + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + case Keyboard.KEY_A: + animate = !animate; + System.out.println("Animation is now " + (animate ? "on" : "off") + "."); + break; + case Keyboard.KEY_C: + colorMask = !colorMask; + glColorMask(colorMask, colorMask, colorMask, false); + System.out.println("Color mask is now " + (colorMask ? "on" : "off") + "."); + // Disable alpha test when color mask is off, else we get no benefit. + if ( colorMask ) { + glEnable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } else { + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); + } + break; + case Keyboard.KEY_R: + render = !render; + System.out.println("Rendering is now " + (render ? "on" : "off") + "."); + break; + case Keyboard.KEY_S: + smooth = !smooth; + System.out.println("Smooth animation is now " + (smooth ? "on" : "off") + "."); + break; + case Keyboard.KEY_T: + if ( texID == texBigID ) { + texID = texSmallID; + ballSize = 16; + } else { + texID = texBigID; + ballSize = 42; + } + renderer.updateBallSize(); + glBindTexture(GL_TEXTURE_2D, texID); + System.out.println("Now using the " + (texID == texBigID ? "big" : "small") + " texture."); + break; + case Keyboard.KEY_V: + vsync = !vsync; + Display.setVSyncEnabled(vsync); + System.out.println("VSYNC is now " + (vsync ? "enabled" : "disabled") + "."); + break; + } + } + + while ( Mouse.next() ) ; + } + + private static void checkCLError(IntBuffer buffer) { + org.lwjgl.opencl.Util.checkCLError(buffer.get(0)); + } + + private void destroy() { + if ( clContext != null ) + clReleaseContext(clContext); + Display.destroy(); + System.exit(0); + } + + private abstract class SpriteRenderer { + + protected int progID; + protected int animVBO; + + protected void createKernel(final String source) { + program = clCreateProgramWithSource(clContext, source, errorCode); + checkCLError(errorCode); + final int build = clBuildProgram(program, clDevice, "", null); + if ( build != CL_SUCCESS ) { + System.out.println("BUILD LOG: " + program.getBuildInfoString(clDevice, CL_PROGRAM_BUILD_LOG)); + throw new RuntimeException("Failed to build CL program, status: " + build); + } + + kernel = clCreateKernel(program, "animate", errorCode); + checkCLError(errorCode); + + kernelGlobalWorkSize = BufferUtils.createPointerBuffer(1); + kernelGlobalWorkSize.put(0, ballCount); + + kernel.setArg(0, SCREEN_WIDTH); + kernel.setArg(1, SCREEN_HEIGHT); + } + + protected void createProgram(final int vshID) { + final int fshID = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fshID, "#version 110\n" + + "uniform sampler2D COLOR_MAP;" + + "void main(void) {\n" + + " gl_FragColor = texture2D(COLOR_MAP, gl_PointCoord);\n" + + "}"); + glCompileShader(fshID); + if ( glGetShaderi(fshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(fshID, glGetShaderi(fshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile fragment shader."); + } + + progID = glCreateProgram(); + glAttachShader(progID, vshID); + glAttachShader(progID, fshID); + glLinkProgram(progID); + if ( glGetProgrami(progID, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progID, glGetProgrami(progID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progID); + glUniform1i(glGetUniformLocation(progID, "COLOR_MAP"), 0); + + glEnableClientState(GL_VERTEX_ARRAY); + } + + public void updateBallSize() { + glPointSize(ballSize); + kernel.setArg(2, ballSize * 0.5f); + } + + public void updateBalls(final int count) { + kernelGlobalWorkSize.put(0, ballCount); + + final FloatBuffer transform = BufferUtils.createFloatBuffer(count * 4); + + final Random random = new Random(); + for ( int i = 0; i < count; i++ ) { + transform.put((int)(random.nextFloat() * (SCREEN_WIDTH - ballSize)) + ballSize * 0.5f); + transform.put((int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize)) + ballSize * 0.5f); + transform.put(random.nextFloat() * 0.4f - 0.2f); + transform.put(random.nextFloat() * 0.4f - 0.2f); + } + transform.flip(); + + if ( animVBO != 0 ) { + clReleaseMemObject(clTransform); + glDeleteBuffers(animVBO); + } + + animVBO = glGenBuffers(); + + glBindBuffer(GL_ARRAY_BUFFER, animVBO); + glBufferData(GL_ARRAY_BUFFER, transform, GL_STATIC_DRAW); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + + clTransform = clCreateFromGLBuffer(clContext, CL_MEM_READ_WRITE, animVBO, errorCode); + checkCLError(errorCode); + kernel.setArg(4, clTransform); + } + + protected abstract void render(boolean render, boolean animate, int delta); + + } + + private class SpriteRendererDefault extends SpriteRenderer { + + SpriteRendererDefault() { + System.out.println("Shootout Implementation: OpenCL GPU animation"); + + final int vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "#version 150\n" + + "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createProgram(vshID); + + org.lwjgl.opengl.Util.checkGLError(); + + createKernel("kernel void animate(\n" + + " const int WIDTH,\n" + + " const int HEIGHT,\n" + + " const float radius,\n" + + " const int delta,\n" + + " global float4 *balls\n" + + ") {\n" + + " unsigned int b = get_global_id(0);\n" + + "\n" + + " float4 anim = balls[b];\n" + + " anim.xy = anim.xy + anim.zw * delta;\n" + + " float2 animC = clamp(anim.xy, (float2)radius, (float2)(WIDTH - radius, HEIGHT - radius));\n" + + " if ( anim.x != animC.x ) anim.z = -anim.z;\n" + + " if ( anim.y != animC.y ) anim.w = -anim.w;\n" + + "\n" + + " balls[b] = (float4)(animC, anim.zw);\n" + + "}"); + + updateBallSize(); + } + + public void updateBalls(final int count) { + super.updateBalls(count); + } + + public void render(final boolean render, final boolean animate, final int delta) { + if ( animate ) { + //glFinish(); + + kernel.setArg(3, delta); + + clEnqueueAcquireGLObjects(queue, clTransform, null, null); + clEnqueueNDRangeKernel(queue, kernel, 1, null, kernelGlobalWorkSize, null, null, null); + clEnqueueReleaseGLObjects(queue, clTransform, null, null); + + clFinish(queue); + } + + if ( render ) + glDrawArrays(GL_POINTS, 0, ballCount); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java new file mode 100644 index 0000000..3512915 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/SpriteShootoutMapped.java @@ -0,0 +1,839 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.sprites; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.*; +import org.lwjgl.util.mapped.MappedObject; +import org.lwjgl.util.mapped.MappedObjectClassLoader; +import org.lwjgl.util.mapped.MappedObjectTransformer; +import org.lwjgl.util.mapped.MappedType; + +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Random; +import javax.imageio.ImageIO; + +import static org.lwjgl.opengl.EXTTransformFeedback.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * Sprite rendering demo. Three implementations are supported: + * a) CPU animation + BufferData VBO update. + * b) CPU animation + MapBufferRange VBO update. + * c) GPU animation using transform feedback with a vertex shader. + * + * @author Spasi + * @since 18/3/2011 + */ +public final class SpriteShootoutMapped { + + static final int SCREEN_WIDTH = 800; + static final int SCREEN_HEIGHT = 600; + + private static final int ANIMATION_TICKS = 60; + + private boolean run = true; + private boolean render = true; + private boolean colorMask = true; + private boolean animate = true; + private boolean smooth; + private boolean vsync; + + int ballSize = 42; + int ballCount = 100 * 1000; + + private SpriteRenderer renderer; + + // OpenGL stuff + private int texID; + private int texBigID; + private int texSmallID; + + long animateTime; + + private SpriteShootoutMapped() { + } + + public static void main(String[] args) { + MappedObjectTransformer.register(Pixel4b.class); + MappedObjectTransformer.register(Pixel3b.class); + MappedObjectTransformer.register(Sprite.class); + MappedObjectTransformer.register(SpriteRender.class); + + if ( MappedObjectClassLoader.fork(SpriteShootoutMapped.class, args) ) + return; + + try { + new SpriteShootoutMapped().start(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + private void start() throws LWJGLException { + try { + initGL(); + + final ContextCapabilities caps = GLContext.getCapabilities(); + if ( !true && (caps.OpenGL30 || caps.GL_EXT_transform_feedback) ) + renderer = new SpriteRendererTF(); + else if ( true && caps.GL_ARB_map_buffer_range ) + renderer = new SpriteRendererMapped(); + else + renderer = new SpriteRendererPlain(); + + updateBalls(ballCount); + run(); + } catch (Throwable t) { + t.printStackTrace(); + } finally { + destroy(); + } + } + + private void initGL() throws LWJGLException { + Display.setLocation((Display.getDisplayMode().getWidth() - SCREEN_WIDTH) / 2, + (Display.getDisplayMode().getHeight() - SCREEN_HEIGHT) / 2); + Display.setDisplayMode(new DisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT)); + Display.setTitle("Sprite Shootout"); + Display.create(); + //Display.create(new PixelFormat(), new ContextAttribs(4, 1).withProfileCompatibility(true).withDebug(true)); + //AMDDebugOutput.glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + + if ( !GLContext.getCapabilities().OpenGL20 ) + throw new RuntimeException("OpenGL 2.0 is required for this demo."); + + // Setup viewport + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, -1.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + glClearColor(1.0f, 1.0f, 1.0f, 0.0f); + + // Create textures + + try { + texSmallID = createTexture("res/ball_sm.png"); + texBigID = createTexture("res/ball.png"); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-1); + } + texID = texBigID; + + // Setup rendering state + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0f); + + glColorMask(colorMask, colorMask, colorMask, false); + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + // Setup geometry + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + Util.checkGLError(); + } + + private static int createTexture(final String path) throws IOException { + final BufferedImage img = ImageIO.read(SpriteShootoutMapped.class.getClassLoader().getResource(path)); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final ByteBuffer buffer = readImage(img); + + final int texID = glGenTextures(); + + glBindTexture(GL_TEXTURE_2D, texID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); + + return texID; + } + + public static class Pixel4b extends MappedObject { + + public byte r, g, b, a; + + } + + @MappedType(align = 3) + public static class Pixel3b extends MappedObject { + + public byte r, g, b; + + } + + private static ByteBuffer readImage(final BufferedImage img) throws IOException { + final Raster raster = img.getRaster(); + + final int bands = raster.getNumBands(); + + final int w = img.getWidth(); + final int h = img.getHeight(); + + final int count = w * h; + + final byte[] pixels = new byte[count * bands]; + raster.getDataElements(0, 0, w, h, pixels); + + if ( bands == 4 ) { + Pixel4b p = Pixel4b.malloc(count); + + int b = 0; + for ( int i = 0; i < count; i++, b += 4 ) { + // Pre-multiply alpha + final float a = unpackUByte01(pixels[b + 3]); + + p.view = i; + p.r = packUByte01(unpackUByte01(pixels[b + 2]) * a); + p.g = packUByte01(unpackUByte01(pixels[b + 1]) * a); + p.b = packUByte01(unpackUByte01(pixels[b + 0]) * a); + p.a = pixels[b + 3]; + } + + return p.backingByteBuffer(); + } else if ( bands == 3 ) { + Pixel3b p = Pixel3b.malloc(count); + + int b = 0; + for ( int i = 0; i < count; i++, b += 3 ) { + p.view = i; + p.r = pixels[b + 2]; + p.g = pixels[b + 1]; + p.b = pixels[b + 0]; + } + + return p.backingByteBuffer(); + } else { + ByteBuffer p = BufferUtils.createByteBuffer(count * bands); + p.put(pixels, 0, p.capacity()); + p.flip(); + return p; + } + + } + + private static float unpackUByte01(final byte x) { + return (x & 0xFF) / 255.0f; + } + + private static byte packUByte01(final float x) { + return (byte)(x * 255.0f); + } + + private void updateBalls(final int count) { + System.out.println("NUMBER OF BALLS: " + count); + renderer.updateBalls(ballCount); + } + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + long time = Sys.getTime(); + final int ticksPerUpdate = (int)(Sys.getTimerResolution() / ANIMATION_TICKS); + + renderer.render(false, true, 0); + + while ( run ) { + Display.processMessages(); + handleInput(); + + glClear(GL_COLOR_BUFFER_BIT); + + final long currTime = Sys.getTime(); + final int delta = (int)(currTime - time); + if ( smooth || delta >= ticksPerUpdate ) { + renderer.render(render, animate, delta); + time = currTime; + } else + renderer.render(render, false, 0); + + Display.update(false); + //Display.sync(60); + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println("FPS: " + (Math.round(fps / (timeUsed / 1000.0) * 10) / 10.0) + ", Balls: " + ballCount); + System.out.println("Animation: " + animateTime / fps); + animateTime = 0; + fps = 0; + } + } + } + + private void handleInput() { + if ( Display.isCloseRequested() ) + run = false; + + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_1: + case Keyboard.KEY_2: + case Keyboard.KEY_3: + case Keyboard.KEY_4: + case Keyboard.KEY_5: + case Keyboard.KEY_6: + case Keyboard.KEY_7: + case Keyboard.KEY_8: + case Keyboard.KEY_9: + case Keyboard.KEY_0: + ballCount = 1 << (Keyboard.getEventKey() - Keyboard.KEY_1); + updateBalls(ballCount); + break; + case Keyboard.KEY_ADD: + case Keyboard.KEY_SUBTRACT: + int mult; + if ( Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ) + mult = 1000; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU) ) + mult = 100; + else if ( Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ) + mult = 10; + else + mult = 1; + if ( Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT ) + mult = -mult; + ballCount += mult * 100; + if ( ballCount <= 0 ) + ballCount = 1; + updateBalls(ballCount); + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + case Keyboard.KEY_A: + animate = !animate; + System.out.println("Animation is now " + (animate ? "on" : "off") + "."); + break; + case Keyboard.KEY_C: + colorMask = !colorMask; + glColorMask(colorMask, colorMask, colorMask, false); + System.out.println("Color mask is now " + (colorMask ? "on" : "off") + "."); + // Disable alpha test when color mask is off, else we get no benefit. + if ( colorMask ) { + glEnable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } else { + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); + } + break; + case Keyboard.KEY_R: + render = !render; + System.out.println("Rendering is now " + (render ? "on" : "off") + "."); + break; + case Keyboard.KEY_S: + smooth = !smooth; + System.out.println("Smooth animation is now " + (smooth ? "on" : "off") + "."); + break; + case Keyboard.KEY_T: + if ( texID == texBigID ) { + texID = texSmallID; + ballSize = 16; + } else { + texID = texBigID; + ballSize = 42; + } + renderer.updateBallSize(); + glBindTexture(GL_TEXTURE_2D, texID); + System.out.println("Now using the " + (texID == texBigID ? "big" : "small") + " texture."); + break; + case Keyboard.KEY_V: + vsync = !vsync; + Display.setVSyncEnabled(vsync); + System.out.println("VSYNC is now " + (vsync ? "enabled" : "disabled") + "."); + break; + } + } + + while ( Mouse.next() ) ; + } + + private void destroy() { + Display.destroy(); + } + + public static class Sprite extends MappedObject { + + public float dx, x; + public float dy, y; + + } + + public static class SpriteRender extends MappedObject { + + public float x, y; + + } + + private abstract class SpriteRenderer { + + protected Sprite sprites; + + protected int spriteCount; + + protected int vshID; + protected int progID; + + protected void createProgram() { + final int fshID = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fshID, "uniform sampler2D COLOR_MAP;\n" + + "void main(void) {\n" + + " gl_FragColor = texture2D(COLOR_MAP, gl_PointCoord);\n" + + "}"); + glCompileShader(fshID); + if ( glGetShaderi(fshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(fshID, glGetShaderi(fshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile fragment shader."); + } + + progID = glCreateProgram(); + glAttachShader(progID, vshID); + glAttachShader(progID, fshID); + glLinkProgram(progID); + if ( glGetProgrami(progID, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progID, glGetProgrami(progID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progID); + glUniform1i(glGetUniformLocation(progID, "COLOR_MAP"), 0); + + updateBallSize(); + + glEnableClientState(GL_VERTEX_ARRAY); + } + + public void updateBallSize() { + glPointSize(ballSize); + } + + public abstract void updateBalls(int count); + + protected abstract void render(boolean render, boolean animate, int delta); + + } + + private abstract class SpriteRendererBatched extends SpriteRenderer { + + protected static final int BALLS_PER_BATCH = 10 * 1000; + + SpriteRendererBatched() { + vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createProgram(); + } + + public void updateBalls(final int count) { + final Random random = new Random(); + + final Sprite newSprites = Sprite.malloc(count); + if ( sprites != null ) { + sprites.view = 0; + sprites.copyRange(newSprites, Math.min(count, spriteCount)); + } + + if ( count > spriteCount ) { + for ( int i = spriteCount; i < count; i++ ) { + newSprites.view = i; + + newSprites.x = (int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f); + newSprites.y = (int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f); + newSprites.dx = random.nextFloat() * 0.4f - 0.2f; + newSprites.dy = random.nextFloat() * 0.4f - 0.2f; + } + } + + sprites = newSprites; + spriteCount = count; + } + + protected void animate( + final Sprite sprite, + final SpriteRender spriteRender, + final int ballSize, final int ballIndex, final int batchSize, final int delta + ) { + final float ballRadius = ballSize * 0.5f; + final float boundW = SCREEN_WIDTH - ballRadius; + final float boundH = SCREEN_HEIGHT - ballRadius; + + final Sprite[] sprites = sprite.asArray(); + final SpriteRender[] spritesRender = spriteRender.asArray(); + for ( int b = ballIndex, r = 0, len = (ballIndex + batchSize); b < len; b++, r++ ) { + float dx = sprites[b].dx; + float x = sprites[b].x; + + x += dx * delta; + if ( x < ballRadius ) { + x = ballRadius; + dx = -dx; + } else if ( x > boundW ) { + x = boundW; + dx = -dx; + } + + sprites[b].dx = dx; + sprites[b].x = x; + spritesRender[r].x = x; + + float dy = sprites[b].dy; + float y = sprites[b].y; + + y += dy * delta; + if ( y < ballRadius ) { + y = ballRadius; + dy = -dy; + } else if ( y > boundH ) { + y = boundH; + dy = -dy; + } + + sprites[b].dy = dy; + sprites[b].y = y; + spritesRender[r].y = y; + } + } + + } + + private class SpriteRendererPlain extends SpriteRendererBatched { + + private final int DATA_PER_BATCH = BALLS_PER_BATCH * 2 * 4; // balls * 2 floats * 4 bytes + + protected int[] animVBO; + + private SpriteRender spritesRender; + + SpriteRendererPlain() { + System.out.println("Shootout Implementation: CPU animation & BufferData"); + spritesRender = SpriteRender.malloc(BALLS_PER_BATCH); + } + + public void updateBalls(final int count) { + super.updateBalls(count); + + final int batchCount = count / BALLS_PER_BATCH + (count % BALLS_PER_BATCH == 0 ? 0 : 1); + if ( animVBO != null && batchCount == animVBO.length ) + return; + + final int[] newAnimVBO = new int[batchCount]; + if ( animVBO != null ) { + System.arraycopy(animVBO, 0, newAnimVBO, 0, Math.min(animVBO.length, newAnimVBO.length)); + for ( int i = newAnimVBO.length; i < animVBO.length; i++ ) + glDeleteBuffers(animVBO[i]); + } + for ( int i = animVBO == null ? 0 : animVBO.length; i < newAnimVBO.length; i++ ) { + newAnimVBO[i] = glGenBuffers(); + glBindBuffer(GL_ARRAY_BUFFER, newAnimVBO[i]); + } + + animVBO = newAnimVBO; + } + + public void render(final boolean render, final boolean animate, final int delta) { + int batchSize = Math.min(ballCount, BALLS_PER_BATCH); + int ballIndex = 0; + int batchIndex = 0; + while ( ballIndex < ballCount ) { + glBindBuffer(GL_ARRAY_BUFFER, animVBO[batchIndex]); + + if ( animate ) + animate(ballIndex, batchSize, delta); + + if ( render ) { + glVertexPointer(2, GL_FLOAT, 0, 0); + glDrawArrays(GL_POINTS, 0, batchSize); + } + + ballIndex += batchSize; + batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH); + batchIndex++; + } + } + + private void animate(final int ballIndex, final int batchSize, final int delta) { + animate( + sprites, spritesRender, + ballSize, ballIndex, batchSize, delta + ); + + glBufferData(GL_ARRAY_BUFFER, DATA_PER_BATCH, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, spritesRender.backingByteBuffer()); + } + + } + + private class SpriteRendererMapped extends SpriteRendererBatched { + + private StreamVBO animVBO; + + SpriteRendererMapped() { + System.out.println("Shootout Implementation: CPU animation & MapBufferRange"); + } + + public void updateBalls(final int count) { + super.updateBalls(count); + + if ( animVBO != null ) + animVBO.destroy(); + + animVBO = new StreamVBO(GL_ARRAY_BUFFER, ballCount * (2 * 4)); + } + + public void render(final boolean render, final boolean animate, final int delta) { + int batchSize = Math.min(ballCount, BALLS_PER_BATCH); + int ballIndex = 0; + while ( ballIndex < ballCount ) { + if ( animate ) { + final ByteBuffer buffer = animVBO.map(batchSize * (2 * 4)); + + long t0 = System.nanoTime(); + animate(sprites, SpriteRender.<SpriteRender>map(buffer), ballSize, ballIndex, batchSize, delta); + long t1 = System.nanoTime(); + + animateTime += t1 - t0; + + animVBO.unmap(); + } + + if ( render ) { + glVertexPointer(2, GL_FLOAT, 0, ballIndex * (2 * 4)); + glDrawArrays(GL_POINTS, 0, batchSize); + } + + ballIndex += batchSize; + batchSize = Math.min(ballCount - ballIndex, BALLS_PER_BATCH); + } + } + + } + + private class SpriteRendererTF extends SpriteRenderer { + + private int progIDTF; + private int ballSizeLoc; + private int deltaLoc; + + private int[] tfVBO = new int[2]; + private int currVBO; + + SpriteRendererTF() { + System.out.println("Shootout Implementation: TF GPU animation"); + + // Transform-feedback program + + final int vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vshID, "#version 130\n" + + "const float WIDTH = " + SCREEN_WIDTH + ";\n" + + "const float HEIGHT = " + SCREEN_HEIGHT + ";\n" + + "uniform float ballSize;\n" + // ballSize / 2 + "uniform float delta;\n" + + "void main(void) {\n" + + " vec4 anim = gl_Vertex;\n" + + " anim.xy = anim.xy + anim.zw * delta;\n" + + " vec2 animC = clamp(anim.xy, vec2(ballSize), vec2(WIDTH - ballSize, HEIGHT - ballSize));\n" + + " if ( anim.x != animC.x ) anim.z = -anim.z;\n" + + " if ( anim.y != animC.y ) anim.w = -anim.w;\n" + + " gl_Position = vec4(animC, anim.zw);\n" + + "}"); + glCompileShader(vshID); + if ( glGetShaderi(vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(vshID, glGetShaderi(vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + progIDTF = glCreateProgram(); + glAttachShader(progIDTF, vshID); + glTransformFeedbackVaryings(progIDTF, new CharSequence[] { "gl_Position" }, GL_SEPARATE_ATTRIBS); + glLinkProgram(progIDTF); + if ( glGetProgrami(progIDTF, GL_LINK_STATUS) == GL_FALSE ) { + System.out.println(glGetProgramInfoLog(progIDTF, glGetProgrami(progIDTF, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to link shader program."); + } + + glUseProgram(progIDTF); + + ballSizeLoc = glGetUniformLocation(progIDTF, "ballSize"); + deltaLoc = glGetUniformLocation(progIDTF, "delta"); + + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + // ----------------- + + this.vshID = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(this.vshID, "void main(void) {\n" + + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + + "}"); + glCompileShader(this.vshID); + if ( glGetShaderi(this.vshID, GL_COMPILE_STATUS) == GL_FALSE ) { + System.out.println(glGetShaderInfoLog(this.vshID, glGetShaderi(this.vshID, GL_INFO_LOG_LENGTH))); + throw new RuntimeException("Failed to compile vertex shader."); + } + + createProgram(); + } + + public void updateBallSize() { + glUseProgram(progIDTF); + glUniform1f(ballSizeLoc, ballSize * 0.5f); + + glUseProgram(progID); + super.updateBallSize(); + } + + private void doUpdateBalls(final int count) { + final Random random = new Random(); + + final Sprite newSprites = Sprite.malloc(count); + if ( sprites != null ) { + sprites.view = 0; + sprites.copyRange(newSprites, Math.min(count, spriteCount)); + } + + if ( count > spriteCount ) { + for ( int i = spriteCount; i < count; i++ ) { + newSprites.view = i; + + newSprites.x = (int)(random.nextFloat() * (SCREEN_WIDTH - ballSize) + ballSize * 0.5f); + newSprites.y = (int)(random.nextFloat() * (SCREEN_HEIGHT - ballSize) + ballSize * 0.5f); + newSprites.dx = random.nextFloat() * 0.4f - 0.2f; + newSprites.dy = random.nextFloat() * 0.4f - 0.2f; + } + } + + sprites = newSprites; + spriteCount = count; + } + + public void updateBalls(final int count) { + if ( tfVBO[0] != 0 ) { + // Fetch current animation state + glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sprites.backingByteBuffer()); + } + + doUpdateBalls(count); + + if ( tfVBO[0] != 0 ) { + for ( int i = 0; i < tfVBO.length; i++ ) + glDeleteBuffers(tfVBO[i]); + } + + for ( int i = 0; i < tfVBO.length; i++ ) { + tfVBO[i] = glGenBuffers(); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tfVBO[i]); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sprites.backingByteBuffer(), GL_STATIC_DRAW); + } + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[0]); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + } + + public void render(final boolean render, final boolean animate, final int delta) { + if ( animate ) { + glUseProgram(progIDTF); + glUniform1f(deltaLoc, delta); + + final int vbo = currVBO; + currVBO = 1 - currVBO; + + glBindBuffer(GL_ARRAY_BUFFER, tfVBO[vbo]); + glVertexPointer(4, GL_FLOAT, 0, 0); + + glEnable(GL_RASTERIZER_DISCARD); + if ( GLContext.getCapabilities().OpenGL30 ) { + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedback(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount); + glEndTransformFeedback(); + } else { + glBindBufferBaseEXT(GL_TRANSFORM_FEEDBACK_BUFFER_EXT, 0, tfVBO[1 - vbo]); + + glBeginTransformFeedbackEXT(GL_POINTS); + glDrawArrays(GL_POINTS, 0, ballCount); + glEndTransformFeedbackEXT(); + } + glDisable(GL_RASTERIZER_DISCARD); + + glUseProgram(progID); + glVertexPointer(2, GL_FLOAT, (4 * 4), 0); + } + + if ( render ) + glDrawArrays(GL_POINTS, 0, ballCount); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/StreamVBO.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/StreamVBO.java new file mode 100644 index 0000000..933c513 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengl/sprites/StreamVBO.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengl.sprites; + +import org.lwjgl.LWJGLUtil; + +import java.nio.ByteBuffer; + +import static java.lang.Math.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * This class implements VBO orphaning, useful for streaming + * dynamically generated geometry to the GPU. OpenGL 3.0 or + * higher is required. See + * {@url http://www.opengl.org/wiki/Buffer_Object_Streaming} + * under "Buffer update" for details. + * + * @author Spasi + */ +public class StreamVBO { + + private final int target; + private final long size; + private final int padding; + + private int ID; + + private long cursor; + + public StreamVBO(final int target, final int size) { + this(target, size, 64); + } + + public StreamVBO(final int target, final int size, final int padding) { + this.target = target; + this.padding = padding; + this.size = max(pad(size), padding); + + ID = glGenBuffers(); + + glBindBuffer(target, ID); + glBufferData(target, this.size, GL_STREAM_DRAW); + } + + public int getTarget() { + return target; + } + + public int getID() { + return ID; + } + + public long getSize() { + return size; + } + + public int getPadding() { + return padding; + } + + public void bind() { + glBindBuffer(target, ID); + } + + public void init(final int offset, final ByteBuffer data) { + glBufferSubData(target, offset, data); + } + + public void unmap() { + glUnmapBuffer(target); + } + + public void destroy() { + glBindBuffer(target, 0); + glDeleteBuffers(ID); + } + + public void reset() { + // Orphan current buffer and allocate a new one + glBufferData(target, size, GL_STREAM_DRAW); + // Flush + cursor = 0; + } + + public ByteBuffer map(final int bytes) { + return map(bytes, null); + } + + public ByteBuffer map(final int bytes, final ByteBuffer old_buffer) { + return doMap(pad(bytes), old_buffer); + } + + private int pad(int size) { + final int mod = size % padding; + if ( mod == 0 ) + return size; + + return size + padding - mod; + } + + private ByteBuffer doMap(final int bytes, final ByteBuffer old_buffer) { + if ( LWJGLUtil.CHECKS && size < bytes ) + throw new IllegalArgumentException(Integer.toString(bytes)); + + if ( size < cursor + bytes ) + reset(); + + final ByteBuffer map = glMapBufferRange(target, cursor, bytes, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, old_buffer); + cursor += bytes; + return map; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/FullScreenWindowedTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/FullScreenWindowedTest.java new file mode 100644 index 0000000..b674f49 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/FullScreenWindowedTest.java @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.test.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengles.PixelFormat; +import org.lwjgl.opengles.PowerManagementEventException; +import org.lwjgl.util.vector.Vector2f; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.test.opengles.util.GLMatrix.*; + +/** + * Tests switching between windowed and fullscreen + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 3172 $ + * $Id: FullScreenWindowedTest.java 3172 2008-12-28 19:30:43Z elias_naur $ + */ +public class FullScreenWindowedTest { + + /** Intended deiplay mode */ + private DisplayMode mode; + /** our quad moving around */ + private Vector2f quadPosition; + /** our quadVelocity */ + private Vector2f quadVelocity; + /** angle of quad */ + private float angle; + /** degrees to rotate per frame */ + private float angleRotation = 1.0f; + /** Max speed of all changable attributes */ + private static final float MAX_SPEED = 20.0f; + + private static int buffer_id; + private static int indices_buffer_id; + + private QuadRenderer renderer; + + /** Creates a FullScreenWindowedTest */ + public FullScreenWindowedTest() { + } + + /** Executes the test */ + public void execute() { + initialize(); + mainLoop(); + cleanup(); + } + + private void switchMode() throws LWJGLException { + mode = findDisplayMode(1024, 600, Display.getDisplayMode().getBitsPerPixel()); + try { + Display.setDisplayModeAndFullscreen(mode); + } catch (PowerManagementEventException e) { + e.printStackTrace(); + } + } + + /** Initializes the test */ + private void initialize() { + try { + //find displaymode + switchMode(); + + quadPosition = new Vector2f(100f, 100f); + quadVelocity = new Vector2f(1.0f, 1.0f); + + reinit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void reinit() throws LWJGLException { + Display.create(new PixelFormat()); + glInit(); + renderer = new QuadRenderer(); + } + + /** Runs the main loop of the "test" */ + private void mainLoop() { + while ( !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) && !Display.isCloseRequested() ) { + if ( Display.isVisible() ) { + // check keyboard input + processKeyboard(); + // do "game" logic, and render it + logic(); + render(); + } else { + // no need to render/paint if nothing has changed (ie. window + // dragged over) + if ( Display.isDirty() ) { + render(); + } + // don't waste cpu time, sleep more + try { + Thread.sleep(100); + } catch (InterruptedException inte) { + } + } + // Update window + try { + Display.update(); + Display.sync(60); + } catch (PowerManagementEventException e) { + e.printStackTrace(); + } + } + } + + /** Performs the logic */ + private void logic() { + angle += angleRotation; + if ( angle > 90.0f ) { + angle = 0.0f; + } + quadPosition.x += quadVelocity.x; + quadPosition.y += quadVelocity.y; + //check colision with vertical border border + if ( quadPosition.x + 50 >= mode.getWidth() || quadPosition.x - 50 <= 0 ) { + quadVelocity.x *= -1; + } + //check collision with horizontal border + if ( quadPosition.y + 50 >= mode.getHeight() || quadPosition.y - 50 <= 0 ) { + quadVelocity.y *= -1; + } + } + + private void render() { + //clear background + glClear(GL_COLOR_BUFFER_BIT); + // draw white quad + glPushMatrix(); + { + glTranslatef(quadPosition.x, quadPosition.y, 0); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + + renderer.setMVPUniform(); + + glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0); + } + glPopMatrix(); + } + + /** Processes keyboard input */ + private void processKeyboard() { + //check for fullscreen key + if ( Keyboard.isKeyDown(Keyboard.KEY_F) ) { + try { + cleanup(); + + switchMode(); + + reinit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for window key + if ( Keyboard.isKeyDown(Keyboard.KEY_W) ) { + try { + cleanup(); + + mode = new DisplayMode(800, 480); + Display.setDisplayModeAndFullscreen(mode); + + reinit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + //check for speed changes + if ( Keyboard.isKeyDown(Keyboard.KEY_UP) ) { + quadVelocity.y += 0.1f; + } + if ( Keyboard.isKeyDown(Keyboard.KEY_DOWN) ) { + quadVelocity.y -= 0.1f; + } + if ( Keyboard.isKeyDown(Keyboard.KEY_RIGHT) ) { + quadVelocity.x += 0.1f; + } + if ( Keyboard.isKeyDown(Keyboard.KEY_LEFT) ) { + quadVelocity.x -= 0.1f; + } + if ( Keyboard.isKeyDown(Keyboard.KEY_ADD) ) { + angleRotation += 0.1f; + } + if ( Keyboard.isKeyDown(Keyboard.KEY_SUBTRACT) ) { + angleRotation -= 0.1f; + } + //throttle + if ( quadVelocity.x < -MAX_SPEED ) { + quadVelocity.x = -MAX_SPEED; + } + if ( quadVelocity.x > MAX_SPEED ) { + quadVelocity.x = MAX_SPEED; + } + if ( quadVelocity.y < -MAX_SPEED ) { + quadVelocity.y = -MAX_SPEED; + } + if ( quadVelocity.y > MAX_SPEED ) { + quadVelocity.y = MAX_SPEED; + } + if ( angleRotation < 0.0f ) { + angleRotation = 0.0f; + } + if ( angleRotation > MAX_SPEED ) { + angleRotation = MAX_SPEED; + } + } + + /** Cleans up the test */ + private void cleanup() { + renderer.cleanup(); + + IntBuffer int_buffer = BufferUtils.createIntBuffer(2); + int_buffer.put(0, buffer_id); + int_buffer.put(1, indices_buffer_id); + + glDeleteBuffers(int_buffer); + + Display.destroy(); + } + + /** + * Retrieves a displaymode, if one such is available + * + * @param width Required width + * @param height Required height + * @param bpp Minimum required bits per pixel + * + * @return + */ + private static DisplayMode findDisplayMode(int width, int height, int bpp) throws LWJGLException { + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( int i = 0; i < modes.length; i++ ) { + if ( modes[i].getWidth() == width && modes[i].getHeight() == height && modes[i].getBitsPerPixel() >= bpp && modes[i].getFrequency() <= 60 ) { + return modes[i]; + } + } + return Display.getDesktopDisplayMode(); + } + + /** Initializes OGL */ + private void glInit() { + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, mode.getWidth(), 0, mode.getHeight(), -1.0f, 1.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glViewport(0, 0, mode.getWidth(), mode.getHeight()); + //set clear color to black + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + //sync frame (only works on windows) + Display.setVSyncEnabled(true); + + final IntBuffer int_buffer = BufferUtils.createIntBuffer(2); + glGenBuffers(int_buffer); + buffer_id = int_buffer.get(0); + indices_buffer_id = int_buffer.get(1); + + glBindBuffer(GL_ARRAY_BUFFER, buffer_id); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_id); + + final FloatBuffer vertices = BufferUtils.createFloatBuffer(2 * 4); + vertices + .put(-50).put(-50) + .put(50).put(-50) + .put(-50).put(50) + .put(50).put(50); + vertices.rewind(); + + final IntBuffer indices = BufferUtils.createIntBuffer(4); + indices.put(0).put(1).put(2).put(3); + indices.rewind(); + + glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW); + } + + /** Test entry point */ + public static void main(String[] args) { + System.out.println("Change between fullscreen and windowed mode, by pressing F and W respectively"); + System.out.println("Move quad using arrowkeys, and change rotation using +/-"); + FullScreenWindowedTest fswTest = new FullScreenWindowedTest(); + fswTest.execute(); + System.exit(0); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/Gears.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/Gears.java new file mode 100644 index 0000000..58994ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/Gears.java @@ -0,0 +1,580 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * 3-D gear wheels. Originally by Brian Paul + */ +package org.lwjgl.test.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengles.*; +import org.lwjgl.test.opengles.util.Geometry; +import org.lwjgl.test.opengles.util.ImmediateModeBuffer; +import org.lwjgl.test.opengles.util.Shader; +import org.lwjgl.test.opengles.util.ShaderProgram; +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; + +import java.lang.reflect.Field; +import java.nio.FloatBuffer; +import java.util.StringTokenizer; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.test.opengles.util.GLLight.*; +import static org.lwjgl.test.opengles.util.GLMatrix.*; +import static org.lwjgl.test.opengles.util.Geometry.*; + +/** + * <p> + * This is the OpenGL "standard" Gears demo, originally by Brian Paul + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 3276 $ + * $Id: Gears.java 3276 2010-02-21 21:18:17Z matzon $ + */ +public class Gears { + + private boolean run = true; + + private float view_rotx = 20.0f; + + private float view_roty = 30.0f; + + private float view_rotz = 0.0f; + + private Gear gear1; + + private Gear gear2; + + private Gear gear3; + + private float angle = 0.0f; + + private Shader vsh; + private Shader fsh; + + private ShaderProgram program; + + private int LIGHT_POS; + + private int MVP; + private int NM; + + private int GEAR_COLOR; + + private int vPosition; + private int vNormal; + + private final Matrix4f p = new Matrix4f(); + private final Matrix4f mv = new Matrix4f(); + private final Matrix4f mvp = new Matrix4f(); + + private final FloatBuffer m4fBuffer = BufferUtils.createFloatBuffer(4 * 4); + private final FloatBuffer m3fBuffer = BufferUtils.createFloatBuffer(3 * 3); + + public static void main(String[] args) { + new Gears().execute(); + System.exit(0); + } + + /** + * + */ + private void execute() { + try { + init(); + } catch (LWJGLException e) { + e.printStackTrace(); + System.out.println("Failed to initialize Gears."); + return; + } + + System.out.println("\nGL RENDERER: " + glGetString(GL_RENDERER)); + System.out.println("GL VENDOR: " + glGetString(GL_VENDOR)); + System.out.println("GL VERSION: " + glGetString(GL_VERSION)); + System.out.println("GL_SHADING_LANGUAGE_VERSION: " + glGetString(GL_SHADING_LANGUAGE_VERSION)); + System.out.println("GL_EXTENSIONS = " + glGetString(GL_EXTENSIONS)); + + ContextCapabilities caps = GLContext.getCapabilities(); + + System.out.println(); + + // Check extension support + Field[] field = ContextCapabilities.class.getFields(); + for ( Field f : field ) { + if ( f.getName().startsWith("GL_") ) { + try { + System.out.println(f.getName() + " - " + f.getBoolean(caps)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + System.out.println(); + + // Check for extensions that LWJGL does not support + final String extensions = glGetString(GL_EXTENSIONS); + + final StringTokenizer tokenizer = new StringTokenizer(extensions); + while ( tokenizer.hasMoreTokens() ) { + final String ext = tokenizer.nextToken(); + try { + if ( !caps.getClass().getField(ext).getBoolean(caps) ) + System.out.println("-- Extension exposed but functions are missing: " + ext); + } catch (NoSuchFieldException e) { + System.out.println("-- No LWJGL support for extension: " + ext); + } catch (Exception e) { + e.printStackTrace(); + } + } + + loop(); + + destroy(); + } + + /** + * + */ + private void destroy() { + program.destroy(); + + fsh.destroy(); + vsh.destroy(); + + gear3.destroy(); + gear2.destroy(); + gear1.destroy(); + + Display.destroy(); + } + + /** + * + */ + private void loop() { + long lastFrameTime = Sys.getTime(); + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while ( run ) { + if ( !Display.isVisible() ) + Thread.yield(); + else { + // This is the current frame time. + long frameStart = Sys.getTime(); + + // How many seconds passed since last frame. + final float frameTime = (float)((frameStart - lastFrameTime) / (double)Sys.getTimerResolution()); + lastFrameTime = frameStart; + + angle += frameTime * 120.0f; + + handleInput(); + + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_COVERAGE_BUFFER_BIT_NV); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + glPushMatrix(); + glTranslatef(-3.0f, -2.0f, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + gear1.render(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1f, -2.0f, 0.0f); + glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + gear2.render(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1f, 4.2f, 0.0f); + glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + gear3.render(); + glPopMatrix(); + + glPopMatrix(); + + try { + Display.update(); + //Display.sync(60); + } catch (PowerManagementEventException e) { + e.printStackTrace(); + } + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in " + (timeUsed / 1000f) + " seconds = " + (fps / (timeUsed / 1000f))); + fps = 0; + } + + if ( Display.isCloseRequested() ) + break; + } + } + } + + private void handleInput() { + if ( Keyboard.getNumKeyboardEvents() != 0 ) { + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + final int key = Keyboard.getEventKey(); + switch ( key ) { + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + + while ( Mouse.next() ) ; + } + + /** + * + */ + private void init() throws LWJGLException { + final int WIDTH = 640; + final int HEIGHT = 480; + + Display.setLocation((Display.getDisplayMode().getWidth() - WIDTH) / 2, + (Display.getDisplayMode().getHeight() - HEIGHT) / 2); + try { + Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); + } catch (PowerManagementEventException e) { + e.printStackTrace(); + } + Display.setTitle("Gears"); + Display.create(new PixelFormat()); + + //glCoverageMaskNV(true); + + // setup ogl + glViewport(0, 0, WIDTH, HEIGHT); + glFrontFace(GL_CCW); + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + final Vector3f lp = new Vector3f(5.0f, 5.0f, 10.0f); + lp.normalise(); + glLight(GL_LIGHT0, GL_POSITION, lp.getX(), lp.getY(), lp.getZ(), 0.0f); + + /* make the gears */ + gear1 = new Gear(gear(1.0f, 4.0f, 1.0f, 20, 0.7f), new float[] { 0.8f, 0.1f, 0.0f, 1.0f }); + gear2 = new Gear(gear(0.5f, 2.0f, 2.0f, 10, 0.7f), new float[] { 0.0f, 0.8f, 0.2f, 1.0f }); + gear3 = new Gear(gear(1.3f, 2.0f, 0.5f, 10, 0.7f), new float[] { 0.2f, 0.2f, 1.0f, 1.0f }); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + final float h = (float)300 / (float)300; + glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, -40.0f); + + vsh = new Shader(GL_VERTEX_SHADER, "uniform highp vec4 LIGHT_POS;\n" + + "uniform highp mat4 MODEL_VIEW_PROJECTION_MATRIX;\n" + + "uniform mediump mat3 NORMAL_MATRIX;\n" + + "uniform lowp vec3 GEAR_COLOR;\n" + + "attribute highp vec3 vPosition;\n" + + "attribute mediump vec3 vNormal;\n" + + "varying lowp vec3 color;\n" + + "void main(void) {\n" + + "\tgl_Position = MODEL_VIEW_PROJECTION_MATRIX * vec4(vPosition, 1.0);\n" + + "\tvec3 normal = NORMAL_MATRIX * vNormal;\n" + + "\tcolor = max(dot(normal, vec3(LIGHT_POS)), 0.0) * GEAR_COLOR + vec3(0.05);\n" + + "}"); + + fsh = new Shader(GL_FRAGMENT_SHADER, "varying lowp vec3 color;\n" + + "void main(void) {\n" + + "\tgl_FragColor = vec4(color, 1.0);\n" + + "}"); + + program = new ShaderProgram(vsh, fsh); + program.enable(); + + LIGHT_POS = program.getUniformLocation("LIGHT_POS"); + + MVP = program.getUniformLocation("MODEL_VIEW_PROJECTION_MATRIX"); + NM = program.getUniformLocation("NORMAL_MATRIX"); + + GEAR_COLOR = program.getUniformLocation("GEAR_COLOR"); + + vPosition = program.getAttributeLocation("vPosition"); + vNormal = program.getAttributeLocation("vNormal"); + + glEnableVertexAttribArray(vNormal); + glEnableVertexAttribArray(vPosition); + } + + /** + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * @param inner_radius radius of hole at center + * @param outer_radius radius at center of teeth + * @param width width of gear + * @param teeth number of teeth + * @param tooth_depth depth of tooth + */ + private static Geometry gear(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth) { + int i; + float r0, r1, r2; + float angle, da; + float u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0f; + r2 = outer_radius + tooth_depth / 2.0f; + + da = 2.0f * (float)Math.PI / teeth / 4.0f; + + final Geometry gear = new Geometry(); + final ImmediateModeBuffer imb = new ImmediateModeBuffer(1024); + int lastDrawIndex = 0; + + //glShadeModel(GL_FLAT); + + // draw front face + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, teeth * 4 + 2); + for ( i = 0; i <= teeth; i++ ) { + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5f); + + if ( i < teeth ) { + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle + 3.0f * da), r1 * sin(angle + 3.0f * da), width * 0.5f); + } + } + + // draw front sides of teeth + for ( i = 0; i < teeth; i++ ) { + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, 4); + + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle + 3.0f * da), r1 * sin(angle + 3.0f * da), width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r2 * cos(angle + 2.0f * da), r2 * sin(angle + 2.0f * da), width * 0.5f); + } + + // draw back face + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, (teeth + 1) * 4); + for ( i = 0; i <= teeth; i++ ) { + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5f); + } + + // draw back sides of teeth + for ( i = 0; i < teeth; i++ ) { + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, 4); + + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5f); + + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5f); + } + + // draw outward faces of teeth + // OpenGL ES 2.0 note: This needs to be converted to a triangle + // list with face normals to get the flat look of the original. + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, teeth * 8 + 2); + for ( i = 0; i < teeth; i++ ) { + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(cos(angle), sin(angle), 0.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5f); + + imb.glNormal3f(cos(angle), sin(angle), 0.0f); + imb.glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5f); + + u = r2 * cos(angle + da) - r1 * cos(angle); + v = r2 * sin(angle + da) - r1 * sin(angle); + len = (float)Math.sqrt(u * u + v * v); + u /= len; + v /= len; + + imb.glNormal3f(v, -u, 0.0f); + imb.glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5f); + + imb.glNormal3f(v, -u, 0.0f); + imb.glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5f); + + imb.glNormal3f(cos(angle), sin(angle), 0.0f); + imb.glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5f); + + imb.glNormal3f(cos(angle), sin(angle), 0.0f); + imb.glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5f); + + u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); + v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); + + imb.glNormal3f(v, -u, 0.0f); + imb.glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5f); + + imb.glNormal3f(v, -u, 0.0f); + imb.glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5f); + } + imb.glNormal3f(cos(0), sin(0), 0.0f); + imb.glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5f); + + imb.glNormal3f(cos(0), sin(0), 0.0f); + imb.glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5f); + + //glShadeModel(GL_SMOOTH); + + // draw inside radius cylinder + lastDrawIndex += gear.addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, (teeth + 1) * 2); + for ( i = 0; i <= teeth; i++ ) { + angle = i * 2.0f * (float)Math.PI / teeth; + + imb.glNormal3f(-cos(angle), -sin(angle), 0.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5f); + + imb.glNormal3f(-cos(angle), -sin(angle), 0.0f); + imb.glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5f); + } + + gear.update(imb.getBuffer()); + return gear; + } + + private class Gear { + + private final Geometry geom; + + private final float[] color; + + Gear(final Geometry geom, final float[] color) { + this.geom = geom; + this.color = color; + } + + void render() { + // Set gear color + glUniform3f(GEAR_COLOR, color[0], color[1], color[2]); + + // Set Light position + setUniform4f(LIGHT_POS, GL_LIGHT0, GL_POSITION); + + // Get Projection and Modelview matrices + glMatrixMode(GL_PROJECTION); + glGetMatrix(p); + + glMatrixMode(GL_MODELVIEW); + glGetMatrix(mv); + + // Set MVP uniform + Matrix4f.mul(p, mv, mvp); + mvp.store(m4fBuffer); + m4fBuffer.flip(); + glUniformMatrix4(MVP, false, m4fBuffer); + + // Set normal matrix (upper-left 3x3 of the inverse transpose MV matrix) + mv.invert(); + mv.transpose(); + mv.store3f(m3fBuffer); + m3fBuffer.flip(); + glUniformMatrix3(NM, false, m3fBuffer); + + geom.bind(); + + final int stride = (3 + 3) * 4; + glVertexAttribPointer(vNormal, 3, GL_FLOAT, false, stride, 0); + glVertexAttribPointer(vPosition, 3, GL_FLOAT, false, stride, 3 * 4); + + geom.draw(); + } + + void destroy() { + geom.destroy(); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/MappedIndexedVBOTest.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/MappedIndexedVBOTest.java new file mode 100644 index 0000000..ac011f5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/MappedIndexedVBOTest.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: VBOIndexTest.java 2983 2008-04-07 18:36:09Z matzon $ + * + * Simple java test program. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + */ + +package org.lwjgl.test.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.Sys; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.DisplayMode; +import org.lwjgl.opengles.GLContext; +import org.lwjgl.opengles.PixelFormat; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.opengles.OESMapbuffer.*; +import static org.lwjgl.test.opengles.util.GLMatrix.*; + +public final class MappedIndexedVBOTest { + + static { + try { + //find first display mode that allows us 640*480*16 + int mode = -1; + DisplayMode[] modes = Display.getAvailableDisplayModes(); + for ( int i = 0; i < modes.length; i++ ) { + if ( modes[i].getWidth() == 640 + && modes[i].getHeight() == 480 + && modes[i].getBitsPerPixel() >= 16 ) { + mode = i; + break; + } + } + if ( mode != -1 ) { + //select above found displaymode + System.out.println("Setting display mode to " + modes[mode]); + Display.setDisplayMode(modes[mode]); + System.out.println("Created display."); + } + } catch (Exception e) { + System.err.println("Failed to create display due to " + e); + } + } + + static { + try { + Display.create(new PixelFormat()); + System.out.println("Created OpenGL."); + + if ( !GLContext.getCapabilities().GL_OES_mapbuffer ) { + System.out.println("GL_OES_mapbuffer is not supported, quitting!"); + System.exit(0); + } + } catch (Exception e) { + System.err.println("Failed to create OpenGL due to " + e); + System.exit(1); + } + } + + /** Is the game finished? */ + private static boolean finished; + + /** A rotating square! */ + private static float angle; + private static int buffer_id; + private static int indices_buffer_id; + private static FloatBuffer vertices; + private static ByteBuffer mapped_buffer; + private static FloatBuffer mapped_float_buffer; + private static IntBuffer indices; + private static ByteBuffer mapped_indices_buffer; + private static IntBuffer mapped_indices_int_buffer; + + private static QuadRenderer renderer; + + public static void main(String[] arguments) { + try { + init(); + while ( !finished ) { + Display.update(); + Display.sync(30); + + if ( !Display.isVisible() ) + Thread.sleep(200); + else if ( Display.isCloseRequested() ) + System.exit(0); + + mainLoop(); + render(); + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + cleanup(); + } + System.exit(0); + } + + /** All calculations are done in here */ + private static void mainLoop() { + angle += 1f; + if ( angle > 360.0f ) + angle = 0.0f; + + if ( Mouse.getDX() != 0 || Mouse.getDY() != 0 || Mouse.getDWheel() != 0 ) + System.out.println("Mouse moved " + Mouse.getDX() + " " + Mouse.getDY() + " " + Mouse.getDWheel()); + for ( int i = 0; i < Mouse.getButtonCount(); i++ ) + if ( Mouse.isButtonDown(i) ) + System.out.println("Button " + i + " down"); + if ( Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) ) + finished = true; + for ( int i = 0; i < Keyboard.getNumKeyboardEvents(); i++ ) { + Keyboard.next(); + if ( Keyboard.getEventKey() == Keyboard.KEY_ESCAPE && Keyboard.getEventKeyState() ) + finished = true; + if ( Keyboard.getEventKey() == Keyboard.KEY_T && Keyboard.getEventKeyState() ) + System.out.println("Current time: " + Sys.getTime()); + } + } + + /** All rendering is done in here */ + private static void render() { + glClear(GL_COLOR_BUFFER_BIT); + + glPushMatrix(); + glTranslatef(Display.getDisplayMode().getWidth() / 2, Display.getDisplayMode().getHeight() / 2, 0.0f); + glRotatef(angle, 0, 0, 1.0f); + + renderer.setMVPUniform(); + + ByteBuffer new_mapped_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES, mapped_buffer); + if ( new_mapped_buffer != mapped_buffer ) { + mapped_buffer = new_mapped_buffer; + mapped_float_buffer = new_mapped_buffer.asFloatBuffer(); + } + + new_mapped_buffer = glMapBufferOES(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY_OES, mapped_indices_buffer); + if ( new_mapped_buffer != mapped_indices_buffer ) { + mapped_indices_buffer = new_mapped_buffer; + mapped_indices_int_buffer = new_mapped_buffer.asIntBuffer(); + } + + mapped_float_buffer.rewind(); + vertices.rewind(); + mapped_float_buffer.put(vertices); + + mapped_indices_int_buffer.rewind(); + indices.rewind(); + mapped_indices_int_buffer.put(indices); + if ( glUnmapBufferOES(GL_ARRAY_BUFFER) && + glUnmapBufferOES(GL_ELEMENT_ARRAY_BUFFER) ) { + glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0); + } + + glPopMatrix(); + } + + /** Initialize */ + private static void init() throws Exception { + System.out.println("Timer resolution: " + Sys.getTimerResolution()); + + // Go into orthographic projection mode. + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, Display.getDisplayMode().getWidth(), 0, Display.getDisplayMode().getHeight(), -1.0f, 1.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + final IntBuffer int_buffer = BufferUtils.createIntBuffer(2); + glGenBuffers(int_buffer); + buffer_id = int_buffer.get(0); + indices_buffer_id = int_buffer.get(1); + + glBindBuffer(GL_ARRAY_BUFFER, buffer_id); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_id); + + vertices = BufferUtils.createFloatBuffer(2 * 4); + vertices + .put(-50).put(-50) + .put(50).put(-50) + .put(-50).put(50) + .put(50).put(50); + vertices.rewind(); + + indices = BufferUtils.createIntBuffer(4); + indices.put(0).put(1).put(2).put(3); + indices.rewind(); + + glBufferData(GL_ARRAY_BUFFER, 2 * 4 * 4, GL_STREAM_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * 4, GL_STREAM_DRAW); + + renderer = new QuadRenderer(); + } + + /** Cleanup */ + private static void cleanup() { + renderer.cleanup(); + + IntBuffer int_buffer = BufferUtils.createIntBuffer(2); + int_buffer.put(0, buffer_id); + int_buffer.put(1, indices_buffer_id); + + glDeleteBuffers(int_buffer); + + Display.destroy(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/QuadRenderer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/QuadRenderer.java new file mode 100644 index 0000000..27a1ef6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/QuadRenderer.java @@ -0,0 +1,70 @@ +package org.lwjgl.test.opengles; + +import org.lwjgl.BufferUtils; +import org.lwjgl.test.opengles.util.Shader; +import org.lwjgl.test.opengles.util.ShaderProgram; +import org.lwjgl.util.vector.Matrix4f; + +import java.nio.FloatBuffer; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.test.opengles.util.GLMatrix.*; + +final class QuadRenderer { + + private final Shader vsh; + private final Shader fsh; + private final ShaderProgram program; + + private final int uniMVP; + + private final Matrix4f p = new Matrix4f(); + private final Matrix4f mv = new Matrix4f(); + private final Matrix4f mvp = new Matrix4f(); + + private final FloatBuffer m4fBuffer = BufferUtils.createFloatBuffer(4 * 4); + + QuadRenderer() { + vsh = new Shader(GL_VERTEX_SHADER, "uniform highp mat4 MODEL_VIEW_PROJECTION_MATRIX;\n" + + "attribute highp vec2 vPosition;\n" + + "void main(void) {\n" + + "\tgl_Position = MODEL_VIEW_PROJECTION_MATRIX * vec4(vPosition, 0.0, 1.0);\n" + + "}"); + + fsh = new Shader(GL_FRAGMENT_SHADER, "void main(void) {\n" + + "\tgl_FragColor = vec4(1.0);\n" + + "}"); + + program = new ShaderProgram(vsh, fsh); + program.enable(); + + uniMVP = program.getUniformLocation("MODEL_VIEW_PROJECTION_MATRIX"); + + final int vPosition = program.getAttributeLocation("vPosition"); + glVertexAttribPointer(vPosition, 2, GL_FLOAT, false, 0, 0); + glEnableVertexAttribArray(vPosition); + } + + void setMVPUniform() { + // Get Projection and Modelview matrices + glMatrixMode(GL_PROJECTION); + glGetMatrix(p); + + glMatrixMode(GL_MODELVIEW); + glGetMatrix(mv); + + // Set MVP uniform + Matrix4f.mul(p, mv, mvp); + mvp.store(m4fBuffer); + m4fBuffer.flip(); + glUniformMatrix4(uniMVP, false, m4fBuffer); + } + + void cleanup() { + program.destroy(); + + fsh.destroy(); + vsh.destroy(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObject.java new file mode 100644 index 0000000..ea15141 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObject.java @@ -0,0 +1,99 @@ +package org.lwjgl.test.opengles.util; + +import java.nio.*; + +import static org.lwjgl.opengles.GLES20.*; +import static org.lwjgl.opengles.OESMapbuffer.*; + +abstract class BufferObject implements GLObject { + + protected final int ID; + + protected int target; + protected int usage; + + /** The BufferObject data size in bytes. */ + private int size; + + protected BufferObject(final int type, final int usage) { + this.ID = glGenBuffers(); + this.target = type; + this.usage = usage; + } + + protected BufferObject(final int type, final int usage, final Buffer buffer) { + this(type, usage); + setData(buffer); + } + + protected BufferObject(final int type, final int usage, final int dataSize) { + this(type, usage); + setData(dataSize); + } + + public final int getID() { + return ID; + } + + public void destroy() { + glDeleteBuffers(ID); + } + + public final int getTarget() { + return target; + } + + public final int getUsage() { + return usage; + } + + public final int getSize() { + return size; + } + + public abstract void enable(); + + public abstract void disable(); + + public final void setData(final Buffer buffer) { + enable(); + + if ( buffer instanceof ByteBuffer ) { + glBufferData(target, (ByteBuffer)buffer, usage); + size = buffer.remaining(); + } else if ( buffer instanceof ShortBuffer ) { + glBufferData(target, (ShortBuffer)buffer, usage); + size = buffer.remaining() << 1; + } else if ( buffer instanceof IntBuffer ) { + glBufferData(target, (IntBuffer)buffer, usage); + size = buffer.remaining() << 2; + } else if ( buffer instanceof FloatBuffer ) { + glBufferData(target, (FloatBuffer)buffer, usage); + size = buffer.remaining() << 2; + } + + disable(); + } + + public final void setData(final int dataSize) { + enable(); + + glBufferData(target, dataSize, usage); + size = dataSize; + + disable(); + } + + public final ByteBuffer map(final int access, final ByteBuffer oldBuffer) { + return glMapBufferOES(target, access, oldBuffer); + } + + public final ByteBuffer map(final int access, final int length, final ByteBuffer oldBuffer) { + return glMapBufferOES(target, access, length, oldBuffer); + } + + public final boolean unmap() { + return glUnmapBufferOES(target); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectArray.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectArray.java new file mode 100644 index 0000000..05d1307 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectArray.java @@ -0,0 +1,41 @@ +package org.lwjgl.test.opengles.util; + +import java.nio.Buffer; + +import static org.lwjgl.opengles.GLES20.*; + +public final class BufferObjectArray extends BufferObject { + + private static int boundBOArray; + + public BufferObjectArray(final int usage) { + super(GL_ARRAY_BUFFER, usage); + } + + public BufferObjectArray(final int usage, final Buffer buffer) { + super(GL_ARRAY_BUFFER, usage, buffer); + } + + public BufferObjectArray(final int usage, final int dataSize) { + super(GL_ARRAY_BUFFER, usage, dataSize); + } + + public void enable() { + if ( boundBOArray != ID ) { + glBindBuffer(GL_ARRAY_BUFFER, ID); + boundBOArray = ID; + } + } + + public void disable() { + boArrayDisable(); + } + + public static void boArrayDisable() { + if ( boundBOArray != 0 ) { + glBindBuffer(GL_ARRAY_BUFFER, 0); + boundBOArray = 0; + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectElement.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectElement.java new file mode 100644 index 0000000..80952c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/BufferObjectElement.java @@ -0,0 +1,41 @@ +package org.lwjgl.test.opengles.util; + +import java.nio.Buffer; + +import static org.lwjgl.opengles.GLES20.*; + +public final class BufferObjectElement extends BufferObject { + + private static int boundBOElementArray; + + public BufferObjectElement(final int usage) { + super(GL_ELEMENT_ARRAY_BUFFER, usage); + } + + public BufferObjectElement(final int usage, final Buffer buffer) { + super(GL_ELEMENT_ARRAY_BUFFER, usage, buffer); + } + + public BufferObjectElement(final int usage, final int dataSize) { + super(GL_ELEMENT_ARRAY_BUFFER, usage, dataSize); + } + + public void enable() { + if ( boundBOElementArray != ID ) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ID); + boundBOElementArray = ID; + } + } + + public void disable() { + boElementArrayDisable(); + } + + public static void boElementArrayDisable() { + if ( boundBOElementArray != 0 ) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + boundBOElementArray = 0; + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLLight.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLLight.java new file mode 100644 index 0000000..7b5467c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLLight.java @@ -0,0 +1,165 @@ +package org.lwjgl.test.opengles.util; + +import static org.lwjgl.opengles.GLES20.*; + +/** Emulates the light state in fixed-function OpenGL. */ +public class GLLight { + + public static final int GL_LIGHT0 = 0x4000; + public static final int GL_LIGHT1 = 0x4001; + public static final int GL_LIGHT2 = 0x4002; + public static final int GL_LIGHT3 = 0x4003; + public static final int GL_LIGHT4 = 0x4004; + public static final int GL_LIGHT5 = 0x4005; + public static final int GL_LIGHT6 = 0x4006; + public static final int GL_LIGHT7 = 0x4007; + + public static final int GL_AMBIENT = 0x1200; + public static final int GL_DIFFUSE = 0x1201; + public static final int GL_SPECULAR = 0x1202; + public static final int GL_POSITION = 0x1203; + public static final int GL_SPOT_DIRECTION = 0x1204; + public static final int GL_SPOT_EXPONENT = 0x1205; + public static final int GL_SPOT_CUTOFF = 0x1206; + public static final int GL_CONSTANT_ATTENUATION = 0x1207; + public static final int GL_LINEAR_ATTENUATION = 0x1208; + public static final int GL_QUADRATIC_ATTENUATION = 0x1209; + + private static final Light[] lights = new Light[8]; + + static { + for ( int i = 0; i < lights.length; i++ ) + lights[i] = new Light(); + + System.arraycopy(new float[] { 1.0f, 1.0f, 1.0f, 1.0f }, 0, lights[0].diffuse, 0, 4); + System.arraycopy(new float[] { 1.0f, 1.0f, 1.0f, 1.0f }, 0, lights[0].specular, 0, 4); + } + + private GLLight() { + } + + public static void glLight(final int light, final int pname, final float v) { + if ( light < GL_LIGHT0 || GL_LIGHT7 < light ) + throw new IllegalArgumentException("Invalid light specified: " + light); + + final Light l = lights[light - GL_LIGHT0]; + + switch ( pname ) { + case GL_SPOT_EXPONENT: + l.s = v; + break; + case GL_SPOT_CUTOFF: + l.c = v; + break; + case GL_CONSTANT_ATTENUATION: + l.k0 = v; + break; + case GL_LINEAR_ATTENUATION: + l.k1 = v; + break; + case GL_QUADRATIC_ATTENUATION: + l.k2 = v; + break; + default: + throw new IllegalArgumentException("Invalid light parameter specified: " + pname); + } + } + + public static void glLight(final int light, final int pname, + final float x, final float y, final float z) { + if ( light < GL_LIGHT0 || GL_LIGHT7 < light ) + throw new IllegalArgumentException("Invalid light specified: " + light); + + if ( pname != GL_SPOT_DIRECTION ) + throw new IllegalArgumentException("Invalid light parameter specified: " + pname); + + final float[] param = lights[light - GL_LIGHT0].direction; + + param[0] = x; + param[1] = y; + param[2] = z; + } + + private static float[] getParam4f(final int light, final int pname) { + if ( light < GL_LIGHT0 || GL_LIGHT7 < light ) + throw new IllegalArgumentException("Invalid light specified: " + light); + + final Light l = lights[light - GL_LIGHT0]; + switch ( pname ) { + case GL_AMBIENT: + return l.ambient; + case GL_DIFFUSE: + return l.diffuse; + case GL_SPECULAR: + return l.specular; + case GL_POSITION: + return l.position; + default: + throw new IllegalArgumentException("Invalid light parameter specified: " + pname); + } + } + + public static void glLight(final int light, final int pname, + final float x, final float y, final float z, final float w) { + final float[] param = getParam4f(light, pname); + param[0] = x; + param[1] = y; + param[2] = z; + param[3] = w; + } + + public static void setUniform1f(final int location, final int light, final int pname) { + if ( light < GL_LIGHT0 || GL_LIGHT7 < light ) + throw new IllegalArgumentException("Invalid light specified: " + light); + + final Light l = lights[light - GL_LIGHT0]; + + switch ( pname ) { + case GL_SPOT_EXPONENT: + glUniform1f(location, l.s); + break; + case GL_SPOT_CUTOFF: + glUniform1f(location, l.c); + break; + case GL_CONSTANT_ATTENUATION: + glUniform1f(location, l.k0); + break; + case GL_LINEAR_ATTENUATION: + glUniform1f(location, l.k1); + break; + case GL_QUADRATIC_ATTENUATION: + glUniform1f(location, l.k2); + break; + default: + throw new IllegalArgumentException("Invalid light parameter specified: " + pname); + } + } + + public static void setUniform3f(final int location, final int light, final int pname) { + if ( pname != GL_SPOT_DIRECTION ) + throw new IllegalArgumentException("Invalid light parameter specified: " + pname); + + final float[] param = lights[light - GL_LIGHT0].direction; + glUniform3f(location, param[0], param[1], param[2]); + } + + public static void setUniform4f(final int location, final int light, final int pname) { + final float[] param = getParam4f(light, pname); + glUniform4f(location, param[0], param[1], param[2], param[3]); + } + + private static class Light { + + float[] ambient = { 0.0f, 0.0f, 0.0f, 1.0f }; + float[] diffuse = { 0.0f, 0.0f, 0.0f, 1.0f }; + float[] specular = { 0.0f, 0.0f, 0.0f, 1.0f }; + + float[] position = { 0.0f, 0.0f, 1.0f, 0.0f }; + float[] direction = { 0.0f, 0.0f, -1.0f }; + + float s, c = 180.0f; + float k0 = 1.0f, k1, k2; + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLMatrix.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLMatrix.java new file mode 100644 index 0000000..5ca8ab0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLMatrix.java @@ -0,0 +1,163 @@ +package org.lwjgl.test.opengles.util; + +import org.lwjgl.util.vector.Matrix4f; +import org.lwjgl.util.vector.Vector3f; + +import java.util.Stack; + +import static java.lang.Math.*; + +/** Emulates the matrix stack in fixed-function OpenGL. */ +public final class GLMatrix { + + public static final int GL_MODELVIEW = 0x1700; + public static final int GL_PROJECTION = 0x1701; + + private static final float PI = (float)Math.PI; + + /** The model/view matrix stack. */ + private static final Stack<Matrix4f> mvMatrixStack = new Stack<Matrix4f>(); + + /** The projection matrix stack. */ + private static final Stack<Matrix4f> pMatrixStack = new Stack<Matrix4f>(); + + private static final Matrix4f m4f = new Matrix4f(); + private static final Vector3f v3f = new Vector3f(); + + private static int mode = GL_MODELVIEW; + + static { + mvMatrixStack.push(new Matrix4f()); + pMatrixStack.push(new Matrix4f()); + } + + private GLMatrix() { + } + + private static Stack<Matrix4f> getCurrentStack() { + switch ( mode ) { + case GL_MODELVIEW: + return mvMatrixStack; + case GL_PROJECTION: + return pMatrixStack; + default: + return null; // Cannot happen + } + } + + private static Matrix4f getCurrentMatrix() { + return getCurrentStack().peek(); + } + + public static void glMatrixMode(final int mode) { + if ( mode != GL_MODELVIEW && mode != GL_PROJECTION ) + throw new IllegalArgumentException("Invalid matrix mode specified: " + mode); + + GLMatrix.mode = mode; + } + + public static void glPushMatrix() { + final Stack<Matrix4f> stack = getCurrentStack(); + stack.push(new Matrix4f(stack.peek())); + } + + public static void glPopMatrix() { + final Stack<Matrix4f> stack = getCurrentStack(); + + if ( stack.size() == 1 ) + throw new IllegalStateException("The last matrix in the stack cannot be popped."); + + getCurrentStack().pop(); + } + + public static void glLoadIdentity() { + final Matrix4f m = getCurrentMatrix(); + m.setIdentity(); + } + + public static void glLoadMatrix(final Matrix4f s) { + getCurrentMatrix().load(s); + } + + public static void glMultMatrix(final Matrix4f m) { + final Matrix4f c = getCurrentMatrix(); + Matrix4f.mul(c, m, c); + } + + public static void glTranslatef(final float x, final float y, final float z) { + final Matrix4f m = getCurrentMatrix(); + v3f.set(x, y, z); + m.translate(v3f); + } + + public static void glRotatef(final float angle, final float x, final float y, final float z) { + final Matrix4f m = getCurrentMatrix(); + v3f.set(x, y, z); + m.rotate((float)toRadians(angle), v3f); + } + + public static void glOrtho(final float l, final float r, final float b, final float t, final float n, final float f) { + final Matrix4f m = m4f; + m.setIdentity(); + + m.m00 = 2.0f / (r - l); + m.m30 = -(r + l) / (r - l); + + m.m11 = 2.0f / (t - b); + m.m31 = -(t + b) / (t - b); + + m.m22 = -2.0f / (f - n); + m.m32 = -(f + n) / (f - n); + + glMultMatrix(m); + } + + public static void glFrustum(final float l, final float r, final float b, final float t, final float n, final float f) { + final Matrix4f m = m4f; + m.setIdentity(); + + m.m00 = 2.0f * n / (r - l); + m.m20 = (r + l) / (r - l); + + m.m11 = 2.0f * n / (t - b); + m.m21 = (t + b) / (t - b); + + m.m22 = -(f + n) / (f - n); + m.m32 = -(2.0f * f * n) / (f - n); + + m.m23 = -1.0f; + m.m33 = 0.0f; + + glMultMatrix(m); + } + + public static void gluPerspective(final float fovy, final float aspect, final float zNear, final float zFar) { + final float radians = fovy / 2.0f * PI / 180.0f; + + final float deltaZ = zFar - zNear; + final float sine = (float)sin(radians); + + if ( (deltaZ == 0) || (sine == 0) || (aspect == 0) ) { + return; + } + + final float cotangent = (float)cos(radians) / sine; + + final Matrix4f m = m4f; + m.setIdentity(); + + m.m00 = cotangent / aspect; + m.m11 = cotangent; + m.m22 = -(zFar + zNear) / deltaZ; + m.m23 = -1.0f; + m.m32 = -2 * zNear * zFar / deltaZ; + m.m33 = 0.0f; + + glMultMatrix(m); + } + + public static void glGetMatrix(final Matrix4f d) { + d.load(getCurrentMatrix()); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLObject.java new file mode 100644 index 0000000..6286f1c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/GLObject.java @@ -0,0 +1,9 @@ +package org.lwjgl.test.opengles.util; + +public interface GLObject { + + int getID(); + + void destroy(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Geometry.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Geometry.java new file mode 100644 index 0000000..a200fa8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Geometry.java @@ -0,0 +1,78 @@ +package org.lwjgl.test.opengles.util; + +import org.lwjgl.test.opengles.util.BufferObjectArray; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; + +import static org.lwjgl.opengles.GLES20.*; + +public class Geometry { + + protected BufferObjectArray bo; + + protected final List<DrawCommand> drawCommands = new ArrayList<DrawCommand>(4); + + public Geometry() { + } + + public Geometry(final FloatBuffer buffer) { + update(buffer); + } + + public void update(final FloatBuffer buffer) { + if ( bo != null ) + destroy(); + + bo = new BufferObjectArray(GL_STATIC_DRAW, buffer); + } + + public void bind() { + bo.enable(); + } + + public void draw() { + for ( DrawCommand command : drawCommands ) + command.draw(); + } + + public void destroy() { + bo.destroy(); + bo = null; + + drawCommands.clear(); + } + + public int addDrawCommand(final int mode, final int first, final int count) { + drawCommands.add(new DrawCommand(mode, first, count)); + return count; + } + + public static float sin(final float r) { + return (float)Math.sin(r); + } + + public static float cos(final float r) { + return (float)Math.cos(r); + } + + protected static class DrawCommand { + + private int mode; + private int first; + private int count; + + private DrawCommand(final int mode, final int first, final int count) { + this.mode = mode; + this.first = first; + this.count = count; + } + + void draw() { + glDrawArrays(mode, first, count); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ImmediateModeBuffer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ImmediateModeBuffer.java new file mode 100644 index 0000000..8205405 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ImmediateModeBuffer.java @@ -0,0 +1,58 @@ +package org.lwjgl.test.opengles.util; + +import org.lwjgl.BufferUtils; + +import java.nio.FloatBuffer; + +/** + * Utility class that emulates immediate mode vertex data submission. + * Can be used to create VBO data. + */ +public final class ImmediateModeBuffer { + + private FloatBuffer buffer; + + public ImmediateModeBuffer(final int startSize) { + this.buffer = BufferUtils.createFloatBuffer(startSize); + } + + private void checkSize(final int count) { + while ( buffer.remaining() < count ) { + final FloatBuffer newBuffer = BufferUtils.createFloatBuffer(buffer.capacity() << 1); + buffer.flip(); + newBuffer.put(buffer); + buffer = newBuffer; + } + } + + public FloatBuffer getBuffer() { + buffer.flip(); + return buffer; + } + + public void glVertex2f(final float x, final float y) { + checkSize(2); + buffer.put(x).put(y); + } + + public void glVertex3f(final float x, final float y, final float z) { + checkSize(3); + buffer.put(x).put(y).put(z); + } + + public void glVertex4f(final float x, final float y, final float z, final float w) { + checkSize(4); + buffer.put(x).put(y).put(z).put(w); + } + + public void glNormal3f(final float x, final float y, final float z) { + checkSize(3); + buffer.put(x).put(y).put(z); + } + + public void glTexCoord2f(final float s, final float t) { + checkSize(2); + buffer.put(s).put(t); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Shader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Shader.java new file mode 100644 index 0000000..c377d3e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Shader.java @@ -0,0 +1,98 @@ +package org.lwjgl.test.opengles.util; + +import org.lwjgl.BufferUtils; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +import static org.lwjgl.opengles.GLES20.*; + +public class Shader implements GLObject { + + protected static ByteBuffer fileBuffer = BufferUtils.createByteBuffer(1024 * 10); + + private int type; + private int ID; + + public Shader() { + } + + public Shader(final int type, final CharSequence source) { + createFromSource(type, source); + } + + public int getID() { + return ID; + } + + public int getType() { + return type; + } + + public void destroy() { + if ( ID == 0 ) + throw new IllegalStateException("The shader has not been created"); + + glDeleteShader(ID); + ID = 0; + } + + public void createFromFile(final int type, final ClassLoader loader, final String file) throws IOException { + final InputStream inputStream = loader.getResourceAsStream(file); + + if ( inputStream == null ) + throw new IllegalArgumentException("A shader source file could not be found: " + file); + + final BufferedInputStream stream = new BufferedInputStream(inputStream); + + byte character; + while ( (character = (byte)stream.read()) != -1 ) + fileBuffer.put(character); + fileBuffer.flip(); + + stream.close(); + + final byte[] array = new byte[fileBuffer.remaining()]; + fileBuffer.get(array); + + final String source = new String(array); + + fileBuffer.clear(); + + createFromSource(type, source); + } + + public void createFromSource(final int type, final CharSequence source) { + if ( ID != 0 ) + throw new IllegalStateException("The shader has already been created"); + + this.type = type; + this.ID = glCreateShader(type); + + glShaderSource(ID, source); + + glCompileShader(ID); + + if ( glGetShaderi(ID, GL_COMPILE_STATUS) == GL_FALSE ) { + printInfoLog(); + destroy(); + throw new RuntimeException("A compilation error occured in a shader."); + } + } + + public void printInfoLog() { + if ( ID == 0 ) + throw new IllegalStateException("The shader has not been created"); + + final int logLength = glGetShaderi(ID, GL_INFO_LOG_LENGTH); + if ( logLength <= 1 ) + return; + + System.out.println("\nInfo Log of Shader Object: " + ID); + System.out.println("--------------------------"); + System.out.println(glGetShaderInfoLog(ID, logLength)); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ShaderProgram.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ShaderProgram.java new file mode 100644 index 0000000..de120d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/ShaderProgram.java @@ -0,0 +1,82 @@ +package org.lwjgl.test.opengles.util; + +import static org.lwjgl.opengles.GLES20.*; + +public class ShaderProgram implements GLObject { + + private final int ID; + + public ShaderProgram(final Shader... shaders) { + this.ID = glCreateProgram(); + + for ( Shader shader : shaders ) + glAttachShader(ID, shader.getID()); + + glLinkProgram(ID); + + if ( glGetProgrami(ID, GL_LINK_STATUS) == GL_FALSE ) { + printInfoLog(); + destroy(); + throw new RuntimeException("Failed to link a Shader Program: " + ID); + } + } + + public void validate() { + glValidateProgram(ID); + + final boolean error = glGetProgrami(ID, GL_VALIDATE_STATUS) == GL_FALSE; + + if ( error ) { + printInfoLog(); + throw new RuntimeException("Failed to validate a Shader Program."); + } + } + + public int getID() { + return ID; + } + + public void destroy() { + glDeleteProgram(ID); + } + + public void enable() { + glUseProgram(ID); + } + + public static void disable() { + glUseProgram(0); + } + + public int getUniformLocation(final String uniform) { + final int location = glGetUniformLocation(ID, uniform); + + if ( location == -1 ) + throw new IllegalArgumentException("Invalid uniform name specified: " + uniform); + + return location; + } + + public int getAttributeLocation(final String attrib) { + final int location = glGetAttribLocation(ID, attrib); + + if ( location == -1 ) + throw new IllegalArgumentException("Invalid attribute name specified: " + attrib); + + return location; + } + + private void printInfoLog() { + final int logLength = glGetProgrami(ID, GL_INFO_LOG_LENGTH); + + System.out.println(logLength); + if ( logLength <= 1 ) + return; + + System.out.println("\nInfo Log of Shader Program: " + ID); + System.out.println("-------------------"); + System.out.println(glGetProgramInfoLog(ID, logLength)); + System.out.println("-------------------"); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Sphere.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Sphere.java new file mode 100644 index 0000000..5932080 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/test/opengles/util/Sphere.java @@ -0,0 +1,414 @@ +package org.lwjgl.test.opengles.util; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; + +import static org.lwjgl.opengles.GLES20.*; + +/** VBO implementation of GLU Sphere. */ +public final class Sphere { + + /* QuadricNormal */ + public static final int GLU_SMOOTH = 100000; + public static final int GLU_FLAT = 100001; + public static final int GLU_NONE = 100002; + + /* QuadricDrawStyle */ + public static final int GLU_POINT = 100010; + public static final int GLU_LINE = 100011; + public static final int GLU_FILL = 100012; + public static final int GLU_SILHOUETTE = 100013; + + /* QuadricOrientation */ + public static final int GLU_OUTSIDE = 100020; + public static final int GLU_INSIDE = 100021; + + static final float PI = (float)Math.PI; + + private int drawStyle; + private int orientation; + private boolean textureFlag; + private int normals; + + private BufferObjectArray bo; + + private final List<DrawCommand> drawCommands = new ArrayList<DrawCommand>(4); + + public Sphere() { + this(GLU_FILL, GLU_OUTSIDE, false, GLU_SMOOTH); + } + + public Sphere(final int drawStyle, final int orientation, final boolean textureFlag, final int normals) { + setDrawStyle(drawStyle); + setOrientation(orientation); + setTextureFlag(textureFlag); + setNormals(normals); + } + + public Sphere(final float radius, final int slices, final int stacks) { + this(); + updateGeometry(radius, slices, stacks); + } + + public Sphere(final float radius, final int slices, final int stacks, + final int drawStyle, final int orientation, final boolean textureFlag, final int normals) { + this(drawStyle, orientation, textureFlag, normals); + updateGeometry(radius, slices, stacks); + } + + public void updateGeometry(final float radius, final int slices, final int stacks) { + if ( bo != null ) + destroy(); + + bo = new BufferObjectArray(GL_STATIC_DRAW, createBuffer(radius, slices, stacks)); + } + + public void bind() { + bo.enable(); + } + + public void draw() { + for ( DrawCommand command : drawCommands ) + command.draw(); + } + + public void destroy() { + bo.destroy(); + bo = null; + + drawCommands.clear(); + } + + /** + * specifies the draw style for quadrics. + * <p/> + * The legal values are as follows: + * <p/> + * GLU.FILL: Quadrics are rendered with polygon primitives. The polygons + * are drawn in a counterclockwise fashion with respect to + * their normals (as defined with glu.quadricOrientation). + * <p/> + * GLU.LINE: Quadrics are rendered as a set of lines. + * <p/> + * GLU.SILHOUETTE: Quadrics are rendered as a set of lines, except that edges + * separating coplanar faces will not be drawn. + * <p/> + * GLU.POINT: Quadrics are rendered as a set of points. + * + * @param drawStyle The drawStyle to set + */ + public void setDrawStyle(int drawStyle) { + switch ( drawStyle ) { + case GLU_FILL: + case GLU_LINE: + case GLU_SILHOUETTE: + case GLU_POINT: + break; + default: + throw new IllegalArgumentException("Invalid draw style specified: " + drawStyle); + } + + this.drawStyle = drawStyle; + } + + /** + * specifies what kind of normals are desired for quadrics. + * The legal values are as follows: + * <p/> + * GLU.NONE: No normals are generated. + * <p/> + * GLU.FLAT: One normal is generated for every facet of a quadric. + * <p/> + * GLU.SMOOTH: One normal is generated for every vertex of a quadric. This + * is the default. + * + * @param normals The normals to set + */ + public void setNormals(int normals) { + switch ( normals ) { + case GLU_NONE: + case GLU_FLAT: + case GLU_SMOOTH: + break; + default: + throw new IllegalArgumentException("Invalid normal kind specified: " + normals); + } + + this.normals = normals; + } + + /** + * specifies what kind of orientation is desired for. + * The orientation values are as follows: + * <p/> + * GLU.OUTSIDE: Quadrics are drawn with normals pointing outward. + * <p/> + * GLU.INSIDE: Normals point inward. The default is GLU.OUTSIDE. + * <p/> + * Note that the interpretation of outward and inward depends on the quadric + * being drawn. + * + * @param orientation The orientation to set + */ + public void setOrientation(int orientation) { + if ( orientation != GLU_OUTSIDE && orientation != GLU_INSIDE ) + throw new IllegalArgumentException("Invalid orientation specified: " + orientation); + + this.orientation = orientation; + } + + /** + * specifies if texture coordinates should be generated for + * quadrics rendered with qobj. If the value of textureCoords is true, + * then texture coordinates are generated, and if textureCoords is false, + * they are not.. The default is false. + * <p/> + * The manner in which texture coordinates are generated depends upon the + * specific quadric rendered. + * + * @param textureFlag The textureFlag to set + */ + public void setTextureFlag(boolean textureFlag) { + this.textureFlag = textureFlag; + } + + /** + * Returns the drawStyle. + * + * @return int + */ + public int getDrawStyle() { + return drawStyle; + } + + /** + * Returns the normals. + * + * @return int + */ + public int getNormals() { + return normals; + } + + /** + * Returns the orientation. + * + * @return int + */ + public int getOrientation() { + return orientation; + } + + /** + * Returns the textureFlag. + * + * @return boolean + */ + public boolean getTextureFlag() { + return textureFlag; + } + + private static float sin(final float r) { + return (float)Math.sin(r); + } + + private static float cos(final float r) { + return (float)Math.cos(r); + } + + private int addDrawCommand(final int mode, final int first, final int count) { + drawCommands.add(new DrawCommand(mode, first, count)); + return count; + } + + /** + * draws a sphere of the given radius centered around the origin. + * The sphere is subdivided around the z axis into slices and along the z axis + * into stacks (similar to lines of longitude and latitude). + * <p/> + * If the orientation is set to GLU.OUTSIDE (with glu.quadricOrientation), then + * any normals generated point away from the center of the sphere. Otherwise, + * they point toward the center of the sphere. + * <p/> + * If texturing is turned on (with glu.quadricTexture), then texture + * coordinates are generated so that t ranges from 0.0 at z=-radius to 1.0 at + * z=radius (t increases linearly along longitudinal lines), and s ranges from + * 0.0 at the +y axis, to 0.25 at the +x axis, to 0.5 at the -y axis, to 0.75 + * at the -x axis, and back to 1.0 at the +y axis. + */ + public FloatBuffer createBuffer(float radius, int slices, int stacks) { + float rho, theta; + float x, y, z; + float s, t, ds, dt; + int i, j; + + final boolean normals = this.normals != GLU_NONE; + final float nsign = this.orientation == GLU_INSIDE ? -1.0f : 1.0f; + + final float drho = PI / stacks; + final float dtheta = 2.0f * PI / slices; + + final ImmediateModeBuffer imb = new ImmediateModeBuffer(16 * 1024); // TODO: We can calculate this to avoid re-allocs + int lastDrawIndex = 0; + + if ( this.drawStyle == GLU_FILL ) { + if ( !this.textureFlag ) { + lastDrawIndex += addDrawCommand(GL_TRIANGLE_FAN, lastDrawIndex, slices + 2); + + // draw +Z end as a triangle fan + imb.glNormal3f(0.0f, 0.0f, 1.0f); + imb.glVertex3f(0.0f, 0.0f, nsign * radius); + for ( j = 0; j <= slices; j++ ) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(drho); + y = cos(theta) * sin(drho); + z = nsign * cos(drho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + imb.glVertex3f(x * radius, y * radius, z * radius); + } + } + + ds = 1.0f / slices; + dt = 1.0f / stacks; + t = 1.0f; // because loop now runs from 0 + + final int imin, imax; + if ( this.textureFlag ) { + imin = 0; + imax = stacks; + } else { + imin = 1; + imax = stacks - 1; + } + + // draw intermediate stacks as quad strips + for ( i = imin; i < imax; i++ ) { + lastDrawIndex += addDrawCommand(GL_TRIANGLE_STRIP, lastDrawIndex, (slices + 1) * 2); + + rho = i * drho; + s = 0.0f; + for ( j = 0; j <= slices; j++ ) { + theta = (j == slices) ? 0.0f : j * dtheta; + + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + if ( textureFlag ) + imb.glTexCoord2f(s, t); + imb.glVertex3f(x * radius, y * radius, z * radius); + + x = -sin(theta) * sin(rho + drho); + y = cos(theta) * sin(rho + drho); + z = nsign * cos(rho + drho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + if ( textureFlag ) + imb.glTexCoord2f(s, t - dt); + s += ds; + imb.glVertex3f(x * radius, y * radius, z * radius); + } + t -= dt; + } + + if ( !this.textureFlag ) { + lastDrawIndex += addDrawCommand(GL_TRIANGLE_FAN, lastDrawIndex, slices + 2); + + // draw -Z end as a triangle fan + imb.glNormal3f(0.0f, 0.0f, -1.0f); + imb.glVertex3f(0.0f, 0.0f, -radius * nsign); + rho = PI - drho; + s = 1.0f; + for ( j = slices; j >= 0; j-- ) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + s -= ds; + imb.glVertex3f(x * radius, y * radius, z * radius); + } + } + } else if ( this.drawStyle == GLU_LINE || this.drawStyle == GLU_SILHOUETTE ) { + // draw stack lines + for ( i = 1; i < stacks; i++ ) { // stack line at i==stacks-1 was missing here + lastDrawIndex += addDrawCommand(GL_LINE_LOOP, lastDrawIndex, slices); + + rho = i * drho; + for ( j = 0; j < slices; j++ ) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + imb.glVertex3f(x * radius, y * radius, z * radius); + } + } + // draw slice lines + for ( j = 0; j < slices; j++ ) { + lastDrawIndex += addDrawCommand(GL_LINE_STRIP, lastDrawIndex, stacks + 1); + + theta = j * dtheta; + for ( i = 0; i <= stacks; i++ ) { + rho = i * drho; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + imb.glVertex3f(x * radius, y * radius, z * radius); + } + } + } else if ( this.drawStyle == GLU_POINT ) { + lastDrawIndex += addDrawCommand(GL_POINTS, lastDrawIndex, 2 + (stacks - 2) * slices); + + // top and bottom-most points + if ( normals ) + imb.glNormal3f(0.0f, 0.0f, nsign); + imb.glVertex3f(0.0f, 0.0f, radius); + if ( normals ) + imb.glNormal3f(0.0f, 0.0f, -nsign); + imb.glVertex3f(0.0f, 0.0f, -radius); + + // loop over stacks + for ( i = 1; i < stacks - 1; i++ ) { + rho = i * drho; + for ( j = 0; j < slices; j++ ) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if ( normals ) + imb.glNormal3f(x * nsign, y * nsign, z * nsign); + imb.glVertex3f(x * radius, y * radius, z * radius); + } + } + } + + return imb.getBuffer(); + } + + private static class DrawCommand { + + private int mode; + private int first; + private int count; + + private DrawCommand(final int mode, final int first, final int count) { + this.mode = mode; + this.first = first; + this.count = count; + } + + void draw() { + glDrawArrays(mode, first, count); + } + + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Color.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Color.java new file mode 100644 index 0000000..fdce824 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Color.java @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; +import java.io.Serializable; +import java.nio.ByteBuffer; + +/** + * A mutable Color class + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Color implements ReadableColor, Serializable, WritableColor { + + static final long serialVersionUID = 1L; + + /** Color components, publicly accessible */ + private byte red, green, blue, alpha; + + /** + * Constructor for Color. + */ + public Color() { + this(0, 0, 0, 255); + } + + /** + * Constructor for Color. Alpha defaults to 255. + */ + public Color(int r, int g, int b) { + this(r, g, b, 255); + } + + /** + * Constructor for Color. Alpha defaults to 255. + */ + public Color(byte r, byte g, byte b) { + this(r, g, b, (byte) 255); + } + + /** + * Constructor for Color. + */ + public Color(int r, int g, int b, int a) { + set(r, g, b, a); + } + + /** + * Constructor for Color. + */ + public Color(byte r, byte g, byte b, byte a) { + set(r, g, b, a); + } + + /** + * Constructor for Color + */ + public Color(ReadableColor c) { + setColor(c); + } + + /** + * Set a color + */ + public void set(int r, int g, int b, int a) { + red = (byte) r; + green = (byte) g; + blue = (byte) b; + alpha = (byte) a; + } + + /** + * Set a color + */ + public void set(byte r, byte g, byte b, byte a) { + this.red = r; + this.green = g; + this.blue = b; + this.alpha = a; + } + + /** + * Set a color + */ + public void set(int r, int g, int b) { + set(r, g, b, 255); + } + + /** + * Set a color + */ + public void set(byte r, byte g, byte b) { + set(r, g, b, (byte) 255); + } + + /** + * Accessor + */ + public int getRed() { + return red & 0xFF; + } + + /** + * Accessor + */ + public int getGreen() { + return green & 0xFF; + } + + /** + * Accessor + */ + public int getBlue() { + return blue & 0xFF; + } + + /** + * Accessor + */ + public int getAlpha() { + return alpha & 0xFF; + } + + /** + * Set the Red component + */ + public void setRed(int red) { + this.red = (byte) red; + } + + /** + * Set the Green component + */ + public void setGreen(int green) { + this.green = (byte) green; + } + + /** + * Set the Blue component + */ + public void setBlue(int blue) { + this.blue = (byte) blue; + } + + /** + * Set the Alpha component + */ + public void setAlpha(int alpha) { + this.alpha = (byte) alpha; + } + + /** + * Set the Red component + */ + public void setRed(byte red) { + this.red = red; + } + + /** + * Set the Green component + */ + public void setGreen(byte green) { + this.green = green; + } + + /** + * Set the Blue component + */ + public void setBlue(byte blue) { + this.blue = blue; + } + + /** + * Set the Alpha component + */ + public void setAlpha(byte alpha) { + this.alpha = alpha; + } + + /** + * Stringify + */ + public String toString() { + return "Color [" + getRed() + ", " + getGreen() + ", " + getBlue() + ", " + getAlpha() + "]"; + } + + /** + * Equals + */ + public boolean equals(Object o) { + return (o != null) + && (o instanceof ReadableColor) + && (((ReadableColor) o).getRed() == this.getRed()) + && (((ReadableColor) o).getGreen() == this.getGreen()) + && (((ReadableColor) o).getBlue() == this.getBlue()) + && (((ReadableColor) o).getAlpha() == this.getAlpha()); + } + + /** + * Hashcode + */ + public int hashCode() { + return (red << 24) | (green << 16) | (blue << 8) | alpha; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getAlphaByte() + */ + public byte getAlphaByte() { + return alpha; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getBlueByte() + */ + public byte getBlueByte() { + return blue; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getGreenByte() + */ + public byte getGreenByte() { + return green; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#getRedByte() + */ + public byte getRedByte() { + return red; + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeRGBA(java.nio.ByteBuffer) + */ + public void writeRGBA(ByteBuffer dest) { + dest.put(red); + dest.put(green); + dest.put(blue); + dest.put(alpha); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeRGB(java.nio.ByteBuffer) + */ + public void writeRGB(ByteBuffer dest) { + dest.put(red); + dest.put(green); + dest.put(blue); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeABGR(java.nio.ByteBuffer) + */ + public void writeABGR(ByteBuffer dest) { + dest.put(alpha); + dest.put(blue); + dest.put(green); + dest.put(red); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeARGB(java.nio.ByteBuffer) + */ + public void writeARGB(ByteBuffer dest) { + dest.put(alpha); + dest.put(red); + dest.put(green); + dest.put(blue); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeBGR(java.nio.ByteBuffer) + */ + public void writeBGR(ByteBuffer dest) { + dest.put(blue); + dest.put(green); + dest.put(red); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableColor#writeBGRA(java.nio.ByteBuffer) + */ + public void writeBGRA(ByteBuffer dest) { + dest.put(blue); + dest.put(green); + dest.put(red); + dest.put(alpha); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readRGBA(ByteBuffer src) { + red = src.get(); + green = src.get(); + blue = src.get(); + alpha = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readRGB(ByteBuffer src) { + red = src.get(); + green = src.get(); + blue = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readARGB(ByteBuffer src) { + alpha = src.get(); + red = src.get(); + green = src.get(); + blue = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readBGRA(ByteBuffer src) { + blue = src.get(); + green = src.get(); + red = src.get(); + alpha = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readBGR(ByteBuffer src) { + blue = src.get(); + green = src.get(); + red = src.get(); + } + + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + public void readABGR(ByteBuffer src) { + alpha = src.get(); + blue = src.get(); + green = src.get(); + red = src.get(); + } + + /** + * Set this color's color by copying another color + * @param src The source color + */ + public void setColor(ReadableColor src) { + red = src.getRedByte(); + green = src.getGreenByte(); + blue = src.getBlueByte(); + alpha = src.getAlphaByte(); + } + + /** + * HSB to RGB conversion, pinched from java.awt.Color. + * @param hue (0..1.0f) + * @param saturation (0..1.0f) + * @param brightness (0..1.0f) + */ + public void fromHSB(float hue, float saturation, float brightness) { + if (saturation == 0.0F) { + red = green = blue = (byte) (brightness * 255F + 0.5F); + } else { + float f3 = (hue - (float) Math.floor(hue)) * 6F; + float f4 = f3 - (float) Math.floor(f3); + float f5 = brightness * (1.0F - saturation); + float f6 = brightness * (1.0F - saturation * f4); + float f7 = brightness * (1.0F - saturation * (1.0F - f4)); + switch ((int) f3) { + case 0 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f7 * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 1 : + red = (byte) (f6 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f5 * 255F + 0.5F); + break; + case 2 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (brightness * 255F + 0.5F); + blue = (byte) (f7 * 255F + 0.5F); + break; + case 3 : + red = (byte) (f5 * 255F + 0.5F); + green = (byte) (f6 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 4 : + red = (byte) (f7 * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (brightness * 255F + 0.5F); + break; + case 5 : + red = (byte) (brightness * 255F + 0.5F); + green = (byte) (f5 * 255F + 0.5F); + blue = (byte) (f6 * 255F + 0.5F); + break; + } + } + } + + /** + * RGB to HSB conversion, pinched from java.awt.Color. + * The HSB value is returned in dest[] if dest[] is supplied. + * Values range from 0..1 + * @param dest Destination floats, or null + * @return dest, or a new float array + */ + public float[] toHSB(float dest[]) { + int r = getRed(); + int g = getGreen(); + int b = getBlue(); + if (dest == null) + dest = new float[3]; + int l = r <= g ? g : r; + if (b > l) + l = b; + int i1 = r >= g ? g : r; + if (b < i1) + i1 = b; + float brightness = l / 255F; + float saturation; + if (l != 0) + saturation = (float) (l - i1) / (float) l; + else + saturation = 0.0F; + float hue; + if (saturation == 0.0F) { + hue = 0.0F; + } else { + float f3 = (float) (l - r) / (float) (l - i1); + float f4 = (float) (l - g) / (float) (l - i1); + float f5 = (float) (l - b) / (float) (l - i1); + if (r == l) + hue = f5 - f4; + else if (g == l) + hue = (2.0F + f3) - f5; + else + hue = (4F + f4) - f3; + hue /= 6F; + if (hue < 0.0F) + hue++; + } + dest[0] = hue; + dest[1] = saturation; + dest[2] = brightness; + return dest; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Dimension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Dimension.java new file mode 100644 index 0000000..341024c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Dimension.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.io.Serializable; + +/** + * A 2D integer Dimension class, which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Dimension implements Serializable, ReadableDimension, WritableDimension { + + static final long serialVersionUID = 1L; + + /** The dimensions! */ + private int width, height; + + /** + * Constructor for Dimension. + */ + public Dimension() { + super(); + } + + /** + * Constructor for Dimension. + */ + public Dimension(int w, int h) { + this.width = w; + this.height = h; + } + + /** + * Constructor for Dimension. + */ + public Dimension(ReadableDimension d) { + setSize(d); + } + + public void setSize(int w, int h) { + this.width = w; + this.height = h; + } + + public void setSize(ReadableDimension d) { + this.width = d.getWidth(); + this.height = d.getHeight(); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) + */ + public void getSize(WritableDimension dest) { + dest.setSize(this); + } + + /** + * Checks whether two dimension objects have equal values. + */ + public boolean equals(Object obj) { + if (obj instanceof ReadableDimension) { + ReadableDimension d = (ReadableDimension) obj; + return (width == d.getWidth()) && (height == d.getHeight()); + } + return false; + } + + /** + * Returns the hash code for this <code>Dimension</code>. + * + * @return a hash code for this <code>Dimension</code> + */ + public int hashCode() { + int sum = width + height; + return sum * (sum + 1) / 2 + width; + } + + /** + * Returns a string representation of the values of this + * <code>Dimension</code> object's <code>height</code> and + * <code>width</code> fields. This method is intended to be used only + * for debugging purposes, and the content and format of the returned + * string may vary between implementations. The returned string may be + * empty but may not be <code>null</code>. + * + * @return a string representation of this <code>Dimension</code> + * object + */ + public String toString() { + return getClass().getName() + "[width=" + width + ",height=" + height + "]"; + } + + /** + * Gets the height. + * @return Returns a int + */ + public int getHeight() { + return height; + } + + /** + * Sets the height. + * @param height The height to set + */ + public void setHeight(int height) { + this.height = height; + } + + /** + * Gets the width. + * @return Returns a int + */ + public int getWidth() { + return width; + } + + /** + * Sets the width. + * @param width The width to set + */ + public void setWidth(int width) { + this.width = width; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Display.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Display.java new file mode 100644 index 0000000..999d9de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Display.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; + +import org.lwjgl.LWJGLException; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.opengl.DisplayMode; + +/** + * Display initialization utility, that can be used to find display modes and pick + * one for you based on your criteria. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Display { + + private static final boolean DEBUG = false; + + /** + * Determine the available display modes that match the specified minimum and maximum criteria. + * If any given criterium is specified as -1 then it is ignored. + * + * @param minWidth the minimum display resolution in pixels + * @param minHeight the minimum display resolution in pixels + * @param maxWidth the maximum display resolution in pixels + * @param maxHeight the maximum display resolution in pixels + * @param minBPP the minimum bit depth per pixel + * @param maxBPP the maximum bit depth per pixel + * @param minFreq the minimum display frequency in Hz + * @param maxFreq the maximum display frequency in Hz + * @return an array of matching display modes + */ + public static DisplayMode[] getAvailableDisplayModes(int minWidth, int minHeight, int maxWidth, int maxHeight, int minBPP, int maxBPP, + int minFreq, int maxFreq) throws LWJGLException + { + // First get the available display modes + DisplayMode[] modes = org.lwjgl.opengl.Display.getAvailableDisplayModes(); + + if (LWJGLUtil.DEBUG || DEBUG) { + System.out.println("Available screen modes:"); + for ( DisplayMode mode : modes ) { + System.out.println(mode); + } + } + + ArrayList<DisplayMode> matches = new ArrayList<DisplayMode>(modes.length); + + for (int i = 0; i < modes.length; i ++) { + assert modes[i] != null : ""+i+" "+modes.length; + if (minWidth != -1 && modes[i].getWidth() < minWidth) + continue; + if (maxWidth != -1 && modes[i].getWidth() > maxWidth) + continue; + if (minHeight != -1 && modes[i].getHeight() < minHeight) + continue; + if (maxHeight != -1 && modes[i].getHeight() > maxHeight) + continue; + if (minBPP != -1 && modes[i].getBitsPerPixel() < minBPP) + continue; + if (maxBPP != -1 && modes[i].getBitsPerPixel() > maxBPP) + continue; + //if (modes[i].bpp == 24) + // continue; + if (modes[i].getFrequency() != 0) { + if (minFreq != -1 && modes[i].getFrequency() < minFreq) + continue; + if (maxFreq != -1 && modes[i].getFrequency() > maxFreq) + continue; + } + matches.add(modes[i]); + } + + DisplayMode[] ret = new DisplayMode[matches.size()]; + matches.toArray(ret); + if (LWJGLUtil.DEBUG && DEBUG) { + System.out.println("Filtered screen modes:"); + for ( DisplayMode mode : ret ) { + System.out.println(mode); + } + } + + return ret; + } + + /** + * Create the display by choosing from a list of display modes based on an order of preference. + * You must supply a list of allowable display modes, probably by calling getAvailableDisplayModes(), + * and an array with the order in which you would like them sorted in descending order. + * This method attempts to create the topmost display mode; if that fails, it will try the next one, + * and so on, until there are no modes left. If no mode is set at the end, an exception is thrown. + * @param dm a list of display modes to choose from + * @param param the names of the DisplayMode fields in the order in which you would like them sorted. + * @return the chosen display mode + * @throws NoSuchFieldException if one of the params is not a field in DisplayMode + * @throws Exception if no display mode could be set + * @see org.lwjgl.opengl.DisplayMode + */ + public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception { + + class FieldAccessor { + final String fieldName; + final int order; + final int preferred; + final boolean usePreferred; + FieldAccessor(String fieldName, int order, int preferred, boolean usePreferred) { + this.fieldName = fieldName; + this.order = order; + this.preferred = preferred; + this.usePreferred = usePreferred; + } + int getInt(DisplayMode mode) { + if ("width".equals(fieldName)) { + return mode.getWidth(); + } + if ("height".equals(fieldName)) { + return mode.getHeight(); + } + if ("freq".equals(fieldName)) { + return mode.getFrequency(); + } + if ("bpp".equals(fieldName)) { + return mode.getBitsPerPixel(); + } + throw new IllegalArgumentException("Unknown field "+fieldName); + } + } + + class Sorter implements Comparator<DisplayMode> { + + final FieldAccessor[] accessors; + + Sorter() { + accessors = new FieldAccessor[param.length]; + for (int i = 0; i < accessors.length; i ++) { + int idx = param[i].indexOf('='); + if (idx > 0) { + accessors[i] = new FieldAccessor(param[i].substring(0, idx), 0, Integer.parseInt(param[i].substring(idx + 1, param[i].length())), true); + } else if (param[i].charAt(0) == '-') { + accessors[i] = new FieldAccessor(param[i].substring(1), -1, 0, false); + } else { + accessors[i] = new FieldAccessor(param[i], 1, 0, false); + } + } + } + + /** + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + public int compare(DisplayMode dm1, DisplayMode dm2) { + for ( FieldAccessor accessor : accessors ) { + int f1 = accessor.getInt(dm1); + int f2 = accessor.getInt(dm2); + + if ( accessor.usePreferred && f1 != f2 ) { + if ( f1 == accessor.preferred ) + return -1; + else if ( f2 == accessor.preferred ) + return 1; + else { + // Score according to the difference between the values + int absf1 = Math.abs(f1 - accessor.preferred); + int absf2 = Math.abs(f2 - accessor.preferred); + if ( absf1 < absf2 ) + return -1; + else if ( absf1 > absf2 ) + return 1; + else + continue; + } + } else if ( f1 < f2 ) + return accessor.order; + else if ( f1 == f2 ) + continue; + else + return -accessor.order; + } + + return 0; + } + } + + // Sort the display modes + Arrays.sort(dm, new Sorter()); + + // Try them out in the appropriate order + if (LWJGLUtil.DEBUG || DEBUG) { + System.out.println("Sorted display modes:"); + for ( DisplayMode aDm : dm ) { + System.out.println(aDm); + } + } + for ( DisplayMode aDm : dm ) { + try { + if ( LWJGLUtil.DEBUG || DEBUG ) + System.out.println("Attempting to set displaymode: " + aDm); + org.lwjgl.opengl.Display.setDisplayMode(aDm); + return aDm; + } catch (Exception e) { + if ( LWJGLUtil.DEBUG || DEBUG ) { + System.out.println("Failed to set display mode to " + aDm); + e.printStackTrace(); + } + } + } + + throw new Exception("Failed to set display mode."); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Point.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Point.java new file mode 100644 index 0000000..90db474 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Point.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.io.Serializable; + +/** + * A 2D integer point class, which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Point implements ReadablePoint, WritablePoint, Serializable { + + static final long serialVersionUID = 1L; + + /** The location */ + private int x, y; + + /** + * Constructor for Point. + */ + public Point() { + super(); + } + + /** + * Constructor for Point. + */ + public Point(int x, int y) { + setLocation(x, y); + } + + /** + * Constructor for Point. + */ + public Point(ReadablePoint p) { + setLocation(p); + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLocation(ReadablePoint p) { + this.x = p.getX(); + this.y = p.getY(); + } + + public void setX(int x) { + this.x = x; + } + + public void setY(int y) { + this.y = y; + } + + /** + * Translate a point. + * @param dx The translation to apply + * @param dy The translation to apply + */ + public void translate(int dx, int dy) { + this.x += dx; + this.y += dy; + } + + /** + * Translate a point. + * @param p The translation to apply + */ + public void translate(ReadablePoint p) { + this.x += p.getX(); + this.y += p.getY(); + } + + /** + * Un-translate a point. + * @param p The translation to apply + */ + public void untranslate(ReadablePoint p) { + this.x -= p.getX(); + this.y -= p.getY(); + } + + /** + * Determines whether an instance of <code>Point2D</code> is equal + * to this point. Two instances of <code>Point2D</code> are equal if + * the values of their <code>x</code> and <code>y</code> member + * fields, representing their position in the coordinate space, are + * the same. + * @param obj an object to be compared with this point + * @return <code>true</code> if the object to be compared is + * an instance of <code>Point</code> and has + * the same values; <code>false</code> otherwise + */ + public boolean equals(Object obj) { + if (obj instanceof Point) { + Point pt = (Point) obj; + return (x == pt.x) && (y == pt.y); + } + return super.equals(obj); + } + + /** + * Returns a string representation of this point and its location + * in the (<i>x</i>,&nbsp;<i>y</i>) coordinate space. This method is + * intended to be used only for debugging purposes, and the content + * and format of the returned string may vary between implementations. + * The returned string may be empty but may not be <code>null</code>. + * + * @return a string representation of this point + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + "]"; + } + + /** + * Returns the hash code for this <code>Point</code>. + * + * @return a hash code for this <code>Point</code> + */ + public int hashCode() { + int sum = x + y; + return sum * (sum + 1) / 2 + x; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public void getLocation(WritablePoint dest) { + dest.setLocation(x, y); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableColor.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableColor.java new file mode 100644 index 0000000..e4f9ea8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableColor.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.nio.ByteBuffer; + +/** + * Readonly interface for Colors + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableColor { + + /** + * Return the red component (0..255) + * @return int + */ + int getRed(); + + /** + * Return the red component (0..255) + * @return int + */ + int getGreen(); + + /** + * Return the red component (0..255) + * @return int + */ + int getBlue(); + + /** + * Return the red component (0..255) + * @return int + */ + int getAlpha(); + + /** + * Return the red component + * @return int + */ + byte getRedByte(); + + /** + * Return the red component + * @return int + */ + byte getGreenByte(); + + /** + * Return the red component + * @return int + */ + byte getBlueByte(); + + /** + * Return the red component + * @return int + */ + byte getAlphaByte(); + + /** + * Write the RGBA color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeRGBA(ByteBuffer dest); + + /** + * Write the RGB color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeRGB(ByteBuffer dest); + + /** + * Write the ABGR color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeABGR(ByteBuffer dest); + + /** + * Write the BGR color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeBGR(ByteBuffer dest); + + /** + * Write the BGRA color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeBGRA(ByteBuffer dest); + + /** + * Write the ARGB color directly out to a ByteBuffer + * @param dest the buffer to write to + */ + void writeARGB(ByteBuffer dest); + + /* + * Some standard colors + */ + ReadableColor RED = new Color(255, 0, 0); + ReadableColor ORANGE = new Color(255, 128, 0); + ReadableColor YELLOW = new Color(255, 255, 0); + ReadableColor GREEN = new Color(0, 255, 0); + ReadableColor CYAN = new Color(0, 255, 255); + ReadableColor BLUE = new Color(0, 0, 255); + ReadableColor PURPLE = new Color(255, 0, 255); + ReadableColor WHITE = new Color(255, 255, 255); + ReadableColor BLACK = new Color(0, 0, 0); + ReadableColor LTGREY = new Color(192, 192, 192); + ReadableColor DKGREY = new Color(64, 64, 64); + ReadableColor GREY = new Color(128, 128, 128); + + + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableDimension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableDimension.java new file mode 100644 index 0000000..0c2babc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableDimension.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Readonly interface for Dimensions + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableDimension { + + /** + * Get the width + * @return int + */ + int getWidth(); + + /** + * Get the height + * @return int + */ + int getHeight(); + + /** + * Copy this ReadableDimension into a destination Dimension + * @param dest The destination + */ + void getSize(WritableDimension dest); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadablePoint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadablePoint.java new file mode 100644 index 0000000..df02317 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadablePoint.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Readonly interface for Points + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadablePoint { + + /** + * @return int + */ + int getX(); + + /** + * @return int + */ + int getY(); + + /** + * Copy this ReadablePoint into a destination Point + * @param dest The destination Point, or null, to create a new Point + */ + void getLocation(WritablePoint dest); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableRectangle.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableRectangle.java new file mode 100644 index 0000000..66e162c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/ReadableRectangle.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Readonly interface for Rectangles + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface ReadableRectangle extends ReadableDimension, ReadablePoint { + + /** + * Copy this readable rectangle's bounds into a destination Rectangle + * @param dest The destination Rectangle, or null, to create a new Rectangle + */ + void getBounds(WritableRectangle dest); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Rectangle.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Rectangle.java new file mode 100644 index 0000000..8f030b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Rectangle.java @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.io.Serializable; + +/** + * A 2D integer Rectangle class which looks remarkably like an AWT one. + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public final class Rectangle implements ReadableRectangle, WritableRectangle, Serializable { + + static final long serialVersionUID = 1L; + + /** Rectangle's bounds */ + private int x, y, width, height; + + /** + * Constructor for Rectangle. + */ + public Rectangle() { + super(); + } + /** + * Constructor for Rectangle. + */ + public Rectangle(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + /** + * Constructor for Rectangle. + */ + public Rectangle(ReadablePoint p, ReadableDimension d) { + x = p.getX(); + y = p.getY(); + width = d.getWidth(); + height = d.getHeight(); + } + /** + * Constructor for Rectangle. + */ + public Rectangle(ReadableRectangle r) { + x = r.getX(); + y = r.getY(); + width = r.getWidth(); + height = r.getHeight(); + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLocation(ReadablePoint p) { + this.x = p.getX(); + this.y = p.getY(); + } + + public void setSize(int w, int h) { + this.width = w; + this.height = h; + } + + public void setSize(ReadableDimension d) { + this.width = d.getWidth(); + this.height = d.getHeight(); + } + + public void setBounds(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + public void setBounds(ReadablePoint p, ReadableDimension d) { + x = p.getX(); + y = p.getY(); + width = d.getWidth(); + height = d.getHeight(); + } + + public void setBounds(ReadableRectangle r) { + x = r.getX(); + y = r.getY(); + width = r.getWidth(); + height = r.getHeight(); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableRectangle#getBounds(com.shavenpuppy.jglib.Rectangle) + */ + public void getBounds(WritableRectangle dest) { + dest.setBounds(x, y, width, height); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadablePoint#getLocation(com.shavenpuppy.jglib.Point) + */ + public void getLocation(WritablePoint dest) { + dest.setLocation(x, y); + } + + /* (Overrides) + * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension) + */ + public void getSize(WritableDimension dest) { + dest.setSize(width, height); + } + + /** + * Translate the rectangle by an amount. + * @param x The translation amount on the x axis + * @param y The translation amount on the y axis + */ + public void translate(int x, int y) { + this.x += x; + this.y += y; + } + + /** + * Translate the rectangle by an amount. + * @param point The translation amount + */ + public void translate(ReadablePoint point) { + this.x += point.getX(); + this.y += point.getY(); + } + + /** + * Un-translate the rectangle by an amount. + * @param point The translation amount + */ + public void untranslate(ReadablePoint point) { + this.x -= point.getX(); + this.y -= point.getY(); + } + + /** + * Checks whether or not this <code>Rectangle</code> contains the + * specified <code>Point</code>. + * @param p the <code>Point</code> to test + * @return <code>true</code> if the <code>Point</code> + * (<i>x</i>,&nbsp;<i>y</i>) is inside this + * <code>Rectangle</code>; + * <code>false</code> otherwise. + */ + public boolean contains(ReadablePoint p) { + return contains(p.getX(), p.getY()); + } + + /** + * Checks whether or not this <code>Rectangle</code> contains the + * point at the specified location + * (<i>x</i>,&nbsp;<i>y</i>). + * @param X the specified x coordinate + * @param Y the specified y coordinate + * @return <code>true</code> if the point + * (<i>x</i>,&nbsp;<i>y</i>) is inside this + * <code>Rectangle</code>; + * <code>false</code> otherwise. + */ + public boolean contains(int X, int Y) { + int w = this.width; + int h = this.height; + if ((w | h) < 0) { + // At least one of the dimensions is negative... + return false; + } + // Note: if either dimension is zero, tests below must return false... + int x = this.x; + int y = this.y; + if (X < x || Y < y) { + return false; + } + w += x; + h += y; + // overflow || intersect + return ((w < x || w > X) && (h < y || h > Y)); + } + + /** + * Checks whether or not this <code>Rectangle</code> entirely contains + * the specified <code>Rectangle</code>. + * @param r the specified <code>Rectangle</code> + * @return <code>true</code> if the <code>Rectangle</code> + * is contained entirely inside this <code>Rectangle</code>; + * <code>false</code> otherwise. + */ + public boolean contains(ReadableRectangle r) { + return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); + } + + /** + * Checks whether this <code>Rectangle</code> entirely contains + * the <code>Rectangle</code> + * at the specified location (<i>X</i>,&nbsp;<i>Y</i>) with the + * specified dimensions (<i>W</i>,&nbsp;<i>H</i>). + * @param X the specified x coordinate + * @param Y the specified y coordinate + * @param W the width of the <code>Rectangle</code> + * @param H the height of the <code>Rectangle</code> + * @return <code>true</code> if the <code>Rectangle</code> specified by + * (<i>X</i>,&nbsp;<i>Y</i>,&nbsp;<i>W</i>,&nbsp;<i>H</i>) + * is entirely enclosed inside this <code>Rectangle</code>; + * <code>false</code> otherwise. + */ + public boolean contains(int X, int Y, int W, int H) { + int w = this.width; + int h = this.height; + if ((w | h | W | H) < 0) { + // At least one of the dimensions is negative... + return false; + } + // Note: if any dimension is zero, tests below must return false... + int x = this.x; + int y = this.y; + if (X < x || Y < y) { + return false; + } + w += x; + W += X; + if (W <= X) { + // X+W overflowed or W was zero, return false if... + // either original w or W was zero or + // x+w did not overflow or + // the overflowed x+w is smaller than the overflowed X+W + if (w >= x || W > w) + return false; + } else { + // X+W did not overflow and W was not zero, return false if... + // original w was zero or + // x+w did not overflow and x+w is smaller than X+W + if (w >= x && W > w) + return false; + } + h += y; + H += Y; + if (H <= Y) { + if (h >= y || H > h) + return false; + } else { + if (h >= y && H > h) + return false; + } + return true; + } + + /** + * Determines whether or not this <code>Rectangle</code> and the specified + * <code>Rectangle</code> intersect. Two rectangles intersect if + * their intersection is nonempty. + * + * @param r the specified <code>Rectangle</code> + * @return <code>true</code> if the specified <code>Rectangle</code> + * and this <code>Rectangle</code> intersect; + * <code>false</code> otherwise. + */ + public boolean intersects(ReadableRectangle r) { + int tw = this.width; + int th = this.height; + int rw = r.getWidth(); + int rh = r.getHeight(); + if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) { + return false; + } + int tx = this.x; + int ty = this.y; + int rx = r.getX(); + int ry = r.getY(); + rw += rx; + rh += ry; + tw += tx; + th += ty; + // overflow || intersect + return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry)); + } + + /** + * Computes the intersection of this <code>Rectangle</code> with the + * specified <code>Rectangle</code>. Returns a new <code>Rectangle</code> + * that represents the intersection of the two rectangles. + * If the two rectangles do not intersect, the result will be + * an empty rectangle. + * + * @param r the specified <code>Rectangle</code> + * @return the largest <code>Rectangle</code> contained in both the + * specified <code>Rectangle</code> and in + * this <code>Rectangle</code>; or if the rectangles + * do not intersect, an empty rectangle. + */ + public Rectangle intersection(ReadableRectangle r, Rectangle dest) { + int tx1 = this.x; + int ty1 = this.y; + int rx1 = r.getX(); + int ry1 = r.getY(); + long tx2 = tx1; + tx2 += this.width; + long ty2 = ty1; + ty2 += this.height; + long rx2 = rx1; + rx2 += r.getWidth(); + long ry2 = ry1; + ry2 += r.getHeight(); + if (tx1 < rx1) + tx1 = rx1; + if (ty1 < ry1) + ty1 = ry1; + if (tx2 > rx2) + tx2 = rx2; + if (ty2 > ry2) + ty2 = ry2; + tx2 -= tx1; + ty2 -= ty1; + // tx2,ty2 will never overflow (they will never be + // larger than the smallest of the two source w,h) + // they might underflow, though... + if (tx2 < Integer.MIN_VALUE) + tx2 = Integer.MIN_VALUE; + if (ty2 < Integer.MIN_VALUE) + ty2 = Integer.MIN_VALUE; + if (dest == null) + dest = new Rectangle(tx1, ty1, (int) tx2, (int) ty2); + else + dest.setBounds(tx1, ty1, (int) tx2, (int) ty2); + return dest; + + } + + /** + * Computes the union of this <code>Rectangle</code> with the + * specified <code>Rectangle</code>. Returns a new + * <code>Rectangle</code> that + * represents the union of the two rectangles + * @param r the specified <code>Rectangle</code> + * @return the smallest <code>Rectangle</code> containing both + * the specified <code>Rectangle</code> and this + * <code>Rectangle</code>. + */ + public WritableRectangle union(ReadableRectangle r, WritableRectangle dest) { + int x1 = Math.min(x, r.getX()); + int x2 = Math.max(x + width, r.getX() + r.getWidth()); + int y1 = Math.min(y, r.getY()); + int y2 = Math.max(y + height, r.getY() + r.getHeight()); + dest.setBounds(x1, y1, x2 - x1, y2 - y1); + return dest; + } + + /** + * Adds a point, specified by the integer arguments <code>newx</code> + * and <code>newy</code>, to this <code>Rectangle</code>. The + * resulting <code>Rectangle</code> is + * the smallest <code>Rectangle</code> that contains both the + * original <code>Rectangle</code> and the specified point. + * <p> + * After adding a point, a call to <code>contains</code> with the + * added point as an argument does not necessarily return + * <code>true</code>. The <code>contains</code> method does not + * return <code>true</code> for points on the right or bottom + * edges of a <code>Rectangle</code>. Therefore, if the added point + * falls on the right or bottom edge of the enlarged + * <code>Rectangle</code>, <code>contains</code> returns + * <code>false</code> for that point. + * @param newx the x coordinates of the new point + * @param newy the y coordinates of the new point + */ + public void add(int newx, int newy) { + int x1 = Math.min(x, newx); + int x2 = Math.max(x + width, newx); + int y1 = Math.min(y, newy); + int y2 = Math.max(y + height, newy); + x = x1; + y = y1; + width = x2 - x1; + height = y2 - y1; + } + + /** + * Adds the specified <code>Point</code> to this + * <code>Rectangle</code>. The resulting <code>Rectangle</code> + * is the smallest <code>Rectangle</code> that contains both the + * original <code>Rectangle</code> and the specified + * <code>Point</code>. + * <p> + * After adding a <code>Point</code>, a call to <code>contains</code> + * with the added <code>Point</code> as an argument does not + * necessarily return <code>true</code>. The <code>contains</code> + * method does not return <code>true</code> for points on the right + * or bottom edges of a <code>Rectangle</code>. Therefore if the added + * <code>Point</code> falls on the right or bottom edge of the + * enlarged <code>Rectangle</code>, <code>contains</code> returns + * <code>false</code> for that <code>Point</code>. + * @param pt the new <code>Point</code> to add to this + * <code>Rectangle</code> + */ + public void add(ReadablePoint pt) { + add(pt.getX(), pt.getY()); + } + + /** + * Adds a <code>Rectangle</code> to this <code>Rectangle</code>. + * The resulting <code>Rectangle</code> is the union of the two + * rectangles. + * @param r the specified <code>Rectangle</code> + */ + public void add(ReadableRectangle r) { + int x1 = Math.min(x, r.getX()); + int x2 = Math.max(x + width, r.getX() + r.getWidth()); + int y1 = Math.min(y, r.getY()); + int y2 = Math.max(y + height, r.getY() + r.getHeight()); + x = x1; + y = y1; + width = x2 - x1; + height = y2 - y1; + } + + /** + * Resizes the <code>Rectangle</code> both horizontally and vertically. + * <p> + * This method modifies the <code>Rectangle</code> so that it is + * <code>h</code> units larger on both the left and right side, + * and <code>v</code> units larger at both the top and bottom. + * <p> + * The new <code>Rectangle</code> has (<code>x&nbsp;-&nbsp;h</code>, + * <code>y&nbsp;-&nbsp;v</code>) as its top-left corner, a + * width of + * <code>width</code>&nbsp;<code>+</code>&nbsp;<code>2h</code>, + * and a height of + * <code>height</code>&nbsp;<code>+</code>&nbsp;<code>2v</code>. + * <p> + * If negative values are supplied for <code>h</code> and + * <code>v</code>, the size of the <code>Rectangle</code> + * decreases accordingly. + * The <code>grow</code> method does not check whether the resulting + * values of <code>width</code> and <code>height</code> are + * non-negative. + * @param h the horizontal expansion + * @param v the vertical expansion + */ + public void grow(int h, int v) { + x -= h; + y -= v; + width += h * 2; + height += v * 2; + } + + /** + * Determines whether or not this <code>Rectangle</code> is empty. A + * <code>Rectangle</code> is empty if its width or its height is less + * than or equal to zero. + * @return <code>true</code> if this <code>Rectangle</code> is empty; + * <code>false</code> otherwise. + */ + public boolean isEmpty() { + return (width <= 0) || (height <= 0); + } + /** + * Checks whether two rectangles are equal. + * <p> + * The result is <code>true</code> if and only if the argument is not + * <code>null</code> and is a <code>Rectangle</code> object that has the + * same top-left corner, width, and height as this <code>Rectangle</code>. + * @param obj the <code>Object</code> to compare with + * this <code>Rectangle</code> + * @return <code>true</code> if the objects are equal; + * <code>false</code> otherwise. + */ + public boolean equals(Object obj) { + if (obj instanceof Rectangle) { + Rectangle r = (Rectangle) obj; + return ((x == r.x) && (y == r.y) && (width == r.width) && (height == r.height)); + } + return super.equals(obj); + } + + /** + * Debugging + * @return a String + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; + } + /** + * Gets the height. + * @return Returns a int + */ + public int getHeight() { + return height; + } + + /** + * Sets the height. + * @param height The height to set + */ + public void setHeight(int height) { + this.height = height; + } + + /** + * Gets the width. + * @return Returns a int + */ + public int getWidth() { + return width; + } + + /** + * Sets the width. + * @param width The width to set + */ + public void setWidth(int width) { + this.width = width; + } + + /** + * Gets the x. + * @return Returns a int + */ + public int getX() { + return x; + } + + /** + * Sets the x. + * @param x The x to set + */ + public void setX(int x) { + this.x = x; + } + + /** + * Gets the y. + * @return Returns a int + */ + public int getY() { + return y; + } + + /** + * Sets the y. + * @param y The y to set + */ + public void setY(int y) { + this.y = y; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Renderable.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Renderable.java new file mode 100644 index 0000000..f75bd2f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Renderable.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * + * Simple interface to things that can be Rendered. + * + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface Renderable { + + /** + * "Render" this thing. This will involve calls to the GL. + */ + void render(); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Timer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Timer.java new file mode 100644 index 0000000..1ae20aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/Timer.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import org.lwjgl.Sys; + +/** + * + * A hires timer. This measures time in seconds as floating point values. + * All Timers created are updated simultaneously by calling the static method + * tick(). This ensures that within a single iteration of a game loop that + * all timers are updated consistently with each other. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class Timer { + + // Record the timer resolution on classload + private static long resolution = Sys.getTimerResolution(); + + // Every so often we will re-query the timer resolution + private static final int QUERY_INTERVAL = 50; // in calls to tick() + private static int queryCount; + + // Globally keeps track of time for all instances of Timer + private static long currentTime; + + // When the timer was started + private long startTime; + + // The last time recorded by getTime() + private long lastTime; + + // Whether the timer is paused + private boolean paused; + + static { + tick(); + } + + /** + * Constructs a timer. The timer will be reset to 0.0 and resumed immediately. + */ + public Timer() { + reset(); + resume(); + } + + /** + * @return the time in seconds, as a float + */ + public float getTime() { + if (!paused) { + lastTime = currentTime - startTime; + } + + return (float) ((double) lastTime / (double) resolution); + } + /** + * @return whether this timer is paused + */ + public boolean isPaused() { + return paused; + } + + /** + * Pause the timer. Whilst paused the time will not change for this timer + * when tick() is called. + * + * @see #resume() + */ + public void pause() { + paused = true; + } + + /** + * Reset the timer. Equivalent to set(0.0f); + * @see #set(float) + */ + public void reset() { + set(0.0f); + } + + /** + * Resume the timer. + * @see #pause() + */ + public void resume() { + paused = false; + startTime = currentTime - lastTime; + } + + /** + * Set the time of this timer + * @param newTime the new time, in seconds + */ + public void set(float newTime) { + long newTimeInTicks = (long) ((double) newTime * (double) resolution); + startTime = currentTime - newTimeInTicks; + lastTime = newTimeInTicks; + } + + /** + * Get the next time update from the system's hires timer. This method should + * be called once per main loop iteration; all timers are updated simultaneously + * from it. + */ + public static void tick() { + currentTime = Sys.getTime(); + + // Periodically refresh the timer resolution: + queryCount ++; + if (queryCount > QUERY_INTERVAL) { + queryCount = 0; + resolution = Sys.getTimerResolution(); + } + } + + /** + * Debug output. + */ + public String toString() { + return "Timer[Time=" + getTime() + ", Paused=" + paused + "]"; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WaveData.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WaveData.java new file mode 100644 index 0000000..c12159b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WaveData.java @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +import org.lwjgl.openal.AL10; + +import com.sun.media.sound.WaveFileReader; + +/** + * + * Utitlity class for loading wavefiles. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public class WaveData { + /** actual wave data */ + public final ByteBuffer data; + + /** format type of data */ + public final int format; + + /** sample rate of data */ + public final int samplerate; + + /** + * Creates a new WaveData + * + * @param data actual wavedata + * @param format format of wave data + * @param samplerate sample rate of data + */ + private WaveData(ByteBuffer data, int format, int samplerate) { + this.data = data; + this.format = format; + this.samplerate = samplerate; + } + + /** + * Disposes the wavedata + */ + public void dispose() { + data.clear(); + } + + /** + * Creates a WaveData container from the specified url + * + * @param path URL to file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(URL path) { + try { + // due to an issue with AudioSystem.getAudioInputStream + // and mixing unsigned and signed code + // we will use the reader directly + WaveFileReader wfr = new WaveFileReader(); + return create(wfr.getAudioInputStream(new BufferedInputStream(path.openStream()))); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from: " + path + ", " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified in the classpath + * + * @param path path to file (relative, and in classpath) + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(String path) { + return create(Thread.currentThread().getContextClassLoader().getResource(path)); + } + + /** + * Creates a WaveData container from the specified inputstream + * + * @param is InputStream to read from + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(InputStream is) { + try { + return create( + AudioSystem.getAudioInputStream(is)); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from inputstream, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified bytes + * + * @param buffer array of bytes containing the complete wave file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(byte[] buffer) { + try { + return create( + AudioSystem.getAudioInputStream( + new BufferedInputStream(new ByteArrayInputStream(buffer)))); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from byte array, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified ByetBuffer. + * If the buffer is backed by an array, it will be used directly, + * else the contents of the buffer will be copied using get(byte[]). + * + * @param buffer ByteBuffer containing sound file + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(ByteBuffer buffer) { + try { + byte[] bytes = null; + + if(buffer.hasArray()) { + bytes = buffer.array(); + } else { + bytes = new byte[buffer.capacity()]; + buffer.get(bytes); + } + return create(bytes); + } catch (Exception e) { + org.lwjgl.LWJGLUtil.log("Unable to create from ByteBuffer, " + e.getMessage()); + return null; + } + } + + /** + * Creates a WaveData container from the specified stream + * + * @param ais AudioInputStream to read from + * @return WaveData containing data, or null if a failure occured + */ + public static WaveData create(AudioInputStream ais) { + //get format of data + AudioFormat audioformat = ais.getFormat(); + + // get channels + int channels = 0; + if (audioformat.getChannels() == 1) { + if (audioformat.getSampleSizeInBits() == 8) { + channels = AL10.AL_FORMAT_MONO8; + } else if (audioformat.getSampleSizeInBits() == 16) { + channels = AL10.AL_FORMAT_MONO16; + } else { + assert false : "Illegal sample size"; + } + } else if (audioformat.getChannels() == 2) { + if (audioformat.getSampleSizeInBits() == 8) { + channels = AL10.AL_FORMAT_STEREO8; + } else if (audioformat.getSampleSizeInBits() == 16) { + channels = AL10.AL_FORMAT_STEREO16; + } else { + assert false : "Illegal sample size"; + } + } else { + assert false : "Only mono or stereo is supported"; + } + + //read data into buffer + ByteBuffer buffer = null; + try { + int available = ais.available(); + if(available <= 0) { + available = ais.getFormat().getChannels() * (int) ais.getFrameLength() * ais.getFormat().getSampleSizeInBits() / 8; + } + byte[] buf = new byte[ais.available()]; + int read = 0, total = 0; + while ((read = ais.read(buf, total, buf.length - total)) != -1 + && total < buf.length) { + total += read; + } + buffer = convertAudioBytes(buf, audioformat.getSampleSizeInBits() == 16, audioformat.isBigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); + } catch (IOException ioe) { + return null; + } + + + //create our result + WaveData wavedata = + new WaveData(buffer, channels, (int) audioformat.getSampleRate()); + + //close stream + try { + ais.close(); + } catch (IOException ioe) { + } + + return wavedata; + } + + private static ByteBuffer convertAudioBytes(byte[] audio_bytes, boolean two_bytes_data, ByteOrder order) { + ByteBuffer dest = ByteBuffer.allocateDirect(audio_bytes.length); + dest.order(ByteOrder.nativeOrder()); + ByteBuffer src = ByteBuffer.wrap(audio_bytes); + src.order(order); + if (two_bytes_data) { + ShortBuffer dest_short = dest.asShortBuffer(); + ShortBuffer src_short = src.asShortBuffer(); + while (src_short.hasRemaining()) + dest_short.put(src_short.get()); + } else { + while (src.hasRemaining()) + dest.put(src.get()); + } + dest.rewind(); + return dest; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableColor.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableColor.java new file mode 100644 index 0000000..5f02464 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableColor.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.nio.ByteBuffer; + +/** + * Write interface for Colors + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritableColor { + /** + * Set a color + */ + void set(int r, int g, int b, int a); + /** + * Set a color + */ + void set(byte r, byte g, byte b, byte a); + /** + * Set a color + */ + void set(int r, int g, int b); + /** + * Set a color + */ + void set(byte r, byte g, byte b); + /** + * Set the Red component + */ + void setRed(int red); + /** + * Set the Green component + */ + void setGreen(int green); + /** + * Set the Blue component + */ + void setBlue(int blue); + /** + * Set the Alpha component + */ + void setAlpha(int alpha); + /** + * Set the Red component + */ + void setRed(byte red); + /** + * Set the Green component + */ + void setGreen(byte green); + /** + * Set the Blue component + */ + void setBlue(byte blue); + /** + * Set the Alpha component + */ + void setAlpha(byte alpha); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readRGBA(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readRGB(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readARGB(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readBGRA(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readBGR(ByteBuffer src); + /** + * Read a color from a byte buffer + * @param src The source buffer + */ + void readABGR(ByteBuffer src); + /** + * Set this color's color by copying another color + * @param src The source color + */ + void setColor(ReadableColor src); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableDimension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableDimension.java new file mode 100644 index 0000000..2c89400 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableDimension.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Write interface for Dimensions + * @author $Author$ + * @version $Revision$ + * $Id$ + + */ +public interface WritableDimension { + void setSize(int w, int h); + void setSize(ReadableDimension d); + /** + * Sets the height. + * @param height The height to set + */ + void setHeight(int height); + /** + * Sets the width. + * @param width The width to set + */ + void setWidth(int width); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritablePoint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritablePoint.java new file mode 100644 index 0000000..d777f17 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritablePoint.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Write interface for Points + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritablePoint { + void setLocation(int x, int y); + void setLocation(ReadablePoint p); + void setX(int x); + void setY(int y); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableRectangle.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableRectangle.java new file mode 100644 index 0000000..c821963 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/WritableRectangle.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +/** + * Write interface for Rectangles + * @author $Author$ + * @version $Revision$ + * $Id$ + */ +public interface WritableRectangle extends WritablePoint, WritableDimension { + + /** + * Sets the bounds of the rectangle + * @param x Position of rectangle on x axis + * @param y Position of rectangle on y axis + * @param width Width of rectangle + * @param height Height of rectangle + */ + void setBounds(int x, int y, int width, int height); + + /** + * Sets the bounds of the rectangle + * @param location + * @param size + */ + void setBounds(ReadablePoint location, ReadableDimension size); + + /** + * Sets the bounds of the rectangle + * @param src + */ + void setBounds(ReadableRectangle src); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/XPMFile.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/XPMFile.java new file mode 100644 index 0000000..c98c17d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/XPMFile.java @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.util.HashMap; +import java.util.StringTokenizer; + +/** + * <p> + * NOTE: This simple XPM reader does not support extensions nor hotspots + * </p> + * + * @author Brian Matzon <brian@matzon.dk> + * @author Jos Hirth + * @version $Revision$ + * $Id$ + */ + +public class XPMFile { + + /** Array of bytes (RGBA) */ + private byte bytes[]; + + private static final int WIDTH = 0; + + private static final int HEIGHT = 1; + + private static final int NUMBER_OF_COLORS = 2; + + private static final int CHARACTERS_PER_PIXEL = 3; + + private static int[] format = new int[4]; + + /* + * Private constructor, use load(String filename) + */ + private XPMFile() { + } + + /** + * Loads the XPM file + * + * @param file + * path to file + * @return XPMFile loaded, or exception + * @throws IOException + * If any IO exceptions occurs while reading file + */ + public static XPMFile load(String file) throws IOException { + return load(new FileInputStream(new File(file))); + } + + /** + * Loads the XPM file + * + * @param is + * InputStream to read file from + * @return XPMFile loaded, or exception + */ + public static XPMFile load(InputStream is) { + XPMFile xFile = new XPMFile(); + xFile.readImage(is); + return xFile; + } + + /** + * @return the height of the image. + */ + public int getHeight() { + return format[HEIGHT]; + } + + /** + * @return the width of the image. + */ + public int getWidth() { + return format[WIDTH]; + } + + /** + * @return The data of the image. + */ + public byte[] getBytes() { + return bytes; + } + + /** + * Read the image from the specified file. + */ + private void readImage(InputStream is) { + try { + LineNumberReader reader = new LineNumberReader( + new InputStreamReader(is)); + HashMap<String, Integer> colors = new HashMap<String, Integer>(); + + format = parseFormat(nextLineOfInterest(reader)); + + // setup color mapping + for (int i = 0; i < format[NUMBER_OF_COLORS]; i++) { + Object[] colorDefinition = parseColor(nextLineOfInterest(reader)); + colors.put((String)colorDefinition[0], (Integer)colorDefinition[1]); + } + + // read actual image (convert to RGBA) + bytes = new byte[format[WIDTH] * format[HEIGHT] * 4]; + for (int i = 0; i < format[HEIGHT]; i++) { + parseImageLine(nextLineOfInterest(reader), format, colors, i); + } + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException("Unable to parse XPM File"); + } + } + + /** + * Finds the next interesting line of text. + * + * @param reader + * The LineNumberReader to read from + * @return The next interesting String (with stripped quotes) + * @throws IOException + * If any IO exceptions occurs while reading file + */ + private static String nextLineOfInterest(LineNumberReader reader) + throws IOException { + String ret; + do { + ret = reader.readLine(); + } while (!ret.startsWith("\"")); + // lacks sanity check + return ret.substring(1, ret.lastIndexOf('\"')); + } + + /** + * Parses the format of the xpm file given a format string + * + * @param format + * String to parse + * @return Array specifying width, height, colors, characters per pixel + */ + private static int[] parseFormat(String format) { + // format should look like this: + // 16 16 122 2 + + // tokenize it + StringTokenizer st = new StringTokenizer(format); + + return new int[] { Integer.parseInt(st.nextToken()), /* width */ + Integer.parseInt(st.nextToken()), /* height */ + Integer.parseInt(st.nextToken()), /* colors */ + Integer.parseInt(st.nextToken()) /* chars per pixel */ + }; + } + + /** + * Given a line defining a color/pixel, parses this into an array containing + * a key and a color + * + * @param line + * Line to parse + * @return Array containing a key (String) and a color (Integer) + */ + private static Object[] parseColor(String line) { + // line should look like this: + // # c #0A0A0A + + // NOTE: will break if the color is something like "black" or "gray50" + // etc (instead of #rrggbb). + + String key = line.substring(0, format[CHARACTERS_PER_PIXEL]); + // since we always assume color as type we dont need to read it + // String type = line.substring(format[CHARACTERS_PER_PIXEL] + 1, + // format[CHARACTERS_PER_PIXEL] + 2); + String color = line.substring(format[CHARACTERS_PER_PIXEL] + 4); + + // we always assume type is color, and supplied as #<r><g><b> + return new Object[] { key, Integer.parseInt(color, 16) }; + } + + /** + * Parses an Image line into its byte values + * + * @param line + * Line of chars to parse + * @param format + * Format to expext it in + * @param colors + * Colors to lookup + * @param index + * current index into lines, we've reached + */ + private void parseImageLine(String line, int[] format, HashMap<String, Integer> colors, + int index) { + // offset for next line + int offset = index * 4 * format[WIDTH]; + + // read <format[CHARACTERS_PER_PIXEL]> characters <format[WIDTH]> times, + // each iteration equals one pixel + for (int i = 0; i < format[WIDTH]; i++) { + String key = line + .substring( + i * format[CHARACTERS_PER_PIXEL], + (i * format[CHARACTERS_PER_PIXEL] + format[CHARACTERS_PER_PIXEL])); + int color = colors.get(key); + bytes[offset + (i * 4)] = (byte) ((color & 0x00ff0000) >> 16); + bytes[offset + ((i * 4) + 1)] = (byte) ((color & 0x0000ff00) >> 8); + bytes[offset + ((i * 4) + 2)] = (byte) ((color & 0x000000ff) >> 0); // looks + // better + // :) + bytes[offset + ((i * 4) + 3)] = (byte) 0xff; // always 0xff alpha + } + } + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length != 1) { + System.out.println("usage:\nXPMFile <file>"); + } + + try { + String out = args[0].substring(0, args[0].indexOf(".")) + ".raw"; + XPMFile file = XPMFile.load(args[0]); + BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(new File(out))); + bos.write(file.getBytes()); + bos.close(); + + // showResult(file.getBytes()); + } catch (Exception e) { + e.printStackTrace(); + } + } + /* + private static void showResult(byte[] bytes) { + final BufferedImage i = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); + int c = 0; + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 16; x++) { + i.setRGB(x, y, (bytes[c] << 16) + (bytes[c + 1] << 8) + (bytes[c + 2] << 0) + (bytes[c + 3] << 24));//+(128<<24));// + c += 4; + } + } + + final Frame frame = new Frame("XPM Result"); + frame.add(new Canvas() { + + public void paint(Graphics g) { + g.drawImage(i, 0, 0, frame); + } + }); + + frame.addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + frame.dispose(); + } + + }); + + frame.setSize(100, 100); + frame.setVisible(true); + }*/ +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/applet/AppletLoader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/applet/AppletLoader.java new file mode 100644 index 0000000..41e5518 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/applet/AppletLoader.java @@ -0,0 +1,2259 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.applet; + +import java.applet.Applet; +import java.applet.AppletStub; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.MediaTracker; +import java.awt.image.ImageObserver; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilePermission; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.net.HttpURLConnection; +import java.net.JarURLConnection; +import java.net.SocketPermission; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.URLConnection; +import java.security.AccessControlException; +import java.security.AccessController; +import java.security.AllPermission; +import java.security.CodeSource; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.PrivilegedExceptionAction; +import java.security.cert.Certificate; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Queue; +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.jar.Pack200; +import java.util.zip.CRC32; +import java.util.zip.CheckedInputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * <p> + * The AppletLoader enables deployment of LWJGL to applets in an easy + * and polished way. The loader will display a configurable logo and progressbar + * while the relevant jars (generic and native) are downloaded from a specified source. + * </p> + * <p> + * The downloaded jars are extracted to the users temporary directory - and if enabled, cached for + * faster loading in future uses. + * </p> + * <p> + * The following applet parameters are required: + * <ul> + * <li>al_main - [String] Full package and class the applet to instantiate and display when loaded.</li> + * <li>al_jars - [String] Comma separated list of jars to download.</li> + * <p> + * <li>al_windows - [String] Jar containing native files for windows.</li> + * <li>al_linux - [String] Jar containing native files for linux.</li> + * <li>al_mac - [String] Jar containing native files for mac.</li> + * <li>al_solaris - [String] Jar containing native files for solaris.</li> + * <li>al_freebsd - [String] Jar containing native files for freebsd.</li> + * </ul> + * </p> + * <p> + * Additionally the following parameters can be supplied to tweak the behaviour of the AppletLoader. + * <ul> + * <li>al_cache - [boolean] Whether to use cache system. <i>Default: true</i>.</li> + * <li>al_version - [int or float] Version of deployment. If this is specified, the jars will be cached and + * reused if the version matches. If version doesn't match all of the files are reloaded.</li> + * + * <li>al_debug - [boolean] Whether to enable debug mode. <i>Default: false</i>.</li> + * <li>al_min_jre - [String] Specify the minimum jre version that the applet requires, should be in format like 1.6.0_24 or a subset like 1.6 <i>Default: 1.5</i>.</li> + * <li>al_prepend_host - [boolean] Whether to limit caching to this domain, disable if your applet is hosted on multiple domains and needs to share the cache. <i>Default: true</i>.</li> + * <li>al_lookup_threads - [int] Specify the number of concurrent threads to use to get file information before downloading. <i>Default: 1</i>.</li> + * <p> + * <li>al_windows64 - [String] If specified it will be used instead of al_windows on 64bit windows systems.</li> + * <li>al_windows32 - [String] If specified it will be used instead of al_windows on 32bit windows systems.</li> + * <li>al_linux64 - [String] If specified it will be used instead of al_linux on 64bit linux systems.</li> + * <li>al_linux32 - [String] If specified it will be used instead of al_linux on 32bit linux systems.</li> + * <li>al_mac32 - [String] If specified it will be used instead of al_mac on 64bit mac systems.</li> + * <li>al_mac64 - [String] If specified it will be used instead of al_mac on 32bit mac systems.</li> + * <li>al_macppc - [String] If specified it will be used instead of al_mac on PPC mac systems.</li> + * <p> + * <li>boxbgcolor - [String] any String AWT color ("red", "blue", etc), RGB (0-255) or hex formated color (#RRGGBB) to use as background. <i>Default: #ffffff</i>.</li> + * <li>boxfgcolor - [String] any String AWT color ("red", "blue", etc), RGB (0-255) or hex formated color (#RRGGBB) to use as foreground. <i>Default: #000000</i>.</li> + * <p> + * <li>al_logo - [String Path of of the logo resource to paint while loading.<i>Default: "appletlogo.gif"</i>.</li> + * <li>al_progressbar - [String] Path of the progressbar resource to paint on top of the logo, width clipped by percentage.<i>Default: "appletprogress.gif"</i>.</li> + * <p> + * <li>lwjgl_arguments - </li> [String] used to pass LWJGL parameters to LWJGL e.g. ("-Dorg.lwjgl.input.Mouse.allowNegativeMouseCoords=true -Dorg.lwjgl.util.Debug=true").</li> + * </ul> + * </p> + * @author kappaOne <one.kappa@gmail.com> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + * + * Contributors: + * <ul> + * <li>Arielsan</li> + * <li>Bobjob</li> + * <li>Dashiva</li> + * <li>Dr_evil</li> + * <li>Elias Naur</li> + * <li>Kevin Glass</li> + * <li>Matthias Mann</li> + * <li>Mickelukas</li> + * <li>NateS</li> + * <li>Pelle Johnsen</li> + * <li>Riven</li> + * <li>Ruben01</li> + * <li>Shannon Smith</li> + * </ul> + * + */ +public class AppletLoader extends Applet implements Runnable, AppletStub { + + /** initializing */ + public static final int STATE_INIT = 1; + + /** checking version of jre */ + public static final int STATE_CHECK_JRE_VERSION = 2; + + /** determining which packages that are required */ + public static final int STATE_DETERMINING_PACKAGES = 3; + + /** checking for already downloaded files */ + public static final int STATE_CHECKING_CACHE = 4; + + /** checking if any updates are available for cache files */ + public static final int STATE_CHECKING_FOR_UPDATES = 5; + + /** downloading packages */ + public static final int STATE_DOWNLOADING = 6; + + /** extracting packages */ + public static final int STATE_EXTRACTING_PACKAGES = 7; + + /** validating packages */ + public static final int STATE_VALIDATING_PACKAGES = 8; + + /** updating the classpath */ + public static final int STATE_UPDATING_CLASSPATH = 9; + + /** switching to real applet */ + public static final int STATE_SWITCHING_APPLET = 10; + + /** initializing real applet */ + public static final int STATE_INITIALIZE_REAL_APPLET = 11; + + /** stating real applet */ + public static final int STATE_START_REAL_APPLET = 12; + + /** done */ + public static final int STATE_DONE = 13; + + /** used to calculate length of progress bar */ + protected volatile int percentage; + + /** total size of download in bytes */ + protected int totalDownloadSize; + + /** current size of extracted in bytes */ + protected int currentSizeExtract; + + /** total size of extracted in bytes */ + protected int totalSizeExtract; + + /** logo to be shown while loading */ + protected Image logo, logoBuffer; + + /** progressbar to render while loading */ + protected Image progressbar, progressbarBuffer; + + /** offscreen image used */ + protected Image offscreen; + + /** set to true while painting is done */ + protected boolean painting; + + /** background color of applet */ + protected Color bgColor = Color.white; + + /** color to write foreground in */ + protected Color fgColor = Color.black; + + /** urls of the jars to download */ + protected URL[] urlList; + + /** classLoader used to add downloaded jars to the classpath */ + protected ClassLoader classLoader; + + /** actual thread that does the loading */ + protected Thread loaderThread; + + /** animation thread that renders our load screen while loading */ + protected Thread animationThread; + + /** applet to load after all downloads are complete */ + protected Applet lwjglApplet; + + /** whether we're running in debug mode */ + protected boolean debugMode; + + /** whether to prepend host to cache path */ + protected boolean prependHost; + + /** Used to store file names with lastModified time */ + protected HashMap<String, Long> filesLastModified; + + /** Sizes of files to download */ + protected int[] fileSizes; + + /** Number of native jars */ + protected int nativeJarCount; + + /** whether to use caching system, only download files that have changed */ + protected boolean cacheEnabled; + + /** String to display as a subtask */ + protected String subtaskMessage = ""; + + /** state of applet loader */ + protected volatile int state = STATE_INIT; + + /** whether lzma is supported */ + protected boolean lzmaSupported; + + /** whether pack200 is supported */ + protected boolean pack200Supported; + + /** whether to run in headless mode */ + protected boolean headless = false; + + /** whether to switch applets in headless mode or wait longer */ + protected boolean headlessWaiting = true; + + /** messages to be passed via liveconnect in headless mode */ + protected String[] headlessMessage; + + /** threads to use when fetching information of files to be downloaded */ + protected int concurrentLookupThreads; + + /** whether a fatal error occurred */ + protected boolean fatalError; + + /** whether a certificate refused error occurred */ + protected boolean certificateRefused; + + /** whether the minimum required JRE version is not found */ + protected boolean minimumJreNotFound; + + /** generic error message to display on error */ + protected String[] genericErrorMessage = { "An error occured while loading the applet.", + "Please contact support to resolve this issue.", + "<placeholder for error message>"}; + + /** error message to display if user refuses to accept certificate*/ + protected String[] certificateRefusedMessage = { "Permissions for Applet Refused.", + "Please accept the permissions dialog to allow", + "the applet to continue the loading process."}; + + /** error message to display if minimum JRE version is not met */ + protected String[] minimumJREMessage = { "Your version of Java is out of date.", + "Visit java.com to get the latest version.", + "Java <al_min_jre> or greater is required."}; + + /** fatal error message to display */ + protected String[] errorMessage; + + /** have natives been loaded by another instance of this applet */ + protected static boolean natives_loaded; + + /* + * @see java.applet.Applet#init() + */ + public void init() { + setState(STATE_INIT); + + // sanity check + String[] requiredArgs = {"al_main", "al_jars"}; + for ( String requiredArg : requiredArgs ) { + if ( getParameter(requiredArg) == null ) { + fatalErrorOccured("missing required applet parameter: " + requiredArg, null); + return; + } + } + + // whether to use cache system + cacheEnabled = getBooleanParameter("al_cache", true); + + // whether to run in debug mode + debugMode = getBooleanParameter("al_debug", false); + + // whether to prepend host to cache path + prependHost = getBooleanParameter("al_prepend_host", true); + + // whether to run in headless mode + headless = getBooleanParameter("al_headless", false); + + // obtain the number of concurrent lookup threads to use + concurrentLookupThreads = getIntParameter("al_lookup_threads", 1); // defaults to 1 + + // get colors of applet + bgColor = getColor("boxbgcolor", Color.white); + setBackground(bgColor); + fgColor = getColor("boxfgcolor", Color.black); + + if (!headless) { + // load logos + logo = getImage(getStringParameter("al_logo", "appletlogo.gif")); + progressbar = getImage(getStringParameter("al_progressbar", "appletprogress.gif")); + } + + // check for lzma support + try { + Class.forName("LZMA.LzmaInputStream"); + lzmaSupported = true; + } catch (Throwable e) { + /* no lzma support */ + } + + // check pack200 support + try { + java.util.jar.Pack200.class.getSimpleName(); + pack200Supported = true; + } catch (Throwable e) { + /* no pack200 support */ + } + } + + /** + * Generates a stacktrace in the form of a string + * @param exception Exception to make stacktrace of + * @return Stacktrace of exception in the form of a string + */ + private static String generateStacktrace(Exception exception) { + Writer result = new StringWriter(); + PrintWriter printWriter = new PrintWriter(result); + exception.printStackTrace(printWriter); + return result.toString(); + } + + /* + * @see java.applet.Applet#start() + */ + public void start() { + if (lwjglApplet != null) { + lwjglApplet.start(); + } + else { + if(loaderThread == null && !fatalError) { + loaderThread = new Thread(this); + loaderThread.setName("AppletLoader.loaderThread"); + loaderThread.start(); + + if (!headless) { + animationThread = new Thread() { + public void run() { + while(loaderThread != null) { + repaint(); + AppletLoader.this.sleep(100); + } + animationThread = null; + } + }; + animationThread.setName("AppletLoader.animationthread"); + animationThread.start(); + } + } + } + } + + /* + * @see java.applet.Applet#stop() + */ + public void stop() { + if (lwjglApplet != null) { + lwjglApplet.stop(); + } + } + + /* + * @see java.applet.Applet#destroy() + */ + public void destroy() { + if (lwjglApplet != null) { + lwjglApplet.destroy(); + } + } + + /** + * Clean up resources + */ + protected void cleanUp() { + progressbar = null; + logo = null; + + logoBuffer = null; + progressbarBuffer = null; + + offscreen = null; + } + + /** + * Retrieves the applet that has been loaded. Useful for liveconnect. + */ + public Applet getApplet() { + return lwjglApplet; + } + + /** + * Retrieves the current status of the AppletLoader and is + * used by liveconnect when running in headless mode. + * + * This method will return the current progress of the AppletLoader + * as a value from 0-100. In the case of a fatal error it will + * return -1. If the certificate is refused it will return -2. + * If the minimum jre requirement is not met will return -3. + * + * When method returns 100 the AppletLoader will sleep until the + * method is called again. When called again it will switch to the + * LWJGL Applet. This is a useful trigger to start the LWJGL applet + * when needed. + */ + public int getStatus() { + if (fatalError) { + headlessMessage = errorMessage; + + if (certificateRefused) return -2; + if (minimumJreNotFound) return -3; + return -1; + } + + if (percentage == 100 && headlessWaiting) { + headlessWaiting = false; + } + + if (percentage == 95) { + percentage = 100; // ready to switch applet + } + + String[] message = {getDescriptionForState(), subtaskMessage}; + headlessMessage = message; + + return percentage; + } + + /** + * Retrieves the current message for the current status. + * Used by liveconnect when running in headless mode. + */ + public String[] getMessages() { + return headlessMessage; + } + + /** + * Transfers the call of AppletResize from the stub to the lwjglApplet. + */ + public void appletResize(int width, int height) { + resize(width, height); + } + + /* + * @see java.awt.Container#update(java.awt.Graphics) + */ + public final void update(Graphics g) { + paint(g); + } + + /* + * @see java.awt.Container#paint(java.awt.Graphics) + */ + public void paint(Graphics g) { + // don't paint loader if applet loaded + if(state == STATE_DONE) { + cleanUp(); // clean up resources + return; + } + + // no drawing in headless mode + if (headless) return; + + // create offscreen if missing + if (offscreen == null) { + offscreen = createImage(getWidth(), getHeight()); + + // create buffers for animated gifs + if (logo != null) { + logoBuffer = createImage(logo.getWidth(null), logo.getHeight(null)); + // add image observer, it will notify when next animated gif frame is ready + offscreen.getGraphics().drawImage(logo, 0, 0, this); + // in case image is not animated fill image buffer once + imageUpdate(logo, ImageObserver.FRAMEBITS, 0, 0, 0, 0); + } + + if (progressbar != null) { + progressbarBuffer = createImage(progressbar.getWidth(null), progressbar.getHeight(null)); + // add image observer, it will notify when next animated gif frame is ready + offscreen.getGraphics().drawImage(progressbar, 0, 0, this); + // in case image is not animated fill image buffer once + imageUpdate(progressbar, ImageObserver.FRAMEBITS, 0, 0, 0, 0); + } + } + + // draw everything onto an image before drawing to avoid flicker + Graphics og = offscreen.getGraphics(); + FontMetrics fm = og.getFontMetrics(); + + // clear background color + og.setColor(bgColor); + og.fillRect(0, 0, offscreen.getWidth(null), offscreen.getHeight(null)); + + og.setColor(fgColor); + + // if we had a failure of some sort, notify the user + if (fatalError) { + for(int i=0; i<errorMessage.length; i++) { + if(errorMessage[i] != null) { + int messageX = (offscreen.getWidth(null) - fm.stringWidth(errorMessage[i])) / 2; + int messageY = (offscreen.getHeight(null) - (fm.getHeight() * errorMessage.length)) / 2; + + og.drawString(errorMessage[i], messageX, messageY + i*fm.getHeight()); + } + } + } else { + og.setColor(fgColor); + + painting = true; + + // get position at the middle of the offscreen buffer + int x = offscreen.getWidth(null)/2; + int y = offscreen.getHeight(null)/2; + + // draw logo + if (logo != null) { + og.drawImage(logoBuffer, x-logo.getWidth(null)/2, y-logo.getHeight(null)/2, this); + } + + // draw message + String message = getDescriptionForState(); + + int messageX = (offscreen.getWidth(null) - fm.stringWidth(message)) / 2; + int messageY = y + 20; + + if (logo != null) messageY += logo.getHeight(null)/2; + else if (progressbar != null) messageY += progressbar.getHeight(null)/2; + + og.drawString(message, messageX, messageY); + + // draw subtaskmessage, if any + if(subtaskMessage.length() > 0) { + messageX = (offscreen.getWidth(null) - fm.stringWidth(subtaskMessage)) / 2; + og.drawString(subtaskMessage, messageX, messageY+20); + } + + // draw loading progress bar, clipping it depending on percentage done + if (progressbar != null) { + int barSize = (progressbar.getWidth(null) * percentage) / 100; + og.clipRect(x-progressbar.getWidth(null)/2, 0, barSize, offscreen.getHeight(null)); + og.drawImage(progressbarBuffer, x-progressbar.getWidth(null)/2, y-progressbar.getHeight(null)/2, this); + } + + painting = false; + } + + og.dispose(); + + // finally draw it all centred + g.drawImage(offscreen, (getWidth() - offscreen.getWidth(null))/2, (getHeight() - offscreen.getHeight(null))/2, null); + } + + /** + * When an animated gif frame is ready to be drawn the ImageObserver + * will call this method. + * + * The Image frame is copied into a buffer, which is then drawn. + * This is done to prevent image tearing on gif animations. + */ + public boolean imageUpdate(Image img, int flag, int x, int y, int width, int height) { + + // finish with this ImageObserver + if (state == STATE_DONE) return false; + + // if image frame is ready to be drawn and is currently not being painted + if (flag == ImageObserver.FRAMEBITS && !painting) { + Image buffer; + + // select which buffer to fill + if (img == logo) buffer = logoBuffer; + else buffer = progressbarBuffer; + + Graphics g = buffer.getGraphics(); + + // clear background on buffer + g.setColor(bgColor); + g.fillRect(0, 0, buffer.getWidth(null), buffer.getHeight(null)); + + // buffer background is cleared, so draw logo under progressbar + if (img == progressbar && logo != null) { + g.drawImage(logoBuffer, progressbar.getWidth(null)/2-logo.getWidth(null)/2, + progressbar.getHeight(null)/2-logo.getHeight(null)/2, null); + } + + g.drawImage(img, 0, 0, this); + g.dispose(); + + repaint(); + } + + return true; + } + + /** + * @return string describing the state of the loader + */ + protected String getDescriptionForState() { + switch (state) { + case STATE_INIT: + return "Initializing loader"; + case STATE_CHECK_JRE_VERSION: + return "Checking version"; + case STATE_DETERMINING_PACKAGES: + return "Determining packages to load"; + case STATE_CHECKING_CACHE: + return "Calculating download size"; + case STATE_CHECKING_FOR_UPDATES: + return "Checking for updates"; + case STATE_DOWNLOADING: + return "Downloading packages"; + case STATE_EXTRACTING_PACKAGES: + return "Extracting downloaded packages"; + case STATE_VALIDATING_PACKAGES: + return "Validating packages"; + case STATE_UPDATING_CLASSPATH: + return "Updating classpath"; + case STATE_SWITCHING_APPLET: + return "Switching applet"; + case STATE_INITIALIZE_REAL_APPLET: + return "Initializing real applet"; + case STATE_START_REAL_APPLET: + return "Starting real applet"; + case STATE_DONE: + return "Done loading"; + default: + return "unknown state"; + } + } + + /** + * Trims the passed file string based on the available capabilities + * @param file string of files to be trimmed + * @return trimmed string based on capabilities of client + */ + protected String trimExtensionByCapabilities(String file) { + if (!pack200Supported) { + file = file.replace(".pack", ""); + } + + if (!lzmaSupported && file.endsWith(".lzma")) { + file = file.replace(".lzma", ""); + System.out.println("LZMA decoder (lzma.jar) not found, trying " + file + " without lzma extension."); + } + return file; + } + + /** + * Reads list of jars to download and adds the urls to urlList + * also finds out which OS you are on and adds appropriate native + * jar to the urlList + */ + protected void loadJarURLs() throws Exception { + setState(STATE_DETERMINING_PACKAGES); + + // jars to load + String jarList = getParameter("al_jars"); + String nativeJarList = null; + + String osName = System.getProperty("os.name"); + + if (osName.startsWith("Win")) { + + // check if arch specific natives have been specified + if (System.getProperty("os.arch").endsWith("64")) { + nativeJarList = getParameter("al_windows64"); + } else { + nativeJarList = getParameter("al_windows32"); + } + + if (nativeJarList == null) { + nativeJarList = getParameter("al_windows"); + } + + } else if (osName.startsWith("Linux") || osName.startsWith("Unix")) { + + // check if arch specific natives have been specified + if (System.getProperty("os.arch").endsWith("64")) { + nativeJarList = getParameter("al_linux64"); + } else { + nativeJarList = getParameter("al_linux32"); + } + + if (nativeJarList == null) { + nativeJarList = getParameter("al_linux"); + } + + } else if (osName.startsWith("Mac") || osName.startsWith("Darwin")) { + + // check if arch specific natives have been specified + if (System.getProperty("os.arch").endsWith("64")) { + nativeJarList = getParameter("al_mac64"); + } else if (System.getProperty("os.arch").contains("ppc")) { + nativeJarList = getParameter("al_macppc"); + } else { + nativeJarList = getParameter("al_mac32"); + } + + if (nativeJarList == null) { + nativeJarList = getParameter("al_mac"); + } + + } else if (osName.startsWith("Solaris") || osName.startsWith("SunOS")) { + nativeJarList = getParameter("al_solaris"); + } else if (osName.startsWith("FreeBSD")) { + nativeJarList = getParameter("al_freebsd"); + } else { + fatalErrorOccured("OS (" + osName + ") not supported", null); + return; + } + + if (nativeJarList == null) { + fatalErrorOccured("no lwjgl natives files found", null); + return; + } + + jarList = trimExtensionByCapabilities(jarList); + StringTokenizer jars = new StringTokenizer(jarList, ", "); + + nativeJarList = trimExtensionByCapabilities(nativeJarList); + StringTokenizer nativeJars = new StringTokenizer(nativeJarList, ", "); + + int jarCount = jars.countTokens(); + nativeJarCount = nativeJars.countTokens(); + + urlList = new URL[jarCount+nativeJarCount]; + + URL path = getCodeBase(); + + // set jars urls + for (int i = 0; i < jarCount; i++) { + urlList[i] = new URL(path, jars.nextToken()); + } + + for (int i = jarCount; i < jarCount+nativeJarCount; i++) { + urlList[i] = new URL(path, nativeJars.nextToken()); + } + } + + /** + * 9 steps + * + * 1) check jre version meets minimum requirements + * 2) check applet cache and decide which jars to download + * 3) download the jars + * 4) extract native files + * 5) validate jars for any corruption + * 6) save applet cache information + * 7) add jars to class path + * 8) set any lwjgl properties + * 9) switch to loaded applet + */ + public void run() { + percentage = 5; + + try { + debug_sleep(2000); + + // check JRE version meets minimum requirements + if (!isMinJREVersionAvailable()) { + minimumJreNotFound = true; + fatalErrorOccured("Java " + getStringParameter("al_min_jre", "1.5") + " or greater is required.", null); + return; + } + + // parse the urls for the jars into the url list + loadJarURLs(); + + // get path where applet files will be stored + String path = getCacheDirectory(); + + File dir = new File(path); + + // create directory + if (!dir.exists()) { + dir.mkdirs(); + } + + File versionFile = new File(dir, "version"); + + // if specified applet version already available don't download anything + boolean versionAvailable = false; + + // version string of applet + String version = getParameter("al_version"); + + // if applet version specifed, compare with version in the cache + if (version != null) { + versionAvailable = compareVersion(versionFile, version.toLowerCase()); + } + + // if jars not available or need updating download them + if (!versionAvailable) { + // get jars file sizes and check cache + getJarInfo(dir); // 5-15% + + // downloads jars from the server + downloadJars(path); // 15-55% + + // Extract Pack and LZMA files + extractJars(path); // 55-65% + + // Extracts Native Files + extractNatives(path); // 65-80% + + // Validate Jars // 80-90% + validateJars(path); + + // save version information once jars downloaded successfully + if (version != null) { + percentage = 90; + writeObjectFile(versionFile, version.toLowerCase()); + } + + // save file names with last modified info once downloaded successfully + writeObjectFile(new File(dir, "timestamps"), filesLastModified); + } + + // add the downloaded jars and natives to classpath + updateClassPath(path); + + // set lwjgl properties + setLWJGLProperties(); + + // if headless mode then sleep, until told to continue + if (headless) { + while(headlessWaiting) { + Thread.sleep(100); + } + } + + // make applet switch on the EDT as an AWT/Swing permission dialog could be called + EventQueue.invokeAndWait(new Runnable() { + public void run() { + try { + switchApplet(); + } catch (Exception e) { + fatalErrorOccured("This occurred while '" + getDescriptionForState() + "'", e); + } + setState(STATE_DONE); + repaint(); + } + }); + + } catch (Exception e) { + certificateRefused = e instanceof AccessControlException; + fatalErrorOccured("This occurred while '" + getDescriptionForState() + "'", e); + } finally { + loaderThread = null; + } + } + + /** + * When this method is supplied with a JRE version it will compare it to the + * current JRE version. + * + * minimum requried JRE version is set using al_min_jre parameter, if not + * this is not set then the value will default to version 1.5 + * + * The minimumVersion should follow a structure such as x.x.x_x + * Example values would include 1.6.0_10 or a subset like 1.6.0 or 1.6 + * + * @return returns true if the available version is greater or equal to the + * minimum version required + * + * @throws Exception a NumberFormatException is thrown if the string is not valid + */ + public boolean isMinJREVersionAvailable() throws Exception { + setState(STATE_CHECK_JRE_VERSION); + + String minimumVersion = getStringParameter("al_min_jre", "1.5"); + String javaVersion = System.getProperty("java.version"); + + // remove dash and anything after it (letters) from version string e.g. 1.5.0_01-ea + minimumVersion = javaVersion.split("-")[0]; + javaVersion = minimumVersion.split("-")[0]; + + // split version string into a string arrays + String[] jvmVersionData = javaVersion.split("[_\\.]"); + String[] minVersionData = minimumVersion.split("[_\\.]"); + + int maxLength = Math.max(jvmVersionData.length, minVersionData.length); + + // convert string arrays into int arrays + int[] jvmVersion = new int[maxLength]; + int[] minVersion = new int[maxLength]; + + for (int i = 0; i < jvmVersionData.length; i++) { + jvmVersion[i] = Integer.parseInt(jvmVersionData[i]); + } + + for (int i = 0; i < minVersionData.length; i++) { + minVersion[i] = Integer.parseInt(minVersionData[i]); + } + + // compare versions + for (int i = 0; i < maxLength; i++) { + if (jvmVersion[i] < minVersion[i]) return false; // minVersion is greater then jvmVersion + } + + return true; + } + + /** + * This method will return true if the version stored in the file + * matches the supplied String version. + * + * @param versionFile - location to file containing version information + * @param version - String version that needs to be compared + * @return returns true if the version in file matches specified version + */ + protected boolean compareVersion(File versionFile, String version) { + // if version file exists + if (versionFile.exists()) { + String s = readStringFile(versionFile); + + // compare to version with file + if (s != null && s.equals(version)) { + percentage = 90; // not need to download cache files again + + if(debugMode) { + System.out.println("Loading Cached Applet Version: " + version); + } + debug_sleep(2000); + + return true; // version matches file + } + } + + return false; + } + + /** + * Parses the java_arguments list and sets lwjgl specific + * properties accordingly, before the launch. + */ + protected void setLWJGLProperties() { + String lwjglArguments = getParameter("lwjgl_arguments"); + + if(lwjglArguments != null && lwjglArguments.length() > 0) { + int start = lwjglArguments.indexOf("-Dorg.lwjgl"); + while(start != -1) { + int end = lwjglArguments.indexOf(" ", start); + if(end == -1) { + end = lwjglArguments.length(); + } + String[] keyValue = lwjglArguments.substring(start+2, end).split("="); + System.setProperty(keyValue[0], keyValue[1]); + if(debugMode) { + System.out.println("Setting property " + keyValue[0] + " to " + keyValue[1]); + } + start = lwjglArguments.indexOf("-Dorg.lwjgl", end); + } + } + } + + /** + * This method will return the location of the cache directory. All the + * applet files will be downloaded and stored here. A folder will be + * created inside the LWJGL cache directory from the al_title parameter. + * This folder will also be prepended by the host name of the codebase + * to avoid conflict with same named applets on other hosts. + * + * @return path to applets cache directory + * @throws Exception if access is denied + */ + protected String getCacheDirectory() throws Exception { + + String path = AccessController.doPrivileged(new PrivilegedExceptionAction<String>() { + public String run() throws Exception { + + // we append the code base to avoid naming collisions with al_title + String codebase = ""; + if(prependHost) { + codebase = getCodeBase().getHost(); + if(codebase == null || codebase.length() == 0) { + codebase = "localhost"; + } + codebase += File.separator; + } + return getLWJGLCacheDir() + File.separator + codebase + getParameter("al_title") + File.separator; + } + }); + + return path; + } + + /** + * Get path to the lwjgl cache directory. This location will be where + * the OS keeps temporary files. + * + * @return path to the lwjgl cache directory + */ + protected String getLWJGLCacheDir() { + String cacheDir = System.getProperty("deployment.user.cachedir"); + + if (cacheDir == null || System.getProperty("os.name").startsWith("Win")) { + cacheDir = System.getProperty("java.io.tmpdir"); + } + + return cacheDir + File.separator + "lwjglcache"; + } + + /** + * read String object from File + * + * @param file to be read + * @return the String stored in the file or null if it fails + */ + protected String readStringFile(File file) { + try { + return (String)readObjectFile(file); + } catch (Exception e) { + // failed to read version file + e.printStackTrace(); + } + + // return null if failed to read file + return null; + } + + /** + * read the HashMap from File + * + * @param file the file to read + * @return the hashmap stored in the file or an empty hashmap if it fails + */ + @SuppressWarnings("unchecked") + protected HashMap<String, Long> readHashMapFile(File file) { + + try { + return (HashMap<String, Long>) readObjectFile(file); + } catch (Exception e) { + // failed to read hashmap from file + e.printStackTrace(); + } + + // return an empty map if failed to read file + return new HashMap<String, Long>(); + } + + /** + * read the object from the File + * + * @param file the file to read + * @return the object contained in the file or null if it fails + * @throws Exception if it fails to read object from file + */ + protected Object readObjectFile(File file) throws Exception { + FileInputStream fis = new FileInputStream(file); + + try { + ObjectInputStream dis = new ObjectInputStream(fis); + Object object = dis.readObject(); + dis.close(); + return object; + } catch (Exception e) { + // failed to read file + throw e; + } finally { + fis.close(); + } + } + + /** + * write object to specified File + * + * @param file the file to write out to + * @param object the contents of the file + * @throws Exception if it fails to write file + */ + protected void writeObjectFile(File file, Object object) throws Exception { + FileOutputStream fos = new FileOutputStream(file); + try { + ObjectOutputStream dos = new ObjectOutputStream(fos); + dos.writeObject(object); + dos.close(); + } finally { + fos.close(); + } + } + + /** + * Edits the ClassPath at runtime to include the jars + * that have just been downloaded and then adds the + * lwjgl natives folder property. + * + * @param path location where applet is stored + * @throws Exception if it fails to add classpath + */ + protected void updateClassPath(final String path) throws Exception { + + setState(STATE_UPDATING_CLASSPATH); + + percentage = 95; + + URL[] urls = new URL[urlList.length]; + + for (int i = 0; i < urlList.length; i++) { + String file = new File(path, getJarName(urlList[i])).toURI().toString(); + // fix JVM bug where ! is not escaped + file = file.replace("!", "%21"); + urls[i] = new URL(file); + } + + // get AppletLoader certificates + final Certificate[] certs = getCurrentCertificates(); + + // detect if we are running on a mac and save result as boolean + String osName = System.getProperty("os.name"); + final boolean isMacOS = (osName.startsWith("Mac") || osName.startsWith("Darwin")); + + // add downloaded jars to the classpath with required permissions + classLoader = new URLClassLoader(urls) { + protected PermissionCollection getPermissions (CodeSource codesource) { + PermissionCollection perms = null; + + try { + // no permissions + perms = new Permissions(); + + // if certificates match the AppletLoader certificates then we should be all set + if (certificatesMatch(certs, codesource.getCertificates())) { + perms.add(new AllPermission()); + return perms; + } + + String host = getCodeBase().getHost(); + if (host != null && (host.length() > 0)) { + // add permission for downloaded jars to access host they were from + perms.add(new SocketPermission(host, "connect,accept")); + } + else if ( "file".equals(codesource.getLocation().getProtocol()) ) { + // if running locally add file permission + String path = codesource.getLocation().getFile().replace('/', File.separatorChar); + perms.add(new FilePermission(path, "read")); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return perms; + } + + // allow non lwjgl native to be found from cache directory + protected String findLibrary (String libname) { + String libPath = path + "natives" + File.separator + System.mapLibraryName(libname); + + if (new File(libPath).exists()) { + return libPath; + } + + return super.findLibrary(libname); + } + }; + + debug_sleep(2000); + + // unload natives loaded by a previous instance of this lwjgl applet + unloadNatives(path); + + // add natives files path to native class path + System.setProperty("org.lwjgl.librarypath", path + "natives"); + + // Make sure jinput knows about the new path too + System.setProperty("net.java.games.input.librarypath", path + "natives"); + + // set the library path, useful for non lwjgl natives + System.setProperty("java.library.path", path + "natives"); + + // mark natives as loaded + natives_loaded = true; + } + + /** + * Unload natives loaded by a different classloader. + * + * Due to limitations of the jvm, native files can only + * be loaded once and only be used by the classloader + * they were loaded from. + * + * Due to the way applets on plugin1 work, one jvm must + * be used for all applets. We need to use multiple + * classloaders in the same jvm due to LWJGL's static + * nature. In order to solve this we simply remove the + * natives from a previous classloader allowing a new + * classloader to use those natives in the same jvm. + * + * This method will only attempt to unload natives from a + * previous classloader if it detects that the natives have + * been loaded in the same jvm. + * + * @param nativePath directory where natives are stored + */ + private void unloadNatives(String nativePath) { + + // check whether natives have been loaded into this jvm + if (!natives_loaded) { + return; + } + + try { + Field field = ClassLoader.class.getDeclaredField("loadedLibraryNames"); + field.setAccessible(true); + Vector libs = (Vector) field.get(getClass().getClassLoader()); + + String path = new File(nativePath).getCanonicalPath(); + + for (int i = 0; i < libs.size(); i++) { + String s = (String) libs.get(i); + + // if a native from the nativePath directory is loaded, unload it + if (s.startsWith(path)) { + libs.remove(i); + i--; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * replace the current applet with the lwjgl applet + * using AppletStub and initialise and start it + */ + protected void switchApplet() throws Exception { + + setState(STATE_SWITCHING_APPLET); + percentage = 100; + + debug_sleep(2000); + + // set correct context classloader for lwjgl applet + Thread.currentThread().setContextClassLoader(classLoader); + + Class appletClass = classLoader.loadClass(getParameter("al_main")); + lwjglApplet = (Applet) appletClass.newInstance(); + + lwjglApplet.setStub(this); + lwjglApplet.setSize(getWidth(), getHeight()); + + setLayout(new BorderLayout()); + add(lwjglApplet); + validate(); + + setState(STATE_INITIALIZE_REAL_APPLET); + lwjglApplet.init(); + + setState(STATE_START_REAL_APPLET); + lwjglApplet.start(); + } + + /** + * This method will get the files sizes of the files to download. + * It wil further get the lastModified time of files + * and save it in a hashmap, if cache is enabled it will mark + * those files that have not changed since last download to not + * redownloaded. + * + * @param dir - location to read cache file from + * @throws Exception - if fails to get infomation + */ + protected void getJarInfo(File dir) throws Exception { + setState(STATE_CHECKING_CACHE); + + filesLastModified = new HashMap<String, Long>(); + + // store file sizes and mark which files not to download + fileSizes = new int[urlList.length]; + + File timestampsFile = new File(dir, "timestamps"); + + // if timestamps file exists, load it + if (timestampsFile.exists()) { + setState(STATE_CHECKING_FOR_UPDATES); + filesLastModified = readHashMapFile(timestampsFile); + } + + // calculate total size of jars to download + + ExecutorService executorService = Executors.newFixedThreadPool(concurrentLookupThreads); + Queue<Future> requests = new LinkedList<Future>(); + + // create unique object to sync code in requests + final Object sync = new Integer(1); + + for (int j = 0; j < urlList.length; j++) { + final int i = j; + + Future request = executorService.submit(new Runnable() { + + public void run() { + + try { + + URLConnection urlconnection = urlList[i].openConnection(); + urlconnection.setDefaultUseCaches(false); + if (urlconnection instanceof HttpURLConnection) { + ((HttpURLConnection) urlconnection).setRequestMethod("HEAD"); + } + + fileSizes[i] = urlconnection.getContentLength(); + + long lastModified = urlconnection.getLastModified(); + String fileName = getFileName(urlList[i]); + + if (cacheEnabled && lastModified != 0 && filesLastModified.containsKey(fileName)) { + long savedLastModified = filesLastModified.get(fileName); + + // if lastModifed time is the same, don't redownload + if (savedLastModified == lastModified) { + fileSizes[i] = -2; // mark it to not redownload + } + } + + if (fileSizes[i] >= 0) { + synchronized (sync) { + totalDownloadSize += fileSizes[i]; + } + } + + // put key and value in the hashmap + filesLastModified.put(fileName, lastModified); + + } catch (Exception e) { + throw new RuntimeException("Failed to fetch information for " + urlList[i], e); + } + }}); + + requests.add(request); + } + + while (!requests.isEmpty()) { + Iterator<Future> iterator = requests.iterator(); + while (iterator.hasNext()) { + Future request = iterator.next(); + if (request.isDone()) { + request.get(); // will throw an exception if request thrown an exception. + iterator.remove(); + + // update progress bar + percentage = 5 + (int) (10 * (urlList.length - requests.size()) / (float) urlList.length); + } + } + + Thread.sleep(10); + } + + executorService.shutdown(); + } + + /** + * Will download the jars from the server using the list of urls + * in urlList, while at the same time updating progress bar + * + * @param path location of the directory to save to + * @throws Exception if download fails + */ + protected void downloadJars(String path) throws Exception { + setState(STATE_DOWNLOADING); + + URLConnection urlconnection; + + int initialPercentage = percentage = 15; + int amountDownloaded = 0; + + // download each jar + byte buffer[] = new byte[65536]; + for (int i = 0; i < urlList.length; i++) { + + // skip file if marked as -2 (already downloaded and not changed) + if (fileSizes[i] == -2) continue; + + int unsuccessfulAttempts = 0; + int maxUnsuccessfulAttempts = 3; + boolean downloadFile = true; + + String currentFile = getFileName(urlList[i]); + + // download the jar a max of 3 times + while(downloadFile) { + downloadFile = false; + + debug_sleep(2000); + + try { + urlconnection = urlList[i].openConnection(); + urlconnection.setUseCaches(false); + + if (urlconnection instanceof HttpURLConnection) { + urlconnection.setRequestProperty("Cache-Control", "no-store,max-age=0,no-cache"); + urlconnection.connect(); + } + + + InputStream inputstream = getJarInputStream(currentFile, urlconnection); + FileOutputStream fos = new FileOutputStream(path + currentFile); + + + int bufferSize; + int currentDownload = 0; + + long downloadStartTime = System.currentTimeMillis(); + int downloadedAmount = 0; + String downloadSpeedMessage = ""; + + try { + while ((bufferSize = inputstream.read(buffer, 0, buffer.length)) != -1) { + debug_sleep(10); + fos.write(buffer, 0, bufferSize); + currentDownload += bufferSize; + + int totalDownloaded = amountDownloaded + currentDownload; + percentage = initialPercentage + ((totalDownloaded * 45) / totalDownloadSize); + subtaskMessage = "Retrieving: " + currentFile + " " + ((totalDownloaded * 100) / totalDownloadSize) + "%"; + + downloadedAmount += bufferSize; + long timeLapse = System.currentTimeMillis() - downloadStartTime; + // update only if a second or more has passed + if (timeLapse >= 1000) { + // get kb/s, nice that bytes/millis is same as kilobytes/seconds + float downloadSpeed = (float) downloadedAmount / timeLapse; + // round to two decimal places + downloadSpeed = ((int)(downloadSpeed*100))/100f; + // set current speed message + downloadSpeedMessage = " - " + downloadSpeed + " KB/sec"; + // reset downloaded amount + downloadedAmount = 0; + // reset start time + downloadStartTime = System.currentTimeMillis(); + } + + subtaskMessage += downloadSpeedMessage; + } + + } finally { + inputstream.close(); + fos.close(); + } + + // download complete, verify if it was successful + if (urlconnection instanceof HttpURLConnection) { + if (currentDownload == fileSizes[i]) { + // successful download + } + else if (fileSizes[i] <= 0 && currentDownload != 0) { + // If contentLength for fileSizes[i] <= 0, we don't know if the download + // is complete. We're going to guess the download is complete. + } + else { + throw new Exception("size mismatch on download of " + currentFile + + " expected " + fileSizes[i] + " got " + currentDownload); + } + } + + // successful file download, update total amount downloaded + amountDownloaded += fileSizes[i]; + + } catch (Exception e) { + e.printStackTrace(); // output exception to console + + // Failed to download the file + unsuccessfulAttempts++; + + // download failed try again + if (unsuccessfulAttempts < maxUnsuccessfulAttempts) { + downloadFile = true; + Thread.sleep(100); // wait a bit before retrying + } + else { + // retry attempts exhasted, download failed + throw new Exception("failed to download " + currentFile + + " after " + maxUnsuccessfulAttempts + " attempts"); + } + } + } + } + subtaskMessage = ""; + } + + /** + * Retrieves a jar files input stream. This method exists primarily to fix an Opera hang in getInputStream + * @param urlconnection connection to get input stream from + * @return InputStream or null if not possible + */ + protected InputStream getJarInputStream(final String currentFile, final URLConnection urlconnection) throws Exception { + final InputStream[] is = new InputStream[1]; + + // try to get the input stream 3 times. + // Wait at most 5 seconds before interrupting the thread + for (int j = 0; j < 3 && is[0] == null; j++) { + Thread t = new Thread() { + public void run() { + try { + is[0] = urlconnection.getInputStream(); + } catch (IOException e) { + /* ignored */ + } + } + }; + t.setName("JarInputStreamThread"); + t.start(); + + int iterationCount = 0; + while(is[0] == null && iterationCount++ < 5) { + try { + t.join(1000); + } catch (InterruptedException inte) { + /* ignored */ + } + } + + if(is[0] == null) { + try { + t.interrupt(); + t.join(); + } catch (InterruptedException inte) { + /* ignored */ + } + } + } + + if(is[0] == null) { + throw new Exception("Unable to get input stream for " + currentFile); + } + + + return is[0]; + } + + /** + * Extract LZMA File + * @param in Input path to pack file + * @param out output path to resulting file + * @throws Exception if any errors occur + */ + protected void extractLZMA(String in, String out) throws Exception { + + File f = new File(in); + FileInputStream fileInputHandle = new FileInputStream(f); + + // use reflection to avoid hard dependency + Class<?> clazz = Class.forName( "LZMA.LzmaInputStream" ); + Constructor constructor = clazz.getDeclaredConstructor(InputStream.class); + InputStream inputHandle = (InputStream) constructor.newInstance(fileInputHandle); + + OutputStream outputHandle = new FileOutputStream(out); + + byte [] buffer = new byte [1<<14]; + + try { + int ret = inputHandle.read(buffer); + while (ret >= 1) { + outputHandle.write(buffer,0,ret); + ret = inputHandle.read(buffer); + } + } finally { + inputHandle.close(); + outputHandle.close(); + } + + // delete LZMA file, as it is no longer needed + f.delete(); + } + + /** + * Extract GZip File + * @param in Input path to pack file + * @param out output path to resulting file + * @throws Exception if any errors occur + */ + protected void extractGZip(String in, String out) throws Exception { + + File f = new File(in); + FileInputStream fileInputHandle = new FileInputStream(f); + + InputStream inputHandle = new GZIPInputStream(fileInputHandle); + + OutputStream outputHandle = new FileOutputStream(out); + + try { + byte [] buffer = new byte [1<<14]; + + int ret = inputHandle.read(buffer); + while (ret >= 1) { + outputHandle.write(buffer,0,ret); + ret = inputHandle.read(buffer); + } + } finally { + inputHandle.close(); + outputHandle.close(); + } + + // delete GZip file, as it is no longer needed + f.delete(); + } + + /** + * Extract Pack File + * @param in Input path to pack file + * @param out output path to resulting file + * @throws Exception if any errors occur + */ + protected void extractPack(String in, String out) throws Exception { + File f = new File(in); + FileOutputStream fostream = new FileOutputStream(out); + JarOutputStream jostream = new JarOutputStream(fostream); + + try { + Pack200.Unpacker unpacker = Pack200.newUnpacker(); + unpacker.unpack(f, jostream); + } finally { + jostream.close(); + fostream.close(); + } + + // delete pack file as its no longer needed + f.delete(); + } + + /** + * Extract all jars from any lzma/gz/pack files + * + * @param path output path + * @throws Exception if any errors occur + */ + protected void extractJars(String path) throws Exception { + setState(STATE_EXTRACTING_PACKAGES); + + float increment = (float) 10.0 / urlList.length; + // extract all gz, lzma, pack.gz and pack.lzma files + for (int i = 0; i < urlList.length; i++) { + + // if file has not changed, skip it + if (fileSizes[i] == -2) continue; + + percentage = 55 + (int) (increment * (i+1)); + String filename = getFileName(urlList[i]); + + if (filename.endsWith(".pack.lzma")) { + subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".lzma", ""); + debug_sleep(1000); + extractLZMA(path + filename, path + replaceLast(filename, ".lzma", "")); + + subtaskMessage = "Extracting: " + replaceLast(filename, ".lzma", "") + " to " + replaceLast(filename, ".pack.lzma", ""); + debug_sleep(1000); + extractPack(path + replaceLast(filename, ".lzma", ""), path + replaceLast(filename, ".pack.lzma", "")); + } + else if (filename.endsWith(".pack.gz")) { + subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".gz", ""); + debug_sleep(1000); + extractGZip(path + filename, path + replaceLast(filename, ".gz", "")); + + subtaskMessage = "Extracting: " + replaceLast(filename, ".gz", "") + " to " + replaceLast(filename, ".pack.gz", ""); + debug_sleep(1000); + extractPack(path + replaceLast(filename, ".gz", ""), path + replaceLast(filename, ".pack.gz", "")); + } + else if (filename.endsWith(".pack")) { + subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".pack", ""); + debug_sleep(1000); + extractPack(path + filename, path + replaceLast(filename, ".pack", "")); + } + else if (filename.endsWith(".lzma")) { + subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".lzma", ""); + debug_sleep(1000); + extractLZMA(path + filename, path + replaceLast(filename, ".lzma", "")); + } + else if (filename.endsWith(".gz")) { + subtaskMessage = "Extracting: " + filename + " to " + replaceLast(filename, ".gz", ""); + debug_sleep(1000); + extractGZip(path + filename, path + replaceLast(filename, ".gz", "")); + } + } + } + + /** + * This method will extract all file from the native jar and extract them + * to the subdirectory called "natives" in the local path, will also check + * to see if the native jar files is signed properly + * + * @param path base folder containing all downloaded jars + * @throws Exception if it fails to extract files + */ + protected void extractNatives(String path) throws Exception { + + setState(STATE_EXTRACTING_PACKAGES); + + float percentageParts = 15f/nativeJarCount; // parts for each native jar from 15% + + // create native folder + File nativeFolder = new File(path + "natives"); + if (!nativeFolder.exists()) { + nativeFolder.mkdir(); + } + + // get the current AppletLoader certificates to compare against certificates of the native files + Certificate[] certificate = getCurrentCertificates(); + + for (int i = urlList.length - nativeJarCount; i < urlList.length; i++) { + + // if a new native jar was not downloaded, no extracting needed + if (fileSizes[i] == -2) { + continue; + } + + // get name of jar file with natives from urlList + String nativeJar = getJarName(urlList[i]); + + // open jar file + JarFile jarFile = new JarFile(path + nativeJar, true); + + // get list of files in jar + Enumeration entities = jarFile.entries(); + + totalSizeExtract = 0; + int jarNum = i - (urlList.length - nativeJarCount); // used for progressbar + + // calculate the size of the files to extract for progress bar + while (entities.hasMoreElements()) { + JarEntry entry = (JarEntry) entities.nextElement(); + + // skip directories and anything in directories + // conveniently ignores the manifest + if (entry.isDirectory() || entry.getName().indexOf('/') != -1) { + continue; + } + totalSizeExtract += entry.getSize(); + } + + currentSizeExtract = 0; + + // reset point to begining by getting list of file again + entities = jarFile.entries(); + + // extract all files from the jar + while (entities.hasMoreElements()) { + JarEntry entry = (JarEntry) entities.nextElement(); + + // skip directories and anything in directories + // conveniently ignores the manifest + if (entry.isDirectory() || entry.getName().indexOf('/') != -1) { + continue; + } + + // check if native file already exists if so delete it to make room for new one + // useful when using the reload button on the browser + File f = new File(path + "natives" + File.separator + entry.getName()); + if (f.exists()) { + if (!f.delete()) { + continue; // unable to delete file, it is in use, skip extracting it + } + } + + debug_sleep(1000); + + InputStream in = jarFile.getInputStream(jarFile.getEntry(entry.getName())); + OutputStream out = new FileOutputStream(path + "natives" + File.separator + entry.getName()); + + try { + int bufferSize; + byte buffer[] = new byte[65536]; + + while ((bufferSize = in.read(buffer, 0, buffer.length)) != -1) { + debug_sleep(10); + out.write(buffer, 0, bufferSize); + currentSizeExtract += bufferSize; + + // update progress bar + percentage = 65 + (int)(percentageParts * (jarNum + currentSizeExtract/(float)totalSizeExtract)); + subtaskMessage = "Extracting: " + entry.getName() + " " + ((currentSizeExtract * 100) / totalSizeExtract) + "%"; + } + } finally { + in.close(); + out.close(); + } + + // validate the certificate for the native file being extracted + if (!certificatesMatch(certificate, entry.getCertificates())) { + f.delete(); // delete extracted native as its certificates doesn't match + throw new Exception("The certificate(s) in " + nativeJar + " do not match the AppletLoader!"); + } + } + subtaskMessage = ""; + + jarFile.close(); + + // delete native jar as it is no longer needed + File f = new File(path + nativeJar); + f.delete(); + + } + } + + /** + * Compare two certificate chains to see if they match + * + * @param cert1 first chain of certificates + * @param cert2 second chain of certificates + * + * @return true if the certificate chains are the same + */ + protected static boolean certificatesMatch(Certificate[] certs1, Certificate[] certs2) throws Exception { + if (certs1 == null || certs2 == null) { + return false; + } + + if (certs1.length != certs2.length) { + System.out.println("Certificate chain differs in length [" + certs1.length + " vs " + certs2.length + "]!"); + return false; + } + + for (int i = 0; i < certs1.length; i++) { + if (!certs1[i].equals(certs2[i])) { + System.out.println("Certificate mismatch found!"); + return false; + } + } + + return true; + } + + /** + * Returns the current certificate chain of the AppletLoader + * + * @return - certificate chain of AppletLoader + */ + protected static Certificate[] getCurrentCertificates() throws Exception { + // get the current certificate to compare against native files + Certificate[] certificate = AppletLoader.class.getProtectionDomain().getCodeSource().getCertificates(); + + // workaround for bug where cached applet loader does not have certificates!? + if (certificate == null) { + URL location = AppletLoader.class.getProtectionDomain().getCodeSource().getLocation(); + + // manually load the certificate + JarURLConnection jurl = (JarURLConnection) (new URL("jar:" + location.toString() + "!/org/lwjgl/util/applet/AppletLoader.class").openConnection()); + jurl.setDefaultUseCaches(true); + certificate = jurl.getCertificates(); + jurl.setDefaultUseCaches(false); + } + + return certificate; + } + + /** + * Check and validate jars which will be loaded into the classloader to make + * sure that they are not corrupt. This ensures corrupt files are never marked + * as successful downloadeds by the cache system. + * + * @param path - where the jars are stored + * @throws Exception if a corrupt jar is found + */ + protected void validateJars(String path) throws Exception { + + setState(STATE_VALIDATING_PACKAGES); + + percentage = 80; + + float percentageParts = 10f / urlList.length; // percentage for each file out of 10% + + for (int i = 0; i < urlList.length - nativeJarCount; i++) { + + debug_sleep(1000); + + // if file not downloaded, no need to validate again + if (fileSizes[i] == -2) continue; + + subtaskMessage = "Validating: " + getJarName(urlList[i]); + + File file = new File(path, getJarName(urlList[i])); + if (!isZipValid(file)) { + throw new Exception("The file " + getJarName(urlList[i]) + " is corrupt!"); + } + + percentage = 80 + (int)(percentageParts * i); + } + + subtaskMessage = ""; + } + + /** + * This method will check if a zip file is valid by running through it + * and checking for any corruption and CRC failures + * + * @param file - zip file to test + * @return boolean - runs false if the file is corrupt + */ + protected boolean isZipValid(File file) { + + try { + ZipFile zipFile = new ZipFile(file); + + try { + Enumeration e = zipFile.entries(); + + byte[] buffer = new byte[4096]; + + while(e.hasMoreElements()) { + ZipEntry zipEntry = (ZipEntry) e.nextElement(); + + CRC32 crc = new CRC32(); + + BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry)); + CheckedInputStream cis = new CheckedInputStream(bis, crc); + + while(cis.read(buffer, 0, buffer.length) != -1) { + // scroll through zip entry + } + + if (crc.getValue() != zipEntry.getCrc()) { + return false; // CRC match failed, corrupt zip + } + } + + return true; // valid zip file + } finally { + zipFile.close(); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * Get Image from path provided + * + * @param s location of the image + * @return the Image file + */ + protected Image getImage(String s) { + + // if s is "" then don't load an image + if (s.length() == 0) return null; + + Image image = null; + + try { + image = getImage(new URL(getCodeBase(), s)); + } catch (Exception e) { + /* */ + } + + // if image failed to load, try another method + if (image == null) { + image = getImage(Thread.currentThread().getContextClassLoader().getResource(s)); + } + + // if image loaded sucessfully return it + if (image != null) { + return image; + } + + // show error as image could not be loaded + fatalErrorOccured("Unable to load the logo/progressbar image: " + s, null); + return null; + } + + /** + * Get Image from path provided + * + * @param url location of the image + * @return the Image file + */ + public Image getImage(URL url) { + try { + MediaTracker tracker = new MediaTracker(this); + + Image image = super.getImage(url); + + // wait for image to load + tracker.addImage(image, 0); + tracker.waitForAll(); + + // if no errors return image + if (!tracker.isErrorAny()) { + return image; + } + } catch (Exception e) { + /* */ + } + + return null; + } + + /** + * Get jar name from URL. + * + * @param url Get jar file name from this url + * @return file name as string + */ + protected String getJarName(URL url) { + String fileName = url.getFile(); + + if (fileName.endsWith(".pack.lzma")) { + fileName = replaceLast(fileName, ".pack.lzma", ""); + } else if (fileName.endsWith(".pack.gz")) { + fileName = replaceLast(fileName, ".pack.gz", ""); + } else if (fileName.endsWith(".pack")) { + fileName = replaceLast(fileName, ".pack", ""); + } else if (fileName.endsWith(".lzma")) { + fileName = replaceLast(fileName, ".lzma", ""); + } else if (fileName.endsWith(".gz")) { + fileName = replaceLast(fileName, ".gz", ""); + } + + return fileName.substring(fileName.lastIndexOf('/') + 1); + } + + /** + * Get file name portion of URL. + * + * @param url Get file name from this url + * @return file name as string + */ + protected String getFileName(URL url) { + String fileName = url.getFile(); + return fileName.substring(fileName.lastIndexOf('/') + 1); + } + + /** + * Retrieves the color + * + * @param param Color to load + * @param defaultColor Default color to use if no color to load + * @return Color to use + */ + protected Color getColor(String param, Color defaultColor) { + String color = getParameter(param); + + if (color == null) return defaultColor; + + // Check if RGB format + if (color.indexOf(",") != -1) { + StringTokenizer st = new StringTokenizer(color, ","); + + // We've got three components for the color + try { + return new Color(Integer.parseInt(st.nextToken().trim()), + Integer.parseInt(st.nextToken().trim()), + Integer.parseInt(st.nextToken().trim())); + } catch (Exception e) { + // failed to parse + return defaultColor; + } + } + + // Check & decode if the color is in hexadecimal color format (i.e. #808000) + try { + return Color.decode(color); + } catch (NumberFormatException e) { + // ignore exception + } + + // Get the color by name if it exists + try { + return (Color)Color.class.getField(color).get(null); + } catch (Exception e) { + return defaultColor; + } + } + + /** + * Replaces the last occurrence of the specified target substring with + * the specified replacement string in a string. + * + * @param original - String to search + * @param target - substring to find + * @param replacement - what to replace target substring with + * @return - return the modified string, if target substring not found return original string + */ + public String replaceLast(String original, String target, String replacement) { + int index = original.lastIndexOf(target); + + if(index == -1) { + return original; + } + + return original.substring(0, index) + replacement + original.substring(index + target.length()); + } + + /** + * Retrieves the String value for the parameter + * @param name Name of parameter + * @param defaultValue default value to return if no such parameter + * @return value of parameter or defaultValue + */ + protected String getStringParameter(String name, String defaultValue) { + String parameter = getParameter(name); + if (parameter != null) { + return parameter; + } + return defaultValue; + } + + /** + * Retrieves the boolean value for the parameter + * @param name Name of parameter + * @param defaultValue default value to return if no such parameter + * @return value of parameter or defaultValue + */ + protected boolean getBooleanParameter(String name, boolean defaultValue) { + String parameter = getParameter(name); + if (parameter != null) { + return Boolean.parseBoolean(parameter); + } + return defaultValue; + } + + /** + * Retrieves the int value for the applet + * @param name Name of parameter + * @param defaultValue default value to return if no such parameter + * @return value of parameter or defaultValue + */ + protected int getIntParameter(String name, int defaultValue) { + String parameter = getParameter(name); + if (parameter != null) { + return Integer.parseInt(parameter); + } + return defaultValue; + } + + /** + * Sets the error message and print debug information + * + * @param error Error message to print + */ + protected void fatalErrorOccured(String error, Exception e) { + fatalError = true; + + if (minimumJreNotFound) { + errorMessage = minimumJREMessage; + errorMessage[errorMessage.length-1] = error; + } + else if (certificateRefused) { + errorMessage = certificateRefusedMessage; + } + else { + errorMessage = genericErrorMessage; + errorMessage[errorMessage.length-1] = error; + } + + System.out.println(error); + if(e != null) { + System.out.println(e.getMessage()); + System.out.println(generateStacktrace(e)); + } + repaint(); + } + + /** + * set the state of applet loader + * @param new state of applet loader + * */ + protected void setState(int state) { + this.state = state; + if(debugMode) { + System.out.println(getDescriptionForState()); + } + } + + /** + * Utility method for sleeping + * Will only really sleep if debug has been enabled + * @param ms milliseconds to sleep + */ + protected void debug_sleep(long ms) { + if(debugMode) { + sleep(ms); + } + } + + /** + * Utility method for sleeping + * @param ms milliseconds to sleep + */ + protected void sleep(long ms) { + try { + Thread.sleep(ms); + } catch (Exception e) { + /* ignored */ + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alias.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alias.java new file mode 100644 index 0000000..3983174 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alias.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * This annotation can be used for extensions that have aliases + * with the exact same functionality. + * <p/> + * This is currently only implemented for context-specific functionality. + * + * @author Spasi <spasi@users.sourceforge.net> + */ +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +public @interface Alias { + + /** The aliased extension name. */ + String value(); + + /** The function name postfix for the aliased version. (optional) */ + String postfix() default ""; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alternate.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alternate.java new file mode 100644 index 0000000..c137415 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Alternate.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * When a method is annonated with @Alternate, no native stub will be created and the Java method will be renamed to value(). + * This can be useful when we want to provide an alternate GL call with different arguments (created by different annotations) + * + * @author spasi <spasi@users.sourceforge.net> + */ +@Target({ ElementType.METHOD }) +public @interface Alternate { + + /** This must match an existing GL method name. */ + String value(); + + /** If true, an alternate Java->native call will be created. Useful when the alternate implementation uses different types. */ + boolean nativeAlt() default false; + + /** Applicable when nativeAlt is true. If true, no extra native call will be generated. Useful when there's another nativeAlt already defined. */ + boolean skipNative() default false; + + /** If true, the alternate method's name will be used for the Java call. */ + boolean javaAlt() default false; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Auto.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Auto.java new file mode 100644 index 0000000..e5702a1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Auto.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * AutoType and AutoSize is annotated with @Auto. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.ANNOTATION_TYPE) +public @interface Auto { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoSize.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoSize.java new file mode 100644 index 0000000..741a417 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoSize.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * AutoSize specifies that a parameter should be pre-computed + * according to the remaining() of a Buffer parameter. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Auto +@Target({ElementType.METHOD,ElementType.PARAMETER}) +public @interface AutoSize { + String value(); // The name of the Buffer parameter + String expression() default ""; // This value is added after the argument + boolean useExpression() default false; // When this is true, the expression result will be used directly. + boolean canBeNull() default false; // When this is true and the Buffer parameter is null, 0 will be used. + boolean isNative() default false; // When this is true, auto-sizing will be performed in native code. +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoType.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoType.java new file mode 100644 index 0000000..123a6aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/AutoType.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * Indicates that a parameter should be pre-computed according + * to the type of a Buffer parameter. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Auto +@Target(ElementType.PARAMETER) +public @interface AutoType { + String value(); // The parameter to get the type from +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferKind.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferKind.java new file mode 100644 index 0000000..d5ae1fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferKind.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public enum BufferKind { + UnpackPBO, + PackPBO, + ElementVBO, + ArrayVBO, + IndirectBO +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferObject.java new file mode 100644 index 0000000..9c96a3c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/BufferObject.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation implies that a Buffer parameter can be an + * integer VBO/PBO offset. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface BufferObject { + BufferKind value(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedReference.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedReference.java new file mode 100644 index 0000000..a8cbf49 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedReference.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation indicates that a buffer parameter is cached by + * OpenGL. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface CachedReference { + /** If set then this will be used as array index for accessing the stored reference. */ + String index() default ""; + + /** If set then this name will be used for the reference and the reference field will not be auto generated in References. */ + String name() default ""; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedResult.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedResult.java new file mode 100644 index 0000000..a38ef75 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/CachedResult.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.METHOD) +public @interface CachedResult { + boolean isRange() default false; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Check.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Check.java new file mode 100644 index 0000000..3a1c640 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Check.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface Check { + String value() default ""; + boolean canBeNull() default false; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Code.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Code.java new file mode 100644 index 0000000..cb924c4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Code.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +public @interface Code { + + String value() default ""; // Java, before everything + + boolean tryBlock() default false; // Add a try/finally block around the native call and return statement + + String javaBeforeNative() default ""; // Before the native call + String javaAfterNative() default ""; // After the native call + String javaFinally() default ""; // In the finally block + + String nativeAfterVars() default ""; // After variable declaration + String nativeBeforeCall() default ""; // Before the API call + String nativeAfterCall() default ""; // After the API call + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Const.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Const.java new file mode 100644 index 0000000..f32942e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Const.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface Const { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Constant.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Constant.java new file mode 100644 index 0000000..e1bcb96 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Constant.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface Constant { + String value(); + /** If true, the original parameter will not be removed from the method. */ + boolean keepParam() default false; + /** If true, this is a native code constant. */ + boolean isNative() default false; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Dependent.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Dependent.java new file mode 100644 index 0000000..1741823 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Dependent.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * Use this annotation on extensions with functionality that depends on the presence of other extensions. + * Functions in such extensions marked with this annotation will only be loaded if the specified extension is present. + * + * @author spasi <spasi@users.sourceforge.net> + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.TYPE, ElementType.METHOD }) +public @interface Dependent { + String value() default ""; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/DeprecatedGL.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/DeprecatedGL.java new file mode 100644 index 0000000..4789d98 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/DeprecatedGL.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * Use this annotation on extensions with deprecated functionality. + * Functions in such extensions marked with this annotation will not be loaded in a forward compatible context. + * + * @author spasi <spasi@users.sourceforge.net> + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.TYPE, ElementType.METHOD }) +public @interface DeprecatedGL { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extension.java new file mode 100644 index 0000000..3db8bdb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extension.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.TYPE) +public @interface Extension { + String className() default ""; + boolean isFinal() default true; + String postfix(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extern.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extern.java new file mode 100644 index 0000000..b4e8f6f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Extern.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * Functions marked with <code>@Extern</code> will not be declared as <code>static</code> in the C implementation. + * This allows other source files to call them. + * + * @author Spasi + */ +@Target(ElementType.METHOD) +public @interface Extern { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/FieldsGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/FieldsGenerator.java new file mode 100644 index 0000000..3118e53 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/FieldsGenerator.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +import java.io.PrintWriter; +import java.util.Collection; + +import com.sun.mirror.declaration.FieldDeclaration; +import com.sun.mirror.declaration.Modifier; +import com.sun.mirror.type.PrimitiveType; +import com.sun.mirror.type.TypeMirror; + +public class FieldsGenerator { + + private static void validateField(FieldDeclaration field) { + // Check if field is "public static final" + Collection<Modifier> modifiers = field.getModifiers(); + if ( modifiers.size() != 3 + || !modifiers.contains(Modifier.PUBLIC) + || !modifiers.contains(Modifier.STATIC) + || !modifiers.contains(Modifier.FINAL) ) { + throw new RuntimeException("Field " + field.getSimpleName() + " is not declared public static final"); + } + + // Check suported types (int, long, float, String) + TypeMirror field_type = field.getType(); + if ( field_type instanceof PrimitiveType ) { + PrimitiveType field_type_prim = (PrimitiveType)field_type; + PrimitiveType.Kind field_kind = field_type_prim.getKind(); + if ( field_kind != PrimitiveType.Kind.INT + && field_kind != PrimitiveType.Kind.LONG + && field_kind != PrimitiveType.Kind.FLOAT + && field_kind != PrimitiveType.Kind.BYTE ) { + throw new RuntimeException("Field " + field.getSimpleName() + " is not of type 'int', 'long' or 'float'"); + } + } else if ( "java.lang.String".equals(field_type.toString()) ) { + } else { + throw new RuntimeException("Field " + field.getSimpleName() + " is not a primitive type or String"); + } + + Object field_value = field.getConstantValue(); + if ( field_value == null ) { + throw new RuntimeException("Field " + field.getSimpleName() + " has no initial value"); + } + } + + private static void generateField(PrintWriter writer, FieldDeclaration field, FieldDeclaration prev_field) { + validateField(field); + + Object value = field.getConstantValue(); + String field_value_string; + Class field_value_class = value.getClass(); + if ( field_value_class.equals(Integer.class) ) { + field_value_string = "0x" + Integer.toHexString((Integer)field.getConstantValue()).toUpperCase(); + } else if ( field_value_class.equals(Long.class) ) { + field_value_string = "0x" + Long.toHexString((Long)field.getConstantValue()).toUpperCase() + 'L'; + } else if ( field_value_class.equals(Float.class) ) { + field_value_string = field.getConstantValue() + "f"; + } else if ( value.getClass().equals(Byte.class) ) { + field_value_string = "0x" + Integer.toHexString((Byte)field.getConstantValue()).toUpperCase(); + } else if ( field_value_class.equals(String.class) ) { + field_value_string = "\"" + field.getConstantValue() + "\""; + } else { + throw new RuntimeException("Field is of unexpected type. This means there is a bug in validateField()."); + } + + boolean hadDoc = prev_field != null && prev_field.getDocComment() != null; + boolean hasDoc = field.getDocComment() != null; + boolean newBatch = prev_field == null || !prev_field.getType().equals(field.getType()) || (!hadDoc && field.getDocComment() != null) || (hadDoc && hasDoc && !prev_field.getDocComment().equals(field.getDocComment())); + + // Print field declaration + if ( newBatch ) { + if ( prev_field != null ) + writer.println(";\n"); + + Utils.printDocComment(writer, field); + writer.print("\tpublic static final " + field.getType().toString() + " " + field.getSimpleName() + " = " + field_value_string); + } else + writer.print(",\n\t\t" + field.getSimpleName() + " = " + field_value_string); + } + + public static void generateFields(PrintWriter writer, Collection<FieldDeclaration> fields) { + if ( 0 < fields.size() ) { + writer.println(); + FieldDeclaration prev_field = null; + for ( FieldDeclaration field : fields ) { + generateField(writer, field, prev_field); + prev_field = field; + } + writer.println(";"); + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/ForceInit.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/ForceInit.java new file mode 100644 index 0000000..7173f6e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/ForceInit.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * Extensions marked with ForceInit will be initialized by LWJGL even if not exposed in the GL_EXTENSIONS string. + * + * @author spasi + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ ElementType.TYPE }) +public @interface ForceInit { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GenerateAutos.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GenerateAutos.java new file mode 100644 index 0000000..b103b40 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GenerateAutos.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.METHOD) +public @interface GenerateAutos { + /** If true, a size variable will be generated. */ + String[] sizeVariables() default {}; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorProcessorFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorProcessorFactory.java new file mode 100644 index 0000000..d9206b8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorProcessorFactory.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +import java.io.File; +import java.io.FileFilter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.AnnotationTypeDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; + +import static com.sun.mirror.util.DeclarationVisitors.*; +import static java.util.Collections.*; + +/** + * Generator tool for creating the java classes and native code + * from an annotated template java interface. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class GeneratorProcessorFactory implements AnnotationProcessorFactory, RoundCompleteListener { + + private static boolean first_round = true; + + // Process any set of annotations + private static final Collection<String> supportedAnnotations = + unmodifiableCollection(Arrays.asList("*")); + + private static final Collection<String> supportedOptions = + unmodifiableCollection(Arrays.asList("-Atypemap", "-Ageneratechecks", "-Acontextspecific")); + + public Collection<String> supportedAnnotationTypes() { + return supportedAnnotations; + } + + public Collection<String> supportedOptions() { + return supportedOptions; + } + + public void roundComplete(RoundCompleteEvent event) { + first_round = false; + } + + public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { + // Only process the initial types, not the generated ones + if ( first_round ) { + env.addListener(this); + return new GeneratorProcessor(env); + } else + return AnnotationProcessors.NO_OP; + } + + private static class GeneratorProcessor implements AnnotationProcessor { + + private final AnnotationProcessorEnvironment env; + + GeneratorProcessor(AnnotationProcessorEnvironment env) { + this.env = env; + } + + public void process() { + Map<String, String> options = env.getOptions(); + String typemap_classname = null; + String bin_path = null; + boolean generate_error_checks = options.containsKey("-Ageneratechecks"); + boolean context_specific = options.containsKey("-Acontextspecific"); + for ( String k : options.keySet() ) { + if ( !k.startsWith("-A") ) + continue; + + int delimiter = k.indexOf('='); + if ( delimiter != -1 ) { + if ( k.startsWith("-Atypemap") ) { + typemap_classname = k.substring(delimiter + 1); + } else if ( k.startsWith("-Abinpath") ) { + bin_path = k.substring(delimiter + 1); + } + } + } + if ( typemap_classname == null ) + throw new RuntimeException("No TypeMap class name specified with -Atypemap=<class-name>"); + if ( bin_path == null ) + throw new RuntimeException("No path specified for the bin directory with -Abinpath=<path>"); + + TypeDeclaration lastFile = null; + try { + long generatorLM = getGeneratorLastModified(bin_path); + TypeMap type_map = (TypeMap)(Class.forName(typemap_classname).newInstance()); + for ( TypeDeclaration typedecl : env.getSpecifiedTypeDeclarations() ) { + lastFile = typedecl; + typedecl.accept(getDeclarationScanner(new GeneratorVisitor(env, type_map, generate_error_checks, context_specific, generatorLM), NO_OP)); + } + } catch (Exception e) { + if ( lastFile == null ) + throw new RuntimeException(e); + else + throw new RuntimeException("\n-- Failed to process template: " + lastFile.getQualifiedName() + " --", e); + } + } + + /** + * Gets the time of the latest change on the Generator classes. + * + * @return time of the latest change + */ + private static long getGeneratorLastModified(final String bin_path) { + long lastModified = getDirectoryLastModified(bin_path, "/org/lwjgl/util/generator"); + lastModified = Math.max(lastModified, getDirectoryLastModified(bin_path, "/org/lwjgl/util/generator/openal")); + lastModified = Math.max(lastModified, getDirectoryLastModified(bin_path, "/org/lwjgl/util/generator/opengl")); + lastModified = Math.max(lastModified, getDirectoryLastModified(bin_path, "/org/lwjgl/util/generator/opencl")); + + return lastModified; + } + + private static long getDirectoryLastModified(final String bin_path, final String path) { + final File pck = new File(bin_path + path); + if ( !pck.exists() || !pck.isDirectory() ) + return Long.MAX_VALUE; + + final File[] classes = pck.listFiles(new FileFilter() { + public boolean accept(final File pathname) { + return pathname.isFile() && pathname.getName().endsWith(".class"); + } + }); + + if ( classes == null || classes.length == 0 ) + return Long.MAX_VALUE; + + long lastModified = 0; + + for ( File clazz : classes ) { + long lm = clazz.lastModified(); + if ( lastModified < lm ) + lastModified = lm; + } + + return lastModified; + } + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorVisitor.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorVisitor.java new file mode 100644 index 0000000..8658c22 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/GeneratorVisitor.java @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; +import com.sun.mirror.util.*; + +import java.io.*; +import java.lang.annotation.Annotation; +import java.nio.channels.FileChannel; +import java.util.*; + +import java.nio.*; + +/** + * + * Generator visitor for the generator tool + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class GeneratorVisitor extends SimpleDeclarationVisitor { + private final AnnotationProcessorEnvironment env; + private final TypeMap type_map; + private final boolean generate_error_checks; + private final boolean context_specific; + private final long generatorLM; + + public GeneratorVisitor(AnnotationProcessorEnvironment env, TypeMap type_map, boolean generate_error_checks, boolean context_specific, long generatorLM) { + this.env = env; + this.type_map = type_map; + this.generate_error_checks = generate_error_checks; + this.context_specific = context_specific; + this.generatorLM = generatorLM; + } + + private void validateMethod(MethodDeclaration method) { + if (method.isVarArgs()) + throw new RuntimeException("Method " + method.getSimpleName() + " is variadic"); + Collection<Modifier> modifiers = method.getModifiers(); + if (!modifiers.contains(Modifier.PUBLIC)) + throw new RuntimeException("Method " + method.getSimpleName() + " is not public"); + if (method.getThrownTypes().size() > 0) + throw new RuntimeException("Method " + method.getSimpleName() + " throws checked exceptions"); + validateParameters(method); + StripPostfix strip_annotation = method.getAnnotation(StripPostfix.class); + if (strip_annotation != null && method.getAnnotation(Alternate.class) == null) { + String postfix_param_name = strip_annotation.value(); + ParameterDeclaration postfix_param = Utils.findParameter(method, postfix_param_name); + if (Utils.isParameterMultiTyped(postfix_param)) + throw new RuntimeException("Postfix parameter can't be the same as a multityped parameter in method " + method); + if (Utils.getNIOBufferType(postfix_param.getType()) == null) + throw new RuntimeException("Postfix parameter type must be a nio Buffer"); + } + if (Utils.getResultParameter(method) != null && !method.getReturnType().equals(env.getTypeUtils().getVoidType())) + throw new RuntimeException(method + " return type is not void but a parameter is annotated with Result"); + if (method.getAnnotation(CachedResult.class) != null) { + if (Utils.getNIOBufferType(Utils.getMethodReturnType(method)) == null) + throw new RuntimeException(method + " return type is not a Buffer, but is annotated with CachedResult"); + if (method.getAnnotation(AutoSize.class) == null) + throw new RuntimeException(method + " is annotated with CachedResult but misses an AutoSize annotation"); + } + validateTypes(method, method.getAnnotationMirrors(), method.getReturnType()); + } + + private void validateType(MethodDeclaration method, Class<?extends Annotation> annotation_type, Class type) { + Class[] valid_types = type_map.getValidAnnotationTypes(type); + for ( Class valid_type : valid_types ) + if ( valid_type.equals(annotation_type) ) + return; + throw new RuntimeException(type + " is annotated with invalid native type " + annotation_type + + " in method " + method); + } + + private void validateTypes(MethodDeclaration method, Collection<AnnotationMirror> annotations, TypeMirror type_mirror) { + for (AnnotationMirror annotation : annotations) { + NativeType native_type_annotation = NativeTypeTranslator.getAnnotation(annotation, NativeType.class); + if (native_type_annotation != null) { + Class<? extends Annotation> annotation_type = NativeTypeTranslator.getClassFromType(annotation.getAnnotationType()); + Class type = Utils.getJavaType(type_mirror); + if (Buffer.class.equals(type)) + continue; + validateType(method, annotation_type, type); + } + } + } + + private void validateParameters(MethodDeclaration method) { + for (ParameterDeclaration param : method.getParameters()) { + validateTypes(method, param.getAnnotationMirrors(), param.getType()); + Class<?> param_type = Utils.getJavaType(param.getType()); + if (Utils.getNIOBufferType(param.getType()) != null && param_type != CharSequence.class && param_type != CharSequence[].class) { + Check parameter_check_annotation = param.getAnnotation(Check.class); + NullTerminated null_terminated_annotation = param.getAnnotation(NullTerminated.class); + if (parameter_check_annotation == null && null_terminated_annotation == null) { + boolean found_auto_size_param = false; + for (ParameterDeclaration inner_param : method.getParameters()) { + AutoSize auto_size_annotation = inner_param.getAnnotation(AutoSize.class); + if (auto_size_annotation != null && + auto_size_annotation.value().equals(param.getSimpleName())) { + found_auto_size_param = true; + break; + } + } + if (!found_auto_size_param + && param.getAnnotation(Result.class) == null + && param.getAnnotation(Constant.class) == null + && !Utils.isReturnParameter(method, param) + ) + throw new RuntimeException(param + " has no Check, Result nor Constant annotation, is not the return parameter and no other parameter has" + + " an @AutoSize annotation on it in method " + method); + } + if (param.getAnnotation(CachedReference.class) != null && param.getAnnotation(Result.class) != null) + throw new RuntimeException(param + " can't be annotated with both CachedReference and Result"); + if (param.getAnnotation(BufferObject.class) != null && param.getAnnotation(Result.class) != null) + throw new RuntimeException(param + " can't be annotated with both BufferObject and Result"); + //if (param.getAnnotation(Constant.class) != null) + //throw new RuntimeException("Buffer parameter " + param + " cannot be Constant"); + } else { + if (param.getAnnotation(BufferObject.class) != null) + throw new RuntimeException(param + " type is not a buffer, but annotated as a BufferObject"); + if (param.getAnnotation(CachedReference.class) != null) + throw new RuntimeException(param + " type is not a buffer, but annotated as a CachedReference"); + } + } + } + + private static void generateMethodsNativePointers(PrintWriter writer, Collection<? extends MethodDeclaration> methods) { + for (MethodDeclaration method : methods) { + if ( method.getAnnotation(Alternate.class) == null ) + generateMethodNativePointers(writer, method); + } + } + + private static void generateMethodNativePointers(PrintWriter writer, MethodDeclaration method) { + if ( method.getAnnotation(Extern.class) == null ) + writer.print("static "); + writer.println(Utils.getTypedefName(method) + " " + method.getSimpleName() + ";"); + } + + private void generateJavaSource(InterfaceDeclaration d, PrintWriter java_writer) throws IOException { + java_writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + java_writer.println(); + java_writer.println("package " + d.getPackage().getQualifiedName() + ";"); + java_writer.println(); + java_writer.println("import org.lwjgl.*;"); + java_writer.println("import java.nio.*;"); + Imports imports = d.getAnnotation(Imports.class); + if ( imports != null ) { + for ( String i : imports.value() ) + java_writer.println("import " + i + ";"); + } + java_writer.println(); + Utils.printDocComment(java_writer, d); + if ( d.getAnnotation(Private.class) == null ) + java_writer.print("public "); + boolean is_final = Utils.isFinal(d); + if (is_final) + java_writer.write("final "); + java_writer.print("class " + Utils.getSimpleClassName(d)); + Collection<InterfaceType> super_interfaces = d.getSuperinterfaces(); + if (super_interfaces.size() > 1) + throw new RuntimeException(d + " extends more than one interface"); + if (super_interfaces.size() == 1) { + InterfaceDeclaration super_interface = super_interfaces.iterator().next().getDeclaration(); + java_writer.print(" extends " + Utils.getSimpleClassName(super_interface)); + } + java_writer.println(" {"); + FieldsGenerator.generateFields(java_writer, d.getFields()); + java_writer.println(); + if (is_final) { + // Write private constructor to avoid instantiation + java_writer.println("\tprivate " + Utils.getSimpleClassName(d) + "() {}"); + } + if (d.getMethods().size() > 0 && !context_specific) { + java_writer.println(); + java_writer.println("\tstatic native void " + Utils.STUB_INITIALIZER_NAME + "() throws LWJGLException;"); + } + JavaMethodsGenerator.generateMethodsJava(env, type_map, java_writer, d, generate_error_checks, context_specific); + java_writer.println("}"); + java_writer.close(); + String qualified_interface_name = Utils.getQualifiedClassName(d); + env.getMessager().printNotice("Generated class " + qualified_interface_name); + } + + private void generateNativeSource(InterfaceDeclaration d) throws IOException { + String qualified_interface_name = Utils.getQualifiedClassName(d); + String qualified_native_name = Utils.getNativeQualifiedName(qualified_interface_name)+ ".c"; + PrintWriter native_writer = env.getFiler().createTextFile(Filer.Location.CLASS_TREE, "", new File(qualified_native_name), "UTF-8"); + native_writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + native_writer.println(); + native_writer.println("#include <jni.h>"); + type_map.printNativeIncludes(native_writer); + native_writer.println(); + TypedefsGenerator.generateNativeTypedefs(type_map, native_writer, d.getMethods()); + native_writer.println(); + if (!context_specific) { + generateMethodsNativePointers(native_writer, d.getMethods()); + native_writer.println(); + } + NativeMethodStubsGenerator.generateNativeMethodStubs(env, type_map, native_writer, d, generate_error_checks, context_specific); + if (!context_specific) { + native_writer.print("JNIEXPORT void JNICALL " + Utils.getQualifiedNativeMethodName(qualified_interface_name, Utils.STUB_INITIALIZER_NAME)); + native_writer.println("(JNIEnv *env, jclass clazz) {"); + native_writer.println("\tJavaMethodAndExtFunction functions[] = {"); + RegisterStubsGenerator.generateMethodsNativeStubBind(native_writer, d, generate_error_checks, context_specific); + native_writer.println("\t};"); + native_writer.println("\tint num_functions = NUMFUNCTIONS(functions);"); + native_writer.print("\t"); + native_writer.print(type_map.getRegisterNativesFunctionName()); + native_writer.println("(env, clazz, num_functions, functions);"); + native_writer.println("}"); + } + native_writer.close(); + env.getMessager().printNotice("Generated C source " + qualified_interface_name); + } + + public void visitInterfaceDeclaration(InterfaceDeclaration d) { + final File input = d.getPosition().file(); + final File outputJava = new File(env.getOptions().get("-s") + '/' + d.getPackage().getQualifiedName().replace('.', '/'), Utils.getSimpleClassName(d) + ".java"); + + PrintWriter java_writer = null; + + try { + final Collection<? extends MethodDeclaration> methods = d.getMethods(); + if ( methods.size() == 0 && d.getFields().size() == 0 ) + return; + + // Skip this class if the output exists and the input has not been modified. + if ( outputJava.exists() && Math.max(input.lastModified(), generatorLM) < outputJava.lastModified() ) + return; + + for ( final MethodDeclaration method : methods ) + validateMethod(method); + java_writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, d.getPackage().getQualifiedName(), new File(Utils.getSimpleClassName(d) + ".java"), null); + generateJavaSource(d, java_writer); + + if ( methods.size() > 0 ) { + boolean noNative = true; + for ( final MethodDeclaration method : methods ) { + Alternate alt_annotation = method.getAnnotation(Alternate.class); + if ( (alt_annotation == null || alt_annotation.nativeAlt()) && method.getAnnotation(Reuse.class) == null ) { + noNative = false; + break; + } + } + if ( noNative ) + return; + + final String outputPath = env.getOptions().get("-d") + '/' + Utils.getNativeQualifiedName(Utils.getQualifiedClassName(d)); + final File outputNative = new File(outputPath + ".c"); + final File outputBackup = new File(outputPath + "_backup.c"); + + // If the native file exists, rename. + final ByteBuffer nativeBefore; + if ( outputNative.exists() ) { + nativeBefore = readFile(outputNative); + outputNative.renameTo(outputBackup); + } else + nativeBefore = null; + + try { + generateNativeSource(d); + + // If the native file did exist, compare with the new file. If they're the same, + // reset the last modified time to avoid ridiculous C compilation times. + if ( nativeBefore != null && outputNative.length() == nativeBefore.capacity() ) { + final ByteBuffer nativeAfter = readFile(outputNative); + boolean same = true; + for ( int i = nativeBefore.position(); i < nativeBefore.limit(); i++ ) { + if ( nativeBefore.get(i) != nativeAfter.get(i) ) { + same = false; + break; + } + } + + if ( same ) { + outputNative.delete(); + outputBackup.renameTo(outputNative); + } + } + } finally { + if ( outputBackup.exists() ) + outputBackup.delete(); + } + } + } catch (Exception e) { + // If anything goes wrong mid-gen, delete output to allow regen next time we run. + if ( java_writer != null ) java_writer.close(); + if ( outputJava.exists() ) outputJava.delete(); + + throw new RuntimeException(e); + } + } + + private static ByteBuffer readFile(final File file) throws IOException { + final FileChannel channel = new FileInputStream(file).getChannel(); + + final long bytesTotal = channel.size(); + final ByteBuffer buffer = ByteBuffer.allocateDirect((int)bytesTotal); + + long bytesRead = 0; + do { + bytesRead += channel.read(buffer); + } while ( bytesRead < bytesTotal ); + buffer.flip(); + + channel.close(); + + return buffer; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Helper.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Helper.java new file mode 100644 index 0000000..708c75d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Helper.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * Method parameters marked with <code>@Helper</code> will be considered Java-API + * parameters and will be ignored when generating native stubs/code. + * + * @author Spasi + */ +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +public @interface Helper { + boolean passToNative() default false; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Imports.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Imports.java new file mode 100644 index 0000000..6a278ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Imports.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * This annotation can be used when an extension template needs + * extra imports in its generated class. + * + * @author Spasi + */ +@Target(ElementType.TYPE) +public @interface Imports { + String[] value(); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Indirect.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Indirect.java new file mode 100644 index 0000000..6696e46 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Indirect.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * Implies that a parameter is indirect, and forces the native + * stub to use the indirection operator '&' on it. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface Indirect { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JNITypeTranslator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JNITypeTranslator.java new file mode 100644 index 0000000..2b8a54c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JNITypeTranslator.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +import org.lwjgl.PointerBuffer; + +import java.nio.Buffer; + +import com.sun.mirror.type.*; +import com.sun.mirror.util.*; + +/** + * + * A TypeVisitor that translates TypeMirrors to JNI + * type strings. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class JNITypeTranslator implements TypeVisitor { + + private final StringBuilder signature = new StringBuilder(); + + private boolean objectReturn; + + public String getSignature() { + return signature.toString(); + } + + public String getReturnSignature() { + return objectReturn ? "jobject" : signature.toString(); + } + + public void visitAnnotationType(AnnotationType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitArrayType(ArrayType t) { + final String className = t.getComponentType().toString(); + if ( "java.lang.CharSequence".equals(className) ) + signature.append("jlong"); + else if ( "java.nio.ByteBuffer".equals(className) ) + signature.append("jobjectArray"); + else if ( "org.lwjgl.opencl.CLMem".equals(className) ) + signature.append("jobjectArray"); + else + throw new RuntimeException(t + " is not allowed"); + } + + public void visitClassType(ClassType t) { + final Class<?> type = Utils.getJavaType(t); + if ( Buffer.class.isAssignableFrom(type) || PointerBuffer.class.isAssignableFrom(type) ) { + signature.append("jlong"); + objectReturn = true; + } else + signature.append("jobject"); + } + + public void visitDeclaredType(DeclaredType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitEnumType(EnumType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitInterfaceType(InterfaceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitPrimitiveType(PrimitiveType t) { + String type; + switch (t.getKind()) { + case LONG: + type = "jlong"; + break; + case INT: + type = "jint"; + break; + case FLOAT: + type = "jfloat"; + break; + case SHORT: + type = "jshort"; + break; + case BYTE: + type = "jbyte"; + break; + case DOUBLE: + type = "jdouble"; + break; + case BOOLEAN: + type = "jboolean"; + break; + default: + throw new RuntimeException(t + " is not allowed"); + } + signature.append(type); + } + + public void visitReferenceType(ReferenceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeMirror(TypeMirror t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeVariable(TypeVariable t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitVoidType(VoidType t) { + signature.append(t.toString()); + } + + public void visitWildcardType(WildcardType t) { + throw new RuntimeException(t + " is not allowed"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java new file mode 100644 index 0000000..c1231bf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaMethodsGenerator.java @@ -0,0 +1,738 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * This class generates the methods in the generated java source files. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.opengl.GLreturn; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.util.*; +import java.nio.*; + +public class JavaMethodsGenerator { + private static final String SAVED_PARAMETER_POSTFIX = "_saved"; + + public static void generateMethodsJava(AnnotationProcessorEnvironment env, TypeMap type_map, PrintWriter writer, InterfaceDeclaration interface_decl, boolean generate_error_checks, boolean context_specific) { + for (MethodDeclaration method : interface_decl.getMethods()) + generateMethodJava(env, type_map, writer, interface_decl, method, generate_error_checks, context_specific); + } + + private static void generateMethodJava(AnnotationProcessorEnvironment env, TypeMap type_map, PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method, boolean generate_error_checks, boolean context_specific) { + writer.println(); + if (Utils.isMethodIndirect(generate_error_checks, context_specific, method)) { + if (method.getAnnotation(GenerateAutos.class) != null) { + printMethodWithMultiType(env, type_map, writer, interface_decl, method, TypeInfo.getDefaultTypeInfoMap(method), Mode.AUTOS, generate_error_checks, context_specific); + } + Collection<Map<ParameterDeclaration, TypeInfo>> cross_product = TypeInfo.getTypeInfoCrossProduct(type_map, method); + for (Map<ParameterDeclaration, TypeInfo> typeinfos_instance : cross_product) { + printMethodWithMultiType(env, type_map, writer, interface_decl, method, typeinfos_instance, Mode.NORMAL, generate_error_checks, context_specific); + } + } + if ( method.getAnnotation(CachedResult.class) != null && !method.getAnnotation(CachedResult.class).isRange() ) { + printMethodWithMultiType(env, type_map, writer, interface_decl, method, TypeInfo.getDefaultTypeInfoMap(method), Mode.CACHEDRESULT, generate_error_checks, context_specific); + } + + Reuse reuse_annotation = method.getAnnotation(Reuse.class); + Alternate alt_annotation = method.getAnnotation(Alternate.class); + if ( alt_annotation == null || (alt_annotation.nativeAlt() && !alt_annotation.skipNative()) ) { + if ( alt_annotation != null && method.getSimpleName().equals(alt_annotation.value()) ) + throw new RuntimeException("An alternate function with native code should have a different name than the main function."); + + if ( reuse_annotation == null ) + printJavaNativeStub(writer, method, Mode.NORMAL, generate_error_checks, context_specific); + + if (Utils.hasMethodBufferObjectParameter(method)) { + printMethodWithMultiType(env, type_map, writer, interface_decl, method, TypeInfo.getDefaultTypeInfoMap(method), Mode.BUFFEROBJECT, generate_error_checks, context_specific); + if ( reuse_annotation == null ) + printJavaNativeStub(writer, method, Mode.BUFFEROBJECT, generate_error_checks, context_specific); + } + } + } + + private static void printJavaNativeStub(PrintWriter writer, MethodDeclaration method, Mode mode, boolean generate_error_checks, boolean context_specific) { + if (Utils.isMethodIndirect(generate_error_checks, context_specific, method)) { + writer.print("\tstatic native "); + } else { + Utils.printDocComment(writer, method); + writer.print("\tpublic static native "); + } + writer.print(getResultType(method, true)); + writer.print(" " + Utils.getSimpleNativeMethodName(method, generate_error_checks, context_specific)); + if (mode == Mode.BUFFEROBJECT) + writer.print(Utils.BUFFER_OBJECT_METHOD_POSTFIX); + writer.print("("); + boolean first_parameter = generateParametersJava(writer, method, TypeInfo.getDefaultTypeInfoMap(method), true, true, mode); + if (context_specific) { + if (!first_parameter) + writer.print(", "); + writer.print("long " + Utils.FUNCTION_POINTER_VAR_NAME); + } + writer.println(");"); + } + + private static boolean generateParametersJava(PrintWriter writer, MethodDeclaration method, Map<ParameterDeclaration, TypeInfo> typeinfos_instance, boolean native_stub, final boolean printTypes, Mode mode) { + boolean first_parameter = true; + for (ParameterDeclaration param : method.getParameters()) { + if ( native_stub && (param.getAnnotation(Helper.class) != null && !param.getAnnotation(Helper.class).passToNative()) ) + continue; + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( constant_annotation != null && constant_annotation.isNative() ) + continue; + AnnotationMirror auto_annotation_mirror = Utils.getParameterAutoAnnotation(param); + boolean hide_auto_parameter = mode == Mode.NORMAL && !native_stub && auto_annotation_mirror != null; + if (hide_auto_parameter) { + AutoType auto_type_annotation = param.getAnnotation(AutoType.class); + if (auto_type_annotation != null) { + ParameterDeclaration auto_parameter = Utils.findParameter(method, auto_type_annotation.value()); + TypeInfo auto_param_type_info = typeinfos_instance.get(auto_parameter); + if (auto_param_type_info.getSignedness() == Signedness.BOTH) { + if (!first_parameter) + writer.print(", "); + first_parameter = false; + if ( printTypes ) + writer.print("boolean "); + writer.print(TypeInfo.UNSIGNED_PARAMETER_NAME); + } + } + } else if ( + param.getAnnotation(Result.class) == null + && (native_stub || ((param.getAnnotation(Constant.class) == null || param.getAnnotation(Constant.class).keepParam()) && !Utils.isReturnParameter(method, param))) + && (mode != Mode.AUTOS || getAutoTypeParameter(method, param) == null) + ) { + first_parameter = generateParameterJava(writer, param, typeinfos_instance.get(param), native_stub, printTypes, first_parameter, mode); + } + } + CachedResult cached_result_annotation = method.getAnnotation(CachedResult.class); + TypeMirror result_type = Utils.getMethodReturnType(method); + if ((native_stub && Utils.getNIOBufferType(result_type) != null) || Utils.needResultSize(method)) { + AutoSize auto_size_annotation = method.getAnnotation(AutoSize.class); + if ( auto_size_annotation == null || !auto_size_annotation.isNative() ) { + if (cached_result_annotation == null || !cached_result_annotation.isRange()) { + if (!first_parameter) + writer.print(", "); + first_parameter = false; + if ( printTypes ) + writer.print("long "); + writer.print(Utils.RESULT_SIZE_NAME); + } + } + } + if (cached_result_annotation != null) { + if (!first_parameter) + writer.print(", "); + + if ( mode == Mode.CACHEDRESULT ) { + if ( printTypes ) + writer.print("long "); + writer.print(Utils.CACHED_BUFFER_LENGTH_NAME + ", "); + } + + first_parameter = false; + if ( printTypes ) + writer.print(getResultType(method, native_stub)); + writer.print(" " + Utils.CACHED_BUFFER_NAME); + } + return first_parameter; + } + + private static boolean generateParameterJava(PrintWriter writer, ParameterDeclaration param, TypeInfo type_info, boolean native_stub, final boolean printTypes, boolean first_parameter, Mode mode) { + Class buffer_type = Utils.getNIOBufferType(param.getType()); + if (!first_parameter) + writer.print(", "); + BufferObject bo_annotation = param.getAnnotation(BufferObject.class); + if (bo_annotation != null && mode == Mode.BUFFEROBJECT) { + if (buffer_type == null) + throw new RuntimeException("type of " + param + " is not a nio Buffer parameter but is annotated as buffer object"); + if ( printTypes ) + writer.print("long "); + writer.print(param.getSimpleName() + Utils.BUFFER_OBJECT_PARAMETER_POSTFIX); + } else { + if ( native_stub && param.getAnnotation(PointerWrapper.class) != null ) + writer.print("long "); + else { + Class type = type_info.getType(); + if ( native_stub && (type == CharSequence.class || type == CharSequence[].class || type == PointerBuffer.class || Buffer.class.isAssignableFrom(type) ) ) + writer.print("long "); + else if ( printTypes ) + writer.print(type_info.getType().getSimpleName() + " "); + } + AutoSize auto_size_annotation = param.getAnnotation(AutoSize.class); + if ( auto_size_annotation != null ) + writer.print(auto_size_annotation.value() + "_"); + writer.print(param.getSimpleName()); + } + return false; + } + + private static void printBufferObjectCheck(PrintWriter writer, BufferKind kind, Mode mode, boolean context_specific) { + String bo_check_method_name = kind.toString(); + writer.print("\t\t" + Utils.CHECKS_CLASS_NAME + ".ensure" + bo_check_method_name); + if (mode == Mode.BUFFEROBJECT) + writer.print("enabled"); + else + writer.print("disabled"); + + if ( context_specific ) + writer.println("(caps);"); + else + writer.println("();"); + } + + private static void printBufferObjectChecks(PrintWriter writer, MethodDeclaration method, Mode mode, boolean context_specific) { + EnumSet<BufferKind> check_set = EnumSet.noneOf(BufferKind.class); + for (ParameterDeclaration param : method.getParameters()) { + BufferObject bo_annotation = param.getAnnotation(BufferObject.class); + if (bo_annotation != null) + check_set.add(bo_annotation.value()); + } + for (BufferKind kind : check_set) + printBufferObjectCheck(writer, kind, mode, context_specific); + } + + private static void printMethodWithMultiType(AnnotationProcessorEnvironment env, TypeMap type_map, PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method, Map<ParameterDeclaration, TypeInfo> typeinfos_instance, Mode mode, boolean generate_error_checks, boolean context_specific) { + Utils.printDocComment(writer, method); + if ( method.getAnnotation(Deprecated.class) != null ) + writer.println("\t@Deprecated"); + if ( interface_decl.getAnnotation(Private.class) == null && method.getAnnotation(Private.class) == null ) + writer.print("\tpublic static "); + else + writer.print("\tstatic "); + writer.print(getResultType(method, false)); + StripPostfix strip_annotation = method.getAnnotation(StripPostfix.class); + String method_name; + Alternate alt_annotation = method.getAnnotation(Alternate.class); + method_name = alt_annotation == null || alt_annotation.javaAlt() ? method.getSimpleName() : alt_annotation.value(); + if (strip_annotation != null && mode == Mode.NORMAL) + method_name = getPostfixStrippedName(type_map, interface_decl, method); + writer.print(" " + method_name + "("); + generateParametersJava(writer, method, typeinfos_instance, false, true, mode); + writer.println(") {"); + + final TypeMirror result_type = Utils.getMethodReturnType(method); + boolean has_result = !result_type.equals(env.getTypeUtils().getVoidType()); + + final Reuse reuse_annotation = method.getAnnotation(Reuse.class); + if ( reuse_annotation != null ) { + writer.print("\t\t"); + if ( has_result || method.getAnnotation(GLreturn.class) != null ) + writer.print("return "); + + writer.print(reuse_annotation.value() + "." + (reuse_annotation.method().length() > 0 ? reuse_annotation.method() : method_name) + "("); + generateParametersJava(writer, method, typeinfos_instance, false, false, mode); + writer.println(");\n\t}"); + return; + } + + if (context_specific) { + type_map.printCapabilitiesInit(writer); + writer.print("\t\tlong " + Utils.FUNCTION_POINTER_VAR_NAME + " = " + type_map.getCapabilities() + "."); + writer.println(Utils.getFunctionAddressName(interface_decl, method, true) + ";"); + writer.print("\t\tBufferChecks.checkFunctionAddress("); + writer.println(Utils.FUNCTION_POINTER_VAR_NAME + ");"); + } + final Code code_annotation = method.getAnnotation(Code.class); + if (code_annotation != null && code_annotation.value().length() > 0) + writer.println(code_annotation.value()); + printBufferObjectChecks(writer, method, mode, context_specific); + printParameterChecks(writer, method, typeinfos_instance, mode, generate_error_checks); + printParameterCaching(writer, interface_decl, method, mode, context_specific); + + if ( code_annotation != null && code_annotation.javaBeforeNative().length() > 0 ) + writer.println(code_annotation.javaBeforeNative()); + writer.print("\t\t"); + + final PointerWrapper pointer_wrapper_annotation = method.getAnnotation(PointerWrapper.class); + if (has_result) { + writer.print(getResultType(method, false) + " " + Utils.RESULT_VAR_NAME); + + if ( code_annotation != null && code_annotation.tryBlock() ) { + writer.print(" = " + getDefaultResultValue(method)); + writer.println(";\n\t\ttry {"); + writer.print("\t\t\t" + Utils.RESULT_VAR_NAME); + } + + writer.print(" = "); + if ( pointer_wrapper_annotation != null ) { + if ( pointer_wrapper_annotation.factory().length() > 0 ) + writer.print(pointer_wrapper_annotation.factory() + "("); + else + writer.print("new " + getResultType(method, false) + "("); + } + } else if ( method.getAnnotation(GLreturn.class) != null ) { + has_result = true; + Utils.printGLReturnPre(writer, method, method.getAnnotation(GLreturn.class), type_map); + } + writer.print(Utils.getSimpleNativeMethodName(method, generate_error_checks, context_specific)); + if (mode == Mode.BUFFEROBJECT) + writer.print(Utils.BUFFER_OBJECT_METHOD_POSTFIX); + writer.print("("); + boolean first_parameter = printMethodCallArguments(writer, method, typeinfos_instance, mode, type_map); + if (context_specific) { + if (!first_parameter) + writer.print(", "); + writer.print(Utils.FUNCTION_POINTER_VAR_NAME); + } + if ( has_result && pointer_wrapper_annotation != null ) { + writer.print(")"); + if ( pointer_wrapper_annotation.params().length() > 0 ) + writer.print(", " + pointer_wrapper_annotation.params()); + } + writer.println(");"); + + if ( code_annotation != null && code_annotation.javaAfterNative().length() > 0 ) + writer.println(code_annotation.javaAfterNative()); + + final String tabs = code_annotation != null && code_annotation.tryBlock() ? "\t\t\t" : "\t\t"; + if (generate_error_checks && method.getAnnotation(NoErrorCheck.class) == null) + type_map.printErrorCheckMethod(writer, method, tabs); + // DISABLED: indirect buffer support + //printNondirectParameterCopies(writer, method, mode); + if (has_result) { + if ( method.getAnnotation(GLreturn.class) == null ) { + if ( ByteBuffer.class.equals(Utils.getJavaType(result_type)) ) + writer.println(tabs + "return LWJGLUtil.CHECKS && " + Utils.RESULT_VAR_NAME + " == null ? null : " + Utils.RESULT_VAR_NAME + ".order(ByteOrder.nativeOrder());"); // safeNewBuffer returns a direct ByteBuffer with BIG_ENDIAN order. + else + writer.println(tabs + "return " + Utils.RESULT_VAR_NAME + ";"); + } else + Utils.printGLReturnPost(writer, method, method.getAnnotation(GLreturn.class), type_map); + } + + if ( code_annotation != null && code_annotation.tryBlock() ) { + writer.println("\t\t} finally {"); + writer.println(code_annotation.javaFinally()); + writer.println("\t\t}"); + } + writer.println("\t}"); + } + + private static String getExtensionPostfix(InterfaceDeclaration interface_decl) { + String interface_simple_name = interface_decl.getSimpleName(); + Extension extension_annotation = interface_decl.getAnnotation(Extension.class); + if (extension_annotation == null) { + int underscore_index = interface_simple_name.indexOf("_"); + if (underscore_index != -1) + return interface_simple_name.substring(0, underscore_index); + else + return ""; + } else + return extension_annotation.postfix(); + } + + private static ParameterDeclaration getAutoTypeParameter(MethodDeclaration method, ParameterDeclaration target_parameter) { + for (ParameterDeclaration param : method.getParameters()) { + AnnotationMirror auto_annotation = Utils.getParameterAutoAnnotation(param); + if (auto_annotation != null) { + Class annotation_type = NativeTypeTranslator.getClassFromType(auto_annotation.getAnnotationType()); + String parameter_name; + if (annotation_type.equals(AutoType.class)) + parameter_name = param.getAnnotation(AutoType.class).value(); + else if (annotation_type.equals(AutoSize.class)) + parameter_name = param.getAnnotation(AutoSize.class).value(); + else + throw new RuntimeException("Unknown annotation type " + annotation_type); + if (target_parameter.getSimpleName().equals(parameter_name)) + return param; + } + } + return null; + } + + private static boolean hasAnyParameterAutoTypeAnnotation(MethodDeclaration method, ParameterDeclaration target_param) { + for (ParameterDeclaration param : method.getParameters()) { + AutoType auto_type_annotation = param.getAnnotation(AutoType.class); + if (auto_type_annotation != null) { + ParameterDeclaration type_target_param = Utils.findParameter(method, auto_type_annotation.value()); + if (target_param.equals(type_target_param)) + return true; + } + } + return false; + } + + private static String getPostfixStrippedName(TypeMap type_map, InterfaceDeclaration interface_decl, MethodDeclaration method) { + StripPostfix strip_annotation = method.getAnnotation(StripPostfix.class); + ParameterDeclaration postfix_parameter = Utils.findParameter(method, strip_annotation.value()); + String postfix = strip_annotation.postfix(); + if ( "NULL".equals(postfix) ) { + PostfixTranslator translator = new PostfixTranslator(type_map, postfix_parameter); + postfix_parameter.getType().accept(translator); + postfix = translator.getSignature(); + } + String method_name; + Alternate alt_annotation = method.getAnnotation(Alternate.class); + method_name = alt_annotation == null || alt_annotation.javaAlt() ? method.getSimpleName() : alt_annotation.value(); + + String extension_postfix = "NULL".equals(strip_annotation.extension()) ? getExtensionPostfix(interface_decl) : strip_annotation.extension(); + String result; + + if ( strip_annotation.hasPostfix() && method_name.endsWith(postfix + "v" + extension_postfix)) + result = method_name.substring(0, method_name.length() - (postfix.length() + 1 + extension_postfix.length())); + else if ( strip_annotation.hasPostfix() && method_name.endsWith(postfix + extension_postfix)) + result = method_name.substring(0, method_name.length() - (postfix.length() + extension_postfix.length())); + else if ( strip_annotation.hasPostfix() && method_name.endsWith(postfix + "i_v" + extension_postfix) ) + result = method_name.substring(0, method_name.length() - (postfix.length() + 3 + extension_postfix.length())); + else if ( method_name.endsWith("i_v" + extension_postfix) ) + result = method_name.substring(0, method_name.length() - (3 + extension_postfix.length())); + else if (method_name.endsWith("v" + extension_postfix)) + result = method_name.substring(0, method_name.length() - (1 + extension_postfix.length())); + else + throw new RuntimeException(method + " is specified as being postfix stripped on parameter " + postfix_parameter + ", but it's postfix is not '" + postfix + "' nor 'v'"); + + return result + extension_postfix; + } + + private static int getBufferElementSizeExponent(Class c) { + if (IntBuffer.class.equals(c)) + return 2; + else if (LongBuffer.class.equals(c)) + return 3; + else if (DoubleBuffer.class.equals(c)) + return 3; + else if (ShortBuffer.class.equals(c)) + return 1; + else if (ByteBuffer.class.equals(c)) + return 0; + else if (FloatBuffer.class.equals(c)) + return 2; + else + throw new RuntimeException(c + " is not allowed"); + } + + private static boolean printMethodCallArgument(PrintWriter writer, MethodDeclaration method, ParameterDeclaration param, Map<ParameterDeclaration, TypeInfo> typeinfos_instance, Mode mode, boolean first_parameter, TypeMap type_map) { + if (!first_parameter) + writer.print(", "); + + AnnotationMirror auto_annotation = Utils.getParameterAutoAnnotation(param); + Constant constant_annotation = param.getAnnotation(Constant.class); + if (constant_annotation != null) { + writer.print(constant_annotation.value()); + } else if (auto_annotation != null && mode == Mode.NORMAL) { + Class param_type = NativeTypeTranslator.getClassFromType(auto_annotation.getAnnotationType()); + if (AutoType.class.equals(param_type)) { + final AutoType auto_type_annotation = param.getAnnotation(AutoType.class); + final ParameterDeclaration auto_parameter = Utils.findParameter(method, auto_type_annotation.value()); + final String auto_type = typeinfos_instance.get(auto_parameter).getAutoType(); + if ( auto_type == null ) + throw new RuntimeException("No auto type for parameter " + param.getSimpleName() + " in method " + method); + writer.print(auto_type); + } else if (AutoSize.class.equals(param_type)) { + final AutoSize auto_size_annotation = param.getAnnotation(AutoSize.class); + if ( !auto_size_annotation.useExpression() ) { + final String auto_parameter_name = auto_size_annotation.value(); + final ParameterDeclaration auto_target_param = Utils.findParameter(method, auto_parameter_name); + final TypeInfo auto_target_type_info = typeinfos_instance.get(auto_target_param); + final boolean shift_remaining = !hasAnyParameterAutoTypeAnnotation(method, auto_target_param) && Utils.isParameterMultiTyped(auto_target_param); + int shifting = 0; + if ( shift_remaining ) { + shifting = getBufferElementSizeExponent(auto_target_type_info.getType()); + if ( shifting > 0 ) + writer.print("("); + } + if ( auto_size_annotation.canBeNull() ) + writer.print("(" + auto_parameter_name + " == null ? 0 : " + auto_parameter_name + ".remaining())"); + else + writer.print(auto_parameter_name + ".remaining()"); + // Shift the remaining if the target parameter is multityped and there's no AutoType to track type + if (shift_remaining && shifting > 0) { + writer.print(" << " + shifting); + writer.print(")"); + } + } + writer.print(auto_size_annotation.expression()); + } else + throw new RuntimeException("Unknown auto annotation " + param_type); + } else { + if (mode == Mode.BUFFEROBJECT && param.getAnnotation(BufferObject.class) != null) { + writer.print(param.getSimpleName() + Utils.BUFFER_OBJECT_PARAMETER_POSTFIX); + } else { + Class type = typeinfos_instance.get(param).getType(); + Check check_annotation = param.getAnnotation(Check.class); + boolean hide_buffer = mode == Mode.AUTOS && getAutoTypeParameter(method, param) != null; + if (hide_buffer) { + writer.print("0L"); + } else { + if ( type == CharSequence.class || type == CharSequence[].class ) { + final String offset = Utils.getStringOffset(method, param); + + writer.print("APIUtil.getBuffer"); + if ( param.getAnnotation(NullTerminated.class) != null ) + writer.print("NT"); + writer.print('('); + writer.print(type_map.getAPIUtilParam(true)); + writer.print(param.getSimpleName()); + if ( offset != null ) + writer.print(", " + offset); + writer.print(")"); + } else { + final AutoSize auto_size_annotation = param.getAnnotation(AutoSize.class); + if ( auto_size_annotation != null ) + writer.print(auto_size_annotation.value() + "_"); + + final Class buffer_type = Utils.getNIOBufferType(param.getType()); + if ( buffer_type == null ) + writer.print(param.getSimpleName()); + else { + writer.print("MemoryUtil.getAddress"); + if ( check_annotation != null && check_annotation.canBeNull() ) + writer.print("Safe"); + writer.print("("); + writer.print(param.getSimpleName()); + writer.print(")"); + } + } + } + if ( type != long.class ) { + PointerWrapper pointer_annotation = param.getAnnotation(PointerWrapper.class); + if ( pointer_annotation != null ) { + if ( pointer_annotation.canBeNull() ) + writer.print(" == null ? 0 : " + param.getSimpleName()); + writer.print(".getPointer()"); + } + } + } + } + return false; + } + + private static boolean printMethodCallArguments(PrintWriter writer, MethodDeclaration method, Map<ParameterDeclaration, TypeInfo> typeinfos_instance, Mode mode, TypeMap type_map) { + boolean first_parameter = true; + for ( ParameterDeclaration param : method.getParameters() ) { + if ( param.getAnnotation(Result.class) != null || (param.getAnnotation(Helper.class) != null && !param.getAnnotation(Helper.class).passToNative()) ) + continue; + + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( constant_annotation== null || !constant_annotation.isNative() ) + first_parameter = printMethodCallArgument(writer, method, param, typeinfos_instance, mode, first_parameter, type_map); + } + if (Utils.getNIOBufferType(Utils.getMethodReturnType(method)) != null) { + if (method.getAnnotation(CachedResult.class) != null && method.getAnnotation(CachedResult.class).isRange()) { + first_parameter = false; + Utils.printExtraCallArguments(writer, method, ""); + } else { + AutoSize auto_size_annotation = method.getAnnotation(AutoSize.class); + if ( auto_size_annotation == null || !auto_size_annotation.isNative() ) { + if (!first_parameter) + writer.print(", "); + first_parameter = false; + + String result_size_expression; + if ( mode == Mode.CACHEDRESULT ) + result_size_expression = Utils.CACHED_BUFFER_LENGTH_NAME; + else if ( auto_size_annotation == null ) + result_size_expression = Utils.RESULT_SIZE_NAME; + else + result_size_expression = auto_size_annotation.value(); + + Utils.printExtraCallArguments(writer, method, result_size_expression); + } + } + } + return first_parameter; + } + + private static void printParameterCaching(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method, Mode mode, boolean context_specific) { + for (ParameterDeclaration param : method.getParameters()) { + Class java_type = Utils.getJavaType(param.getType()); + CachedReference cachedReference = param.getAnnotation(CachedReference.class); + if (Buffer.class.isAssignableFrom(java_type) && + cachedReference != null && + (mode != Mode.BUFFEROBJECT || param.getAnnotation(BufferObject.class) == null) && + param.getAnnotation(Result.class) == null) { + writer.print("\t\tif ( LWJGLUtil.CHECKS ) StateTracker."); + if ( context_specific ) + writer.print("getReferences(caps)."); + else + writer.print("getTracker()."); + if(cachedReference.name().length() > 0) { + writer.print(cachedReference.name()); + } else { + writer.print(Utils.getReferenceName(interface_decl, method, param)); + } + if(cachedReference.index().length() > 0) { + writer.print("[" + cachedReference.index() + "]"); + } + writer.println(" = " + param.getSimpleName() + ";"); + } + } + } + + private static void printParameterChecks(PrintWriter writer, MethodDeclaration method, Map<ParameterDeclaration, TypeInfo> typeinfos, Mode mode, final boolean generate_error_checks) { + if ( mode == Mode.NORMAL ) { + final GenerateAutos gen_autos_annotation = method.getAnnotation(GenerateAutos.class); + if ( gen_autos_annotation != null && gen_autos_annotation.sizeVariables().length > 0 ) { + // For the auto-generated parameters, declare and init a size variable (that can be reused by @Code) + for ( final ParameterDeclaration param : method.getParameters() ) { + if ( Arrays.binarySearch(gen_autos_annotation.sizeVariables(), param.getSimpleName()) >= 0 ) { + final int shifting = getBufferElementSizeExponent(typeinfos.get(param).getType()); + final Check check_annotation = param.getAnnotation(Check.class); + + writer.print("\t\tlong " + param.getSimpleName() + "_size = "); + if ( check_annotation == null || !check_annotation.canBeNull() ) + writer.println(param.getSimpleName() + ".remaining() << " + shifting + ";"); + else + writer.println(param.getSimpleName() + " == null ? 0 : " + param.getSimpleName() + ".remaining() << " + shifting + ";"); + } + } + } + } + + for (ParameterDeclaration param : method.getParameters()) { + Class java_type = Utils.getJavaType(param.getType()); + if ( java_type.isArray() || (Utils.isAddressableType(java_type) && + (mode != Mode.BUFFEROBJECT || param.getAnnotation(BufferObject.class) == null) && + (mode != Mode.AUTOS || getAutoTypeParameter(method, param) == null) && + param.getAnnotation(Result.class) == null && + !Utils.isReturnParameter(method, param)) ) { + String check_value = null; + boolean can_be_null = false; + Check check_annotation = param.getAnnotation(Check.class); + if (check_annotation != null) { + check_value = check_annotation.value(); + can_be_null = check_annotation.canBeNull(); + } + if ((Buffer.class.isAssignableFrom(java_type) || PointerBuffer.class.isAssignableFrom(java_type)) && param.getAnnotation(Constant.class) == null) { + boolean out_parameter = param.getAnnotation(OutParameter.class) != null; + TypeInfo typeinfo = typeinfos.get(param); + printParameterCheck(writer, method, param.getSimpleName(), typeinfo.getType().getSimpleName(), check_value, can_be_null, param.getAnnotation(NullTerminated.class), out_parameter, generate_error_checks); + } else if ( String.class.equals(java_type)) { + if (!can_be_null) + writer.println("\t\tBufferChecks.checkNotNull(" + param.getSimpleName() + ");"); + } else if ( java_type.isArray() ) { + final TypeInfo typeinfo = typeinfos.get(param); + printArrayParameterCheck(writer, param.getSimpleName(), typeinfo.getType().getSimpleName(), check_value, can_be_null); + } + } + } + if (method.getAnnotation(CachedResult.class) != null) + printParameterCheck(writer, method, Utils.CACHED_BUFFER_NAME, null, null, true, null, false, generate_error_checks); + } + + private static void printParameterCheck(PrintWriter writer, MethodDeclaration method, String name, String type, String check_value, boolean can_be_null, NullTerminated null_terminated, boolean out_parameter, boolean generate_error_checks) { + String tabs; + if (can_be_null) { + writer.print("\t\tif (" + name + " != null)"); + if ( null_terminated != null ) + writer.println(" {"); + else + writer.println(); + tabs = "\t\t\t"; + } else + tabs = "\t\t"; + writer.print(tabs + "BufferChecks.check"); + if (check_value != null && check_value.length() > 0) { + writer.print("Buffer"); + if ( "Buffer".equals(type) ) + writer.print("Size"); // Check size only, Buffer.isDirect() was added in 1.6, cannot use yet. TODO: Remove? + writer.print("(" + name + ", " + check_value); + } else { + writer.print("Direct(" + name); + } + writer.println(");"); + if ( can_be_null && generate_error_checks ) { + final Check check_annotation = method.getAnnotation(Check.class); + if ( check_annotation != null && check_annotation.value().equals(name) ) { + writer.println("\t\telse"); + writer.println("\t\t\t" + name + " = APIUtil.getBufferIntDebug();"); // Use an exclusive buffer here + } + } + if (null_terminated != null) { + writer.print(tabs + "BufferChecks.checkNullTerminated("); + writer.print(name); + if ( null_terminated.value().length() > 0 ) { + writer.print(", "); + writer.print(null_terminated.value()); + } + writer.println(");"); + if ( can_be_null ) + writer.println("\t\t}"); + } + } + + private static void printArrayParameterCheck(PrintWriter writer, String name, String type, String check_value, boolean can_be_null) { + String tabs; + if ( can_be_null ) { + writer.println("\t\tif (" + name + " != null)"); + tabs = "\t\t\t"; + } else + tabs = "\t\t"; + + writer.print(tabs + "BufferChecks.checkArray(" + name); + if ( check_value != null && check_value.length() > 0) + writer.print(", " + check_value); + writer.println(");"); + } + + private static String getResultType(MethodDeclaration method, boolean native_stub) { + if ( native_stub && method.getAnnotation(PointerWrapper.class) != null ) + return "long"; + else if ( !native_stub && method.getAnnotation(GLreturn.class) != null ) + return Utils.getMethodReturnType(method, method.getAnnotation(GLreturn.class), false); + else + return Utils.getJavaType(Utils.getMethodReturnType(method)).getSimpleName(); + } + + private static String getDefaultResultValue(MethodDeclaration method) { + if ( method.getAnnotation(GLreturn.class) != null ) { + final String type = Utils.getMethodReturnType(method, method.getAnnotation(GLreturn.class), false); + if ( "boolean".equals(type) ) + return "false"; + else if ( Character.isLowerCase(type.charAt(0)) ) + return "0"; + else + return "null"; + } else { + final Class type = Utils.getJavaType(Utils.getMethodReturnType(method)); + if ( type.isPrimitive() ) { + if ( type == boolean.class ) + return "false"; + else + return "0"; + } else + return "null"; + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaTypeTranslator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaTypeTranslator.java new file mode 100644 index 0000000..a170461 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/JavaTypeTranslator.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +import org.lwjgl.opencl.CLMem; + +import java.nio.ByteBuffer; + +import com.sun.mirror.type.*; +import com.sun.mirror.util.*; + +/** + * A TypeVisitor that translates (annotated) TypeMirrors to + * java types (represented by a Class) + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public class JavaTypeTranslator implements TypeVisitor { + private Class type; + + public Class getType() { + return type; + } + + public void visitAnnotationType(AnnotationType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitArrayType(ArrayType t) { + final TypeMirror componentType = t.getComponentType(); + if ( componentType instanceof PrimitiveType ) { + type = getPrimitiveArrayClassFromKind(((PrimitiveType)componentType).getKind()); + } else { + try { + final Class c = Class.forName(t.getComponentType().toString()); + if ( CharSequence.class.isAssignableFrom(c) || ByteBuffer.class.isAssignableFrom(c) || org.lwjgl.PointerWrapper.class.isAssignableFrom(c) ) + type = Class.forName("[L" + t.getComponentType() + ";"); + else { + throw new RuntimeException(t + " is not allowed"); + } + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + } + + public static Class getPrimitiveClassFromKind(PrimitiveType.Kind kind) { + switch ( kind ) { + case LONG: + return long.class; + case INT: + return int.class; + case DOUBLE: + return double.class; + case FLOAT: + return float.class; + case SHORT: + return short.class; + case BYTE: + return byte.class; + case BOOLEAN: + return boolean.class; + default: + throw new RuntimeException(kind + " is not allowed"); + } + } + + private static Class getPrimitiveArrayClassFromKind(PrimitiveType.Kind kind) { + switch ( kind ) { + case LONG: + return long[].class; + case INT: + return int[].class; + case DOUBLE: + return double[].class; + case FLOAT: + return float[].class; + case SHORT: + return short[].class; + case BYTE: + return byte[].class; + case BOOLEAN: + return boolean[].class; + default: + throw new RuntimeException(kind + " is not allowed"); + } + } + + public void visitPrimitiveType(PrimitiveType t) { + type = getPrimitiveClassFromKind(t.getKind()); + } + + public void visitDeclaredType(DeclaredType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitEnumType(EnumType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitClassType(ClassType t) { + type = NativeTypeTranslator.getClassFromType(t); + } + + public void visitInterfaceType(InterfaceType t) { + type = NativeTypeTranslator.getClassFromType(t); + } + + public void visitReferenceType(ReferenceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeMirror(TypeMirror t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeVariable(TypeVariable t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitVoidType(VoidType t) { + type = void.class; + } + + public void visitWildcardType(WildcardType t) { + throw new RuntimeException(t + " is not allowed"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Mode.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Mode.java new file mode 100644 index 0000000..ffb6aa9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Mode.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +public enum Mode { + BUFFEROBJECT, + AUTOS, + CACHEDRESULT, // Used for generating a CachedResult method with an explicit length argument. + NORMAL +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java new file mode 100644 index 0000000..f69dbfe --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeMethodStubsGenerator.java @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * This class generates the functions in the native source files. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.util.*; +import java.nio.*; + +public class NativeMethodStubsGenerator { + private static final String BUFFER_ADDRESS_POSTFIX = "_address"; + public static final String BUFFER_POSITION_POSTFIX = "_position"; + private static final String STRING_LIST_NAME = "_str"; + private static final String POINTER_LIST_NAME = "_ptr"; + + public static void generateNativeMethodStubs(AnnotationProcessorEnvironment env, TypeMap type_map, PrintWriter writer, InterfaceDeclaration d, boolean generate_error_checks, boolean context_specific) { + for (MethodDeclaration method : d.getMethods()) { + Alternate alt_annotation = method.getAnnotation(Alternate.class); + if ( (alt_annotation != null && (!alt_annotation.nativeAlt() || alt_annotation.skipNative())) || method.getAnnotation(Reuse.class) != null ) + continue; + generateMethodStub(env, type_map, writer, Utils.getQualifiedClassName(d), method, Mode.NORMAL, generate_error_checks, context_specific); + if (Utils.hasMethodBufferObjectParameter(method)) + generateMethodStub(env, type_map, writer, Utils.getQualifiedClassName(d), method, Mode.BUFFEROBJECT, generate_error_checks, context_specific); + } + } + + private static void generateParameters(PrintWriter writer, Collection<ParameterDeclaration> params, Mode mode) { + for (ParameterDeclaration param : params) { + if ( param.getAnnotation(Result.class) != null || (param.getAnnotation(Helper.class) != null && !param.getAnnotation(Helper.class).passToNative()) ) + continue; + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( constant_annotation == null || !constant_annotation.isNative() ) + generateParameter(writer, param, mode); + } + } + + private static void generateParameter(PrintWriter writer, ParameterDeclaration param, Mode mode) { + writer.print(", "); + if (mode == Mode.BUFFEROBJECT && param.getAnnotation(BufferObject.class) != null) { + writer.print("jlong " + param.getSimpleName() + Utils.BUFFER_OBJECT_PARAMETER_POSTFIX); + } else if ( param.getAnnotation(PointerWrapper.class) != null ) { + writer.print("jlong " + param.getSimpleName()); + } else { + JNITypeTranslator translator = new JNITypeTranslator(); + param.getType().accept(translator); + writer.print(translator.getSignature() + " " + param.getSimpleName()); + } + } + + private static void generateMethodStub(AnnotationProcessorEnvironment env, TypeMap type_map, PrintWriter writer, String interface_name, MethodDeclaration method, Mode mode, boolean generate_error_checks, boolean context_specific) { + if ( !context_specific && method.getAnnotation(Alternate.class) == null ) + writer.print("static "); + else + writer.print("JNIEXPORT "); + + final TypeMirror result_type = Utils.getMethodReturnType(method); + final CachedResult cached_result_annotation = method.getAnnotation(CachedResult.class); + final AutoSize auto_size_annotation = method.getAnnotation(AutoSize.class); + + if ( method.getAnnotation(PointerWrapper.class) != null ) { + writer.print("jlong"); + } else { + JNITypeTranslator translator = new JNITypeTranslator(); + result_type.accept(translator); + writer.print(translator.getReturnSignature()); + } + writer.print(" JNICALL "); + + writer.print(Utils.getQualifiedNativeMethodName(interface_name, method, generate_error_checks, context_specific)); + if (mode == Mode.BUFFEROBJECT) + writer.print(Utils.BUFFER_OBJECT_METHOD_POSTFIX); + writer.print("(JNIEnv *env, jclass clazz"); + generateParameters(writer, method.getParameters(), mode); + if (Utils.getNIOBufferType(result_type) != null) { + if ( (cached_result_annotation == null || !cached_result_annotation.isRange()) && (auto_size_annotation == null || !auto_size_annotation.isNative()) ) + writer.print(", jlong " + Utils.RESULT_SIZE_NAME); + if (cached_result_annotation != null) + writer.print(", jobject " + Utils.CACHED_BUFFER_NAME); + } + if (context_specific) { + writer.print(", jlong " + Utils.FUNCTION_POINTER_VAR_NAME); + } + writer.println(") {"); + + generateBufferParameterAddresses(type_map, writer, method, mode); + Alternate alt_annotation = method.getAnnotation(Alternate.class); + if (context_specific) { + String typedef_name = Utils.getTypedefName(method); + writer.print("\t" + typedef_name + " " + (alt_annotation == null ? method.getSimpleName() : alt_annotation.value())); + writer.print(" = (" + typedef_name + ")((intptr_t)"); + writer.println(Utils.FUNCTION_POINTER_VAR_NAME + ");"); + } + + final Code code_annotation = method.getAnnotation(Code.class); + + final boolean hasResult = !result_type.equals(env.getTypeUtils().getVoidType()); + final boolean resultPreDeclare = hasResult && (hasPointerArrayInits(method.getParameters()) || (code_annotation != null && (code_annotation.nativeAfterVars().length() > 0 || code_annotation.nativeBeforeCall().length() > 0))); + if ( resultPreDeclare ) + printResultParam(type_map, writer, method, result_type, true); + + if ( code_annotation != null && code_annotation.nativeAfterVars().length() > 0 ) + writer.println(code_annotation.nativeAfterVars()); + + generatePointerArrayInits(type_map, writer, method.getParameters()); + + if ( code_annotation != null && code_annotation.nativeBeforeCall().length() > 0 ) + writer.println(code_annotation.nativeBeforeCall()); + + writer.print("\t"); + if ( resultPreDeclare ) + writer.print(Utils.RESULT_VAR_NAME + " = "); + else if ( hasResult ) + printResultParam(type_map, writer, method, result_type, false); + writer.print((alt_annotation == null ? method.getSimpleName() : alt_annotation.value()) + "("); + generateCallParameters(writer, type_map, method.getParameters()); + writer.print(")"); + writer.println(";"); + + if ( code_annotation != null && code_annotation.nativeAfterCall().length() > 0 ) + writer.println(code_annotation.nativeAfterCall()); + + generateStringDeallocations(writer, method.getParameters()); + if (!result_type.equals(env.getTypeUtils().getVoidType())) { + writer.print("\treturn "); + Class java_result_type = Utils.getJavaType(result_type); + if (Buffer.class.isAssignableFrom(java_result_type)) { + if (cached_result_annotation != null) + writer.print("safeNewBufferCached(env, "); + else + writer.print("safeNewBuffer(env, "); + } else if (String.class.equals(java_result_type)) { + writer.print("NewStringNativeUnsigned(env, "); + } else if ( method.getAnnotation(PointerWrapper.class) != null ) { + writer.print("(intptr_t)"); + } + writer.print(Utils.RESULT_VAR_NAME); + if (Buffer.class.isAssignableFrom(java_result_type)) { + final String size_parameter_name; + if ( auto_size_annotation != null && (auto_size_annotation.isNative() || (cached_result_annotation != null && cached_result_annotation.isRange())) ) + size_parameter_name = auto_size_annotation.value(); + else + size_parameter_name = Utils.RESULT_SIZE_NAME; + + writer.print(", "); + Utils.printExtraCallArguments(writer, method, size_parameter_name); + } + if (Buffer.class.isAssignableFrom(java_result_type) || + String.class.equals(java_result_type)) + writer.print(")"); + writer.println(";"); + } + writer.println("}"); + writer.println(); + } + + private static void printResultParam(final TypeMap type_map, final PrintWriter writer, final MethodDeclaration method, final TypeMirror result_type, final boolean preDeclare) { + final ParameterDeclaration result_param = Utils.getResultParameter(method); + final Declaration return_declaration = result_param == null ? method : result_param; + final NativeTypeTranslator result_translator = new NativeTypeTranslator(type_map, return_declaration); + result_type.accept(result_translator); + if ( preDeclare ) + writer.print("\t"); + writer.print(result_translator.getSignature() + " " + Utils.RESULT_VAR_NAME); + if ( preDeclare) + writer.println(";"); + else + writer.print(result_param == null ? " = " : ";\n\t"); + } + + private static void generateCallParameters(PrintWriter writer, TypeMap type_map, Collection<ParameterDeclaration> params) { + if (params.size() > 0) { + boolean first = true; + for ( ParameterDeclaration param : params ) { + if ( param.getAnnotation(Helper.class) != null ) + continue; + + if ( first ) + first = false; + else + writer.print(", "); + + generateCallParameter(writer, type_map, param); + } + } + } + + private static void generateCallParameter(PrintWriter writer, TypeMap type_map, ParameterDeclaration param) { + if ( param.getAnnotation(Helper.class) != null ) + return; + + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( constant_annotation != null && constant_annotation.isNative() ) { + writer.print(constant_annotation.value()); + return; + } + + boolean is_indirect = param.getAnnotation(Indirect.class) != null; + if (is_indirect || param.getAnnotation(PointerArray.class) != null) { + writer.print("("); + final NativeTypeTranslator translator = new NativeTypeTranslator(type_map, param); + param.getType().accept(translator); + writer.print(translator.getSignature()); + writer.print("*)"); + } + if ( param.getAnnotation(PointerWrapper.class) != null ) + writer.print("(" + param.getAnnotation(PointerWrapper.class).value() + ")(intptr_t)"); + if (param.getAnnotation(Result.class) != null || is_indirect) + writer.print("&"); + + if ( param.getAnnotation(Result.class) != null ) { + writer.print(Utils.RESULT_VAR_NAME); + } else { + writer.print(param.getSimpleName()); + if ( param.getAnnotation(PointerArray.class) != null ) + writer.print(getPointerArrayName(Utils.getJavaType(param.getType()))); + else if ( Utils.isAddressableType(param.getType()) ) + writer.print(BUFFER_ADDRESS_POSTFIX); + } + } + + private static void generateStringDeallocations(PrintWriter writer, Collection<ParameterDeclaration> params) { + for (ParameterDeclaration param : params) { + final Class java_type = Utils.getJavaType(param.getType()); + if ( java_type.equals(String.class) && param.getAnnotation(Result.class) == null ) + writer.println("\tfree(" + param.getSimpleName() + BUFFER_ADDRESS_POSTFIX + ");"); + else if (param.getAnnotation(PointerArray.class) != null ) // Free the string array mem + writer.println("\tfree(" + param.getSimpleName() + getPointerArrayName(java_type) + ");"); + } + } + + private static void generateBufferParameterAddresses(TypeMap type_map, PrintWriter writer, MethodDeclaration method, Mode mode) { + strLoopDeclared = false; + ptrLoopDeclared = false; + for ( ParameterDeclaration param : method.getParameters() ) { + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( param.getAnnotation(Result.class) == null && (constant_annotation == null || !constant_annotation.isNative()) && Utils.isAddressableType(param.getType())) + generateBufferParameterAddress(type_map, writer, method, param, mode); + } + } + + private static boolean strLoopDeclared; + private static boolean ptrLoopDeclared; + + private static void generateBufferParameterAddress(TypeMap type_map, PrintWriter writer, MethodDeclaration method, ParameterDeclaration param, Mode mode) { + final Check check_annotation = param.getAnnotation(Check.class); + final PointerArray array_annotation = param.getAnnotation(PointerArray.class); + final Class java_type = Utils.getJavaType(param.getType()); + + final NativeTypeTranslator translator = new NativeTypeTranslator(type_map, param); + param.getType().accept(translator); + final String native_type = translator.getSignature(); + + if ( !java_type.isArray() || CharSequence.class.isAssignableFrom(java_type.getComponentType()) ) { + writer.print("\t" + native_type + param.getSimpleName()); + writer.print(BUFFER_ADDRESS_POSTFIX + " = ("); + writer.print(native_type); + writer.print(")(intptr_t)"); + + if (mode == Mode.BUFFEROBJECT && param.getAnnotation(BufferObject.class) != null) { + writer.print("offsetToPointer(" + param.getSimpleName() + Utils.BUFFER_OBJECT_PARAMETER_POSTFIX + ")"); + } else { + if (Buffer.class.isAssignableFrom(java_type) || java_type.equals(CharSequence.class) || java_type.equals(CharSequence[].class) || PointerBuffer.class.isAssignableFrom(java_type) ) { + writer.print(param.getSimpleName()); + } else if (java_type.equals(String.class)) { + writer.print("GetStringNativeChars(env, " + param.getSimpleName() + ")"); + } else if ( array_annotation == null ) + throw new RuntimeException("Illegal type " + java_type); + } + writer.println(";"); + } + + if ( array_annotation != null ) { + final String n = getPointerArrayName(java_type); + final String arrayType; + if ( POINTER_LIST_NAME.equals(n) ) { + if ( n.equals(param.getSimpleName()) ) + throw new RuntimeException("The name '" + n + "' is not valid for object array arguments annotated with PointerArray"); + + arrayType = translator.getSignature(true) + (org.lwjgl.PointerWrapper.class.isAssignableFrom(java_type.getComponentType()) ? " " : ""); + + // Declare loop counters and allocate object array + if ( !ptrLoopDeclared ) { + writer.println("\tint " + n + "_i;"); + writer.println("\tjobject " + n + "_object;"); + ptrLoopDeclared = true; + } + } else { + if ( n.equals(param.getSimpleName()) ) + throw new RuntimeException("The name '" + n + "' is not valid for arguments annotated with PointerArray"); + + arrayType = translator.getSignature(true); + + // Declare loop counters and allocate string array + if ( !strLoopDeclared ) { + writer.println("\tint " + n + "_i;"); + writer.println("\t" + arrayType + n + "_address;"); + strLoopDeclared = true; + } + } + + writer.print("\t" + arrayType + "*" + param.getSimpleName() + n + " = "); + if ( check_annotation != null && check_annotation.canBeNull() ) + writer.print(array_annotation.value() + " == 0 ? NULL : "); + writer.println("(" + arrayType + "*) malloc(" + array_annotation.value() + " * sizeof(" + arrayType + "));"); + } + } + + private static String getPointerArrayName(final Class java_type) { + final Class<?> component_type = java_type.getComponentType(); + if ( component_type != null && (Buffer.class.isAssignableFrom(component_type) || org.lwjgl.PointerWrapper.class.isAssignableFrom(component_type)) ) + return POINTER_LIST_NAME; + else + return STRING_LIST_NAME; + } + + private static boolean hasPointerArrayInits(Collection<ParameterDeclaration> params) { + for ( ParameterDeclaration param : params ) { + PointerArray pointerArray_annotation = param.getAnnotation(PointerArray.class); + if ( pointerArray_annotation != null ) + return true; + } + return false; + } + + private static void generatePointerArrayInits(TypeMap type_map, PrintWriter writer, Collection<ParameterDeclaration> params) { + for ( ParameterDeclaration param : params ) { + PointerArray pointerArray_annotation = param.getAnnotation(PointerArray.class); + if ( pointerArray_annotation != null ) { + final Class java_type = Utils.getJavaType(param.getType()); + final Class<?> component_type = java_type.isArray() ? java_type.getComponentType() : null; + final NativeTypeTranslator translator = new NativeTypeTranslator(type_map, param); + param.getType().accept(translator); + + final String n = getPointerArrayName(java_type); + if ( POINTER_LIST_NAME.equals(n) ) { + // Init vars + writer.println("\t" + n + "_i = 0;"); + // Fill pointer array with the buffer pointers + writer.println("\twhile ( " + n + "_i < " + pointerArray_annotation.value() + " ) {"); + writer.println("\t\t" + n + "_object = (*env)->GetObjectArrayElement(env, " + param.getSimpleName() + ", " + n + "_i);"); + writer.print("\t\t" + param.getSimpleName() + n + "[" + n + "_i++] = (" + translator.getSignature(true) + ")"); + if ( Buffer.class.isAssignableFrom(component_type) ) + writer.println("(*env)->GetDirectBufferAddress(env, " + n + "_object);"); + else + writer.println("(intptr_t)getPointerWrapperAddress(env, " + n + "_object);"); + writer.println("\t}"); + } else { + final String lengths = pointerArray_annotation.lengths(); + + // Init vars + writer.println("\t" + n + "_i = 0;"); + writer.println("\t" + n + "_address = (" + translator.getSignature(true) + ")" + param.getSimpleName() + BUFFER_ADDRESS_POSTFIX + ";"); + // Fill string array with the string pointers + writer.println("\twhile ( " + n + "_i < " + pointerArray_annotation.value() + " ) {"); + if ( lengths.length() == 0 ) { + writer.println("\t\t" + param.getSimpleName() + n + "[" + n + "_i++] = " + n + "_address;"); + writer.println("\t\t" + n + "_address += strlen(" + n + "_address) + 1;"); + } else { + writer.println("\t\t" + param.getSimpleName() + n + "[" + n + "_i] = " + n + "_address;"); + writer.println("\t\t" + n + "_address += " + lengths + BUFFER_ADDRESS_POSTFIX + "[" + n + "_i++];"); + } + writer.println("\t}"); + } + } + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeType.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeType.java new file mode 100644 index 0000000..fbcf1b9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeType.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation indicates that another annotation is + * a native type. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target({ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) +public @interface NativeType { + String value() default ""; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java new file mode 100644 index 0000000..3c9963f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NativeTypeTranslator.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * A TypeVisitor that translates types (and optional native type + * annotations) to the native type string. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; + +import java.lang.annotation.Annotation; +import java.nio.*; +import java.util.ArrayList; +import java.util.Collection; + +import com.sun.mirror.declaration.AnnotationMirror; +import com.sun.mirror.declaration.Declaration; +import com.sun.mirror.type.*; +import com.sun.mirror.util.TypeVisitor; + +/** + * $Id$ + * <p/> + * A TypeVisitor that translates (annotated) TypeMirrors to + * native types + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ +public class NativeTypeTranslator implements TypeVisitor { + + private Collection<Class> native_types; + private boolean is_indirect; + private final Declaration declaration; + private final TypeMap type_map; + + public NativeTypeTranslator(TypeMap type_map, Declaration declaration) { + this.declaration = declaration; + this.type_map = type_map; + } + + public String getSignature() { + return getSignature(false); + } + + public String getSignature(final boolean skipConst) { + StringBuilder signature = new StringBuilder(); + if ( !skipConst && declaration.getAnnotation(Const.class) != null ) + signature.append("const "); + + if ( declaration.getAnnotation(PointerWrapper.class) != null ) { + signature.append(declaration.getAnnotation(PointerWrapper.class).value()); + } else if ( declaration.getAnnotation(NativeType.class) != null ) { + signature.append(declaration.getAnnotation(NativeType.class).value()); + } else { + // Use the name of the native type annotation as the C type name + signature.append(getAnnotationType().getSimpleName()); + } + + if ( is_indirect ) + signature.append(" *"); + return signature.toString(); + } + + public Class getAnnotationType() { + if ( native_types.size() != 1 ) + throw new RuntimeException("Expected only one native type for declaration " + declaration + + ", but got " + native_types.size()); + return native_types.iterator().next(); + } + + public void visitAnnotationType(AnnotationType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitArrayType(ArrayType t) { + final Class<?> type = Utils.getJavaType(t).getComponentType(); + + if ( CharSequence.class.isAssignableFrom(type) ) { + is_indirect = true; + native_types = new ArrayList<Class>(); + native_types.add(type_map.getStringArrayType()); + } else if ( Buffer.class.isAssignableFrom(type) ) { + is_indirect = true; + native_types = new ArrayList<Class>(); + native_types.add(type_map.getByteBufferArrayType()); + } else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) { + is_indirect = false; + } else + throw new RuntimeException(t + " is not allowed"); + } + + public static PrimitiveType.Kind getPrimitiveKindFromBufferClass(Class c) { + if ( IntBuffer.class.equals(c) ) + return PrimitiveType.Kind.INT; + else if ( DoubleBuffer.class.equals(c) ) + return PrimitiveType.Kind.DOUBLE; + else if ( ShortBuffer.class.equals(c) ) + return PrimitiveType.Kind.SHORT; + else if ( ByteBuffer.class.equals(c) || PointerBuffer.class.equals(c) ) + return PrimitiveType.Kind.BYTE; + else if ( FloatBuffer.class.equals(c) ) + return PrimitiveType.Kind.FLOAT; + else if ( LongBuffer.class.equals(c) ) + return PrimitiveType.Kind.LONG; + else + throw new RuntimeException(c + " is not allowed"); + } + + @SuppressWarnings("unchecked") + public static Class<? extends Annotation> getClassFromType(DeclaredType t) { + try { + return (Class<? extends Annotation>)Class.forName(t.getDeclaration().getQualifiedName()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private void getNativeTypeFromAnnotatedPrimitiveType(PrimitiveType.Kind kind) { + native_types = translateAnnotations(); + if ( native_types.size() == 0 ) + native_types.add(type_map.getNativeTypeFromPrimitiveType(kind)); + } + + public void visitClassType(ClassType t) { + is_indirect = true; + + Class<?> c = getClassFromType(t); + if ( String.class.equals(c) ) { + native_types = new ArrayList<Class>(); + native_types.add(type_map.getStringElementType()); + } else if ( Buffer.class.equals(c) ) { + native_types = new ArrayList<Class>(); + native_types.add(type_map.getVoidType()); + } else if ( Buffer.class.isAssignableFrom(c) || PointerBuffer.class.isAssignableFrom(c) ) { + PrimitiveType.Kind kind = getPrimitiveKindFromBufferClass(c); + getNativeTypeFromAnnotatedPrimitiveType(kind); + } else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(c) ) { + native_types = new ArrayList<Class>(); + native_types.add(PointerWrapper.class); + + is_indirect = false; + } else + throw new RuntimeException(t + " is not allowed"); + } + + public void visitPrimitiveType(PrimitiveType t) { + getNativeTypeFromAnnotatedPrimitiveType(t.getKind()); + } + + public void visitDeclaredType(DeclaredType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitEnumType(EnumType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitInterfaceType(InterfaceType t) { + // See ARB_debug_label.glObjectPtrLabel + Class<?> c = getClassFromType(t); + if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(c) ) { + native_types = new ArrayList<Class>(); + native_types.add(PointerWrapper.class); + + is_indirect = false; + } else + throw new RuntimeException(t + " is not allowed"); + } + + // Check if the annotation is itself annotated with a certain annotation type + + public static <T extends Annotation> T getAnnotation(AnnotationMirror annotation, Class<T> type) { + return annotation.getAnnotationType().getDeclaration().getAnnotation(type); + } + + private static Class translateAnnotation(AnnotationMirror annotation) { + NativeType native_type = getAnnotation(annotation, NativeType.class); + if ( native_type != null ) { + return getClassFromType(annotation.getAnnotationType()); + } else + return null; + } + + private Collection<Class> translateAnnotations() { + Collection<Class> result = new ArrayList<Class>(); + for ( AnnotationMirror annotation : Utils.getSortedAnnotations(declaration.getAnnotationMirrors()) ) { + Class translated_result = translateAnnotation(annotation); + if ( translated_result != null ) { + result.add(translated_result); + } + } + return result; + } + + public void visitReferenceType(ReferenceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeMirror(TypeMirror t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeVariable(TypeVariable t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitVoidType(VoidType t) { + native_types = translateAnnotations(); + if ( native_types.size() == 0 ) + native_types.add(void.class); + } + + public void visitWildcardType(WildcardType t) { + throw new RuntimeException(t + " is not allowed"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NoErrorCheck.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NoErrorCheck.java new file mode 100644 index 0000000..bb330c6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NoErrorCheck.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation implies that a method should not include + * error checking even if it is enabled. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.METHOD) +public @interface NoErrorCheck { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NullTerminated.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NullTerminated.java new file mode 100644 index 0000000..1d32492 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/NullTerminated.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation implies that a Buffer argument should be + * checked for a trailing '\0' + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface NullTerminated { + String value() default ""; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Optional.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Optional.java new file mode 100644 index 0000000..60f1063 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Optional.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * A function annotated with @Optional will allow the extension to be available even if the driver does not expose that function. + * This is useful when certain buggy drivers miss some functionality. + * + * @author spasi <spasi@users.sourceforge.net> + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +public @interface Optional { + String reason(); // No default value to force documentation +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/OutParameter.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/OutParameter.java new file mode 100644 index 0000000..c23c6ee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/OutParameter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * This annotation indicates that a parameter is written, + * not read. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2286 $ + * $Id: Check.java 2286 2006-03-23 19:32:21Z matzon $ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface OutParameter { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Platform.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Platform.java new file mode 100644 index 0000000..5968478 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Platform.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.io.PrintWriter; + +public enum Platform { + WGL, + GLX, + ALL; + + public void printPrologue(PrintWriter writer) { + if (this == ALL) + return; + writer.print("#ifdef "); + switch (this) { + case WGL: + writer.println("_WIN32"); + break; + case GLX: + writer.println("_X11"); + break; + default: + throw new RuntimeException(this + " is not supported"); + } + } + + public void printEpilogue(PrintWriter writer) { + if (this == ALL) + return; + writer.println("#endif"); + } + + public String getOSPrefix() { + switch (this) { + case WGL: + return "Windows"; + case GLX: + return "Linux"; + default: + throw new RuntimeException(this + " has no OS specific prefix"); + } + } + + public String getPrefix() { + switch (this) { + case WGL: + return "wgl"; + case GLX: + return "glX"; + case ALL: + return "gl"; + default: + throw new RuntimeException(this + " is not supported"); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PlatformDependent.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PlatformDependent.java new file mode 100644 index 0000000..22ca33f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PlatformDependent.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation implies that the corresponding native + * function symbol is named after the platform specific + * window system (glX, wgl, ...) + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.METHOD) +public @interface PlatformDependent { + Platform[] value(); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerArray.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerArray.java new file mode 100644 index 0000000..0eaa493 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerArray.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author spasi <spasi@users.sourceforge.net> + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface PointerArray { + /** Number of values in the string list (name of native-side parameter) */ + String value(); + /** List of string lengths (name of native-side parameter) */ + String lengths() default ""; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerType.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerType.java new file mode 100644 index 0000000..48f4ce3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** Marker interface for pointer types. */ +@Target(ElementType.ANNOTATION_TYPE) +public @interface PointerType { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerWrapper.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerWrapper.java new file mode 100644 index 0000000..0efe225 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PointerWrapper.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * @author spasi <spasi@users.sourceforge.net> + */ +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface PointerWrapper { + String value(); // The native pointer type. + boolean canBeNull() default false; // Whether the pointer may be null. + String params() default ""; // Pass these extra parameters when constructing PointerWrapper objects. + String factory() default ""; // Use this factory method call instead of normal object construction. +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PostfixTranslator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PostfixTranslator.java new file mode 100644 index 0000000..878a14d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/PostfixTranslator.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * A TypeVisitor that translates (annotated) TypeMirrors to + * postfixes. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; +import com.sun.mirror.util.*; + +import java.lang.annotation.Annotation; +import java.nio.*; + +public class PostfixTranslator implements TypeVisitor { + private final StringBuilder signature = new StringBuilder(); + private final Declaration declaration; + private final TypeMap type_map; + + public PostfixTranslator(TypeMap type_map, Declaration declaration) { + this.declaration = declaration; + this.type_map = type_map; + } + + public String getSignature() { + return signature.toString(); + } + + public void visitAnnotationType(AnnotationType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitArrayType(ArrayType t) { + throw new RuntimeException(t + " is not allowed"); + } + + private static PrimitiveType.Kind getPrimitiveKindFromBufferClass(Class c) { + if (IntBuffer.class.equals(c) || int.class.equals(c) ) + return PrimitiveType.Kind.INT; + else if (DoubleBuffer.class.equals(c) || double.class.equals(c) ) + return PrimitiveType.Kind.DOUBLE; + else if (ShortBuffer.class.equals(c) || short.class.equals(c) ) + return PrimitiveType.Kind.SHORT; + else if (ByteBuffer.class.equals(c) || byte.class.equals(c) ) + return PrimitiveType.Kind.BYTE; + else if (FloatBuffer.class.equals(c) || float.class.equals(c)) + return PrimitiveType.Kind.FLOAT; + else if (LongBuffer.class.equals(c) || long.class.equals(c) ) + return PrimitiveType.Kind.LONG; + else + throw new RuntimeException(c + " is not allowed"); + } + + public void visitClassType(ClassType t) { + Class<?> c = NativeTypeTranslator.getClassFromType(t); + PrimitiveType.Kind kind = getPrimitiveKindFromBufferClass(c); + visitPrimitiveTypeKind(kind); + } + + public void visitDeclaredType(DeclaredType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitEnumType(EnumType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitInterfaceType(InterfaceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + private boolean translateAnnotation(AnnotationMirror annotation) { + NativeType native_type = NativeTypeTranslator.getAnnotation(annotation, NativeType.class); + if (native_type != null) { + Class<? extends Annotation> annotation_class = NativeTypeTranslator.getClassFromType(annotation.getAnnotationType()); + signature.append(type_map.translateAnnotation(annotation_class)); + return true; + } else + return false; + } + + private boolean translateAnnotations() { + boolean result = false; + for (AnnotationMirror annotation : Utils.getSortedAnnotations(declaration.getAnnotationMirrors())) + if (translateAnnotation(annotation)) { + if (result) + throw new RuntimeException("Multiple native types"); + result = true; + } + return result; + } + + public void visitPrimitiveType(PrimitiveType t) { + visitPrimitiveTypeKind(t.getKind()); + } + + private void visitPrimitiveTypeKind(PrimitiveType.Kind kind) { + boolean annotated_translation = translateAnnotations(); + if (annotated_translation) + return; + // No annotation type was specified, fall back to default + String type; + switch (kind) { + case INT: + type = "i"; + break; + case DOUBLE: + type = "d"; + break; + case FLOAT: + type = "f"; + break; + case SHORT: + type = "s"; + break; + case BYTE: + type = "b"; + break; + case LONG: + type = "i64"; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + signature.append(type); + } + + public void visitReferenceType(ReferenceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeMirror(TypeMirror t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeVariable(TypeVariable t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitVoidType(VoidType t) { + } + + public void visitWildcardType(WildcardType t) { + throw new RuntimeException(t + " is not allowed"); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Private.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Private.java new file mode 100644 index 0000000..3cfcc12 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Private.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * Extension templates marked with <code>@Private</code> will result in classes without the <code>public</code> keyword. + * + * @author Spasi + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface Private { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/RegisterStubsGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/RegisterStubsGenerator.java new file mode 100644 index 0000000..00cc4c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/RegisterStubsGenerator.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * This class generates the initNatives native function. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.util.*; + +public class RegisterStubsGenerator { + public static void generateMethodsNativeStubBind(PrintWriter writer, InterfaceDeclaration d, boolean generate_error_checks, boolean context_specific) { + Iterator<? extends MethodDeclaration> it = d.getMethods().iterator(); + while (it.hasNext()) { + MethodDeclaration method = it.next(); + Alternate alt_annotation = method.getAnnotation(Alternate.class); + if ( (alt_annotation != null && (!alt_annotation.nativeAlt() || alt_annotation.skipNative())) || method.getAnnotation(Reuse.class) != null ) + continue; + EnumSet<Platform> platforms; + PlatformDependent platform_annotation = method.getAnnotation(PlatformDependent.class); + if (platform_annotation != null) + platforms = EnumSet.copyOf(Arrays.asList(platform_annotation.value())); + else + platforms = EnumSet.of(Platform.ALL); + for (Platform platform : platforms) { + platform.printPrologue(writer); + boolean has_buffer_parameter = Utils.hasMethodBufferObjectParameter(method); + printMethodNativeStubBind(writer, d, method, platform, Mode.NORMAL, it.hasNext() || has_buffer_parameter, generate_error_checks, context_specific); + if (has_buffer_parameter) { + printMethodNativeStubBind(writer, d, method, platform, Mode.BUFFEROBJECT, it.hasNext(), generate_error_checks, context_specific); + } + platform.printEpilogue(writer); + } + } + writer.println(); + } + + private static String getTypeSignature(TypeMirror type, boolean add_position_signature) { + SignatureTranslator v = new SignatureTranslator(add_position_signature); + type.accept(v); + return v.getSignature(); + } + + private static String getMethodSignature(MethodDeclaration method, Mode mode) { + Collection<ParameterDeclaration> params = method.getParameters(); + String signature = "("; + for (ParameterDeclaration param : params) { + if ( param.getAnnotation(Result.class) != null || (param.getAnnotation(Helper.class) != null && !param.getAnnotation(Helper.class).passToNative()) ) + continue; + + final Constant constant_annotation = param.getAnnotation(Constant.class); + if ( constant_annotation != null && constant_annotation.isNative() ) + continue; + + if (mode == Mode.BUFFEROBJECT && param.getAnnotation(BufferObject.class) != null) + signature += "J"; + else + signature += getTypeSignature(param.getType(), true); + } + + final TypeMirror result_type = Utils.getMethodReturnType(method); + final CachedResult cached_result_annotation = method.getAnnotation(CachedResult.class); + final AutoSize auto_size_annotation = method.getAnnotation(AutoSize.class); + + final boolean isNIOBuffer = Utils.getNIOBufferType(result_type) != null; + if ( isNIOBuffer && (auto_size_annotation == null || !auto_size_annotation.isNative()) ) + signature += "J"; + + final String result_type_signature = isNIOBuffer ? "Ljava/nio/ByteBuffer;" : getTypeSignature(result_type, false); + if ( cached_result_annotation != null ) + signature += result_type_signature; + + signature += ")"; + signature += result_type_signature; + return signature; + } + + private static void printMethodNativeStubBind(PrintWriter writer, InterfaceDeclaration d, MethodDeclaration method, Platform platform, Mode mode, boolean has_more, boolean generate_error_checks, boolean context_specific) { + writer.print("\t\t{\"" + Utils.getSimpleNativeMethodName(method, generate_error_checks, context_specific)); + if (mode == Mode.BUFFEROBJECT) + writer.print(Utils.BUFFER_OBJECT_METHOD_POSTFIX); + writer.print("\", \"" + getMethodSignature(method, mode) + "\", (void *)&"); + writer.print(Utils.getQualifiedNativeMethodName(Utils.getQualifiedClassName(d), method, generate_error_checks, context_specific)); + if (mode == Mode.BUFFEROBJECT) + writer.print(Utils.BUFFER_OBJECT_METHOD_POSTFIX); + + final Alternate alt_annotation = method.getAnnotation(Alternate.class); + final String methodName = alt_annotation == null ? method.getSimpleName() : alt_annotation.value(); + String opengl_handle_name = methodName.replaceFirst("gl", platform.getPrefix()); + writer.print(", \"" + opengl_handle_name + "\", (void *)&" + methodName + ", " + (method.getAnnotation(Optional.class) == null ? "false" : "true") + "}"); + if (has_more) + writer.println(","); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Result.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Result.java new file mode 100644 index 0000000..ebd1618 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Result.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation indicates that the method result is in the + * specified parameter. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.PARAMETER) +public @interface Result { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Reuse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Reuse.java new file mode 100644 index 0000000..c2c25e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Reuse.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * Reuse can be used to annotate methods that duplicate functionality that has been already + * defined somewhere else. For example, this can be applied to OpenGL core functionality that + * exists as an ARB extension as well, but with the exact same entry points. + * + * @author Spasi + */ +@Target(ElementType.METHOD) +public @interface Reuse { + /** The extension Class that defines the method. */ + String value(); + String method() default ""; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/SignatureTranslator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/SignatureTranslator.java new file mode 100644 index 0000000..2eff145 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/SignatureTranslator.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * A TypeVisitor that translates types to JNI signatures. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; + +import com.sun.mirror.type.*; +import com.sun.mirror.util.*; + +import java.nio.*; + +class SignatureTranslator implements TypeVisitor { + private final boolean add_position_signature; + private final StringBuilder signature = new StringBuilder(); + + SignatureTranslator(boolean add_position_signature) { + this.add_position_signature = add_position_signature; + } + + private static String getNativeNameFromClassName(String class_name) { + return class_name.replaceAll("\\.", "/"); + } + + public String getSignature() { + return signature.toString(); + } + + public void visitAnnotationType(AnnotationType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitArrayType(ArrayType t) { + final Class type = Utils.getJavaType(t.getComponentType()); + if ( CharSequence.class.isAssignableFrom(type) ) + signature.append("J"); + else if ( Buffer.class.isAssignableFrom(type) ) + signature.append("[Ljava/nio/ByteBuffer;"); + else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) + signature.append("[L" + getNativeNameFromClassName(type.getName()) + ";"); + else + throw new RuntimeException(t + " is not allowed"); + } + + public void visitClassType(ClassType t) { + Class type = NativeTypeTranslator.getClassFromType(t); + + if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) || (Utils.isAddressableType(type) && !String.class.equals(type)) ) + signature.append("J"); + else { + String type_name; + if ( (CharSequence.class.isAssignableFrom(type) && !String.class.equals(type)) || CharSequence[].class.isAssignableFrom(type) || PointerBuffer.class.isAssignableFrom(type) ) + type_name = ByteBuffer.class.getName(); + else + type_name = t.getDeclaration().getQualifiedName(); + + signature.append("L"); + signature.append(getNativeNameFromClassName(type_name)); + signature.append(";"); + } + } + + public void visitDeclaredType(DeclaredType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitEnumType(EnumType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitInterfaceType(InterfaceType t) { + Class type = NativeTypeTranslator.getClassFromType(t); + if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) + signature.append("J"); + else + throw new RuntimeException(t + " is not allowed"); + } + + public void visitPrimitiveType(PrimitiveType t) { + switch (t.getKind()) { + case BOOLEAN: + signature.append("Z"); + break; + case INT: + signature.append("I"); + break; + case FLOAT: + signature.append("F"); + break; + case SHORT: + signature.append("S"); + break; + case DOUBLE: + signature.append("D"); + break; + case BYTE: + signature.append("B"); + break; + case LONG: + signature.append("J"); + break; + default: + throw new RuntimeException("Unsupported type " + t); + } + } + + public void visitReferenceType(ReferenceType t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeMirror(TypeMirror t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitTypeVariable(TypeVariable t) { + throw new RuntimeException(t + " is not allowed"); + } + + public void visitVoidType(VoidType t) { + signature.append("V"); + } + + public void visitWildcardType(WildcardType t) { + throw new RuntimeException(t + " is not allowed"); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Signedness.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Signedness.java new file mode 100644 index 0000000..3df3b25 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Signedness.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public enum Signedness { + SIGNED, + UNSIGNED, + NONE, + BOTH +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/StripPostfix.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/StripPostfix.java new file mode 100644 index 0000000..b2c8a18 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/StripPostfix.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This annotation implies that a method have its postfix stripped + * according to a specified Buffer parameter. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@Target(ElementType.METHOD) +public @interface StripPostfix { + String value(); // The parameter to deduce the postfix from + String extension() default "NULL"; + boolean hasPostfix() default true; + String postfix() default "NULL"; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeInfo.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeInfo.java new file mode 100644 index 0000000..021ee50 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeInfo.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * This class represent a parameter configuration. There are multiple + * TypeInfos in case of multityped parameters. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.opengl.GLvoid; + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.lang.annotation.Annotation; +import java.util.*; +import java.nio.*; + +public class TypeInfo { + public static final String UNSIGNED_PARAMETER_NAME = "unsigned"; + + private final Signedness signedness; + private final Class type; + private final String auto_type; + + private TypeInfo(Class type, Signedness signedness, String auto_type) { + this.type = type; + this.signedness = signedness; + this.auto_type = auto_type; + } + + public Class getType() { + return type; + } + + public Signedness getSignedness() { + return signedness; + } + + public String getAutoType() { + if (auto_type == null) + throw new RuntimeException("No auto type assigned"); + return auto_type; + } + + private static Class getTypeFromPrimitiveKind(PrimitiveType.Kind kind) { + Class type; + switch (kind) { + case LONG: + type = long.class; + break; + case INT: + type = int.class; + break; + case FLOAT: + type = float.class; + break; + case DOUBLE: + type = double.class; + break; + case SHORT: + type = short.class; + break; + case BYTE: + type = byte.class; + break; + case BOOLEAN: + type = boolean.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + private static Class getBufferTypeFromPrimitiveKind(PrimitiveType.Kind kind, AnnotationMirror annotation) { + Class type; + switch (kind) { + case INT: + type = IntBuffer.class; + break; + case FLOAT: + type = FloatBuffer.class; + break; + case DOUBLE: + type = DoubleBuffer.class; + break; + case SHORT: + type = ShortBuffer.class; + break; + case LONG: + if ( annotation.getAnnotationType().getDeclaration().getAnnotation(PointerType.class) != null ) + type = PointerBuffer.class; + else + type = LongBuffer.class; + break; + case BYTE: /* fall through */ + case BOOLEAN: + type = ByteBuffer.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + private static TypeInfo getDefaultTypeInfo(TypeMirror t) { + Class java_type = Utils.getJavaType(t); + return new TypeInfo(java_type, Signedness.NONE, null); + } + + public static Map<ParameterDeclaration, TypeInfo> getDefaultTypeInfoMap(MethodDeclaration method) { + Map<ParameterDeclaration, TypeInfo> map = new HashMap<ParameterDeclaration, TypeInfo>(); + for (ParameterDeclaration param : method.getParameters()) { + TypeInfo type_info = getDefaultTypeInfo(param.getType()); + map.put(param, type_info); + } + return map; + } + + private static Collection<TypeInfo> getTypeInfos(TypeMap type_map, Declaration param, TypeMirror decl_type) { + Collection<AnnotationMirror> annotations = Utils.getSortedAnnotations(param.getAnnotationMirrors()); + Map<Class, TypeInfo> types = new HashMap<Class, TypeInfo>(); + Collection<TypeInfo> multityped_result = new ArrayList<TypeInfo>(); + boolean add_default_type = true; + for (AnnotationMirror annotation : annotations) { + NativeType native_type_annotation = NativeTypeTranslator.getAnnotation(annotation, NativeType.class); + if (native_type_annotation != null) { + Class<? extends Annotation> annotation_type = NativeTypeTranslator.getClassFromType(annotation.getAnnotationType()); + Signedness signedness = type_map.getSignednessFromType(annotation_type); + Class inverse_type = type_map.getInverseType(annotation_type); + String auto_type = type_map.getAutoTypeFromAnnotation(annotation); + if (inverse_type != null) { + if (types.containsKey(inverse_type)) { + TypeInfo inverse_type_info = types.get(inverse_type); + String inverse_auto_type = inverse_type_info.getAutoType(); + auto_type = signedness == Signedness.UNSIGNED ? auto_type + " : " + inverse_auto_type : + inverse_auto_type + " : " + auto_type; + auto_type = UNSIGNED_PARAMETER_NAME + " ? " + auto_type; + signedness = Signedness.BOTH; + types.remove(inverse_type); + multityped_result.remove(inverse_type_info); + } + } + Class type; + PrimitiveType.Kind kind; + GLvoid void_annotation = param.getAnnotation(GLvoid.class); + kind = void_annotation == null ? type_map.getPrimitiveTypeFromNativeType(annotation_type) : void_annotation.value(); + if (Utils.getNIOBufferType(decl_type) != null) + type = getBufferTypeFromPrimitiveKind(kind, annotation); + else + type = getTypeFromPrimitiveKind(kind); + TypeInfo type_info = new TypeInfo(type, signedness, auto_type); + types.put(annotation_type, type_info); + multityped_result.add(type_info); + add_default_type = false; + } + } + if (add_default_type) { + TypeInfo default_type_info = getDefaultTypeInfo(decl_type); + Collection<TypeInfo> result = new ArrayList<TypeInfo>(); + result.add(default_type_info); + return result; + } else + return multityped_result; + } + + private static Map<ParameterDeclaration, Collection<TypeInfo>> getTypeInfoMap(TypeMap type_map, MethodDeclaration method) { + Map<ParameterDeclaration, Collection<TypeInfo>> map = new HashMap<ParameterDeclaration, Collection<TypeInfo>>(); + for (ParameterDeclaration param : method.getParameters()) { + Collection<TypeInfo> types = getTypeInfos(type_map, param, param.getType()); + map.put(param, types); + } + return map; + } + + public static Collection<Map<ParameterDeclaration, TypeInfo>> getTypeInfoCrossProduct(TypeMap type_map, MethodDeclaration method) { + Collection<ParameterDeclaration> parameter_collection = method.getParameters(); + ParameterDeclaration[] parameters = new ParameterDeclaration[parameter_collection.size()]; + parameter_collection.toArray(parameters); + Collection<Map<ParameterDeclaration, TypeInfo>> cross_product = new ArrayList<Map<ParameterDeclaration, TypeInfo>>(); + getCrossProductRecursive(0, parameters, getTypeInfoMap(type_map, method), + new HashMap<ParameterDeclaration, TypeInfo>(), cross_product); + return cross_product; + } + + private static void getCrossProductRecursive(int index, ParameterDeclaration[] parameters, Map<ParameterDeclaration, + Collection<TypeInfo>> typeinfos_map, Map<ParameterDeclaration, TypeInfo> current_instance, + Collection<Map<ParameterDeclaration, TypeInfo>> cross_product) { + if (index == parameters.length) { + cross_product.add(current_instance); + return; + } + ParameterDeclaration param = parameters[index]; + Collection<TypeInfo> typeinfos = typeinfos_map.get(param); + if (typeinfos != null) { + for (TypeInfo typeinfo : typeinfos) { + Map<ParameterDeclaration, TypeInfo> instance = new HashMap<ParameterDeclaration, TypeInfo>(current_instance); + instance.put(param, typeinfo); + getCrossProductRecursive(index + 1, parameters, typeinfos_map, instance, cross_product); + } + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeMap.java new file mode 100644 index 0000000..1092994 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypeMap.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * The interface to the OpenAL/OpenGL specific generator behaviour + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.lang.annotation.Annotation; + +public interface TypeMap { + void printCapabilitiesInit(PrintWriter writer); + String getCapabilities(); + String getAPIUtilParam(boolean comma); + void printErrorCheckMethod(PrintWriter writer, MethodDeclaration method, String tabs); + String getRegisterNativesFunctionName(); + PrimitiveType.Kind getPrimitiveTypeFromNativeType(Class<? extends Annotation> native_type); + String getTypedefPostfix(); + String getFunctionPrefix(); + void printNativeIncludes(PrintWriter writer); + Class<? extends Annotation> getStringElementType(); + Class<? extends Annotation> getStringArrayType(); + Class<? extends Annotation> getByteBufferArrayType(); + Class[] getValidAnnotationTypes(Class type); + Class<? extends Annotation> getVoidType(); + String translateAnnotation(Class<? extends Annotation> annotation_type); + Class getNativeTypeFromPrimitiveType(PrimitiveType.Kind kind); + String getAutoTypeFromAnnotation(AnnotationMirror annotation); + Class<? extends Annotation> getInverseType(Class<? extends Annotation> type); + Signedness getSignednessFromType(Class<? extends Annotation> type); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypedefsGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypedefsGenerator.java new file mode 100644 index 0000000..bd4aac8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/TypedefsGenerator.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator; + +/** + * + * A TypeVisitor that generates the native typedefs. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.util.*; + +public class TypedefsGenerator { + private static void generateNativeTypedefs(TypeMap type_map, PrintWriter writer, MethodDeclaration method) { + TypeMirror return_type = method.getReturnType(); + writer.print("typedef "); + writer.print(type_map.getTypedefPostfix()); + NativeTypeTranslator translator = new NativeTypeTranslator(type_map, method); + return_type.accept(translator); + writer.print(translator.getSignature()); + writer.print(" ("); + writer.print(type_map.getFunctionPrefix()); + writer.print(" *" + Utils.getTypedefName(method) + ") ("); + generateNativeTypedefsParameters(type_map, writer, method.getParameters()); + writer.println(");"); + } + + private static void generateNativeTypedefsParameters(TypeMap type_map, PrintWriter writer, Collection<ParameterDeclaration> params) { + if (params.size() > 0) { + boolean first = true; + for ( ParameterDeclaration param : params ) { + if ( param.getAnnotation(Helper.class) != null ) + continue; + + if ( first ) + first = false; + else + writer.print(", "); + + generateNativeTypedefsParameter(type_map, writer, param); + } + } + } + + private static void generateNativeTypedefsParameter(TypeMap type_map, PrintWriter writer, ParameterDeclaration param) { + NativeTypeTranslator translator = new NativeTypeTranslator(type_map, param); + param.getType().accept(translator); + writer.print(translator.getSignature()); + if (param.getAnnotation(Result.class) != null || param.getAnnotation(Indirect.class) != null || param.getAnnotation(PointerArray.class) != null) + writer.print("*"); + writer.print(" " + param.getSimpleName()); + } + + public static void generateNativeTypedefs(TypeMap type_map, PrintWriter writer, Collection<? extends MethodDeclaration> methods) { + for (MethodDeclaration method : methods) { + if ( method.getAnnotation(Alternate.class) == null && method.getAnnotation(Reuse.class) == null ) + generateNativeTypedefs(type_map, writer, method); + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Utils.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Utils.java new file mode 100644 index 0000000..cd4f5ef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/Utils.java @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator; + +/** + * + * Various utility methods to the generator. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.opengl.GLboolean; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLcharARB; +import org.lwjgl.util.generator.opengl.GLreturn; + +import java.io.PrintWriter; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.*; + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.PrimitiveType; +import com.sun.mirror.type.TypeMirror; + +public class Utils { + + public static final String TYPEDEF_POSTFIX = "PROC"; + public static final String FUNCTION_POINTER_VAR_NAME = "function_pointer"; + public static final String FUNCTION_POINTER_POSTFIX = "_pointer"; + public static final String CHECKS_CLASS_NAME = "GLChecks"; + public static final String CONTEXT_CAPS_CLASS_NAME = "ContextCapabilities"; + public static final String STUB_INITIALIZER_NAME = "initNativeStubs"; + public static final String BUFFER_OBJECT_METHOD_POSTFIX = "BO"; + public static final String BUFFER_OBJECT_PARAMETER_POSTFIX = "_buffer_offset"; + public static final String RESULT_SIZE_NAME = "result_size"; + public static final String RESULT_VAR_NAME = "__result"; + public static final String CACHED_BUFFER_LENGTH_NAME = "length"; + public static final String CACHED_BUFFER_NAME = "old_buffer"; + private static final String OVERLOADED_METHOD_PREFIX = "n"; + + public static String getTypedefName(MethodDeclaration method) { + Alternate alt_annotation = method.getAnnotation(Alternate.class); + return (alt_annotation == null ? method.getSimpleName() : alt_annotation.value()) + TYPEDEF_POSTFIX; + } + + public static String getFunctionAddressName(InterfaceDeclaration interface_decl, MethodDeclaration method) { + return getFunctionAddressName(interface_decl, method, false); + } + + public static String getFunctionAddressName(InterfaceDeclaration interface_decl, MethodDeclaration method, boolean forceAlt) { + final Alternate alt_annotation = method.getAnnotation(Alternate.class); + + /* Removed prefix so that we can identify reusable entry points, removed postfix because it's not needed and looks nicer. + String interfaceName = interface_decl.getSimpleName(); // If we add this back, we need to fix @Reuse (add a param for the template name) + if ( alt_annotation == null || (alt_annotation.nativeAlt() && !forceAlt) ) + return interfaceName + "_" + method.getSimpleName() + FUNCTION_POINTER_POSTFIX; + else + return interfaceName + "_" + alt_annotation.value() + FUNCTION_POINTER_POSTFIX; + */ + if ( alt_annotation == null || (alt_annotation.nativeAlt() && !forceAlt) ) + return method.getSimpleName(); + else + return alt_annotation.value(); + } + + public static boolean isFinal(InterfaceDeclaration d) { + Extension extension_annotation = d.getAnnotation(Extension.class); + return extension_annotation == null || extension_annotation.isFinal(); + } + + private static class AnnotationMirrorComparator implements Comparator<AnnotationMirror> { + + public int compare(AnnotationMirror a1, AnnotationMirror a2) { + String n1 = a1.getAnnotationType().getDeclaration().getQualifiedName(); + String n2 = a2.getAnnotationType().getDeclaration().getQualifiedName(); + int result = n1.compareTo(n2); + return result; + } + + public boolean equals(AnnotationMirror a1, AnnotationMirror a2) { + return compare(a1, a2) == 0; + } + } + + public static Collection<AnnotationMirror> getSortedAnnotations(Collection<AnnotationMirror> annotations) { + List<AnnotationMirror> annotation_list = new ArrayList<AnnotationMirror>(annotations); + Collections.sort(annotation_list, new AnnotationMirrorComparator()); + return annotation_list; + } + + public static String getReferenceName(InterfaceDeclaration interface_decl, MethodDeclaration method, ParameterDeclaration param) { + return interface_decl.getSimpleName() + "_" + method.getSimpleName() + "_" + param.getSimpleName(); + } + + public static boolean isAddressableType(TypeMirror type) { + return isAddressableType(getJavaType(type)); + } + + public static boolean isAddressableType(Class type) { + if ( type.isArray() ) { + final Class component_type = type.getComponentType(); + return isAddressableTypeImpl(component_type) || org.lwjgl.PointerWrapper.class.isAssignableFrom(component_type); + } + return isAddressableTypeImpl(type); + } + + private static boolean isAddressableTypeImpl(Class type) { + return Buffer.class.isAssignableFrom(type) || PointerBuffer.class.isAssignableFrom(type) || CharSequence.class.isAssignableFrom(type); + } + + public static Class getJavaType(TypeMirror type_mirror) { + JavaTypeTranslator translator = new JavaTypeTranslator(); + type_mirror.accept(translator); + return translator.getType(); + } + + private static boolean hasParameterMultipleTypes(ParameterDeclaration param) { + int num_native_annotations = 0; + for ( AnnotationMirror annotation : param.getAnnotationMirrors() ) + if ( NativeTypeTranslator.getAnnotation(annotation, NativeType.class) != null ) + num_native_annotations++; + return num_native_annotations > 1; + } + + public static boolean isParameterMultiTyped(ParameterDeclaration param) { + boolean result = Buffer.class.equals(Utils.getJavaType(param.getType())); + if ( !result && hasParameterMultipleTypes(param) ) + throw new RuntimeException(param + " not defined as java.nio.Buffer but has multiple types"); + return result; + } + + public static ParameterDeclaration findParameter(MethodDeclaration method, String name) { + for ( ParameterDeclaration param : method.getParameters() ) + if ( param.getSimpleName().equals(name) ) + return param; + throw new RuntimeException("Parameter " + name + " not found"); + } + + public static void printDocComment(PrintWriter writer, Declaration decl) { + final String overloadsComment; + if ( (decl instanceof MethodDeclaration) && decl.getAnnotation(Alternate.class) != null ) + overloadsComment = "Overloads " + decl.getAnnotation(Alternate.class).value() + "."; + else + overloadsComment = null; + + String doc_comment = decl.getDocComment(); + if ( doc_comment != null ) { + final String tab = decl instanceof InterfaceDeclaration ? "" : "\t"; + writer.println(tab + "/**"); + + if ( overloadsComment != null ) { + writer.println("\t * " + overloadsComment); + writer.println("\t * <p>"); + } + + final StringTokenizer doc_lines = new StringTokenizer(doc_comment, "\n", true); + boolean lastWasNL = false; + while ( doc_lines.hasMoreTokens() ) { + final String t = doc_lines.nextToken(); + if ( "\n".equals(t) ) { + if ( lastWasNL ) + writer.println(tab + " * <p>"); + lastWasNL = true; + } else { + writer.println(tab + " * " + t); + lastWasNL = false; + } + } + + writer.println(tab + " */"); + } else if ( overloadsComment != null ) + writer.println("\t/** " + overloadsComment + " */"); + } + + public static AnnotationMirror getParameterAutoAnnotation(ParameterDeclaration param) { + for ( AnnotationMirror annotation : param.getAnnotationMirrors() ) + if ( NativeTypeTranslator.getAnnotation(annotation, Auto.class) != null ) + return annotation; + return null; + } + + // DISABLED: We always generate indirect methods. (affects OpenAL only at the time of this change) + public static boolean isMethodIndirect(boolean generate_error_checks, boolean context_specific, MethodDeclaration method) { + /* + for (ParameterDeclaration param : method.getParameters()) { + if (isAddressableType(param.getType()) || getParameterAutoAnnotation(param) != null || + param.getAnnotation(Constant.class) != null) + return true; + } + return hasMethodBufferObjectParameter(method) || method.getAnnotation(Code.class) != null || + method.getAnnotation(CachedResult.class) != null || + (generate_error_checks && method.getAnnotation(NoErrorCheck.class) == null) || + context_specific; + */ + return true; + } + + public static String getNativeQualifiedName(String qualified_name) { + return qualified_name.replaceAll("\\.", "_"); + } + + public static String getQualifiedNativeMethodName(String qualified_class_name, String method_name) { + // Escape '_' in method name + if ( method_name.indexOf('_') != -1 ) + method_name = method_name.replace("_", "_1"); + + return "Java_" + getNativeQualifiedName(qualified_class_name) + "_" + method_name; + } + + public static String getQualifiedNativeMethodName(String qualified_class_name, MethodDeclaration method, boolean generate_error_checks, boolean context_specific) { + String method_name = getSimpleNativeMethodName(method, generate_error_checks, context_specific); + return getQualifiedNativeMethodName(qualified_class_name, method_name); + } + + public static ParameterDeclaration getResultParameter(MethodDeclaration method) { + ParameterDeclaration result_param = null; + for ( ParameterDeclaration param : method.getParameters() ) { + if ( param.getAnnotation(Result.class) != null ) { + if ( result_param != null ) + throw new RuntimeException("Multiple parameters annotated with Result in method " + method); + result_param = param; + } + } + return result_param; + } + + public static TypeMirror getMethodReturnType(MethodDeclaration method) { + TypeMirror result_type; + ParameterDeclaration result_param = getResultParameter(method); + if ( result_param != null ) { + result_type = result_param.getType(); + } else + result_type = method.getReturnType(); + return result_type; + } + + public static String getMethodReturnType(MethodDeclaration method, GLreturn return_annotation, boolean buffer) { + ParameterDeclaration return_param = null; + for ( ParameterDeclaration param : method.getParameters() ) { + if ( param.getSimpleName().equals(return_annotation.value()) ) { + return_param = param; + break; + } + } + if ( return_param == null ) + throw new RuntimeException("The @GLreturn parameter \"" + return_annotation.value() + "\" could not be found in method: " + method); + + PrimitiveType.Kind kind = NativeTypeTranslator.getPrimitiveKindFromBufferClass(Utils.getJavaType(return_param.getType())); + if ( return_param.getAnnotation(GLboolean.class) != null ) + kind = PrimitiveType.Kind.BOOLEAN; + + if ( kind == PrimitiveType.Kind.BYTE && (return_param.getAnnotation(GLchar.class) != null || return_param.getAnnotation(GLcharARB.class) != null) ) + return "String"; + else { + final String type = JavaTypeTranslator.getPrimitiveClassFromKind(kind).getName(); + return buffer ? Character.toUpperCase(type.charAt(0)) + type.substring(1) : type; + } + } + + public static boolean needResultSize(MethodDeclaration method) { + return getNIOBufferType(getMethodReturnType(method)) != null && method.getAnnotation(AutoSize.class) == null; + } + + public static void printExtraCallArguments(PrintWriter writer, MethodDeclaration method, String size_parameter_name) { + writer.print(size_parameter_name); + if ( method.getAnnotation(CachedResult.class) != null ) { + writer.print(", " + CACHED_BUFFER_NAME); + } + } + + private static String getClassName(InterfaceDeclaration interface_decl, String opengl_name) { + Extension extension_annotation = interface_decl.getAnnotation(Extension.class); + if ( extension_annotation != null && !"".equals(extension_annotation.className()) ) { + return extension_annotation.className(); + } + StringBuilder result = new StringBuilder(); + for ( int i = 0; i < opengl_name.length(); i++ ) { + int ch = opengl_name.codePointAt(i); + if ( ch == '_' ) { + i++; + result.appendCodePoint(Character.toUpperCase(opengl_name.codePointAt(i))); + } else + result.appendCodePoint(ch); + } + return result.toString(); + } + + public static boolean hasMethodBufferObjectParameter(MethodDeclaration method) { + for ( ParameterDeclaration param : method.getParameters() ) { + if ( param.getAnnotation(BufferObject.class) != null ) { + return true; + } + } + return false; + } + + public static String getQualifiedClassName(InterfaceDeclaration interface_decl) { + return interface_decl.getPackage().getQualifiedName() + "." + getSimpleClassName(interface_decl); + } + + public static String getSimpleClassName(InterfaceDeclaration interface_decl) { + return getClassName(interface_decl, interface_decl.getSimpleName()); + } + + public static Class<?> getNIOBufferType(TypeMirror t) { + Class<?> param_type = getJavaType(t); + if ( Buffer.class.isAssignableFrom(param_type) ) + return param_type; + else if ( param_type == CharSequence.class || param_type == CharSequence[].class || param_type == PointerBuffer.class ) + return ByteBuffer.class; + else + return null; + } + + public static String getSimpleNativeMethodName(MethodDeclaration method, boolean generate_error_checks, boolean context_specific) { + String method_name; + Alternate alt_annotation = method.getAnnotation(Alternate.class); + method_name = alt_annotation == null || alt_annotation.nativeAlt() ? method.getSimpleName() : alt_annotation.value(); + if ( isMethodIndirect(generate_error_checks, context_specific, method) ) + method_name = OVERLOADED_METHOD_PREFIX + method_name; + return method_name; + } + + static boolean isReturnParameter(MethodDeclaration method, ParameterDeclaration param) { + GLreturn string_annotation = method.getAnnotation(GLreturn.class); + if ( string_annotation == null || !string_annotation.value().equals(param.getSimpleName()) ) + return false; + + if ( param.getAnnotation(OutParameter.class) == null ) + throw new RuntimeException("The parameter specified in @GLreturn is not annotated with @OutParameter in method: " + method); + + if ( param.getAnnotation(Check.class) != null ) + throw new RuntimeException("The parameter specified in @GLreturn is annotated with @Check in method: " + method); + + if ( param.getAnnotation(GLchar.class) != null && Utils.getJavaType(param.getType()).equals(ByteBuffer.class) && string_annotation.maxLength().length() == 0 ) + throw new RuntimeException("The @GLreturn annotation is missing a maxLength parameter in method: " + method); + + return true; + } + + static String getStringOffset(MethodDeclaration method, ParameterDeclaration param) { + String offset = null; + for ( ParameterDeclaration p : method.getParameters() ) { + if ( param != null && p.getSimpleName().equals(param.getSimpleName()) ) + break; + + if ( p.getAnnotation(NullTerminated.class) != null ) + continue; + + final Class type = Utils.getJavaType(p.getType()); + if ( type.equals(CharSequence.class) ) { + if ( offset == null ) + offset = p.getSimpleName() + ".length()"; + else + offset += " + " + p.getSimpleName() + ".length()"; + //if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + 1"; + } else if ( type.equals(CharSequence[].class) ) { + if ( offset == null ) + offset = "APIUtil.getTotalLength(" + p.getSimpleName() + ")"; + else + offset += " + APIUtil.getTotalLength(" + p.getSimpleName() + ")"; + //if ( p.getAnnotation(NullTerminated.class) != null ) offset += " + " + p.getSimpleName() + ".length"; + } + + } + return offset; + } + + static void printGLReturnPre(PrintWriter writer, MethodDeclaration method, GLreturn return_annotation, TypeMap type_map) { + final String return_type = getMethodReturnType(method, return_annotation, true); + + if ( "String".equals(return_type) ) { + if ( !return_annotation.forceMaxLength() ) { + writer.println("IntBuffer " + return_annotation.value() + "_length = APIUtil.getLengths(" + type_map.getAPIUtilParam(false) + ");"); + writer.print("\t\t"); + } + writer.print("ByteBuffer " + return_annotation.value() + " = APIUtil.getBufferByte(" + type_map.getAPIUtilParam(true) + return_annotation.maxLength()); + /* + Params that use the return buffer will advance its position while filling it. When we return, the position will be + at the right spot for grabbing the returned string bytes. We only have to make sure that the original buffer was + large enough to hold everything, so that no re-allocations happen while filling. + */ + final String offset = getStringOffset(method, null); + if ( offset != null ) + writer.print(" + " + offset); + writer.println(");"); + } else { + final String buffer_type = "Boolean".equals(return_type) ? "Byte" : return_type; + writer.print(buffer_type + "Buffer " + return_annotation.value() + " = APIUtil.getBuffer" + buffer_type + "(" + type_map.getAPIUtilParam(false)); + if ( "Byte".equals(buffer_type) ) + writer.print((type_map.getAPIUtilParam(false).length() > 0 ? ", " : "") + "1"); + writer.println(");"); + } + + final Code code_annotation = method.getAnnotation(Code.class); + if ( code_annotation != null && code_annotation.tryBlock() ) { + writer.println("\t\ttry {"); + writer.print("\t\t\t"); + } else + writer.print("\t\t"); + } + + static void printGLReturnPost(PrintWriter writer, MethodDeclaration method, GLreturn return_annotation, TypeMap type_map) { + final String return_type = getMethodReturnType(method, return_annotation, true); + + if ( "String".equals(return_type) ) { + writer.print("\t\t" + return_annotation.value() + ".limit("); + final String offset = getStringOffset(method, null); + if ( offset != null ) + writer.print(offset + " + "); + if ( return_annotation.forceMaxLength() ) + writer.print(return_annotation.maxLength()); + else + writer.print(return_annotation.value() + "_length.get(0)"); + writer.println(");"); + writer.println("\t\treturn APIUtil.getString(" + type_map.getAPIUtilParam(true) + return_annotation.value() + ");"); + } else { + writer.print("\t\treturn " + return_annotation.value() + ".get(0)"); + if ( "Boolean".equals(return_type) ) + writer.print(" == 1"); + writer.println(";"); + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALTypeMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALTypeMap.java new file mode 100644 index 0000000..e1aed20 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALTypeMap.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.openal; + +/** + * + * The OpenAL specific generator behaviour + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALTypeMap.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.Signedness; +import org.lwjgl.util.generator.TypeMap; + +import com.sun.mirror.declaration.*; +import com.sun.mirror.type.*; + +import java.io.*; +import java.lang.annotation.Annotation; +import java.util.*; +import java.nio.*; + +public class ALTypeMap implements TypeMap { + private static final Map<Class, PrimitiveType.Kind> native_types_to_primitive; + + static { + native_types_to_primitive = new HashMap<Class, PrimitiveType.Kind>(); + native_types_to_primitive.put(ALboolean.class, PrimitiveType.Kind.BOOLEAN); + native_types_to_primitive.put(ALbyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(ALenum.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(ALfloat.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(ALdouble.class, PrimitiveType.Kind.DOUBLE); + native_types_to_primitive.put(ALint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(ALshort.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(ALsizei.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(ALubyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(ALuint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(ALvoid.class, PrimitiveType.Kind.BYTE); + } + + public PrimitiveType.Kind getPrimitiveTypeFromNativeType(Class native_type) { + PrimitiveType.Kind kind = native_types_to_primitive.get(native_type); + if (kind == null) + throw new RuntimeException("Unsupported type " + native_type); + return kind; + } + + public Signedness getSignednessFromType(Class type) { + if (ALuint.class.equals(type)) + return Signedness.UNSIGNED; + else if (ALint.class.equals(type)) + return Signedness.SIGNED; + else if (ALshort.class.equals(type)) + return Signedness.SIGNED; + else if (ALbyte.class.equals(type)) + return Signedness.SIGNED; + else + return Signedness.NONE; + } + + public String translateAnnotation(Class annotation_type) { + if (annotation_type.equals(ALuint.class)) + return "i"; + else if (annotation_type.equals(ALint.class)) + return "i"; + else if (annotation_type.equals(ALshort.class)) + return "s"; + else if (annotation_type.equals(ALbyte.class)) + return "b"; + else if (annotation_type.equals(ALfloat.class)) + return "f"; + else if (annotation_type.equals(ALdouble.class)) + return "d"; + else if (annotation_type.equals(ALboolean.class) || annotation_type.equals(ALvoid.class)) + return ""; + else + throw new RuntimeException(annotation_type + " is not allowed"); + } + + public Class getNativeTypeFromPrimitiveType(PrimitiveType.Kind kind) { + Class type; + switch (kind) { + case INT: + type = ALint.class; + break; + case FLOAT: + type = ALfloat.class; + break; + case DOUBLE: + type = ALdouble.class; + break; + case SHORT: + type = ALshort.class; + break; + case BYTE: + type = ALbyte.class; + break; + case BOOLEAN: + type = ALboolean.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + private static Class[] getValidBufferTypes(Class type) { + if (type.equals(IntBuffer.class)) + return new Class[]{ALenum.class, ALint.class, ALsizei.class, ALuint.class}; + else if (type.equals(FloatBuffer.class)) + return new Class[]{ALfloat.class}; + else if (type.equals(ByteBuffer.class)) + return new Class[]{ALboolean.class, ALbyte.class, ALvoid.class}; + else if (type.equals(ShortBuffer.class)) + return new Class[]{ALshort.class}; + else if (type.equals(DoubleBuffer.class)) + return new Class[]{ALdouble.class}; + else + return new Class[]{}; + } + + private static Class[] getValidPrimitiveTypes(Class type) { + if (type.equals(int.class)) + return new Class[]{ALenum.class, ALint.class, ALsizei.class, ALuint.class}; + else if (type.equals(double.class)) + return new Class[]{ALdouble.class}; + else if (type.equals(float.class)) + return new Class[]{ALfloat.class}; + else if (type.equals(short.class)) + return new Class[]{ALshort.class}; + else if (type.equals(byte.class)) + return new Class[]{ALbyte.class}; + else if (type.equals(boolean.class)) + return new Class[]{ALboolean.class}; + else if (type.equals(void.class)) + return new Class[]{ALvoid.class}; + else + return new Class[]{}; + } + + public void printCapabilitiesInit(final PrintWriter writer) { + throw new UnsupportedOperationException(); + } + + public String getCapabilities() { + throw new UnsupportedOperationException(); + } + + public String getAPIUtilParam(boolean comma) { + return ""; + } + + public void printErrorCheckMethod(final PrintWriter writer, final MethodDeclaration method, final String tabs) { + writer.println(tabs + "Util.checkALError();"); + } + + public String getRegisterNativesFunctionName() { + return "extal_InitializeClass"; + } + + public String getTypedefPostfix() { + return ""; + } + + public String getFunctionPrefix() { + return "ALAPIENTRY"; + } + + public void printNativeIncludes(PrintWriter writer) { + writer.println("#include \"extal.h\""); + } + + public Class<? extends Annotation> getStringElementType() { + return ALubyte.class; + } + + public Class<? extends Annotation> getStringArrayType() { + return ALubyte.class; + } + + public Class<? extends Annotation> getByteBufferArrayType() { + return ALubyte.class; + } + + public Class[] getValidAnnotationTypes(Class type) { + Class[] valid_types; + if (Buffer.class.isAssignableFrom(type)) + valid_types = getValidBufferTypes(type); + else if (type.isPrimitive()) + valid_types = getValidPrimitiveTypes(type); + else if (type.equals(String.class)) + valid_types = new Class[]{ALubyte.class}; + else + valid_types = new Class[]{}; + return valid_types; + } + + public Class<? extends Annotation> getVoidType() { + return ALvoid.class; + } + + public Class<? extends Annotation> getInverseType(Class type) { + if (ALuint.class.equals(type)) + return ALint.class; + else if (ALint.class.equals(type)) + return ALuint.class; + else + return null; + } + + public String getAutoTypeFromAnnotation(AnnotationMirror annotation) { + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALboolean.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALboolean.java new file mode 100644 index 0000000..ed45b77 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALboolean.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALboolean.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALboolean { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALbyte.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALbyte.java new file mode 100644 index 0000000..412e4b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALbyte.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALbyte.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALbyte { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALdouble.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALdouble.java new file mode 100644 index 0000000..aa6e081 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALdouble.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALdouble.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALdouble { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALenum.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALenum.java new file mode 100644 index 0000000..4563691 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALenum.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALenum.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALenum { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALfloat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALfloat.java new file mode 100644 index 0000000..39e358a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALfloat.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALfloat.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALfloat { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALint.java new file mode 100644 index 0000000..ae347e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALint.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALint.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALint { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALshort.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALshort.java new file mode 100644 index 0000000..603386b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALshort.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALshort.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALshort { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALsizei.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALsizei.java new file mode 100644 index 0000000..b079c8f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALsizei.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALsizei.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALsizei { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALubyte.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALubyte.java new file mode 100644 index 0000000..caf22ef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALubyte.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALubyte.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALubyte { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALuint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALuint.java new file mode 100644 index 0000000..a31c2a3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALuint.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALuint.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALuint { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALvoid.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALvoid.java new file mode 100644 index 0000000..9b645eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/openal/ALvoid.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.openal; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: ALvoid.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface ALvoid { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLCapabilitiesGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLCapabilitiesGenerator.java new file mode 100644 index 0000000..fabeb1f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLCapabilitiesGenerator.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.*; + +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Iterator; + +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; + +/** + * CLCapabilities generator. + * + * @author Spasi + */ +public class CLCapabilitiesGenerator { + + static void generateClassPrologue(final PrintWriter writer) { + writer.println("public final class " + CLGeneratorProcessorFactory.CLCAPS_CLASS_NAME + " {"); + writer.println(); + } + + static void generateSymbolAddresses(final PrintWriter writer, final InterfaceDeclaration d) { + final Alias alias_annotation = d.getAnnotation(Alias.class); + final boolean aliased = alias_annotation != null && alias_annotation.postfix().length() > 0; + + boolean foundNative = false; + for ( final MethodDeclaration method : d.getMethods() ) { + if ( method.getAnnotation(Alternate.class) != null || method.getAnnotation(Reuse.class) != null ) + continue; + + if ( !foundNative ) { + //writer.println("\t// " + d.getSimpleName()); + writer.println("\tstatic final boolean " + CLGeneratorProcessorFactory.getExtensionName(d.getSimpleName()) + ";"); + foundNative = true; + } + writer.print("\tstatic final long " + Utils.getFunctionAddressName(d, method) + " = CL.getFunctionAddress("); + + if ( aliased ) + writer.println("new String [] {\"" + Utils.getFunctionAddressName(d, method) + "\",\"" + method.getSimpleName() + alias_annotation.postfix() + "\"});"); + else + writer.println("\"" + Utils.getFunctionAddressName(d, method) + "\");"); + } + + if ( foundNative ) + writer.println(); + } + + static void generateConstructor(final PrintWriter writer, final Collection<TypeDeclaration> interface_decls) { + writer.println("\tprivate " + CLGeneratorProcessorFactory.CLCAPS_CLASS_NAME + "() {}"); + writer.println(); + writer.println("\tstatic {"); + + for ( final TypeDeclaration d : interface_decls ) { + if ( d.getMethods().isEmpty() ) + continue; + + //writer.println("\t\tif ( " + getExtensionSupportedName(d.getSimpleName()) + "() )"); + //writer.println("\t\t\t" + SUPPORTED_EXTS + ".add(\"" + CLGeneratorProcessorFactory.getExtensionName(d.getSimpleName()) + "\");"); + writer.println("\t\t" + CLGeneratorProcessorFactory.getExtensionName(d.getSimpleName()) + " = " + getExtensionSupportedName(d.getSimpleName()) + "();"); + } + + writer.println("\t}\n"); + } + + static void generateExtensionChecks(final PrintWriter writer, final InterfaceDeclaration d) { + Iterator<? extends MethodDeclaration> methods = d.getMethods().iterator(); + if ( !methods.hasNext() ) + return; + + writer.println("\tprivate static boolean " + getExtensionSupportedName(d.getSimpleName()) + "() {"); + writer.println("\t\treturn "); + + boolean first = true; + while ( methods.hasNext() ) { + MethodDeclaration method = methods.next(); + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + if ( !first ) + writer.println(" &"); + else + first = false; + + final boolean optional = method.getAnnotation(Optional.class) != null; + + writer.print("\t\t\t"); + if ( optional ) + writer.print('('); + writer.print(Utils.getFunctionAddressName(d, method) + " != 0"); + if ( optional ) + writer.print(" || true)"); + } + writer.println(";"); + writer.println("\t}"); + writer.println(); + } + + private static String getExtensionSupportedName(final String class_name) { + return "is" + class_name + "Supported"; + } + + public static void generateCapabilitiesGetters(final PrintWriter writer) { + writer.println("\tpublic static CLPlatformCapabilities getPlatformCapabilities(final CLPlatform platform) {\n" + + "\t\tplatform.checkValid();\n" + + "\n" + + "\t\tCLPlatformCapabilities caps = (CLPlatformCapabilities)platform.getCapabilities();\n" + + "\t\tif ( caps == null )\n" + + "\t\t\tplatform.setCapabilities(caps = new CLPlatformCapabilities(platform));\n" + + "\n" + + "\t\treturn caps;\n" + + "\t}\n"); + + writer.println("\tpublic static CLDeviceCapabilities getDeviceCapabilities(final CLDevice device) {\n" + + "\t\tdevice.checkValid();\n" + + "\n" + + "\t\tCLDeviceCapabilities caps = (CLDeviceCapabilities)device.getCapabilities();\n" + + "\t\tif ( caps == null )\n" + + "\t\t\tdevice.setCapabilities(caps = new CLDeviceCapabilities(device));\n" + + "\n" + + "\t\treturn caps;\n" + + "\t}\n"); + + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLDeviceExtension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLDeviceExtension.java new file mode 100644 index 0000000..f34e8f5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLDeviceExtension.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** Extension templates marked with @CLDeviceExtension will be considered CL device extensions. */ +@Target(ElementType.TYPE) +public @interface CLDeviceExtension { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLGeneratorProcessorFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLGeneratorProcessorFactory.java new file mode 100644 index 0000000..d881fc1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLGeneratorProcessorFactory.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.PointerWrapper; +import org.lwjgl.opencl.CLDevice; +import org.lwjgl.opencl.CLPlatform; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.AnnotationTypeDeclaration; +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; +import com.sun.mirror.util.DeclarationFilter; + +import static java.util.Collections.*; + +/** + * Generator tool for creating the OpenCL capabilities classes + * + * @author Spasi + */ +public class CLGeneratorProcessorFactory implements AnnotationProcessorFactory, RoundCompleteListener { + + public static final String CLCAPS_CLASS_NAME = "CLCapabilities"; + public static final String PLATFORM_CAPS_CLASS_NAME = "CLPlatformCapabilities"; + public static final String DEVICE_CAPS_CLASS_NAME = "CLDeviceCapabilities"; + + private static final String EXTENSION_PREFIX = "CL_"; + private static final String CORE_PREFIX = "Open"; + + private static boolean first_round = true; + + // Process any set of annotations + private static final Collection<String> supportedAnnotations = unmodifiableCollection(Arrays.asList("*")); + + public Collection<String> supportedAnnotationTypes() { + return supportedAnnotations; + } + + public Collection<String> supportedOptions() { + return unmodifiableCollection(Arrays.asList("-Acontextspecific")); + } + + public void roundComplete(RoundCompleteEvent event) { + first_round = false; + } + + public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { + // Only process the initial types, not the generated ones + if ( first_round ) { + env.addListener(this); + return new GeneratorProcessor(env); + } else + return AnnotationProcessors.NO_OP; + } + + static String getExtensionName(String interface_name) { + if ( interface_name.startsWith("CL") ) + return CORE_PREFIX + interface_name; + else + return EXTENSION_PREFIX + interface_name; + } + + private static class GeneratorProcessor implements AnnotationProcessor { + + private final AnnotationProcessorEnvironment env; + + GeneratorProcessor(AnnotationProcessorEnvironment env) { + this.env = env; + } + + public void process() { + try { + generateCLCapabilitiesSource(); + generateCLPDCapabilitiesSource(CLPlatformExtension.class, PLATFORM_CAPS_CLASS_NAME, CLPlatform.class, "platform"); + generateCLPDCapabilitiesSource(CLDeviceExtension.class, DEVICE_CAPS_CLASS_NAME, CLDevice.class, "device"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static void printHeader(final PrintWriter writer) { + writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + writer.println(); + writer.println("package org.lwjgl.opencl;"); + writer.println(); + } + + private void generateCLCapabilitiesSource() throws IOException { + final PrintWriter writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, "org.lwjgl.opencl", new File(CLCAPS_CLASS_NAME + ".java"), null); + printHeader(writer); + + CLCapabilitiesGenerator.generateClassPrologue(writer); + + final Collection<TypeDeclaration> templates = DeclarationFilter.getFilter(InterfaceDeclaration.class).filter(env.getSpecifiedTypeDeclarations()); + + for ( final TypeDeclaration t : templates ) { + if ( t.getAnnotation(CLPlatformExtension.class) == null && t.getAnnotation(CLDeviceExtension.class) == null && !t.getSimpleName().startsWith("CL") ) + throw new RuntimeException("An OpenCL extension is missing an extension type annotation: " + t.getSimpleName()); + + CLCapabilitiesGenerator.generateSymbolAddresses(writer, (InterfaceDeclaration)t); + } + writer.println(); + + CLCapabilitiesGenerator.generateConstructor(writer, templates); + + CLCapabilitiesGenerator.generateCapabilitiesGetters(writer); + + for ( final TypeDeclaration template : templates ) + CLCapabilitiesGenerator.generateExtensionChecks(writer, (InterfaceDeclaration)template); + + writer.println("}"); + writer.close(); + } + + private void generateCLPDCapabilitiesSource(final Class<? extends Annotation> capsType, final String capsName, final Class<? extends PointerWrapper> objectType, final String objectName) throws IOException { + final PrintWriter writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, "org.lwjgl.opencl", new File(capsName + ".java"), null); + printHeader(writer); + writer.println("import java.util.*;"); + writer.println(); + + CLPDCapabilitiesGenerator.generateClassPrologue(writer, capsName); + + final Collection<TypeDeclaration> templates = DeclarationFilter.getFilter(InterfaceDeclaration.class).filter(env.getSpecifiedTypeDeclarations()); + + for ( final TypeDeclaration t : templates ) { + if ( t.getAnnotation(capsType) != null ) + CLPDCapabilitiesGenerator.generateExtensions(writer, (InterfaceDeclaration)t); + } + writer.println(); + + CLPDCapabilitiesGenerator.generateConstructor(writer, templates, capsType, capsName, objectType, objectName); + + CLPDCapabilitiesGenerator.generateGetters(writer); + + CLPDCapabilitiesGenerator.generateToString(writer, templates, capsType); + + writer.println("}"); + writer.close(); + } + + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPDCapabilitiesGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPDCapabilitiesGenerator.java new file mode 100644 index 0000000..9d7f10e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPDCapabilitiesGenerator.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.PointerWrapper; +import org.lwjgl.util.generator.Private; + +import java.io.PrintWriter; +import java.lang.annotation.Annotation; +import java.util.Collection; + +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; + +/** + * CL platform/device capabilities generator. + * + * @author Spasi + */ +public class CLPDCapabilitiesGenerator { + + // TODO: Add future versions here + private static final int[][] CL_VERSIONS = { + { 1, 2 }, // OpenCL 1 + }; + + static void generateClassPrologue(final PrintWriter writer, final String name) { + writer.println("public class " + name + " {"); + writer.println(); + writer.println("\tpublic final int majorVersion;"); + writer.println("\tpublic final int minorVersion;"); + writer.println(); + for ( int major = 1; major <= CL_VERSIONS.length; major++ ) { + for ( final int minor : CL_VERSIONS[major - 1] ) + writer.println("\tpublic final boolean OpenCL" + Integer.toString(major) + Integer.toString(minor) + ";"); + } + writer.println(); + } + + static void generateExtensions(final PrintWriter writer, final InterfaceDeclaration d) { + writer.print("\t"); + + if ( d.getAnnotation(Private.class) == null ) + writer.print("public "); + + writer.println("final boolean " + CLGeneratorProcessorFactory.getExtensionName(d.getSimpleName()) + ";"); + } + + static void generateConstructor(final PrintWriter writer, final Collection<TypeDeclaration> templates, + final Class<? extends Annotation> capsType, final String capsName, + final Class<? extends PointerWrapper> objectType, final String objectName) { + writer.println("\tpublic " + capsName + "(final " + objectType.getSimpleName() + ' ' + objectName + ") {"); + + writer.println("\t\tfinal String extensionList = " + objectName + ".getInfoString(CL10.CL_" + objectName.toUpperCase() + "_EXTENSIONS);\n" + + "\t\tfinal String version = " + objectName + ".getInfoString(CL10.CL_" + objectName.toUpperCase() + "_VERSION);\n" + + "\t\tif ( !version.startsWith(\"OpenCL \") )\n" + + "\t\t\tthrow new RuntimeException(\"Invalid OpenCL version string: \" + version);\n\n" + + "\t\ttry {\n" + + "\t\t\tfinal StringTokenizer tokenizer = new StringTokenizer(version.substring(7), \". \");\n" + + "\n" + + "\t\t\tmajorVersion = Integer.parseInt(tokenizer.nextToken());\n" + + "\t\t\tminorVersion = Integer.parseInt(tokenizer.nextToken());\n"); + + for ( int major = 1; major <= CL_VERSIONS.length; major++ ) { + for ( final int minor : CL_VERSIONS[major - 1] ) + writer.println("\t\t\tOpenCL" + Integer.toString(major) + Integer.toString(minor) + " = " + major + " < majorVersion || (" + major + " == majorVersion && " + minor + " <= minorVersion);"); + } + + writer.println("\t\t} catch (RuntimeException e) {\n" + + "\t\t\tthrow new RuntimeException(\"The major and/or minor OpenCL version \\\"\" + version + \"\\\" is malformed: \" + e.getMessage());\n" + + "\t\t}\n"); + + writer.println("\t\tfinal Set<String> extensions = APIUtil.getExtensions(extensionList);"); + + for ( final TypeDeclaration t : templates ) { + if ( t.getAnnotation(capsType) == null ) + continue; + + final String extName = CLGeneratorProcessorFactory.getExtensionName(t.getSimpleName()); + + writer.print("\t\t" + extName + " = extensions.contains(\"" + extName.toLowerCase() + "\")"); + if ( !t.getMethods().isEmpty() ) + writer.print(" && CLCapabilities." + extName); + writer.println(";"); + } + + writer.println("\t}\n"); + } + + public static void generateGetters(final PrintWriter writer) { + writer.println("\tpublic int getMajorVersion() {"); + writer.println("\t\treturn majorVersion;"); + writer.println("\t}\n"); + + writer.println("\tpublic int getMinorVersion() {"); + writer.println("\t\treturn minorVersion;"); + writer.println("\t}\n"); + } + + public static void generateToString(final PrintWriter writer, final Collection<TypeDeclaration> templates, final Class<? extends Annotation> capsType) { + writer.println("\tpublic String toString() {"); + writer.println("\t\tfinal StringBuilder buf = new StringBuilder();\n"); + + writer.println("\t\tbuf.append(\"OpenCL \").append(majorVersion).append('.').append(minorVersion);"); + writer.println(); + writer.println("\t\tbuf.append(\" - Extensions: \");"); + for ( final TypeDeclaration t : templates ) { + if ( t.getAnnotation(capsType) == null ) + continue; + + writer.println("\t\tif ( " + CLGeneratorProcessorFactory.getExtensionName(t.getSimpleName()) + " ) buf.append(\"" + CLGeneratorProcessorFactory.getExtensionName(t.getSimpleName()).toLowerCase() + " \");"); + } + + writer.println("\n\t\treturn buf.toString();"); + writer.println("\t}\n"); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPlatformExtension.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPlatformExtension.java new file mode 100644 index 0000000..e8ddadc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLPlatformExtension.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** Extension templates marked with @CLPlatformExtension will be considered CL platform extensions. */ +@Target(ElementType.TYPE) +public @interface CLPlatformExtension { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLTypeMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLTypeMap.java new file mode 100644 index 0000000..9b6433a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/CLTypeMap.java @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opencl; + +/** + * + * OpenCL specific generator behaviour + * + * @author Spasi + */ + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLreturn; + +import java.io.PrintWriter; +import java.lang.annotation.Annotation; +import java.nio.*; +import java.util.HashMap; +import java.util.Map; + +import com.sun.mirror.declaration.AnnotationMirror; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.declaration.ParameterDeclaration; +import com.sun.mirror.type.PrimitiveType; + +public class CLTypeMap implements TypeMap { + + private static final Map<Class, PrimitiveType.Kind> native_types_to_primitive; + + static { + native_types_to_primitive = new HashMap<Class, PrimitiveType.Kind>(); + native_types_to_primitive.put(cl_void.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(cl_byte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(cl_char.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(cl_uchar.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(cl_short.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(cl_bool.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(cl_int.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(cl_uint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(cl_long.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(size_t.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(cl_bitfield.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(cl_float.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(cl_double.class, PrimitiveType.Kind.DOUBLE); + } + + public PrimitiveType.Kind getPrimitiveTypeFromNativeType(Class native_type) { + PrimitiveType.Kind kind = native_types_to_primitive.get(native_type); + if ( kind == null ) + throw new RuntimeException("Unsupported type " + native_type); + return kind; + } + + public void printCapabilitiesInit(final PrintWriter writer) { + } + + public String getCapabilities() { + return "CLCapabilities"; + } + + public String getAPIUtilParam(boolean comma) { + return ""; + } + + public void printErrorCheckMethod(final PrintWriter writer, final MethodDeclaration method, final String tabs) { + final Check check = method.getAnnotation(Check.class); + if ( check != null ) // Get the error code from an IntBuffer output parameter + writer.println(tabs + "Util.checkCLError(" + check.value() + ".get(" + check.value() + ".position()));"); + else { + final Class return_type = Utils.getJavaType(method.getReturnType()); + if ( return_type == int.class ) + writer.println(tabs + "Util.checkCLError(__result);"); + else { + boolean hasErrCodeParam = false; + for ( final ParameterDeclaration param : method.getParameters() ) { + if ( "errcode_ret".equals(param.getSimpleName()) && Utils.getJavaType(param.getType()) == IntBuffer.class ) { + hasErrCodeParam = true; + break; + } + } + if ( hasErrCodeParam ) + throw new RuntimeException("A method is missing the @Check annotation: " + method.toString()); + } + } + } + + public String getRegisterNativesFunctionName() { + return "extcl_InitializeClass"; + } + + public Signedness getSignednessFromType(Class type) { + if ( cl_uint.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( cl_int.class.equals(type) ) + return Signedness.SIGNED; + else + return Signedness.NONE; + } + + public String translateAnnotation(Class annotation_type) { + if ( annotation_type.equals(cl_uint.class) || annotation_type.equals(cl_int.class) ) + return "i"; + else if ( annotation_type.equals(cl_short.class) ) + return "s"; + else if ( annotation_type.equals(cl_byte.class) ) + return "b"; + else if ( annotation_type.equals(cl_float.class) ) + return "f"; + else if ( annotation_type.equals(cl_double.class) ) + return "d"; + else + throw new RuntimeException(annotation_type + " is not allowed"); + } + + public Class getNativeTypeFromPrimitiveType(PrimitiveType.Kind kind) { + Class type; + switch ( kind ) { + case INT: + type = cl_int.class; + break; + case DOUBLE: + type = cl_double.class; + break; + case FLOAT: + type = cl_float.class; + break; + case SHORT: + type = cl_short.class; + break; + case BYTE: + type = cl_byte.class; + break; + case LONG: + type = cl_long.class; + break; + case BOOLEAN: + type = cl_bool.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + public Class<? extends Annotation> getVoidType() { + return cl_void.class; + } + + public Class<? extends Annotation> getStringElementType() { + return cl_char.class; + } + + public Class<? extends Annotation> getStringArrayType() { + return cl_char.class; + } + + public Class<? extends Annotation> getByteBufferArrayType() { + return cl_uchar.class; + } + + private static Class[] getValidBufferTypes(Class type) { + if ( type.equals(IntBuffer.class) ) + return new Class[] { cl_int.class, cl_uint.class }; + else if ( type.equals(FloatBuffer.class) ) + return new Class[] { cl_float.class }; + else if ( type.equals(ByteBuffer.class) ) + return new Class[] { cl_byte.class, cl_char.class, cl_uchar.class, cl_void.class }; + else if ( type.equals(ShortBuffer.class) ) + return new Class[] { cl_short.class }; + else if ( type.equals(DoubleBuffer.class) ) + return new Class[] { cl_double.class }; + else if ( type.equals(LongBuffer.class) ) + return new Class[] { cl_long.class }; + else if ( type.equals(PointerBuffer.class) ) + return new Class[] { size_t.class }; + else + return new Class[] { }; + } + + private static Class[] getValidPrimitiveTypes(Class type) { + if ( type.equals(long.class) ) + return new Class[] { cl_long.class, size_t.class, cl_bitfield.class }; + else if ( type.equals(int.class) ) + return new Class[] { cl_int.class, cl_uint.class, cl_bool.class }; + else if ( type.equals(double.class) ) + return new Class[] { cl_double.class }; + else if ( type.equals(float.class) ) + return new Class[] { cl_float.class }; + else if ( type.equals(short.class) ) + return new Class[] { cl_short.class }; + else if ( type.equals(byte.class) ) + return new Class[] { cl_byte.class, cl_char.class, cl_uchar.class }; + else if ( type.equals(boolean.class) ) + return new Class[] { cl_bool.class }; + else if ( type.equals(void.class) ) + return new Class[] { cl_void.class }; + else + return new Class[] { }; + } + + public String getTypedefPostfix() { + return "CL_API_ENTRY "; + } + + public String getFunctionPrefix() { + return "CL_API_CALL"; + } + + public void printNativeIncludes(PrintWriter writer) { + writer.println("#include \"extcl.h\""); + } + + public Class[] getValidAnnotationTypes(Class type) { + Class[] valid_types; + if ( Buffer.class.isAssignableFrom(type) || PointerBuffer.class.isAssignableFrom(type) ) + valid_types = getValidBufferTypes(type); + else if ( type.isPrimitive() ) + valid_types = getValidPrimitiveTypes(type); + else if ( String.class.equals(type) ) + valid_types = new Class[] { cl_byte.class }; + else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) + valid_types = new Class[] { PointerWrapper.class }; + else if ( ByteBuffer[].class == type ) + valid_types = new Class[] { cl_char.class, cl_uchar.class }; + else if ( void.class.equals(type) ) + valid_types = new Class[] { GLreturn.class }; + else + valid_types = new Class[] { }; + return valid_types; + } + + public Class<? extends Annotation> getInverseType(Class type) { + return null; + } + + public String getAutoTypeFromAnnotation(AnnotationMirror annotation) { + return null; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bitfield.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bitfield.java new file mode 100644 index 0000000..4b21651 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bitfield.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface cl_bitfield { + String alias() default ""; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bool.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bool.java new file mode 100644 index 0000000..73792b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_bool.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface cl_bool { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_byte.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_byte.java new file mode 100644 index 0000000..28bc59e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_byte.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_byte { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_char.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_char.java new file mode 100644 index 0000000..c275db4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_char.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface cl_char { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_double.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_double.java new file mode 100644 index 0000000..8459a87 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_double.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_double { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_float.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_float.java new file mode 100644 index 0000000..44c9cb1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_float.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_float { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_int.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_int.java new file mode 100644 index 0000000..b515e4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_int.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_int { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_long.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_long.java new file mode 100644 index 0000000..c34aa6a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_long.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface cl_long { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_short.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_short.java new file mode 100644 index 0000000..23ce10d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_short.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_short { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uchar.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uchar.java new file mode 100644 index 0000000..825a479 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uchar.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface cl_uchar { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uint.java new file mode 100644 index 0000000..50a335a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_uint.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_uint { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_void.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_void.java new file mode 100644 index 0000000..6cf5631 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/cl_void.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +import com.sun.mirror.type.PrimitiveType; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface cl_void { + PrimitiveType.Kind value() default PrimitiveType.Kind.BYTE; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/size_t.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/size_t.java new file mode 100644 index 0000000..b6bdeab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opencl/size_t.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opencl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER }) +public @interface size_t { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLint64NV.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLint64NV.java new file mode 100644 index 0000000..99a6e68 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLint64NV.java @@ -0,0 +1,12 @@ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface EGLint64NV { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLuint64NV.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLuint64NV.java new file mode 100644 index 0000000..e633d57 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/EGLuint64NV.java @@ -0,0 +1,12 @@ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +public @interface EGLuint64NV { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLCapabilitiesGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLCapabilitiesGenerator.java new file mode 100644 index 0000000..b15a4dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLCapabilitiesGenerator.java @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.*; + +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumSet; +import java.util.Iterator; + +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.type.InterfaceType; + +/** + * Generator visitor for the context capabilities generator tool + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3355 $ + * $Id: ContextCapabilitiesGenerator.java 3355 2010-05-27 22:56:29Z spasi $ + */ +public class GLCapabilitiesGenerator { + + private static final String STUBS_LOADED_NAME = "loaded_stubs"; + private static final String ALL_INIT_METHOD_NAME = "initAllStubs"; + private static final String POINTER_INITIALIZER_POSTFIX = "_initNativeFunctionAddresses"; + private static final String CACHED_EXTS_VAR_NAME = "supported_extensions"; + private static final String PROFILE_MASK_VAR_NAME = "profileMask"; + private static final String EXTENSION_PREFIX = "GL_"; + private static final String CORE_PREFIX = "Open"; + + public static void generateClassPrologue(PrintWriter writer, boolean context_specific, boolean generate_error_checks) { + writer.println("public class " + Utils.CONTEXT_CAPS_CLASS_NAME + " {"); + writer.println("\tstatic final boolean DEBUG = " + Boolean.toString(generate_error_checks) + ";"); + writer.println("\tfinal APIUtil util = new APIUtil();"); + writer.println("\tfinal StateTracker tracker = new StateTracker();"); + writer.println(); + if ( !context_specific ) { + writer.println("\tprivate static boolean " + STUBS_LOADED_NAME + " = false;"); + } + } + + public static void generateInitializerPrologue(PrintWriter writer) { + writer.println("\t" + Utils.CONTEXT_CAPS_CLASS_NAME + "(boolean forwardCompatible) throws LWJGLException {"); + writer.println("\t\tSet<String> " + CACHED_EXTS_VAR_NAME + " = " + ALL_INIT_METHOD_NAME + "(forwardCompatible);"); + } + + private static String translateFieldName(String interface_name) { + if ( interface_name.startsWith("GL") ) + return CORE_PREFIX + interface_name; + else + return EXTENSION_PREFIX + interface_name; + } + + public static void generateSuperClassAdds(PrintWriter writer, InterfaceDeclaration d) { + Collection<InterfaceType> super_interfaces = d.getSuperinterfaces(); + if ( super_interfaces.size() > 1 ) + throw new RuntimeException(d + " extends more than one other interface"); + if ( super_interfaces.size() == 1 ) { + InterfaceType super_interface = super_interfaces.iterator().next(); + writer.print("\t\tif (" + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.println(translateFieldName(d.getSimpleName()) + "\"))"); + writer.print("\t\t\t"); + generateAddExtension(writer, super_interface.getDeclaration()); + } + } + + public static void generateInitializer(PrintWriter writer, InterfaceDeclaration d) { + String translated_field_name = translateFieldName(d.getSimpleName()); + writer.print("\t\tthis." + translated_field_name + " = "); + writer.print(CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translated_field_name + "\")"); + Collection<InterfaceType> super_interfaces = d.getSuperinterfaces(); + if ( super_interfaces.size() > 1 ) + throw new RuntimeException(d + " extends more than one other interface"); + if ( super_interfaces.size() == 1 ) { + InterfaceType super_interface = super_interfaces.iterator().next(); + writer.println(); + writer.print("\t\t\t&& " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(super_interface.getDeclaration().getSimpleName()) + "\")"); + } + Alias alias_annotation = d.getAnnotation(Alias.class); + if ( alias_annotation != null ) { + writer.println(); + writer.print("\t\t\t|| " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(alias_annotation.value()) + "\")"); + } + writer.println(";"); + } + + private static String getAddressesInitializerName(String class_name) { + return class_name + POINTER_INITIALIZER_POSTFIX; + } + + public static void generateInitStubsPrologue(PrintWriter writer, boolean context_specific) { + writer.println("\tprivate Set<String> " + ALL_INIT_METHOD_NAME + "(boolean forwardCompatible) throws LWJGLException {"); + + // Load the basic pointers we need to detect OpenGL version and supported extensions. + writer.println("\t\tglGetError = GLContext.getFunctionAddress(\"glGetError\");"); + writer.println("\t\tglGetString = GLContext.getFunctionAddress(\"glGetString\");"); + + // Initialize GL11.glGetIntegerv and GL30.glGetStringi here, in case we have created an OpenGL 3.0 context. + // (they will be used in GLContext.getSupportedExtensions) + writer.println("\t\tglGetIntegerv = GLContext.getFunctionAddress(\"glGetIntegerv\");"); + writer.println("\t\tglGetStringi = GLContext.getFunctionAddress(\"glGetStringi\");"); + + // Get the supported extensions set. + writer.println("\t\tGLContext.setCapabilities(this);"); + writer.println("\t\tSet<String> " + CACHED_EXTS_VAR_NAME + " = new HashSet<String>(256);"); + writer.println("\t\tint " + PROFILE_MASK_VAR_NAME + " = GLContext.getSupportedExtensions(" + CACHED_EXTS_VAR_NAME + ");"); + + // Force forward compatible mode when OpenGL version is 3.1 or higher and ARB_compatibility is not available. + writer.println("\t\tif ( supported_extensions.contains(\"OpenGL31\") && !(supported_extensions.contains(\"GL_ARB_compatibility\") || (profileMask & GL32.GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0) )"); + writer.println("\t\t\tforwardCompatible = true;"); + + if ( !context_specific ) { + writer.println("\t\tif (" + STUBS_LOADED_NAME + ")"); + writer.println("\t\t\treturn GLContext.getSupportedExtensions();"); + writer.println("\t\torg.lwjgl.opengl.GL11." + Utils.STUB_INITIALIZER_NAME + "();"); + } else { + writer.println("\t\tif (!" + getAddressesInitializerName("GL11") + "(forwardCompatible))"); + writer.println("\t\t\tthrow new LWJGLException(\"GL11 not supported\");"); + } + } + + public static void generateInitStubsEpilogue(PrintWriter writer, boolean context_specific) { + if ( !context_specific ) { + writer.println("\t\t" + STUBS_LOADED_NAME + " = true;"); + } + writer.println("\t\treturn " + CACHED_EXTS_VAR_NAME + ";"); + writer.println("\t}"); + } + + public static void generateUnloadStubs(PrintWriter writer, InterfaceDeclaration d) { + if ( d.getMethods().size() > 0 ) { + writer.print("\t\tGLContext.resetNativeStubs(" + Utils.getSimpleClassName(d)); + writer.println(".class);"); + } + } + + public static void generateInitStubs(PrintWriter writer, InterfaceDeclaration d, boolean context_specific) { + if ( d.getMethods().size() > 0 ) { + if ( context_specific ) { + final Alias alias_annotation = d.getAnnotation(Alias.class); + + if ( d.getAnnotation(ForceInit.class) != null ) + writer.println("\t\t" + CACHED_EXTS_VAR_NAME + ".add(\"" + translateFieldName(d.getSimpleName()) + "\");"); + writer.print("\t\tif ("); + if ( alias_annotation != null ) + writer.print("("); + writer.print(CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(d.getSimpleName()) + "\")"); + if ( alias_annotation != null ) { + writer.print(" || " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(alias_annotation.value()) + "\"))"); + } + writer.print(" && !" + getAddressesInitializerName(d.getSimpleName()) + "("); + if ( d.getAnnotation(DeprecatedGL.class) != null ) + writer.print("forwardCompatible"); + if ( d.getAnnotation(Dependent.class) != null ) { + if ( d.getAnnotation(DeprecatedGL.class) != null ) + writer.print(","); + writer.print("supported_extensions"); + } + if ( alias_annotation != null ) { + writer.println(")) {"); + writer.print("\t\t\tremove(" + CACHED_EXTS_VAR_NAME + ", \""); + writer.println(translateFieldName(alias_annotation.value()) + "\");"); + } else + writer.println("))"); + writer.print("\t\t\tremove(" + CACHED_EXTS_VAR_NAME + ", \""); + writer.println(translateFieldName(d.getSimpleName()) + "\");"); + if ( alias_annotation != null ) + writer.println("\t\t}"); + } else { + writer.print("\t\tGLContext." + Utils.STUB_INITIALIZER_NAME + "(" + Utils.getSimpleClassName(d)); + writer.println(".class, " + CACHED_EXTS_VAR_NAME + ", \"" + translateFieldName(d.getSimpleName()) + "\");"); + } + } + } + + private static void generateAddExtension(PrintWriter writer, InterfaceDeclaration d) { + writer.print(CACHED_EXTS_VAR_NAME + ".add(\""); + writer.println(translateFieldName(d.getSimpleName()) + "\");"); + } + + public static void generateAddressesInitializers(PrintWriter writer, InterfaceDeclaration d) { + Iterator<? extends MethodDeclaration> methods = d.getMethods().iterator(); + if ( !methods.hasNext() ) + return; + + writer.print("\tprivate boolean " + getAddressesInitializerName(d.getSimpleName()) + "("); + + boolean optional; + boolean deprecated = d.getAnnotation(DeprecatedGL.class) != null; + Dependent dependent = d.getAnnotation(Dependent.class); + if ( deprecated ) + writer.print("boolean forwardCompatible"); + if ( dependent != null ) { + if ( deprecated ) + writer.print(","); + writer.print("Set<String> supported_extensions"); + } + + Alias alias_annotation = d.getAnnotation(Alias.class); + boolean aliased = alias_annotation != null && alias_annotation.postfix().length() > 0; + + writer.println(") {"); + writer.println("\t\treturn "); + + boolean first = true; + while ( methods.hasNext() ) { + MethodDeclaration method = methods.next(); + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + if ( !first ) + writer.println(" &"); + else + first = false; + + optional = method.getAnnotation(Optional.class) != null; + deprecated = method.getAnnotation(DeprecatedGL.class) != null; + dependent = method.getAnnotation(Dependent.class); + + writer.print("\t\t\t("); + if ( optional ) + writer.print('('); + if ( deprecated ) + writer.print("forwardCompatible || "); + if ( dependent != null ) { + if ( dependent.value().indexOf(',') == -1 ) + writer.print("!supported_extensions.contains(\"" + dependent.value() + "\") || "); + else { + writer.print("!(false"); + for ( String extension : dependent.value().split(",") ) + writer.print(" || supported_extensions.contains(\"" + extension + "\")"); + writer.print(") || "); + } + } + if ( deprecated || dependent != null ) + writer.print('('); + writer.print(Utils.getFunctionAddressName(d, method) + " = "); + PlatformDependent platform_dependent = method.getAnnotation(PlatformDependent.class); + if ( platform_dependent != null ) { + EnumSet<Platform> platform_set = EnumSet.copyOf(Arrays.asList(platform_dependent.value())); + writer.print("GLContext.getPlatformSpecificFunctionAddress(\""); + writer.print(Platform.ALL.getPrefix() + "\", "); + writer.print("new String[]{"); + Iterator<Platform> platforms = platform_set.iterator(); + while ( platforms.hasNext() ) { + writer.print("\"" + platforms.next().getOSPrefix() + "\""); + if ( platforms.hasNext() ) + writer.print(", "); + } + writer.print("}, new String[]{"); + platforms = platform_set.iterator(); + while ( platforms.hasNext() ) { + writer.print("\"" + platforms.next().getPrefix() + "\""); + if ( platforms.hasNext() ) + writer.print(", "); + } + writer.print("}, "); + } else if ( aliased ) { + writer.print("GLContext.getFunctionAddress(new String[] {\"" + method.getSimpleName() + "\",\"" + method.getSimpleName() + alias_annotation.postfix() + "\"})) != 0"); + } else + writer.print("GLContext.getFunctionAddress("); + if ( !aliased ) + writer.print("\"" + method.getSimpleName() + "\")) != 0"); + if ( deprecated || dependent != null ) + writer.print(')'); + if ( optional ) + writer.print(" || true)"); + } + writer.println(";"); + writer.println("\t}"); + writer.println(); + } + + public static void generateSymbolAddresses(PrintWriter writer, InterfaceDeclaration d) { + boolean first = true; + for ( final MethodDeclaration method : d.getMethods() ) { + if ( method.getAnnotation(Alternate.class) != null || method.getAnnotation(Reuse.class) != null ) + continue; + + if ( first ) { + writer.println("\t// " + d.getSimpleName()); + first = false; + } + writer.println("\tlong " + Utils.getFunctionAddressName(d, method) + ";"); + } + } + + public static void generateField(PrintWriter writer, InterfaceDeclaration d) { + writer.println("\tpublic final boolean " + translateFieldName(d.getSimpleName()) + ";"); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESCapabilitiesGenerator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESCapabilitiesGenerator.java new file mode 100644 index 0000000..06d5e9a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESCapabilitiesGenerator.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.*; + +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumSet; +import java.util.Iterator; + +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.type.InterfaceType; + +/** + * Generator visitor for the context capabilities generator tool + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3334 $ + * $Id: ContextCapabilitiesGenerator.java 3334 2010-04-22 23:21:48Z spasi $ + */ +public class GLESCapabilitiesGenerator { + + private static final String STUBS_LOADED_NAME = "loaded_stubs"; + private static final String ALL_INIT_METHOD_NAME = "initAllStubs"; + private static final String POINTER_INITIALIZER_POSTFIX = "_initNativeFunctionAddresses"; + private static final String CACHED_EXTS_VAR_NAME = "supported_extensions"; + private static final String EXTENSION_PREFIX = "GL_"; + private static final String CORE_PREFIX = "Open"; + + public static void generateClassPrologue(PrintWriter writer, boolean context_specific, boolean generate_error_checks) { + writer.println("public class " + Utils.CONTEXT_CAPS_CLASS_NAME + " {"); + writer.println("\tstatic final boolean DEBUG = " + Boolean.toString(generate_error_checks) + ";"); + writer.println(); + if ( !context_specific ) { + writer.println("\tprivate static boolean " + STUBS_LOADED_NAME + ";"); + } + } + + public static void generateInitializerPrologue(PrintWriter writer) { + writer.println("\t" + Utils.CONTEXT_CAPS_CLASS_NAME + "() throws LWJGLException {"); + writer.println("\t\tSet<String> " + CACHED_EXTS_VAR_NAME + " = " + ALL_INIT_METHOD_NAME + "();"); + } + + private static String translateFieldName(String interface_name) { + if ( interface_name.startsWith("GL") ) + return CORE_PREFIX + interface_name; + else + return EXTENSION_PREFIX + interface_name; + } + + public static void generateSuperClassAdds(PrintWriter writer, InterfaceDeclaration d) { + Collection<InterfaceType> super_interfaces = d.getSuperinterfaces(); + if ( super_interfaces.size() > 1 ) + throw new RuntimeException(d + " extends more than one other interface"); + if ( super_interfaces.size() == 1 ) { + InterfaceType super_interface = super_interfaces.iterator().next(); + writer.print("\t\tif (" + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.println(translateFieldName(d.getSimpleName()) + "\"))"); + writer.print("\t\t\t"); + generateAddExtension(writer, super_interface.getDeclaration()); + } + } + + public static void generateInitializer(PrintWriter writer, InterfaceDeclaration d) { + String translated_field_name = translateFieldName(d.getSimpleName()); + writer.print("\t\tthis." + translated_field_name + " = "); + writer.print(CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translated_field_name + "\")"); + Collection<InterfaceType> super_interfaces = d.getSuperinterfaces(); + if ( super_interfaces.size() > 1 ) + throw new RuntimeException(d + " extends more than one other interface"); + if ( super_interfaces.size() == 1 ) { + InterfaceType super_interface = super_interfaces.iterator().next(); + writer.println(); + writer.print("\t\t\t&& " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(super_interface.getDeclaration().getSimpleName()) + "\")"); + } + Alias alias_annotation = d.getAnnotation(Alias.class); + if ( alias_annotation != null ) { + writer.println(); + writer.print("\t\t\t|| " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(alias_annotation.value()) + "\")"); + } + writer.println(";"); + } + + private static String getAddressesInitializerName(String class_name) { + return class_name + POINTER_INITIALIZER_POSTFIX; + } + + public static void generateInitStubsPrologue(PrintWriter writer, boolean context_specific) { + writer.println("\tprivate Set<String> " + ALL_INIT_METHOD_NAME + "() throws LWJGLException {"); + + if ( context_specific ) { + // Load the basic pointers we need to detect OpenGL version and supported extensions. + writer.println("\t\tglGetError = GLContext.getFunctionAddress(\"glGetError\");"); + writer.println("\t\tglGetString = GLContext.getFunctionAddress(\"glGetString\");"); + } + + // Get the supported extensions set. + writer.println("\t\tGLContext.setCapabilities(this);"); + writer.println("\t\tSet<String> " + CACHED_EXTS_VAR_NAME + " = new HashSet<String>(256);"); + if ( !context_specific ) + writer.println("\t\tGLContext.doInitNativeStubs(GLES20.class);"); + writer.println("\t\tGLContext.getSupportedExtensions(" + CACHED_EXTS_VAR_NAME + ");"); + + if ( !context_specific ) { + writer.println("\t\tif (" + STUBS_LOADED_NAME + ")"); + writer.println("\t\t\treturn " + CACHED_EXTS_VAR_NAME + ";"); + } else { + writer.println("\t\tif (!" + getAddressesInitializerName("GLES20") + "())"); + writer.println("\t\t\tthrow new LWJGLException(\"GL ES 2.0 not supported\");"); + } + } + + public static void generateInitStubsEpilogue(PrintWriter writer, boolean context_specific) { + if ( !context_specific ) + writer.println("\t\t" + STUBS_LOADED_NAME + " = true;"); + writer.println("\t\treturn " + CACHED_EXTS_VAR_NAME + ";"); + writer.println("\t}"); + } + + public static void generateUnloadStubs(PrintWriter writer, InterfaceDeclaration d) { + // TODO: Remove GLES + if ( d.getMethods().size() > 0 && !d.getSimpleName().startsWith("GLES") ) { + writer.print("\t\tGLContext.resetNativeStubs(" + Utils.getSimpleClassName(d)); + writer.println(".class);"); + } + } + + public static void generateInitStubs(PrintWriter writer, InterfaceDeclaration d, boolean context_specific) { + if ( d.getMethods().size() > 0 ) { + if ( context_specific ) { + final Alias alias_annotation = d.getAnnotation(Alias.class); + + if ( d.getAnnotation(ForceInit.class) != null ) + writer.println("\t\t" + CACHED_EXTS_VAR_NAME + ".add(\"" + translateFieldName(d.getSimpleName()) + "\");"); + writer.print("\t\tif ("); + if ( alias_annotation != null ) + writer.print("("); + writer.print(CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(d.getSimpleName()) + "\")"); + if ( alias_annotation != null ) { + writer.print(" || " + CACHED_EXTS_VAR_NAME + ".contains(\""); + writer.print(translateFieldName(alias_annotation.value()) + "\"))"); + } + writer.print(" && !" + getAddressesInitializerName(d.getSimpleName()) + "("); + if ( d.getAnnotation(Dependent.class) != null ) + writer.print("supported_extensions"); + if ( alias_annotation != null ) { + writer.println(")) {"); + writer.print("\t\t\tremove(" + CACHED_EXTS_VAR_NAME + ", \""); + writer.println(translateFieldName(alias_annotation.value()) + "\");"); + } else + writer.println("))"); + writer.print("\t\t\tremove(" + CACHED_EXTS_VAR_NAME + ", \""); + writer.println(translateFieldName(d.getSimpleName()) + "\");"); + if ( alias_annotation != null ) + writer.println("\t\t}"); + } else { + writer.print("\t\tGLContext." + Utils.STUB_INITIALIZER_NAME + "(" + Utils.getSimpleClassName(d)); + writer.println(".class, " + CACHED_EXTS_VAR_NAME + ", \"" + translateFieldName(d.getSimpleName()) + "\");"); + } + } + } + + private static void generateAddExtension(PrintWriter writer, InterfaceDeclaration d) { + writer.print(CACHED_EXTS_VAR_NAME + ".add(\""); + writer.println(translateFieldName(d.getSimpleName()) + "\");"); + } + + public static void generateAddressesInitializers(PrintWriter writer, InterfaceDeclaration d) { + Iterator<? extends MethodDeclaration> methods = d.getMethods().iterator(); + if ( !methods.hasNext() ) + return; + + writer.print("\tprivate boolean " + getAddressesInitializerName(d.getSimpleName()) + "("); + + boolean optional; + Dependent dependent = d.getAnnotation(Dependent.class); + if ( dependent != null ) { + writer.print("Set<String> supported_extensions"); + } + + Alias alias_annotation = d.getAnnotation(Alias.class); + boolean aliased = alias_annotation != null && alias_annotation.postfix().length() > 0; + + writer.println(") {"); + writer.println("\t\treturn "); + + boolean first = true; + while ( methods.hasNext() ) { + MethodDeclaration method = methods.next(); + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + if ( !first ) + writer.println(" &"); + else + first = false; + + optional = method.getAnnotation(Optional.class) != null; + dependent = method.getAnnotation(Dependent.class); + + writer.print("\t\t\t("); + if ( optional ) + writer.print('('); + if ( dependent != null ) { + if ( dependent.value().indexOf(',') == -1 ) + writer.print("!supported_extensions.contains(\"" + dependent.value() + "\") || "); + else { + writer.print("!(false"); + for ( String extension : dependent.value().split(",") ) + writer.print(" || supported_extensions.contains(\"" + extension + "\")"); + writer.print(") || "); + } + } + if ( dependent != null ) + writer.print('('); + writer.print(Utils.getFunctionAddressName(d, method) + " = "); + PlatformDependent platform_dependent = method.getAnnotation(PlatformDependent.class); + if ( platform_dependent != null ) { + EnumSet<Platform> platform_set = EnumSet.copyOf(Arrays.asList(platform_dependent.value())); + writer.print("GLContext.getPlatformSpecificFunctionAddress(\""); + writer.print(Platform.ALL.getPrefix() + "\", "); + writer.print("new String[]{"); + Iterator<Platform> platforms = platform_set.iterator(); + while ( platforms.hasNext() ) { + writer.print("\"" + platforms.next().getOSPrefix() + "\""); + if ( platforms.hasNext() ) + writer.print(", "); + } + writer.print("}, new String[]{"); + platforms = platform_set.iterator(); + while ( platforms.hasNext() ) { + writer.print("\"" + platforms.next().getPrefix() + "\""); + if ( platforms.hasNext() ) + writer.print(", "); + } + writer.print("}, "); + } else if ( aliased ) { + writer.print("GLContext.getFunctionAddress(new String[] {\"" + method.getSimpleName() + "\",\"" + method.getSimpleName() + alias_annotation.postfix() + "\"})) != 0"); + } else + writer.print("GLContext.getFunctionAddress("); + if ( !aliased ) + writer.print("\"" + method.getSimpleName() + "\")) != 0"); + if ( dependent != null ) + writer.print(')'); + if ( optional ) + writer.print(" || true)"); + } + writer.println(";"); + writer.println("\t}"); + writer.println(); + } + + public static void generateSymbolAddresses(PrintWriter writer, InterfaceDeclaration d) { + boolean first = true; + for ( final MethodDeclaration method : d.getMethods() ) { + if ( method.getAnnotation(Alternate.class) != null || method.getAnnotation(Reuse.class) != null ) + continue; + + if ( first ) { + writer.println("\t// " + d.getSimpleName()); + first = false; + } + writer.println("\tint " + Utils.getFunctionAddressName(d, method) + ";"); + } + } + + public static void generateField(PrintWriter writer, InterfaceDeclaration d) { + writer.println("\tpublic final boolean " + translateFieldName(d.getSimpleName()) + ";"); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESGeneratorProcessorFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESGeneratorProcessorFactory.java new file mode 100644 index 0000000..2c2c730 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESGeneratorProcessorFactory.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.Utils; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.sun.mirror.apt.*; +import com.sun.mirror.declaration.AnnotationTypeDeclaration; +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; +import com.sun.mirror.util.DeclarationFilter; + +import static java.util.Collections.*; + +/** + * Generator tool for creating the ContexCapabilities class + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3316 $ + * $Id: ContextGeneratorProcessorFactory.java 3316 2010-04-09 23:57:40Z spasi $ + */ +public class GLESGeneratorProcessorFactory implements AnnotationProcessorFactory, RoundCompleteListener { + + private static boolean first_round = true; + + // Process any set of annotations + private static final Collection<String> supportedAnnotations = + unmodifiableCollection(Arrays.asList("*")); + + public Collection<String> supportedAnnotationTypes() { + return supportedAnnotations; + } + + public Collection<String> supportedOptions() { + return unmodifiableCollection(Arrays.asList("-Acontextspecific", "-Ageneratechecks")); + } + + public void roundComplete(RoundCompleteEvent event) { + first_round = false; + } + + public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { + // Only process the initial types, not the generated ones + if ( first_round ) { + env.addListener(this); + return new GeneratorProcessor(env); + } else + return AnnotationProcessors.NO_OP; + } + + private static class GeneratorProcessor implements AnnotationProcessor { + + private final AnnotationProcessorEnvironment env; + + GeneratorProcessor(AnnotationProcessorEnvironment env) { + this.env = env; + } + + public void process() { + Map<String, String> options = env.getOptions(); + boolean generate_error_checks = options.containsKey("-Ageneratechecks"); + boolean context_specific = options.containsKey("-Acontextspecific"); + try { + generateContextCapabilitiesSource(context_specific, generate_error_checks); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void generateContextCapabilitiesSource(boolean context_specific, boolean generate_error_checks) throws IOException { + PrintWriter writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, "org.lwjgl.opengles", new File(Utils.CONTEXT_CAPS_CLASS_NAME + ".java"), null); + writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + writer.println(); + writer.println("package org.lwjgl.opengles;"); + writer.println(); + writer.println("import org.lwjgl.LWJGLException;"); + writer.println("import org.lwjgl.LWJGLUtil;"); + writer.println("import java.util.Set;"); + writer.println("import java.util.HashSet;"); + writer.println(); + GLESCapabilitiesGenerator.generateClassPrologue(writer, context_specific, generate_error_checks); + DeclarationFilter filter = DeclarationFilter.getFilter(InterfaceDeclaration.class); + Collection<TypeDeclaration> interface_decls = filter.filter(env.getSpecifiedTypeDeclarations()); + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + if ( Utils.isFinal(interface_decl) ) + GLESCapabilitiesGenerator.generateField(writer, interface_decl); + } + writer.println(); + if ( context_specific ) { + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLESCapabilitiesGenerator.generateSymbolAddresses(writer, interface_decl); + } + writer.println(); + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLESCapabilitiesGenerator.generateAddressesInitializers(writer, interface_decl); + } + writer.println(); + } + + if ( context_specific ) { + writer.println("\tprivate static void remove(Set supported_extensions, String extension) {"); + writer.println("\t\tLWJGLUtil.log(extension + \" was reported as available but an entry point is missing\");"); + writer.println("\t\tsupported_extensions.remove(extension);"); + writer.println("\t}\n"); + } + + GLESCapabilitiesGenerator.generateInitStubsPrologue(writer, context_specific); + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLESCapabilitiesGenerator.generateSuperClassAdds(writer, interface_decl); + } + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + if ( "GLES20".equals(interface_decl.getSimpleName()) ) + continue; + GLESCapabilitiesGenerator.generateInitStubs(writer, interface_decl, context_specific); + } + GLESCapabilitiesGenerator.generateInitStubsEpilogue(writer, context_specific); + writer.println(); + writer.println("\tstatic void unloadAllStubs() {"); + if ( !context_specific ) { + writer.println("\t\tif (!loaded_stubs)"); + writer.println("\t\t\treturn;"); + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLESCapabilitiesGenerator.generateUnloadStubs(writer, interface_decl); + } + writer.println("\t\tloaded_stubs = false;"); + } + writer.println("\t}"); + writer.println(); + GLESCapabilitiesGenerator.generateInitializerPrologue(writer); + for ( TypeDeclaration typedecl : interface_decls ) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + if ( Utils.isFinal(interface_decl) ) + GLESCapabilitiesGenerator.generateInitializer(writer, interface_decl); + } + writer.println("\t}"); + writer.println("}"); + writer.close(); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESTypeMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESTypeMap.java new file mode 100644 index 0000000..3383da5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLESTypeMap.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +/** + * + * OpenGL sepcific generator behaviour + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3287 $ + * $Id: GLTypeMap.java 3287 2010-03-14 23:24:40Z spasi $ + */ + +import org.lwjgl.util.generator.NativeTypeTranslator; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.Signedness; +import org.lwjgl.util.generator.TypeMap; + +import java.io.PrintWriter; +import java.lang.annotation.Annotation; +import java.nio.*; +import java.util.HashMap; +import java.util.Map; + +import com.sun.mirror.declaration.AnnotationMirror; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.type.PrimitiveType; + +public class GLESTypeMap implements TypeMap { + + private static final Map<Class<? extends Annotation>, PrimitiveType.Kind> native_types_to_primitive; + + static { + native_types_to_primitive = new HashMap<Class<? extends Annotation>, PrimitiveType.Kind>(); + native_types_to_primitive.put(GLbitfield.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLclampf.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(GLfloat.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(GLint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLshort.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLsizeiptr.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLuint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLboolean.class, PrimitiveType.Kind.BOOLEAN); + native_types_to_primitive.put(GLchar.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLhalf.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLsizei.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLushort.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLbyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLenum.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLintptr.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLubyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLvoid.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(EGLint64NV.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(EGLuint64NV.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLint64.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLuint64.class, PrimitiveType.Kind.LONG); + } + + public PrimitiveType.Kind getPrimitiveTypeFromNativeType(Class<? extends Annotation> native_type) { + PrimitiveType.Kind kind = native_types_to_primitive.get(native_type); + if ( kind == null ) + throw new RuntimeException("Unsupported type " + native_type); + return kind; + } + + public void printCapabilitiesInit(final PrintWriter writer) { + writer.println("\t\tContextCapabilities caps = GLContext.getCapabilities();"); + } + + public String getCapabilities() { + return "caps"; + } + + public String getAPIUtilParam(boolean comma) { + return ""; + } + + public void printErrorCheckMethod(final PrintWriter writer, final MethodDeclaration method, final String tabs) { + writer.println(tabs + "Util.checkGLError();"); + } + + public String getRegisterNativesFunctionName() { + return "extgl_InitializeClass"; + } + + public Signedness getSignednessFromType(Class<? extends Annotation> type) { + if ( GLuint.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLint.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLushort.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLshort.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLubyte.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLbyte.class.equals(type) ) + return Signedness.SIGNED; + else if ( EGLuint64NV.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( EGLint64NV.class.equals(type) ) + return Signedness.SIGNED; + else + return Signedness.NONE; + } + + public String translateAnnotation(Class annotation_type) { + if ( annotation_type.equals(GLuint64.class) || annotation_type.equals(GLint64.class) ) + return "i64"; + else if ( annotation_type.equals(GLuint.class) || annotation_type.equals(GLint.class) ) + return "i"; + else if ( annotation_type.equals(GLushort.class) || annotation_type.equals(GLshort.class) ) + return "s"; + else if ( annotation_type.equals(GLubyte.class) || annotation_type.equals(GLbyte.class) ) + return "b"; + else if ( annotation_type.equals(GLfloat.class) ) + return "f"; + else if ( annotation_type.equals(GLhalf.class) ) + return "h"; + else if ( annotation_type.equals(GLboolean.class) || annotation_type.equals(GLvoid.class) ) + return ""; + else if ( annotation_type.equals(EGLuint64NV.class) || annotation_type.equals(EGLint64NV.class) ) + return "l"; + else + throw new RuntimeException(annotation_type + " is not allowed"); + } + + public Class<? extends Annotation> getNativeTypeFromPrimitiveType(PrimitiveType.Kind kind) { + Class<? extends Annotation> type; + switch ( kind ) { + case INT: + type = GLint.class; + break; + case FLOAT: + type = GLfloat.class; + break; + case SHORT: + type = GLshort.class; + break; + case BYTE: + type = GLbyte.class; + break; + case BOOLEAN: + type = GLboolean.class; + break; + case LONG: + type = GLint64.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + public Class<? extends Annotation> getVoidType() { + return GLvoid.class; + } + + public Class<? extends Annotation> getStringElementType() { + return GLubyte.class; + } + + public Class<? extends Annotation> getStringArrayType() { + return GLchar.class; + } + + public Class<? extends Annotation> getByteBufferArrayType() { + return GLubyte.class; + } + + private static Class[] getValidBufferTypes(Class type) { + if ( type.equals(IntBuffer.class) ) + return new Class[] { GLbitfield.class, GLenum.class, GLint.class, GLsizei.class, GLuint.class, GLvoid.class }; + else if ( type.equals(FloatBuffer.class) ) + return new Class[] { GLclampf.class, GLfloat.class }; + else if ( type.equals(ByteBuffer.class) ) + return new Class[] { GLboolean.class, GLbyte.class, GLchar.class, GLubyte.class, GLvoid.class }; + else if ( type.equals(ShortBuffer.class) ) + return new Class[] { GLhalf.class, GLshort.class, GLushort.class }; + else if ( type.equals(LongBuffer.class) ) + return new Class[] { GLint64.class, GLuint64.class, EGLint64NV.class, EGLuint64NV.class }; + else + return new Class[] { }; + } + + private static Class[] getValidPrimitiveTypes(Class type) { + if ( type.equals(long.class) ) + return new Class[] { GLintptr.class, GLsizeiptr.class, GLint64.class, GLuint64.class, EGLuint64NV.class, EGLint64NV.class }; + else if ( type.equals(int.class) ) + return new Class[] { GLbitfield.class, GLenum.class, GLint.class, GLuint.class, GLsizei.class }; + else if ( type.equals(float.class) ) + return new Class[] { GLclampf.class, GLfloat.class }; + else if ( type.equals(short.class) ) + return new Class[] { GLhalf.class, GLshort.class, GLushort.class }; + else if ( type.equals(byte.class) ) + return new Class[] { GLbyte.class, GLchar.class, GLubyte.class }; + else if ( type.equals(boolean.class) ) + return new Class[] { GLboolean.class }; + else if ( type.equals(void.class) ) + return new Class[] { GLvoid.class, GLreturn.class }; + else + return new Class[] { }; + } + + public String getTypedefPostfix() { + return "GL_APICALL "; + } + + public String getFunctionPrefix() { + return "GL_APIENTRY"; + } + + public void printNativeIncludes(PrintWriter writer) { + writer.println("#include \"extgl.h\""); + } + + public Class[] getValidAnnotationTypes(Class type) { + Class[] valid_types; + if ( Buffer.class.isAssignableFrom(type) ) + valid_types = getValidBufferTypes(type); + else if ( type.isPrimitive() ) + valid_types = getValidPrimitiveTypes(type); + else if ( String.class.equals(type) ) + valid_types = new Class[] { GLubyte.class }; + else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) + valid_types = new Class[] { PointerWrapper.class }; + else if ( void.class.equals(type) ) + valid_types = new Class[] { GLreturn.class }; + else + valid_types = new Class[] { }; + return valid_types; + } + + public Class<? extends Annotation> getInverseType(Class<? extends Annotation> type) { + if ( GLuint64.class.equals(type) ) + return GLint64.class; + if ( GLuint.class.equals(type) ) + return GLint.class; + else if ( GLint.class.equals(type) ) + return GLuint.class; + else if ( GLushort.class.equals(type) ) + return GLshort.class; + else if ( GLshort.class.equals(type) ) + return GLushort.class; + else if ( GLubyte.class.equals(type) ) + return GLbyte.class; + else if ( GLbyte.class.equals(type) ) + return GLubyte.class; + else + return null; + } + + public String getAutoTypeFromAnnotation(AnnotationMirror annotation) { + Class annotation_class = NativeTypeTranslator.getClassFromType(annotation.getAnnotationType()); + if ( annotation_class.equals(GLint.class) ) + return "GLES20.GL_INT"; + else if ( annotation_class.equals(GLbyte.class) ) + return "GLES20.GL_BYTE"; + else if ( annotation_class.equals(GLshort.class) ) + return "GLES20.GL_SHORT"; + if ( annotation_class.equals(GLuint.class) ) + return "GLES20.GL_UNSIGNED_INT"; + else if ( annotation_class.equals(GLubyte.class) ) + return "GLES20.GL_UNSIGNED_BYTE"; + else if ( annotation_class.equals(GLushort.class) ) + return "GLES20.GL_UNSIGNED_SHORT"; + else if ( annotation_class.equals(GLfloat.class) ) + return "GLES20.GL_FLOAT"; + else + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLGeneratorProcessorFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLGeneratorProcessorFactory.java new file mode 100644 index 0000000..db50e48 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLGeneratorProcessorFactory.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.Utils; + +import static java.util.Collections.unmodifiableCollection; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.sun.mirror.apt.AnnotationProcessor; +import com.sun.mirror.apt.AnnotationProcessorEnvironment; +import com.sun.mirror.apt.AnnotationProcessorFactory; +import com.sun.mirror.apt.AnnotationProcessors; +import com.sun.mirror.apt.Filer; +import com.sun.mirror.apt.RoundCompleteEvent; +import com.sun.mirror.apt.RoundCompleteListener; +import com.sun.mirror.declaration.AnnotationTypeDeclaration; +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; +import com.sun.mirror.util.DeclarationFilter; + +/** + * + * Generator tool for creating the ContexCapabilities class + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3316 $ + * $Id: ContextGeneratorProcessorFactory.java 3316 2010-04-09 23:57:40Z spasi $ + */ +public class GLGeneratorProcessorFactory implements AnnotationProcessorFactory, RoundCompleteListener { + private static boolean first_round = true; + + // Process any set of annotations + private static final Collection<String> supportedAnnotations = + unmodifiableCollection(Arrays.asList("*")); + + public Collection<String> supportedAnnotationTypes() { + return supportedAnnotations; + } + + public Collection<String> supportedOptions() { + return unmodifiableCollection(Arrays.asList("-Acontextspecific", "-Ageneratechecks")); + } + + public void roundComplete(RoundCompleteEvent event) { + first_round = false; + } + + public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { + // Only process the initial types, not the generated ones + if (first_round) { + env.addListener(this); + return new GeneratorProcessor(env); + } else + return AnnotationProcessors.NO_OP; + } + + private static class GeneratorProcessor implements AnnotationProcessor { + private final AnnotationProcessorEnvironment env; + + GeneratorProcessor(AnnotationProcessorEnvironment env) { + this.env = env; + } + + public void process() { + Map<String, String> options = env.getOptions(); + boolean generate_error_checks = options.containsKey("-Ageneratechecks"); + boolean context_specific = options.containsKey("-Acontextspecific"); + try { + generateContextCapabilitiesSource(context_specific, generate_error_checks); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void generateContextCapabilitiesSource(boolean context_specific, boolean generate_error_checks) throws IOException { + PrintWriter writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, "org.lwjgl.opengl", new File(Utils.CONTEXT_CAPS_CLASS_NAME + ".java"), null); + writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + writer.println(); + writer.println("package org.lwjgl.opengl;"); + writer.println(); + writer.println("import org.lwjgl.LWJGLException;"); + writer.println("import org.lwjgl.LWJGLUtil;"); + writer.println("import java.util.Set;"); + writer.println("import java.util.HashSet;"); + writer.println(); + GLCapabilitiesGenerator.generateClassPrologue(writer, context_specific, generate_error_checks); + DeclarationFilter filter = DeclarationFilter.getFilter(InterfaceDeclaration.class); + Collection<TypeDeclaration> interface_decls = filter.filter(env.getSpecifiedTypeDeclarations()); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + if (Utils.isFinal(interface_decl)) + GLCapabilitiesGenerator.generateField(writer, interface_decl); + } + writer.println(); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLCapabilitiesGenerator.generateSymbolAddresses(writer, interface_decl); + } + writer.println(); + if (context_specific) { + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLCapabilitiesGenerator.generateAddressesInitializers(writer, interface_decl); + } + writer.println(); + } + + writer.println("\tprivate static void remove(Set supported_extensions, String extension) {"); + writer.println("\t\tLWJGLUtil.log(extension + \" was reported as available but an entry point is missing\");"); + writer.println("\t\tsupported_extensions.remove(extension);"); + writer.println("\t}\n"); + + GLCapabilitiesGenerator.generateInitStubsPrologue(writer, context_specific); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLCapabilitiesGenerator.generateSuperClassAdds(writer, interface_decl); + } + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + String simple_name = interface_decl.getSimpleName(); + if ( "GL11".equals(simple_name) ) + continue; + GLCapabilitiesGenerator.generateInitStubs(writer, interface_decl, context_specific); + } + GLCapabilitiesGenerator.generateInitStubsEpilogue(writer, context_specific); + writer.println(); + writer.println("\tstatic void unloadAllStubs() {"); + if (!context_specific) { + writer.println("\t\tif (!loaded_stubs)"); + writer.println("\t\t\treturn;"); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + GLCapabilitiesGenerator.generateUnloadStubs(writer, interface_decl); + } + writer.println("\t\tloaded_stubs = false;"); + } + writer.println("\t}"); + writer.println(); + GLCapabilitiesGenerator.generateInitializerPrologue(writer); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + if (Utils.isFinal(interface_decl)) + GLCapabilitiesGenerator.generateInitializer(writer, interface_decl); + } + writer.println("\t\ttracker.init();"); + writer.println("\t}"); + writer.println("}"); + writer.close(); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLReferencesGeneratorProcessorFactory.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLReferencesGeneratorProcessorFactory.java new file mode 100644 index 0000000..6424de7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLReferencesGeneratorProcessorFactory.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.CachedReference; +import org.lwjgl.util.generator.Utils; + +import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableCollection; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; + +import com.sun.mirror.apt.AnnotationProcessor; +import com.sun.mirror.apt.AnnotationProcessorEnvironment; +import com.sun.mirror.apt.AnnotationProcessorFactory; +import com.sun.mirror.apt.AnnotationProcessors; +import com.sun.mirror.apt.Filer; +import com.sun.mirror.apt.RoundCompleteEvent; +import com.sun.mirror.apt.RoundCompleteListener; +import com.sun.mirror.declaration.AnnotationTypeDeclaration; +import com.sun.mirror.declaration.InterfaceDeclaration; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.declaration.ParameterDeclaration; +import com.sun.mirror.declaration.TypeDeclaration; +import com.sun.mirror.util.DeclarationFilter; + +/** + * + * Generator tool for creating the References class + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3237 $ + * $Id: ReferencesGeneratorProcessorFactory.java 3237 2009-09-08 15:07:15Z spasi $ + */ +public class GLReferencesGeneratorProcessorFactory implements AnnotationProcessorFactory, RoundCompleteListener { + private static final String REFERENCES_CLASS_NAME = "References"; + private static final String REFERENCES_PARAMETER_NAME = "references"; + + private static boolean first_round = true; + + // Process any set of annotations + private static final Collection<String> supportedAnnotations = + unmodifiableCollection(Arrays.asList("*")); + + public Collection<String> supportedAnnotationTypes() { + return supportedAnnotations; + } + + public Collection<String> supportedOptions() { + return emptyList(); + } + + public void roundComplete(RoundCompleteEvent event) { + first_round = false; + } + + public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) { + // Only process the initial types, not the generated ones + if (first_round) { + env.addListener(this); + return new GeneratorProcessor(env); + } else + return AnnotationProcessors.NO_OP; + } + + private static class GeneratorProcessor implements AnnotationProcessor { + private final AnnotationProcessorEnvironment env; + + GeneratorProcessor(AnnotationProcessorEnvironment env) { + this.env = env; + } + + public void process() { + try { + generateReferencesSource(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static void generateClearsFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { + for (ParameterDeclaration param : method.getParameters()) { + CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { + Class nio_type = Utils.getNIOBufferType(param.getType()); + String reference_name = Utils.getReferenceName(interface_decl, method, param); + writer.println("\t\tthis." + reference_name + " = null;"); + } + } + } + + private static void generateCopiesFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { + for (ParameterDeclaration param : method.getParameters()) { + CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { + Class nio_type = Utils.getNIOBufferType(param.getType()); + String reference_name = Utils.getReferenceName(interface_decl, method, param); + writer.print("\t\t\tthis." + reference_name + " = "); + writer.println(REFERENCES_PARAMETER_NAME + "." + reference_name + ";"); + } + } + } + + private static void generateClearsFromMethods(PrintWriter writer, InterfaceDeclaration interface_decl) { + for (MethodDeclaration method : interface_decl.getMethods()) { + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + generateClearsFromParameters(writer, interface_decl, method); + } + } + + private static void generateCopiesFromMethods(PrintWriter writer, InterfaceDeclaration interface_decl) { + for (MethodDeclaration method : interface_decl.getMethods()) { + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + generateCopiesFromParameters(writer, interface_decl, method); + } + } + + private static void generateReferencesFromParameters(PrintWriter writer, InterfaceDeclaration interface_decl, MethodDeclaration method) { + for (ParameterDeclaration param : method.getParameters()) { + CachedReference cached_reference_annotation = param.getAnnotation(CachedReference.class); + if (cached_reference_annotation != null && cached_reference_annotation.name().length() == 0) { + Class nio_type = Utils.getNIOBufferType(param.getType()); + if (nio_type == null) + throw new RuntimeException(param + " in method " + method + " in " + interface_decl + " is annotated with " + + cached_reference_annotation.annotationType().getSimpleName() + " but the parameter is not a NIO buffer"); + writer.print("\t" + nio_type.getName() + " " + Utils.getReferenceName(interface_decl, method, param)); + writer.println(";"); + } + } + } + + private static void generateReferencesFromMethods(PrintWriter writer, InterfaceDeclaration interface_decl) { + for (MethodDeclaration method : interface_decl.getMethods()) { + if ( method.getAnnotation(Alternate.class) != null ) + continue; + + generateReferencesFromParameters(writer, interface_decl, method); + } + } + + private void generateReferencesSource() throws IOException { + PrintWriter writer = env.getFiler().createTextFile(Filer.Location.SOURCE_TREE, "org.lwjgl.opengl", new File(REFERENCES_CLASS_NAME + ".java"), null); + writer.println("/* MACHINE GENERATED FILE, DO NOT EDIT */"); + writer.println(); + writer.println("package org.lwjgl.opengl;"); + writer.println(); + writer.println("class " + REFERENCES_CLASS_NAME + " extends BaseReferences {"); + writer.println("\t" + REFERENCES_CLASS_NAME + "(ContextCapabilities caps) {"); + writer.println("\t\tsuper(caps);"); + writer.println("\t}"); + DeclarationFilter filter = DeclarationFilter.getFilter(InterfaceDeclaration.class); + Collection<TypeDeclaration> interface_decls = filter.filter(env.getSpecifiedTypeDeclarations()); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + generateReferencesFromMethods(writer, interface_decl); + } + writer.println(); + writer.println("\tvoid copy(" + REFERENCES_CLASS_NAME + " " + REFERENCES_PARAMETER_NAME + ", int mask) {"); + writer.println("\t\tsuper.copy(" + REFERENCES_PARAMETER_NAME + ", mask);"); + writer.println("\t\tif ( (mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0 ) {"); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + generateCopiesFromMethods(writer, interface_decl); + } + writer.println("\t\t}"); + writer.println("\t}"); + writer.println("\tvoid clear() {"); + writer.println("\t\tsuper.clear();"); + for (TypeDeclaration typedecl : interface_decls) { + InterfaceDeclaration interface_decl = (InterfaceDeclaration)typedecl; + generateClearsFromMethods(writer, interface_decl); + } + writer.println("\t}"); + writer.println("}"); + writer.close(); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java new file mode 100644 index 0000000..46797e2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLTypeMap.java @@ -0,0 +1,331 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.generator.opengl; + +/** + * + * OpenGL sepcific generator behaviour + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3392 $ + * $Id: GLTypeMap.java 3392 2010-07-27 15:33:22Z spasi $ + */ + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.NativeTypeTranslator; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.Signedness; +import org.lwjgl.util.generator.TypeMap; + +import java.io.PrintWriter; +import java.lang.annotation.Annotation; +import java.nio.*; +import java.util.HashMap; +import java.util.Map; + +import com.sun.mirror.declaration.AnnotationMirror; +import com.sun.mirror.declaration.MethodDeclaration; +import com.sun.mirror.type.PrimitiveType; + +public class GLTypeMap implements TypeMap { + + private static final Map<Class, PrimitiveType.Kind> native_types_to_primitive; + + static { + native_types_to_primitive = new HashMap<Class, PrimitiveType.Kind>(); + native_types_to_primitive.put(GLbitfield.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLcharARB.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLclampf.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(GLfloat.class, PrimitiveType.Kind.FLOAT); + native_types_to_primitive.put(GLint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLshort.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLsizeiptr.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLuint.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLboolean.class, PrimitiveType.Kind.BOOLEAN); + native_types_to_primitive.put(GLchar.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLdouble.class, PrimitiveType.Kind.DOUBLE); + native_types_to_primitive.put(GLhalf.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLintptrARB.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLsizei.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLushort.class, PrimitiveType.Kind.SHORT); + native_types_to_primitive.put(GLbyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLclampd.class, PrimitiveType.Kind.DOUBLE); + native_types_to_primitive.put(GLenum.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLhandleARB.class, PrimitiveType.Kind.INT); + native_types_to_primitive.put(GLintptr.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLsizeiptrARB.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLubyte.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLvoid.class, PrimitiveType.Kind.BYTE); + native_types_to_primitive.put(GLint64EXT.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLuint64EXT.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLint64.class, PrimitiveType.Kind.LONG); + native_types_to_primitive.put(GLuint64.class, PrimitiveType.Kind.LONG); + } + + public PrimitiveType.Kind getPrimitiveTypeFromNativeType(Class native_type) { + PrimitiveType.Kind kind = native_types_to_primitive.get(native_type); + if ( kind == null ) + throw new RuntimeException("Unsupported type " + native_type); + return kind; + } + + public void printCapabilitiesInit(final PrintWriter writer) { + writer.println("\t\tContextCapabilities caps = GLContext.getCapabilities();"); + } + + public String getCapabilities() { + return "caps"; + } + + public String getAPIUtilParam(boolean comma) { + return comma ? "caps, " : "caps"; + } + + public void printErrorCheckMethod(final PrintWriter writer, final MethodDeclaration method, final String tabs) { + writer.println(tabs + "Util.checkGLError();"); + } + + public String getRegisterNativesFunctionName() { + return "extgl_InitializeClass"; + } + + public Signedness getSignednessFromType(Class type) { + if ( GLuint.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLint.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLushort.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLshort.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLubyte.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLbyte.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLuint64EXT.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLint64EXT.class.equals(type) ) + return Signedness.SIGNED; + else if ( GLuint64.class.equals(type) ) + return Signedness.UNSIGNED; + else if ( GLint64.class.equals(type) ) + return Signedness.SIGNED; + else + return Signedness.NONE; + } + + public String translateAnnotation(Class annotation_type) { + if ( annotation_type.equals(GLuint.class) || annotation_type.equals(GLint.class) ) + return "i"; + else if ( annotation_type.equals(GLushort.class) || annotation_type.equals(GLshort.class) ) + return "s"; + else if ( annotation_type.equals(GLubyte.class) || annotation_type.equals(GLbyte.class) ) + return "b"; + else if ( annotation_type.equals(GLfloat.class) || annotation_type.equals(GLclampf.class) ) + return "f"; + else if ( annotation_type.equals(GLdouble.class) || annotation_type.equals(GLclampd.class) ) + return "d"; + else if ( annotation_type.equals(GLhalf.class) ) + return "h"; + else if ( annotation_type.equals(GLuint64EXT.class) || annotation_type.equals(GLint64EXT.class) || annotation_type.equals(GLuint64.class) || annotation_type.equals(GLint64.class) ) + return "i64"; + else if ( annotation_type.equals(GLboolean.class) || annotation_type.equals(GLvoid.class) ) + return ""; + else + throw new RuntimeException(annotation_type + " is not allowed"); + } + + public Class getNativeTypeFromPrimitiveType(PrimitiveType.Kind kind) { + Class type; + switch ( kind ) { + case INT: + type = GLint.class; + break; + case DOUBLE: + type = GLdouble.class; + break; + case FLOAT: + type = GLfloat.class; + break; + case SHORT: + type = GLshort.class; + break; + case BYTE: + type = GLbyte.class; + break; + case LONG: + type = GLint64EXT.class; + break; + case BOOLEAN: + type = GLboolean.class; + break; + default: + throw new RuntimeException(kind + " is not allowed"); + } + return type; + } + + public Class<? extends Annotation> getVoidType() { + return GLvoid.class; + } + + public Class<? extends Annotation> getStringElementType() { + return GLubyte.class; + } + + public Class<? extends Annotation> getStringArrayType() { + return GLchar.class; + } + + public Class<? extends Annotation> getByteBufferArrayType() { + return GLchar.class; + } + + private static Class[] getValidBufferTypes(Class type) { + if ( type.equals(IntBuffer.class) ) + return new Class[] { GLbitfield.class, GLenum.class, GLhandleARB.class, GLint.class, + GLsizei.class, GLuint.class, GLvoid.class }; + else if ( type.equals(FloatBuffer.class) ) + return new Class[] { GLclampf.class, GLfloat.class }; + else if ( type.equals(ByteBuffer.class) ) + return new Class[] { GLboolean.class, GLbyte.class, GLcharARB.class, GLchar.class, GLubyte.class, GLvoid.class }; + else if ( type.equals(ShortBuffer.class) ) + return new Class[] { GLhalf.class, GLshort.class, GLushort.class }; + else if ( type.equals(DoubleBuffer.class) ) + return new Class[] { GLclampd.class, GLdouble.class }; + else if ( type.equals(LongBuffer.class) ) + return new Class[] { GLint64EXT.class, GLuint64EXT.class, GLint64.class, GLuint64.class }; + else + return new Class[] { }; + } + + private static Class[] getValidPrimitiveTypes(Class type) { + if ( type.equals(long.class) ) + return new Class[] { GLintptrARB.class, GLuint.class, GLintptr.class, GLsizeiptrARB.class, GLsizeiptr.class, GLint64EXT.class, GLuint64EXT.class, GLint64.class, GLuint64.class }; + else if ( type.equals(int.class) ) + return new Class[] { GLbitfield.class, GLenum.class, GLhandleARB.class, GLint.class, GLuint.class, + GLsizei.class }; + else if ( type.equals(double.class) ) + return new Class[] { GLclampd.class, GLdouble.class }; + else if ( type.equals(float.class) ) + return new Class[] { GLclampf.class, GLfloat.class }; + else if ( type.equals(short.class) ) + return new Class[] { GLhalf.class, GLshort.class, GLushort.class }; + else if ( type.equals(byte.class) ) + return new Class[] { GLbyte.class, GLcharARB.class, GLchar.class, GLubyte.class }; + else if ( type.equals(boolean.class) ) + return new Class[] { GLboolean.class }; + else if ( type.equals(void.class) ) + return new Class[] { GLvoid.class, GLreturn.class }; + else + return new Class[] { }; + } + + public String getTypedefPostfix() { + return ""; + } + + public String getFunctionPrefix() { + return "APIENTRY"; + } + + public void printNativeIncludes(PrintWriter writer) { + writer.println("#include \"extgl.h\""); + } + + public Class[] getValidAnnotationTypes(Class type) { + Class[] valid_types; + if ( Buffer.class.isAssignableFrom(type) ) + valid_types = getValidBufferTypes(type); + else if ( type.isPrimitive() ) + valid_types = getValidPrimitiveTypes(type); + else if ( String.class.equals(type) ) + valid_types = new Class[] { GLubyte.class }; + else if ( org.lwjgl.PointerWrapper.class.isAssignableFrom(type) ) + valid_types = new Class[] { PointerWrapper.class }; + else if (void.class.equals(type) ) + valid_types = new Class[] { GLreturn.class }; + else if ( PointerBuffer.class.equals(type) ) + valid_types = new Class[] { GLintptr.class, GLintptrARB.class, GLsizeiptr.class, GLsizeiptrARB.class }; + else + valid_types = new Class[] { }; + return valid_types; + } + + public Class<? extends Annotation> getInverseType(Class type) { + if ( GLuint.class.equals(type) ) + return GLint.class; + else if ( GLint.class.equals(type) ) + return GLuint.class; + else if ( GLushort.class.equals(type) ) + return GLshort.class; + else if ( GLshort.class.equals(type) ) + return GLushort.class; + else if ( GLubyte.class.equals(type) ) + return GLbyte.class; + else if ( GLbyte.class.equals(type) ) + return GLubyte.class; + else if ( GLuint64EXT.class.equals(type) ) + return GLint64EXT.class; + else if ( GLint64EXT.class.equals(type) ) + return GLuint64EXT.class; + else if ( GLuint64.class.equals(type) ) + return GLint64.class; + else if ( GLint64.class.equals(type) ) + return GLuint64.class; + else + return null; + } + + public String getAutoTypeFromAnnotation(AnnotationMirror annotation) { + Class annotation_class = NativeTypeTranslator.getClassFromType(annotation.getAnnotationType()); + if ( annotation_class.equals(GLint.class) ) + return "GL11.GL_INT"; + else if ( annotation_class.equals(GLbyte.class) ) + return "GL11.GL_BYTE"; + else if ( annotation_class.equals(GLshort.class) ) + return "GL11.GL_SHORT"; + if ( annotation_class.equals(GLuint.class) ) + return "GL11.GL_UNSIGNED_INT"; + else if ( annotation_class.equals(GLubyte.class) ) + return "GL11.GL_UNSIGNED_BYTE"; + else if ( annotation_class.equals(GLushort.class) ) + return "GL11.GL_UNSIGNED_SHORT"; + else if ( annotation_class.equals(GLfloat.class) ) + return "GL11.GL_FLOAT"; + else if ( annotation_class.equals(GLdouble.class) ) + return "GL11.GL_DOUBLE"; + else + return null; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbitfield.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbitfield.java new file mode 100644 index 0000000..6652f88 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbitfield.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLbitfield.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLbitfield { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLboolean.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLboolean.java new file mode 100644 index 0000000..f392283 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLboolean.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLboolean.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLboolean { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbyte.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbyte.java new file mode 100644 index 0000000..6f4fcc5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLbyte.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLbyte.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLbyte { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLchar.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLchar.java new file mode 100644 index 0000000..a31bf42 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLchar.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLchar.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLchar { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLcharARB.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLcharARB.java new file mode 100644 index 0000000..25fe1f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLcharARB.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLcharARB.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLcharARB { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampd.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampd.java new file mode 100644 index 0000000..21c85fb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampd.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLclampd.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLclampd { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampf.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampf.java new file mode 100644 index 0000000..0027efb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLclampf.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLclampf.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLclampf { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLdouble.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLdouble.java new file mode 100644 index 0000000..10fdf38 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLdouble.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLdouble.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLdouble { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLenum.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLenum.java new file mode 100644 index 0000000..fecf2eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLenum.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLenum.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLenum { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLfloat.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLfloat.java new file mode 100644 index 0000000..ba90d6c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLfloat.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLfloat.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLfloat { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhalf.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhalf.java new file mode 100644 index 0000000..dd77e6f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhalf.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLhalf.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLhalf { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhandleARB.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhandleARB.java new file mode 100644 index 0000000..6d8f05e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLhandleARB.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLhandleARB.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLhandleARB { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint.java new file mode 100644 index 0000000..cb9fc0d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLint.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLint { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64.java new file mode 100644 index 0000000..e83f034 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLint64 { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64EXT.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64EXT.java new file mode 100644 index 0000000..e215241 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLint64EXT.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLint64EXT { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptr.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptr.java new file mode 100644 index 0000000..11da320 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptr.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLintptr.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@PointerType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLintptr { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java new file mode 100644 index 0000000..c0b0e60 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLintptrARB.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLintptrARB.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@PointerType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLintptrARB { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLreturn.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLreturn.java new file mode 100644 index 0000000..2ab196e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLreturn.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * When a method is annonated with @GLreturn, the specified output Buffer parameter + * will be used to return a single value. The primitive type will match the Buffer type. + * String will be returned if the Buffer is a ByteBuffer annotated with @GLchar. + * + * @author spasi + */ +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ ElementType.METHOD }) +public @interface GLreturn { + /** The Buffer parameter to use as the method result. */ + String value(); + /** The argument that specifies the maximum number of bytes that may be read (String results only). */ + String maxLength() default ""; + /** If true, the maxLength value is going to be used when creating the String. */ + boolean forceMaxLength() default false; + ///** If we use the byte buffer for another parameter, an offset must be used. */ + //String offset() default ""; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLshort.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLshort.java new file mode 100644 index 0000000..44c27b1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLshort.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLshort.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLshort { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizei.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizei.java new file mode 100644 index 0000000..ce787e5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizei.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLsizei.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLsizei { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java new file mode 100644 index 0000000..eba3c28 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptr.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLsizeiptr.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@PointerType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLsizeiptr { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java new file mode 100644 index 0000000..8c56bab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLsizeiptrARB.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLsizeiptrARB.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.PointerType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@PointerType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLsizeiptrARB { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLtime.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLtime.java new file mode 100644 index 0000000..c53b62c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLtime.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * Unsigned binary representing an absolute absolute or relative time interval. + * Precision is nanoseconds but accuracy is implementation-dependent. + * + * @author spasi <spasi@users.sourceforge.net> + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLtime { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLubyte.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLubyte.java new file mode 100644 index 0000000..a22c539 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLubyte.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLubyte.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLubyte { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint.java new file mode 100644 index 0000000..44760a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLuint.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLuint { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64.java new file mode 100644 index 0000000..9395dd8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLuint64 { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64EXT.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64EXT.java new file mode 100644 index 0000000..05a228f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLuint64EXT.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLuint64EXT { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLushort.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLushort.java new file mode 100644 index 0000000..18d3198 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLushort.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2983 $ + * $Id: GLushort.java 2983 2008-04-07 18:36:09Z matzon $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLushort { +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLvoid.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLvoid.java new file mode 100644 index 0000000..8cff6a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/generator/opengl/GLvoid.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.generator.opengl; + +/** + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3279 $ + * $Id: GLvoid.java 3279 2010-03-11 21:06:49Z spasi $ + */ + +import org.lwjgl.util.generator.NativeType; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; + +import com.sun.mirror.type.PrimitiveType; + +@NativeType +@Target({ElementType.PARAMETER, ElementType.METHOD}) +public @interface GLvoid { + PrimitiveType.Kind value() default PrimitiveType.Kind.BYTE; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Cylinder.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Cylinder.java new file mode 100644 index 0000000..f964c60 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Cylinder.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * Cylinder.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Cylinder extends Quadric { + + /** + * Constructor for Cylinder. + */ + public Cylinder() { + super(); + } + + /** + * draws a cylinder oriented along the z axis. The base of the + * cylinder is placed at z = 0, and the top at z=height. Like a sphere, a + * cylinder is subdivided around the z axis into slices, and along the z axis + * into stacks. + * + * Note that if topRadius is set to zero, then this routine will generate a + * cone. + * + * If the orientation is set to GLU.OUTSIDE (with glu.quadricOrientation), then + * any generated normals point away from the z axis. Otherwise, they point + * toward the z axis. + * + * If texturing is turned on (with glu.quadricTexture), then texture + * coordinates are generated so that t ranges linearly from 0.0 at z = 0 to + * 1.0 at z = height, and s ranges from 0.0 at the +y axis, to 0.25 at the +x + * axis, to 0.5 at the -y axis, to 0.75 at the -x axis, and back to 1.0 at the + * +y axis. + * + * @param baseRadius Specifies the radius of the cylinder at z = 0. + * @param topRadius Specifies the radius of the cylinder at z = height. + * @param height Specifies the height of the cylinder. + * @param slices Specifies the number of subdivisions around the z axis. + * @param stacks Specifies the number of subdivisions along the z axis. + */ + public void draw(float baseRadius, float topRadius, float height, int slices, int stacks) { + + float da, r, dr, dz; + float x, y, z, nz, nsign; + int i, j; + + if (super.orientation == GLU_INSIDE) { + nsign = -1.0f; + } else { + nsign = 1.0f; + } + + da = 2.0f * PI / slices; + dr = (topRadius - baseRadius) / stacks; + dz = height / stacks; + nz = (baseRadius - topRadius) / height; + // Z component of normal vectors + + if (super.drawStyle == GLU_POINT) { + glBegin(GL_POINTS); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + + z = 0.0f; + r = baseRadius; + for (j = 0; j <= stacks; j++) { + glVertex3f((x * r), (y * r), z); + z += dz; + r += dr; + } + } + glEnd(); + } else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) { + // Draw rings + if (super.drawStyle == GLU_LINE) { + z = 0.0f; + r = baseRadius; + for (j = 0; j <= stacks; j++) { + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * r), (y * r), z); + } + glEnd(); + z += dz; + r += dr; + } + } else { + // draw one ring at each end + if (baseRadius != 0.0) { + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * baseRadius), (y * baseRadius), 0.0f); + } + glEnd(); + glBegin(GL_LINE_LOOP); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * topRadius), (y * topRadius), height); + } + glEnd(); + } + } + // draw length lines + glBegin(GL_LINES); + for (i = 0; i < slices; i++) { + x = cos((i * da)); + y = sin((i * da)); + normal3f(x * nsign, y * nsign, nz * nsign); + glVertex3f((x * baseRadius), (y * baseRadius), 0.0f); + glVertex3f((x * topRadius), (y * topRadius), (height)); + } + glEnd(); + } else if (super.drawStyle == GLU_FILL) { + float ds = 1.0f / slices; + float dt = 1.0f / stacks; + float t = 0.0f; + z = 0.0f; + r = baseRadius; + for (j = 0; j < stacks; j++) { + float s = 0.0f; + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= slices; i++) { + if (i == slices) { + x = sin(0.0f); + y = cos(0.0f); + } else { + x = sin((i * da)); + y = cos((i * da)); + } + if (nsign == 1.0f) { + normal3f((x * nsign), (y * nsign), (nz * nsign)); + TXTR_COORD(s, t); + glVertex3f((x * r), (y * r), z); + normal3f((x * nsign), (y * nsign), (nz * nsign)); + TXTR_COORD(s, t + dt); + glVertex3f((x * (r + dr)), (y * (r + dr)), (z + dz)); + } else { + normal3f(x * nsign, y * nsign, nz * nsign); + TXTR_COORD(s, t); + glVertex3f((x * r), (y * r), z); + normal3f(x * nsign, y * nsign, nz * nsign); + TXTR_COORD(s, t + dt); + glVertex3f((x * (r + dr)), (y * (r + dr)), (z + dz)); + } + s += ds; + } // for slices + glEnd(); + r += dr; + t += dt; + z += dz; + } // for stacks + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Disk.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Disk.java new file mode 100644 index 0000000..b71cf36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Disk.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * Disk.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Disk extends Quadric { + + /** + * Constructor for Disk. + */ + public Disk() { + super(); + } + + /** + * renders a disk on the z = 0 plane. The disk has a radius of + * outerRadius, and contains a concentric circular hole with a radius of + * innerRadius. If innerRadius is 0, then no hole is generated. The disk is + * subdivided around the z axis into slices (like pizza slices), and also + * about the z axis into rings (as specified by slices and loops, + * respectively). + * + * With respect to orientation, the +z side of the disk is considered to be + * "outside" (see glu.quadricOrientation). This means that if the orientation + * is set to GLU.OUTSIDE, then any normals generated point along the +z axis. + * Otherwise, they point along the -z axis. + * + * If texturing is turned on (with glu.quadricTexture), texture coordinates are + * generated linearly such that where r=outerRadius, the value at (r, 0, 0) is + * (1, 0.5), at (0, r, 0) it is (0.5, 1), at (-r, 0, 0) it is (0, 0.5), and at + * (0, -r, 0) it is (0.5, 0). + */ + public void draw(float innerRadius, float outerRadius, int slices, int loops) + { + float da, dr; + + /* Normal vectors */ + if (super.normals != GLU_NONE) { + if (super.orientation == GLU_OUTSIDE) { + glNormal3f(0.0f, 0.0f, +1.0f); + } + else { + glNormal3f(0.0f, 0.0f, -1.0f); + } + } + + da = 2.0f * PI / slices; + dr = (outerRadius - innerRadius) / loops; + + switch (super.drawStyle) { + case GLU_FILL: + { + /* texture of a gluDisk is a cut out of the texture unit square + * x, y in [-outerRadius, +outerRadius]; s, t in [0, 1] + * (linear mapping) + */ + float dtc = 2.0f * outerRadius; + float sa, ca; + float r1 = innerRadius; + int l; + for (l = 0; l < loops; l++) { + float r2 = r1 + dr; + if (super.orientation == GLU_OUTSIDE) { + int s; + glBegin(GL_QUAD_STRIP); + for (s = 0; s <= slices; s++) { + float a; + if (s == slices) + a = 0.0f; + else + a = s * da; + sa = sin(a); + ca = cos(a); + TXTR_COORD(0.5f + sa * r2 / dtc, 0.5f + ca * r2 / dtc); + glVertex2f(r2 * sa, r2 * ca); + TXTR_COORD(0.5f + sa * r1 / dtc, 0.5f + ca * r1 / dtc); + glVertex2f(r1 * sa, r1 * ca); + } + glEnd(); + } + else { + int s; + glBegin(GL_QUAD_STRIP); + for (s = slices; s >= 0; s--) { + float a; + if (s == slices) + a = 0.0f; + else + a = s * da; + sa = sin(a); + ca = cos(a); + TXTR_COORD(0.5f - sa * r2 / dtc, 0.5f + ca * r2 / dtc); + glVertex2f(r2 * sa, r2 * ca); + TXTR_COORD(0.5f - sa * r1 / dtc, 0.5f + ca * r1 / dtc); + glVertex2f(r1 * sa, r1 * ca); + } + glEnd(); + } + r1 = r2; + } + break; + } + case GLU_LINE: + { + int l, s; + /* draw loops */ + for (l = 0; l <= loops; l++) { + float r = innerRadius + l * dr; + glBegin(GL_LINE_LOOP); + for (s = 0; s < slices; s++) { + float a = s * da; + glVertex2f(r * sin(a), r * cos(a)); + } + glEnd(); + } + /* draw spokes */ + for (s = 0; s < slices; s++) { + float a = s * da; + float x = sin(a); + float y = cos(a); + glBegin(GL_LINE_STRIP); + for (l = 0; l <= loops; l++) { + float r = innerRadius + l * dr; + glVertex2f(r * x, r * y); + } + glEnd(); + } + break; + } + case GLU_POINT: + { + int s; + glBegin(GL_POINTS); + for (s = 0; s < slices; s++) { + float a = s * da; + float x = sin(a); + float y = cos(a); + int l; + for (l = 0; l <= loops; l++) { + float r = innerRadius * l * dr; + glVertex2f(r * x, r * y); + } + } + glEnd(); + break; + } + case GLU_SILHOUETTE: + { + if (innerRadius != 0.0) { + float a; + glBegin(GL_LINE_LOOP); + for (a = 0.0f; a < 2.0 * PI; a += da) { + float x = innerRadius * sin(a); + float y = innerRadius * cos(a); + glVertex2f(x, y); + } + glEnd(); + } + { + float a; + glBegin(GL_LINE_LOOP); + for (a = 0; a < 2.0f * PI; a += da) { + float x = outerRadius * sin(a); + float y = outerRadius * cos(a); + glVertex2f(x, y); + } + glEnd(); + } + break; + } + default: + return; + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLU.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLU.java new file mode 100644 index 0000000..7268c5d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLU.java @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.opengl.Util; +import org.lwjgl.util.glu.tessellation.GLUtessellatorImpl; + +import static org.lwjgl.opengl.GL11.*; + +/** + * GLU.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class GLU { + static final float PI = (float)Math.PI; + + /* Errors: (return value 0 = no error) */ + public static final int GLU_INVALID_ENUM = 100900; + public static final int GLU_INVALID_VALUE = 100901; + public static final int GLU_OUT_OF_MEMORY = 100902; + public static final int GLU_INCOMPATIBLE_GL_VERSION = 100903; + + /* StringName */ + public static final int GLU_VERSION = 100800; + public static final int GLU_EXTENSIONS = 100801; + + /* Boolean */ + public static final boolean GLU_TRUE = true; + public static final boolean GLU_FALSE = false; + + + /**** Quadric constants ****/ + + /* QuadricNormal */ + public static final int GLU_SMOOTH = 100000; + public static final int GLU_FLAT = 100001; + public static final int GLU_NONE = 100002; + + /* QuadricDrawStyle */ + public static final int GLU_POINT = 100010; + public static final int GLU_LINE = 100011; + public static final int GLU_FILL = 100012; + public static final int GLU_SILHOUETTE = 100013; + + /* QuadricOrientation */ + public static final int GLU_OUTSIDE = 100020; + public static final int GLU_INSIDE = 100021; + + /* Callback types: */ + /* ERROR = 100103 */ + + + /**** Tesselation constants ****/ + + public static final double GLU_TESS_MAX_COORD = 1.0e150; + public static final double TESS_MAX_COORD = 1.0e150; + + /* TessProperty */ + public static final int GLU_TESS_WINDING_RULE = 100140; + public static final int GLU_TESS_BOUNDARY_ONLY = 100141; + public static final int GLU_TESS_TOLERANCE = 100142; + + /* TessWinding */ + public static final int GLU_TESS_WINDING_ODD = 100130; + public static final int GLU_TESS_WINDING_NONZERO = 100131; + public static final int GLU_TESS_WINDING_POSITIVE = 100132; + public static final int GLU_TESS_WINDING_NEGATIVE = 100133; + public static final int GLU_TESS_WINDING_ABS_GEQ_TWO = 100134; + + /* TessCallback */ + public static final int GLU_TESS_BEGIN = 100100; /* void (CALLBACK*)(GLenum type) */ + public static final int GLU_TESS_VERTEX = 100101; /* void (CALLBACK*)(void *data) */ + public static final int GLU_TESS_END = 100102; /* void (CALLBACK*)(void) */ + public static final int GLU_TESS_ERROR = 100103; /* void (CALLBACK*)(GLenum errno) */ + public static final int GLU_TESS_EDGE_FLAG = 100104; /* void (CALLBACK*)(GLboolean boundaryEdge) */ + public static final int GLU_TESS_COMBINE = 100105; /* void (CALLBACK*)(GLdouble coords[3], + void *data[4], + GLfloat weight[4], + void **dataOut) */ + public static final int GLU_TESS_BEGIN_DATA = 100106; /* void (CALLBACK*)(GLenum type, + void *polygon_data) */ + public static final int GLU_TESS_VERTEX_DATA = 100107; /* void (CALLBACK*)(void *data, + void *polygon_data) */ + public static final int GLU_TESS_END_DATA = 100108; /* void (CALLBACK*)(void *polygon_data) */ + public static final int GLU_TESS_ERROR_DATA = 100109; /* void (CALLBACK*)(GLenum errno, + void *polygon_data) */ + public static final int GLU_TESS_EDGE_FLAG_DATA = 100110; /* void (CALLBACK*)(GLboolean boundaryEdge, + void *polygon_data) */ + public static final int GLU_TESS_COMBINE_DATA = 100111; /* void (CALLBACK*)(GLdouble coords[3], + void *data[4], + GLfloat weight[4], + void **dataOut, + void *polygon_data) */ + + /* TessError */ + public static final int GLU_TESS_ERROR1 = 100151; + public static final int GLU_TESS_ERROR2 = 100152; + public static final int GLU_TESS_ERROR3 = 100153; + public static final int GLU_TESS_ERROR4 = 100154; + public static final int GLU_TESS_ERROR5 = 100155; + public static final int GLU_TESS_ERROR6 = 100156; + public static final int GLU_TESS_ERROR7 = 100157; + public static final int GLU_TESS_ERROR8 = 100158; + + public static final int GLU_TESS_MISSING_BEGIN_POLYGON = GLU_TESS_ERROR1; + public static final int GLU_TESS_MISSING_BEGIN_CONTOUR = GLU_TESS_ERROR2; + public static final int GLU_TESS_MISSING_END_POLYGON = GLU_TESS_ERROR3; + public static final int GLU_TESS_MISSING_END_CONTOUR = GLU_TESS_ERROR4; + public static final int GLU_TESS_COORD_TOO_LARGE = GLU_TESS_ERROR5; + public static final int GLU_TESS_NEED_COMBINE_CALLBACK = GLU_TESS_ERROR6; + + /**** NURBS constants ****/ + + /* NurbsProperty */ + public static final int GLU_AUTO_LOAD_MATRIX = 100200; + public static final int GLU_CULLING = 100201; + public static final int GLU_SAMPLING_TOLERANCE = 100203; + public static final int GLU_DISPLAY_MODE = 100204; + public static final int GLU_PARAMETRIC_TOLERANCE = 100202; + public static final int GLU_SAMPLING_METHOD = 100205; + public static final int GLU_U_STEP = 100206; + public static final int GLU_V_STEP = 100207; + + /* NurbsSampling */ + public static final int GLU_PATH_LENGTH = 100215; + public static final int GLU_PARAMETRIC_ERROR = 100216; + public static final int GLU_DOMAIN_DISTANCE = 100217; + + + /* NurbsTrim */ + public static final int GLU_MAP1_TRIM_2 = 100210; + public static final int GLU_MAP1_TRIM_3 = 100211; + + /* NurbsDisplay */ + /* FILL = 100012 */ + public static final int GLU_OUTLINE_POLYGON = 100240; + public static final int GLU_OUTLINE_PATCH = 100241; + + /* NurbsCallback */ + /* ERROR = 100103 */ + + /* NurbsErrors */ + public static final int GLU_NURBS_ERROR1 = 100251; + public static final int GLU_NURBS_ERROR2 = 100252; + public static final int GLU_NURBS_ERROR3 = 100253; + public static final int GLU_NURBS_ERROR4 = 100254; + public static final int GLU_NURBS_ERROR5 = 100255; + public static final int GLU_NURBS_ERROR6 = 100256; + public static final int GLU_NURBS_ERROR7 = 100257; + public static final int GLU_NURBS_ERROR8 = 100258; + public static final int GLU_NURBS_ERROR9 = 100259; + public static final int GLU_NURBS_ERROR10 = 100260; + public static final int GLU_NURBS_ERROR11 = 100261; + public static final int GLU_NURBS_ERROR12 = 100262; + public static final int GLU_NURBS_ERROR13 = 100263; + public static final int GLU_NURBS_ERROR14 = 100264; + public static final int GLU_NURBS_ERROR15 = 100265; + public static final int GLU_NURBS_ERROR16 = 100266; + public static final int GLU_NURBS_ERROR17 = 100267; + public static final int GLU_NURBS_ERROR18 = 100268; + public static final int GLU_NURBS_ERROR19 = 100269; + public static final int GLU_NURBS_ERROR20 = 100270; + public static final int GLU_NURBS_ERROR21 = 100271; + public static final int GLU_NURBS_ERROR22 = 100272; + public static final int GLU_NURBS_ERROR23 = 100273; + public static final int GLU_NURBS_ERROR24 = 100274; + public static final int GLU_NURBS_ERROR25 = 100275; + public static final int GLU_NURBS_ERROR26 = 100276; + public static final int GLU_NURBS_ERROR27 = 100277; + public static final int GLU_NURBS_ERROR28 = 100278; + public static final int GLU_NURBS_ERROR29 = 100279; + public static final int GLU_NURBS_ERROR30 = 100280; + public static final int GLU_NURBS_ERROR31 = 100281; + public static final int GLU_NURBS_ERROR32 = 100282; + public static final int GLU_NURBS_ERROR33 = 100283; + public static final int GLU_NURBS_ERROR34 = 100284; + public static final int GLU_NURBS_ERROR35 = 100285; + public static final int GLU_NURBS_ERROR36 = 100286; + public static final int GLU_NURBS_ERROR37 = 100287; + + /* Contours types -- obsolete! */ + public static final int GLU_CW = 100120; + public static final int GLU_CCW = 100121; + public static final int GLU_INTERIOR = 100122; + public static final int GLU_EXTERIOR = 100123; + public static final int GLU_UNKNOWN = 100124; + + /* Names without "TESS_" prefix */ + public static final int GLU_BEGIN = GLU_TESS_BEGIN; + public static final int GLU_VERTEX = GLU_TESS_VERTEX; + public static final int GLU_END = GLU_TESS_END; + public static final int GLU_ERROR = GLU_TESS_ERROR; + public static final int GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG; + + /** + * Method gluLookAt + * @param eyex + * @param eyey + * @param eyez + * @param centerx + * @param centery + * @param centerz + * @param upx + * @param upy + * @param upz + */ + public static void gluLookAt( + float eyex, + float eyey, + float eyez, + float centerx, + float centery, + float centerz, + float upx, + float upy, + float upz) { + + Project.gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz); + } + + /** + * Method gluOrtho2D + * @param left + * @param right + * @param bottom + * @param top + */ + public static void gluOrtho2D( + float left, + float right, + float bottom, + float top) { + + glOrtho(left, right, bottom, top, -1.0, 1.0); + } + + /** + * Method gluPerspective + * @param fovy + * @param aspect + * @param zNear + * @param zFar + */ + public static void gluPerspective( + float fovy, + float aspect, + float zNear, + float zFar) { + + Project.gluPerspective(fovy, aspect, zNear, zFar); + } + + /** + * Method gluProject + * @param objx + * @param objy + * @param objz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param win_pos + */ + public static boolean gluProject(float objx, float objy, float objz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer win_pos) + { + return Project.gluProject(objx, objy, objz, modelMatrix, projMatrix, viewport, win_pos); + } + + /** + * Method gluUnproject + * @param winx + * @param winy + * @param winz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param obj_pos + */ + public static boolean gluUnProject(float winx, float winy, float winz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer obj_pos) + { + return Project.gluUnProject(winx, winy, winz, modelMatrix, projMatrix, viewport, obj_pos); + } + + /** + * Method gluPickMatrix + * @param x + * @param y + * @param width + * @param height + * @param viewport + */ + public static void gluPickMatrix( + float x, + float y, + float width, + float height, + IntBuffer viewport) { + + Project.gluPickMatrix(x, y, width, height, viewport); + } + + /** + * Method gluGetString. + * @param name + * @return String + */ + public static String gluGetString(int name) { + return Registry.gluGetString(name); + } + + /** + * Method gluCheckExtension. + * @param extName + * @param extString + * @return boolean + */ + public static boolean gluCheckExtension(String extName, String extString) { + return Registry.gluCheckExtension(extName, extString); + } + + /** + * Method gluBuild2DMipmaps + * @param target + * @param components + * @param width + * @param height + * @param format + * @param type + * @param data + * @return int + */ + public static int gluBuild2DMipmaps( + int target, + int components, + int width, + int height, + int format, + int type, + ByteBuffer data) { + + return MipMap.gluBuild2DMipmaps(target, components, width, height, format, type, data); + } + + /** + * Method gluScaleImage. + * @param format + * @param widthIn + * @param heightIn + * @param typeIn + * @param dataIn + * @param widthOut + * @param heightOut + * @param typeOut + * @param dataOut + * @return int + */ + public static int gluScaleImage( + int format, + int widthIn, + int heightIn, + int typeIn, + ByteBuffer dataIn, + int widthOut, + int heightOut, + int typeOut, + ByteBuffer dataOut) { + + return MipMap.gluScaleImage(format, widthIn, heightIn, typeIn, dataIn, widthOut, heightOut, typeOut, dataOut); + } + + public static String gluErrorString(int error_code) { + switch (error_code) { + case GLU_INVALID_ENUM: + return "Invalid enum (glu)"; + case GLU_INVALID_VALUE: + return "Invalid value (glu)"; + case GLU_OUT_OF_MEMORY: + return "Out of memory (glu)"; + default: + return Util.translateGLErrorString(error_code); + } + } + + public static GLUtessellator gluNewTess() { + return new GLUtessellatorImpl(); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellator.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellator.java new file mode 100644 index 0000000..521ee04 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellator.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.lwjgl.util.glu; + +public interface GLUtessellator { + + void gluDeleteTess(); + + void gluTessProperty(int which, double value); + + /* Returns tessellator property */ + void gluGetTessProperty(int which, double[] value, + int value_offset); /* gluGetTessProperty() */ + + void gluTessNormal(double x, double y, double z); + + void gluTessCallback(int which, + GLUtessellatorCallback aCallback); + + void gluTessVertex(double[] coords, int coords_offset, + Object vertexData); + + void gluTessBeginPolygon(Object data); + + void gluTessBeginContour(); + + void gluTessEndContour(); + + void gluTessEndPolygon(); + + /*******************************************************/ + + /* Obsolete calls -- for backward compatibility */ + + void gluBeginPolygon(); + + /*ARGSUSED*/ + void gluNextContour(int type); + + void gluEndPolygon(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallback.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallback.java new file mode 100644 index 0000000..1a008e7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallback.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu; + +/** + * <b>GLUtessellatorCallback</b> interface provides methods that the user will + * override to define the callbacks for a tessellation object. + * + * @author Eric Veach, July 1994 + * @author Java Port: Pepijn Van Eeckhoudt, July 2003 + * @author Java Port: Nathan Parker Burg, August 2003 + */ +public interface GLUtessellatorCallback { + /** + * The <b>begin</b> callback method is invoked like + * {@link javax.media.opengl.GL#glBegin glBegin} to indicate the start of a + * (triangle) primitive. The method takes a single argument of type int. If + * the <b>GLU_TESS_BOUNDARY_ONLY</b> property is set to <b>GL_FALSE</b>, then + * the argument is set to either <b>GL_TRIANGLE_FAN</b>, + * <b>GL_TRIANGLE_STRIP</b>, or <b>GL_TRIANGLES</b>. If the + * <b>GLU_TESS_BOUNDARY_ONLY</b> property is set to <b>GL_TRUE</b>, then the + * argument will be set to <b>GL_LINE_LOOP</b>. + * + * @param type + * Specifics the type of begin/end pair being defined. The following + * values are valid: <b>GL_TRIANGLE_FAN</b>, <b>GL_TRIANGLE_STRIP</b>, + * <b>GL_TRIANGLES</b> or <b>GL_LINE_LOOP</b>. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #end end + * @see #begin begin + */ + void begin(int type); + + /** + * The same as the {@link #begin begin} callback method except that + * it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param type + * Specifics the type of begin/end pair being defined. The following + * values are valid: <b>GL_TRIANGLE_FAN</b>, <b>GL_TRIANGLE_STRIP</b>, + * <b>GL_TRIANGLES</b> or <b>GL_LINE_LOOP</b>. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #endData endData + * @see #begin begin + */ + void beginData(int type, Object polygonData); + + + /** + * The <b>edgeFlag</b> callback method is similar to + * {@link javax.media.opengl.GL#glEdgeFlag glEdgeFlag}. The method takes + * a single boolean boundaryEdge that indicates which edges lie on the + * polygon boundary. If the boundaryEdge is <b>GL_TRUE</b>, then each vertex + * that follows begins an edge that lies on the polygon boundary, that is, + * an edge that separates an interior region from an exterior one. If the + * boundaryEdge is <b>GL_FALSE</b>, then each vertex that follows begins an + * edge that lies in the polygon interior. The edge flag callback (if + * defined) is invoked before the first vertex callback.<P> + * + * Since triangle fans and triangle strips do not support edge flags, the + * begin callback is not called with <b>GL_TRIANGLE_FAN</b> or + * <b>GL_TRIANGLE_STRIP</b> if a non-null edge flag callback is provided. + * (If the callback is initialized to null, there is no impact on + * performance). Instead, the fans and strips are converted to independent + * triangles. + * + * @param boundaryEdge + * Specifics which edges lie on the polygon boundary. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #edgeFlagData edgeFlagData + */ + void edgeFlag(boolean boundaryEdge); + + + /** + * The same as the {@link #edgeFlag edgeFlage} callback method + * except that it takes an additional reference argument. This + * reference is identical to the opaque reference provided when + * {@link GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param boundaryEdge + * Specifics which edges lie on the polygon boundary. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #edgeFlag edgeFlag + */ + void edgeFlagData(boolean boundaryEdge, Object polygonData); + + + /** + * The <b>vertex</b> callback method is invoked between the {@link + * #begin begin} and {@link #end end} callback methods. It is + * similar to {@link javax.media.opengl.GL#glVertex3f glVertex3f}, + * and it defines the vertices of the triangles created by the + * tessellation process. The method takes a reference as its only + * argument. This reference is identical to the opaque reference + * provided by the user when the vertex was described (see {@link + * GLU#gluTessVertex gluTessVertex}). + * + * @param vertexData + * Specifics a reference to the vertices of the triangles created + * byt the tessellatin process. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #vertexData vertexData + */ + void vertex(Object vertexData); + + + /** + * The same as the {@link #vertex vertex} callback method except + * that it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param vertexData + * Specifics a reference to the vertices of the triangles created + * byt the tessellatin process. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #vertex vertex + */ + void vertexData(Object vertexData, Object polygonData); + + + /** + * The end callback serves the same purpose as + * {@link javax.media.opengl.GL#glEnd glEnd}. It indicates the end of a + * primitive and it takes no arguments. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #begin begin + * @see #endData endData + */ + void end(); + + + /** + * The same as the {@link #end end} callback method except that it + * takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #beginData beginData + * @see #end end + */ + void endData(Object polygonData); + + + /** + * The <b>combine</b> callback method is called to create a new vertex when + * the tessellation detects an intersection, or wishes to merge features. The + * method takes four arguments: an array of three elements each of type + * double, an array of four references, an array of four elements each of + * type float, and a reference to a reference.<P> + * + * The vertex is defined as a linear combination of up to four existing + * vertices, stored in <i>data</i>. The coefficients of the linear combination + * are given by <i>weight</i>; these weights always add up to 1. All vertex + * pointers are valid even when some of the weights are 0. <i>coords</i> gives + * the location of the new vertex.<P> + * + * The user must allocate another vertex, interpolate parameters using + * <i>data</i> and <i>weight</i>, and return the new vertex pointer in + * <i>outData</i>. This handle is supplied during rendering callbacks. The + * user is responsible for freeing the memory some time after + * {@link GLU#gluTessEndPolygon gluTessEndPolygon} is + * called.<P> + * + * For example, if the polygon lies in an arbitrary plane in 3-space, and a + * color is associated with each vertex, the <b>GLU_TESS_COMBINE</b> + * callback might look like this: + * </UL> + * <PRE> + * void myCombine(double[] coords, Object[] data, + * float[] weight, Object[] outData) + * { + * MyVertex newVertex = new MyVertex(); + * + * newVertex.x = coords[0]; + * newVertex.y = coords[1]; + * newVertex.z = coords[2]; + * newVertex.r = weight[0]*data[0].r + + * weight[1]*data[1].r + + * weight[2]*data[2].r + + * weight[3]*data[3].r; + * newVertex.g = weight[0]*data[0].g + + * weight[1]*data[1].g + + * weight[2]*data[2].g + + * weight[3]*data[3].g; + * newVertex.b = weight[0]*data[0].b + + * weight[1]*data[1].b + + * weight[2]*data[2].b + + * weight[3]*data[3].b; + * newVertex.a = weight[0]*data[0].a + + * weight[1]*data[1].a + + * weight[2]*data[2].a + + * weight[3]*data[3].a; + * outData = newVertex; + * }</PRE> + * + * @param coords + * Specifics the location of the new vertex. + * @param data + * Specifics the vertices used to create the new vertex. + * @param weight + * Specifics the weights used to create the new vertex. + * @param outData + * Reference user the put the coodinates of the new vertex. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #combineData combineData + */ + void combine(double[] coords, Object[] data, + float[] weight, Object[] outData); + + + /** + * The same as the {@link #combine combine} callback method except + * that it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param coords + * Specifics the location of the new vertex. + * @param data + * Specifics the vertices used to create the new vertex. + * @param weight + * Specifics the weights used to create the new vertex. + * @param outData + * Reference user the put the coodinates of the new vertex. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #combine combine + */ + void combineData(double[] coords, Object[] data, + float[] weight, Object[] outData, + Object polygonData); + + + /** + * The <b>error</b> callback method is called when an error is encountered. + * The one argument is of type int; it indicates the specific error that + * occurred and will be set to one of <b>GLU_TESS_MISSING_BEGIN_POLYGON</b>, + * <b>GLU_TESS_MISSING_END_POLYGON</b>, <b>GLU_TESS_MISSING_BEGIN_CONTOUR</b>, + * <b>GLU_TESS_MISSING_END_CONTOUR</b>, <b>GLU_TESS_COORD_TOO_LARGE</b>, + * <b>GLU_TESS_NEED_COMBINE_CALLBACK</b> or <b>GLU_OUT_OF_MEMORY</b>. + * Character strings describing these errors can be retrieved with the + * {@link GLU#gluErrorString gluErrorString} call.<P> + * + * The GLU library will recover from the first four errors by inserting the + * missing call(s). <b>GLU_TESS_COORD_TOO_LARGE</b> indicates that some + * vertex coordinate exceeded the predefined constant + * <b>GLU_TESS_MAX_COORD</b> in absolute value, and that the value has been + * clamped. (Coordinate values must be small enough so that two can be + * multiplied together without overflow.) + * <b>GLU_TESS_NEED_COMBINE_CALLBACK</b> indicates that the tessellation + * detected an intersection between two edges in the input data, and the + * <b>GLU_TESS_COMBINE</b> or <b>GLU_TESS_COMBINE_DATA</b> callback was not + * provided. No output is generated. <b>GLU_OUT_OF_MEMORY</b> indicates that + * there is not enough memory so no output is generated. + * + * @param errnum + * Specifics the error number code. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #errorData errorData + */ + void error(int errnum); + + + /** + * The same as the {@link #error error} callback method except that + * it takes an additional reference argument. This reference is + * identical to the opaque reference provided when {@link + * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. + * + * @param errnum + * Specifics the error number code. + * @param polygonData + * Specifics a reference to user-defined data. + * + * @see GLU#gluTessCallback gluTessCallback + * @see #error error + */ + void errorData(int errnum, Object polygonData); + + //void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh); +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java new file mode 100644 index 0000000..7ca0044 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/GLUtessellatorCallbackAdapter.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu; + +/** + * The <b>GLUtessellatorCallbackAdapter</b> provides a default implementation of + * {@link GLUtessellatorCallback GLUtessellatorCallback} + * with empty callback methods. This class can be extended to provide user + * defined callback methods. + * + * @author Eric Veach, July 1994 + * @author Java Port: Pepijn Van Eechhoudt, July 2003 + * @author Java Port: Nathan Parker Burg, August 2003 + */ + +public class GLUtessellatorCallbackAdapter implements GLUtessellatorCallback { + public void begin(int type) {} + public void edgeFlag(boolean boundaryEdge) {} + public void vertex(Object vertexData) {} + public void end() {} +// public void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh) {} + public void error(int errnum) {} + public void combine(double[] coords, Object[] data, + float[] weight, Object[] outData) {} + public void beginData(int type, Object polygonData) {} + public void edgeFlagData(boolean boundaryEdge, + Object polygonData) {} + public void vertexData(Object vertexData, Object polygonData) {} + public void endData(Object polygonData) {} + public void errorData(int errnum, Object polygonData) {} + public void combineData(double[] coords, Object[] data, + float[] weight, Object[] outData, + Object polygonData) {} +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/MipMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/MipMap.java new file mode 100644 index 0000000..b0fe3db --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/MipMap.java @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import java.nio.ByteBuffer; + +import org.lwjgl.BufferUtils; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * MipMap.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +public class MipMap extends Util { + + /** + * Method gluBuild2DMipmaps + * + * @param target + * @param components + * @param width + * @param height + * @param format + * @param type + * @param data + * @return int + */ + public static int gluBuild2DMipmaps(final int target, + final int components, final int width, final int height, + final int format, final int type, final ByteBuffer data) { + if ( width < 1 || height < 1 ) return GLU_INVALID_VALUE; + + final int bpp = bytesPerPixel(format, type); + if ( bpp == 0 ) + return GLU_INVALID_ENUM; + + final int maxSize = glGetIntegerv(GL_MAX_TEXTURE_SIZE); + + int w = nearestPower(width); + if ( w > maxSize ) + w = maxSize; + + int h = nearestPower(height); + if ( h > maxSize ) + h = maxSize; + + // Get current glPixelStore state + PixelStoreState pss = new PixelStoreState(); + + // set pixel packing + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + + ByteBuffer image; + int retVal = 0; + boolean done = false; + + if ( w != width || h != height ) { + // must rescale image to get "top" mipmap texture image + image = BufferUtils.createByteBuffer((w + 4) * h * bpp); + int error = gluScaleImage(format, width, height, type, data, w, h, type, image); + if ( error != 0 ) { + retVal = error; + done = true; + } + + /* set pixel unpacking */ + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + } else { + image = data; + } + + ByteBuffer bufferA = null; + ByteBuffer bufferB = null; + + int level = 0; + while ( !done ) { + if (image != data) { + /* set pixel unpacking */ + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + } + + glTexImage2D(target, level, components, w, h, 0, format, type, image); + + if ( w == 1 && h == 1 ) + break; + + final int newW = (w < 2) ? 1 : w >> 1; + final int newH = (h < 2) ? 1 : h >> 1; + + final ByteBuffer newImage; + + if ( bufferA == null ) + newImage = (bufferA = BufferUtils.createByteBuffer((newW + 4) * newH * bpp)); + else if ( bufferB == null ) + newImage = (bufferB = BufferUtils.createByteBuffer((newW + 4) * newH * bpp)); + else + newImage = bufferB; + + int error = gluScaleImage(format, w, h, type, image, newW, newH, type, newImage); + if ( error != 0 ) { + retVal = error; + done = true; + } + + image = newImage; + if ( bufferB != null ) + bufferB = bufferA; + + w = newW; + h = newH; + level++; + } + + // Restore original glPixelStore state + pss.save(); + + return retVal; + } + + /** + * Method gluScaleImage. + * @param format + * @param widthIn + * @param heightIn + * @param typein + * @param dataIn + * @param widthOut + * @param heightOut + * @param typeOut + * @param dataOut + * @return int + */ + public static int gluScaleImage(int format, + int widthIn, int heightIn, int typein, ByteBuffer dataIn, + int widthOut, int heightOut, int typeOut, ByteBuffer dataOut) { + + final int components = compPerPix(format); + if ( components == -1 ) + return GLU_INVALID_ENUM; + + int i, j, k; + float[] tempIn, tempOut; + float sx, sy; + int sizein, sizeout; + int rowstride, rowlen; + + // temp image data + tempIn = new float[widthIn * heightIn * components]; + tempOut = new float[widthOut * heightOut * components]; + + // Determine bytes per input type + switch ( typein ) { + case GL_UNSIGNED_BYTE: + sizein = 1; + break; + case GL_FLOAT: + sizein = 4; + break; + default: + return GL_INVALID_ENUM; + } + + // Determine bytes per output type + switch ( typeOut ) { + case GL_UNSIGNED_BYTE: + sizeout = 1; + break; + case GL_FLOAT: + sizeout = 4; + break; + default: + return GL_INVALID_ENUM; + } + + // Get glPixelStore state + PixelStoreState pss = new PixelStoreState(); + + //Unpack the pixel data and convert to floating point + if ( pss.unpackRowLength > 0 ) + rowlen = pss.unpackRowLength; + else + rowlen = widthIn; + + if ( sizein >= pss.unpackAlignment ) + rowstride = components * rowlen; + else + rowstride = pss.unpackAlignment / sizein * ceil(components * rowlen * sizein, pss.unpackAlignment); + + switch ( typein ) { + case GL_UNSIGNED_BYTE: + k = 0; + dataIn.rewind(); + for ( i = 0; i < heightIn; i++ ) { + int ubptr = i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components; + for ( j = 0; j < widthIn * components; j++ ) { + tempIn[k++] = dataIn.get(ubptr++) & 0xff; + } + } + break; + case GL_FLOAT: + k = 0; + dataIn.rewind(); + for ( i = 0; i < heightIn; i++ ) + { + int fptr = 4 * (i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components); + for ( j = 0; j < widthIn * components; j++ ) + { + tempIn[k++] = dataIn.getFloat(fptr); + fptr += 4; + } + } + break; + default: + return GLU_INVALID_ENUM; + } + + // Do scaling + sx = (float)widthIn / (float)widthOut; + sy = (float)heightIn / (float)heightOut; + + float[] c = new float[components]; + int src, dst; + + for ( int iy = 0; iy < heightOut; iy++ ) { + for ( int ix = 0; ix < widthOut; ix++ ) { + int x0 = (int)(ix * sx); + int x1 = (int)((ix + 1) * sx); + int y0 = (int)(iy * sy); + int y1 = (int)((iy + 1) * sy); + + int readPix = 0; + + // reset weighted pixel + for ( int ic = 0; ic < components; ic++ ) { + c[ic] = 0; + } + + // create weighted pixel + for ( int ix0 = x0; ix0 < x1; ix0++ ) { + for ( int iy0 = y0; iy0 < y1; iy0++ ) { + + src = (iy0 * widthIn + ix0) * components; + + for ( int ic = 0; ic < components; ic++ ) { + c[ic] += tempIn[src + ic]; + } + + readPix++; + } + } + + // store weighted pixel + dst = (iy * widthOut + ix) * components; + + if ( readPix == 0 ) { + // Image is sized up, caused by non power of two texture as input + src = (y0 * widthIn + x0) * components; + for ( int ic = 0; ic < components; ic++ ) { + tempOut[dst++] = tempIn[src + ic]; + } + } else { + // sized down + for ( k = 0; k < components; k++ ) { + tempOut[dst++] = c[k] / readPix; + } + } + } + } + + + // Convert temp output + if ( pss.packRowLength > 0 ) + rowlen = pss.packRowLength; + else + rowlen = widthOut; + + if ( sizeout >= pss.packAlignment ) + rowstride = components * rowlen; + else + rowstride = pss.packAlignment / sizeout * ceil(components * rowlen * sizeout, pss.packAlignment); + + switch ( typeOut ) { + case GL_UNSIGNED_BYTE: + k = 0; + for ( i = 0; i < heightOut; i++ ) { + int ubptr = i * rowstride + pss.packSkipRows * rowstride + pss.packSkipPixels * components; + + for ( j = 0; j < widthOut * components; j++ ) { + dataOut.put(ubptr++, (byte)tempOut[k++]); + } + } + break; + case GL_FLOAT: + k = 0; + for ( i = 0; i < heightOut; i++ ) { + int fptr = 4 * (i * rowstride + pss.unpackSkipRows * rowstride + pss.unpackSkipPixels * components); + + for ( j = 0; j < widthOut * components; j++ ) { + dataOut.putFloat(fptr, tempOut[k++]); + fptr += 4; + } + } + break; + default: + return GLU_INVALID_ENUM; + } + + return 0; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PartialDisk.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PartialDisk.java new file mode 100644 index 0000000..ce06a47 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PartialDisk.java @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * PartialDisk.java + * + * + * Created 23-dec-2003 + * + * @author Erik Duijs + */ +public class PartialDisk extends Quadric { + + private static final int CACHE_SIZE = 240; + + /** + * Constructor for PartialDisk. + */ + public PartialDisk() { + super(); + } + + /** + * renders a partial disk on the z=0 plane. A partial disk is similar to a + * full disk, except that only the subset of the disk from startAngle + * through startAngle + sweepAngle is included (where 0 degrees is along + * the +y axis, 90 degrees along the +x axis, 180 along the -y axis, and + * 270 along the -x axis). + * + * The partial disk has a radius of outerRadius, and contains a concentric + * circular hole with a radius of innerRadius. If innerRadius is zero, then + * no hole is generated. The partial disk is subdivided around the z axis + * into slices (like pizza slices), and also about the z axis into rings + * (as specified by slices and loops, respectively). + * + * With respect to orientation, the +z side of the partial disk is + * considered to be outside (see gluQuadricOrientation). This means that if + * the orientation is set to GLU.GLU_OUTSIDE, then any normals generated point + * along the +z axis. Otherwise, they point along the -z axis. + * + * If texturing is turned on (with gluQuadricTexture), texture coordinates + * are generated linearly such that where r=outerRadius, the value at (r, 0, 0) + * is (1, 0.5), at (0, r, 0) it is (0.5, 1), at (-r, 0, 0) it is (0, 0.5), + * and at (0, -r, 0) it is (0.5, 0). + */ + public void draw( + float innerRadius, + float outerRadius, + int slices, + int loops, + float startAngle, + float sweepAngle) { + + int i, j; + float[] sinCache = new float[CACHE_SIZE]; + float[] cosCache = new float[CACHE_SIZE]; + float angle; + float sintemp, costemp; + float deltaRadius; + float radiusLow, radiusHigh; + float texLow = 0, texHigh = 0; + float angleOffset; + int slices2; + int finish; + + if (slices >= CACHE_SIZE) + slices = CACHE_SIZE - 1; + if (slices < 2 + || loops < 1 + || outerRadius <= 0.0f + || innerRadius < 0.0f + || innerRadius > outerRadius) { + //gluQuadricError(qobj, GLU.GLU_INVALID_VALUE); + System.err.println("PartialDisk: GLU_INVALID_VALUE"); + return; + } + + if (sweepAngle < -360.0f) + sweepAngle = 360.0f; + if (sweepAngle > 360.0f) + sweepAngle = 360.0f; + if (sweepAngle < 0) { + startAngle += sweepAngle; + sweepAngle = -sweepAngle; + } + + if (sweepAngle == 360.0f) { + slices2 = slices; + } else { + slices2 = slices + 1; + } + + /* Compute length (needed for normal calculations) */ + deltaRadius = outerRadius - innerRadius; + + /* Cache is the vertex locations cache */ + + angleOffset = startAngle / 180.0f * PI; + for (i = 0; i <= slices; i++) { + angle = angleOffset + ((PI * sweepAngle) / 180.0f) * i / slices; + sinCache[i] = sin(angle); + cosCache[i] = cos(angle); + } + + if (sweepAngle == 360.0f) { + sinCache[slices] = sinCache[0]; + cosCache[slices] = cosCache[0]; + } + + switch (super.normals) { + case GLU_FLAT : + case GLU_SMOOTH : + if (super.orientation == GLU_OUTSIDE) { + glNormal3f(0.0f, 0.0f, 1.0f); + } else { + glNormal3f(0.0f, 0.0f, -1.0f); + } + break; + default : + case GLU_NONE : + break; + } + + switch (super.drawStyle) { + case GLU_FILL : + if (innerRadius == .0f) { + finish = loops - 1; + /* Triangle strip for inner polygons */ + glBegin(GL_TRIANGLE_FAN); + if (super.textureFlag) { + glTexCoord2f(0.5f, 0.5f); + } + glVertex3f(0.0f, 0.0f, 0.0f); + radiusLow = outerRadius - deltaRadius * ((float) (loops - 1) / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + if (super.orientation == GLU_OUTSIDE) { + for (i = slices; i >= 0; i--) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } else { + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } + glEnd(); + } else { + finish = loops; + } + for (j = 0; j < finish; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + radiusHigh = outerRadius - deltaRadius * ((float) (j + 1) / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + texHigh = radiusHigh / outerRadius / 2; + } + + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= slices; i++) { + if (super.orientation == GLU_OUTSIDE) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + + if (super.textureFlag) { + glTexCoord2f( + texHigh * sinCache[i] + 0.5f, + texHigh * cosCache[i] + 0.5f); + } + glVertex3f( + radiusHigh * sinCache[i], + radiusHigh * cosCache[i], + 0.0f); + } else { + if (super.textureFlag) { + glTexCoord2f( + texHigh * sinCache[i] + 0.5f, + texHigh * cosCache[i] + 0.5f); + } + glVertex3f( + radiusHigh * sinCache[i], + radiusHigh * cosCache[i], + 0.0f); + + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + } + glEnd(); + } + break; + case GLU_POINT : + glBegin(GL_POINTS); + for (i = 0; i < slices2; i++) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + } + glEnd(); + break; + case GLU_LINE : + if (innerRadius == outerRadius) { + glBegin(GL_LINE_STRIP); + + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f); + } + glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f); + } + glEnd(); + break; + } + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + glBegin(GL_LINE_STRIP); + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + glEnd(); + } + for (i = 0; i < slices2; i++) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + glBegin(GL_LINE_STRIP); + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + glEnd(); + } + break; + case GLU_SILHOUETTE : + if (sweepAngle < 360.0f) { + for (i = 0; i <= slices; i += slices) { + sintemp = sinCache[i]; + costemp = cosCache[i]; + glBegin(GL_LINE_STRIP); + for (j = 0; j <= loops; j++) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + } + glEnd(); + } + } + for (j = 0; j <= loops; j += loops) { + radiusLow = outerRadius - deltaRadius * ((float) j / loops); + if (super.textureFlag) { + texLow = radiusLow / outerRadius / 2; + } + + glBegin(GL_LINE_STRIP); + for (i = 0; i <= slices; i++) { + if (super.textureFlag) { + glTexCoord2f( + texLow * sinCache[i] + 0.5f, + texLow * cosCache[i] + 0.5f); + } + glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + } + glEnd(); + if (innerRadius == outerRadius) + break; + } + break; + default : + break; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PixelStoreState.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PixelStoreState.java new file mode 100644 index 0000000..b7ed9a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/PixelStoreState.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; + +/** + * PixelStoreState.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +class PixelStoreState extends Util { + + public int unpackRowLength; + public int unpackAlignment; + public int unpackSkipRows; + public int unpackSkipPixels; + public int packRowLength; + public int packAlignment; + public int packSkipRows; + public int packSkipPixels; + + /** + * Constructor for PixelStoreState. + */ + PixelStoreState() { + super(); + load(); + } + + public void load() { + unpackRowLength = glGetIntegerv(GL_UNPACK_ROW_LENGTH); + unpackAlignment = glGetIntegerv(GL_UNPACK_ALIGNMENT); + unpackSkipRows = glGetIntegerv(GL_UNPACK_SKIP_ROWS); + unpackSkipPixels = glGetIntegerv(GL_UNPACK_SKIP_PIXELS); + packRowLength = glGetIntegerv(GL_PACK_ROW_LENGTH); + packAlignment = glGetIntegerv(GL_PACK_ALIGNMENT); + packSkipRows = glGetIntegerv(GL_PACK_SKIP_ROWS); + packSkipPixels = glGetIntegerv(GL_PACK_SKIP_PIXELS); + } + + public void save() { + glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength); + glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlignment); + glPixelStorei(GL_UNPACK_SKIP_ROWS, unpackSkipRows); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels); + glPixelStorei(GL_PACK_ROW_LENGTH, packRowLength); + glPixelStorei(GL_PACK_ALIGNMENT, packAlignment); + glPixelStorei(GL_PACK_SKIP_ROWS, packSkipRows); + glPixelStorei(GL_PACK_SKIP_PIXELS, packSkipPixels); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Project.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Project.java new file mode 100644 index 0000000..0ea0c54 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Project.java @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +import static org.lwjgl.opengl.GL11.*; + +/** + * Project.java + * <p/> + * <p/> + * Created 11-jan-2004 + * + * @author Erik Duijs + */ +public class Project extends Util { + + private static final float[] IDENTITY_MATRIX = + new float[] { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + private static final FloatBuffer matrix = BufferUtils.createFloatBuffer(16); + private static final FloatBuffer finalMatrix = BufferUtils.createFloatBuffer(16); + + private static final FloatBuffer tempMatrix = BufferUtils.createFloatBuffer(16); + private static final float[] in = new float[4]; + private static final float[] out = new float[4]; + + private static final float[] forward = new float[3]; + private static final float[] side = new float[3]; + private static final float[] up = new float[3]; + + /** + * Make matrix an identity matrix + */ + private static void __gluMakeIdentityf(FloatBuffer m) { + int oldPos = m.position(); + m.put(IDENTITY_MATRIX); + m.position(oldPos); + } + + /** + * Method __gluMultMatrixVecf + * + * @param finalMatrix + * @param in + * @param out + */ + private static void __gluMultMatrixVecf(FloatBuffer m, float[] in, float[] out) { + for (int i = 0; i < 4; i++) { + out[i] = + in[0] * m.get(m.position() + 0*4 + i) + + in[1] * m.get(m.position() + 1*4 + i) + + in[2] * m.get(m.position() + 2*4 + i) + + in[3] * m.get(m.position() + 3*4 + i); + + } + } + + /** + * @param src + * @param inverse + * + * @return + */ + private static boolean __gluInvertMatrixf(FloatBuffer src, FloatBuffer inverse) { + int i, j, k, swap; + float t; + FloatBuffer temp = Project.tempMatrix; + + + for (i = 0; i < 16; i++) { + temp.put(i, src.get(i + src.position())); + } + __gluMakeIdentityf(inverse); + + for (i = 0; i < 4; i++) { + /* + * * Look for largest element in column + */ + swap = i; + for (j = i + 1; j < 4; j++) { + /* + * if (fabs(temp[j][i]) > fabs(temp[i][i])) { swap = j; + */ + if (Math.abs(temp.get(j*4 + i)) > Math.abs(temp.get(i* 4 + i))) { + swap = j; + } + } + + if (swap != i) { + /* + * * Swap rows. + */ + for (k = 0; k < 4; k++) { + t = temp.get(i*4 + k); + temp.put(i*4 + k, temp.get(swap*4 + k)); + temp.put(swap*4 + k, t); + + t = inverse.get(i*4 + k); + inverse.put(i*4 + k, inverse.get(swap*4 + k)); + //inverse.put((i << 2) + k, inverse.get((swap << 2) + k)); + inverse.put(swap*4 + k, t); + //inverse.put((swap << 2) + k, t); + } + } + + if (temp.get(i*4 + i) == 0) { + /* + * * No non-zero pivot. The matrix is singular, which shouldn't * + * happen. This means the user gave us a bad matrix. + */ + return false; + } + + t = temp.get(i*4 + i); + for (k = 0; k < 4; k++) { + temp.put(i*4 + k, temp.get(i*4 + k)/t); + inverse.put(i*4 + k, inverse.get(i*4 + k)/t); + } + for (j = 0; j < 4; j++) { + if (j != i) { + t = temp.get(j*4 + i); + for (k = 0; k < 4; k++) { + temp.put(j*4 + k, temp.get(j*4 + k) - temp.get(i*4 + k) * t); + inverse.put(j*4 + k, inverse.get(j*4 + k) - inverse.get(i*4 + k) * t); + /*inverse.put( + (j << 2) + k, + inverse.get((j << 2) + k) - inverse.get((i << 2) + k) * t);*/ + } + } + } + } + return true; + } + + /** + * @param a + * @param b + * @param r + */ + private static void __gluMultMatricesf(FloatBuffer a, FloatBuffer b, FloatBuffer r) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + r.put(r.position() + i*4 + j, + a.get(a.position() + i*4 + 0) * b.get(b.position() + 0*4 + j) + a.get(a.position() + i*4 + 1) * b.get(b.position() + 1*4 + j) + a.get(a.position() + i*4 + 2) * b.get(b.position() + 2*4 + j) + a.get(a.position() + i*4 + 3) * b.get(b.position() + 3*4 + j)); + } + } + } + + /** + * Method gluPerspective. + * + * @param fovy + * @param aspect + * @param zNear + * @param zFar + */ + public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) { + float sine, cotangent, deltaZ; + float radians = fovy / 2 * GLU.PI / 180; + + deltaZ = zFar - zNear; + sine = (float) Math.sin(radians); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) { + return; + } + + cotangent = (float) Math.cos(radians) / sine; + + __gluMakeIdentityf(matrix); + + matrix.put(0 * 4 + 0, cotangent / aspect); + matrix.put(1 * 4 + 1, cotangent); + matrix.put(2 * 4 + 2, - (zFar + zNear) / deltaZ); + matrix.put(2 * 4 + 3, -1); + matrix.put(3 * 4 + 2, -2 * zNear * zFar / deltaZ); + matrix.put(3 * 4 + 3, 0); + + glMultMatrix(matrix); + } + + /** + * Method gluLookAt + * + * @param eyex + * @param eyey + * @param eyez + * @param centerx + * @param centery + * @param centerz + * @param upx + * @param upy + * @param upz + */ + public static void gluLookAt( + float eyex, + float eyey, + float eyez, + float centerx, + float centery, + float centerz, + float upx, + float upy, + float upz) { + float[] forward = Project.forward; + float[] side = Project.side; + float[] up = Project.up; + + forward[0] = centerx - eyex; + forward[1] = centery - eyey; + forward[2] = centerz - eyez; + + up[0] = upx; + up[1] = upy; + up[2] = upz; + + normalize(forward); + + /* Side = forward x up */ + cross(forward, up, side); + normalize(side); + + /* Recompute up as: up = side x forward */ + cross(side, forward, up); + + __gluMakeIdentityf(matrix); + matrix.put(0 * 4 + 0, side[0]); + matrix.put(1 * 4 + 0, side[1]); + matrix.put(2 * 4 + 0, side[2]); + + matrix.put(0 * 4 + 1, up[0]); + matrix.put(1 * 4 + 1, up[1]); + matrix.put(2 * 4 + 1, up[2]); + + matrix.put(0 * 4 + 2, -forward[0]); + matrix.put(1 * 4 + 2, -forward[1]); + matrix.put(2 * 4 + 2, -forward[2]); + + glMultMatrix(matrix); + glTranslatef(-eyex, -eyey, -eyez); + } + + /** + * Method gluProject + * + * @param objx + * @param objy + * @param objz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param win_pos + */ + public static boolean gluProject( + float objx, + float objy, + float objz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer win_pos) { + + float[] in = Project.in; + float[] out = Project.out; + + in[0] = objx; + in[1] = objy; + in[2] = objz; + in[3] = 1.0f; + + __gluMultMatrixVecf(modelMatrix, in, out); + __gluMultMatrixVecf(projMatrix, out, in); + + if (in[3] == 0.0) + return false; + + in[3] = (1.0f / in[3]) * 0.5f; + + // Map x, y and z to range 0-1 + in[0] = in[0] * in[3] + 0.5f; + in[1] = in[1] * in[3] + 0.5f; + in[2] = in[2] * in[3] + 0.5f; + + // Map x,y to viewport + win_pos.put(0, in[0] * viewport.get(viewport.position() + 2) + viewport.get(viewport.position() + 0)); + win_pos.put(1, in[1] * viewport.get(viewport.position() + 3) + viewport.get(viewport.position() + 1)); + win_pos.put(2, in[2]); + + return true; + } + + /** + * Method gluUnproject + * + * @param winx + * @param winy + * @param winz + * @param modelMatrix + * @param projMatrix + * @param viewport + * @param obj_pos + */ + public static boolean gluUnProject( + float winx, + float winy, + float winz, + FloatBuffer modelMatrix, + FloatBuffer projMatrix, + IntBuffer viewport, + FloatBuffer obj_pos) { + float[] in = Project.in; + float[] out = Project.out; + + __gluMultMatricesf(modelMatrix, projMatrix, finalMatrix); + + if (!__gluInvertMatrixf(finalMatrix, finalMatrix)) + return false; + + in[0] = winx; + in[1] = winy; + in[2] = winz; + in[3] = 1.0f; + + // Map x and y from window coordinates + in[0] = (in[0] - viewport.get(viewport.position() + 0)) / viewport.get(viewport.position() + 2); + in[1] = (in[1] - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3); + + // Map to range -1 to 1 + in[0] = in[0] * 2 - 1; + in[1] = in[1] * 2 - 1; + in[2] = in[2] * 2 - 1; + + __gluMultMatrixVecf(finalMatrix, in, out); + + if (out[3] == 0.0) + return false; + + out[3] = 1.0f / out[3]; + + obj_pos.put(obj_pos.position() + 0, out[0] * out[3]); + obj_pos.put(obj_pos.position() + 1, out[1] * out[3]); + obj_pos.put(obj_pos.position() + 2, out[2] * out[3]); + + return true; + } + + /** + * Method gluPickMatrix + * + * @param x + * @param y + * @param deltaX + * @param deltaY + * @param viewport + */ + public static void gluPickMatrix( + float x, + float y, + float deltaX, + float deltaY, + IntBuffer viewport) { + if (deltaX <= 0 || deltaY <= 0) { + return; + } + + /* Translate and scale the picked region to the entire window */ + glTranslatef( + (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX, + (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY, + 0); + glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Quadric.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Quadric.java new file mode 100644 index 0000000..b3c0aa4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Quadric.java @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * Quadric.java + * + * + * Created 22-dec-2003 + * @author Erik Duijs + */ +public class Quadric { + + protected int drawStyle; + protected int orientation; + protected boolean textureFlag; + protected int normals; + + /** + * Constructor for Quadric. + */ + public Quadric() { + super(); + + drawStyle = GLU_FILL; + orientation = GLU_OUTSIDE; + textureFlag = false; + normals = GLU_SMOOTH; + } + + /** + * Call glNormal3f after scaling normal to unit length. + * + * @param x + * @param y + * @param z + */ + protected void normal3f(float x, float y, float z) { + float mag; + + mag = (float)Math.sqrt(x * x + y * y + z * z); + if (mag > 0.00001F) { + x /= mag; + y /= mag; + z /= mag; + } + glNormal3f(x, y, z); + } + + /** + * specifies the draw style for quadrics. + * + * The legal values are as follows: + * + * GLU.FILL: Quadrics are rendered with polygon primitives. The polygons + * are drawn in a counterclockwise fashion with respect to + * their normals (as defined with glu.quadricOrientation). + * + * GLU.LINE: Quadrics are rendered as a set of lines. + * + * GLU.SILHOUETTE: Quadrics are rendered as a set of lines, except that edges + * separating coplanar faces will not be drawn. + * + * GLU.POINT: Quadrics are rendered as a set of points. + * + * @param drawStyle The drawStyle to set + */ + public void setDrawStyle(int drawStyle) { + this.drawStyle = drawStyle; + } + + /** + * specifies what kind of normals are desired for quadrics. + * The legal values are as follows: + * + * GLU.NONE: No normals are generated. + * + * GLU.FLAT: One normal is generated for every facet of a quadric. + * + * GLU.SMOOTH: One normal is generated for every vertex of a quadric. This + * is the default. + * + * @param normals The normals to set + */ + public void setNormals(int normals) { + this.normals = normals; + } + + /** + * specifies what kind of orientation is desired for. + * The orientation values are as follows: + * + * GLU.OUTSIDE: Quadrics are drawn with normals pointing outward. + * + * GLU.INSIDE: Normals point inward. The default is GLU.OUTSIDE. + * + * Note that the interpretation of outward and inward depends on the quadric + * being drawn. + * + * @param orientation The orientation to set + */ + public void setOrientation(int orientation) { + this.orientation = orientation; + } + + /** + * specifies if texture coordinates should be generated for + * quadrics rendered with qobj. If the value of textureCoords is true, + * then texture coordinates are generated, and if textureCoords is false, + * they are not.. The default is false. + * + * The manner in which texture coordinates are generated depends upon the + * specific quadric rendered. + * + * @param textureFlag The textureFlag to set + */ + public void setTextureFlag(boolean textureFlag) { + this.textureFlag = textureFlag; + } + + + /** + * Returns the drawStyle. + * @return int + */ + public int getDrawStyle() { + return drawStyle; + } + + /** + * Returns the normals. + * @return int + */ + public int getNormals() { + return normals; + } + + /** + * Returns the orientation. + * @return int + */ + public int getOrientation() { + return orientation; + } + + /** + * Returns the textureFlag. + * @return boolean + */ + public boolean getTextureFlag() { + return textureFlag; + } + + protected void TXTR_COORD(float x, float y) { + if (textureFlag) glTexCoord2f(x,y); + } + + + protected float sin(float r) { + return (float)Math.sin(r); + } + + protected float cos(float r) { + return (float)Math.cos(r); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Registry.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Registry.java new file mode 100644 index 0000000..3f354f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Registry.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.util.glu.GLU.*; + +/** + * Registry.java + * + * + * Created 11-jan-2004 + * @author Erik Duijs + */ +public class Registry extends Util { + + private static final String versionString = "1.3"; + private static final String extensionString = + "GLU_EXT_nurbs_tessellator " + "GLU_EXT_object_space_tess "; + + /** + * Method gluGetString + * @param name + * @return String + */ + public static String gluGetString(int name) { + + if (name == GLU_VERSION) { + return versionString; + } else if (name == GLU_EXTENSIONS) { + return extensionString; + } + return null; + } + + /** + * Method gluCheckExtension + * + * @param extName is an extension name. + * @param extString is a string of extensions separated by blank(s). There may or + * may not be leading or trailing blank(s) in extString. + * This works in cases of extensions being prefixes of another like + * GL_EXT_texture and GL_EXT_texture3D. + * @return boolean true if extName is found otherwise it returns false. + */ + public static boolean gluCheckExtension(String extName, String extString) { + if (extString == null || extName == null) + return false; + + return extString.indexOf(extName) != -1; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Sphere.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Sphere.java new file mode 100644 index 0000000..0b0fad3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Sphere.java @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +/** + * Sphere.java + * + * + * Created 23-dec-2003 + * @author Erik Duijs + */ +public class Sphere extends Quadric { + + /** + * Constructor + */ + public Sphere() { + super(); + } + + /** + * draws a sphere of the given radius centered around the origin. + * The sphere is subdivided around the z axis into slices and along the z axis + * into stacks (similar to lines of longitude and latitude). + * + * If the orientation is set to GLU.OUTSIDE (with glu.quadricOrientation), then + * any normals generated point away from the center of the sphere. Otherwise, + * they point toward the center of the sphere. + + * If texturing is turned on (with glu.quadricTexture), then texture + * coordinates are generated so that t ranges from 0.0 at z=-radius to 1.0 at + * z=radius (t increases linearly along longitudinal lines), and s ranges from + * 0.0 at the +y axis, to 0.25 at the +x axis, to 0.5 at the -y axis, to 0.75 + * at the -x axis, and back to 1.0 at the +y axis. + */ + public void draw(float radius, int slices, int stacks) { + // TODO + + float rho, drho, theta, dtheta; + float x, y, z; + float s, t, ds, dt; + int i, j, imin, imax; + boolean normals; + float nsign; + + normals = super.normals != GLU_NONE; + + if (super.orientation == GLU_INSIDE) { + nsign = -1.0f; + } else { + nsign = 1.0f; + } + + drho = PI / stacks; + dtheta = 2.0f * PI / slices; + + if (super.drawStyle == GLU_FILL) { + if (!super.textureFlag) { + // draw +Z end as a triangle fan + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0.0f, 0.0f, 1.0f); + glVertex3f(0.0f, 0.0f, nsign * radius); + for (j = 0; j <= slices; j++) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(drho); + y = cos(theta) * sin(drho); + z = nsign * cos(drho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + + ds = 1.0f / slices; + dt = 1.0f / stacks; + t = 1.0f; // because loop now runs from 0 + if (super.textureFlag) { + imin = 0; + imax = stacks; + } else { + imin = 1; + imax = stacks - 1; + } + + // draw intermediate stacks as quad strips + for (i = imin; i < imax; i++) { + rho = i * drho; + glBegin(GL_QUAD_STRIP); + s = 0.0f; + for (j = 0; j <= slices; j++) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + TXTR_COORD(s, t); + glVertex3f(x * radius, y * radius, z * radius); + x = -sin(theta) * sin(rho + drho); + y = cos(theta) * sin(rho + drho); + z = nsign * cos(rho + drho); + if (normals) { + glNormal3f(x * nsign, y * nsign, z * nsign); + } + TXTR_COORD(s, t - dt); + s += ds; + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + t -= dt; + } + + if (!super.textureFlag) { + // draw -Z end as a triangle fan + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0.0f, 0.0f, -1.0f); + glVertex3f(0.0f, 0.0f, -radius * nsign); + rho = PI - drho; + s = 1.0f; + for (j = slices; j >= 0; j--) { + theta = (j == slices) ? 0.0f : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + s -= ds; + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + } else if ( + super.drawStyle == GLU_LINE + || super.drawStyle == GLU_SILHOUETTE) { + // draw stack lines + for (i = 1; + i < stacks; + i++) { // stack line at i==stacks-1 was missing here + rho = i * drho; + glBegin(GL_LINE_LOOP); + for (j = 0; j < slices; j++) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + // draw slice lines + for (j = 0; j < slices; j++) { + theta = j * dtheta; + glBegin(GL_LINE_STRIP); + for (i = 0; i <= stacks; i++) { + rho = i * drho; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + glEnd(); + } + } else if (super.drawStyle == GLU_POINT) { + // top and bottom-most points + glBegin(GL_POINTS); + if (normals) + glNormal3f(0.0f, 0.0f, nsign); + glVertex3f(0.0f, 0.0f, radius); + if (normals) + glNormal3f(0.0f, 0.0f, -nsign); + glVertex3f(0.0f, 0.0f, -radius); + + // loop over stacks + for (i = 1; i < stacks - 1; i++) { + rho = i * drho; + for (j = 0; j < slices; j++) { + theta = j * dtheta; + x = cos(theta) * sin(rho); + y = sin(theta) * sin(rho); + z = cos(rho); + if (normals) + glNormal3f(x * nsign, y * nsign, z * nsign); + glVertex3f(x * radius, y * radius, z * radius); + } + } + glEnd(); + } + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Util.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Util.java new file mode 100644 index 0000000..82763a6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/Util.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.glu; + +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; + +/** + * Util.java + * <p/> + * <p/> + * Created 7-jan-2004 + * + * @author Erik Duijs + */ +public class Util { + + /** + * temp IntBuffer of one for getting an int from some GL functions + */ + private static IntBuffer scratch = BufferUtils.createIntBuffer(16); + + /** + * Return ceiling of integer division + * + * @param a + * @param b + * + * @return int + */ + protected static int ceil(int a, int b) { + return (a % b == 0 ? a / b : a / b + 1); + } + + /** + * Normalize vector + * + * @param v + * + * @return float[] + */ + protected static float[] normalize(float[] v) { + float r; + + r = (float)Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + if ( r == 0.0 ) + return v; + + r = 1.0f / r; + + v[0] *= r; + v[1] *= r; + v[2] *= r; + + return v; + } + + /** + * Calculate cross-product + * + * @param v1 + * @param v2 + * @param result + */ + protected static void cross(float[] v1, float[] v2, float[] result) { + result[0] = v1[1] * v2[2] - v1[2] * v2[1]; + result[1] = v1[2] * v2[0] - v1[0] * v2[2]; + result[2] = v1[0] * v2[1] - v1[1] * v2[0]; + } + + /** + * Method compPerPix. + * + * @param format + * + * @return int + */ + protected static int compPerPix(int format) { + /* Determine number of components per pixel */ + switch ( format ) { + case GL_COLOR_INDEX: + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_LUMINANCE: + return 1; + case GL_LUMINANCE_ALPHA: + return 2; + case GL_RGB: + case GL_BGR: + return 3; + case GL_RGBA: + case GL_BGRA: + return 4; + default : + return -1; + } + } + + /** + * Method nearestPower. + * <p/> + * Compute the nearest power of 2 number. This algorithm is a little strange, but it works quite well. + * + * @param value + * + * @return int + */ + protected static int nearestPower(int value) { + int i; + + i = 1; + + /* Error! */ + if ( value == 0 ) + return -1; + + for ( ; ; ) { + if ( value == 1 ) { + return i; + } else if ( value == 3 ) { + return i << 2; + } + value >>= 1; + i <<= 1; + } + } + + /** + * Method bytesPerPixel. + * + * @param format + * @param type + * + * @return int + */ + protected static int bytesPerPixel(int format, int type) { + int n, m; + + switch ( format ) { + case GL_COLOR_INDEX: + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_LUMINANCE: + n = 1; + break; + case GL_LUMINANCE_ALPHA: + n = 2; + break; + case GL_RGB: + case GL_BGR: + n = 3; + break; + case GL_RGBA: + case GL_BGRA: + n = 4; + break; + default : + n = 0; + } + + switch ( type ) { + case GL_UNSIGNED_BYTE: + m = 1; + break; + case GL_BYTE: + m = 1; + break; + case GL_BITMAP: + m = 1; + break; + case GL_UNSIGNED_SHORT: + m = 2; + break; + case GL_SHORT: + m = 2; + break; + case GL_UNSIGNED_INT: + m = 4; + break; + case GL_INT: + m = 4; + break; + case GL_FLOAT: + m = 4; + break; + default : + m = 0; + } + + return n * m; + } + + /** + * Convenience method for returning an int, rather than getting it out of a buffer yourself. + * + * @param what + * + * @return int + */ + protected static int glGetIntegerv(int what) { + scratch.rewind(); + glGetInteger(what, scratch); + return scratch.get(); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java new file mode 100644 index 0000000..2e96d04 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/ActiveRegion.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class ActiveRegion { + GLUhalfEdge eUp; /* upper edge, directed right to left */ + DictNode nodeUp; /* dictionary node corresponding to eUp */ + int windingNumber; /* used to determine which regions are + * inside the polygon */ + boolean inside; /* is this region inside the polygon? */ + boolean sentinel; /* marks fake edges at t = +/-infinity */ + boolean dirty; /* marks regions where the upper or lower + * edge has changed, but we haven't checked + * whether they intersect yet */ + boolean fixUpperEdge; /* marks temporary edges introduced when + * we process a "right vertex" (one without + * any edges leaving to the right) */ +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/CachedVertex.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/CachedVertex.java new file mode 100644 index 0000000..66df7f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/CachedVertex.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class CachedVertex { + public double[] coords = new double[3]; + public Object data; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Dict.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Dict.java new file mode 100644 index 0000000..fbca7a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Dict.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Dict { + DictNode head; + Object frame; + DictLeq leq; + + private Dict() { + } + + static Dict dictNewDict(Object frame, DictLeq leq) { + Dict dict = new Dict(); + dict.head = new DictNode(); + + dict.head.key = null; + dict.head.next = dict.head; + dict.head.prev = dict.head; + + dict.frame = frame; + dict.leq = leq; + + return dict; + } + + static void dictDeleteDict(Dict dict) { + dict.head = null; + dict.frame = null; + dict.leq = null; + } + + static DictNode dictInsert(Dict dict, Object key) { + return dictInsertBefore(dict, dict.head, key); + } + + static DictNode dictInsertBefore(Dict dict, DictNode node, Object key) { + do { + node = node.prev; + } while (node.key != null && !dict.leq.leq(dict.frame, node.key, key)); + + DictNode newNode = new DictNode(); + newNode.key = key; + newNode.next = node.next; + node.next.prev = newNode; + newNode.prev = node; + node.next = newNode; + + return newNode; + } + + static Object dictKey(DictNode aNode) { + return aNode.key; + } + + static DictNode dictSucc(DictNode aNode) { + return aNode.next; + } + + static DictNode dictPred(DictNode aNode) { + return aNode.prev; + } + + static DictNode dictMin(Dict aDict) { + return aDict.head.next; + } + + static DictNode dictMax(Dict aDict) { + return aDict.head.prev; + } + + static void dictDelete(Dict dict, DictNode node) { + node.next.prev = node.prev; + node.prev.next = node.next; + } + + static DictNode dictSearch(Dict dict, Object key) { + DictNode node = dict.head; + + do { + node = node.next; + } while (node.key != null && !(dict.leq.leq(dict.frame, key, node.key))); + + return node; + } + + public interface DictLeq { + boolean leq(Object frame, Object key1, Object key2); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/DictNode.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/DictNode.java new file mode 100644 index 0000000..6d54786 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/DictNode.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class DictNode { + Object key; + DictNode next; + DictNode prev; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUface.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUface.java new file mode 100644 index 0000000..7e39cc3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUface.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class GLUface { + public GLUface next; /* next face (never NULL) */ + public GLUface prev; /* previous face (never NULL) */ + public GLUhalfEdge anEdge; /* a half edge with this left face */ + public Object data; /* room for client's data */ + + /* Internal data (keep hidden) */ + public GLUface trail; /* "stack" for conversion to strips */ + public boolean marked; /* flag for conversion to strips */ + public boolean inside; /* this face is in the polygon interior */ +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java new file mode 100644 index 0000000..db0a52b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUhalfEdge.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class GLUhalfEdge { + public GLUhalfEdge next; /* doubly-linked list (prev==Sym->next) */ + public GLUhalfEdge Sym; /* same edge, opposite direction */ + public GLUhalfEdge Onext; /* next edge CCW around origin */ + public GLUhalfEdge Lnext; /* next edge CCW around left face */ + public GLUvertex Org; /* origin vertex (Overtex too long) */ + public GLUface Lface; /* left face */ + + /* Internal data (keep hidden) */ + public ActiveRegion activeRegion; /* a region with this upper edge (sweep.c) */ + public int winding; /* change in winding number when crossing */ + public boolean first; + + GLUhalfEdge(boolean first) { + this.first = first; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUmesh.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUmesh.java new file mode 100644 index 0000000..5c9a177 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUmesh.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class GLUmesh { + GLUvertex vHead = new GLUvertex(); /* dummy header for vertex list */ + GLUface fHead = new GLUface(); /* dummy header for face list */ + GLUhalfEdge eHead = new GLUhalfEdge(true); /* dummy header for edge list */ + GLUhalfEdge eHeadSym = new GLUhalfEdge(false); /* and its symmetric counterpart */ +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java new file mode 100644 index 0000000..eb8e2dc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUtessellatorImpl.java @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import org.lwjgl.util.glu.GLUtessellator; +import org.lwjgl.util.glu.GLUtessellatorCallback; +import org.lwjgl.util.glu.GLUtessellatorCallbackAdapter; + +import static org.lwjgl.util.glu.GLU.*; + +public class GLUtessellatorImpl implements GLUtessellator { + public static final int TESS_MAX_CACHE = 100; + + private int state; /* what begin/end calls have we seen? */ + + private GLUhalfEdge lastEdge; /* lastEdge->Org is the most recent vertex */ + GLUmesh mesh; /* stores the input contours, and eventually + the tessellation itself */ + + /*** state needed for projecting onto the sweep plane ***/ + + double[] normal = new double[3]; /* user-specified normal (if provided) */ + double[] sUnit = new double[3]; /* unit vector in s-direction (debugging) */ + double[] tUnit = new double[3]; /* unit vector in t-direction (debugging) */ + + /*** state needed for the line sweep ***/ + + private double relTolerance; /* tolerance for merging features */ + int windingRule; /* rule for determining polygon interior */ + boolean fatalError; /* fatal error: needed combine callback */ + + Dict dict; /* edge dictionary for sweep line */ + PriorityQ pq; /* priority queue of vertex events */ + GLUvertex event; /* current sweep event being processed */ + + /*** state needed for rendering callbacks (see render.c) ***/ + + boolean flagBoundary; /* mark boundary edges (use EdgeFlag) */ + boolean boundaryOnly; /* Extract contours, not triangles */ + GLUface lonelyTriList; + /* list of triangles which could not be rendered as strips or fans */ + + + + /*** state needed to cache single-contour polygons for renderCache() */ + + private boolean flushCacheOnNextVertex; /* empty cache on next vertex() call */ + int cacheCount; /* number of cached vertices */ + CachedVertex[] cache = new CachedVertex[TESS_MAX_CACHE]; /* the vertex data */ + + /*** rendering callbacks that also pass polygon data ***/ + private Object polygonData; /* client data for current polygon */ + + private GLUtessellatorCallback callBegin; + private GLUtessellatorCallback callEdgeFlag; + private GLUtessellatorCallback callVertex; + private GLUtessellatorCallback callEnd; +// private GLUtessellatorCallback callMesh; + private GLUtessellatorCallback callError; + private GLUtessellatorCallback callCombine; + + private GLUtessellatorCallback callBeginData; + private GLUtessellatorCallback callEdgeFlagData; + private GLUtessellatorCallback callVertexData; + private GLUtessellatorCallback callEndData; +// private GLUtessellatorCallback callMeshData; + private GLUtessellatorCallback callErrorData; + private GLUtessellatorCallback callCombineData; + + private static final double GLU_TESS_DEFAULT_TOLERANCE = 0.0; +// private static final int GLU_TESS_MESH = 100112; /* void (*)(GLUmesh *mesh) */ + private static GLUtessellatorCallback NULL_CB = new GLUtessellatorCallbackAdapter(); + +// #define MAX_FAST_ALLOC (MAX(sizeof(EdgePair), \ +// MAX(sizeof(GLUvertex),sizeof(GLUface)))) + + public GLUtessellatorImpl() { + state = TessState.T_DORMANT; + + normal[0] = 0; + normal[1] = 0; + normal[2] = 0; + + relTolerance = GLU_TESS_DEFAULT_TOLERANCE; + windingRule = GLU_TESS_WINDING_ODD; + flagBoundary = false; + boundaryOnly = false; + + callBegin = NULL_CB; + callEdgeFlag = NULL_CB; + callVertex = NULL_CB; + callEnd = NULL_CB; + callError = NULL_CB; + callCombine = NULL_CB; +// callMesh = NULL_CB; + + callBeginData = NULL_CB; + callEdgeFlagData = NULL_CB; + callVertexData = NULL_CB; + callEndData = NULL_CB; + callErrorData = NULL_CB; + callCombineData = NULL_CB; + + polygonData = null; + + for (int i = 0; i < cache.length; i++) { + cache[i] = new CachedVertex(); + } + } + + public static GLUtessellator gluNewTess() + { + return new GLUtessellatorImpl(); + } + + + private void makeDormant() { + /* Return the tessellator to its original dormant state. */ + + if (mesh != null) { + Mesh.__gl_meshDeleteMesh(mesh); + } + state = TessState.T_DORMANT; + lastEdge = null; + mesh = null; + } + + private void requireState(int newState) { + if (state != newState) gotoState(newState); + } + + private void gotoState(int newState) { + while (state != newState) { + /* We change the current state one level at a time, to get to + * the desired state. + */ + if (state < newState) { + if (state == TessState.T_DORMANT) { + callErrorOrErrorData(GLU_TESS_MISSING_BEGIN_POLYGON); + gluTessBeginPolygon(null); + } else if (state == TessState.T_IN_POLYGON) { + callErrorOrErrorData(GLU_TESS_MISSING_BEGIN_CONTOUR); + gluTessBeginContour(); + } + } else { + if (state == TessState.T_IN_CONTOUR) { + callErrorOrErrorData(GLU_TESS_MISSING_END_CONTOUR); + gluTessEndContour(); + } else if (state == TessState.T_IN_POLYGON) { + callErrorOrErrorData(GLU_TESS_MISSING_END_POLYGON); + /* gluTessEndPolygon( tess ) is too much work! */ + makeDormant(); + } + } + } + } + + public void gluDeleteTess() { + requireState(TessState.T_DORMANT); + } + + public void gluTessProperty(int which, double value) { + switch (which) { + case GLU_TESS_TOLERANCE: + if (value < 0.0 || value > 1.0) break; + relTolerance = value; + return; + + case GLU_TESS_WINDING_RULE: + int windingRule = (int) value; + if (windingRule != value) break; /* not an integer */ + + switch (windingRule) { + case GLU_TESS_WINDING_ODD: + case GLU_TESS_WINDING_NONZERO: + case GLU_TESS_WINDING_POSITIVE: + case GLU_TESS_WINDING_NEGATIVE: + case GLU_TESS_WINDING_ABS_GEQ_TWO: + this.windingRule = windingRule; + return; + default: + break; + } + + case GLU_TESS_BOUNDARY_ONLY: + boundaryOnly = (value != 0); + return; + + default: + callErrorOrErrorData(GLU_INVALID_ENUM); + return; + } + callErrorOrErrorData(GLU_INVALID_VALUE); + } + +/* Returns tessellator property */ + public void gluGetTessProperty(int which, double[] value, int value_offset) { + switch (which) { + case GLU_TESS_TOLERANCE: +/* tolerance should be in range [0..1] */ + assert (0.0 <= relTolerance && relTolerance <= 1.0); + value[value_offset] = relTolerance; + break; + case GLU_TESS_WINDING_RULE: + assert (windingRule == GLU_TESS_WINDING_ODD || + windingRule == GLU_TESS_WINDING_NONZERO || + windingRule == GLU_TESS_WINDING_POSITIVE || + windingRule == GLU_TESS_WINDING_NEGATIVE || + windingRule == GLU_TESS_WINDING_ABS_GEQ_TWO); + value[value_offset] = windingRule; + break; + case GLU_TESS_BOUNDARY_ONLY: + assert (boundaryOnly == true || boundaryOnly == false); + value[value_offset] = boundaryOnly ? 1 : 0; + break; + default: + value[value_offset] = 0.0; + callErrorOrErrorData(GLU_INVALID_ENUM); + break; + } + } /* gluGetTessProperty() */ + + public void gluTessNormal(double x, double y, double z) { + normal[0] = x; + normal[1] = y; + normal[2] = z; + } + + public void gluTessCallback(int which, GLUtessellatorCallback aCallback) { + switch (which) { + case GLU_TESS_BEGIN: + callBegin = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_BEGIN_DATA: + callBeginData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_EDGE_FLAG: + callEdgeFlag = aCallback == null ? NULL_CB : aCallback; +/* If the client wants boundary edges to be flagged, + * we render everything as separate triangles (no strips or fans). + */ + flagBoundary = aCallback != null; + return; + case GLU_TESS_EDGE_FLAG_DATA: + callEdgeFlagData = callBegin = aCallback == null ? NULL_CB : aCallback; +/* If the client wants boundary edges to be flagged, + * we render everything as separate triangles (no strips or fans). + */ + flagBoundary = (aCallback != null); + return; + case GLU_TESS_VERTEX: + callVertex = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_VERTEX_DATA: + callVertexData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_END: + callEnd = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_END_DATA: + callEndData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_ERROR: + callError = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_ERROR_DATA: + callErrorData = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_COMBINE: + callCombine = aCallback == null ? NULL_CB : aCallback; + return; + case GLU_TESS_COMBINE_DATA: + callCombineData = aCallback == null ? NULL_CB : aCallback; + return; +// case GLU_TESS_MESH: +// callMesh = aCallback == null ? NULL_CB : aCallback; +// return; + default: + callErrorOrErrorData(GLU_INVALID_ENUM); + return; + } + } + + private boolean addVertex(double[] coords, Object vertexData) { + GLUhalfEdge e; + + e = lastEdge; + if (e == null) { +/* Make a self-loop (one vertex, one edge). */ + + e = Mesh.__gl_meshMakeEdge(mesh); + if (e == null) return false; + if (!Mesh.__gl_meshSplice(e, e.Sym)) return false; + } else { +/* Create a new vertex and edge which immediately follow e + * in the ordering around the left face. + */ + if (Mesh.__gl_meshSplitEdge(e) == null) return false; + e = e.Lnext; + } + +/* The new vertex is now e.Org. */ + e.Org.data = vertexData; + e.Org.coords[0] = coords[0]; + e.Org.coords[1] = coords[1]; + e.Org.coords[2] = coords[2]; + +/* The winding of an edge says how the winding number changes as we + * cross from the edge''s right face to its left face. We add the + * vertices in such an order that a CCW contour will add +1 to + * the winding number of the region inside the contour. + */ + e.winding = 1; + e.Sym.winding = -1; + + lastEdge = e; + + return true; + } + + private void cacheVertex(double[] coords, Object vertexData) { + if (cache[cacheCount] == null) { + cache[cacheCount] = new CachedVertex(); + } + + CachedVertex v = cache[cacheCount]; + + v.data = vertexData; + v.coords[0] = coords[0]; + v.coords[1] = coords[1]; + v.coords[2] = coords[2]; + ++cacheCount; + } + + + private boolean flushCache() { + CachedVertex[] v = cache; + + mesh = Mesh.__gl_meshNewMesh(); + if (mesh == null) return false; + + for (int i = 0; i < cacheCount; i++) { + CachedVertex vertex = v[i]; + if (!addVertex(vertex.coords, vertex.data)) return false; + } + cacheCount = 0; + flushCacheOnNextVertex = false; + + return true; + } + + public void gluTessVertex(double[] coords, int coords_offset, Object vertexData) { + int i; + boolean tooLarge = false; + double x; + double[] clamped = new double[3]; + + requireState(TessState.T_IN_CONTOUR); + + if (flushCacheOnNextVertex) { + if (!flushCache()) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + return; + } + lastEdge = null; + } + for (i = 0; i < 3; ++i) { + x = coords[i+coords_offset]; + if (x < -GLU_TESS_MAX_COORD) { + x = -GLU_TESS_MAX_COORD; + tooLarge = true; + } + if (x > GLU_TESS_MAX_COORD) { + x = GLU_TESS_MAX_COORD; + tooLarge = true; + } + clamped[i] = x; + } + if (tooLarge) { + callErrorOrErrorData(GLU_TESS_COORD_TOO_LARGE); + } + + if (mesh == null) { + if (cacheCount < TESS_MAX_CACHE) { + cacheVertex(clamped, vertexData); + return; + } + if (!flushCache()) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + return; + } + } + + if (!addVertex(clamped, vertexData)) { + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + } + } + + + public void gluTessBeginPolygon(Object data) { + requireState(TessState.T_DORMANT); + + state = TessState.T_IN_POLYGON; + cacheCount = 0; + flushCacheOnNextVertex = false; + mesh = null; + + polygonData = data; + } + + + public void gluTessBeginContour() { + requireState(TessState.T_IN_POLYGON); + + state = TessState.T_IN_CONTOUR; + lastEdge = null; + if (cacheCount > 0) { +/* Just set a flag so we don't get confused by empty contours + * -- these can be generated accidentally with the obsolete + * NextContour() interface. + */ + flushCacheOnNextVertex = true; + } + } + + + public void gluTessEndContour() { + requireState(TessState.T_IN_CONTOUR); + state = TessState.T_IN_POLYGON; + } + + public void gluTessEndPolygon() { + GLUmesh mesh; + + try { + requireState(TessState.T_IN_POLYGON); + state = TessState.T_DORMANT; + + if (this.mesh == null) { + if (!flagBoundary /*&& callMesh == NULL_CB*/) { + +/* Try some special code to make the easy cases go quickly + * (eg. convex polygons). This code does NOT handle multiple contours, + * intersections, edge flags, and of course it does not generate + * an explicit mesh either. + */ + if (Render.__gl_renderCache(this)) { + polygonData = null; + return; + } + } + if (!flushCache()) throw new RuntimeException(); /* could've used a label*/ + } + +/* Determine the polygon normal and project vertices onto the plane + * of the polygon. + */ + Normal.__gl_projectPolygon(this); + +/* __gl_computeInterior( tess ) computes the planar arrangement specified + * by the given contours, and further subdivides this arrangement + * into regions. Each region is marked "inside" if it belongs + * to the polygon, according to the rule given by windingRule. + * Each interior region is guaranteed be monotone. + */ + if (!Sweep.__gl_computeInterior(this)) { + throw new RuntimeException(); /* could've used a label */ + } + + mesh = this.mesh; + if (!fatalError) { + boolean rc = true; + +/* If the user wants only the boundary contours, we throw away all edges + * except those which separate the interior from the exterior. + * Otherwise we tessellate all the regions marked "inside". + */ + if (boundaryOnly) { + rc = TessMono.__gl_meshSetWindingNumber(mesh, 1, true); + } else { + rc = TessMono.__gl_meshTessellateInterior(mesh); + } + if (!rc) throw new RuntimeException(); /* could've used a label */ + + Mesh.__gl_meshCheckMesh(mesh); + + if (callBegin != NULL_CB || callEnd != NULL_CB + || callVertex != NULL_CB || callEdgeFlag != NULL_CB + || callBeginData != NULL_CB + || callEndData != NULL_CB + || callVertexData != NULL_CB + || callEdgeFlagData != NULL_CB) { + if (boundaryOnly) { + Render.__gl_renderBoundary(this, mesh); /* output boundary contours */ + } else { + Render.__gl_renderMesh(this, mesh); /* output strips and fans */ + } + } +// if (callMesh != NULL_CB) { +// +///* Throw away the exterior faces, so that all faces are interior. +// * This way the user doesn't have to check the "inside" flag, +// * and we don't need to even reveal its existence. It also leaves +// * the freedom for an implementation to not generate the exterior +// * faces in the first place. +// */ +// TessMono.__gl_meshDiscardExterior(mesh); +// callMesh.mesh(mesh); /* user wants the mesh itself */ +// mesh = null; +// polygonData = null; +// return; +// } + } + Mesh.__gl_meshDeleteMesh(mesh); + polygonData = null; + mesh = null; + } catch (Exception e) { + e.printStackTrace(); + callErrorOrErrorData(GLU_OUT_OF_MEMORY); + } + } + + /*******************************************************/ + +/* Obsolete calls -- for backward compatibility */ + + public void gluBeginPolygon() { + gluTessBeginPolygon(null); + gluTessBeginContour(); + } + + +/*ARGSUSED*/ + public void gluNextContour(int type) { + gluTessEndContour(); + gluTessBeginContour(); + } + + + public void gluEndPolygon() { + gluTessEndContour(); + gluTessEndPolygon(); + } + + void callBeginOrBeginData(int a) { + if (callBeginData != NULL_CB) + callBeginData.beginData(a, polygonData); + else + callBegin.begin(a); + } + + void callVertexOrVertexData(Object a) { + if (callVertexData != NULL_CB) + callVertexData.vertexData(a, polygonData); + else + callVertex.vertex(a); + } + + void callEdgeFlagOrEdgeFlagData(boolean a) { + if (callEdgeFlagData != NULL_CB) + callEdgeFlagData.edgeFlagData(a, polygonData); + else + callEdgeFlag.edgeFlag(a); + } + + void callEndOrEndData() { + if (callEndData != NULL_CB) + callEndData.endData(polygonData); + else + callEnd.end(); + } + + void callCombineOrCombineData(double[] coords, Object[] vertexData, float[] weights, Object[] outData) { + if (callCombineData != NULL_CB) + callCombineData.combineData(coords, vertexData, weights, outData, polygonData); + else + callCombine.combine(coords, vertexData, weights, outData); + } + + void callErrorOrErrorData(int a) { + if (callErrorData != NULL_CB) + callErrorData.errorData(a, polygonData); + else + callError.error(a); + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUvertex.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUvertex.java new file mode 100644 index 0000000..7eaa40a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/GLUvertex.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class GLUvertex { + public GLUvertex next; /* next vertex (never NULL) */ + public GLUvertex prev; /* previous vertex (never NULL) */ + public GLUhalfEdge anEdge; /* a half-edge with this origin */ + public Object data; /* client's data */ + + /* Internal data (keep hidden) */ + public double[] coords = new double[3]; /* vertex location in 3D */ + public double s, t; /* projection onto the sweep plane */ + public int pqHandle; /* to allow deletion from priority queue */ +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Geom.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Geom.java new file mode 100644 index 0000000..e5f1e97 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Geom.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Geom { + private Geom() { + } + + /* Given three vertices u,v,w such that VertLeq(u,v) && VertLeq(v,w), + * evaluates the t-coord of the edge uw at the s-coord of the vertex v. + * Returns v->t - (uw)(v->s), ie. the signed distance from uw to v. + * If uw is vertical (and thus passes thru v), the result is zero. + * + * The calculation is extremely accurate and stable, even when v + * is very close to u or w. In particular if we set v->t = 0 and + * let r be the negated result (this evaluates (uw)(v->s)), then + * r is guaranteed to satisfy MIN(u->t,w->t) <= r <= MAX(u->t,w->t). + */ + static double EdgeEval(GLUvertex u, GLUvertex v, GLUvertex w) { + double gapL, gapR; + + assert (VertLeq(u, v) && VertLeq(v, w)); + + gapL = v.s - u.s; + gapR = w.s - v.s; + + if (gapL + gapR > 0) { + if (gapL < gapR) { + return (v.t - u.t) + (u.t - w.t) * (gapL / (gapL + gapR)); + } else { + return (v.t - w.t) + (w.t - u.t) * (gapR / (gapL + gapR)); + } + } + /* vertical line */ + return 0; + } + + static double EdgeSign(GLUvertex u, GLUvertex v, GLUvertex w) { + double gapL, gapR; + + assert (VertLeq(u, v) && VertLeq(v, w)); + + gapL = v.s - u.s; + gapR = w.s - v.s; + + if (gapL + gapR > 0) { + return (v.t - w.t) * gapL + (v.t - u.t) * gapR; + } + /* vertical line */ + return 0; + } + + + /*********************************************************************** + * Define versions of EdgeSign, EdgeEval with s and t transposed. + */ + + static double TransEval(GLUvertex u, GLUvertex v, GLUvertex w) { + /* Given three vertices u,v,w such that TransLeq(u,v) && TransLeq(v,w), + * evaluates the t-coord of the edge uw at the s-coord of the vertex v. + * Returns v->s - (uw)(v->t), ie. the signed distance from uw to v. + * If uw is vertical (and thus passes thru v), the result is zero. + * + * The calculation is extremely accurate and stable, even when v + * is very close to u or w. In particular if we set v->s = 0 and + * let r be the negated result (this evaluates (uw)(v->t)), then + * r is guaranteed to satisfy MIN(u->s,w->s) <= r <= MAX(u->s,w->s). + */ + double gapL, gapR; + + assert (TransLeq(u, v) && TransLeq(v, w)); + + gapL = v.t - u.t; + gapR = w.t - v.t; + + if (gapL + gapR > 0) { + if (gapL < gapR) { + return (v.s - u.s) + (u.s - w.s) * (gapL / (gapL + gapR)); + } else { + return (v.s - w.s) + (w.s - u.s) * (gapR / (gapL + gapR)); + } + } + /* vertical line */ + return 0; + } + + static double TransSign(GLUvertex u, GLUvertex v, GLUvertex w) { + /* Returns a number whose sign matches TransEval(u,v,w) but which + * is cheaper to evaluate. Returns > 0, == 0 , or < 0 + * as v is above, on, or below the edge uw. + */ + double gapL, gapR; + + assert (TransLeq(u, v) && TransLeq(v, w)); + + gapL = v.t - u.t; + gapR = w.t - v.t; + + if (gapL + gapR > 0) { + return (v.s - w.s) * gapL + (v.s - u.s) * gapR; + } + /* vertical line */ + return 0; + } + + + static boolean VertCCW(GLUvertex u, GLUvertex v, GLUvertex w) { + /* For almost-degenerate situations, the results are not reliable. + * Unless the floating-point arithmetic can be performed without + * rounding errors, *any* implementation will give incorrect results + * on some degenerate inputs, so the client must have some way to + * handle this situation. + */ + return (u.s * (v.t - w.t) + v.s * (w.t - u.t) + w.s * (u.t - v.t)) >= 0; + } + +/* Given parameters a,x,b,y returns the value (b*x+a*y)/(a+b), + * or (x+y)/2 if a==b==0. It requires that a,b >= 0, and enforces + * this in the rare case that one argument is slightly negative. + * The implementation is extremely stable numerically. + * In particular it guarantees that the result r satisfies + * MIN(x,y) <= r <= MAX(x,y), and the results are very accurate + * even when a and b differ greatly in magnitude. + */ + static double Interpolate(double a, double x, double b, double y) { + a = (a < 0) ? 0 : a; + b = (b < 0) ? 0 : b; + if (a <= b) { + if (b == 0) { + return (x + y) / 2.0; + } else { + return (x + (y - x) * (a / (a + b))); + } + } else { + return (y + (x - y) * (b / (a + b))); + } + } + + static void EdgeIntersect(GLUvertex o1, GLUvertex d1, + GLUvertex o2, GLUvertex d2, + GLUvertex v) +/* Given edges (o1,d1) and (o2,d2), compute their point of intersection. + * The computed point is guaranteed to lie in the intersection of the + * bounding rectangles defined by each edge. + */ { + double z1, z2; + + /* This is certainly not the most efficient way to find the intersection + * of two line segments, but it is very numerically stable. + * + * Strategy: find the two middle vertices in the VertLeq ordering, + * and interpolate the intersection s-value from these. Then repeat + * using the TransLeq ordering to find the intersection t-value. + */ + + if (!VertLeq(o1, d1)) { + GLUvertex temp = o1; + o1 = d1; + d1 = temp; + } + if (!VertLeq(o2, d2)) { + GLUvertex temp = o2; + o2 = d2; + d2 = temp; + } + if (!VertLeq(o1, o2)) { + GLUvertex temp = o1; + o1 = o2; + o2 = temp; + temp = d1; + d1 = d2; + d2 = temp; + } + + if (!VertLeq(o2, d1)) { + /* Technically, no intersection -- do our best */ + v.s = (o2.s + d1.s) / 2.0; + } else if (VertLeq(d1, d2)) { + /* Interpolate between o2 and d1 */ + z1 = EdgeEval(o1, o2, d1); + z2 = EdgeEval(o2, d1, d2); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.s = Interpolate(z1, o2.s, z2, d1.s); + } else { + /* Interpolate between o2 and d2 */ + z1 = EdgeSign(o1, o2, d1); + z2 = -EdgeSign(o1, d2, d1); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.s = Interpolate(z1, o2.s, z2, d2.s); + } + + /* Now repeat the process for t */ + + if (!TransLeq(o1, d1)) { + GLUvertex temp = o1; + o1 = d1; + d1 = temp; + } + if (!TransLeq(o2, d2)) { + GLUvertex temp = o2; + o2 = d2; + d2 = temp; + } + if (!TransLeq(o1, o2)) { + GLUvertex temp = o2; + o2 = o1; + o1 = temp; + temp = d2; + d2 = d1; + d1 = temp; + } + + if (!TransLeq(o2, d1)) { + /* Technically, no intersection -- do our best */ + v.t = (o2.t + d1.t) / 2.0; + } else if (TransLeq(d1, d2)) { + /* Interpolate between o2 and d1 */ + z1 = TransEval(o1, o2, d1); + z2 = TransEval(o2, d1, d2); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.t = Interpolate(z1, o2.t, z2, d1.t); + } else { + /* Interpolate between o2 and d2 */ + z1 = TransSign(o1, o2, d1); + z2 = -TransSign(o1, d2, d1); + if (z1 + z2 < 0) { + z1 = -z1; + z2 = -z2; + } + v.t = Interpolate(z1, o2.t, z2, d2.t); + } + } + + static boolean VertEq(GLUvertex u, GLUvertex v) { + return u.s == v.s && u.t == v.t; + } + + static boolean VertLeq(GLUvertex u, GLUvertex v) { + return u.s < v.s || (u.s == v.s && u.t <= v.t); + } + +/* Versions of VertLeq, EdgeSign, EdgeEval with s and t transposed. */ + + static boolean TransLeq(GLUvertex u, GLUvertex v) { + return u.t < v.t || (u.t == v.t && u.s <= v.s); + } + + static boolean EdgeGoesLeft(GLUhalfEdge e) { + return VertLeq(e.Sym.Org, e.Org); + } + + static boolean EdgeGoesRight(GLUhalfEdge e) { + return VertLeq(e.Org, e.Sym.Org); + } + + static double VertL1dist(GLUvertex u, GLUvertex v) { + return Math.abs(u.s - v.s) + Math.abs(u.t - v.t); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Mesh.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Mesh.java new file mode 100644 index 0000000..b85644b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Mesh.java @@ -0,0 +1,766 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class Mesh { + private Mesh() { + } + + /************************ Utility Routines ************************/ +/* MakeEdge creates a new pair of half-edges which form their own loop. + * No vertex or face structures are allocated, but these must be assigned + * before the current edge operation is completed. + */ + static GLUhalfEdge MakeEdge(GLUhalfEdge eNext) { + GLUhalfEdge e; + GLUhalfEdge eSym; + GLUhalfEdge ePrev; + +// EdgePair * pair = (EdgePair *) +// memAlloc(sizeof(EdgePair)); +// if (pair == NULL) return NULL; +// +// e = &pair - > e; + e = new GLUhalfEdge(true); +// eSym = &pair - > eSym; + eSym = new GLUhalfEdge(false); + + + /* Make sure eNext points to the first edge of the edge pair */ + if (!eNext.first) { + eNext = eNext.Sym; + } + + /* Insert in circular doubly-linked list before eNext. + * Note that the prev pointer is stored in Sym->next. + */ + ePrev = eNext.Sym.next; + eSym.next = ePrev; + ePrev.Sym.next = e; + e.next = eNext; + eNext.Sym.next = eSym; + + e.Sym = eSym; + e.Onext = e; + e.Lnext = eSym; + e.Org = null; + e.Lface = null; + e.winding = 0; + e.activeRegion = null; + + eSym.Sym = e; + eSym.Onext = eSym; + eSym.Lnext = e; + eSym.Org = null; + eSym.Lface = null; + eSym.winding = 0; + eSym.activeRegion = null; + + return e; + } + +/* Splice( a, b ) is best described by the Guibas/Stolfi paper or the + * CS348a notes (see mesh.h). Basically it modifies the mesh so that + * a->Onext and b->Onext are exchanged. This can have various effects + * depending on whether a and b belong to different face or vertex rings. + * For more explanation see __gl_meshSplice() below. + */ + static void Splice(GLUhalfEdge a, GLUhalfEdge b) { + GLUhalfEdge aOnext = a.Onext; + GLUhalfEdge bOnext = b.Onext; + + aOnext.Sym.Lnext = b; + bOnext.Sym.Lnext = a; + a.Onext = bOnext; + b.Onext = aOnext; + } + +/* MakeVertex( newVertex, eOrig, vNext ) attaches a new vertex and makes it the + * origin of all edges in the vertex loop to which eOrig belongs. "vNext" gives + * a place to insert the new vertex in the global vertex list. We insert + * the new vertex *before* vNext so that algorithms which walk the vertex + * list will not see the newly created vertices. + */ + static void MakeVertex(GLUvertex newVertex, + GLUhalfEdge eOrig, GLUvertex vNext) { + GLUhalfEdge e; + GLUvertex vPrev; + GLUvertex vNew = newVertex; + + assert (vNew != null); + + /* insert in circular doubly-linked list before vNext */ + vPrev = vNext.prev; + vNew.prev = vPrev; + vPrev.next = vNew; + vNew.next = vNext; + vNext.prev = vNew; + + vNew.anEdge = eOrig; + vNew.data = null; + /* leave coords, s, t undefined */ + + /* fix other edges on this vertex loop */ + e = eOrig; + do { + e.Org = vNew; + e = e.Onext; + } while (e != eOrig); + } + +/* MakeFace( newFace, eOrig, fNext ) attaches a new face and makes it the left + * face of all edges in the face loop to which eOrig belongs. "fNext" gives + * a place to insert the new face in the global face list. We insert + * the new face *before* fNext so that algorithms which walk the face + * list will not see the newly created faces. + */ + static void MakeFace(GLUface newFace, GLUhalfEdge eOrig, GLUface fNext) { + GLUhalfEdge e; + GLUface fPrev; + GLUface fNew = newFace; + + assert (fNew != null); + + /* insert in circular doubly-linked list before fNext */ + fPrev = fNext.prev; + fNew.prev = fPrev; + fPrev.next = fNew; + fNew.next = fNext; + fNext.prev = fNew; + + fNew.anEdge = eOrig; + fNew.data = null; + fNew.trail = null; + fNew.marked = false; + + /* The new face is marked "inside" if the old one was. This is a + * convenience for the common case where a face has been split in two. + */ + fNew.inside = fNext.inside; + + /* fix other edges on this face loop */ + e = eOrig; + do { + e.Lface = fNew; + e = e.Lnext; + } while (e != eOrig); + } + +/* KillEdge( eDel ) destroys an edge (the half-edges eDel and eDel->Sym), + * and removes from the global edge list. + */ + static void KillEdge(GLUhalfEdge eDel) { + GLUhalfEdge ePrev, eNext; + + /* Half-edges are allocated in pairs, see EdgePair above */ + if (!eDel.first) { + eDel = eDel.Sym; + } + + /* delete from circular doubly-linked list */ + eNext = eDel.next; + ePrev = eDel.Sym.next; + eNext.Sym.next = ePrev; + ePrev.Sym.next = eNext; + } + + +/* KillVertex( vDel ) destroys a vertex and removes it from the global + * vertex list. It updates the vertex loop to point to a given new vertex. + */ + static void KillVertex(GLUvertex vDel, GLUvertex newOrg) { + GLUhalfEdge e, eStart = vDel.anEdge; + GLUvertex vPrev, vNext; + + /* change the origin of all affected edges */ + e = eStart; + do { + e.Org = newOrg; + e = e.Onext; + } while (e != eStart); + + /* delete from circular doubly-linked list */ + vPrev = vDel.prev; + vNext = vDel.next; + vNext.prev = vPrev; + vPrev.next = vNext; + } + +/* KillFace( fDel ) destroys a face and removes it from the global face + * list. It updates the face loop to point to a given new face. + */ + static void KillFace(GLUface fDel, GLUface newLface) { + GLUhalfEdge e, eStart = fDel.anEdge; + GLUface fPrev, fNext; + + /* change the left face of all affected edges */ + e = eStart; + do { + e.Lface = newLface; + e = e.Lnext; + } while (e != eStart); + + /* delete from circular doubly-linked list */ + fPrev = fDel.prev; + fNext = fDel.next; + fNext.prev = fPrev; + fPrev.next = fNext; + } + + + /****************** Basic Edge Operations **********************/ + +/* __gl_meshMakeEdge creates one edge, two vertices, and a loop (face). + * The loop consists of the two new half-edges. + */ + public static GLUhalfEdge __gl_meshMakeEdge(GLUmesh mesh) { + GLUvertex newVertex1 = new GLUvertex(); + GLUvertex newVertex2 = new GLUvertex(); + GLUface newFace = new GLUface(); + GLUhalfEdge e; + + e = MakeEdge(mesh.eHead); + if (e == null) return null; + + MakeVertex(newVertex1, e, mesh.vHead); + MakeVertex(newVertex2, e.Sym, mesh.vHead); + MakeFace(newFace, e, mesh.fHead); + return e; + } + + +/* __gl_meshSplice( eOrg, eDst ) is the basic operation for changing the + * mesh connectivity and topology. It changes the mesh so that + * eOrg->Onext <- OLD( eDst->Onext ) + * eDst->Onext <- OLD( eOrg->Onext ) + * where OLD(...) means the value before the meshSplice operation. + * + * This can have two effects on the vertex structure: + * - if eOrg->Org != eDst->Org, the two vertices are merged together + * - if eOrg->Org == eDst->Org, the origin is split into two vertices + * In both cases, eDst->Org is changed and eOrg->Org is untouched. + * + * Similarly (and independently) for the face structure, + * - if eOrg->Lface == eDst->Lface, one loop is split into two + * - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one + * In both cases, eDst->Lface is changed and eOrg->Lface is unaffected. + * + * Some special cases: + * If eDst == eOrg, the operation has no effect. + * If eDst == eOrg->Lnext, the new face will have a single edge. + * If eDst == eOrg->Lprev, the old face will have a single edge. + * If eDst == eOrg->Onext, the new vertex will have a single edge. + * If eDst == eOrg->Oprev, the old vertex will have a single edge. + */ + public static boolean __gl_meshSplice(GLUhalfEdge eOrg, GLUhalfEdge eDst) { + boolean joiningLoops = false; + boolean joiningVertices = false; + + if (eOrg == eDst) return true; + + if (eDst.Org != eOrg.Org) { + /* We are merging two disjoint vertices -- destroy eDst->Org */ + joiningVertices = true; + KillVertex(eDst.Org, eOrg.Org); + } + if (eDst.Lface != eOrg.Lface) { + /* We are connecting two disjoint loops -- destroy eDst.Lface */ + joiningLoops = true; + KillFace(eDst.Lface, eOrg.Lface); + } + + /* Change the edge structure */ + Splice(eDst, eOrg); + + if (!joiningVertices) { + GLUvertex newVertex = new GLUvertex(); + + /* We split one vertex into two -- the new vertex is eDst.Org. + * Make sure the old vertex points to a valid half-edge. + */ + MakeVertex(newVertex, eDst, eOrg.Org); + eOrg.Org.anEdge = eOrg; + } + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We split one loop into two -- the new loop is eDst.Lface. + * Make sure the old face points to a valid half-edge. + */ + MakeFace(newFace, eDst, eOrg.Lface); + eOrg.Lface.anEdge = eOrg; + } + + return true; + } + + +/* __gl_meshDelete( eDel ) removes the edge eDel. There are several cases: + * if (eDel.Lface != eDel.Rface), we join two loops into one; the loop + * eDel.Lface is deleted. Otherwise, we are splitting one loop into two; + * the newly created loop will contain eDel.Dst. If the deletion of eDel + * would create isolated vertices, those are deleted as well. + * + * This function could be implemented as two calls to __gl_meshSplice + * plus a few calls to memFree, but this would allocate and delete + * unnecessary vertices and faces. + */ + static boolean __gl_meshDelete(GLUhalfEdge eDel) { + GLUhalfEdge eDelSym = eDel.Sym; + boolean joiningLoops = false; + + /* First step: disconnect the origin vertex eDel.Org. We make all + * changes to get a consistent mesh in this "intermediate" state. + */ + if (eDel.Lface != eDel.Sym.Lface) { + /* We are joining two loops into one -- remove the left face */ + joiningLoops = true; + KillFace(eDel.Lface, eDel.Sym.Lface); + } + + if (eDel.Onext == eDel) { + KillVertex(eDel.Org, null); + } else { + /* Make sure that eDel.Org and eDel.Sym.Lface point to valid half-edges */ + eDel.Sym.Lface.anEdge = eDel.Sym.Lnext; + eDel.Org.anEdge = eDel.Onext; + + Splice(eDel, eDel.Sym.Lnext); + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We are splitting one loop into two -- create a new loop for eDel. */ + MakeFace(newFace, eDel, eDel.Lface); + } + } + + /* Claim: the mesh is now in a consistent state, except that eDel.Org + * may have been deleted. Now we disconnect eDel.Dst. + */ + if (eDelSym.Onext == eDelSym) { + KillVertex(eDelSym.Org, null); + KillFace(eDelSym.Lface, null); + } else { + /* Make sure that eDel.Dst and eDel.Lface point to valid half-edges */ + eDel.Lface.anEdge = eDelSym.Sym.Lnext; + eDelSym.Org.anEdge = eDelSym.Onext; + Splice(eDelSym, eDelSym.Sym.Lnext); + } + + /* Any isolated vertices or faces have already been freed. */ + KillEdge(eDel); + + return true; + } + + + /******************** Other Edge Operations **********************/ + +/* All these routines can be implemented with the basic edge + * operations above. They are provided for convenience and efficiency. + */ + + +/* __gl_meshAddEdgeVertex( eOrg ) creates a new edge eNew such that + * eNew == eOrg.Lnext, and eNew.Dst is a newly created vertex. + * eOrg and eNew will have the same left face. + */ + static GLUhalfEdge __gl_meshAddEdgeVertex(GLUhalfEdge eOrg) { + GLUhalfEdge eNewSym; + GLUhalfEdge eNew = MakeEdge(eOrg); + + eNewSym = eNew.Sym; + + /* Connect the new edge appropriately */ + Splice(eNew, eOrg.Lnext); + + /* Set the vertex and face information */ + eNew.Org = eOrg.Sym.Org; + { + GLUvertex newVertex = new GLUvertex(); + + MakeVertex(newVertex, eNewSym, eNew.Org); + } + eNew.Lface = eNewSym.Lface = eOrg.Lface; + + return eNew; + } + + +/* __gl_meshSplitEdge( eOrg ) splits eOrg into two edges eOrg and eNew, + * such that eNew == eOrg.Lnext. The new vertex is eOrg.Sym.Org == eNew.Org. + * eOrg and eNew will have the same left face. + */ + public static GLUhalfEdge __gl_meshSplitEdge(GLUhalfEdge eOrg) { + GLUhalfEdge eNew; + GLUhalfEdge tempHalfEdge = __gl_meshAddEdgeVertex(eOrg); + + eNew = tempHalfEdge.Sym; + + /* Disconnect eOrg from eOrg.Sym.Org and connect it to eNew.Org */ + Splice(eOrg.Sym, eOrg.Sym.Sym.Lnext); + Splice(eOrg.Sym, eNew); + + /* Set the vertex and face information */ + eOrg.Sym.Org = eNew.Org; + eNew.Sym.Org.anEdge = eNew.Sym; /* may have pointed to eOrg.Sym */ + eNew.Sym.Lface = eOrg.Sym.Lface; + eNew.winding = eOrg.winding; /* copy old winding information */ + eNew.Sym.winding = eOrg.Sym.winding; + + return eNew; + } + + +/* __gl_meshConnect( eOrg, eDst ) creates a new edge from eOrg.Sym.Org + * to eDst.Org, and returns the corresponding half-edge eNew. + * If eOrg.Lface == eDst.Lface, this splits one loop into two, + * and the newly created loop is eNew.Lface. Otherwise, two disjoint + * loops are merged into one, and the loop eDst.Lface is destroyed. + * + * If (eOrg == eDst), the new face will have only two edges. + * If (eOrg.Lnext == eDst), the old face is reduced to a single edge. + * If (eOrg.Lnext.Lnext == eDst), the old face is reduced to two edges. + */ + static GLUhalfEdge __gl_meshConnect(GLUhalfEdge eOrg, GLUhalfEdge eDst) { + GLUhalfEdge eNewSym; + boolean joiningLoops = false; + GLUhalfEdge eNew = MakeEdge(eOrg); + + eNewSym = eNew.Sym; + + if (eDst.Lface != eOrg.Lface) { + /* We are connecting two disjoint loops -- destroy eDst.Lface */ + joiningLoops = true; + KillFace(eDst.Lface, eOrg.Lface); + } + + /* Connect the new edge appropriately */ + Splice(eNew, eOrg.Lnext); + Splice(eNewSym, eDst); + + /* Set the vertex and face information */ + eNew.Org = eOrg.Sym.Org; + eNewSym.Org = eDst.Org; + eNew.Lface = eNewSym.Lface = eOrg.Lface; + + /* Make sure the old face points to a valid half-edge */ + eOrg.Lface.anEdge = eNewSym; + + if (!joiningLoops) { + GLUface newFace = new GLUface(); + + /* We split one loop into two -- the new loop is eNew.Lface */ + MakeFace(newFace, eNew, eOrg.Lface); + } + return eNew; + } + + + /******************** Other Operations **********************/ + +/* __gl_meshZapFace( fZap ) destroys a face and removes it from the + * global face list. All edges of fZap will have a null pointer as their + * left face. Any edges which also have a null pointer as their right face + * are deleted entirely (along with any isolated vertices this produces). + * An entire mesh can be deleted by zapping its faces, one at a time, + * in any order. Zapped faces cannot be used in further mesh operations! + */ + static void __gl_meshZapFace(GLUface fZap) { + GLUhalfEdge eStart = fZap.anEdge; + GLUhalfEdge e, eNext, eSym; + GLUface fPrev, fNext; + + /* walk around face, deleting edges whose right face is also null */ + eNext = eStart.Lnext; + do { + e = eNext; + eNext = e.Lnext; + + e.Lface = null; + if (e.Sym.Lface == null) { + /* delete the edge -- see __gl_MeshDelete above */ + + if (e.Onext == e) { + KillVertex(e.Org, null); + } else { + /* Make sure that e.Org points to a valid half-edge */ + e.Org.anEdge = e.Onext; + Splice(e, e.Sym.Lnext); + } + eSym = e.Sym; + if (eSym.Onext == eSym) { + KillVertex(eSym.Org, null); + } else { + /* Make sure that eSym.Org points to a valid half-edge */ + eSym.Org.anEdge = eSym.Onext; + Splice(eSym, eSym.Sym.Lnext); + } + KillEdge(e); + } + } while (e != eStart); + + /* delete from circular doubly-linked list */ + fPrev = fZap.prev; + fNext = fZap.next; + fNext.prev = fPrev; + fPrev.next = fNext; + } + + +/* __gl_meshNewMesh() creates a new mesh with no edges, no vertices, + * and no loops (what we usually call a "face"). + */ + public static GLUmesh __gl_meshNewMesh() { + GLUvertex v; + GLUface f; + GLUhalfEdge e; + GLUhalfEdge eSym; + GLUmesh mesh = new GLUmesh(); + + v = mesh.vHead; + f = mesh.fHead; + e = mesh.eHead; + eSym = mesh.eHeadSym; + + v.next = v.prev = v; + v.anEdge = null; + v.data = null; + + f.next = f.prev = f; + f.anEdge = null; + f.data = null; + f.trail = null; + f.marked = false; + f.inside = false; + + e.next = e; + e.Sym = eSym; + e.Onext = null; + e.Lnext = null; + e.Org = null; + e.Lface = null; + e.winding = 0; + e.activeRegion = null; + + eSym.next = eSym; + eSym.Sym = e; + eSym.Onext = null; + eSym.Lnext = null; + eSym.Org = null; + eSym.Lface = null; + eSym.winding = 0; + eSym.activeRegion = null; + + return mesh; + } + + +/* __gl_meshUnion( mesh1, mesh2 ) forms the union of all structures in + * both meshes, and returns the new mesh (the old meshes are destroyed). + */ + static GLUmesh __gl_meshUnion(GLUmesh mesh1, GLUmesh mesh2) { + GLUface f1 = mesh1.fHead; + GLUvertex v1 = mesh1.vHead; + GLUhalfEdge e1 = mesh1.eHead; + GLUface f2 = mesh2.fHead; + GLUvertex v2 = mesh2.vHead; + GLUhalfEdge e2 = mesh2.eHead; + + /* Add the faces, vertices, and edges of mesh2 to those of mesh1 */ + if (f2.next != f2) { + f1.prev.next = f2.next; + f2.next.prev = f1.prev; + f2.prev.next = f1; + f1.prev = f2.prev; + } + + if (v2.next != v2) { + v1.prev.next = v2.next; + v2.next.prev = v1.prev; + v2.prev.next = v1; + v1.prev = v2.prev; + } + + if (e2.next != e2) { + e1.Sym.next.Sym.next = e2.next; + e2.next.Sym.next = e1.Sym.next; + e2.Sym.next.Sym.next = e1; + e1.Sym.next = e2.Sym.next; + } + + return mesh1; + } + + +/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh. + */ + static void __gl_meshDeleteMeshZap(GLUmesh mesh) { + GLUface fHead = mesh.fHead; + + while (fHead.next != fHead) { + __gl_meshZapFace(fHead.next); + } + assert (mesh.vHead.next == mesh.vHead); + } + +/* __gl_meshDeleteMesh( mesh ) will free all storage for any valid mesh. + */ + public static void __gl_meshDeleteMesh(GLUmesh mesh) { + GLUface f, fNext; + GLUvertex v, vNext; + GLUhalfEdge e, eNext; + + for (f = mesh.fHead.next; f != mesh.fHead; f = fNext) { + fNext = f.next; + } + + for (v = mesh.vHead.next; v != mesh.vHead; v = vNext) { + vNext = v.next; + } + + for (e = mesh.eHead.next; e != mesh.eHead; e = eNext) { + /* One call frees both e and e.Sym (see EdgePair above) */ + eNext = e.next; + } + } + +/* __gl_meshCheckMesh( mesh ) checks a mesh for self-consistency. + */ + public static void __gl_meshCheckMesh(GLUmesh mesh) { + GLUface fHead = mesh.fHead; + GLUvertex vHead = mesh.vHead; + GLUhalfEdge eHead = mesh.eHead; + GLUface f, fPrev; + GLUvertex v, vPrev; + GLUhalfEdge e, ePrev; + + fPrev = fHead; + for (fPrev = fHead; (f = fPrev.next) != fHead; fPrev = f) { + assert (f.prev == fPrev); + e = f.anEdge; + do { + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + assert (e.Lface == f); + e = e.Lnext; + } while (e != f.anEdge); + } + assert (f.prev == fPrev && f.anEdge == null && f.data == null); + + vPrev = vHead; + for (vPrev = vHead; (v = vPrev.next) != vHead; vPrev = v) { + assert (v.prev == vPrev); + e = v.anEdge; + do { + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + assert (e.Org == v); + e = e.Onext; + } while (e != v.anEdge); + } + assert (v.prev == vPrev && v.anEdge == null && v.data == null); + + ePrev = eHead; + for (ePrev = eHead; (e = ePrev.next) != eHead; ePrev = e) { + assert (e.Sym.next == ePrev.Sym); + assert (e.Sym != e); + assert (e.Sym.Sym == e); + assert (e.Org != null); + assert (e.Sym.Org != null); + assert (e.Lnext.Onext.Sym == e); + assert (e.Onext.Sym.Lnext == e); + } + assert (e.Sym.next == ePrev.Sym + && e.Sym == mesh.eHeadSym + && e.Sym.Sym == e + && e.Org == null && e.Sym.Org == null + && e.Lface == null && e.Sym.Lface == null); + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Normal.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Normal.java new file mode 100644 index 0000000..cefa61d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Normal.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import org.lwjgl.util.glu.GLU; + +class Normal { + private Normal() { + } + + static boolean SLANTED_SWEEP; + static double S_UNIT_X; /* Pre-normalized */ + static double S_UNIT_Y; + private static final boolean TRUE_PROJECT = false; + + static { + if (SLANTED_SWEEP) { +/* The "feature merging" is not intended to be complete. There are + * special cases where edges are nearly parallel to the sweep line + * which are not implemented. The algorithm should still behave + * robustly (ie. produce a reasonable tesselation) in the presence + * of such edges, however it may miss features which could have been + * merged. We could minimize this effect by choosing the sweep line + * direction to be something unusual (ie. not parallel to one of the + * coordinate axes). + */ + S_UNIT_X = 0.50941539564955385; /* Pre-normalized */ + S_UNIT_Y = 0.86052074622010633; + } else { + S_UNIT_X = 1.0; + S_UNIT_Y = 0.0; + } + } + + private static double Dot(double[] u, double[] v) { + return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]); + } + + static void Normalize(double[] v) { + double len = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + + assert (len > 0); + len = Math.sqrt(len); + v[0] /= len; + v[1] /= len; + v[2] /= len; + } + + static int LongAxis(double[] v) { + int i = 0; + + if (Math.abs(v[1]) > Math.abs(v[0])) { + i = 1; + } + if (Math.abs(v[2]) > Math.abs(v[i])) { + i = 2; + } + return i; + } + + static void ComputeNormal(GLUtessellatorImpl tess, double[] norm) { + GLUvertex v, v1, v2; + double c, tLen2, maxLen2; + double[] maxVal, minVal, d1, d2, tNorm; + GLUvertex[] maxVert, minVert; + GLUvertex vHead = tess.mesh.vHead; + int i; + + maxVal = new double[3]; + minVal = new double[3]; + minVert = new GLUvertex[3]; + maxVert = new GLUvertex[3]; + d1 = new double[3]; + d2 = new double[3]; + tNorm = new double[3]; + + maxVal[0] = maxVal[1] = maxVal[2] = -2 * GLU.TESS_MAX_COORD; + minVal[0] = minVal[1] = minVal[2] = 2 * GLU.TESS_MAX_COORD; + + for (v = vHead.next; v != vHead; v = v.next) { + for (i = 0; i < 3; ++i) { + c = v.coords[i]; + if (c < minVal[i]) { + minVal[i] = c; + minVert[i] = v; + } + if (c > maxVal[i]) { + maxVal[i] = c; + maxVert[i] = v; + } + } + } + +/* Find two vertices separated by at least 1/sqrt(3) of the maximum + * distance between any two vertices + */ + i = 0; + if (maxVal[1] - minVal[1] > maxVal[0] - minVal[0]) { + i = 1; + } + if (maxVal[2] - minVal[2] > maxVal[i] - minVal[i]) { + i = 2; + } + if (minVal[i] >= maxVal[i]) { +/* All vertices are the same -- normal doesn't matter */ + norm[0] = 0; + norm[1] = 0; + norm[2] = 1; + return; + } + +/* Look for a third vertex which forms the triangle with maximum area + * (Length of normal == twice the triangle area) + */ + maxLen2 = 0; + v1 = minVert[i]; + v2 = maxVert[i]; + d1[0] = v1.coords[0] - v2.coords[0]; + d1[1] = v1.coords[1] - v2.coords[1]; + d1[2] = v1.coords[2] - v2.coords[2]; + for (v = vHead.next; v != vHead; v = v.next) { + d2[0] = v.coords[0] - v2.coords[0]; + d2[1] = v.coords[1] - v2.coords[1]; + d2[2] = v.coords[2] - v2.coords[2]; + tNorm[0] = d1[1] * d2[2] - d1[2] * d2[1]; + tNorm[1] = d1[2] * d2[0] - d1[0] * d2[2]; + tNorm[2] = d1[0] * d2[1] - d1[1] * d2[0]; + tLen2 = tNorm[0] * tNorm[0] + tNorm[1] * tNorm[1] + tNorm[2] * tNorm[2]; + if (tLen2 > maxLen2) { + maxLen2 = tLen2; + norm[0] = tNorm[0]; + norm[1] = tNorm[1]; + norm[2] = tNorm[2]; + } + } + + if (maxLen2 <= 0) { +/* All points lie on a single line -- any decent normal will do */ + norm[0] = norm[1] = norm[2] = 0; + norm[LongAxis(d1)] = 1; + } + } + + static void CheckOrientation(GLUtessellatorImpl tess) { + double area; + GLUface f, fHead = tess.mesh.fHead; + GLUvertex v, vHead = tess.mesh.vHead; + GLUhalfEdge e; + +/* When we compute the normal automatically, we choose the orientation + * so that the the sum of the signed areas of all contours is non-negative. + */ + area = 0; + for (f = fHead.next; f != fHead; f = f.next) { + e = f.anEdge; + if (e.winding <= 0) continue; + do { + area += (e.Org.s - e.Sym.Org.s) * (e.Org.t + e.Sym.Org.t); + e = e.Lnext; + } while (e != f.anEdge); + } + if (area < 0) { +/* Reverse the orientation by flipping all the t-coordinates */ + for (v = vHead.next; v != vHead; v = v.next) { + v.t = -v.t; + } + tess.tUnit[0] = -tess.tUnit[0]; + tess.tUnit[1] = -tess.tUnit[1]; + tess.tUnit[2] = -tess.tUnit[2]; + } + } + +/* Determine the polygon normal and project vertices onto the plane + * of the polygon. + */ + public static void __gl_projectPolygon(GLUtessellatorImpl tess) { + GLUvertex v, vHead = tess.mesh.vHead; + double w; + double[] norm = new double[3]; + double[] sUnit, tUnit; + int i; + boolean computedNormal = false; + + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if (norm[0] == 0 && norm[1] == 0 && norm[2] == 0) { + ComputeNormal(tess, norm); + computedNormal = true; + } + sUnit = tess.sUnit; + tUnit = tess.tUnit; + i = LongAxis(norm); + + if (TRUE_PROJECT) { +/* Choose the initial sUnit vector to be approximately perpendicular + * to the normal. + */ + Normalize(norm); + + sUnit[i] = 0; + sUnit[(i + 1) % 3] = S_UNIT_X; + sUnit[(i + 2) % 3] = S_UNIT_Y; + +/* Now make it exactly perpendicular */ + w = Dot(sUnit, norm); + sUnit[0] -= w * norm[0]; + sUnit[1] -= w * norm[1]; + sUnit[2] -= w * norm[2]; + Normalize(sUnit); + +/* Choose tUnit so that (sUnit,tUnit,norm) form a right-handed frame */ + tUnit[0] = norm[1] * sUnit[2] - norm[2] * sUnit[1]; + tUnit[1] = norm[2] * sUnit[0] - norm[0] * sUnit[2]; + tUnit[2] = norm[0] * sUnit[1] - norm[1] * sUnit[0]; + Normalize(tUnit); + } else { +/* Project perpendicular to a coordinate axis -- better numerically */ + sUnit[i] = 0; + sUnit[(i + 1) % 3] = S_UNIT_X; + sUnit[(i + 2) % 3] = S_UNIT_Y; + + tUnit[i] = 0; + tUnit[(i + 1) % 3] = (norm[i] > 0) ? -S_UNIT_Y : S_UNIT_Y; + tUnit[(i + 2) % 3] = (norm[i] > 0) ? S_UNIT_X : -S_UNIT_X; + } + +/* Project the vertices onto the sweep plane */ + for (v = vHead.next; v != vHead; v = v.next) { + v.s = Dot(v.coords, sUnit); + v.t = Dot(v.coords, tUnit); + } + if (computedNormal) { + CheckOrientation(tess); + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQ.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQ.java new file mode 100644 index 0000000..574abe2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQ.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +abstract class PriorityQ { + public static final int INIT_SIZE = 32; + + public static class PQnode { + int handle; + } + + public static class PQhandleElem { + Object key; + int node; + } + + public interface Leq { + boolean leq(Object key1, Object key2); + } + + // #ifdef FOR_TRITE_TEST_PROGRAM +// private static boolean LEQ(PriorityQCommon.Leq leq, Object x,Object y) { +// return pq.leq.leq(x,y); +// } +// #else +/* Violates modularity, but a little faster */ +// #include "geom.h" + public static boolean LEQ(Leq leq, Object x, Object y) { + return Geom.VertLeq((GLUvertex) x, (GLUvertex) y); + } + + static PriorityQ pqNewPriorityQ(Leq leq) { + return new PriorityQSort(leq); + } + + abstract void pqDeletePriorityQ(); + + abstract boolean pqInit(); + + abstract int pqInsert(Object keyNew); + + abstract Object pqExtractMin(); + + abstract void pqDelete(int hCurr); + + abstract Object pqMinimum(); + + abstract boolean pqIsEmpty(); +// #endif +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java new file mode 100644 index 0000000..4a1232e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQHeap.java @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class PriorityQHeap extends PriorityQ { + PriorityQ.PQnode[] nodes; + PriorityQ.PQhandleElem[] handles; + int size, max; + int freeList; + boolean initialized; + PriorityQ.Leq leq; + +/* really __gl_pqHeapNewPriorityQ */ +PriorityQHeap(PriorityQ.Leq leq) { + size = 0; + max = PriorityQ.INIT_SIZE; + nodes = new PriorityQ.PQnode[PriorityQ.INIT_SIZE + 1]; + for (int i = 0; i < nodes.length; i++) { + nodes[i] = new PQnode(); + } + handles = new PriorityQ.PQhandleElem[PriorityQ.INIT_SIZE + 1]; + for (int i = 0; i < handles.length; i++) { + handles[i] = new PQhandleElem(); + } + initialized = false; + freeList = 0; + this.leq = leq; + + nodes[1].handle = 1; /* so that Minimum() returns NULL */ + handles[1].key = null; + } + +/* really __gl_pqHeapDeletePriorityQ */ + void pqDeletePriorityQ() { + handles = null; + nodes = null; + } + + void FloatDown(int curr) { + PriorityQ.PQnode[] n = nodes; + PriorityQ.PQhandleElem[] h = handles; + int hCurr, hChild; + int child; + + hCurr = n[curr].handle; + for (; ;) { + child = curr << 1; + if (child < size && LEQ(leq, h[n[child + 1].handle].key, + h[n[child].handle].key)) { + ++child; + } + + assert (child <= max); + + hChild = n[child].handle; + if (child > size || LEQ(leq, h[hCurr].key, h[hChild].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break; + } + n[curr].handle = hChild; + h[hChild].node = curr; + curr = child; + } + } + + + void FloatUp(int curr) { + PriorityQ.PQnode[] n = nodes; + PriorityQ.PQhandleElem[] h = handles; + int hCurr, hParent; + int parent; + + hCurr = n[curr].handle; + for (; ;) { + parent = curr >> 1; + hParent = n[parent].handle; + if (parent == 0 || LEQ(leq, h[hParent].key, h[hCurr].key)) { + n[curr].handle = hCurr; + h[hCurr].node = curr; + break; + } + n[curr].handle = hParent; + h[hParent].node = curr; + curr = parent; + } + } + +/* really __gl_pqHeapInit */ + boolean pqInit() { + int i; + + /* This method of building a heap is O(n), rather than O(n lg n). */ + + for (i = size; i >= 1; --i) { + FloatDown(i); + } + initialized = true; + + return true; + } + +/* really __gl_pqHeapInsert */ +/* returns LONG_MAX iff out of memory */ + int pqInsert(Object keyNew) { + int curr; + int free; + + curr = ++size; + if ((curr * 2) > max) { + PriorityQ.PQnode[] saveNodes = nodes; + PriorityQ.PQhandleElem[] saveHandles = handles; + + /* If the heap overflows, double its size. */ + max <<= 1; +// pq->nodes = (PQnode *)memRealloc( pq->nodes, (size_t) ((pq->max + 1) * sizeof( pq->nodes[0] ))); + PriorityQ.PQnode[] pqNodes = new PriorityQ.PQnode[max + 1]; + System.arraycopy( nodes, 0, pqNodes, 0, nodes.length ); + for (int i = nodes.length; i < pqNodes.length; i++) { + pqNodes[i] = new PQnode(); + } + nodes = pqNodes; + if (nodes == null) { + nodes = saveNodes; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + +// pq->handles = (PQhandleElem *)memRealloc( pq->handles,(size_t)((pq->max + 1) * sizeof( pq->handles[0] ))); + PriorityQ.PQhandleElem[] pqHandles = new PriorityQ.PQhandleElem[max + 1]; + System.arraycopy( handles, 0, pqHandles, 0, handles.length ); + for (int i = handles.length; i < pqHandles.length; i++) { + pqHandles[i] = new PQhandleElem(); + } + handles = pqHandles; + if (handles == null) { + handles = saveHandles; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + } + + if (freeList == 0) { + free = curr; + } else { + free = freeList; + freeList = handles[free].node; + } + + nodes[curr].handle = free; + handles[free].node = curr; + handles[free].key = keyNew; + + if (initialized) { + FloatUp(curr); + } + assert (free != Integer.MAX_VALUE); + return free; + } + +/* really __gl_pqHeapExtractMin */ + Object pqExtractMin() { + PriorityQ.PQnode[] n = nodes; + PriorityQ.PQhandleElem[] h = handles; + int hMin = n[1].handle; + Object min = h[hMin].key; + + if (size > 0) { + n[1].handle = n[size].handle; + h[n[1].handle].node = 1; + + h[hMin].key = null; + h[hMin].node = freeList; + freeList = hMin; + + if (--size > 0) { + FloatDown(1); + } + } + return min; + } + +/* really __gl_pqHeapDelete */ + void pqDelete(int hCurr) { + PriorityQ.PQnode[] n = nodes; + PriorityQ.PQhandleElem[] h = handles; + int curr; + + assert (hCurr >= 1 && hCurr <= max && h[hCurr].key != null); + + curr = h[hCurr].node; + n[curr].handle = n[size].handle; + h[n[curr].handle].node = curr; + + if (curr <= --size) { + if (curr <= 1 || LEQ(leq, h[n[curr >> 1].handle].key, h[n[curr].handle].key)) { + FloatDown(curr); + } else { + FloatUp(curr); + } + } + h[hCurr].key = null; + h[hCurr].node = freeList; + freeList = hCurr; + } + + Object pqMinimum() { + return handles[nodes[1].handle].key; + } + + boolean pqIsEmpty() { + return size == 0; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java new file mode 100644 index 0000000..ef30d07 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/PriorityQSort.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + + + +class PriorityQSort extends PriorityQ { + PriorityQHeap heap; + Object[] keys; + + // JAVA: 'order' contains indices into the keys array. + // This simulates the indirect pointers used in the original C code + // (from Frank Suykens, Luciad.com). + int[] order; + int size, max; + boolean initialized; + PriorityQ.Leq leq; + + PriorityQSort(PriorityQ.Leq leq) { + heap = new PriorityQHeap(leq); + + keys = new Object[PriorityQ.INIT_SIZE]; + + size = 0; + max = PriorityQ.INIT_SIZE; + initialized = false; + this.leq = leq; + } + +/* really __gl_pqSortDeletePriorityQ */ + void pqDeletePriorityQ() { + if (heap != null) heap.pqDeletePriorityQ(); + order = null; + keys = null; + } + + private static boolean LT(PriorityQ.Leq leq, Object x, Object y) { + return (!PriorityQHeap.LEQ(leq, y, x)); + } + + private static boolean GT(PriorityQ.Leq leq, Object x, Object y) { + return (!PriorityQHeap.LEQ(leq, x, y)); + } + + private static void Swap(int[] array, int a, int b) { + if (true) { + int tmp = array[a]; + array[a] = array[b]; + array[b] = tmp; + } else { + + } + } + + private static class Stack { + int p, r; + } + +/* really __gl_pqSortInit */ + boolean pqInit() { + int p, r, i, j; + int piv; + Stack[] stack = new Stack[50]; + for (int k = 0; k < stack.length; k++) { + stack[k] = new Stack(); + } + int top = 0; + + int seed = 2016473283; + + /* Create an array of indirect pointers to the keys, so that we + * the handles we have returned are still valid. + */ + order = new int[size + 1]; +/* the previous line is a patch to compensate for the fact that IBM */ +/* machines return a null on a malloc of zero bytes (unlike SGI), */ +/* so we have to put in this defense to guard against a memory */ +/* fault four lines down. from fossum@austin.ibm.com. */ + p = 0; + r = size - 1; + for (piv = 0, i = p; i <= r; ++piv, ++i) { + // indirect pointers: keep an index into the keys array, not a direct pointer to its contents + order[i] = piv; + } + + /* Sort the indirect pointers in descending order, + * using randomized Quicksort + */ + stack[top].p = p; + stack[top].r = r; + ++top; + while (--top >= 0) { + p = stack[top].p; + r = stack[top].r; + while (r > p + 10) { + seed = Math.abs( seed * 1539415821 + 1 ); + i = p + seed % (r - p + 1); + piv = order[i]; + order[i] = order[p]; + order[p] = piv; + i = p - 1; + j = r + 1; + do { + do { + ++i; + } while (GT(leq, keys[order[i]], keys[piv])); + do { + --j; + } while (LT(leq, keys[order[j]], keys[piv])); + Swap(order, i, j); + } while (i < j); + Swap(order, i, j); /* Undo last swap */ + if (i - p < r - j) { + stack[top].p = j + 1; + stack[top].r = r; + ++top; + r = i - 1; + } else { + stack[top].p = p; + stack[top].r = i - 1; + ++top; + p = j + 1; + } + } + /* Insertion sort small lists */ + for (i = p + 1; i <= r; ++i) { + piv = order[i]; + for (j = i; j > p && LT(leq, keys[order[j - 1]], keys[piv]); --j) { + order[j] = order[j - 1]; + } + order[j] = piv; + } + } + max = size; + initialized = true; + heap.pqInit(); /* always succeeds */ + +/* #ifndef NDEBUG + p = order; + r = p + size - 1; + for (i = p; i < r; ++i) { + Assertion.doAssert(LEQ( * * (i + 1), **i )); + } + #endif*/ + + return true; + } + +/* really __gl_pqSortInsert */ +/* returns LONG_MAX iff out of memory */ + int pqInsert(Object keyNew) { + int curr; + + if (initialized) { + return heap.pqInsert(keyNew); + } + curr = size; + if (++size >= max) { + Object[] saveKey = keys; + + /* If the heap overflows, double its size. */ + max <<= 1; +// pq->keys = (PQHeapKey *)memRealloc( pq->keys,(size_t)(pq->max * sizeof( pq->keys[0] ))); + Object[] pqKeys = new Object[max]; + System.arraycopy( keys, 0, pqKeys, 0, keys.length ); + keys = pqKeys; + if (keys == null) { + keys = saveKey; /* restore ptr to free upon return */ + return Integer.MAX_VALUE; + } + } + assert curr != Integer.MAX_VALUE; + keys[curr] = keyNew; + + /* Negative handles index the sorted array. */ + return -(curr + 1); + } + +/* really __gl_pqSortExtractMin */ + Object pqExtractMin() { + Object sortMin, heapMin; + + if (size == 0) { + return heap.pqExtractMin(); + } + sortMin = keys[order[size - 1]]; + if (!heap.pqIsEmpty()) { + heapMin = heap.pqMinimum(); + if (LEQ(leq, heapMin, sortMin)) { + return heap.pqExtractMin(); + } + } + do { + --size; + } while (size > 0 && keys[order[size - 1]] == null); + return sortMin; + } + +/* really __gl_pqSortMinimum */ + Object pqMinimum() { + Object sortMin, heapMin; + + if (size == 0) { + return heap.pqMinimum(); + } + sortMin = keys[order[size - 1]]; + if (!heap.pqIsEmpty()) { + heapMin = heap.pqMinimum(); + if (PriorityQHeap.LEQ(leq, heapMin, sortMin)) { + return heapMin; + } + } + return sortMin; + } + +/* really __gl_pqSortIsEmpty */ + boolean pqIsEmpty() { + return (size == 0) && heap.pqIsEmpty(); + } + +/* really __gl_pqSortDelete */ + void pqDelete(int curr) { + if (curr >= 0) { + heap.pqDelete(curr); + return; + } + curr = -(curr + 1); + assert curr < max && keys[curr] != null; + + keys[curr] = null; + while (size > 0 && keys[order[size - 1]] == null) { + --size; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Render.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Render.java new file mode 100644 index 0000000..b4c1031 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Render.java @@ -0,0 +1,589 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.util.glu.GLU.*; + +class Render { + private static final boolean USE_OPTIMIZED_CODE_PATH = false; + + private Render() { + } + + private static final RenderFan renderFan = new RenderFan(); + private static final RenderStrip renderStrip = new RenderStrip(); + private static final RenderTriangle renderTriangle = new RenderTriangle(); + +/* This structure remembers the information we need about a primitive + * to be able to render it later, once we have determined which + * primitive is able to use the most triangles. + */ + private static class FaceCount { + private FaceCount() { + } + + private FaceCount(long size, GLUhalfEdge eStart, renderCallBack render) { + this.size = size; + this.eStart = eStart; + this.render = render; + } + + long size; /* number of triangles used */ + GLUhalfEdge eStart; /* edge where this primitive starts */ + renderCallBack render; + }; + + private interface renderCallBack { + void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size); + } + + /************************ Strips and Fans decomposition ******************/ + +/* __gl_renderMesh( tess, mesh ) takes a mesh and breaks it into triangle + * fans, strips, and separate triangles. A substantial effort is made + * to use as few rendering primitives as possible (ie. to make the fans + * and strips as large as possible). + * + * The rendering output is provided as callbacks (see the api). + */ + public static void __gl_renderMesh(GLUtessellatorImpl tess, GLUmesh mesh) { + GLUface f; + + /* Make a list of separate triangles so we can render them all at once */ + tess.lonelyTriList = null; + + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + f.marked = false; + } + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + + /* We examine all faces in an arbitrary order. Whenever we find + * an unprocessed face F, we output a group of faces including F + * whose size is maximum. + */ + if (f.inside && !f.marked) { + RenderMaximumFaceGroup(tess, f); + assert (f.marked); + } + } + if (tess.lonelyTriList != null) { + RenderLonelyTriangles(tess, tess.lonelyTriList); + tess.lonelyTriList = null; + } + } + + + static void RenderMaximumFaceGroup(GLUtessellatorImpl tess, GLUface fOrig) { + /* We want to find the largest triangle fan or strip of unmarked faces + * which includes the given face fOrig. There are 3 possible fans + * passing through fOrig (one centered at each vertex), and 3 possible + * strips (one for each CCW permutation of the vertices). Our strategy + * is to try all of these, and take the primitive which uses the most + * triangles (a greedy approach). + */ + GLUhalfEdge e = fOrig.anEdge; + FaceCount max = new FaceCount(); + FaceCount newFace; + + max.size = 1; + max.eStart = e; + max.render = renderTriangle; + + if (!tess.flagBoundary) { + newFace = MaximumFan(e); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumFan(e.Lnext); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumFan(e.Onext.Sym); + if (newFace.size > max.size) { + max = newFace; + } + + newFace = MaximumStrip(e); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumStrip(e.Lnext); + if (newFace.size > max.size) { + max = newFace; + } + newFace = MaximumStrip(e.Onext.Sym); + if (newFace.size > max.size) { + max = newFace; + } + } + max.render.render(tess, max.eStart, max.size); + } + + +/* Macros which keep track of faces we have marked temporarily, and allow + * us to backtrack when necessary. With triangle fans, this is not + * really necessary, since the only awkward case is a loop of triangles + * around a single origin vertex. However with strips the situation is + * more complicated, and we need a general tracking method like the + * one here. + */ + private static boolean Marked(GLUface f) { + return !f.inside || f.marked; + } + + private static GLUface AddToTrail(GLUface f, GLUface t) { + f.trail = t; + f.marked = true; + return f; + } + + private static void FreeTrail(GLUface t) { + if (true) { + while (t != null) { + t.marked = false; + t = t.trail; + } + } else { + /* absorb trailing semicolon */ + } + } + + static FaceCount MaximumFan(GLUhalfEdge eOrig) { + /* eOrig.Lface is the face we want to render. We want to find the size + * of a maximal fan around eOrig.Org. To do this we just walk around + * the origin vertex as far as possible in both directions. + */ + FaceCount newFace = new FaceCount(0, null, renderFan); + GLUface trail = null; + GLUhalfEdge e; + + for (e = eOrig; !Marked(e.Lface); e = e.Onext) { + trail = AddToTrail(e.Lface, trail); + ++newFace.size; + } + for (e = eOrig; !Marked(e.Sym.Lface); e = e.Sym.Lnext) { + trail = AddToTrail(e.Sym.Lface, trail); + ++newFace.size; + } + newFace.eStart = e; + /*LINTED*/ + FreeTrail(trail); + return newFace; + } + + + private static boolean IsEven(long n) { + return (n & 0x1L) == 0; + } + + static FaceCount MaximumStrip(GLUhalfEdge eOrig) { + /* Here we are looking for a maximal strip that contains the vertices + * eOrig.Org, eOrig.Dst, eOrig.Lnext.Dst (in that order or the + * reverse, such that all triangles are oriented CCW). + * + * Again we walk forward and backward as far as possible. However for + * strips there is a twist: to get CCW orientations, there must be + * an *even* number of triangles in the strip on one side of eOrig. + * We walk the strip starting on a side with an even number of triangles; + * if both side have an odd number, we are forced to shorten one side. + */ + FaceCount newFace = new FaceCount(0, null, renderStrip); + long headSize = 0, tailSize = 0; + GLUface trail = null; + GLUhalfEdge e, eTail, eHead; + + for (e = eOrig; !Marked(e.Lface); ++tailSize, e = e.Onext) { + trail = AddToTrail(e.Lface, trail); + ++tailSize; + e = e.Lnext.Sym; + if (Marked(e.Lface)) break; + trail = AddToTrail(e.Lface, trail); + } + eTail = e; + + for (e = eOrig; !Marked(e.Sym.Lface); ++headSize, e = e.Sym.Onext.Sym) { + trail = AddToTrail(e.Sym.Lface, trail); + ++headSize; + e = e.Sym.Lnext; + if (Marked(e.Sym.Lface)) break; + trail = AddToTrail(e.Sym.Lface, trail); + } + eHead = e; + + newFace.size = tailSize + headSize; + if (IsEven(tailSize)) { + newFace.eStart = eTail.Sym; + } else if (IsEven(headSize)) { + newFace.eStart = eHead; + } else { + /* Both sides have odd length, we must shorten one of them. In fact, + * we must start from eHead to guarantee inclusion of eOrig.Lface. + */ + --newFace.size; + newFace.eStart = eHead.Onext; + } + /*LINTED*/ + FreeTrail(trail); + return newFace; + } + + private static class RenderTriangle implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Just add the triangle to a triangle list, so we can render all + * the separate triangles at once. + */ + assert (size == 1); + tess.lonelyTriList = AddToTrail(e.Lface, tess.lonelyTriList); + } + } + + + static void RenderLonelyTriangles(GLUtessellatorImpl tess, GLUface f) { + /* Now we render all the separate triangles which could not be + * grouped into a triangle fan or strip. + */ + GLUhalfEdge e; + int newState; + int edgeState = -1; /* force edge state output for first vertex */ + + tess.callBeginOrBeginData(GL_TRIANGLES); + + for (; f != null; f = f.trail) { + /* Loop once for each edge (there will always be 3 edges) */ + + e = f.anEdge; + do { + if (tess.flagBoundary) { + /* Set the "edge state" to true just before we output the + * first vertex of each edge on the polygon boundary. + */ + newState = (!e.Sym.Lface.inside) ? 1 : 0; + if (edgeState != newState) { + edgeState = newState; + tess.callEdgeFlagOrEdgeFlagData( edgeState != 0); + } + } + tess.callVertexOrVertexData( e.Org.data); + + e = e.Lnext; + } while (e != f.anEdge); + } + tess.callEndOrEndData(); + } + + private static class RenderFan implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Render as many CCW triangles as possible in a fan starting from + * edge "e". The fan *should* contain exactly "size" triangles + * (otherwise we've goofed up somewhere). + */ + tess.callBeginOrBeginData(GL_TRIANGLE_FAN); + tess.callVertexOrVertexData( e.Org.data); + tess.callVertexOrVertexData( e.Sym.Org.data); + + while (!Marked(e.Lface)) { + e.Lface.marked = true; + --size; + e = e.Onext; + tess.callVertexOrVertexData( e.Sym.Org.data); + } + + assert (size == 0); + tess.callEndOrEndData(); + } + } + + private static class RenderStrip implements renderCallBack { + public void render(GLUtessellatorImpl tess, GLUhalfEdge e, long size) { + /* Render as many CCW triangles as possible in a strip starting from + * edge "e". The strip *should* contain exactly "size" triangles + * (otherwise we've goofed up somewhere). + */ + tess.callBeginOrBeginData(GL_TRIANGLE_STRIP); + tess.callVertexOrVertexData( e.Org.data); + tess.callVertexOrVertexData( e.Sym.Org.data); + + while (!Marked(e.Lface)) { + e.Lface.marked = true; + --size; + e = e.Lnext.Sym; + tess.callVertexOrVertexData( e.Org.data); + if (Marked(e.Lface)) break; + + e.Lface.marked = true; + --size; + e = e.Onext; + tess.callVertexOrVertexData( e.Sym.Org.data); + } + + assert (size == 0); + tess.callEndOrEndData(); + } + } + + /************************ Boundary contour decomposition ******************/ + +/* __gl_renderBoundary( tess, mesh ) takes a mesh, and outputs one + * contour for each face marked "inside". The rendering output is + * provided as callbacks (see the api). + */ + public static void __gl_renderBoundary(GLUtessellatorImpl tess, GLUmesh mesh) { + GLUface f; + GLUhalfEdge e; + + for (f = mesh.fHead.next; f != mesh.fHead; f = f.next) { + if (f.inside) { + tess.callBeginOrBeginData(GL_LINE_LOOP); + e = f.anEdge; + do { + tess.callVertexOrVertexData( e.Org.data); + e = e.Lnext; + } while (e != f.anEdge); + tess.callEndOrEndData(); + } + } + } + + + /************************ Quick-and-dirty decomposition ******************/ + + private static final int SIGN_INCONSISTENT = 2; + + static int ComputeNormal(GLUtessellatorImpl tess, double[] norm, boolean check) +/* + * If check==false, we compute the polygon normal and place it in norm[]. + * If check==true, we check that each triangle in the fan from v0 has a + * consistent orientation with respect to norm[]. If triangles are + * consistently oriented CCW, return 1; if CW, return -1; if all triangles + * are degenerate return 0; otherwise (no consistent orientation) return + * SIGN_INCONSISTENT. + */ { + CachedVertex[] v = tess.cache; +// CachedVertex vn = v0 + tess.cacheCount; + int vn = tess.cacheCount; +// CachedVertex vc; + int vc; + double dot, xc, yc, zc, xp, yp, zp; + double[] n = new double[3]; + int sign = 0; + + /* Find the polygon normal. It is important to get a reasonable + * normal even when the polygon is self-intersecting (eg. a bowtie). + * Otherwise, the computed normal could be very tiny, but perpendicular + * to the true plane of the polygon due to numerical noise. Then all + * the triangles would appear to be degenerate and we would incorrectly + * decompose the polygon as a fan (or simply not render it at all). + * + * We use a sum-of-triangles normal algorithm rather than the more + * efficient sum-of-trapezoids method (used in CheckOrientation() + * in normal.c). This lets us explicitly reverse the signed area + * of some triangles to get a reasonable normal in the self-intersecting + * case. + */ + if (!check) { + norm[0] = norm[1] = norm[2] = 0.0; + } + + vc = 1; + xc = v[vc].coords[0] - v[0].coords[0]; + yc = v[vc].coords[1] - v[0].coords[1]; + zc = v[vc].coords[2] - v[0].coords[2]; + while (++vc < vn) { + xp = xc; + yp = yc; + zp = zc; + xc = v[vc].coords[0] - v[0].coords[0]; + yc = v[vc].coords[1] - v[0].coords[1]; + zc = v[vc].coords[2] - v[0].coords[2]; + + /* Compute (vp - v0) cross (vc - v0) */ + n[0] = yp * zc - zp * yc; + n[1] = zp * xc - xp * zc; + n[2] = xp * yc - yp * xc; + + dot = n[0] * norm[0] + n[1] * norm[1] + n[2] * norm[2]; + if (!check) { + /* Reverse the contribution of back-facing triangles to get + * a reasonable normal for self-intersecting polygons (see above) + */ + if (dot >= 0) { + norm[0] += n[0]; + norm[1] += n[1]; + norm[2] += n[2]; + } else { + norm[0] -= n[0]; + norm[1] -= n[1]; + norm[2] -= n[2]; + } + } else if (dot != 0) { + /* Check the new orientation for consistency with previous triangles */ + if (dot > 0) { + if (sign < 0) return SIGN_INCONSISTENT; + sign = 1; + } else { + if (sign > 0) return SIGN_INCONSISTENT; + sign = -1; + } + } + } + return sign; + } + +/* __gl_renderCache( tess ) takes a single contour and tries to render it + * as a triangle fan. This handles convex polygons, as well as some + * non-convex polygons if we get lucky. + * + * Returns true if the polygon was successfully rendered. The rendering + * output is provided as callbacks (see the api). + */ + public static boolean __gl_renderCache(GLUtessellatorImpl tess) { + CachedVertex[] v = tess.cache; +// CachedVertex vn = v0 + tess.cacheCount; + int vn = tess.cacheCount; +// CachedVertex vc; + int vc; + double[] norm = new double[3]; + int sign; + + if (tess.cacheCount < 3) { + /* Degenerate contour -- no output */ + return true; + } + + norm[0] = tess.normal[0]; + norm[1] = tess.normal[1]; + norm[2] = tess.normal[2]; + if (norm[0] == 0 && norm[1] == 0 && norm[2] == 0) { + ComputeNormal( tess, norm, false); + } + + sign = ComputeNormal( tess, norm, true); + if (sign == SIGN_INCONSISTENT) { + /* Fan triangles did not have a consistent orientation */ + return false; + } + if (sign == 0) { + /* All triangles were degenerate */ + return true; + } + + if ( !USE_OPTIMIZED_CODE_PATH ) { + return false; + } else { + /* Make sure we do the right thing for each winding rule */ + switch (tess.windingRule) { + case GLU_TESS_WINDING_ODD: + case GLU_TESS_WINDING_NONZERO: + break; + case GLU_TESS_WINDING_POSITIVE: + if (sign < 0) return true; + break; + case GLU_TESS_WINDING_NEGATIVE: + if (sign > 0) return true; + break; + case GLU_TESS_WINDING_ABS_GEQ_TWO: + return true; + } + + tess.callBeginOrBeginData( tess.boundaryOnly ? GL_LINE_LOOP + : (tess.cacheCount > 3) ? GL_TRIANGLE_FAN + : GL_TRIANGLES); + + tess.callVertexOrVertexData( v[0].data); + if (sign > 0) { + for (vc = 1; vc < vn; ++vc) { + tess.callVertexOrVertexData( v[vc].data); + } + } else { + for (vc = vn - 1; vc > 0; --vc) { + tess.callVertexOrVertexData( v[vc].data); + } + } + tess.callEndOrEndData(); + return true; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Sweep.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Sweep.java new file mode 100644 index 0000000..c96819f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/Sweep.java @@ -0,0 +1,1384 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +import static org.lwjgl.util.glu.GLU.*; + +class Sweep { + private Sweep() { + } + +// #ifdef FOR_TRITE_TEST_PROGRAM +// extern void DebugEvent( GLUtessellator *tess ); +// #else + private static void DebugEvent(GLUtessellatorImpl tess) { + + } +// #endif + +/* + * Invariants for the Edge Dictionary. + * - each pair of adjacent edges e2=Succ(e1) satisfies EdgeLeq(e1,e2) + * at any valid location of the sweep event + * - if EdgeLeq(e2,e1) as well (at any valid sweep event), then e1 and e2 + * share a common endpoint + * - for each e, e.Dst has been processed, but not e.Org + * - each edge e satisfies VertLeq(e.Dst,event) && VertLeq(event,e.Org) + * where "event" is the current sweep line event. + * - no edge e has zero length + * + * Invariants for the Mesh (the processed portion). + * - the portion of the mesh left of the sweep line is a planar graph, + * ie. there is *some* way to embed it in the plane + * - no processed edge has zero length + * - no two processed vertices have identical coordinates + * - each "inside" region is monotone, ie. can be broken into two chains + * of monotonically increasing vertices according to VertLeq(v1,v2) + * - a non-invariant: these chains may intersect (very slightly) + * + * Invariants for the Sweep. + * - if none of the edges incident to the event vertex have an activeRegion + * (ie. none of these edges are in the edge dictionary), then the vertex + * has only right-going edges. + * - if an edge is marked "fixUpperEdge" (it is a temporary edge introduced + * by ConnectRightVertex), then it is the only right-going edge from + * its associated vertex. (This says that these edges exist only + * when it is necessary.) + */ + +/* When we merge two edges into one, we need to compute the combined + * winding of the new edge. + */ + private static void AddWinding(GLUhalfEdge eDst, GLUhalfEdge eSrc) { + eDst.winding += eSrc.winding; + eDst.Sym.winding += eSrc.Sym.winding; + } + + + private static ActiveRegion RegionBelow(ActiveRegion r) { + return ((ActiveRegion) Dict.dictKey(Dict.dictPred(r.nodeUp))); + } + + private static ActiveRegion RegionAbove(ActiveRegion r) { + return ((ActiveRegion) Dict.dictKey(Dict.dictSucc(r.nodeUp))); + } + + static boolean EdgeLeq(GLUtessellatorImpl tess, ActiveRegion reg1, ActiveRegion reg2) +/* + * Both edges must be directed from right to left (this is the canonical + * direction for the upper edge of each region). + * + * The strategy is to evaluate a "t" value for each edge at the + * current sweep line position, given by tess.event. The calculations + * are designed to be very stable, but of course they are not perfect. + * + * Special case: if both edge destinations are at the sweep event, + * we sort the edges by slope (they would otherwise compare equally). + */ { + GLUvertex event = tess.event; + GLUhalfEdge e1, e2; + double t1, t2; + + e1 = reg1.eUp; + e2 = reg2.eUp; + + if (e1.Sym.Org == event) { + if (e2.Sym.Org == event) { + /* Two edges right of the sweep line which meet at the sweep event. + * Sort them by slope. + */ + if (Geom.VertLeq(e1.Org, e2.Org)) { + return Geom.EdgeSign(e2.Sym.Org, e1.Org, e2.Org) <= 0; + } + return Geom.EdgeSign(e1.Sym.Org, e2.Org, e1.Org) >= 0; + } + return Geom.EdgeSign(e2.Sym.Org, event, e2.Org) <= 0; + } + if (e2.Sym.Org == event) { + return Geom.EdgeSign(e1.Sym.Org, event, e1.Org) >= 0; + } + + /* General case - compute signed distance *from* e1, e2 to event */ + t1 = Geom.EdgeEval(e1.Sym.Org, event, e1.Org); + t2 = Geom.EdgeEval(e2.Sym.Org, event, e2.Org); + return (t1 >= t2); + } + + + static void DeleteRegion(GLUtessellatorImpl tess, ActiveRegion reg) { + if (reg.fixUpperEdge) { + /* It was created with zero winding number, so it better be + * deleted with zero winding number (ie. it better not get merged + * with a real edge). + */ + assert (reg.eUp.winding == 0); + } + reg.eUp.activeRegion = null; + Dict.dictDelete(tess.dict, reg.nodeUp); /* __gl_dictListDelete */ + } + + + static boolean FixUpperEdge(ActiveRegion reg, GLUhalfEdge newEdge) +/* + * Replace an upper edge which needs fixing (see ConnectRightVertex). + */ { + assert (reg.fixUpperEdge); + if (!Mesh.__gl_meshDelete(reg.eUp)) return false; + reg.fixUpperEdge = false; + reg.eUp = newEdge; + newEdge.activeRegion = reg; + + return true; + } + + static ActiveRegion TopLeftRegion(ActiveRegion reg) { + GLUvertex org = reg.eUp.Org; + GLUhalfEdge e; + + /* Find the region above the uppermost edge with the same origin */ + do { + reg = RegionAbove(reg); + } while (reg.eUp.Org == org); + + /* If the edge above was a temporary edge introduced by ConnectRightVertex, + * now is the time to fix it. + */ + if (reg.fixUpperEdge) { + e = Mesh.__gl_meshConnect(RegionBelow(reg).eUp.Sym, reg.eUp.Lnext); + if (e == null) return null; + if (!FixUpperEdge(reg, e)) return null; + reg = RegionAbove(reg); + } + return reg; + } + + static ActiveRegion TopRightRegion(ActiveRegion reg) { + GLUvertex dst = reg.eUp.Sym.Org; + + /* Find the region above the uppermost edge with the same destination */ + do { + reg = RegionAbove(reg); + } while (reg.eUp.Sym.Org == dst); + return reg; + } + + static ActiveRegion AddRegionBelow(GLUtessellatorImpl tess, + ActiveRegion regAbove, + GLUhalfEdge eNewUp) +/* + * Add a new active region to the sweep line, *somewhere* below "regAbove" + * (according to where the new edge belongs in the sweep-line dictionary). + * The upper edge of the new region will be "eNewUp". + * Winding number and "inside" flag are not updated. + */ { + ActiveRegion regNew = new ActiveRegion(); + if (regNew == null) throw new RuntimeException(); + + regNew.eUp = eNewUp; + /* __gl_dictListInsertBefore */ + regNew.nodeUp = Dict.dictInsertBefore(tess.dict, regAbove.nodeUp, regNew); + if (regNew.nodeUp == null) throw new RuntimeException(); + regNew.fixUpperEdge = false; + regNew.sentinel = false; + regNew.dirty = false; + + eNewUp.activeRegion = regNew; + return regNew; + } + + static boolean IsWindingInside(GLUtessellatorImpl tess, int n) { + switch (tess.windingRule) { + case GLU_TESS_WINDING_ODD: + return (n & 1) != 0; + case GLU_TESS_WINDING_NONZERO: + return (n != 0); + case GLU_TESS_WINDING_POSITIVE: + return (n > 0); + case GLU_TESS_WINDING_NEGATIVE: + return (n < 0); + case GLU_TESS_WINDING_ABS_GEQ_TWO: + return (n >= 2) || (n <= -2); + } + /*LINTED*/ +// assert (false); + throw new InternalError(); + /*NOTREACHED*/ + } + + + static void ComputeWinding(GLUtessellatorImpl tess, ActiveRegion reg) { + reg.windingNumber = RegionAbove(reg).windingNumber + reg.eUp.winding; + reg.inside = IsWindingInside(tess, reg.windingNumber); + } + + + static void FinishRegion(GLUtessellatorImpl tess, ActiveRegion reg) +/* + * Delete a region from the sweep line. This happens when the upper + * and lower chains of a region meet (at a vertex on the sweep line). + * The "inside" flag is copied to the appropriate mesh face (we could + * not do this before -- since the structure of the mesh is always + * changing, this face may not have even existed until now). + */ { + GLUhalfEdge e = reg.eUp; + GLUface f = e.Lface; + + f.inside = reg.inside; + f.anEdge = e; /* optimization for __gl_meshTessellateMonoRegion() */ + DeleteRegion(tess, reg); + } + + + static GLUhalfEdge FinishLeftRegions(GLUtessellatorImpl tess, + ActiveRegion regFirst, ActiveRegion regLast) +/* + * We are given a vertex with one or more left-going edges. All affected + * edges should be in the edge dictionary. Starting at regFirst.eUp, + * we walk down deleting all regions where both edges have the same + * origin vOrg. At the same time we copy the "inside" flag from the + * active region to the face, since at this point each face will belong + * to at most one region (this was not necessarily true until this point + * in the sweep). The walk stops at the region above regLast; if regLast + * is null we walk as far as possible. At the same time we relink the + * mesh if necessary, so that the ordering of edges around vOrg is the + * same as in the dictionary. + */ { + ActiveRegion reg, regPrev; + GLUhalfEdge e, ePrev; + + regPrev = regFirst; + ePrev = regFirst.eUp; + while (regPrev != regLast) { + regPrev.fixUpperEdge = false; /* placement was OK */ + reg = RegionBelow(regPrev); + e = reg.eUp; + if (e.Org != ePrev.Org) { + if (!reg.fixUpperEdge) { + /* Remove the last left-going edge. Even though there are no further + * edges in the dictionary with this origin, there may be further + * such edges in the mesh (if we are adding left edges to a vertex + * that has already been processed). Thus it is important to call + * FinishRegion rather than just DeleteRegion. + */ + FinishRegion(tess, regPrev); + break; + } + /* If the edge below was a temporary edge introduced by + * ConnectRightVertex, now is the time to fix it. + */ + e = Mesh.__gl_meshConnect(ePrev.Onext.Sym, e.Sym); + if (e == null) throw new RuntimeException(); + if (!FixUpperEdge(reg, e)) throw new RuntimeException(); + } + + /* Relink edges so that ePrev.Onext == e */ + if (ePrev.Onext != e) { + if (!Mesh.__gl_meshSplice(e.Sym.Lnext, e)) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(ePrev, e)) throw new RuntimeException(); + } + FinishRegion(tess, regPrev); /* may change reg.eUp */ + ePrev = reg.eUp; + regPrev = reg; + } + return ePrev; + } + + + static void AddRightEdges(GLUtessellatorImpl tess, ActiveRegion regUp, + GLUhalfEdge eFirst, GLUhalfEdge eLast, GLUhalfEdge eTopLeft, + boolean cleanUp) +/* + * Purpose: insert right-going edges into the edge dictionary, and update + * winding numbers and mesh connectivity appropriately. All right-going + * edges share a common origin vOrg. Edges are inserted CCW starting at + * eFirst; the last edge inserted is eLast.Sym.Lnext. If vOrg has any + * left-going edges already processed, then eTopLeft must be the edge + * such that an imaginary upward vertical segment from vOrg would be + * contained between eTopLeft.Sym.Lnext and eTopLeft; otherwise eTopLeft + * should be null. + */ { + ActiveRegion reg, regPrev; + GLUhalfEdge e, ePrev; + boolean firstTime = true; + + /* Insert the new right-going edges in the dictionary */ + e = eFirst; + do { + assert (Geom.VertLeq(e.Org, e.Sym.Org)); + AddRegionBelow(tess, regUp, e.Sym); + e = e.Onext; + } while (e != eLast); + + /* Walk *all* right-going edges from e.Org, in the dictionary order, + * updating the winding numbers of each region, and re-linking the mesh + * edges to match the dictionary ordering (if necessary). + */ + if (eTopLeft == null) { + eTopLeft = RegionBelow(regUp).eUp.Sym.Onext; + } + regPrev = regUp; + ePrev = eTopLeft; + for (; ;) { + reg = RegionBelow(regPrev); + e = reg.eUp.Sym; + if (e.Org != ePrev.Org) break; + + if (e.Onext != ePrev) { + /* Unlink e from its current position, and relink below ePrev */ + if (!Mesh.__gl_meshSplice(e.Sym.Lnext, e)) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(ePrev.Sym.Lnext, e)) throw new RuntimeException(); + } + /* Compute the winding number and "inside" flag for the new regions */ + reg.windingNumber = regPrev.windingNumber - e.winding; + reg.inside = IsWindingInside(tess, reg.windingNumber); + + /* Check for two outgoing edges with same slope -- process these + * before any intersection tests (see example in __gl_computeInterior). + */ + regPrev.dirty = true; + if (!firstTime && CheckForRightSplice(tess, regPrev)) { + AddWinding(e, ePrev); + DeleteRegion(tess, regPrev); + if (!Mesh.__gl_meshDelete(ePrev)) throw new RuntimeException(); + } + firstTime = false; + regPrev = reg; + ePrev = e; + } + regPrev.dirty = true; + assert (regPrev.windingNumber - e.winding == reg.windingNumber); + + if (cleanUp) { + /* Check for intersections between newly adjacent edges. */ + WalkDirtyRegions(tess, regPrev); + } + } + + + static void CallCombine(GLUtessellatorImpl tess, GLUvertex isect, + Object[] data, float[] weights, boolean needed) { + double[] coords = new double[3]; + + /* Copy coord data in case the callback changes it. */ + coords[0] = isect.coords[0]; + coords[1] = isect.coords[1]; + coords[2] = isect.coords[2]; + + Object[] outData = new Object[1]; + tess.callCombineOrCombineData(coords, data, weights, outData); + isect.data = outData[0]; + if (isect.data == null) { + if (!needed) { + isect.data = data[0]; + } else if (!tess.fatalError) { + /* The only way fatal error is when two edges are found to intersect, + * but the user has not provided the callback necessary to handle + * generated intersection points. + */ + tess.callErrorOrErrorData(GLU_TESS_NEED_COMBINE_CALLBACK); + tess.fatalError = true; + } + } + } + + static void SpliceMergeVertices(GLUtessellatorImpl tess, GLUhalfEdge e1, + GLUhalfEdge e2) +/* + * Two vertices with idential coordinates are combined into one. + * e1.Org is kept, while e2.Org is discarded. + */ { + Object[] data = new Object[4]; + float[] weights = new float[]{0.5f, 0.5f, 0.0f, 0.0f}; + + data[0] = e1.Org.data; + data[1] = e2.Org.data; + CallCombine(tess, e1.Org, data, weights, false); + if (!Mesh.__gl_meshSplice(e1, e2)) throw new RuntimeException(); + } + + static void VertexWeights(GLUvertex isect, GLUvertex org, GLUvertex dst, + float[] weights) +/* + * Find some weights which describe how the intersection vertex is + * a linear combination of "org" and "dest". Each of the two edges + * which generated "isect" is allocated 50% of the weight; each edge + * splits the weight between its org and dst according to the + * relative distance to "isect". + */ { + double t1 = Geom.VertL1dist(org, isect); + double t2 = Geom.VertL1dist(dst, isect); + + weights[0] = (float) (0.5 * t2 / (t1 + t2)); + weights[1] = (float) (0.5 * t1 / (t1 + t2)); + isect.coords[0] += weights[0] * org.coords[0] + weights[1] * dst.coords[0]; + isect.coords[1] += weights[0] * org.coords[1] + weights[1] * dst.coords[1]; + isect.coords[2] += weights[0] * org.coords[2] + weights[1] * dst.coords[2]; + } + + + static void GetIntersectData(GLUtessellatorImpl tess, GLUvertex isect, + GLUvertex orgUp, GLUvertex dstUp, + GLUvertex orgLo, GLUvertex dstLo) +/* + * We've computed a new intersection point, now we need a "data" pointer + * from the user so that we can refer to this new vertex in the + * rendering callbacks. + */ { + Object[] data = new Object[4]; + float[] weights = new float[4]; + float[] weights1 = new float[2]; + float[] weights2 = new float[2]; + + data[0] = orgUp.data; + data[1] = dstUp.data; + data[2] = orgLo.data; + data[3] = dstLo.data; + + isect.coords[0] = isect.coords[1] = isect.coords[2] = 0; + VertexWeights(isect, orgUp, dstUp, weights1); + VertexWeights(isect, orgLo, dstLo, weights2); + System.arraycopy(weights1, 0, weights, 0, 2); + System.arraycopy(weights2, 0, weights, 2, 2); + + CallCombine(tess, isect, data, weights, true); + } + + static boolean CheckForRightSplice(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edge of "regUp", to make sure that the + * eUp.Org is above eLo, or eLo.Org is below eUp (depending on which + * origin is leftmost). + * + * The main purpose is to splice right-going edges with the same + * dest vertex and nearly identical slopes (ie. we can't distinguish + * the slopes numerically). However the splicing can also help us + * to recover from numerical errors. For example, suppose at one + * point we checked eUp and eLo, and decided that eUp.Org is barely + * above eLo. Then later, we split eLo into two edges (eg. from + * a splice operation like this one). This can change the result of + * our test so that now eUp.Org is incident to eLo, or barely below it. + * We must correct this condition to maintain the dictionary invariants. + * + * One possibility is to check these edges for intersection again + * (ie. CheckForIntersect). This is what we do if possible. However + * CheckForIntersect requires that tess.event lies between eUp and eLo, + * so that it has something to fall back on when the intersection + * calculation gives us an unusable answer. So, for those cases where + * we can't check for intersection, this routine fixes the problem + * by just splicing the offending vertex into the other edge. + * This is a guaranteed solution, no matter how degenerate things get. + * Basically this is a combinatorial solution to a numerical problem. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + + if (Geom.VertLeq(eUp.Org, eLo.Org)) { + if (Geom.EdgeSign(eLo.Sym.Org, eUp.Org, eLo.Org) > 0) return false; + + /* eUp.Org appears to be below eLo */ + if (!Geom.VertEq(eUp.Org, eLo.Org)) { + /* Splice eUp.Org into eLo */ + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp, eLo.Sym.Lnext)) throw new RuntimeException(); + regUp.dirty = regLo.dirty = true; + + } else if (eUp.Org != eLo.Org) { + /* merge the two vertices, discarding eUp.Org */ + tess.pq.pqDelete(eUp.Org.pqHandle); /* __gl_pqSortDelete */ + SpliceMergeVertices(tess, eLo.Sym.Lnext, eUp); + } + } else { + if (Geom.EdgeSign(eUp.Sym.Org, eLo.Org, eUp.Org) < 0) return false; + + /* eLo.Org appears to be above eUp, so splice eLo.Org into eUp */ + RegionAbove(regUp).dirty = regUp.dirty = true; + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym.Lnext, eUp)) throw new RuntimeException(); + } + return true; + } + + static boolean CheckForLeftSplice(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edge of "regUp", to make sure that the + * eUp.Sym.Org is above eLo, or eLo.Sym.Org is below eUp (depending on which + * destination is rightmost). + * + * Theoretically, this should always be true. However, splitting an edge + * into two pieces can change the results of previous tests. For example, + * suppose at one point we checked eUp and eLo, and decided that eUp.Sym.Org + * is barely above eLo. Then later, we split eLo into two edges (eg. from + * a splice operation like this one). This can change the result of + * the test so that now eUp.Sym.Org is incident to eLo, or barely below it. + * We must correct this condition to maintain the dictionary invariants + * (otherwise new edges might get inserted in the wrong place in the + * dictionary, and bad stuff will happen). + * + * We fix the problem by just splicing the offending vertex into the + * other edge. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + GLUhalfEdge e; + + assert (!Geom.VertEq(eUp.Sym.Org, eLo.Sym.Org)); + + if (Geom.VertLeq(eUp.Sym.Org, eLo.Sym.Org)) { + if (Geom.EdgeSign(eUp.Sym.Org, eLo.Sym.Org, eUp.Org) < 0) return false; + + /* eLo.Sym.Org is above eUp, so splice eLo.Sym.Org into eUp */ + RegionAbove(regUp).dirty = regUp.dirty = true; + e = Mesh.__gl_meshSplitEdge(eUp); + if (e == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym, e)) throw new RuntimeException(); + e.Lface.inside = regUp.inside; + } else { + if (Geom.EdgeSign(eLo.Sym.Org, eUp.Sym.Org, eLo.Org) > 0) return false; + + /* eUp.Sym.Org is below eLo, so splice eUp.Sym.Org into eLo */ + regUp.dirty = regLo.dirty = true; + e = Mesh.__gl_meshSplitEdge(eLo); + if (e == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp.Lnext, eLo.Sym)) throw new RuntimeException(); + e.Sym.Lface.inside = regUp.inside; + } + return true; + } + + + static boolean CheckForIntersect(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * Check the upper and lower edges of the given region to see if + * they intersect. If so, create the intersection and add it + * to the data structures. + * + * Returns true if adding the new intersection resulted in a recursive + * call to AddRightEdges(); in this case all "dirty" regions have been + * checked for intersections, and possibly regUp has been deleted. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + GLUvertex orgUp = eUp.Org; + GLUvertex orgLo = eLo.Org; + GLUvertex dstUp = eUp.Sym.Org; + GLUvertex dstLo = eLo.Sym.Org; + double tMinUp, tMaxLo; + GLUvertex isect = new GLUvertex(); + GLUvertex orgMin; + GLUhalfEdge e; + + assert (!Geom.VertEq(dstLo, dstUp)); + assert (Geom.EdgeSign(dstUp, tess.event, orgUp) <= 0); + assert (Geom.EdgeSign(dstLo, tess.event, orgLo) >= 0); + assert (orgUp != tess.event && orgLo != tess.event); + assert (!regUp.fixUpperEdge && !regLo.fixUpperEdge); + + if (orgUp == orgLo) return false; /* right endpoints are the same */ + + tMinUp = Math.min(orgUp.t, dstUp.t); + tMaxLo = Math.max(orgLo.t, dstLo.t); + if (tMinUp > tMaxLo) return false; /* t ranges do not overlap */ + + if (Geom.VertLeq(orgUp, orgLo)) { + if (Geom.EdgeSign(dstLo, orgUp, orgLo) > 0) return false; + } else { + if (Geom.EdgeSign(dstUp, orgLo, orgUp) < 0) return false; + } + + /* At this point the edges intersect, at least marginally */ + DebugEvent(tess); + + Geom.EdgeIntersect(dstUp, orgUp, dstLo, orgLo, isect); + /* The following properties are guaranteed: */ + assert (Math.min(orgUp.t, dstUp.t) <= isect.t); + assert (isect.t <= Math.max(orgLo.t, dstLo.t)); + assert (Math.min(dstLo.s, dstUp.s) <= isect.s); + assert (isect.s <= Math.max(orgLo.s, orgUp.s)); + + if (Geom.VertLeq(isect, tess.event)) { + /* The intersection point lies slightly to the left of the sweep line, + * so move it until it''s slightly to the right of the sweep line. + * (If we had perfect numerical precision, this would never happen + * in the first place). The easiest and safest thing to do is + * replace the intersection by tess.event. + */ + isect.s = tess.event.s; + isect.t = tess.event.t; + } + /* Similarly, if the computed intersection lies to the right of the + * rightmost origin (which should rarely happen), it can cause + * unbelievable inefficiency on sufficiently degenerate inputs. + * (If you have the test program, try running test54.d with the + * "X zoom" option turned on). + */ + orgMin = Geom.VertLeq(orgUp, orgLo) ? orgUp : orgLo; + if (Geom.VertLeq(orgMin, isect)) { + isect.s = orgMin.s; + isect.t = orgMin.t; + } + + if (Geom.VertEq(isect, orgUp) || Geom.VertEq(isect, orgLo)) { + /* Easy case -- intersection at one of the right endpoints */ + CheckForRightSplice(tess, regUp); + return false; + } + + if ((!Geom.VertEq(dstUp, tess.event) + && Geom.EdgeSign(dstUp, tess.event, isect) >= 0) + || (!Geom.VertEq(dstLo, tess.event) + && Geom.EdgeSign(dstLo, tess.event, isect) <= 0)) { + /* Very unusual -- the new upper or lower edge would pass on the + * wrong side of the sweep event, or through it. This can happen + * due to very small numerical errors in the intersection calculation. + */ + if (dstLo == tess.event) { + /* Splice dstLo into eUp, and process the new region(s) */ + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym, eUp)) throw new RuntimeException(); + regUp = TopLeftRegion(regUp); + if (regUp == null) throw new RuntimeException(); + eUp = RegionBelow(regUp).eUp; + FinishLeftRegions(tess, RegionBelow(regUp), regLo); + AddRightEdges(tess, regUp, eUp.Sym.Lnext, eUp, eUp, true); + return true; + } + if (dstUp == tess.event) { + /* Splice dstUp into eLo, and process the new region(s) */ + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eUp.Lnext, eLo.Sym.Lnext)) throw new RuntimeException(); + regLo = regUp; + regUp = TopRightRegion(regUp); + e = RegionBelow(regUp).eUp.Sym.Onext; + regLo.eUp = eLo.Sym.Lnext; + eLo = FinishLeftRegions(tess, regLo, null); + AddRightEdges(tess, regUp, eLo.Onext, eUp.Sym.Onext, e, true); + return true; + } + /* Special case: called from ConnectRightVertex. If either + * edge passes on the wrong side of tess.event, split it + * (and wait for ConnectRightVertex to splice it appropriately). + */ + if (Geom.EdgeSign(dstUp, tess.event, isect) >= 0) { + RegionAbove(regUp).dirty = regUp.dirty = true; + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + eUp.Org.s = tess.event.s; + eUp.Org.t = tess.event.t; + } + if (Geom.EdgeSign(dstLo, tess.event, isect) <= 0) { + regUp.dirty = regLo.dirty = true; + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + eLo.Org.s = tess.event.s; + eLo.Org.t = tess.event.t; + } + /* leave the rest for ConnectRightVertex */ + return false; + } + + /* General case -- split both edges, splice into new vertex. + * When we do the splice operation, the order of the arguments is + * arbitrary as far as correctness goes. However, when the operation + * creates a new face, the work done is proportional to the size of + * the new face. We expect the faces in the processed part of + * the mesh (ie. eUp.Lface) to be smaller than the faces in the + * unprocessed original contours (which will be eLo.Sym.Lnext.Lface). + */ + if (Mesh.__gl_meshSplitEdge(eUp.Sym) == null) throw new RuntimeException(); + if (Mesh.__gl_meshSplitEdge(eLo.Sym) == null) throw new RuntimeException(); + if (!Mesh.__gl_meshSplice(eLo.Sym.Lnext, eUp)) throw new RuntimeException(); + eUp.Org.s = isect.s; + eUp.Org.t = isect.t; + eUp.Org.pqHandle = tess.pq.pqInsert(eUp.Org); /* __gl_pqSortInsert */ + if (eUp.Org.pqHandle == Long.MAX_VALUE) { + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + tess.pq = null; + throw new RuntimeException(); + } + GetIntersectData(tess, eUp.Org, orgUp, dstUp, orgLo, dstLo); + RegionAbove(regUp).dirty = regUp.dirty = regLo.dirty = true; + return false; + } + + static void WalkDirtyRegions(GLUtessellatorImpl tess, ActiveRegion regUp) +/* + * When the upper or lower edge of any region changes, the region is + * marked "dirty". This routine walks through all the dirty regions + * and makes sure that the dictionary invariants are satisfied + * (see the comments at the beginning of this file). Of course + * new dirty regions can be created as we make changes to restore + * the invariants. + */ { + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp, eLo; + + for (; ;) { + /* Find the lowest dirty region (we walk from the bottom up). */ + while (regLo.dirty) { + regUp = regLo; + regLo = RegionBelow(regLo); + } + if (!regUp.dirty) { + regLo = regUp; + regUp = RegionAbove(regUp); + if (regUp == null || !regUp.dirty) { + /* We've walked all the dirty regions */ + return; + } + } + regUp.dirty = false; + eUp = regUp.eUp; + eLo = regLo.eUp; + + if (eUp.Sym.Org != eLo.Sym.Org) { + /* Check that the edge ordering is obeyed at the Dst vertices. */ + if (CheckForLeftSplice(tess, regUp)) { + + /* If the upper or lower edge was marked fixUpperEdge, then + * we no longer need it (since these edges are needed only for + * vertices which otherwise have no right-going edges). + */ + if (regLo.fixUpperEdge) { + DeleteRegion(tess, regLo); + if (!Mesh.__gl_meshDelete(eLo)) throw new RuntimeException(); + regLo = RegionBelow(regUp); + eLo = regLo.eUp; + } else if (regUp.fixUpperEdge) { + DeleteRegion(tess, regUp); + if (!Mesh.__gl_meshDelete(eUp)) throw new RuntimeException(); + regUp = RegionAbove(regLo); + eUp = regUp.eUp; + } + } + } + if (eUp.Org != eLo.Org) { + if (eUp.Sym.Org != eLo.Sym.Org + && !regUp.fixUpperEdge && !regLo.fixUpperEdge + && (eUp.Sym.Org == tess.event || eLo.Sym.Org == tess.event)) { + /* When all else fails in CheckForIntersect(), it uses tess.event + * as the intersection location. To make this possible, it requires + * that tess.event lie between the upper and lower edges, and also + * that neither of these is marked fixUpperEdge (since in the worst + * case it might splice one of these edges into tess.event, and + * violate the invariant that fixable edges are the only right-going + * edge from their associated vertex). + */ + if (CheckForIntersect(tess, regUp)) { + /* WalkDirtyRegions() was called recursively; we're done */ + return; + } + } else { + /* Even though we can't use CheckForIntersect(), the Org vertices + * may violate the dictionary edge ordering. Check and correct this. + */ + CheckForRightSplice(tess, regUp); + } + } + if (eUp.Org == eLo.Org && eUp.Sym.Org == eLo.Sym.Org) { + /* A degenerate loop consisting of only two edges -- delete it. */ + AddWinding(eLo, eUp); + DeleteRegion(tess, regUp); + if (!Mesh.__gl_meshDelete(eUp)) throw new RuntimeException(); + regUp = RegionAbove(regLo); + } + } + } + + + static void ConnectRightVertex(GLUtessellatorImpl tess, ActiveRegion regUp, + GLUhalfEdge eBottomLeft) +/* + * Purpose: connect a "right" vertex vEvent (one where all edges go left) + * to the unprocessed portion of the mesh. Since there are no right-going + * edges, two regions (one above vEvent and one below) are being merged + * into one. "regUp" is the upper of these two regions. + * + * There are two reasons for doing this (adding a right-going edge): + * - if the two regions being merged are "inside", we must add an edge + * to keep them separated (the combined region would not be monotone). + * - in any case, we must leave some record of vEvent in the dictionary, + * so that we can merge vEvent with features that we have not seen yet. + * For example, maybe there is a vertical edge which passes just to + * the right of vEvent; we would like to splice vEvent into this edge. + * + * However, we don't want to connect vEvent to just any vertex. We don''t + * want the new edge to cross any other edges; otherwise we will create + * intersection vertices even when the input data had no self-intersections. + * (This is a bad thing; if the user's input data has no intersections, + * we don't want to generate any false intersections ourselves.) + * + * Our eventual goal is to connect vEvent to the leftmost unprocessed + * vertex of the combined region (the union of regUp and regLo). + * But because of unseen vertices with all right-going edges, and also + * new vertices which may be created by edge intersections, we don''t + * know where that leftmost unprocessed vertex is. In the meantime, we + * connect vEvent to the closest vertex of either chain, and mark the region + * as "fixUpperEdge". This flag says to delete and reconnect this edge + * to the next processed vertex on the boundary of the combined region. + * Quite possibly the vertex we connected to will turn out to be the + * closest one, in which case we won''t need to make any changes. + */ { + GLUhalfEdge eNew; + GLUhalfEdge eTopLeft = eBottomLeft.Onext; + ActiveRegion regLo = RegionBelow(regUp); + GLUhalfEdge eUp = regUp.eUp; + GLUhalfEdge eLo = regLo.eUp; + boolean degenerate = false; + + if (eUp.Sym.Org != eLo.Sym.Org) { + CheckForIntersect(tess, regUp); + } + + /* Possible new degeneracies: upper or lower edge of regUp may pass + * through vEvent, or may coincide with new intersection vertex + */ + if (Geom.VertEq(eUp.Org, tess.event)) { + if (!Mesh.__gl_meshSplice(eTopLeft.Sym.Lnext, eUp)) throw new RuntimeException(); + regUp = TopLeftRegion(regUp); + if (regUp == null) throw new RuntimeException(); + eTopLeft = RegionBelow(regUp).eUp; + FinishLeftRegions(tess, RegionBelow(regUp), regLo); + degenerate = true; + } + if (Geom.VertEq(eLo.Org, tess.event)) { + if (!Mesh.__gl_meshSplice(eBottomLeft, eLo.Sym.Lnext)) throw new RuntimeException(); + eBottomLeft = FinishLeftRegions(tess, regLo, null); + degenerate = true; + } + if (degenerate) { + AddRightEdges(tess, regUp, eBottomLeft.Onext, eTopLeft, eTopLeft, true); + return; + } + + /* Non-degenerate situation -- need to add a temporary, fixable edge. + * Connect to the closer of eLo.Org, eUp.Org. + */ + if (Geom.VertLeq(eLo.Org, eUp.Org)) { + eNew = eLo.Sym.Lnext; + } else { + eNew = eUp; + } + eNew = Mesh.__gl_meshConnect(eBottomLeft.Onext.Sym, eNew); + if (eNew == null) throw new RuntimeException(); + + /* Prevent cleanup, otherwise eNew might disappear before we've even + * had a chance to mark it as a temporary edge. + */ + AddRightEdges(tess, regUp, eNew, eNew.Onext, eNew.Onext, false); + eNew.Sym.activeRegion.fixUpperEdge = true; + WalkDirtyRegions(tess, regUp); + } + +/* Because vertices at exactly the same location are merged together + * before we process the sweep event, some degenerate cases can't occur. + * However if someone eventually makes the modifications required to + * merge features which are close together, the cases below marked + * TOLERANCE_NONZERO will be useful. They were debugged before the + * code to merge identical vertices in the main loop was added. + */ + private static final boolean TOLERANCE_NONZERO = false; + + static void ConnectLeftDegenerate(GLUtessellatorImpl tess, + ActiveRegion regUp, GLUvertex vEvent) +/* + * The event vertex lies exacty on an already-processed edge or vertex. + * Adding the new vertex involves splicing it into the already-processed + * part of the mesh. + */ { + GLUhalfEdge e, eTopLeft, eTopRight, eLast; + ActiveRegion reg; + + e = regUp.eUp; + if (Geom.VertEq(e.Org, vEvent)) { + /* e.Org is an unprocessed vertex - just combine them, and wait + * for e.Org to be pulled from the queue + */ + assert (TOLERANCE_NONZERO); + SpliceMergeVertices(tess, e, vEvent.anEdge); + return; + } + + if (!Geom.VertEq(e.Sym.Org, vEvent)) { + /* General case -- splice vEvent into edge e which passes through it */ + if (Mesh.__gl_meshSplitEdge(e.Sym) == null) throw new RuntimeException(); + if (regUp.fixUpperEdge) { + /* This edge was fixable -- delete unused portion of original edge */ + if (!Mesh.__gl_meshDelete(e.Onext)) throw new RuntimeException(); + regUp.fixUpperEdge = false; + } + if (!Mesh.__gl_meshSplice(vEvent.anEdge, e)) throw new RuntimeException(); + SweepEvent(tess, vEvent); /* recurse */ + return; + } + + /* vEvent coincides with e.Sym.Org, which has already been processed. + * Splice in the additional right-going edges. + */ + assert (TOLERANCE_NONZERO); + regUp = TopRightRegion(regUp); + reg = RegionBelow(regUp); + eTopRight = reg.eUp.Sym; + eTopLeft = eLast = eTopRight.Onext; + if (reg.fixUpperEdge) { + /* Here e.Sym.Org has only a single fixable edge going right. + * We can delete it since now we have some real right-going edges. + */ + assert (eTopLeft != eTopRight); /* there are some left edges too */ + DeleteRegion(tess, reg); + if (!Mesh.__gl_meshDelete(eTopRight)) throw new RuntimeException(); + eTopRight = eTopLeft.Sym.Lnext; + } + if (!Mesh.__gl_meshSplice(vEvent.anEdge, eTopRight)) throw new RuntimeException(); + if (!Geom.EdgeGoesLeft(eTopLeft)) { + /* e.Sym.Org had no left-going edges -- indicate this to AddRightEdges() */ + eTopLeft = null; + } + AddRightEdges(tess, regUp, eTopRight.Onext, eLast, eTopLeft, true); + } + + + static void ConnectLeftVertex(GLUtessellatorImpl tess, GLUvertex vEvent) +/* + * Purpose: connect a "left" vertex (one where both edges go right) + * to the processed portion of the mesh. Let R be the active region + * containing vEvent, and let U and L be the upper and lower edge + * chains of R. There are two possibilities: + * + * - the normal case: split R into two regions, by connecting vEvent to + * the rightmost vertex of U or L lying to the left of the sweep line + * + * - the degenerate case: if vEvent is close enough to U or L, we + * merge vEvent into that edge chain. The subcases are: + * - merging with the rightmost vertex of U or L + * - merging with the active edge of U or L + * - merging with an already-processed portion of U or L + */ { + ActiveRegion regUp, regLo, reg; + GLUhalfEdge eUp, eLo, eNew; + ActiveRegion tmp = new ActiveRegion(); + + /* assert ( vEvent.anEdge.Onext.Onext == vEvent.anEdge ); */ + + /* Get a pointer to the active region containing vEvent */ + tmp.eUp = vEvent.anEdge.Sym; + /* __GL_DICTLISTKEY */ /* __gl_dictListSearch */ + regUp = (ActiveRegion) Dict.dictKey(Dict.dictSearch(tess.dict, tmp)); + regLo = RegionBelow(regUp); + eUp = regUp.eUp; + eLo = regLo.eUp; + + /* Try merging with U or L first */ + if (Geom.EdgeSign(eUp.Sym.Org, vEvent, eUp.Org) == 0) { + ConnectLeftDegenerate(tess, regUp, vEvent); + return; + } + + /* Connect vEvent to rightmost processed vertex of either chain. + * e.Sym.Org is the vertex that we will connect to vEvent. + */ + reg = Geom.VertLeq(eLo.Sym.Org, eUp.Sym.Org) ? regUp : regLo; + + if (regUp.inside || reg.fixUpperEdge) { + if (reg == regUp) { + eNew = Mesh.__gl_meshConnect(vEvent.anEdge.Sym, eUp.Lnext); + if (eNew == null) throw new RuntimeException(); + } else { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(eLo.Sym.Onext.Sym, vEvent.anEdge); + if (tempHalfEdge == null) throw new RuntimeException(); + + eNew = tempHalfEdge.Sym; + } + if (reg.fixUpperEdge) { + if (!FixUpperEdge(reg, eNew)) throw new RuntimeException(); + } else { + ComputeWinding(tess, AddRegionBelow(tess, regUp, eNew)); + } + SweepEvent(tess, vEvent); + } else { + /* The new vertex is in a region which does not belong to the polygon. + * We don''t need to connect this vertex to the rest of the mesh. + */ + AddRightEdges(tess, regUp, vEvent.anEdge, vEvent.anEdge, null, true); + } + } + + + static void SweepEvent(GLUtessellatorImpl tess, GLUvertex vEvent) +/* + * Does everything necessary when the sweep line crosses a vertex. + * Updates the mesh and the edge dictionary. + */ { + ActiveRegion regUp, reg; + GLUhalfEdge e, eTopLeft, eBottomLeft; + + tess.event = vEvent; /* for access in EdgeLeq() */ + DebugEvent(tess); + + /* Check if this vertex is the right endpoint of an edge that is + * already in the dictionary. In this case we don't need to waste + * time searching for the location to insert new edges. + */ + e = vEvent.anEdge; + while (e.activeRegion == null) { + e = e.Onext; + if (e == vEvent.anEdge) { + /* All edges go right -- not incident to any processed edges */ + ConnectLeftVertex(tess, vEvent); + return; + } + } + + /* Processing consists of two phases: first we "finish" all the + * active regions where both the upper and lower edges terminate + * at vEvent (ie. vEvent is closing off these regions). + * We mark these faces "inside" or "outside" the polygon according + * to their winding number, and delete the edges from the dictionary. + * This takes care of all the left-going edges from vEvent. + */ + regUp = TopLeftRegion(e.activeRegion); + if (regUp == null) throw new RuntimeException(); + reg = RegionBelow(regUp); + eTopLeft = reg.eUp; + eBottomLeft = FinishLeftRegions(tess, reg, null); + + /* Next we process all the right-going edges from vEvent. This + * involves adding the edges to the dictionary, and creating the + * associated "active regions" which record information about the + * regions between adjacent dictionary edges. + */ + if (eBottomLeft.Onext == eTopLeft) { + /* No right-going edges -- add a temporary "fixable" edge */ + ConnectRightVertex(tess, regUp, eBottomLeft); + } else { + AddRightEdges(tess, regUp, eBottomLeft.Onext, eTopLeft, eTopLeft, true); + } + } + + +/* Make the sentinel coordinates big enough that they will never be + * merged with real input features. (Even with the largest possible + * input contour and the maximum tolerance of 1.0, no merging will be + * done with coordinates larger than 3 * GLU_TESS_MAX_COORD). + */ + private static final double SENTINEL_COORD = (4.0 * GLU_TESS_MAX_COORD); + + static void AddSentinel(GLUtessellatorImpl tess, double t) +/* + * We add two sentinel edges above and below all other edges, + * to avoid special cases at the top and bottom. + */ { + GLUhalfEdge e; + ActiveRegion reg = new ActiveRegion(); + if (reg == null) throw new RuntimeException(); + + e = Mesh.__gl_meshMakeEdge(tess.mesh); + if (e == null) throw new RuntimeException(); + + e.Org.s = SENTINEL_COORD; + e.Org.t = t; + e.Sym.Org.s = -SENTINEL_COORD; + e.Sym.Org.t = t; + tess.event = e.Sym.Org; /* initialize it */ + + reg.eUp = e; + reg.windingNumber = 0; + reg.inside = false; + reg.fixUpperEdge = false; + reg.sentinel = true; + reg.dirty = false; + reg.nodeUp = Dict.dictInsert(tess.dict, reg); /* __gl_dictListInsertBefore */ + if (reg.nodeUp == null) throw new RuntimeException(); + } + + + static void InitEdgeDict(final GLUtessellatorImpl tess) +/* + * We maintain an ordering of edge intersections with the sweep line. + * This order is maintained in a dynamic dictionary. + */ { + /* __gl_dictListNewDict */ + tess.dict = Dict.dictNewDict(tess, new Dict.DictLeq() { + public boolean leq(Object frame, Object key1, Object key2) { + return EdgeLeq(tess, (ActiveRegion) key1, (ActiveRegion) key2); + } + }); + if (tess.dict == null) throw new RuntimeException(); + + AddSentinel(tess, -SENTINEL_COORD); + AddSentinel(tess, SENTINEL_COORD); + } + + + static void DoneEdgeDict(GLUtessellatorImpl tess) { + ActiveRegion reg; + int fixedEdges = 0; + + /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */ + while ((reg = (ActiveRegion) Dict.dictKey(Dict.dictMin(tess.dict))) != null) { + /* + * At the end of all processing, the dictionary should contain + * only the two sentinel edges, plus at most one "fixable" edge + * created by ConnectRightVertex(). + */ + if (!reg.sentinel) { + assert (reg.fixUpperEdge); + assert (++fixedEdges == 1); + } + assert (reg.windingNumber == 0); + DeleteRegion(tess, reg); +/* __gl_meshDelete( reg.eUp );*/ + } + Dict.dictDeleteDict(tess.dict); /* __gl_dictListDeleteDict */ + } + + + static void RemoveDegenerateEdges(GLUtessellatorImpl tess) +/* + * Remove zero-length edges, and contours with fewer than 3 vertices. + */ { + GLUhalfEdge e, eNext, eLnext; + GLUhalfEdge eHead = tess.mesh.eHead; + + /*LINTED*/ + for (e = eHead.next; e != eHead; e = eNext) { + eNext = e.next; + eLnext = e.Lnext; + + if (Geom.VertEq(e.Org, e.Sym.Org) && e.Lnext.Lnext != e) { + /* Zero-length edge, contour has at least 3 edges */ + + SpliceMergeVertices(tess, eLnext, e); /* deletes e.Org */ + if (!Mesh.__gl_meshDelete(e)) throw new RuntimeException(); /* e is a self-loop */ + e = eLnext; + eLnext = e.Lnext; + } + if (eLnext.Lnext == e) { + /* Degenerate contour (one or two edges) */ + + if (eLnext != e) { + if (eLnext == eNext || eLnext == eNext.Sym) { + eNext = eNext.next; + } + if (!Mesh.__gl_meshDelete(eLnext)) throw new RuntimeException(); + } + if (e == eNext || e == eNext.Sym) { + eNext = eNext.next; + } + if (!Mesh.__gl_meshDelete(e)) throw new RuntimeException(); + } + } + } + + static boolean InitPriorityQ(GLUtessellatorImpl tess) +/* + * Insert all vertices into the priority queue which determines the + * order in which vertices cross the sweep line. + */ { + PriorityQ pq; + GLUvertex v, vHead; + + /* __gl_pqSortNewPriorityQ */ + pq = tess.pq = PriorityQ.pqNewPriorityQ(new PriorityQ.Leq() { + public boolean leq(Object key1, Object key2) { + return Geom.VertLeq(((GLUvertex) key1), (GLUvertex) key2); + } + }); + if (pq == null) return false; + + vHead = tess.mesh.vHead; + for (v = vHead.next; v != vHead; v = v.next) { + v.pqHandle = pq.pqInsert(v); /* __gl_pqSortInsert */ + if (v.pqHandle == Long.MAX_VALUE) break; + } + if (v != vHead || !pq.pqInit()) { /* __gl_pqSortInit */ + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + tess.pq = null; + return false; + } + + return true; + } + + + static void DonePriorityQ(GLUtessellatorImpl tess) { + tess.pq.pqDeletePriorityQ(); /* __gl_pqSortDeletePriorityQ */ + } + + + static boolean RemoveDegenerateFaces(GLUmesh mesh) +/* + * Delete any degenerate faces with only two edges. WalkDirtyRegions() + * will catch almost all of these, but it won't catch degenerate faces + * produced by splice operations on already-processed edges. + * The two places this can happen are in FinishLeftRegions(), when + * we splice in a "temporary" edge produced by ConnectRightVertex(), + * and in CheckForLeftSplice(), where we splice already-processed + * edges to ensure that our dictionary invariants are not violated + * by numerical errors. + * + * In both these cases it is *very* dangerous to delete the offending + * edge at the time, since one of the routines further up the stack + * will sometimes be keeping a pointer to that edge. + */ { + GLUface f, fNext; + GLUhalfEdge e; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = fNext) { + fNext = f.next; + e = f.anEdge; + assert (e.Lnext != e); + + if (e.Lnext.Lnext == e) { + /* A face with only two edges */ + AddWinding(e.Onext, e); + if (!Mesh.__gl_meshDelete(e)) return false; + } + } + return true; + } + + public static boolean __gl_computeInterior(GLUtessellatorImpl tess) +/* + * __gl_computeInterior( tess ) computes the planar arrangement specified + * by the given contours, and further subdivides this arrangement + * into regions. Each region is marked "inside" if it belongs + * to the polygon, according to the rule given by tess.windingRule. + * Each interior region is guaranteed be monotone. + */ { + GLUvertex v, vNext; + + tess.fatalError = false; + + /* Each vertex defines an event for our sweep line. Start by inserting + * all the vertices in a priority queue. Events are processed in + * lexicographic order, ie. + * + * e1 < e2 iff e1.x < e2.x || (e1.x == e2.x && e1.y < e2.y) + */ + RemoveDegenerateEdges(tess); + if (!InitPriorityQ(tess)) return false; /* if error */ + InitEdgeDict(tess); + + /* __gl_pqSortExtractMin */ + while ((v = (GLUvertex) tess.pq.pqExtractMin()) != null) { + for (; ;) { + vNext = (GLUvertex) tess.pq.pqMinimum(); /* __gl_pqSortMinimum */ + if (vNext == null || !Geom.VertEq(vNext, v)) break; + + /* Merge together all vertices at exactly the same location. + * This is more efficient than processing them one at a time, + * simplifies the code (see ConnectLeftDegenerate), and is also + * important for correct handling of certain degenerate cases. + * For example, suppose there are two identical edges A and B + * that belong to different contours (so without this code they would + * be processed by separate sweep events). Suppose another edge C + * crosses A and B from above. When A is processed, we split it + * at its intersection point with C. However this also splits C, + * so when we insert B we may compute a slightly different + * intersection point. This might leave two edges with a small + * gap between them. This kind of error is especially obvious + * when using boundary extraction (GLU_TESS_BOUNDARY_ONLY). + */ + vNext = (GLUvertex) tess.pq.pqExtractMin(); /* __gl_pqSortExtractMin*/ + SpliceMergeVertices(tess, v.anEdge, vNext.anEdge); + } + SweepEvent(tess, v); + } + + /* Set tess.event for debugging purposes */ + /* __GL_DICTLISTKEY */ /* __GL_DICTLISTMIN */ + tess.event = ((ActiveRegion) Dict.dictKey(Dict.dictMin(tess.dict))).eUp.Org; + DebugEvent(tess); + DoneEdgeDict(tess); + DonePriorityQ(tess); + + if (!RemoveDegenerateFaces(tess.mesh)) return false; + Mesh.__gl_meshCheckMesh(tess.mesh); + + return true; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessMono.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessMono.java new file mode 100644 index 0000000..62aa72a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessMono.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class TessMono { +/* __gl_meshTessellateMonoRegion( face ) tessellates a monotone region + * (what else would it do??) The region must consist of a single + * loop of half-edges (see mesh.h) oriented CCW. "Monotone" in this + * case means that any vertical line intersects the interior of the + * region in a single interval. + * + * Tessellation consists of adding interior edges (actually pairs of + * half-edges), to split the region into non-overlapping triangles. + * + * The basic idea is explained in Preparata and Shamos (which I don''t + * have handy right now), although their implementation is more + * complicated than this one. The are two edge chains, an upper chain + * and a lower chain. We process all vertices from both chains in order, + * from right to left. + * + * The algorithm ensures that the following invariant holds after each + * vertex is processed: the untessellated region consists of two + * chains, where one chain (say the upper) is a single edge, and + * the other chain is concave. The left vertex of the single edge + * is always to the left of all vertices in the concave chain. + * + * Each step consists of adding the rightmost unprocessed vertex to one + * of the two chains, and forming a fan of triangles from the rightmost + * of two chain endpoints. Determining whether we can add each triangle + * to the fan is a simple orientation test. By making the fan as large + * as possible, we restore the invariant (check it yourself). + */ + static boolean __gl_meshTessellateMonoRegion(GLUface face) { + GLUhalfEdge up, lo; + + /* All edges are oriented CCW around the boundary of the region. + * First, find the half-edge whose origin vertex is rightmost. + * Since the sweep goes from left to right, face->anEdge should + * be close to the edge we want. + */ + up = face.anEdge; + assert (up.Lnext != up && up.Lnext.Lnext != up); + + for (; Geom.VertLeq(up.Sym.Org, up.Org); up = up.Onext.Sym) + ; + for (; Geom.VertLeq(up.Org, up.Sym.Org); up = up.Lnext) + ; + lo = up.Onext.Sym; + + while (up.Lnext != lo) { + if (Geom.VertLeq(up.Sym.Org, lo.Org)) { + /* up.Sym.Org is on the left. It is safe to form triangles from lo.Org. + * The EdgeGoesLeft test guarantees progress even when some triangles + * are CW, given that the upper and lower chains are truly monotone. + */ + while (lo.Lnext != up && (Geom.EdgeGoesLeft(lo.Lnext) + || Geom.EdgeSign(lo.Org, lo.Sym.Org, lo.Lnext.Sym.Org) <= 0)) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(lo.Lnext, lo); + if (tempHalfEdge == null) return false; + lo = tempHalfEdge.Sym; + } + lo = lo.Onext.Sym; + } else { + /* lo.Org is on the left. We can make CCW triangles from up.Sym.Org. */ + while (lo.Lnext != up && (Geom.EdgeGoesRight(up.Onext.Sym) + || Geom.EdgeSign(up.Sym.Org, up.Org, up.Onext.Sym.Org) >= 0)) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(up, up.Onext.Sym); + if (tempHalfEdge == null) return false; + up = tempHalfEdge.Sym; + } + up = up.Lnext; + } + } + + /* Now lo.Org == up.Sym.Org == the leftmost vertex. The remaining region + * can be tessellated in a fan from this leftmost vertex. + */ + assert (lo.Lnext != up); + while (lo.Lnext.Lnext != up) { + GLUhalfEdge tempHalfEdge = Mesh.__gl_meshConnect(lo.Lnext, lo); + if (tempHalfEdge == null) return false; + lo = tempHalfEdge.Sym; + } + + return true; + } + + +/* __gl_meshTessellateInterior( mesh ) tessellates each region of + * the mesh which is marked "inside" the polygon. Each such region + * must be monotone. + */ + public static boolean __gl_meshTessellateInterior(GLUmesh mesh) { + GLUface f, next; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = next) { + /* Make sure we don''t try to tessellate the new triangles. */ + next = f.next; + if (f.inside) { + if (!__gl_meshTessellateMonoRegion(f)) return false; + } + } + + return true; + } + + +/* __gl_meshDiscardExterior( mesh ) zaps (ie. sets to NULL) all faces + * which are not marked "inside" the polygon. Since further mesh operations + * on NULL faces are not allowed, the main purpose is to clean up the + * mesh so that exterior loops are not represented in the data structure. + */ + public static void __gl_meshDiscardExterior(GLUmesh mesh) { + GLUface f, next; + + /*LINTED*/ + for (f = mesh.fHead.next; f != mesh.fHead; f = next) { + /* Since f will be destroyed, save its next pointer. */ + next = f.next; + if (!f.inside) { + Mesh.__gl_meshZapFace(f); + } + } + } + +// private static final int MARKED_FOR_DELETION = 0x7fffffff; + +/* __gl_meshSetWindingNumber( mesh, value, keepOnlyBoundary ) resets the + * winding numbers on all edges so that regions marked "inside" the + * polygon have a winding number of "value", and regions outside + * have a winding number of 0. + * + * If keepOnlyBoundary is TRUE, it also deletes all edges which do not + * separate an interior region from an exterior one. + */ + public static boolean __gl_meshSetWindingNumber(GLUmesh mesh, int value, boolean keepOnlyBoundary) { + GLUhalfEdge e, eNext; + + for (e = mesh.eHead.next; e != mesh.eHead; e = eNext) { + eNext = e.next; + if (e.Sym.Lface.inside != e.Lface.inside) { + + /* This is a boundary edge (one side is interior, one is exterior). */ + e.winding = (e.Lface.inside) ? value : -value; + } else { + + /* Both regions are interior, or both are exterior. */ + if (!keepOnlyBoundary) { + e.winding = 0; + } else { + if (!Mesh.__gl_meshDelete(e)) return false; + } + } + } + return true; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessState.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessState.java new file mode 100644 index 0000000..02e1ef7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/glu/tessellation/TessState.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +* Portions Copyright (C) 2003-2006 Sun Microsystems, Inc. +* All rights reserved. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** NOTE: The Original Code (as defined below) has been licensed to Sun +** Microsystems, Inc. ("Sun") under the SGI Free Software License B +** (Version 1.1), shown above ("SGI License"). Pursuant to Section +** 3.2(3) of the SGI License, Sun is distributing the Covered Code to +** you under an alternative license ("Alternative License"). This +** Alternative License includes all of the provisions of the SGI License +** except that Section 2.2 and 11 are omitted. Any differences between +** the Alternative License and the SGI License are offered solely by Sun +** and not by SGI. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: The application programming interfaces +** established by SGI in conjunction with the Original Code are The +** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released +** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version +** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X +** Window System(R) (Version 1.3), released October 19, 1998. This software +** was created using the OpenGL(R) version 1.2.1 Sample Implementation +** published by SGI, but has not been independently verified as being +** compliant with the OpenGL(R) version 1.2.1 Specification. +** +** Author: Eric Veach, July 1994 +** Java Port: Pepijn Van Eeckhoudt, July 2003 +** Java Port: Nathan Parker Burg, August 2003 +*/ +package org.lwjgl.util.glu.tessellation; + +class TessState { + public static final int T_DORMANT = 0; + public static final int T_IN_POLYGON = 1; + public static final int T_IN_CONTOUR = 2; +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/input/ControllerAdapter.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/input/ControllerAdapter.java new file mode 100644 index 0000000..8c1226a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/input/ControllerAdapter.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.input; + +import org.lwjgl.input.Controller; + +/** + * Adapter for the Controller interface. It can be used as placeholder + * Controller, which doesn't do anything (eg if Controllers.create() fails and + * you don't want to take care of that). + * + * @author Onyx, Aho and all the other aliases... + */ +public class ControllerAdapter implements Controller { + + /** + * Get the name assigned to this controller. + * + * @return The name assigned to this controller + */ + public String getName() { + return "Dummy Controller"; + } + + /** + * Get the index of this controller in the collection + * + * @return The index of this controller in the collection + */ + public int getIndex() { + return 0; //-1 maybe? + } + + /** + * Retrieve the number of buttons available on this controller + * + * @return The number of butotns available on this controller + */ + public int getButtonCount() { + return 0; + } + + /** + * Get the name of the specified button. Be warned, often this is as + * exciting as "Button X" + * + * @param index The index of the button whose name should be retrieved + * @return The name of the button requested + */ + public String getButtonName(int index) { + return "button n/a"; + } + + /** + * Check if a button is currently pressed + * + * @param index The button to check + * @return True if the button is currently pressed + */ + public boolean isButtonPressed(int index) { + return false; + } + + /** + * Poll the controller for new data. This will also update events + */ + public void poll() { + } + + /** + * Get the X-Axis value of the POV on this controller + * + * @return The X-Axis value of the POV on this controller + */ + public float getPovX() { + return 0f; + } + + /** + * Get the Y-Axis value of the POV on this controller + * + * @return The Y-Axis value of the POV on this controller + */ + public float getPovY() { + return 0f; + } + + /** + * Get the dead zone for a specified axis + * + * @param index The index of the axis for which to retrieve the dead zone + * @return The dead zone for the specified axis + */ + public float getDeadZone(int index) { + return 0f; + } + + /** + * Set the dead zone for the specified axis + * + * @param index The index of hte axis for which to set the dead zone + * @param zone The dead zone to use for the specified axis + */ + public void setDeadZone(int index, float zone) { + } + + /** + * Retrieve the number of axes available on this controller. + * + * @return The number of axes available on this controller. + */ + public int getAxisCount() { + return 0; + } + + /** + * Get the name that's given to the specified axis + * + * @param index The index of the axis whose name should be retrieved + * @return The name of the specified axis. + */ + public String getAxisName(int index) { + return "axis n/a"; + } + + /** + * Retrieve the value thats currently available on a specified axis. The + * value will always be between 1.0 and -1.0 and will calibrate as values + * are passed read. It may be useful to get the player to wiggle the + * joystick from side to side to get the calibration right. + * + * @param index The index of axis to be read + * @return The value from the specified axis. + */ + public float getAxisValue(int index) { + return 0f; + } + + /** + * Get the value from the X axis if there is one. If no X axis is defined a + * zero value will be returned. + * + * @return The value from the X axis + */ + public float getXAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the X axis. + * + * @return The dead zone for the X axis + */ + public float getXAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the X axis + * + * @param zone The dead zone to use for the X axis + */ + public void setXAxisDeadZone(float zone) { + } + + /** + * Get the value from the Y axis if there is one. If no Y axis is defined a + * zero value will be returned. + * + * @return The value from the Y axis + */ + public float getYAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the Y axis. + * + * @return The dead zone for the Y axis + */ + public float getYAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the Y axis + * + * @param zone The dead zone to use for the Y axis + */ + public void setYAxisDeadZone(float zone) { + } + + /** + * Get the value from the Z axis if there is one. If no Z axis is defined a + * zero value will be returned. + * + * @return The value from the Z axis + */ + public float getZAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the Z axis. + * + * @return The dead zone for the Z axis + */ + public float getZAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the Z axis + * + * @param zone The dead zone to use for the Z axis + */ + public void setZAxisDeadZone(float zone) { + } + + /** + * Get the value from the RX axis if there is one. If no RX axis is defined + * a zero value will be returned. + * + * @return The value from the RX axis + */ + public float getRXAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RX axis. + * + * @return The dead zone for the RX axis + */ + public float getRXAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RX axis + * + * @param zone The dead zone to use for the RX axis + */ + public void setRXAxisDeadZone(float zone) { + } + + /** + * Get the value from the RY axis if there is one. If no RY axis is defined + * a zero value will be returned. + * + * @return The value from the RY axis + */ + public float getRYAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RY axis. + * + * @return The dead zone for the RY axis + */ + public float getRYAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RY axis + * + * @param zone The dead zone to use for the RY axis + */ + public void setRYAxisDeadZone(float zone) { + } + + /** + * Get the value from the RZ axis if there is one. If no RZ axis is defined + * a zero value will be returned. + * + * @return The value from the RZ axis + */ + public float getRZAxisValue() { + return 0f; + } + + /** + * Get the dead zone for the RZ axis. + * + * @return The dead zone for the RZ axis + */ + public float getRZAxisDeadZone() { + return 0f; + } + + /** + * Set the dead zone for the RZ axis + * + * @param zone The dead zone to use for the RZ axis + */ + public void setRZAxisDeadZone(float zone) { + } + + public int getRumblerCount() { + return 0; + } + + public String getRumblerName(int index) { + return "rumber n/a"; + } + + public void setRumblerStrength(int index, float strength) { + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/KeyMap.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/KeyMap.java new file mode 100644 index 0000000..2143e4a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/KeyMap.java @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.jinput; + +import org.lwjgl.input.Keyboard; +import net.java.games.input.Component; + +/** + * @author elias + */ +final class KeyMap { + public static Component.Identifier.Key map(int lwjgl_key_code) { + switch (lwjgl_key_code) { + case Keyboard.KEY_ESCAPE: + return Component.Identifier.Key.ESCAPE; + case Keyboard.KEY_1: + return Component.Identifier.Key._1; + case Keyboard.KEY_2: + return Component.Identifier.Key._2; + case Keyboard.KEY_3: + return Component.Identifier.Key._3; + case Keyboard.KEY_4: + return Component.Identifier.Key._4; + case Keyboard.KEY_5: + return Component.Identifier.Key._5; + case Keyboard.KEY_6: + return Component.Identifier.Key._6; + case Keyboard.KEY_7: + return Component.Identifier.Key._7; + case Keyboard.KEY_8: + return Component.Identifier.Key._8; + case Keyboard.KEY_9: + return Component.Identifier.Key._9; + case Keyboard.KEY_0: + return Component.Identifier.Key._0; + case Keyboard.KEY_MINUS: + return Component.Identifier.Key.MINUS; + case Keyboard.KEY_EQUALS: + return Component.Identifier.Key.EQUALS; + case Keyboard.KEY_BACK: + return Component.Identifier.Key.BACK; + case Keyboard.KEY_TAB: + return Component.Identifier.Key.TAB; + case Keyboard.KEY_Q: + return Component.Identifier.Key.Q; + case Keyboard.KEY_W: + return Component.Identifier.Key.W; + case Keyboard.KEY_E: + return Component.Identifier.Key.E; + case Keyboard.KEY_R: + return Component.Identifier.Key.R; + case Keyboard.KEY_T: + return Component.Identifier.Key.T; + case Keyboard.KEY_Y: + return Component.Identifier.Key.Y; + case Keyboard.KEY_U: + return Component.Identifier.Key.U; + case Keyboard.KEY_I: + return Component.Identifier.Key.I; + case Keyboard.KEY_O: + return Component.Identifier.Key.O; + case Keyboard.KEY_P: + return Component.Identifier.Key.P; + case Keyboard.KEY_LBRACKET: + return Component.Identifier.Key.LBRACKET; + case Keyboard.KEY_RBRACKET: + return Component.Identifier.Key.RBRACKET; + case Keyboard.KEY_RETURN: + return Component.Identifier.Key.RETURN; + case Keyboard.KEY_LCONTROL: + return Component.Identifier.Key.LCONTROL; + case Keyboard.KEY_A: + return Component.Identifier.Key.A; + case Keyboard.KEY_S: + return Component.Identifier.Key.S; + case Keyboard.KEY_D: + return Component.Identifier.Key.D; + case Keyboard.KEY_F: + return Component.Identifier.Key.F; + case Keyboard.KEY_G: + return Component.Identifier.Key.G; + case Keyboard.KEY_H: + return Component.Identifier.Key.H; + case Keyboard.KEY_J: + return Component.Identifier.Key.J; + case Keyboard.KEY_K: + return Component.Identifier.Key.K; + case Keyboard.KEY_L: + return Component.Identifier.Key.L; + case Keyboard.KEY_SEMICOLON: + return Component.Identifier.Key.SEMICOLON; + case Keyboard.KEY_APOSTROPHE: + return Component.Identifier.Key.APOSTROPHE; + case Keyboard.KEY_GRAVE: + return Component.Identifier.Key.GRAVE; + case Keyboard.KEY_LSHIFT: + return Component.Identifier.Key.LSHIFT; + case Keyboard.KEY_BACKSLASH: + return Component.Identifier.Key.BACKSLASH; + case Keyboard.KEY_Z: + return Component.Identifier.Key.Z; + case Keyboard.KEY_X: + return Component.Identifier.Key.X; + case Keyboard.KEY_C: + return Component.Identifier.Key.C; + case Keyboard.KEY_V: + return Component.Identifier.Key.V; + case Keyboard.KEY_B: + return Component.Identifier.Key.B; + case Keyboard.KEY_N: + return Component.Identifier.Key.N; + case Keyboard.KEY_M: + return Component.Identifier.Key.M; + case Keyboard.KEY_COMMA: + return Component.Identifier.Key.COMMA; + case Keyboard.KEY_PERIOD: + return Component.Identifier.Key.PERIOD; + case Keyboard.KEY_SLASH: + return Component.Identifier.Key.SLASH; + case Keyboard.KEY_RSHIFT: + return Component.Identifier.Key.RSHIFT; + case Keyboard.KEY_MULTIPLY: + return Component.Identifier.Key.MULTIPLY; + case Keyboard.KEY_LMENU: + return Component.Identifier.Key.LALT; + case Keyboard.KEY_SPACE: + return Component.Identifier.Key.SPACE; + case Keyboard.KEY_CAPITAL: + return Component.Identifier.Key.CAPITAL; + case Keyboard.KEY_F1: + return Component.Identifier.Key.F1; + case Keyboard.KEY_F2: + return Component.Identifier.Key.F2; + case Keyboard.KEY_F3: + return Component.Identifier.Key.F3; + case Keyboard.KEY_F4: + return Component.Identifier.Key.F4; + case Keyboard.KEY_F5: + return Component.Identifier.Key.F5; + case Keyboard.KEY_F6: + return Component.Identifier.Key.F6; + case Keyboard.KEY_F7: + return Component.Identifier.Key.F7; + case Keyboard.KEY_F8: + return Component.Identifier.Key.F8; + case Keyboard.KEY_F9: + return Component.Identifier.Key.F9; + case Keyboard.KEY_F10: + return Component.Identifier.Key.F10; + case Keyboard.KEY_NUMLOCK: + return Component.Identifier.Key.NUMLOCK; + case Keyboard.KEY_SCROLL: + return Component.Identifier.Key.SCROLL; + case Keyboard.KEY_NUMPAD7: + return Component.Identifier.Key.NUMPAD7; + case Keyboard.KEY_NUMPAD8: + return Component.Identifier.Key.NUMPAD8; + case Keyboard.KEY_NUMPAD9: + return Component.Identifier.Key.NUMPAD9; + case Keyboard.KEY_SUBTRACT: + return Component.Identifier.Key.SUBTRACT; + case Keyboard.KEY_NUMPAD4: + return Component.Identifier.Key.NUMPAD4; + case Keyboard.KEY_NUMPAD5: + return Component.Identifier.Key.NUMPAD5; + case Keyboard.KEY_NUMPAD6: + return Component.Identifier.Key.NUMPAD6; + case Keyboard.KEY_ADD: + return Component.Identifier.Key.ADD; + case Keyboard.KEY_NUMPAD1: + return Component.Identifier.Key.NUMPAD1; + case Keyboard.KEY_NUMPAD2: + return Component.Identifier.Key.NUMPAD2; + case Keyboard.KEY_NUMPAD3: + return Component.Identifier.Key.NUMPAD3; + case Keyboard.KEY_NUMPAD0: + return Component.Identifier.Key.NUMPAD0; + case Keyboard.KEY_DECIMAL: + return Component.Identifier.Key.DECIMAL; + case Keyboard.KEY_F11: + return Component.Identifier.Key.F11; + case Keyboard.KEY_F12: + return Component.Identifier.Key.F12; + case Keyboard.KEY_F13: + return Component.Identifier.Key.F13; + case Keyboard.KEY_F14: + return Component.Identifier.Key.F14; + case Keyboard.KEY_F15: + return Component.Identifier.Key.F15; + case Keyboard.KEY_KANA: + return Component.Identifier.Key.KANA; + case Keyboard.KEY_CONVERT: + return Component.Identifier.Key.CONVERT; + case Keyboard.KEY_NOCONVERT: + return Component.Identifier.Key.NOCONVERT; + case Keyboard.KEY_YEN: + return Component.Identifier.Key.YEN; + case Keyboard.KEY_NUMPADEQUALS: + return Component.Identifier.Key.NUMPADEQUAL; + case Keyboard.KEY_CIRCUMFLEX: + return Component.Identifier.Key.CIRCUMFLEX; + case Keyboard.KEY_AT: + return Component.Identifier.Key.AT; + case Keyboard.KEY_COLON: + return Component.Identifier.Key.COLON; + case Keyboard.KEY_UNDERLINE: + return Component.Identifier.Key.UNDERLINE; + case Keyboard.KEY_KANJI: + return Component.Identifier.Key.KANJI; + case Keyboard.KEY_STOP: + return Component.Identifier.Key.STOP; + case Keyboard.KEY_AX: + return Component.Identifier.Key.AX; + case Keyboard.KEY_UNLABELED: + return Component.Identifier.Key.UNLABELED; + case Keyboard.KEY_NUMPADENTER: + return Component.Identifier.Key.NUMPADENTER; + case Keyboard.KEY_RCONTROL: + return Component.Identifier.Key.RCONTROL; + case Keyboard.KEY_NUMPADCOMMA: + return Component.Identifier.Key.NUMPADCOMMA; + case Keyboard.KEY_DIVIDE: + return Component.Identifier.Key.DIVIDE; + case Keyboard.KEY_SYSRQ: + return Component.Identifier.Key.SYSRQ; + case Keyboard.KEY_RMENU: + return Component.Identifier.Key.RALT; + case Keyboard.KEY_PAUSE: + return Component.Identifier.Key.PAUSE; + case Keyboard.KEY_HOME: + return Component.Identifier.Key.HOME; + case Keyboard.KEY_UP: + return Component.Identifier.Key.UP; + case Keyboard.KEY_PRIOR: + return Component.Identifier.Key.PAGEUP; + case Keyboard.KEY_LEFT: + return Component.Identifier.Key.LEFT; + case Keyboard.KEY_RIGHT: + return Component.Identifier.Key.RIGHT; + case Keyboard.KEY_END: + return Component.Identifier.Key.END; + case Keyboard.KEY_DOWN: + return Component.Identifier.Key.DOWN; + case Keyboard.KEY_NEXT: + return Component.Identifier.Key.PAGEDOWN; + case Keyboard.KEY_INSERT: + return Component.Identifier.Key.INSERT; + case Keyboard.KEY_DELETE: + return Component.Identifier.Key.DELETE; + case Keyboard.KEY_LMETA: + return Component.Identifier.Key.LWIN; + case Keyboard.KEY_RMETA: + return Component.Identifier.Key.RWIN; + case Keyboard.KEY_APPS: + return Component.Identifier.Key.APPS; + case Keyboard.KEY_POWER: + return Component.Identifier.Key.POWER; + case Keyboard.KEY_SLEEP: + return Component.Identifier.Key.SLEEP; + default: + return Component.Identifier.Key.UNKNOWN; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java new file mode 100644 index 0000000..6f4b5f3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLEnvironmentPlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.jinput; + +import net.java.games.input.Controller; +import net.java.games.input.ControllerEnvironment; +import net.java.games.util.plugins.Plugin; + +/** + * @author elias + */ +public class LWJGLEnvironmentPlugin extends ControllerEnvironment implements Plugin { + private final Controller[] controllers; + + public LWJGLEnvironmentPlugin() { + this.controllers = new Controller[]{new LWJGLKeyboard(), new LWJGLMouse()}; + } + + public Controller[] getControllers() { + return controllers; + } + + public boolean isSupported() { + return true; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLKeyboard.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLKeyboard.java new file mode 100644 index 0000000..5a0671d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLKeyboard.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.jinput; + +import net.java.games.input.AbstractComponent; +import net.java.games.input.Keyboard; +import net.java.games.input.Component; +import net.java.games.input.Controller; +import net.java.games.input.Rumbler; +import net.java.games.input.Event; +import java.util.List; +import java.util.ArrayList; + +import java.io.IOException; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +/** + * @author elias + */ +final class LWJGLKeyboard extends Keyboard { + LWJGLKeyboard() { + super("LWJGLKeyboard", createComponents(), new Controller[]{}, new Rumbler[]{}); + } + + private static Component[] createComponents() { + List<Key> components = new ArrayList<Key>(); + Field[] vkey_fields = org.lwjgl.input.Keyboard.class.getFields(); + for ( Field vkey_field : vkey_fields ) { + try { + if (Modifier.isStatic(vkey_field.getModifiers()) && vkey_field.getType() == int.class && + vkey_field.getName().startsWith("KEY_")) { + int vkey_code = vkey_field.getInt(null); + Component.Identifier.Key key_id = KeyMap.map(vkey_code); + if (key_id != Component.Identifier.Key.UNKNOWN) + components.add(new Key(key_id, vkey_code)); + } + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + return components.toArray(new Component[components.size()]); + } + + public synchronized void pollDevice() throws IOException { + if (!org.lwjgl.input.Keyboard.isCreated()) + return; + org.lwjgl.input.Keyboard.poll(); + for ( Component component : getComponents() ) { + Key key = (Key)component; + key.update(); + } + } + + protected synchronized boolean getNextDeviceEvent(Event event) throws IOException { + if (!org.lwjgl.input.Keyboard.isCreated()) + return false; + if (!org.lwjgl.input.Keyboard.next()) + return false; + int lwjgl_key = org.lwjgl.input.Keyboard.getEventKey(); + if (lwjgl_key == org.lwjgl.input.Keyboard.KEY_NONE) + return false; + Component.Identifier.Key key_id = KeyMap.map(lwjgl_key); + if (key_id == null) + return false; + Component key = getComponent(key_id); + if (key == null) + return false; + float value = org.lwjgl.input.Keyboard.getEventKeyState() ? 1 : 0; + event.set(key, value, org.lwjgl.input.Keyboard.getEventNanoseconds()); + return true; + } + + + private static final class Key extends AbstractComponent { + private final int lwjgl_key; + private float value; + + Key(Component.Identifier.Key key_id, int lwjgl_key) { + super(key_id.getName(), key_id); + this.lwjgl_key = lwjgl_key; + } + + public void update() { + this.value = org.lwjgl.input.Keyboard.isKeyDown(lwjgl_key) ? 1 : 0; + } + + protected float poll() { + return value; + } + + public boolean isRelative() { + return false; + } + + public boolean isAnalog() { + return false; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLMouse.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLMouse.java new file mode 100644 index 0000000..8516c14 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/jinput/LWJGLMouse.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.jinput; + +import java.io.IOException; + +import net.java.games.input.AbstractComponent; +import net.java.games.input.Component; +import net.java.games.input.Controller; +import net.java.games.input.Event; +import net.java.games.input.Mouse; +import net.java.games.input.Rumbler; + +/** + * @author elias + */ +final class LWJGLMouse extends Mouse { + private static final int EVENT_X = 1; + private static final int EVENT_Y = 2; + private static final int EVENT_WHEEL = 3; + private static final int EVENT_BUTTON = 4; + private static final int EVENT_DONE = 5; + + private int event_state = EVENT_DONE; + + LWJGLMouse() { + super("LWJGLMouse", createComponents(), new Controller[]{}, new Rumbler[]{}); + } + + private static Component[] createComponents() { + return new Component[]{new Axis(Component.Identifier.Axis.X), + new Axis(Component.Identifier.Axis.Y), + new Axis(Component.Identifier.Axis.Z), + new Button(Component.Identifier.Button.LEFT), + new Button(Component.Identifier.Button.MIDDLE), + new Button(Component.Identifier.Button.RIGHT)}; + } + + public synchronized void pollDevice() throws IOException { + if (!org.lwjgl.input.Mouse.isCreated()) + return; + org.lwjgl.input.Mouse.poll(); + for (int i = 0; i < 3; i++) + setButtonState(i); + } + + private Button map(int lwjgl_button) { + switch (lwjgl_button) { + case 0: + return (Button)getLeft(); + case 1: + return (Button)getRight(); + case 2: + return (Button)getMiddle(); + default: + return null; + } + } + + private void setButtonState(int lwjgl_button) { + Button button = map(lwjgl_button); + if (button != null) + button.setValue(org.lwjgl.input.Mouse.isButtonDown(lwjgl_button) ? 1 : 0); + } + + protected synchronized boolean getNextDeviceEvent(Event event) throws IOException { + if (!org.lwjgl.input.Mouse.isCreated()) + return false; + while (true) { + long nanos = org.lwjgl.input.Mouse.getEventNanoseconds(); + switch (event_state) { + case EVENT_X: + event_state = EVENT_Y; + int dx = org.lwjgl.input.Mouse.getEventDX(); + if (dx != 0) { + event.set(getX(), dx, nanos); + return true; + } + break; + case EVENT_Y: + event_state = EVENT_WHEEL; + /* We must negate the y coord since lwjgl uses the + * OpenGL coordinate system + */ + int dy = -org.lwjgl.input.Mouse.getEventDY(); + if (dy != 0) { + event.set(getY(), dy, nanos); + return true; + } + break; + case EVENT_WHEEL: + event_state = EVENT_BUTTON; + int dwheel = org.lwjgl.input.Mouse.getEventDWheel(); + if (dwheel != 0) { + event.set(getWheel(), dwheel, nanos); + return true; + } + break; + case EVENT_BUTTON: + event_state = EVENT_DONE; + int lwjgl_button = org.lwjgl.input.Mouse.getEventButton(); + if (lwjgl_button != -1) { + Button button = map(lwjgl_button); + if (button != null) { + event.set(button, org.lwjgl.input.Mouse.getEventButtonState() ? 1f : 0f, nanos); + return true; + } + } + break; + case EVENT_DONE: + if (!org.lwjgl.input.Mouse.next()) + return false; + event_state = EVENT_X; + break; + default: + break; + } + } + } + + static final class Axis extends AbstractComponent { + Axis(Component.Identifier.Axis axis_id) { + super(axis_id.getName(), axis_id); + } + + public boolean isRelative() { + return true; + } + + protected float poll() throws IOException { + return 0; + } + + public boolean isAnalog() { + return true; + } + } + + static final class Button extends AbstractComponent { + private float value; + + Button(Component.Identifier.Button button_id) { + super(button_id.getName(), button_id); + } + + void setValue(float value) { + this.value = value; + } + + protected float poll() throws IOException { + return value; + } + + public boolean isRelative() { + return false; + } + + public boolean isAnalog() { + return false; + } + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLinePad.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLinePad.java new file mode 100644 index 0000000..6ad2ab0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLinePad.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * When this annotation is used on a field, automatic cache-line-sized padding + * will be inserted around the field. This is useful in multi-threaded algorithms + * to avoid cache line false sharing. The annotation defaults to padding after + * the field, but can be changed to before or both before and after. It can be + * applied to both mapped object fields and POJO primitive fields. + * + * @author Spasi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CacheLinePad { + + /** + * When true, cache-line padding will be inserted before the field. + * + * @return + */ + boolean before() default false; + + /** + * When true, cache-line padding will be inserted after the field. + * + * @return + */ + boolean after() default true; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLineSize.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLineSize.java new file mode 100644 index 0000000..fef93f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheLineSize.java @@ -0,0 +1,141 @@ +package org.lwjgl.util.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.lwjgl.util.mapped.MappedHelper.*; + +/** + * This micro-benchmark tries to detect the CPU's cache line size. This is + * done by exploiting cache line false sharing in multi-threaded code: + * When 2 threads simultaneously access the same cache line (and at least + * 1 access is a write), performance drops considerably. We detect this + * performance drop while decreasing the memory padding in every test step. + * + * @author Spasi + */ +final class CacheLineSize { + + private CacheLineSize() { + } + + static int getCacheLineSize() { + final int THREADS = 2; + final int REPEATS = 100000 * THREADS; + final int LOCAL_REPEATS = REPEATS / THREADS; + + // Detection will start from CacheLineMaxSize bytes. + final int MAX_SIZE = LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineMaxSize", 1024) / 4; // in # of integers + // Detection will stop when the execution time increases by more than CacheLineTimeThreshold %. + final double TIME_THRESHOLD = 1.0 + LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineTimeThreshold", 50) / 100.0; + + final ExecutorService executorService = Executors.newFixedThreadPool(THREADS); + final ExecutorCompletionService<Long> completionService = new ExecutorCompletionService<Long>(executorService); + + try { + // We need to use a NIO buffer in order to guarantee memory alignment. + final IntBuffer memory = getMemory(MAX_SIZE); + + // -- WARMUP -- + + final int WARMUP = 10; + for ( int i = 0; i < WARMUP; i++ ) + doTest(THREADS, LOCAL_REPEATS, 0, memory, completionService); + + // -- CACHE LINE SIZE DETECTION -- + + long totalTime = 0; + int count = 0; + int cacheLineSize = 64; // fallback to the most common size these days + boolean found = false; + for ( int i = MAX_SIZE; i >= 1; i >>= 1 ) { + final long time = doTest(THREADS, LOCAL_REPEATS, i, memory, completionService); + if ( totalTime > 0 ) { // Ignore first run + final long avgTime = totalTime / count; + if ( (double)time / (double)avgTime > TIME_THRESHOLD ) { // Try to detect a noticeable jump in execution time + cacheLineSize = (i << 1) * 4; + found = true; + break; + } + } + totalTime += time; + count++; + } + + if ( LWJGLUtil.DEBUG ) { + if ( found ) + LWJGLUtil.log("Cache line size detected: " + cacheLineSize + " bytes"); + else + LWJGLUtil.log("Failed to detect cache line size, assuming " + cacheLineSize + " bytes"); + } + + return cacheLineSize; + } finally { + executorService.shutdown(); + } + } + + public static void main(String[] args) { + CacheUtil.getCacheLineSize(); + } + + static long memoryLoop(final int index, final int repeats, final IntBuffer memory, final int padding) { + final long address = MemoryUtil.getAddress(memory) + (index * padding * 4); + + final long time = System.nanoTime(); + for ( int i = 0; i < repeats; i++ ) { + // Use volatile access to avoid server VM optimizations. + ivput(ivget(address) + 1, address); + } + + return System.nanoTime() - time; + } + + private static IntBuffer getMemory(final int START_SIZE) { + final int PAGE_SIZE = MappedObjectUnsafe.INSTANCE.pageSize(); + + final ByteBuffer buffer = ByteBuffer.allocateDirect((START_SIZE * 4) + PAGE_SIZE).order(ByteOrder.nativeOrder()); + + // Align to page and, consequently, to cache line. Otherwise results will be inconsistent. + if ( MemoryUtil.getAddress(buffer) % PAGE_SIZE != 0 ) { + // Round up to page boundary + buffer.position(PAGE_SIZE - (int)(MemoryUtil.getAddress(buffer) & (PAGE_SIZE - 1))); + } + + return buffer.asIntBuffer(); + } + + private static long doTest(final int threads, final int repeats, final int padding, final IntBuffer memory, final ExecutorCompletionService<Long> completionService) { + for ( int i = 0; i < threads; i++ ) + submitTest(completionService, i, repeats, memory, padding); + return waitForResults(threads, completionService); + } + + private static void submitTest(final ExecutorCompletionService<Long> completionService, final int index, final int repeats, final IntBuffer memory, final int padding) { + completionService.submit(new Callable<Long>() { + public Long call() throws Exception { + return memoryLoop(index, repeats, memory, padding); + } + }); + } + + private static long waitForResults(final int count, final ExecutorCompletionService<Long> completionService) { + try { + long totalTime = 0; + for ( int i = 0; i < count; i++ ) + totalTime += completionService.take().get(); + return totalTime; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheUtil.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheUtil.java new file mode 100644 index 0000000..53ef6da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/CacheUtil.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.lwjgl.PointerBuffer; + +import java.nio.*; + +/** + * This class provides utility methods for allocating cache-line-aligned + * NIO buffers. The CPU cache line size is detected using a micro-benchmark + * that exploits the performation degredation that occurs when different + * threads write to different locations of the same cache line. The detection + * should be reasonably robust on both the server and client VM, but there + * are a few system properties that can be used to tune it. + * + * @author Spasi + */ +public final class CacheUtil { + + private static final int CACHE_LINE_SIZE; + + static { + final Integer size = LWJGLUtil.getPrivilegedInteger("org.lwjgl.util.mapped.CacheLineSize"); // forces a specific cache line size + + if ( size != null ) { + if ( size < 1 ) + throw new IllegalStateException("Invalid CacheLineSize specified: " + size); + CACHE_LINE_SIZE = size; + } else if ( Runtime.getRuntime().availableProcessors() == 1 ) { // We cannot use false sharing to detect it + /* + Spasi: + + I have implemented a single-threaded benchmark for this, but it requires + lots of memory allocations and could not tune it for both the client and + server VM. It's not a big deal anyway, 64 bytes should be ok for any + single-core CPU. + */ + if ( LWJGLUtil.DEBUG ) + LWJGLUtil.log("Cannot detect cache line size on single-core CPUs, assuming 64 bytes."); + CACHE_LINE_SIZE = 64; + } else + CACHE_LINE_SIZE = CacheLineSize.getCacheLineSize(); + } + + private CacheUtil() { + } + + /** + * Returns the CPU cache line size, in number of bytes. + * + * @return the cache line size + */ + public static int getCacheLineSize() { + return CACHE_LINE_SIZE; + } + + /** + * Construct a direct, native-ordered and cache-line-aligned bytebuffer with the specified size. + * + * @param size The size, in bytes + * + * @return a ByteBuffer + */ + public static ByteBuffer createByteBuffer(int size) { + ByteBuffer buffer = ByteBuffer.allocateDirect(size + CACHE_LINE_SIZE); + + // Align to cache line. + if ( MemoryUtil.getAddress(buffer) % CACHE_LINE_SIZE != 0 ) { + // Round up to cache line boundary + buffer.position(CACHE_LINE_SIZE - (int)(MemoryUtil.getAddress(buffer) & (CACHE_LINE_SIZE - 1))); + } + + buffer.limit(buffer.position() + size); + return buffer.slice().order(ByteOrder.nativeOrder()); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned shortbuffer with the specified number + * of elements. + * + * @param size The size, in shorts + * + * @return a ShortBuffer + */ + public static ShortBuffer createShortBuffer(int size) { + return createByteBuffer(size << 1).asShortBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned charbuffer with the specified number + * of elements. + * + * @param size The size, in chars + * + * @return an CharBuffer + */ + public static CharBuffer createCharBuffer(int size) { + return createByteBuffer(size << 1).asCharBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned intbuffer with the specified number + * of elements. + * + * @param size The size, in ints + * + * @return an IntBuffer + */ + public static IntBuffer createIntBuffer(int size) { + return createByteBuffer(size << 2).asIntBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned longbuffer with the specified number + * of elements. + * + * @param size The size, in longs + * + * @return an LongBuffer + */ + public static LongBuffer createLongBuffer(int size) { + return createByteBuffer(size << 3).asLongBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned floatbuffer with the specified number + * of elements. + * + * @param size The size, in floats + * + * @return a FloatBuffer + */ + public static FloatBuffer createFloatBuffer(int size) { + return createByteBuffer(size << 2).asFloatBuffer(); + } + + /** + * Construct a direct, native-ordered and cache-line-aligned doublebuffer with the specified number + * of elements. + * + * @param size The size, in floats + * + * @return a FloatBuffer + */ + public static DoubleBuffer createDoubleBuffer(int size) { + return createByteBuffer(size << 3).asDoubleBuffer(); + } + + /** + * Construct a cache-line-aligned PointerBuffer with the specified number + * of elements. + * + * @param size The size, in memory addresses + * + * @return a PointerBuffer + */ + public static PointerBuffer createPointerBuffer(int size) { + return new PointerBuffer(createByteBuffer(size * PointerBuffer.getPointerSize())); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedField.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedField.java new file mode 100644 index 0000000..f280e88 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedField.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation can be used on fields of {@link MappedObject} subclasses, + * to manually specify byte offsets and lengths. This is useful when the + * mapped fields require custom alignment. {@link java.nio.ByteBuffer} + * fields are required to have this annotation with a hardcoded byte length. + * + * @author Riven + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface MappedField { + + /** + * Specifies the field byte offset within the mapped object. + * + * @return the field byte offset + */ + long byteOffset() default -1; + + /** + * Specifies the field byte length. Required for {@link java.nio.ByteBuffer} fields. + * + * @return the field byte length + */ + long byteLength() default -1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedForeach.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedForeach.java new file mode 100644 index 0000000..ed75d3d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedForeach.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.util.Iterator; + +/** + * Iterable implementation for {@link MappedObject}. + * + * @author Riven + */ +final class MappedForeach<T extends MappedObject> implements Iterable<T> { + + final T mapped; + final int elementCount; + + MappedForeach(T mapped, int elementCount) { + this.mapped = mapped; + this.elementCount = elementCount; + } + + public Iterator<T> iterator() { + return new Iterator<T>() { + + private int index; + + public boolean hasNext() { + return this.index < (MappedForeach.this.elementCount); + } + + public T next() { + mapped.setViewAddress(mapped.getViewAddress(this.index++)); + return mapped; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedHelper.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedHelper.java new file mode 100644 index 0000000..9002d89 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedHelper.java @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.ByteBuffer; + +import static org.lwjgl.util.mapped.MappedObjectUnsafe.*; + +/** + * [INTERNAL USE ONLY] + * <p/> + * Helper class used by the bytecode transformer. + * + * @author Riven + */ +public class MappedHelper { + + public static void setup(MappedObject mo, ByteBuffer buffer, int align, int sizeof) { + if ( LWJGLUtil.CHECKS && mo.baseAddress != 0L ) + throw new IllegalStateException("this method should not be called by user-code"); + + if ( LWJGLUtil.CHECKS && !buffer.isDirect() ) + throw new IllegalArgumentException("bytebuffer must be direct"); + mo.preventGC = buffer; + + if ( LWJGLUtil.CHECKS && align <= 0 ) + throw new IllegalArgumentException("invalid alignment"); + + if ( LWJGLUtil.CHECKS && (sizeof <= 0 || sizeof % align != 0) ) + throw new IllegalStateException("sizeof not a multiple of alignment"); + + long addr = MemoryUtil.getAddress(buffer); + if ( LWJGLUtil.CHECKS && addr % align != 0 ) + throw new IllegalStateException("buffer address not aligned on " + align + " bytes"); + + mo.baseAddress = mo.viewAddress = addr; + } + + public static void checkAddress(long viewAddress, MappedObject mapped) { + mapped.checkAddress(viewAddress); + } + + public static void put_views(MappedSet2 set, int view) { + set.view(view); + } + + public static void put_views(MappedSet3 set, int view) { + set.view(view); + } + + public static void put_views(MappedSet4 set, int view) { + set.view(view); + } + + public static void put_view(MappedObject mapped, int view, int sizeof) { + mapped.setViewAddress(mapped.baseAddress + view * sizeof); + } + + public static int get_view(MappedObject mapped, int sizeof) { + return (int)(mapped.viewAddress - mapped.baseAddress) / sizeof; + } + + public static void put_view_shift(MappedObject mapped, int view, int sizeof_shift) { + mapped.setViewAddress(mapped.baseAddress + (view << sizeof_shift)); + } + + public static int get_view_shift(MappedObject mapped, int sizeof_shift) { + return ((int)(mapped.viewAddress - mapped.baseAddress)) >> sizeof_shift; + } + + public static void put_view_next(MappedObject mapped, int sizeof) { + mapped.setViewAddress(mapped.viewAddress + sizeof); + } + + public static MappedObject dup(MappedObject src, MappedObject dst) { + dst.baseAddress = src.baseAddress; + dst.viewAddress = src.viewAddress; + dst.preventGC = src.preventGC; + return dst; + } + + public static MappedObject slice(MappedObject src, MappedObject dst) { + dst.baseAddress = src.viewAddress; // ! + dst.viewAddress = src.viewAddress; + dst.preventGC = src.preventGC; + return dst; + } + + public static void copy(MappedObject src, MappedObject dst, int bytes) { + if ( MappedObject.CHECKS ) { + src.checkRange(bytes); + dst.checkRange(bytes); + } + + INSTANCE.copyMemory(src.viewAddress, dst.viewAddress, bytes); + } + + public static ByteBuffer newBuffer(long address, int capacity) { + return MappedObjectUnsafe.newBuffer(address, capacity); + } + + // ---- primitive fields read/write + + // byte + + public static void bput(byte value, long addr) { + INSTANCE.putByte(addr, value); + } + + public static void bput(MappedObject mapped, byte value, int fieldOffset) { + INSTANCE.putByte(mapped.viewAddress + fieldOffset, value); + } + + public static byte bget(long addr) { + return INSTANCE.getByte(addr); + } + + public static byte bget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getByte(mapped.viewAddress + fieldOffset); + } + + public static void bvput(byte value, long addr) { + INSTANCE.putByteVolatile(null, addr, value); + } + + public static void bvput(MappedObject mapped, byte value, int fieldOffset) { + INSTANCE.putByteVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static byte bvget(long addr) { + return INSTANCE.getByteVolatile(null, addr); + } + + public static byte bvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getByteVolatile(null, mapped.viewAddress + fieldOffset); + } + + // short + + public static void sput(short value, long addr) { + INSTANCE.putShort(addr, value); + } + + public static void sput(MappedObject mapped, short value, int fieldOffset) { + INSTANCE.putShort(mapped.viewAddress + fieldOffset, value); + } + + public static short sget(long addr) { + return INSTANCE.getShort(addr); + } + + public static short sget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getShort(mapped.viewAddress + fieldOffset); + } + + public static void svput(short value, long addr) { + INSTANCE.putShortVolatile(null, addr, value); + } + + public static void svput(MappedObject mapped, short value, int fieldOffset) { + INSTANCE.putShortVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static short svget(long addr) { + return INSTANCE.getShortVolatile(null, addr); + } + + public static short svget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getShortVolatile(null, mapped.viewAddress + fieldOffset); + } + + // char + + public static void cput(char value, long addr) { + INSTANCE.putChar(addr, value); + } + + public static void cput(MappedObject mapped, char value, int fieldOffset) { + INSTANCE.putChar(mapped.viewAddress + fieldOffset, value); + } + + public static char cget(long addr) { + return INSTANCE.getChar(addr); + } + + public static char cget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getChar(mapped.viewAddress + fieldOffset); + } + + public static void cvput(char value, long addr) { + INSTANCE.putCharVolatile(null, addr, value); + } + + public static void cvput(MappedObject mapped, char value, int fieldOffset) { + INSTANCE.putCharVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static char cvget(long addr) { + return INSTANCE.getCharVolatile(null, addr); + } + + public static char cvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getCharVolatile(null, mapped.viewAddress + fieldOffset); + } + + // int + + public static void iput(int value, long addr) { + INSTANCE.putInt(addr, value); + } + + public static void iput(MappedObject mapped, int value, int fieldOffset) { + INSTANCE.putInt(mapped.viewAddress + fieldOffset, value); + } + + public static int iget(long address) { + return INSTANCE.getInt(address); + } + + public static int iget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getInt(mapped.viewAddress + fieldOffset); + } + + public static void ivput(int value, long addr) { + INSTANCE.putIntVolatile(null, addr, value); + } + + public static void ivput(MappedObject mapped, int value, int fieldOffset) { + INSTANCE.putIntVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static int ivget(long address) { + return INSTANCE.getIntVolatile(null, address); + } + + public static int ivget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getIntVolatile(null, mapped.viewAddress + fieldOffset); + } + + // float + + public static void fput(float value, long addr) { + INSTANCE.putFloat(addr, value); + } + + public static void fput(MappedObject mapped, float value, int fieldOffset) { + INSTANCE.putFloat(mapped.viewAddress + fieldOffset, value); + } + + public static float fget(long addr) { + return INSTANCE.getFloat(addr); + } + + public static float fget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getFloat(mapped.viewAddress + fieldOffset); + } + + public static void fvput(float value, long addr) { + INSTANCE.putFloatVolatile(null, addr, value); + } + + public static void fvput(MappedObject mapped, float value, int fieldOffset) { + INSTANCE.putFloatVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static float fvget(long addr) { + return INSTANCE.getFloatVolatile(null, addr); + } + + public static float fvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getFloatVolatile(null, mapped.viewAddress + fieldOffset); + } + + // long + + public static void jput(long value, long addr) { + INSTANCE.putLong(addr, value); + } + + public static void jput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putLong(mapped.viewAddress + fieldOffset, value); + } + + public static long jget(long addr) { + return INSTANCE.getLong(addr); + } + + public static long jget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getLong(mapped.viewAddress + fieldOffset); + } + + public static void jvput(long value, long addr) { + INSTANCE.putLongVolatile(null, addr, value); + } + + public static void jvput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putLongVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static long jvget(long addr) { + return INSTANCE.getLongVolatile(null, addr); + } + + public static long jvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getLongVolatile(null, mapped.viewAddress + fieldOffset); + } + + // address + + public static void aput(long value, long addr) { + INSTANCE.putAddress(addr, value); + } + + public static void aput(MappedObject mapped, long value, int fieldOffset) { + INSTANCE.putAddress(mapped.viewAddress + fieldOffset, value); + } + + public static long aget(long addr) { + return INSTANCE.getAddress(addr); + } + + public static long aget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getAddress(mapped.viewAddress + fieldOffset); + } + + // double + + public static void dput(double value, long addr) { + INSTANCE.putDouble(addr, value); + } + + public static void dput(MappedObject mapped, double value, int fieldOffset) { + INSTANCE.putDouble(mapped.viewAddress + fieldOffset, value); + } + + public static double dget(long addr) { + return INSTANCE.getDouble(addr); + } + + public static double dget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getDouble(mapped.viewAddress + fieldOffset); + } + + public static void dvput(double value, long addr) { + INSTANCE.putDoubleVolatile(null, addr, value); + } + + public static void dvput(MappedObject mapped, double value, int fieldOffset) { + INSTANCE.putDoubleVolatile(null, mapped.viewAddress + fieldOffset, value); + } + + public static double dvget(long addr) { + return INSTANCE.getDoubleVolatile(null, addr); + } + + public static double dvget(MappedObject mapped, int fieldOffset) { + return INSTANCE.getDoubleVolatile(null, mapped.viewAddress + fieldOffset); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObject.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObject.java new file mode 100644 index 0000000..2d5a17c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObject.java @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; + +import java.nio.BufferOverflowException; +import java.nio.ByteBuffer; + +/** + * Base superclass of all mapped objects. Classes that require + * data mapping should extend this class and registered with + * {@link MappedObjectTransformer#register(Class)}. + * <p/> + * Subclasses may only specify the default constructor. Any code + * inside that constructor is optional, but will not run when the + * view is instantiated, see {@link #runViewConstructor()}. + * <p/> + * Bounds checking may be enabled through a JVM system property: org.lwjgl.util.mapped.Checks=true + * + * @author Riven + */ +public abstract class MappedObject { + + static final boolean CHECKS = LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.Checks"); + + protected MappedObject() { + // + } + + /** The mapped object base memory address, in bytes. Read-only. */ + public long baseAddress; + + /** The mapped object view memory address, in bytes. Read-only. */ + public long viewAddress; + + /** The mapped buffer. */ + ByteBuffer preventGC; + + /** + * Holds the value of sizeof of the sub-type of this MappedObject<br> + * <br> + * The behavior of this (transformed) method does not follow the normal Java behavior.<br> + * <code>Vec2.SIZEOF</code> will yield 8 (2 floats)<br> + * <code>Vec3.SIZEOF</code> will yield 12 (3 floats)<br> + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").<br> + * Using Java 5.0's static-import on this method will break functionality. + */ + public static int SIZEOF = -1; // any method that calls these field will have its call-site modified ('final' per subtype) + + /** + * The mapped object view offset, in elements. Read/write. + * This is a virtual field, used as a convenient getter/setter for {@see viewAddress}. + */ + public int view; + + protected final long getViewAddress(final int view) { + // No call-site modification for this, we override in every subclass instead, + // so that we can use it in MappedForeach. + throw new InternalError("type not registered"); + } + + public final void setViewAddress(final long address) { + if ( CHECKS ) + checkAddress(address); + this.viewAddress = address; + } + + final void checkAddress(final long address) { + final long base = MemoryUtil.getAddress0(preventGC); + final int offset = (int)(address - base); + if ( address < base || preventGC.capacity() < (offset + getSizeof()) ) + throw new IndexOutOfBoundsException(Integer.toString(offset / getSizeof())); + } + + final void checkRange(final int bytes) { + if ( bytes < 0 ) + throw new IllegalArgumentException(); + + if ( preventGC.capacity() < (viewAddress - MemoryUtil.getAddress0(preventGC) + bytes) ) + throw new BufferOverflowException(); + } + + /** The mapped object memory alignment, in bytes. Read-only. */ + /** + * Returns the mapped object memory alignment, in bytes. + * + * @return the memory alignment + */ + public final int getAlign() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Returns the mapped object memory sizeof, in bytes. + * + * @return the sizeof value + */ + public final int getSizeof() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Returns the number of mapped objects that fit in the mapped buffer. + * + * @return the mapped object capacity + */ + public final int capacity() { + // No call-site modification for this, we override in every subclass instead. + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region of the specified direct ByteBuffer. + * <p/> + * The behavior of this (transformed) method does not follow the normal Java behavior.<br> + * <code>Vec2.map(buffer)</code> will return a mapped Vec2 instance.<br> + * <code>Vec3.map(buffer)</code> will return a mapped Vec3 instance.<br> + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").<br> + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static <T extends MappedObject> T map(ByteBuffer bb) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region specified. This is useful for mapping + * arbitrary regions in memory, e.g. OpenCL CLMem objects, without creating a ByteBuffer first. + * <p/> + * The behavior of this (transformed) method does not follow the normal Java behavior.<br> + * <code>Vec2.map(buffer)</code> will return a mapped Vec2 instance.<br> + * <code>Vec3.map(buffer)</code> will return a mapped Vec3 instance.<br> + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").<br> + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static <T extends MappedObject> T map(long address, int capacity) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a MappedObject instance, mapping the memory region of an allocated direct ByteBuffer with a capacity of <code>elementCount*SIZEOF</code> + * <p/> + * The behavior of this (transformed) method does not follow the normal Java behavior.<br> + * <code>Vec2.malloc(int)</code> will return a mapped Vec2 instance.<br> + * <code>Vec3.malloc(int)</code> will return a mapped Vec3 instance.<br> + * This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").<br> + * Using Java 5.0's static-import on this method will break functionality. + */ + @SuppressWarnings("unused") + public static <T extends MappedObject> T malloc(int elementCount) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates an identical new MappedObject instance, comparable to the + * contract of {@link java.nio.ByteBuffer#duplicate}. This is useful when more than one + * views of the mapped object are required at the same time, e.g. in + * multithreaded access. + */ + public final <T extends MappedObject> T dup() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates a new MappedObject instance, with a base offset equal to + * the offset of the current view, comparable to the contract of {@link java.nio.ByteBuffer#slice}. + */ + public final <T extends MappedObject> T slice() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Any code in the default constructor will not run automatically. This method + * can be used to execute that code on the current view. + */ + public final void runViewConstructor() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** Moves the current view to the next element. */ + public final void next() { + // No call-site modification for this, we override in every subclass instead, + // so that we can use it in MappedSetX. + throw new InternalError("type not registered"); + } + + /** + * Copies and amount of <code>SIZEOF - padding</code> bytes, from the current + * mapped object, to the specified mapped object. + */ + @SuppressWarnings("unused") + public final <T extends MappedObject> void copyTo(T target) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Copies and amount of <code>SIZEOF * instances</code> bytes, from the + * current mapped object, to the specified mapped object. Note that + * this includes any padding bytes that are part of SIZEOF. + */ + @SuppressWarnings("unused") + public final <T extends MappedObject> void copyRange(T target, int instances) { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Creates an {@link Iterable} <MappedObject> that will step through + * <code>capacity()</code> views, leaving the <code>view</code> at + * the last valid value.<br> + * <p/> + * For convenience you are encouraged to static-import this specific method: + * <code>import static org.lwjgl.util.mapped.MappedObject.foreach;</code> + */ + public static <T extends MappedObject> Iterable<T> foreach(T mapped) { + return foreach(mapped, mapped.capacity()); + } + + /** + * Creates an {@link Iterable} <MappedObject> that will step through + * <code>elementCount</code> views, leaving the <code>view</code> at + * the last valid value.<br> + * <p/> + * For convenience you are encouraged to static-import this specific method: + * <code>import static org.lwjgl.util.mapped.MappedObject.foreach;</code> + */ + public static <T extends MappedObject> Iterable<T> foreach(T mapped, int elementCount) { + return new MappedForeach<T>(mapped, elementCount); + } + + @SuppressWarnings("unused") + public final <T extends MappedObject> T[] asArray() { + // any method that calls this method will have its call-site modified + throw new InternalError("type not registered"); + } + + /** + * Returns the {@link java.nio.ByteBuffer} that backs this mapped object. + * + * @return the backing buffer + */ + public final ByteBuffer backingByteBuffer() { + return this.preventGC; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java new file mode 100644 index 0000000..89aa7ec --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectClassLoader.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import org.lwjgl.LWJGLUtil; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URLClassLoader; + +/** + * This classloader is responsible for applying the bytecode transformation to mapped objects. + * The transformation can either be applied using a Java agent, or with the convenient {@link #fork} method. + * + * @author Riven + */ +public class MappedObjectClassLoader extends URLClassLoader { + + static final String MAPPEDOBJECT_PACKAGE_PREFIX = MappedObjectClassLoader.class.getPackage().getName() + "."; + + static boolean FORKED; + + /** + * Forks the specified class containing a main method, passing the specified arguments. See + * {@link org.lwjgl.test.mapped.TestMappedObject} for example usage. + * + * @param mainClass the class containing the main method + * @param args the arguments to pass + * + * @return true if the fork was successful. + */ + public static boolean fork(Class<?> mainClass, String[] args) { + if ( FORKED ) { + return false; + } + + FORKED = true; + + try { + MappedObjectClassLoader loader = new MappedObjectClassLoader(mainClass); + loader.loadMappedObject(); + + Class<?> replacedMainClass = loader.loadClass(mainClass.getName()); + Method mainMethod = replacedMainClass.getMethod("main", String[].class); + mainMethod.invoke(null, new Object[] { args }); + } catch (InvocationTargetException exc) { + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), exc.getCause()); + } catch (Throwable cause) { + throw new Error("failed to fork", cause); + } + + return true; + } + + private MappedObjectClassLoader(Class<?> mainClass) { + super(((URLClassLoader)mainClass.getClassLoader()).getURLs()); + } + + protected synchronized Class<?> loadMappedObject() throws ClassNotFoundException { + final String name = MappedObject.class.getName(); + String className = name.replace('.', '/'); + + byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class"))); + + long t0 = System.nanoTime(); + bytecode = MappedObjectTransformer.transformMappedObject(bytecode); + long t1 = System.nanoTime(); + total_time_transforming += (t1 - t0); + + if ( MappedObjectTransformer.PRINT_ACTIVITY ) + printActivity(className, t0, t1); + + Class<?> clazz = super.defineClass(name, bytecode, 0, bytecode.length); + resolveClass(clazz); + return clazz; + } + + private static long total_time_transforming; + + @Override + protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { + if ( name.startsWith("java.") + || name.startsWith("javax.") + || name.startsWith("sun.") + || name.startsWith("sunw.") + || name.startsWith("org.objectweb.asm.") + ) + return super.loadClass(name, resolve); + + final String className = name.replace('.', '/'); + final boolean inThisPackage = name.startsWith(MAPPEDOBJECT_PACKAGE_PREFIX); + + if ( inThisPackage && ( + name.equals(MappedObjectClassLoader.class.getName()) + || name.equals((MappedObjectTransformer.class.getName())) + || name.equals((CacheUtil.class.getName())) + ) ) + return super.loadClass(name, resolve); + + byte[] bytecode = readStream(this.getResourceAsStream(className.concat(".class"))); + + // Classes in this package do not get transformed, but need to go through here because we have transformed MappedObject. + if ( !(inThisPackage && name.substring(MAPPEDOBJECT_PACKAGE_PREFIX.length()).indexOf('.') == -1) ) { + long t0 = System.nanoTime(); + final byte[] newBytecode = MappedObjectTransformer.transformMappedAPI(className, bytecode); + long t1 = System.nanoTime(); + + total_time_transforming += (t1 - t0); + + if ( bytecode != newBytecode ) { + bytecode = newBytecode; + if ( MappedObjectTransformer.PRINT_ACTIVITY ) + printActivity(className, t0, t1); + } + } + + Class<?> clazz = super.defineClass(name, bytecode, 0, bytecode.length); + if ( resolve ) + resolveClass(clazz); + return clazz; + } + + private static void printActivity(final String className, final long t0, final long t1) { + final StringBuilder msg = new StringBuilder(MappedObjectClassLoader.class.getSimpleName() + ": " + className); + + if ( MappedObjectTransformer.PRINT_TIMING ) + msg.append("\n\ttransforming took " + (t1 - t0) / 1000 + " micros (total: " + (total_time_transforming / 1000 / 1000) + "ms)"); + + LWJGLUtil.log(msg); + } + + private static byte[] readStream(InputStream in) { + byte[] bytecode = new byte[256]; + int len = 0; + try { + while ( true ) { + if ( bytecode.length == len ) + bytecode = copyOf(bytecode, len * 2); + int got = in.read(bytecode, len, bytecode.length - len); + if ( got == -1 ) + break; + len += got; + } + } catch (IOException exc) { + // stop! + } finally { + try { + in.close(); + } catch (IOException exc) { + // ignore... + } + } + return copyOf(bytecode, len); + } + + private static byte[] copyOf(byte[] original, int newLength) { + byte[] copy = new byte[newLength]; + System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); + return copy; + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java new file mode 100644 index 0000000..cf2aac8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java @@ -0,0 +1,1319 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLUtil; +import org.lwjgl.MemoryUtil; +import org.objectweb.asm.*; +import org.objectweb.asm.tree.*; +import org.objectweb.asm.tree.analysis.*; +import org.objectweb.asm.tree.analysis.Frame; +import org.objectweb.asm.util.TraceClassVisitor; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import static org.objectweb.asm.ClassWriter.*; +import static org.objectweb.asm.Opcodes.*; + +/** + * This class implements the bytecode transformation that mapped object go through. + * Mapped object classes need to first be registered with the transformer, see {@link #register(Class)}. + * <p/> + * The transformer supports some debugging tools, enabled through JVM system properties:<br/> + * org.lwjgl.util.mapped.PrintTiming=true, prints timing information for the transformation step.<br/> + * org.lwjgl.util.mapped.PrintActivity=true, prints activity information.<br/> + * org.lwjgl.util.mapped.PrintBytecode=true, prints the transformed bytecode.<br/> + * org.lwjgl.util.Debug must also be set to true for the above to work. + * + * @author Riven + */ +public class MappedObjectTransformer { + + static final boolean PRINT_ACTIVITY = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintActivity"); + static final boolean PRINT_TIMING = PRINT_ACTIVITY && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintTiming"); + static final boolean PRINT_BYTECODE = LWJGLUtil.DEBUG && LWJGLUtil.getPrivilegedBoolean("org.lwjgl.util.mapped.PrintBytecode"); + + static final Map<String, MappedSubtypeInfo> className_to_subtype; + + static final String MAPPED_OBJECT_JVM = jvmClassName(MappedObject.class); + static final String MAPPED_HELPER_JVM = jvmClassName(MappedHelper.class); + + static final String MAPPEDSET_PREFIX = jvmClassName(MappedSet.class); + static final String MAPPED_SET2_JVM = jvmClassName(MappedSet2.class); + static final String MAPPED_SET3_JVM = jvmClassName(MappedSet3.class); + static final String MAPPED_SET4_JVM = jvmClassName(MappedSet4.class); + + static final String CACHE_LINE_PAD_JVM = "L" + jvmClassName(CacheLinePad.class) + ";"; + + // Public methods + static final String VIEWADDRESS_METHOD_NAME = "getViewAddress"; + static final String NEXT_METHOD_NAME = "next"; + static final String ALIGN_METHOD_NAME = "getAlign"; + static final String SIZEOF_METHOD_NAME = "getSizeof"; + static final String CAPACITY_METHOD_NAME = "capacity"; // Used for .asArray().length + + // Internal methods + static final String VIEW_CONSTRUCTOR_NAME = "constructView$LWJGL"; // Used by runViewConstructor + + static final Map<Integer, String> OPCODE_TO_NAME = new HashMap<Integer, String>(); + static final Map<Integer, String> INSNTYPE_TO_NAME = new HashMap<Integer, String>(); + + static boolean is_currently_computing_frames; + + static { + getClassEnums(Opcodes.class, OPCODE_TO_NAME, "V1_", "ACC_", "T_", "F_", "MH_"); + getClassEnums(AbstractInsnNode.class, INSNTYPE_TO_NAME); + + className_to_subtype = new HashMap<String, MappedSubtypeInfo>(); + + { + // HACK: required for mapped.view++ + // + // because the compiler generates: + // => GETFIELD MappedObject.view + // => ICONST_1 + // => IADD + // => PUTFIELD MyMappedType.view + // + // instead of: + // => GETFIELD MyMappedType.view + // => ICONST_1 + // => IADD + // => PUTFIELD MyMappedType.view + // + className_to_subtype.put(MAPPED_OBJECT_JVM, new MappedSubtypeInfo(MAPPED_OBJECT_JVM, null, -1, -1, -1, false)); + } + + final String vmName = System.getProperty("java.vm.name"); + if ( vmName != null && !vmName.contains("Server") ) { + System.err.println("Warning: " + MappedObject.class.getSimpleName() + "s have inferiour performance on Client VMs, please consider switching to a Server VM."); + } + } + + /** + * Registers a class as a mapped object. + * The class must extend {@link org.lwjgl.util.mapped.MappedObject} and be annotated with {@link org.lwjgl.util.mapped.MappedField}. + * + * @param type the mapped object class. + */ + public static void register(Class<? extends MappedObject> type) { + if ( MappedObjectClassLoader.FORKED ) + return; + + final MappedType mapped = type.getAnnotation(MappedType.class); + + if ( mapped != null && mapped.padding() < 0 ) + throw new ClassFormatError("Invalid mapped type padding: " + mapped.padding()); + + if ( type.getEnclosingClass() != null && !Modifier.isStatic(type.getModifiers()) ) + throw new InternalError("only top-level or static inner classes are allowed"); + + final String className = jvmClassName(type); + final Map<String, FieldInfo> fields = new HashMap<String, FieldInfo>(); + + long sizeof = 0; + for ( Field field : type.getDeclaredFields() ) { + FieldInfo fieldInfo = registerField(mapped == null || mapped.autoGenerateOffsets(), className, sizeof, field); + if ( fieldInfo == null ) + continue; + + fields.put(field.getName(), fieldInfo); + + sizeof = Math.max(sizeof, fieldInfo.offset + fieldInfo.lengthPadded); + } + + int align = 4; + int padding = 0; + boolean cacheLinePadded = false; + + if ( mapped != null ) { + align = mapped.align(); + if ( mapped.cacheLinePadding() ) { + if ( mapped.padding() != 0 ) + throw new ClassFormatError("Mapped type padding cannot be specified together with cacheLinePadding."); + + final int cacheLineMod = (int)(sizeof % CacheUtil.getCacheLineSize()); + if ( cacheLineMod != 0 ) + padding = CacheUtil.getCacheLineSize() - cacheLineMod; + + cacheLinePadded = true; + } else + padding = mapped.padding(); + } + + sizeof += padding; + + final MappedSubtypeInfo mappedType = new MappedSubtypeInfo(className, fields, (int)sizeof, align, padding, cacheLinePadded); + if ( className_to_subtype.put(className, mappedType) != null ) + throw new InternalError("duplicate mapped type: " + mappedType.className); + } + + private static FieldInfo registerField(final boolean autoGenerateOffsets, final String className, long advancingOffset, final Field field) { + if ( Modifier.isStatic(field.getModifiers()) ) // static fields are never mapped + return null; + + // we only support primitives and ByteBuffers + if ( !field.getType().isPrimitive() && field.getType() != ByteBuffer.class ) + throw new ClassFormatError("field '" + className + "." + field.getName() + "' not supported: " + field.getType()); + + MappedField meta = field.getAnnotation(MappedField.class); + if ( meta == null && !autoGenerateOffsets ) + throw new ClassFormatError("field '" + className + "." + field.getName() + "' missing annotation " + MappedField.class.getName() + ": " + className); + + Pointer pointer = field.getAnnotation(Pointer.class); + if ( pointer != null && field.getType() != long.class ) + throw new ClassFormatError("The @Pointer annotation can only be used on long fields. @Pointer field found: " + className + "." + field.getName() + ": " + field.getType()); + + if ( Modifier.isVolatile(field.getModifiers()) && (pointer != null || field.getType() == ByteBuffer.class) ) + throw new ClassFormatError("The volatile keyword is not supported for @Pointer or ByteBuffer fields. Volatile field found: " + className + "." + field.getName() + ": " + field.getType()); + + // quick hack + long byteLength; + if ( field.getType() == long.class || field.getType() == double.class ) { + if ( pointer == null ) + byteLength = 8; + else + byteLength = MappedObjectUnsafe.INSTANCE.addressSize(); + } else if ( field.getType() == double.class ) + byteLength = 8; + else if ( field.getType() == int.class || field.getType() == float.class ) + byteLength = 4; + else if ( field.getType() == char.class || field.getType() == short.class ) + byteLength = 2; + else if ( field.getType() == byte.class ) + byteLength = 1; + else if ( field.getType() == ByteBuffer.class ) { + byteLength = meta.byteLength(); + if ( byteLength < 0 ) + throw new IllegalStateException("invalid byte length for mapped ByteBuffer field: " + className + "." + field.getName() + " [length=" + byteLength + "]"); + } else + throw new ClassFormatError(field.getType().getName()); + + if ( field.getType() != ByteBuffer.class && (advancingOffset % byteLength) != 0 ) + throw new IllegalStateException("misaligned mapped type: " + className + "." + field.getName()); + + CacheLinePad pad = field.getAnnotation(CacheLinePad.class); + + long byteOffset = advancingOffset; + if ( meta != null && meta.byteOffset() != -1 ) { + if ( meta.byteOffset() < 0 ) + throw new ClassFormatError("Invalid field byte offset: " + className + "." + field.getName() + " [byteOffset=" + meta.byteOffset() + "]"); + if ( pad != null ) + throw new ClassFormatError("A field byte offset cannot be specified together with cache-line padding: " + className + "." + field.getName()); + + byteOffset = meta.byteOffset(); + } + + long byteLengthPadded = byteLength; + if ( pad != null ) { + // Pad before + if ( pad.before() && byteOffset % CacheUtil.getCacheLineSize() != 0 ) + byteOffset += CacheUtil.getCacheLineSize() - (byteOffset & (CacheUtil.getCacheLineSize() - 1)); + + // Pad after + if ( pad.after() && (byteOffset + byteLength) % CacheUtil.getCacheLineSize() != 0 ) + byteLengthPadded += CacheUtil.getCacheLineSize() - (byteOffset + byteLength) % CacheUtil.getCacheLineSize(); + + assert !pad.before() || (byteOffset % CacheUtil.getCacheLineSize() == 0); + assert !pad.after() || ((byteOffset + byteLengthPadded) % CacheUtil.getCacheLineSize() == 0); + } + + if ( PRINT_ACTIVITY ) + LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": " + className + "." + field.getName() + " [type=" + field.getType().getSimpleName() + ", offset=" + byteOffset + "]"); + + return new FieldInfo(byteOffset, byteLength, byteLengthPadded, Type.getType(field.getType()), Modifier.isVolatile(field.getModifiers()), pointer != null); + } + + /** Removes final from methods that will be overriden by subclasses. */ + static byte[] transformMappedObject(byte[] bytecode) { + final ClassWriter cw = new ClassWriter(0); + + ClassVisitor cv = new ClassAdapter(cw) { + + private final String[] DEFINALIZE_LIST = { + VIEWADDRESS_METHOD_NAME, + NEXT_METHOD_NAME, + ALIGN_METHOD_NAME, + SIZEOF_METHOD_NAME, + CAPACITY_METHOD_NAME, + }; + + public MethodVisitor visitMethod(int access, final String name, final String desc, final String signature, final String[] exceptions) { + for ( String method : DEFINALIZE_LIST ) { + if ( name.equals(method) ) { + access &= ~ACC_FINAL; + break; + } + } + return super.visitMethod(access, name, desc, signature, exceptions); + } + }; + + new ClassReader(bytecode).accept(cv, 0); + return cw.toByteArray(); + } + + static byte[] transformMappedAPI(final String className, byte[] bytecode) { + final ClassWriter cw = new ClassWriter(COMPUTE_FRAMES) { + + @Override + protected String getCommonSuperClass(String a, String b) { + // HACK: prevent user-code static-initialization-blocks to be executed + if ( is_currently_computing_frames && !a.startsWith("java/") || !b.startsWith("java/") ) + return "java/lang/Object"; + + return super.getCommonSuperClass(a, b); + } + + }; + + final TransformationAdapter ta = new TransformationAdapter(cw, className); + + ClassVisitor cv = ta; + if ( className_to_subtype.containsKey(className) ) // Do a first pass to generate address getters + cv = getMethodGenAdapter(className, cv); + + new ClassReader(bytecode).accept(cv, ClassReader.SKIP_FRAMES); + + if ( !ta.transformed ) + return bytecode; + + bytecode = cw.toByteArray(); + if ( PRINT_BYTECODE ) + printBytecode(bytecode); + + return bytecode; + } + + private static ClassAdapter getMethodGenAdapter(final String className, final ClassVisitor cv) { + return new ClassAdapter(cv) { + + @Override + public void visitEnd() { + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + + generateViewAddressGetter(); + generateCapacity(); + generateAlignGetter(mappedSubtype); + generateSizeofGetter(); + generateNext(); + + for ( String fieldName : mappedSubtype.fields.keySet() ) { + final FieldInfo field = mappedSubtype.fields.get(fieldName); + + if ( field.type.getDescriptor().length() > 1 ) { // ByteBuffer, getter only + generateByteBufferGetter(fieldName, field); + } else { + generateFieldGetter(fieldName, field); + generateFieldSetter(fieldName, field); + } + } + + super.visitEnd(); + } + + private void generateViewAddressGetter() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, VIEWADDRESS_METHOD_NAME, "(I)J", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J"); + mv.visitVarInsn(ILOAD, 1); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IMUL); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + if ( MappedObject.CHECKS ) { + mv.visitInsn(DUP2); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "checkAddress", "(JL" + MAPPED_OBJECT_JVM + ";)V"); + } + mv.visitInsn(LRETURN); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateCapacity() { + // return (backingByteBuffer().capacity() + (int)(MemoryUtil.getAddress0(backingByteBuffer()) - baseAddress)) / SIZEOF; + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, CAPACITY_METHOD_NAME, "()I", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKEVIRTUAL, MAPPED_OBJECT_JVM, "backingByteBuffer", "()L" + jvmClassName(ByteBuffer.class) + ";"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKEVIRTUAL, jvmClassName(ByteBuffer.class), "capacity", "()I"); + mv.visitInsn(SWAP); + mv.visitMethodInsn(INVOKESTATIC, jvmClassName(MemoryUtil.class), "getAddress0", "(L" + jvmClassName(Buffer.class) + ";)J"); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "baseAddress", "J"); + mv.visitInsn(LSUB); + mv.visitInsn(L2I); + mv.visitInsn(IADD); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IDIV); + mv.visitInsn(IRETURN); + mv.visitMaxs(3, 1); + mv.visitEnd(); + } + + private void generateAlignGetter(final MappedSubtypeInfo mappedSubtype) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, ALIGN_METHOD_NAME, "()I", null, null); + mv.visitCode(); + visitIntNode(mv, mappedSubtype.sizeof); + mv.visitInsn(IRETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + + private void generateSizeofGetter() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, SIZEOF_METHOD_NAME, "()I", null, null); + mv.visitCode(); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(IRETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + + private void generateNext() { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC, NEXT_METHOD_NAME, "()V", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitInsn(DUP); + mv.visitFieldInsn(GETFIELD, MAPPED_OBJECT_JVM, "viewAddress", "J"); + mv.visitFieldInsn(GETSTATIC, className, "SIZEOF", "I"); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKEVIRTUAL, className, "setViewAddress", "(J)V"); + mv.visitInsn(RETURN); + mv.visitMaxs(3, 1); + mv.visitEnd(); + } + + private void generateByteBufferGetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + visitIntNode(mv, (int)field.length); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";"); + mv.visitInsn(ARETURN); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateFieldGetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, getterName(fieldName), "(L" + className + ";I)" + field.type.getDescriptor(), null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(J)" + field.type.getDescriptor()); + mv.visitInsn(field.type.getOpcode(IRETURN)); + mv.visitMaxs(3, 2); + mv.visitEnd(); + } + + private void generateFieldSetter(final String fieldName, final FieldInfo field) { + MethodVisitor mv = super.visitMethod(ACC_PUBLIC | ACC_STATIC, setterName(fieldName), "(L" + className + ";I" + field.type.getDescriptor() + ")V", null, null); + mv.visitCode(); + int load = 0; + switch ( field.type.getSort() ) { + case Type.BOOLEAN: + case Type.CHAR: + case Type.BYTE: + case Type.SHORT: + case Type.INT: + load = ILOAD; + break; + case Type.FLOAT: + load = FLOAD; + break; + case Type.LONG: + load = LLOAD; + break; + case Type.DOUBLE: + load = DLOAD; + break; + } + mv.visitVarInsn(load, 2); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ILOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, className, VIEWADDRESS_METHOD_NAME, "(I)J"); + visitIntNode(mv, (int)field.offset); + mv.visitInsn(I2L); + mv.visitInsn(LADD); + mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(" + field.type.getDescriptor() + "J)V"); + mv.visitInsn(RETURN); + mv.visitMaxs(4, 4); + mv.visitEnd(); + } + + }; + } + + private static class TransformationAdapter extends ClassAdapter { + + final String className; + + boolean transformed; + + TransformationAdapter(final ClassVisitor cv, final String className) { + super(cv); + this.className = className; + } + + @Override + public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) { + // remove redirected fields + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + if ( mappedSubtype != null && mappedSubtype.fields.containsKey(name) ) { + if ( PRINT_ACTIVITY ) + LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": discarding field: " + className + "." + name + ":" + desc); + return null; + } + + if ( (access & ACC_STATIC) == 0 ) { + return new FieldNode(access, name, desc, signature, value) { + public void visitEnd() { + if ( visibleAnnotations == null ) { // early-out + accept(cv); + return; + } + + boolean before = false; + boolean after = false; + int byteLength = 0; + for ( AnnotationNode pad : visibleAnnotations ) { + if ( CACHE_LINE_PAD_JVM.equals(pad.desc) ) { + if ( "J".equals(desc) || "D".equals(desc) ) + byteLength = 8; + else if ( "I".equals(desc) || "F".equals(desc) ) + byteLength = 4; + else if ( "S".equals(desc) || "C".equals(desc) ) + byteLength = 2; + else if ( "B".equals(desc) || "Z".equals(desc) ) + byteLength = 1; + else + throw new ClassFormatError("The @CacheLinePad annotation cannot be used on non-primitive fields: " + className + "." + name); + + transformed = true; + + after = true; + if ( pad.values != null ) { + for ( int i = 0; i < pad.values.size(); i += 2 ) { + final boolean value = pad.values.get(i + 1).equals(Boolean.TRUE); + if ( "before".equals(pad.values.get(i)) ) + before = value; + else + after = value; + } + } + break; + } + } + + /* + We make the fields public to force the JVM to keep the fields in the object. + Instead of using only longs or integers, we use the same type as the original + field. That's because modern JVMs usually reorder fields by type: + longs, then doubles, then integers, then booleans, etc. This way it's more + likely that the padding will work as expected. + */ + + if ( before ) { + final int count = CacheUtil.getCacheLineSize() / byteLength - 1; + for ( int i = count; i >= 1; i-- ) + cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD_" + i, desc, signature, null); + } + + accept(cv); + + if ( after ) { + final int count = CacheUtil.getCacheLineSize() / byteLength - 1; + for ( int i = 1; i <= count; i++ ) + cv.visitField(access | ACC_PUBLIC | ACC_SYNTHETIC, name + "$PAD" + i, desc, signature, null); + } + } + }; + } else + return super.visitField(access, name, desc, signature, value); + } + + @Override + public MethodVisitor visitMethod(final int access, String name, final String desc, final String signature, final String[] exceptions) { + // Move MappedSubtype constructors to another method + if ( "<init>".equals(name) ) { + final MappedSubtypeInfo mappedSubtype = className_to_subtype.get(className); + if ( mappedSubtype != null ) { + if ( !"()V".equals(desc) ) + throw new ClassFormatError(className + " can only have a default constructor, found: " + desc); + + final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, MAPPED_OBJECT_JVM, "<init>", "()V"); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + + // put the method body in another method + name = VIEW_CONSTRUCTOR_NAME; + } + } + + final MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); + return new MethodNode(access, name, desc, signature, exceptions) { + + /** When true, the method has touched a mapped object and needs to be transformed. We track this + * so we can skip the expensive frame analysis and tree API usage. */ + boolean needsTransformation; + + @Override + public void visitMaxs(int a, int b) { + try { + is_currently_computing_frames = true; + super.visitMaxs(a, b); + } finally { + is_currently_computing_frames = false; + } + } + + @Override + public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) { + if ( className_to_subtype.containsKey(owner) || owner.startsWith(MAPPEDSET_PREFIX) ) + needsTransformation = true; + + super.visitFieldInsn(opcode, owner, name, desc); + } + + @Override + public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) { + if ( className_to_subtype.containsKey(owner) ) + needsTransformation = true; + + super.visitMethodInsn(opcode, owner, name, desc); + } + + @Override + public void visitEnd() { + if ( needsTransformation ) { // Early-out for methods that do not touch a mapped object. + //System.err.println("\nTRANSFORMING: " + className + "." + name + desc); + transformed = true; + try { + transformMethod(analyse()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // Pass the instruction stream to the adapter's MethodVisitor + accept(mv); + } + + private Frame<BasicValue>[] analyse() throws AnalyzerException { + final Analyzer<BasicValue> a = new Analyzer<BasicValue>(new SimpleVerifier()); + a.analyze(className, this); + return a.getFrames(); + } + + private void transformMethod(final Frame<BasicValue>[] frames) { + final InsnList instructions = this.instructions; + + final Map<Integer, MappedSubtypeInfo> arrayVars = new HashMap<Integer, MappedSubtypeInfo>(); + + /* + We need this map because we insert/remove instructions from the stream and we need a way + to match each original instruction with the corresponding frame. + TODO: Can we keep track of everything more efficiently without a map? + */ + final Map<AbstractInsnNode, Frame<BasicValue>> frameMap = new HashMap<AbstractInsnNode, Frame<BasicValue>>(); + for ( int i = 0; i < frames.length; i++ ) + frameMap.put(instructions.get(i), frames[i]); + + for ( int i = 0; i < instructions.size(); i++ ) { // f is a separate cursor for frames + final AbstractInsnNode instruction = instructions.get(i); + + //System.out.println("MAIN LOOP #" + i + " - " + getOpcodeName(instruction)); + + switch ( instruction.getType() ) { + case AbstractInsnNode.VAR_INSN: + if ( instruction.getOpcode() == ALOAD ) { + VarInsnNode varInsn = (VarInsnNode)instruction; + final MappedSubtypeInfo mappedSubtype = arrayVars.get(varInsn.var); + if ( mappedSubtype != null ) + i = transformArrayAccess(instructions, i, frameMap, varInsn, mappedSubtype, varInsn.var); + } + break; + case AbstractInsnNode.FIELD_INSN: + FieldInsnNode fieldInsn = (FieldInsnNode)instruction; + + final InsnList list = transformFieldAccess(fieldInsn); + if ( list != null ) + i = replace(instructions, i, instruction, list); + + break; + case AbstractInsnNode.METHOD_INSN: + MethodInsnNode methodInsn = (MethodInsnNode)instruction; + final MappedSubtypeInfo mappedType = className_to_subtype.get(methodInsn.owner); + if ( mappedType != null ) + i = transformMethodCall(instructions, i, frameMap, methodInsn, mappedType, arrayVars); + break; + } + } + } + }; + } + } + + static int transformMethodCall(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame<BasicValue>> frameMap, final MethodInsnNode methodInsn, final MappedSubtypeInfo mappedType, final Map<Integer, MappedSubtypeInfo> arrayVars) { + switch ( methodInsn.getOpcode() ) { + case INVOKEVIRTUAL: + if ( "asArray".equals(methodInsn.name) && methodInsn.desc.equals("()[L" + MAPPED_OBJECT_JVM + ";") ) { + // Go forward and store the local variable index. + // We only allow this pattern: INVOKEVIRTUAL -> CHECKCAST -> ASTORE. + // We remove the first two and store the target MappedSubtype in the ASTORE variable + AbstractInsnNode nextInstruction; + checkInsnAfterIsArray(nextInstruction = methodInsn.getNext(), CHECKCAST); + checkInsnAfterIsArray(nextInstruction = nextInstruction.getNext(), ASTORE); + + final Frame<BasicValue> frame = frameMap.get(nextInstruction); + final String targetType = frame.getStack(frame.getStackSize() - 1).getType().getElementType().getInternalName(); + if ( !methodInsn.owner.equals(targetType) ) { + /* + This may happen with the current API, like so: + MappedA foo = MappedA.malloc(...); + MappedB[] cursor = foo.asArray(); + We have to parameterize MappedObject to avoid this. + */ + throw new ClassCastException("Source: " + methodInsn.owner + " - Target: " + targetType); + } + + final VarInsnNode varInstruction = (VarInsnNode)nextInstruction; + + arrayVars.put(varInstruction.var, mappedType); + + instructions.remove(methodInsn.getNext()); // Remove CHECKCAST + instructions.remove(methodInsn); // Remove INVOKEVIRTUAL + } + + if ( "dup".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) { + i = replace(instructions, i, methodInsn, generateDupInstructions(methodInsn)); + break; + } + + if ( "slice".equals(methodInsn.name) && methodInsn.desc.equals("()L" + MAPPED_OBJECT_JVM + ";") ) { + i = replace(instructions, i, methodInsn, generateSliceInstructions(methodInsn)); + break; + } + + if ( "runViewConstructor".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) { + i = replace(instructions, i, methodInsn, generateRunViewConstructorInstructions(methodInsn)); + break; + } + + if ( "copyTo".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";)V") ) { + i = replace(instructions, i, methodInsn, generateCopyToInstructions(mappedType)); + break; + } + + if ( "copyRange".equals(methodInsn.name) && methodInsn.desc.equals("(L" + MAPPED_OBJECT_JVM + ";I)V") ) { + i = replace(instructions, i, methodInsn, generateCopyRangeInstructions(mappedType)); + break; + } + + break; + case INVOKESPECIAL: + // super() in VIEW_CONSTRUCTOR_NAME, remove + if ( methodInsn.owner.equals(MAPPED_OBJECT_JVM) && "<init>".equals(methodInsn.name) && "()V".equals(methodInsn.desc) ) { + instructions.remove(methodInsn.getPrevious()); // ALOAD + instructions.remove(methodInsn); // INVOKESPECIAL + + i -= 2; + } + break; + case INVOKESTATIC: + boolean isMapDirectMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(JI)L" + MAPPED_OBJECT_JVM + ";"); + boolean isMapBufferMethod = "map".equals(methodInsn.name) && methodInsn.desc.equals("(Ljava/nio/ByteBuffer;)L" + MAPPED_OBJECT_JVM + ";"); + boolean isMallocMethod = "malloc".equals(methodInsn.name) && methodInsn.desc.equals("(I)L" + MAPPED_OBJECT_JVM + ";"); + + if ( (isMapDirectMethod || isMapBufferMethod) || isMallocMethod ) + i = replace(instructions, i, methodInsn, generateMapInstructions(mappedType, methodInsn.owner, isMapDirectMethod, isMallocMethod)); + break; + } + + return i; + } + + private static InsnList generateCopyRangeInstructions(final MappedSubtypeInfo mappedType) { + final InsnList list = new InsnList(); + + // stack: instances, target, this + list.add(getIntNode(mappedType.sizeof)); + // stack: sizeof, instances, target, this + list.add(new InsnNode(IMUL)); + // stack: bytes, target, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V")); + // stack: - + + return list; + } + + private static InsnList generateCopyToInstructions(final MappedSubtypeInfo mappedType) { + final InsnList list = new InsnList(); + + // stack: target, this + list.add(getIntNode(mappedType.sizeof - mappedType.padding)); + // stack: sizeof, target, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "copy", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";I)V")); + // stack: - + + return list; + } + + private static InsnList generateRunViewConstructorInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new InsnNode(DUP)); + // stack: this, this + list.add(new MethodInsnNode(INVOKEVIRTUAL, methodInsn.owner, VIEW_CONSTRUCTOR_NAME, "()V")); + // stack: this + + return list; + } + + private static InsnList generateSliceInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new TypeInsnNode(NEW, methodInsn.owner)); + // stack: new, this + list.add(new InsnNode(DUP)); + // stack: new, new, this + list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "<init>", "()V")); + // stack: new, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "slice", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";")); + // stack: new + + return list; + } + + private static InsnList generateDupInstructions(final MethodInsnNode methodInsn) { + final InsnList list = new InsnList(); + + // stack: this + list.add(new TypeInsnNode(NEW, methodInsn.owner)); + // stack: new, this + list.add(new InsnNode(DUP)); + // stack: new, new, this + list.add(new MethodInsnNode(INVOKESPECIAL, methodInsn.owner, "<init>", "()V")); + // stack: new, this + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "dup", "(L" + MAPPED_OBJECT_JVM + ";L" + MAPPED_OBJECT_JVM + ";)L" + MAPPED_OBJECT_JVM + ";")); + // stack: new + + return list; + } + + private static InsnList generateMapInstructions(final MappedSubtypeInfo mappedType, final String className, final boolean mapDirectMethod, final boolean mallocMethod) { + final InsnList trg = new InsnList(); + + if ( mallocMethod ) { + // stack: count + trg.add(getIntNode(mappedType.sizeof)); + // stack: sizeof, count + trg.add(new InsnNode(IMUL)); + // stack: bytes + trg.add(new MethodInsnNode(INVOKESTATIC, mappedType.cacheLinePadded ? jvmClassName(CacheUtil.class) : jvmClassName(BufferUtils.class), "createByteBuffer", "(I)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + } else if ( mapDirectMethod ) { + // stack: capacity, address + trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + } + + // stack: buffer + trg.add(new TypeInsnNode(NEW, className)); + // stack: new, buffer + trg.add(new InsnNode(DUP)); + // stack: new, new, buffer + trg.add(new MethodInsnNode(INVOKESPECIAL, className, "<init>", "()V")); + // stack: new, buffer + trg.add(new InsnNode(DUP_X1)); + // stack: new, buffer, new + trg.add(new InsnNode(SWAP)); + // stack: buffer, new, new + trg.add(getIntNode(mappedType.align)); + // stack: int, buffer, new, new + trg.add(getIntNode(mappedType.sizeof)); + // stack: int, int, buffer, new, new + trg.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "setup", "(L" + MAPPED_OBJECT_JVM + ";Ljava/nio/ByteBuffer;II)V")); + // stack: new + + return trg; + } + + static InsnList transformFieldAccess(final FieldInsnNode fieldInsn) { + final MappedSubtypeInfo mappedSubtype; + mappedSubtype = className_to_subtype.get(fieldInsn.owner); + if ( mappedSubtype == null ) { // early out + // MappedSet.view + outer: + if ( "view".equals(fieldInsn.name) && fieldInsn.owner.startsWith(MAPPEDSET_PREFIX) ) + return generateSetViewInstructions(fieldInsn); + + return null; // early out + } + + if ( "SIZEOF".equals(fieldInsn.name) ) + return generateSIZEOFInstructions(fieldInsn, mappedSubtype); + + if ( "view".equals(fieldInsn.name) ) + return generateViewInstructions(fieldInsn, mappedSubtype); + + if ( "baseAddress".equals(fieldInsn.name) || "viewAddress".equals(fieldInsn.name) ) { + return generateAddressInstructions(fieldInsn); + } + + final FieldInfo field = mappedSubtype.fields.get(fieldInsn.name); + if ( field == null ) // early out + return null; + + // now we're going to transform ByteBuffer-typed field access + if ( fieldInsn.desc.equals("L" + jvmClassName(ByteBuffer.class) + ";") ) + return generateByteBufferInstructions(fieldInsn, mappedSubtype, field.offset); + + // we're now going to transform the field access + return generateFieldInstructions(fieldInsn, field); + } + + private static InsnList generateSetViewInstructions(final FieldInsnNode fieldInsn) { + if ( fieldInsn.getOpcode() == GETFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + if ( fieldInsn.getOpcode() != PUTFIELD ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + // stack: index, this + if ( MAPPED_SET2_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET2_JVM + ";I)V")); + else if ( MAPPED_SET3_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET3_JVM + ";I)V")); + else if ( MAPPED_SET4_JVM.equals(fieldInsn.owner) ) + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_views", "(L" + MAPPED_SET4_JVM + ";I)V")); + else + throw new InternalError(); + // stack: - + + return list; + } + + private static InsnList generateSIZEOFInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) { + if ( !"I".equals(fieldInsn.desc) ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == GETSTATIC ) { + list.add(getIntNode(mappedSubtype.sizeof)); + return list; + } + + if ( fieldInsn.getOpcode() == PUTSTATIC ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + throw new InternalError(); + } + + private static InsnList generateViewInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype) { + if ( !"I".equals(fieldInsn.desc) ) + throw new InternalError(); + + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == GETFIELD ) { + if ( mappedSubtype.sizeof_shift != 0 ) { + // stack: instance + list.add(getIntNode(mappedSubtype.sizeof_shift)); + // stack: sizeof, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view_shift", "(L" + MAPPED_OBJECT_JVM + ";I)I")); + // stack: view + } else { + // stack: instance + list.add(getIntNode(mappedSubtype.sizeof)); + // stack: sizeof, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "get_view", "(L" + MAPPED_OBJECT_JVM + ";I)I")); + // stack: view + } + return list; + } + + if ( fieldInsn.getOpcode() == PUTFIELD ) { + if ( mappedSubtype.sizeof_shift != 0 ) { + // stack: view, instance + list.add(getIntNode(mappedSubtype.sizeof_shift)); + // stack: sizeof, view, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view_shift", "(L" + MAPPED_OBJECT_JVM + ";II)V")); + // stack: - + } else { + // stack: view, instance + list.add(getIntNode(mappedSubtype.sizeof)); + // stack: sizeof, view, instance + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "put_view", "(L" + MAPPED_OBJECT_JVM + ";II)V")); + // stack: - + } + return list; + } + + throw new InternalError(); + } + + private static InsnList generateAddressInstructions(final FieldInsnNode fieldInsn) { + if ( !"J".equals(fieldInsn.desc) ) + throw new IllegalStateException(); + + if ( fieldInsn.getOpcode() == GETFIELD ) // do not change a thing + return null; + + if ( fieldInsn.getOpcode() == PUTFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + throw new InternalError(); + } + + private static InsnList generateByteBufferInstructions(final FieldInsnNode fieldInsn, final MappedSubtypeInfo mappedSubtype, final long fieldOffset) { + if ( fieldInsn.getOpcode() == PUTFIELD ) + throwAccessErrorOnReadOnlyField(fieldInsn.owner, fieldInsn.name); + + if ( fieldInsn.getOpcode() == GETFIELD ) { + final InsnList list = new InsnList(); + + // stack: ref + list.add(new FieldInsnNode(GETFIELD, mappedSubtype.className, "viewAddress", "J")); + // stack: long + list.add(new LdcInsnNode(fieldOffset)); + // stack: long, long + list.add(new InsnNode(LADD)); + // stack: long + list.add(new LdcInsnNode(mappedSubtype.fields.get(fieldInsn.name).length)); + // stack: long, long + list.add(new InsnNode(L2I)); + // stack: int, long + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";")); + // stack: buffer + + return list; + } + + throw new InternalError(); + } + + private static InsnList generateFieldInstructions(final FieldInsnNode fieldInsn, final FieldInfo field) { + final InsnList list = new InsnList(); + + if ( fieldInsn.getOpcode() == PUTFIELD ) { + // stack: value, ref + list.add(getIntNode((int)field.offset)); + // stack: fieldOffset, value, ref + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(L" + MAPPED_OBJECT_JVM + ";" + fieldInsn.desc + "I)V")); + // stack - + return list; + } + + if ( fieldInsn.getOpcode() == GETFIELD ) { + // stack: ref + list.add(getIntNode((int)field.offset)); + // stack: fieldOffset, ref + list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(L" + MAPPED_OBJECT_JVM + ";I)" + fieldInsn.desc)); + // stack: - + return list; + } + + throw new InternalError(); + } + + static int transformArrayAccess(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame<BasicValue>> frameMap, final VarInsnNode loadInsn, final MappedSubtypeInfo mappedSubtype, final int var) { + // We need to go forward in time to find how we use the array var + final int loadStackSize = frameMap.get(loadInsn).getStackSize() + 1; + + AbstractInsnNode nextInsn = loadInsn; + + while ( true ) { + nextInsn = nextInsn.getNext(); + if ( nextInsn == null ) + throw new InternalError(); + + Frame<BasicValue> frame = frameMap.get(nextInsn); + if ( frame == null ) + continue; + + int stackSize = frame.getStackSize(); + + if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == AALOAD ) { + final AbstractInsnNode aaLoadInsn = nextInsn; + + while ( true ) { + nextInsn = nextInsn.getNext(); + if ( nextInsn == null ) + break; + + frame = frameMap.get(nextInsn); + if ( frame == null ) + continue; + stackSize = frame.getStackSize(); + + if ( stackSize == loadStackSize + 1 && nextInsn.getOpcode() == PUTFIELD ) { + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn; + + // stack: value, view, ref + instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, setterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I" + fieldInsn.desc + ")V")); + // stack: - + instructions.remove(nextInsn); + + break; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == GETFIELD ) { + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn; + + // stack: view, ref + instructions.insert(nextInsn, new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc)); + // stack: value + instructions.remove(nextInsn); + + break; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == DUP && nextInsn.getNext().getOpcode() == GETFIELD ) { + // May happen with operator+assignment (e.g. cursor[i].value += 10) + final FieldInsnNode fieldInsn = (FieldInsnNode)nextInsn.getNext(); + + final MethodInsnNode getter = new MethodInsnNode(INVOKESTATIC, mappedSubtype.className, getterName(fieldInsn.name), "(L" + mappedSubtype.className + ";I)" + fieldInsn.desc); + + // stack: view, ref + instructions.insert(nextInsn, new InsnNode(DUP2)); + // stack: view, ref, view, ref + instructions.insert(nextInsn.getNext(), getter); + // stack: value, view, ref + + instructions.remove(nextInsn); + instructions.remove(fieldInsn); + + nextInsn = getter; + continue; + } else if ( stackSize < loadStackSize ) + throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn)); + } + + instructions.remove(aaLoadInsn); + + return i; + } else if ( stackSize == loadStackSize && nextInsn.getOpcode() == ARRAYLENGTH ) { + if ( LWJGLUtil.DEBUG && loadInsn.getNext() != nextInsn ) + throw new InternalError(); + + instructions.remove(nextInsn); + loadInsn.var = var; + instructions.insert(loadInsn, new MethodInsnNode(INVOKEVIRTUAL, mappedSubtype.className, CAPACITY_METHOD_NAME, "()I")); + + return i + 1; + } else if ( stackSize < loadStackSize ) // Consumed by something other than AALOAD or ARRAYLENGTH + throw new ClassFormatError("Invalid " + mappedSubtype.className + " view array usage detected: " + getOpcodeName(nextInsn)); + } + } + + private static class FieldInfo { + + final long offset; + final long length; + final long lengthPadded; + final Type type; + final boolean isVolatile; + final boolean isPointer; + + FieldInfo(final long offset, final long length, final long lengthPadded, final Type type, final boolean isVolatile, final boolean isPointer) { + this.offset = offset; + this.length = length; + this.lengthPadded = lengthPadded; + this.type = type; + this.isVolatile = isVolatile; + this.isPointer = isPointer; + } + + String getAccessType() { + return isPointer ? "a" : type.getDescriptor().toLowerCase() + (isVolatile ? "v" : ""); + } + + } + + private static class MappedSubtypeInfo { + + final String className; + + final int sizeof; + final int sizeof_shift; + final int align; + final int padding; + final boolean cacheLinePadded; + + final Map<String, FieldInfo> fields; + + MappedSubtypeInfo(String className, Map<String, FieldInfo> fields, int sizeof, int align, int padding, final boolean cacheLinePadded) { + this.className = className; + + this.sizeof = sizeof; + if ( ((sizeof - 1) & sizeof) == 0 ) + this.sizeof_shift = getPoT(sizeof); + else + this.sizeof_shift = 0; + this.align = align; + this.padding = padding; + this.cacheLinePadded = cacheLinePadded; + + this.fields = fields; + } + + private static int getPoT(int value) { + int pot = -1; + while ( value > 0 ) { + pot++; + value >>= 1; + } + return pot; + } + + } + + // ------------------------------------------------------- + // -------------------[ MACROS & UTILS ]------------------ + // ------------------------------------------------------- + + private static void getClassEnums(final Class clazz, final Map<Integer, String> map, final String... prefixFilters) { + try { + OUTER: + for ( Field field : clazz.getFields() ) { + if ( !Modifier.isStatic(field.getModifiers()) || field.getType() != int.class ) + continue; + + for ( String filter : prefixFilters ) { + if ( field.getName().startsWith(filter) ) + continue OUTER; + } + + if ( map.put((Integer)field.get(null), field.getName()) != null ) + throw new IllegalStateException(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + static String getOpcodeName(final AbstractInsnNode insn) { + final String op = OPCODE_TO_NAME.get(insn.getOpcode()); + return INSNTYPE_TO_NAME.get(insn.getType()) + ": " + insn.getOpcode() + (op == null ? "" : " [" + OPCODE_TO_NAME.get(insn.getOpcode()) + "]"); + } + + static String jvmClassName(Class<?> type) { + return type.getName().replace('.', '/'); + } + + static String getterName(final String fieldName) { + return "get$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL"; + } + + static String setterName(final String fieldName) { + return "set$" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1) + "$LWJGL"; + } + + private static void checkInsnAfterIsArray(final AbstractInsnNode instruction, final int opcode) { + if ( instruction == null ) + throw new ClassFormatError("Unexpected end of instructions after .asArray() method."); + + if ( instruction.getOpcode() != opcode ) + throw new ClassFormatError("The result of .asArray() must be stored to a local variable. Found: " + getOpcodeName(instruction)); + } + + static AbstractInsnNode getIntNode(final int value) { + if ( value <= 5 && -1 <= value ) + return new InsnNode(ICONST_M1 + value + 1); + + if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE ) + return new IntInsnNode(BIPUSH, value); + + if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE ) + return new IntInsnNode(SIPUSH, value); + + return new LdcInsnNode(value); + } + + static void visitIntNode(final MethodVisitor mv, final int value) { + if ( value <= 5 && -1 <= value ) + mv.visitInsn(ICONST_M1 + value + 1); + else if ( value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE ) + mv.visitIntInsn(BIPUSH, value); + else if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE ) + mv.visitIntInsn(SIPUSH, value); + else + mv.visitLdcInsn(value); + } + + /** Replace an instruction with a list of instructions. */ + static int replace(final InsnList instructions, final int i, final AbstractInsnNode location, final InsnList list) { + final int size = list.size(); + + instructions.insert(location, list); + instructions.remove(location); + + return i + (size - 1); + } + + private static void throwAccessErrorOnReadOnlyField(String className, String fieldName) { + throw new IllegalAccessError("The " + className + "." + fieldName + " field is final."); + } + + private static void printBytecode(byte[] bytecode) { + StringWriter sw = new StringWriter(); + ClassVisitor tracer = new TraceClassVisitor(new ClassWriter(0), new PrintWriter(sw)); + new ClassReader(bytecode).accept(tracer, 0); + String dump = sw.toString(); + + LWJGLUtil.log(dump); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java new file mode 100644 index 0000000..2f25f48 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedObjectUnsafe.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import sun.misc.Unsafe; + +/** + * [INTERNAL USE ONLY] + * + * @author Riven + */ +final class MappedObjectUnsafe { + + static final Unsafe INSTANCE = getUnsafeInstance(); + + private static final long BUFFER_ADDRESS_OFFSET = getObjectFieldOffset(ByteBuffer.class, "address"); + private static final long BUFFER_CAPACITY_OFFSET = getObjectFieldOffset(ByteBuffer.class, "capacity"); + + private static final ByteBuffer global = ByteBuffer.allocateDirect(4 * 1024); + + static ByteBuffer newBuffer(long address, int capacity) { + if ( address <= 0L || capacity < 0 ) + throw new IllegalStateException("you almost crashed the jvm"); + + ByteBuffer buffer = global.duplicate().order(ByteOrder.nativeOrder()); + INSTANCE.putLong(buffer, BUFFER_ADDRESS_OFFSET, address); + INSTANCE.putInt(buffer, BUFFER_CAPACITY_OFFSET, capacity); + buffer.position(0); + buffer.limit(capacity); + return buffer; + } + + private static long getObjectFieldOffset(Class<?> type, String fieldName) { + while ( type != null ) { + try { + return INSTANCE.objectFieldOffset(type.getDeclaredField(fieldName)); + } catch (Throwable t) { + type = type.getSuperclass(); + } + } + + throw new UnsupportedOperationException(); + } + + private static Unsafe getUnsafeInstance() { + final Field[] fields = Unsafe.class.getDeclaredFields(); + + /* + Different runtimes use different names for the Unsafe singleton, + so we cannot use .getDeclaredField and we scan instead. For example: + + Oracle: theUnsafe + PERC : m_unsafe_instance + Android: THE_ONE + */ + for ( Field field : fields ) { + if ( !field.getType().equals(Unsafe.class) ) + continue; + + final int modifiers = field.getModifiers(); + if ( !(Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) ) + continue; + + field.setAccessible(true); + try { + return (Unsafe)field.get(null); + } catch (IllegalAccessException e) { + // ignore + } + break; + } + + throw new UnsupportedOperationException(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet.java new file mode 100644 index 0000000..925ac15 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +/** + * Factory for mapped sets. A mapped set can be used as a Structure of Arrays by + * linking together the view of two or more mapped objects. Changing the view + * of the mapped set, changes the corresponding view of all the mapped objects in + * the set. + */ +public class MappedSet { + + /** + * Creates a <code>MappedSet</code> by linking the specified <code>MappedObject</code>s. + * + * @return the mapped set. + */ + public static MappedSet2 create(MappedObject a, MappedObject b) { + return new MappedSet2(a, b); + } + + /** + * Creates a <code>MappedSet</code> by linking the specified <code>MappedObject</code>s. + * + * @return the mapped set. + */ + public static MappedSet3 create(MappedObject a, MappedObject b, MappedObject c) { + return new MappedSet3(a, b, c); + } + + /** + * Creates a <code>MappedSet</code> by linking the specified <code>MappedObject</code>s. + * + * @return the mapped set. + */ + public static MappedSet4 create(MappedObject a, MappedObject b, MappedObject c, MappedObject d) { + return new MappedSet4(a, b, c, d); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet2.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet2.java new file mode 100644 index 0000000..aedaaff --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet2.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +/** <code>MappedSet</code> implementation for two <code>MappedObject</code>s. */ +public class MappedSet2 { + + private final MappedObject a, b; + + MappedSet2(MappedObject a, MappedObject b) { + this.a = a; + this.b = b; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet3.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet3.java new file mode 100644 index 0000000..a2f3369 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet3.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +/** <code>MappedSet</code> implementation for three <code>MappedObject</code>s. */ +public class MappedSet3 { + + private final MappedObject a, b, c; + + MappedSet3(MappedObject a, MappedObject b, MappedObject c) { + this.a = a; + this.b = b; + this.c = c; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + c.setViewAddress(c.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + this.c.next(); + } + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet4.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet4.java new file mode 100644 index 0000000..749fc6a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedSet4.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +/** <code>MappedSet</code> implementation for four <code>MappedObject</code>s. */ +public class MappedSet4 { + + private final MappedObject a, b, c, d; + + MappedSet4(MappedObject a, MappedObject b, MappedObject c, MappedObject d) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + } + + public int view; + + void view(int view) { + a.setViewAddress(a.getViewAddress(view)); + b.setViewAddress(b.getViewAddress(view)); + c.setViewAddress(c.getViewAddress(view)); + d.setViewAddress(d.getViewAddress(view)); + } + + public void next() { + this.a.next(); + this.b.next(); + this.c.next(); + this.d.next(); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedType.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedType.java new file mode 100644 index 0000000..a059010 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/MappedType.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation marks a class as a mapped object, which will go under bytecode + * transformation at runtime. Mapped objects cannot be instantiated directly; a data + * buffer must be mapped first and the mapped object instance will then be used as a + * view on top of the buffer. Instead of a separate instance per "element" in the buffer, + * only a single instance is used to manage everything. See {@link MappedObject} + * for API details and {@link org.lwjgl.test.mapped.TestMappedObject} for examples. + * <p/> + * The instance fields of the annotated class should only be limited to primitive types or + * {@link java.nio.ByteBuffer}. Static fields are supported and they can have any type. + * <p/> + * The purpose of mapped objects is to reduce the memory requirements required for the type + * of data that are often used in OpenGL/OpenCL programming, while at the same time enabling + * clean Java code. There are also performance benefits related to not having to copy data + * between buffers and Java objects and the removal of bounds checking when accessing + * buffer data. + * + * @author Riven + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface MappedType { + + /** + * The number of bytes to add to the total byte size. + * SIZEOF will be calculated as <code>SIZEOF = max(field_offset + field_length) + padding</code>. + * <p/> + * Cannot be used with {@link #cacheLinePadding()}. + * + * @return the padding amount + */ + int padding() default 0; + + /** + * When true, SIZEOF will be increased (if necessary) so that it's a multiple of the CPU cache line size. + * Additionally, {@link MappedObject#malloc(int)} on the mapped object type will automatically use + * {@link CacheUtil#createByteBuffer(int)} instead of the unaligned {@link org.lwjgl.BufferUtils#createByteBuffer(int)}. + * <p/> + * Cannot be used with {@link #padding()}. + * + * @return if cache-line padding should be applied + * + * @see CacheUtil + */ + boolean cacheLinePadding() default false; + + /** + * The mapped data memory alignment, in bytes. + * + * @return the memory alignment + */ + int align() default 4; + + /** + * When autoGenerateOffsets is true, byte offsets of the mapped fields will + * be generated automatically. This is convenient for packed data. For manually + * aligned data, autoGenerateOffsets must be set to false and the user needs + * to manually specify byte offsets using the {@link MappedField} annotation. + * + * @return true if automatic byte offset generation is required. + */ + boolean autoGenerateOffsets() default true; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/Pointer.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/Pointer.java new file mode 100644 index 0000000..9b55b24 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/mapped/Pointer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.mapped; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * This annotation can be used on long fields of {@link MappedObject} subclasses, + * to specify that the long value should be interpreted as a pointer. This + * will determine the actual byte size of the field at runtime (4 or 8 bytes). + * + * @author Spasi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Pointer { + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix.java new file mode 100644 index 0000000..cb8f8fb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for matrices. When a matrix is constructed it will be the identity + * matrix unless otherwise stated. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public abstract class Matrix implements Serializable { + + /** + * Constructor for Matrix. + */ + protected Matrix() { + super(); + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public abstract Matrix setIdentity(); + + + /** + * Invert this matrix + * @return this + */ + public abstract Matrix invert(); + + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix load(FloatBuffer buf); + + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public abstract Matrix loadTranspose(FloatBuffer buf); + + + /** + * Negate this matrix + * @return this + */ + public abstract Matrix negate(); + + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix store(FloatBuffer buf); + + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + * @return this + */ + public abstract Matrix storeTranspose(FloatBuffer buf); + + + /** + * Transpose this matrix + * @return this + */ + public abstract Matrix transpose(); + + + /** + * Set this matrix to 0. + * @return this + */ + public abstract Matrix setZero(); + + + /** + * @return the determinant of the matrix + */ + public abstract float determinant(); + + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix2f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix2f.java new file mode 100644 index 0000000..aee8566 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix2f.java @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 2x2 matrix + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Matrix2f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, m01, m10, m11; + + /** + * Constructor for Matrix2f. The matrix is initialised to the identity. + */ + public Matrix2f() { + setIdentity(); + } + + /** + * Constructor + */ + public Matrix2f(Matrix2f src) { + load(src); + } + + /** + * Load from another matrix + * @param src The source matrix + * @return this + */ + public Matrix2f load(Matrix2f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new one should be created. + * @return The copied matrix + */ + public static Matrix2f load(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m10 = src.m10; + dest.m11 = src.m11; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (mathematical) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m10); + buf.put(m11); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m01); + buf.put(m11); + return this; + } + + + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f add(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f sub(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix2f mul(Matrix2f left, Matrix2f right, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01; + float m01 = left.m01 * right.m00 + left.m11 * right.m01; + float m10 = left.m00 * right.m10 + left.m10 * right.m11; + float m11 = left.m01 * right.m10 + left.m11 * right.m11; + + dest.m00 = m00; + dest.m01 = m01; + dest.m10 = m10; + dest.m11 = m11; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector2f transform(Matrix2f left, Vector2f right, Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + + float x = left.m00 * right.x + left.m10 * right.y; + float y = left.m01 * right.x + left.m11 * right.y; + + dest.x = x; + dest.y = y; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Transpose this matrix and place the result in another matrix. + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix2f transpose(Matrix2f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix. + * @param src The source matrix or null if a new matrix is to be created + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix2f transpose(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + float m01 = src.m10; + float m10 = src.m01; + + dest.m01 = m01; + dest.m10 = m10; + + return dest; + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and place the result in the destination matrix. + * @param src The source matrix to be inverted + * @param dest The destination matrix or null if a new matrix is to be created + * @return The inverted matrix, or null if source can't be reverted. + */ + public static Matrix2f invert(Matrix2f src, Matrix2f dest) { + /* + *inv(A) = 1/det(A) * adj(A); + */ + + float determinant = src.determinant(); + if (determinant != 0) { + if (dest == null) + dest = new Matrix2f(); + float determinant_inv = 1f/determinant; + float t00 = src.m11*determinant_inv; + float t01 = -src.m01*determinant_inv; + float t11 = src.m00*determinant_inv; + float t10 = -src.m10*determinant_inv; + + dest.m00 = t00; + dest.m01 = t01; + dest.m10 = t10; + dest.m11 = t11; + return dest; + } else + return null; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and stash the result in another matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix2f negate(Matrix2f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and stash the result in the destination matrix. + * @param src The source matrix to be negated + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix2f negate(Matrix2f src, Matrix2f dest) { + if (dest == null) + dest = new Matrix2f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the source matrix to be the identity matrix. + * @param src The matrix to set to the identity. + * @return The source matrix + */ + public static Matrix2f setIdentity(Matrix2f src) { + src.m00 = 1.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 1.0f; + return src; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + public static Matrix2f setZero(Matrix2f src) { + src.m00 = 0.0f; + src.m01 = 0.0f; + src.m10 = 0.0f; + src.m11 = 0.0f; + return src; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Matrix#determinant() + */ + public float determinant() { + return m00 * m11 - m01*m10; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix3f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix3f.java new file mode 100644 index 0000000..01c55dc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix3f.java @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Holds a 3x3 matrix. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Matrix3f extends Matrix implements Serializable { + + private static final long serialVersionUID = 1L; + + public float m00, + m01, + m02, + m10, + m11, + m12, + m20, + m21, + m22; + + /** + * Constructor for Matrix3f. Matrix is initialised to the identity. + */ + public Matrix3f() { + super(); + setIdentity(); + } + + /** + * Load from another matrix + * @param src The source matrix + * @return this + */ + public Matrix3f load(Matrix3f src) { + return load(src, this); + } + + /** + * Copy source matrix to destination matrix + * @param src The source matrix + * @param dest The destination matrix, or null of a new matrix is to be created + * @return The copied matrix + */ + public static Matrix3f load(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = src.m00; + dest.m10 = src.m10; + dest.m20 = src.m20; + dest.m01 = src.m01; + dest.m11 = src.m11; + dest.m21 = src.m21; + dest.m02 = src.m02; + dest.m12 = src.m12; + dest.m22 = src.m22; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (maths) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m02); + buf.put(m12); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f add(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f sub(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix3f mul(Matrix3f left, Matrix3f right, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + float m00 = + left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02; + float m01 = + left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02; + float m02 = + left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02; + float m10 = + left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12; + float m11 = + left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12; + float m12 = + left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12; + float m20 = + left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22; + float m21 = + left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22; + float m22 = + left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector3f transform(Matrix3f left, Vector3f right, Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z; + + dest.x = x; + dest.y = y; + dest.z = z; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this, this); + } + + /** + * Transpose this matrix and place the result in another matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix3f transpose(Matrix3f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result into the destination matrix + * @param src The source matrix to be transposed + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix3f transpose(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = + m00 * (m11 * m22 - m12 * m21) + + m01 * (m12 * m20 - m10 * m22) + + m02 * (m10 * m21 - m11 * m20); + return f; + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append('\n'); + return buf.toString(); + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result into the destination matrix + * @param src The source matrix to be inverted + * @param dest The destination matrix, or null if a new one is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix3f invert(Matrix3f src, Matrix3f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + if (dest == null) + dest = new Matrix3f(); + /* do it the ordinary way + * + * inv(A) = 1/det(A) * adj(T), where adj(T) = transpose(Conjugate Matrix) + * + * m00 m01 m02 + * m10 m11 m12 + * m20 m21 m22 + */ + float determinant_inv = 1f/determinant; + + // get the conjugate matrix + float t00 = src.m11 * src.m22 - src.m12* src.m21; + float t01 = - src.m10 * src.m22 + src.m12 * src.m20; + float t02 = src.m10 * src.m21 - src.m11 * src.m20; + float t10 = - src.m01 * src.m22 + src.m02 * src.m21; + float t11 = src.m00 * src.m22 - src.m02 * src.m20; + float t12 = - src.m00 * src.m21 + src.m01 * src.m20; + float t20 = src.m01 * src.m12 - src.m02 * src.m11; + float t21 = -src.m00 * src.m12 + src.m02 * src.m10; + float t22 = src.m00 * src.m11 - src.m01 * src.m10; + + dest.m00 = t00*determinant_inv; + dest.m11 = t11*determinant_inv; + dest.m22 = t22*determinant_inv; + dest.m01 = t10*determinant_inv; + dest.m10 = t01*determinant_inv; + dest.m20 = t02*determinant_inv; + dest.m02 = t20*determinant_inv; + dest.m12 = t21*determinant_inv; + dest.m21 = t12*determinant_inv; + return dest; + } else + return null; + } + + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix3f negate(Matrix3f dest) { + return negate(this, dest); + } + + /** + * Negate the source matrix and place the result in the destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public static Matrix3f negate(Matrix3f src, Matrix3f dest) { + if (dest == null) + dest = new Matrix3f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m02; + dest.m02 = -src.m01; + dest.m10 = -src.m10; + dest.m11 = -src.m12; + dest.m12 = -src.m11; + dest.m20 = -src.m20; + dest.m21 = -src.m22; + dest.m22 = -src.m21; + return dest; + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the matrix to be the identity matrix. + * @param m The matrix to be set to the identity + * @return m + */ + public static Matrix3f setIdentity(Matrix3f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + return m; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the matrix matrix to 0. + * @param m The matrix to be set to 0 + * @return m + */ + public static Matrix3f setZero(Matrix3f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + return m; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix4f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix4f.java new file mode 100644 index 0000000..3a291b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Matrix4f.java @@ -0,0 +1,849 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * Holds a 4x4 float matrix. + * + * @author foo + */ +public class Matrix4f extends Matrix implements Serializable { + private static final long serialVersionUID = 1L; + + public float m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33; + + /** + * Construct a new matrix, initialized to the identity. + */ + public Matrix4f() { + super(); + setIdentity(); + } + + public Matrix4f(final Matrix4f src) { + super(); + load(src); + } + + /** + * Returns a string representation of this matrix + */ + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append(m00).append(' ').append(m10).append(' ').append(m20).append(' ').append(m30).append('\n'); + buf.append(m01).append(' ').append(m11).append(' ').append(m21).append(' ').append(m31).append('\n'); + buf.append(m02).append(' ').append(m12).append(' ').append(m22).append(' ').append(m32).append('\n'); + buf.append(m03).append(' ').append(m13).append(' ').append(m23).append(' ').append(m33).append('\n'); + return buf.toString(); + } + + /** + * Set this matrix to be the identity matrix. + * @return this + */ + public Matrix setIdentity() { + return setIdentity(this); + } + + /** + * Set the given matrix to be the identity matrix. + * @param m The matrix to set to the identity + * @return m + */ + public static Matrix4f setIdentity(Matrix4f m) { + m.m00 = 1.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 1.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 1.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 1.0f; + + return m; + } + + /** + * Set this matrix to 0. + * @return this + */ + public Matrix setZero() { + return setZero(this); + } + + /** + * Set the given matrix to 0. + * @param m The matrix to set to 0 + * @return m + */ + public static Matrix4f setZero(Matrix4f m) { + m.m00 = 0.0f; + m.m01 = 0.0f; + m.m02 = 0.0f; + m.m03 = 0.0f; + m.m10 = 0.0f; + m.m11 = 0.0f; + m.m12 = 0.0f; + m.m13 = 0.0f; + m.m20 = 0.0f; + m.m21 = 0.0f; + m.m22 = 0.0f; + m.m23 = 0.0f; + m.m30 = 0.0f; + m.m31 = 0.0f; + m.m32 = 0.0f; + m.m33 = 0.0f; + + return m; + } + + /** + * Load from another matrix4f + * @param src The source matrix + * @return this + */ + public Matrix4f load(Matrix4f src) { + return load(src, this); + } + + /** + * Copy the source matrix to the destination matrix + * @param src The source matrix + * @param dest The destination matrix, or null of a new one is to be created + * @return The copied matrix + */ + public static Matrix4f load(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00; + dest.m01 = src.m01; + dest.m02 = src.m02; + dest.m03 = src.m03; + dest.m10 = src.m10; + dest.m11 = src.m11; + dest.m12 = src.m12; + dest.m13 = src.m13; + dest.m20 = src.m20; + dest.m21 = src.m21; + dest.m22 = src.m22; + dest.m23 = src.m23; + dest.m30 = src.m30; + dest.m31 = src.m31; + dest.m32 = src.m32; + dest.m33 = src.m33; + + return dest; + } + + /** + * Load from a float buffer. The buffer stores the matrix in column major + * (OpenGL) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix load(FloatBuffer buf) { + + m00 = buf.get(); + m01 = buf.get(); + m02 = buf.get(); + m03 = buf.get(); + m10 = buf.get(); + m11 = buf.get(); + m12 = buf.get(); + m13 = buf.get(); + m20 = buf.get(); + m21 = buf.get(); + m22 = buf.get(); + m23 = buf.get(); + m30 = buf.get(); + m31 = buf.get(); + m32 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Load from a float buffer. The buffer stores the matrix in row major + * (maths) order. + * + * @param buf A float buffer to read from + * @return this + */ + public Matrix loadTranspose(FloatBuffer buf) { + + m00 = buf.get(); + m10 = buf.get(); + m20 = buf.get(); + m30 = buf.get(); + m01 = buf.get(); + m11 = buf.get(); + m21 = buf.get(); + m31 = buf.get(); + m02 = buf.get(); + m12 = buf.get(); + m22 = buf.get(); + m32 = buf.get(); + m03 = buf.get(); + m13 = buf.get(); + m23 = buf.get(); + m33 = buf.get(); + + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m03); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m13); + buf.put(m20); + buf.put(m21); + buf.put(m22); + buf.put(m23); + buf.put(m30); + buf.put(m31); + buf.put(m32); + buf.put(m33); + return this; + } + + /** + * Store this matrix in a float buffer. The matrix is stored in row + * major (maths) order. + * @param buf The buffer to store this matrix in + */ + public Matrix storeTranspose(FloatBuffer buf) { + buf.put(m00); + buf.put(m10); + buf.put(m20); + buf.put(m30); + buf.put(m01); + buf.put(m11); + buf.put(m21); + buf.put(m31); + buf.put(m02); + buf.put(m12); + buf.put(m22); + buf.put(m32); + buf.put(m03); + buf.put(m13); + buf.put(m23); + buf.put(m33); + return this; + } + + /** + * Store the rotation portion of this matrix in a float buffer. The matrix is stored in column + * major (openGL) order. + * @param buf The buffer to store this matrix in + */ + public Matrix store3f(FloatBuffer buf) { + buf.put(m00); + buf.put(m01); + buf.put(m02); + buf.put(m10); + buf.put(m11); + buf.put(m12); + buf.put(m20); + buf.put(m21); + buf.put(m22); + return this; + } + + /** + * Add two matrices together and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f add(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 + right.m00; + dest.m01 = left.m01 + right.m01; + dest.m02 = left.m02 + right.m02; + dest.m03 = left.m03 + right.m03; + dest.m10 = left.m10 + right.m10; + dest.m11 = left.m11 + right.m11; + dest.m12 = left.m12 + right.m12; + dest.m13 = left.m13 + right.m13; + dest.m20 = left.m20 + right.m20; + dest.m21 = left.m21 + right.m21; + dest.m22 = left.m22 + right.m22; + dest.m23 = left.m23 + right.m23; + dest.m30 = left.m30 + right.m30; + dest.m31 = left.m31 + right.m31; + dest.m32 = left.m32 + right.m32; + dest.m33 = left.m33 + right.m33; + + return dest; + } + + /** + * Subtract the right matrix from the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f sub(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = left.m00 - right.m00; + dest.m01 = left.m01 - right.m01; + dest.m02 = left.m02 - right.m02; + dest.m03 = left.m03 - right.m03; + dest.m10 = left.m10 - right.m10; + dest.m11 = left.m11 - right.m11; + dest.m12 = left.m12 - right.m12; + dest.m13 = left.m13 - right.m13; + dest.m20 = left.m20 - right.m20; + dest.m21 = left.m21 - right.m21; + dest.m22 = left.m22 - right.m22; + dest.m23 = left.m23 - right.m23; + dest.m30 = left.m30 - right.m30; + dest.m31 = left.m31 - right.m31; + dest.m32 = left.m32 - right.m32; + dest.m33 = left.m33 - right.m33; + + return dest; + } + + /** + * Multiply the right matrix by the left and place the result in a third matrix. + * @param left The left source matrix + * @param right The right source matrix + * @param dest The destination matrix, or null if a new one is to be created + * @return the destination matrix + */ + public static Matrix4f mul(Matrix4f left, Matrix4f right, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + float m00 = left.m00 * right.m00 + left.m10 * right.m01 + left.m20 * right.m02 + left.m30 * right.m03; + float m01 = left.m01 * right.m00 + left.m11 * right.m01 + left.m21 * right.m02 + left.m31 * right.m03; + float m02 = left.m02 * right.m00 + left.m12 * right.m01 + left.m22 * right.m02 + left.m32 * right.m03; + float m03 = left.m03 * right.m00 + left.m13 * right.m01 + left.m23 * right.m02 + left.m33 * right.m03; + float m10 = left.m00 * right.m10 + left.m10 * right.m11 + left.m20 * right.m12 + left.m30 * right.m13; + float m11 = left.m01 * right.m10 + left.m11 * right.m11 + left.m21 * right.m12 + left.m31 * right.m13; + float m12 = left.m02 * right.m10 + left.m12 * right.m11 + left.m22 * right.m12 + left.m32 * right.m13; + float m13 = left.m03 * right.m10 + left.m13 * right.m11 + left.m23 * right.m12 + left.m33 * right.m13; + float m20 = left.m00 * right.m20 + left.m10 * right.m21 + left.m20 * right.m22 + left.m30 * right.m23; + float m21 = left.m01 * right.m20 + left.m11 * right.m21 + left.m21 * right.m22 + left.m31 * right.m23; + float m22 = left.m02 * right.m20 + left.m12 * right.m21 + left.m22 * right.m22 + left.m32 * right.m23; + float m23 = left.m03 * right.m20 + left.m13 * right.m21 + left.m23 * right.m22 + left.m33 * right.m23; + float m30 = left.m00 * right.m30 + left.m10 * right.m31 + left.m20 * right.m32 + left.m30 * right.m33; + float m31 = left.m01 * right.m30 + left.m11 * right.m31 + left.m21 * right.m32 + left.m31 * right.m33; + float m32 = left.m02 * right.m30 + left.m12 * right.m31 + left.m22 * right.m32 + left.m32 * right.m33; + float m33 = left.m03 * right.m30 + left.m13 * right.m31 + left.m23 * right.m32 + left.m33 * right.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * Transform a Vector by a matrix and return the result in a destination + * vector. + * @param left The left matrix + * @param right The right vector + * @param dest The destination vector, or null if a new one is to be created + * @return the destination vector + */ + public static Vector4f transform(Matrix4f left, Vector4f right, Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + + float x = left.m00 * right.x + left.m10 * right.y + left.m20 * right.z + left.m30 * right.w; + float y = left.m01 * right.x + left.m11 * right.y + left.m21 * right.z + left.m31 * right.w; + float z = left.m02 * right.x + left.m12 * right.y + left.m22 * right.z + left.m32 * right.w; + float w = left.m03 * right.x + left.m13 * right.y + left.m23 * right.z + left.m33 * right.w; + + dest.x = x; + dest.y = y; + dest.z = z; + dest.w = w; + + return dest; + } + + /** + * Transpose this matrix + * @return this + */ + public Matrix transpose() { + return transpose(this); + } + + /** + * Translate this matrix + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector2f vec) { + return translate(vec, this); + } + + /** + * Translate this matrix + * @param vec The vector to translate by + * @return this + */ + public Matrix4f translate(Vector3f vec) { + return translate(vec, this); + } + + /** + * Scales this matrix + * @param vec The vector to scale by + * @return this + */ + public Matrix4f scale(Vector3f vec) { + return scale(vec, this, this); + } + + /** + * Scales the source matrix and put the result in the destination matrix + * @param vec The vector to scale by + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The scaled matrix + */ + public static Matrix4f scale(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + dest.m00 = src.m00 * vec.x; + dest.m01 = src.m01 * vec.x; + dest.m02 = src.m02 * vec.x; + dest.m03 = src.m03 * vec.x; + dest.m10 = src.m10 * vec.y; + dest.m11 = src.m11 * vec.y; + dest.m12 = src.m12 * vec.y; + dest.m13 = src.m13 * vec.y; + dest.m20 = src.m20 * vec.z; + dest.m21 = src.m21 * vec.z; + dest.m22 = src.m22 * vec.z; + dest.m23 = src.m23 * vec.z; + return dest; + } + + /** + * Rotates the matrix around the given axis the specified angle + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @return this + */ + public Matrix4f rotate(float angle, Vector3f axis) { + return rotate(angle, axis, this); + } + + /** + * Rotates the matrix around the given axis the specified angle + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param dest The matrix to put the result, or null if a new matrix is to be created + * @return The rotated matrix + */ + public Matrix4f rotate(float angle, Vector3f axis, Matrix4f dest) { + return rotate(angle, axis, this, dest); + } + + /** + * Rotates the source matrix around the given axis the specified angle and + * put the result in the destination matrix. + * @param angle the angle, in radians. + * @param axis The vector representing the rotation axis. Must be normalized. + * @param src The matrix to rotate + * @param dest The matrix to put the result, or null if a new matrix is to be created + * @return The rotated matrix + */ + public static Matrix4f rotate(float angle, Vector3f axis, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float c = (float) Math.cos(angle); + float s = (float) Math.sin(angle); + float oneminusc = 1.0f - c; + float xy = axis.x*axis.y; + float yz = axis.y*axis.z; + float xz = axis.x*axis.z; + float xs = axis.x*s; + float ys = axis.y*s; + float zs = axis.z*s; + + float f00 = axis.x*axis.x*oneminusc+c; + float f01 = xy*oneminusc+zs; + float f02 = xz*oneminusc-ys; + // n[3] not used + float f10 = xy*oneminusc-zs; + float f11 = axis.y*axis.y*oneminusc+c; + float f12 = yz*oneminusc+xs; + // n[7] not used + float f20 = xz*oneminusc+ys; + float f21 = yz*oneminusc-xs; + float f22 = axis.z*axis.z*oneminusc+c; + + float t00 = src.m00 * f00 + src.m10 * f01 + src.m20 * f02; + float t01 = src.m01 * f00 + src.m11 * f01 + src.m21 * f02; + float t02 = src.m02 * f00 + src.m12 * f01 + src.m22 * f02; + float t03 = src.m03 * f00 + src.m13 * f01 + src.m23 * f02; + float t10 = src.m00 * f10 + src.m10 * f11 + src.m20 * f12; + float t11 = src.m01 * f10 + src.m11 * f11 + src.m21 * f12; + float t12 = src.m02 * f10 + src.m12 * f11 + src.m22 * f12; + float t13 = src.m03 * f10 + src.m13 * f11 + src.m23 * f12; + dest.m20 = src.m00 * f20 + src.m10 * f21 + src.m20 * f22; + dest.m21 = src.m01 * f20 + src.m11 * f21 + src.m21 * f22; + dest.m22 = src.m02 * f20 + src.m12 * f21 + src.m22 * f22; + dest.m23 = src.m03 * f20 + src.m13 * f21 + src.m23 * f22; + dest.m00 = t00; + dest.m01 = t01; + dest.m02 = t02; + dest.m03 = t03; + dest.m10 = t10; + dest.m11 = t11; + dest.m12 = t12; + dest.m13 = t13; + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector3f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z; + + return dest; + } + + /** + * Translate this matrix and stash the result in another matrix + * @param vec The vector to translate by + * @param dest The destination matrix or null if a new matrix is to be created + * @return the translated matrix + */ + public Matrix4f translate(Vector2f vec, Matrix4f dest) { + return translate(vec, this, dest); + } + + /** + * Translate the source matrix and stash the result in the destination matrix + * @param vec The vector to translate by + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return The translated matrix + */ + public static Matrix4f translate(Vector2f vec, Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m30 += src.m00 * vec.x + src.m10 * vec.y; + dest.m31 += src.m01 * vec.x + src.m11 * vec.y; + dest.m32 += src.m02 * vec.x + src.m12 * vec.y; + dest.m33 += src.m03 * vec.x + src.m13 * vec.y; + + return dest; + } + + /** + * Transpose this matrix and place the result in another matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public Matrix4f transpose(Matrix4f dest) { + return transpose(this, dest); + } + + /** + * Transpose the source matrix and place the result in the destination matrix + * @param src The source matrix + * @param dest The destination matrix or null if a new matrix is to be created + * @return the transposed matrix + */ + public static Matrix4f transpose(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + float m00 = src.m00; + float m01 = src.m10; + float m02 = src.m20; + float m03 = src.m30; + float m10 = src.m01; + float m11 = src.m11; + float m12 = src.m21; + float m13 = src.m31; + float m20 = src.m02; + float m21 = src.m12; + float m22 = src.m22; + float m23 = src.m32; + float m30 = src.m03; + float m31 = src.m13; + float m32 = src.m23; + float m33 = src.m33; + + dest.m00 = m00; + dest.m01 = m01; + dest.m02 = m02; + dest.m03 = m03; + dest.m10 = m10; + dest.m11 = m11; + dest.m12 = m12; + dest.m13 = m13; + dest.m20 = m20; + dest.m21 = m21; + dest.m22 = m22; + dest.m23 = m23; + dest.m30 = m30; + dest.m31 = m31; + dest.m32 = m32; + dest.m33 = m33; + + return dest; + } + + /** + * @return the determinant of the matrix + */ + public float determinant() { + float f = + m00 + * ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32) + - m13 * m22 * m31 + - m11 * m23 * m32 + - m12 * m21 * m33); + f -= m01 + * ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32) + - m13 * m22 * m30 + - m10 * m23 * m32 + - m12 * m20 * m33); + f += m02 + * ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31) + - m13 * m21 * m30 + - m10 * m23 * m31 + - m11 * m20 * m33); + f -= m03 + * ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31) + - m12 * m21 * m30 + - m10 * m22 * m31 + - m11 * m20 * m32); + return f; + } + + /** + * Calculate the determinant of a 3x3 matrix + * @return result + */ + + private static float determinant3x3(float t00, float t01, float t02, + float t10, float t11, float t12, + float t20, float t21, float t22) + { + return t00 * (t11 * t22 - t12 * t21) + + t01 * (t12 * t20 - t10 * t22) + + t02 * (t10 * t21 - t11 * t20); + } + + /** + * Invert this matrix + * @return this if successful, null otherwise + */ + public Matrix invert() { + return invert(this, this); + } + + /** + * Invert the source matrix and put the result in the destination + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The inverted matrix if successful, null otherwise + */ + public static Matrix4f invert(Matrix4f src, Matrix4f dest) { + float determinant = src.determinant(); + + if (determinant != 0) { + /* + * m00 m01 m02 m03 + * m10 m11 m12 m13 + * m20 m21 m22 m23 + * m30 m31 m32 m33 + */ + if (dest == null) + dest = new Matrix4f(); + float determinant_inv = 1f/determinant; + + // first row + float t00 = determinant3x3(src.m11, src.m12, src.m13, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t01 = -determinant3x3(src.m10, src.m12, src.m13, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t02 = determinant3x3(src.m10, src.m11, src.m13, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t03 = -determinant3x3(src.m10, src.m11, src.m12, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // second row + float t10 = -determinant3x3(src.m01, src.m02, src.m03, src.m21, src.m22, src.m23, src.m31, src.m32, src.m33); + float t11 = determinant3x3(src.m00, src.m02, src.m03, src.m20, src.m22, src.m23, src.m30, src.m32, src.m33); + float t12 = -determinant3x3(src.m00, src.m01, src.m03, src.m20, src.m21, src.m23, src.m30, src.m31, src.m33); + float t13 = determinant3x3(src.m00, src.m01, src.m02, src.m20, src.m21, src.m22, src.m30, src.m31, src.m32); + // third row + float t20 = determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m31, src.m32, src.m33); + float t21 = -determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m30, src.m32, src.m33); + float t22 = determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m30, src.m31, src.m33); + float t23 = -determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m30, src.m31, src.m32); + // fourth row + float t30 = -determinant3x3(src.m01, src.m02, src.m03, src.m11, src.m12, src.m13, src.m21, src.m22, src.m23); + float t31 = determinant3x3(src.m00, src.m02, src.m03, src.m10, src.m12, src.m13, src.m20, src.m22, src.m23); + float t32 = -determinant3x3(src.m00, src.m01, src.m03, src.m10, src.m11, src.m13, src.m20, src.m21, src.m23); + float t33 = determinant3x3(src.m00, src.m01, src.m02, src.m10, src.m11, src.m12, src.m20, src.m21, src.m22); + + // transpose and divide by the determinant + dest.m00 = t00*determinant_inv; + dest.m11 = t11*determinant_inv; + dest.m22 = t22*determinant_inv; + dest.m33 = t33*determinant_inv; + dest.m01 = t10*determinant_inv; + dest.m10 = t01*determinant_inv; + dest.m20 = t02*determinant_inv; + dest.m02 = t20*determinant_inv; + dest.m12 = t21*determinant_inv; + dest.m21 = t12*determinant_inv; + dest.m03 = t30*determinant_inv; + dest.m30 = t03*determinant_inv; + dest.m13 = t31*determinant_inv; + dest.m31 = t13*determinant_inv; + dest.m32 = t23*determinant_inv; + dest.m23 = t32*determinant_inv; + return dest; + } else + return null; + } + + /** + * Negate this matrix + * @return this + */ + public Matrix negate() { + return negate(this); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param dest The destination matrix, or null if a new matrix is to be created + * @return the negated matrix + */ + public Matrix4f negate(Matrix4f dest) { + return negate(this, dest); + } + + /** + * Negate this matrix and place the result in a destination matrix. + * @param src The source matrix + * @param dest The destination matrix, or null if a new matrix is to be created + * @return The negated matrix + */ + public static Matrix4f negate(Matrix4f src, Matrix4f dest) { + if (dest == null) + dest = new Matrix4f(); + + dest.m00 = -src.m00; + dest.m01 = -src.m01; + dest.m02 = -src.m02; + dest.m03 = -src.m03; + dest.m10 = -src.m10; + dest.m11 = -src.m11; + dest.m12 = -src.m12; + dest.m13 = -src.m13; + dest.m20 = -src.m20; + dest.m21 = -src.m21; + dest.m22 = -src.m22; + dest.m23 = -src.m23; + dest.m30 = -src.m30; + dest.m31 = -src.m31; + dest.m32 = -src.m32; + dest.m33 = -src.m33; + + return dest; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Quaternion.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Quaternion.java new file mode 100644 index 0000000..f81340c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Quaternion.java @@ -0,0 +1,530 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * + * Quaternions for LWJGL! + * + * @author fbi + * @version $Revision$ + * $Id$ + */ + +import java.nio.FloatBuffer; + +public class Quaternion extends Vector implements ReadableVector4f { + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * C'tor. The quaternion will be initialized to the identity. + */ + public Quaternion() { + super(); + setIdentity(); + } + + /** + * C'tor + * + * @param src + */ + public Quaternion(ReadableVector4f src) { + set(src); + } + + /** + * C'tor + * + */ + public Quaternion(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, + * float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * + * @param src + * The source vector + * @return this + */ + public Quaternion set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * Set this quaternion to the multiplication identity. + * @return this + */ + public Quaternion setIdentity() { + return setIdentity(this); + } + + /** + * Set the given quaternion to the multiplication identity. + * @param q The quaternion + * @return q + */ + public static Quaternion setIdentity(Quaternion q) { + q.x = 0; + q.y = 0; + q.z = 0; + q.w = 1; + return q; + } + + /** + * @return the length squared of the quaternion + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Normalise the source quaternion and place the result in another quaternion. + * + * @param src + * The source quaternion + * @param dest + * The destination quaternion, or null if a new quaternion is to be + * created + * @return The normalised quaternion + */ + public static Quaternion normalise(Quaternion src, Quaternion dest) { + float inv_l = 1f/src.length(); + + if (dest == null) + dest = new Quaternion(); + + dest.set(src.x * inv_l, src.y * inv_l, src.z * inv_l, src.w * inv_l); + + return dest; + } + + /** + * Normalise this quaternion and place the result in another quaternion. + * + * @param dest + * The destination quaternion, or null if a new quaternion is to be + * created + * @return the normalised quaternion + */ + public Quaternion normalise(Quaternion dest) { + return normalise(this, dest); + } + + /** + * The dot product of two quaternions + * + * @param left + * The LHS quat + * @param right + * The RHS quat + * @return left dot right + */ + public static float dot(Quaternion left, Quaternion right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w + * right.w; + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param dest + * The quaternion which should be set to the conjugate of this + * quaternion + */ + public Quaternion negate(Quaternion dest) { + return negate(this, dest); + } + + /** + * Calculate the conjugate of this quaternion and put it into the given one + * + * @param src + * The source quaternion + * @param dest + * The quaternion which should be set to the conjugate of this + * quaternion + */ + public static Quaternion negate(Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + + dest.x = -src.x; + dest.y = -src.y; + dest.z = -src.z; + dest.w = src.w; + + return dest; + } + + /** + * Calculate the conjugate of this quaternion + */ + public Vector negate() { + return negate(this, this); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.Vector#load(java.nio.FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* + * (non-Javadoc) + * + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + return scale(scale, this, this); + } + + /** + * Scale the source quaternion by scale and put the result in the destination + * @param scale The amount to scale by + * @param src The source quaternion + * @param dest The destination quaternion, or null if a new quaternion is to be created + * @return The scaled quaternion + */ + public static Quaternion scale(float scale, Quaternion src, Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.x = src.x * scale; + dest.y = src.y * scale; + dest.z = src.z * scale; + dest.w = src.w * scale; + return dest; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.ReadableVector#store(java.nio.FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* + * (Overrides) + * + * @see org.lwjgl.vector.ReadableVector3f#getW() + */ + public float getW() { + return w; + } + + public String toString() { + return "Quaternion: " + x + " " + y + " " + z + " " + w; + } + + /** + * Sets the value of this quaternion to the quaternion product of + * quaternions left and right (this = left * right). Note that this is safe + * for aliasing (e.g. this can be left or right). + * + * @param left + * the first quaternion + * @param right + * the second quaternion + */ + public static Quaternion mul(Quaternion left, Quaternion right, + Quaternion dest) { + if (dest == null) + dest = new Quaternion(); + dest.set(left.x * right.w + left.w * right.x + left.y * right.z + - left.z * right.y, left.y * right.w + left.w * right.y + + left.z * right.x - left.x * right.z, left.z * right.w + + left.w * right.z + left.x * right.y - left.y * right.x, + left.w * right.w - left.x * right.x - left.y * right.y + - left.z * right.z); + return dest; + } + + /** + * + * Multiplies quaternion left by the inverse of quaternion right and places + * the value into this quaternion. The value of both argument quaternions is + * preservered (this = left * right^-1). + * + * @param left + * the left quaternion + * @param right + * the right quaternion + */ + public static Quaternion mulInverse(Quaternion left, Quaternion right, + Quaternion dest) { + float n = right.lengthSquared(); + // zero-div may occur. + n = (n == 0.0 ? n : 1 / n); + // store on stack once for aliasing-safty + if (dest == null) + dest = new Quaternion(); + dest + .set((left.x * right.w - left.w * right.x - left.y + * right.z + left.z * right.y) + * n, (left.y * right.w - left.w * right.y - left.z + * right.x + left.x * right.z) + * n, (left.z * right.w - left.w * right.z - left.x + * right.y + left.y * right.x) + * n, (left.w * right.w + left.x * right.x + left.y + * right.y + left.z * right.z) + * n); + + return dest; + } + + /** + * Sets the value of this quaternion to the equivalent rotation of the + * Axis-Angle argument. + * + * @param a1 + * the axis-angle: (x,y,z) is the axis and w is the angle + */ + public final void setFromAxisAngle(Vector4f a1) { + x = a1.x; + y = a1.y; + z = a1.z; + float n = (float) Math.sqrt(x * x + y * y + z * z); + // zero-div may occur. + float s = (float) (Math.sin(0.5 * a1.w) / n); + x *= s; + y *= s; + z *= s; + w = (float) Math.cos(0.5 * a1.w); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The matrix + * @return this + */ + public final Quaternion setFromMatrix(Matrix4f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + * @param q + * The destination quaternion, or null if a new quaternion is to be created + * @return q + */ + public static Quaternion setFromMatrix(Matrix4f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, + m.m21, m.m22); + } + + /** + * Sets the value of this quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + */ + public final Quaternion setFromMatrix(Matrix3f m) { + return setFromMatrix(m, this); + } + + /** + * Sets the value of the source quaternion using the rotational component of the + * passed matrix. + * + * @param m + * The source matrix + * @param q + * The destination quaternion, or null if a new quaternion is to be created + * @return q + */ + public static Quaternion setFromMatrix(Matrix3f m, Quaternion q) { + return q.setFromMat(m.m00, m.m01, m.m02, m.m10, m.m11, m.m12, m.m20, + m.m21, m.m22); + } + + /** + * Private method to perform the matrix-to-quaternion conversion + */ + private Quaternion setFromMat(float m00, float m01, float m02, float m10, + float m11, float m12, float m20, float m21, float m22) { + + float s; + float tr = m00 + m11 + m22; + if (tr >= 0.0) { + s = (float) Math.sqrt(tr + 1.0); + w = s * 0.5f; + s = 0.5f / s; + x = (m21 - m12) * s; + y = (m02 - m20) * s; + z = (m10 - m01) * s; + } else { + float max = Math.max(Math.max(m00, m11), m22); + if (max == m00) { + s = (float) Math.sqrt(m00 - (m11 + m22) + 1.0); + x = s * 0.5f; + s = 0.5f / s; + y = (m01 + m10) * s; + z = (m20 + m02) * s; + w = (m21 - m12) * s; + } else if (max == m11) { + s = (float) Math.sqrt(m11 - (m22 + m00) + 1.0); + y = s * 0.5f; + s = 0.5f / s; + z = (m12 + m21) * s; + x = (m01 + m10) * s; + w = (m02 - m20) * s; + } else { + s = (float) Math.sqrt(m22 - (m00 + m11) + 1.0); + z = s * 0.5f; + s = 0.5f / s; + x = (m20 + m02) * s; + y = (m12 + m21) * s; + w = (m10 - m01) * s; + } + } + return this; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector.java new file mode 100644 index 0000000..e9e3df4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.nio.FloatBuffer; + +/** + * @author foo + */ +public interface ReadableVector { + /** + * @return the length of the vector + */ + float length(); + /** + * @return the length squared of the vector + */ + float lengthSquared(); + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + Vector store(FloatBuffer buf); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector2f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector2f.java new file mode 100644 index 0000000..1a3be3a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector2f.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * @author foo + */ +public interface ReadableVector2f extends ReadableVector { + /** + * @return x + */ + float getX(); + /** + * @return y + */ + float getY(); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector3f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector3f.java new file mode 100644 index 0000000..c6b967d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector3f.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * @author foo + */ +public interface ReadableVector3f extends ReadableVector2f { + /** + * @return z + */ + float getZ(); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector4f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector4f.java new file mode 100644 index 0000000..d766b44 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/ReadableVector4f.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * @author foo + */ +public interface ReadableVector4f extends ReadableVector3f { + + /** + * @return w + */ + float getW(); + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector.java new file mode 100644 index 0000000..64cc757 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +/** + * + * Base class for vectors. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +public abstract class Vector implements Serializable, ReadableVector { + + /** + * Constructor for Vector. + */ + protected Vector() { + super(); + } + + /** + * @return the length of the vector + */ + public final float length() { + return (float) Math.sqrt(lengthSquared()); + } + + + /** + * @return the length squared of the vector + */ + public abstract float lengthSquared(); + + /** + * Load this vector from a FloatBuffer + * @param buf The buffer to load it from, at the current position + * @return this + */ + public abstract Vector load(FloatBuffer buf); + + /** + * Negate a vector + * @return this + */ + public abstract Vector negate(); + + + /** + * Normalise this vector + * @return this + */ + public final Vector normalise() { + float len = length(); + if (len != 0.0f) { + float l = 1.0f / len; + return scale(l); + } else + throw new IllegalStateException("Zero length vector"); + } + + + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + public abstract Vector store(FloatBuffer buf); + + + /** + * Scale this vector + * @param scale The scale factor + * @return this + */ + public abstract Vector scale(float scale); + + + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector2f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector2f.java new file mode 100644 index 0000000..d4836fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector2f.java @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +import org.lwjgl.util.vector.Vector2f; + +/** + * + * Holds a 2-tuple vector. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Vector2f extends Vector implements Serializable, ReadableVector2f, WritableVector2f { + + private static final long serialVersionUID = 1L; + + public float x, y; + + /** + * Constructor for Vector3f. + */ + public Vector2f() { + super(); + } + + /** + * Constructor + */ + public Vector2f(ReadableVector2f src) { + set(src); + } + + /** + * Constructor + */ + public Vector2f(float x, float y) { + set(x, y); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /** + * Load from another Vector2f + * @param src The source vector + * @return this + */ + public Vector2f set(ReadableVector2f src) { + x = src.getX(); + y = src.getY(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector2f translate(float x, float y) { + this.x += x; + this.y += y; + return this; + } + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector2f negate(Vector2f dest) { + if (dest == null) + dest = new Vector2f(); + dest.x = -x; + dest.y = -y; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector2f normalise(Vector2f dest) { + float l = length(); + + if (dest == null) + dest = new Vector2f(x / l, y / l); + else + dest.set(x / l, y / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector2f left, Vector2f right) { + return left.x * right.x + left.y * right.y; + } + + + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector2f a, Vector2f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector2f add(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x + right.x, left.y + right.y); + else { + dest.set(left.x + right.x, left.y + right.y); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector2f sub(Vector2f left, Vector2f right, Vector2f dest) { + if (dest == null) + return new Vector2f(left.x - right.x, left.y - right.y); + else { + dest.set(left.x - right.x, left.y - right.y); + return dest; + } + } + + /** + * Store this vector in a FloatBuffer + * @param buf The buffer to store it in, at the current position + * @return this + */ + public Vector store(FloatBuffer buf) { + buf.put(x); + buf.put(y); + return this; + } + + /** + * Load this vector from a FloatBuffer + * @param buf The buffer to load it from, at the current position + * @return this + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + + return this; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector2f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector2f other = (Vector2f)obj; + + if (x == other.x && y == other.y) return true; + + return false; + } + +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector3f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector3f.java new file mode 100644 index 0000000..f5a0717 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector3f.java @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +import org.lwjgl.util.vector.Vector3f; + +/** + * + * Holds a 3-tuple vector. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Vector3f extends Vector implements Serializable, ReadableVector3f, WritableVector3f { + + private static final long serialVersionUID = 1L; + + public float x, y, z; + + /** + * Constructor for Vector3f. + */ + public Vector3f() { + super(); + } + + /** + * Constructor + */ + public Vector3f(ReadableVector3f src) { + set(src); + } + + /** + * Constructor + */ + public Vector3f(float x, float y, float z) { + set(x, y, z); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Load from another Vector3f + * @param src The source vector + * @return this + */ + public Vector3f set(ReadableVector3f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector3f translate(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector3f add(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x + right.x, left.y + right.y, left.z + right.z); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector3f sub(Vector3f left, Vector3f right, Vector3f dest) { + if (dest == null) + return new Vector3f(left.x - right.x, left.y - right.y, left.z - right.z); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z); + return dest; + } + } + + /** + * The cross product of two vectors. + * + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination result, or null if a new vector is to be created + * @return left cross right + */ + public static Vector3f cross( + Vector3f left, + Vector3f right, + Vector3f dest) + { + + if (dest == null) + dest = new Vector3f(); + + dest.set( + left.y * right.z - left.z * right.y, + right.x * left.z - right.z * left.x, + left.x * right.y - left.y * right.x + ); + + return dest; + } + + + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector3f negate(Vector3f dest) { + if (dest == null) + dest = new Vector3f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector3f normalise(Vector3f dest) { + float l = length(); + + if (dest == null) + dest = new Vector3f(x / l, y / l, z / l); + else + dest.set(x / l, y / l, z / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector3f left, Vector3f right) { + return left.x * right.x + left.y * right.y + left.z * right.z; + } + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector3f a, Vector3f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + + x *= scale; + y *= scale; + z *= scale; + + return this; + + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + + return this; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuilder sb = new StringBuilder(64); + + sb.append("Vector3f["); + sb.append(x); + sb.append(", "); + sb.append(y); + sb.append(", "); + sb.append(z); + sb.append(']'); + return sb.toString(); + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector3f other = (Vector3f)obj; + + if (x == other.x && y == other.y && z == other.z) return true; + + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector4f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector4f.java new file mode 100644 index 0000000..06af940 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/Vector4f.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +import java.io.Serializable; +import java.nio.FloatBuffer; + +import org.lwjgl.util.vector.Vector4f; + +/** + * + * Holds a 4-tuple vector. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public class Vector4f extends Vector implements Serializable, ReadableVector4f, WritableVector4f { + + private static final long serialVersionUID = 1L; + + public float x, y, z, w; + + /** + * Constructor for Vector4f. + */ + public Vector4f() { + super(); + } + + /** + * Constructor + */ + public Vector4f(ReadableVector4f src) { + set(src); + } + + /** + * Constructor + */ + public Vector4f(float x, float y, float z, float w) { + set(x, y, z, w); + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector2f#set(float, float) + */ + public void set(float x, float y) { + this.x = x; + this.y = y; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector3f#set(float, float, float) + */ + public void set(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + /* (non-Javadoc) + * @see org.lwjgl.util.vector.WritableVector4f#set(float, float, float, float) + */ + public void set(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Load from another Vector4f + * @param src The source vector + * @return this + */ + public Vector4f set(ReadableVector4f src) { + x = src.getX(); + y = src.getY(); + z = src.getZ(); + w = src.getW(); + return this; + } + + /** + * @return the length squared of the vector + */ + public float lengthSquared() { + return x * x + y * y + z * z + w * w; + } + + /** + * Translate a vector + * @param x The translation in x + * @param y the translation in y + * @return this + */ + public Vector4f translate(float x, float y, float z, float w) { + this.x += x; + this.y += y; + this.z += z; + this.w += w; + return this; + } + + /** + * Add a vector to another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return the sum of left and right in dest + */ + public static Vector4f add(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + else { + dest.set(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); + return dest; + } + } + + /** + * Subtract a vector from another vector and place the result in a destination + * vector. + * @param left The LHS vector + * @param right The RHS vector + * @param dest The destination vector, or null if a new vector is to be created + * @return left minus right in dest + */ + public static Vector4f sub(Vector4f left, Vector4f right, Vector4f dest) { + if (dest == null) + return new Vector4f(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + else { + dest.set(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); + return dest; + } + } + + + /** + * Negate a vector + * @return this + */ + public Vector negate() { + x = -x; + y = -y; + z = -z; + w = -w; + return this; + } + + /** + * Negate a vector and place the result in a destination vector. + * @param dest The destination vector or null if a new vector is to be created + * @return the negated vector + */ + public Vector4f negate(Vector4f dest) { + if (dest == null) + dest = new Vector4f(); + dest.x = -x; + dest.y = -y; + dest.z = -z; + dest.w = -w; + return dest; + } + + + /** + * Normalise this vector and place the result in another vector. + * @param dest The destination vector, or null if a new vector is to be created + * @return the normalised vector + */ + public Vector4f normalise(Vector4f dest) { + float l = length(); + + if (dest == null) + dest = new Vector4f(x / l, y / l, z / l, w / l); + else + dest.set(x / l, y / l, z / l, w / l); + + return dest; + } + + /** + * The dot product of two vectors is calculated as + * v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w + * @param left The LHS vector + * @param right The RHS vector + * @return left dot right + */ + public static float dot(Vector4f left, Vector4f right) { + return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; + } + + /** + * Calculate the angle between two vectors, in radians + * @param a A vector + * @param b The other vector + * @return the angle between the two vectors, in radians + */ + public static float angle(Vector4f a, Vector4f b) { + float dls = dot(a, b) / (a.length() * b.length()); + if (dls < -1f) + dls = -1f; + else if (dls > 1.0f) + dls = 1.0f; + return (float)Math.acos(dls); + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#load(FloatBuffer) + */ + public Vector load(FloatBuffer buf) { + x = buf.get(); + y = buf.get(); + z = buf.get(); + w = buf.get(); + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#scale(float) + */ + public Vector scale(float scale) { + x *= scale; + y *= scale; + z *= scale; + w *= scale; + return this; + } + + /* (non-Javadoc) + * @see org.lwjgl.vector.Vector#store(FloatBuffer) + */ + public Vector store(FloatBuffer buf) { + + buf.put(x); + buf.put(y); + buf.put(z); + buf.put(w); + + return this; + } + + public String toString() { + return "Vector4f: " + x + " " + y + " " + z + " " + w; + } + + /** + * @return x + */ + public final float getX() { + return x; + } + + /** + * @return y + */ + public final float getY() { + return y; + } + + /** + * Set X + * @param x + */ + public final void setX(float x) { + this.x = x; + } + + /** + * Set Y + * @param y + */ + public final void setY(float y) { + this.y = y; + } + + /** + * Set Z + * @param z + */ + public void setZ(float z) { + this.z = z; + } + + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getZ() { + return z; + } + + /** + * Set W + * @param w + */ + public void setW(float w) { + this.w = w; + } + + /* (Overrides) + * @see org.lwjgl.vector.ReadableVector3f#getZ() + */ + public float getW() { + return w; + } + + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + Vector4f other = (Vector4f)obj; + + if (x == other.x && y == other.y && z == other.z && w == other.w) return true; + + return false; + } +} diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector2f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector2f.java new file mode 100644 index 0000000..ea171a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector2f.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * Writable interface to Vector2fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector2f { + + /** + * Set the X value + * @param x + */ + void setX(float x); + + /** + * Set the Y value + * @param y + */ + void setY(float y); + + /** + * Set the X,Y values + * @param x + * @param y + */ + void set(float x, float y); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector3f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector3f.java new file mode 100644 index 0000000..3e660a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector3f.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * Writable interface to Vector3fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector3f extends WritableVector2f { + + /** + * Set the Z value + * @param z + */ + void setZ(float z); + + /** + * Set the X,Y,Z values + * @param x + * @param y + * @param z + */ + void set(float x, float y, float z); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector4f.java b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector4f.java new file mode 100644 index 0000000..b060b85 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/java/org/lwjgl/util/vector/WritableVector4f.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.util.vector; + +/** + * Writable interface to Vector4fs + * @author $author$ + * @version $revision$ + * $Id$ + */ +public interface WritableVector4f extends WritableVector3f { + + /** + * Set the W value + * @param w + */ + void setW(float w); + + /** + * Set the X,Y,Z,W values + * @param x + * @param y + * @param z + * @param w + */ + void set(float x, float y, float z, float w); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/lwjgl-git.iml b/etc/lwjgl-2.9.1/src/lwjgl-git.iml new file mode 100644 index 0000000..fc25338 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/lwjgl-git.iml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$/.."> + <sourceFolder url="file://$MODULE_DIR$/generated" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="library" name="libs" level="project" /> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://I:/Development/jdk1.7.0_17/lib/tools.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://I:/Development/jdk1.7.0_17/lib/tools.jar!/" /> + </SOURCES> + </library> + </orderEntry> + </component> +</module> + diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl.h new file mode 100644 index 0000000..1a0e29c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl.h @@ -0,0 +1,998 @@ +/******************************************************************************* + * Copyright (c) 2008-2010 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. + ******************************************************************************/ + +/* $Revision: 11985 $ on $Date: 2010-07-15 11:16:06 -0700 (Thu, 15 Jul 2010) $ */ + +#ifndef __OPENCL_CL_H +#define __OPENCL_CL_H + +#ifdef __APPLE__ +#include <OpenCL/cl_platform.h> +#else +#include <CL/cl_platform.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************/ + +typedef struct _cl_platform_id * cl_platform_id; +typedef struct _cl_device_id * cl_device_id; +typedef struct _cl_context * cl_context; +typedef struct _cl_command_queue * cl_command_queue; +typedef struct _cl_mem * cl_mem; +typedef struct _cl_program * cl_program; +typedef struct _cl_kernel * cl_kernel; +typedef struct _cl_event * cl_event; +typedef struct _cl_sampler * cl_sampler; + +typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ +typedef cl_ulong cl_bitfield; +typedef cl_bitfield cl_device_type; +typedef cl_uint cl_platform_info; +typedef cl_uint cl_device_info; +typedef cl_bitfield cl_device_fp_config; +typedef cl_uint cl_device_mem_cache_type; +typedef cl_uint cl_device_local_mem_type; +typedef cl_bitfield cl_device_exec_capabilities; +typedef cl_bitfield cl_command_queue_properties; + +typedef intptr_t cl_context_properties; +typedef cl_uint cl_context_info; +typedef cl_uint cl_command_queue_info; +typedef cl_uint cl_channel_order; +typedef cl_uint cl_channel_type; +typedef cl_bitfield cl_mem_flags; +typedef cl_uint cl_mem_object_type; +typedef cl_uint cl_mem_info; +typedef cl_uint cl_image_info; +typedef cl_uint cl_buffer_create_type; +typedef cl_uint cl_addressing_mode; +typedef cl_uint cl_filter_mode; +typedef cl_uint cl_sampler_info; +typedef cl_bitfield cl_map_flags; +typedef cl_uint cl_program_info; +typedef cl_uint cl_program_build_info; +typedef cl_int cl_build_status; +typedef cl_uint cl_kernel_info; +typedef cl_uint cl_kernel_work_group_info; +typedef cl_uint cl_event_info; +typedef cl_uint cl_command_type; +typedef cl_uint cl_profiling_info; + +typedef struct _cl_image_format { + cl_channel_order image_channel_order; + cl_channel_type image_channel_data_type; +} cl_image_format; + + +typedef struct _cl_buffer_region { + size_t origin; + size_t size; +} cl_buffer_region; + +/******************************************************************************/ + +/* Error Codes */ +#define CL_SUCCESS 0 +#define CL_DEVICE_NOT_FOUND -1 +#define CL_DEVICE_NOT_AVAILABLE -2 +#define CL_COMPILER_NOT_AVAILABLE -3 +#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 +#define CL_OUT_OF_RESOURCES -5 +#define CL_OUT_OF_HOST_MEMORY -6 +#define CL_PROFILING_INFO_NOT_AVAILABLE -7 +#define CL_MEM_COPY_OVERLAP -8 +#define CL_IMAGE_FORMAT_MISMATCH -9 +#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 +#define CL_BUILD_PROGRAM_FAILURE -11 +#define CL_MAP_FAILURE -12 +#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 +#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 + +#define CL_INVALID_VALUE -30 +#define CL_INVALID_DEVICE_TYPE -31 +#define CL_INVALID_PLATFORM -32 +#define CL_INVALID_DEVICE -33 +#define CL_INVALID_CONTEXT -34 +#define CL_INVALID_QUEUE_PROPERTIES -35 +#define CL_INVALID_COMMAND_QUEUE -36 +#define CL_INVALID_HOST_PTR -37 +#define CL_INVALID_MEM_OBJECT -38 +#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 +#define CL_INVALID_IMAGE_SIZE -40 +#define CL_INVALID_SAMPLER -41 +#define CL_INVALID_BINARY -42 +#define CL_INVALID_BUILD_OPTIONS -43 +#define CL_INVALID_PROGRAM -44 +#define CL_INVALID_PROGRAM_EXECUTABLE -45 +#define CL_INVALID_KERNEL_NAME -46 +#define CL_INVALID_KERNEL_DEFINITION -47 +#define CL_INVALID_KERNEL -48 +#define CL_INVALID_ARG_INDEX -49 +#define CL_INVALID_ARG_VALUE -50 +#define CL_INVALID_ARG_SIZE -51 +#define CL_INVALID_KERNEL_ARGS -52 +#define CL_INVALID_WORK_DIMENSION -53 +#define CL_INVALID_WORK_GROUP_SIZE -54 +#define CL_INVALID_WORK_ITEM_SIZE -55 +#define CL_INVALID_GLOBAL_OFFSET -56 +#define CL_INVALID_EVENT_WAIT_LIST -57 +#define CL_INVALID_EVENT -58 +#define CL_INVALID_OPERATION -59 +#define CL_INVALID_GL_OBJECT -60 +#define CL_INVALID_BUFFER_SIZE -61 +#define CL_INVALID_MIP_LEVEL -62 +#define CL_INVALID_GLOBAL_WORK_SIZE -63 +#define CL_INVALID_PROPERTY -64 + +/* OpenCL Version */ +#define CL_VERSION_1_0 1 +#define CL_VERSION_1_1 1 + +/* cl_bool */ +#define CL_FALSE 0 +#define CL_TRUE 1 + +/* cl_platform_info */ +#define CL_PLATFORM_PROFILE 0x0900 +#define CL_PLATFORM_VERSION 0x0901 +#define CL_PLATFORM_NAME 0x0902 +#define CL_PLATFORM_VENDOR 0x0903 +#define CL_PLATFORM_EXTENSIONS 0x0904 + +/* cl_device_type - bitfield */ +#define CL_DEVICE_TYPE_DEFAULT (1 << 0) +#define CL_DEVICE_TYPE_CPU (1 << 1) +#define CL_DEVICE_TYPE_GPU (1 << 2) +#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) +#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF + +/* cl_device_info */ +#define CL_DEVICE_TYPE 0x1000 +#define CL_DEVICE_VENDOR_ID 0x1001 +#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 +#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 +#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 +#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B +#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C +#define CL_DEVICE_ADDRESS_BITS 0x100D +#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E +#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F +#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 +#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 +#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 +#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 +#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 +#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 +#define CL_DEVICE_IMAGE_SUPPORT 0x1016 +#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 +#define CL_DEVICE_MAX_SAMPLERS 0x1018 +#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 +#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A +#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B +#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C +#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D +#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E +#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F +#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 +#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 +#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 +#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 +#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 +#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 +#define CL_DEVICE_ENDIAN_LITTLE 0x1026 +#define CL_DEVICE_AVAILABLE 0x1027 +#define CL_DEVICE_COMPILER_AVAILABLE 0x1028 +#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 +#define CL_DEVICE_QUEUE_PROPERTIES 0x102A +#define CL_DEVICE_NAME 0x102B +#define CL_DEVICE_VENDOR 0x102C +#define CL_DRIVER_VERSION 0x102D +#define CL_DEVICE_PROFILE 0x102E +#define CL_DEVICE_VERSION 0x102F +#define CL_DEVICE_EXTENSIONS 0x1030 +#define CL_DEVICE_PLATFORM 0x1031 +/* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */ +/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */ +#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 +#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B +#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C +#define CL_DEVICE_OPENCL_C_VERSION 0x103D + +/* cl_device_fp_config - bitfield */ +#define CL_FP_DENORM (1 << 0) +#define CL_FP_INF_NAN (1 << 1) +#define CL_FP_ROUND_TO_NEAREST (1 << 2) +#define CL_FP_ROUND_TO_ZERO (1 << 3) +#define CL_FP_ROUND_TO_INF (1 << 4) +#define CL_FP_FMA (1 << 5) +#define CL_FP_SOFT_FLOAT (1 << 6) + +/* cl_device_mem_cache_type */ +#define CL_NONE 0x0 +#define CL_READ_ONLY_CACHE 0x1 +#define CL_READ_WRITE_CACHE 0x2 + +/* cl_device_local_mem_type */ +#define CL_LOCAL 0x1 +#define CL_GLOBAL 0x2 + +/* cl_device_exec_capabilities - bitfield */ +#define CL_EXEC_KERNEL (1 << 0) +#define CL_EXEC_NATIVE_KERNEL (1 << 1) + +/* cl_command_queue_properties - bitfield */ +#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) +#define CL_QUEUE_PROFILING_ENABLE (1 << 1) + +/* cl_context_info */ +#define CL_CONTEXT_REFERENCE_COUNT 0x1080 +#define CL_CONTEXT_DEVICES 0x1081 +#define CL_CONTEXT_PROPERTIES 0x1082 +#define CL_CONTEXT_NUM_DEVICES 0x1083 + +/* cl_context_info + cl_context_properties */ +#define CL_CONTEXT_PLATFORM 0x1084 + +/* cl_command_queue_info */ +#define CL_QUEUE_CONTEXT 0x1090 +#define CL_QUEUE_DEVICE 0x1091 +#define CL_QUEUE_REFERENCE_COUNT 0x1092 +#define CL_QUEUE_PROPERTIES 0x1093 + +/* cl_mem_flags - bitfield */ +#define CL_MEM_READ_WRITE (1 << 0) +#define CL_MEM_WRITE_ONLY (1 << 1) +#define CL_MEM_READ_ONLY (1 << 2) +#define CL_MEM_USE_HOST_PTR (1 << 3) +#define CL_MEM_ALLOC_HOST_PTR (1 << 4) +#define CL_MEM_COPY_HOST_PTR (1 << 5) + +/* cl_channel_order */ +#define CL_R 0x10B0 +#define CL_A 0x10B1 +#define CL_RG 0x10B2 +#define CL_RA 0x10B3 +#define CL_RGB 0x10B4 +#define CL_RGBA 0x10B5 +#define CL_BGRA 0x10B6 +#define CL_ARGB 0x10B7 +#define CL_INTENSITY 0x10B8 +#define CL_LUMINANCE 0x10B9 +#define CL_Rx 0x10BA +#define CL_RGx 0x10BB +#define CL_RGBx 0x10BC + +/* cl_channel_type */ +#define CL_SNORM_INT8 0x10D0 +#define CL_SNORM_INT16 0x10D1 +#define CL_UNORM_INT8 0x10D2 +#define CL_UNORM_INT16 0x10D3 +#define CL_UNORM_SHORT_565 0x10D4 +#define CL_UNORM_SHORT_555 0x10D5 +#define CL_UNORM_INT_101010 0x10D6 +#define CL_SIGNED_INT8 0x10D7 +#define CL_SIGNED_INT16 0x10D8 +#define CL_SIGNED_INT32 0x10D9 +#define CL_UNSIGNED_INT8 0x10DA +#define CL_UNSIGNED_INT16 0x10DB +#define CL_UNSIGNED_INT32 0x10DC +#define CL_HALF_FLOAT 0x10DD +#define CL_FLOAT 0x10DE + +/* cl_mem_object_type */ +#define CL_MEM_OBJECT_BUFFER 0x10F0 +#define CL_MEM_OBJECT_IMAGE2D 0x10F1 +#define CL_MEM_OBJECT_IMAGE3D 0x10F2 + +/* cl_mem_info */ +#define CL_MEM_TYPE 0x1100 +#define CL_MEM_FLAGS 0x1101 +#define CL_MEM_SIZE 0x1102 +#define CL_MEM_HOST_PTR 0x1103 +#define CL_MEM_MAP_COUNT 0x1104 +#define CL_MEM_REFERENCE_COUNT 0x1105 +#define CL_MEM_CONTEXT 0x1106 +#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 +#define CL_MEM_OFFSET 0x1108 + +/* cl_image_info */ +#define CL_IMAGE_FORMAT 0x1110 +#define CL_IMAGE_ELEMENT_SIZE 0x1111 +#define CL_IMAGE_ROW_PITCH 0x1112 +#define CL_IMAGE_SLICE_PITCH 0x1113 +#define CL_IMAGE_WIDTH 0x1114 +#define CL_IMAGE_HEIGHT 0x1115 +#define CL_IMAGE_DEPTH 0x1116 + +/* cl_addressing_mode */ +#define CL_ADDRESS_NONE 0x1130 +#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 +#define CL_ADDRESS_CLAMP 0x1132 +#define CL_ADDRESS_REPEAT 0x1133 +#define CL_ADDRESS_MIRRORED_REPEAT 0x1134 + +/* cl_filter_mode */ +#define CL_FILTER_NEAREST 0x1140 +#define CL_FILTER_LINEAR 0x1141 + +/* cl_sampler_info */ +#define CL_SAMPLER_REFERENCE_COUNT 0x1150 +#define CL_SAMPLER_CONTEXT 0x1151 +#define CL_SAMPLER_NORMALIZED_COORDS 0x1152 +#define CL_SAMPLER_ADDRESSING_MODE 0x1153 +#define CL_SAMPLER_FILTER_MODE 0x1154 + +/* cl_map_flags - bitfield */ +#define CL_MAP_READ (1 << 0) +#define CL_MAP_WRITE (1 << 1) + +/* cl_program_info */ +#define CL_PROGRAM_REFERENCE_COUNT 0x1160 +#define CL_PROGRAM_CONTEXT 0x1161 +#define CL_PROGRAM_NUM_DEVICES 0x1162 +#define CL_PROGRAM_DEVICES 0x1163 +#define CL_PROGRAM_SOURCE 0x1164 +#define CL_PROGRAM_BINARY_SIZES 0x1165 +#define CL_PROGRAM_BINARIES 0x1166 + +/* cl_program_build_info */ +#define CL_PROGRAM_BUILD_STATUS 0x1181 +#define CL_PROGRAM_BUILD_OPTIONS 0x1182 +#define CL_PROGRAM_BUILD_LOG 0x1183 + +/* cl_build_status */ +#define CL_BUILD_SUCCESS 0 +#define CL_BUILD_NONE -1 +#define CL_BUILD_ERROR -2 +#define CL_BUILD_IN_PROGRESS -3 + +/* cl_kernel_info */ +#define CL_KERNEL_FUNCTION_NAME 0x1190 +#define CL_KERNEL_NUM_ARGS 0x1191 +#define CL_KERNEL_REFERENCE_COUNT 0x1192 +#define CL_KERNEL_CONTEXT 0x1193 +#define CL_KERNEL_PROGRAM 0x1194 + +/* cl_kernel_work_group_info */ +#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 +#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 +#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 +#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 +#define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4 + +/* cl_event_info */ +#define CL_EVENT_COMMAND_QUEUE 0x11D0 +#define CL_EVENT_COMMAND_TYPE 0x11D1 +#define CL_EVENT_REFERENCE_COUNT 0x11D2 +#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 +#define CL_EVENT_CONTEXT 0x11D4 + +/* cl_command_type */ +#define CL_COMMAND_NDRANGE_KERNEL 0x11F0 +#define CL_COMMAND_TASK 0x11F1 +#define CL_COMMAND_NATIVE_KERNEL 0x11F2 +#define CL_COMMAND_READ_BUFFER 0x11F3 +#define CL_COMMAND_WRITE_BUFFER 0x11F4 +#define CL_COMMAND_COPY_BUFFER 0x11F5 +#define CL_COMMAND_READ_IMAGE 0x11F6 +#define CL_COMMAND_WRITE_IMAGE 0x11F7 +#define CL_COMMAND_COPY_IMAGE 0x11F8 +#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 +#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA +#define CL_COMMAND_MAP_BUFFER 0x11FB +#define CL_COMMAND_MAP_IMAGE 0x11FC +#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD +#define CL_COMMAND_MARKER 0x11FE +#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF +#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 +#define CL_COMMAND_READ_BUFFER_RECT 0x1201 +#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 +#define CL_COMMAND_COPY_BUFFER_RECT 0x1203 +#define CL_COMMAND_USER 0x1204 + +/* command execution status */ +#define CL_COMPLETE 0x0 +#define CL_RUNNING 0x1 +#define CL_SUBMITTED 0x2 +#define CL_QUEUED 0x3 + +/* cl_buffer_create_type */ +#define CL_BUFFER_CREATE_TYPE_REGION 0x1220 + +/* cl_profiling_info */ +#define CL_PROFILING_COMMAND_QUEUED 0x1280 +#define CL_PROFILING_COMMAND_SUBMIT 0x1281 +#define CL_PROFILING_COMMAND_START 0x1282 +#define CL_PROFILING_COMMAND_END 0x1283 + +/********************************************************************************************************/ + +/* Platform API */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetPlatformIDs(cl_uint /* num_entries */, + cl_platform_id * /* platforms */, + cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetPlatformInfo(cl_platform_id /* platform */, + cl_platform_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Device APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceIDs(cl_platform_id /* platform */, + cl_device_type /* device_type */, + cl_uint /* num_entries */, + cl_device_id * /* devices */, + cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetDeviceInfo(cl_device_id /* device */, + cl_device_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Context APIs */ +extern CL_API_ENTRY cl_context CL_API_CALL +clCreateContext(const cl_context_properties * /* properties */, + cl_uint /* num_devices */, + const cl_device_id * /* devices */, + void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *), + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_context CL_API_CALL +clCreateContextFromType(const cl_context_properties * /* properties */, + cl_device_type /* device_type */, + void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *), + void * /* user_data */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseContext(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetContextInfo(cl_context /* context */, + cl_context_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Command Queue APIs */ +extern CL_API_ENTRY cl_command_queue CL_API_CALL +clCreateCommandQueue(cl_context /* context */, + cl_device_id /* device */, + cl_command_queue_properties /* properties */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseCommandQueue(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetCommandQueueInfo(cl_command_queue /* command_queue */, + cl_command_queue_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS +#warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1! +/* + * WARNING: + * This API introduces mutable state into the OpenCL implementation. It has been REMOVED + * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the + * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably. + * It is likely to be non-performant. Use of this API is not advised. Use at your own risk. + * + * Software developers previously relying on this API are instructed to set the command queue + * properties when creating the queue, instead. + */ +extern CL_API_ENTRY cl_int CL_API_CALL +clSetCommandQueueProperty(cl_command_queue /* command_queue */, + cl_command_queue_properties /* properties */, + cl_bool /* enable */, + cl_command_queue_properties * /* old_properties */) CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED; +#endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */ + +/* Memory Object APIs */ +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateBuffer(cl_context /* context */, + cl_mem_flags /* flags */, + size_t /* size */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateSubBuffer(cl_mem /* buffer */, + cl_mem_flags /* flags */, + cl_buffer_create_type /* buffer_create_type */, + const void * /* buffer_create_info */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateImage2D(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_row_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateImage3D(cl_context /* context */, + cl_mem_flags /* flags */, + const cl_image_format * /* image_format */, + size_t /* image_width */, + size_t /* image_height */, + size_t /* image_depth */, + size_t /* image_row_pitch */, + size_t /* image_slice_pitch */, + void * /* host_ptr */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseMemObject(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetSupportedImageFormats(cl_context /* context */, + cl_mem_flags /* flags */, + cl_mem_object_type /* image_type */, + cl_uint /* num_entries */, + cl_image_format * /* image_formats */, + cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetMemObjectInfo(cl_mem /* memobj */, + cl_mem_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetImageInfo(cl_mem /* image */, + cl_image_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetMemObjectDestructorCallback( cl_mem /* memobj */, + void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), + void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1; + +/* Sampler APIs */ +extern CL_API_ENTRY cl_sampler CL_API_CALL +clCreateSampler(cl_context /* context */, + cl_bool /* normalized_coords */, + cl_addressing_mode /* addressing_mode */, + cl_filter_mode /* filter_mode */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseSampler(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetSamplerInfo(cl_sampler /* sampler */, + cl_sampler_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Program Object APIs */ +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithSource(cl_context /* context */, + cl_uint /* count */, + const char ** /* strings */, + const size_t * /* lengths */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_program CL_API_CALL +clCreateProgramWithBinary(cl_context /* context */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const size_t * /* lengths */, + const unsigned char ** /* binaries */, + cl_int * /* binary_status */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseProgram(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clBuildProgram(cl_program /* program */, + cl_uint /* num_devices */, + const cl_device_id * /* device_list */, + const char * /* options */, + void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clUnloadCompiler(void) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetProgramInfo(cl_program /* program */, + cl_program_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetProgramBuildInfo(cl_program /* program */, + cl_device_id /* device */, + cl_program_build_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Kernel Object APIs */ +extern CL_API_ENTRY cl_kernel CL_API_CALL +clCreateKernel(cl_program /* program */, + const char * /* kernel_name */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clCreateKernelsInProgram(cl_program /* program */, + cl_uint /* num_kernels */, + cl_kernel * /* kernels */, + cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseKernel(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetKernelArg(cl_kernel /* kernel */, + cl_uint /* arg_index */, + size_t /* arg_size */, + const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelInfo(cl_kernel /* kernel */, + cl_kernel_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetKernelWorkGroupInfo(cl_kernel /* kernel */, + cl_device_id /* device */, + cl_kernel_work_group_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Event Object APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clWaitForEvents(cl_uint /* num_events */, + const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetEventInfo(cl_event /* event */, + cl_event_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_event CL_API_CALL +clCreateUserEvent(cl_context /* context */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clRetainEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clReleaseEvent(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetUserEventStatus(cl_event /* event */, + cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clSetEventCallback( cl_event /* event */, + cl_int /* command_exec_callback_type */, + void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), + void * /* user_data */) CL_API_SUFFIX__VERSION_1_1; + +/* Profiling APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clGetEventProfilingInfo(cl_event /* event */, + cl_profiling_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +/* Flush and Finish APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clFlush(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clFinish(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +/* Enqueued Commands APIs */ +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadBuffer(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_read */, + size_t /* offset */, + size_t /* cb */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadBufferRect(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_read */, + const size_t * /* buffer_origin */, + const size_t * /* host_origin */, + const size_t * /* region */, + size_t /* buffer_row_pitch */, + size_t /* buffer_slice_pitch */, + size_t /* host_row_pitch */, + size_t /* host_slice_pitch */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteBuffer(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_write */, + size_t /* offset */, + size_t /* cb */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteBufferRect(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_write */, + const size_t * /* buffer_origin */, + const size_t * /* host_origin */, + const size_t * /* region */, + size_t /* buffer_row_pitch */, + size_t /* buffer_slice_pitch */, + size_t /* host_row_pitch */, + size_t /* host_slice_pitch */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBuffer(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_buffer */, + size_t /* src_offset */, + size_t /* dst_offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBufferRect(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_buffer */, + const size_t * /* src_origin */, + const size_t * /* dst_origin */, + const size_t * /* region */, + size_t /* src_row_pitch */, + size_t /* src_slice_pitch */, + size_t /* dst_row_pitch */, + size_t /* dst_slice_pitch */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReadImage(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_read */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* row_pitch */, + size_t /* slice_pitch */, + void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWriteImage(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_write */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t /* input_row_pitch */, + size_t /* input_slice_pitch */, + const void * /* ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyImage(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_image */, + const size_t * /* src_origin[3] */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyImageToBuffer(cl_command_queue /* command_queue */, + cl_mem /* src_image */, + cl_mem /* dst_buffer */, + const size_t * /* src_origin[3] */, + const size_t * /* region[3] */, + size_t /* dst_offset */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueCopyBufferToImage(cl_command_queue /* command_queue */, + cl_mem /* src_buffer */, + cl_mem /* dst_image */, + size_t /* src_offset */, + const size_t * /* dst_origin[3] */, + const size_t * /* region[3] */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY void * CL_API_CALL +clEnqueueMapBuffer(cl_command_queue /* command_queue */, + cl_mem /* buffer */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + size_t /* offset */, + size_t /* cb */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY void * CL_API_CALL +clEnqueueMapImage(cl_command_queue /* command_queue */, + cl_mem /* image */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + const size_t * /* origin[3] */, + const size_t * /* region[3] */, + size_t * /* image_row_pitch */, + size_t * /* image_slice_pitch */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueUnmapMemObject(cl_command_queue /* command_queue */, + cl_mem /* memobj */, + void * /* mapped_ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueNDRangeKernel(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* work_dim */, + const size_t * /* global_work_offset */, + const size_t * /* global_work_size */, + const size_t * /* local_work_size */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueTask(cl_command_queue /* command_queue */, + cl_kernel /* kernel */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueNativeKernel(cl_command_queue /* command_queue */, + void (*user_func)(void *), + void * /* args */, + size_t /* cb_args */, + cl_uint /* num_mem_objects */, + const cl_mem * /* mem_list */, + const void ** /* args_mem_loc */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueMarker(cl_command_queue /* command_queue */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueWaitForEvents(cl_command_queue /* command_queue */, + cl_uint /* num_events */, + const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueBarrier(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; + +/* Extension function access + * + * Returns the extension function address for the given function name, + * or NULL if a valid function can not be found. The client must + * check to make sure the address is not NULL, before using or + * calling the returned function address. + */ +extern CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_H */ + diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl_d3d10.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl_d3d10.h new file mode 100644 index 0000000..374d507 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl_d3d10.h @@ -0,0 +1,126 @@ +/********************************************************************************** + * Copyright (c) 2008-2010 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. + **********************************************************************************/ + +/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ + +#ifndef __OPENCL_CL_D3D10_H +#define __OPENCL_CL_D3D10_H + +#include <d3d10.h> +#include <CL/cl.h> +#include <CL/cl_platform.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * cl_khr_d3d10_sharing */ +#define cl_khr_d3d10_sharing 1 + +typedef cl_uint cl_d3d10_device_source_khr; +typedef cl_uint cl_d3d10_device_set_khr; + +/******************************************************************************/ + +// Error Codes +#define CL_INVALID_D3D10_DEVICE_KHR -1002 +#define CL_INVALID_D3D10_RESOURCE_KHR -1003 +#define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004 +#define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005 + +// cl_d3d10_device_source_nv +#define CL_D3D10_DEVICE_KHR 0x4010 +#define CL_D3D10_DXGI_ADAPTER_KHR 0x4011 + +// cl_d3d10_device_set_nv +#define CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012 +#define CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013 + +// cl_context_info +#define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014 +#define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C + +// cl_mem_info +#define CL_MEM_D3D10_RESOURCE_KHR 0x4015 + +// cl_image_info +#define CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016 + +// cl_command_type +#define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017 +#define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018 + +/******************************************************************************/ + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D10KHR_fn)( + cl_platform_id platform, + cl_d3d10_device_source_khr d3d_device_source, + void * d3d_object, + cl_d3d10_device_set_khr d3d_device_set, + cl_uint num_entries, + cl_device_id * devices, + cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10BufferKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Buffer * resource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture2DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Texture2D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture3DKHR_fn)( + cl_context context, + cl_mem_flags flags, + ID3D10Texture3D * resource, + UINT subresource, + cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D10ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + const cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)( + cl_command_queue command_queue, + cl_uint num_objects, + cl_mem * mem_objects, + cl_uint num_events_in_wait_list, + const cl_event * event_wait_list, + cl_event * event) CL_API_SUFFIX__VERSION_1_0; + +#ifdef __cplusplus +} +#endif + +#endif // __OPENCL_CL_D3D10_H + diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl_ext.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl_ext.h new file mode 100644 index 0000000..59e11e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl_ext.h @@ -0,0 +1,213 @@ +/******************************************************************************* + * Copyright (c) 2008-2010 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. + ******************************************************************************/ + +/* $Revision: 11928 $ on $Date: 2010-07-13 09:04:56 -0700 (Tue, 13 Jul 2010) $ */ + +/* cl_ext.h contains OpenCL extensions which don't have external */ +/* (OpenGL, D3D) dependencies. */ + +#ifndef __CL_EXT_H +#define __CL_EXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __APPLE__ + #include <OpenCL/cl.h> + #include <AvailabilityMacros.h> +#else + #include <CL/cl.h> +#endif + +/* cl_khr_fp64 extension - no extension #define since it has no functions */ +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 + +/* cl_khr_fp16 extension - no extension #define since it has no functions */ +#define CL_DEVICE_HALF_FP_CONFIG 0x1033 + +/* Memory object destruction + * + * Apple extension for use to manage externally allocated buffers used with cl_mem objects with CL_MEM_USE_HOST_PTR + * + * Registers a user callback function that will be called when the memory object is deleted and its resources + * freed. Each call to clSetMemObjectCallbackFn registers the specified user callback function on a callback + * stack associated with memobj. The registered user callback functions are called in the reverse order in + * which they were registered. The user callback functions are called and then the memory object is deleted + * and its resources freed. This provides a mechanism for the application (and libraries) using memobj to be + * notified when the memory referenced by host_ptr, specified when the memory object is created and used as + * the storage bits for the memory object, can be reused or freed. + * + * The application may not call CL api's with the cl_mem object passed to the pfn_notify. + * + * Please check for the "cl_APPLE_SetMemObjectDestructor" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) + * before using. + */ +#define cl_APPLE_SetMemObjectDestructor 1 +cl_int CL_API_ENTRY clSetMemObjectDestructorAPPLE( cl_mem /* memobj */, + void (* /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), + void * /*user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; + + +/* Context Logging Functions + * + * The next three convenience functions are intended to be used as the pfn_notify parameter to clCreateContext(). + * Please check for the "cl_APPLE_ContextLoggingFunctions" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS) + * before using. + * + * clLogMessagesToSystemLog fowards on all log messages to the Apple System Logger + */ +#define cl_APPLE_ContextLoggingFunctions 1 +extern void CL_API_ENTRY clLogMessagesToSystemLogAPPLE( const char * /* errstr */, + const void * /* private_info */, + size_t /* cb */, + void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; + +/* clLogMessagesToStdout sends all log messages to the file descriptor stdout */ +extern void CL_API_ENTRY clLogMessagesToStdoutAPPLE( const char * /* errstr */, + const void * /* private_info */, + size_t /* cb */, + void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; + +/* clLogMessagesToStderr sends all log messages to the file descriptor stderr */ +extern void CL_API_ENTRY clLogMessagesToStderrAPPLE( const char * /* errstr */, + const void * /* private_info */, + size_t /* cb */, + void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0; + + +/************************ +* cl_khr_icd extension * +************************/ +#define cl_khr_icd 1 + +/* cl_platform_info */ +#define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920 + +/* Additional Error Codes */ +#define CL_PLATFORM_NOT_FOUND_KHR -1001 + +extern CL_API_ENTRY cl_int CL_API_CALL +clIcdGetPlatformIDsKHR(cl_uint /* num_entries */, + cl_platform_id * /* platforms */, + cl_uint * /* num_platforms */); + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clIcdGetPlatformIDsKHR_fn)( + cl_uint /* num_entries */, + cl_platform_id * /* platforms */, + cl_uint * /* num_platforms */); + + +/****************************************** +* cl_nv_device_attribute_query extension * +******************************************/ +/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */ +#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000 +#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001 +#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002 +#define CL_DEVICE_WARP_SIZE_NV 0x4003 +#define CL_DEVICE_GPU_OVERLAP_NV 0x4004 +#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005 +#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006 + + +/********************************* +* cl_amd_device_attribute_query * +*********************************/ +#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036 + + +#ifdef CL_VERSION_1_1 + /*********************************** + * cl_ext_device_fission extension * + ***********************************/ + #define cl_ext_device_fission 1 + + extern CL_API_ENTRY cl_int CL_API_CALL + clReleaseDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + typedef CL_API_ENTRY cl_int + (CL_API_CALL *clReleaseDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + extern CL_API_ENTRY cl_int CL_API_CALL + clRetainDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + typedef CL_API_ENTRY cl_int + (CL_API_CALL *clRetainDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + typedef cl_ulong cl_device_partition_property_ext; + extern CL_API_ENTRY cl_int CL_API_CALL + clCreateSubDevicesEXT( cl_device_id /*in_device*/, + const cl_device_partition_property_ext * /* properties */, + cl_uint /*num_entries*/, + cl_device_id * /*out_devices*/, + cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + typedef CL_API_ENTRY cl_int + ( CL_API_CALL * clCreateSubDevicesEXT_fn)( cl_device_id /*in_device*/, + const cl_device_partition_property_ext * /* properties */, + cl_uint /*num_entries*/, + cl_device_id * /*out_devices*/, + cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; + + /* cl_device_partition_property_ext */ + #define CL_DEVICE_PARTITION_EQUALLY_EXT 0x4050 + #define CL_DEVICE_PARTITION_BY_COUNTS_EXT 0x4051 + #define CL_DEVICE_PARTITION_BY_NAMES_EXT 0x4052 + #define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT 0x4053 + + /* clDeviceGetInfo selectors */ + #define CL_DEVICE_PARENT_DEVICE_EXT 0x4054 + #define CL_DEVICE_PARTITION_TYPES_EXT 0x4055 + #define CL_DEVICE_AFFINITY_DOMAINS_EXT 0x4056 + #define CL_DEVICE_REFERENCE_COUNT_EXT 0x4057 + #define CL_DEVICE_PARTITION_STYLE_EXT 0x4058 + + /* error codes */ + #define CL_DEVICE_PARTITION_FAILED_EXT -1057 + #define CL_INVALID_PARTITION_COUNT_EXT -1058 + #define CL_INVALID_PARTITION_NAME_EXT -1059 + + /* CL_AFFINITY_DOMAINs */ + #define CL_AFFINITY_DOMAIN_L1_CACHE_EXT 0x1 + #define CL_AFFINITY_DOMAIN_L2_CACHE_EXT 0x2 + #define CL_AFFINITY_DOMAIN_L3_CACHE_EXT 0x3 + #define CL_AFFINITY_DOMAIN_L4_CACHE_EXT 0x4 + #define CL_AFFINITY_DOMAIN_NUMA_EXT 0x10 + #define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT 0x100 + + /* cl_device_partition_property_ext list terminators */ + #define CL_PROPERTIES_LIST_END_EXT ((cl_device_partition_property_ext) 0) + #define CL_PARTITION_BY_COUNTS_LIST_END_EXT ((cl_device_partition_property_ext) 0) + #define CL_PARTITION_BY_NAMES_LIST_END_EXT ((cl_device_partition_property_ext) 0 - 1) + + + +#endif /* CL_VERSION_1_1 */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __CL_EXT_H */ diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl.h new file mode 100644 index 0000000..e296bc8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl.h @@ -0,0 +1,155 @@ +/********************************************************************************** + * Copyright (c) 2008-2010 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. + **********************************************************************************/ + +/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ + +/* + * cl_gl.h contains Khronos-approved (KHR) OpenCL extensions which have + * OpenGL dependencies. The application is responsible for #including + * OpenGL or OpenGL ES headers before #including cl_gl.h. + */ + +#ifndef __OPENCL_CL_GL_H +#define __OPENCL_CL_GL_H + +#ifdef __APPLE__ +#include <OpenCL/cl.h> +#include <OpenGL/CGLDevice.h> +#else +#include <CL/cl.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef cl_uint cl_gl_object_type; +typedef cl_uint cl_gl_texture_info; +typedef cl_uint cl_gl_platform_info; +typedef struct __GLsync *cl_GLsync; + +/* cl_gl_object_type */ +#define CL_GL_OBJECT_BUFFER 0x2000 +#define CL_GL_OBJECT_TEXTURE2D 0x2001 +#define CL_GL_OBJECT_TEXTURE3D 0x2002 +#define CL_GL_OBJECT_RENDERBUFFER 0x2003 + +/* cl_gl_texture_info */ +#define CL_GL_TEXTURE_TARGET 0x2004 +#define CL_GL_MIPMAP_LEVEL 0x2005 + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLBuffer(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLuint /* bufobj */, + int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLTexture2D(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLenum /* target */, + cl_GLint /* miplevel */, + cl_GLuint /* texture */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLTexture3D(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLenum /* target */, + cl_GLint /* miplevel */, + cl_GLuint /* texture */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateFromGLRenderbuffer(cl_context /* context */, + cl_mem_flags /* flags */, + cl_GLuint /* renderbuffer */, + cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLObjectInfo(cl_mem /* memobj */, + cl_gl_object_type * /* gl_object_type */, + cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLTextureInfo(cl_mem /* memobj */, + cl_gl_texture_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueAcquireGLObjects(cl_command_queue /* command_queue */, + cl_uint /* num_objects */, + const cl_mem * /* mem_objects */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +extern CL_API_ENTRY cl_int CL_API_CALL +clEnqueueReleaseGLObjects(cl_command_queue /* command_queue */, + cl_uint /* num_objects */, + const cl_mem * /* mem_objects */, + cl_uint /* num_events_in_wait_list */, + const cl_event * /* event_wait_list */, + cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; + +/* cl_khr_gl_sharing extension */ + +#define cl_khr_gl_sharing 1 + +typedef cl_uint cl_gl_context_info; + +/* Additional Error Codes */ +#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 + +/* cl_gl_context_info */ +#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006 +#define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007 + +/* Additional cl_context_properties */ +#define CL_GL_CONTEXT_KHR 0x2008 +#define CL_EGL_DISPLAY_KHR 0x2009 +#define CL_GLX_DISPLAY_KHR 0x200A +#define CL_WGL_HDC_KHR 0x200B +#define CL_CGL_SHAREGROUP_KHR 0x200C + +extern CL_API_ENTRY cl_int CL_API_CALL +clGetGLContextInfoKHR(const cl_context_properties * /* properties */, + cl_gl_context_info /* param_name */, + size_t /* param_value_size */, + void * /* param_value */, + size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)( + const cl_context_properties * properties, + cl_gl_context_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret); + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_GL_H */ diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl_ext.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl_ext.h new file mode 100644 index 0000000..670acb2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl_gl_ext.h @@ -0,0 +1,69 @@ +/********************************************************************************** + * Copyright (c) 2008-2010 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. + **********************************************************************************/ + +/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ + +/* cl_gl_ext.h contains vendor (non-KHR) OpenCL extensions which have */ +/* OpenGL dependencies. */ + +#ifndef __OPENCL_CL_GL_EXT_H +#define __OPENCL_CL_GL_EXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __APPLE__ + #include <OpenCL/cl_gl.h> +#else + #include <CL/cl_gl.h> +#endif + +/* + * For each extension, follow this template + * /* cl_VEN_extname extension */ +/* #define cl_VEN_extname 1 + * ... define new types, if any + * ... define new tokens, if any + * ... define new APIs, if any + * + * If you need GLtypes here, mirror them with a cl_GLtype, rather than including a GL header + * This allows us to avoid having to decide whether to include GL headers or GLES here. + */ + +/* + * cl_khr_gl_event extension + * See section 9.9 in the OpenCL 1.1 spec for more information + */ +#define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR 0x200D + +extern CL_API_ENTRY cl_event CL_API_CALL +clCreateEventFromGLsyncKHR(cl_context /* context */, + cl_GLsync /* cl_GLsync */, + cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1; + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_CL_GL_EXT_H */ diff --git a/etc/lwjgl-2.9.1/src/native/common/CL/cl_platform.h b/etc/lwjgl-2.9.1/src/native/common/CL/cl_platform.h new file mode 100644 index 0000000..b87fba3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/CL/cl_platform.h @@ -0,0 +1,1198 @@ +/********************************************************************************** + * Copyright (c) 2008-2010 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. + **********************************************************************************/ + +/* $Revision: 11803 $ on $Date: 2010-06-25 10:02:12 -0700 (Fri, 25 Jun 2010) $ */ + +#ifndef __CL_PLATFORM_H +#define __CL_PLATFORM_H + +#ifdef __APPLE__ + /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ + #include <AvailabilityMacros.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) + #define CL_API_ENTRY + #define CL_API_CALL __stdcall + #define CL_CALLBACK __stdcall +#else + #define CL_API_ENTRY + #define CL_API_CALL + #define CL_CALLBACK +#endif + +#ifdef __APPLE__ + #define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) + #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER + #define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK + #define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#else + #define CL_EXTENSION_WEAK_LINK + #define CL_API_SUFFIX__VERSION_1_0 + #define CL_EXT_SUFFIX__VERSION_1_0 + #define CL_API_SUFFIX__VERSION_1_1 + #define CL_EXT_SUFFIX__VERSION_1_1 + #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED +#endif + +#if (defined (_WIN32) && defined(_MSC_VER)) + +/* scalar types */ +typedef signed __int8 cl_char; +typedef unsigned __int8 cl_uchar; +typedef signed __int16 cl_short; +typedef unsigned __int16 cl_ushort; +typedef signed __int32 cl_int; +typedef unsigned __int32 cl_uint; +typedef signed __int64 cl_long; +typedef unsigned __int64 cl_ulong; + +typedef unsigned __int16 cl_half; +typedef float cl_float; +typedef double cl_double; + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 340282346638528859811704183484516925440.0f +#define CL_FLT_MIN 1.175494350822287507969e-38f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 +#define CL_DBL_MIN 2.225073858507201383090e-308 +#define CL_DBL_EPSILON 2.220446049250313080847e-16 + +#define CL_M_E 2.718281828459045090796 +#define CL_M_LOG2E 1.442695040888963387005 +#define CL_M_LOG10E 0.434294481903251816668 +#define CL_M_LN2 0.693147180559945286227 +#define CL_M_LN10 2.302585092994045901094 +#define CL_M_PI 3.141592653589793115998 +#define CL_M_PI_2 1.570796326794896557999 +#define CL_M_PI_4 0.785398163397448278999 +#define CL_M_1_PI 0.318309886183790691216 +#define CL_M_2_PI 0.636619772367581382433 +#define CL_M_2_SQRTPI 1.128379167095512558561 +#define CL_M_SQRT2 1.414213562373095145475 +#define CL_M_SQRT1_2 0.707106781186547572737 + +#define CL_M_E_F 2.71828174591064f +#define CL_M_LOG2E_F 1.44269502162933f +#define CL_M_LOG10E_F 0.43429449200630f +#define CL_M_LN2_F 0.69314718246460f +#define CL_M_LN10_F 2.30258512496948f +#define CL_M_PI_F 3.14159274101257f +#define CL_M_PI_2_F 1.57079637050629f +#define CL_M_PI_4_F 0.78539818525314f +#define CL_M_1_PI_F 0.31830987334251f +#define CL_M_2_PI_F 0.63661974668503f +#define CL_M_2_SQRTPI_F 1.12837922573090f +#define CL_M_SQRT2_F 1.41421353816986f +#define CL_M_SQRT1_2_F 0.70710676908493f + +#define CL_NAN (CL_INFINITY - CL_INFINITY) +#define CL_HUGE_VALF ((cl_float) 1e50) +#define CL_HUGE_VAL ((cl_double) 1e500) +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#else + +#include <stdint.h> + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short __attribute__((aligned(2))); +typedef uint16_t cl_ushort __attribute__((aligned(2))); +typedef int32_t cl_int __attribute__((aligned(4))); +typedef uint32_t cl_uint __attribute__((aligned(4))); +typedef int64_t cl_long __attribute__((aligned(8))); +typedef uint64_t cl_ulong __attribute__((aligned(8))); + +typedef uint16_t cl_half __attribute__((aligned(2))); +typedef float cl_float __attribute__((aligned(4))); +typedef double cl_double __attribute__((aligned(8))); + +/* Macro names and corresponding values defined by OpenCL */ +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 0x1.fffffep127f +#define CL_FLT_MIN 0x1.0p-126f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 0x1.fffffffffffffp1023 +#define CL_DBL_MIN 0x1.0p-1022 +#define CL_DBL_EPSILON 0x1.0p-52 + +#define CL_M_E 2.718281828459045090796 +#define CL_M_LOG2E 1.442695040888963387005 +#define CL_M_LOG10E 0.434294481903251816668 +#define CL_M_LN2 0.693147180559945286227 +#define CL_M_LN10 2.302585092994045901094 +#define CL_M_PI 3.141592653589793115998 +#define CL_M_PI_2 1.570796326794896557999 +#define CL_M_PI_4 0.785398163397448278999 +#define CL_M_1_PI 0.318309886183790691216 +#define CL_M_2_PI 0.636619772367581382433 +#define CL_M_2_SQRTPI 1.128379167095512558561 +#define CL_M_SQRT2 1.414213562373095145475 +#define CL_M_SQRT1_2 0.707106781186547572737 + +#define CL_M_E_F 2.71828174591064f +#define CL_M_LOG2E_F 1.44269502162933f +#define CL_M_LOG10E_F 0.43429449200630f +#define CL_M_LN2_F 0.69314718246460f +#define CL_M_LN10_F 2.30258512496948f +#define CL_M_PI_F 3.14159274101257f +#define CL_M_PI_2_F 1.57079637050629f +#define CL_M_PI_4_F 0.78539818525314f +#define CL_M_1_PI_F 0.31830987334251f +#define CL_M_2_PI_F 0.63661974668503f +#define CL_M_2_SQRTPI_F 1.12837922573090f +#define CL_M_SQRT2_F 1.41421353816986f +#define CL_M_SQRT1_2_F 0.70710676908493f + +#if defined( __GNUC__ ) + #define CL_HUGE_VALF __builtin_huge_valf() + #define CL_HUGE_VAL __builtin_huge_val() + #define CL_NAN __builtin_nanf( "" ) +#else + #define CL_HUGE_VALF ((cl_float) 1e50) + #define CL_HUGE_VAL ((cl_double) 1e500) + float nanf( const char * ); + #define CL_NAN nanf( "" ) +#endif +#define CL_MAXFLOAT CL_FLT_MAX +#define CL_INFINITY CL_HUGE_VALF + +#endif + +#include <stddef.h> + +/* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */ +typedef unsigned int cl_GLuint; +typedef int cl_GLint; +typedef unsigned int cl_GLenum; + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ + +/* Define basic vector types */ +#if defined( __VEC__ ) + #include <altivec.h> /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */ + typedef vector unsigned char __cl_uchar16; + typedef vector signed char __cl_char16; + typedef vector unsigned short __cl_ushort8; + typedef vector signed short __cl_short8; + typedef vector unsigned int __cl_uint4; + typedef vector signed int __cl_int4; + typedef vector float __cl_float4; + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_UINT4__ 1 + #define __CL_INT4__ 1 + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE__ ) + #if defined( __MINGW64__ ) + #include <intrin.h> + #else + #include <xmmintrin.h> + #endif + #if defined( __GNUC__ ) + typedef float __cl_float4 __attribute__((vector_size(16))); + #else + typedef __m128 __cl_float4; + #endif + #define __CL_FLOAT4__ 1 +#endif + +#if defined( __SSE2__ ) + #if defined( __MINGW64__ ) + #include <intrin.h> + #else + #include <emmintrin.h> + #endif + #if defined( __GNUC__ ) + typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16))); + typedef cl_char __cl_char16 __attribute__((vector_size(16))); + typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16))); + typedef cl_short __cl_short8 __attribute__((vector_size(16))); + typedef cl_uint __cl_uint4 __attribute__((vector_size(16))); + typedef cl_int __cl_int4 __attribute__((vector_size(16))); + typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16))); + typedef cl_long __cl_long2 __attribute__((vector_size(16))); + typedef cl_double __cl_double2 __attribute__((vector_size(16))); + #else + typedef __m128i __cl_uchar16; + typedef __m128i __cl_char16; + typedef __m128i __cl_ushort8; + typedef __m128i __cl_short8; + typedef __m128i __cl_uint4; + typedef __m128i __cl_int4; + typedef __m128i __cl_ulong2; + typedef __m128i __cl_long2; + typedef __m128d __cl_double2; + #endif + #define __CL_UCHAR16__ 1 + #define __CL_CHAR16__ 1 + #define __CL_USHORT8__ 1 + #define __CL_SHORT8__ 1 + #define __CL_INT4__ 1 + #define __CL_UINT4__ 1 + #define __CL_ULONG2__ 1 + #define __CL_LONG2__ 1 + #define __CL_DOUBLE2__ 1 +#endif + +#if defined( __MMX__ ) + #include <mmintrin.h> + #if defined( __GNUC__ ) + typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8))); + typedef cl_char __cl_char8 __attribute__((vector_size(8))); + typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8))); + typedef cl_short __cl_short4 __attribute__((vector_size(8))); + typedef cl_uint __cl_uint2 __attribute__((vector_size(8))); + typedef cl_int __cl_int2 __attribute__((vector_size(8))); + typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8))); + typedef cl_long __cl_long1 __attribute__((vector_size(8))); + typedef cl_float __cl_float2 __attribute__((vector_size(8))); + #else + typedef __m64 __cl_uchar8; + typedef __m64 __cl_char8; + typedef __m64 __cl_ushort4; + typedef __m64 __cl_short4; + typedef __m64 __cl_uint2; + typedef __m64 __cl_int2; + typedef __m64 __cl_ulong1; + typedef __m64 __cl_long1; + typedef __m64 __cl_float2; + #endif + #define __CL_UCHAR8__ 1 + #define __CL_CHAR8__ 1 + #define __CL_USHORT4__ 1 + #define __CL_SHORT4__ 1 + #define __CL_INT2__ 1 + #define __CL_UINT2__ 1 + #define __CL_ULONG1__ 1 + #define __CL_LONG1__ 1 + #define __CL_FLOAT2__ 1 +#endif + +#if defined( __AVX__ ) + #if defined( __MINGW64__ ) + #include <intrin.h> + #else + #include <immintrin.h> + #endif + #if defined( __GNUC__ ) + typedef cl_float __cl_float8 __attribute__((vector_size(32))); + typedef cl_double __cl_double4 __attribute__((vector_size(32))); + #else + typedef __m256 __cl_float8; + typedef __m256d __cl_double4; + #endif + #define __CL_FLOAT8__ 1 + #define __CL_DOUBLE4__ 1 +#endif + +/* Define alignment keys */ +#if defined( __GNUC__ ) + #define CL_ALIGNED(_x) __attribute__ ((aligned(_x))) +#elif defined( _WIN32) && (_MSC_VER) + /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */ + /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */ + /* #include <crtdefs.h> */ + /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */ + #define CL_ALIGNED(_x) +#else + #warning Need to implement some method to align data here + #define CL_ALIGNED(_x) +#endif + +/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */ +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + /* .xyzw and .s0123...{f|F} are supported */ + #define CL_HAS_NAMED_VECTOR_FIELDS 1 + /* .hi and .lo are supported */ + #define CL_HAS_HI_LO_VECTOR_FIELDS 1 +#endif + +/* Define cl_vector types */ + +/* ---- cl_charn ---- */ +typedef union +{ + cl_char CL_ALIGNED(2) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_char x, y; }; + __extension__ struct{ cl_char s0, s1; }; + __extension__ struct{ cl_char lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2; +#endif +}cl_char2; + +typedef union +{ + cl_char CL_ALIGNED(4) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_char x, y, z, w; }; + __extension__ struct{ cl_char s0, s1, s2, s3; }; + __extension__ struct{ cl_char2 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[2]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4; +#endif +}cl_char4; + +/* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */ +typedef cl_char4 cl_char3; + +typedef union +{ + cl_char CL_ALIGNED(8) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_char x, y, z, w; }; + __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_char4 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[4]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[2]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8; +#endif +}cl_char8; + +typedef union +{ + cl_char CL_ALIGNED(16) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_char8 lo, hi; }; +#endif +#if defined( __CL_CHAR2__) + __cl_char2 v2[8]; +#endif +#if defined( __CL_CHAR4__) + __cl_char4 v4[4]; +#endif +#if defined( __CL_CHAR8__ ) + __cl_char8 v8[2]; +#endif +#if defined( __CL_CHAR16__ ) + __cl_char16 v16; +#endif +}cl_char16; + + +/* ---- cl_ucharn ---- */ +typedef union +{ + cl_uchar CL_ALIGNED(2) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uchar x, y; }; + __extension__ struct{ cl_uchar s0, s1; }; + __extension__ struct{ cl_uchar lo, hi; }; +#endif +#if defined( __cl_uchar2__) + __cl_uchar2 v2; +#endif +}cl_uchar2; + +typedef union +{ + cl_uchar CL_ALIGNED(4) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uchar x, y, z, w; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3; }; + __extension__ struct{ cl_uchar2 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[2]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4; +#endif +}cl_uchar4; + +/* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */ +typedef cl_uchar4 cl_uchar3; + +typedef union +{ + cl_uchar CL_ALIGNED(8) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uchar x, y, z, w; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_uchar4 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[4]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[2]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8; +#endif +}cl_uchar8; + +typedef union +{ + cl_uchar CL_ALIGNED(16) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_uchar8 lo, hi; }; +#endif +#if defined( __CL_UCHAR2__) + __cl_uchar2 v2[8]; +#endif +#if defined( __CL_UCHAR4__) + __cl_uchar4 v4[4]; +#endif +#if defined( __CL_UCHAR8__ ) + __cl_uchar8 v8[2]; +#endif +#if defined( __CL_UCHAR16__ ) + __cl_uchar16 v16; +#endif +}cl_uchar16; + + +/* ---- cl_shortn ---- */ +typedef union +{ + cl_short CL_ALIGNED(4) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_short x, y; }; + __extension__ struct{ cl_short s0, s1; }; + __extension__ struct{ cl_short lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2; +#endif +}cl_short2; + +typedef union +{ + cl_short CL_ALIGNED(8) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_short x, y, z, w; }; + __extension__ struct{ cl_short s0, s1, s2, s3; }; + __extension__ struct{ cl_short2 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[2]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4; +#endif +}cl_short4; + +/* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */ +typedef cl_short4 cl_short3; + +typedef union +{ + cl_short CL_ALIGNED(16) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_short x, y, z, w; }; + __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_short4 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[4]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[2]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8; +#endif +}cl_short8; + +typedef union +{ + cl_short CL_ALIGNED(32) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_short8 lo, hi; }; +#endif +#if defined( __CL_SHORT2__) + __cl_short2 v2[8]; +#endif +#if defined( __CL_SHORT4__) + __cl_short4 v4[4]; +#endif +#if defined( __CL_SHORT8__ ) + __cl_short8 v8[2]; +#endif +#if defined( __CL_SHORT16__ ) + __cl_short16 v16; +#endif +}cl_short16; + + +/* ---- cl_ushortn ---- */ +typedef union +{ + cl_ushort CL_ALIGNED(4) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ushort x, y; }; + __extension__ struct{ cl_ushort s0, s1; }; + __extension__ struct{ cl_ushort lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2; +#endif +}cl_ushort2; + +typedef union +{ + cl_ushort CL_ALIGNED(8) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ushort x, y, z, w; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3; }; + __extension__ struct{ cl_ushort2 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[2]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4; +#endif +}cl_ushort4; + +/* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */ +typedef cl_ushort4 cl_ushort3; + +typedef union +{ + cl_ushort CL_ALIGNED(16) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ushort x, y, z, w; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_ushort4 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[4]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[2]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8; +#endif +}cl_ushort8; + +typedef union +{ + cl_ushort CL_ALIGNED(32) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_ushort8 lo, hi; }; +#endif +#if defined( __CL_USHORT2__) + __cl_ushort2 v2[8]; +#endif +#if defined( __CL_USHORT4__) + __cl_ushort4 v4[4]; +#endif +#if defined( __CL_USHORT8__ ) + __cl_ushort8 v8[2]; +#endif +#if defined( __CL_USHORT16__ ) + __cl_ushort16 v16; +#endif +}cl_ushort16; + +/* ---- cl_intn ---- */ +typedef union +{ + cl_int CL_ALIGNED(8) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_int x, y; }; + __extension__ struct{ cl_int s0, s1; }; + __extension__ struct{ cl_int lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2; +#endif +}cl_int2; + +typedef union +{ + cl_int CL_ALIGNED(16) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_int x, y, z, w; }; + __extension__ struct{ cl_int s0, s1, s2, s3; }; + __extension__ struct{ cl_int2 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[2]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4; +#endif +}cl_int4; + +/* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */ +typedef cl_int4 cl_int3; + +typedef union +{ + cl_int CL_ALIGNED(32) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_int x, y, z, w; }; + __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_int4 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[4]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[2]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8; +#endif +}cl_int8; + +typedef union +{ + cl_int CL_ALIGNED(64) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_int8 lo, hi; }; +#endif +#if defined( __CL_INT2__) + __cl_int2 v2[8]; +#endif +#if defined( __CL_INT4__) + __cl_int4 v4[4]; +#endif +#if defined( __CL_INT8__ ) + __cl_int8 v8[2]; +#endif +#if defined( __CL_INT16__ ) + __cl_int16 v16; +#endif +}cl_int16; + + +/* ---- cl_uintn ---- */ +typedef union +{ + cl_uint CL_ALIGNED(8) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uint x, y; }; + __extension__ struct{ cl_uint s0, s1; }; + __extension__ struct{ cl_uint lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2; +#endif +}cl_uint2; + +typedef union +{ + cl_uint CL_ALIGNED(16) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uint x, y, z, w; }; + __extension__ struct{ cl_uint s0, s1, s2, s3; }; + __extension__ struct{ cl_uint2 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[2]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4; +#endif +}cl_uint4; + +/* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */ +typedef cl_uint4 cl_uint3; + +typedef union +{ + cl_uint CL_ALIGNED(32) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uint x, y, z, w; }; + __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_uint4 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[4]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[2]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8; +#endif +}cl_uint8; + +typedef union +{ + cl_uint CL_ALIGNED(64) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_uint8 lo, hi; }; +#endif +#if defined( __CL_UINT2__) + __cl_uint2 v2[8]; +#endif +#if defined( __CL_UINT4__) + __cl_uint4 v4[4]; +#endif +#if defined( __CL_UINT8__ ) + __cl_uint8 v8[2]; +#endif +#if defined( __CL_UINT16__ ) + __cl_uint16 v16; +#endif +}cl_uint16; + +/* ---- cl_longn ---- */ +typedef union +{ + cl_long CL_ALIGNED(16) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_long x, y; }; + __extension__ struct{ cl_long s0, s1; }; + __extension__ struct{ cl_long lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2; +#endif +}cl_long2; + +typedef union +{ + cl_long CL_ALIGNED(32) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_long x, y, z, w; }; + __extension__ struct{ cl_long s0, s1, s2, s3; }; + __extension__ struct{ cl_long2 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[2]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4; +#endif +}cl_long4; + +/* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */ +typedef cl_long4 cl_long3; + +typedef union +{ + cl_long CL_ALIGNED(64) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_long x, y, z, w; }; + __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_long4 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[4]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[2]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8; +#endif +}cl_long8; + +typedef union +{ + cl_long CL_ALIGNED(128) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_long8 lo, hi; }; +#endif +#if defined( __CL_LONG2__) + __cl_long2 v2[8]; +#endif +#if defined( __CL_LONG4__) + __cl_long4 v4[4]; +#endif +#if defined( __CL_LONG8__ ) + __cl_long8 v8[2]; +#endif +#if defined( __CL_LONG16__ ) + __cl_long16 v16; +#endif +}cl_long16; + + +/* ---- cl_ulongn ---- */ +typedef union +{ + cl_ulong CL_ALIGNED(16) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ulong x, y; }; + __extension__ struct{ cl_ulong s0, s1; }; + __extension__ struct{ cl_ulong lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2; +#endif +}cl_ulong2; + +typedef union +{ + cl_ulong CL_ALIGNED(32) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ulong x, y, z, w; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3; }; + __extension__ struct{ cl_ulong2 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[2]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4; +#endif +}cl_ulong4; + +/* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */ +typedef cl_ulong4 cl_ulong3; + +typedef union +{ + cl_ulong CL_ALIGNED(64) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ulong x, y, z, w; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_ulong4 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[4]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[2]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8; +#endif +}cl_ulong8; + +typedef union +{ + cl_ulong CL_ALIGNED(128) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_ulong8 lo, hi; }; +#endif +#if defined( __CL_ULONG2__) + __cl_ulong2 v2[8]; +#endif +#if defined( __CL_ULONG4__) + __cl_ulong4 v4[4]; +#endif +#if defined( __CL_ULONG8__ ) + __cl_ulong8 v8[2]; +#endif +#if defined( __CL_ULONG16__ ) + __cl_ulong16 v16; +#endif +}cl_ulong16; + + +/* --- cl_floatn ---- */ + +typedef union +{ + cl_float CL_ALIGNED(8) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_float x, y; }; + __extension__ struct{ cl_float s0, s1; }; + __extension__ struct{ cl_float lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2; +#endif +}cl_float2; + +typedef union +{ + cl_float CL_ALIGNED(16) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_float x, y, z, w; }; + __extension__ struct{ cl_float s0, s1, s2, s3; }; + __extension__ struct{ cl_float2 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[2]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4; +#endif +}cl_float4; + +/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */ +typedef cl_float4 cl_float3; + +typedef union +{ + cl_float CL_ALIGNED(32) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_float x, y, z, w; }; + __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_float4 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[4]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[2]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8; +#endif +}cl_float8; + +typedef union +{ + cl_float CL_ALIGNED(64) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_float8 lo, hi; }; +#endif +#if defined( __CL_FLOAT2__) + __cl_float2 v2[8]; +#endif +#if defined( __CL_FLOAT4__) + __cl_float4 v4[4]; +#endif +#if defined( __CL_FLOAT8__ ) + __cl_float8 v8[2]; +#endif +#if defined( __CL_FLOAT16__ ) + __cl_float16 v16; +#endif +}cl_float16; + +/* --- cl_doublen ---- */ + +typedef union +{ + cl_double CL_ALIGNED(16) s[2]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_double x, y; }; + __extension__ struct{ cl_double s0, s1; }; + __extension__ struct{ cl_double lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2; +#endif +}cl_double2; + +typedef union +{ + cl_double CL_ALIGNED(32) s[4]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_double x, y, z, w; }; + __extension__ struct{ cl_double s0, s1, s2, s3; }; + __extension__ struct{ cl_double2 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[2]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4; +#endif +}cl_double4; + +/* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */ +typedef cl_double4 cl_double3; + +typedef union +{ + cl_double CL_ALIGNED(64) s[8]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_double x, y, z, w; }; + __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; }; + __extension__ struct{ cl_double4 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[4]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[2]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8; +#endif +}cl_double8; + +typedef union +{ + cl_double CL_ALIGNED(128) s[16]; +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ ) + __extension__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; + __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; + __extension__ struct{ cl_double8 lo, hi; }; +#endif +#if defined( __CL_DOUBLE2__) + __cl_double2 v2[8]; +#endif +#if defined( __CL_DOUBLE4__) + __cl_double4 v4[4]; +#endif +#if defined( __CL_DOUBLE8__ ) + __cl_double8 v8[2]; +#endif +#if defined( __CL_DOUBLE16__ ) + __cl_double16 v16; +#endif +}cl_double16; + +/* Macro to facilitate debugging + * Usage: + * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source. + * The first line ends with: CL_PROGRAM_STRING_BEGIN \" + * Each line thereafter of OpenCL C source must end with: \n\ + * The last line ends in "; + * + * Example: + * + * const char *my_program = CL_PROGRAM_STRING_BEGIN "\ + * kernel void foo( int a, float * b ) \n\ + * { \n\ + * // my comment \n\ + * *b[ get_global_id(0)] = a; \n\ + * } \n\ + * "; + * + * This should correctly set up the line, (column) and file information for your source + * string so you can do source level debugging. + */ +#define __CL_STRINGIFY( _x ) # _x +#define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x ) +#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n" + +#ifdef __cplusplus +} +#endif + +#endif /* __CL_PLATFORM_H */ diff --git a/etc/lwjgl-2.9.1/src/native/common/EGL/egl.h b/etc/lwjgl-2.9.1/src/native/common/EGL/egl.h new file mode 100644 index 0000000..6d82073 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/EGL/egl.h @@ -0,0 +1,329 @@ +/* -*- mode: c; tab-width: 8; -*- */ +/* vi: set sw=4 ts=8: */ +/* Reference version of egl.h for EGL 1.4. + * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $ + */ + +/* +** Copyright (c) 2007-2009 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 __egl_h_ +#define __egl_h_ + +/* All platform-dependent types and macro boilerplate (such as EGLAPI + * and EGLAPIENTRY) should go in eglplatform.h. + */ +#include <EGL/eglplatform.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* EGL Types */ +/* EGLint is defined in eglplatform.h */ +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLSurface; +typedef void *EGLClientBuffer; + +/* EGL Versioning */ +#define EGL_VERSION_1_0 1 +#define EGL_VERSION_1_1 1 +#define EGL_VERSION_1_2 1 +#define EGL_VERSION_1_3 1 +#define EGL_VERSION_1_4 1 + +/* EGL Enumerants. Bitmasks and other exceptional cases aside, most + * enums are assigned unique values starting at 0x3000. + */ + +/* EGL aliases */ +#define EGL_FALSE 0 +#define EGL_TRUE 1 + +/* Out-of-band handle values */ +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_SURFACE ((EGLSurface)0) + +/* Out-of-band attribute value */ +#define EGL_DONT_CARE ((EGLint)-1) + +/* Errors / GetError return values */ +#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_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */ + +/* Reserved 0x300F-0x301F for additional errors */ + +/* Config attributes */ +#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 /* Attrib list terminator */ +#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_LUMINANCE_SIZE 0x303D +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */ +#define EGL_CONFORMANT 0x3042 + +/* Reserved 0x3041-0x304F for additional config attributes */ + +/* Config attribute values */ +#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */ +#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */ +#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */ +#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */ +#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */ + +/* More config attribute values, for EGL_TEXTURE_FORMAT */ +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_2D 0x305F + +/* Config attribute mask bits */ +#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */ + +#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */ + +/* QueryString targets */ +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_EXTENSIONS 0x3055 +#define EGL_CLIENT_APIS 0x308D + +/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */ +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 + +/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */ +#define EGL_BACK_BUFFER 0x3084 +#define EGL_SINGLE_BUFFER 0x3085 + +/* OpenVG color spaces */ +#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */ +#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */ + +/* OpenVG alpha formats */ +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */ +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */ + +/* Constant scale factor by which fractional display resolutions & + * aspect ratio are scaled when queried as integer values. + */ +#define EGL_DISPLAY_SCALING 10000 + +/* Unknown display resolution/aspect ratio */ +#define EGL_UNKNOWN ((EGLint)-1) + +/* Back buffer swap behaviors */ +#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */ +#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */ + +/* CreatePbufferFromClientBuffer buffer types */ +#define EGL_OPENVG_IMAGE 0x3096 + +/* QueryContext targets */ +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 + +/* CreateContext attributes */ +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 + +/* Multisample resolution behaviors */ +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */ +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */ + +/* BindAPI/QueryAPI targets */ +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENGL_API 0x30A2 + +/* GetCurrentSurface targets */ +#define EGL_DRAW 0x3059 +#define EGL_READ 0x305A + +/* WaitNative engines */ +#define EGL_CORE_NATIVE_ENGINE 0x305B + +/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */ +#define EGL_COLORSPACE EGL_VG_COLORSPACE +#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT +#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB +#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR +#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE +#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE + +/* EGL extensions must request enum blocks from the Khronos + * API Registrar, who maintains the enumerant registry. Submit + * a bug in Khronos Bugzilla against task "Registry". + */ + + + +/* EGL Functions */ + +EGLAPI EGLint EGLAPIENTRY eglGetError(void); + +EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id); +EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy); + +EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name); + +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, + EGLint config_size, EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, + EGLConfig *configs, EGLint config_size, + EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, + EGLint attribute, EGLint *value); + +EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, + EGLNativeWindowType win, + const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, + const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, + EGLNativePixmapType pixmap, + const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, + EGLint attribute, EGLint *value); + +EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api); +EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void); + +EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void); + +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void); + +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer( + EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, + EGLConfig config, const EGLint *attrib_list); + +EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, + EGLint attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); + + +EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval); + + +EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, + EGLContext share_context, + const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, + EGLSurface read, EGLContext ctx); + +EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void); +EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw); +EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, + EGLint attribute, EGLint *value); + +EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, + EGLNativePixmapType target); + +/* This is a generic function pointer type, whose name indicates it must + * be cast to the proper type *and calling convention* before use. + */ +typedef void (*__eglMustCastToProperFunctionPointerType)(void); + +/* Now, define eglGetProcAddress using the generic function ptr. type */ +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY + eglGetProcAddress(const char *procname); + +#ifdef __cplusplus +} +#endif + +#endif /* __egl_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/EGL/eglext.h b/etc/lwjgl-2.9.1/src/native/common/EGL/eglext.h new file mode 100644 index 0000000..a5aee11 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/EGL/eglext.h @@ -0,0 +1,230 @@ +#ifndef __eglext_h_ +#define __eglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2007-2010 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. +*/ + +#include <EGL/eglplatform.h> + +/*************************************************************/ + +/* Header file version number */ +/* Current version at http://www.khronos.org/registry/egl/ */ +/* $Revision: 11249 $ on $Date: 2010-05-05 09:54:28 -0700 (Wed, 05 May 2010) $ */ +#define EGL_EGLEXT_VERSION 5 + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 /* EGLConfig attribute */ +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 /* EGL_SURFACE_TYPE bitfield */ +#endif + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_MATCH_FORMAT_KHR 0x3043 /* EGLConfig attribute */ +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGB_565_KHR 0x30C1 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 /* eglLockSurfaceKHR attribute */ +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 /* eglLockSurfaceKHR attribute */ +#define EGL_BITMAP_POINTER_KHR 0x30C6 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PITCH_KHR 0x30C7 /* eglQuerySurface attribute */ +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD /* eglQuerySurface attribute */ +#define EGL_LOWER_LEFT_KHR 0x30CE /* EGL_BITMAP_ORIGIN_KHR value */ +#define EGL_UPPER_LEFT_KHR 0x30CF /* EGL_BITMAP_ORIGIN_KHR value */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface); +#endif + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 /* eglCreateImageKHR target */ +typedef void *EGLImageKHR; +#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#endif + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC /* eglCreateImageKHR attribute */ +#endif + +#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 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +typedef void* EGLSyncKHR; +typedef khronos_utime_nanoseconds_t EGLTimeKHR; + +#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_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 /* eglClientWaitSyncKHR <flags> bitfield */ +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +/* Most interfaces defined by EGL_KHR_image_pixmap above */ +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +/* Interfaces defined by EGL_KHR_image above */ +#endif + +#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 +#endif + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +#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_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#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_NO_SYNC_NV ((EGLSyncNV)0) +typedef void* EGLSyncNV; +typedef unsigned long long EGLTimeNV; +#ifdef EGL_EGLEXT_PROTOTYPES +EGLSyncNV eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLBoolean eglDestroySyncNV (EGLSyncNV sync); +EGLBoolean eglFenceNV (EGLSyncNV sync); +EGLint eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLBoolean eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLBoolean eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +/* Reuses most tokens and entry points from EGL_KHR_reusable_sync */ +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/EGL/eglplatform.h b/etc/lwjgl-2.9.1/src/native/common/EGL/eglplatform.h new file mode 100644 index 0000000..47a3292 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/EGL/eglplatform.h @@ -0,0 +1,110 @@ +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright (c) 2007-2009 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. +*/ + +/* Platform-specific types and definitions for egl.h + * $Revision: 9724 $ on $Date: 2009-12-02 02:05:33 -0800 (Wed, 02 Dec 2009) $ + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "EGL" component "Registry". + */ + +#include <KHR/khrplatform.h> + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + */ + +#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include <windows.h> + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativeWindowType; +typedef void *EGLNativePixmapType; + +#elif defined(__unix__) + +/* X11 (tentative) */ +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +typedef khronos_int32_t EGLint; + +#endif /* __eglplatform_h */ diff --git a/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2.h b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2.h new file mode 100644 index 0000000..1149d25 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2.h @@ -0,0 +1,621 @@ +#ifndef __gl2_h_ +#define __gl2_h_ + +/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */ + +#include <GLES2/gl2platform.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/*------------------------------------------------------------------------- + * Data type definitions + *-----------------------------------------------------------------------*/ + +typedef void GLvoid; +typedef char GLchar; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef khronos_int8_t GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; + +/* GL types for handling large vertex buffer objects */ +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +/* OpenGL ES core versions */ +#define GL_ES_VERSION_2_0 1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 + +/* Boolean */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 + +/* AlphaFunction (not supported in ES20) */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + +/* BlendEquationSeparate */ +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */ +#define GL_BLEND_EQUATION_ALPHA 0x883D + +/* BlendSubtract */ +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B + +/* Separate Blend Functions */ +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 + +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 + +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 + +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 + +/* CullFaceMode */ +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* EnableCap */ +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetPName */ +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +/* GL_SCISSOR_TEST */ +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +/* GL_POLYGON_OFFSET_FILL */ +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +#define GL_GENERATE_MIPMAP_HINT 0x8192 + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C + +/* PixelFormat */ +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +/* PixelType */ +/* GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 + +/* Shaders */ +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D + +/* StencilFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 + +/* TextureTarget */ +/* GL_TEXTURE_2D */ +#define GL_TEXTURE 0x1702 + +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C + +/* TextureUnit */ +#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 + +/* TextureWrapMode */ +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 + +/* Uniform Types */ +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 + +/* Vertex Arrays */ +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F + +/* Read Format */ +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B + +/* Shader Source */ +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA + +/* Shader Binary */ +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 + +/* Shader Precision-Specified Types */ +#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 + +/* Framebuffer Object. */ +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 + +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 + +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 + +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 + +#define GL_NONE 0 + +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD + +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 + +/*------------------------------------------------------------------------- + * GL core functions. + *-----------------------------------------------------------------------*/ + +GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); +GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name); +GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode ); +GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); +GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); +GL_APICALL void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth); +GL_APICALL void GL_APIENTRY glClearStencil (GLint s); +GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); +GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); +GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); +GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); +GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers); +GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); +GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); +GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures); +GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); +GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); +GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); +GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glDisable (GLenum cap); +GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); +GL_APICALL void GL_APIENTRY glEnable (GLenum cap); +GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glFinish (void); +GL_APICALL void GL_APIENTRY glFlush (void); +GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); +GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers); +GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); +GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers); +GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers); +GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures); +GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); +GL_APICALL int GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params); +GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL GLenum GL_APIENTRY glGetError (void); +GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog); +GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); +GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); +GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name); +GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params); +GL_APICALL int GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name); +GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params); +GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer); +GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); +GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); +GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); +GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); +GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); +GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); +GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); +GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length); +GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar** string, const GLint* length); +GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params); +GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params); +GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x); +GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x); +GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y); +GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z); +GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v); +GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w); +GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v); +GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); +GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x); +GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values); +GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr); +GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2ext.h b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2ext.h new file mode 100644 index 0000000..f5e704f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2ext.h @@ -0,0 +1,803 @@ +#ifndef __gl2ext_h_ +#define __gl2ext_h_ + +/* $Revision: 10969 $ on $Date:: 2010-04-09 02:27:15 -0700 #$ */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +#ifndef GL_APIENTRYP +# define GL_APIENTRYP GL_APIENTRY* +#endif + +/*------------------------------------------------------------------------* + * OES extension tokens + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_ETC1_RGB8_OES 0x8D64 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif + +/* GL_OES_depth_texture */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +typedef void* GLeglImageOES; +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_UNSIGNED_INT 0x1405 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +#endif + +/* GL_OES_texture_float */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_HALF_FLOAT_OES 0x8D61 +#endif + +/* GL_OES_texture_half_float_linear */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_texture_npot */ +/* No new tokens introduced by this extension. */ + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +#endif + +/* GL_OES_vertex_half_float */ +/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */ + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#endif + +/*------------------------------------------------------------------------* + * AMD extension tokens + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif + +/* GL_AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#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 +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_Z400_BINARY_AMD 0x8740 +#endif + +/*------------------------------------------------------------------------* + * EXT extension tokens + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +#endif + +/* GL_EXT_multi_draw_arrays */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#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 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_EXT_texture_type_2_10_10_10_REV */ +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif + +/*------------------------------------------------------------------------* + * IMG extension tokens + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_SGX_BINARY_IMG 0x8C0A +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +#endif + +/*------------------------------------------------------------------------* + * NV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x8000 +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#endif + +/*------------------------------------------------------------------------* + * QCOM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_QCOM_driver_control */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#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 +#endif + +/* GL_QCOM_extended_get2 */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#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 +#endif + +/*------------------------------------------------------------------------* + * End of extension tokens, start of corresponding extension functions + *------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------* + * OES extension functions + *------------------------------------------------------------------------*/ + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#endif + +/* GL_OES_depth_texture */ +#ifndef GL_OES_depth_texture +#define GL_OES_depth_texture 1 +#endif + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif + +/* GL_OES_fbo_render_mipmap */ +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif + +/* GL_OES_fragment_precision_high */ +#ifndef GL_OES_fragment_precision_high +#define GL_OES_fragment_precision_high 1 +#endif + +/* GL_OES_get_program_binary */ +#ifndef GL_OES_get_program_binary +#define GL_OES_get_program_binary 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length); +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid** params); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid** params); +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif + +/* GL_OES_standard_derivatives */ +#ifndef GL_OES_standard_derivatives +#define GL_OES_standard_derivatives 1 +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#endif + +/* GL_OES_texture_3D */ +#ifndef GL_OES_texture_3D +#define GL_OES_texture_3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif + +/* GL_OES_texture_float */ +#ifndef GL_OES_texture_float +#define GL_OES_texture_float 1 +#endif + +/* GL_OES_texture_float_linear */ +#ifndef GL_OES_texture_float_linear +#define GL_OES_texture_float_linear 1 +#endif + +/* GL_OES_texture_half_float */ +#ifndef GL_OES_texture_half_float +#define GL_OES_texture_half_float 1 +#endif + +/* GL_OES_texture_half_float_linear */ +#ifndef GL_OES_texture_half_float_linear +#define GL_OES_texture_half_float_linear 1 +#endif + +/* GL_OES_texture_npot */ +#ifndef GL_OES_texture_npot +#define GL_OES_texture_npot 1 +#endif + +/* GL_OES_vertex_array_object */ +#ifndef GL_OES_vertex_array_object +#define GL_OES_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); +GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); +GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); +GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); +#endif +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); +#endif + +/* GL_OES_vertex_half_float */ +#ifndef GL_OES_vertex_half_float +#define GL_OES_vertex_half_float 1 +#endif + +/* GL_OES_vertex_type_10_10_10_2 */ +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_OES_vertex_type_10_10_10_2 1 +#endif + +/*------------------------------------------------------------------------* + * AMD extension functions + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#endif + +/* AMD_performance_monitor */ +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); +typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList); +typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif + +/* GL_AMD_program_binary_Z400 */ +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 +#endif + +/*------------------------------------------------------------------------* + * EXT extension functions + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif + +/* 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 +#endif + +/* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#endif + +/*------------------------------------------------------------------------* + * IMG extension functions + *------------------------------------------------------------------------*/ + +/* GL_IMG_program_binary */ +#ifndef GL_IMG_program_binary +#define GL_IMG_program_binary 1 +#endif + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#endif + +/* GL_IMG_shader_binary */ +#ifndef GL_IMG_shader_binary +#define GL_IMG_shader_binary 1 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#endif + +/* GL_IMG_multisampled_render_to_texture */ +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_IMG_multisampled_render_to_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +#endif +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCLIPPLANEXIMG) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif + +/*------------------------------------------------------------------------* + * NV extension functions + *------------------------------------------------------------------------*/ + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *); +GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint); +GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint); +GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint); +GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum); +#endif +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +/* GL_NV_coverage_sample */ +#ifndef GL_NV_coverage_sample +#define GL_NV_coverage_sample 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); +GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); +#endif +typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); +typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); +#endif + +/* GL_NV_depth_nonlinear */ +#ifndef GL_NV_depth_nonlinear +#define GL_NV_depth_nonlinear 1 +#endif + +/*------------------------------------------------------------------------* + * QCOM extension functions + *------------------------------------------------------------------------*/ + +/* GL_QCOM_driver_control */ +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#endif + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params); +#endif + +/* GL_QCOM_extended_get2 */ +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#endif + +/* GL_QCOM_tiled_rendering */ +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); +#endif +typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2ext_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2extimg.h b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2extimg.h new file mode 100644 index 0000000..d9c76da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2extimg.h @@ -0,0 +1,51 @@ +#ifndef __gl2extimg_h_ +#define __gl2extimg_h_ + +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------* + * IMG extension tokens + *------------------------------------------------------------------------*/ + +/* GL_IMG_binary_shader */ +#ifndef GL_IMG_binary_shader +#define GL_SGX_BINARY_IMG 0x8C0A +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif + + +/* GL_IMG_texture_format_BGRA8888 */ +#define GL_BGRA 0x80E1 + + +/*------------------------------------------------------------------------* + * IMG extension functions + *------------------------------------------------------------------------*/ + +/* GL_IMG_binary_shader */ +#ifndef GL_IMG_binary_shader +#define GL_IMG_binary_shader 1 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __gl2extimg_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2platform.h b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2platform.h new file mode 100644 index 0000000..38cb3b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/GLES2/gl2platform.h @@ -0,0 +1,30 @@ +#ifndef __gl2platform_h_ +#define __gl2platform_h_ + +/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */ + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "OpenGL-ES" component "Registry". + */ + +#include <KHR/khrplatform.h> + +#ifndef GL_APICALL +#define GL_APICALL KHRONOS_APICALL +#endif + +#ifndef GL_APIENTRY +#define GL_APIENTRY KHRONOS_APIENTRY +#endif + +#endif /* __gl2platform_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/KHR/khrplatform.h b/etc/lwjgl-2.9.1/src/native/common/KHR/khrplatform.h new file mode 100644 index 0000000..1e323ed --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/KHR/khrplatform.h @@ -0,0 +1,269 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2009 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. +*/ + +/* Khronos platform-specific types and definitions. + * + * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $ + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by sending them to the public Khronos Bugzilla + * (http://khronos.org/bugzilla) by filing a bug against product + * "Khronos (general)" component "Registry". + * + * A predefined template which fills in some of the bug fields can be + * reached using http://tinyurl.com/khrplatform-h-bugreport, but you + * must create a Bugzilla login first. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include <KHR/khrplatform.h> + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using <stdint.h> + */ +#include <stdint.h> +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using <inttypes.h> + */ +#include <inttypes.h> +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include <stdint.h> +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/OpenCL/cl_platform.h b/etc/lwjgl-2.9.1/src/native/common/OpenCL/cl_platform.h new file mode 100644 index 0000000..5d85ded --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/OpenCL/cl_platform.h @@ -0,0 +1,296 @@ +/********************************************************************************** + * Copyright (c) 2008-2009 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 __CL_PLATFORM_H +#define __CL_PLATFORM_H + +#ifdef __APPLE__ + /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ + #include <AvailabilityMacros.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define CL_API_ENTRY +#define CL_API_CALL +#ifdef __APPLE__ +#define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) +#else +#define CL_API_SUFFIX__VERSION_1_0 +#define CL_EXTENSION_WEAK_LINK +#endif + +#if (defined (WIN32) && (_MSC_VER)) + +/* scalar types */ +typedef signed __int8 cl_char; +typedef unsigned __int8 cl_uchar; +typedef signed __int16 cl_short; +typedef unsigned __int16 cl_ushort; +typedef signed __int32 cl_int; +typedef unsigned __int32 cl_uint; +typedef signed __int64 cl_long; +typedef unsigned __int64 cl_ulong; + +typedef unsigned __int16 cl_half; +typedef float cl_float; +typedef double cl_double; + + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ +typedef signed __int8 cl_char2[2]; +typedef signed __int8 cl_char4[4]; +typedef signed __int8 cl_char8[8]; +typedef signed __int8 cl_char16[16]; +typedef unsigned __int8 cl_uchar2[2]; +typedef unsigned __int8 cl_uchar4[4]; +typedef unsigned __int8 cl_uchar8[8]; +typedef unsigned __int8 cl_uchar16[16]; + +typedef signed __int16 cl_short2[2]; +typedef signed __int16 cl_short4[4]; +typedef signed __int16 cl_short8[8]; +typedef signed __int16 cl_short16[16]; +typedef unsigned __int16 cl_ushort2[2]; +typedef unsigned __int16 cl_ushort4[4]; +typedef unsigned __int16 cl_ushort8[8]; +typedef unsigned __int16 cl_ushort16[16]; + +typedef signed __int32 cl_int2[2]; +typedef signed __int32 cl_int4[4]; +typedef signed __int32 cl_int8[8]; +typedef signed __int32 cl_int16[16]; +typedef unsigned __int32 cl_uint2[2]; +typedef unsigned __int32 cl_uint4[4]; +typedef unsigned __int32 cl_uint8[8]; +typedef unsigned __int32 cl_uint16[16]; + +typedef signed __int64 cl_long2[2]; +typedef signed __int64 cl_long4[4]; +typedef signed __int64 cl_long8[8]; +typedef signed __int64 cl_long16[16]; +typedef unsigned __int64 cl_ulong2[2]; +typedef unsigned __int64 cl_ulong4[4]; +typedef unsigned __int64 cl_ulong8[8]; +typedef unsigned __int64 cl_ulong16[16]; + +typedef float cl_float2[2]; +typedef float cl_float4[4]; +typedef float cl_float8[8]; +typedef float cl_float16[16]; + +typedef double cl_double2[2]; +typedef double cl_double4[4]; +typedef double cl_double8[8]; +typedef double cl_double16[16]; +/* There are no vector types for half */ + +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 340282346638528859811704183484516925440.0f +#define CL_FLT_MIN 1.175494350822287507969e-38f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 +#define CL_DBL_MIN 2.225073858507201383090e-308 +#define CL_DBL_EPSILON 2.220446049250313080847e-16 + + +#else + +#include <stdint.h> + +/* scalar types */ +typedef int8_t cl_char; +typedef uint8_t cl_uchar; +typedef int16_t cl_short __attribute__((aligned(2))); +typedef uint16_t cl_ushort __attribute__((aligned(2))); +typedef int32_t cl_int __attribute__((aligned(4))); +typedef uint32_t cl_uint __attribute__((aligned(4))); +typedef int64_t cl_long __attribute__((aligned(8))); +typedef uint64_t cl_ulong __attribute__((aligned(8))); + +typedef uint16_t cl_half __attribute__((aligned(2))); +typedef float cl_float __attribute__((aligned(4))); +typedef double cl_double __attribute__((aligned(8))); + +/* + * Vector types + * + * Note: OpenCL requires that all types be naturally aligned. + * This means that vector types must be naturally aligned. + * For example, a vector of four floats must be aligned to + * a 16 byte boundary (calculated as 4 * the natural 4-byte + * alignment of the float). The alignment qualifiers here + * will only function properly if your compiler supports them + * and if you don't actively work to defeat them. For example, + * in order for a cl_float4 to be 16 byte aligned in a struct, + * the start of the struct must itself be 16-byte aligned. + * + * Maintaining proper alignment is the user's responsibility. + */ +typedef int8_t cl_char2[2] __attribute__((aligned(2))); +typedef int8_t cl_char4[4] __attribute__((aligned(4))); +typedef int8_t cl_char8[8] __attribute__((aligned(8))); +typedef int8_t cl_char16[16] __attribute__((aligned(16))); +typedef uint8_t cl_uchar2[2] __attribute__((aligned(2))); +typedef uint8_t cl_uchar4[4] __attribute__((aligned(4))); +typedef uint8_t cl_uchar8[8] __attribute__((aligned(8))); +typedef uint8_t cl_uchar16[16] __attribute__((aligned(16))); + +typedef int16_t cl_short2[2] __attribute__((aligned(4))); +typedef int16_t cl_short4[4] __attribute__((aligned(8))); +typedef int16_t cl_short8[8] __attribute__((aligned(16))); +typedef int16_t cl_short16[16] __attribute__((aligned(32))); +typedef uint16_t cl_ushort2[2] __attribute__((aligned(4))); +typedef uint16_t cl_ushort4[4] __attribute__((aligned(8))); +typedef uint16_t cl_ushort8[8] __attribute__((aligned(16))); +typedef uint16_t cl_ushort16[16] __attribute__((aligned(32))); + +typedef int32_t cl_int2[2] __attribute__((aligned(8))); +typedef int32_t cl_int4[4] __attribute__((aligned(16))); +typedef int32_t cl_int8[8] __attribute__((aligned(32))); +typedef int32_t cl_int16[16] __attribute__((aligned(64))); +typedef uint32_t cl_uint2[2] __attribute__((aligned(8))); +typedef uint32_t cl_uint4[4] __attribute__((aligned(16))); +typedef uint32_t cl_uint8[8] __attribute__((aligned(32))); +typedef uint32_t cl_uint16[16] __attribute__((aligned(64))); + +typedef int64_t cl_long2[2] __attribute__((aligned(16))); +typedef int64_t cl_long4[4] __attribute__((aligned(32))); +typedef int64_t cl_long8[8] __attribute__((aligned(64))); +typedef int64_t cl_long16[16] __attribute__((aligned(128))); +typedef uint64_t cl_ulong2[2] __attribute__((aligned(16))); +typedef uint64_t cl_ulong4[4] __attribute__((aligned(32))); +typedef uint64_t cl_ulong8[8] __attribute__((aligned(64))); +typedef uint64_t cl_ulong16[16] __attribute__((aligned(128))); + +typedef float cl_float2[2] __attribute__((aligned(8))); +typedef float cl_float4[4] __attribute__((aligned(16))); +typedef float cl_float8[8] __attribute__((aligned(32))); +typedef float cl_float16[16] __attribute__((aligned(64))); + +typedef double cl_double2[2] __attribute__((aligned(16))); +typedef double cl_double4[4] __attribute__((aligned(32))); +typedef double cl_double8[8] __attribute__((aligned(64))); +typedef double cl_double16[16] __attribute__((aligned(128))); + +/* There are no vector types for half */ + +/******************************************************************************/ + +// Macro names and corresponding values defined by OpenCL + +#define CL_CHAR_BIT 8 +#define CL_SCHAR_MAX 127 +#define CL_SCHAR_MIN (-127-1) +#define CL_CHAR_MAX CL_SCHAR_MAX +#define CL_CHAR_MIN CL_SCHAR_MIN +#define CL_UCHAR_MAX 255 +#define CL_SHRT_MAX 32767 +#define CL_SHRT_MIN (-32767-1) +#define CL_USHRT_MAX 65535 +#define CL_INT_MAX 2147483647 +#define CL_INT_MIN (-2147483647-1) +#define CL_UINT_MAX 0xffffffffU +#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) +#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) +#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) + +#define CL_FLT_DIG 6 +#define CL_FLT_MANT_DIG 24 +#define CL_FLT_MAX_10_EXP +38 +#define CL_FLT_MAX_EXP +128 +#define CL_FLT_MIN_10_EXP -37 +#define CL_FLT_MIN_EXP -125 +#define CL_FLT_RADIX 2 +#define CL_FLT_MAX 0x1.fffffep127f +#define CL_FLT_MIN 0x1.0p-126f +#define CL_FLT_EPSILON 0x1.0p-23f + +#define CL_DBL_DIG 15 +#define CL_DBL_MANT_DIG 53 +#define CL_DBL_MAX_10_EXP +308 +#define CL_DBL_MAX_EXP +1024 +#define CL_DBL_MIN_10_EXP -307 +#define CL_DBL_MIN_EXP -1021 +#define CL_DBL_RADIX 2 +#define CL_DBL_MAX 0x1.fffffffffffffp1023 +#define CL_DBL_MIN 0x1.0p-1022 +#define CL_DBL_EPSILON 0x1.0p-52 + +#endif + +#include <stddef.h> + + +#ifdef __cplusplus +} +#endif + +#endif // __CL_PLATFORM_H diff --git a/etc/lwjgl-2.9.1/src/native/common/awt_tools.h b/etc/lwjgl-2.9.1/src/native/common/awt_tools.h new file mode 100644 index 0000000..84622f9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/awt_tools.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#ifndef __LWJGL_AWT_TOOLS_H +#define __LWJGL_AWT_TOOLS_H + +#include <jni.h> +#include <jawt_md.h> + +typedef struct { + JAWT awt; + JAWT_DrawingSurface* ds; + JAWT_DrawingSurfaceInfo *dsi; +} AWTSurfaceLock; + +#endif + diff --git a/etc/lwjgl-2.9.1/src/native/common/common_tools.c b/etc/lwjgl-2.9.1/src/native/common/common_tools.c new file mode 100644 index 0000000..d0720d2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/common_tools.c @@ -0,0 +1,398 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <stdlib.h> +#include "common_tools.h" +#include "org_lwjgl_DefaultSysImplementation.h" + +static bool debug = false; +static JavaVM *jvm; + +static jmethodID mByteBuffer_asReadOnlyBuffer; +static jmethodID mPointerWrapper_getPointer; + +void initAttribList(attrib_list_t *list) { + list->current_index = 0; +} + +void putAttrib(attrib_list_t *list, int attrib) { + if (list->current_index == ATTRIB_LIST_SIZE) { + printfDebug("Ignoring attrib %d: attrib list size too small", attrib); + return; + } + list->attribs[list->current_index] = attrib; + list->current_index++; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getPointerSize(JNIEnv *env, jclass clazz) { + return (jint)sizeof(void *); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_DefaultSysImplementation_setDebug + (JNIEnv *env, jobject ignored, jboolean enable) { + debug = enable == JNI_TRUE ? true : false; +} + +bool isDebugEnabled(void) { + return debug; +} + +static int do_vsnprintf(char* buffer, size_t buffer_size, const char *format, va_list ap) { +#ifdef _MSC_VER + return vsnprintf_s(buffer, buffer_size, _TRUNCATE, format, ap); +#else + va_list cp_ap; + va_copy(cp_ap, ap); + int res = vsnprintf(buffer, buffer_size, format, cp_ap); + va_end(cp_ap); + return res; +#endif +} + +static jstring sprintfJavaString(JNIEnv *env, const char *format, va_list ap) { + int buffer_size = 2048; + char *buffer; + jstring str; + int str_size; + buffer = (char *)malloc(sizeof(char)*buffer_size); + if (buffer == NULL) + return NULL; + str_size = do_vsnprintf(buffer, buffer_size, format, ap); + if (str_size > buffer_size) { + free(buffer); + buffer_size = str_size + 1; + buffer = (char *)malloc(sizeof(char)*buffer_size); + if (buffer == NULL) + return NULL; + do_vsnprintf(buffer, buffer_size, format, ap); + } + str = (*env)->NewStringUTF(env, buffer); + free(buffer); + return str; +} + +void printfDebugJava(JNIEnv *env, const char *format, ...) { + jstring str; + jclass org_lwjgl_LWJGLUtil_class; + jmethodID log_method; + va_list ap; + if (isDebugEnabled() && !(*env)->ExceptionOccurred(env)) { + va_start(ap, format); + str = sprintfJavaString(env, format, ap); + va_end(ap); + org_lwjgl_LWJGLUtil_class = (*env)->FindClass(env, "org/lwjgl/LWJGLUtil"); + if (org_lwjgl_LWJGLUtil_class == NULL) + return; + log_method = (*env)->GetStaticMethodID(env, org_lwjgl_LWJGLUtil_class, "log", "(Ljava/lang/CharSequence;)V"); + if (log_method == NULL) + return; + (*env)->CallStaticVoidMethod(env, org_lwjgl_LWJGLUtil_class, log_method, str); + } +} + +void printfDebug(const char *format, ...) { + va_list ap; + va_start(ap, format); + if (isDebugEnabled()) + vfprintf(stderr, format, ap); + va_end(ap); +} + +static void throwFormattedGeneralException(JNIEnv * env, const char *exception_name, const char *format, va_list ap) { + jclass cls; + jstring str; + jmethodID exception_constructor; + jobject exception; + + if ((*env)->ExceptionCheck(env) == JNI_TRUE) + return; // The JVM crashes if we try to throw two exceptions from one native call + str = sprintfJavaString(env, format, ap); + cls = (*env)->FindClass(env, exception_name); + exception_constructor = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/lang/String;)V"); + exception = (*env)->NewObject(env, cls, exception_constructor, str); + (*env)->Throw(env, exception); +} + +void throwGeneralException(JNIEnv * env, const char *exception_name, const char * err) { + jclass cls; + + if ((*env)->ExceptionCheck(env) == JNI_TRUE) + return; // The JVM crashes if we try to throw two exceptions from one native call + cls = (*env)->FindClass(env, exception_name); + (*env)->ThrowNew(env, cls, err); +} + +void throwFMODException(JNIEnv * env, const char * err) { + throwGeneralException(env, "org/lwjgl/fmod3/FMODException", err); +} + +void throwFormattedRuntimeException(JNIEnv * env, const char *format, ...) { + va_list ap; + va_start(ap, format); + throwFormattedGeneralException(env, "java/lang/RuntimeException", format, ap); + va_end(ap); +} + +void throwFormattedException(JNIEnv * env, const char *format, ...) { + va_list ap; + va_start(ap, format); + throwFormattedGeneralException(env, "org/lwjgl/LWJGLException", format, ap); + va_end(ap); +} + +void throwException(JNIEnv * env, const char * err) { + throwGeneralException(env, "org/lwjgl/LWJGLException", err); +} + +// retrieves the locale-specific C string +char * GetStringNativeChars(JNIEnv *env, jstring jstr) { + jbyteArray bytes = 0; + jthrowable exc; + char *result = 0; + jclass jcls_str; + jmethodID MID_String_getBytes; + + /* out of memory error? */ + if ((*env)->EnsureLocalCapacity(env, 2) < 0) { + return 0; + } + + // aquire getBytes method + jcls_str = (*env)->FindClass(env, "java/lang/String"); + MID_String_getBytes = (*env)->GetMethodID(env, jcls_str, "getBytes", "()[B"); + + // get the bytes + bytes = (jbyteArray) (*env)->CallObjectMethod(env, jstr, MID_String_getBytes); + exc = (*env)->ExceptionOccurred(env); + + // if no exception occured while getting bytes - continue + if (!exc) { + jint len = (*env)->GetArrayLength(env, bytes); + result = (char *) malloc(len + 1); + if (result == 0) { + throwGeneralException(env, "java/lang/OutOfMemoryError", NULL); + (*env)->DeleteLocalRef(env, bytes); + return 0; + } + (*env)->GetByteArrayRegion(env, bytes, 0, len, (jbyte *) result); + result[len] = 0; /* NULL-terminate */ + } else { + (*env)->DeleteLocalRef(env, exc); + } + (*env)->DeleteLocalRef(env, bytes); + return (char*) result; +} + +/* creates locale specific string, unsigned argument to + * match GLuchar and ALuchar types + */ +jstring NewStringNativeUnsigned(JNIEnv *env, const unsigned char *ustr) { + const char *str = (const char *)ustr; + if (str == NULL) + return NULL; + return NewStringNativeWithLength(env, str, (jsize)strlen(str)); +} + +// creates locale specific string +jstring NewStringNativeWithLength(JNIEnv *env, const char *str, jsize length) { + jclass jcls_str; + jmethodID jmethod_str; + jstring result; + jbyteArray bytes; + if (str==NULL) { + return NULL; + } + + jcls_str = (*env)->FindClass(env,"java/lang/String"); + if (jcls_str == NULL) + return NULL; + jmethod_str = (*env)->GetMethodID(env,jcls_str, "<init>", "([B)V"); + if (jmethod_str == NULL) + return NULL; + + bytes = 0; + + if ((*env)->EnsureLocalCapacity(env,2) < 0) { + return NULL; /* out of memory error */ + } + + bytes = (*env)->NewByteArray(env,length); + if (bytes != NULL) { + (*env)->SetByteArrayRegion(env,bytes, 0, length, (jbyte *)str); + result = (jstring)(*env)->NewObject(env,jcls_str, jmethod_str, bytes); + (*env)->DeleteLocalRef(env,bytes); + return result; + } /* else fall through */ + return NULL; +} + +bool ext_InitializeFunctions(ExtGetProcAddressPROC gpa, int num_functions, ExtFunction *functions) { + int i; + void **ext_function_pointer_pointer; + for (i = 0; i < num_functions; i++) { + ExtFunction *function = functions + i; + if (function->ext_function_name != NULL) { + void *ext_func_pointer = gpa(function->ext_function_name); + if (ext_func_pointer == NULL) + return false; + ext_function_pointer_pointer = function->ext_function_pointer; + *ext_function_pointer_pointer = ext_func_pointer; + } + } + return true; +} + +jobject NewReadOnlyDirectByteBuffer(JNIEnv* env, const void* address, jlong capacity) { + jobject buffer = (*env)->NewDirectByteBuffer(env, (void *)address, capacity); + return (*env)->CallObjectMethod(env, buffer, mByteBuffer_asReadOnlyBuffer); +} + +jobject newJavaManagedByteBuffer(JNIEnv *env, const int size) { + jclass bufferutils_class = (*env)->FindClass(env, "org/lwjgl/BufferUtils"); + jmethodID createByteBuffer = (*env)->GetStaticMethodID(env, bufferutils_class, "createByteBuffer", "(I)Ljava/nio/ByteBuffer;"); + jobject buffer = (*env)->CallStaticObjectMethod(env, bufferutils_class, createByteBuffer, size); + return buffer; +} + +void ext_InitializeClass(JNIEnv *env, jclass clazz, ExtGetProcAddressPROC gpa, int num_functions, JavaMethodAndExtFunction *functions) { + JNINativeMethod *methods; + JavaMethodAndExtFunction *function; + void *ext_func_pointer; + void **ext_function_pointer_pointer; + JNINativeMethod *method; + int i, num_natives = 0; + if (clazz == NULL) { + throwException(env, "Null class"); + return; + } + methods = (JNINativeMethod *)malloc(num_functions*sizeof(JNINativeMethod)); + for (i = 0; i < num_functions; i++) { + function = functions + i; + if (function->ext_function_name != NULL) { + ext_func_pointer = gpa(function->ext_function_name); + if (ext_func_pointer == NULL) { + if ( function->optional ) + continue; + + free(methods); + throwException(env, "Missing driver symbols"); + return; + } + ext_function_pointer_pointer = function->ext_function_pointer; + *ext_function_pointer_pointer = ext_func_pointer; + } + method = methods + num_natives; + method->name = function->method_name; + method->signature = function->signature; + method->fnPtr = function->method_pointer; + + num_natives++; + } + (*env)->RegisterNatives(env, clazz, methods, num_natives); + free(methods); +} + +bool getBooleanProperty(JNIEnv *env, const char* propertyName) { + jstring property = NewStringNativeWithLength(env, propertyName, (jsize)strlen(propertyName)); + jclass org_lwjgl_LWJGLUtil_class; + jmethodID getBoolean; + if (property == NULL) + return false; + org_lwjgl_LWJGLUtil_class = (*env)->FindClass(env, "org/lwjgl/LWJGLUtil"); + if (org_lwjgl_LWJGLUtil_class == NULL) + return false; + getBoolean = (*env)->GetStaticMethodID(env, org_lwjgl_LWJGLUtil_class, "getPrivilegedBoolean", "(Ljava/lang/String;)Z"); + if (getBoolean == NULL) + return false; + return (*env)->CallStaticBooleanMethod(env, org_lwjgl_LWJGLUtil_class, getBoolean, property) ? true : false; +} + +jlong getPointerWrapperAddress(JNIEnv *env, jobject wrapper) { + return (*env)->CallLongMethod(env, wrapper, mPointerWrapper_getPointer); +} + +JNIEnv *getThreadEnv() { + JNIEnv *env; + (*jvm)->GetEnv(jvm, (void *)&env, JNI_VERSION_1_4); + return env; +} + +JNIEnv *attachCurrentThread() { + JNIEnv *env; + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + return env; +} + +void detachCurrentThread() { + (*jvm)->DetachCurrentThread(jvm); +} + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *env; + jclass clazz; + + jvm = vm; + env = getThreadEnv(); + + clazz = (*env)->FindClass(env, "java/nio/ByteBuffer"); + mByteBuffer_asReadOnlyBuffer = (*env)->GetMethodID(env, clazz, "asReadOnlyBuffer", "()Ljava/nio/ByteBuffer;"); + + clazz = (*env)->FindClass(env, "org/lwjgl/PointerWrapper"); + mPointerWrapper_getPointer = (*env)->GetMethodID(env, clazz, "getPointer", "()J"); + + return JNI_VERSION_1_4; +} + +JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) { +} + +bool positionBuffer(JNIEnv *env, jobject buffer, jint position) { + jclass buffer_class; + jmethodID position_method; + + buffer_class = (*env)->GetObjectClass(env, buffer); + if (buffer_class == NULL) + return false; + position_method = (*env)->GetMethodID(env, buffer_class, "position", "(I)Ljava/nio/Buffer;"); + if (position_method == NULL) + return false; + (*env)->CallObjectMethod(env, buffer, position_method, position); + return true; +} diff --git a/etc/lwjgl-2.9.1/src/native/common/common_tools.h b/etc/lwjgl-2.9.1/src/native/common/common_tools.h new file mode 100644 index 0000000..a47ba94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/common_tools.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#ifndef _COMMON_TOOLS_H +#define _COMMON_TOOLS_H + +#include <jni.h> +#include <string.h> +#include <stdlib.h> + +#define ATTRIB_LIST_SIZE (256) + +typedef struct { + int current_index; + int attribs[ATTRIB_LIST_SIZE]; +} attrib_list_t; + +#ifndef __cplusplus +#ifndef bool +typedef enum {false, true} bool; +#endif +#endif + +#ifdef _MSC_VER +#define inline __inline +#include <Basetsd.h> +#else +#include <inttypes.h> +#endif + +static inline void * safeGetBufferAddress(JNIEnv *env, jobject buffer) { + if (buffer != NULL) { +#ifdef __cplusplus + return (void *)((char *)env->GetDirectBufferAddress(buffer)); +#else + return (void *)((char *)(*env)->GetDirectBufferAddress(env, buffer)); +#endif + } else + return NULL; +} + +static inline jobject safeNewBuffer(JNIEnv *env, void *p, jlong capacity) { + if (p != NULL) { +#ifdef __cplusplus + return env->NewDirectByteBuffer(p, capacity); +#else + return (*env)->NewDirectByteBuffer(env, p, capacity); +#endif + } else + return NULL; +} + +static inline jobject safeNewBufferCached(JNIEnv *env, void *p, jlong size, jobject old_buffer) { + if (old_buffer != NULL) { + void *old_buffer_address = (*env)->GetDirectBufferAddress(env, old_buffer); + jlong capacity = (*env)->GetDirectBufferCapacity(env, old_buffer); + if (old_buffer_address == p && capacity == size) + return old_buffer; + } + return safeNewBuffer(env, p, size); + +} + +static inline void *offsetToPointer(jlong offset) { + return (char *)NULL + offset; +} + +typedef void *(* ExtGetProcAddressPROC) (const char *func_name); +typedef struct { + char *method_name; + char *signature; + void *method_pointer; + + char *ext_function_name; + void **ext_function_pointer; + bool optional; +} JavaMethodAndExtFunction; + +typedef struct { + char *ext_function_name; + void **ext_function_pointer; +} ExtFunction; + +#define NUMFUNCTIONS(x) (sizeof(x)/sizeof(JavaMethodAndExtFunction)); + +#ifdef __cplusplus +extern "C" { +#endif + +extern JNIEnv *getThreadEnv(); +extern JNIEnv *attachCurrentThread(); +extern void detachCurrentThread(); +extern void initAttribList(attrib_list_t *list); +extern void putAttrib(attrib_list_t *list, int attrib); + +extern bool isDebugEnabled(void); +extern jstring getVersionString(JNIEnv *env); +extern void throwGeneralException(JNIEnv * env, const char *exception_name, const char * err); +extern void throwFormattedRuntimeException(JNIEnv * env, const char *format, ...); +extern void throwException(JNIEnv *env, const char *msg); +extern void throwFormattedException(JNIEnv * env, const char *format, ...); +extern void throwFMODException(JNIEnv * env, const char * err); +extern void setDebugEnabled(bool enable); +extern void printfDebugJava(JNIEnv *env, const char *format, ...); +extern void printfDebug(const char *format, ...); +extern bool getBooleanProperty(JNIEnv *env, const char* propertyName); +extern char * GetStringNativeChars(JNIEnv *env, jstring jstr); +extern jstring NewStringNativeWithLength(JNIEnv *env, const char *str, jsize length); +extern jstring NewStringNativeUnsigned(JNIEnv *env, const unsigned char *str); +extern jobject NewReadOnlyDirectByteBuffer(JNIEnv* env, const void* address, jlong capacity); +extern jobject newJavaManagedByteBuffer(JNIEnv *env, const int size); +extern bool positionBuffer(JNIEnv *env, jobject buffer, jint position); +extern jlong getPointerWrapperAddress(JNIEnv *env, jobject wrapper); + +extern void ext_InitializeClass(JNIEnv *env, jclass clazz, ExtGetProcAddressPROC gpa, int num_functions, JavaMethodAndExtFunction *functions); +extern bool ext_InitializeFunctions(ExtGetProcAddressPROC gpa, int num_functions, ExtFunction *functions); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/etc/lwjgl-2.9.1/src/native/common/extal.c b/etc/lwjgl-2.9.1/src/native/common/extal.c new file mode 100644 index 0000000..0a63d97 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/extal.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "extal.h" + +typedef ALvoid* (ALAPIENTRY *alGetProcAddressPROC)(const ALubyte* fname); +/* alGetProcAddress is commented out, since we don't use it anyway */ +//static alGetProcAddressPROC alGetProcAddress = NULL; + +/** + * Initializes OpenAL by loading the library + */ +/*void InitializeOpenAL(JNIEnv *env, jstring oalPath) { + //load our library + if (!extal_LoadLibrary(env, oalPath)) { + throwException(env, "Could not load openal library."); + return; + } + alGetProcAddress = (alGetProcAddressPROC)extal_NativeGetFunctionPointer("alGetProcAddress"); + if (alGetProcAddress == NULL) { + extal_UnloadLibrary(); + throwException(env, "Could not load alGetProcAddress function pointer."); + return; + } +}*/ + +/** + * Retrieves a pointer to the named function + * + * @param function Name of function + * @return pointer to named function, or NULL if not found + */ +void* extal_GetProcAddress(const char* function) { + void *p; +/* p = alGetProcAddress((const ALubyte*)function); + if (p == NULL) {*/ + p = extal_NativeGetFunctionPointer(function); + if (p == NULL) { + printfDebug("Could not locate symbol %s\n", function); + } +// } + return p; +} + +void extal_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions) { + ext_InitializeClass(env, clazz, &extal_GetProcAddress, num_functions, functions); +} + diff --git a/etc/lwjgl-2.9.1/src/native/common/extal.h b/etc/lwjgl-2.9.1/src/native/common/extal.h new file mode 100644 index 0000000..dc69316 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/extal.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AL_TEST_H +#define _AL_TEST_H + +#ifdef _WIN32 +#include <windows.h> +#endif + +#include <jni.h> +#include "common_tools.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) + #ifdef _OPENAL32LIB + #define ALCAPI __declspec(dllexport) + #else + #define ALCAPI __declspec(dllimport) + #endif + + #define ALCAPIENTRY __cdecl +#else + #define ALCAPI + #define ALCAPIENTRY + +#endif + +#ifdef _WIN32 + #ifdef _OPENAL32LIB + #define ALAPI __declspec(dllexport) + #else + #define ALAPI __declspec(dllimport) + #endif + #define ALAPIENTRY __cdecl + #define AL_CALLBACK +#else + #define ALAPI + #define ALAPIENTRY + #define AL_CALLBACK +#endif + +#define INITGUID +#define OPENAL + +// ALC typedefs +typedef struct ALCdevice_struct ALCdevice; +typedef struct ALCcontext_struct ALCcontext; +/** 8-bit boolean */ +typedef char ALCboolean; + +/** character */ +typedef char ALCchar; + +/** signed 8-bit 2's complement integer */ +typedef char ALCbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALCubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALCshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALCushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALCint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALCuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALCsizei; + +/** enumerated 32-bit value */ +typedef int ALCenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALCfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALCdouble; + +/** void type (for opaque pointers only) */ +typedef void ALCvoid; + +// AL typedefs +/** 8-bit boolean */ +typedef char ALboolean; + +/** character */ +typedef char ALchar; + +/** signed 8-bit 2's complement integer */ +typedef char ALbyte; + +/** unsigned 8-bit integer */ +typedef unsigned char ALubyte; + +/** signed 16-bit 2's complement integer */ +typedef short ALshort; + +/** unsigned 16-bit integer */ +typedef unsigned short ALushort; + +/** signed 32-bit 2's complement integer */ +typedef int ALint; + +/** unsigned 32-bit integer */ +typedef unsigned int ALuint; + +/** non-negative 32-bit binary integer size */ +typedef int ALsizei; + +/** enumerated 32-bit value */ +typedef int ALenum; + +/** 32-bit IEEE754 floating-point */ +typedef float ALfloat; + +/** 64-bit IEEE754 floating-point */ +typedef double ALdouble; + +/** void type (for opaque pointers only) */ +typedef void ALvoid; + +void* extal_GetProcAddress(const char* function); +void extal_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions); + +/* Platform dependent functions */ +void *extal_NativeGetFunctionPointer(const char *function); +void extal_LoadLibrary(JNIEnv *env, jstring path); +void extal_UnloadLibrary(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/extcl.c b/etc/lwjgl-2.9.1/src/native/common/extcl.c new file mode 100644 index 0000000..c87e068 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/extcl.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY void * (CL_API_CALL *clGetExtensionFunctionAddressPROC) (const char * func_name); +static clGetExtensionFunctionAddressPROC clGetExtensionFunctionAddress; + +/** + * Retrieves a pointer to the named function + * + * @param function Name of function + * @return pointer to named function, or NULL if not found + */ +void* extcl_GetProcAddress(const char * function) { + void *p = NULL; + + if ( clGetExtensionFunctionAddress == NULL ) + clGetExtensionFunctionAddress = extcl_NativeGetFunctionPointer("clGetExtensionFunctionAddress"); + + p = clGetExtensionFunctionAddress(function); + if ( p == NULL ) + p = extcl_NativeGetFunctionPointer(function); + + return p; +} + +void extcl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions) { + ext_InitializeClass(env, clazz, &extcl_GetProcAddress, num_functions, functions); +} + +size_t extcl_CalculateImageSize(const size_t *region, size_t row_pitch, size_t slice_pitch) { + if ( slice_pitch == 0 ) + return region[1] * row_pitch; + else + return region[2] * slice_pitch; +} diff --git a/etc/lwjgl-2.9.1/src/native/common/extcl.h b/etc/lwjgl-2.9.1/src/native/common/extcl.h new file mode 100644 index 0000000..20f10f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/extcl.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __EXTCL_H__ +#define __EXTCL_H__ + +#include <jni.h> + +#ifdef __APPLE__ + #include <OpenCL/cl_platform.h> +#else + #include <CL/cl_platform.h> +#endif + +#include "common_tools.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "extgl_types.h" +#include "extcl_types.h" + +// -----------------[ OpenGL-dependent typedefs ]----------------- +typedef GLsync cl_GLsync; + +// -----------------[ Callback function typedefs ]----------------- + +#ifndef CL_CALLBACK + #define CL_CALLBACK +#endif + +typedef void (CL_CALLBACK * cl_create_context_callback)(const char *errinfo, const void *private_info, size_t cb, void *user_data); +typedef void (CL_CALLBACK * cl_mem_object_destructor_callback)(cl_mem memobj, void *user_data); +typedef void (CL_CALLBACK * cl_program_callback)(cl_program program, void *user_data); +typedef void (CL_CALLBACK * cl_event_callback)(cl_event event, cl_int event_command_exec_status, void *user_data); +typedef void (CL_CALLBACK * cl_native_kernel_func)(void *args); +typedef void (CL_CALLBACK * cl_printf_callback)(cl_context context, cl_uint printf_data_len, char *printf_data_ptr, void *user_data); + +// -----------------[ Cross-platform functions ]----------------- + +void* extcl_GetProcAddress(const char* function); +void extcl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions); +size_t extcl_CalculateImageSize(const size_t *region, size_t row_pitch, size_t slice_pitch); + +// -----------------[ Platform dependent functions ]----------------- + +void *extcl_NativeGetFunctionPointer(const char *function); +void extcl_LoadLibrary(JNIEnv *env, jstring path); +void extcl_UnloadLibrary(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/extcl_types.h b/etc/lwjgl-2.9.1/src/native/common/extcl_types.h new file mode 100644 index 0000000..940ba4a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/extcl_types.h @@ -0,0 +1,95 @@ +// -----------------[ Core typedefs ]----------------- + +typedef struct _cl_platform_id * cl_platform_id; +typedef struct _cl_device_id * cl_device_id; +typedef struct _cl_context * cl_context; +typedef struct _cl_command_queue * cl_command_queue; +typedef struct _cl_mem * cl_mem; +typedef struct _cl_program * cl_program; +typedef struct _cl_kernel * cl_kernel; +typedef struct _cl_event * cl_event; +typedef struct _cl_sampler * cl_sampler; + +typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ +typedef cl_ulong cl_bitfield; +typedef cl_bitfield cl_device_type; +typedef cl_uint cl_platform_info; +typedef cl_uint cl_device_info; +typedef cl_bitfield cl_device_fp_config; +typedef cl_uint cl_device_mem_cache_type; +typedef cl_uint cl_device_local_mem_type; +typedef cl_bitfield cl_device_exec_capabilities; +typedef cl_bitfield cl_command_queue_properties; +typedef intptr_t cl_device_partition_property; +typedef cl_bitfield cl_device_affinity_domain; + +typedef intptr_t cl_context_properties; +typedef cl_uint cl_context_info; +typedef cl_uint cl_command_queue_info; +typedef cl_uint cl_channel_order; +typedef cl_uint cl_channel_type; +typedef cl_bitfield cl_mem_flags; +typedef cl_uint cl_mem_object_type; +typedef cl_uint cl_mem_info; +typedef cl_bitfield cl_mem_migration_flags; +typedef cl_uint cl_image_info; +typedef cl_uint cl_buffer_create_type; +typedef cl_uint cl_addressing_mode; +typedef cl_uint cl_filter_mode; +typedef cl_uint cl_sampler_info; +typedef cl_bitfield cl_map_flags; +typedef cl_uint cl_program_info; +typedef cl_uint cl_program_build_info; +typedef cl_uint cl_program_binary_type; +typedef cl_int cl_build_status; +typedef cl_uint cl_kernel_info; +typedef cl_uint cl_kernel_arg_info; +typedef cl_uint cl_kernel_arg_address_qualifier; +typedef cl_uint cl_kernel_arg_access_qualifier; +typedef cl_uint cl_kernel_work_group_info; +typedef cl_uint cl_event_info; +typedef cl_uint cl_command_type; +typedef cl_uint cl_profiling_info; + +typedef struct _cl_image_format { + cl_channel_order image_channel_order; + cl_channel_type image_channel_data_type; +} cl_image_format; + +typedef struct _cl_image_desc { + cl_mem_object_type image_type; + size_t image_width; + size_t image_height; + size_t image_depth; + size_t image_array_size; + size_t image_row_pitch; + size_t image_slice_pitch; + cl_uint num_mip_levels; + cl_uint num_samples; + cl_mem buffer; +} cl_image_desc; + +typedef struct _cl_buffer_region { + size_t origin; + size_t size; +} cl_buffer_region; + +// cl_gl.h +typedef cl_uint cl_gl_platform_info; +typedef cl_uint cl_gl_context_info; +typedef cl_uint cl_gl_object_type; +typedef cl_uint cl_gl_texture_info; + +// -----------------[ Extension typedefs ]----------------- + +// EXT_device_fission +typedef cl_ulong cl_device_partition_property_ext; +// EXT_migrate_memobject +typedef cl_bitfield cl_mem_migration_flags_ext; + +// KHR_subgroups +typedef cl_uint cl_kernel_sub_group_info; + +// -----------------[ Convenience typedefs ]----------------- + +typedef void cl_void; diff --git a/etc/lwjgl-2.9.1/src/native/common/opencl.h b/etc/lwjgl-2.9.1/src/native/common/opencl.h new file mode 100644 index 0000000..68b41e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opencl.h @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2008-2010 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. + ******************************************************************************/ + +/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */ + +#ifndef __OPENCL_H +#define __OPENCL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __APPLE__ + +#include <OpenCL/cl.h> +#include <OpenCL/cl_gl.h> +#include <OpenCL/cl_gl_ext.h> +#include <OpenCL/cl_ext.h> + +#else + +#include <CL/cl.h> +#include <CL/cl_gl.h> +#include <CL/cl_gl_ext.h> +#include <CL/cl_ext.h> + +#endif + +#include "common_tools.h" + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENCL_H */ + diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.c b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.c new file mode 100644 index 0000000..c965ede --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.c @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2001-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. +------------------------------------------------------------------------------*/ +/* + Lev Povalahev + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ + +*/ + +#include <stdio.h> +#include <string.h> +#include "extgl.h" +#include "common_tools.h" + +void extgl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions) { + ext_InitializeClass(env, clazz, &extgl_GetProcAddress, num_functions, functions); +} + +bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions) { + return ext_InitializeFunctions(&extgl_GetProcAddress, num_functions, functions); +} + +bool extgl_QueryExtension(const GLubyte*extensions, const char *name) +{ + const GLubyte *start; + GLubyte *where, *terminator; + + if (extensions == NULL) { + printfDebug("NULL extension string\n"); + return false; + } + + /* Extension names should not have spaces. */ + where = (GLubyte *) strchr(name, ' '); + if (where || *name == '\0') + return false; + + /* It takes a bit of care to be fool-proof about parsing the + OpenGL extensions string. Don't be fooled by sub-strings, + etc. */ + start = extensions; + for (;;) + { + where = (GLubyte *) strstr((const char *) start, name); + if (!where) + break; + terminator = where + strlen(name); + if (where == start || *(where - 1) == ' ') + if (*terminator == ' ' || *terminator == '\0') { + return true; + } + start = terminator; + } + return false; + +} + diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.h b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.h new file mode 100644 index 0000000..c9382df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl.h @@ -0,0 +1,124 @@ +/* Small parts were taken from Mesa's glext.h and gl.h, here's the license: */ + +/* + * Mesa 3-D graphics library + * Version: 6.5.1 + * + * Copyright (C) 1999-2006 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. + */ + +/* Some parts derived from files copyright (c) 2001-2002 Lev Povalahev under this license: */ + +/* ---------------------------------------------------------------------------- +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. +------------------------------------------------------------------------------*/ +/* + GL_draw_range_elements support added by Benjamin Karaban + + Lev Povalahev contact information: + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ +*/ + +#ifndef __EXTGL_H__ +#define __EXTGL_H__ + +#include <jni.h> + +#include <string.h> +#include <stddef.h> + +#ifdef __APPLE__ + #include <OpenCL/cl_platform.h> +#else + #include <CL/cl_platform.h> +#endif + +#include "common_tools.h" + +#if defined(_WIN32) || defined(_WIN64) + #include <windows.h> // fix APIENTRY macro redefinition +#endif + +#ifndef APIENTRY + #define APIENTRY +#endif + +#include "extcl_types.h" +#include "extgl_types.h" + +/* AMD_debug_output callback function pointer. */ +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +/* ARB_debug_output callback function pointer. */ +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +/* KHR_debug callback function pointer. */ +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +/* initializes everything, call this right after the rc is created. the function returns true if successful */ +extern bool extgl_Open(JNIEnv *env); +extern void extgl_Close(void); +extern void extgl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions); +extern bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions); +extern bool extgl_QueryExtension(const GLubyte*extensions, const char *name); +extern void *extgl_GetProcAddress(const char *name); + + +#ifndef __APPLE__ + /* NV_present_video functions (GLX & WGL only) */ + extern jint extgl_EnumerateVideoDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); + extern jboolean extgl_BindVideoDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position); + extern jboolean extgl_QueryContextNV(JNIEnv *env, jobject peer_info_handle, jobject context_handle, jint attrib, jobject value, jint value_position); + + /* NV_video_capture functions (GLX & WGL only) */ + extern jboolean extgl_BindVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong device); + extern jint extgl_EnumerateVideoCaptureDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); + extern jboolean extgl_LockVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); + extern jboolean extgl_QueryVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device, jint attribute, jobject value, jint value_position); + extern jboolean extgl_ReleaseVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); +#endif + +#endif /* __EXTGL_H__ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/extgl_types.h b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl_types.h new file mode 100644 index 0000000..c8d92dc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/extgl_types.h @@ -0,0 +1,55 @@ +#if defined(_WIN32) || defined(_WIN64) + #define int64_t __int64 + #define uint64_t unsigned __int64 +#endif + +#ifdef _MACOSX + typedef unsigned long GLenum; + typedef unsigned char GLboolean; + typedef unsigned long GLbitfield; + typedef signed char GLbyte; + typedef short GLshort; + typedef long GLint; + typedef long GLsizei; + typedef unsigned char GLubyte; + typedef unsigned short GLushort; + typedef unsigned long GLuint; + typedef float GLfloat; + typedef float GLclampf; + typedef double GLdouble; + typedef double GLclampd; + typedef void GLvoid; +#else + typedef unsigned int GLenum; + typedef unsigned char GLboolean; + typedef unsigned int GLbitfield; + typedef void GLvoid; + typedef signed char GLbyte; /* 1-byte signed */ + typedef short GLshort; /* 2-byte signed */ + typedef int GLint; /* 4-byte signed */ + typedef unsigned char GLubyte; /* 1-byte unsigned */ + typedef unsigned short GLushort; /* 2-byte unsigned */ + typedef unsigned int GLuint; /* 4-byte unsigned */ + typedef int GLsizei; /* 4-byte signed */ + typedef float GLfloat; /* single precision float */ + typedef float GLclampf; /* single precision float in [0,1] */ + typedef double GLdouble; /* double precision float */ + typedef double GLclampd; /* double precision float in [0,1] */ +#endif + +typedef char GLchar; /* native character */ + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +typedef char GLcharARB; /* native character */ +typedef unsigned int GLhandleARB; /* shader object handle */ +typedef unsigned short GLhalfARB; +typedef unsigned short GLhalfNV; +typedef unsigned short GLhalf; +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +typedef int64_t GLint64; +typedef uint64_t GLuint64; +typedef struct __GLsync * GLsync; \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.c b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.c new file mode 100644 index 0000000..9b49e08 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.c @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * JNI implementation of the ARB/AMD_debug_output & KHR_debug function callbacks. + * + * @author Spasi + */ + +#include <jni.h> +#include "common_tools.h" +#include "extgl.h" +#include "org_lwjgl_opengl_CallbackUtil.h" + +static jmethodID debugOutputCallbackARBJ; +static jmethodID debugOutputCallbackAMDJ; +static jmethodID debugCallbackKHRJ; + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_ncreateGlobalRef(JNIEnv *env, jclass clazz, jobject obj) { + return (jlong)(intptr_t)(*env)->NewGlobalRef(env, obj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_CallbackUtil_deleteGlobalRef(JNIEnv *env, jclass clazz, jlong globalRef) { + (*env)->DeleteGlobalRef(env, (jobject)(intptr_t)globalRef); +} + +// ----------------- [ ARB_debug_output ] ----------------- + +static void APIENTRY debugOutputCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && debugOutputCallbackARBJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)userParam, debugOutputCallbackARBJ, + (jint)source, + (jint)type, + (jint)id, + (jint)severity, + NewStringNativeWithLength(env, message, length) + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugOutputCallbackARB(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( debugOutputCallbackARBJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opengl/ARBDebugOutputCallback$Handler"); + if ( callbackClass != NULL ) + debugOutputCallbackARBJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(IIIILjava/lang/String;)V"); + } + + return (jlong)(intptr_t)&debugOutputCallbackARB; +} + +// ----------------- [ AMD_debug_output ] ----------------- + +static void APIENTRY debugOutputCallbackAMD(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && debugOutputCallbackAMDJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)userParam, debugOutputCallbackAMDJ, + (jint)id, + (jint)category, + (jint)severity, + NewStringNativeWithLength(env, message, length) + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugOutputCallbackAMD(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( debugOutputCallbackAMDJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opengl/AMDDebugOutputCallback$Handler"); + if ( callbackClass != NULL ) + debugOutputCallbackAMDJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(IIILjava/lang/String;)V"); + } + + return (jlong)(intptr_t)&debugOutputCallbackAMD; +} + +// ----------------- [ KHR_debug ] ----------------- + +static void APIENTRY debugCallbackKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && debugCallbackKHRJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)userParam, debugCallbackKHRJ, + (jint)source, + (jint)type, + (jint)id, + (jint)severity, + NewStringNativeWithLength(env, message, length) + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugCallbackKHR(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( debugCallbackKHRJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opengl/KHRDebugCallback$Handler"); + if ( callbackClass != NULL ) + debugCallbackKHRJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(IIIILjava/lang/String;)V"); + } + + return (jlong)(intptr_t)&debugCallbackKHR; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.h new file mode 100644 index 0000000..247fc27 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_CallbackUtil.h @@ -0,0 +1,53 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_CallbackUtil */ + +#ifndef _Included_org_lwjgl_opengl_CallbackUtil +#define _Included_org_lwjgl_opengl_CallbackUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_CallbackUtil + * Method: ncreateGlobalRef + * Signature: (Ljava/lang/Object;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_ncreateGlobalRef + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_CallbackUtil + * Method: deleteGlobalRef + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_CallbackUtil_deleteGlobalRef + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_CallbackUtil + * Method: getDebugOutputCallbackARB + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugOutputCallbackARB + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_CallbackUtil + * Method: getDebugOutputCallbackAMD + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugOutputCallbackAMD + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_CallbackUtil + * Method: getDebugCallbackKHR + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugCallbackKHR + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.c b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.c new file mode 100644 index 0000000..3e336c5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_GLContext.h" +#include "extgl.h" + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_GLContext_ngetFunctionAddress(JNIEnv *env, jclass clazz, jlong function_name) { + return (jlong)(intptr_t)extgl_GetProcAddress((char *)(intptr_t)function_name); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_nLoadOpenGLLibrary(JNIEnv * env, jclass clazz) { + extgl_Open(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_nUnloadOpenGLLibrary(JNIEnv * env, jclass clazz) { + extgl_Close(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_resetNativeStubs(JNIEnv *env, jclass clazz, jclass gl_class) { + (*env)->UnregisterNatives(env, gl_class); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.h new file mode 100644 index 0000000..54d4879 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext.h @@ -0,0 +1,45 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_GLContext */ + +#ifndef _Included_org_lwjgl_opengl_GLContext +#define _Included_org_lwjgl_opengl_GLContext +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_GLContext + * Method: ngetFunctionAddress + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_GLContext_ngetFunctionAddress + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_GLContext + * Method: nLoadOpenGLLibrary + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_nLoadOpenGLLibrary + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_GLContext + * Method: nUnloadOpenGLLibrary + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_nUnloadOpenGLLibrary + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_GLContext + * Method: resetNativeStubs + * Signature: (Ljava/lang/Class;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GLContext_resetNativeStubs + (JNIEnv *, jclass, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry.h new file mode 100644 index 0000000..eae0b71 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry */ + +#ifndef _Included_org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry +#define _Included_org_lwjgl_opengl_GLContext_CapabilitiesCacheEntry +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.c b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.c new file mode 100644 index 0000000..3e84287 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * JNI implementation of the NVPresentVideoUtil class (GLX & WGL only). + * + * @author Spasi + */ + +#include <jni.h> +#include "common_tools.h" +#include "extgl.h" +#include "org_lwjgl_opengl_NVPresentVideoUtil.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglEnumerateVideoDevicesNV( + JNIEnv *env, jclass clazz, jobject peer_info, jobject devices, jint devices_position +) { + #ifdef __APPLE__ + return 0; + #else + return extgl_EnumerateVideoDevicesNV(env, peer_info, devices, devices_position); + #endif +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglBindVideoDeviceNV( + JNIEnv *env, jclass clazz, jobject peer_info, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position +) { + #ifdef __APPLE__ + return false; + #else + return extgl_BindVideoDeviceNV(env, peer_info, video_slot, video_device, attrib_list, attrib_list_position); + #endif +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglQueryContextNV(JNIEnv *env, jclass clazz, jobject peer_info, jobject context_handle, jint attrib, jobject value, jint value_position) { + #ifdef __APPLE__ + return false; + #else + return extgl_QueryContextNV(env, peer_info, context_handle, attrib, value, value_position); + #endif +} diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.h new file mode 100644 index 0000000..79bf87e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVPresentVideoUtil.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_NVPresentVideoUtil */ + +#ifndef _Included_org_lwjgl_opengl_NVPresentVideoUtil +#define _Included_org_lwjgl_opengl_NVPresentVideoUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_NVPresentVideoUtil + * Method: nglEnumerateVideoDevicesNV + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/LongBuffer;I)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglEnumerateVideoDevicesNV + (JNIEnv *, jclass, jobject, jobject, jint); + +/* + * Class: org_lwjgl_opengl_NVPresentVideoUtil + * Method: nglBindVideoDeviceNV + * Signature: (Ljava/nio/ByteBuffer;IJLjava/nio/IntBuffer;I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglBindVideoDeviceNV + (JNIEnv *, jclass, jobject, jint, jlong, jobject, jint); + +/* + * Class: org_lwjgl_opengl_NVPresentVideoUtil + * Method: nglQueryContextNV + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;ILjava/nio/IntBuffer;I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPresentVideoUtil_nglQueryContextNV + (JNIEnv *, jclass, jobject, jobject, jint, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.c b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.c new file mode 100644 index 0000000..ce663de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * JNI implementation of the NVVideoCaptureUtil class (GLX & WGL only). + * + * @author Spasi + */ + +#include <jni.h> +#include "common_tools.h" +#include "extgl.h" +#include "org_lwjgl_opengl_NVVideoCaptureUtil.h" + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglBindVideoCaptureDeviceNV(JNIEnv *env, jclass clazz, jobject peer_info, jint video_slot, jlong device) { + #ifdef __APPLE__ + return false; + #else + return extgl_BindVideoCaptureDeviceNV(env, peer_info, video_slot, device); + #endif +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglEnumerateVideoCaptureDevicesNV(JNIEnv *env, jclass clazz, jobject peer_info, jobject devices, jint devices_position) { + #ifdef __APPLE__ + return 0; + #else + return extgl_EnumerateVideoCaptureDevicesNV(env, peer_info, devices, devices_position); + #endif +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglLockVideoCaptureDeviceNV(JNIEnv *env, jclass clazz, jobject peer_info, jlong device) { + #ifdef __APPLE__ + return false; + #else + return extgl_LockVideoCaptureDeviceNV(env, peer_info, device); + #endif +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglQueryVideoCaptureDeviceNV(JNIEnv *env, jclass clazz, jobject peer_info, jlong device, jint attribute, jobject value, jint value_position) { + #ifdef __APPLE__ + return false; + #else + return extgl_QueryVideoCaptureDeviceNV(env, peer_info, device, attribute, value, value_position); + #endif +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglReleaseVideoCaptureDeviceNV(JNIEnv *env, jclass clazz, jobject peer_info, jlong device) { + #ifdef __APPLE__ + return false; + #else + return extgl_ReleaseVideoCaptureDeviceNV(env, peer_info, device); + #endif +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.h new file mode 100644 index 0000000..1aea21b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_NVVideoCaptureUtil.h @@ -0,0 +1,53 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_NVVideoCaptureUtil */ + +#ifndef _Included_org_lwjgl_opengl_NVVideoCaptureUtil +#define _Included_org_lwjgl_opengl_NVVideoCaptureUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_NVVideoCaptureUtil + * Method: nglBindVideoCaptureDeviceNV + * Signature: (Ljava/nio/ByteBuffer;IJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglBindVideoCaptureDeviceNV + (JNIEnv *, jclass, jobject, jint, jlong); + +/* + * Class: org_lwjgl_opengl_NVVideoCaptureUtil + * Method: nglEnumerateVideoCaptureDevicesNV + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/LongBuffer;I)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglEnumerateVideoCaptureDevicesNV + (JNIEnv *, jclass, jobject, jobject, jint); + +/* + * Class: org_lwjgl_opengl_NVVideoCaptureUtil + * Method: nglLockVideoCaptureDeviceNV + * Signature: (Ljava/nio/ByteBuffer;J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglLockVideoCaptureDeviceNV + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_lwjgl_opengl_NVVideoCaptureUtil + * Method: nglQueryVideoCaptureDeviceNV + * Signature: (Ljava/nio/ByteBuffer;JILjava/nio/IntBuffer;I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglQueryVideoCaptureDeviceNV + (JNIEnv *, jclass, jobject, jlong, jint, jobject, jint); + +/* + * Class: org_lwjgl_opengl_NVVideoCaptureUtil + * Method: nglReleaseVideoCaptureDeviceNV + * Signature: (Ljava/nio/ByteBuffer;J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVVideoCaptureUtil_nglReleaseVideoCaptureDeviceNV + (JNIEnv *, jclass, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_Pbuffer.h b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_Pbuffer.h new file mode 100644 index 0000000..d1c25be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengl/org_lwjgl_opengl_Pbuffer.h @@ -0,0 +1,47 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_Pbuffer */ + +#ifndef _Included_org_lwjgl_opengl_Pbuffer +#define _Included_org_lwjgl_opengl_Pbuffer +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_Pbuffer_PBUFFER_SUPPORTED +#define org_lwjgl_opengl_Pbuffer_PBUFFER_SUPPORTED 1L +#undef org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_SUPPORTED +#define org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_SUPPORTED 2L +#undef org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_RECTANGLE_SUPPORTED +#define org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_RECTANGLE_SUPPORTED 4L +#undef org_lwjgl_opengl_Pbuffer_RENDER_DEPTH_TEXTURE_SUPPORTED +#define org_lwjgl_opengl_Pbuffer_RENDER_DEPTH_TEXTURE_SUPPORTED 8L +#undef org_lwjgl_opengl_Pbuffer_MIPMAP_LEVEL +#define org_lwjgl_opengl_Pbuffer_MIPMAP_LEVEL 8315L +#undef org_lwjgl_opengl_Pbuffer_CUBE_MAP_FACE +#define org_lwjgl_opengl_Pbuffer_CUBE_MAP_FACE 8316L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_X +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_X 8317L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_X +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_X 8318L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_Y +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_Y 8319L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_Y +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_Y 8320L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_Z +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_POSITIVE_Z 8321L +#undef org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_Z +#define org_lwjgl_opengl_Pbuffer_TEXTURE_CUBE_MAP_NEGATIVE_Z 8322L +#undef org_lwjgl_opengl_Pbuffer_FRONT_LEFT_BUFFER +#define org_lwjgl_opengl_Pbuffer_FRONT_LEFT_BUFFER 8323L +#undef org_lwjgl_opengl_Pbuffer_FRONT_RIGHT_BUFFER +#define org_lwjgl_opengl_Pbuffer_FRONT_RIGHT_BUFFER 8324L +#undef org_lwjgl_opengl_Pbuffer_BACK_LEFT_BUFFER +#define org_lwjgl_opengl_Pbuffer_BACK_LEFT_BUFFER 8325L +#undef org_lwjgl_opengl_Pbuffer_BACK_RIGHT_BUFFER +#define org_lwjgl_opengl_Pbuffer_BACK_RIGHT_BUFFER 8326L +#undef org_lwjgl_opengl_Pbuffer_DEPTH_BUFFER +#define org_lwjgl_opengl_Pbuffer_DEPTH_BUFFER 8359L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.c b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.c new file mode 100644 index 0000000..3da9bd2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.c @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2001-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. +------------------------------------------------------------------------------*/ +/* + Lev Povalahev + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ + +*/ + +#include <stdio.h> +#include <string.h> +#include "extgl.h" +#include "common_tools.h" + +void extgl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions) { + ext_InitializeClass(env, clazz, &extgl_GetProcAddress, num_functions, functions); +} + +bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions) { + return ext_InitializeFunctions(&extgl_GetProcAddress, num_functions, functions); +} + +bool extgl_QueryExtension(const char *extensions, const char *name) +{ + const char *start; + char *where, *terminator; + + if (extensions == NULL) { + printfDebug("NULL extension string\n"); + return false; + } + + /* Extension names should not have spaces. */ + where = (char *) strchr(name, ' '); + if (where || *name == '\0') + return false; + + /* It takes a bit of care to be fool-proof about parsing the + OpenGL extensions string. Don't be fooled by sub-strings, + etc. */ + start = extensions; + for (;;) + { + where = (char *) strstr((const char *) start, name); + if (!where) + break; + terminator = where + strlen(name); + if (where == start || *(where - 1) == ' ') + if (*terminator == ' ' || *terminator == '\0') { + return true; + } + start = terminator; + } + return false; + +} + diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.h b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.h new file mode 100644 index 0000000..124d748 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl.h @@ -0,0 +1,92 @@ +/* Small parts were taken from Mesa's glext.h and gl.h, here's the license: */ + +/* + * Mesa 3-D graphics library + * Version: 6.5.1 + * + * Copyright (C) 1999-2006 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. + */ + +/* Some parts derived from files copyright (c) 2001-2002 Lev Povalahev under this license: */ + +/* ---------------------------------------------------------------------------- +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. +------------------------------------------------------------------------------*/ +/* + GL_draw_range_elements support added by Benjamin Karaban + + Lev Povalahev contact information: + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ +*/ + +#ifndef __EXTGL_H__ +#define __EXTGL_H__ + +#include <jni.h> + +#include <string.h> +#include <stddef.h> + +#include "common_tools.h" + +#include <EGL/egl.h> +//#include <GLES2/gl2.h> +#include <GLES2/gl2platform.h> + +#include "extgl_types.h" + +/* KHR_debug callback function pointer. */ +typedef void (GL_APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +/* initializes everything, call this right after the rc is created. the function returns true if successful */ +extern bool extgl_Open(JNIEnv *env); +extern void extgl_Close(void); +extern void extgl_InitializeClass(JNIEnv *env, jclass clazz, int num_functions, JavaMethodAndExtFunction *functions); +extern bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions); +extern bool extgl_QueryExtension(const char *extensions, const char *name); +extern void *extgl_GetProcAddress(const char *name); + +#endif /* __EXTGL_H__ */ diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.c b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.c new file mode 100644 index 0000000..f2c782b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.c @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2002-2011 LWJGL Project +* 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. +* +* * Neither the name of 'LWJGL' nor the names of +* its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "extgl_egl.h" + +static void extgl_InitEGLKHRLockSurface(EGLExtensions *extensions) { + ExtFunction functions[] = { + { "eglLockSurfaceKHR", (void *)&extensions->eglLockSurfaceKHR }, + { "eglUnlockSurfaceKHR", (void *)&extensions->eglUnlockSurfaceKHR } + }; + if ( extensions->EGLKHRLockSurface ) + extensions->EGLKHRLockSurface = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitEGLKHRImageBase(EGLExtensions *extensions) { + ExtFunction functions[] = { + { "eglCreateImageKHR", (void *)&extensions->eglCreateImageKHR }, + { "eglDestroyImageKHR", (void *)&extensions->eglDestroyImageKHR } + }; + if ( extensions->EGLKHRImageBase ) + extensions->EGLKHRImageBase = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitEGLKHRFenceSync(EGLExtensions *extensions) { + ExtFunction functions[] = { + { "eglCreateSyncKHR", (void *)&extensions->eglCreateSyncKHR }, + { "eglDestroySyncKHR", (void *)&extensions->eglDestroySyncKHR }, + { "eglClientWaitSyncKHR", (void *)&extensions->eglClientWaitSyncKHR }, + { "eglSignalSyncKHR", (void *)&extensions->eglSignalSyncKHR }, + { "eglGetSyncAttribKHR", (void *)&extensions->eglGetSyncAttribKHR } + }; + if (extensions->EGLKHRFenceSync) + extensions->EGLKHRFenceSync = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitEGLNVSync(EGLExtensions *extensions) { + ExtFunction functions[] = { + { "eglCreateFenceSyncNV", (void *)&extensions->eglCreateFenceSyncNV }, + { "eglDestroySyncNV", (void *)&extensions->eglDestroySyncNV }, + { "eglFenceNV", (void *)&extensions->eglFenceNV }, + { "eglClientWaitSyncNV", (void *)&extensions->eglClientWaitSyncNV }, + { "eglSignalSyncNV", (void *)&extensions->eglSignalSyncNV }, + { "eglGetSyncAttribNV", (void *)&extensions->eglGetSyncAttribNV } + + }; + if (extensions->EGLNVSync) + extensions->EGLNVSync = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitSupportedEGLExtensions(EGLDisplay dpy, EGLExtensions *extensions) { + const char *extension_string = eglQueryString(dpy, EGL_EXTENSIONS); + + extensions->EGLKHRConfigAttribs = extgl_QueryExtension(extension_string, "EGL_KHR_config_attribs"); + extensions->EGLKHRLockSurface = extgl_QueryExtension(extension_string, "EGL_KHR_lock_surface"); + extensions->EGLKHRImage = extgl_QueryExtension(extension_string, "EGL_KHR_image"); + extensions->EGLKHRVGParentImage = extgl_QueryExtension(extension_string, "EGL_KHR_vg_parent_image"); + extensions->EGLKHRGLTexture2DImage = extgl_QueryExtension(extension_string, "EGL_KHR_gl_texture_2D_image"); + extensions->EGLKHRGLTextureCubemapImage = extgl_QueryExtension(extension_string, "EGL_KHR_gl_texture_cubemap_image"); + extensions->EGLKHRGLTexture3DImage = extgl_QueryExtension(extension_string, "EGL_KHR_gl_texture_3D_image"); + extensions->EGLKHRGLRenderbufferImage = extgl_QueryExtension(extension_string, "EGL_KHR_gl_renderbuffer_image"); + extensions->EGLKHRReusableSync = extgl_QueryExtension(extension_string, "EGL_KHR_reusable_sync"); + extensions->EGLKHRImageBase = extgl_QueryExtension(extension_string, "EGL_KHR_image_base"); + extensions->EGLKHRImagePixmap = extgl_QueryExtension(extension_string, "EGL_KHR_image_pixmap"); + extensions->EGLIMGContextPriority = extgl_QueryExtension(extension_string, "EGL_IMG_context_priority"); + extensions->EGLNVCoverageSample = extgl_QueryExtension(extension_string, "EGL_NV_coverage_sample"); + extensions->EGLNVDepthNonlinear = extgl_QueryExtension(extension_string, "EGL_NV_depth_nonlinear"); + extensions->EGLNVSync = extgl_QueryExtension(extension_string, "EGL_NV_sync"); + extensions->EGLKHRFenceSync = extgl_QueryExtension(extension_string, "EGL_KHR_fence_sync"); +} + +void extgl_InitEGL(EGLDisplay dpy, EGLExtensions *extensions) { + extgl_InitSupportedEGLExtensions(dpy, extensions); + + extgl_InitEGLKHRLockSurface(extensions); + extgl_InitEGLKHRImageBase(extensions); + extgl_InitEGLKHRFenceSync(extensions); + extgl_InitEGLNVSync(extensions); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.h b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.h new file mode 100644 index 0000000..e8711d4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_egl.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _EXTGL_EGL_H +#define _EXTGL_EGL_H + +#include "extgl.h" +#include "common_tools.h" + +#include <EGL/eglext.h> + +typedef struct { + bool EGLKHRConfigAttribs; + bool EGLKHRLockSurface; + bool EGLKHRImage; + bool EGLKHRVGParentImage; + bool EGLKHRGLTexture2DImage; + bool EGLKHRGLTextureCubemapImage; + bool EGLKHRGLTexture3DImage; + bool EGLKHRGLRenderbufferImage; + bool EGLKHRFenceSync; + bool EGLKHRReusableSync; + bool EGLKHRImageBase; + bool EGLKHRImagePixmap; + bool EGLIMGContextPriority; + bool EGLNVCoverageSample; + bool EGLNVDepthNonlinear; + bool EGLNVSync; + + PFNEGLLOCKSURFACEKHRPROC eglLockSurfaceKHR; + PFNEGLUNLOCKSURFACEKHRPROC eglUnlockSurfaceKHR; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR; + + PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; + PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; + PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; + PFNEGLSIGNALSYNCKHRPROC eglSignalSyncKHR; + PFNEGLGETSYNCATTRIBKHRPROC eglGetSyncAttribKHR; + + PFNEGLCREATEFENCESYNCNVPROC eglCreateFenceSyncNV; + PFNEGLDESTROYSYNCNVPROC eglDestroySyncNV; + PFNEGLFENCENVPROC eglFenceNV; + PFNEGLCLIENTWAITSYNCNVPROC eglClientWaitSyncNV; + PFNEGLSIGNALSYNCNVPROC eglSignalSyncNV; + PFNEGLGETSYNCATTRIBNVPROC eglGetSyncAttribNV; +} EGLExtensions; + +extern void extgl_InitEGL(EGLDisplay dpy, EGLExtensions *extensions); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_types.h b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_types.h new file mode 100644 index 0000000..d459a1c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/extgl_types.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _EXTGL_TYPES_H +#define _EXTGL_TYPES_H + +#include <KHR/khrplatform.h> + +/*------------------------------------------------------------------------- + * Data type definitions + *-----------------------------------------------------------------------*/ + +typedef void GLvoid; +typedef char GLchar; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef khronos_int8_t GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; + +// OpenGL ES 3.0 +typedef unsigned short GLhalf; +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef struct __GLsync *GLsync; + +/* GL types for handling large vertex buffer objects */ +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + +typedef khronos_int64_t EGLint64NV; +typedef khronos_uint64_t EGLuint64NV; + +// EGL_image_OES +typedef void* GLeglImageOES; + +#endif \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.c new file mode 100644 index 0000000..514483e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * JNI implementation of the ARB/AMD_debug_output & KHR_debug function callbacks. + * + * @author Spasi + */ + +#include <jni.h> +#include "common_tools.h" +#include "extgl.h" +#include "org_lwjgl_opengles_CallbackUtil.h" + +static jmethodID debugCallbackKHRJ; + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_ncreateGlobalRef(JNIEnv *env, jclass clazz, jobject obj) { + return (jlong)(intptr_t)(*env)->NewGlobalRef(env, obj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_CallbackUtil_deleteGlobalRef(JNIEnv *env, jclass clazz, jlong globalRef) { + (*env)->DeleteGlobalRef(env, (jobject)(intptr_t)globalRef); +} + +// ----------------- [ KHR_debug ] ----------------- + +static void APIENTRY debugCallbackKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && debugCallbackKHRJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)userParam, debugCallbackKHRJ, + (jint)source, + (jint)type, + (jint)id, + (jint)severity, + NewStringNativeWithLength(env, message, length) + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_CallbackUtil_getDebugCallbackKHR(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( debugCallbackKHRJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opengles/KHRDebugCallback$Handler"); + if ( callbackClass != NULL ) + debugCallbackKHRJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(IIIILjava/lang/String;)V"); + } + + return (jlong)(intptr_t)&debugCallbackKHRJ; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.h new file mode 100644 index 0000000..61cb23c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_CallbackUtil.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_CallbackUtil */ + +#ifndef _Included_org_lwjgl_opengles_CallbackUtil +#define _Included_org_lwjgl_opengles_CallbackUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengles_CallbackUtil + * Method: ncreateGlobalRef + * Signature: (Ljava/lang/Object;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_CallbackUtil_ncreateGlobalRef + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengles_CallbackUtil + * Method: deleteGlobalRef + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_CallbackUtil_deleteGlobalRef + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengles_CallbackUtil + * Method: getDebugCallbackKHR + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_CallbackUtil_getDebugCallbackKHR + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.c new file mode 100644 index 0000000..1dcfb49 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengles_EGL.h" +#include "extgl_egl.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGL_eglGetError(JNIEnv *env, jclass clazz) { + return eglGetError(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetDisplay(JNIEnv *env, jclass clazz, jlong display_id) { + return (intptr_t)eglGetDisplay((EGLNativeDisplayType)(intptr_t)display_id); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglInitialize(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong version) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLint *version_address = (EGLint *)(intptr_t)version; + + return eglInitialize(dpy, version_address, version_address + 1); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglTerminate(JNIEnv *env, jclass clazz, jlong dpy_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + + return eglTerminate(dpy); +} + +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengles_EGL_neglQueryString(JNIEnv *env, jclass clazz, jlong dpy_ptr, jint name) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + const char * __result = eglQueryString(dpy, name); + if ( __result == NULL ) + return NULL; + + return NewStringNativeWithLength(env, __result, (jsize)strlen(__result)); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglGetConfigs(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong configs, jint config_size, jlong num_config) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLConfig *configs_address = (EGLConfig *)(intptr_t)configs; + EGLint *num_config_address = (EGLint *)(intptr_t)num_config; + + return eglGetConfigs(dpy, configs_address, config_size, num_config_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglChooseConfig(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong attrib_list, jlong configs, jint config_size, jlong num_config) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + EGLConfig *configs_address = (EGLConfig *)(intptr_t)configs; + EGLint *num_config_address = (EGLint *)(intptr_t)num_config; + + return eglChooseConfig(dpy, attrib_list_address, configs_address, config_size, num_config_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglGetConfigAttrib(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong config_ptr, jint attribute, jlong value) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLConfig config = (EGLConfig)(intptr_t)config_ptr; + EGLint *value_address = (EGLint *)(intptr_t)value; + + return eglGetConfigAttrib(dpy, config, attribute, value_address); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreateWindowSurface(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong config_ptr, jlong win, jlong attrib_list) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLConfig config = (EGLConfig)(intptr_t)config_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + + return (intptr_t)eglCreateWindowSurface(dpy, config, (EGLNativeWindowType)(intptr_t)win, attrib_list_address); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreatePbufferSurface(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong config_ptr, jlong attrib_list) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLConfig config = (EGLConfig)(intptr_t)config_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + + return (intptr_t)eglCreatePbufferSurface(dpy, config, attrib_list_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglDestroySurface(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong surface_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSurface surface = (EGLSurface)(intptr_t)surface_ptr; + + return eglDestroySurface(dpy, surface); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSurfaceAttrib(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong surface_ptr, jint attribute, jint value) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSurface surface = (EGLSurface)(intptr_t)surface_ptr; + + return eglSurfaceAttrib(dpy, surface, attribute, value); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglQuerySurface(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong surface_ptr, jint attribute, jlong value) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSurface surface = (EGLSurface)(intptr_t)surface_ptr; + EGLint *value_address = (EGLint *)(intptr_t)value; + + return eglQuerySurface(dpy, surface, attribute, value_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglBindAPI(JNIEnv *env, jclass clazz, jint api) { + return eglBindAPI(api); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGL_eglQueryAPI(JNIEnv *env, jclass clazz) { + return eglQueryAPI(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglReleaseThread(JNIEnv *env, jclass clazz) { + return eglReleaseThread(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSwapInterval(JNIEnv *env, jclass clazz, jlong dpy_ptr, jint interval) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + return eglSwapInterval(dpy, interval); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreateContext(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong config_ptr, jlong share_context_ptr, jlong attrib_list) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLConfig config = (EGLConfig)(intptr_t)config_ptr; + EGLContext share_context = (EGLContext)(intptr_t)share_context_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + + return (intptr_t)eglCreateContext(dpy, config, share_context, attrib_list_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglDestroyContext(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong ctx_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLContext ctx = (EGLContext)(intptr_t)ctx_ptr; + + return eglDestroyContext(dpy, ctx); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglMakeCurrent(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong draw_ptr, jlong read_ptr, jlong ctx_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSurface draw = (EGLSurface)(intptr_t)draw_ptr; + EGLSurface read = (EGLSurface)(intptr_t)read_ptr; + EGLContext ctx = (EGLContext)(intptr_t)ctx_ptr; + + return eglMakeCurrent(dpy, draw, read, ctx); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentContext(JNIEnv *env, jclass clazz) { + return (intptr_t)eglGetCurrentContext(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentSurface(JNIEnv *env, jclass clazz, jint readdraw) { + return (intptr_t)eglGetCurrentSurface(readdraw); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentDisplay(JNIEnv *env, jclass clazz) { + return (intptr_t)eglGetCurrentDisplay(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglQueryContext(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong ctx_ptr, jint attribute, jlong value) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLContext ctx = (EGLContext)(intptr_t)ctx_ptr; + EGLint *value_address = (EGLint *)(intptr_t)value; + + return eglQueryContext(dpy, ctx, attribute, value_address); + +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitClient(JNIEnv *env, jclass clazz) { + return eglWaitClient(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitGL(JNIEnv *env, jclass clazz) { + return eglWaitGL(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitNative(JNIEnv *env, jclass clazz, jint engine) { + return eglWaitNative(engine); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSwapBuffers(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong surface_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSurface surface = (EGLSurface)(intptr_t)surface_ptr; + + return eglSwapBuffers(dpy, surface); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.h new file mode 100644 index 0000000..4253aee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGL.h @@ -0,0 +1,469 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_EGL */ + +#ifndef _Included_org_lwjgl_opengles_EGL +#define _Included_org_lwjgl_opengles_EGL +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengles_EGL_EGL_FALSE +#define org_lwjgl_opengles_EGL_EGL_FALSE 0L +#undef org_lwjgl_opengles_EGL_EGL_TRUE +#define org_lwjgl_opengles_EGL_EGL_TRUE 1L +#undef org_lwjgl_opengles_EGL_EGL_DEFAULT_DISPLAY +#define org_lwjgl_opengles_EGL_EGL_DEFAULT_DISPLAY 0L +#undef org_lwjgl_opengles_EGL_EGL_NO_CONTEXT +#define org_lwjgl_opengles_EGL_EGL_NO_CONTEXT 0L +#undef org_lwjgl_opengles_EGL_EGL_NO_DISPLAY +#define org_lwjgl_opengles_EGL_EGL_NO_DISPLAY 0L +#undef org_lwjgl_opengles_EGL_EGL_NO_SURFACE +#define org_lwjgl_opengles_EGL_EGL_NO_SURFACE 0L +#undef org_lwjgl_opengles_EGL_EGL_DONT_CARE +#define org_lwjgl_opengles_EGL_EGL_DONT_CARE -1L +#undef org_lwjgl_opengles_EGL_EGL_SUCCESS +#define org_lwjgl_opengles_EGL_EGL_SUCCESS 12288L +#undef org_lwjgl_opengles_EGL_EGL_NOT_INITIALIZED +#define org_lwjgl_opengles_EGL_EGL_NOT_INITIALIZED 12289L +#undef org_lwjgl_opengles_EGL_EGL_BAD_ACCESS +#define org_lwjgl_opengles_EGL_EGL_BAD_ACCESS 12290L +#undef org_lwjgl_opengles_EGL_EGL_BAD_ALLOC +#define org_lwjgl_opengles_EGL_EGL_BAD_ALLOC 12291L +#undef org_lwjgl_opengles_EGL_EGL_BAD_ATTRIBUTE +#define org_lwjgl_opengles_EGL_EGL_BAD_ATTRIBUTE 12292L +#undef org_lwjgl_opengles_EGL_EGL_BAD_CONFIG +#define org_lwjgl_opengles_EGL_EGL_BAD_CONFIG 12293L +#undef org_lwjgl_opengles_EGL_EGL_BAD_CONTEXT +#define org_lwjgl_opengles_EGL_EGL_BAD_CONTEXT 12294L +#undef org_lwjgl_opengles_EGL_EGL_BAD_CURRENT_SURFACE +#define org_lwjgl_opengles_EGL_EGL_BAD_CURRENT_SURFACE 12295L +#undef org_lwjgl_opengles_EGL_EGL_BAD_DISPLAY +#define org_lwjgl_opengles_EGL_EGL_BAD_DISPLAY 12296L +#undef org_lwjgl_opengles_EGL_EGL_BAD_MATCH +#define org_lwjgl_opengles_EGL_EGL_BAD_MATCH 12297L +#undef org_lwjgl_opengles_EGL_EGL_BAD_NATIVE_PIXMAP +#define org_lwjgl_opengles_EGL_EGL_BAD_NATIVE_PIXMAP 12298L +#undef org_lwjgl_opengles_EGL_EGL_BAD_NATIVE_WINDOW +#define org_lwjgl_opengles_EGL_EGL_BAD_NATIVE_WINDOW 12299L +#undef org_lwjgl_opengles_EGL_EGL_BAD_PARAMETER +#define org_lwjgl_opengles_EGL_EGL_BAD_PARAMETER 12300L +#undef org_lwjgl_opengles_EGL_EGL_BAD_SURFACE +#define org_lwjgl_opengles_EGL_EGL_BAD_SURFACE 12301L +#undef org_lwjgl_opengles_EGL_EGL_CONTEXT_LOST +#define org_lwjgl_opengles_EGL_EGL_CONTEXT_LOST 12302L +#undef org_lwjgl_opengles_EGL_EGL_BUFFER_SIZE +#define org_lwjgl_opengles_EGL_EGL_BUFFER_SIZE 12320L +#undef org_lwjgl_opengles_EGL_EGL_ALPHA_SIZE +#define org_lwjgl_opengles_EGL_EGL_ALPHA_SIZE 12321L +#undef org_lwjgl_opengles_EGL_EGL_BLUE_SIZE +#define org_lwjgl_opengles_EGL_EGL_BLUE_SIZE 12322L +#undef org_lwjgl_opengles_EGL_EGL_GREEN_SIZE +#define org_lwjgl_opengles_EGL_EGL_GREEN_SIZE 12323L +#undef org_lwjgl_opengles_EGL_EGL_RED_SIZE +#define org_lwjgl_opengles_EGL_EGL_RED_SIZE 12324L +#undef org_lwjgl_opengles_EGL_EGL_DEPTH_SIZE +#define org_lwjgl_opengles_EGL_EGL_DEPTH_SIZE 12325L +#undef org_lwjgl_opengles_EGL_EGL_STENCIL_SIZE +#define org_lwjgl_opengles_EGL_EGL_STENCIL_SIZE 12326L +#undef org_lwjgl_opengles_EGL_EGL_CONFIG_CAVEAT +#define org_lwjgl_opengles_EGL_EGL_CONFIG_CAVEAT 12327L +#undef org_lwjgl_opengles_EGL_EGL_CONFIG_ID +#define org_lwjgl_opengles_EGL_EGL_CONFIG_ID 12328L +#undef org_lwjgl_opengles_EGL_EGL_LEVEL +#define org_lwjgl_opengles_EGL_EGL_LEVEL 12329L +#undef org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_HEIGHT +#define org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_HEIGHT 12330L +#undef org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_PIXELS +#define org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_PIXELS 12331L +#undef org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_WIDTH +#define org_lwjgl_opengles_EGL_EGL_MAX_PBUFFER_WIDTH 12332L +#undef org_lwjgl_opengles_EGL_EGL_NATIVE_RENDERABLE +#define org_lwjgl_opengles_EGL_EGL_NATIVE_RENDERABLE 12333L +#undef org_lwjgl_opengles_EGL_EGL_NATIVE_VISUAL_ID +#define org_lwjgl_opengles_EGL_EGL_NATIVE_VISUAL_ID 12334L +#undef org_lwjgl_opengles_EGL_EGL_NATIVE_VISUAL_TYPE +#define org_lwjgl_opengles_EGL_EGL_NATIVE_VISUAL_TYPE 12335L +#undef org_lwjgl_opengles_EGL_EGL_SAMPLES +#define org_lwjgl_opengles_EGL_EGL_SAMPLES 12337L +#undef org_lwjgl_opengles_EGL_EGL_SAMPLE_BUFFERS +#define org_lwjgl_opengles_EGL_EGL_SAMPLE_BUFFERS 12338L +#undef org_lwjgl_opengles_EGL_EGL_SURFACE_TYPE +#define org_lwjgl_opengles_EGL_EGL_SURFACE_TYPE 12339L +#undef org_lwjgl_opengles_EGL_EGL_TRANSPARENT_TYPE +#define org_lwjgl_opengles_EGL_EGL_TRANSPARENT_TYPE 12340L +#undef org_lwjgl_opengles_EGL_EGL_TRANSPARENT_BLUE_VALUE +#define org_lwjgl_opengles_EGL_EGL_TRANSPARENT_BLUE_VALUE 12341L +#undef org_lwjgl_opengles_EGL_EGL_TRANSPARENT_GREEN_VALUE +#define org_lwjgl_opengles_EGL_EGL_TRANSPARENT_GREEN_VALUE 12342L +#undef org_lwjgl_opengles_EGL_EGL_TRANSPARENT_RED_VALUE +#define org_lwjgl_opengles_EGL_EGL_TRANSPARENT_RED_VALUE 12343L +#undef org_lwjgl_opengles_EGL_EGL_NONE +#define org_lwjgl_opengles_EGL_EGL_NONE 12344L +#undef org_lwjgl_opengles_EGL_EGL_BIND_TO_TEXTURE_RGB +#define org_lwjgl_opengles_EGL_EGL_BIND_TO_TEXTURE_RGB 12345L +#undef org_lwjgl_opengles_EGL_EGL_BIND_TO_TEXTURE_RGBA +#define org_lwjgl_opengles_EGL_EGL_BIND_TO_TEXTURE_RGBA 12346L +#undef org_lwjgl_opengles_EGL_EGL_MIN_SWAP_INTERVAL +#define org_lwjgl_opengles_EGL_EGL_MIN_SWAP_INTERVAL 12347L +#undef org_lwjgl_opengles_EGL_EGL_MAX_SWAP_INTERVAL +#define org_lwjgl_opengles_EGL_EGL_MAX_SWAP_INTERVAL 12348L +#undef org_lwjgl_opengles_EGL_EGL_LUMINANCE_SIZE +#define org_lwjgl_opengles_EGL_EGL_LUMINANCE_SIZE 12349L +#undef org_lwjgl_opengles_EGL_EGL_ALPHA_MASK_SIZE +#define org_lwjgl_opengles_EGL_EGL_ALPHA_MASK_SIZE 12350L +#undef org_lwjgl_opengles_EGL_EGL_COLOR_BUFFER_TYPE +#define org_lwjgl_opengles_EGL_EGL_COLOR_BUFFER_TYPE 12351L +#undef org_lwjgl_opengles_EGL_EGL_RENDERABLE_TYPE +#define org_lwjgl_opengles_EGL_EGL_RENDERABLE_TYPE 12352L +#undef org_lwjgl_opengles_EGL_EGL_MATCH_NATIVE_PIXMAP +#define org_lwjgl_opengles_EGL_EGL_MATCH_NATIVE_PIXMAP 12353L +#undef org_lwjgl_opengles_EGL_EGL_CONFORMANT +#define org_lwjgl_opengles_EGL_EGL_CONFORMANT 12354L +#undef org_lwjgl_opengles_EGL_EGL_SLOW_CONFIG +#define org_lwjgl_opengles_EGL_EGL_SLOW_CONFIG 12368L +#undef org_lwjgl_opengles_EGL_EGL_NON_CONFORMANT_CONFIG +#define org_lwjgl_opengles_EGL_EGL_NON_CONFORMANT_CONFIG 12369L +#undef org_lwjgl_opengles_EGL_EGL_TRANSPARENT_RGB +#define org_lwjgl_opengles_EGL_EGL_TRANSPARENT_RGB 12370L +#undef org_lwjgl_opengles_EGL_EGL_RGB_BUFFER +#define org_lwjgl_opengles_EGL_EGL_RGB_BUFFER 12430L +#undef org_lwjgl_opengles_EGL_EGL_LUMINANCE_BUFFER +#define org_lwjgl_opengles_EGL_EGL_LUMINANCE_BUFFER 12431L +#undef org_lwjgl_opengles_EGL_EGL_NO_TEXTURE +#define org_lwjgl_opengles_EGL_EGL_NO_TEXTURE 12380L +#undef org_lwjgl_opengles_EGL_EGL_TEXTURE_RGB +#define org_lwjgl_opengles_EGL_EGL_TEXTURE_RGB 12381L +#undef org_lwjgl_opengles_EGL_EGL_TEXTURE_RGBA +#define org_lwjgl_opengles_EGL_EGL_TEXTURE_RGBA 12382L +#undef org_lwjgl_opengles_EGL_EGL_TEXTURE_2D +#define org_lwjgl_opengles_EGL_EGL_TEXTURE_2D 12383L +#undef org_lwjgl_opengles_EGL_EGL_PBUFFER_BIT +#define org_lwjgl_opengles_EGL_EGL_PBUFFER_BIT 1L +#undef org_lwjgl_opengles_EGL_EGL_PIXMAP_BIT +#define org_lwjgl_opengles_EGL_EGL_PIXMAP_BIT 2L +#undef org_lwjgl_opengles_EGL_EGL_WINDOW_BIT +#define org_lwjgl_opengles_EGL_EGL_WINDOW_BIT 4L +#undef org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_LINEAR_BIT +#define org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_LINEAR_BIT 32L +#undef org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_PRE_BIT +#define org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_PRE_BIT 64L +#undef org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_BOX_BIT +#define org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_BOX_BIT 512L +#undef org_lwjgl_opengles_EGL_EGL_SWAP_BEHAVIOR_PRESERVED_BIT +#define org_lwjgl_opengles_EGL_EGL_SWAP_BEHAVIOR_PRESERVED_BIT 1024L +#undef org_lwjgl_opengles_EGL_EGL_OPENGL_ES_BIT +#define org_lwjgl_opengles_EGL_EGL_OPENGL_ES_BIT 1L +#undef org_lwjgl_opengles_EGL_EGL_OPENVG_BIT +#define org_lwjgl_opengles_EGL_EGL_OPENVG_BIT 2L +#undef org_lwjgl_opengles_EGL_EGL_OPENGL_ES2_BIT +#define org_lwjgl_opengles_EGL_EGL_OPENGL_ES2_BIT 4L +#undef org_lwjgl_opengles_EGL_EGL_OPENGL_BIT +#define org_lwjgl_opengles_EGL_EGL_OPENGL_BIT 8L +#undef org_lwjgl_opengles_EGL_EGL_VENDOR +#define org_lwjgl_opengles_EGL_EGL_VENDOR 12371L +#undef org_lwjgl_opengles_EGL_EGL_VERSION +#define org_lwjgl_opengles_EGL_EGL_VERSION 12372L +#undef org_lwjgl_opengles_EGL_EGL_EXTENSIONS +#define org_lwjgl_opengles_EGL_EGL_EXTENSIONS 12373L +#undef org_lwjgl_opengles_EGL_EGL_CLIENT_APIS +#define org_lwjgl_opengles_EGL_EGL_CLIENT_APIS 12429L +#undef org_lwjgl_opengles_EGL_EGL_HEIGHT +#define org_lwjgl_opengles_EGL_EGL_HEIGHT 12374L +#undef org_lwjgl_opengles_EGL_EGL_WIDTH +#define org_lwjgl_opengles_EGL_EGL_WIDTH 12375L +#undef org_lwjgl_opengles_EGL_EGL_LARGEST_PBUFFER +#define org_lwjgl_opengles_EGL_EGL_LARGEST_PBUFFER 12376L +#undef org_lwjgl_opengles_EGL_EGL_TEXTURE_FORMAT +#define org_lwjgl_opengles_EGL_EGL_TEXTURE_FORMAT 12416L +#undef org_lwjgl_opengles_EGL_EGL_TEXTURE_TARGET +#define org_lwjgl_opengles_EGL_EGL_TEXTURE_TARGET 12417L +#undef org_lwjgl_opengles_EGL_EGL_MIPMAP_TEXTURE +#define org_lwjgl_opengles_EGL_EGL_MIPMAP_TEXTURE 12418L +#undef org_lwjgl_opengles_EGL_EGL_MIPMAP_LEVEL +#define org_lwjgl_opengles_EGL_EGL_MIPMAP_LEVEL 12419L +#undef org_lwjgl_opengles_EGL_EGL_RENDER_BUFFER +#define org_lwjgl_opengles_EGL_EGL_RENDER_BUFFER 12422L +#undef org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE +#define org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE 12423L +#undef org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT +#define org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT 12424L +#undef org_lwjgl_opengles_EGL_EGL_HORIZONTAL_RESOLUTION +#define org_lwjgl_opengles_EGL_EGL_HORIZONTAL_RESOLUTION 12432L +#undef org_lwjgl_opengles_EGL_EGL_VERTICAL_RESOLUTION +#define org_lwjgl_opengles_EGL_EGL_VERTICAL_RESOLUTION 12433L +#undef org_lwjgl_opengles_EGL_EGL_PIXEL_ASPECT_RATIO +#define org_lwjgl_opengles_EGL_EGL_PIXEL_ASPECT_RATIO 12434L +#undef org_lwjgl_opengles_EGL_EGL_SWAP_BEHAVIOR +#define org_lwjgl_opengles_EGL_EGL_SWAP_BEHAVIOR 12435L +#undef org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE +#define org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE 12441L +#undef org_lwjgl_opengles_EGL_EGL_BACK_BUFFER +#define org_lwjgl_opengles_EGL_EGL_BACK_BUFFER 12420L +#undef org_lwjgl_opengles_EGL_EGL_SINGLE_BUFFER +#define org_lwjgl_opengles_EGL_EGL_SINGLE_BUFFER 12421L +#undef org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_sRGB +#define org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_sRGB 12425L +#undef org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_LINEAR +#define org_lwjgl_opengles_EGL_EGL_VG_COLORSPACE_LINEAR 12426L +#undef org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_NONPRE +#define org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_NONPRE 12427L +#undef org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_PRE +#define org_lwjgl_opengles_EGL_EGL_VG_ALPHA_FORMAT_PRE 12428L +#undef org_lwjgl_opengles_EGL_EGL_DISPLAY_SCALING +#define org_lwjgl_opengles_EGL_EGL_DISPLAY_SCALING 10000L +#undef org_lwjgl_opengles_EGL_EGL_UNKNOWN +#define org_lwjgl_opengles_EGL_EGL_UNKNOWN -1L +#undef org_lwjgl_opengles_EGL_EGL_BUFFER_PRESERVED +#define org_lwjgl_opengles_EGL_EGL_BUFFER_PRESERVED 12436L +#undef org_lwjgl_opengles_EGL_EGL_BUFFER_DESTROYED +#define org_lwjgl_opengles_EGL_EGL_BUFFER_DESTROYED 12437L +#undef org_lwjgl_opengles_EGL_EGL_OPENVG_IMAGE +#define org_lwjgl_opengles_EGL_EGL_OPENVG_IMAGE 12438L +#undef org_lwjgl_opengles_EGL_EGL_CONTEXT_CLIENT_TYPE +#define org_lwjgl_opengles_EGL_EGL_CONTEXT_CLIENT_TYPE 12439L +#undef org_lwjgl_opengles_EGL_EGL_CONTEXT_CLIENT_VERSION +#define org_lwjgl_opengles_EGL_EGL_CONTEXT_CLIENT_VERSION 12440L +#undef org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_DEFAULT +#define org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_DEFAULT 12442L +#undef org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_BOX +#define org_lwjgl_opengles_EGL_EGL_MULTISAMPLE_RESOLVE_BOX 12443L +#undef org_lwjgl_opengles_EGL_EGL_OPENGL_ES_API +#define org_lwjgl_opengles_EGL_EGL_OPENGL_ES_API 12448L +#undef org_lwjgl_opengles_EGL_EGL_OPENVG_API +#define org_lwjgl_opengles_EGL_EGL_OPENVG_API 12449L +#undef org_lwjgl_opengles_EGL_EGL_OPENGL_API +#define org_lwjgl_opengles_EGL_EGL_OPENGL_API 12450L +#undef org_lwjgl_opengles_EGL_EGL_DRAW +#define org_lwjgl_opengles_EGL_EGL_DRAW 12377L +#undef org_lwjgl_opengles_EGL_EGL_READ +#define org_lwjgl_opengles_EGL_EGL_READ 12378L +#undef org_lwjgl_opengles_EGL_EGL_CORE_NATIVE_ENGINE +#define org_lwjgl_opengles_EGL_EGL_CORE_NATIVE_ENGINE 12379L +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglGetError + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGL_eglGetError + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetDisplay + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetDisplay + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglInitialize + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglInitialize + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglTerminate + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglTerminate + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglQueryString + * Signature: (JI)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengles_EGL_neglQueryString + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetConfigs + * Signature: (JJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglGetConfigs + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglChooseConfig + * Signature: (JJJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglChooseConfig + (JNIEnv *, jclass, jlong, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetConfigAttrib + * Signature: (JJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglGetConfigAttrib + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglCreateWindowSurface + * Signature: (JJJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreateWindowSurface + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglCreatePbufferSurface + * Signature: (JJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreatePbufferSurface + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglSurfaceAttrib + * Signature: (JJII)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSurfaceAttrib + (JNIEnv *, jclass, jlong, jlong, jint, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglDestroySurface + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglDestroySurface + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglQuerySurface + * Signature: (JJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglQuerySurface + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglBindAPI + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglBindAPI + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglQueryAPI + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGL_eglQueryAPI + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglReleaseThread + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglReleaseThread + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglSwapInterval + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSwapInterval + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglCreateContext + * Signature: (JJJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglCreateContext + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglDestroyContext + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglDestroyContext + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglMakeCurrent + * Signature: (JJJJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglMakeCurrent + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetCurrentContext + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentContext + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetCurrentSurface + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentSurface + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglGetCurrentDisplay + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGL_neglGetCurrentDisplay + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglQueryContext + * Signature: (JJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglQueryContext + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglWaitClient + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitClient + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglWaitGL + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitGL + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: eglWaitNative + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_eglWaitNative + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengles_EGL + * Method: neglSwapBuffers + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGL_neglSwapBuffers + (JNIEnv *, jclass, jlong, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.c new file mode 100644 index 0000000..9183513 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengles_EGLKHRFenceSync.h" +#include "extgl_egl.h" + +static PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; +static PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; +static PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; +static PFNEGLGETSYNCATTRIBKHRPROC eglGetSyncAttribKHR; + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglCreateSyncKHR(JNIEnv *env, jclass clazz, jlong dpy_ptr, jint type, jlong attrib_list) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + + return (intptr_t)eglCreateSyncKHR(dpy, type, attrib_list_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglDestroySyncKHR(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong sync_ptr) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSyncKHR sync = (EGLSyncKHR)(intptr_t)sync_ptr; + + return eglDestroySyncKHR(dpy, sync); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglClientWaitSyncKHR(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong sync_ptr, jint flags, jlong timeout) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSyncKHR sync = (EGLSyncKHR)(intptr_t)sync_ptr; + + return eglClientWaitSyncKHR(dpy, sync, flags, timeout); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglGetSyncAttribKHR(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong sync_ptr, jint attribute, jlong value) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSyncKHR sync = (EGLSyncKHR)(intptr_t)sync_ptr; + EGLint *value_address = (EGLint *)(intptr_t)value; + + return eglGetSyncAttribKHR(dpy, sync, attribute, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"neglCreateSyncKHR", "(JIJ)J", (void *)&Java_org_lwjgl_opengles_EGLKHRFenceSync_neglCreateSyncKHR, "eglCreateSyncKHR", (void *)&eglCreateSyncKHR, false}, + {"neglDestroySyncKHR", "(JJ)Z", (void *)&Java_org_lwjgl_opengles_EGLKHRFenceSync_neglDestroySyncKHR, "eglDestroySyncKHR", (void *)&eglDestroySyncKHR, false}, + {"neglClientWaitSyncKHR", "(JJIJ)I", (void *)&Java_org_lwjgl_opengles_EGLKHRFenceSync_neglClientWaitSyncKHR, "eglClientWaitSyncKHR", (void *)&eglClientWaitSyncKHR, false}, + {"neglGetSyncAttribKHR", "(JJIJ)Z", (void *)&Java_org_lwjgl_opengles_EGLKHRFenceSync_neglGetSyncAttribKHR, "eglGetSyncAttribKHR", (void *)&eglGetSyncAttribKHR, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.h new file mode 100644 index 0000000..28e767a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRFenceSync.h @@ -0,0 +1,77 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_EGLKHRFenceSync */ + +#ifndef _Included_org_lwjgl_opengles_EGLKHRFenceSync +#define _Included_org_lwjgl_opengles_EGLKHRFenceSync +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_FENCE_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_FENCE_KHR 12537L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_TYPE_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_TYPE_KHR 12535L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_STATUS_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_STATUS_KHR 12529L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_CONDITION_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_CONDITION_KHR 12536L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SIGNALED_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SIGNALED_KHR 12530L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_UNSIGNALED_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_UNSIGNALED_KHR 12531L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 12528L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_FLUSH_COMMANDS_BIT_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 1L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_FOREVER_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_FOREVER_KHR -1i64 +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_TIMEOUT_EXPIRED_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_TIMEOUT_EXPIRED_KHR 12533L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_CONDITION_SATISFIED_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_CONDITION_SATISFIED_KHR 12534L +#undef org_lwjgl_opengles_EGLKHRFenceSync_EGL_NO_SYNC_KHR +#define org_lwjgl_opengles_EGLKHRFenceSync_EGL_NO_SYNC_KHR 0i64 +/* + * Class: org_lwjgl_opengles_EGLKHRFenceSync + * Method: initNativeStubs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_initNativeStubs + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGLKHRFenceSync + * Method: neglCreateSyncKHR + * Signature: (JIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglCreateSyncKHR + (JNIEnv *, jclass, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGLKHRFenceSync + * Method: neglDestroySyncKHR + * Signature: (JJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglDestroySyncKHR + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengles_EGLKHRFenceSync + * Method: neglClientWaitSyncKHR + * Signature: (JJIJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglClientWaitSyncKHR + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGLKHRFenceSync + * Method: neglGetSyncAttribKHR + * Signature: (JJIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRFenceSync_neglGetSyncAttribKHR + (JNIEnv *, jclass, jlong, jlong, jint, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.c new file mode 100644 index 0000000..971e092 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengles_EGLKHRReusableSync.h" +#include "extgl_egl.h" + +static PFNEGLSIGNALSYNCKHRPROC eglSignalSyncKHR; + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRReusableSync_neglSignalSyncKHR(JNIEnv *env, jclass clazz, jlong dpy_ptr, jlong sync_ptr, jint mode) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + EGLSyncKHR sync = (EGLSyncKHR)(intptr_t)sync_ptr; + return eglSignalSyncKHR(dpy, sync, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLKHRReusableSync_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"neglSignalSyncKHR", "(JJI)Z", (void *)&Java_org_lwjgl_opengles_EGLKHRReusableSync_neglSignalSyncKHR, "eglSignalSyncKHR", (void *)&eglSignalSyncKHR, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.h new file mode 100644 index 0000000..21118e2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLKHRReusableSync.h @@ -0,0 +1,49 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_EGLKHRReusableSync */ + +#ifndef _Included_org_lwjgl_opengles_EGLKHRReusableSync +#define _Included_org_lwjgl_opengles_EGLKHRReusableSync +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_REUSABLE_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_REUSABLE_KHR 12538L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_TYPE_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_TYPE_KHR 12535L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_STATUS_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_STATUS_KHR 12529L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_SIGNALED_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_SIGNALED_KHR 12530L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_UNSIGNALED_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_UNSIGNALED_KHR 12531L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_FLUSH_COMMANDS_BIT_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 1L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_FOREVER_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_FOREVER_KHR -1i64 +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_TIMEOUT_EXPIRED_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_TIMEOUT_EXPIRED_KHR 12533L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_CONDITION_SATISFIED_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_CONDITION_SATISFIED_KHR 12534L +#undef org_lwjgl_opengles_EGLKHRReusableSync_EGL_NO_SYNC_KHR +#define org_lwjgl_opengles_EGLKHRReusableSync_EGL_NO_SYNC_KHR 0i64 +/* + * Class: org_lwjgl_opengles_EGLKHRReusableSync + * Method: initNativeStubs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLKHRReusableSync_initNativeStubs + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGLKHRReusableSync + * Method: neglSignalSyncKHR + * Signature: (JJI)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLKHRReusableSync_neglSignalSyncKHR + (JNIEnv *, jclass, jlong, jlong, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.c new file mode 100644 index 0000000..655a848 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengles_EGLNVSync.h" +#include "extgl_egl.h" + +static PFNEGLCREATEFENCESYNCNVPROC eglCreateFenceSyncNV; +static PFNEGLDESTROYSYNCNVPROC eglDestroySyncNV; +static PFNEGLFENCENVPROC eglFenceNV; +static PFNEGLCLIENTWAITSYNCNVPROC eglClientWaitSyncNV; +static PFNEGLSIGNALSYNCNVPROC eglSignalSyncNV; +static PFNEGLGETSYNCATTRIBNVPROC eglGetSyncAttribNV; + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglCreateFenceSyncNV(JNIEnv *env, jclass clazz, jlong dpy_ptr, jint condition, jlong attrib_list) { + EGLDisplay dpy = (EGLDisplay)(intptr_t)dpy_ptr; + const EGLint *attrib_list_address = (EGLint *)(intptr_t)attrib_list; + + return (intptr_t)eglCreateFenceSyncNV(dpy, condition, attrib_list_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglDestroySyncNV(JNIEnv *env, jclass clazz, jlong sync_ptr) { + EGLSyncNV sync = (EGLSyncNV)(intptr_t)sync_ptr; + + return eglDestroySyncNV(sync); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglFenceNV(JNIEnv *env, jclass clazz, jlong sync_ptr) { + EGLSyncNV sync = (EGLSyncNV)(intptr_t)sync_ptr; + + return eglFenceNV(sync); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglClientWaitSyncNV(JNIEnv *env, jclass clazz, jlong sync_ptr, jint flags, jlong timeout) { + EGLSyncNV sync = (EGLSyncNV)(intptr_t)sync_ptr; + + return eglClientWaitSyncNV(sync, flags, timeout); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglSignalSyncNV(JNIEnv *env, jclass clazz, jlong sync_ptr, jint mode) { + EGLSyncNV sync = (EGLSyncNV)(intptr_t)sync_ptr; + + return eglSignalSyncNV(sync, mode); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglGetSyncAttribNV(JNIEnv *env, jclass clazz, jlong sync_ptr, jint attribute, jlong value) { + EGLSyncNV sync = (EGLSyncNV)(intptr_t)sync_ptr; + EGLint *value_address = (EGLint *)(intptr_t)value; + + return eglGetSyncAttribNV(sync, attribute, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLNVSync_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"neglCreateFenceSyncNV", "(JIJ)J", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglCreateFenceSyncNV, "eglCreateFenceSyncNV", (void *)&eglCreateFenceSyncNV, false}, + {"neglDestroySyncNV", "(J)Z", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglDestroySyncNV, "eglDestroySyncNV", (void *)&eglDestroySyncNV, false}, + {"neglFenceNV", "(J)Z", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglFenceNV, "eglFenceNV", (void *)&eglFenceNV, false}, + {"neglClientWaitSyncNV", "(JIJ)I", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglClientWaitSyncNV, "eglClientWaitSyncNV", (void *)&eglClientWaitSyncNV, false}, + {"neglSignalSyncNV", "(JI)Z", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglSignalSyncNV, "eglSignalSyncNV", (void *)&eglSignalSyncNV, false}, + {"neglGetSyncAttribNV", "(JIJ)Z", (void *)&Java_org_lwjgl_opengles_EGLNVSync_neglGetSyncAttribNV, "eglGetSyncAttribNV", (void *)&eglGetSyncAttribNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.h new file mode 100644 index 0000000..e5566b4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_EGLNVSync.h @@ -0,0 +1,95 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_EGLNVSync */ + +#ifndef _Included_org_lwjgl_opengles_EGLNVSync +#define _Included_org_lwjgl_opengles_EGLNVSync +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 12518L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_STATUS_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_STATUS_NV 12519L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SIGNALED_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SIGNALED_NV 12520L +#undef org_lwjgl_opengles_EGLNVSync_EGL_UNSIGNALED_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_UNSIGNALED_NV 12521L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_FLUSH_COMMANDS_BIT_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_FLUSH_COMMANDS_BIT_NV 1L +#undef org_lwjgl_opengles_EGLNVSync_EGL_FOREVER_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_FOREVER_NV -1i64 +#undef org_lwjgl_opengles_EGLNVSync_EGL_ALREADY_SIGNALED_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_ALREADY_SIGNALED_NV 12522L +#undef org_lwjgl_opengles_EGLNVSync_EGL_TIMEOUT_EXPIRED_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_TIMEOUT_EXPIRED_NV 12523L +#undef org_lwjgl_opengles_EGLNVSync_EGL_CONDITION_SATISFIED_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_CONDITION_SATISFIED_NV 12524L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_TYPE_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_TYPE_NV 12525L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_CONDITION_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_CONDITION_NV 12526L +#undef org_lwjgl_opengles_EGLNVSync_EGL_SYNC_FENCE_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_SYNC_FENCE_NV 12527L +#undef org_lwjgl_opengles_EGLNVSync_EGL_NO_SYNC_NV +#define org_lwjgl_opengles_EGLNVSync_EGL_NO_SYNC_NV 0i64 +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: initNativeStubs + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EGLNVSync_initNativeStubs + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglCreateFenceSyncNV + * Signature: (JIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglCreateFenceSyncNV + (JNIEnv *, jclass, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglDestroySyncNV + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglDestroySyncNV + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglFenceNV + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglFenceNV + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglClientWaitSyncNV + * Signature: (JIJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglClientWaitSyncNV + (JNIEnv *, jclass, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglSignalSyncNV + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglSignalSyncNV + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengles_EGLNVSync + * Method: neglGetSyncAttribNV + * Signature: (JIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_EGLNVSync_neglGetSyncAttribNV + (JNIEnv *, jclass, jlong, jint, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.c b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.c new file mode 100644 index 0000000..f7273f3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengles_GLContext.h" +#include "extgl.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_nLoadOpenGLLibrary(JNIEnv * env, jclass clazz) { + extgl_Open(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_nUnloadOpenGLLibrary(JNIEnv * env, jclass clazz) { + extgl_Close(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_resetNativeStubs(JNIEnv *env, jclass clazz, jclass gl_class) { + //(*env)->UnregisterNatives(env, gl_class); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.h new file mode 100644 index 0000000..5365e5a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_GLContext */ + +#ifndef _Included_org_lwjgl_opengles_GLContext +#define _Included_org_lwjgl_opengles_GLContext +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengles_GLContext + * Method: nLoadOpenGLLibrary + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_nLoadOpenGLLibrary + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_GLContext + * Method: nUnloadOpenGLLibrary + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_nUnloadOpenGLLibrary + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengles_GLContext + * Method: resetNativeStubs + * Signature: (Ljava/lang/Class;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLContext_resetNativeStubs + (JNIEnv *, jclass, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry.h b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry.h new file mode 100644 index 0000000..91d93aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/opengles/org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry */ + +#ifndef _Included_org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry +#define _Included_org_lwjgl_opengles_GLContext_CapabilitiesCacheEntry +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.c new file mode 100644 index 0000000..be80123 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.c @@ -0,0 +1,10 @@ +#include "org_lwjgl_BufferUtils.h" +#include "common_tools.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_BufferUtils_zeroBuffer0(JNIEnv *env, jclass clazz, jobject buffer, jlong offset, jlong size) { + memset((char*)(*env)->GetDirectBufferAddress(env, buffer) + (size_t)offset, 0, (size_t)size); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_BufferUtils_getBufferAddress(JNIEnv *env, jclass clazz, jobject buffer) { + return (intptr_t)(*env)->GetDirectBufferAddress(env, buffer); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.h new file mode 100644 index 0000000..021b058 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_BufferUtils.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_BufferUtils */ + +#ifndef _Included_org_lwjgl_BufferUtils +#define _Included_org_lwjgl_BufferUtils +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_BufferUtils + * Method: zeroBuffer0 + * Signature: (Ljava/nio/Buffer;JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_BufferUtils_zeroBuffer0 + (JNIEnv *, jclass, jobject, jlong, jlong); + +/* + * Class: org_lwjgl_BufferUtils + * Method: getBufferAddress + * Signature: (Ljava/nio/Buffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_BufferUtils_getBufferAddress + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_DefaultSysImplementation.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_DefaultSysImplementation.h new file mode 100644 index 0000000..6e79d59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_DefaultSysImplementation.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_DefaultSysImplementation */ + +#ifndef _Included_org_lwjgl_DefaultSysImplementation +#define _Included_org_lwjgl_DefaultSysImplementation +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_DefaultSysImplementation + * Method: getJNIVersion + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion + (JNIEnv *, jobject); + +/* + * Class: org_lwjgl_DefaultSysImplementation + * Method: getPointerSize + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getPointerSize + (JNIEnv *, jobject); + +/* + * Class: org_lwjgl_DefaultSysImplementation + * Method: setDebug + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_DefaultSysImplementation_setDebug + (JNIEnv *, jobject, jboolean); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor.h new file mode 100644 index 0000000..237a511 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor.h @@ -0,0 +1,19 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_input_Cursor */ + +#ifndef _Included_org_lwjgl_input_Cursor +#define _Included_org_lwjgl_input_Cursor +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_input_Cursor_CURSOR_ONE_BIT_TRANSPARENCY +#define org_lwjgl_input_Cursor_CURSOR_ONE_BIT_TRANSPARENCY 1L +#undef org_lwjgl_input_Cursor_CURSOR_8_BIT_ALPHA +#define org_lwjgl_input_Cursor_CURSOR_8_BIT_ALPHA 2L +#undef org_lwjgl_input_Cursor_CURSOR_ANIMATION +#define org_lwjgl_input_Cursor_CURSOR_ANIMATION 4L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor_CursorElement.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor_CursorElement.h new file mode 100644 index 0000000..85d73b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Cursor_CursorElement.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_input_Cursor_CursorElement */ + +#ifndef _Included_org_lwjgl_input_Cursor_CursorElement +#define _Included_org_lwjgl_input_Cursor_CursorElement +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard.h new file mode 100644 index 0000000..b3e61c6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard.h @@ -0,0 +1,287 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_input_Keyboard */ + +#ifndef _Included_org_lwjgl_input_Keyboard +#define _Included_org_lwjgl_input_Keyboard +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_input_Keyboard_EVENT_SIZE +#define org_lwjgl_input_Keyboard_EVENT_SIZE 18L +#undef org_lwjgl_input_Keyboard_CHAR_NONE +#define org_lwjgl_input_Keyboard_CHAR_NONE 0L +#undef org_lwjgl_input_Keyboard_KEY_NONE +#define org_lwjgl_input_Keyboard_KEY_NONE 0L +#undef org_lwjgl_input_Keyboard_KEY_ESCAPE +#define org_lwjgl_input_Keyboard_KEY_ESCAPE 1L +#undef org_lwjgl_input_Keyboard_KEY_1 +#define org_lwjgl_input_Keyboard_KEY_1 2L +#undef org_lwjgl_input_Keyboard_KEY_2 +#define org_lwjgl_input_Keyboard_KEY_2 3L +#undef org_lwjgl_input_Keyboard_KEY_3 +#define org_lwjgl_input_Keyboard_KEY_3 4L +#undef org_lwjgl_input_Keyboard_KEY_4 +#define org_lwjgl_input_Keyboard_KEY_4 5L +#undef org_lwjgl_input_Keyboard_KEY_5 +#define org_lwjgl_input_Keyboard_KEY_5 6L +#undef org_lwjgl_input_Keyboard_KEY_6 +#define org_lwjgl_input_Keyboard_KEY_6 7L +#undef org_lwjgl_input_Keyboard_KEY_7 +#define org_lwjgl_input_Keyboard_KEY_7 8L +#undef org_lwjgl_input_Keyboard_KEY_8 +#define org_lwjgl_input_Keyboard_KEY_8 9L +#undef org_lwjgl_input_Keyboard_KEY_9 +#define org_lwjgl_input_Keyboard_KEY_9 10L +#undef org_lwjgl_input_Keyboard_KEY_0 +#define org_lwjgl_input_Keyboard_KEY_0 11L +#undef org_lwjgl_input_Keyboard_KEY_MINUS +#define org_lwjgl_input_Keyboard_KEY_MINUS 12L +#undef org_lwjgl_input_Keyboard_KEY_EQUALS +#define org_lwjgl_input_Keyboard_KEY_EQUALS 13L +#undef org_lwjgl_input_Keyboard_KEY_BACK +#define org_lwjgl_input_Keyboard_KEY_BACK 14L +#undef org_lwjgl_input_Keyboard_KEY_TAB +#define org_lwjgl_input_Keyboard_KEY_TAB 15L +#undef org_lwjgl_input_Keyboard_KEY_Q +#define org_lwjgl_input_Keyboard_KEY_Q 16L +#undef org_lwjgl_input_Keyboard_KEY_W +#define org_lwjgl_input_Keyboard_KEY_W 17L +#undef org_lwjgl_input_Keyboard_KEY_E +#define org_lwjgl_input_Keyboard_KEY_E 18L +#undef org_lwjgl_input_Keyboard_KEY_R +#define org_lwjgl_input_Keyboard_KEY_R 19L +#undef org_lwjgl_input_Keyboard_KEY_T +#define org_lwjgl_input_Keyboard_KEY_T 20L +#undef org_lwjgl_input_Keyboard_KEY_Y +#define org_lwjgl_input_Keyboard_KEY_Y 21L +#undef org_lwjgl_input_Keyboard_KEY_U +#define org_lwjgl_input_Keyboard_KEY_U 22L +#undef org_lwjgl_input_Keyboard_KEY_I +#define org_lwjgl_input_Keyboard_KEY_I 23L +#undef org_lwjgl_input_Keyboard_KEY_O +#define org_lwjgl_input_Keyboard_KEY_O 24L +#undef org_lwjgl_input_Keyboard_KEY_P +#define org_lwjgl_input_Keyboard_KEY_P 25L +#undef org_lwjgl_input_Keyboard_KEY_LBRACKET +#define org_lwjgl_input_Keyboard_KEY_LBRACKET 26L +#undef org_lwjgl_input_Keyboard_KEY_RBRACKET +#define org_lwjgl_input_Keyboard_KEY_RBRACKET 27L +#undef org_lwjgl_input_Keyboard_KEY_RETURN +#define org_lwjgl_input_Keyboard_KEY_RETURN 28L +#undef org_lwjgl_input_Keyboard_KEY_LCONTROL +#define org_lwjgl_input_Keyboard_KEY_LCONTROL 29L +#undef org_lwjgl_input_Keyboard_KEY_A +#define org_lwjgl_input_Keyboard_KEY_A 30L +#undef org_lwjgl_input_Keyboard_KEY_S +#define org_lwjgl_input_Keyboard_KEY_S 31L +#undef org_lwjgl_input_Keyboard_KEY_D +#define org_lwjgl_input_Keyboard_KEY_D 32L +#undef org_lwjgl_input_Keyboard_KEY_F +#define org_lwjgl_input_Keyboard_KEY_F 33L +#undef org_lwjgl_input_Keyboard_KEY_G +#define org_lwjgl_input_Keyboard_KEY_G 34L +#undef org_lwjgl_input_Keyboard_KEY_H +#define org_lwjgl_input_Keyboard_KEY_H 35L +#undef org_lwjgl_input_Keyboard_KEY_J +#define org_lwjgl_input_Keyboard_KEY_J 36L +#undef org_lwjgl_input_Keyboard_KEY_K +#define org_lwjgl_input_Keyboard_KEY_K 37L +#undef org_lwjgl_input_Keyboard_KEY_L +#define org_lwjgl_input_Keyboard_KEY_L 38L +#undef org_lwjgl_input_Keyboard_KEY_SEMICOLON +#define org_lwjgl_input_Keyboard_KEY_SEMICOLON 39L +#undef org_lwjgl_input_Keyboard_KEY_APOSTROPHE +#define org_lwjgl_input_Keyboard_KEY_APOSTROPHE 40L +#undef org_lwjgl_input_Keyboard_KEY_GRAVE +#define org_lwjgl_input_Keyboard_KEY_GRAVE 41L +#undef org_lwjgl_input_Keyboard_KEY_LSHIFT +#define org_lwjgl_input_Keyboard_KEY_LSHIFT 42L +#undef org_lwjgl_input_Keyboard_KEY_BACKSLASH +#define org_lwjgl_input_Keyboard_KEY_BACKSLASH 43L +#undef org_lwjgl_input_Keyboard_KEY_Z +#define org_lwjgl_input_Keyboard_KEY_Z 44L +#undef org_lwjgl_input_Keyboard_KEY_X +#define org_lwjgl_input_Keyboard_KEY_X 45L +#undef org_lwjgl_input_Keyboard_KEY_C +#define org_lwjgl_input_Keyboard_KEY_C 46L +#undef org_lwjgl_input_Keyboard_KEY_V +#define org_lwjgl_input_Keyboard_KEY_V 47L +#undef org_lwjgl_input_Keyboard_KEY_B +#define org_lwjgl_input_Keyboard_KEY_B 48L +#undef org_lwjgl_input_Keyboard_KEY_N +#define org_lwjgl_input_Keyboard_KEY_N 49L +#undef org_lwjgl_input_Keyboard_KEY_M +#define org_lwjgl_input_Keyboard_KEY_M 50L +#undef org_lwjgl_input_Keyboard_KEY_COMMA +#define org_lwjgl_input_Keyboard_KEY_COMMA 51L +#undef org_lwjgl_input_Keyboard_KEY_PERIOD +#define org_lwjgl_input_Keyboard_KEY_PERIOD 52L +#undef org_lwjgl_input_Keyboard_KEY_SLASH +#define org_lwjgl_input_Keyboard_KEY_SLASH 53L +#undef org_lwjgl_input_Keyboard_KEY_RSHIFT +#define org_lwjgl_input_Keyboard_KEY_RSHIFT 54L +#undef org_lwjgl_input_Keyboard_KEY_MULTIPLY +#define org_lwjgl_input_Keyboard_KEY_MULTIPLY 55L +#undef org_lwjgl_input_Keyboard_KEY_LMENU +#define org_lwjgl_input_Keyboard_KEY_LMENU 56L +#undef org_lwjgl_input_Keyboard_KEY_SPACE +#define org_lwjgl_input_Keyboard_KEY_SPACE 57L +#undef org_lwjgl_input_Keyboard_KEY_CAPITAL +#define org_lwjgl_input_Keyboard_KEY_CAPITAL 58L +#undef org_lwjgl_input_Keyboard_KEY_F1 +#define org_lwjgl_input_Keyboard_KEY_F1 59L +#undef org_lwjgl_input_Keyboard_KEY_F2 +#define org_lwjgl_input_Keyboard_KEY_F2 60L +#undef org_lwjgl_input_Keyboard_KEY_F3 +#define org_lwjgl_input_Keyboard_KEY_F3 61L +#undef org_lwjgl_input_Keyboard_KEY_F4 +#define org_lwjgl_input_Keyboard_KEY_F4 62L +#undef org_lwjgl_input_Keyboard_KEY_F5 +#define org_lwjgl_input_Keyboard_KEY_F5 63L +#undef org_lwjgl_input_Keyboard_KEY_F6 +#define org_lwjgl_input_Keyboard_KEY_F6 64L +#undef org_lwjgl_input_Keyboard_KEY_F7 +#define org_lwjgl_input_Keyboard_KEY_F7 65L +#undef org_lwjgl_input_Keyboard_KEY_F8 +#define org_lwjgl_input_Keyboard_KEY_F8 66L +#undef org_lwjgl_input_Keyboard_KEY_F9 +#define org_lwjgl_input_Keyboard_KEY_F9 67L +#undef org_lwjgl_input_Keyboard_KEY_F10 +#define org_lwjgl_input_Keyboard_KEY_F10 68L +#undef org_lwjgl_input_Keyboard_KEY_NUMLOCK +#define org_lwjgl_input_Keyboard_KEY_NUMLOCK 69L +#undef org_lwjgl_input_Keyboard_KEY_SCROLL +#define org_lwjgl_input_Keyboard_KEY_SCROLL 70L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD7 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD7 71L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD8 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD8 72L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD9 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD9 73L +#undef org_lwjgl_input_Keyboard_KEY_SUBTRACT +#define org_lwjgl_input_Keyboard_KEY_SUBTRACT 74L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD4 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD4 75L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD5 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD5 76L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD6 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD6 77L +#undef org_lwjgl_input_Keyboard_KEY_ADD +#define org_lwjgl_input_Keyboard_KEY_ADD 78L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD1 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD1 79L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD2 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD2 80L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD3 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD3 81L +#undef org_lwjgl_input_Keyboard_KEY_NUMPAD0 +#define org_lwjgl_input_Keyboard_KEY_NUMPAD0 82L +#undef org_lwjgl_input_Keyboard_KEY_DECIMAL +#define org_lwjgl_input_Keyboard_KEY_DECIMAL 83L +#undef org_lwjgl_input_Keyboard_KEY_F11 +#define org_lwjgl_input_Keyboard_KEY_F11 87L +#undef org_lwjgl_input_Keyboard_KEY_F12 +#define org_lwjgl_input_Keyboard_KEY_F12 88L +#undef org_lwjgl_input_Keyboard_KEY_F13 +#define org_lwjgl_input_Keyboard_KEY_F13 100L +#undef org_lwjgl_input_Keyboard_KEY_F14 +#define org_lwjgl_input_Keyboard_KEY_F14 101L +#undef org_lwjgl_input_Keyboard_KEY_F15 +#define org_lwjgl_input_Keyboard_KEY_F15 102L +#undef org_lwjgl_input_Keyboard_KEY_F16 +#define org_lwjgl_input_Keyboard_KEY_F16 103L +#undef org_lwjgl_input_Keyboard_KEY_F17 +#define org_lwjgl_input_Keyboard_KEY_F17 104L +#undef org_lwjgl_input_Keyboard_KEY_F18 +#define org_lwjgl_input_Keyboard_KEY_F18 105L +#undef org_lwjgl_input_Keyboard_KEY_KANA +#define org_lwjgl_input_Keyboard_KEY_KANA 112L +#undef org_lwjgl_input_Keyboard_KEY_F19 +#define org_lwjgl_input_Keyboard_KEY_F19 113L +#undef org_lwjgl_input_Keyboard_KEY_CONVERT +#define org_lwjgl_input_Keyboard_KEY_CONVERT 121L +#undef org_lwjgl_input_Keyboard_KEY_NOCONVERT +#define org_lwjgl_input_Keyboard_KEY_NOCONVERT 123L +#undef org_lwjgl_input_Keyboard_KEY_YEN +#define org_lwjgl_input_Keyboard_KEY_YEN 125L +#undef org_lwjgl_input_Keyboard_KEY_NUMPADEQUALS +#define org_lwjgl_input_Keyboard_KEY_NUMPADEQUALS 141L +#undef org_lwjgl_input_Keyboard_KEY_CIRCUMFLEX +#define org_lwjgl_input_Keyboard_KEY_CIRCUMFLEX 144L +#undef org_lwjgl_input_Keyboard_KEY_AT +#define org_lwjgl_input_Keyboard_KEY_AT 145L +#undef org_lwjgl_input_Keyboard_KEY_COLON +#define org_lwjgl_input_Keyboard_KEY_COLON 146L +#undef org_lwjgl_input_Keyboard_KEY_UNDERLINE +#define org_lwjgl_input_Keyboard_KEY_UNDERLINE 147L +#undef org_lwjgl_input_Keyboard_KEY_KANJI +#define org_lwjgl_input_Keyboard_KEY_KANJI 148L +#undef org_lwjgl_input_Keyboard_KEY_STOP +#define org_lwjgl_input_Keyboard_KEY_STOP 149L +#undef org_lwjgl_input_Keyboard_KEY_AX +#define org_lwjgl_input_Keyboard_KEY_AX 150L +#undef org_lwjgl_input_Keyboard_KEY_UNLABELED +#define org_lwjgl_input_Keyboard_KEY_UNLABELED 151L +#undef org_lwjgl_input_Keyboard_KEY_NUMPADENTER +#define org_lwjgl_input_Keyboard_KEY_NUMPADENTER 156L +#undef org_lwjgl_input_Keyboard_KEY_RCONTROL +#define org_lwjgl_input_Keyboard_KEY_RCONTROL 157L +#undef org_lwjgl_input_Keyboard_KEY_SECTION +#define org_lwjgl_input_Keyboard_KEY_SECTION 167L +#undef org_lwjgl_input_Keyboard_KEY_NUMPADCOMMA +#define org_lwjgl_input_Keyboard_KEY_NUMPADCOMMA 179L +#undef org_lwjgl_input_Keyboard_KEY_DIVIDE +#define org_lwjgl_input_Keyboard_KEY_DIVIDE 181L +#undef org_lwjgl_input_Keyboard_KEY_SYSRQ +#define org_lwjgl_input_Keyboard_KEY_SYSRQ 183L +#undef org_lwjgl_input_Keyboard_KEY_RMENU +#define org_lwjgl_input_Keyboard_KEY_RMENU 184L +#undef org_lwjgl_input_Keyboard_KEY_FUNCTION +#define org_lwjgl_input_Keyboard_KEY_FUNCTION 196L +#undef org_lwjgl_input_Keyboard_KEY_PAUSE +#define org_lwjgl_input_Keyboard_KEY_PAUSE 197L +#undef org_lwjgl_input_Keyboard_KEY_HOME +#define org_lwjgl_input_Keyboard_KEY_HOME 199L +#undef org_lwjgl_input_Keyboard_KEY_UP +#define org_lwjgl_input_Keyboard_KEY_UP 200L +#undef org_lwjgl_input_Keyboard_KEY_PRIOR +#define org_lwjgl_input_Keyboard_KEY_PRIOR 201L +#undef org_lwjgl_input_Keyboard_KEY_LEFT +#define org_lwjgl_input_Keyboard_KEY_LEFT 203L +#undef org_lwjgl_input_Keyboard_KEY_RIGHT +#define org_lwjgl_input_Keyboard_KEY_RIGHT 205L +#undef org_lwjgl_input_Keyboard_KEY_END +#define org_lwjgl_input_Keyboard_KEY_END 207L +#undef org_lwjgl_input_Keyboard_KEY_DOWN +#define org_lwjgl_input_Keyboard_KEY_DOWN 208L +#undef org_lwjgl_input_Keyboard_KEY_NEXT +#define org_lwjgl_input_Keyboard_KEY_NEXT 209L +#undef org_lwjgl_input_Keyboard_KEY_INSERT +#define org_lwjgl_input_Keyboard_KEY_INSERT 210L +#undef org_lwjgl_input_Keyboard_KEY_DELETE +#define org_lwjgl_input_Keyboard_KEY_DELETE 211L +#undef org_lwjgl_input_Keyboard_KEY_CLEAR +#define org_lwjgl_input_Keyboard_KEY_CLEAR 218L +#undef org_lwjgl_input_Keyboard_KEY_LMETA +#define org_lwjgl_input_Keyboard_KEY_LMETA 219L +#undef org_lwjgl_input_Keyboard_KEY_LWIN +#define org_lwjgl_input_Keyboard_KEY_LWIN 219L +#undef org_lwjgl_input_Keyboard_KEY_RMETA +#define org_lwjgl_input_Keyboard_KEY_RMETA 220L +#undef org_lwjgl_input_Keyboard_KEY_RWIN +#define org_lwjgl_input_Keyboard_KEY_RWIN 220L +#undef org_lwjgl_input_Keyboard_KEY_APPS +#define org_lwjgl_input_Keyboard_KEY_APPS 221L +#undef org_lwjgl_input_Keyboard_KEY_POWER +#define org_lwjgl_input_Keyboard_KEY_POWER 222L +#undef org_lwjgl_input_Keyboard_KEY_SLEEP +#define org_lwjgl_input_Keyboard_KEY_SLEEP 223L +#undef org_lwjgl_input_Keyboard_KEYBOARD_SIZE +#define org_lwjgl_input_Keyboard_KEYBOARD_SIZE 256L +#undef org_lwjgl_input_Keyboard_BUFFER_SIZE +#define org_lwjgl_input_Keyboard_BUFFER_SIZE 50L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard_KeyEvent.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard_KeyEvent.h new file mode 100644 index 0000000..01044d5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Keyboard_KeyEvent.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_input_Keyboard_KeyEvent */ + +#ifndef _Included_org_lwjgl_input_Keyboard_KeyEvent +#define _Included_org_lwjgl_input_Keyboard_KeyEvent +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Mouse.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Mouse.h new file mode 100644 index 0000000..f23a453 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_input_Mouse.h @@ -0,0 +1,17 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_input_Mouse */ + +#ifndef _Included_org_lwjgl_input_Mouse +#define _Included_org_lwjgl_input_Mouse +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_input_Mouse_EVENT_SIZE +#define org_lwjgl_input_Mouse_EVENT_SIZE 22L +#undef org_lwjgl_input_Mouse_BUFFER_SIZE +#define org_lwjgl_input_Mouse_BUFFER_SIZE 50L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.c new file mode 100644 index 0000000..8963f92 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "org_lwjgl_openal_AL.h" +#include "extal.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nCreate(JNIEnv *env, jclass clazz, jstring oalPath) { + extal_LoadLibrary(env, oalPath); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nDestroy(JNIEnv *env, jclass clazz) { + extal_UnloadLibrary(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_resetNativeStubs(JNIEnv *env, jclass clazz, jclass al_class) { + (*env)->UnregisterNatives(env, al_class); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.h new file mode 100644 index 0000000..8844807 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_AL.h @@ -0,0 +1,45 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_openal_AL */ + +#ifndef _Included_org_lwjgl_openal_AL +#define _Included_org_lwjgl_openal_AL +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_openal_AL + * Method: nCreate + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nCreate + (JNIEnv *, jclass, jstring); + +/* + * Class: org_lwjgl_openal_AL + * Method: nCreateDefault + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nCreateDefault + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_openal_AL + * Method: nDestroy + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nDestroy + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_openal_AL + * Method: resetNativeStubs + * Signature: (Ljava/lang/Class;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_resetNativeStubs + (JNIEnv *, jclass, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC10.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC10.c new file mode 100644 index 0000000..6764ef6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC10.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_openal_ALC.c 2279 2006-02-23 19:22:00Z elias_naur $ + * + * This is the actual JNI implementation of the OpenAL context/device library. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2279 $ + */ + +/* OpenAL includes */ +#include "extal.h" + +//alc +typedef ALCubyte* (ALCAPIENTRY *alcGetStringPROC)(ALCdevice *device,ALCenum param); +typedef ALCvoid (ALCAPIENTRY *alcGetIntegervPROC)(ALCdevice *device,ALCenum param,ALCsizei size,ALCint *data); +typedef ALCdevice* (ALCAPIENTRY *alcOpenDevicePROC)(ALCubyte *deviceName); +typedef ALCboolean (ALCAPIENTRY *alcCloseDevicePROC)(ALCdevice *device); +typedef ALCcontext* (ALCAPIENTRY *alcCreateContextPROC)(ALCdevice *device,ALCint *attrList); +typedef ALCenum (ALCAPIENTRY *alcMakeContextCurrentPROC)(ALCcontext *context); +typedef ALCvoid (ALCAPIENTRY *alcProcessContextPROC)(ALCcontext *context); +typedef ALCdevice* (ALCAPIENTRY *alcGetContextsDevicePROC)(ALCcontext *context); +typedef ALCvoid (ALCAPIENTRY *alcSuspendContextPROC)(ALCcontext *context); +typedef ALCvoid (ALCAPIENTRY *alcDestroyContextPROC)(ALCcontext *context); +typedef ALCenum (ALCAPIENTRY *alcGetErrorPROC)(ALCdevice *device); +typedef ALCboolean (ALCAPIENTRY *alcIsExtensionPresentPROC)(ALCdevice *device,ALCubyte *extName); +//typedef ALCvoid* (ALCAPIENTRY *alcGetProcAddressPROC)(ALCdevice *device,ALCubyte *funcName); +typedef ALCenum (ALCAPIENTRY *alcGetEnumValuePROC)(ALCdevice *device,ALCubyte *enumName); +typedef ALCcontext* (ALCAPIENTRY *alcGetCurrentContextPROC)(ALCvoid); + +static alcGetCurrentContextPROC alcGetCurrentContext = NULL; +static alcGetStringPROC alcGetString; +static alcGetIntegervPROC alcGetIntegerv; +static alcOpenDevicePROC alcOpenDevice; +static alcCloseDevicePROC alcCloseDevice; +static alcCreateContextPROC alcCreateContext; +static alcMakeContextCurrentPROC alcMakeContextCurrent; +static alcProcessContextPROC alcProcessContext; +static alcGetContextsDevicePROC alcGetContextsDevice; +static alcSuspendContextPROC alcSuspendContext; +static alcDestroyContextPROC alcDestroyContext; +static alcGetErrorPROC alcGetError; +static alcIsExtensionPresentPROC alcIsExtensionPresent; +//static alcGetProcAddressPROC alcGetProcAddress; +static alcGetEnumValuePROC alcGetEnumValue; + +/** + * This function returns strings related to the context. + * + * C Specification: + * ALubyte * alcGetString(ALCdevice *device, ALenum token); + */ +static jobject JNICALL Java_org_lwjgl_openal_ALC10_nalcGetString (JNIEnv *env, jclass clazz, jlong deviceaddress, jint token) { + char* alcString = (char*) alcGetString((ALCdevice*)((intptr_t)deviceaddress), (ALenum) token); + size_t length; + int i=1; + + if (alcString == NULL) { + return NULL; + } + + // Special treatment of enumeration tokens + // These are encoded using \0 between elements and a finishing \0\0 + switch(token) { + case 0x1005: // ALC_DEVICE_SPECIFIER + case 0x310: // ALC_CAPTURE_DEVICE_SPECIFIER + // If deviceaddress is not 0, OpenAL returns a single device terminated by a + // single \0 character, if token is ALC_DEVICE_SPECIFIER or + // ALC_CAPTURE_DEVICE_SPECIFIER. + if (deviceaddress != 0) { + length = strlen(alcString); + break; + } + case 0x1013: // ALC_ALL_DEVICES_SPECIFIER + while (alcString[i - 1] != '\0' || alcString[i] != '\0') { + i++; + } + length = i + 1; + break; + default: // e.g. ALC_DEFAULT_ALL_DEVICES_SPECIFIER + length = strlen(alcString); + } + //return NewStringNativeWithLength(env, alcString, length); + return safeNewBuffer(env, alcString, length); +} + +/** + * This function returns integers related to the context. + * + * C Specification: + * ALvoid alcGetIntegerv(ALCdevice *device, ALenum token, ALsizei size, ALint *dest); + */ +static void JNICALL Java_org_lwjgl_openal_ALC10_nalcGetIntegerv (JNIEnv *env, jclass clazz, jlong deviceaddress, jint token, jint size, jlong dest) { + ALint* dest_address = (ALint*)(intptr_t)dest; + alcGetIntegerv((ALCdevice*)((intptr_t)deviceaddress), (ALenum) token, (ALsizei) size, dest_address); +} + +/** + * This function opens a device by name. + * + * C Specification: + * ALCdevice *alcOpenDevice( const ALubyte *tokstr ); + */ +static jlong JNICALL Java_org_lwjgl_openal_ALC10_nalcOpenDevice (JNIEnv *env, jclass clazz, jlong tokstr) { + return (jlong)(intptr_t)alcOpenDevice((ALubyte *)(intptr_t)tokstr); +} + +/** + * This function closes a device by name. + * + * C Specification: + * bool alcCloseDevice( ALCdevice *dev ); + */ +static jboolean JNICALL Java_org_lwjgl_openal_ALC10_nalcCloseDevice (JNIEnv *env, jclass clazz, jlong deviceaddress) { + return alcCloseDevice((ALCdevice*)((intptr_t)deviceaddress)); +} + +/** + * This function creates a context using a specified device. + * + * C Specification: + * ALCcontext* alcCreateContext( ALCdevice *dev, ALint* attrlist ); + */ +static jlong JNICALL Java_org_lwjgl_openal_ALC10_nalcCreateContext (JNIEnv *env, jclass clazz, jlong deviceaddress, jlong attrlist) { + ALint* attrlist_address = (ALint*)(intptr_t)attrlist; + ALCcontext* context; + + context = alcCreateContext((ALCdevice*)((intptr_t)deviceaddress), attrlist_address); + + return (jlong)((intptr_t)context); +} + +/** + * This function makes a specified context the current context. + * + * C Specification: + * ALCboolean alcMakeContextCurrent(ALCcontext *context); + */ +static jint JNICALL Java_org_lwjgl_openal_ALC10_nalcMakeContextCurrent (JNIEnv *env, jclass clazz, jlong contextaddress) { + ALCcontext* context = (ALCcontext*)((intptr_t)contextaddress); + return alcMakeContextCurrent(context); +} + +/** + * This function tells a context to begin processing. + * + * C Specification: + * void alcProcessContext(ALCcontext *context); + */ +static void JNICALL Java_org_lwjgl_openal_ALC10_nalcProcessContext (JNIEnv *env, jclass clazz, jlong contextaddress) { + alcProcessContext((ALCcontext*)((intptr_t)contextaddress)); +} + +/** + * This function retrieves the current context. + * + * C Specification: + * ALCcontext* alcGetCurrentContext( ALvoid ); + */ +static jlong JNICALL Java_org_lwjgl_openal_ALC10_nalcGetCurrentContext (JNIEnv *env, jclass clazz) { + ALCcontext* context = alcGetCurrentContext(); + return (jlong)((intptr_t)context); +} + +/** + * This function retrieves the specified contexts device + * + * C Specification: + * ALCdevice* alcGetContextsDevice(ALCcontext *context); + */ +static jlong JNICALL Java_org_lwjgl_openal_ALC10_nalcGetContextsDevice (JNIEnv *env, jclass clazz, jlong contextaddress) { + ALCdevice* device = alcGetContextsDevice((ALCcontext*)((intptr_t)contextaddress)); + return (jlong)((intptr_t)device); +} + +/** + * This function suspends processing on a specified context. + * + * C Specification: + * void alcSuspendContext(ALCcontext *context); + */ +static void JNICALL Java_org_lwjgl_openal_ALC10_nalcSuspendContext (JNIEnv *env, jclass clazz, jlong contextaddress) { + alcSuspendContext((ALCcontext*)((intptr_t)contextaddress)); +} + +/** + * This function destroys a context. + * + * C Specification: + * void alcDestroyContext(ALCcontext *context); + */ +static void JNICALL Java_org_lwjgl_openal_ALC10_nalcDestroyContext (JNIEnv *env, jclass clazz, jlong contextaddress) { + alcDestroyContext((ALCcontext*)((intptr_t)contextaddress)); +} + +/** + * This function retrieves the specified devices context error state. + * + * C Specification: + * ALCenum alcGetError(ALCdevice *device); + */ +static jint JNICALL Java_org_lwjgl_openal_ALC10_nalcGetError (JNIEnv *env, jclass clazz, jlong deviceaddress) { + return alcGetError((ALCdevice*)((intptr_t)deviceaddress)); +} + +/** + * This function queries if a specified context extension is available. + * + * C Specification: + * ALboolean alcIsExtensionPresent(ALCdevice *device, ALubyte *extName); + */ +static jboolean JNICALL Java_org_lwjgl_openal_ALC10_nalcIsExtensionPresent (JNIEnv *env, jclass clazz, jlong deviceaddress, jlong extName) { + return (jboolean) alcIsExtensionPresent((ALCdevice*)((intptr_t)deviceaddress), (ALubyte*)(intptr_t)extName); +} + +/** + * This function retrieves the enum value for a specified enumeration name. + * + * C Specification: + * ALenum alcGetEnumValue(ALCdevice *device, ALubyte *enumName); + */ +static jint JNICALL Java_org_lwjgl_openal_ALC10_nalcGetEnumValue (JNIEnv *env, jclass clazz, jlong deviceaddress, jlong enumName) { + return (jint) alcGetEnumValue((ALCdevice*)((intptr_t)deviceaddress), (ALubyte*)(intptr_t)enumName); +} + +/** + * Loads the context OpenAL functions + * + * @return true if all methods were loaded, false if one of the methods could not be loaded + */ +#ifdef __cplusplus +extern "C" { +#endif +JNIEXPORT void JNICALL Java_org_lwjgl_openal_ALC10_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nalcGetString", "(JI)Ljava/nio/ByteBuffer;", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetString, "alcGetString", (void*)&alcGetString, false}, + {"nalcGetIntegerv", "(JIIJ)V", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetIntegerv, "alcGetIntegerv", (void*)&alcGetIntegerv, false}, + {"nalcOpenDevice", "(J)J", (void*)&Java_org_lwjgl_openal_ALC10_nalcOpenDevice, "alcOpenDevice", (void*)&alcOpenDevice, false}, + {"nalcCloseDevice", "(J)Z", (void*)&Java_org_lwjgl_openal_ALC10_nalcCloseDevice, "alcCloseDevice", (void*)&alcCloseDevice, false}, + {"nalcCreateContext", "(JJ)J", (void*)&Java_org_lwjgl_openal_ALC10_nalcCreateContext, "alcCreateContext", (void*)&alcCreateContext, false}, + {"nalcMakeContextCurrent", "(J)I", (void*)&Java_org_lwjgl_openal_ALC10_nalcMakeContextCurrent, "alcMakeContextCurrent", (void*)&alcMakeContextCurrent, false}, + {"nalcProcessContext", "(J)V", (void*)&Java_org_lwjgl_openal_ALC10_nalcProcessContext, "alcProcessContext", (void*)&alcProcessContext, false}, + {"nalcGetCurrentContext", "()J", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetCurrentContext, "alcGetCurrentContext", (void*)&alcGetCurrentContext, false}, + {"nalcGetContextsDevice", "(J)J", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetContextsDevice, "alcGetContextsDevice", (void*)&alcGetContextsDevice, false}, + {"nalcSuspendContext", "(J)V", (void*)&Java_org_lwjgl_openal_ALC10_nalcSuspendContext, "alcSuspendContext", (void*)&alcSuspendContext, false}, + {"nalcDestroyContext", "(J)V", (void*)&Java_org_lwjgl_openal_ALC10_nalcDestroyContext, "alcDestroyContext", (void*)&alcDestroyContext, false}, + {"nalcGetError", "(J)I", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetError, "alcGetError", (void*)&alcGetError, false}, + {"nalcIsExtensionPresent", "(JJ)Z", (void*)&Java_org_lwjgl_openal_ALC10_nalcIsExtensionPresent, "alcIsExtensionPresent", (void*)&alcIsExtensionPresent, false}, + {"nalcGetEnumValue", "(JJ)I", (void*)&Java_org_lwjgl_openal_ALC10_nalcGetEnumValue, "alcGetEnumValue", (void*)&alcGetEnumValue, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extal_InitializeClass(env, clazz, num_functions, functions); +} +#ifdef __cplusplus +} +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC11.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC11.c new file mode 100644 index 0000000..38b157c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_openal_ALC11.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_openal_ALC.c 2279 2006-02-23 19:22:00Z elias_naur $ + * + * This is the actual JNI implementation of the OpenAL context/device library. + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2279 $ + */ + +/* OpenAL includes */ +#include "extal.h" + +//alc +typedef ALCdevice * (ALCAPIENTRY *alcCaptureOpenDevicePROC)( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize ); +typedef ALCboolean (ALCAPIENTRY *alcCaptureCloseDevicePROC)( ALCdevice *device ); +typedef void (ALCAPIENTRY *alcCaptureStartPROC)( ALCdevice *device ); +typedef void (ALCAPIENTRY *alcCaptureStopPROC)( ALCdevice *device ); +typedef void (ALCAPIENTRY *alcCaptureSamplesPROC)( ALCdevice *device, ALCvoid *buffer, ALCsizei samples ); + +static alcCaptureOpenDevicePROC alcCaptureOpenDevice; +static alcCaptureCloseDevicePROC alcCaptureCloseDevice; +static alcCaptureStartPROC alcCaptureStart; +static alcCaptureStopPROC alcCaptureStop; +static alcCaptureSamplesPROC alcCaptureSamples; + +/* + * Class: org_lwjgl_openal_ALC11 + * Method: nalcCaptureOpenDevice + * Signature: (Ljava/lang/String;III)J + */ +static jlong JNICALL Java_org_lwjgl_openal_ALC11_nalcCaptureOpenDevice(JNIEnv *env, jclass clazz, jlong devicename, jint frequency, jint format, jint buffersize) { + return (jlong)(intptr_t)alcCaptureOpenDevice((const char *)(intptr_t)devicename, (unsigned int) frequency, format, buffersize); +} + +/* + * Class: org_lwjgl_openal_ALC11 + * Method: nalcCaptureCloseDevice + * Signature: (J)Z + */ +static jboolean JNICALL Java_org_lwjgl_openal_ALC11_nalcCaptureCloseDevice(JNIEnv *env, jclass clazz, jlong device) { + return (jboolean) alcCaptureCloseDevice((ALCdevice*) ((intptr_t)device)); +} + +/* + * Class: org_lwjgl_openal_ALC11 + * Method: nalcCaptureStart + * Signature: (J)V + */ +static void JNICALL Java_org_lwjgl_openal_ALC11_nalcCaptureStart(JNIEnv *env, jclass clazz, jlong device) { + alcCaptureStart((ALCdevice*) ((intptr_t)device)); +} + +/* + * Class: org_lwjgl_openal_ALC11 + * Method: nalcCaptureStop + * Signature: (J)V + */ +static void JNICALL Java_org_lwjgl_openal_ALC11_nalcCaptureStop(JNIEnv * env, jclass clazz, jlong device) { + alcCaptureStop((ALCdevice*) ((intptr_t)device)); +} + +/* + * Class: org_lwjgl_openal_ALC11 + * Method: nalcCaptureSamples + * Signature: (JLjava/nio/ByteBuffer;I)V + */ +static void JNICALL Java_org_lwjgl_openal_ALC11_nalcCaptureSamples(JNIEnv *env, jclass clazz, jlong device, jlong buffer, jint samples) { + ALvoid *buffer_address = (ALbyte *)(intptr_t)buffer; + alcCaptureSamples((ALCdevice*) ((intptr_t)device), buffer_address, samples); +} + +/** + * Loads the context OpenAL functions + * + * @return true if all methods were loaded, false if one of the methods could not be loaded + */ +#ifdef __cplusplus +extern "C" { +#endif +JNIEXPORT void JNICALL Java_org_lwjgl_openal_ALC11_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nalcCaptureOpenDevice", "(JIII)J", (void*)&Java_org_lwjgl_openal_ALC11_nalcCaptureOpenDevice, "alcCaptureOpenDevice", (void*)&alcCaptureOpenDevice, false}, + {"nalcCaptureCloseDevice", "(J)Z", (void*)&Java_org_lwjgl_openal_ALC11_nalcCaptureCloseDevice, "alcCaptureCloseDevice", (void*)&alcCaptureCloseDevice, false}, + {"nalcCaptureStart", "(J)V", (void*)&Java_org_lwjgl_openal_ALC11_nalcCaptureStart, "alcCaptureStart", (void*)&alcCaptureStart, false}, + {"nalcCaptureStop", "(J)V", (void*)&Java_org_lwjgl_openal_ALC11_nalcCaptureStop, "alcCaptureStop", (void*)&alcCaptureStop, false}, + {"nalcCaptureSamples", "(JJI)V", (void*)&Java_org_lwjgl_openal_ALC11_nalcCaptureSamples, "alcCaptureSamples", (void*)&alcCaptureSamples, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extal_InitializeClass(env, clazz, num_functions, functions); +} +#ifdef __cplusplus +} +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.c new file mode 100644 index 0000000..3f72503 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <jni.h> +#include "org_lwjgl_opencl_CL.h" +#include "extcl.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nCreate(JNIEnv *env, jclass clazz, jstring oclPath) { + extcl_LoadLibrary(env, oclPath); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nDestroy(JNIEnv *env, jclass clazz) { + extcl_UnloadLibrary(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL_ngetFunctionAddress(JNIEnv *env, jclass clazz, jlong function_name) { + return (jlong)(intptr_t)extcl_GetProcAddress((char *)(intptr_t)function_name); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opencl_CL_getHostBuffer(JNIEnv *env, jclass clazz, jlong address, jint size) { + return safeNewBuffer(env, (void *)(intptr_t)address, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_resetNativeStubs(JNIEnv *env, jclass clazz, jclass cl_class) { + (*env)->UnregisterNatives(env, cl_class); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.h new file mode 100644 index 0000000..ba64517 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CL.h @@ -0,0 +1,61 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opencl_CL */ + +#ifndef _Included_org_lwjgl_opencl_CL +#define _Included_org_lwjgl_opencl_CL +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opencl_CL + * Method: nCreate + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nCreate + (JNIEnv *, jclass, jstring); + +/* + * Class: org_lwjgl_opencl_CL + * Method: nCreateDefault + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nCreateDefault + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CL + * Method: nDestroy + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nDestroy + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CL + * Method: ngetFunctionAddress + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL_ngetFunctionAddress + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opencl_CL + * Method: getHostBuffer + * Signature: (JI)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opencl_CL_getHostBuffer + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opencl_CL + * Method: resetNativeStubs + * Signature: (Ljava/lang/Class;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_resetNativeStubs + (JNIEnv *, jclass, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.c new file mode 100644 index 0000000..17d937d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * JNI implementation of the OpenCL function callbacks. + * + * @author Spasi + */ + +#include <jni.h> +#include "common_tools.h" +#include "extcl.h" +#include "org_lwjgl_opencl_CallbackUtil.h" + +static jmethodID contextCallbackJ; +static jmethodID memObjectDestructorCallbackJ; +static jmethodID programCallbackJ; +static jmethodID nativeKernelCallbackJ; +static jmethodID eventCallbackJ; +static jmethodID printfCallbackJ; + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_ncreateGlobalRef(JNIEnv *env, jclass clazz, jobject obj) { + return (intptr_t)(*env)->NewGlobalRef(env, obj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CallbackUtil_deleteGlobalRef(JNIEnv *env, jclass clazz, jlong globalRef) { + (*env)->DeleteGlobalRef(env, (jobject)(intptr_t)globalRef); +} + +// ----------------- [ CONTEXT CALLBACK ] ----------------- + +static void CL_CALLBACK contextCallback(const char *errinfo, const void *private_info, size_t cb, void *user_data) { + JNIEnv *env = attachCurrentThread(); + jobject private_info_buffer = NULL; + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && contextCallbackJ != NULL ) { + if ( private_info != NULL ) + private_info_buffer = NewReadOnlyDirectByteBuffer(env, private_info, cb); + + (*env)->CallVoidMethod(env, (jobject)user_data, contextCallbackJ, + NewStringNativeWithLength(env, errinfo, (jsize)strlen(errinfo)), + private_info_buffer + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getContextCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( contextCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLContextCallback"); + if ( callbackClass != NULL ) + contextCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(Ljava/lang/String;Ljava/nio/ByteBuffer;)V"); + } + + return (jlong)(intptr_t)&contextCallback; +} + +// ----------------- [ MEM OBJECT DESTRUCTOR CALLBACK ] ----------------- + +static void CL_CALLBACK memObjectDestructorCallback(cl_mem memobj, void *user_data) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && memObjectDestructorCallbackJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)user_data, memObjectDestructorCallbackJ, + (jlong)(intptr_t)memobj + ); + (*env)->DeleteGlobalRef(env, (jobject)user_data); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getMemObjectDestructorCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( memObjectDestructorCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLMemObjectDestructorCallback"); + if ( callbackClass != NULL ) + memObjectDestructorCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(J)V"); + } + + return (jlong)(intptr_t)&memObjectDestructorCallback; +} + +// ----------------- [ PROGRAM CALLBACK ] ----------------- + +static void CL_CALLBACK programCallback(cl_program program, void *user_data) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && programCallbackJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)user_data, programCallbackJ, + (jlong)(intptr_t)program + ); + (*env)->DeleteGlobalRef(env, (jobject)user_data); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getProgramCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( programCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLProgramCallback"); + if ( callbackClass != NULL ) + programCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(J)V"); + } + + return (jlong)(intptr_t)&programCallback; +} + +// ----------------- [ NATIVE KERNEL CALLBACK ] ----------------- + +static void CL_CALLBACK nativeKernelCallback(void *args) { + JNIEnv *env = attachCurrentThread(); + jobject user_func = (jobject)(intptr_t)*(jlong *)args; + jsize num_mem_objects = *(jsize *)((char *)args + 8); + jobjectArray memobjs = NULL; + jobject buffer; + jsize i; + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && nativeKernelCallbackJ != NULL ) { + if ( num_mem_objects > 0 ) { + memobjs = (*env)->NewObjectArray(env, num_mem_objects, (*env)->FindClass(env, "java/nio/ByteBuffer"), NULL); + for ( i = 0; i < num_mem_objects; i++ ) { + buffer = (*env)->NewDirectByteBuffer(env, + // Pointer to cl_mem buffer + (void *)((char *)args + (12 + 4 + (i * (4 + sizeof(void *))))), + // cl_mem buffer size + *((jint *)((char *)args + (12 + (i * (4 + sizeof(void *)))))) + ); + (*env)->SetObjectArrayElement(env, memobjs, i, buffer); + } + } + + (*env)->CallVoidMethod(env, user_func, nativeKernelCallbackJ, memobjs); + + if ( num_mem_objects > 0 ) + (*env)->DeleteLocalRef(env, memobjs); + (*env)->DeleteGlobalRef(env, user_func); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getNativeKernelCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( nativeKernelCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLNativeKernel"); + if ( callbackClass != NULL ) + nativeKernelCallbackJ = (*env)->GetMethodID(env, callbackClass, "execute", "([Ljava/nio/ByteBuffer;)V"); + } + + return (jlong)(intptr_t)&nativeKernelCallback; +} + +// ----------------- [ EVENT CALLBACK ] ----------------- + +static void CL_CALLBACK eventCallback(cl_event event, cl_int event_command_exec_status, void *user_data) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && eventCallbackJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)user_data, eventCallbackJ, + (jlong)(intptr_t)event, + event_command_exec_status + ); + (*env)->DeleteGlobalRef(env, (jobject)user_data); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getEventCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( eventCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLEventCallback"); + if ( callbackClass != NULL ) + eventCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(JI)V"); + } + + return (jlong)(intptr_t)&eventCallback; +} + +// ----------------- [ PRINTF CALLBACK ] ----------------- + +static void CL_CALLBACK printfCallback(cl_context context, cl_uint printf_data_len, char *printf_data_ptr, void *user_data) { + JNIEnv *env = attachCurrentThread(); + + if ( env != NULL && !(*env)->ExceptionOccurred(env) && printfCallbackJ != NULL ) { + (*env)->CallVoidMethod(env, (jobject)user_data, printfCallbackJ, + NewStringNativeWithLength(env, printf_data_ptr, printf_data_len) + ); + } + + detachCurrentThread(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getPrintfCallback(JNIEnv *env, jclass clazz) { + // Cache the callback methodID + jclass callbackClass; + if ( printfCallbackJ == NULL ) { + callbackClass = (*env)->FindClass(env, "org/lwjgl/opencl/CLPrintfCallback"); + if ( callbackClass != NULL ) + printfCallbackJ = (*env)->GetMethodID(env, callbackClass, "handleMessage", "(Ljava/lang/String;)V"); + } + + return (jlong)(intptr_t)&printfCallback; +} + +// ----------------- [ APPLE_ContextLoggingFunctions CALLBACKS ] ----------------- + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToSystemLogAPPLE(JNIEnv *env, jclass clazz) { + return (jlong)(intptr_t)extcl_GetProcAddress("clLogMessagesToSystemLogAPPLE"); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToStdoutAPPLE(JNIEnv *env, jclass clazz) { + return (jlong)(intptr_t)extcl_GetProcAddress("getLogMessageToStdoutAPPLE"); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToStderrAPPLE(JNIEnv *env, jclass clazz) { + return (jlong)(intptr_t)extcl_GetProcAddress("getLogMessageToStderrAPPLE"); +} diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.h new file mode 100644 index 0000000..234a916 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opencl_CallbackUtil.h @@ -0,0 +1,101 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opencl_CallbackUtil */ + +#ifndef _Included_org_lwjgl_opencl_CallbackUtil +#define _Included_org_lwjgl_opencl_CallbackUtil +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: ncreateGlobalRef + * Signature: (Ljava/lang/Object;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_ncreateGlobalRef + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: deleteGlobalRef + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CallbackUtil_deleteGlobalRef + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getContextCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getContextCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getMemObjectDestructorCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getMemObjectDestructorCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getProgramCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getProgramCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getNativeKernelCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getNativeKernelCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getEventCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getEventCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getPrintfCallback + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getPrintfCallback + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getLogMessageToSystemLogAPPLE + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToSystemLogAPPLE + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getLogMessageToStdoutAPPLE + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToStdoutAPPLE + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opencl_CallbackUtil + * Method: getLogMessageToStderrAPPLE + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CallbackUtil_getLogMessageToStderrAPPLE + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c new file mode 100644 index 0000000..bb557ce --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + */ + +#include <jni.h> +#ifdef __MACH__ +#include <JavaVM/jawt_md.h> +#else +#include <jawt_md.h> +#endif +#include "org_lwjgl_opengl_AWTSurfaceLock.h" +#include "awt_tools.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_createHandle + (JNIEnv *env, jclass clazz) { + return newJavaManagedByteBuffer(env, sizeof(AWTSurfaceLock)); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_lockAndInitHandle + (JNIEnv *env, jclass clazz, jobject lock_buffer_handle, jobject canvas) { + JAWT awt; + JAWT_DrawingSurface* ds; + JAWT_DrawingSurfaceInfo *dsi; + AWTSurfaceLock *awt_lock = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + + jboolean result = JNI_FALSE; + + #ifdef __MACH__ + // try get JAWT with JAWT_MACOSX_USE_CALAYER Opt In + awt.version = JAWT_VERSION_1_4 | 0x80000000;//JAWT_MACOSX_USE_CALAYER; + result = JAWT_GetAWT(env, &awt); + #endif + + if (result == JNI_FALSE) { + // now try without CALAYER + awt.version = JAWT_VERSION_1_4; + if (JAWT_GetAWT(env, &awt) == JNI_FALSE) { + throwException(env, "Could not get the JAWT interface"); + return JNI_FALSE; + } + } + + ds = awt.GetDrawingSurface(env, canvas); + if (ds == NULL) { + throwException(env, "Could not get the drawing surface"); + return JNI_FALSE; + } + + if((ds->Lock(ds) & JAWT_LOCK_ERROR) != 0) { + awt.FreeDrawingSurface(ds); + throwException(env, "Could not lock the drawing surface"); + return JNI_FALSE; + } + + dsi = ds->GetDrawingSurfaceInfo(ds); + if (dsi != NULL) { + awt_lock->awt = awt; + awt_lock->ds = ds; + awt_lock->dsi = dsi; + return JNI_TRUE; + } + ds->Unlock(ds); + awt.FreeDrawingSurface(ds); + return JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_nUnlock + (JNIEnv *env, jclass clazz, jobject lock_buffer_handle) { + AWTSurfaceLock *awt_lock = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + awt_lock->ds->FreeDrawingSurfaceInfo(awt_lock->dsi); + awt_lock->ds->Unlock(awt_lock->ds); + awt_lock->awt.FreeDrawingSurface(awt_lock->ds); +} + diff --git a/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.h b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.h new file mode 100644 index 0000000..11d66ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.h @@ -0,0 +1,39 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_AWTSurfaceLock */ + +#ifndef _Included_org_lwjgl_opengl_AWTSurfaceLock +#define _Included_org_lwjgl_opengl_AWTSurfaceLock +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_AWTSurfaceLock_WAIT_DELAY_MILLIS +#define org_lwjgl_opengl_AWTSurfaceLock_WAIT_DELAY_MILLIS 100L +/* + * Class: org_lwjgl_opengl_AWTSurfaceLock + * Method: createHandle + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_createHandle + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_AWTSurfaceLock + * Method: lockAndInitHandle + * Signature: (Ljava/nio/ByteBuffer;Ljava/awt/Canvas;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_lockAndInitHandle + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_AWTSurfaceLock + * Method: nUnlock + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AWTSurfaceLock_nUnlock + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL10.c b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL10.c new file mode 100644 index 0000000..27ee64d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL10.c @@ -0,0 +1,444 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extal.h" + +typedef ALvoid (ALAPIENTRY *alEnablePROC) (ALint capability); +typedef ALvoid (ALAPIENTRY *alDisablePROC) (ALenum capability); +typedef ALboolean (ALAPIENTRY *alIsEnabledPROC) (ALenum capability); +typedef ALboolean (ALAPIENTRY *alGetBooleanPROC) (ALenum pname); +typedef ALint (ALAPIENTRY *alGetIntegerPROC) (ALenum pname); +typedef ALfloat (ALAPIENTRY *alGetFloatPROC) (ALenum pname); +typedef ALdouble (ALAPIENTRY *alGetDoublePROC) (ALenum pname); +typedef ALvoid (ALAPIENTRY *alGetIntegervPROC) (ALenum pname, ALint * data); +typedef ALvoid (ALAPIENTRY *alGetFloatvPROC) (ALenum pname, ALfloat * data); +typedef ALvoid (ALAPIENTRY *alGetDoublevPROC) (ALenum pname, ALdouble * data); +typedef ALubyte * (ALAPIENTRY *alGetStringPROC) (ALenum pname); +typedef ALenum (ALAPIENTRY *alGetErrorPROC) (); +typedef ALboolean (ALAPIENTRY *alIsExtensionPresentPROC) (ALubyte * fname); +typedef ALenum (ALAPIENTRY *alGetEnumValuePROC) (ALubyte * ename); +typedef ALvoid (ALAPIENTRY *alListeneriPROC) (ALenum pname, ALint value); +typedef ALvoid (ALAPIENTRY *alListenerfPROC) (ALenum pname, ALfloat value); +typedef ALvoid (ALAPIENTRY *alListenerfvPROC) (ALenum pname, const ALfloat * value); +typedef ALvoid (ALAPIENTRY *alListener3fPROC) (ALenum pname, ALfloat v1, ALfloat v2, ALfloat v3); +typedef void (ALAPIENTRY *alGetListeneriPROC) (ALenum pname, ALint* value); +typedef void (ALAPIENTRY *alGetListenerfPROC) (ALenum pname, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetListenerfvPROC) (ALenum pname, ALfloat * floatdata); +typedef ALvoid (ALAPIENTRY *alGenSourcesPROC) (ALsizei n, ALuint * sources); +typedef ALvoid (ALAPIENTRY *alDeleteSourcesPROC) (ALsizei n, ALuint * sources); +typedef ALboolean (ALAPIENTRY *alIsSourcePROC) (ALuint id); +typedef ALvoid (ALAPIENTRY *alSourceiPROC) (ALuint source, ALenum pname, ALint value); +typedef ALvoid (ALAPIENTRY *alSourcefPROC) (ALuint source, ALenum pname, ALfloat value); +typedef ALvoid (ALAPIENTRY *alSourcefvPROC) (ALuint source, ALenum pname, const ALfloat * value); +typedef ALvoid (ALAPIENTRY *alSource3fPROC) (ALuint source, ALenum pname, ALfloat v1, ALfloat v2, ALfloat v3); +typedef ALvoid (ALAPIENTRY *alGetSourceiPROC) (ALuint source, ALenum pname, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetSourcefPROC) (ALuint source, ALenum pname, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetSourcefvPROC) (ALuint source, ALenum pname, ALfloat * floatdata); +typedef ALvoid (ALAPIENTRY *alSourcePlayvPROC) (ALsizei n, ALuint * sources); +typedef ALvoid (ALAPIENTRY *alSourcePausevPROC) (ALsizei n, ALuint * sources); +typedef ALvoid (ALAPIENTRY *alSourceStopvPROC) (ALsizei n, ALuint * sources); +typedef ALvoid (ALAPIENTRY *alSourceRewindvPROC) (ALsizei n, ALuint * sources); +typedef ALvoid (ALAPIENTRY *alSourcePlayPROC) (ALuint source); +typedef ALvoid (ALAPIENTRY *alSourcePausePROC) (ALuint source); +typedef ALvoid (ALAPIENTRY *alSourceStopPROC) (ALuint source); +typedef ALvoid (ALAPIENTRY *alSourceRewindPROC) (ALuint source); +typedef ALvoid (ALAPIENTRY *alGenBuffersPROC) (ALsizei n, ALuint * buffers); +typedef ALvoid (ALAPIENTRY *alDeleteBuffersPROC) (ALsizei n, ALuint * buffers); +typedef ALboolean (ALAPIENTRY *alIsBufferPROC) (ALuint buffer); +typedef ALvoid (ALAPIENTRY *alBufferDataPROC) (ALuint buffer, ALenum format, ALvoid * data, ALsizei size, ALsizei freq); +typedef ALvoid (ALAPIENTRY *alGetBufferiPROC) (ALuint buffer, ALenum pname, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetBufferfPROC) (ALuint buffer, ALenum pname, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alSourceQueueBuffersPROC) (ALuint source, ALsizei n, ALuint * buffers); +typedef ALvoid (ALAPIENTRY *alSourceUnqueueBuffersPROC) (ALuint source, ALsizei n, ALuint * buffers); +typedef ALvoid (ALAPIENTRY *alDistanceModelPROC) (ALenum value); +typedef ALvoid (ALAPIENTRY *alDopplerFactorPROC) (ALfloat value); +typedef ALvoid (ALAPIENTRY *alDopplerVelocityPROC) (ALfloat value); + +static alEnablePROC alEnable; +static alDisablePROC alDisable; +static alIsEnabledPROC alIsEnabled; +static alGetBooleanPROC alGetBoolean; +static alGetIntegerPROC alGetInteger; +static alGetFloatPROC alGetFloat; +static alGetDoublePROC alGetDouble; +static alGetIntegervPROC alGetIntegerv; +static alGetFloatvPROC alGetFloatv; +static alGetDoublevPROC alGetDoublev; +static alGetStringPROC alGetString; +static alGetErrorPROC alGetError; +static alIsExtensionPresentPROC alIsExtensionPresent; +static alGetEnumValuePROC alGetEnumValue; +static alListeneriPROC alListeneri; +static alListenerfPROC alListenerf; +static alListenerfvPROC alListenerfv; +static alListener3fPROC alListener3f; +static alGetListeneriPROC alGetListeneri; +static alGetListenerfPROC alGetListenerf; +static alGetListenerfvPROC alGetListenerfv; +static alGenSourcesPROC alGenSources; +static alDeleteSourcesPROC alDeleteSources; +static alIsSourcePROC alIsSource; +static alSourceiPROC alSourcei; +static alSourcefPROC alSourcef; +static alSourcefvPROC alSourcefv; +static alSource3fPROC alSource3f; +static alGetSourceiPROC alGetSourcei; +static alGetSourcefPROC alGetSourcef; +static alGetSourcefvPROC alGetSourcefv; +static alSourcePlayvPROC alSourcePlayv; +static alSourcePausevPROC alSourcePausev; +static alSourceStopvPROC alSourceStopv; +static alSourceRewindvPROC alSourceRewindv; +static alSourcePlayPROC alSourcePlay; +static alSourcePausePROC alSourcePause; +static alSourceStopPROC alSourceStop; +static alSourceRewindPROC alSourceRewind; +static alGenBuffersPROC alGenBuffers; +static alDeleteBuffersPROC alDeleteBuffers; +static alIsBufferPROC alIsBuffer; +static alBufferDataPROC alBufferData; +static alGetBufferiPROC alGetBufferi; +static alGetBufferfPROC alGetBufferf; +static alSourceQueueBuffersPROC alSourceQueueBuffers; +static alSourceUnqueueBuffersPROC alSourceUnqueueBuffers; +static alDistanceModelPROC alDistanceModel; +static alDopplerFactorPROC alDopplerFactor; +static alDopplerVelocityPROC alDopplerVelocity; + +static void JNICALL Java_org_lwjgl_openal_AL10_nalEnable(JNIEnv *env, jclass clazz, jint capability) { + alEnable(capability); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDisable(JNIEnv *env, jclass clazz, jint capability) { + alDisable(capability); +} + +static jboolean JNICALL Java_org_lwjgl_openal_AL10_nalIsEnabled(JNIEnv *env, jclass clazz, jint capability) { + ALboolean __result = alIsEnabled(capability); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_openal_AL10_nalGetBoolean(JNIEnv *env, jclass clazz, jint pname) { + ALboolean __result = alGetBoolean(pname); + return __result; +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetInteger(JNIEnv *env, jclass clazz, jint pname) { + ALint __result = alGetInteger(pname); + return __result; +} + +static jfloat JNICALL Java_org_lwjgl_openal_AL10_nalGetFloat(JNIEnv *env, jclass clazz, jint pname) { + ALfloat __result = alGetFloat(pname); + return __result; +} + +static jdouble JNICALL Java_org_lwjgl_openal_AL10_nalGetDouble(JNIEnv *env, jclass clazz, jint pname) { + ALdouble __result = alGetDouble(pname); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGetIntegerv(JNIEnv *env, jclass clazz, jint pname, jlong data) { + ALint *data_address = (ALint *)(intptr_t)data; + alGetIntegerv(pname, data_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGetFloatv(JNIEnv *env, jclass clazz, jint pname, jlong data) { + ALfloat *data_address = (ALfloat *)(intptr_t)data; + alGetFloatv(pname, data_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGetDoublev(JNIEnv *env, jclass clazz, jint pname, jlong data) { + ALdouble *data_address = (ALdouble *)(intptr_t)data; + alGetDoublev(pname, data_address); +} + +static jobject JNICALL Java_org_lwjgl_openal_AL10_nalGetString(JNIEnv *env, jclass clazz, jint pname) { + ALubyte * __result = alGetString(pname); + return NewStringNativeUnsigned(env, __result); +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetError(JNIEnv *env, jclass clazz) { + ALenum __result = alGetError(); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_openal_AL10_nalIsExtensionPresent(JNIEnv *env, jclass clazz, jobject fname) { + ALubyte *fname_address = (ALubyte *)(intptr_t)GetStringNativeChars(env, fname); + ALboolean __result = alIsExtensionPresent(fname_address); + free(fname_address); + return __result; +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetEnumValue(JNIEnv *env, jclass clazz, jobject ename) { + ALubyte *ename_address = (ALubyte *)(intptr_t)GetStringNativeChars(env, ename); + ALenum __result = alGetEnumValue(ename_address); + free(ename_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalListeneri(JNIEnv *env, jclass clazz, jint pname, jint value) { + alListeneri(pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalListenerf(JNIEnv *env, jclass clazz, jint pname, jfloat value) { + alListenerf(pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalListenerfv(JNIEnv *env, jclass clazz, jint pname, jlong value) { + const ALfloat *value_address = (const ALfloat *)(intptr_t)value; + alListenerfv(pname, value_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalListener3f(JNIEnv *env, jclass clazz, jint pname, jfloat v1, jfloat v2, jfloat v3) { + alListener3f(pname, v1, v2, v3); +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetListeneri(JNIEnv *env, jclass clazz, jint pname) { + ALint __result; + alGetListeneri(pname, &__result); + return __result; +} + +static jfloat JNICALL Java_org_lwjgl_openal_AL10_nalGetListenerf(JNIEnv *env, jclass clazz, jint pname) { + ALfloat __result; + alGetListenerf(pname, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGetListenerfv(JNIEnv *env, jclass clazz, jint pname, jlong floatdata) { + ALfloat *floatdata_address = (ALfloat *)(intptr_t)floatdata; + alGetListenerfv(pname, floatdata_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGenSources(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alGenSources(n, sources_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_AL10_nalGenSources2(JNIEnv *env, jclass clazz, jint n) { + ALuint __result; + alGenSources(n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDeleteSources(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alDeleteSources(n, sources_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL10_nalDeleteSources2(JNIEnv *env, jclass clazz, jint n, jint source) { + alDeleteSources(n, (ALuint*)&source); +} + +static jboolean JNICALL Java_org_lwjgl_openal_AL10_nalIsSource(JNIEnv *env, jclass clazz, jint id) { + ALboolean __result = alIsSource(id); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcei(JNIEnv *env, jclass clazz, jint source, jint pname, jint value) { + alSourcei(source, pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcef(JNIEnv *env, jclass clazz, jint source, jint pname, jfloat value) { + alSourcef(source, pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcefv(JNIEnv *env, jclass clazz, jint source, jint pname, jlong value) { + const ALfloat *value_address = (const ALfloat *)(intptr_t)value; + alSourcefv(source, pname, value_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSource3f(JNIEnv *env, jclass clazz, jint source, jint pname, jfloat v1, jfloat v2, jfloat v3) { + alSource3f(source, pname, v1, v2, v3); +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetSourcei(JNIEnv *env, jclass clazz, jint source, jint pname) { + ALint __result; + alGetSourcei(source, pname, &__result); + return __result; +} + +static jfloat JNICALL Java_org_lwjgl_openal_AL10_nalGetSourcef(JNIEnv *env, jclass clazz, jint source, jint pname) { + ALfloat __result; + alGetSourcef(source, pname, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGetSourcefv(JNIEnv *env, jclass clazz, jint source, jint pname, jlong floatdata) { + ALfloat *floatdata_address = (ALfloat *)(intptr_t)floatdata; + alGetSourcefv(source, pname, floatdata_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcePlayv(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alSourcePlayv(n, sources_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcePausev(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alSourcePausev(n, sources_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceStopv(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alSourceStopv(n, sources_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceRewindv(JNIEnv *env, jclass clazz, jint n, jlong sources) { + ALuint *sources_address = (ALuint *)(intptr_t)sources; + alSourceRewindv(n, sources_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcePlay(JNIEnv *env, jclass clazz, jint source) { + alSourcePlay(source); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourcePause(JNIEnv *env, jclass clazz, jint source) { + alSourcePause(source); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceStop(JNIEnv *env, jclass clazz, jint source) { + alSourceStop(source); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceRewind(JNIEnv *env, jclass clazz, jint source) { + alSourceRewind(source); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalGenBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers) { + ALuint *buffers_address = (ALuint *)(intptr_t)buffers; + alGenBuffers(n, buffers_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_AL10_nalGenBuffers2(JNIEnv *env, jclass clazz, jint n) { + ALuint __result; + alGenBuffers(n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDeleteBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers) { + ALuint *buffers_address = (ALuint *)(intptr_t)buffers; + alDeleteBuffers(n, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL10_nalDeleteBuffers2(JNIEnv *env, jclass clazz, jint n, jint buffer) { + alDeleteBuffers(n, (ALuint*)&buffer); +} + +static jboolean JNICALL Java_org_lwjgl_openal_AL10_nalIsBuffer(JNIEnv *env, jclass clazz, jint buffer) { + ALboolean __result = alIsBuffer(buffer); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalBufferData(JNIEnv *env, jclass clazz, jint buffer, jint format, jlong data, jint size, jint freq) { + ALvoid *data_address = (ALvoid *)(intptr_t)data; + alBufferData(buffer, format, data_address, size, freq); +} + +static jint JNICALL Java_org_lwjgl_openal_AL10_nalGetBufferi(JNIEnv *env, jclass clazz, jint buffer, jint pname) { + ALint __result; + alGetBufferi(buffer, pname, &__result); + return __result; +} + +static jfloat JNICALL Java_org_lwjgl_openal_AL10_nalGetBufferf(JNIEnv *env, jclass clazz, jint buffer, jint pname) { + ALfloat __result; + alGetBufferf(buffer, pname, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceQueueBuffers(JNIEnv *env, jclass clazz, jint source, jint n, jlong buffers) { + ALuint *buffers_address = (ALuint *)(intptr_t)buffers; + alSourceQueueBuffers(source, n, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL10_nalSourceQueueBuffers2(JNIEnv *env, jclass clazz, jint source, jint n, jint buffer) { + alSourceQueueBuffers(source, n, (ALuint*)&buffer); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalSourceUnqueueBuffers(JNIEnv *env, jclass clazz, jint source, jint n, jlong buffers) { + ALuint *buffers_address = (ALuint *)(intptr_t)buffers; + alSourceUnqueueBuffers(source, n, buffers_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_AL10_nalSourceUnqueueBuffers2(JNIEnv *env, jclass clazz, jint source, jint n) { + ALuint __result; + alSourceUnqueueBuffers(source, n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDistanceModel(JNIEnv *env, jclass clazz, jint value) { + alDistanceModel(value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDopplerFactor(JNIEnv *env, jclass clazz, jfloat value) { + alDopplerFactor(value); +} + +static void JNICALL Java_org_lwjgl_openal_AL10_nalDopplerVelocity(JNIEnv *env, jclass clazz, jfloat value) { + alDopplerVelocity(value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL10_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nalEnable", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalEnable, "alEnable", (void *)&alEnable, false}, + {"nalDisable", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalDisable, "alDisable", (void *)&alDisable, false}, + {"nalIsEnabled", "(I)Z", (void *)&Java_org_lwjgl_openal_AL10_nalIsEnabled, "alIsEnabled", (void *)&alIsEnabled, false}, + {"nalGetBoolean", "(I)Z", (void *)&Java_org_lwjgl_openal_AL10_nalGetBoolean, "alGetBoolean", (void *)&alGetBoolean, false}, + {"nalGetInteger", "(I)I", (void *)&Java_org_lwjgl_openal_AL10_nalGetInteger, "alGetInteger", (void *)&alGetInteger, false}, + {"nalGetFloat", "(I)F", (void *)&Java_org_lwjgl_openal_AL10_nalGetFloat, "alGetFloat", (void *)&alGetFloat, false}, + {"nalGetDouble", "(I)D", (void *)&Java_org_lwjgl_openal_AL10_nalGetDouble, "alGetDouble", (void *)&alGetDouble, false}, + {"nalGetIntegerv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGetIntegerv, "alGetIntegerv", (void *)&alGetIntegerv, false}, + {"nalGetFloatv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGetFloatv, "alGetFloatv", (void *)&alGetFloatv, false}, + {"nalGetDoublev", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGetDoublev, "alGetDoublev", (void *)&alGetDoublev, false}, + {"nalGetString", "(I)Ljava/lang/String;", (void *)&Java_org_lwjgl_openal_AL10_nalGetString, "alGetString", (void *)&alGetString, false}, + {"nalGetError", "()I", (void *)&Java_org_lwjgl_openal_AL10_nalGetError, "alGetError", (void *)&alGetError, false}, + {"nalIsExtensionPresent", "(Ljava/lang/String;)Z", (void *)&Java_org_lwjgl_openal_AL10_nalIsExtensionPresent, "alIsExtensionPresent", (void *)&alIsExtensionPresent, false}, + {"nalGetEnumValue", "(Ljava/lang/String;)I", (void *)&Java_org_lwjgl_openal_AL10_nalGetEnumValue, "alGetEnumValue", (void *)&alGetEnumValue, false}, + {"nalListeneri", "(II)V", (void *)&Java_org_lwjgl_openal_AL10_nalListeneri, "alListeneri", (void *)&alListeneri, false}, + {"nalListenerf", "(IF)V", (void *)&Java_org_lwjgl_openal_AL10_nalListenerf, "alListenerf", (void *)&alListenerf, false}, + {"nalListenerfv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalListenerfv, "alListenerfv", (void *)&alListenerfv, false}, + {"nalListener3f", "(IFFF)V", (void *)&Java_org_lwjgl_openal_AL10_nalListener3f, "alListener3f", (void *)&alListener3f, false}, + {"nalGetListeneri", "(I)I", (void *)&Java_org_lwjgl_openal_AL10_nalGetListeneri, "alGetListeneri", (void *)&alGetListeneri, false}, + {"nalGetListenerf", "(I)F", (void *)&Java_org_lwjgl_openal_AL10_nalGetListenerf, "alGetListenerf", (void *)&alGetListenerf, false}, + {"nalGetListenerfv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGetListenerfv, "alGetListenerfv", (void *)&alGetListenerfv, false}, + {"nalGenSources", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGenSources, "alGenSources", (void *)&alGenSources, false}, + {"nalGenSources2", "(I)I", (void *)&Java_org_lwjgl_openal_AL10_nalGenSources2, "alGenSources", (void *)&alGenSources, false}, + {"nalDeleteSources", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalDeleteSources, "alDeleteSources", (void *)&alDeleteSources, false}, + {"nalDeleteSources2", "(II)V", (void *)&Java_org_lwjgl_openal_AL10_nalDeleteSources2, "alDeleteSources", (void *)&alDeleteSources, false}, + {"nalIsSource", "(I)Z", (void *)&Java_org_lwjgl_openal_AL10_nalIsSource, "alIsSource", (void *)&alIsSource, false}, + {"nalSourcei", "(III)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcei, "alSourcei", (void *)&alSourcei, false}, + {"nalSourcef", "(IIF)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcef, "alSourcef", (void *)&alSourcef, false}, + {"nalSourcefv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcefv, "alSourcefv", (void *)&alSourcefv, false}, + {"nalSource3f", "(IIFFF)V", (void *)&Java_org_lwjgl_openal_AL10_nalSource3f, "alSource3f", (void *)&alSource3f, false}, + {"nalGetSourcei", "(II)I", (void *)&Java_org_lwjgl_openal_AL10_nalGetSourcei, "alGetSourcei", (void *)&alGetSourcei, false}, + {"nalGetSourcef", "(II)F", (void *)&Java_org_lwjgl_openal_AL10_nalGetSourcef, "alGetSourcef", (void *)&alGetSourcef, false}, + {"nalGetSourcefv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGetSourcefv, "alGetSourcefv", (void *)&alGetSourcefv, false}, + {"nalSourcePlayv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcePlayv, "alSourcePlayv", (void *)&alSourcePlayv, false}, + {"nalSourcePausev", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcePausev, "alSourcePausev", (void *)&alSourcePausev, false}, + {"nalSourceStopv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceStopv, "alSourceStopv", (void *)&alSourceStopv, false}, + {"nalSourceRewindv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceRewindv, "alSourceRewindv", (void *)&alSourceRewindv, false}, + {"nalSourcePlay", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcePlay, "alSourcePlay", (void *)&alSourcePlay, false}, + {"nalSourcePause", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourcePause, "alSourcePause", (void *)&alSourcePause, false}, + {"nalSourceStop", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceStop, "alSourceStop", (void *)&alSourceStop, false}, + {"nalSourceRewind", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceRewind, "alSourceRewind", (void *)&alSourceRewind, false}, + {"nalGenBuffers", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalGenBuffers, "alGenBuffers", (void *)&alGenBuffers, false}, + {"nalGenBuffers2", "(I)I", (void *)&Java_org_lwjgl_openal_AL10_nalGenBuffers2, "alGenBuffers", (void *)&alGenBuffers, false}, + {"nalDeleteBuffers", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalDeleteBuffers, "alDeleteBuffers", (void *)&alDeleteBuffers, false}, + {"nalDeleteBuffers2", "(II)V", (void *)&Java_org_lwjgl_openal_AL10_nalDeleteBuffers2, "alDeleteBuffers", (void *)&alDeleteBuffers, false}, + {"nalIsBuffer", "(I)Z", (void *)&Java_org_lwjgl_openal_AL10_nalIsBuffer, "alIsBuffer", (void *)&alIsBuffer, false}, + {"nalBufferData", "(IIJII)V", (void *)&Java_org_lwjgl_openal_AL10_nalBufferData, "alBufferData", (void *)&alBufferData, false}, + {"nalGetBufferi", "(II)I", (void *)&Java_org_lwjgl_openal_AL10_nalGetBufferi, "alGetBufferi", (void *)&alGetBufferi, false}, + {"nalGetBufferf", "(II)F", (void *)&Java_org_lwjgl_openal_AL10_nalGetBufferf, "alGetBufferf", (void *)&alGetBufferf, false}, + {"nalSourceQueueBuffers", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceQueueBuffers, "alSourceQueueBuffers", (void *)&alSourceQueueBuffers, false}, + {"nalSourceQueueBuffers2", "(III)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceQueueBuffers2, "alSourceQueueBuffers", (void *)&alSourceQueueBuffers, false}, + {"nalSourceUnqueueBuffers", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL10_nalSourceUnqueueBuffers, "alSourceUnqueueBuffers", (void *)&alSourceUnqueueBuffers, false}, + {"nalSourceUnqueueBuffers2", "(II)I", (void *)&Java_org_lwjgl_openal_AL10_nalSourceUnqueueBuffers2, "alSourceUnqueueBuffers", (void *)&alSourceUnqueueBuffers, false}, + {"nalDistanceModel", "(I)V", (void *)&Java_org_lwjgl_openal_AL10_nalDistanceModel, "alDistanceModel", (void *)&alDistanceModel, false}, + {"nalDopplerFactor", "(F)V", (void *)&Java_org_lwjgl_openal_AL10_nalDopplerFactor, "alDopplerFactor", (void *)&alDopplerFactor, false}, + {"nalDopplerVelocity", "(F)V", (void *)&Java_org_lwjgl_openal_AL10_nalDopplerVelocity, "alDopplerVelocity", (void *)&alDopplerVelocity, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extal_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL11.c b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL11.c new file mode 100644 index 0000000..7aac982 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_AL11.c @@ -0,0 +1,128 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extal.h" + +typedef ALvoid (ALAPIENTRY *alListener3iPROC) (ALenum pname, ALint v1, ALint v2, ALint v3); +typedef ALvoid (ALAPIENTRY *alGetListenerivPROC) (ALenum pname, ALfloat * intdata); +typedef ALvoid (ALAPIENTRY *alSource3iPROC) (ALuint source, ALenum pname, ALint v1, ALint v2, ALint v3); +typedef ALvoid (ALAPIENTRY *alSourceivPROC) (ALuint source, ALenum pname, const ALint * value); +typedef ALvoid (ALAPIENTRY *alBufferfPROC) (ALuint buffer, ALenum pname, ALfloat value); +typedef ALvoid (ALAPIENTRY *alBuffer3fPROC) (ALuint buffer, ALenum pname, ALfloat v1, ALfloat v2, ALfloat v3); +typedef ALvoid (ALAPIENTRY *alBufferfvPROC) (ALuint buffer, ALenum pname, const ALfloat * value); +typedef ALvoid (ALAPIENTRY *alBufferiPROC) (ALuint buffer, ALenum pname, ALint value); +typedef ALvoid (ALAPIENTRY *alBuffer3iPROC) (ALuint buffer, ALenum pname, ALint v1, ALint v2, ALint v3); +typedef ALvoid (ALAPIENTRY *alBufferivPROC) (ALuint buffer, ALenum pname, const ALint * value); +typedef ALvoid (ALAPIENTRY *alGetBufferiPROC) (ALuint buffer, ALenum pname, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetBufferivPROC) (ALuint buffer, ALenum pname, ALint * values); +typedef ALvoid (ALAPIENTRY *alGetBufferfPROC) (ALuint buffer, ALenum pname, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetBufferfvPROC) (ALuint buffer, ALenum pname, ALfloat * values); +typedef ALvoid (ALAPIENTRY *alSpeedOfSoundPROC) (ALfloat value); + +static alListener3iPROC alListener3i; +static alGetListenerivPROC alGetListeneriv; +static alSource3iPROC alSource3i; +static alSourceivPROC alSourceiv; +static alBufferfPROC alBufferf; +static alBuffer3fPROC alBuffer3f; +static alBufferfvPROC alBufferfv; +static alBufferiPROC alBufferi; +static alBuffer3iPROC alBuffer3i; +static alBufferivPROC alBufferiv; +static alGetBufferiPROC alGetBufferi; +static alGetBufferivPROC alGetBufferiv; +static alGetBufferfPROC alGetBufferf; +static alGetBufferfvPROC alGetBufferfv; +static alSpeedOfSoundPROC alSpeedOfSound; + +static void JNICALL Java_org_lwjgl_openal_AL11_nalListener3i(JNIEnv *env, jclass clazz, jint pname, jint v1, jint v2, jint v3) { + alListener3i(pname, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalGetListeneriv(JNIEnv *env, jclass clazz, jint pname, jlong intdata) { + ALfloat *intdata_address = (ALfloat *)(intptr_t)intdata; + alGetListeneriv(pname, intdata_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalSource3i(JNIEnv *env, jclass clazz, jint source, jint pname, jint v1, jint v2, jint v3) { + alSource3i(source, pname, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalSourceiv(JNIEnv *env, jclass clazz, jint source, jint pname, jlong value) { + const ALint *value_address = (const ALint *)(intptr_t)value; + alSourceiv(source, pname, value_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBufferf(JNIEnv *env, jclass clazz, jint buffer, jint pname, jfloat value) { + alBufferf(buffer, pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBuffer3f(JNIEnv *env, jclass clazz, jint buffer, jint pname, jfloat v1, jfloat v2, jfloat v3) { + alBuffer3f(buffer, pname, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBufferfv(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong value) { + const ALfloat *value_address = (const ALfloat *)(intptr_t)value; + alBufferfv(buffer, pname, value_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBufferi(JNIEnv *env, jclass clazz, jint buffer, jint pname, jint value) { + alBufferi(buffer, pname, value); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBuffer3i(JNIEnv *env, jclass clazz, jint buffer, jint pname, jint v1, jint v2, jint v3) { + alBuffer3i(buffer, pname, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalBufferiv(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong value) { + const ALint *value_address = (const ALint *)(intptr_t)value; + alBufferiv(buffer, pname, value_address); +} + +static jint JNICALL Java_org_lwjgl_openal_AL11_nalGetBufferi(JNIEnv *env, jclass clazz, jint buffer, jint pname) { + ALint __result; + alGetBufferi(buffer, pname, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalGetBufferiv(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong values) { + ALint *values_address = (ALint *)(intptr_t)values; + alGetBufferiv(buffer, pname, values_address); +} + +static jfloat JNICALL Java_org_lwjgl_openal_AL11_nalGetBufferf(JNIEnv *env, jclass clazz, jint buffer, jint pname) { + ALfloat __result; + alGetBufferf(buffer, pname, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalGetBufferfv(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong values) { + ALfloat *values_address = (ALfloat *)(intptr_t)values; + alGetBufferfv(buffer, pname, values_address); +} + +static void JNICALL Java_org_lwjgl_openal_AL11_nalSpeedOfSound(JNIEnv *env, jclass clazz, jfloat value) { + alSpeedOfSound(value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL11_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nalListener3i", "(IIII)V", (void *)&Java_org_lwjgl_openal_AL11_nalListener3i, "alListener3i", (void *)&alListener3i, false}, + {"nalGetListeneriv", "(IJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalGetListeneriv, "alGetListeneriv", (void *)&alGetListeneriv, false}, + {"nalSource3i", "(IIIII)V", (void *)&Java_org_lwjgl_openal_AL11_nalSource3i, "alSource3i", (void *)&alSource3i, false}, + {"nalSourceiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalSourceiv, "alSourceiv", (void *)&alSourceiv, false}, + {"nalBufferf", "(IIF)V", (void *)&Java_org_lwjgl_openal_AL11_nalBufferf, "alBufferf", (void *)&alBufferf, false}, + {"nalBuffer3f", "(IIFFF)V", (void *)&Java_org_lwjgl_openal_AL11_nalBuffer3f, "alBuffer3f", (void *)&alBuffer3f, false}, + {"nalBufferfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalBufferfv, "alBufferfv", (void *)&alBufferfv, false}, + {"nalBufferi", "(III)V", (void *)&Java_org_lwjgl_openal_AL11_nalBufferi, "alBufferi", (void *)&alBufferi, false}, + {"nalBuffer3i", "(IIIII)V", (void *)&Java_org_lwjgl_openal_AL11_nalBuffer3i, "alBuffer3i", (void *)&alBuffer3i, false}, + {"nalBufferiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalBufferiv, "alBufferiv", (void *)&alBufferiv, false}, + {"nalGetBufferi", "(II)I", (void *)&Java_org_lwjgl_openal_AL11_nalGetBufferi, "alGetBufferi", (void *)&alGetBufferi, false}, + {"nalGetBufferiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalGetBufferiv, "alGetBufferiv", (void *)&alGetBufferiv, false}, + {"nalGetBufferf", "(II)F", (void *)&Java_org_lwjgl_openal_AL11_nalGetBufferf, "alGetBufferf", (void *)&alGetBufferf, false}, + {"nalGetBufferfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_AL11_nalGetBufferfv, "alGetBufferfv", (void *)&alGetBufferfv, false}, + {"nalSpeedOfSound", "(F)V", (void *)&Java_org_lwjgl_openal_AL11_nalSpeedOfSound, "alSpeedOfSound", (void *)&alSpeedOfSound, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extal_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_EFX10.c b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_EFX10.c new file mode 100644 index 0000000..b29c0b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/openal/org_lwjgl_openal_EFX10.c @@ -0,0 +1,313 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extal.h" + +typedef ALvoid (ALAPIENTRY *alGenAuxiliaryEffectSlotsPROC) (ALsizei n, ALuint * auxiliaryeffectslots); +typedef ALvoid (ALAPIENTRY *alDeleteAuxiliaryEffectSlotsPROC) (ALsizei n, ALuint * auxiliaryeffectslots); +typedef ALboolean (ALAPIENTRY *alIsAuxiliaryEffectSlotPROC) (ALuint auxiliaryeffectslot); +typedef ALvoid (ALAPIENTRY *alAuxiliaryEffectSlotiPROC) (ALuint auxiliaryeffectslot, ALenum param, ALint value); +typedef ALvoid (ALAPIENTRY *alAuxiliaryEffectSlotivPROC) (ALuint auxiliaryeffectslot, ALenum param, const ALint * values); +typedef ALvoid (ALAPIENTRY *alAuxiliaryEffectSlotfPROC) (ALuint auxiliaryeffectslot, ALenum param, ALfloat value); +typedef ALvoid (ALAPIENTRY *alAuxiliaryEffectSlotfvPROC) (ALuint auxiliaryeffectslot, ALenum param, const ALfloat * values); +typedef ALvoid (ALAPIENTRY *alGetAuxiliaryEffectSlotiPROC) (ALuint auxiliaryeffectslot, ALenum param, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetAuxiliaryEffectSlotivPROC) (ALuint auxiliaryeffectslot, ALenum param, ALint * intdata); +typedef ALvoid (ALAPIENTRY *alGetAuxiliaryEffectSlotfPROC) (ALuint auxiliaryeffectslot, ALenum param, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetAuxiliaryEffectSlotfvPROC) (ALuint auxiliaryeffectslot, ALenum param, ALfloat * floatdata); +typedef ALvoid (ALAPIENTRY *alGenEffectsPROC) (ALsizei n, ALuint * effects); +typedef ALvoid (ALAPIENTRY *alDeleteEffectsPROC) (ALsizei n, ALuint * effects); +typedef ALboolean (ALAPIENTRY *alIsEffectPROC) (ALuint effect); +typedef ALvoid (ALAPIENTRY *alEffectiPROC) (ALuint effect, ALenum param, ALint value); +typedef ALvoid (ALAPIENTRY *alEffectivPROC) (ALuint effect, ALenum param, const ALint * values); +typedef ALvoid (ALAPIENTRY *alEffectfPROC) (ALuint effect, ALenum param, ALfloat value); +typedef ALvoid (ALAPIENTRY *alEffectfvPROC) (ALuint effect, ALenum param, const ALfloat * values); +typedef ALvoid (ALAPIENTRY *alGetEffectiPROC) (ALuint effect, ALenum param, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetEffectivPROC) (ALuint effect, ALenum param, ALint * intdata); +typedef ALvoid (ALAPIENTRY *alGetEffectfPROC) (ALuint effect, ALenum param, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetEffectfvPROC) (ALuint effect, ALenum param, ALfloat * floatdata); +typedef ALvoid (ALAPIENTRY *alGenFiltersPROC) (ALsizei n, ALuint * filters); +typedef ALvoid (ALAPIENTRY *alDeleteFiltersPROC) (ALsizei n, ALuint * filters); +typedef ALboolean (ALAPIENTRY *alIsFilterPROC) (ALuint filter); +typedef ALvoid (ALAPIENTRY *alFilteriPROC) (ALuint filter, ALenum param, ALint value); +typedef ALvoid (ALAPIENTRY *alFilterivPROC) (ALuint filter, ALenum param, const ALint * values); +typedef ALvoid (ALAPIENTRY *alFilterfPROC) (ALuint filter, ALenum param, ALfloat value); +typedef ALvoid (ALAPIENTRY *alFilterfvPROC) (ALuint filter, ALenum param, const ALfloat * values); +typedef ALvoid (ALAPIENTRY *alGetFilteriPROC) (ALuint filter, ALenum param, ALint* value); +typedef ALvoid (ALAPIENTRY *alGetFilterivPROC) (ALuint filter, ALenum param, ALint * intdata); +typedef ALvoid (ALAPIENTRY *alGetFilterfPROC) (ALuint filter, ALenum param, ALfloat* value); +typedef ALvoid (ALAPIENTRY *alGetFilterfvPROC) (ALuint filter, ALenum param, ALfloat * floatdata); + +static alGenAuxiliaryEffectSlotsPROC alGenAuxiliaryEffectSlots; +static alDeleteAuxiliaryEffectSlotsPROC alDeleteAuxiliaryEffectSlots; +static alIsAuxiliaryEffectSlotPROC alIsAuxiliaryEffectSlot; +static alAuxiliaryEffectSlotiPROC alAuxiliaryEffectSloti; +static alAuxiliaryEffectSlotivPROC alAuxiliaryEffectSlotiv; +static alAuxiliaryEffectSlotfPROC alAuxiliaryEffectSlotf; +static alAuxiliaryEffectSlotfvPROC alAuxiliaryEffectSlotfv; +static alGetAuxiliaryEffectSlotiPROC alGetAuxiliaryEffectSloti; +static alGetAuxiliaryEffectSlotivPROC alGetAuxiliaryEffectSlotiv; +static alGetAuxiliaryEffectSlotfPROC alGetAuxiliaryEffectSlotf; +static alGetAuxiliaryEffectSlotfvPROC alGetAuxiliaryEffectSlotfv; +static alGenEffectsPROC alGenEffects; +static alDeleteEffectsPROC alDeleteEffects; +static alIsEffectPROC alIsEffect; +static alEffectiPROC alEffecti; +static alEffectivPROC alEffectiv; +static alEffectfPROC alEffectf; +static alEffectfvPROC alEffectfv; +static alGetEffectiPROC alGetEffecti; +static alGetEffectivPROC alGetEffectiv; +static alGetEffectfPROC alGetEffectf; +static alGetEffectfvPROC alGetEffectfv; +static alGenFiltersPROC alGenFilters; +static alDeleteFiltersPROC alDeleteFilters; +static alIsFilterPROC alIsFilter; +static alFilteriPROC alFilteri; +static alFilterivPROC alFilteriv; +static alFilterfPROC alFilterf; +static alFilterfvPROC alFilterfv; +static alGetFilteriPROC alGetFilteri; +static alGetFilterivPROC alGetFilteriv; +static alGetFilterfPROC alGetFilterf; +static alGetFilterfvPROC alGetFilterfv; + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGenAuxiliaryEffectSlots(JNIEnv *env, jclass clazz, jint n, jlong auxiliaryeffectslots) { + ALuint *auxiliaryeffectslots_address = (ALuint *)(intptr_t)auxiliaryeffectslots; + alGenAuxiliaryEffectSlots(n, auxiliaryeffectslots_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_EFX10_nalGenAuxiliaryEffectSlots2(JNIEnv *env, jclass clazz, jint n) { + ALuint __result; + alGenAuxiliaryEffectSlots(n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteAuxiliaryEffectSlots(JNIEnv *env, jclass clazz, jint n, jlong auxiliaryeffectslots) { + ALuint *auxiliaryeffectslots_address = (ALuint *)(intptr_t)auxiliaryeffectslots; + alDeleteAuxiliaryEffectSlots(n, auxiliaryeffectslots_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteAuxiliaryEffectSlots2(JNIEnv *env, jclass clazz, jint n, jint auxiliaryeffectslot) { + alDeleteAuxiliaryEffectSlots(n, (ALuint*)&auxiliaryeffectslot); +} + +static jboolean JNICALL Java_org_lwjgl_openal_EFX10_nalIsAuxiliaryEffectSlot(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot) { + ALboolean __result = alIsAuxiliaryEffectSlot(auxiliaryeffectslot); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSloti(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jint value) { + alAuxiliaryEffectSloti(auxiliaryeffectslot, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotiv(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jlong values) { + const ALint *values_address = (const ALint *)(intptr_t)values; + alAuxiliaryEffectSlotiv(auxiliaryeffectslot, param, values_address); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotf(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jfloat value) { + alAuxiliaryEffectSlotf(auxiliaryeffectslot, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotfv(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jlong values) { + const ALfloat *values_address = (const ALfloat *)(intptr_t)values; + alAuxiliaryEffectSlotfv(auxiliaryeffectslot, param, values_address); +} + +static jint JNICALL Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSloti(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param) { + ALint __result; + alGetAuxiliaryEffectSloti(auxiliaryeffectslot, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotiv(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jlong intdata) { + ALint *intdata_address = (ALint *)(intptr_t)intdata; + alGetAuxiliaryEffectSlotiv(auxiliaryeffectslot, param, intdata_address); +} + +static jfloat JNICALL Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotf(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param) { + ALfloat __result; + alGetAuxiliaryEffectSlotf(auxiliaryeffectslot, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotfv(JNIEnv *env, jclass clazz, jint auxiliaryeffectslot, jint param, jlong floatdata) { + ALfloat *floatdata_address = (ALfloat *)(intptr_t)floatdata; + alGetAuxiliaryEffectSlotfv(auxiliaryeffectslot, param, floatdata_address); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGenEffects(JNIEnv *env, jclass clazz, jint n, jlong effects) { + ALuint *effects_address = (ALuint *)(intptr_t)effects; + alGenEffects(n, effects_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_EFX10_nalGenEffects2(JNIEnv *env, jclass clazz, jint n) { + ALuint __result; + alGenEffects(n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteEffects(JNIEnv *env, jclass clazz, jint n, jlong effects) { + ALuint *effects_address = (ALuint *)(intptr_t)effects; + alDeleteEffects(n, effects_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteEffects2(JNIEnv *env, jclass clazz, jint n, jint effect) { + alDeleteEffects(n, (ALuint*)&effect); +} + +static jboolean JNICALL Java_org_lwjgl_openal_EFX10_nalIsEffect(JNIEnv *env, jclass clazz, jint effect) { + ALboolean __result = alIsEffect(effect); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalEffecti(JNIEnv *env, jclass clazz, jint effect, jint param, jint value) { + alEffecti(effect, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalEffectiv(JNIEnv *env, jclass clazz, jint effect, jint param, jlong values) { + const ALint *values_address = (const ALint *)(intptr_t)values; + alEffectiv(effect, param, values_address); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalEffectf(JNIEnv *env, jclass clazz, jint effect, jint param, jfloat value) { + alEffectf(effect, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalEffectfv(JNIEnv *env, jclass clazz, jint effect, jint param, jlong values) { + const ALfloat *values_address = (const ALfloat *)(intptr_t)values; + alEffectfv(effect, param, values_address); +} + +static jint JNICALL Java_org_lwjgl_openal_EFX10_nalGetEffecti(JNIEnv *env, jclass clazz, jint effect, jint param) { + ALint __result; + alGetEffecti(effect, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetEffectiv(JNIEnv *env, jclass clazz, jint effect, jint param, jlong intdata) { + ALint *intdata_address = (ALint *)(intptr_t)intdata; + alGetEffectiv(effect, param, intdata_address); +} + +static jfloat JNICALL Java_org_lwjgl_openal_EFX10_nalGetEffectf(JNIEnv *env, jclass clazz, jint effect, jint param) { + ALfloat __result; + alGetEffectf(effect, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetEffectfv(JNIEnv *env, jclass clazz, jint effect, jint param, jlong floatdata) { + ALfloat *floatdata_address = (ALfloat *)(intptr_t)floatdata; + alGetEffectfv(effect, param, floatdata_address); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGenFilters(JNIEnv *env, jclass clazz, jint n, jlong filters) { + ALuint *filters_address = (ALuint *)(intptr_t)filters; + alGenFilters(n, filters_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_EFX10_nalGenFilters2(JNIEnv *env, jclass clazz, jint n) { + ALuint __result; + alGenFilters(n, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteFilters(JNIEnv *env, jclass clazz, jint n, jlong filters) { + ALuint *filters_address = (ALuint *)(intptr_t)filters; + alDeleteFilters(n, filters_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_EFX10_nalDeleteFilters2(JNIEnv *env, jclass clazz, jint n, jint filter) { + alDeleteFilters(n, (ALuint*)&filter); +} + +static jboolean JNICALL Java_org_lwjgl_openal_EFX10_nalIsFilter(JNIEnv *env, jclass clazz, jint filter) { + ALboolean __result = alIsFilter(filter); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalFilteri(JNIEnv *env, jclass clazz, jint filter, jint param, jint value) { + alFilteri(filter, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalFilteriv(JNIEnv *env, jclass clazz, jint filter, jint param, jlong values) { + const ALint *values_address = (const ALint *)(intptr_t)values; + alFilteriv(filter, param, values_address); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalFilterf(JNIEnv *env, jclass clazz, jint filter, jint param, jfloat value) { + alFilterf(filter, param, value); +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalFilterfv(JNIEnv *env, jclass clazz, jint filter, jint param, jlong values) { + const ALfloat *values_address = (const ALfloat *)(intptr_t)values; + alFilterfv(filter, param, values_address); +} + +static jint JNICALL Java_org_lwjgl_openal_EFX10_nalGetFilteri(JNIEnv *env, jclass clazz, jint filter, jint param) { + ALint __result; + alGetFilteri(filter, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetFilteriv(JNIEnv *env, jclass clazz, jint filter, jint param, jlong intdata) { + ALint *intdata_address = (ALint *)(intptr_t)intdata; + alGetFilteriv(filter, param, intdata_address); +} + +static jfloat JNICALL Java_org_lwjgl_openal_EFX10_nalGetFilterf(JNIEnv *env, jclass clazz, jint filter, jint param) { + ALfloat __result; + alGetFilterf(filter, param, &__result); + return __result; +} + +static void JNICALL Java_org_lwjgl_openal_EFX10_nalGetFilterfv(JNIEnv *env, jclass clazz, jint filter, jint param, jlong floatdata) { + ALfloat *floatdata_address = (ALfloat *)(intptr_t)floatdata; + alGetFilterfv(filter, param, floatdata_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_EFX10_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nalGenAuxiliaryEffectSlots", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGenAuxiliaryEffectSlots, "alGenAuxiliaryEffectSlots", (void *)&alGenAuxiliaryEffectSlots, false}, + {"nalGenAuxiliaryEffectSlots2", "(I)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGenAuxiliaryEffectSlots2, "alGenAuxiliaryEffectSlots", (void *)&alGenAuxiliaryEffectSlots, false}, + {"nalDeleteAuxiliaryEffectSlots", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteAuxiliaryEffectSlots, "alDeleteAuxiliaryEffectSlots", (void *)&alDeleteAuxiliaryEffectSlots, false}, + {"nalDeleteAuxiliaryEffectSlots2", "(II)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteAuxiliaryEffectSlots2, "alDeleteAuxiliaryEffectSlots", (void *)&alDeleteAuxiliaryEffectSlots, false}, + {"nalIsAuxiliaryEffectSlot", "(I)Z", (void *)&Java_org_lwjgl_openal_EFX10_nalIsAuxiliaryEffectSlot, "alIsAuxiliaryEffectSlot", (void *)&alIsAuxiliaryEffectSlot, false}, + {"nalAuxiliaryEffectSloti", "(III)V", (void *)&Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSloti, "alAuxiliaryEffectSloti", (void *)&alAuxiliaryEffectSloti, false}, + {"nalAuxiliaryEffectSlotiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotiv, "alAuxiliaryEffectSlotiv", (void *)&alAuxiliaryEffectSlotiv, false}, + {"nalAuxiliaryEffectSlotf", "(IIF)V", (void *)&Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotf, "alAuxiliaryEffectSlotf", (void *)&alAuxiliaryEffectSlotf, false}, + {"nalAuxiliaryEffectSlotfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalAuxiliaryEffectSlotfv, "alAuxiliaryEffectSlotfv", (void *)&alAuxiliaryEffectSlotfv, false}, + {"nalGetAuxiliaryEffectSloti", "(II)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSloti, "alGetAuxiliaryEffectSloti", (void *)&alGetAuxiliaryEffectSloti, false}, + {"nalGetAuxiliaryEffectSlotiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotiv, "alGetAuxiliaryEffectSlotiv", (void *)&alGetAuxiliaryEffectSlotiv, false}, + {"nalGetAuxiliaryEffectSlotf", "(II)F", (void *)&Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotf, "alGetAuxiliaryEffectSlotf", (void *)&alGetAuxiliaryEffectSlotf, false}, + {"nalGetAuxiliaryEffectSlotfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetAuxiliaryEffectSlotfv, "alGetAuxiliaryEffectSlotfv", (void *)&alGetAuxiliaryEffectSlotfv, false}, + {"nalGenEffects", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGenEffects, "alGenEffects", (void *)&alGenEffects, false}, + {"nalGenEffects2", "(I)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGenEffects2, "alGenEffects", (void *)&alGenEffects, false}, + {"nalDeleteEffects", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteEffects, "alDeleteEffects", (void *)&alDeleteEffects, false}, + {"nalDeleteEffects2", "(II)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteEffects2, "alDeleteEffects", (void *)&alDeleteEffects, false}, + {"nalIsEffect", "(I)Z", (void *)&Java_org_lwjgl_openal_EFX10_nalIsEffect, "alIsEffect", (void *)&alIsEffect, false}, + {"nalEffecti", "(III)V", (void *)&Java_org_lwjgl_openal_EFX10_nalEffecti, "alEffecti", (void *)&alEffecti, false}, + {"nalEffectiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalEffectiv, "alEffectiv", (void *)&alEffectiv, false}, + {"nalEffectf", "(IIF)V", (void *)&Java_org_lwjgl_openal_EFX10_nalEffectf, "alEffectf", (void *)&alEffectf, false}, + {"nalEffectfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalEffectfv, "alEffectfv", (void *)&alEffectfv, false}, + {"nalGetEffecti", "(II)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGetEffecti, "alGetEffecti", (void *)&alGetEffecti, false}, + {"nalGetEffectiv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetEffectiv, "alGetEffectiv", (void *)&alGetEffectiv, false}, + {"nalGetEffectf", "(II)F", (void *)&Java_org_lwjgl_openal_EFX10_nalGetEffectf, "alGetEffectf", (void *)&alGetEffectf, false}, + {"nalGetEffectfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetEffectfv, "alGetEffectfv", (void *)&alGetEffectfv, false}, + {"nalGenFilters", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGenFilters, "alGenFilters", (void *)&alGenFilters, false}, + {"nalGenFilters2", "(I)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGenFilters2, "alGenFilters", (void *)&alGenFilters, false}, + {"nalDeleteFilters", "(IJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteFilters, "alDeleteFilters", (void *)&alDeleteFilters, false}, + {"nalDeleteFilters2", "(II)V", (void *)&Java_org_lwjgl_openal_EFX10_nalDeleteFilters2, "alDeleteFilters", (void *)&alDeleteFilters, false}, + {"nalIsFilter", "(I)Z", (void *)&Java_org_lwjgl_openal_EFX10_nalIsFilter, "alIsFilter", (void *)&alIsFilter, false}, + {"nalFilteri", "(III)V", (void *)&Java_org_lwjgl_openal_EFX10_nalFilteri, "alFilteri", (void *)&alFilteri, false}, + {"nalFilteriv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalFilteriv, "alFilteriv", (void *)&alFilteriv, false}, + {"nalFilterf", "(IIF)V", (void *)&Java_org_lwjgl_openal_EFX10_nalFilterf, "alFilterf", (void *)&alFilterf, false}, + {"nalFilterfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalFilterfv, "alFilterfv", (void *)&alFilterfv, false}, + {"nalGetFilteri", "(II)I", (void *)&Java_org_lwjgl_openal_EFX10_nalGetFilteri, "alGetFilteri", (void *)&alGetFilteri, false}, + {"nalGetFilteriv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetFilteriv, "alGetFilteriv", (void *)&alGetFilteriv, false}, + {"nalGetFilterf", "(II)F", (void *)&Java_org_lwjgl_openal_EFX10_nalGetFilterf, "alGetFilterf", (void *)&alGetFilterf, false}, + {"nalGetFilterfv", "(IIJ)V", (void *)&Java_org_lwjgl_openal_EFX10_nalGetFilterfv, "alGetFilterfv", (void *)&alGetFilterfv, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extal_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEContextLoggingFunctions.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEContextLoggingFunctions.c new file mode 100644 index 0000000..a369557 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEContextLoggingFunctions.c @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY void (CL_API_CALL *clLogMessagesToSystemLogAPPLEPROC) (const cl_char * errstr, const cl_void * private_info, size_t cb, cl_void * user_data); +typedef CL_API_ENTRY void (CL_API_CALL *clLogMessagesToStdoutAPPLEPROC) (const cl_char * errstr, const cl_void * private_info, size_t cb, cl_void * user_data); +typedef CL_API_ENTRY void (CL_API_CALL *clLogMessagesToStderrAPPLEPROC) (const cl_char * errstr, const cl_void * private_info, size_t cb, cl_void * user_data); + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_APPLEContextLoggingFunctions_nclLogMessagesToSystemLogAPPLE(JNIEnv *env, jclass clazz, jlong errstr, jlong private_info, jlong cb, jlong user_data, jlong function_pointer) { + const cl_char *errstr_address = (const cl_char *)(intptr_t)errstr; + const cl_void *private_info_address = (const cl_void *)(intptr_t)private_info; + cl_void *user_data_address = (cl_void *)(intptr_t)user_data; + clLogMessagesToSystemLogAPPLEPROC clLogMessagesToSystemLogAPPLE = (clLogMessagesToSystemLogAPPLEPROC)((intptr_t)function_pointer); + clLogMessagesToSystemLogAPPLE(errstr_address, private_info_address, cb, user_data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_APPLEContextLoggingFunctions_nclLogMessagesToStdoutAPPLE(JNIEnv *env, jclass clazz, jlong errstr, jlong private_info, jlong cb, jlong user_data, jlong function_pointer) { + const cl_char *errstr_address = (const cl_char *)(intptr_t)errstr; + const cl_void *private_info_address = (const cl_void *)(intptr_t)private_info; + cl_void *user_data_address = (cl_void *)(intptr_t)user_data; + clLogMessagesToStdoutAPPLEPROC clLogMessagesToStdoutAPPLE = (clLogMessagesToStdoutAPPLEPROC)((intptr_t)function_pointer); + clLogMessagesToStdoutAPPLE(errstr_address, private_info_address, cb, user_data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_APPLEContextLoggingFunctions_nclLogMessagesToStderrAPPLE(JNIEnv *env, jclass clazz, jlong errstr, jlong private_info, jlong cb, jlong user_data, jlong function_pointer) { + const cl_char *errstr_address = (const cl_char *)(intptr_t)errstr; + const cl_void *private_info_address = (const cl_void *)(intptr_t)private_info; + cl_void *user_data_address = (cl_void *)(intptr_t)user_data; + clLogMessagesToStderrAPPLEPROC clLogMessagesToStderrAPPLE = (clLogMessagesToStderrAPPLEPROC)((intptr_t)function_pointer); + clLogMessagesToStderrAPPLE(errstr_address, private_info_address, cb, user_data_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEGLSharing.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEGLSharing.c new file mode 100644 index 0000000..072c0f7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLEGLSharing.c @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoAPPLEPROC) (cl_context context, cl_void * platform_gl_ctx, cl_gl_platform_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_APPLEGLSharing_nclGetGLContextInfoAPPLE(JNIEnv *env, jclass clazz, jlong context, jlong platform_gl_ctx, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *platform_gl_ctx_address = (cl_void *)(intptr_t)platform_gl_ctx; + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetGLContextInfoAPPLEPROC clGetGLContextInfoAPPLE = (clGetGLContextInfoAPPLEPROC)((intptr_t)function_pointer); + cl_int __result = clGetGLContextInfoAPPLE((cl_context)(intptr_t)context, platform_gl_ctx_address, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLESetMemObjectDestructor.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLESetMemObjectDestructor.c new file mode 100644 index 0000000..b87063c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_APPLESetMemObjectDestructor.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetMemObjectDestructorAPPLEPROC) (cl_mem memobj, cl_mem_object_destructor_callback pfn_notify, void * user_data); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_APPLESetMemObjectDestructor_nclSetMemObjectDestructorAPPLE(JNIEnv *env, jclass clazz, jlong memobj, jlong pfn_notify, jlong user_data, jlong function_pointer) { + clSetMemObjectDestructorAPPLEPROC clSetMemObjectDestructorAPPLE = (clSetMemObjectDestructorAPPLEPROC)((intptr_t)function_pointer); + cl_int __result = clSetMemObjectDestructorAPPLE((cl_mem)(intptr_t)memobj, (cl_mem_object_destructor_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10.c new file mode 100644 index 0000000..845efe6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10.c @@ -0,0 +1,732 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformIDsPROC) (cl_uint num_entries, cl_platform_id * platforms, cl_uint * num_platforms); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformInfoPROC) (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsPROC) (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceInfoPROC) (cl_device_id device, cl_device_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_context (CL_API_CALL *clCreateContextPROC) (const cl_context_properties * properties, cl_uint num_devices, const cl_device_id * devices, cl_create_context_callback pfn_notify, void * user_data, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_context (CL_API_CALL *clCreateContextFromTypePROC) (const cl_context_properties * properties, cl_device_type device_type, cl_create_context_callback pfn_notify, void * user_data, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainContextPROC) (cl_context context); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseContextPROC) (cl_context context); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetContextInfoPROC) (cl_context context, cl_context_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *clCreateCommandQueuePROC) (cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainCommandQueuePROC) (cl_command_queue command_queue); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseCommandQueuePROC) (cl_command_queue command_queue); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetCommandQueueInfoPROC) (cl_command_queue command_queue, cl_command_queue_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateBufferPROC) (cl_context context, cl_mem_flags flags, size_t size, cl_void * host_ptr, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReadBufferPROC) (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t size, cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueWriteBufferPROC) (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t size, const cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueCopyBufferPROC) (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t size, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_void * (CL_API_CALL *clEnqueueMapBufferPROC) (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateImage2DPROC) (cl_context context, cl_mem_flags flags, const cl_image_format * image_format, size_t image_width, size_t image_height, size_t image_row_pitch, cl_void * host_ptr, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateImage3DPROC) (cl_context context, cl_mem_flags flags, const cl_image_format * image_format, size_t image_width, size_t image_height, size_t image_depth, size_t image_row_pitch, size_t image_slice_pitch, cl_void * host_ptr, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetSupportedImageFormatsPROC) (cl_context context, cl_mem_flags flags, cl_mem_object_type image_type, cl_uint num_entries, cl_image_format * image_formats, cl_uint * num_image_formats); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReadImagePROC) (cl_command_queue command_queue, cl_mem image, cl_bool blocking_read, const size_t * origin, const size_t * region, size_t row_pitch, size_t slice_pitch, cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueWriteImagePROC) (cl_command_queue command_queue, cl_mem image, cl_bool blocking_write, const size_t * origin, const size_t * region, size_t input_row_pitch, size_t input_slice_pitch, const cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueCopyImagePROC) (cl_command_queue command_queue, cl_mem src_image, cl_mem dst_image, const size_t * src_origin, const size_t * dst_origin, const size_t * region, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueCopyImageToBufferPROC) (cl_command_queue command_queue, cl_mem src_image, cl_mem dst_buffer, const size_t * src_origin, const size_t * region, size_t dst_offset, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueCopyBufferToImagePROC) (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_image, size_t src_offset, const size_t * dst_origin, const size_t * region, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_void * (CL_API_CALL *clEnqueueMapImagePROC) (cl_command_queue command_queue, cl_mem image, cl_bool blocking_map, cl_map_flags map_flags, const size_t * origin, const size_t * region, size_t * image_row_pitch, size_t * image_slice_pitch, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetImageInfoPROC) (cl_mem image, cl_image_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainMemObjectPROC) (cl_mem memobj); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseMemObjectPROC) (cl_mem memobj); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueUnmapMemObjectPROC) (cl_command_queue command_queue, cl_mem memobj, cl_void * mapped_ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetMemObjectInfoPROC) (cl_mem memobj, cl_mem_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_sampler (CL_API_CALL *clCreateSamplerPROC) (cl_context context, cl_bool normalized_coords, cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainSamplerPROC) (cl_sampler sampler); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseSamplerPROC) (cl_sampler sampler); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetSamplerInfoPROC) (cl_sampler sampler, cl_sampler_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_program (CL_API_CALL *clCreateProgramWithSourcePROC) (cl_context context, cl_uint count, const cl_char ** string, const size_t* lengths, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_program (CL_API_CALL *clCreateProgramWithBinaryPROC) (cl_context context, cl_uint num_devices, const cl_device_id* device, const size_t* lengths, const cl_uchar ** binary, cl_int * binary_status, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainProgramPROC) (cl_program program); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseProgramPROC) (cl_program program); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clBuildProgramPROC) (cl_program program, cl_uint num_devices, const cl_device_id * device_list, const cl_char * options, cl_program_callback pfn_notify, void * user_data); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clUnloadCompilerPROC) (); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetProgramInfoPROC) (cl_program program, cl_program_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetProgramBuildInfoPROC) (cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_kernel (CL_API_CALL *clCreateKernelPROC) (cl_program program, const cl_char * kernel_name, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clCreateKernelsInProgramPROC) (cl_program program, cl_uint num_kernels, cl_kernel * kernels, cl_uint * num_kernels_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainKernelPROC) (cl_kernel kernel); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseKernelPROC) (cl_kernel kernel); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetKernelArgPROC) (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const cl_void * arg_value); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelInfoPROC) (cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelWorkGroupInfoPROC) (cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueNDRangeKernelPROC) (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t * global_work_offset, const size_t * global_work_size, const size_t * local_work_size, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueTaskPROC) (cl_command_queue command_queue, cl_kernel kernel, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueNativeKernelPROC) (cl_command_queue command_queue, cl_native_kernel_func user_func, cl_void * args, size_t cb_args, cl_uint num_mem_objects, const cl_mem* mem_list, const cl_void ** args_mem_loc, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clWaitForEventsPROC) (cl_uint num_events, const cl_event * event_list); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetEventInfoPROC) (cl_event event, cl_event_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainEventPROC) (cl_event event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseEventPROC) (cl_event event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMarkerPROC) (cl_command_queue command_queue, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueBarrierPROC) (cl_command_queue command_queue); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueWaitForEventsPROC) (cl_command_queue command_queue, cl_uint num_events, const cl_event * event_list); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetEventProfilingInfoPROC) (cl_event event, cl_profiling_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clFlushPROC) (cl_command_queue command_queue); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clFinishPROC) (cl_command_queue command_queue); +typedef CL_API_ENTRY void * (CL_API_CALL *clGetExtensionFunctionAddressPROC) (const cl_char * func_name); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetPlatformIDs(JNIEnv *env, jclass clazz, jint num_entries, jlong platforms, jlong num_platforms, jlong function_pointer) { + cl_platform_id *platforms_address = (cl_platform_id *)(intptr_t)platforms; + cl_uint *num_platforms_address = (cl_uint *)(intptr_t)num_platforms; + clGetPlatformIDsPROC clGetPlatformIDs = (clGetPlatformIDsPROC)((intptr_t)function_pointer); + cl_int __result = clGetPlatformIDs(num_entries, platforms_address, num_platforms_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetPlatformInfo(JNIEnv *env, jclass clazz, jlong platform, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetPlatformInfoPROC clGetPlatformInfo = (clGetPlatformInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetPlatformInfo((cl_platform_id)(intptr_t)platform, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetDeviceIDs(JNIEnv *env, jclass clazz, jlong platform, jlong device_type, jint num_entries, jlong devices, jlong num_devices, jlong function_pointer) { + cl_device_id *devices_address = (cl_device_id *)(intptr_t)devices; + cl_uint *num_devices_address = (cl_uint *)(intptr_t)num_devices; + clGetDeviceIDsPROC clGetDeviceIDs = (clGetDeviceIDsPROC)((intptr_t)function_pointer); + cl_int __result = clGetDeviceIDs((cl_platform_id)(intptr_t)platform, device_type, num_entries, devices_address, num_devices_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetDeviceInfo(JNIEnv *env, jclass clazz, jlong device, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetDeviceInfoPROC clGetDeviceInfo = (clGetDeviceInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetDeviceInfo((cl_device_id)(intptr_t)device, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateContext(JNIEnv *env, jclass clazz, jlong properties, jint num_devices, jlong devices, jlong pfn_notify, jlong user_data, jlong errcode_ret, jlong function_pointer) { + const cl_context_properties *properties_address = (const cl_context_properties *)(intptr_t)properties; + const cl_device_id *devices_address = (const cl_device_id *)(intptr_t)devices; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateContextPROC clCreateContext = (clCreateContextPROC)((intptr_t)function_pointer); + cl_context __result = clCreateContext(properties_address, num_devices, devices_address, (cl_create_context_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateContextFromType(JNIEnv *env, jclass clazz, jlong properties, jlong device_type, jlong pfn_notify, jlong user_data, jlong errcode_ret, jlong function_pointer) { + const cl_context_properties *properties_address = (const cl_context_properties *)(intptr_t)properties; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateContextFromTypePROC clCreateContextFromType = (clCreateContextFromTypePROC)((intptr_t)function_pointer); + cl_context __result = clCreateContextFromType(properties_address, device_type, (cl_create_context_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainContext(JNIEnv *env, jclass clazz, jlong context, jlong function_pointer) { + clRetainContextPROC clRetainContext = (clRetainContextPROC)((intptr_t)function_pointer); + cl_int __result = clRetainContext((cl_context)(intptr_t)context); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseContext(JNIEnv *env, jclass clazz, jlong context, jlong function_pointer) { + clReleaseContextPROC clReleaseContext = (clReleaseContextPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseContext((cl_context)(intptr_t)context); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetContextInfo(JNIEnv *env, jclass clazz, jlong context, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetContextInfoPROC clGetContextInfo = (clGetContextInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetContextInfo((cl_context)(intptr_t)context, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateCommandQueue(JNIEnv *env, jclass clazz, jlong context, jlong device, jlong properties, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateCommandQueuePROC clCreateCommandQueue = (clCreateCommandQueuePROC)((intptr_t)function_pointer); + cl_command_queue __result = clCreateCommandQueue((cl_context)(intptr_t)context, (cl_device_id)(intptr_t)device, properties, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainCommandQueue(JNIEnv *env, jclass clazz, jlong command_queue, jlong function_pointer) { + clRetainCommandQueuePROC clRetainCommandQueue = (clRetainCommandQueuePROC)((intptr_t)function_pointer); + cl_int __result = clRetainCommandQueue((cl_command_queue)(intptr_t)command_queue); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseCommandQueue(JNIEnv *env, jclass clazz, jlong command_queue, jlong function_pointer) { + clReleaseCommandQueuePROC clReleaseCommandQueue = (clReleaseCommandQueuePROC)((intptr_t)function_pointer); + cl_int __result = clReleaseCommandQueue((cl_command_queue)(intptr_t)command_queue); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetCommandQueueInfo(JNIEnv *env, jclass clazz, jlong command_queue, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetCommandQueueInfoPROC clGetCommandQueueInfo = (clGetCommandQueueInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetCommandQueueInfo((cl_command_queue)(intptr_t)command_queue, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateBuffer(JNIEnv *env, jclass clazz, jlong context, jlong flags, jlong size, jlong host_ptr, jlong errcode_ret, jlong function_pointer) { + cl_void *host_ptr_address = (cl_void *)(intptr_t)host_ptr; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateBufferPROC clCreateBuffer = (clCreateBufferPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateBuffer((cl_context)(intptr_t)context, flags, size, host_ptr_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueReadBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jint blocking_read, jlong offset, jlong size, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + cl_void *ptr_address = (cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueReadBufferPROC clEnqueueReadBuffer = (clEnqueueReadBufferPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueReadBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, blocking_read, offset, size, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueWriteBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jint blocking_write, jlong offset, jlong size, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_void *ptr_address = (const cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueWriteBufferPROC clEnqueueWriteBuffer = (clEnqueueWriteBufferPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueWriteBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, blocking_write, offset, size, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueCopyBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong src_buffer, jlong dst_buffer, jlong src_offset, jlong dst_offset, jlong size, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueCopyBufferPROC clEnqueueCopyBuffer = (clEnqueueCopyBufferPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueCopyBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)src_buffer, (cl_mem)(intptr_t)dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueMapBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jint blocking_map, jlong map_flags, jlong offset, jlong size, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong errcode_ret, jlong result_size, jlong function_pointer) { + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clEnqueueMapBufferPROC clEnqueueMapBuffer = (clEnqueueMapBufferPROC)((intptr_t)function_pointer); + cl_void * __result = clEnqueueMapBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, blocking_map, map_flags, offset, size, num_events_in_wait_list, event_wait_list_address, event_address, errcode_ret_address); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateImage2D(JNIEnv *env, jclass clazz, jlong context, jlong flags, jlong image_format, jlong image_width, jlong image_height, jlong image_row_pitch, jlong host_ptr, jlong errcode_ret, jlong function_pointer) { + const cl_image_format *image_format_address = (const cl_image_format *)(intptr_t)image_format; + cl_void *host_ptr_address = (cl_void *)(intptr_t)host_ptr; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateImage2DPROC clCreateImage2D = (clCreateImage2DPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateImage2D((cl_context)(intptr_t)context, flags, image_format_address, image_width, image_height, image_row_pitch, host_ptr_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateImage3D(JNIEnv *env, jclass clazz, jlong context, jlong flags, jlong image_format, jlong image_width, jlong image_height, jlong image_depth, jlong image_row_pitch, jlong image_slice_pitch, jlong host_ptr, jlong errcode_ret, jlong function_pointer) { + const cl_image_format *image_format_address = (const cl_image_format *)(intptr_t)image_format; + cl_void *host_ptr_address = (cl_void *)(intptr_t)host_ptr; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateImage3DPROC clCreateImage3D = (clCreateImage3DPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateImage3D((cl_context)(intptr_t)context, flags, image_format_address, image_width, image_height, image_depth, image_row_pitch, image_slice_pitch, host_ptr_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetSupportedImageFormats(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint image_type, jint num_entries, jlong image_formats, jlong num_image_formats, jlong function_pointer) { + cl_image_format *image_formats_address = (cl_image_format *)(intptr_t)image_formats; + cl_uint *num_image_formats_address = (cl_uint *)(intptr_t)num_image_formats; + clGetSupportedImageFormatsPROC clGetSupportedImageFormats = (clGetSupportedImageFormatsPROC)((intptr_t)function_pointer); + cl_int __result = clGetSupportedImageFormats((cl_context)(intptr_t)context, flags, image_type, num_entries, image_formats_address, num_image_formats_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueReadImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong image, jint blocking_read, jlong origin, jlong region, jlong row_pitch, jlong slice_pitch, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *origin_address = (const size_t *)(intptr_t)origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + cl_void *ptr_address = (cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueReadImagePROC clEnqueueReadImage = (clEnqueueReadImagePROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueReadImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)image, blocking_read, origin_address, region_address, row_pitch, slice_pitch, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueWriteImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong image, jint blocking_write, jlong origin, jlong region, jlong input_row_pitch, jlong input_slice_pitch, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *origin_address = (const size_t *)(intptr_t)origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_void *ptr_address = (const cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueWriteImagePROC clEnqueueWriteImage = (clEnqueueWriteImagePROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueWriteImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)image, blocking_write, origin_address, region_address, input_row_pitch, input_slice_pitch, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueCopyImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong src_image, jlong dst_image, jlong src_origin, jlong dst_origin, jlong region, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *src_origin_address = (const size_t *)(intptr_t)src_origin; + const size_t *dst_origin_address = (const size_t *)(intptr_t)dst_origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueCopyImagePROC clEnqueueCopyImage = (clEnqueueCopyImagePROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueCopyImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)src_image, (cl_mem)(intptr_t)dst_image, src_origin_address, dst_origin_address, region_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueCopyImageToBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong src_image, jlong dst_buffer, jlong src_origin, jlong region, jlong dst_offset, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *src_origin_address = (const size_t *)(intptr_t)src_origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueCopyImageToBufferPROC clEnqueueCopyImageToBuffer = (clEnqueueCopyImageToBufferPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueCopyImageToBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)src_image, (cl_mem)(intptr_t)dst_buffer, src_origin_address, region_address, dst_offset, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueCopyBufferToImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong src_buffer, jlong dst_image, jlong src_offset, jlong dst_origin, jlong region, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *dst_origin_address = (const size_t *)(intptr_t)dst_origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueCopyBufferToImagePROC clEnqueueCopyBufferToImage = (clEnqueueCopyBufferToImagePROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueCopyBufferToImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)src_buffer, (cl_mem)(intptr_t)dst_image, src_offset, dst_origin_address, region_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueMapImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong image, jint blocking_map, jlong map_flags, jlong origin, jlong region, jlong image_row_pitch, jlong image_slice_pitch, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong errcode_ret, jlong function_pointer) { + const size_t *origin_address = (const size_t *)(intptr_t)origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + size_t *image_row_pitch_address = (size_t *)(intptr_t)image_row_pitch; + size_t *image_slice_pitch_address = (size_t *)(intptr_t)image_slice_pitch; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clEnqueueMapImagePROC clEnqueueMapImage = (clEnqueueMapImagePROC)((intptr_t)function_pointer); + cl_void * __result = clEnqueueMapImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)image, blocking_map, map_flags, origin_address, region_address, image_row_pitch_address, image_slice_pitch_address, num_events_in_wait_list, event_wait_list_address, event_address, errcode_ret_address); + return safeNewBuffer(env, __result, extcl_CalculateImageSize(region_address, *image_row_pitch_address, image_slice_pitch_address == NULL ? 0 : *image_slice_pitch_address)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetImageInfo(JNIEnv *env, jclass clazz, jlong image, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetImageInfoPROC clGetImageInfo = (clGetImageInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetImageInfo((cl_mem)(intptr_t)image, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainMemObject(JNIEnv *env, jclass clazz, jlong memobj, jlong function_pointer) { + clRetainMemObjectPROC clRetainMemObject = (clRetainMemObjectPROC)((intptr_t)function_pointer); + cl_int __result = clRetainMemObject((cl_mem)(intptr_t)memobj); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseMemObject(JNIEnv *env, jclass clazz, jlong memobj, jlong function_pointer) { + clReleaseMemObjectPROC clReleaseMemObject = (clReleaseMemObjectPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseMemObject((cl_mem)(intptr_t)memobj); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueUnmapMemObject(JNIEnv *env, jclass clazz, jlong command_queue, jlong memobj, jlong mapped_ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + cl_void *mapped_ptr_address = (cl_void *)(intptr_t)mapped_ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueUnmapMemObjectPROC clEnqueueUnmapMemObject = (clEnqueueUnmapMemObjectPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueUnmapMemObject((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)memobj, mapped_ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetMemObjectInfo(JNIEnv *env, jclass clazz, jlong memobj, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetMemObjectInfoPROC clGetMemObjectInfo = (clGetMemObjectInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetMemObjectInfo((cl_mem)(intptr_t)memobj, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateSampler(JNIEnv *env, jclass clazz, jlong context, jint normalized_coords, jint addressing_mode, jint filter_mode, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateSamplerPROC clCreateSampler = (clCreateSamplerPROC)((intptr_t)function_pointer); + cl_sampler __result = clCreateSampler((cl_context)(intptr_t)context, normalized_coords, addressing_mode, filter_mode, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainSampler(JNIEnv *env, jclass clazz, jlong sampler, jlong function_pointer) { + clRetainSamplerPROC clRetainSampler = (clRetainSamplerPROC)((intptr_t)function_pointer); + cl_int __result = clRetainSampler((cl_sampler)(intptr_t)sampler); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseSampler(JNIEnv *env, jclass clazz, jlong sampler, jlong function_pointer) { + clReleaseSamplerPROC clReleaseSampler = (clReleaseSamplerPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseSampler((cl_sampler)(intptr_t)sampler); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetSamplerInfo(JNIEnv *env, jclass clazz, jlong sampler, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetSamplerInfoPROC clGetSamplerInfo = (clGetSamplerInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetSamplerInfo((cl_sampler)(intptr_t)sampler, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithSource(JNIEnv *env, jclass clazz, jlong context, jint count, jlong string, jlong lengths, jlong errcode_ret, jlong function_pointer) { + const cl_char *string_address = (const cl_char *)(intptr_t)string; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithSourcePROC clCreateProgramWithSource = (clCreateProgramWithSourcePROC)((intptr_t)function_pointer); + cl_program __result = clCreateProgramWithSource((cl_context)(intptr_t)context, count, (const cl_char **)&string_address, (const size_t*)&lengths, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithSource2(JNIEnv *env, jclass clazz, jlong context, jint count, jlong strings, jlong lengths, jlong errcode_ret, jlong function_pointer) { + const cl_char *strings_address = (const cl_char *)(intptr_t)strings; + int _str_i; + cl_char *_str_address; + cl_char **strings_str = (cl_char **) malloc(count * sizeof(cl_char *)); + const size_t *lengths_address = (const size_t *)(intptr_t)lengths; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithSourcePROC clCreateProgramWithSource = (clCreateProgramWithSourcePROC)((intptr_t)function_pointer); + cl_program __result; + _str_i = 0; + _str_address = (cl_char *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i] = _str_address; + _str_address += lengths_address[_str_i++]; + } + __result = clCreateProgramWithSource((cl_context)(intptr_t)context, count, (const cl_char **)strings_str, lengths_address, errcode_ret_address); + free(strings_str); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithSource3(JNIEnv *env, jclass clazz, jlong context, jint count, jobjectArray strings, jlong lengths, jlong errcode_ret, jlong function_pointer) { + int _ptr_i; + jobject _ptr_object; + cl_char **strings_ptr = (cl_char **) malloc(count * sizeof(cl_char *)); + const size_t *lengths_address = (const size_t *)(intptr_t)lengths; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithSourcePROC clCreateProgramWithSource = (clCreateProgramWithSourcePROC)((intptr_t)function_pointer); + cl_program __result; + _ptr_i = 0; + while ( _ptr_i < count ) { + _ptr_object = (*env)->GetObjectArrayElement(env, strings, _ptr_i); + strings_ptr[_ptr_i++] = (cl_char *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = clCreateProgramWithSource((cl_context)(intptr_t)context, count, (const cl_char **)strings_ptr, lengths_address, errcode_ret_address); + free(strings_ptr); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithSource4(JNIEnv *env, jclass clazz, jlong context, jint count, jlong strings, jlong lengths, jlong errcode_ret, jlong function_pointer) { + const cl_char *strings_address = (const cl_char *)(intptr_t)strings; + int _str_i; + cl_char *_str_address; + cl_char **strings_str = (cl_char **) malloc(count * sizeof(cl_char *)); + const size_t *lengths_address = (const size_t *)(intptr_t)lengths; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithSourcePROC clCreateProgramWithSource = (clCreateProgramWithSourcePROC)((intptr_t)function_pointer); + cl_program __result; + _str_i = 0; + _str_address = (cl_char *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i] = _str_address; + _str_address += lengths_address[_str_i++]; + } + __result = clCreateProgramWithSource((cl_context)(intptr_t)context, count, (const cl_char **)strings_str, lengths_address, errcode_ret_address); + free(strings_str); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithBinary(JNIEnv *env, jclass clazz, jlong context, jint num_devices, jlong device, jlong lengths, jlong binary, jlong binary_status, jlong errcode_ret, jlong function_pointer) { + const cl_uchar *binary_address = (const cl_uchar *)(intptr_t)binary; + cl_int *binary_status_address = (cl_int *)(intptr_t)binary_status; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithBinaryPROC clCreateProgramWithBinary = (clCreateProgramWithBinaryPROC)((intptr_t)function_pointer); + cl_program __result = clCreateProgramWithBinary((cl_context)(intptr_t)context, num_devices, (const cl_device_id*)(cl_device_id)(intptr_t)&device, (const size_t*)&lengths, (const cl_uchar **)&binary_address, binary_status_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithBinary2(JNIEnv *env, jclass clazz, jlong context, jint num_devices, jlong device_list, jlong lengths, jlong binaries, jlong binary_status, jlong errcode_ret, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const size_t *lengths_address = (const size_t *)(intptr_t)lengths; + const cl_uchar *binaries_address = (const cl_uchar *)(intptr_t)binaries; + int _str_i; + cl_uchar *_str_address; + cl_uchar **binaries_str = (cl_uchar **) malloc(num_devices * sizeof(cl_uchar *)); + cl_int *binary_status_address = (cl_int *)(intptr_t)binary_status; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithBinaryPROC clCreateProgramWithBinary = (clCreateProgramWithBinaryPROC)((intptr_t)function_pointer); + cl_program __result; + _str_i = 0; + _str_address = (cl_uchar *)binaries_address; + while ( _str_i < num_devices ) { + binaries_str[_str_i] = _str_address; + _str_address += lengths_address[_str_i++]; + } + __result = clCreateProgramWithBinary((cl_context)(intptr_t)context, num_devices, device_list_address, lengths_address, (const cl_uchar **)binaries_str, binary_status_address, errcode_ret_address); + free(binaries_str); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateProgramWithBinary3(JNIEnv *env, jclass clazz, jlong context, jint num_devices, jlong device_list, jlong lengths, jobjectArray binaries, jlong binary_status, jlong errcode_ret, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const size_t *lengths_address = (const size_t *)(intptr_t)lengths; + int _ptr_i; + jobject _ptr_object; + cl_uchar **binaries_ptr = (cl_uchar **) malloc(num_devices * sizeof(cl_uchar *)); + cl_int *binary_status_address = (cl_int *)(intptr_t)binary_status; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithBinaryPROC clCreateProgramWithBinary = (clCreateProgramWithBinaryPROC)((intptr_t)function_pointer); + cl_program __result; + _ptr_i = 0; + while ( _ptr_i < num_devices ) { + _ptr_object = (*env)->GetObjectArrayElement(env, binaries, _ptr_i); + binaries_ptr[_ptr_i++] = (cl_uchar *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = clCreateProgramWithBinary((cl_context)(intptr_t)context, num_devices, device_list_address, lengths_address, (const cl_uchar **)binaries_ptr, binary_status_address, errcode_ret_address); + free(binaries_ptr); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainProgram(JNIEnv *env, jclass clazz, jlong program, jlong function_pointer) { + clRetainProgramPROC clRetainProgram = (clRetainProgramPROC)((intptr_t)function_pointer); + cl_int __result = clRetainProgram((cl_program)(intptr_t)program); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseProgram(JNIEnv *env, jclass clazz, jlong program, jlong function_pointer) { + clReleaseProgramPROC clReleaseProgram = (clReleaseProgramPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseProgram((cl_program)(intptr_t)program); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclBuildProgram(JNIEnv *env, jclass clazz, jlong program, jint num_devices, jlong device_list, jlong options, jlong pfn_notify, jlong user_data, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *options_address = (const cl_char *)(intptr_t)options; + clBuildProgramPROC clBuildProgram = (clBuildProgramPROC)((intptr_t)function_pointer); + cl_int __result = clBuildProgram((cl_program)(intptr_t)program, num_devices, device_list_address, options_address, (cl_program_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclUnloadCompiler(JNIEnv *env, jclass clazz, jlong function_pointer) { + clUnloadCompilerPROC clUnloadCompiler = (clUnloadCompilerPROC)((intptr_t)function_pointer); + cl_int __result = clUnloadCompiler(); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetProgramInfo(JNIEnv *env, jclass clazz, jlong program, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetProgramInfoPROC clGetProgramInfo = (clGetProgramInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetProgramInfo((cl_program)(intptr_t)program, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetProgramInfo2(JNIEnv *env, jclass clazz, jlong program, jint param_name, jlong sizes_len, jlong sizes, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + const size_t *sizes_address = (const size_t *)(intptr_t)sizes; + cl_uchar *param_value_address = (cl_uchar *)(intptr_t)param_value; + int _str_i; + cl_uchar *_str_address; + cl_uchar **param_value_str = (cl_uchar **) malloc(sizes_len * sizeof(cl_uchar *)); + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetProgramInfoPROC clGetProgramInfo = (clGetProgramInfoPROC)((intptr_t)function_pointer); + cl_int __result; + _str_i = 0; + _str_address = (cl_uchar *)param_value_address; + while ( _str_i < sizes_len ) { + param_value_str[_str_i] = _str_address; + _str_address += sizes_address[_str_i++]; + } + __result = clGetProgramInfo((cl_program)(intptr_t)program, param_name, sizes_len * sizeof(cl_uchar *), (cl_uchar **)param_value_str, param_value_size_ret_address); + free(param_value_str); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetProgramInfo3(JNIEnv *env, jclass clazz, jlong program, jint param_name, jlong param_value_len, jobjectArray param_value, jlong param_value_size_ret, jlong function_pointer) { + int _ptr_i; + jobject _ptr_object; + cl_uchar **param_value_ptr = (cl_uchar **) malloc(param_value_len * sizeof(cl_uchar *)); + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetProgramInfoPROC clGetProgramInfo = (clGetProgramInfoPROC)((intptr_t)function_pointer); + cl_int __result; + _ptr_i = 0; + while ( _ptr_i < param_value_len ) { + _ptr_object = (*env)->GetObjectArrayElement(env, param_value, _ptr_i); + param_value_ptr[_ptr_i++] = (cl_uchar *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = clGetProgramInfo((cl_program)(intptr_t)program, param_name, param_value_len * sizeof(cl_uchar *), (cl_uchar **)param_value_ptr, param_value_size_ret_address); + free(param_value_ptr); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetProgramBuildInfo(JNIEnv *env, jclass clazz, jlong program, jlong device, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetProgramBuildInfoPROC clGetProgramBuildInfo = (clGetProgramBuildInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetProgramBuildInfo((cl_program)(intptr_t)program, (cl_device_id)(intptr_t)device, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclCreateKernel(JNIEnv *env, jclass clazz, jlong program, jlong kernel_name, jlong errcode_ret, jlong function_pointer) { + const cl_char *kernel_name_address = (const cl_char *)(intptr_t)kernel_name; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateKernelPROC clCreateKernel = (clCreateKernelPROC)((intptr_t)function_pointer); + cl_kernel __result = clCreateKernel((cl_program)(intptr_t)program, kernel_name_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclCreateKernelsInProgram(JNIEnv *env, jclass clazz, jlong program, jint num_kernels, jlong kernels, jlong num_kernels_ret, jlong function_pointer) { + cl_kernel *kernels_address = (cl_kernel *)(intptr_t)kernels; + cl_uint *num_kernels_ret_address = (cl_uint *)(intptr_t)num_kernels_ret; + clCreateKernelsInProgramPROC clCreateKernelsInProgram = (clCreateKernelsInProgramPROC)((intptr_t)function_pointer); + cl_int __result = clCreateKernelsInProgram((cl_program)(intptr_t)program, num_kernels, kernels_address, num_kernels_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainKernel(JNIEnv *env, jclass clazz, jlong kernel, jlong function_pointer) { + clRetainKernelPROC clRetainKernel = (clRetainKernelPROC)((intptr_t)function_pointer); + cl_int __result = clRetainKernel((cl_kernel)(intptr_t)kernel); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseKernel(JNIEnv *env, jclass clazz, jlong kernel, jlong function_pointer) { + clReleaseKernelPROC clReleaseKernel = (clReleaseKernelPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseKernel((cl_kernel)(intptr_t)kernel); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclSetKernelArg(JNIEnv *env, jclass clazz, jlong kernel, jint arg_index, jlong arg_size, jlong arg_value, jlong function_pointer) { + const cl_void *arg_value_address = (const cl_void *)(intptr_t)arg_value; + clSetKernelArgPROC clSetKernelArg = (clSetKernelArgPROC)((intptr_t)function_pointer); + cl_int __result = clSetKernelArg((cl_kernel)(intptr_t)kernel, arg_index, arg_size, arg_value_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetKernelInfo(JNIEnv *env, jclass clazz, jlong kernel, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetKernelInfoPROC clGetKernelInfo = (clGetKernelInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetKernelInfo((cl_kernel)(intptr_t)kernel, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetKernelWorkGroupInfo(JNIEnv *env, jclass clazz, jlong kernel, jlong device, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetKernelWorkGroupInfoPROC clGetKernelWorkGroupInfo = (clGetKernelWorkGroupInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetKernelWorkGroupInfo((cl_kernel)(intptr_t)kernel, (cl_device_id)(intptr_t)device, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueNDRangeKernel(JNIEnv *env, jclass clazz, jlong command_queue, jlong kernel, jint work_dim, jlong global_work_offset, jlong global_work_size, jlong local_work_size, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *global_work_offset_address = (const size_t *)(intptr_t)global_work_offset; + const size_t *global_work_size_address = (const size_t *)(intptr_t)global_work_size; + const size_t *local_work_size_address = (const size_t *)(intptr_t)local_work_size; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueNDRangeKernelPROC clEnqueueNDRangeKernel = (clEnqueueNDRangeKernelPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueNDRangeKernel((cl_command_queue)(intptr_t)command_queue, (cl_kernel)(intptr_t)kernel, work_dim, global_work_offset_address, global_work_size_address, local_work_size_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueTask(JNIEnv *env, jclass clazz, jlong command_queue, jlong kernel, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueTaskPROC clEnqueueTask = (clEnqueueTaskPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueTask((cl_command_queue)(intptr_t)command_queue, (cl_kernel)(intptr_t)kernel, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueNativeKernel(JNIEnv *env, jclass clazz, jlong command_queue, jlong user_func, jlong args, jlong cb_args, jint num_mem_objects, jobjectArray mem_list, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + cl_void *args_address = (cl_void *)(intptr_t)args; + int _ptr_i; + jobject _ptr_object; + cl_mem *mem_list_ptr = num_mem_objects == 0 ? NULL : (cl_mem *) malloc(num_mem_objects * sizeof(cl_mem )); + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueNativeKernelPROC clEnqueueNativeKernel = (clEnqueueNativeKernelPROC)((intptr_t)function_pointer); + cl_int __result; + void **args_mem_loc = num_mem_objects == 0 ? NULL : (void **)malloc(num_mem_objects * sizeof(void *)); + _ptr_i = 0; + while ( _ptr_i < num_mem_objects ) { + _ptr_object = (*env)->GetObjectArrayElement(env, mem_list, _ptr_i); + mem_list_ptr[_ptr_i++] = (cl_mem)(intptr_t)getPointerWrapperAddress(env, _ptr_object); + } + _ptr_i = 0; + while ( _ptr_i < num_mem_objects ) { + args_mem_loc[_ptr_i] = (cl_void *)((char *)args_address + (12 + 4 + _ptr_i * (4 + sizeof(void *)))); + _ptr_i++; + } + __result = clEnqueueNativeKernel((cl_command_queue)(intptr_t)command_queue, (cl_native_kernel_func)(intptr_t)user_func, args_address, cb_args, num_mem_objects, (const cl_mem*)mem_list_ptr, (const void**)args_mem_loc, num_events_in_wait_list, event_wait_list_address, event_address); + free(args_mem_loc); + free(mem_list_ptr); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclWaitForEvents(JNIEnv *env, jclass clazz, jint num_events, jlong event_list, jlong function_pointer) { + const cl_event *event_list_address = (const cl_event *)(intptr_t)event_list; + clWaitForEventsPROC clWaitForEvents = (clWaitForEventsPROC)((intptr_t)function_pointer); + cl_int __result = clWaitForEvents(num_events, event_list_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetEventInfo(JNIEnv *env, jclass clazz, jlong event, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetEventInfoPROC clGetEventInfo = (clGetEventInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetEventInfo((cl_event)(intptr_t)event, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclRetainEvent(JNIEnv *env, jclass clazz, jlong event, jlong function_pointer) { + clRetainEventPROC clRetainEvent = (clRetainEventPROC)((intptr_t)function_pointer); + cl_int __result = clRetainEvent((cl_event)(intptr_t)event); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclReleaseEvent(JNIEnv *env, jclass clazz, jlong event, jlong function_pointer) { + clReleaseEventPROC clReleaseEvent = (clReleaseEventPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseEvent((cl_event)(intptr_t)event); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueMarker(JNIEnv *env, jclass clazz, jlong command_queue, jlong event, jlong function_pointer) { + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueMarkerPROC clEnqueueMarker = (clEnqueueMarkerPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueMarker((cl_command_queue)(intptr_t)command_queue, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueBarrier(JNIEnv *env, jclass clazz, jlong command_queue, jlong function_pointer) { + clEnqueueBarrierPROC clEnqueueBarrier = (clEnqueueBarrierPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueBarrier((cl_command_queue)(intptr_t)command_queue); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclEnqueueWaitForEvents(JNIEnv *env, jclass clazz, jlong command_queue, jint num_events, jlong event_list, jlong function_pointer) { + const cl_event *event_list_address = (const cl_event *)(intptr_t)event_list; + clEnqueueWaitForEventsPROC clEnqueueWaitForEvents = (clEnqueueWaitForEventsPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueWaitForEvents((cl_command_queue)(intptr_t)command_queue, num_events, event_list_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclGetEventProfilingInfo(JNIEnv *env, jclass clazz, jlong event, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetEventProfilingInfoPROC clGetEventProfilingInfo = (clGetEventProfilingInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetEventProfilingInfo((cl_event)(intptr_t)event, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclFlush(JNIEnv *env, jclass clazz, jlong command_queue, jlong function_pointer) { + clFlushPROC clFlush = (clFlushPROC)((intptr_t)function_pointer); + cl_int __result = clFlush((cl_command_queue)(intptr_t)command_queue); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10_nclFinish(JNIEnv *env, jclass clazz, jlong command_queue, jlong function_pointer) { + clFinishPROC clFinish = (clFinishPROC)((intptr_t)function_pointer); + cl_int __result = clFinish((cl_command_queue)(intptr_t)command_queue); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10_nclGetExtensionFunctionAddress(JNIEnv *env, jclass clazz, jlong func_name, jlong function_pointer) { + const cl_char *func_name_address = (const cl_char *)(intptr_t)func_name; + clGetExtensionFunctionAddressPROC clGetExtensionFunctionAddress = (clGetExtensionFunctionAddressPROC)((intptr_t)function_pointer); + void * __result = clGetExtensionFunctionAddress(func_name_address); + return (intptr_t)__result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10GL.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10GL.c new file mode 100644 index 0000000..39fb836 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL10GL.c @@ -0,0 +1,76 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromGLBufferPROC) (cl_context context, cl_mem_flags flags, GLuint bufobj, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromGLTexture2DPROC) (cl_context context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texture, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromGLTexture3DPROC) (cl_context context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texture, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromGLRenderbufferPROC) (cl_context context, cl_mem_flags flags, GLuint renderbuffer, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLObjectInfoPROC) (cl_mem memobj, cl_gl_object_type * gl_object_type, GLuint * gl_object_name); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLTextureInfoPROC) (cl_mem memobj, cl_gl_texture_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireGLObjectsPROC) (cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseGLObjectsPROC) (cl_command_queue command_queue, cl_uint num_objects, const cl_mem * mem_objects, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10GL_nclCreateFromGLBuffer(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint bufobj, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateFromGLBufferPROC clCreateFromGLBuffer = (clCreateFromGLBufferPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateFromGLBuffer((cl_context)(intptr_t)context, flags, bufobj, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10GL_nclCreateFromGLTexture2D(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint target, jint miplevel, jint texture, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateFromGLTexture2DPROC clCreateFromGLTexture2D = (clCreateFromGLTexture2DPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateFromGLTexture2D((cl_context)(intptr_t)context, flags, target, miplevel, texture, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10GL_nclCreateFromGLTexture3D(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint target, jint miplevel, jint texture, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateFromGLTexture3DPROC clCreateFromGLTexture3D = (clCreateFromGLTexture3DPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateFromGLTexture3D((cl_context)(intptr_t)context, flags, target, miplevel, texture, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL10GL_nclCreateFromGLRenderbuffer(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint renderbuffer, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateFromGLRenderbufferPROC clCreateFromGLRenderbuffer = (clCreateFromGLRenderbufferPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateFromGLRenderbuffer((cl_context)(intptr_t)context, flags, renderbuffer, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10GL_nclGetGLObjectInfo(JNIEnv *env, jclass clazz, jlong memobj, jlong gl_object_type, jlong gl_object_name, jlong function_pointer) { + cl_gl_object_type *gl_object_type_address = (cl_gl_object_type *)(intptr_t)gl_object_type; + GLuint *gl_object_name_address = (GLuint *)(intptr_t)gl_object_name; + clGetGLObjectInfoPROC clGetGLObjectInfo = (clGetGLObjectInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetGLObjectInfo((cl_mem)(intptr_t)memobj, gl_object_type_address, gl_object_name_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10GL_nclGetGLTextureInfo(JNIEnv *env, jclass clazz, jlong memobj, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetGLTextureInfoPROC clGetGLTextureInfo = (clGetGLTextureInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetGLTextureInfo((cl_mem)(intptr_t)memobj, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10GL_nclEnqueueAcquireGLObjects(JNIEnv *env, jclass clazz, jlong command_queue, jint num_objects, jlong mem_objects, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_mem *mem_objects_address = (const cl_mem *)(intptr_t)mem_objects; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueAcquireGLObjectsPROC clEnqueueAcquireGLObjects = (clEnqueueAcquireGLObjectsPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueAcquireGLObjects((cl_command_queue)(intptr_t)command_queue, num_objects, mem_objects_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL10GL_nclEnqueueReleaseGLObjects(JNIEnv *env, jclass clazz, jlong command_queue, jint num_objects, jlong mem_objects, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_mem *mem_objects_address = (const cl_mem *)(intptr_t)mem_objects; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueReleaseGLObjectsPROC clEnqueueReleaseGLObjects = (clEnqueueReleaseGLObjectsPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueReleaseGLObjects((cl_command_queue)(intptr_t)command_queue, num_objects, mem_objects_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL11.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL11.c new file mode 100644 index 0000000..44cb07b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL11.c @@ -0,0 +1,82 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateSubBufferPROC) (cl_mem buffer, cl_mem_flags flags, cl_buffer_create_type buffer_create_type, const cl_void * buffer_create_info, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetMemObjectDestructorCallbackPROC) (cl_mem memobj, cl_mem_object_destructor_callback pfn_notify, void * user_data); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReadBufferRectPROC) (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, const size_t * buffer_offset, const size_t * host_offset, const size_t * region, size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueWriteBufferRectPROC) (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, const size_t * buffer_offset, const size_t * host_offset, const size_t * region, size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, const cl_void * ptr, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueCopyBufferRectPROC) (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, const size_t * src_origin, const size_t * dst_origin, const size_t * region, size_t src_row_pitch, size_t src_slice_pitch, size_t dst_row_pitch, size_t dst_slice_pitch, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_event (CL_API_CALL *clCreateUserEventPROC) (cl_context context, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetUserEventStatusPROC) (cl_event event, cl_int execution_status); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetEventCallbackPROC) (cl_event event, cl_int command_exec_callback_type, cl_event_callback pfn_notify, void * user_data); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL11_nclCreateSubBuffer(JNIEnv *env, jclass clazz, jlong buffer, jlong flags, jint buffer_create_type, jlong buffer_create_info, jlong errcode_ret, jlong function_pointer) { + const cl_void *buffer_create_info_address = (const cl_void *)(intptr_t)buffer_create_info; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateSubBufferPROC clCreateSubBuffer = (clCreateSubBufferPROC)((intptr_t)function_pointer); + cl_mem __result = clCreateSubBuffer((cl_mem)(intptr_t)buffer, flags, buffer_create_type, buffer_create_info_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclSetMemObjectDestructorCallback(JNIEnv *env, jclass clazz, jlong memobj, jlong pfn_notify, jlong user_data, jlong function_pointer) { + clSetMemObjectDestructorCallbackPROC clSetMemObjectDestructorCallback = (clSetMemObjectDestructorCallbackPROC)((intptr_t)function_pointer); + cl_int __result = clSetMemObjectDestructorCallback((cl_mem)(intptr_t)memobj, (cl_mem_object_destructor_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclEnqueueReadBufferRect(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jint blocking_read, jlong buffer_offset, jlong host_offset, jlong region, jlong buffer_row_pitch, jlong buffer_slice_pitch, jlong host_row_pitch, jlong host_slice_pitch, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *buffer_offset_address = (const size_t *)(intptr_t)buffer_offset; + const size_t *host_offset_address = (const size_t *)(intptr_t)host_offset; + const size_t *region_address = (const size_t *)(intptr_t)region; + cl_void *ptr_address = (cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueReadBufferRectPROC clEnqueueReadBufferRect = (clEnqueueReadBufferRectPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueReadBufferRect((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, blocking_read, buffer_offset_address, host_offset_address, region_address, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclEnqueueWriteBufferRect(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jint blocking_write, jlong buffer_offset, jlong host_offset, jlong region, jlong buffer_row_pitch, jlong buffer_slice_pitch, jlong host_row_pitch, jlong host_slice_pitch, jlong ptr, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *buffer_offset_address = (const size_t *)(intptr_t)buffer_offset; + const size_t *host_offset_address = (const size_t *)(intptr_t)host_offset; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_void *ptr_address = (const cl_void *)(intptr_t)ptr; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueWriteBufferRectPROC clEnqueueWriteBufferRect = (clEnqueueWriteBufferRectPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueWriteBufferRect((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, blocking_write, buffer_offset_address, host_offset_address, region_address, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclEnqueueCopyBufferRect(JNIEnv *env, jclass clazz, jlong command_queue, jlong src_buffer, jlong dst_buffer, jlong src_origin, jlong dst_origin, jlong region, jlong src_row_pitch, jlong src_slice_pitch, jlong dst_row_pitch, jlong dst_slice_pitch, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const size_t *src_origin_address = (const size_t *)(intptr_t)src_origin; + const size_t *dst_origin_address = (const size_t *)(intptr_t)dst_origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueCopyBufferRectPROC clEnqueueCopyBufferRect = (clEnqueueCopyBufferRectPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueCopyBufferRect((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)src_buffer, (cl_mem)(intptr_t)dst_buffer, src_origin_address, dst_origin_address, region_address, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL11_nclCreateUserEvent(JNIEnv *env, jclass clazz, jlong context, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateUserEventPROC clCreateUserEvent = (clCreateUserEventPROC)((intptr_t)function_pointer); + cl_event __result = clCreateUserEvent((cl_context)(intptr_t)context, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclSetUserEventStatus(JNIEnv *env, jclass clazz, jlong event, jint execution_status, jlong function_pointer) { + clSetUserEventStatusPROC clSetUserEventStatus = (clSetUserEventStatusPROC)((intptr_t)function_pointer); + cl_int __result = clSetUserEventStatus((cl_event)(intptr_t)event, execution_status); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL11_nclSetEventCallback(JNIEnv *env, jclass clazz, jlong event, jint command_exec_callback_type, jlong pfn_notify, jlong user_data, jlong function_pointer) { + clSetEventCallbackPROC clSetEventCallback = (clSetEventCallbackPROC)((intptr_t)function_pointer); + cl_int __result = clSetEventCallback((cl_event)(intptr_t)event, command_exec_callback_type, (cl_event_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12.c new file mode 100644 index 0000000..6665fb6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12.c @@ -0,0 +1,194 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainDevicePROC) (cl_device_id device); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseDevicePROC) (cl_device_id device); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clCreateSubDevicesPROC) (cl_device_id in_device, const cl_device_partition_property * properties, cl_uint num_devices, cl_device_id * out_devices, cl_uint * num_devices_ret); +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateImagePROC) (cl_context context, cl_mem_flags flags, const cl_image_format * image_format, const cl_image_desc * image_desc, cl_void * host_ptr, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_program (CL_API_CALL *clCreateProgramWithBuiltInKernelsPROC) (cl_context context, cl_uint num_devices, const cl_device_id * device_list, const cl_char * kernel_names, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clCompileProgramPROC) (cl_program program, cl_uint num_devices, const cl_device_id * device_list, const cl_char * options, cl_uint num_input_headers, const cl_program * input_header, const cl_char ** header_include_name, cl_program_callback pfn_notify, void * user_data); +typedef CL_API_ENTRY cl_program (CL_API_CALL *clLinkProgramPROC) (cl_context context, cl_uint num_devices, const cl_device_id * device_list, const cl_char * options, cl_uint num_input_programs, const cl_program * input_programs, cl_program_callback pfn_notify, void * user_data, cl_int * errcode_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clUnloadPlatformCompilerPROC) (cl_platform_id platform); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelArgInfoPROC) (cl_kernel kernel, cl_uint arg_indx, cl_kernel_arg_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueFillBufferPROC) (cl_command_queue command_queue, cl_mem buffer, const cl_void * pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueFillImagePROC) (cl_command_queue command_queue, cl_mem image, const cl_void * fill_color, const size_t * origin, const size_t * region, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMigrateMemObjectsPROC) (cl_command_queue command_queue, cl_uint num_mem_objects, const cl_mem * mem_objects, cl_mem_migration_flags flags, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMarkerWithWaitListPROC) (cl_command_queue command_queue, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueBarrierWithWaitListPROC) (cl_command_queue command_queue, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clSetPrintfCallbackPROC) (cl_context context, cl_printf_callback pfn_notify, void * user_data); +typedef CL_API_ENTRY void * (CL_API_CALL *clGetExtensionFunctionAddressForPlatformPROC) (cl_platform_id platform, const cl_char * func_name); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclRetainDevice(JNIEnv *env, jclass clazz, jlong device, jlong function_pointer) { + clRetainDevicePROC clRetainDevice = (clRetainDevicePROC)((intptr_t)function_pointer); + cl_int __result = clRetainDevice((cl_device_id)(intptr_t)device); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclReleaseDevice(JNIEnv *env, jclass clazz, jlong device, jlong function_pointer) { + clReleaseDevicePROC clReleaseDevice = (clReleaseDevicePROC)((intptr_t)function_pointer); + cl_int __result = clReleaseDevice((cl_device_id)(intptr_t)device); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclCreateSubDevices(JNIEnv *env, jclass clazz, jlong in_device, jlong properties, jint num_devices, jlong out_devices, jlong num_devices_ret, jlong function_pointer) { + const cl_device_partition_property *properties_address = (const cl_device_partition_property *)(intptr_t)properties; + cl_device_id *out_devices_address = (cl_device_id *)(intptr_t)out_devices; + cl_uint *num_devices_ret_address = (cl_uint *)(intptr_t)num_devices_ret; + clCreateSubDevicesPROC clCreateSubDevices = (clCreateSubDevicesPROC)((intptr_t)function_pointer); + cl_int __result = clCreateSubDevices((cl_device_id)(intptr_t)in_device, properties_address, num_devices, out_devices_address, num_devices_ret_address); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL12_nclCreateImage(JNIEnv *env, jclass clazz, jlong context, jlong flags, jlong image_format, jlong image_desc, jlong host_ptr, jlong errcode_ret, jlong function_pointer) { + const cl_image_format *image_format_address = (const cl_image_format *)(intptr_t)image_format; + const cl_image_desc *image_desc_address = (const cl_image_desc *)(intptr_t)image_desc; + cl_void *host_ptr_address = (cl_void *)(intptr_t)host_ptr; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateImagePROC clCreateImage = (clCreateImagePROC)((intptr_t)function_pointer); + cl_mem __result = clCreateImage((cl_context)(intptr_t)context, flags, image_format_address, image_desc_address, host_ptr_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL12_nclCreateProgramWithBuiltInKernels(JNIEnv *env, jclass clazz, jlong context, jint num_devices, jlong device_list, jlong kernel_names, jlong errcode_ret, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *kernel_names_address = (const cl_char *)(intptr_t)kernel_names; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateProgramWithBuiltInKernelsPROC clCreateProgramWithBuiltInKernels = (clCreateProgramWithBuiltInKernelsPROC)((intptr_t)function_pointer); + cl_program __result = clCreateProgramWithBuiltInKernels((cl_context)(intptr_t)context, num_devices, device_list_address, kernel_names_address, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclCompileProgram(JNIEnv *env, jclass clazz, jlong program, jint num_devices, jlong device_list, jlong options, jint num_input_headers, jlong input_header, jlong header_include_name, jlong pfn_notify, jlong user_data, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *options_address = (const cl_char *)(intptr_t)options; + const cl_program *input_header_address = (const cl_program *)(intptr_t)input_header; + const cl_char *header_include_name_address = (const cl_char *)(intptr_t)header_include_name; + clCompileProgramPROC clCompileProgram = (clCompileProgramPROC)((intptr_t)function_pointer); + cl_int __result = clCompileProgram((cl_program)(intptr_t)program, num_devices, device_list_address, options_address, num_input_headers, input_header_address, (const cl_char **)&header_include_name_address, (cl_program_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclCompileProgramMulti(JNIEnv *env, jclass clazz, jlong program, jint num_devices, jlong device_list, jlong options, jint num_input_headers, jlong input_headers, jlong header_include_names, jlong pfn_notify, jlong user_data, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *options_address = (const cl_char *)(intptr_t)options; + const cl_program *input_headers_address = (const cl_program *)(intptr_t)input_headers; + const cl_char *header_include_names_address = (const cl_char *)(intptr_t)header_include_names; + int _str_i; + cl_char *_str_address; + cl_char **header_include_names_str = (cl_char **) malloc(num_input_headers * sizeof(cl_char *)); + clCompileProgramPROC clCompileProgram = (clCompileProgramPROC)((intptr_t)function_pointer); + cl_int __result; + _str_i = 0; + _str_address = (cl_char *)header_include_names_address; + while ( _str_i < num_input_headers ) { + header_include_names_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + __result = clCompileProgram((cl_program)(intptr_t)program, num_devices, device_list_address, options_address, num_input_headers, input_headers_address, (const cl_char **)&header_include_names_str, (cl_program_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + free(header_include_names_str); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclCompileProgram3(JNIEnv *env, jclass clazz, jlong program, jint num_devices, jlong device_list, jlong options, jint num_input_headers, jlong input_headers, jobjectArray header_include_names, jlong pfn_notify, jlong user_data, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *options_address = (const cl_char *)(intptr_t)options; + const cl_program *input_headers_address = (const cl_program *)(intptr_t)input_headers; + int _ptr_i; + jobject _ptr_object; + cl_char **header_include_names_ptr = (cl_char **) malloc(num_input_headers * sizeof(cl_char *)); + clCompileProgramPROC clCompileProgram = (clCompileProgramPROC)((intptr_t)function_pointer); + cl_int __result; + _ptr_i = 0; + while ( _ptr_i < num_input_headers ) { + _ptr_object = (*env)->GetObjectArrayElement(env, header_include_names, _ptr_i); + header_include_names_ptr[_ptr_i++] = (cl_char *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = clCompileProgram((cl_program)(intptr_t)program, num_devices, device_list_address, options_address, num_input_headers, input_headers_address, (const cl_char **)header_include_names_ptr, (cl_program_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + free(header_include_names_ptr); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL12_nclLinkProgram(JNIEnv *env, jclass clazz, jlong context, jint num_devices, jlong device_list, jlong options, jint num_input_programs, jlong input_programs, jlong pfn_notify, jlong user_data, jlong errcode_ret, jlong function_pointer) { + const cl_device_id *device_list_address = (const cl_device_id *)(intptr_t)device_list; + const cl_char *options_address = (const cl_char *)(intptr_t)options; + const cl_program *input_programs_address = (const cl_program *)(intptr_t)input_programs; + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clLinkProgramPROC clLinkProgram = (clLinkProgramPROC)((intptr_t)function_pointer); + cl_program __result = clLinkProgram((cl_context)(intptr_t)context, num_devices, device_list_address, options_address, num_input_programs, input_programs_address, (cl_program_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data, errcode_ret_address); + return (intptr_t)__result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclUnloadPlatformCompiler(JNIEnv *env, jclass clazz, jlong platform, jlong function_pointer) { + clUnloadPlatformCompilerPROC clUnloadPlatformCompiler = (clUnloadPlatformCompilerPROC)((intptr_t)function_pointer); + cl_int __result = clUnloadPlatformCompiler((cl_platform_id)(intptr_t)platform); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclGetKernelArgInfo(JNIEnv *env, jclass clazz, jlong kernel, jint arg_indx, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetKernelArgInfoPROC clGetKernelArgInfo = (clGetKernelArgInfoPROC)((intptr_t)function_pointer); + cl_int __result = clGetKernelArgInfo((cl_kernel)(intptr_t)kernel, arg_indx, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclEnqueueFillBuffer(JNIEnv *env, jclass clazz, jlong command_queue, jlong buffer, jlong pattern, jlong pattern_size, jlong offset, jlong size, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_void *pattern_address = (const cl_void *)(intptr_t)pattern; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueFillBufferPROC clEnqueueFillBuffer = (clEnqueueFillBufferPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueFillBuffer((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)buffer, pattern_address, pattern_size, offset, size, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclEnqueueFillImage(JNIEnv *env, jclass clazz, jlong command_queue, jlong image, jlong fill_color, jlong origin, jlong region, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_void *fill_color_address = (const cl_void *)(intptr_t)fill_color; + const size_t *origin_address = (const size_t *)(intptr_t)origin; + const size_t *region_address = (const size_t *)(intptr_t)region; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueFillImagePROC clEnqueueFillImage = (clEnqueueFillImagePROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueFillImage((cl_command_queue)(intptr_t)command_queue, (cl_mem)(intptr_t)image, fill_color_address, origin_address, region_address, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclEnqueueMigrateMemObjects(JNIEnv *env, jclass clazz, jlong command_queue, jint num_mem_objects, jlong mem_objects, jlong flags, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_mem *mem_objects_address = (const cl_mem *)(intptr_t)mem_objects; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueMigrateMemObjectsPROC clEnqueueMigrateMemObjects = (clEnqueueMigrateMemObjectsPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueMigrateMemObjects((cl_command_queue)(intptr_t)command_queue, num_mem_objects, mem_objects_address, flags, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclEnqueueMarkerWithWaitList(JNIEnv *env, jclass clazz, jlong command_queue, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueMarkerWithWaitListPROC clEnqueueMarkerWithWaitList = (clEnqueueMarkerWithWaitListPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueMarkerWithWaitList((cl_command_queue)(intptr_t)command_queue, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclEnqueueBarrierWithWaitList(JNIEnv *env, jclass clazz, jlong command_queue, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueBarrierWithWaitListPROC clEnqueueBarrierWithWaitList = (clEnqueueBarrierWithWaitListPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueBarrierWithWaitList((cl_command_queue)(intptr_t)command_queue, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_CL12_nclSetPrintfCallback(JNIEnv *env, jclass clazz, jlong context, jlong pfn_notify, jlong user_data, jlong function_pointer) { + clSetPrintfCallbackPROC clSetPrintfCallback = (clSetPrintfCallbackPROC)((intptr_t)function_pointer); + cl_int __result = clSetPrintfCallback((cl_context)(intptr_t)context, (cl_printf_callback)(intptr_t)pfn_notify, (void *)(intptr_t)user_data); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL12_nclGetExtensionFunctionAddressForPlatform(JNIEnv *env, jclass clazz, jlong platform, jlong func_name, jlong function_pointer) { + const cl_char *func_name_address = (const cl_char *)(intptr_t)func_name; + clGetExtensionFunctionAddressForPlatformPROC clGetExtensionFunctionAddressForPlatform = (clGetExtensionFunctionAddressForPlatformPROC)((intptr_t)function_pointer); + void * __result = clGetExtensionFunctionAddressForPlatform((cl_platform_id)(intptr_t)platform, func_name_address); + return (intptr_t)__result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12GL.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12GL.c new file mode 100644 index 0000000..9690b8e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_CL12GL.c @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromGLTexturePROC) (cl_context context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texture, cl_int * errcode_ret); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_CL12GL_nclCreateFromGLTexture(JNIEnv *env, jclass clazz, jlong context, jlong flags, jint target, jint miplevel, jint texture, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateFromGLTexturePROC clCreateFromGLTexture = (clCreateFromGLTexturePROC)((intptr_t)function_pointer); + cl_mem __result = clCreateFromGLTexture((cl_context)(intptr_t)context, flags, target, miplevel, texture, errcode_ret_address); + return (intptr_t)__result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTDeviceFission.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTDeviceFission.c new file mode 100644 index 0000000..7138ced --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTDeviceFission.c @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clRetainDeviceEXTPROC) (cl_device_id device); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clReleaseDeviceEXTPROC) (cl_device_id device); +typedef CL_API_ENTRY cl_int (CL_API_CALL *clCreateSubDevicesEXTPROC) (cl_device_id in_device, const cl_device_partition_property_ext * properties, cl_uint num_entries, cl_device_id * out_devices, cl_uint * num_devices); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_EXTDeviceFission_nclRetainDeviceEXT(JNIEnv *env, jclass clazz, jlong device, jlong function_pointer) { + clRetainDeviceEXTPROC clRetainDeviceEXT = (clRetainDeviceEXTPROC)((intptr_t)function_pointer); + cl_int __result = clRetainDeviceEXT((cl_device_id)(intptr_t)device); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_EXTDeviceFission_nclReleaseDeviceEXT(JNIEnv *env, jclass clazz, jlong device, jlong function_pointer) { + clReleaseDeviceEXTPROC clReleaseDeviceEXT = (clReleaseDeviceEXTPROC)((intptr_t)function_pointer); + cl_int __result = clReleaseDeviceEXT((cl_device_id)(intptr_t)device); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_EXTDeviceFission_nclCreateSubDevicesEXT(JNIEnv *env, jclass clazz, jlong in_device, jlong properties, jint num_entries, jlong out_devices, jlong num_devices, jlong function_pointer) { + const cl_device_partition_property_ext *properties_address = (const cl_device_partition_property_ext *)(intptr_t)properties; + cl_device_id *out_devices_address = (cl_device_id *)(intptr_t)out_devices; + cl_uint *num_devices_address = (cl_uint *)(intptr_t)num_devices; + clCreateSubDevicesEXTPROC clCreateSubDevicesEXT = (clCreateSubDevicesEXTPROC)((intptr_t)function_pointer); + cl_int __result = clCreateSubDevicesEXT((cl_device_id)(intptr_t)in_device, properties_address, num_entries, out_devices_address, num_devices_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTMigrateMemobject.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTMigrateMemobject.c new file mode 100644 index 0000000..d555432 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_EXTMigrateMemobject.c @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMigrateMemObjectEXTPROC) (cl_command_queue command_queue, cl_uint num_mem_objects, const cl_mem * mem_objects, cl_mem_migration_flags_ext flags, cl_uint num_events_in_wait_list, const cl_event * event_wait_list, cl_event * event); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_EXTMigrateMemobject_nclEnqueueMigrateMemObjectEXT(JNIEnv *env, jclass clazz, jlong command_queue, jint num_mem_objects, jlong mem_objects, jlong flags, jint num_events_in_wait_list, jlong event_wait_list, jlong event, jlong function_pointer) { + const cl_mem *mem_objects_address = (const cl_mem *)(intptr_t)mem_objects; + const cl_event *event_wait_list_address = (const cl_event *)(intptr_t)event_wait_list; + cl_event *event_address = (cl_event *)(intptr_t)event; + clEnqueueMigrateMemObjectEXTPROC clEnqueueMigrateMemObjectEXT = (clEnqueueMigrateMemObjectEXTPROC)((intptr_t)function_pointer); + cl_int __result = clEnqueueMigrateMemObjectEXT((cl_command_queue)(intptr_t)command_queue, num_mem_objects, mem_objects_address, flags, num_events_in_wait_list, event_wait_list_address, event_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLEvent.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLEvent.c new file mode 100644 index 0000000..271b8e9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLEvent.c @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_event (CL_API_CALL *clCreateEventFromGLsyncKHRPROC) (cl_context context, cl_GLsync sync, cl_int * errcode_ret); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opencl_KHRGLEvent_nclCreateEventFromGLsyncKHR(JNIEnv *env, jclass clazz, jlong context, jlong sync, jlong errcode_ret, jlong function_pointer) { + cl_int *errcode_ret_address = (cl_int *)(intptr_t)errcode_ret; + clCreateEventFromGLsyncKHRPROC clCreateEventFromGLsyncKHR = (clCreateEventFromGLsyncKHRPROC)((intptr_t)function_pointer); + cl_event __result = clCreateEventFromGLsyncKHR((cl_context)(intptr_t)context, (cl_GLsync)(intptr_t)sync, errcode_ret_address); + return (intptr_t)__result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLSharing.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLSharing.c new file mode 100644 index 0000000..1363be1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRGLSharing.c @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHRPROC) (const cl_context_properties * properties, cl_gl_context_info param_name, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_KHRGLSharing_nclGetGLContextInfoKHR(JNIEnv *env, jclass clazz, jlong properties, jint param_name, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + const cl_context_properties *properties_address = (const cl_context_properties *)(intptr_t)properties; + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetGLContextInfoKHRPROC clGetGLContextInfoKHR = (clGetGLContextInfoKHRPROC)((intptr_t)function_pointer); + cl_int __result = clGetGLContextInfoKHR(properties_address, param_name, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRICD.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRICD.c new file mode 100644 index 0000000..66a06e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRICD.c @@ -0,0 +1,15 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clIcdGetPlatformIDsKHRPROC) (cl_uint num_entries, cl_platform_id * platforms, cl_uint * num_platforms); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_KHRICD_nclIcdGetPlatformIDsKHR(JNIEnv *env, jclass clazz, jint num_entries, jlong platforms, jlong num_platforms, jlong function_pointer) { + cl_platform_id *platforms_address = (cl_platform_id *)(intptr_t)platforms; + cl_uint *num_platforms_address = (cl_uint *)(intptr_t)num_platforms; + clIcdGetPlatformIDsKHRPROC clIcdGetPlatformIDsKHR = (clIcdGetPlatformIDsKHRPROC)((intptr_t)function_pointer); + cl_int __result = clIcdGetPlatformIDsKHR(num_entries, platforms_address, num_platforms_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRSubgroups.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRSubgroups.c new file mode 100644 index 0000000..117380c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRSubgroups.c @@ -0,0 +1,16 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelSubGroupInfoKHRPROC) (cl_kernel kernel, cl_device_id device, cl_kernel_sub_group_info param_name, size_t input_value_size, const cl_void * input_value, size_t param_value_size, cl_void * param_value, size_t * param_value_size_ret); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_KHRSubgroups_nclGetKernelSubGroupInfoKHR(JNIEnv *env, jclass clazz, jlong kernel, jlong device, jint param_name, jlong input_value_size, jlong input_value, jlong param_value_size, jlong param_value, jlong param_value_size_ret, jlong function_pointer) { + const cl_void *input_value_address = (const cl_void *)(intptr_t)input_value; + cl_void *param_value_address = (cl_void *)(intptr_t)param_value; + size_t *param_value_size_ret_address = (size_t *)(intptr_t)param_value_size_ret; + clGetKernelSubGroupInfoKHRPROC clGetKernelSubGroupInfoKHR = (clGetKernelSubGroupInfoKHRPROC)((intptr_t)function_pointer); + cl_int __result = clGetKernelSubGroupInfoKHR((cl_kernel)(intptr_t)kernel, (cl_device_id)(intptr_t)device, param_name, input_value_size, input_value_address, param_value_size, param_value_address, param_value_size_ret_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRTerminateContext.c b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRTerminateContext.c new file mode 100644 index 0000000..c93e951 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opencl/org_lwjgl_opencl_KHRTerminateContext.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extcl.h" + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHRPROC) (cl_context context); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opencl_KHRTerminateContext_nclTerminateContextKHR(JNIEnv *env, jclass clazz, jlong context, jlong function_pointer) { + clTerminateContextKHRPROC clTerminateContextKHR = (clTerminateContextKHRPROC)((intptr_t)function_pointer); + cl_int __result = clTerminateContextKHR((cl_context)(intptr_t)context); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDebugOutput.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDebugOutput.c new file mode 100644 index 0000000..9e57122 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDebugOutput.c @@ -0,0 +1,38 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDebugMessageEnableAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (APIENTRY *glDebugMessageInsertAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar * buf); +typedef void (APIENTRY *glDebugMessageCallbackAMDPROC) (GLDEBUGPROCAMD callback, GLvoid * userParam); +typedef GLuint (APIENTRY *glGetDebugMessageLogAMDPROC) (GLuint count, GLsizei logSize, GLenum * categories, GLuint * severities, GLuint * ids, GLsizei * lengths, GLchar * messageLog); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDebugOutput_nglDebugMessageEnableAMD(JNIEnv *env, jclass clazz, jint category, jint severity, jint count, jlong ids, jboolean enabled, jlong function_pointer) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDebugMessageEnableAMDPROC glDebugMessageEnableAMD = (glDebugMessageEnableAMDPROC)((intptr_t)function_pointer); + glDebugMessageEnableAMD(category, severity, count, ids_address, enabled); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDebugOutput_nglDebugMessageInsertAMD(JNIEnv *env, jclass clazz, jint category, jint severity, jint id, jint length, jlong buf, jlong function_pointer) { + const GLchar *buf_address = (const GLchar *)(intptr_t)buf; + glDebugMessageInsertAMDPROC glDebugMessageInsertAMD = (glDebugMessageInsertAMDPROC)((intptr_t)function_pointer); + glDebugMessageInsertAMD(category, severity, id, length, buf_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDebugOutput_nglDebugMessageCallbackAMD(JNIEnv *env, jclass clazz, jlong callback, jlong userParam, jlong function_pointer) { + glDebugMessageCallbackAMDPROC glDebugMessageCallbackAMD = (glDebugMessageCallbackAMDPROC)((intptr_t)function_pointer); + glDebugMessageCallbackAMD((GLDEBUGPROCAMD)(intptr_t)callback, (GLvoid *)(intptr_t)userParam); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_AMDDebugOutput_nglGetDebugMessageLogAMD(JNIEnv *env, jclass clazz, jint count, jint logSize, jlong categories, jlong severities, jlong ids, jlong lengths, jlong messageLog, jlong function_pointer) { + GLenum *categories_address = (GLenum *)(intptr_t)categories; + GLuint *severities_address = (GLuint *)(intptr_t)severities; + GLuint *ids_address = (GLuint *)(intptr_t)ids; + GLsizei *lengths_address = (GLsizei *)(intptr_t)lengths; + GLchar *messageLog_address = (GLchar *)(intptr_t)messageLog; + glGetDebugMessageLogAMDPROC glGetDebugMessageLogAMD = (glGetDebugMessageLogAMDPROC)((intptr_t)function_pointer); + GLuint __result = glGetDebugMessageLogAMD(count, logSize, categories_address, severities_address, ids_address, lengths_address, messageLog_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDrawBuffersBlend.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDrawBuffersBlend.c new file mode 100644 index 0000000..8dc070e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDDrawBuffersBlend.c @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendFuncIndexedAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRY *glBlendFuncSeparateIndexedAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRY *glBlendEquationIndexedAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRY *glBlendEquationSeparateIndexedAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDrawBuffersBlend_nglBlendFuncIndexedAMD(JNIEnv *env, jclass clazz, jint buf, jint src, jint dst, jlong function_pointer) { + glBlendFuncIndexedAMDPROC glBlendFuncIndexedAMD = (glBlendFuncIndexedAMDPROC)((intptr_t)function_pointer); + glBlendFuncIndexedAMD(buf, src, dst); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDrawBuffersBlend_nglBlendFuncSeparateIndexedAMD(JNIEnv *env, jclass clazz, jint buf, jint srcRGB, jint dstRGB, jint srcAlpha, jint dstAlpha, jlong function_pointer) { + glBlendFuncSeparateIndexedAMDPROC glBlendFuncSeparateIndexedAMD = (glBlendFuncSeparateIndexedAMDPROC)((intptr_t)function_pointer); + glBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDrawBuffersBlend_nglBlendEquationIndexedAMD(JNIEnv *env, jclass clazz, jint buf, jint mode, jlong function_pointer) { + glBlendEquationIndexedAMDPROC glBlendEquationIndexedAMD = (glBlendEquationIndexedAMDPROC)((intptr_t)function_pointer); + glBlendEquationIndexedAMD(buf, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDDrawBuffersBlend_nglBlendEquationSeparateIndexedAMD(JNIEnv *env, jclass clazz, jint buf, jint modeRGB, jint modeAlpha, jlong function_pointer) { + glBlendEquationSeparateIndexedAMDPROC glBlendEquationSeparateIndexedAMD = (glBlendEquationSeparateIndexedAMDPROC)((intptr_t)function_pointer); + glBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDInterleavedElements.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDInterleavedElements.c new file mode 100644 index 0000000..93005c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDInterleavedElements.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribParameteriAMDPROC) (GLuint index, GLenum pname, GLint param); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDInterleavedElements_nglVertexAttribParameteriAMD(JNIEnv *env, jclass clazz, jint index, jint pname, jint param, jlong function_pointer) { + glVertexAttribParameteriAMDPROC glVertexAttribParameteriAMD = (glVertexAttribParameteriAMDPROC)((intptr_t)function_pointer); + glVertexAttribParameteriAMD(index, pname, param); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDMultiDrawIndirect.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDMultiDrawIndirect.c new file mode 100644 index 0000000..5f87daf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDMultiDrawIndirect.c @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMultiDrawArraysIndirectAMDPROC) (GLenum mode, const GLvoid * indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRY *glMultiDrawElementsIndirectAMDPROC) (GLenum mode, GLenum type, const GLvoid * indirect, GLsizei primcount, GLsizei stride); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDMultiDrawIndirect_nglMultiDrawArraysIndirectAMD(JNIEnv *env, jclass clazz, jint mode, jlong indirect, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawArraysIndirectAMDPROC glMultiDrawArraysIndirectAMD = (glMultiDrawArraysIndirectAMDPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectAMD(mode, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDMultiDrawIndirect_nglMultiDrawArraysIndirectAMDBO(JNIEnv *env, jclass clazz, jint mode, jlong indirect_buffer_offset, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawArraysIndirectAMDPROC glMultiDrawArraysIndirectAMD = (glMultiDrawArraysIndirectAMDPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectAMD(mode, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDMultiDrawIndirect_nglMultiDrawElementsIndirectAMD(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawElementsIndirectAMDPROC glMultiDrawElementsIndirectAMD = (glMultiDrawElementsIndirectAMDPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectAMD(mode, type, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDMultiDrawIndirect_nglMultiDrawElementsIndirectAMDBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawElementsIndirectAMDPROC glMultiDrawElementsIndirectAMD = (glMultiDrawElementsIndirectAMDPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectAMD(mode, type, indirect_address, primcount, stride); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDNameGenDelete.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDNameGenDelete.c new file mode 100644 index 0000000..50ec023 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDNameGenDelete.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGenNamesAMDPROC) (GLenum identifier, GLuint num, GLuint * names); +typedef void (APIENTRY *glDeleteNamesAMDPROC) (GLenum identifier, GLsizei num, const GLuint * names); +typedef GLboolean (APIENTRY *glIsNameAMDPROC) (GLenum identifier, GLuint name); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDNameGenDelete_nglGenNamesAMD(JNIEnv *env, jclass clazz, jint identifier, jint num, jlong names, jlong function_pointer) { + GLuint *names_address = (GLuint *)(intptr_t)names; + glGenNamesAMDPROC glGenNamesAMD = (glGenNamesAMDPROC)((intptr_t)function_pointer); + glGenNamesAMD(identifier, num, names_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDNameGenDelete_nglDeleteNamesAMD(JNIEnv *env, jclass clazz, jint identifier, jint num, jlong names, jlong function_pointer) { + const GLuint *names_address = (const GLuint *)(intptr_t)names; + glDeleteNamesAMDPROC glDeleteNamesAMD = (glDeleteNamesAMDPROC)((intptr_t)function_pointer); + glDeleteNamesAMD(identifier, num, names_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_AMDNameGenDelete_nglIsNameAMD(JNIEnv *env, jclass clazz, jint identifier, jint name, jlong function_pointer) { + glIsNameAMDPROC glIsNameAMD = (glIsNameAMDPROC)((intptr_t)function_pointer); + GLboolean __result = glIsNameAMD(identifier, name); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDPerformanceMonitor.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDPerformanceMonitor.c new file mode 100644 index 0000000..1211370 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDPerformanceMonitor.c @@ -0,0 +1,87 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetPerfMonitorGroupsAMDPROC) (GLint * numGroups, GLsizei groupsSize, GLuint * groups); +typedef void (APIENTRY *glGetPerfMonitorCountersAMDPROC) (GLuint group, GLint * numCounters, GLint * maxActiveCounters, GLsizei countersSize, GLuint * counters); +typedef void (APIENTRY *glGetPerfMonitorGroupStringAMDPROC) (GLuint group, GLsizei bufSize, GLsizei * length, GLchar * groupString); +typedef void (APIENTRY *glGetPerfMonitorCounterStringAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei * length, GLchar * counterString); +typedef void (APIENTRY *glGetPerfMonitorCounterInfoAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid * data); +typedef void (APIENTRY *glGenPerfMonitorsAMDPROC) (GLsizei n, GLuint * monitors); +typedef void (APIENTRY *glDeletePerfMonitorsAMDPROC) (GLsizei n, GLuint * monitors); +typedef void (APIENTRY *glSelectPerfMonitorCountersAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint * counterList); +typedef void (APIENTRY *glBeginPerfMonitorAMDPROC) (GLuint monitor); +typedef void (APIENTRY *glEndPerfMonitorAMDPROC) (GLuint monitor); +typedef void (APIENTRY *glGetPerfMonitorCounterDataAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint * data, GLint * bytesWritten); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorGroupsAMD(JNIEnv *env, jclass clazz, jlong numGroups, jint groupsSize, jlong groups, jlong function_pointer) { + GLint *numGroups_address = (GLint *)(intptr_t)numGroups; + GLuint *groups_address = (GLuint *)(intptr_t)groups; + glGetPerfMonitorGroupsAMDPROC glGetPerfMonitorGroupsAMD = (glGetPerfMonitorGroupsAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorGroupsAMD(numGroups_address, groupsSize, groups_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorCountersAMD(JNIEnv *env, jclass clazz, jint group, jlong numCounters, jlong maxActiveCounters, jint countersSize, jlong counters, jlong function_pointer) { + GLint *numCounters_address = (GLint *)(intptr_t)numCounters; + GLint *maxActiveCounters_address = (GLint *)(intptr_t)maxActiveCounters; + GLuint *counters_address = (GLuint *)(intptr_t)counters; + glGetPerfMonitorCountersAMDPROC glGetPerfMonitorCountersAMD = (glGetPerfMonitorCountersAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorCountersAMD(group, numCounters_address, maxActiveCounters_address, countersSize, counters_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorGroupStringAMD(JNIEnv *env, jclass clazz, jint group, jint bufSize, jlong length, jlong groupString, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *groupString_address = (GLchar *)(intptr_t)groupString; + glGetPerfMonitorGroupStringAMDPROC glGetPerfMonitorGroupStringAMD = (glGetPerfMonitorGroupStringAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorGroupStringAMD(group, bufSize, length_address, groupString_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorCounterStringAMD(JNIEnv *env, jclass clazz, jint group, jint counter, jint bufSize, jlong length, jlong counterString, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *counterString_address = (GLchar *)(intptr_t)counterString; + glGetPerfMonitorCounterStringAMDPROC glGetPerfMonitorCounterStringAMD = (glGetPerfMonitorCounterStringAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length_address, counterString_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorCounterInfoAMD(JNIEnv *env, jclass clazz, jint group, jint counter, jint pname, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetPerfMonitorCounterInfoAMDPROC glGetPerfMonitorCounterInfoAMD = (glGetPerfMonitorCounterInfoAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorCounterInfoAMD(group, counter, pname, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGenPerfMonitorsAMD(JNIEnv *env, jclass clazz, jint n, jlong monitors, jlong function_pointer) { + GLuint *monitors_address = (GLuint *)(intptr_t)monitors; + glGenPerfMonitorsAMDPROC glGenPerfMonitorsAMD = (glGenPerfMonitorsAMDPROC)((intptr_t)function_pointer); + glGenPerfMonitorsAMD(n, monitors_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglDeletePerfMonitorsAMD(JNIEnv *env, jclass clazz, jint n, jlong monitors, jlong function_pointer) { + GLuint *monitors_address = (GLuint *)(intptr_t)monitors; + glDeletePerfMonitorsAMDPROC glDeletePerfMonitorsAMD = (glDeletePerfMonitorsAMDPROC)((intptr_t)function_pointer); + glDeletePerfMonitorsAMD(n, monitors_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglSelectPerfMonitorCountersAMD(JNIEnv *env, jclass clazz, jint monitor, jboolean enable, jint group, jint numCounters, jlong counterList, jlong function_pointer) { + GLuint *counterList_address = (GLuint *)(intptr_t)counterList; + glSelectPerfMonitorCountersAMDPROC glSelectPerfMonitorCountersAMD = (glSelectPerfMonitorCountersAMDPROC)((intptr_t)function_pointer); + glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglBeginPerfMonitorAMD(JNIEnv *env, jclass clazz, jint monitor, jlong function_pointer) { + glBeginPerfMonitorAMDPROC glBeginPerfMonitorAMD = (glBeginPerfMonitorAMDPROC)((intptr_t)function_pointer); + glBeginPerfMonitorAMD(monitor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglEndPerfMonitorAMD(JNIEnv *env, jclass clazz, jint monitor, jlong function_pointer) { + glEndPerfMonitorAMDPROC glEndPerfMonitorAMD = (glEndPerfMonitorAMDPROC)((intptr_t)function_pointer); + glEndPerfMonitorAMD(monitor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDPerformanceMonitor_nglGetPerfMonitorCounterDataAMD(JNIEnv *env, jclass clazz, jint monitor, jint pname, jint dataSize, jlong data, jlong bytesWritten, jlong function_pointer) { + GLuint *data_address = (GLuint *)(intptr_t)data; + GLint *bytesWritten_address = (GLint *)(intptr_t)bytesWritten; + glGetPerfMonitorCounterDataAMDPROC glGetPerfMonitorCounterDataAMD = (glGetPerfMonitorCounterDataAMDPROC)((intptr_t)function_pointer); + glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data_address, bytesWritten_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSamplePositions.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSamplePositions.c new file mode 100644 index 0000000..1a10539 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSamplePositions.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glSetMultisamplefvAMDPROC) (GLenum pname, GLuint index, const GLfloat * val); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDSamplePositions_nglSetMultisamplefvAMD(JNIEnv *env, jclass clazz, jint pname, jint index, jlong val, jlong function_pointer) { + const GLfloat *val_address = (const GLfloat *)(intptr_t)val; + glSetMultisamplefvAMDPROC glSetMultisamplefvAMD = (glSetMultisamplefvAMDPROC)((intptr_t)function_pointer); + glSetMultisamplefvAMD(pname, index, val_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSparseTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSparseTexture.c new file mode 100644 index 0000000..11063ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDSparseTexture.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexStorageSparseAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRY *glTextureStorageSparseAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDSparseTexture_nglTexStorageSparseAMD(JNIEnv *env, jclass clazz, jint target, jint internalFormat, jint width, jint height, jint depth, jint layers, jint flags, jlong function_pointer) { + glTexStorageSparseAMDPROC glTexStorageSparseAMD = (glTexStorageSparseAMDPROC)((intptr_t)function_pointer); + glTexStorageSparseAMD(target, internalFormat, width, height, depth, layers, flags); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDSparseTexture_nglTextureStorageSparseAMD(JNIEnv *env, jclass clazz, jint texture, jint target, jint internalFormat, jint width, jint height, jint depth, jint layers, jint flags, jlong function_pointer) { + glTextureStorageSparseAMDPROC glTextureStorageSparseAMD = (glTextureStorageSparseAMDPROC)((intptr_t)function_pointer); + glTextureStorageSparseAMD(texture, target, internalFormat, width, height, depth, layers, flags); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDStencilOperationExtended.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDStencilOperationExtended.c new file mode 100644 index 0000000..70979d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDStencilOperationExtended.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glStencilOpValueAMDPROC) (GLenum face, GLuint value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDStencilOperationExtended_nglStencilOpValueAMD(JNIEnv *env, jclass clazz, jint face, jint value, jlong function_pointer) { + glStencilOpValueAMDPROC glStencilOpValueAMD = (glStencilOpValueAMDPROC)((intptr_t)function_pointer); + glStencilOpValueAMD(face, value); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDVertexShaderTessellator.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDVertexShaderTessellator.c new file mode 100644 index 0000000..46efc1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_AMDVertexShaderTessellator.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTessellationFactorAMDPROC) (GLfloat factor); +typedef void (APIENTRY *glTessellationModeAMDPROC) (GLenum mode); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDVertexShaderTessellator_nglTessellationFactorAMD(JNIEnv *env, jclass clazz, jfloat factor, jlong function_pointer) { + glTessellationFactorAMDPROC glTessellationFactorAMD = (glTessellationFactorAMDPROC)((intptr_t)function_pointer); + glTessellationFactorAMD(factor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_AMDVertexShaderTessellator_nglTessellationModeAMD(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glTessellationModeAMDPROC glTessellationModeAMD = (glTessellationModeAMDPROC)((intptr_t)function_pointer); + glTessellationModeAMD(mode); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEElementArray.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEElementArray.c new file mode 100644 index 0000000..a96c0b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEElementArray.c @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glElementPointerAPPLEPROC) (GLenum type, const GLvoid * pointer); +typedef void (APIENTRY *glDrawElementArrayAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRY *glDrawRangeElementArrayAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRY *glMultiDrawElementArrayAPPLEPROC) (GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); +typedef void (APIENTRY *glMultiDrawRangeElementArrayAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEElementArray_nglElementPointerAPPLE(JNIEnv *env, jclass clazz, jint type, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glElementPointerAPPLEPROC glElementPointerAPPLE = (glElementPointerAPPLEPROC)((intptr_t)function_pointer); + glElementPointerAPPLE(type, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEElementArray_nglDrawElementArrayAPPLE(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jlong function_pointer) { + glDrawElementArrayAPPLEPROC glDrawElementArrayAPPLE = (glDrawElementArrayAPPLEPROC)((intptr_t)function_pointer); + glDrawElementArrayAPPLE(mode, first, count); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEElementArray_nglDrawRangeElementArrayAPPLE(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint first, jint count, jlong function_pointer) { + glDrawRangeElementArrayAPPLEPROC glDrawRangeElementArrayAPPLE = (glDrawRangeElementArrayAPPLEPROC)((intptr_t)function_pointer); + glDrawRangeElementArrayAPPLE(mode, start, end, first, count); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEElementArray_nglMultiDrawElementArrayAPPLE(JNIEnv *env, jclass clazz, jint mode, jlong first, jlong count, jint primcount, jlong function_pointer) { + const GLint *first_address = (const GLint *)(intptr_t)first; + const GLsizei *count_address = (const GLsizei *)(intptr_t)count; + glMultiDrawElementArrayAPPLEPROC glMultiDrawElementArrayAPPLE = (glMultiDrawElementArrayAPPLEPROC)((intptr_t)function_pointer); + glMultiDrawElementArrayAPPLE(mode, first_address, count_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEElementArray_nglMultiDrawRangeElementArrayAPPLE(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jlong first, jlong count, jint primcount, jlong function_pointer) { + const GLint *first_address = (const GLint *)(intptr_t)first; + const GLsizei *count_address = (const GLsizei *)(intptr_t)count; + glMultiDrawRangeElementArrayAPPLEPROC glMultiDrawRangeElementArrayAPPLE = (glMultiDrawRangeElementArrayAPPLEPROC)((intptr_t)function_pointer); + glMultiDrawRangeElementArrayAPPLE(mode, start, end, first_address, count_address, primcount); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFence.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFence.c new file mode 100644 index 0000000..bf8381a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFence.c @@ -0,0 +1,59 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGenFencesAPPLEPROC) (GLsizei n, GLuint * fences); +typedef void (APIENTRY *glDeleteFencesAPPLEPROC) (GLsizei n, const GLuint * fences); +typedef void (APIENTRY *glSetFenceAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRY *glIsFenceAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRY *glTestFenceAPPLEPROC) (GLuint fence); +typedef void (APIENTRY *glFinishFenceAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRY *glTestObjectAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRY *glFinishObjectAPPLEPROC) (GLenum object, GLint name); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFence_nglGenFencesAPPLE(JNIEnv *env, jclass clazz, jint n, jlong fences, jlong function_pointer) { + GLuint *fences_address = (GLuint *)(intptr_t)fences; + glGenFencesAPPLEPROC glGenFencesAPPLE = (glGenFencesAPPLEPROC)((intptr_t)function_pointer); + glGenFencesAPPLE(n, fences_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFence_nglDeleteFencesAPPLE(JNIEnv *env, jclass clazz, jint n, jlong fences, jlong function_pointer) { + const GLuint *fences_address = (const GLuint *)(intptr_t)fences; + glDeleteFencesAPPLEPROC glDeleteFencesAPPLE = (glDeleteFencesAPPLEPROC)((intptr_t)function_pointer); + glDeleteFencesAPPLE(n, fences_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFence_nglSetFenceAPPLE(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glSetFenceAPPLEPROC glSetFenceAPPLE = (glSetFenceAPPLEPROC)((intptr_t)function_pointer); + glSetFenceAPPLE(fence); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_APPLEFence_nglIsFenceAPPLE(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glIsFenceAPPLEPROC glIsFenceAPPLE = (glIsFenceAPPLEPROC)((intptr_t)function_pointer); + GLboolean __result = glIsFenceAPPLE(fence); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_APPLEFence_nglTestFenceAPPLE(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glTestFenceAPPLEPROC glTestFenceAPPLE = (glTestFenceAPPLEPROC)((intptr_t)function_pointer); + GLboolean __result = glTestFenceAPPLE(fence); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFence_nglFinishFenceAPPLE(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glFinishFenceAPPLEPROC glFinishFenceAPPLE = (glFinishFenceAPPLEPROC)((intptr_t)function_pointer); + glFinishFenceAPPLE(fence); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_APPLEFence_nglTestObjectAPPLE(JNIEnv *env, jclass clazz, jint object, jint name, jlong function_pointer) { + glTestObjectAPPLEPROC glTestObjectAPPLE = (glTestObjectAPPLEPROC)((intptr_t)function_pointer); + GLboolean __result = glTestObjectAPPLE(object, name); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFence_nglFinishObjectAPPLE(JNIEnv *env, jclass clazz, jint object, jint name, jlong function_pointer) { + glFinishObjectAPPLEPROC glFinishObjectAPPLE = (glFinishObjectAPPLEPROC)((intptr_t)function_pointer); + glFinishObjectAPPLE(object, name); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFlushBufferRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFlushBufferRange.c new file mode 100644 index 0000000..5c0f527 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEFlushBufferRange.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBufferParameteriAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glFlushMappedBufferRangeAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFlushBufferRange_nglBufferParameteriAPPLE(JNIEnv *env, jclass clazz, jint target, jint pname, jint param, jlong function_pointer) { + glBufferParameteriAPPLEPROC glBufferParameteriAPPLE = (glBufferParameteriAPPLEPROC)((intptr_t)function_pointer); + glBufferParameteriAPPLE(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEFlushBufferRange_nglFlushMappedBufferRangeAPPLE(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong function_pointer) { + glFlushMappedBufferRangeAPPLEPROC glFlushMappedBufferRangeAPPLE = (glFlushMappedBufferRangeAPPLEPROC)((intptr_t)function_pointer); + glFlushMappedBufferRangeAPPLE(target, offset, size); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEObjectPurgeable.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEObjectPurgeable.c new file mode 100644 index 0000000..bbe0c47 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEObjectPurgeable.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLenum (APIENTRY *glObjectPurgeableAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRY *glObjectUnpurgeableAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRY *glGetObjectParameterivAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint * params); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_APPLEObjectPurgeable_nglObjectPurgeableAPPLE(JNIEnv *env, jclass clazz, jint objectType, jint name, jint option, jlong function_pointer) { + glObjectPurgeableAPPLEPROC glObjectPurgeableAPPLE = (glObjectPurgeableAPPLEPROC)((intptr_t)function_pointer); + GLenum __result = glObjectPurgeableAPPLE(objectType, name, option); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_APPLEObjectPurgeable_nglObjectUnpurgeableAPPLE(JNIEnv *env, jclass clazz, jint objectType, jint name, jint option, jlong function_pointer) { + glObjectUnpurgeableAPPLEPROC glObjectUnpurgeableAPPLE = (glObjectUnpurgeableAPPLEPROC)((intptr_t)function_pointer); + GLenum __result = glObjectUnpurgeableAPPLE(objectType, name, option); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEObjectPurgeable_nglGetObjectParameterivAPPLE(JNIEnv *env, jclass clazz, jint objectType, jint name, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetObjectParameterivAPPLEPROC glGetObjectParameterivAPPLE = (glGetObjectParameterivAPPLEPROC)((intptr_t)function_pointer); + glGetObjectParameterivAPPLE(objectType, name, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLETextureRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLETextureRange.c new file mode 100644 index 0000000..fcac8d6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLETextureRange.c @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTextureRangeAPPLEPROC) (GLenum target, GLsizei length, GLvoid * pointer); +typedef void (APIENTRY *glGetTexParameterPointervAPPLEPROC) (GLenum target, GLenum pname, GLvoid ** params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLETextureRange_nglTextureRangeAPPLE(JNIEnv *env, jclass clazz, jint target, jint length, jlong pointer, jlong function_pointer) { + GLvoid *pointer_address = (GLvoid *)(intptr_t)pointer; + glTextureRangeAPPLEPROC glTextureRangeAPPLE = (glTextureRangeAPPLEPROC)((intptr_t)function_pointer); + glTextureRangeAPPLE(target, length, pointer_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_APPLETextureRange_nglGetTexParameterPointervAPPLE(JNIEnv *env, jclass clazz, jint target, jint pname, jlong result_size, jlong function_pointer) { + glGetTexParameterPointervAPPLEPROC glGetTexParameterPointervAPPLE = (glGetTexParameterPointervAPPLEPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetTexParameterPointervAPPLE(target, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayObject.c new file mode 100644 index 0000000..51eb9ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayObject.c @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindVertexArrayAPPLEPROC) (GLuint array); +typedef void (APIENTRY *glDeleteVertexArraysAPPLEPROC) (GLsizei n, const GLuint * arrays); +typedef void (APIENTRY *glGenVertexArraysAPPLEPROC) (GLsizei n, GLuint * arrays); +typedef GLboolean (APIENTRY *glIsVertexArrayAPPLEPROC) (GLuint array); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayObject_nglBindVertexArrayAPPLE(JNIEnv *env, jclass clazz, jint array, jlong function_pointer) { + glBindVertexArrayAPPLEPROC glBindVertexArrayAPPLE = (glBindVertexArrayAPPLEPROC)((intptr_t)function_pointer); + glBindVertexArrayAPPLE(array); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayObject_nglDeleteVertexArraysAPPLE(JNIEnv *env, jclass clazz, jint n, jlong arrays, jlong function_pointer) { + const GLuint *arrays_address = (const GLuint *)(intptr_t)arrays; + glDeleteVertexArraysAPPLEPROC glDeleteVertexArraysAPPLE = (glDeleteVertexArraysAPPLEPROC)((intptr_t)function_pointer); + glDeleteVertexArraysAPPLE(n, arrays_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayObject_nglGenVertexArraysAPPLE(JNIEnv *env, jclass clazz, jint n, jlong arrays, jlong function_pointer) { + GLuint *arrays_address = (GLuint *)(intptr_t)arrays; + glGenVertexArraysAPPLEPROC glGenVertexArraysAPPLE = (glGenVertexArraysAPPLEPROC)((intptr_t)function_pointer); + glGenVertexArraysAPPLE(n, arrays_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayObject_nglIsVertexArrayAPPLE(JNIEnv *env, jclass clazz, jint array, jlong function_pointer) { + glIsVertexArrayAPPLEPROC glIsVertexArrayAPPLE = (glIsVertexArrayAPPLEPROC)((intptr_t)function_pointer); + GLboolean __result = glIsVertexArrayAPPLE(array); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayRange.c new file mode 100644 index 0000000..b791f03 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexArrayRange.c @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexArrayRangeAPPLEPROC) (GLsizei length, GLvoid * pointer); +typedef void (APIENTRY *glFlushVertexArrayRangeAPPLEPROC) (GLsizei length, GLvoid * pointer); +typedef void (APIENTRY *glVertexArrayParameteriAPPLEPROC) (GLenum pname, GLint param); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayRange_nglVertexArrayRangeAPPLE(JNIEnv *env, jclass clazz, jint length, jlong pointer, jlong function_pointer) { + GLvoid *pointer_address = (GLvoid *)(intptr_t)pointer; + glVertexArrayRangeAPPLEPROC glVertexArrayRangeAPPLE = (glVertexArrayRangeAPPLEPROC)((intptr_t)function_pointer); + glVertexArrayRangeAPPLE(length, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayRange_nglFlushVertexArrayRangeAPPLE(JNIEnv *env, jclass clazz, jint length, jlong pointer, jlong function_pointer) { + GLvoid *pointer_address = (GLvoid *)(intptr_t)pointer; + glFlushVertexArrayRangeAPPLEPROC glFlushVertexArrayRangeAPPLE = (glFlushVertexArrayRangeAPPLEPROC)((intptr_t)function_pointer); + glFlushVertexArrayRangeAPPLE(length, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexArrayRange_nglVertexArrayParameteriAPPLE(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glVertexArrayParameteriAPPLEPROC glVertexArrayParameteriAPPLE = (glVertexArrayParameteriAPPLEPROC)((intptr_t)function_pointer); + glVertexArrayParameteriAPPLE(pname, param); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexProgramEvaluators.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexProgramEvaluators.c new file mode 100644 index 0000000..bc8910b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_APPLEVertexProgramEvaluators.c @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glEnableVertexAttribAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRY *glDisableVertexAttribAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRY *glIsVertexAttribEnabledAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRY *glMapVertexAttrib1dAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); +typedef void (APIENTRY *glMapVertexAttrib1fAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); +typedef void (APIENTRY *glMapVertexAttrib2dAPPLEPROC) (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 (APIENTRY *glMapVertexAttrib2fAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglEnableVertexAttribAPPLE(JNIEnv *env, jclass clazz, jint index, jint pname, jlong function_pointer) { + glEnableVertexAttribAPPLEPROC glEnableVertexAttribAPPLE = (glEnableVertexAttribAPPLEPROC)((intptr_t)function_pointer); + glEnableVertexAttribAPPLE(index, pname); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglDisableVertexAttribAPPLE(JNIEnv *env, jclass clazz, jint index, jint pname, jlong function_pointer) { + glDisableVertexAttribAPPLEPROC glDisableVertexAttribAPPLE = (glDisableVertexAttribAPPLEPROC)((intptr_t)function_pointer); + glDisableVertexAttribAPPLE(index, pname); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglIsVertexAttribEnabledAPPLE(JNIEnv *env, jclass clazz, jint index, jint pname, jlong function_pointer) { + glIsVertexAttribEnabledAPPLEPROC glIsVertexAttribEnabledAPPLE = (glIsVertexAttribEnabledAPPLEPROC)((intptr_t)function_pointer); + GLboolean __result = glIsVertexAttribEnabledAPPLE(index, pname); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglMapVertexAttrib1dAPPLE(JNIEnv *env, jclass clazz, jint index, jint size, jdouble u1, jdouble u2, jint stride, jint order, jlong points, jlong function_pointer) { + const GLdouble *points_address = (const GLdouble *)(intptr_t)points; + glMapVertexAttrib1dAPPLEPROC glMapVertexAttrib1dAPPLE = (glMapVertexAttrib1dAPPLEPROC)((intptr_t)function_pointer); + glMapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglMapVertexAttrib1fAPPLE(JNIEnv *env, jclass clazz, jint index, jint size, jfloat u1, jfloat u2, jint stride, jint order, jlong points, jlong function_pointer) { + const GLfloat *points_address = (const GLfloat *)(intptr_t)points; + glMapVertexAttrib1fAPPLEPROC glMapVertexAttrib1fAPPLE = (glMapVertexAttrib1fAPPLEPROC)((intptr_t)function_pointer); + glMapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglMapVertexAttrib2dAPPLE(JNIEnv *env, jclass clazz, jint index, jint size, jdouble u1, jdouble u2, jint ustride, jint uorder, jdouble v1, jdouble v2, jint vstride, jint vorder, jlong points, jlong function_pointer) { + const GLdouble *points_address = (const GLdouble *)(intptr_t)points; + glMapVertexAttrib2dAPPLEPROC glMapVertexAttrib2dAPPLE = (glMapVertexAttrib2dAPPLEPROC)((intptr_t)function_pointer); + glMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_APPLEVertexProgramEvaluators_nglMapVertexAttrib2fAPPLE(JNIEnv *env, jclass clazz, jint index, jint size, jfloat u1, jfloat u2, jint ustride, jint uorder, jfloat v1, jfloat v2, jint vstride, jint vorder, jlong points, jlong function_pointer) { + const GLfloat *points_address = (const GLfloat *)(intptr_t)points; + glMapVertexAttrib2fAPPLEPROC glMapVertexAttrib2fAPPLE = (glMapVertexAttrib2fAPPLEPROC)((intptr_t)function_pointer); + glMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBindlessTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBindlessTexture.c new file mode 100644 index 0000000..968ebf3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBindlessTexture.c @@ -0,0 +1,111 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLuint64 (APIENTRY *glGetTextureHandleARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRY *glGetTextureSamplerHandleARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRY *glMakeTextureHandleResidentARBPROC) (GLuint64 handle); +typedef void (APIENTRY *glMakeTextureHandleNonResidentARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRY *glGetImageHandleARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRY *glMakeImageHandleResidentARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRY *glMakeImageHandleNonResidentARBPROC) (GLuint64 handle); +typedef void (APIENTRY *glUniformHandleui64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRY *glUniformHandleui64vARBPROC) (GLint location, GLsizei count, const GLuint64 * value); +typedef void (APIENTRY *glProgramUniformHandleui64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRY *glProgramUniformHandleui64vARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 * values); +typedef GLboolean (APIENTRY *glIsTextureHandleResidentARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRY *glIsImageHandleResidentARBPROC) (GLuint64 handle); +typedef void (APIENTRY *glVertexAttribL1ui64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRY *glVertexAttribL1ui64vARBPROC) (GLuint index, const GLuint64EXT * v); +typedef void (APIENTRY *glGetVertexAttribLui64vARBPROC) (GLuint index, GLenum pname, GLuint64EXT * params); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglGetTextureHandleARB(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glGetTextureHandleARBPROC glGetTextureHandleARB = (glGetTextureHandleARBPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetTextureHandleARB(texture); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglGetTextureSamplerHandleARB(JNIEnv *env, jclass clazz, jint texture, jint sampler, jlong function_pointer) { + glGetTextureSamplerHandleARBPROC glGetTextureSamplerHandleARB = (glGetTextureSamplerHandleARBPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetTextureSamplerHandleARB(texture, sampler); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglMakeTextureHandleResidentARB(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeTextureHandleResidentARBPROC glMakeTextureHandleResidentARB = (glMakeTextureHandleResidentARBPROC)((intptr_t)function_pointer); + glMakeTextureHandleResidentARB(handle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglMakeTextureHandleNonResidentARB(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeTextureHandleNonResidentARBPROC glMakeTextureHandleNonResidentARB = (glMakeTextureHandleNonResidentARBPROC)((intptr_t)function_pointer); + glMakeTextureHandleNonResidentARB(handle); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglGetImageHandleARB(JNIEnv *env, jclass clazz, jint texture, jint level, jboolean layered, jint layer, jint format, jlong function_pointer) { + glGetImageHandleARBPROC glGetImageHandleARB = (glGetImageHandleARBPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetImageHandleARB(texture, level, layered, layer, format); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglMakeImageHandleResidentARB(JNIEnv *env, jclass clazz, jlong handle, jint access, jlong function_pointer) { + glMakeImageHandleResidentARBPROC glMakeImageHandleResidentARB = (glMakeImageHandleResidentARBPROC)((intptr_t)function_pointer); + glMakeImageHandleResidentARB(handle, access); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglMakeImageHandleNonResidentARB(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeImageHandleNonResidentARBPROC glMakeImageHandleNonResidentARB = (glMakeImageHandleNonResidentARBPROC)((intptr_t)function_pointer); + glMakeImageHandleNonResidentARB(handle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglUniformHandleui64ARB(JNIEnv *env, jclass clazz, jint location, jlong value, jlong function_pointer) { + glUniformHandleui64ARBPROC glUniformHandleui64ARB = (glUniformHandleui64ARBPROC)((intptr_t)function_pointer); + glUniformHandleui64ARB(location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglUniformHandleui64vARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64 *value_address = (const GLuint64 *)(intptr_t)value; + glUniformHandleui64vARBPROC glUniformHandleui64vARB = (glUniformHandleui64vARBPROC)((intptr_t)function_pointer); + glUniformHandleui64vARB(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglProgramUniformHandleui64ARB(JNIEnv *env, jclass clazz, jint program, jint location, jlong value, jlong function_pointer) { + glProgramUniformHandleui64ARBPROC glProgramUniformHandleui64ARB = (glProgramUniformHandleui64ARBPROC)((intptr_t)function_pointer); + glProgramUniformHandleui64ARB(program, location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglProgramUniformHandleui64vARB(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong values, jlong function_pointer) { + const GLuint64 *values_address = (const GLuint64 *)(intptr_t)values; + glProgramUniformHandleui64vARBPROC glProgramUniformHandleui64vARB = (glProgramUniformHandleui64vARBPROC)((intptr_t)function_pointer); + glProgramUniformHandleui64vARB(program, location, count, values_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglIsTextureHandleResidentARB(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glIsTextureHandleResidentARBPROC glIsTextureHandleResidentARB = (glIsTextureHandleResidentARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsTextureHandleResidentARB(handle); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglIsImageHandleResidentARB(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glIsImageHandleResidentARBPROC glIsImageHandleResidentARB = (glIsImageHandleResidentARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsImageHandleResidentARB(handle); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglVertexAttribL1ui64ARB(JNIEnv *env, jclass clazz, jint index, jlong x, jlong function_pointer) { + glVertexAttribL1ui64ARBPROC glVertexAttribL1ui64ARB = (glVertexAttribL1ui64ARBPROC)((intptr_t)function_pointer); + glVertexAttribL1ui64ARB(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglVertexAttribL1ui64vARB(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint64EXT *v_address = (const GLuint64EXT *)(intptr_t)v; + glVertexAttribL1ui64vARBPROC glVertexAttribL1ui64vARB = (glVertexAttribL1ui64vARBPROC)((intptr_t)function_pointer); + glVertexAttribL1ui64vARB(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBindlessTexture_nglGetVertexAttribLui64vARB(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetVertexAttribLui64vARBPROC glGetVertexAttribLui64vARB = (glGetVertexAttribLui64vARBPROC)((intptr_t)function_pointer); + glGetVertexAttribLui64vARB(index, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferObject.c new file mode 100644 index 0000000..e90df4d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferObject.c @@ -0,0 +1,83 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindBufferARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRY *glDeleteBuffersARBPROC) (GLsizei n, const GLuint * buffers); +typedef void (APIENTRY *glGenBuffersARBPROC) (GLsizei n, GLuint * buffers); +typedef GLboolean (APIENTRY *glIsBufferARBPROC) (GLuint buffer); +typedef void (APIENTRY *glBufferDataARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage); +typedef void (APIENTRY *glBufferSubDataARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data); +typedef void (APIENTRY *glGetBufferSubDataARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data); +typedef GLvoid * (APIENTRY *glMapBufferARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRY *glUnmapBufferARBPROC) (GLenum target); +typedef void (APIENTRY *glGetBufferParameterivARBPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetBufferPointervARBPROC) (GLenum target, GLenum pname, GLvoid ** pointer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglBindBufferARB(JNIEnv *env, jclass clazz, jint target, jint buffer, jlong function_pointer) { + glBindBufferARBPROC glBindBufferARB = (glBindBufferARBPROC)((intptr_t)function_pointer); + glBindBufferARB(target, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglDeleteBuffersARB(JNIEnv *env, jclass clazz, jint n, jlong buffers, jlong function_pointer) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + glDeleteBuffersARBPROC glDeleteBuffersARB = (glDeleteBuffersARBPROC)((intptr_t)function_pointer); + glDeleteBuffersARB(n, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglGenBuffersARB(JNIEnv *env, jclass clazz, jint n, jlong buffers, jlong function_pointer) { + GLuint *buffers_address = (GLuint *)(intptr_t)buffers; + glGenBuffersARBPROC glGenBuffersARB = (glGenBuffersARBPROC)((intptr_t)function_pointer); + glGenBuffersARB(n, buffers_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglIsBufferARB(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glIsBufferARBPROC glIsBufferARB = (glIsBufferARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsBufferARB(buffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglBufferDataARB(JNIEnv *env, jclass clazz, jint target, jlong size, jlong data, jint usage, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferDataARBPROC glBufferDataARB = (glBufferDataARBPROC)((intptr_t)function_pointer); + glBufferDataARB(target, size, data_address, usage); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglBufferSubDataARB(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferSubDataARBPROC glBufferSubDataARB = (glBufferSubDataARBPROC)((intptr_t)function_pointer); + glBufferSubDataARB(target, offset, size, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglGetBufferSubDataARB(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetBufferSubDataARBPROC glGetBufferSubDataARB = (glGetBufferSubDataARBPROC)((intptr_t)function_pointer); + glGetBufferSubDataARB(target, offset, size, data_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglMapBufferARB(JNIEnv *env, jclass clazz, jint target, jint access, jlong result_size, jobject old_buffer, jlong function_pointer) { + glMapBufferARBPROC glMapBufferARB = (glMapBufferARBPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapBufferARB(target, access); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglUnmapBufferARB(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glUnmapBufferARBPROC glUnmapBufferARB = (glUnmapBufferARBPROC)((intptr_t)function_pointer); + GLboolean __result = glUnmapBufferARB(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglGetBufferParameterivARB(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetBufferParameterivARBPROC glGetBufferParameterivARB = (glGetBufferParameterivARBPROC)((intptr_t)function_pointer); + glGetBufferParameterivARB(target, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_ARBBufferObject_nglGetBufferPointervARB(JNIEnv *env, jclass clazz, jint target, jint pname, jlong result_size, jlong function_pointer) { + glGetBufferPointervARBPROC glGetBufferPointervARB = (glGetBufferPointervARBPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetBufferPointervARB(target, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferStorage.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferStorage.c new file mode 100644 index 0000000..959f23b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBBufferStorage.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glNamedBufferStorageEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid * data, GLbitfield flags); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBBufferStorage_nglNamedBufferStorageEXT(JNIEnv *env, jclass clazz, jint buffer, jlong size, jlong data, jint flags, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glNamedBufferStorageEXTPROC glNamedBufferStorageEXT = (glNamedBufferStorageEXTPROC)((intptr_t)function_pointer); + glNamedBufferStorageEXT(buffer, size, data_address, flags); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBCLEvent.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBCLEvent.c new file mode 100644 index 0000000..d071e9a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBCLEvent.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLsync (APIENTRY *glCreateSyncFromCLeventARBPROC) (cl_context context, cl_event event, GLbitfield flags); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_ARBCLEvent_nglCreateSyncFromCLeventARB(JNIEnv *env, jclass clazz, jlong context, jlong event, jint flags, jlong function_pointer) { + glCreateSyncFromCLeventARBPROC glCreateSyncFromCLeventARB = (glCreateSyncFromCLeventARBPROC)((intptr_t)function_pointer); + GLsync __result = glCreateSyncFromCLeventARB((cl_context)(intptr_t)context, (cl_event)(intptr_t)event, flags); + return (intptr_t)__result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBClearBufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBClearBufferObject.c new file mode 100644 index 0000000..2250d94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBClearBufferObject.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClearNamedBufferDataEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glClearNamedBufferSubDataEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const GLvoid * data); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBClearBufferObject_nglClearNamedBufferDataEXT(JNIEnv *env, jclass clazz, jint buffer, jint internalformat, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearNamedBufferDataEXTPROC glClearNamedBufferDataEXT = (glClearNamedBufferDataEXTPROC)((intptr_t)function_pointer); + glClearNamedBufferDataEXT(buffer, internalformat, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBClearBufferObject_nglClearNamedBufferSubDataEXT(JNIEnv *env, jclass clazz, jint buffer, jint internalformat, jlong offset, jlong size, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearNamedBufferSubDataEXTPROC glClearNamedBufferSubDataEXT = (glClearNamedBufferSubDataEXTPROC)((intptr_t)function_pointer); + glClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, data_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBColorBufferFloat.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBColorBufferFloat.c new file mode 100644 index 0000000..9f781ce --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBColorBufferFloat.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClampColorARBPROC) (GLenum target, GLenum clamp); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBColorBufferFloat_nglClampColorARB(JNIEnv *env, jclass clazz, jint target, jint clamp, jlong function_pointer) { + glClampColorARBPROC glClampColorARB = (glClampColorARBPROC)((intptr_t)function_pointer); + glClampColorARB(target, clamp); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBComputeVariableGroupSize.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBComputeVariableGroupSize.c new file mode 100644 index 0000000..38769f0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBComputeVariableGroupSize.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDispatchComputeGroupSizeARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBComputeVariableGroupSize_nglDispatchComputeGroupSizeARB(JNIEnv *env, jclass clazz, jint num_groups_x, jint num_groups_y, jint num_groups_z, jint group_size_x, jint group_size_y, jint group_size_z, jlong function_pointer) { + glDispatchComputeGroupSizeARBPROC glDispatchComputeGroupSizeARB = (glDispatchComputeGroupSizeARBPROC)((intptr_t)function_pointer); + glDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDebugOutput.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDebugOutput.c new file mode 100644 index 0000000..ad31202 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDebugOutput.c @@ -0,0 +1,39 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDebugMessageControlARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (APIENTRY *glDebugMessageInsertARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (APIENTRY *glDebugMessageCallbackARBPROC) (GLDEBUGPROCARB callback, GLvoid * userParam); +typedef GLuint (APIENTRY *glGetDebugMessageLogARBPROC) (GLuint count, GLsizei logSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDebugOutput_nglDebugMessageControlARB(JNIEnv *env, jclass clazz, jint source, jint type, jint severity, jint count, jlong ids, jboolean enabled, jlong function_pointer) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDebugMessageControlARBPROC glDebugMessageControlARB = (glDebugMessageControlARBPROC)((intptr_t)function_pointer); + glDebugMessageControlARB(source, type, severity, count, ids_address, enabled); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDebugOutput_nglDebugMessageInsertARB(JNIEnv *env, jclass clazz, jint source, jint type, jint id, jint severity, jint length, jlong buf, jlong function_pointer) { + const GLchar *buf_address = (const GLchar *)(intptr_t)buf; + glDebugMessageInsertARBPROC glDebugMessageInsertARB = (glDebugMessageInsertARBPROC)((intptr_t)function_pointer); + glDebugMessageInsertARB(source, type, id, severity, length, buf_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDebugOutput_nglDebugMessageCallbackARB(JNIEnv *env, jclass clazz, jlong callback, jlong userParam, jlong function_pointer) { + glDebugMessageCallbackARBPROC glDebugMessageCallbackARB = (glDebugMessageCallbackARBPROC)((intptr_t)function_pointer); + glDebugMessageCallbackARB((GLDEBUGPROCARB)(intptr_t)callback, (GLvoid *)(intptr_t)userParam); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBDebugOutput_nglGetDebugMessageLogARB(JNIEnv *env, jclass clazz, jint count, jint logSize, jlong sources, jlong types, jlong ids, jlong severities, jlong lengths, jlong messageLog, jlong function_pointer) { + GLenum *sources_address = (GLenum *)(intptr_t)sources; + GLenum *types_address = (GLenum *)(intptr_t)types; + GLuint *ids_address = (GLuint *)(intptr_t)ids; + GLenum *severities_address = (GLenum *)(intptr_t)severities; + GLsizei *lengths_address = (GLsizei *)(intptr_t)lengths; + GLchar *messageLog_address = (GLchar *)(intptr_t)messageLog; + glGetDebugMessageLogARBPROC glGetDebugMessageLogARB = (glGetDebugMessageLogARBPROC)((intptr_t)function_pointer); + GLuint __result = glGetDebugMessageLogARB(count, logSize, sources_address, types_address, ids_address, severities_address, lengths_address, messageLog_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffers.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffers.c new file mode 100644 index 0000000..2504445 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffers.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawBuffersARBPROC) (GLsizei size, const GLenum * buffers); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawBuffers_nglDrawBuffersARB(JNIEnv *env, jclass clazz, jint size, jlong buffers, jlong function_pointer) { + const GLenum *buffers_address = (const GLenum *)(intptr_t)buffers; + glDrawBuffersARBPROC glDrawBuffersARB = (glDrawBuffersARBPROC)((intptr_t)function_pointer); + glDrawBuffersARB(size, buffers_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffersBlend.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffersBlend.c new file mode 100644 index 0000000..64bff1e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawBuffersBlend.c @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendEquationiARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRY *glBlendEquationSeparateiARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRY *glBlendFunciARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRY *glBlendFuncSeparateiARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawBuffersBlend_nglBlendEquationiARB(JNIEnv *env, jclass clazz, jint buf, jint mode, jlong function_pointer) { + glBlendEquationiARBPROC glBlendEquationiARB = (glBlendEquationiARBPROC)((intptr_t)function_pointer); + glBlendEquationiARB(buf, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawBuffersBlend_nglBlendEquationSeparateiARB(JNIEnv *env, jclass clazz, jint buf, jint modeRGB, jint modeAlpha, jlong function_pointer) { + glBlendEquationSeparateiARBPROC glBlendEquationSeparateiARB = (glBlendEquationSeparateiARBPROC)((intptr_t)function_pointer); + glBlendEquationSeparateiARB(buf, modeRGB, modeAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawBuffersBlend_nglBlendFunciARB(JNIEnv *env, jclass clazz, jint buf, jint src, jint dst, jlong function_pointer) { + glBlendFunciARBPROC glBlendFunciARB = (glBlendFunciARBPROC)((intptr_t)function_pointer); + glBlendFunciARB(buf, src, dst); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawBuffersBlend_nglBlendFuncSeparateiARB(JNIEnv *env, jclass clazz, jint buf, jint srcRGB, jint dstRGB, jint srcAlpha, jint dstAlpha, jlong function_pointer) { + glBlendFuncSeparateiARBPROC glBlendFuncSeparateiARB = (glBlendFuncSeparateiARBPROC)((intptr_t)function_pointer); + glBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawInstanced.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawInstanced.c new file mode 100644 index 0000000..f25c023 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBDrawInstanced.c @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawArraysInstancedARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRY *glDrawElementsInstancedARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawInstanced_nglDrawArraysInstancedARB(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jint primcount, jlong function_pointer) { + glDrawArraysInstancedARBPROC glDrawArraysInstancedARB = (glDrawArraysInstancedARBPROC)((intptr_t)function_pointer); + glDrawArraysInstancedARB(mode, first, count, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawInstanced_nglDrawElementsInstancedARB(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedARBPROC glDrawElementsInstancedARB = (glDrawElementsInstancedARBPROC)((intptr_t)function_pointer); + glDrawElementsInstancedARB(mode, count, type, indices_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawInstanced_nglDrawElementsInstancedARBBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedARBPROC glDrawElementsInstancedARB = (glDrawElementsInstancedARBPROC)((intptr_t)function_pointer); + glDrawElementsInstancedARB(mode, count, type, indices_address, primcount); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBFramebufferNoAttachments.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBFramebufferNoAttachments.c new file mode 100644 index 0000000..e81b5fb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBFramebufferNoAttachments.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glNamedFramebufferParameteriEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRY *glGetNamedFramebufferParameterivEXTPROC) (GLuint framebuffer, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBFramebufferNoAttachments_nglNamedFramebufferParameteriEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint pname, jint param, jlong function_pointer) { + glNamedFramebufferParameteriEXTPROC glNamedFramebufferParameteriEXT = (glNamedFramebufferParameteriEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferParameteriEXT(framebuffer, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBFramebufferNoAttachments_nglGetNamedFramebufferParameterivEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedFramebufferParameterivEXTPROC glGetNamedFramebufferParameterivEXT = (glGetNamedFramebufferParameterivEXTPROC)((intptr_t)function_pointer); + glGetNamedFramebufferParameterivEXT(framebuffer, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGeometryShader4.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGeometryShader4.c new file mode 100644 index 0000000..50cfcd7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGeometryShader4.c @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramParameteriARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRY *glFramebufferTextureARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTextureLayerARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRY *glFramebufferTextureFaceARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_nglProgramParameteriARB(JNIEnv *env, jclass clazz, jint program, jint pname, jint value, jlong function_pointer) { + glProgramParameteriARBPROC glProgramParameteriARB = (glProgramParameteriARBPROC)((intptr_t)function_pointer); + glProgramParameteriARB(program, pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_nglFramebufferTextureARB(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jlong function_pointer) { + glFramebufferTextureARBPROC glFramebufferTextureARB = (glFramebufferTextureARBPROC)((intptr_t)function_pointer); + glFramebufferTextureARB(target, attachment, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_nglFramebufferTextureLayerARB(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer, jlong function_pointer) { + glFramebufferTextureLayerARBPROC glFramebufferTextureLayerARB = (glFramebufferTextureLayerARBPROC)((intptr_t)function_pointer); + glFramebufferTextureLayerARB(target, attachment, texture, level, layer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_nglFramebufferTextureFaceARB(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint face, jlong function_pointer) { + glFramebufferTextureFaceARBPROC glFramebufferTextureFaceARB = (glFramebufferTextureFaceARBPROC)((intptr_t)function_pointer); + glFramebufferTextureFaceARB(target, attachment, texture, level, face); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGpuShaderFp64.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGpuShaderFp64.c new file mode 100644 index 0000000..29a57ed --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBGpuShaderFp64.c @@ -0,0 +1,121 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramUniform1dEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRY *glProgramUniform2dEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRY *glProgramUniform3dEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glProgramUniform4dEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glProgramUniform1dvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform2dvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform3dvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform4dvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix2dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix2x3dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix2x4dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3x2dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3x4dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4x2dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4x3dvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform1dEXT(JNIEnv *env, jclass clazz, jint program, jint location, jdouble x, jlong function_pointer) { + glProgramUniform1dEXTPROC glProgramUniform1dEXT = (glProgramUniform1dEXTPROC)((intptr_t)function_pointer); + glProgramUniform1dEXT(program, location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform2dEXT(JNIEnv *env, jclass clazz, jint program, jint location, jdouble x, jdouble y, jlong function_pointer) { + glProgramUniform2dEXTPROC glProgramUniform2dEXT = (glProgramUniform2dEXTPROC)((intptr_t)function_pointer); + glProgramUniform2dEXT(program, location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform3dEXT(JNIEnv *env, jclass clazz, jint program, jint location, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glProgramUniform3dEXTPROC glProgramUniform3dEXT = (glProgramUniform3dEXTPROC)((intptr_t)function_pointer); + glProgramUniform3dEXT(program, location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform4dEXT(JNIEnv *env, jclass clazz, jint program, jint location, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glProgramUniform4dEXTPROC glProgramUniform4dEXT = (glProgramUniform4dEXTPROC)((intptr_t)function_pointer); + glProgramUniform4dEXT(program, location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform1dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform1dvEXTPROC glProgramUniform1dvEXT = (glProgramUniform1dvEXTPROC)((intptr_t)function_pointer); + glProgramUniform1dvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform2dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform2dvEXTPROC glProgramUniform2dvEXT = (glProgramUniform2dvEXTPROC)((intptr_t)function_pointer); + glProgramUniform2dvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform3dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform3dvEXTPROC glProgramUniform3dvEXT = (glProgramUniform3dvEXTPROC)((intptr_t)function_pointer); + glProgramUniform3dvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniform4dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform4dvEXTPROC glProgramUniform4dvEXT = (glProgramUniform4dvEXTPROC)((intptr_t)function_pointer); + glProgramUniform4dvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix2dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2dvEXTPROC glProgramUniformMatrix2dvEXT = (glProgramUniformMatrix2dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix3dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3dvEXTPROC glProgramUniformMatrix3dvEXT = (glProgramUniformMatrix3dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix4dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4dvEXTPROC glProgramUniformMatrix4dvEXT = (glProgramUniformMatrix4dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix2x3dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2x3dvEXTPROC glProgramUniformMatrix2x3dvEXT = (glProgramUniformMatrix2x3dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x3dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix2x4dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2x4dvEXTPROC glProgramUniformMatrix2x4dvEXT = (glProgramUniformMatrix2x4dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x4dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix3x2dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3x2dvEXTPROC glProgramUniformMatrix3x2dvEXT = (glProgramUniformMatrix3x2dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x2dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix3x4dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3x4dvEXTPROC glProgramUniformMatrix3x4dvEXT = (glProgramUniformMatrix3x4dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x4dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix4x2dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4x2dvEXTPROC glProgramUniformMatrix4x2dvEXT = (glProgramUniformMatrix4x2dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x2dvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGpuShaderFp64_nglProgramUniformMatrix4x3dvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4x3dvEXTPROC glProgramUniformMatrix4x3dvEXT = (glProgramUniformMatrix4x3dvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x3dvEXT(program, location, count, transpose, value_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBImaging.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBImaging.c new file mode 100644 index 0000000..c95b100 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBImaging.c @@ -0,0 +1,280 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glColorTablePROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glColorSubTablePROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glColorTableParameterivPROC) (GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glColorTableParameterfvPROC) (GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glCopyColorSubTablePROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glCopyColorTablePROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glGetColorTablePROC) (GLenum target, GLenum format, GLenum type, GLvoid * data); +typedef void (APIENTRY *glGetColorTableParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetColorTableParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glHistogramPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY *glResetHistogramPROC) (GLenum target); +typedef void (APIENTRY *glGetHistogramPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values); +typedef void (APIENTRY *glGetHistogramParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetHistogramParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glMinmaxPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRY *glResetMinmaxPROC) (GLenum target); +typedef void (APIENTRY *glGetMinmaxPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid * values); +typedef void (APIENTRY *glGetMinmaxParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMinmaxParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glConvolutionFilter1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image); +typedef void (APIENTRY *glConvolutionFilter2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image); +typedef void (APIENTRY *glConvolutionParameterfPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRY *glConvolutionParameterfvPROC) (GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glConvolutionParameteriPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRY *glConvolutionParameterivPROC) (GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glCopyConvolutionFilter1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glCopyConvolutionFilter2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetConvolutionFilterPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image); +typedef void (APIENTRY *glGetConvolutionParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetConvolutionParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glSeparableFilter2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column); +typedef void (APIENTRY *glGetSeparableFilterPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorTable(JNIEnv *env, jclass clazz, jint target, jint internalFormat, jint width, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glColorTablePROC glColorTable = (glColorTablePROC)((intptr_t)function_pointer); + glColorTable(target, internalFormat, width, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorTableBO(JNIEnv *env, jclass clazz, jint target, jint internalFormat, jint width, jint format, jint type, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glColorTablePROC glColorTable = (glColorTablePROC)((intptr_t)function_pointer); + glColorTable(target, internalFormat, width, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorSubTable(JNIEnv *env, jclass clazz, jint target, jint start, jint count, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glColorSubTablePROC glColorSubTable = (glColorSubTablePROC)((intptr_t)function_pointer); + glColorSubTable(target, start, count, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorSubTableBO(JNIEnv *env, jclass clazz, jint target, jint start, jint count, jint format, jint type, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glColorSubTablePROC glColorSubTable = (glColorSubTablePROC)((intptr_t)function_pointer); + glColorSubTable(target, start, count, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorTableParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glColorTableParameterivPROC glColorTableParameteriv = (glColorTableParameterivPROC)((intptr_t)function_pointer); + glColorTableParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglColorTableParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glColorTableParameterfvPROC glColorTableParameterfv = (glColorTableParameterfvPROC)((intptr_t)function_pointer); + glColorTableParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglCopyColorSubTable(JNIEnv *env, jclass clazz, jint target, jint start, jint x, jint y, jint width, jlong function_pointer) { + glCopyColorSubTablePROC glCopyColorSubTable = (glCopyColorSubTablePROC)((intptr_t)function_pointer); + glCopyColorSubTable(target, start, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglCopyColorTable(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint x, jint y, jint width, jlong function_pointer) { + glCopyColorTablePROC glCopyColorTable = (glCopyColorTablePROC)((intptr_t)function_pointer); + glCopyColorTable(target, internalformat, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetColorTable(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetColorTablePROC glGetColorTable = (glGetColorTablePROC)((intptr_t)function_pointer); + glGetColorTable(target, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetColorTableParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetColorTableParameterivPROC glGetColorTableParameteriv = (glGetColorTableParameterivPROC)((intptr_t)function_pointer); + glGetColorTableParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetColorTableParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetColorTableParameterfvPROC glGetColorTableParameterfv = (glGetColorTableParameterfvPROC)((intptr_t)function_pointer); + glGetColorTableParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglHistogram(JNIEnv *env, jclass clazz, jint target, jint width, jint internalformat, jboolean sink, jlong function_pointer) { + glHistogramPROC glHistogram = (glHistogramPROC)((intptr_t)function_pointer); + glHistogram(target, width, internalformat, sink); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglResetHistogram(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glResetHistogramPROC glResetHistogram = (glResetHistogramPROC)((intptr_t)function_pointer); + glResetHistogram(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetHistogram(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jlong values, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)values; + glGetHistogramPROC glGetHistogram = (glGetHistogramPROC)((intptr_t)function_pointer); + glGetHistogram(target, reset, format, type, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetHistogramBO(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jlong values_buffer_offset, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetHistogramPROC glGetHistogram = (glGetHistogramPROC)((intptr_t)function_pointer); + glGetHistogram(target, reset, format, type, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetHistogramParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetHistogramParameterfvPROC glGetHistogramParameterfv = (glGetHistogramParameterfvPROC)((intptr_t)function_pointer); + glGetHistogramParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetHistogramParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetHistogramParameterivPROC glGetHistogramParameteriv = (glGetHistogramParameterivPROC)((intptr_t)function_pointer); + glGetHistogramParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglMinmax(JNIEnv *env, jclass clazz, jint target, jint internalformat, jboolean sink, jlong function_pointer) { + glMinmaxPROC glMinmax = (glMinmaxPROC)((intptr_t)function_pointer); + glMinmax(target, internalformat, sink); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglResetMinmax(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glResetMinmaxPROC glResetMinmax = (glResetMinmaxPROC)((intptr_t)function_pointer); + glResetMinmax(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetMinmax(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint types, jlong values, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)values; + glGetMinmaxPROC glGetMinmax = (glGetMinmaxPROC)((intptr_t)function_pointer); + glGetMinmax(target, reset, format, types, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetMinmaxBO(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint types, jlong values_buffer_offset, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetMinmaxPROC glGetMinmax = (glGetMinmaxPROC)((intptr_t)function_pointer); + glGetMinmax(target, reset, format, types, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetMinmaxParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMinmaxParameterfvPROC glGetMinmaxParameterfv = (glGetMinmaxParameterfvPROC)((intptr_t)function_pointer); + glGetMinmaxParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetMinmaxParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMinmaxParameterivPROC glGetMinmaxParameteriv = (glGetMinmaxParameterivPROC)((intptr_t)function_pointer); + glGetMinmaxParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionFilter1D(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint format, jint type, jlong image, jlong function_pointer) { + const GLvoid *image_address = (const GLvoid *)(intptr_t)image; + glConvolutionFilter1DPROC glConvolutionFilter1D = (glConvolutionFilter1DPROC)((intptr_t)function_pointer); + glConvolutionFilter1D(target, internalformat, width, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionFilter1DBO(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint format, jint type, jlong image_buffer_offset, jlong function_pointer) { + const GLvoid *image_address = (const GLvoid *)(intptr_t)offsetToPointer(image_buffer_offset); + glConvolutionFilter1DPROC glConvolutionFilter1D = (glConvolutionFilter1DPROC)((intptr_t)function_pointer); + glConvolutionFilter1D(target, internalformat, width, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionFilter2D(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jint format, jint type, jlong image, jlong function_pointer) { + const GLvoid *image_address = (const GLvoid *)(intptr_t)image; + glConvolutionFilter2DPROC glConvolutionFilter2D = (glConvolutionFilter2DPROC)((intptr_t)function_pointer); + glConvolutionFilter2D(target, internalformat, width, height, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionFilter2DBO(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jint format, jint type, jlong image_buffer_offset, jlong function_pointer) { + const GLvoid *image_address = (const GLvoid *)(intptr_t)offsetToPointer(image_buffer_offset); + glConvolutionFilter2DPROC glConvolutionFilter2D = (glConvolutionFilter2DPROC)((intptr_t)function_pointer); + glConvolutionFilter2D(target, internalformat, width, height, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionParameterf(JNIEnv *env, jclass clazz, jint target, jint pname, jfloat params, jlong function_pointer) { + glConvolutionParameterfPROC glConvolutionParameterf = (glConvolutionParameterfPROC)((intptr_t)function_pointer); + glConvolutionParameterf(target, pname, params); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glConvolutionParameterfvPROC glConvolutionParameterfv = (glConvolutionParameterfvPROC)((intptr_t)function_pointer); + glConvolutionParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionParameteri(JNIEnv *env, jclass clazz, jint target, jint pname, jint params, jlong function_pointer) { + glConvolutionParameteriPROC glConvolutionParameteri = (glConvolutionParameteriPROC)((intptr_t)function_pointer); + glConvolutionParameteri(target, pname, params); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglConvolutionParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glConvolutionParameterivPROC glConvolutionParameteriv = (glConvolutionParameterivPROC)((intptr_t)function_pointer); + glConvolutionParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglCopyConvolutionFilter1D(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint x, jint y, jint width, jlong function_pointer) { + glCopyConvolutionFilter1DPROC glCopyConvolutionFilter1D = (glCopyConvolutionFilter1DPROC)((intptr_t)function_pointer); + glCopyConvolutionFilter1D(target, internalformat, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglCopyConvolutionFilter2D(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyConvolutionFilter2DPROC glCopyConvolutionFilter2D = (glCopyConvolutionFilter2DPROC)((intptr_t)function_pointer); + glCopyConvolutionFilter2D(target, internalformat, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetConvolutionFilter(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong image, jlong function_pointer) { + GLvoid *image_address = (GLvoid *)(intptr_t)image; + glGetConvolutionFilterPROC glGetConvolutionFilter = (glGetConvolutionFilterPROC)((intptr_t)function_pointer); + glGetConvolutionFilter(target, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetConvolutionFilterBO(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong image_buffer_offset, jlong function_pointer) { + GLvoid *image_address = (GLvoid *)(intptr_t)offsetToPointer(image_buffer_offset); + glGetConvolutionFilterPROC glGetConvolutionFilter = (glGetConvolutionFilterPROC)((intptr_t)function_pointer); + glGetConvolutionFilter(target, format, type, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetConvolutionParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetConvolutionParameterfvPROC glGetConvolutionParameterfv = (glGetConvolutionParameterfvPROC)((intptr_t)function_pointer); + glGetConvolutionParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetConvolutionParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetConvolutionParameterivPROC glGetConvolutionParameteriv = (glGetConvolutionParameterivPROC)((intptr_t)function_pointer); + glGetConvolutionParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglSeparableFilter2D(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jint format, jint type, jlong row, jlong column, jlong function_pointer) { + const GLvoid *row_address = (const GLvoid *)(intptr_t)row; + const GLvoid *column_address = (const GLvoid *)(intptr_t)column; + glSeparableFilter2DPROC glSeparableFilter2D = (glSeparableFilter2DPROC)((intptr_t)function_pointer); + glSeparableFilter2D(target, internalformat, width, height, format, type, row_address, column_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglSeparableFilter2DBO(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jint format, jint type, jlong row_buffer_offset, jlong column_buffer_offset, jlong function_pointer) { + const GLvoid *row_address = (const GLvoid *)(intptr_t)offsetToPointer(row_buffer_offset); + const GLvoid *column_address = (const GLvoid *)(intptr_t)offsetToPointer(column_buffer_offset); + glSeparableFilter2DPROC glSeparableFilter2D = (glSeparableFilter2DPROC)((intptr_t)function_pointer); + glSeparableFilter2D(target, internalformat, width, height, format, type, row_address, column_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetSeparableFilter(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong row, jlong column, jlong span, jlong function_pointer) { + GLvoid *row_address = (GLvoid *)(intptr_t)row; + GLvoid *column_address = (GLvoid *)(intptr_t)column; + GLvoid *span_address = (GLvoid *)(intptr_t)span; + glGetSeparableFilterPROC glGetSeparableFilter = (glGetSeparableFilterPROC)((intptr_t)function_pointer); + glGetSeparableFilter(target, format, type, row_address, column_address, span_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBImaging_nglGetSeparableFilterBO(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong row_buffer_offset, jlong column_buffer_offset, jlong span_buffer_offset, jlong function_pointer) { + GLvoid *row_address = (GLvoid *)(intptr_t)offsetToPointer(row_buffer_offset); + GLvoid *column_address = (GLvoid *)(intptr_t)offsetToPointer(column_buffer_offset); + GLvoid *span_address = (GLvoid *)(intptr_t)offsetToPointer(span_buffer_offset); + glGetSeparableFilterPROC glGetSeparableFilter = (glGetSeparableFilterPROC)((intptr_t)function_pointer); + glGetSeparableFilter(target, format, type, row_address, column_address, span_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBIndirectParameters.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBIndirectParameters.c new file mode 100644 index 0000000..d7738da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBIndirectParameters.c @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMultiDrawArraysIndirectCountARBPROC) (GLenum mode, const GLvoid * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRY *glMultiDrawElementsIndirectCountARBPROC) (GLenum mode, GLenum type, const GLvoid * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBIndirectParameters_nglMultiDrawArraysIndirectCountARB(JNIEnv *env, jclass clazz, jint mode, jlong indirect, jlong drawcount, jint maxdrawcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawArraysIndirectCountARBPROC glMultiDrawArraysIndirectCountARB = (glMultiDrawArraysIndirectCountARBPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectCountARB(mode, indirect_address, drawcount, maxdrawcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBIndirectParameters_nglMultiDrawArraysIndirectCountARBBO(JNIEnv *env, jclass clazz, jint mode, jlong indirect_buffer_offset, jlong drawcount, jint maxdrawcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawArraysIndirectCountARBPROC glMultiDrawArraysIndirectCountARB = (glMultiDrawArraysIndirectCountARBPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectCountARB(mode, indirect_address, drawcount, maxdrawcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBIndirectParameters_nglMultiDrawElementsIndirectCountARB(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect, jlong drawcount, jint maxdrawcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawElementsIndirectCountARBPROC glMultiDrawElementsIndirectCountARB = (glMultiDrawElementsIndirectCountARBPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectCountARB(mode, type, indirect_address, drawcount, maxdrawcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBIndirectParameters_nglMultiDrawElementsIndirectCountARBBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jlong drawcount, jint maxdrawcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawElementsIndirectCountARBPROC glMultiDrawElementsIndirectCountARB = (glMultiDrawElementsIndirectCountARBPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectCountARB(mode, type, indirect_address, drawcount, maxdrawcount, stride); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBInstancedArrays.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBInstancedArrays.c new file mode 100644 index 0000000..a670a75 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBInstancedArrays.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribDivisorARBPROC) (GLuint index, GLuint divisor); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBInstancedArrays_nglVertexAttribDivisorARB(JNIEnv *env, jclass clazz, jint index, jint divisor, jlong function_pointer) { + glVertexAttribDivisorARBPROC glVertexAttribDivisorARB = (glVertexAttribDivisorARBPROC)((intptr_t)function_pointer); + glVertexAttribDivisorARB(index, divisor); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMatrixPalette.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMatrixPalette.c new file mode 100644 index 0000000..e4a49bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMatrixPalette.c @@ -0,0 +1,46 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glCurrentPaletteMatrixARBPROC) (GLint index); +typedef void (APIENTRY *glMatrixIndexPointerARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pPointer); +typedef void (APIENTRY *glMatrixIndexubvARBPROC) (GLint size, GLubyte * pIndices); +typedef void (APIENTRY *glMatrixIndexusvARBPROC) (GLint size, GLushort * pIndices); +typedef void (APIENTRY *glMatrixIndexuivARBPROC) (GLint size, GLuint * pIndices); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglCurrentPaletteMatrixARB(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glCurrentPaletteMatrixARBPROC glCurrentPaletteMatrixARB = (glCurrentPaletteMatrixARBPROC)((intptr_t)function_pointer); + glCurrentPaletteMatrixARB(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglMatrixIndexPointerARB(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glMatrixIndexPointerARBPROC glMatrixIndexPointerARB = (glMatrixIndexPointerARBPROC)((intptr_t)function_pointer); + glMatrixIndexPointerARB(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglMatrixIndexPointerARBBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer_buffer_offset, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pPointer_buffer_offset); + glMatrixIndexPointerARBPROC glMatrixIndexPointerARB = (glMatrixIndexPointerARBPROC)((intptr_t)function_pointer); + glMatrixIndexPointerARB(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglMatrixIndexubvARB(JNIEnv *env, jclass clazz, jint size, jlong pIndices, jlong function_pointer) { + GLubyte *pIndices_address = (GLubyte *)(intptr_t)pIndices; + glMatrixIndexubvARBPROC glMatrixIndexubvARB = (glMatrixIndexubvARBPROC)((intptr_t)function_pointer); + glMatrixIndexubvARB(size, pIndices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglMatrixIndexusvARB(JNIEnv *env, jclass clazz, jint size, jlong pIndices, jlong function_pointer) { + GLushort *pIndices_address = (GLushort *)(intptr_t)pIndices; + glMatrixIndexusvARBPROC glMatrixIndexusvARB = (glMatrixIndexusvARBPROC)((intptr_t)function_pointer); + glMatrixIndexusvARB(size, pIndices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMatrixPalette_nglMatrixIndexuivARB(JNIEnv *env, jclass clazz, jint size, jlong pIndices, jlong function_pointer) { + GLuint *pIndices_address = (GLuint *)(intptr_t)pIndices; + glMatrixIndexuivARBPROC glMatrixIndexuivARB = (glMatrixIndexuivARBPROC)((intptr_t)function_pointer); + glMatrixIndexuivARB(size, pIndices_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultisample.c new file mode 100644 index 0000000..cce6bb0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultisample.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glSampleCoverageARBPROC) (GLclampf value, GLboolean invert); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultisample_nglSampleCoverageARB(JNIEnv *env, jclass clazz, jfloat value, jboolean invert, jlong function_pointer) { + glSampleCoverageARBPROC glSampleCoverageARB = (glSampleCoverageARBPROC)((intptr_t)function_pointer); + glSampleCoverageARB(value, invert); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultitexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultitexture.c new file mode 100644 index 0000000..4631e3e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBMultitexture.c @@ -0,0 +1,114 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClientActiveTextureARBPROC) (GLenum texture); +typedef void (APIENTRY *glActiveTextureARBPROC) (GLenum texture); +typedef void (APIENTRY *glMultiTexCoord1fARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRY *glMultiTexCoord1dARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRY *glMultiTexCoord1iARBPROC) (GLenum target, GLint s); +typedef void (APIENTRY *glMultiTexCoord1sARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRY *glMultiTexCoord2fARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRY *glMultiTexCoord2dARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRY *glMultiTexCoord2iARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRY *glMultiTexCoord2sARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRY *glMultiTexCoord3fARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRY *glMultiTexCoord3dARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRY *glMultiTexCoord3iARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRY *glMultiTexCoord3sARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRY *glMultiTexCoord4fARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRY *glMultiTexCoord4dARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRY *glMultiTexCoord4iARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRY *glMultiTexCoord4sARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglClientActiveTextureARB(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glClientActiveTextureARBPROC glClientActiveTextureARB = (glClientActiveTextureARBPROC)((intptr_t)function_pointer); + glClientActiveTextureARB(texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglActiveTextureARB(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glActiveTextureARBPROC glActiveTextureARB = (glActiveTextureARBPROC)((intptr_t)function_pointer); + glActiveTextureARB(texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord1fARB(JNIEnv *env, jclass clazz, jint target, jfloat s, jlong function_pointer) { + glMultiTexCoord1fARBPROC glMultiTexCoord1fARB = (glMultiTexCoord1fARBPROC)((intptr_t)function_pointer); + glMultiTexCoord1fARB(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord1dARB(JNIEnv *env, jclass clazz, jint target, jdouble s, jlong function_pointer) { + glMultiTexCoord1dARBPROC glMultiTexCoord1dARB = (glMultiTexCoord1dARBPROC)((intptr_t)function_pointer); + glMultiTexCoord1dARB(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord1iARB(JNIEnv *env, jclass clazz, jint target, jint s, jlong function_pointer) { + glMultiTexCoord1iARBPROC glMultiTexCoord1iARB = (glMultiTexCoord1iARBPROC)((intptr_t)function_pointer); + glMultiTexCoord1iARB(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord1sARB(JNIEnv *env, jclass clazz, jint target, jshort s, jlong function_pointer) { + glMultiTexCoord1sARBPROC glMultiTexCoord1sARB = (glMultiTexCoord1sARBPROC)((intptr_t)function_pointer); + glMultiTexCoord1sARB(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord2fARB(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jlong function_pointer) { + glMultiTexCoord2fARBPROC glMultiTexCoord2fARB = (glMultiTexCoord2fARBPROC)((intptr_t)function_pointer); + glMultiTexCoord2fARB(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord2dARB(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jlong function_pointer) { + glMultiTexCoord2dARBPROC glMultiTexCoord2dARB = (glMultiTexCoord2dARBPROC)((intptr_t)function_pointer); + glMultiTexCoord2dARB(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord2iARB(JNIEnv *env, jclass clazz, jint target, jint s, jint t, jlong function_pointer) { + glMultiTexCoord2iARBPROC glMultiTexCoord2iARB = (glMultiTexCoord2iARBPROC)((intptr_t)function_pointer); + glMultiTexCoord2iARB(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord2sARB(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jlong function_pointer) { + glMultiTexCoord2sARBPROC glMultiTexCoord2sARB = (glMultiTexCoord2sARBPROC)((intptr_t)function_pointer); + glMultiTexCoord2sARB(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord3fARB(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jfloat r, jlong function_pointer) { + glMultiTexCoord3fARBPROC glMultiTexCoord3fARB = (glMultiTexCoord3fARBPROC)((intptr_t)function_pointer); + glMultiTexCoord3fARB(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord3dARB(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jdouble r, jlong function_pointer) { + glMultiTexCoord3dARBPROC glMultiTexCoord3dARB = (glMultiTexCoord3dARBPROC)((intptr_t)function_pointer); + glMultiTexCoord3dARB(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord3iARB(JNIEnv *env, jclass clazz, jint target, jint s, jint t, jint r, jlong function_pointer) { + glMultiTexCoord3iARBPROC glMultiTexCoord3iARB = (glMultiTexCoord3iARBPROC)((intptr_t)function_pointer); + glMultiTexCoord3iARB(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord3sARB(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jshort r, jlong function_pointer) { + glMultiTexCoord3sARBPROC glMultiTexCoord3sARB = (glMultiTexCoord3sARBPROC)((intptr_t)function_pointer); + glMultiTexCoord3sARB(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord4fARB(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jfloat r, jfloat q, jlong function_pointer) { + glMultiTexCoord4fARBPROC glMultiTexCoord4fARB = (glMultiTexCoord4fARBPROC)((intptr_t)function_pointer); + glMultiTexCoord4fARB(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord4dARB(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jdouble r, jdouble q, jlong function_pointer) { + glMultiTexCoord4dARBPROC glMultiTexCoord4dARB = (glMultiTexCoord4dARBPROC)((intptr_t)function_pointer); + glMultiTexCoord4dARB(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord4iARB(JNIEnv *env, jclass clazz, jint target, jint s, jint t, jint r, jint q, jlong function_pointer) { + glMultiTexCoord4iARBPROC glMultiTexCoord4iARB = (glMultiTexCoord4iARBPROC)((intptr_t)function_pointer); + glMultiTexCoord4iARB(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBMultitexture_nglMultiTexCoord4sARB(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jshort r, jshort q, jlong function_pointer) { + glMultiTexCoord4sARBPROC glMultiTexCoord4sARB = (glMultiTexCoord4sARBPROC)((intptr_t)function_pointer); + glMultiTexCoord4sARB(target, s, t, r, q); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBOcclusionQuery.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBOcclusionQuery.c new file mode 100644 index 0000000..b2e61e6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBOcclusionQuery.c @@ -0,0 +1,60 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGenQueriesARBPROC) (GLsizei n, GLuint * ids); +typedef void (APIENTRY *glDeleteQueriesARBPROC) (GLsizei n, GLuint * ids); +typedef GLboolean (APIENTRY *glIsQueryARBPROC) (GLuint id); +typedef void (APIENTRY *glBeginQueryARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRY *glEndQueryARBPROC) (GLenum target); +typedef void (APIENTRY *glGetQueryivARBPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetQueryObjectivARBPROC) (GLuint id, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetQueryObjectuivARBPROC) (GLuint id, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglGenQueriesARB(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenQueriesARBPROC glGenQueriesARB = (glGenQueriesARBPROC)((intptr_t)function_pointer); + glGenQueriesARB(n, ids_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglDeleteQueriesARB(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glDeleteQueriesARBPROC glDeleteQueriesARB = (glDeleteQueriesARBPROC)((intptr_t)function_pointer); + glDeleteQueriesARB(n, ids_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglIsQueryARB(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glIsQueryARBPROC glIsQueryARB = (glIsQueryARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsQueryARB(id); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglBeginQueryARB(JNIEnv *env, jclass clazz, jint target, jint id, jlong function_pointer) { + glBeginQueryARBPROC glBeginQueryARB = (glBeginQueryARBPROC)((intptr_t)function_pointer); + glBeginQueryARB(target, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglEndQueryARB(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glEndQueryARBPROC glEndQueryARB = (glEndQueryARBPROC)((intptr_t)function_pointer); + glEndQueryARB(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglGetQueryivARB(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryivARBPROC glGetQueryivARB = (glGetQueryivARBPROC)((intptr_t)function_pointer); + glGetQueryivARB(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglGetQueryObjectivARB(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryObjectivARBPROC glGetQueryObjectivARB = (glGetQueryObjectivARBPROC)((intptr_t)function_pointer); + glGetQueryObjectivARB(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBOcclusionQuery_nglGetQueryObjectuivARB(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryObjectuivARBPROC glGetQueryObjectuivARB = (glGetQueryObjectuivARBPROC)((intptr_t)function_pointer); + glGetQueryObjectuivARB(id, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBPointParameters.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBPointParameters.c new file mode 100644 index 0000000..f602835 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBPointParameters.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPointParameterfARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPointParameterfvARBPROC) (GLenum pname, const GLfloat * pfParams); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBPointParameters_nglPointParameterfARB(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPointParameterfARBPROC glPointParameterfARB = (glPointParameterfARBPROC)((intptr_t)function_pointer); + glPointParameterfARB(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBPointParameters_nglPointParameterfvARB(JNIEnv *env, jclass clazz, jint pname, jlong pfParams, jlong function_pointer) { + const GLfloat *pfParams_address = (const GLfloat *)(intptr_t)pfParams; + glPointParameterfvARBPROC glPointParameterfvARB = (glPointParameterfvARBPROC)((intptr_t)function_pointer); + glPointParameterfvARB(pname, pfParams_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBProgram.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBProgram.c new file mode 100644 index 0000000..323b939 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBProgram.c @@ -0,0 +1,134 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramStringARBPROC) (GLenum target, GLenum format, GLsizei length, const GLvoid * string); +typedef void (APIENTRY *glBindProgramARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRY *glDeleteProgramsARBPROC) (GLsizei n, const GLuint * programs); +typedef void (APIENTRY *glGenProgramsARBPROC) (GLsizei n, GLuint * programs); +typedef void (APIENTRY *glProgramEnvParameter4fARBPROC) (GLint target, GLint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glProgramEnvParameter4dARBPROC) (GLint target, GLint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glProgramEnvParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat * params); +typedef void (APIENTRY *glProgramEnvParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble * params); +typedef void (APIENTRY *glProgramLocalParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glProgramLocalParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glProgramLocalParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat * params); +typedef void (APIENTRY *glProgramLocalParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble * params); +typedef void (APIENTRY *glGetProgramEnvParameterfvARBPROC) (GLenum target, GLuint index, GLfloat * params); +typedef void (APIENTRY *glGetProgramEnvParameterdvARBPROC) (GLenum target, GLuint index, GLdouble * params); +typedef void (APIENTRY *glGetProgramLocalParameterfvARBPROC) (GLenum target, GLuint index, GLfloat * params); +typedef void (APIENTRY *glGetProgramLocalParameterdvARBPROC) (GLenum target, GLuint index, GLdouble * params); +typedef void (APIENTRY *glGetProgramivARBPROC) (GLenum target, GLenum parameterName, GLint * params); +typedef void (APIENTRY *glGetProgramStringARBPROC) (GLenum target, GLenum parameterName, GLvoid * paramString); +typedef GLboolean (APIENTRY *glIsProgramARBPROC) (GLuint program); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramStringARB(JNIEnv *env, jclass clazz, jint target, jint format, jint length, jlong string, jlong function_pointer) { + const GLvoid *string_address = (const GLvoid *)(intptr_t)string; + glProgramStringARBPROC glProgramStringARB = (glProgramStringARBPROC)((intptr_t)function_pointer); + glProgramStringARB(target, format, length, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglBindProgramARB(JNIEnv *env, jclass clazz, jint target, jint program, jlong function_pointer) { + glBindProgramARBPROC glBindProgramARB = (glBindProgramARBPROC)((intptr_t)function_pointer); + glBindProgramARB(target, program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglDeleteProgramsARB(JNIEnv *env, jclass clazz, jint n, jlong programs, jlong function_pointer) { + const GLuint *programs_address = (const GLuint *)(intptr_t)programs; + glDeleteProgramsARBPROC glDeleteProgramsARB = (glDeleteProgramsARBPROC)((intptr_t)function_pointer); + glDeleteProgramsARB(n, programs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGenProgramsARB(JNIEnv *env, jclass clazz, jint n, jlong programs, jlong function_pointer) { + GLuint *programs_address = (GLuint *)(intptr_t)programs; + glGenProgramsARBPROC glGenProgramsARB = (glGenProgramsARBPROC)((intptr_t)function_pointer); + glGenProgramsARB(n, programs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramEnvParameter4fARB(JNIEnv *env, jclass clazz, jint target, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glProgramEnvParameter4fARBPROC glProgramEnvParameter4fARB = (glProgramEnvParameter4fARBPROC)((intptr_t)function_pointer); + glProgramEnvParameter4fARB(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramEnvParameter4dARB(JNIEnv *env, jclass clazz, jint target, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glProgramEnvParameter4dARBPROC glProgramEnvParameter4dARB = (glProgramEnvParameter4dARBPROC)((intptr_t)function_pointer); + glProgramEnvParameter4dARB(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramEnvParameter4fvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramEnvParameter4fvARBPROC glProgramEnvParameter4fvARB = (glProgramEnvParameter4fvARBPROC)((intptr_t)function_pointer); + glProgramEnvParameter4fvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramEnvParameter4dvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glProgramEnvParameter4dvARBPROC glProgramEnvParameter4dvARB = (glProgramEnvParameter4dvARBPROC)((intptr_t)function_pointer); + glProgramEnvParameter4dvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4fARB(JNIEnv *env, jclass clazz, jint target, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glProgramLocalParameter4fARBPROC glProgramLocalParameter4fARB = (glProgramLocalParameter4fARBPROC)((intptr_t)function_pointer); + glProgramLocalParameter4fARB(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4dARB(JNIEnv *env, jclass clazz, jint target, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glProgramLocalParameter4dARBPROC glProgramLocalParameter4dARB = (glProgramLocalParameter4dARBPROC)((intptr_t)function_pointer); + glProgramLocalParameter4dARB(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4fvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB = (glProgramLocalParameter4fvARBPROC)((intptr_t)function_pointer); + glProgramLocalParameter4fvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglProgramLocalParameter4dvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glProgramLocalParameter4dvARBPROC glProgramLocalParameter4dvARB = (glProgramLocalParameter4dvARBPROC)((intptr_t)function_pointer); + glProgramLocalParameter4dvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramEnvParameterfvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetProgramEnvParameterfvARBPROC glGetProgramEnvParameterfvARB = (glGetProgramEnvParameterfvARBPROC)((intptr_t)function_pointer); + glGetProgramEnvParameterfvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramEnvParameterdvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetProgramEnvParameterdvARBPROC glGetProgramEnvParameterdvARB = (glGetProgramEnvParameterdvARBPROC)((intptr_t)function_pointer); + glGetProgramEnvParameterdvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramLocalParameterfvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetProgramLocalParameterfvARBPROC glGetProgramLocalParameterfvARB = (glGetProgramLocalParameterfvARBPROC)((intptr_t)function_pointer); + glGetProgramLocalParameterfvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramLocalParameterdvARB(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetProgramLocalParameterdvARBPROC glGetProgramLocalParameterdvARB = (glGetProgramLocalParameterdvARBPROC)((intptr_t)function_pointer); + glGetProgramLocalParameterdvARB(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramivARB(JNIEnv *env, jclass clazz, jint target, jint parameterName, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramivARBPROC glGetProgramivARB = (glGetProgramivARBPROC)((intptr_t)function_pointer); + glGetProgramivARB(target, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBProgram_nglGetProgramStringARB(JNIEnv *env, jclass clazz, jint target, jint parameterName, jlong paramString, jlong function_pointer) { + GLvoid *paramString_address = (GLvoid *)(intptr_t)paramString; + glGetProgramStringARBPROC glGetProgramStringARB = (glGetProgramStringARBPROC)((intptr_t)function_pointer); + glGetProgramStringARB(target, parameterName, paramString_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBProgram_nglIsProgramARB(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glIsProgramARBPROC glIsProgramARB = (glIsProgramARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsProgramARB(program); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBRobustness.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBRobustness.c new file mode 100644 index 0000000..f279d20 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBRobustness.c @@ -0,0 +1,192 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLenum (APIENTRY *glGetGraphicsResetStatusARBPROC) (); +typedef void (APIENTRY *glGetnMapdvARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); +typedef void (APIENTRY *glGetnMapfvARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); +typedef void (APIENTRY *glGetnMapivARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint * v); +typedef void (APIENTRY *glGetnPixelMapfvARBPROC) (GLenum map, GLsizei bufSize, GLfloat * values); +typedef void (APIENTRY *glGetnPixelMapuivARBPROC) (GLenum map, GLsizei bufSize, GLuint * values); +typedef void (APIENTRY *glGetnPixelMapusvARBPROC) (GLenum map, GLsizei bufSize, GLushort * values); +typedef void (APIENTRY *glGetnPolygonStippleARBPROC) (GLsizei bufSize, GLubyte * pattern); +typedef void (APIENTRY *glGetnTexImageARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid * img); +typedef void (APIENTRY *glReadnPixelsARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid * data); +typedef void (APIENTRY *glGetnColorTableARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid * table); +typedef void (APIENTRY *glGetnConvolutionFilterARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid * image); +typedef void (APIENTRY *glGetnSeparableFilterARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid * row, GLsizei columnBufSize, GLvoid * column, GLvoid * span); +typedef void (APIENTRY *glGetnHistogramARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid * values); +typedef void (APIENTRY *glGetnMinmaxARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid * values); +typedef void (APIENTRY *glGetnCompressedTexImageARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid * img); +typedef void (APIENTRY *glGetnUniformfvARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (APIENTRY *glGetnUniformivARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (APIENTRY *glGetnUniformuivARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint * params); +typedef void (APIENTRY *glGetnUniformdvARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble * params); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetGraphicsResetStatusARB(JNIEnv *env, jclass clazz, jlong function_pointer) { + glGetGraphicsResetStatusARBPROC glGetGraphicsResetStatusARB = (glGetGraphicsResetStatusARBPROC)((intptr_t)function_pointer); + GLenum __result = glGetGraphicsResetStatusARB(); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnMapdvARB(JNIEnv *env, jclass clazz, jint target, jint query, jint bufSize, jlong v, jlong function_pointer) { + GLdouble *v_address = (GLdouble *)(intptr_t)v; + glGetnMapdvARBPROC glGetnMapdvARB = (glGetnMapdvARBPROC)((intptr_t)function_pointer); + glGetnMapdvARB(target, query, bufSize, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnMapfvARB(JNIEnv *env, jclass clazz, jint target, jint query, jint bufSize, jlong v, jlong function_pointer) { + GLfloat *v_address = (GLfloat *)(intptr_t)v; + glGetnMapfvARBPROC glGetnMapfvARB = (glGetnMapfvARBPROC)((intptr_t)function_pointer); + glGetnMapfvARB(target, query, bufSize, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnMapivARB(JNIEnv *env, jclass clazz, jint target, jint query, jint bufSize, jlong v, jlong function_pointer) { + GLint *v_address = (GLint *)(intptr_t)v; + glGetnMapivARBPROC glGetnMapivARB = (glGetnMapivARBPROC)((intptr_t)function_pointer); + glGetnMapivARB(target, query, bufSize, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnPixelMapfvARB(JNIEnv *env, jclass clazz, jint map, jint bufSize, jlong values, jlong function_pointer) { + GLfloat *values_address = (GLfloat *)(intptr_t)values; + glGetnPixelMapfvARBPROC glGetnPixelMapfvARB = (glGetnPixelMapfvARBPROC)((intptr_t)function_pointer); + glGetnPixelMapfvARB(map, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnPixelMapuivARB(JNIEnv *env, jclass clazz, jint map, jint bufSize, jlong values, jlong function_pointer) { + GLuint *values_address = (GLuint *)(intptr_t)values; + glGetnPixelMapuivARBPROC glGetnPixelMapuivARB = (glGetnPixelMapuivARBPROC)((intptr_t)function_pointer); + glGetnPixelMapuivARB(map, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnPixelMapusvARB(JNIEnv *env, jclass clazz, jint map, jint bufSize, jlong values, jlong function_pointer) { + GLushort *values_address = (GLushort *)(intptr_t)values; + glGetnPixelMapusvARBPROC glGetnPixelMapusvARB = (glGetnPixelMapusvARBPROC)((intptr_t)function_pointer); + glGetnPixelMapusvARB(map, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnPolygonStippleARB(JNIEnv *env, jclass clazz, jint bufSize, jlong pattern, jlong function_pointer) { + GLubyte *pattern_address = (GLubyte *)(intptr_t)pattern; + glGetnPolygonStippleARBPROC glGetnPolygonStippleARB = (glGetnPolygonStippleARBPROC)((intptr_t)function_pointer); + glGetnPolygonStippleARB(bufSize, pattern_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnTexImageARB(JNIEnv *env, jclass clazz, jint target, jint level, jint format, jint type, jint bufSize, jlong img, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetnTexImageARBPROC glGetnTexImageARB = (glGetnTexImageARBPROC)((intptr_t)function_pointer); + glGetnTexImageARB(target, level, format, type, bufSize, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnTexImageARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint format, jint type, jint bufSize, jlong img_buffer_offset, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)offsetToPointer(img_buffer_offset); + glGetnTexImageARBPROC glGetnTexImageARB = (glGetnTexImageARBPROC)((intptr_t)function_pointer); + glGetnTexImageARB(target, level, format, type, bufSize, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglReadnPixelsARB(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jint bufSize, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glReadnPixelsARBPROC glReadnPixelsARB = (glReadnPixelsARBPROC)((intptr_t)function_pointer); + glReadnPixelsARB(x, y, width, height, format, type, bufSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglReadnPixelsARBBO(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jint bufSize, jlong data_buffer_offset, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glReadnPixelsARBPROC glReadnPixelsARB = (glReadnPixelsARBPROC)((intptr_t)function_pointer); + glReadnPixelsARB(x, y, width, height, format, type, bufSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnColorTableARB(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jint bufSize, jlong table, jlong function_pointer) { + GLvoid *table_address = (GLvoid *)(intptr_t)table; + glGetnColorTableARBPROC glGetnColorTableARB = (glGetnColorTableARBPROC)((intptr_t)function_pointer); + glGetnColorTableARB(target, format, type, bufSize, table_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnConvolutionFilterARB(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jint bufSize, jlong image, jlong function_pointer) { + GLvoid *image_address = (GLvoid *)(intptr_t)image; + glGetnConvolutionFilterARBPROC glGetnConvolutionFilterARB = (glGetnConvolutionFilterARBPROC)((intptr_t)function_pointer); + glGetnConvolutionFilterARB(target, format, type, bufSize, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnConvolutionFilterARBBO(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jint bufSize, jlong image_buffer_offset, jlong function_pointer) { + GLvoid *image_address = (GLvoid *)(intptr_t)offsetToPointer(image_buffer_offset); + glGetnConvolutionFilterARBPROC glGetnConvolutionFilterARB = (glGetnConvolutionFilterARBPROC)((intptr_t)function_pointer); + glGetnConvolutionFilterARB(target, format, type, bufSize, image_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnSeparableFilterARB(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jint rowBufSize, jlong row, jint columnBufSize, jlong column, jlong span, jlong function_pointer) { + GLvoid *row_address = (GLvoid *)(intptr_t)row; + GLvoid *column_address = (GLvoid *)(intptr_t)column; + GLvoid *span_address = (GLvoid *)(intptr_t)span; + glGetnSeparableFilterARBPROC glGetnSeparableFilterARB = (glGetnSeparableFilterARBPROC)((intptr_t)function_pointer); + glGetnSeparableFilterARB(target, format, type, rowBufSize, row_address, columnBufSize, column_address, span_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnSeparableFilterARBBO(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jint rowBufSize, jlong row_buffer_offset, jint columnBufSize, jlong column_buffer_offset, jlong span_buffer_offset, jlong function_pointer) { + GLvoid *row_address = (GLvoid *)(intptr_t)offsetToPointer(row_buffer_offset); + GLvoid *column_address = (GLvoid *)(intptr_t)offsetToPointer(column_buffer_offset); + GLvoid *span_address = (GLvoid *)(intptr_t)offsetToPointer(span_buffer_offset); + glGetnSeparableFilterARBPROC glGetnSeparableFilterARB = (glGetnSeparableFilterARBPROC)((intptr_t)function_pointer); + glGetnSeparableFilterARB(target, format, type, rowBufSize, row_address, columnBufSize, column_address, span_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnHistogramARB(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jint bufSize, jlong values, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)values; + glGetnHistogramARBPROC glGetnHistogramARB = (glGetnHistogramARBPROC)((intptr_t)function_pointer); + glGetnHistogramARB(target, reset, format, type, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnHistogramARBBO(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jint bufSize, jlong values_buffer_offset, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetnHistogramARBPROC glGetnHistogramARB = (glGetnHistogramARBPROC)((intptr_t)function_pointer); + glGetnHistogramARB(target, reset, format, type, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnMinmaxARB(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jint bufSize, jlong values, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)values; + glGetnMinmaxARBPROC glGetnMinmaxARB = (glGetnMinmaxARBPROC)((intptr_t)function_pointer); + glGetnMinmaxARB(target, reset, format, type, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnMinmaxARBBO(JNIEnv *env, jclass clazz, jint target, jboolean reset, jint format, jint type, jint bufSize, jlong values_buffer_offset, jlong function_pointer) { + GLvoid *values_address = (GLvoid *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetnMinmaxARBPROC glGetnMinmaxARB = (glGetnMinmaxARBPROC)((intptr_t)function_pointer); + glGetnMinmaxARB(target, reset, format, type, bufSize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnCompressedTexImageARB(JNIEnv *env, jclass clazz, jint target, jint lod, jint bufSize, jlong img, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetnCompressedTexImageARBPROC glGetnCompressedTexImageARB = (glGetnCompressedTexImageARBPROC)((intptr_t)function_pointer); + glGetnCompressedTexImageARB(target, lod, bufSize, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnCompressedTexImageARBBO(JNIEnv *env, jclass clazz, jint target, jint lod, jint bufSize, jlong img_buffer_offset, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)offsetToPointer(img_buffer_offset); + glGetnCompressedTexImageARBPROC glGetnCompressedTexImageARB = (glGetnCompressedTexImageARBPROC)((intptr_t)function_pointer); + glGetnCompressedTexImageARB(target, lod, bufSize, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnUniformfvARB(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetnUniformfvARBPROC glGetnUniformfvARB = (glGetnUniformfvARBPROC)((intptr_t)function_pointer); + glGetnUniformfvARB(program, location, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnUniformivARB(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetnUniformivARBPROC glGetnUniformivARB = (glGetnUniformivARBPROC)((intptr_t)function_pointer); + glGetnUniformivARB(program, location, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnUniformuivARB(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetnUniformuivARBPROC glGetnUniformuivARB = (glGetnUniformuivARBPROC)((intptr_t)function_pointer); + glGetnUniformuivARB(program, location, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBRobustness_nglGetnUniformdvARB(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetnUniformdvARBPROC glGetnUniformdvARB = (glGetnUniformdvARBPROC)((intptr_t)function_pointer); + glGetnUniformdvARB(program, location, bufSize, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSampleShading.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSampleShading.c new file mode 100644 index 0000000..dbd79b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSampleShading.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMinSampleShadingARBPROC) (GLclampf value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBSampleShading_nglMinSampleShadingARB(JNIEnv *env, jclass clazz, jfloat value, jlong function_pointer) { + glMinSampleShadingARBPROC glMinSampleShadingARB = (glMinSampleShadingARBPROC)((intptr_t)function_pointer); + glMinSampleShadingARB(value); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShaderObjects.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShaderObjects.c new file mode 100644 index 0000000..6593e36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShaderObjects.c @@ -0,0 +1,288 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDeleteObjectARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRY *glGetHandleARBPROC) (GLenum pname); +typedef void (APIENTRY *glDetachObjectARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRY *glCreateShaderObjectARBPROC) (GLenum shaderType); +typedef void (APIENTRY *glShaderSourceARBPROC) (GLhandleARB shader, GLsizei count, const GLcharARB ** string, const GLint* length); +typedef void (APIENTRY *glCompileShaderARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRY *glCreateProgramObjectARBPROC) (); +typedef void (APIENTRY *glAttachObjectARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRY *glLinkProgramARBPROC) (GLhandleARB programObj); +typedef void (APIENTRY *glUseProgramObjectARBPROC) (GLhandleARB programObj); +typedef void (APIENTRY *glValidateProgramARBPROC) (GLhandleARB programObj); +typedef void (APIENTRY *glUniform1fARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRY *glUniform2fARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRY *glUniform3fARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glUniform4fARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRY *glUniform1iARBPROC) (GLint location, GLint v0); +typedef void (APIENTRY *glUniform2iARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRY *glUniform3iARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRY *glUniform4iARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRY *glUniform1fvARBPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform2fvARBPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform3fvARBPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform4fvARBPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform1ivARBPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform2ivARBPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform3ivARBPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform4ivARBPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniformMatrix2fvARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix3fvARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix4fvARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glGetObjectParameterfvARBPROC) (GLhandleARB obj, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetObjectParameterivARBPROC) (GLhandleARB obj, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetInfoLogARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); +typedef void (APIENTRY *glGetAttachedObjectsARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); +typedef GLint (APIENTRY *glGetUniformLocationARBPROC) (GLhandleARB programObj, const GLcharARB * name); +typedef void (APIENTRY *glGetActiveUniformARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (APIENTRY *glGetUniformfvARBPROC) (GLhandleARB programObj, GLint location, GLfloat * params); +typedef void (APIENTRY *glGetUniformivARBPROC) (GLhandleARB programObj, GLint location, GLint * params); +typedef void (APIENTRY *glGetShaderSourceARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglDeleteObjectARB(JNIEnv *env, jclass clazz, jint obj, jlong function_pointer) { + glDeleteObjectARBPROC glDeleteObjectARB = (glDeleteObjectARBPROC)((intptr_t)function_pointer); + glDeleteObjectARB(obj); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetHandleARB(JNIEnv *env, jclass clazz, jint pname, jlong function_pointer) { + glGetHandleARBPROC glGetHandleARB = (glGetHandleARBPROC)((intptr_t)function_pointer); + GLhandleARB __result = glGetHandleARB(pname); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglDetachObjectARB(JNIEnv *env, jclass clazz, jint containerObj, jint attachedObj, jlong function_pointer) { + glDetachObjectARBPROC glDetachObjectARB = (glDetachObjectARBPROC)((intptr_t)function_pointer); + glDetachObjectARB(containerObj, attachedObj); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglCreateShaderObjectARB(JNIEnv *env, jclass clazz, jint shaderType, jlong function_pointer) { + glCreateShaderObjectARBPROC glCreateShaderObjectARB = (glCreateShaderObjectARBPROC)((intptr_t)function_pointer); + GLhandleARB __result = glCreateShaderObjectARB(shaderType); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglShaderSourceARB(JNIEnv *env, jclass clazz, jint shader, jint count, jlong string, jint length, jlong function_pointer) { + const GLcharARB *string_address = (const GLcharARB *)(intptr_t)string; + glShaderSourceARBPROC glShaderSourceARB = (glShaderSourceARBPROC)((intptr_t)function_pointer); + glShaderSourceARB(shader, count, (const GLcharARB **)&string_address, (const GLint*)&length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglShaderSourceARB3(JNIEnv *env, jclass clazz, jint shader, jint count, jlong strings, jlong length, jlong function_pointer) { + const GLchar *strings_address = (const GLchar *)(intptr_t)strings; + int _str_i; + GLchar *_str_address; + GLchar **strings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + const GLint *length_address = (const GLint *)(intptr_t)length; + glShaderSourceARBPROC glShaderSourceARB = (glShaderSourceARBPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i] = _str_address; + _str_address += length_address[_str_i++]; + } + glShaderSourceARB(shader, count, (const GLchar **)strings_str, length_address); + free(strings_str); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglCompileShaderARB(JNIEnv *env, jclass clazz, jint shaderObj, jlong function_pointer) { + glCompileShaderARBPROC glCompileShaderARB = (glCompileShaderARBPROC)((intptr_t)function_pointer); + glCompileShaderARB(shaderObj); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglCreateProgramObjectARB(JNIEnv *env, jclass clazz, jlong function_pointer) { + glCreateProgramObjectARBPROC glCreateProgramObjectARB = (glCreateProgramObjectARBPROC)((intptr_t)function_pointer); + GLhandleARB __result = glCreateProgramObjectARB(); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglAttachObjectARB(JNIEnv *env, jclass clazz, jint containerObj, jint obj, jlong function_pointer) { + glAttachObjectARBPROC glAttachObjectARB = (glAttachObjectARBPROC)((intptr_t)function_pointer); + glAttachObjectARB(containerObj, obj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglLinkProgramARB(JNIEnv *env, jclass clazz, jint programObj, jlong function_pointer) { + glLinkProgramARBPROC glLinkProgramARB = (glLinkProgramARBPROC)((intptr_t)function_pointer); + glLinkProgramARB(programObj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUseProgramObjectARB(JNIEnv *env, jclass clazz, jint programObj, jlong function_pointer) { + glUseProgramObjectARBPROC glUseProgramObjectARB = (glUseProgramObjectARBPROC)((intptr_t)function_pointer); + glUseProgramObjectARB(programObj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglValidateProgramARB(JNIEnv *env, jclass clazz, jint programObj, jlong function_pointer) { + glValidateProgramARBPROC glValidateProgramARB = (glValidateProgramARBPROC)((intptr_t)function_pointer); + glValidateProgramARB(programObj); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform1fARB(JNIEnv *env, jclass clazz, jint location, jfloat v0, jlong function_pointer) { + glUniform1fARBPROC glUniform1fARB = (glUniform1fARBPROC)((intptr_t)function_pointer); + glUniform1fARB(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform2fARB(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jlong function_pointer) { + glUniform2fARBPROC glUniform2fARB = (glUniform2fARBPROC)((intptr_t)function_pointer); + glUniform2fARB(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform3fARB(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jfloat v2, jlong function_pointer) { + glUniform3fARBPROC glUniform3fARB = (glUniform3fARBPROC)((intptr_t)function_pointer); + glUniform3fARB(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform4fARB(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3, jlong function_pointer) { + glUniform4fARBPROC glUniform4fARB = (glUniform4fARBPROC)((intptr_t)function_pointer); + glUniform4fARB(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform1iARB(JNIEnv *env, jclass clazz, jint location, jint v0, jlong function_pointer) { + glUniform1iARBPROC glUniform1iARB = (glUniform1iARBPROC)((intptr_t)function_pointer); + glUniform1iARB(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform2iARB(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jlong function_pointer) { + glUniform2iARBPROC glUniform2iARB = (glUniform2iARBPROC)((intptr_t)function_pointer); + glUniform2iARB(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform3iARB(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glUniform3iARBPROC glUniform3iARB = (glUniform3iARBPROC)((intptr_t)function_pointer); + glUniform3iARB(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform4iARB(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glUniform4iARBPROC glUniform4iARB = (glUniform4iARBPROC)((intptr_t)function_pointer); + glUniform4iARB(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform1fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform1fvARBPROC glUniform1fvARB = (glUniform1fvARBPROC)((intptr_t)function_pointer); + glUniform1fvARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform2fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform2fvARBPROC glUniform2fvARB = (glUniform2fvARBPROC)((intptr_t)function_pointer); + glUniform2fvARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform3fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform3fvARBPROC glUniform3fvARB = (glUniform3fvARBPROC)((intptr_t)function_pointer); + glUniform3fvARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform4fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform4fvARBPROC glUniform4fvARB = (glUniform4fvARBPROC)((intptr_t)function_pointer); + glUniform4fvARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform1ivARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform1ivARBPROC glUniform1ivARB = (glUniform1ivARBPROC)((intptr_t)function_pointer); + glUniform1ivARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform2ivARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform2ivARBPROC glUniform2ivARB = (glUniform2ivARBPROC)((intptr_t)function_pointer); + glUniform2ivARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform3ivARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform3ivARBPROC glUniform3ivARB = (glUniform3ivARBPROC)((intptr_t)function_pointer); + glUniform3ivARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniform4ivARB(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform4ivARBPROC glUniform4ivARB = (glUniform4ivARBPROC)((intptr_t)function_pointer); + glUniform4ivARB(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniformMatrix2fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix2fvARBPROC glUniformMatrix2fvARB = (glUniformMatrix2fvARBPROC)((intptr_t)function_pointer); + glUniformMatrix2fvARB(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniformMatrix3fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix3fvARBPROC glUniformMatrix3fvARB = (glUniformMatrix3fvARBPROC)((intptr_t)function_pointer); + glUniformMatrix3fvARB(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglUniformMatrix4fvARB(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix4fvARBPROC glUniformMatrix4fvARB = (glUniformMatrix4fvARBPROC)((intptr_t)function_pointer); + glUniformMatrix4fvARB(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetObjectParameterfvARB(JNIEnv *env, jclass clazz, jint obj, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetObjectParameterfvARBPROC glGetObjectParameterfvARB = (glGetObjectParameterfvARBPROC)((intptr_t)function_pointer); + glGetObjectParameterfvARB(obj, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetObjectParameterivARB(JNIEnv *env, jclass clazz, jint obj, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetObjectParameterivARBPROC glGetObjectParameterivARB = (glGetObjectParameterivARBPROC)((intptr_t)function_pointer); + glGetObjectParameterivARB(obj, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetInfoLogARB(JNIEnv *env, jclass clazz, jint obj, jint maxLength, jlong length, jlong infoLog, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLcharARB *infoLog_address = (GLcharARB *)(intptr_t)infoLog; + glGetInfoLogARBPROC glGetInfoLogARB = (glGetInfoLogARBPROC)((intptr_t)function_pointer); + glGetInfoLogARB(obj, maxLength, length_address, infoLog_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetAttachedObjectsARB(JNIEnv *env, jclass clazz, jint containerObj, jint maxCount, jlong count, jlong obj, jlong function_pointer) { + GLsizei *count_address = (GLsizei *)(intptr_t)count; + GLhandleARB *obj_address = (GLhandleARB *)(intptr_t)obj; + glGetAttachedObjectsARBPROC glGetAttachedObjectsARB = (glGetAttachedObjectsARBPROC)((intptr_t)function_pointer); + glGetAttachedObjectsARB(containerObj, maxCount, count_address, obj_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetUniformLocationARB(JNIEnv *env, jclass clazz, jint programObj, jlong name, jlong function_pointer) { + const GLcharARB *name_address = (const GLcharARB *)(intptr_t)name; + glGetUniformLocationARBPROC glGetUniformLocationARB = (glGetUniformLocationARBPROC)((intptr_t)function_pointer); + GLint __result = glGetUniformLocationARB(programObj, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetActiveUniformARB(JNIEnv *env, jclass clazz, jint programObj, jint index, jint maxLength, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *size_address = (GLint *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLcharARB *name_address = (GLcharARB *)(intptr_t)name; + glGetActiveUniformARBPROC glGetActiveUniformARB = (glGetActiveUniformARBPROC)((intptr_t)function_pointer); + glGetActiveUniformARB(programObj, index, maxLength, length_address, size_address, type_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetUniformfvARB(JNIEnv *env, jclass clazz, jint programObj, jint location, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetUniformfvARBPROC glGetUniformfvARB = (glGetUniformfvARBPROC)((intptr_t)function_pointer); + glGetUniformfvARB(programObj, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetUniformivARB(JNIEnv *env, jclass clazz, jint programObj, jint location, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetUniformivARBPROC glGetUniformivARB = (glGetUniformivARBPROC)((intptr_t)function_pointer); + glGetUniformivARB(programObj, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShaderObjects_nglGetShaderSourceARB(JNIEnv *env, jclass clazz, jint obj, jint maxLength, jlong length, jlong source, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLcharARB *source_address = (GLcharARB *)(intptr_t)source; + glGetShaderSourceARBPROC glGetShaderSourceARB = (glGetShaderSourceARBPROC)((intptr_t)function_pointer); + glGetShaderSourceARB(obj, maxLength, length_address, source_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShadingLanguageInclude.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShadingLanguageInclude.c new file mode 100644 index 0000000..68c31ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBShadingLanguageInclude.c @@ -0,0 +1,81 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glNamedStringARBPROC) (GLenum type, GLint namelen, const GLchar * name, GLint stringlen, const GLchar * string); +typedef void (APIENTRY *glDeleteNamedStringARBPROC) (GLint namelen, const GLchar * name); +typedef void (APIENTRY *glCompileShaderIncludeARBPROC) (GLuint shader, GLsizei count, const GLchar ** path, const GLint * length); +typedef GLboolean (APIENTRY *glIsNamedStringARBPROC) (GLint namelen, const GLchar * name); +typedef void (APIENTRY *glGetNamedStringARBPROC) (GLint namelen, const GLchar * name, GLsizei bufSize, GLint * stringlen, GLchar * string); +typedef void (APIENTRY *glGetNamedStringivARBPROC) (GLint namelen, const GLchar * name, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglNamedStringARB(JNIEnv *env, jclass clazz, jint type, jint namelen, jlong name, jint stringlen, jlong string, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + const GLchar *string_address = (const GLchar *)(intptr_t)string; + glNamedStringARBPROC glNamedStringARB = (glNamedStringARBPROC)((intptr_t)function_pointer); + glNamedStringARB(type, namelen, name_address, stringlen, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglDeleteNamedStringARB(JNIEnv *env, jclass clazz, jint namelen, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glDeleteNamedStringARBPROC glDeleteNamedStringARB = (glDeleteNamedStringARBPROC)((intptr_t)function_pointer); + glDeleteNamedStringARB(namelen, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglCompileShaderIncludeARB(JNIEnv *env, jclass clazz, jint shader, jint count, jlong path, jlong length, jlong function_pointer) { + const GLchar *path_address = (const GLchar *)(intptr_t)path; + int _str_i; + GLchar *_str_address; + GLchar **path_str = (GLchar **) malloc(count * sizeof(GLchar *)); + const GLint *length_address = (const GLint *)(intptr_t)length; + glCompileShaderIncludeARBPROC glCompileShaderIncludeARB = (glCompileShaderIncludeARBPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)path_address; + while ( _str_i < count ) { + path_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glCompileShaderIncludeARB(shader, count, (const GLchar **)path_str, length_address); + free(path_str); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglCompileShaderIncludeARB2(JNIEnv *env, jclass clazz, jint shader, jint count, jlong path, jlong length, jlong function_pointer) { + const GLchar *path_address = (const GLchar *)(intptr_t)path; + int _str_i; + GLchar *_str_address; + GLchar **path_str = (GLchar **) malloc(count * sizeof(GLchar *)); + const GLint *length_address = (const GLint *)(intptr_t)length; + glCompileShaderIncludeARBPROC glCompileShaderIncludeARB = (glCompileShaderIncludeARBPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)path_address; + while ( _str_i < count ) { + path_str[_str_i] = _str_address; + _str_address += length_address[_str_i++]; + } + glCompileShaderIncludeARB(shader, count, (const GLchar **)path_str, length_address); + free(path_str); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglIsNamedStringARB(JNIEnv *env, jclass clazz, jint namelen, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glIsNamedStringARBPROC glIsNamedStringARB = (glIsNamedStringARBPROC)((intptr_t)function_pointer); + GLboolean __result = glIsNamedStringARB(namelen, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglGetNamedStringARB(JNIEnv *env, jclass clazz, jint namelen, jlong name, jint bufSize, jlong stringlen, jlong string, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + GLint *stringlen_address = (GLint *)(intptr_t)stringlen; + GLchar *string_address = (GLchar *)(intptr_t)string; + glGetNamedStringARBPROC glGetNamedStringARB = (glGetNamedStringARBPROC)((intptr_t)function_pointer); + glGetNamedStringARB(namelen, name_address, bufSize, stringlen_address, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBShadingLanguageInclude_nglGetNamedStringivARB(JNIEnv *env, jclass clazz, jint namelen, jlong name, jint pname, jlong params, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedStringivARBPROC glGetNamedStringivARB = (glGetNamedStringivARBPROC)((intptr_t)function_pointer); + glGetNamedStringivARB(namelen, name_address, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSparseTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSparseTexture.c new file mode 100644 index 0000000..921de08 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBSparseTexture.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexPageCommitmentARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (APIENTRY *glTexturePageCommitmentEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBSparseTexture_nglTexPageCommitmentARB(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jboolean commit, jlong function_pointer) { + glTexPageCommitmentARBPROC glTexPageCommitmentARB = (glTexPageCommitmentARBPROC)((intptr_t)function_pointer); + glTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBSparseTexture_nglTexturePageCommitmentEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jboolean commit, jlong function_pointer) { + glTexturePageCommitmentEXTPROC glTexturePageCommitmentEXT = (glTexturePageCommitmentEXTPROC)((intptr_t)function_pointer); + glTexturePageCommitmentEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, commit); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferObject.c new file mode 100644 index 0000000..f0a3d1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferObject.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexBufferARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureBufferObject_nglTexBufferARB(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint buffer, jlong function_pointer) { + glTexBufferARBPROC glTexBufferARB = (glTexBufferARBPROC)((intptr_t)function_pointer); + glTexBufferARB(target, internalformat, buffer); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferRange.c new file mode 100644 index 0000000..758b44b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureBufferRange.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTextureBufferRangeEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureBufferRange_nglTextureBufferRangeEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint internalformat, jint buffer, jlong offset, jlong size, jlong function_pointer) { + glTextureBufferRangeEXTPROC glTextureBufferRangeEXT = (glTextureBufferRangeEXTPROC)((intptr_t)function_pointer); + glTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureCompression.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureCompression.c new file mode 100644 index 0000000..133cf5a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureCompression.c @@ -0,0 +1,97 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glCompressedTexImage1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glCompressedTexImage2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glCompressedTexImage3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glCompressedTexSubImage1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glCompressedTexSubImage2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glCompressedTexSubImage3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * pData); +typedef void (APIENTRY *glGetCompressedTexImageARBPROC) (GLenum target, GLint lod, GLvoid * pImg); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage1DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexImage1DARBPROC glCompressedTexImage1DARB = (glCompressedTexImage1DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage1DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexImage1DARBPROC glCompressedTexImage1DARB = (glCompressedTexImage1DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage2DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexImage2DARBPROC glCompressedTexImage2DARB = (glCompressedTexImage2DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage2DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexImage2DARBPROC glCompressedTexImage2DARB = (glCompressedTexImage2DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage3DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexImage3DARBPROC glCompressedTexImage3DARB = (glCompressedTexImage3DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexImage3DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexImage3DARBPROC glCompressedTexImage3DARB = (glCompressedTexImage3DARBPROC)((intptr_t)function_pointer); + glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage1DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexSubImage1DARBPROC glCompressedTexSubImage1DARB = (glCompressedTexSubImage1DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage1DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexSubImage1DARBPROC glCompressedTexSubImage1DARB = (glCompressedTexSubImage1DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage2DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexSubImage2DARBPROC glCompressedTexSubImage2DARB = (glCompressedTexSubImage2DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage2DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexSubImage2DARBPROC glCompressedTexSubImage2DARB = (glCompressedTexSubImage2DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage3DARB(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong pData, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)pData; + glCompressedTexSubImage3DARBPROC glCompressedTexSubImage3DARB = (glCompressedTexSubImage3DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglCompressedTexSubImage3DARBBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong pData_buffer_offset, jlong function_pointer) { + const GLvoid *pData_address = (const GLvoid *)(intptr_t)offsetToPointer(pData_buffer_offset); + glCompressedTexSubImage3DARBPROC glCompressedTexSubImage3DARB = (glCompressedTexSubImage3DARBPROC)((intptr_t)function_pointer); + glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglGetCompressedTexImageARB(JNIEnv *env, jclass clazz, jint target, jint lod, jlong pImg, jlong function_pointer) { + GLvoid *pImg_address = (GLvoid *)(intptr_t)pImg; + glGetCompressedTexImageARBPROC glGetCompressedTexImageARB = (glGetCompressedTexImageARBPROC)((intptr_t)function_pointer); + glGetCompressedTexImageARB(target, lod, pImg_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureCompression_nglGetCompressedTexImageARBBO(JNIEnv *env, jclass clazz, jint target, jint lod, jlong pImg_buffer_offset, jlong function_pointer) { + GLvoid *pImg_address = (GLvoid *)(intptr_t)offsetToPointer(pImg_buffer_offset); + glGetCompressedTexImageARBPROC glGetCompressedTexImageARB = (glGetCompressedTexImageARBPROC)((intptr_t)function_pointer); + glGetCompressedTexImageARB(target, lod, pImg_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorage.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorage.c new file mode 100644 index 0000000..e188ca2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorage.c @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTextureStorage1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRY *glTextureStorage2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glTextureStorage3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureStorage_nglTextureStorage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width, jlong function_pointer) { + glTextureStorage1DEXTPROC glTextureStorage1DEXT = (glTextureStorage1DEXTPROC)((intptr_t)function_pointer); + glTextureStorage1DEXT(texture, target, levels, internalformat, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureStorage_nglTextureStorage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width, jint height, jlong function_pointer) { + glTextureStorage2DEXTPROC glTextureStorage2DEXT = (glTextureStorage2DEXTPROC)((intptr_t)function_pointer); + glTextureStorage2DEXT(texture, target, levels, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureStorage_nglTextureStorage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width, jint height, jint depth, jlong function_pointer) { + glTextureStorage3DEXTPROC glTextureStorage3DEXT = (glTextureStorage3DEXTPROC)((intptr_t)function_pointer); + glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorageMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorageMultisample.c new file mode 100644 index 0000000..74e87d4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTextureStorageMultisample.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTextureStorage2DMultisampleEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRY *glTextureStorage3DMultisampleEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureStorageMultisample_nglTextureStorage2DMultisampleEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint samples, jint internalformat, jint width, jint height, jboolean fixedsamplelocations, jlong function_pointer) { + glTextureStorage2DMultisampleEXTPROC glTextureStorage2DMultisampleEXT = (glTextureStorage2DMultisampleEXTPROC)((intptr_t)function_pointer); + glTextureStorage2DMultisampleEXT(texture, target, samples, internalformat, width, height, fixedsamplelocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTextureStorageMultisample_nglTextureStorage3DMultisampleEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint samples, jint internalformat, jint width, jint height, jint depth, jboolean fixedsamplelocations, jlong function_pointer) { + glTextureStorage3DMultisampleEXTPROC glTextureStorage3DMultisampleEXT = (glTextureStorage3DMultisampleEXTPROC)((intptr_t)function_pointer); + glTextureStorage3DMultisampleEXT(texture, target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTransposeMatrix.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTransposeMatrix.c new file mode 100644 index 0000000..b945419 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBTransposeMatrix.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glLoadTransposeMatrixfARBPROC) (const GLfloat * pfMtx); +typedef void (APIENTRY *glMultTransposeMatrixfARBPROC) (const GLfloat * pfMtx); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTransposeMatrix_nglLoadTransposeMatrixfARB(JNIEnv *env, jclass clazz, jlong pfMtx, jlong function_pointer) { + const GLfloat *pfMtx_address = (const GLfloat *)(intptr_t)pfMtx; + glLoadTransposeMatrixfARBPROC glLoadTransposeMatrixfARB = (glLoadTransposeMatrixfARBPROC)((intptr_t)function_pointer); + glLoadTransposeMatrixfARB(pfMtx_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBTransposeMatrix_nglMultTransposeMatrixfARB(JNIEnv *env, jclass clazz, jlong pfMtx, jlong function_pointer) { + const GLfloat *pfMtx_address = (const GLfloat *)(intptr_t)pfMtx; + glMultTransposeMatrixfARBPROC glMultTransposeMatrixfARB = (glMultTransposeMatrixfARBPROC)((intptr_t)function_pointer); + glMultTransposeMatrixfARB(pfMtx_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexAttrib64bit.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexAttrib64bit.c new file mode 100644 index 0000000..31eb33c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexAttrib64bit.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexArrayVertexAttribLOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexAttrib64bit_nglVertexArrayVertexAttribLOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint index, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayVertexAttribLOffsetEXTPROC glVertexArrayVertexAttribLOffsetEXT = (glVertexArrayVertexAttribLOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexBlend.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexBlend.c new file mode 100644 index 0000000..4e2d26d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexBlend.c @@ -0,0 +1,81 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glWeightbvARBPROC) (GLint size, GLbyte * pWeights); +typedef void (APIENTRY *glWeightsvARBPROC) (GLint size, GLshort * pWeights); +typedef void (APIENTRY *glWeightivARBPROC) (GLint size, GLint * pWeights); +typedef void (APIENTRY *glWeightfvARBPROC) (GLint size, GLfloat * pWeights); +typedef void (APIENTRY *glWeightdvARBPROC) (GLint size, GLdouble * pWeights); +typedef void (APIENTRY *glWeightubvARBPROC) (GLint size, GLubyte * pWeights); +typedef void (APIENTRY *glWeightusvARBPROC) (GLint size, GLushort * pWeights); +typedef void (APIENTRY *glWeightuivARBPROC) (GLint size, GLuint * pWeights); +typedef void (APIENTRY *glWeightPointerARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pPointer); +typedef void (APIENTRY *glVertexBlendARBPROC) (GLint count); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightbvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLbyte *pWeights_address = (GLbyte *)(intptr_t)pWeights; + glWeightbvARBPROC glWeightbvARB = (glWeightbvARBPROC)((intptr_t)function_pointer); + glWeightbvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightsvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLshort *pWeights_address = (GLshort *)(intptr_t)pWeights; + glWeightsvARBPROC glWeightsvARB = (glWeightsvARBPROC)((intptr_t)function_pointer); + glWeightsvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightivARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLint *pWeights_address = (GLint *)(intptr_t)pWeights; + glWeightivARBPROC glWeightivARB = (glWeightivARBPROC)((intptr_t)function_pointer); + glWeightivARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightfvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLfloat *pWeights_address = (GLfloat *)(intptr_t)pWeights; + glWeightfvARBPROC glWeightfvARB = (glWeightfvARBPROC)((intptr_t)function_pointer); + glWeightfvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightdvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLdouble *pWeights_address = (GLdouble *)(intptr_t)pWeights; + glWeightdvARBPROC glWeightdvARB = (glWeightdvARBPROC)((intptr_t)function_pointer); + glWeightdvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightubvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLubyte *pWeights_address = (GLubyte *)(intptr_t)pWeights; + glWeightubvARBPROC glWeightubvARB = (glWeightubvARBPROC)((intptr_t)function_pointer); + glWeightubvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightusvARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLushort *pWeights_address = (GLushort *)(intptr_t)pWeights; + glWeightusvARBPROC glWeightusvARB = (glWeightusvARBPROC)((intptr_t)function_pointer); + glWeightusvARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightuivARB(JNIEnv *env, jclass clazz, jint size, jlong pWeights, jlong function_pointer) { + GLuint *pWeights_address = (GLuint *)(intptr_t)pWeights; + glWeightuivARBPROC glWeightuivARB = (glWeightuivARBPROC)((intptr_t)function_pointer); + glWeightuivARB(size, pWeights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightPointerARB(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glWeightPointerARBPROC glWeightPointerARB = (glWeightPointerARBPROC)((intptr_t)function_pointer); + glWeightPointerARB(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglWeightPointerARBBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer_buffer_offset, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pPointer_buffer_offset); + glWeightPointerARBPROC glWeightPointerARB = (glWeightPointerARBPROC)((intptr_t)function_pointer); + glWeightPointerARB(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexBlend_nglVertexBlendARB(JNIEnv *env, jclass clazz, jint count, jlong function_pointer) { + glVertexBlendARBPROC glVertexBlendARB = (glVertexBlendARBPROC)((intptr_t)function_pointer); + glVertexBlendARB(count); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexShader.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexShader.c new file mode 100644 index 0000000..728c6fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBVertexShader.c @@ -0,0 +1,163 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttrib1sARBPROC) (GLuint index, GLshort v0); +typedef void (APIENTRY *glVertexAttrib1fARBPROC) (GLuint index, GLfloat v0); +typedef void (APIENTRY *glVertexAttrib1dARBPROC) (GLuint index, GLdouble v0); +typedef void (APIENTRY *glVertexAttrib2sARBPROC) (GLuint index, GLshort v0, GLshort v1); +typedef void (APIENTRY *glVertexAttrib2fARBPROC) (GLuint index, GLfloat v0, GLfloat v1); +typedef void (APIENTRY *glVertexAttrib2dARBPROC) (GLuint index, GLdouble v0, GLdouble v1); +typedef void (APIENTRY *glVertexAttrib3sARBPROC) (GLuint index, GLshort v0, GLshort v1, GLshort v2); +typedef void (APIENTRY *glVertexAttrib3fARBPROC) (GLuint index, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glVertexAttrib3dARBPROC) (GLuint index, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRY *glVertexAttrib4sARBPROC) (GLuint index, GLshort v0, GLshort v1, GLshort v2, GLshort v3); +typedef void (APIENTRY *glVertexAttrib4fARBPROC) (GLuint index, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRY *glVertexAttrib4dARBPROC) (GLuint index, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRY *glVertexAttrib4NubARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRY *glVertexAttribPointerARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * buffer); +typedef void (APIENTRY *glEnableVertexAttribArrayARBPROC) (GLuint index); +typedef void (APIENTRY *glDisableVertexAttribArrayARBPROC) (GLuint index); +typedef void (APIENTRY *glBindAttribLocationARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB * name); +typedef void (APIENTRY *glGetActiveAttribARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef GLint (APIENTRY *glGetAttribLocationARBPROC) (GLhandleARB programObj, const GLcharARB * name); +typedef void (APIENTRY *glGetVertexAttribfvARBPROC) (GLuint index, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetVertexAttribdvARBPROC) (GLuint index, GLenum pname, GLdouble * params); +typedef void (APIENTRY *glGetVertexAttribivARBPROC) (GLuint index, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVertexAttribPointervARBPROC) (GLuint index, GLenum pname, GLvoid ** result); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib1sARB(JNIEnv *env, jclass clazz, jint index, jshort v0, jlong function_pointer) { + glVertexAttrib1sARBPROC glVertexAttrib1sARB = (glVertexAttrib1sARBPROC)((intptr_t)function_pointer); + glVertexAttrib1sARB(index, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib1fARB(JNIEnv *env, jclass clazz, jint index, jfloat v0, jlong function_pointer) { + glVertexAttrib1fARBPROC glVertexAttrib1fARB = (glVertexAttrib1fARBPROC)((intptr_t)function_pointer); + glVertexAttrib1fARB(index, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib1dARB(JNIEnv *env, jclass clazz, jint index, jdouble v0, jlong function_pointer) { + glVertexAttrib1dARBPROC glVertexAttrib1dARB = (glVertexAttrib1dARBPROC)((intptr_t)function_pointer); + glVertexAttrib1dARB(index, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib2sARB(JNIEnv *env, jclass clazz, jint index, jshort v0, jshort v1, jlong function_pointer) { + glVertexAttrib2sARBPROC glVertexAttrib2sARB = (glVertexAttrib2sARBPROC)((intptr_t)function_pointer); + glVertexAttrib2sARB(index, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib2fARB(JNIEnv *env, jclass clazz, jint index, jfloat v0, jfloat v1, jlong function_pointer) { + glVertexAttrib2fARBPROC glVertexAttrib2fARB = (glVertexAttrib2fARBPROC)((intptr_t)function_pointer); + glVertexAttrib2fARB(index, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib2dARB(JNIEnv *env, jclass clazz, jint index, jdouble v0, jdouble v1, jlong function_pointer) { + glVertexAttrib2dARBPROC glVertexAttrib2dARB = (glVertexAttrib2dARBPROC)((intptr_t)function_pointer); + glVertexAttrib2dARB(index, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib3sARB(JNIEnv *env, jclass clazz, jint index, jshort v0, jshort v1, jshort v2, jlong function_pointer) { + glVertexAttrib3sARBPROC glVertexAttrib3sARB = (glVertexAttrib3sARBPROC)((intptr_t)function_pointer); + glVertexAttrib3sARB(index, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib3fARB(JNIEnv *env, jclass clazz, jint index, jfloat v0, jfloat v1, jfloat v2, jlong function_pointer) { + glVertexAttrib3fARBPROC glVertexAttrib3fARB = (glVertexAttrib3fARBPROC)((intptr_t)function_pointer); + glVertexAttrib3fARB(index, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib3dARB(JNIEnv *env, jclass clazz, jint index, jdouble v0, jdouble v1, jdouble v2, jlong function_pointer) { + glVertexAttrib3dARBPROC glVertexAttrib3dARB = (glVertexAttrib3dARBPROC)((intptr_t)function_pointer); + glVertexAttrib3dARB(index, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib4sARB(JNIEnv *env, jclass clazz, jint index, jshort v0, jshort v1, jshort v2, jshort v3, jlong function_pointer) { + glVertexAttrib4sARBPROC glVertexAttrib4sARB = (glVertexAttrib4sARBPROC)((intptr_t)function_pointer); + glVertexAttrib4sARB(index, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib4fARB(JNIEnv *env, jclass clazz, jint index, jfloat v0, jfloat v1, jfloat v2, jfloat v3, jlong function_pointer) { + glVertexAttrib4fARBPROC glVertexAttrib4fARB = (glVertexAttrib4fARBPROC)((intptr_t)function_pointer); + glVertexAttrib4fARB(index, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib4dARB(JNIEnv *env, jclass clazz, jint index, jdouble v0, jdouble v1, jdouble v2, jdouble v3, jlong function_pointer) { + glVertexAttrib4dARBPROC glVertexAttrib4dARB = (glVertexAttrib4dARBPROC)((intptr_t)function_pointer); + glVertexAttrib4dARB(index, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttrib4NubARB(JNIEnv *env, jclass clazz, jint index, jbyte x, jbyte y, jbyte z, jbyte w, jlong function_pointer) { + glVertexAttrib4NubARBPROC glVertexAttrib4NubARB = (glVertexAttrib4NubARBPROC)((intptr_t)function_pointer); + glVertexAttrib4NubARB(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttribPointerARB(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribPointerARBPROC glVertexAttribPointerARB = (glVertexAttribPointerARBPROC)((intptr_t)function_pointer); + glVertexAttribPointerARB(index, size, type, normalized, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglVertexAttribPointerARBBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer_buffer_offset, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribPointerARBPROC glVertexAttribPointerARB = (glVertexAttribPointerARBPROC)((intptr_t)function_pointer); + glVertexAttribPointerARB(index, size, type, normalized, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglEnableVertexAttribArrayARB(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glEnableVertexAttribArrayARBPROC glEnableVertexAttribArrayARB = (glEnableVertexAttribArrayARBPROC)((intptr_t)function_pointer); + glEnableVertexAttribArrayARB(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglDisableVertexAttribArrayARB(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glDisableVertexAttribArrayARBPROC glDisableVertexAttribArrayARB = (glDisableVertexAttribArrayARBPROC)((intptr_t)function_pointer); + glDisableVertexAttribArrayARB(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglBindAttribLocationARB(JNIEnv *env, jclass clazz, jint programObj, jint index, jlong name, jlong function_pointer) { + const GLcharARB *name_address = (const GLcharARB *)(intptr_t)name; + glBindAttribLocationARBPROC glBindAttribLocationARB = (glBindAttribLocationARBPROC)((intptr_t)function_pointer); + glBindAttribLocationARB(programObj, index, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetActiveAttribARB(JNIEnv *env, jclass clazz, jint programObj, jint index, jint maxLength, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *size_address = (GLint *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLcharARB *name_address = (GLcharARB *)(intptr_t)name; + glGetActiveAttribARBPROC glGetActiveAttribARB = (glGetActiveAttribARBPROC)((intptr_t)function_pointer); + glGetActiveAttribARB(programObj, index, maxLength, length_address, size_address, type_address, name_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetAttribLocationARB(JNIEnv *env, jclass clazz, jint programObj, jlong name, jlong function_pointer) { + const GLcharARB *name_address = (const GLcharARB *)(intptr_t)name; + glGetAttribLocationARBPROC glGetAttribLocationARB = (glGetAttribLocationARBPROC)((intptr_t)function_pointer); + GLint __result = glGetAttribLocationARB(programObj, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetVertexAttribfvARB(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVertexAttribfvARBPROC glGetVertexAttribfvARB = (glGetVertexAttribfvARBPROC)((intptr_t)function_pointer); + glGetVertexAttribfvARB(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetVertexAttribdvARB(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVertexAttribdvARBPROC glGetVertexAttribdvARB = (glGetVertexAttribdvARBPROC)((intptr_t)function_pointer); + glGetVertexAttribdvARB(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetVertexAttribivARB(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribivARBPROC glGetVertexAttribivARB = (glGetVertexAttribivARBPROC)((intptr_t)function_pointer); + glGetVertexAttribivARB(index, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_ARBVertexShader_nglGetVertexAttribPointervARB(JNIEnv *env, jclass clazz, jint index, jint pname, jlong result_size, jlong function_pointer) { + glGetVertexAttribPointervARBPROC glGetVertexAttribPointervARB = (glGetVertexAttribPointervARBPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVertexAttribPointervARB(index, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBWindowPos.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBWindowPos.c new file mode 100644 index 0000000..68862db --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ARBWindowPos.c @@ -0,0 +1,54 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glWindowPos2fARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY *glWindowPos2dARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY *glWindowPos2iARBPROC) (GLint x, GLint y); +typedef void (APIENTRY *glWindowPos2sARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRY *glWindowPos3fARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glWindowPos3dARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glWindowPos3iARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRY *glWindowPos3sARBPROC) (GLshort x, GLshort y, GLshort z); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos2fARB(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jlong function_pointer) { + glWindowPos2fARBPROC glWindowPos2fARB = (glWindowPos2fARBPROC)((intptr_t)function_pointer); + glWindowPos2fARB(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos2dARB(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jlong function_pointer) { + glWindowPos2dARBPROC glWindowPos2dARB = (glWindowPos2dARBPROC)((intptr_t)function_pointer); + glWindowPos2dARB(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos2iARB(JNIEnv *env, jclass clazz, jint x, jint y, jlong function_pointer) { + glWindowPos2iARBPROC glWindowPos2iARB = (glWindowPos2iARBPROC)((intptr_t)function_pointer); + glWindowPos2iARB(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos2sARB(JNIEnv *env, jclass clazz, jshort x, jshort y, jlong function_pointer) { + glWindowPos2sARBPROC glWindowPos2sARB = (glWindowPos2sARBPROC)((intptr_t)function_pointer); + glWindowPos2sARB(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos3fARB(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glWindowPos3fARBPROC glWindowPos3fARB = (glWindowPos3fARBPROC)((intptr_t)function_pointer); + glWindowPos3fARB(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos3dARB(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glWindowPos3dARBPROC glWindowPos3dARB = (glWindowPos3dARBPROC)((intptr_t)function_pointer); + glWindowPos3dARB(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos3iARB(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jlong function_pointer) { + glWindowPos3iARBPROC glWindowPos3iARB = (glWindowPos3iARBPROC)((intptr_t)function_pointer); + glWindowPos3iARB(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBWindowPos_nglWindowPos3sARB(JNIEnv *env, jclass clazz, jshort x, jshort y, jshort z, jlong function_pointer) { + glWindowPos3sARBPROC glWindowPos3sARB = (glWindowPos3sARBPROC)((intptr_t)function_pointer); + glWindowPos3sARB(x, y, z); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIDrawBuffers.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIDrawBuffers.c new file mode 100644 index 0000000..48b900a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIDrawBuffers.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawBuffersATIPROC) (GLsizei size, const GLenum * buffers); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIDrawBuffers_nglDrawBuffersATI(JNIEnv *env, jclass clazz, jint size, jlong buffers, jlong function_pointer) { + const GLenum *buffers_address = (const GLenum *)(intptr_t)buffers; + glDrawBuffersATIPROC glDrawBuffersATI = (glDrawBuffersATIPROC)((intptr_t)function_pointer); + glDrawBuffersATI(size, buffers_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIElementArray.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIElementArray.c new file mode 100644 index 0000000..7598486 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIElementArray.c @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glElementPointerATIPROC) (GLenum type, const GLvoid * pPointer); +typedef void (APIENTRY *glDrawElementArrayATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRY *glDrawRangeElementArrayATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIElementArray_nglElementPointerATI(JNIEnv *env, jclass clazz, jint type, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glElementPointerATIPROC glElementPointerATI = (glElementPointerATIPROC)((intptr_t)function_pointer); + glElementPointerATI(type, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIElementArray_nglDrawElementArrayATI(JNIEnv *env, jclass clazz, jint mode, jint count, jlong function_pointer) { + glDrawElementArrayATIPROC glDrawElementArrayATI = (glDrawElementArrayATIPROC)((intptr_t)function_pointer); + glDrawElementArrayATI(mode, count); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIElementArray_nglDrawRangeElementArrayATI(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jlong function_pointer) { + glDrawRangeElementArrayATIPROC glDrawRangeElementArrayATI = (glDrawRangeElementArrayATIPROC)((intptr_t)function_pointer); + glDrawRangeElementArrayATI(mode, start, end, count); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIEnvmapBumpmap.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIEnvmapBumpmap.c new file mode 100644 index 0000000..b13211b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIEnvmapBumpmap.c @@ -0,0 +1,34 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexBumpParameterfvATIPROC) (GLenum pname, const GLfloat * param); +typedef void (APIENTRY *glTexBumpParameterivATIPROC) (GLenum pname, const GLint * param); +typedef void (APIENTRY *glGetTexBumpParameterfvATIPROC) (GLenum pname, GLfloat * param); +typedef void (APIENTRY *glGetTexBumpParameterivATIPROC) (GLenum pname, GLint * param); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIEnvmapBumpmap_nglTexBumpParameterfvATI(JNIEnv *env, jclass clazz, jint pname, jlong param, jlong function_pointer) { + const GLfloat *param_address = (const GLfloat *)(intptr_t)param; + glTexBumpParameterfvATIPROC glTexBumpParameterfvATI = (glTexBumpParameterfvATIPROC)((intptr_t)function_pointer); + glTexBumpParameterfvATI(pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIEnvmapBumpmap_nglTexBumpParameterivATI(JNIEnv *env, jclass clazz, jint pname, jlong param, jlong function_pointer) { + const GLint *param_address = (const GLint *)(intptr_t)param; + glTexBumpParameterivATIPROC glTexBumpParameterivATI = (glTexBumpParameterivATIPROC)((intptr_t)function_pointer); + glTexBumpParameterivATI(pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIEnvmapBumpmap_nglGetTexBumpParameterfvATI(JNIEnv *env, jclass clazz, jint pname, jlong param, jlong function_pointer) { + GLfloat *param_address = (GLfloat *)(intptr_t)param; + glGetTexBumpParameterfvATIPROC glGetTexBumpParameterfvATI = (glGetTexBumpParameterfvATIPROC)((intptr_t)function_pointer); + glGetTexBumpParameterfvATI(pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIEnvmapBumpmap_nglGetTexBumpParameterivATI(JNIEnv *env, jclass clazz, jint pname, jlong param, jlong function_pointer) { + GLint *param_address = (GLint *)(intptr_t)param; + glGetTexBumpParameterivATIPROC glGetTexBumpParameterivATI = (glGetTexBumpParameterivATIPROC)((intptr_t)function_pointer); + glGetTexBumpParameterivATI(pname, param_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIFragmentShader.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIFragmentShader.c new file mode 100644 index 0000000..abe1cf1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIFragmentShader.c @@ -0,0 +1,92 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLuint (APIENTRY *glGenFragmentShadersATIPROC) (GLuint range); +typedef void (APIENTRY *glBindFragmentShaderATIPROC) (GLuint id); +typedef void (APIENTRY *glDeleteFragmentShaderATIPROC) (GLuint id); +typedef void (APIENTRY *glBeginFragmentShaderATIPROC) (); +typedef void (APIENTRY *glEndFragmentShaderATIPROC) (); +typedef void (APIENTRY *glPassTexCoordATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRY *glSampleMapATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRY *glColorFragmentOp1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRY *glColorFragmentOp2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRY *glColorFragmentOp3ATIPROC) (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 (APIENTRY *glAlphaFragmentOp1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRY *glAlphaFragmentOp2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRY *glAlphaFragmentOp3ATIPROC) (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 (APIENTRY *glSetFragmentShaderConstantATIPROC) (GLuint dst, const GLfloat * pfValue); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglGenFragmentShadersATI(JNIEnv *env, jclass clazz, jint range, jlong function_pointer) { + glGenFragmentShadersATIPROC glGenFragmentShadersATI = (glGenFragmentShadersATIPROC)((intptr_t)function_pointer); + GLuint __result = glGenFragmentShadersATI(range); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglBindFragmentShaderATI(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glBindFragmentShaderATIPROC glBindFragmentShaderATI = (glBindFragmentShaderATIPROC)((intptr_t)function_pointer); + glBindFragmentShaderATI(id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglDeleteFragmentShaderATI(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glDeleteFragmentShaderATIPROC glDeleteFragmentShaderATI = (glDeleteFragmentShaderATIPROC)((intptr_t)function_pointer); + glDeleteFragmentShaderATI(id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglBeginFragmentShaderATI(JNIEnv *env, jclass clazz, jlong function_pointer) { + glBeginFragmentShaderATIPROC glBeginFragmentShaderATI = (glBeginFragmentShaderATIPROC)((intptr_t)function_pointer); + glBeginFragmentShaderATI(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglEndFragmentShaderATI(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndFragmentShaderATIPROC glEndFragmentShaderATI = (glEndFragmentShaderATIPROC)((intptr_t)function_pointer); + glEndFragmentShaderATI(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglPassTexCoordATI(JNIEnv *env, jclass clazz, jint dst, jint coord, jint swizzle, jlong function_pointer) { + glPassTexCoordATIPROC glPassTexCoordATI = (glPassTexCoordATIPROC)((intptr_t)function_pointer); + glPassTexCoordATI(dst, coord, swizzle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglSampleMapATI(JNIEnv *env, jclass clazz, jint dst, jint interp, jint swizzle, jlong function_pointer) { + glSampleMapATIPROC glSampleMapATI = (glSampleMapATIPROC)((intptr_t)function_pointer); + glSampleMapATI(dst, interp, swizzle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglColorFragmentOp1ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMask, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jlong function_pointer) { + glColorFragmentOp1ATIPROC glColorFragmentOp1ATI = (glColorFragmentOp1ATIPROC)((intptr_t)function_pointer); + glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglColorFragmentOp2ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMask, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jint arg2, jint arg2Rep, jint arg2Mod, jlong function_pointer) { + glColorFragmentOp2ATIPROC glColorFragmentOp2ATI = (glColorFragmentOp2ATIPROC)((intptr_t)function_pointer); + glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglColorFragmentOp3ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMask, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jint arg2, jint arg2Rep, jint arg2Mod, jint arg3, jint arg3Rep, jint arg3Mod, jlong function_pointer) { + glColorFragmentOp3ATIPROC glColorFragmentOp3ATI = (glColorFragmentOp3ATIPROC)((intptr_t)function_pointer); + glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglAlphaFragmentOp1ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jlong function_pointer) { + glAlphaFragmentOp1ATIPROC glAlphaFragmentOp1ATI = (glAlphaFragmentOp1ATIPROC)((intptr_t)function_pointer); + glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglAlphaFragmentOp2ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jint arg2, jint arg2Rep, jint arg2Mod, jlong function_pointer) { + glAlphaFragmentOp2ATIPROC glAlphaFragmentOp2ATI = (glAlphaFragmentOp2ATIPROC)((intptr_t)function_pointer); + glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglAlphaFragmentOp3ATI(JNIEnv *env, jclass clazz, jint op, jint dst, jint dstMod, jint arg1, jint arg1Rep, jint arg1Mod, jint arg2, jint arg2Rep, jint arg2Mod, jint arg3, jint arg3Rep, jint arg3Mod, jlong function_pointer) { + glAlphaFragmentOp3ATIPROC glAlphaFragmentOp3ATI = (glAlphaFragmentOp3ATIPROC)((intptr_t)function_pointer); + glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIFragmentShader_nglSetFragmentShaderConstantATI(JNIEnv *env, jclass clazz, jint dst, jlong pfValue, jlong function_pointer) { + const GLfloat *pfValue_address = (const GLfloat *)(intptr_t)pfValue; + glSetFragmentShaderConstantATIPROC glSetFragmentShaderConstantATI = (glSetFragmentShaderConstantATIPROC)((intptr_t)function_pointer); + glSetFragmentShaderConstantATI(dst, pfValue_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIMapObjectBuffer.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIMapObjectBuffer.c new file mode 100644 index 0000000..6750891 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIMapObjectBuffer.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLvoid * (APIENTRY *glMapObjectBufferATIPROC) (GLuint buffer); +typedef void (APIENTRY *glUnmapObjectBufferATIPROC) (GLuint buffer); + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_ATIMapObjectBuffer_nglMapObjectBufferATI(JNIEnv *env, jclass clazz, jint buffer, jlong result_size, jobject old_buffer, jlong function_pointer) { + glMapObjectBufferATIPROC glMapObjectBufferATI = (glMapObjectBufferATIPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapObjectBufferATI(buffer); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIMapObjectBuffer_nglUnmapObjectBufferATI(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glUnmapObjectBufferATIPROC glUnmapObjectBufferATI = (glUnmapObjectBufferATIPROC)((intptr_t)function_pointer); + glUnmapObjectBufferATI(buffer); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIPnTriangles.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIPnTriangles.c new file mode 100644 index 0000000..fbf3819 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIPnTriangles.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPNTrianglesfATIPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPNTrianglesiATIPROC) (GLenum pname, GLint param); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIPnTriangles_nglPNTrianglesfATI(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPNTrianglesfATIPROC glPNTrianglesfATI = (glPNTrianglesfATIPROC)((intptr_t)function_pointer); + glPNTrianglesfATI(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIPnTriangles_nglPNTrianglesiATI(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glPNTrianglesiATIPROC glPNTrianglesiATI = (glPNTrianglesiATIPROC)((intptr_t)function_pointer); + glPNTrianglesiATI(pname, param); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATISeparateStencil.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATISeparateStencil.c new file mode 100644 index 0000000..ae1f2cd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATISeparateStencil.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glStencilOpSeparateATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRY *glStencilFuncSeparateATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATISeparateStencil_nglStencilOpSeparateATI(JNIEnv *env, jclass clazz, jint face, jint sfail, jint dpfail, jint dppass, jlong function_pointer) { + glStencilOpSeparateATIPROC glStencilOpSeparateATI = (glStencilOpSeparateATIPROC)((intptr_t)function_pointer); + glStencilOpSeparateATI(face, sfail, dpfail, dppass); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATISeparateStencil_nglStencilFuncSeparateATI(JNIEnv *env, jclass clazz, jint frontfunc, jint backfunc, jint ref, jint mask, jlong function_pointer) { + glStencilFuncSeparateATIPROC glStencilFuncSeparateATI = (glStencilFuncSeparateATIPROC)((intptr_t)function_pointer); + glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexArrayObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexArrayObject.c new file mode 100644 index 0000000..3a99ffd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexArrayObject.c @@ -0,0 +1,88 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLuint (APIENTRY *glNewObjectBufferATIPROC) (GLsizei size, const GLvoid * pPointer, GLenum usage); +typedef GLboolean (APIENTRY *glIsObjectBufferATIPROC) (GLuint buffer); +typedef void (APIENTRY *glUpdateObjectBufferATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pPointer, GLenum preserve); +typedef void (APIENTRY *glGetObjectBufferfvATIPROC) (GLuint buffer, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetObjectBufferivATIPROC) (GLuint buffer, GLenum pname, GLint * params); +typedef void (APIENTRY *glFreeObjectBufferATIPROC) (GLuint buffer); +typedef void (APIENTRY *glArrayObjectATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRY *glGetArrayObjectfvATIPROC) (GLenum array, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetArrayObjectivATIPROC) (GLenum array, GLenum pname, GLint * params); +typedef void (APIENTRY *glVariantArrayObjectATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRY *glGetVariantArrayObjectfvATIPROC) (GLuint id, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetVariantArrayObjectivATIPROC) (GLuint id, GLenum pname, GLint * params); + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglNewObjectBufferATI(JNIEnv *env, jclass clazz, jint size, jlong pPointer, jint usage, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glNewObjectBufferATIPROC glNewObjectBufferATI = (glNewObjectBufferATIPROC)((intptr_t)function_pointer); + GLuint __result = glNewObjectBufferATI(size, pPointer_address, usage); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglIsObjectBufferATI(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glIsObjectBufferATIPROC glIsObjectBufferATI = (glIsObjectBufferATIPROC)((intptr_t)function_pointer); + GLboolean __result = glIsObjectBufferATI(buffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglUpdateObjectBufferATI(JNIEnv *env, jclass clazz, jint buffer, jint offset, jint size, jlong pPointer, jint preserve, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glUpdateObjectBufferATIPROC glUpdateObjectBufferATI = (glUpdateObjectBufferATIPROC)((intptr_t)function_pointer); + glUpdateObjectBufferATI(buffer, offset, size, pPointer_address, preserve); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetObjectBufferfvATI(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetObjectBufferfvATIPROC glGetObjectBufferfvATI = (glGetObjectBufferfvATIPROC)((intptr_t)function_pointer); + glGetObjectBufferfvATI(buffer, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetObjectBufferivATI(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetObjectBufferivATIPROC glGetObjectBufferivATI = (glGetObjectBufferivATIPROC)((intptr_t)function_pointer); + glGetObjectBufferivATI(buffer, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglFreeObjectBufferATI(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glFreeObjectBufferATIPROC glFreeObjectBufferATI = (glFreeObjectBufferATIPROC)((intptr_t)function_pointer); + glFreeObjectBufferATI(buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglArrayObjectATI(JNIEnv *env, jclass clazz, jint array, jint size, jint type, jint stride, jint buffer, jint offset, jlong function_pointer) { + glArrayObjectATIPROC glArrayObjectATI = (glArrayObjectATIPROC)((intptr_t)function_pointer); + glArrayObjectATI(array, size, type, stride, buffer, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetArrayObjectfvATI(JNIEnv *env, jclass clazz, jint array, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetArrayObjectfvATIPROC glGetArrayObjectfvATI = (glGetArrayObjectfvATIPROC)((intptr_t)function_pointer); + glGetArrayObjectfvATI(array, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetArrayObjectivATI(JNIEnv *env, jclass clazz, jint array, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetArrayObjectivATIPROC glGetArrayObjectivATI = (glGetArrayObjectivATIPROC)((intptr_t)function_pointer); + glGetArrayObjectivATI(array, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglVariantArrayObjectATI(JNIEnv *env, jclass clazz, jint id, jint type, jint stride, jint buffer, jint offset, jlong function_pointer) { + glVariantArrayObjectATIPROC glVariantArrayObjectATI = (glVariantArrayObjectATIPROC)((intptr_t)function_pointer); + glVariantArrayObjectATI(id, type, stride, buffer, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetVariantArrayObjectfvATI(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVariantArrayObjectfvATIPROC glGetVariantArrayObjectfvATI = (glGetVariantArrayObjectfvATIPROC)((intptr_t)function_pointer); + glGetVariantArrayObjectfvATI(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexArrayObject_nglGetVariantArrayObjectivATI(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVariantArrayObjectivATIPROC glGetVariantArrayObjectivATI = (glGetVariantArrayObjectivATIPROC)((intptr_t)function_pointer); + glGetVariantArrayObjectivATI(id, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexAttribArrayObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexAttribArrayObject.c new file mode 100644 index 0000000..bc69207 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexAttribArrayObject.c @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribArrayObjectATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRY *glGetVertexAttribArrayObjectfvATIPROC) (GLuint index, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetVertexAttribArrayObjectivATIPROC) (GLuint index, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexAttribArrayObject_nglVertexAttribArrayObjectATI(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jint buffer, jint offset, jlong function_pointer) { + glVertexAttribArrayObjectATIPROC glVertexAttribArrayObjectATI = (glVertexAttribArrayObjectATIPROC)((intptr_t)function_pointer); + glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexAttribArrayObject_nglGetVertexAttribArrayObjectfvATI(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVertexAttribArrayObjectfvATIPROC glGetVertexAttribArrayObjectfvATI = (glGetVertexAttribArrayObjectfvATIPROC)((intptr_t)function_pointer); + glGetVertexAttribArrayObjectfvATI(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexAttribArrayObject_nglGetVertexAttribArrayObjectivATI(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribArrayObjectivATIPROC glGetVertexAttribArrayObjectivATI = (glGetVertexAttribArrayObjectivATIPROC)((intptr_t)function_pointer); + glGetVertexAttribArrayObjectivATI(index, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexStreams.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexStreams.c new file mode 100644 index 0000000..8820c6d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_ATIVertexStreams.c @@ -0,0 +1,126 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexStream2fATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRY *glVertexStream2dATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertexStream2iATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRY *glVertexStream2sATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRY *glVertexStream3fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glVertexStream3dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertexStream3iATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRY *glVertexStream3sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY *glVertexStream4fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glVertexStream4dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertexStream4iATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glVertexStream4sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY *glNormalStream3bATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRY *glNormalStream3fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glNormalStream3dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glNormalStream3iATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRY *glNormalStream3sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY *glClientActiveVertexStreamATIPROC) (GLenum stream); +typedef void (APIENTRY *glVertexBlendEnvfATIPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glVertexBlendEnviATIPROC) (GLenum pname, GLint param); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream2fATI(JNIEnv *env, jclass clazz, jint stream, jfloat x, jfloat y, jlong function_pointer) { + glVertexStream2fATIPROC glVertexStream2fATI = (glVertexStream2fATIPROC)((intptr_t)function_pointer); + glVertexStream2fATI(stream, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream2dATI(JNIEnv *env, jclass clazz, jint stream, jdouble x, jdouble y, jlong function_pointer) { + glVertexStream2dATIPROC glVertexStream2dATI = (glVertexStream2dATIPROC)((intptr_t)function_pointer); + glVertexStream2dATI(stream, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream2iATI(JNIEnv *env, jclass clazz, jint stream, jint x, jint y, jlong function_pointer) { + glVertexStream2iATIPROC glVertexStream2iATI = (glVertexStream2iATIPROC)((intptr_t)function_pointer); + glVertexStream2iATI(stream, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream2sATI(JNIEnv *env, jclass clazz, jint stream, jshort x, jshort y, jlong function_pointer) { + glVertexStream2sATIPROC glVertexStream2sATI = (glVertexStream2sATIPROC)((intptr_t)function_pointer); + glVertexStream2sATI(stream, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream3fATI(JNIEnv *env, jclass clazz, jint stream, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glVertexStream3fATIPROC glVertexStream3fATI = (glVertexStream3fATIPROC)((intptr_t)function_pointer); + glVertexStream3fATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream3dATI(JNIEnv *env, jclass clazz, jint stream, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertexStream3dATIPROC glVertexStream3dATI = (glVertexStream3dATIPROC)((intptr_t)function_pointer); + glVertexStream3dATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream3iATI(JNIEnv *env, jclass clazz, jint stream, jint x, jint y, jint z, jlong function_pointer) { + glVertexStream3iATIPROC glVertexStream3iATI = (glVertexStream3iATIPROC)((intptr_t)function_pointer); + glVertexStream3iATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream3sATI(JNIEnv *env, jclass clazz, jint stream, jshort x, jshort y, jshort z, jlong function_pointer) { + glVertexStream3sATIPROC glVertexStream3sATI = (glVertexStream3sATIPROC)((intptr_t)function_pointer); + glVertexStream3sATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream4fATI(JNIEnv *env, jclass clazz, jint stream, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glVertexStream4fATIPROC glVertexStream4fATI = (glVertexStream4fATIPROC)((intptr_t)function_pointer); + glVertexStream4fATI(stream, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream4dATI(JNIEnv *env, jclass clazz, jint stream, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertexStream4dATIPROC glVertexStream4dATI = (glVertexStream4dATIPROC)((intptr_t)function_pointer); + glVertexStream4dATI(stream, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream4iATI(JNIEnv *env, jclass clazz, jint stream, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertexStream4iATIPROC glVertexStream4iATI = (glVertexStream4iATIPROC)((intptr_t)function_pointer); + glVertexStream4iATI(stream, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexStream4sATI(JNIEnv *env, jclass clazz, jint stream, jshort x, jshort y, jshort z, jshort w, jlong function_pointer) { + glVertexStream4sATIPROC glVertexStream4sATI = (glVertexStream4sATIPROC)((intptr_t)function_pointer); + glVertexStream4sATI(stream, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglNormalStream3bATI(JNIEnv *env, jclass clazz, jint stream, jbyte x, jbyte y, jbyte z, jlong function_pointer) { + glNormalStream3bATIPROC glNormalStream3bATI = (glNormalStream3bATIPROC)((intptr_t)function_pointer); + glNormalStream3bATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglNormalStream3fATI(JNIEnv *env, jclass clazz, jint stream, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glNormalStream3fATIPROC glNormalStream3fATI = (glNormalStream3fATIPROC)((intptr_t)function_pointer); + glNormalStream3fATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglNormalStream3dATI(JNIEnv *env, jclass clazz, jint stream, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glNormalStream3dATIPROC glNormalStream3dATI = (glNormalStream3dATIPROC)((intptr_t)function_pointer); + glNormalStream3dATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglNormalStream3iATI(JNIEnv *env, jclass clazz, jint stream, jint x, jint y, jint z, jlong function_pointer) { + glNormalStream3iATIPROC glNormalStream3iATI = (glNormalStream3iATIPROC)((intptr_t)function_pointer); + glNormalStream3iATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglNormalStream3sATI(JNIEnv *env, jclass clazz, jint stream, jshort x, jshort y, jshort z, jlong function_pointer) { + glNormalStream3sATIPROC glNormalStream3sATI = (glNormalStream3sATIPROC)((intptr_t)function_pointer); + glNormalStream3sATI(stream, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglClientActiveVertexStreamATI(JNIEnv *env, jclass clazz, jint stream, jlong function_pointer) { + glClientActiveVertexStreamATIPROC glClientActiveVertexStreamATI = (glClientActiveVertexStreamATIPROC)((intptr_t)function_pointer); + glClientActiveVertexStreamATI(stream); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexBlendEnvfATI(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glVertexBlendEnvfATIPROC glVertexBlendEnvfATI = (glVertexBlendEnvfATIPROC)((intptr_t)function_pointer); + glVertexBlendEnvfATI(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ATIVertexStreams_nglVertexBlendEnviATI(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glVertexBlendEnviATIPROC glVertexBlendEnviATI = (glVertexBlendEnviATIPROC)((intptr_t)function_pointer); + glVertexBlendEnviATI(pname, param); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBindableUniform.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBindableUniform.c new file mode 100644 index 0000000..23bbfeb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBindableUniform.c @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glUniformBufferEXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRY *glGetUniformBufferSizeEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRY *glGetUniformOffsetEXTPROC) (GLuint program, GLint location); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTBindableUniform_nglUniformBufferEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint buffer, jlong function_pointer) { + glUniformBufferEXTPROC glUniformBufferEXT = (glUniformBufferEXTPROC)((intptr_t)function_pointer); + glUniformBufferEXT(program, location, buffer); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTBindableUniform_nglGetUniformBufferSizeEXT(JNIEnv *env, jclass clazz, jint program, jint location, jlong function_pointer) { + glGetUniformBufferSizeEXTPROC glGetUniformBufferSizeEXT = (glGetUniformBufferSizeEXTPROC)((intptr_t)function_pointer); + GLint __result = glGetUniformBufferSizeEXT(program, location); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_EXTBindableUniform_nglGetUniformOffsetEXT(JNIEnv *env, jclass clazz, jint program, jint location, jlong function_pointer) { + glGetUniformOffsetEXTPROC glGetUniformOffsetEXT = (glGetUniformOffsetEXTPROC)((intptr_t)function_pointer); + GLintptr __result = glGetUniformOffsetEXT(program, location); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendColor.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendColor.c new file mode 100644 index 0000000..a10457e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendColor.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendColorEXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTBlendColor_nglBlendColorEXT(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha, jlong function_pointer) { + glBlendColorEXTPROC glBlendColorEXT = (glBlendColorEXTPROC)((intptr_t)function_pointer); + glBlendColorEXT(red, green, blue, alpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendEquationSeparate.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendEquationSeparate.c new file mode 100644 index 0000000..ab5f451 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendEquationSeparate.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendEquationSeparateEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTBlendEquationSeparate_nglBlendEquationSeparateEXT(JNIEnv *env, jclass clazz, jint modeRGB, jint modeAlpha, jlong function_pointer) { + glBlendEquationSeparateEXTPROC glBlendEquationSeparateEXT = (glBlendEquationSeparateEXTPROC)((intptr_t)function_pointer); + glBlendEquationSeparateEXT(modeRGB, modeAlpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendFuncSeparate.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendFuncSeparate.c new file mode 100644 index 0000000..9b32589 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendFuncSeparate.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendFuncSeparateEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTBlendFuncSeparate_nglBlendFuncSeparateEXT(JNIEnv *env, jclass clazz, jint sfactorRGB, jint dfactorRGB, jint sfactorAlpha, jint dfactorAlpha, jlong function_pointer) { + glBlendFuncSeparateEXTPROC glBlendFuncSeparateEXT = (glBlendFuncSeparateEXTPROC)((intptr_t)function_pointer); + glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendMinmax.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendMinmax.c new file mode 100644 index 0000000..8caedb9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTBlendMinmax.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendEquationEXTPROC) (GLenum mode); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTBlendMinmax_nglBlendEquationEXT(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glBlendEquationEXTPROC glBlendEquationEXT = (glBlendEquationEXTPROC)((intptr_t)function_pointer); + glBlendEquationEXT(mode); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTCompiledVertexArray.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTCompiledVertexArray.c new file mode 100644 index 0000000..905a7b9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTCompiledVertexArray.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glLockArraysEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRY *glUnlockArraysEXTPROC) (); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTCompiledVertexArray_nglLockArraysEXT(JNIEnv *env, jclass clazz, jint first, jint count, jlong function_pointer) { + glLockArraysEXTPROC glLockArraysEXT = (glLockArraysEXTPROC)((intptr_t)function_pointer); + glLockArraysEXT(first, count); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTCompiledVertexArray_nglUnlockArraysEXT(JNIEnv *env, jclass clazz, jlong function_pointer) { + glUnlockArraysEXTPROC glUnlockArraysEXT = (glUnlockArraysEXTPROC)((intptr_t)function_pointer); + glUnlockArraysEXT(); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDepthBoundsTest.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDepthBoundsTest.c new file mode 100644 index 0000000..941e7ff --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDepthBoundsTest.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDepthBoundsEXTPROC) (GLclampd zmin, GLclampd zmax); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDepthBoundsTest_nglDepthBoundsEXT(JNIEnv *env, jclass clazz, jdouble zmin, jdouble zmax, jlong function_pointer) { + glDepthBoundsEXTPROC glDepthBoundsEXT = (glDepthBoundsEXTPROC)((intptr_t)function_pointer); + glDepthBoundsEXT(zmin, zmax); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDirectStateAccess.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDirectStateAccess.c new file mode 100644 index 0000000..856afe2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDirectStateAccess.c @@ -0,0 +1,1588 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClientAttribDefaultEXTPROC) (GLbitfield mask); +typedef void (APIENTRY *glPushClientAttribDefaultEXTPROC) (GLbitfield mask); +typedef void (APIENTRY *glMatrixLoadfEXTPROC) (GLenum matrixMode, const GLfloat * m); +typedef void (APIENTRY *glMatrixLoaddEXTPROC) (GLenum matrixMode, const GLdouble * m); +typedef void (APIENTRY *glMatrixMultfEXTPROC) (GLenum matrixMode, const GLfloat * m); +typedef void (APIENTRY *glMatrixMultdEXTPROC) (GLenum matrixMode, const GLdouble * m); +typedef void (APIENTRY *glMatrixLoadIdentityEXTPROC) (GLenum matrixMode); +typedef void (APIENTRY *glMatrixRotatefEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glMatrixRotatedEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glMatrixScalefEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glMatrixScaledEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glMatrixTranslatefEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glMatrixTranslatedEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glMatrixOrthoEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (APIENTRY *glMatrixFrustumEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (APIENTRY *glMatrixPushEXTPROC) (GLenum matrixMode); +typedef void (APIENTRY *glMatrixPopEXTPROC) (GLenum matrixMode); +typedef void (APIENTRY *glTextureParameteriEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glTextureParameterivEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * param); +typedef void (APIENTRY *glTextureParameterfEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY *glTextureParameterfvEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat * param); +typedef void (APIENTRY *glTextureImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTextureImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTextureSubImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTextureSubImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glCopyTextureImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRY *glCopyTextureImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRY *glCopyTextureSubImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glCopyTextureSubImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetTextureImageEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); +typedef void (APIENTRY *glGetTextureParameterfvEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetTextureParameterivEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTextureLevelParameterfvEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetTextureLevelParameterivEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (APIENTRY *glTextureImage3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTextureSubImage3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glCopyTextureSubImage3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glBindMultiTextureEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRY *glMultiTexCoordPointerEXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glMultiTexEnvfEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY *glMultiTexEnvfvEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glMultiTexEnviEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glMultiTexEnvivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glMultiTexGendEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRY *glMultiTexGendvEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params); +typedef void (APIENTRY *glMultiTexGenfEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRY *glMultiTexGenfvEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glMultiTexGeniEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRY *glMultiTexGenivEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint * params); +typedef void (APIENTRY *glGetMultiTexEnvfvEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMultiTexEnvivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetMultiTexGendvEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble * params); +typedef void (APIENTRY *glGetMultiTexGenfvEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMultiTexGenivEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint * params); +typedef void (APIENTRY *glMultiTexParameteriEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glMultiTexParameterivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * param); +typedef void (APIENTRY *glMultiTexParameterfEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY *glMultiTexParameterfvEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * param); +typedef void (APIENTRY *glMultiTexImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glMultiTexImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glMultiTexSubImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glMultiTexSubImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glCopyMultiTexImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRY *glCopyMultiTexImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRY *glCopyMultiTexSubImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glCopyMultiTexSubImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetMultiTexImageEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); +typedef void (APIENTRY *glGetMultiTexParameterfvEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMultiTexParameterivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetMultiTexLevelParameterfvEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMultiTexLevelParameterivEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (APIENTRY *glMultiTexImage3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glMultiTexSubImage3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glCopyMultiTexSubImage3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glEnableClientStateIndexedEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRY *glDisableClientStateIndexedEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRY *glEnableClientStateiEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRY *glDisableClientStateiEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRY *glGetFloatIndexedvEXTPROC) (GLenum pname, GLuint index, GLfloat * params); +typedef void (APIENTRY *glGetDoubleIndexedvEXTPROC) (GLenum pname, GLuint index, GLdouble * params); +typedef void (APIENTRY *glGetPointerIndexedvEXTPROC) (GLenum pname, GLuint index, GLvoid ** params); +typedef void (APIENTRY *glGetFloati_vEXTPROC) (GLenum pname, GLuint index, GLfloat * params); +typedef void (APIENTRY *glGetDoublei_vEXTPROC) (GLenum pname, GLuint index, GLdouble * params); +typedef void (APIENTRY *glGetPointeri_vEXTPROC) (GLenum pname, GLuint index, GLvoid ** params); +typedef void (APIENTRY *glNamedProgramStringEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string); +typedef void (APIENTRY *glNamedProgramLocalParameter4dEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glNamedProgramLocalParameter4dvEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble * params); +typedef void (APIENTRY *glNamedProgramLocalParameter4fEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glNamedProgramLocalParameter4fvEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat * params); +typedef void (APIENTRY *glGetNamedProgramLocalParameterdvEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble * params); +typedef void (APIENTRY *glGetNamedProgramLocalParameterfvEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat * params); +typedef void (APIENTRY *glGetNamedProgramivEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetNamedProgramStringEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid * string); +typedef void (APIENTRY *glCompressedTextureImage3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTextureImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTextureImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTextureSubImage3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTextureSubImage2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTextureSubImage1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glGetCompressedTextureImageEXTPROC) (GLuint texture, GLenum target, GLint level, GLvoid * img); +typedef void (APIENTRY *glCompressedMultiTexImage3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedMultiTexImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedMultiTexImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedMultiTexSubImage3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedMultiTexSubImage2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedMultiTexSubImage1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glGetCompressedMultiTexImageEXTPROC) (GLenum texunit, GLenum target, GLint level, GLvoid * img); +typedef void (APIENTRY *glMatrixLoadTransposefEXTPROC) (GLenum matrixMode, const GLfloat * m); +typedef void (APIENTRY *glMatrixLoadTransposedEXTPROC) (GLenum matrixMode, const GLdouble * m); +typedef void (APIENTRY *glMatrixMultTransposefEXTPROC) (GLenum matrixMode, const GLfloat * m); +typedef void (APIENTRY *glMatrixMultTransposedEXTPROC) (GLenum matrixMode, const GLdouble * m); +typedef void (APIENTRY *glNamedBufferDataEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage); +typedef void (APIENTRY *glNamedBufferSubDataEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data); +typedef GLvoid * (APIENTRY *glMapNamedBufferEXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRY *glUnmapNamedBufferEXTPROC) (GLuint buffer); +typedef void (APIENTRY *glGetNamedBufferParameterivEXTPROC) (GLuint buffer, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetNamedBufferPointervEXTPROC) (GLuint buffer, GLenum pname, GLvoid ** params); +typedef void (APIENTRY *glGetNamedBufferSubDataEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data); +typedef void (APIENTRY *glProgramUniform1fEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRY *glProgramUniform2fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRY *glProgramUniform3fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glProgramUniform4fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRY *glProgramUniform1iEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRY *glProgramUniform2iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRY *glProgramUniform3iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRY *glProgramUniform4iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRY *glProgramUniform1fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform2fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform3fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform4fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform1ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform2ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform3ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform4ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniformMatrix2fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix2x3fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3x2fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix2x4fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4x2fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3x4fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4x3fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glTextureBufferEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRY *glMultiTexBufferEXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRY *glTextureParameterIivEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glTextureParameterIuivEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint * params); +typedef void (APIENTRY *glGetTextureParameterIivEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTextureParameterIuivEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint * params); +typedef void (APIENTRY *glMultiTexParameterIivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glMultiTexParameterIuivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint * params); +typedef void (APIENTRY *glGetMultiTexParameterIivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetMultiTexParameterIuivEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint * params); +typedef void (APIENTRY *glProgramUniform1uiEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRY *glProgramUniform2uiEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRY *glProgramUniform3uiEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRY *glProgramUniform4uiEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRY *glProgramUniform1uivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glProgramUniform2uivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glProgramUniform3uivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glProgramUniform4uivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glNamedProgramLocalParameters4fvEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (APIENTRY *glNamedProgramLocalParameterI4iEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glNamedProgramLocalParameterI4ivEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint * params); +typedef void (APIENTRY *glNamedProgramLocalParametersI4ivEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (APIENTRY *glNamedProgramLocalParameterI4uiEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRY *glNamedProgramLocalParameterI4uivEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint * params); +typedef void (APIENTRY *glNamedProgramLocalParametersI4uivEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (APIENTRY *glGetNamedProgramLocalParameterIivEXTPROC) (GLuint program, GLenum target, GLuint index, GLint * params); +typedef void (APIENTRY *glGetNamedProgramLocalParameterIuivEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint * params); +typedef void (APIENTRY *glNamedRenderbufferStorageEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetNamedRenderbufferParameterivEXTPROC) (GLuint renderbuffer, GLenum pname, GLint * params); +typedef void (APIENTRY *glNamedRenderbufferStorageMultisampleEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glNamedRenderbufferStorageMultisampleCoverageEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRY *glCheckNamedFramebufferStatusEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRY *glNamedFramebufferTexture1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glNamedFramebufferTexture2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glNamedFramebufferTexture3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRY *glNamedFramebufferRenderbufferEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRY *glGetNamedFramebufferAttachmentParameterivEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (APIENTRY *glGenerateTextureMipmapEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRY *glGenerateMultiTexMipmapEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRY *glFramebufferDrawBufferEXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRY *glFramebufferDrawBuffersEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (APIENTRY *glFramebufferReadBufferEXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRY *glGetFramebufferParameterivEXTPROC) (GLuint framebuffer, GLenum pname, GLint * param); +typedef void (APIENTRY *glNamedCopyBufferSubDataEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); +typedef void (APIENTRY *glNamedFramebufferTextureEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRY *glNamedFramebufferTextureLayerEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRY *glNamedFramebufferTextureFaceEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRY *glTextureRenderbufferEXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRY *glMultiTexRenderbufferEXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRY *glVertexArrayVertexOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayColorOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayEdgeFlagOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayIndexOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayNormalOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayTexCoordOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayMultiTexCoordOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayFogCoordOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArraySecondaryColorOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayVertexAttribOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glVertexArrayVertexAttribIOffsetEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRY *glEnableVertexArrayEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRY *glDisableVertexArrayEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRY *glEnableVertexArrayAttribEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRY *glDisableVertexArrayAttribEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRY *glGetVertexArrayIntegervEXTPROC) (GLuint vaobj, GLenum pname, GLint * param); +typedef void (APIENTRY *glGetVertexArrayPointervEXTPROC) (GLuint vaobj, GLenum pname, GLvoid ** param); +typedef void (APIENTRY *glGetVertexArrayIntegeri_vEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (APIENTRY *glGetVertexArrayPointeri_vEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid ** param); +typedef GLvoid * (APIENTRY *glMapNamedBufferRangeEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRY *glFlushMappedNamedBufferRangeEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglClientAttribDefaultEXT(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glClientAttribDefaultEXTPROC glClientAttribDefaultEXT = (glClientAttribDefaultEXTPROC)((intptr_t)function_pointer); + glClientAttribDefaultEXT(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglPushClientAttribDefaultEXT(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glPushClientAttribDefaultEXTPROC glPushClientAttribDefaultEXT = (glPushClientAttribDefaultEXTPROC)((intptr_t)function_pointer); + glPushClientAttribDefaultEXT(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixLoadfEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMatrixLoadfEXTPROC glMatrixLoadfEXT = (glMatrixLoadfEXTPROC)((intptr_t)function_pointer); + glMatrixLoadfEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixLoaddEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMatrixLoaddEXTPROC glMatrixLoaddEXT = (glMatrixLoaddEXTPROC)((intptr_t)function_pointer); + glMatrixLoaddEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixMultfEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMatrixMultfEXTPROC glMatrixMultfEXT = (glMatrixMultfEXTPROC)((intptr_t)function_pointer); + glMatrixMultfEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixMultdEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMatrixMultdEXTPROC glMatrixMultdEXT = (glMatrixMultdEXTPROC)((intptr_t)function_pointer); + glMatrixMultdEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixLoadIdentityEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong function_pointer) { + glMatrixLoadIdentityEXTPROC glMatrixLoadIdentityEXT = (glMatrixLoadIdentityEXTPROC)((intptr_t)function_pointer); + glMatrixLoadIdentityEXT(matrixMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixRotatefEXT(JNIEnv *env, jclass clazz, jint matrixMode, jfloat angle, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glMatrixRotatefEXTPROC glMatrixRotatefEXT = (glMatrixRotatefEXTPROC)((intptr_t)function_pointer); + glMatrixRotatefEXT(matrixMode, angle, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixRotatedEXT(JNIEnv *env, jclass clazz, jint matrixMode, jdouble angle, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glMatrixRotatedEXTPROC glMatrixRotatedEXT = (glMatrixRotatedEXTPROC)((intptr_t)function_pointer); + glMatrixRotatedEXT(matrixMode, angle, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixScalefEXT(JNIEnv *env, jclass clazz, jint matrixMode, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glMatrixScalefEXTPROC glMatrixScalefEXT = (glMatrixScalefEXTPROC)((intptr_t)function_pointer); + glMatrixScalefEXT(matrixMode, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixScaledEXT(JNIEnv *env, jclass clazz, jint matrixMode, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glMatrixScaledEXTPROC glMatrixScaledEXT = (glMatrixScaledEXTPROC)((intptr_t)function_pointer); + glMatrixScaledEXT(matrixMode, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixTranslatefEXT(JNIEnv *env, jclass clazz, jint matrixMode, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glMatrixTranslatefEXTPROC glMatrixTranslatefEXT = (glMatrixTranslatefEXTPROC)((intptr_t)function_pointer); + glMatrixTranslatefEXT(matrixMode, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixTranslatedEXT(JNIEnv *env, jclass clazz, jint matrixMode, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glMatrixTranslatedEXTPROC glMatrixTranslatedEXT = (glMatrixTranslatedEXTPROC)((intptr_t)function_pointer); + glMatrixTranslatedEXT(matrixMode, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixOrthoEXT(JNIEnv *env, jclass clazz, jint matrixMode, jdouble l, jdouble r, jdouble b, jdouble t, jdouble n, jdouble f, jlong function_pointer) { + glMatrixOrthoEXTPROC glMatrixOrthoEXT = (glMatrixOrthoEXTPROC)((intptr_t)function_pointer); + glMatrixOrthoEXT(matrixMode, l, r, b, t, n, f); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixFrustumEXT(JNIEnv *env, jclass clazz, jint matrixMode, jdouble l, jdouble r, jdouble b, jdouble t, jdouble n, jdouble f, jlong function_pointer) { + glMatrixFrustumEXTPROC glMatrixFrustumEXT = (glMatrixFrustumEXTPROC)((intptr_t)function_pointer); + glMatrixFrustumEXT(matrixMode, l, r, b, t, n, f); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixPushEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong function_pointer) { + glMatrixPushEXTPROC glMatrixPushEXT = (glMatrixPushEXTPROC)((intptr_t)function_pointer); + glMatrixPushEXT(matrixMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixPopEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong function_pointer) { + glMatrixPopEXTPROC glMatrixPopEXT = (glMatrixPopEXTPROC)((intptr_t)function_pointer); + glMatrixPopEXT(matrixMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameteriEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jint param, jlong function_pointer) { + glTextureParameteriEXTPROC glTextureParameteriEXT = (glTextureParameteriEXTPROC)((intptr_t)function_pointer); + glTextureParameteriEXT(texture, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameterivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong param, jlong function_pointer) { + const GLint *param_address = (const GLint *)(intptr_t)param; + glTextureParameterivEXTPROC glTextureParameterivEXT = (glTextureParameterivEXTPROC)((intptr_t)function_pointer); + glTextureParameterivEXT(texture, target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameterfEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jfloat param, jlong function_pointer) { + glTextureParameterfEXTPROC glTextureParameterfEXT = (glTextureParameterfEXTPROC)((intptr_t)function_pointer); + glTextureParameterfEXT(texture, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameterfvEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong param, jlong function_pointer) { + const GLfloat *param_address = (const GLfloat *)(intptr_t)param; + glTextureParameterfvEXTPROC glTextureParameterfvEXT = (glTextureParameterfvEXTPROC)((intptr_t)function_pointer); + glTextureParameterfvEXT(texture, target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureImage1DEXTPROC glTextureImage1DEXT = (glTextureImage1DEXTPROC)((intptr_t)function_pointer); + glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage1DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureImage1DEXTPROC glTextureImage1DEXT = (glTextureImage1DEXTPROC)((intptr_t)function_pointer); + glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureImage2DEXTPROC glTextureImage2DEXT = (glTextureImage2DEXTPROC)((intptr_t)function_pointer); + glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage2DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureImage2DEXTPROC glTextureImage2DEXT = (glTextureImage2DEXTPROC)((intptr_t)function_pointer); + glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureSubImage1DEXTPROC glTextureSubImage1DEXT = (glTextureSubImage1DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage1DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureSubImage1DEXTPROC glTextureSubImage1DEXT = (glTextureSubImage1DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureSubImage2DEXTPROC glTextureSubImage2DEXT = (glTextureSubImage2DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage2DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureSubImage2DEXTPROC glTextureSubImage2DEXT = (glTextureSubImage2DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyTextureImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint x, jint y, jint width, jint border, jlong function_pointer) { + glCopyTextureImage1DEXTPROC glCopyTextureImage1DEXT = (glCopyTextureImage1DEXTPROC)((intptr_t)function_pointer); + glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyTextureImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint x, jint y, jint width, jint height, jint border, jlong function_pointer) { + glCopyTextureImage2DEXTPROC glCopyTextureImage2DEXT = (glCopyTextureImage2DEXTPROC)((intptr_t)function_pointer); + glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyTextureSubImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint x, jint y, jint width, jlong function_pointer) { + glCopyTextureSubImage1DEXTPROC glCopyTextureSubImage1DEXT = (glCopyTextureSubImage1DEXTPROC)((intptr_t)function_pointer); + glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyTextureSubImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyTextureSubImage2DEXTPROC glCopyTextureSubImage2DEXT = (glCopyTextureSubImage2DEXTPROC)((intptr_t)function_pointer); + glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureImageEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint format, jint type, jlong pixels, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)pixels; + glGetTextureImageEXTPROC glGetTextureImageEXT = (glGetTextureImageEXTPROC)((intptr_t)function_pointer); + glGetTextureImageEXT(texture, target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureImageEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glGetTextureImageEXTPROC glGetTextureImageEXT = (glGetTextureImageEXTPROC)((intptr_t)function_pointer); + glGetTextureImageEXT(texture, target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureParameterfvEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTextureParameterfvEXTPROC glGetTextureParameterfvEXT = (glGetTextureParameterfvEXTPROC)((intptr_t)function_pointer); + glGetTextureParameterfvEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureParameterivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTextureParameterivEXTPROC glGetTextureParameterivEXT = (glGetTextureParameterivEXTPROC)((intptr_t)function_pointer); + glGetTextureParameterivEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureLevelParameterfvEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTextureLevelParameterfvEXTPROC glGetTextureLevelParameterfvEXT = (glGetTextureLevelParameterfvEXTPROC)((intptr_t)function_pointer); + glGetTextureLevelParameterfvEXT(texture, target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureLevelParameterivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTextureLevelParameterivEXTPROC glGetTextureLevelParameterivEXT = (glGetTextureLevelParameterivEXTPROC)((intptr_t)function_pointer); + glGetTextureLevelParameterivEXT(texture, target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureImage3DEXTPROC glTextureImage3DEXT = (glTextureImage3DEXTPROC)((intptr_t)function_pointer); + glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureImage3DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureImage3DEXTPROC glTextureImage3DEXT = (glTextureImage3DEXTPROC)((intptr_t)function_pointer); + glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTextureSubImage3DEXTPROC glTextureSubImage3DEXT = (glTextureSubImage3DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureSubImage3DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTextureSubImage3DEXTPROC glTextureSubImage3DEXT = (glTextureSubImage3DEXTPROC)((intptr_t)function_pointer); + glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyTextureSubImage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyTextureSubImage3DEXTPROC glCopyTextureSubImage3DEXT = (glCopyTextureSubImage3DEXTPROC)((intptr_t)function_pointer); + glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglBindMultiTextureEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint texture, jlong function_pointer) { + glBindMultiTextureEXTPROC glBindMultiTextureEXT = (glBindMultiTextureEXTPROC)((intptr_t)function_pointer); + glBindMultiTextureEXT(texunit, target, texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexCoordPointerEXT(JNIEnv *env, jclass clazz, jint texunit, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glMultiTexCoordPointerEXTPROC glMultiTexCoordPointerEXT = (glMultiTexCoordPointerEXTPROC)((intptr_t)function_pointer); + glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexCoordPointerEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glMultiTexCoordPointerEXTPROC glMultiTexCoordPointerEXT = (glMultiTexCoordPointerEXTPROC)((intptr_t)function_pointer); + glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexEnvfEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jfloat param, jlong function_pointer) { + glMultiTexEnvfEXTPROC glMultiTexEnvfEXT = (glMultiTexEnvfEXTPROC)((intptr_t)function_pointer); + glMultiTexEnvfEXT(texunit, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexEnvfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glMultiTexEnvfvEXTPROC glMultiTexEnvfvEXT = (glMultiTexEnvfvEXTPROC)((intptr_t)function_pointer); + glMultiTexEnvfvEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexEnviEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jint param, jlong function_pointer) { + glMultiTexEnviEXTPROC glMultiTexEnviEXT = (glMultiTexEnviEXTPROC)((intptr_t)function_pointer); + glMultiTexEnviEXT(texunit, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexEnvivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glMultiTexEnvivEXTPROC glMultiTexEnvivEXT = (glMultiTexEnvivEXTPROC)((intptr_t)function_pointer); + glMultiTexEnvivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGendEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jdouble param, jlong function_pointer) { + glMultiTexGendEXTPROC glMultiTexGendEXT = (glMultiTexGendEXTPROC)((intptr_t)function_pointer); + glMultiTexGendEXT(texunit, coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGendvEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glMultiTexGendvEXTPROC glMultiTexGendvEXT = (glMultiTexGendvEXTPROC)((intptr_t)function_pointer); + glMultiTexGendvEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGenfEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jfloat param, jlong function_pointer) { + glMultiTexGenfEXTPROC glMultiTexGenfEXT = (glMultiTexGenfEXTPROC)((intptr_t)function_pointer); + glMultiTexGenfEXT(texunit, coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGenfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glMultiTexGenfvEXTPROC glMultiTexGenfvEXT = (glMultiTexGenfvEXTPROC)((intptr_t)function_pointer); + glMultiTexGenfvEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGeniEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jint param, jlong function_pointer) { + glMultiTexGeniEXTPROC glMultiTexGeniEXT = (glMultiTexGeniEXTPROC)((intptr_t)function_pointer); + glMultiTexGeniEXT(texunit, coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexGenivEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glMultiTexGenivEXTPROC glMultiTexGenivEXT = (glMultiTexGenivEXTPROC)((intptr_t)function_pointer); + glMultiTexGenivEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexEnvfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMultiTexEnvfvEXTPROC glGetMultiTexEnvfvEXT = (glGetMultiTexEnvfvEXTPROC)((intptr_t)function_pointer); + glGetMultiTexEnvfvEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexEnvivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMultiTexEnvivEXTPROC glGetMultiTexEnvivEXT = (glGetMultiTexEnvivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexEnvivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexGendvEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetMultiTexGendvEXTPROC glGetMultiTexGendvEXT = (glGetMultiTexGendvEXTPROC)((intptr_t)function_pointer); + glGetMultiTexGendvEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexGenfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMultiTexGenfvEXTPROC glGetMultiTexGenfvEXT = (glGetMultiTexGenfvEXTPROC)((intptr_t)function_pointer); + glGetMultiTexGenfvEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexGenivEXT(JNIEnv *env, jclass clazz, jint texunit, jint coord, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMultiTexGenivEXTPROC glGetMultiTexGenivEXT = (glGetMultiTexGenivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexGenivEXT(texunit, coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameteriEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jint param, jlong function_pointer) { + glMultiTexParameteriEXTPROC glMultiTexParameteriEXT = (glMultiTexParameteriEXTPROC)((intptr_t)function_pointer); + glMultiTexParameteriEXT(texunit, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameterivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong param, jlong function_pointer) { + const GLint *param_address = (const GLint *)(intptr_t)param; + glMultiTexParameterivEXTPROC glMultiTexParameterivEXT = (glMultiTexParameterivEXTPROC)((intptr_t)function_pointer); + glMultiTexParameterivEXT(texunit, target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameterfEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jfloat param, jlong function_pointer) { + glMultiTexParameterfEXTPROC glMultiTexParameterfEXT = (glMultiTexParameterfEXTPROC)((intptr_t)function_pointer); + glMultiTexParameterfEXT(texunit, target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameterfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong param, jlong function_pointer) { + const GLfloat *param_address = (const GLfloat *)(intptr_t)param; + glMultiTexParameterfvEXTPROC glMultiTexParameterfvEXT = (glMultiTexParameterfvEXTPROC)((intptr_t)function_pointer); + glMultiTexParameterfvEXT(texunit, target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexImage1DEXTPROC glMultiTexImage1DEXT = (glMultiTexImage1DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage1DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexImage1DEXTPROC glMultiTexImage1DEXT = (glMultiTexImage1DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexImage2DEXTPROC glMultiTexImage2DEXT = (glMultiTexImage2DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage2DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexImage2DEXTPROC glMultiTexImage2DEXT = (glMultiTexImage2DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexSubImage1DEXTPROC glMultiTexSubImage1DEXT = (glMultiTexSubImage1DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage1DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexSubImage1DEXTPROC glMultiTexSubImage1DEXT = (glMultiTexSubImage1DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexSubImage2DEXTPROC glMultiTexSubImage2DEXT = (glMultiTexSubImage2DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage2DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexSubImage2DEXTPROC glMultiTexSubImage2DEXT = (glMultiTexSubImage2DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyMultiTexImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint x, jint y, jint width, jint border, jlong function_pointer) { + glCopyMultiTexImage1DEXTPROC glCopyMultiTexImage1DEXT = (glCopyMultiTexImage1DEXTPROC)((intptr_t)function_pointer); + glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyMultiTexImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint x, jint y, jint width, jint height, jint border, jlong function_pointer) { + glCopyMultiTexImage2DEXTPROC glCopyMultiTexImage2DEXT = (glCopyMultiTexImage2DEXTPROC)((intptr_t)function_pointer); + glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyMultiTexSubImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint x, jint y, jint width, jlong function_pointer) { + glCopyMultiTexSubImage1DEXTPROC glCopyMultiTexSubImage1DEXT = (glCopyMultiTexSubImage1DEXTPROC)((intptr_t)function_pointer); + glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyMultiTexSubImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyMultiTexSubImage2DEXTPROC glCopyMultiTexSubImage2DEXT = (glCopyMultiTexSubImage2DEXTPROC)((intptr_t)function_pointer); + glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexImageEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint format, jint type, jlong pixels, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)pixels; + glGetMultiTexImageEXTPROC glGetMultiTexImageEXT = (glGetMultiTexImageEXTPROC)((intptr_t)function_pointer); + glGetMultiTexImageEXT(texunit, target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexImageEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glGetMultiTexImageEXTPROC glGetMultiTexImageEXT = (glGetMultiTexImageEXTPROC)((intptr_t)function_pointer); + glGetMultiTexImageEXT(texunit, target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexParameterfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMultiTexParameterfvEXTPROC glGetMultiTexParameterfvEXT = (glGetMultiTexParameterfvEXTPROC)((intptr_t)function_pointer); + glGetMultiTexParameterfvEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexParameterivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMultiTexParameterivEXTPROC glGetMultiTexParameterivEXT = (glGetMultiTexParameterivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexParameterivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexLevelParameterfvEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMultiTexLevelParameterfvEXTPROC glGetMultiTexLevelParameterfvEXT = (glGetMultiTexLevelParameterfvEXTPROC)((intptr_t)function_pointer); + glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexLevelParameterivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMultiTexLevelParameterivEXTPROC glGetMultiTexLevelParameterivEXT = (glGetMultiTexLevelParameterivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage3DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexImage3DEXTPROC glMultiTexImage3DEXT = (glMultiTexImage3DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexImage3DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexImage3DEXTPROC glMultiTexImage3DEXT = (glMultiTexImage3DEXTPROC)((intptr_t)function_pointer); + glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage3DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glMultiTexSubImage3DEXTPROC glMultiTexSubImage3DEXT = (glMultiTexSubImage3DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexSubImage3DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glMultiTexSubImage3DEXTPROC glMultiTexSubImage3DEXT = (glMultiTexSubImage3DEXTPROC)((intptr_t)function_pointer); + glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCopyMultiTexSubImage3DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyMultiTexSubImage3DEXTPROC glCopyMultiTexSubImage3DEXT = (glCopyMultiTexSubImage3DEXTPROC)((intptr_t)function_pointer); + glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglEnableClientStateIndexedEXT(JNIEnv *env, jclass clazz, jint array, jint index, jlong function_pointer) { + glEnableClientStateIndexedEXTPROC glEnableClientStateIndexedEXT = (glEnableClientStateIndexedEXTPROC)((intptr_t)function_pointer); + glEnableClientStateIndexedEXT(array, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglDisableClientStateIndexedEXT(JNIEnv *env, jclass clazz, jint array, jint index, jlong function_pointer) { + glDisableClientStateIndexedEXTPROC glDisableClientStateIndexedEXT = (glDisableClientStateIndexedEXTPROC)((intptr_t)function_pointer); + glDisableClientStateIndexedEXT(array, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglEnableClientStateiEXT(JNIEnv *env, jclass clazz, jint array, jint index, jlong function_pointer) { + glEnableClientStateiEXTPROC glEnableClientStateiEXT = (glEnableClientStateiEXTPROC)((intptr_t)function_pointer); + glEnableClientStateiEXT(array, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglDisableClientStateiEXT(JNIEnv *env, jclass clazz, jint array, jint index, jlong function_pointer) { + glDisableClientStateiEXTPROC glDisableClientStateiEXT = (glDisableClientStateiEXTPROC)((intptr_t)function_pointer); + glDisableClientStateiEXT(array, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetFloatIndexedvEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetFloatIndexedvEXTPROC glGetFloatIndexedvEXT = (glGetFloatIndexedvEXTPROC)((intptr_t)function_pointer); + glGetFloatIndexedvEXT(pname, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetDoubleIndexedvEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetDoubleIndexedvEXTPROC glGetDoubleIndexedvEXT = (glGetDoubleIndexedvEXTPROC)((intptr_t)function_pointer); + glGetDoubleIndexedvEXT(pname, index, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetPointerIndexedvEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong result_size, jlong function_pointer) { + glGetPointerIndexedvEXTPROC glGetPointerIndexedvEXT = (glGetPointerIndexedvEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetPointerIndexedvEXT(pname, index, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetFloati_1vEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetFloati_vEXTPROC glGetFloati_vEXT = (glGetFloati_vEXTPROC)((intptr_t)function_pointer); + glGetFloati_vEXT(pname, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetDoublei_1vEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetDoublei_vEXTPROC glGetDoublei_vEXT = (glGetDoublei_vEXTPROC)((intptr_t)function_pointer); + glGetDoublei_vEXT(pname, index, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetPointeri_1vEXT(JNIEnv *env, jclass clazz, jint pname, jint index, jlong result_size, jlong function_pointer) { + glGetPointeri_vEXTPROC glGetPointeri_vEXT = (glGetPointeri_vEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetPointeri_vEXT(pname, index, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramStringEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint format, jint len, jlong string, jlong function_pointer) { + const GLvoid *string_address = (const GLvoid *)(intptr_t)string; + glNamedProgramStringEXTPROC glNamedProgramStringEXT = (glNamedProgramStringEXTPROC)((intptr_t)function_pointer); + glNamedProgramStringEXT(program, target, format, len, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameter4dEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glNamedProgramLocalParameter4dEXTPROC glNamedProgramLocalParameter4dEXT = (glNamedProgramLocalParameter4dEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameter4dvEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glNamedProgramLocalParameter4dvEXTPROC glNamedProgramLocalParameter4dvEXT = (glNamedProgramLocalParameter4dvEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameter4dvEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameter4fEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glNamedProgramLocalParameter4fEXTPROC glNamedProgramLocalParameter4fEXT = (glNamedProgramLocalParameter4fEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameter4fvEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glNamedProgramLocalParameter4fvEXTPROC glNamedProgramLocalParameter4fvEXT = (glNamedProgramLocalParameter4fvEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameter4fvEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramLocalParameterdvEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetNamedProgramLocalParameterdvEXTPROC glGetNamedProgramLocalParameterdvEXT = (glGetNamedProgramLocalParameterdvEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramLocalParameterdvEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramLocalParameterfvEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetNamedProgramLocalParameterfvEXTPROC glGetNamedProgramLocalParameterfvEXT = (glGetNamedProgramLocalParameterfvEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramLocalParameterfvEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedProgramivEXTPROC glGetNamedProgramivEXT = (glGetNamedProgramivEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramivEXT(program, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramStringEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint pname, jlong string, jlong function_pointer) { + GLvoid *string_address = (GLvoid *)(intptr_t)string; + glGetNamedProgramStringEXTPROC glGetNamedProgramStringEXT = (glGetNamedProgramStringEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramStringEXT(program, target, pname, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureImage3DEXTPROC glCompressedTextureImage3DEXT = (glCompressedTextureImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage3DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureImage3DEXTPROC glCompressedTextureImage3DEXT = (glCompressedTextureImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureImage2DEXTPROC glCompressedTextureImage2DEXT = (glCompressedTextureImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage2DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureImage2DEXTPROC glCompressedTextureImage2DEXT = (glCompressedTextureImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureImage1DEXTPROC glCompressedTextureImage1DEXT = (glCompressedTextureImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureImage1DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureImage1DEXTPROC glCompressedTextureImage1DEXT = (glCompressedTextureImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureSubImage3DEXTPROC glCompressedTextureSubImage3DEXT = (glCompressedTextureSubImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage3DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureSubImage3DEXTPROC glCompressedTextureSubImage3DEXT = (glCompressedTextureSubImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureSubImage2DEXTPROC glCompressedTextureSubImage2DEXT = (glCompressedTextureSubImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage2DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureSubImage2DEXTPROC glCompressedTextureSubImage2DEXT = (glCompressedTextureSubImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTextureSubImage1DEXTPROC glCompressedTextureSubImage1DEXT = (glCompressedTextureSubImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedTextureSubImage1DEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTextureSubImage1DEXTPROC glCompressedTextureSubImage1DEXT = (glCompressedTextureSubImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetCompressedTextureImageEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jlong img, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetCompressedTextureImageEXTPROC glGetCompressedTextureImageEXT = (glGetCompressedTextureImageEXTPROC)((intptr_t)function_pointer); + glGetCompressedTextureImageEXT(texture, target, level, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetCompressedTextureImageEXTBO(JNIEnv *env, jclass clazz, jint texture, jint target, jint level, jlong img_buffer_offset, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)offsetToPointer(img_buffer_offset); + glGetCompressedTextureImageEXTPROC glGetCompressedTextureImageEXT = (glGetCompressedTextureImageEXTPROC)((intptr_t)function_pointer); + glGetCompressedTextureImageEXT(texture, target, level, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage3DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexImage3DEXTPROC glCompressedMultiTexImage3DEXT = (glCompressedMultiTexImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage3DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexImage3DEXTPROC glCompressedMultiTexImage3DEXT = (glCompressedMultiTexImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexImage2DEXTPROC glCompressedMultiTexImage2DEXT = (glCompressedMultiTexImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage2DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexImage2DEXTPROC glCompressedMultiTexImage2DEXT = (glCompressedMultiTexImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexImage1DEXTPROC glCompressedMultiTexImage1DEXT = (glCompressedMultiTexImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexImage1DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexImage1DEXTPROC glCompressedMultiTexImage1DEXT = (glCompressedMultiTexImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage3DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexSubImage3DEXTPROC glCompressedMultiTexSubImage3DEXT = (glCompressedMultiTexSubImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage3DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexSubImage3DEXTPROC glCompressedMultiTexSubImage3DEXT = (glCompressedMultiTexSubImage3DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage2DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexSubImage2DEXTPROC glCompressedMultiTexSubImage2DEXT = (glCompressedMultiTexSubImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage2DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexSubImage2DEXTPROC glCompressedMultiTexSubImage2DEXT = (glCompressedMultiTexSubImage2DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage1DEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedMultiTexSubImage1DEXTPROC glCompressedMultiTexSubImage1DEXT = (glCompressedMultiTexSubImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCompressedMultiTexSubImage1DEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedMultiTexSubImage1DEXTPROC glCompressedMultiTexSubImage1DEXT = (glCompressedMultiTexSubImage1DEXTPROC)((intptr_t)function_pointer); + glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetCompressedMultiTexImageEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jlong img, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetCompressedMultiTexImageEXTPROC glGetCompressedMultiTexImageEXT = (glGetCompressedMultiTexImageEXTPROC)((intptr_t)function_pointer); + glGetCompressedMultiTexImageEXT(texunit, target, level, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetCompressedMultiTexImageEXTBO(JNIEnv *env, jclass clazz, jint texunit, jint target, jint level, jlong img_buffer_offset, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)offsetToPointer(img_buffer_offset); + glGetCompressedMultiTexImageEXTPROC glGetCompressedMultiTexImageEXT = (glGetCompressedMultiTexImageEXTPROC)((intptr_t)function_pointer); + glGetCompressedMultiTexImageEXT(texunit, target, level, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixLoadTransposefEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMatrixLoadTransposefEXTPROC glMatrixLoadTransposefEXT = (glMatrixLoadTransposefEXTPROC)((intptr_t)function_pointer); + glMatrixLoadTransposefEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixLoadTransposedEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMatrixLoadTransposedEXTPROC glMatrixLoadTransposedEXT = (glMatrixLoadTransposedEXTPROC)((intptr_t)function_pointer); + glMatrixLoadTransposedEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixMultTransposefEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMatrixMultTransposefEXTPROC glMatrixMultTransposefEXT = (glMatrixMultTransposefEXTPROC)((intptr_t)function_pointer); + glMatrixMultTransposefEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMatrixMultTransposedEXT(JNIEnv *env, jclass clazz, jint matrixMode, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMatrixMultTransposedEXTPROC glMatrixMultTransposedEXT = (glMatrixMultTransposedEXTPROC)((intptr_t)function_pointer); + glMatrixMultTransposedEXT(matrixMode, m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedBufferDataEXT(JNIEnv *env, jclass clazz, jint buffer, jlong size, jlong data, jint usage, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glNamedBufferDataEXTPROC glNamedBufferDataEXT = (glNamedBufferDataEXTPROC)((intptr_t)function_pointer); + glNamedBufferDataEXT(buffer, size, data_address, usage); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedBufferSubDataEXT(JNIEnv *env, jclass clazz, jint buffer, jlong offset, jlong size, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glNamedBufferSubDataEXTPROC glNamedBufferSubDataEXT = (glNamedBufferSubDataEXTPROC)((intptr_t)function_pointer); + glNamedBufferSubDataEXT(buffer, offset, size, data_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMapNamedBufferEXT(JNIEnv *env, jclass clazz, jint buffer, jint access, jlong result_size, jobject old_buffer, jlong function_pointer) { + glMapNamedBufferEXTPROC glMapNamedBufferEXT = (glMapNamedBufferEXTPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapNamedBufferEXT(buffer, access); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglUnmapNamedBufferEXT(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glUnmapNamedBufferEXTPROC glUnmapNamedBufferEXT = (glUnmapNamedBufferEXTPROC)((intptr_t)function_pointer); + GLboolean __result = glUnmapNamedBufferEXT(buffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedBufferParameterivEXT(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedBufferParameterivEXTPROC glGetNamedBufferParameterivEXT = (glGetNamedBufferParameterivEXTPROC)((intptr_t)function_pointer); + glGetNamedBufferParameterivEXT(buffer, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedBufferPointervEXT(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong result_size, jlong function_pointer) { + glGetNamedBufferPointervEXTPROC glGetNamedBufferPointervEXT = (glGetNamedBufferPointervEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetNamedBufferPointervEXT(buffer, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedBufferSubDataEXT(JNIEnv *env, jclass clazz, jint buffer, jlong offset, jlong size, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetNamedBufferSubDataEXTPROC glGetNamedBufferSubDataEXT = (glGetNamedBufferSubDataEXTPROC)((intptr_t)function_pointer); + glGetNamedBufferSubDataEXT(buffer, offset, size, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jlong function_pointer) { + glProgramUniform1fEXTPROC glProgramUniform1fEXT = (glProgramUniform1fEXTPROC)((intptr_t)function_pointer); + glProgramUniform1fEXT(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jlong function_pointer) { + glProgramUniform2fEXTPROC glProgramUniform2fEXT = (glProgramUniform2fEXTPROC)((intptr_t)function_pointer); + glProgramUniform2fEXT(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jlong function_pointer) { + glProgramUniform3fEXTPROC glProgramUniform3fEXT = (glProgramUniform3fEXTPROC)((intptr_t)function_pointer); + glProgramUniform3fEXT(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3, jlong function_pointer) { + glProgramUniform4fEXTPROC glProgramUniform4fEXT = (glProgramUniform4fEXTPROC)((intptr_t)function_pointer); + glProgramUniform4fEXT(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jlong function_pointer) { + glProgramUniform1iEXTPROC glProgramUniform1iEXT = (glProgramUniform1iEXTPROC)((intptr_t)function_pointer); + glProgramUniform1iEXT(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jlong function_pointer) { + glProgramUniform2iEXTPROC glProgramUniform2iEXT = (glProgramUniform2iEXTPROC)((intptr_t)function_pointer); + glProgramUniform2iEXT(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glProgramUniform3iEXTPROC glProgramUniform3iEXT = (glProgramUniform3iEXTPROC)((intptr_t)function_pointer); + glProgramUniform3iEXT(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glProgramUniform4iEXTPROC glProgramUniform4iEXT = (glProgramUniform4iEXTPROC)((intptr_t)function_pointer); + glProgramUniform4iEXT(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform1fvEXTPROC glProgramUniform1fvEXT = (glProgramUniform1fvEXTPROC)((intptr_t)function_pointer); + glProgramUniform1fvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform2fvEXTPROC glProgramUniform2fvEXT = (glProgramUniform2fvEXTPROC)((intptr_t)function_pointer); + glProgramUniform2fvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform3fvEXTPROC glProgramUniform3fvEXT = (glProgramUniform3fvEXTPROC)((intptr_t)function_pointer); + glProgramUniform3fvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform4fvEXTPROC glProgramUniform4fvEXT = (glProgramUniform4fvEXTPROC)((intptr_t)function_pointer); + glProgramUniform4fvEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform1ivEXTPROC glProgramUniform1ivEXT = (glProgramUniform1ivEXTPROC)((intptr_t)function_pointer); + glProgramUniform1ivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform2ivEXTPROC glProgramUniform2ivEXT = (glProgramUniform2ivEXTPROC)((intptr_t)function_pointer); + glProgramUniform2ivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform3ivEXTPROC glProgramUniform3ivEXT = (glProgramUniform3ivEXTPROC)((intptr_t)function_pointer); + glProgramUniform3ivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform4ivEXTPROC glProgramUniform4ivEXT = (glProgramUniform4ivEXTPROC)((intptr_t)function_pointer); + glProgramUniform4ivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2fvEXTPROC glProgramUniformMatrix2fvEXT = (glProgramUniformMatrix2fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3fvEXTPROC glProgramUniformMatrix3fvEXT = (glProgramUniformMatrix3fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4fvEXTPROC glProgramUniformMatrix4fvEXT = (glProgramUniformMatrix4fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix2x3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2x3fvEXTPROC glProgramUniformMatrix2x3fvEXT = (glProgramUniformMatrix2x3fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix3x2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3x2fvEXTPROC glProgramUniformMatrix3x2fvEXT = (glProgramUniformMatrix3x2fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix2x4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2x4fvEXTPROC glProgramUniformMatrix2x4fvEXT = (glProgramUniformMatrix2x4fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix4x2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4x2fvEXTPROC glProgramUniformMatrix4x2fvEXT = (glProgramUniformMatrix4x2fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix3x4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3x4fvEXTPROC glProgramUniformMatrix3x4fvEXT = (glProgramUniformMatrix3x4fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniformMatrix4x3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4x3fvEXTPROC glProgramUniformMatrix4x3fvEXT = (glProgramUniformMatrix4x3fvEXTPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureBufferEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint internalformat, jint buffer, jlong function_pointer) { + glTextureBufferEXTPROC glTextureBufferEXT = (glTextureBufferEXTPROC)((intptr_t)function_pointer); + glTextureBufferEXT(texture, target, internalformat, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexBufferEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint internalformat, jint buffer, jlong function_pointer) { + glMultiTexBufferEXTPROC glMultiTexBufferEXT = (glMultiTexBufferEXTPROC)((intptr_t)function_pointer); + glMultiTexBufferEXT(texunit, target, internalformat, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameterIivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glTextureParameterIivEXTPROC glTextureParameterIivEXT = (glTextureParameterIivEXTPROC)((intptr_t)function_pointer); + glTextureParameterIivEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureParameterIuivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glTextureParameterIuivEXTPROC glTextureParameterIuivEXT = (glTextureParameterIuivEXTPROC)((intptr_t)function_pointer); + glTextureParameterIuivEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureParameterIivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTextureParameterIivEXTPROC glGetTextureParameterIivEXT = (glGetTextureParameterIivEXTPROC)((intptr_t)function_pointer); + glGetTextureParameterIivEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetTextureParameterIuivEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetTextureParameterIuivEXTPROC glGetTextureParameterIuivEXT = (glGetTextureParameterIuivEXTPROC)((intptr_t)function_pointer); + glGetTextureParameterIuivEXT(texture, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameterIivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glMultiTexParameterIivEXTPROC glMultiTexParameterIivEXT = (glMultiTexParameterIivEXTPROC)((intptr_t)function_pointer); + glMultiTexParameterIivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexParameterIuivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glMultiTexParameterIuivEXTPROC glMultiTexParameterIuivEXT = (glMultiTexParameterIuivEXTPROC)((intptr_t)function_pointer); + glMultiTexParameterIuivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexParameterIivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMultiTexParameterIivEXTPROC glGetMultiTexParameterIivEXT = (glGetMultiTexParameterIivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexParameterIivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetMultiTexParameterIuivEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetMultiTexParameterIuivEXTPROC glGetMultiTexParameterIuivEXT = (glGetMultiTexParameterIuivEXTPROC)((intptr_t)function_pointer); + glGetMultiTexParameterIuivEXT(texunit, target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1uiEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jlong function_pointer) { + glProgramUniform1uiEXTPROC glProgramUniform1uiEXT = (glProgramUniform1uiEXTPROC)((intptr_t)function_pointer); + glProgramUniform1uiEXT(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2uiEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jlong function_pointer) { + glProgramUniform2uiEXTPROC glProgramUniform2uiEXT = (glProgramUniform2uiEXTPROC)((intptr_t)function_pointer); + glProgramUniform2uiEXT(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3uiEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glProgramUniform3uiEXTPROC glProgramUniform3uiEXT = (glProgramUniform3uiEXTPROC)((intptr_t)function_pointer); + glProgramUniform3uiEXT(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4uiEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glProgramUniform4uiEXTPROC glProgramUniform4uiEXT = (glProgramUniform4uiEXTPROC)((intptr_t)function_pointer); + glProgramUniform4uiEXT(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform1uivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glProgramUniform1uivEXTPROC glProgramUniform1uivEXT = (glProgramUniform1uivEXTPROC)((intptr_t)function_pointer); + glProgramUniform1uivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform2uivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glProgramUniform2uivEXTPROC glProgramUniform2uivEXT = (glProgramUniform2uivEXTPROC)((intptr_t)function_pointer); + glProgramUniform2uivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform3uivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glProgramUniform3uivEXTPROC glProgramUniform3uivEXT = (glProgramUniform3uivEXTPROC)((intptr_t)function_pointer); + glProgramUniform3uivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglProgramUniform4uivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glProgramUniform4uivEXTPROC glProgramUniform4uivEXT = (glProgramUniform4uivEXTPROC)((intptr_t)function_pointer); + glProgramUniform4uivEXT(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameters4fvEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glNamedProgramLocalParameters4fvEXTPROC glNamedProgramLocalParameters4fvEXT = (glNamedProgramLocalParameters4fvEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameters4fvEXT(program, target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameterI4iEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glNamedProgramLocalParameterI4iEXTPROC glNamedProgramLocalParameterI4iEXT = (glNamedProgramLocalParameterI4iEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameterI4ivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glNamedProgramLocalParameterI4ivEXTPROC glNamedProgramLocalParameterI4ivEXT = (glNamedProgramLocalParameterI4ivEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameterI4ivEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParametersI4ivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glNamedProgramLocalParametersI4ivEXTPROC glNamedProgramLocalParametersI4ivEXT = (glNamedProgramLocalParametersI4ivEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameterI4uiEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glNamedProgramLocalParameterI4uiEXTPROC glNamedProgramLocalParameterI4uiEXT = (glNamedProgramLocalParameterI4uiEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParameterI4uivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glNamedProgramLocalParameterI4uivEXTPROC glNamedProgramLocalParameterI4uivEXT = (glNamedProgramLocalParameterI4uivEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParameterI4uivEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedProgramLocalParametersI4uivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glNamedProgramLocalParametersI4uivEXTPROC glNamedProgramLocalParametersI4uivEXT = (glNamedProgramLocalParametersI4uivEXTPROC)((intptr_t)function_pointer); + glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramLocalParameterIivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedProgramLocalParameterIivEXTPROC glGetNamedProgramLocalParameterIivEXT = (glGetNamedProgramLocalParameterIivEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramLocalParameterIivEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedProgramLocalParameterIuivEXT(JNIEnv *env, jclass clazz, jint program, jint target, jint index, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetNamedProgramLocalParameterIuivEXTPROC glGetNamedProgramLocalParameterIuivEXT = (glGetNamedProgramLocalParameterIuivEXTPROC)((intptr_t)function_pointer); + glGetNamedProgramLocalParameterIuivEXT(program, target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedRenderbufferStorageEXT(JNIEnv *env, jclass clazz, jint renderbuffer, jint internalformat, jint width, jint height, jlong function_pointer) { + glNamedRenderbufferStorageEXTPROC glNamedRenderbufferStorageEXT = (glNamedRenderbufferStorageEXTPROC)((intptr_t)function_pointer); + glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedRenderbufferParameterivEXT(JNIEnv *env, jclass clazz, jint renderbuffer, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedRenderbufferParameterivEXTPROC glGetNamedRenderbufferParameterivEXT = (glGetNamedRenderbufferParameterivEXTPROC)((intptr_t)function_pointer); + glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedRenderbufferStorageMultisampleEXT(JNIEnv *env, jclass clazz, jint renderbuffer, jint samples, jint internalformat, jint width, jint height, jlong function_pointer) { + glNamedRenderbufferStorageMultisampleEXTPROC glNamedRenderbufferStorageMultisampleEXT = (glNamedRenderbufferStorageMultisampleEXTPROC)((intptr_t)function_pointer); + glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedRenderbufferStorageMultisampleCoverageEXT(JNIEnv *env, jclass clazz, jint renderbuffer, jint coverageSamples, jint colorSamples, jint internalformat, jint width, jint height, jlong function_pointer) { + glNamedRenderbufferStorageMultisampleCoverageEXTPROC glNamedRenderbufferStorageMultisampleCoverageEXT = (glNamedRenderbufferStorageMultisampleCoverageEXTPROC)((intptr_t)function_pointer); + glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglCheckNamedFramebufferStatusEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint target, jlong function_pointer) { + glCheckNamedFramebufferStatusEXTPROC glCheckNamedFramebufferStatusEXT = (glCheckNamedFramebufferStatusEXTPROC)((intptr_t)function_pointer); + GLenum __result = glCheckNamedFramebufferStatusEXT(framebuffer, target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTexture1DEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glNamedFramebufferTexture1DEXTPROC glNamedFramebufferTexture1DEXT = (glNamedFramebufferTexture1DEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTexture2DEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glNamedFramebufferTexture2DEXTPROC glNamedFramebufferTexture2DEXT = (glNamedFramebufferTexture2DEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTexture3DEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint textarget, jint texture, jint level, jint zoffset, jlong function_pointer) { + glNamedFramebufferTexture3DEXTPROC glNamedFramebufferTexture3DEXT = (glNamedFramebufferTexture3DEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferRenderbufferEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint renderbuffertarget, jint renderbuffer, jlong function_pointer) { + glNamedFramebufferRenderbufferEXTPROC glNamedFramebufferRenderbufferEXT = (glNamedFramebufferRenderbufferEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetNamedFramebufferAttachmentParameterivEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetNamedFramebufferAttachmentParameterivEXTPROC glGetNamedFramebufferAttachmentParameterivEXT = (glGetNamedFramebufferAttachmentParameterivEXTPROC)((intptr_t)function_pointer); + glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGenerateTextureMipmapEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jlong function_pointer) { + glGenerateTextureMipmapEXTPROC glGenerateTextureMipmapEXT = (glGenerateTextureMipmapEXTPROC)((intptr_t)function_pointer); + glGenerateTextureMipmapEXT(texture, target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGenerateMultiTexMipmapEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jlong function_pointer) { + glGenerateMultiTexMipmapEXTPROC glGenerateMultiTexMipmapEXT = (glGenerateMultiTexMipmapEXTPROC)((intptr_t)function_pointer); + glGenerateMultiTexMipmapEXT(texunit, target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglFramebufferDrawBufferEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint mode, jlong function_pointer) { + glFramebufferDrawBufferEXTPROC glFramebufferDrawBufferEXT = (glFramebufferDrawBufferEXTPROC)((intptr_t)function_pointer); + glFramebufferDrawBufferEXT(framebuffer, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglFramebufferDrawBuffersEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint n, jlong bufs, jlong function_pointer) { + const GLenum *bufs_address = (const GLenum *)(intptr_t)bufs; + glFramebufferDrawBuffersEXTPROC glFramebufferDrawBuffersEXT = (glFramebufferDrawBuffersEXTPROC)((intptr_t)function_pointer); + glFramebufferDrawBuffersEXT(framebuffer, n, bufs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglFramebufferReadBufferEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint mode, jlong function_pointer) { + glFramebufferReadBufferEXTPROC glFramebufferReadBufferEXT = (glFramebufferReadBufferEXTPROC)((intptr_t)function_pointer); + glFramebufferReadBufferEXT(framebuffer, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetFramebufferParameterivEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint pname, jlong param, jlong function_pointer) { + GLint *param_address = (GLint *)(intptr_t)param; + glGetFramebufferParameterivEXTPROC glGetFramebufferParameterivEXT = (glGetFramebufferParameterivEXTPROC)((intptr_t)function_pointer); + glGetFramebufferParameterivEXT(framebuffer, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedCopyBufferSubDataEXT(JNIEnv *env, jclass clazz, jint readBuffer, jint writeBuffer, jlong readoffset, jlong writeoffset, jlong size, jlong function_pointer) { + glNamedCopyBufferSubDataEXTPROC glNamedCopyBufferSubDataEXT = (glNamedCopyBufferSubDataEXTPROC)((intptr_t)function_pointer); + glNamedCopyBufferSubDataEXT(readBuffer, writeBuffer, readoffset, writeoffset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTextureEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint texture, jint level, jlong function_pointer) { + glNamedFramebufferTextureEXTPROC glNamedFramebufferTextureEXT = (glNamedFramebufferTextureEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTextureLayerEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint texture, jint level, jint layer, jlong function_pointer) { + glNamedFramebufferTextureLayerEXTPROC glNamedFramebufferTextureLayerEXT = (glNamedFramebufferTextureLayerEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglNamedFramebufferTextureFaceEXT(JNIEnv *env, jclass clazz, jint framebuffer, jint attachment, jint texture, jint level, jint face, jlong function_pointer) { + glNamedFramebufferTextureFaceEXTPROC glNamedFramebufferTextureFaceEXT = (glNamedFramebufferTextureFaceEXTPROC)((intptr_t)function_pointer); + glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglTextureRenderbufferEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint renderbuffer, jlong function_pointer) { + glTextureRenderbufferEXTPROC glTextureRenderbufferEXT = (glTextureRenderbufferEXTPROC)((intptr_t)function_pointer); + glTextureRenderbufferEXT(texture, target, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMultiTexRenderbufferEXT(JNIEnv *env, jclass clazz, jint texunit, jint target, jint renderbuffer, jlong function_pointer) { + glMultiTexRenderbufferEXTPROC glMultiTexRenderbufferEXT = (glMultiTexRenderbufferEXTPROC)((intptr_t)function_pointer); + glMultiTexRenderbufferEXT(texunit, target, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayVertexOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayVertexOffsetEXTPROC glVertexArrayVertexOffsetEXT = (glVertexArrayVertexOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayVertexOffsetEXT(vaobj, buffer, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayColorOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayColorOffsetEXTPROC glVertexArrayColorOffsetEXT = (glVertexArrayColorOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayColorOffsetEXT(vaobj, buffer, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayEdgeFlagOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayEdgeFlagOffsetEXTPROC glVertexArrayEdgeFlagOffsetEXT = (glVertexArrayEdgeFlagOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayEdgeFlagOffsetEXT(vaobj, buffer, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayIndexOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayIndexOffsetEXTPROC glVertexArrayIndexOffsetEXT = (glVertexArrayIndexOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayIndexOffsetEXT(vaobj, buffer, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayNormalOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayNormalOffsetEXTPROC glVertexArrayNormalOffsetEXT = (glVertexArrayNormalOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayNormalOffsetEXT(vaobj, buffer, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayTexCoordOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayTexCoordOffsetEXTPROC glVertexArrayTexCoordOffsetEXT = (glVertexArrayTexCoordOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayTexCoordOffsetEXT(vaobj, buffer, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayMultiTexCoordOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint texunit, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayMultiTexCoordOffsetEXTPROC glVertexArrayMultiTexCoordOffsetEXT = (glVertexArrayMultiTexCoordOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayMultiTexCoordOffsetEXT(vaobj, buffer, texunit, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayFogCoordOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayFogCoordOffsetEXTPROC glVertexArrayFogCoordOffsetEXT = (glVertexArrayFogCoordOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayFogCoordOffsetEXT(vaobj, buffer, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArraySecondaryColorOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArraySecondaryColorOffsetEXTPROC glVertexArraySecondaryColorOffsetEXT = (glVertexArraySecondaryColorOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArraySecondaryColorOffsetEXT(vaobj, buffer, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayVertexAttribOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint index, jint size, jint type, jboolean normalized, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayVertexAttribOffsetEXTPROC glVertexArrayVertexAttribOffsetEXT = (glVertexArrayVertexAttribOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglVertexArrayVertexAttribIOffsetEXT(JNIEnv *env, jclass clazz, jint vaobj, jint buffer, jint index, jint size, jint type, jint stride, jlong offset, jlong function_pointer) { + glVertexArrayVertexAttribIOffsetEXTPROC glVertexArrayVertexAttribIOffsetEXT = (glVertexArrayVertexAttribIOffsetEXTPROC)((intptr_t)function_pointer); + glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglEnableVertexArrayEXT(JNIEnv *env, jclass clazz, jint vaobj, jint array, jlong function_pointer) { + glEnableVertexArrayEXTPROC glEnableVertexArrayEXT = (glEnableVertexArrayEXTPROC)((intptr_t)function_pointer); + glEnableVertexArrayEXT(vaobj, array); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglDisableVertexArrayEXT(JNIEnv *env, jclass clazz, jint vaobj, jint array, jlong function_pointer) { + glDisableVertexArrayEXTPROC glDisableVertexArrayEXT = (glDisableVertexArrayEXTPROC)((intptr_t)function_pointer); + glDisableVertexArrayEXT(vaobj, array); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglEnableVertexArrayAttribEXT(JNIEnv *env, jclass clazz, jint vaobj, jint index, jlong function_pointer) { + glEnableVertexArrayAttribEXTPROC glEnableVertexArrayAttribEXT = (glEnableVertexArrayAttribEXTPROC)((intptr_t)function_pointer); + glEnableVertexArrayAttribEXT(vaobj, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglDisableVertexArrayAttribEXT(JNIEnv *env, jclass clazz, jint vaobj, jint index, jlong function_pointer) { + glDisableVertexArrayAttribEXTPROC glDisableVertexArrayAttribEXT = (glDisableVertexArrayAttribEXTPROC)((intptr_t)function_pointer); + glDisableVertexArrayAttribEXT(vaobj, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetVertexArrayIntegervEXT(JNIEnv *env, jclass clazz, jint vaobj, jint pname, jlong param, jlong function_pointer) { + GLint *param_address = (GLint *)(intptr_t)param; + glGetVertexArrayIntegervEXTPROC glGetVertexArrayIntegervEXT = (glGetVertexArrayIntegervEXTPROC)((intptr_t)function_pointer); + glGetVertexArrayIntegervEXT(vaobj, pname, param_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetVertexArrayPointervEXT(JNIEnv *env, jclass clazz, jint vaobj, jint pname, jlong result_size, jlong function_pointer) { + glGetVertexArrayPointervEXTPROC glGetVertexArrayPointervEXT = (glGetVertexArrayPointervEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVertexArrayPointervEXT(vaobj, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetVertexArrayIntegeri_1vEXT(JNIEnv *env, jclass clazz, jint vaobj, jint index, jint pname, jlong param, jlong function_pointer) { + GLint *param_address = (GLint *)(intptr_t)param; + glGetVertexArrayIntegeri_vEXTPROC glGetVertexArrayIntegeri_vEXT = (glGetVertexArrayIntegeri_vEXTPROC)((intptr_t)function_pointer); + glGetVertexArrayIntegeri_vEXT(vaobj, index, pname, param_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglGetVertexArrayPointeri_1vEXT(JNIEnv *env, jclass clazz, jint vaobj, jint index, jint pname, jlong result_size, jlong function_pointer) { + glGetVertexArrayPointeri_vEXTPROC glGetVertexArrayPointeri_vEXT = (glGetVertexArrayPointeri_vEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVertexArrayPointeri_vEXT(vaobj, index, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglMapNamedBufferRangeEXT(JNIEnv *env, jclass clazz, jint buffer, jlong offset, jlong length, jint access, jobject old_buffer, jlong function_pointer) { + glMapNamedBufferRangeEXTPROC glMapNamedBufferRangeEXT = (glMapNamedBufferRangeEXTPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapNamedBufferRangeEXT(buffer, offset, length, access); + return safeNewBufferCached(env, __result, length, old_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDirectStateAccess_nglFlushMappedNamedBufferRangeEXT(JNIEnv *env, jclass clazz, jint buffer, jlong offset, jlong length, jlong function_pointer) { + glFlushMappedNamedBufferRangeEXTPROC glFlushMappedNamedBufferRangeEXT = (glFlushMappedNamedBufferRangeEXTPROC)((intptr_t)function_pointer); + glFlushMappedNamedBufferRangeEXT(buffer, offset, length); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawBuffers2.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawBuffers2.c new file mode 100644 index 0000000..83008bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawBuffers2.c @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glColorMaskIndexedEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRY *glGetBooleanIndexedvEXTPROC) (GLenum value, GLuint index, GLboolean * data); +typedef void (APIENTRY *glGetIntegerIndexedvEXTPROC) (GLenum value, GLuint index, GLint * data); +typedef void (APIENTRY *glEnableIndexedEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRY *glDisableIndexedEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRY *glIsEnabledIndexedEXTPROC) (GLenum target, GLuint index); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglColorMaskIndexedEXT(JNIEnv *env, jclass clazz, jint buf, jboolean r, jboolean g, jboolean b, jboolean a, jlong function_pointer) { + glColorMaskIndexedEXTPROC glColorMaskIndexedEXT = (glColorMaskIndexedEXTPROC)((intptr_t)function_pointer); + glColorMaskIndexedEXT(buf, r, g, b, a); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglGetBooleanIndexedvEXT(JNIEnv *env, jclass clazz, jint value, jint index, jlong data, jlong function_pointer) { + GLboolean *data_address = (GLboolean *)(intptr_t)data; + glGetBooleanIndexedvEXTPROC glGetBooleanIndexedvEXT = (glGetBooleanIndexedvEXTPROC)((intptr_t)function_pointer); + glGetBooleanIndexedvEXT(value, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglGetIntegerIndexedvEXT(JNIEnv *env, jclass clazz, jint value, jint index, jlong data, jlong function_pointer) { + GLint *data_address = (GLint *)(intptr_t)data; + glGetIntegerIndexedvEXTPROC glGetIntegerIndexedvEXT = (glGetIntegerIndexedvEXTPROC)((intptr_t)function_pointer); + glGetIntegerIndexedvEXT(value, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglEnableIndexedEXT(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glEnableIndexedEXTPROC glEnableIndexedEXT = (glEnableIndexedEXTPROC)((intptr_t)function_pointer); + glEnableIndexedEXT(target, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglDisableIndexedEXT(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glDisableIndexedEXTPROC glDisableIndexedEXT = (glDisableIndexedEXTPROC)((intptr_t)function_pointer); + glDisableIndexedEXT(target, index); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_EXTDrawBuffers2_nglIsEnabledIndexedEXT(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glIsEnabledIndexedEXTPROC glIsEnabledIndexedEXT = (glIsEnabledIndexedEXTPROC)((intptr_t)function_pointer); + GLboolean __result = glIsEnabledIndexedEXT(target, index); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawInstanced.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawInstanced.c new file mode 100644 index 0000000..5e489aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawInstanced.c @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawArraysInstancedEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRY *glDrawElementsInstancedEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawInstanced_nglDrawArraysInstancedEXT(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jint primcount, jlong function_pointer) { + glDrawArraysInstancedEXTPROC glDrawArraysInstancedEXT = (glDrawArraysInstancedEXTPROC)((intptr_t)function_pointer); + glDrawArraysInstancedEXT(mode, first, count, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawInstanced_nglDrawElementsInstancedEXT(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedEXTPROC glDrawElementsInstancedEXT = (glDrawElementsInstancedEXTPROC)((intptr_t)function_pointer); + glDrawElementsInstancedEXT(mode, count, type, indices_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawInstanced_nglDrawElementsInstancedEXTBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedEXTPROC glDrawElementsInstancedEXT = (glDrawElementsInstancedEXTPROC)((intptr_t)function_pointer); + glDrawElementsInstancedEXT(mode, count, type, indices_address, primcount); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawRangeElements.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawRangeElements.c new file mode 100644 index 0000000..0a34069 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTDrawRangeElements.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawRangeElementsEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * pIndices); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawRangeElements_nglDrawRangeElementsEXT(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong pIndices, jlong function_pointer) { + const GLvoid *pIndices_address = (const GLvoid *)(intptr_t)pIndices; + glDrawRangeElementsEXTPROC glDrawRangeElementsEXT = (glDrawRangeElementsEXTPROC)((intptr_t)function_pointer); + glDrawRangeElementsEXT(mode, start, end, count, type, pIndices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTDrawRangeElements_nglDrawRangeElementsEXTBO(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong pIndices_buffer_offset, jlong function_pointer) { + const GLvoid *pIndices_address = (const GLvoid *)(intptr_t)offsetToPointer(pIndices_buffer_offset); + glDrawRangeElementsEXTPROC glDrawRangeElementsEXT = (glDrawRangeElementsEXTPROC)((intptr_t)function_pointer); + glDrawRangeElementsEXT(mode, start, end, count, type, pIndices_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFogCoord.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFogCoord.c new file mode 100644 index 0000000..9209732 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFogCoord.c @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glFogCoordfEXTPROC) (GLfloat coord); +typedef void (APIENTRY *glFogCoorddEXTPROC) (GLdouble coord); +typedef void (APIENTRY *glFogCoordPointerEXTPROC) (GLenum type, GLsizei stride, const GLvoid * data); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFogCoord_nglFogCoordfEXT(JNIEnv *env, jclass clazz, jfloat coord, jlong function_pointer) { + glFogCoordfEXTPROC glFogCoordfEXT = (glFogCoordfEXTPROC)((intptr_t)function_pointer); + glFogCoordfEXT(coord); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFogCoord_nglFogCoorddEXT(JNIEnv *env, jclass clazz, jdouble coord, jlong function_pointer) { + glFogCoorddEXTPROC glFogCoorddEXT = (glFogCoorddEXTPROC)((intptr_t)function_pointer); + glFogCoorddEXT(coord); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFogCoord_nglFogCoordPointerEXT(JNIEnv *env, jclass clazz, jint type, jint stride, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glFogCoordPointerEXTPROC glFogCoordPointerEXT = (glFogCoordPointerEXTPROC)((intptr_t)function_pointer); + glFogCoordPointerEXT(type, stride, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFogCoord_nglFogCoordPointerEXTBO(JNIEnv *env, jclass clazz, jint type, jint stride, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glFogCoordPointerEXTPROC glFogCoordPointerEXT = (glFogCoordPointerEXTPROC)((intptr_t)function_pointer); + glFogCoordPointerEXT(type, stride, data_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferBlit.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferBlit.c new file mode 100644 index 0000000..9407c40 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferBlit.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlitFramebufferEXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferBlit_nglBlitFramebufferEXT(JNIEnv *env, jclass clazz, jint srcX0, jint srcY0, jint srcX1, jint srcY1, jint dstX0, jint dstY0, jint dstX1, jint dstY1, jint mask, jint filter, jlong function_pointer) { + glBlitFramebufferEXTPROC glBlitFramebufferEXT = (glBlitFramebufferEXTPROC)((intptr_t)function_pointer); + glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferMultisample.c new file mode 100644 index 0000000..cf49fe5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferMultisample.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glRenderbufferStorageMultisampleEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferMultisample_nglRenderbufferStorageMultisampleEXT(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jlong function_pointer) { + glRenderbufferStorageMultisampleEXTPROC glRenderbufferStorageMultisampleEXT = (glRenderbufferStorageMultisampleEXTPROC)((intptr_t)function_pointer); + glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferObject.c new file mode 100644 index 0000000..9d5777a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTFramebufferObject.c @@ -0,0 +1,117 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLboolean (APIENTRY *glIsRenderbufferEXTPROC) (GLuint renderbuffer); +typedef void (APIENTRY *glBindRenderbufferEXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRY *glDeleteRenderbuffersEXTPROC) (GLint n, const GLuint * renderbuffers); +typedef void (APIENTRY *glGenRenderbuffersEXTPROC) (GLint n, GLuint * renderbuffers); +typedef void (APIENTRY *glRenderbufferStorageEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetRenderbufferParameterivEXTPROC) (GLenum target, GLenum pname, GLint * params); +typedef GLboolean (APIENTRY *glIsFramebufferEXTPROC) (GLuint framebuffer); +typedef void (APIENTRY *glBindFramebufferEXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRY *glDeleteFramebuffersEXTPROC) (GLint n, const GLuint * framebuffers); +typedef void (APIENTRY *glGenFramebuffersEXTPROC) (GLint n, GLuint * framebuffers); +typedef GLenum (APIENTRY *glCheckFramebufferStatusEXTPROC) (GLenum target); +typedef void (APIENTRY *glFramebufferTexture1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTexture2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTexture3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRY *glFramebufferRenderbufferEXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRY *glGetFramebufferAttachmentParameterivEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (APIENTRY *glGenerateMipmapEXTPROC) (GLenum target); + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglIsRenderbufferEXT(JNIEnv *env, jclass clazz, jint renderbuffer, jlong function_pointer) { + glIsRenderbufferEXTPROC glIsRenderbufferEXT = (glIsRenderbufferEXTPROC)((intptr_t)function_pointer); + GLboolean __result = glIsRenderbufferEXT(renderbuffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglBindRenderbufferEXT(JNIEnv *env, jclass clazz, jint target, jint renderbuffer, jlong function_pointer) { + glBindRenderbufferEXTPROC glBindRenderbufferEXT = (glBindRenderbufferEXTPROC)((intptr_t)function_pointer); + glBindRenderbufferEXT(target, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglDeleteRenderbuffersEXT(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers, jlong function_pointer) { + const GLuint *renderbuffers_address = (const GLuint *)(intptr_t)renderbuffers; + glDeleteRenderbuffersEXTPROC glDeleteRenderbuffersEXT = (glDeleteRenderbuffersEXTPROC)((intptr_t)function_pointer); + glDeleteRenderbuffersEXT(n, renderbuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglGenRenderbuffersEXT(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers, jlong function_pointer) { + GLuint *renderbuffers_address = (GLuint *)(intptr_t)renderbuffers; + glGenRenderbuffersEXTPROC glGenRenderbuffersEXT = (glGenRenderbuffersEXTPROC)((intptr_t)function_pointer); + glGenRenderbuffersEXT(n, renderbuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglRenderbufferStorageEXT(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jlong function_pointer) { + glRenderbufferStorageEXTPROC glRenderbufferStorageEXT = (glRenderbufferStorageEXTPROC)((intptr_t)function_pointer); + glRenderbufferStorageEXT(target, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglGetRenderbufferParameterivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetRenderbufferParameterivEXTPROC glGetRenderbufferParameterivEXT = (glGetRenderbufferParameterivEXTPROC)((intptr_t)function_pointer); + glGetRenderbufferParameterivEXT(target, pname, params_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglIsFramebufferEXT(JNIEnv *env, jclass clazz, jint framebuffer, jlong function_pointer) { + glIsFramebufferEXTPROC glIsFramebufferEXT = (glIsFramebufferEXTPROC)((intptr_t)function_pointer); + GLboolean __result = glIsFramebufferEXT(framebuffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglBindFramebufferEXT(JNIEnv *env, jclass clazz, jint target, jint framebuffer, jlong function_pointer) { + glBindFramebufferEXTPROC glBindFramebufferEXT = (glBindFramebufferEXTPROC)((intptr_t)function_pointer); + glBindFramebufferEXT(target, framebuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglDeleteFramebuffersEXT(JNIEnv *env, jclass clazz, jint n, jlong framebuffers, jlong function_pointer) { + const GLuint *framebuffers_address = (const GLuint *)(intptr_t)framebuffers; + glDeleteFramebuffersEXTPROC glDeleteFramebuffersEXT = (glDeleteFramebuffersEXTPROC)((intptr_t)function_pointer); + glDeleteFramebuffersEXT(n, framebuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglGenFramebuffersEXT(JNIEnv *env, jclass clazz, jint n, jlong framebuffers, jlong function_pointer) { + GLuint *framebuffers_address = (GLuint *)(intptr_t)framebuffers; + glGenFramebuffersEXTPROC glGenFramebuffersEXT = (glGenFramebuffersEXTPROC)((intptr_t)function_pointer); + glGenFramebuffersEXT(n, framebuffers_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglCheckFramebufferStatusEXT(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glCheckFramebufferStatusEXTPROC glCheckFramebufferStatusEXT = (glCheckFramebufferStatusEXTPROC)((intptr_t)function_pointer); + GLenum __result = glCheckFramebufferStatusEXT(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglFramebufferTexture1DEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glFramebufferTexture1DEXTPROC glFramebufferTexture1DEXT = (glFramebufferTexture1DEXTPROC)((intptr_t)function_pointer); + glFramebufferTexture1DEXT(target, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglFramebufferTexture2DEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glFramebufferTexture2DEXTPROC glFramebufferTexture2DEXT = (glFramebufferTexture2DEXTPROC)((intptr_t)function_pointer); + glFramebufferTexture2DEXT(target, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglFramebufferTexture3DEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint zoffset, jlong function_pointer) { + glFramebufferTexture3DEXTPROC glFramebufferTexture3DEXT = (glFramebufferTexture3DEXTPROC)((intptr_t)function_pointer); + glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglFramebufferRenderbufferEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint renderbuffertarget, jint renderbuffer, jlong function_pointer) { + glFramebufferRenderbufferEXTPROC glFramebufferRenderbufferEXT = (glFramebufferRenderbufferEXTPROC)((intptr_t)function_pointer); + glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglGetFramebufferAttachmentParameterivEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFramebufferAttachmentParameterivEXTPROC glGetFramebufferAttachmentParameterivEXT = (glGetFramebufferAttachmentParameterivEXTPROC)((intptr_t)function_pointer); + glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTFramebufferObject_nglGenerateMipmapEXT(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glGenerateMipmapEXTPROC glGenerateMipmapEXT = (glGenerateMipmapEXTPROC)((intptr_t)function_pointer); + glGenerateMipmapEXT(target); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGeometryShader4.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGeometryShader4.c new file mode 100644 index 0000000..1bb7839 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGeometryShader4.c @@ -0,0 +1,30 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramParameteriEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRY *glFramebufferTextureEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTextureLayerEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRY *glFramebufferTextureFaceEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGeometryShader4_nglProgramParameteriEXT(JNIEnv *env, jclass clazz, jint program, jint pname, jint value, jlong function_pointer) { + glProgramParameteriEXTPROC glProgramParameteriEXT = (glProgramParameteriEXTPROC)((intptr_t)function_pointer); + glProgramParameteriEXT(program, pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGeometryShader4_nglFramebufferTextureEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jlong function_pointer) { + glFramebufferTextureEXTPROC glFramebufferTextureEXT = (glFramebufferTextureEXTPROC)((intptr_t)function_pointer); + glFramebufferTextureEXT(target, attachment, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGeometryShader4_nglFramebufferTextureLayerEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer, jlong function_pointer) { + glFramebufferTextureLayerEXTPROC glFramebufferTextureLayerEXT = (glFramebufferTextureLayerEXTPROC)((intptr_t)function_pointer); + glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGeometryShader4_nglFramebufferTextureFaceEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint face, jlong function_pointer) { + glFramebufferTextureFaceEXTPROC glFramebufferTextureFaceEXT = (glFramebufferTextureFaceEXTPROC)((intptr_t)function_pointer); + glFramebufferTextureFaceEXT(target, attachment, texture, level, face); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuProgramParameters.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuProgramParameters.c new file mode 100644 index 0000000..7484d7a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuProgramParameters.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramEnvParameters4fvEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (APIENTRY *glProgramLocalParameters4fvEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuProgramParameters_nglProgramEnvParameters4fvEXT(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramEnvParameters4fvEXTPROC glProgramEnvParameters4fvEXT = (glProgramEnvParameters4fvEXTPROC)((intptr_t)function_pointer); + glProgramEnvParameters4fvEXT(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuProgramParameters_nglProgramLocalParameters4fvEXT(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramLocalParameters4fvEXTPROC glProgramLocalParameters4fvEXT = (glProgramLocalParameters4fvEXTPROC)((intptr_t)function_pointer); + glProgramLocalParameters4fvEXT(target, index, count, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuShader4.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuShader4.c new file mode 100644 index 0000000..b4f938d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTGpuShader4.c @@ -0,0 +1,239 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribI1iEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRY *glVertexAttribI2iEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRY *glVertexAttribI3iEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRY *glVertexAttribI4iEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glVertexAttribI1uiEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRY *glVertexAttribI2uiEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRY *glVertexAttribI3uiEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRY *glVertexAttribI4uiEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRY *glVertexAttribI1ivEXTPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI2ivEXTPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI3ivEXTPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI4ivEXTPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI1uivEXTPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI2uivEXTPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI3uivEXTPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI4uivEXTPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI4bvEXTPROC) (GLuint index, const GLbyte * v); +typedef void (APIENTRY *glVertexAttribI4svEXTPROC) (GLuint index, const GLshort * v); +typedef void (APIENTRY *glVertexAttribI4ubvEXTPROC) (GLuint index, const GLubyte * v); +typedef void (APIENTRY *glVertexAttribI4usvEXTPROC) (GLuint index, const GLushort * v); +typedef void (APIENTRY *glVertexAttribIPointerEXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * buffer); +typedef void (APIENTRY *glGetVertexAttribIivEXTPROC) (GLuint index, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVertexAttribIuivEXTPROC) (GLuint index, GLenum pname, GLuint * params); +typedef void (APIENTRY *glUniform1uiEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRY *glUniform2uiEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRY *glUniform3uiEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRY *glUniform4uiEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRY *glUniform1uivEXTPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform2uivEXTPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform3uivEXTPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform4uivEXTPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glGetUniformuivEXTPROC) (GLuint program, GLint location, GLuint * params); +typedef void (APIENTRY *glBindFragDataLocationEXTPROC) (GLuint program, GLuint colorNumber, const GLchar * name); +typedef GLint (APIENTRY *glGetFragDataLocationEXTPROC) (GLuint program, const GLchar * name); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI1iEXT(JNIEnv *env, jclass clazz, jint index, jint x, jlong function_pointer) { + glVertexAttribI1iEXTPROC glVertexAttribI1iEXT = (glVertexAttribI1iEXTPROC)((intptr_t)function_pointer); + glVertexAttribI1iEXT(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI2iEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jlong function_pointer) { + glVertexAttribI2iEXTPROC glVertexAttribI2iEXT = (glVertexAttribI2iEXTPROC)((intptr_t)function_pointer); + glVertexAttribI2iEXT(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI3iEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jlong function_pointer) { + glVertexAttribI3iEXTPROC glVertexAttribI3iEXT = (glVertexAttribI3iEXTPROC)((intptr_t)function_pointer); + glVertexAttribI3iEXT(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4iEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertexAttribI4iEXTPROC glVertexAttribI4iEXT = (glVertexAttribI4iEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4iEXT(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI1uiEXT(JNIEnv *env, jclass clazz, jint index, jint x, jlong function_pointer) { + glVertexAttribI1uiEXTPROC glVertexAttribI1uiEXT = (glVertexAttribI1uiEXTPROC)((intptr_t)function_pointer); + glVertexAttribI1uiEXT(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI2uiEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jlong function_pointer) { + glVertexAttribI2uiEXTPROC glVertexAttribI2uiEXT = (glVertexAttribI2uiEXTPROC)((intptr_t)function_pointer); + glVertexAttribI2uiEXT(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI3uiEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jlong function_pointer) { + glVertexAttribI3uiEXTPROC glVertexAttribI3uiEXT = (glVertexAttribI3uiEXTPROC)((intptr_t)function_pointer); + glVertexAttribI3uiEXT(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4uiEXT(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertexAttribI4uiEXTPROC glVertexAttribI4uiEXT = (glVertexAttribI4uiEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4uiEXT(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI1ivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI1ivEXTPROC glVertexAttribI1ivEXT = (glVertexAttribI1ivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI1ivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI2ivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI2ivEXTPROC glVertexAttribI2ivEXT = (glVertexAttribI2ivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI2ivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI3ivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI3ivEXTPROC glVertexAttribI3ivEXT = (glVertexAttribI3ivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI3ivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4ivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI4ivEXTPROC glVertexAttribI4ivEXT = (glVertexAttribI4ivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4ivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI1uivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI1uivEXTPROC glVertexAttribI1uivEXT = (glVertexAttribI1uivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI1uivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI2uivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI2uivEXTPROC glVertexAttribI2uivEXT = (glVertexAttribI2uivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI2uivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI3uivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI3uivEXTPROC glVertexAttribI3uivEXT = (glVertexAttribI3uivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI3uivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4uivEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI4uivEXTPROC glVertexAttribI4uivEXT = (glVertexAttribI4uivEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4uivEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4bvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLbyte *v_address = (const GLbyte *)(intptr_t)v; + glVertexAttribI4bvEXTPROC glVertexAttribI4bvEXT = (glVertexAttribI4bvEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4bvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4svEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribI4svEXTPROC glVertexAttribI4svEXT = (glVertexAttribI4svEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4svEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4ubvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLubyte *v_address = (const GLubyte *)(intptr_t)v; + glVertexAttribI4ubvEXTPROC glVertexAttribI4ubvEXT = (glVertexAttribI4ubvEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4ubvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribI4usvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLushort *v_address = (const GLushort *)(intptr_t)v; + glVertexAttribI4usvEXTPROC glVertexAttribI4usvEXT = (glVertexAttribI4usvEXTPROC)((intptr_t)function_pointer); + glVertexAttribI4usvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribIPointerEXT(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribIPointerEXTPROC glVertexAttribIPointerEXT = (glVertexAttribIPointerEXTPROC)((intptr_t)function_pointer); + glVertexAttribIPointerEXT(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglVertexAttribIPointerEXTBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer_buffer_offset, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribIPointerEXTPROC glVertexAttribIPointerEXT = (glVertexAttribIPointerEXTPROC)((intptr_t)function_pointer); + glVertexAttribIPointerEXT(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglGetVertexAttribIivEXT(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribIivEXTPROC glGetVertexAttribIivEXT = (glGetVertexAttribIivEXTPROC)((intptr_t)function_pointer); + glGetVertexAttribIivEXT(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglGetVertexAttribIuivEXT(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetVertexAttribIuivEXTPROC glGetVertexAttribIuivEXT = (glGetVertexAttribIuivEXTPROC)((intptr_t)function_pointer); + glGetVertexAttribIuivEXT(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform1uiEXT(JNIEnv *env, jclass clazz, jint location, jint v0, jlong function_pointer) { + glUniform1uiEXTPROC glUniform1uiEXT = (glUniform1uiEXTPROC)((intptr_t)function_pointer); + glUniform1uiEXT(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform2uiEXT(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jlong function_pointer) { + glUniform2uiEXTPROC glUniform2uiEXT = (glUniform2uiEXTPROC)((intptr_t)function_pointer); + glUniform2uiEXT(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform3uiEXT(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glUniform3uiEXTPROC glUniform3uiEXT = (glUniform3uiEXTPROC)((intptr_t)function_pointer); + glUniform3uiEXT(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform4uiEXT(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glUniform4uiEXTPROC glUniform4uiEXT = (glUniform4uiEXTPROC)((intptr_t)function_pointer); + glUniform4uiEXT(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform1uivEXT(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform1uivEXTPROC glUniform1uivEXT = (glUniform1uivEXTPROC)((intptr_t)function_pointer); + glUniform1uivEXT(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform2uivEXT(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform2uivEXTPROC glUniform2uivEXT = (glUniform2uivEXTPROC)((intptr_t)function_pointer); + glUniform2uivEXT(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform3uivEXT(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform3uivEXTPROC glUniform3uivEXT = (glUniform3uivEXTPROC)((intptr_t)function_pointer); + glUniform3uivEXT(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglUniform4uivEXT(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform4uivEXTPROC glUniform4uivEXT = (glUniform4uivEXTPROC)((intptr_t)function_pointer); + glUniform4uivEXT(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglGetUniformuivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetUniformuivEXTPROC glGetUniformuivEXT = (glGetUniformuivEXTPROC)((intptr_t)function_pointer); + glGetUniformuivEXT(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglBindFragDataLocationEXT(JNIEnv *env, jclass clazz, jint program, jint colorNumber, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glBindFragDataLocationEXTPROC glBindFragDataLocationEXT = (glBindFragDataLocationEXTPROC)((intptr_t)function_pointer); + glBindFragDataLocationEXT(program, colorNumber, name_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTGpuShader4_nglGetFragDataLocationEXT(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetFragDataLocationEXTPROC glGetFragDataLocationEXT = (glGetFragDataLocationEXTPROC)((intptr_t)function_pointer); + GLint __result = glGetFragDataLocationEXT(program, name_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTMultiDrawArrays.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTMultiDrawArrays.c new file mode 100644 index 0000000..af37de1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTMultiDrawArrays.c @@ -0,0 +1,14 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMultiDrawArraysEXTPROC) (GLenum mode, GLint * piFirst, GLsizei * piCount, GLint primcount); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTMultiDrawArrays_nglMultiDrawArraysEXT(JNIEnv *env, jclass clazz, jint mode, jlong piFirst, jlong piCount, jint primcount, jlong function_pointer) { + GLint *piFirst_address = (GLint *)(intptr_t)piFirst; + GLsizei *piCount_address = (GLsizei *)(intptr_t)piCount; + glMultiDrawArraysEXTPROC glMultiDrawArraysEXT = (glMultiDrawArraysEXTPROC)((intptr_t)function_pointer); + glMultiDrawArraysEXT(mode, piFirst_address, piCount_address, primcount); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPalettedTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPalettedTexture.c new file mode 100644 index 0000000..f50997a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPalettedTexture.c @@ -0,0 +1,41 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glColorTableEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glColorSubTableEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glGetColorTableEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * data); +typedef void (APIENTRY *glGetColorTableParameterivEXTPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetColorTableParameterfvEXTPROC) (GLenum target, GLenum pname, GLfloat * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPalettedTexture_nglColorTableEXT(JNIEnv *env, jclass clazz, jint target, jint internalFormat, jint width, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glColorTableEXTPROC glColorTableEXT = (glColorTableEXTPROC)((intptr_t)function_pointer); + glColorTableEXT(target, internalFormat, width, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPalettedTexture_nglColorSubTableEXT(JNIEnv *env, jclass clazz, jint target, jint start, jint count, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glColorSubTableEXTPROC glColorSubTableEXT = (glColorSubTableEXTPROC)((intptr_t)function_pointer); + glColorSubTableEXT(target, start, count, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPalettedTexture_nglGetColorTableEXT(JNIEnv *env, jclass clazz, jint target, jint format, jint type, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetColorTableEXTPROC glGetColorTableEXT = (glGetColorTableEXTPROC)((intptr_t)function_pointer); + glGetColorTableEXT(target, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPalettedTexture_nglGetColorTableParameterivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetColorTableParameterivEXTPROC glGetColorTableParameterivEXT = (glGetColorTableParameterivEXTPROC)((intptr_t)function_pointer); + glGetColorTableParameterivEXT(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPalettedTexture_nglGetColorTableParameterfvEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetColorTableParameterfvEXTPROC glGetColorTableParameterfvEXT = (glGetColorTableParameterfvEXTPROC)((intptr_t)function_pointer); + glGetColorTableParameterfvEXT(target, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPointParameters.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPointParameters.c new file mode 100644 index 0000000..e0411e2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTPointParameters.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPointParameterfEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPointParameterfvEXTPROC) (GLenum pname, const GLfloat * pfParams); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPointParameters_nglPointParameterfEXT(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPointParameterfEXTPROC glPointParameterfEXT = (glPointParameterfEXTPROC)((intptr_t)function_pointer); + glPointParameterfEXT(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTPointParameters_nglPointParameterfvEXT(JNIEnv *env, jclass clazz, jint pname, jlong pfParams, jlong function_pointer) { + const GLfloat *pfParams_address = (const GLfloat *)(intptr_t)pfParams; + glPointParameterfvEXTPROC glPointParameterfvEXT = (glPointParameterfvEXTPROC)((intptr_t)function_pointer); + glPointParameterfvEXT(pname, pfParams_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTProvokingVertex.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTProvokingVertex.c new file mode 100644 index 0000000..6f7ce54 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTProvokingVertex.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProvokingVertexEXTPROC) (GLenum mode); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTProvokingVertex_nglProvokingVertexEXT(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glProvokingVertexEXTPROC glProvokingVertexEXT = (glProvokingVertexEXTPROC)((intptr_t)function_pointer); + glProvokingVertexEXT(mode); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSecondaryColor.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSecondaryColor.c new file mode 100644 index 0000000..8d371c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSecondaryColor.c @@ -0,0 +1,43 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glSecondaryColor3bEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRY *glSecondaryColor3fEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRY *glSecondaryColor3dEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRY *glSecondaryColor3ubEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRY *glSecondaryColorPointerEXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pPointer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColor3bEXT(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glSecondaryColor3bEXTPROC glSecondaryColor3bEXT = (glSecondaryColor3bEXTPROC)((intptr_t)function_pointer); + glSecondaryColor3bEXT(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColor3fEXT(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jlong function_pointer) { + glSecondaryColor3fEXTPROC glSecondaryColor3fEXT = (glSecondaryColor3fEXTPROC)((intptr_t)function_pointer); + glSecondaryColor3fEXT(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColor3dEXT(JNIEnv *env, jclass clazz, jdouble red, jdouble green, jdouble blue, jlong function_pointer) { + glSecondaryColor3dEXTPROC glSecondaryColor3dEXT = (glSecondaryColor3dEXTPROC)((intptr_t)function_pointer); + glSecondaryColor3dEXT(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColor3ubEXT(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glSecondaryColor3ubEXTPROC glSecondaryColor3ubEXT = (glSecondaryColor3ubEXTPROC)((intptr_t)function_pointer); + glSecondaryColor3ubEXT(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColorPointerEXT(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glSecondaryColorPointerEXTPROC glSecondaryColorPointerEXT = (glSecondaryColorPointerEXTPROC)((intptr_t)function_pointer); + glSecondaryColorPointerEXT(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSecondaryColor_nglSecondaryColorPointerEXTBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer_buffer_offset, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pPointer_buffer_offset); + glSecondaryColorPointerEXTPROC glSecondaryColorPointerEXT = (glSecondaryColorPointerEXTPROC)((intptr_t)function_pointer); + glSecondaryColorPointerEXT(size, type, stride, pPointer_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSeparateShaderObjects.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSeparateShaderObjects.c new file mode 100644 index 0000000..28257d4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTSeparateShaderObjects.c @@ -0,0 +1,26 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glUseShaderProgramEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRY *glActiveProgramEXTPROC) (GLuint program); +typedef GLuint (APIENTRY *glCreateShaderProgramEXTPROC) (GLenum type, const GLchar * string); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSeparateShaderObjects_nglUseShaderProgramEXT(JNIEnv *env, jclass clazz, jint type, jint program, jlong function_pointer) { + glUseShaderProgramEXTPROC glUseShaderProgramEXT = (glUseShaderProgramEXTPROC)((intptr_t)function_pointer); + glUseShaderProgramEXT(type, program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTSeparateShaderObjects_nglActiveProgramEXT(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glActiveProgramEXTPROC glActiveProgramEXT = (glActiveProgramEXTPROC)((intptr_t)function_pointer); + glActiveProgramEXT(program); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTSeparateShaderObjects_nglCreateShaderProgramEXT(JNIEnv *env, jclass clazz, jint type, jlong string, jlong function_pointer) { + const GLchar *string_address = (const GLchar *)(intptr_t)string; + glCreateShaderProgramEXTPROC glCreateShaderProgramEXT = (glCreateShaderProgramEXTPROC)((intptr_t)function_pointer); + GLuint __result = glCreateShaderProgramEXT(type, string_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTShaderImageLoadStore.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTShaderImageLoadStore.c new file mode 100644 index 0000000..9fb4b4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTShaderImageLoadStore.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindImageTextureEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRY *glMemoryBarrierEXTPROC) (GLbitfield barriers); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTShaderImageLoadStore_nglBindImageTextureEXT(JNIEnv *env, jclass clazz, jint index, jint texture, jint level, jboolean layered, jint layer, jint access, jint format, jlong function_pointer) { + glBindImageTextureEXTPROC glBindImageTextureEXT = (glBindImageTextureEXTPROC)((intptr_t)function_pointer); + glBindImageTextureEXT(index, texture, level, layered, layer, access, format); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTShaderImageLoadStore_nglMemoryBarrierEXT(JNIEnv *env, jclass clazz, jint barriers, jlong function_pointer) { + glMemoryBarrierEXTPROC glMemoryBarrierEXT = (glMemoryBarrierEXTPROC)((intptr_t)function_pointer); + glMemoryBarrierEXT(barriers); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilClearTag.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilClearTag.c new file mode 100644 index 0000000..9b7dbbf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilClearTag.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glStencilClearTagEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTStencilClearTag_nglStencilClearTagEXT(JNIEnv *env, jclass clazz, jint stencilTagBits, jint stencilClearTag, jlong function_pointer) { + glStencilClearTagEXTPROC glStencilClearTagEXT = (glStencilClearTagEXTPROC)((intptr_t)function_pointer); + glStencilClearTagEXT(stencilTagBits, stencilClearTag); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilTwoSide.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilTwoSide.c new file mode 100644 index 0000000..9ea402a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTStencilTwoSide.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glActiveStencilFaceEXTPROC) (GLenum face); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTStencilTwoSide_nglActiveStencilFaceEXT(JNIEnv *env, jclass clazz, jint face, jlong function_pointer) { + glActiveStencilFaceEXTPROC glActiveStencilFaceEXT = (glActiveStencilFaceEXTPROC)((intptr_t)function_pointer); + glActiveStencilFaceEXT(face); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureBufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureBufferObject.c new file mode 100644 index 0000000..301d2e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureBufferObject.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexBufferEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureBufferObject_nglTexBufferEXT(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint buffer, jlong function_pointer) { + glTexBufferEXTPROC glTexBufferEXT = (glTexBufferEXTPROC)((intptr_t)function_pointer); + glTexBufferEXT(target, internalformat, buffer); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureInteger.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureInteger.c new file mode 100644 index 0000000..5f57930 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTextureInteger.c @@ -0,0 +1,46 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClearColorIiEXTPROC) (GLint r, GLint g, GLint b, GLint a); +typedef void (APIENTRY *glClearColorIuiEXTPROC) (GLuint r, GLuint g, GLuint b, GLuint a); +typedef void (APIENTRY *glTexParameterIivEXTPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glTexParameterIuivEXTPROC) (GLenum target, GLenum pname, GLuint * params); +typedef void (APIENTRY *glGetTexParameterIivEXTPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexParameterIuivEXTPROC) (GLenum target, GLenum pname, GLuint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglClearColorIiEXT(JNIEnv *env, jclass clazz, jint r, jint g, jint b, jint a, jlong function_pointer) { + glClearColorIiEXTPROC glClearColorIiEXT = (glClearColorIiEXTPROC)((intptr_t)function_pointer); + glClearColorIiEXT(r, g, b, a); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglClearColorIuiEXT(JNIEnv *env, jclass clazz, jint r, jint g, jint b, jint a, jlong function_pointer) { + glClearColorIuiEXTPROC glClearColorIuiEXT = (glClearColorIuiEXTPROC)((intptr_t)function_pointer); + glClearColorIuiEXT(r, g, b, a); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglTexParameterIivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glTexParameterIivEXTPROC glTexParameterIivEXT = (glTexParameterIivEXTPROC)((intptr_t)function_pointer); + glTexParameterIivEXT(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglTexParameterIuivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glTexParameterIuivEXTPROC glTexParameterIuivEXT = (glTexParameterIuivEXTPROC)((intptr_t)function_pointer); + glTexParameterIuivEXT(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglGetTexParameterIivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexParameterIivEXTPROC glGetTexParameterIivEXT = (glGetTexParameterIivEXTPROC)((intptr_t)function_pointer); + glGetTexParameterIivEXT(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTextureInteger_nglGetTexParameterIuivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetTexParameterIuivEXTPROC glGetTexParameterIuivEXT = (glGetTexParameterIuivEXTPROC)((intptr_t)function_pointer); + glGetTexParameterIuivEXT(target, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTimerQuery.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTimerQuery.c new file mode 100644 index 0000000..a07db7f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTimerQuery.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetQueryObjecti64vEXTPROC) (GLuint id, GLenum pname, GLint64EXT * params); +typedef void (APIENTRY *glGetQueryObjectui64vEXTPROC) (GLuint id, GLenum pname, GLuint64EXT * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTimerQuery_nglGetQueryObjecti64vEXT(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint64EXT *params_address = (GLint64EXT *)(intptr_t)params; + glGetQueryObjecti64vEXTPROC glGetQueryObjecti64vEXT = (glGetQueryObjecti64vEXTPROC)((intptr_t)function_pointer); + glGetQueryObjecti64vEXT(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTimerQuery_nglGetQueryObjectui64vEXT(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetQueryObjectui64vEXTPROC glGetQueryObjectui64vEXT = (glGetQueryObjectui64vEXTPROC)((intptr_t)function_pointer); + glGetQueryObjectui64vEXT(id, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTransformFeedback.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTransformFeedback.c new file mode 100644 index 0000000..3b0a744 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTTransformFeedback.c @@ -0,0 +1,63 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindBufferRangeEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRY *glBindBufferOffsetEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRY *glBindBufferBaseEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRY *glBeginTransformFeedbackEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRY *glEndTransformFeedbackEXTPROC) (); +typedef void (APIENTRY *glTransformFeedbackVaryingsEXTPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); +typedef void (APIENTRY *glGetTransformFeedbackVaryingEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglBindBufferRangeEXT(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong size, jlong function_pointer) { + glBindBufferRangeEXTPROC glBindBufferRangeEXT = (glBindBufferRangeEXTPROC)((intptr_t)function_pointer); + glBindBufferRangeEXT(target, index, buffer, offset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglBindBufferOffsetEXT(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong function_pointer) { + glBindBufferOffsetEXTPROC glBindBufferOffsetEXT = (glBindBufferOffsetEXTPROC)((intptr_t)function_pointer); + glBindBufferOffsetEXT(target, index, buffer, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglBindBufferBaseEXT(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong function_pointer) { + glBindBufferBaseEXTPROC glBindBufferBaseEXT = (glBindBufferBaseEXTPROC)((intptr_t)function_pointer); + glBindBufferBaseEXT(target, index, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglBeginTransformFeedbackEXT(JNIEnv *env, jclass clazz, jint primitiveMode, jlong function_pointer) { + glBeginTransformFeedbackEXTPROC glBeginTransformFeedbackEXT = (glBeginTransformFeedbackEXTPROC)((intptr_t)function_pointer); + glBeginTransformFeedbackEXT(primitiveMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglEndTransformFeedbackEXT(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndTransformFeedbackEXTPROC glEndTransformFeedbackEXT = (glEndTransformFeedbackEXTPROC)((intptr_t)function_pointer); + glEndTransformFeedbackEXT(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglTransformFeedbackVaryingsEXT(JNIEnv *env, jclass clazz, jint program, jint count, jlong varyings, jint bufferMode, jlong function_pointer) { + const GLchar *varyings_address = (const GLchar *)(intptr_t)varyings; + int _str_i; + GLchar *_str_address; + GLchar **varyings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + glTransformFeedbackVaryingsEXTPROC glTransformFeedbackVaryingsEXT = (glTransformFeedbackVaryingsEXTPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)varyings_address; + while ( _str_i < count ) { + varyings_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glTransformFeedbackVaryingsEXT(program, count, (const GLchar **)varyings_str, bufferMode); + free(varyings_str); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTTransformFeedback_nglGetTransformFeedbackVaryingEXT(JNIEnv *env, jclass clazz, jint program, jint index, jint bufSize, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetTransformFeedbackVaryingEXTPROC glGetTransformFeedbackVaryingEXT = (glGetTransformFeedbackVaryingEXTPROC)((intptr_t)function_pointer); + glGetTransformFeedbackVaryingEXT(program, index, bufSize, length_address, size_address, type_address, name_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexAttrib64bit.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexAttrib64bit.c new file mode 100644 index 0000000..738352d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexAttrib64bit.c @@ -0,0 +1,78 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribL1dEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY *glVertexAttribL2dEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertexAttribL3dEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertexAttribL4dEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertexAttribL1dvEXTPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL2dvEXTPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL3dvEXTPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL4dvEXTPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribLPointerEXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glGetVertexAttribLdvEXTPROC) (GLuint index, GLenum pname, GLdouble * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL1dEXT(JNIEnv *env, jclass clazz, jint index, jdouble x, jlong function_pointer) { + glVertexAttribL1dEXTPROC glVertexAttribL1dEXT = (glVertexAttribL1dEXTPROC)((intptr_t)function_pointer); + glVertexAttribL1dEXT(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL2dEXT(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jlong function_pointer) { + glVertexAttribL2dEXTPROC glVertexAttribL2dEXT = (glVertexAttribL2dEXTPROC)((intptr_t)function_pointer); + glVertexAttribL2dEXT(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL3dEXT(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertexAttribL3dEXTPROC glVertexAttribL3dEXT = (glVertexAttribL3dEXTPROC)((intptr_t)function_pointer); + glVertexAttribL3dEXT(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL4dEXT(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertexAttribL4dEXTPROC glVertexAttribL4dEXT = (glVertexAttribL4dEXTPROC)((intptr_t)function_pointer); + glVertexAttribL4dEXT(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL1dvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL1dvEXTPROC glVertexAttribL1dvEXT = (glVertexAttribL1dvEXTPROC)((intptr_t)function_pointer); + glVertexAttribL1dvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL2dvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL2dvEXTPROC glVertexAttribL2dvEXT = (glVertexAttribL2dvEXTPROC)((intptr_t)function_pointer); + glVertexAttribL2dvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL3dvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL3dvEXTPROC glVertexAttribL3dvEXT = (glVertexAttribL3dvEXTPROC)((intptr_t)function_pointer); + glVertexAttribL3dvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribL4dvEXT(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL4dvEXTPROC glVertexAttribL4dvEXT = (glVertexAttribL4dvEXTPROC)((intptr_t)function_pointer); + glVertexAttribL4dvEXT(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribLPointerEXT(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glVertexAttribLPointerEXTPROC glVertexAttribLPointerEXT = (glVertexAttribLPointerEXTPROC)((intptr_t)function_pointer); + glVertexAttribLPointerEXT(index, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglVertexAttribLPointerEXTBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glVertexAttribLPointerEXTPROC glVertexAttribLPointerEXT = (glVertexAttribLPointerEXTPROC)((intptr_t)function_pointer); + glVertexAttribLPointerEXT(index, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexAttrib64bit_nglGetVertexAttribLdvEXT(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVertexAttribLdvEXTPROC glGetVertexAttribLdvEXT = (glGetVertexAttribLdvEXTPROC)((intptr_t)function_pointer); + glGetVertexAttribLdvEXT(index, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexShader.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexShader.c new file mode 100644 index 0000000..220e99e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexShader.c @@ -0,0 +1,294 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBeginVertexShaderEXTPROC) (); +typedef void (APIENTRY *glEndVertexShaderEXTPROC) (); +typedef void (APIENTRY *glBindVertexShaderEXTPROC) (GLuint id); +typedef GLuint (APIENTRY *glGenVertexShadersEXTPROC) (GLuint range); +typedef void (APIENTRY *glDeleteVertexShaderEXTPROC) (GLuint id); +typedef void (APIENTRY *glShaderOp1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRY *glShaderOp2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRY *glShaderOp3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRY *glSwizzleEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRY *glWriteMaskEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRY *glInsertComponentEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRY *glExtractComponentEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRY *glGenSymbolsEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef void (APIENTRY *glSetInvariantEXTPROC) (GLuint id, GLenum type, const GLvoid * pAddr); +typedef void (APIENTRY *glSetLocalConstantEXTPROC) (GLuint id, GLenum type, const GLvoid * pAddr); +typedef void (APIENTRY *glVariantbvEXTPROC) (GLuint id, const GLbyte * pAddr); +typedef void (APIENTRY *glVariantsvEXTPROC) (GLuint id, const GLshort * pAddr); +typedef void (APIENTRY *glVariantivEXTPROC) (GLuint id, const GLint * pAddr); +typedef void (APIENTRY *glVariantfvEXTPROC) (GLuint id, const GLfloat * pAddr); +typedef void (APIENTRY *glVariantdvEXTPROC) (GLuint id, const GLdouble * pAddr); +typedef void (APIENTRY *glVariantubvEXTPROC) (GLuint id, const GLubyte * pAddr); +typedef void (APIENTRY *glVariantusvEXTPROC) (GLuint id, const GLushort * pAddr); +typedef void (APIENTRY *glVariantuivEXTPROC) (GLuint id, const GLuint * pAddr); +typedef void (APIENTRY *glVariantPointerEXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid * pAddr); +typedef void (APIENTRY *glEnableVariantClientStateEXTPROC) (GLuint id); +typedef void (APIENTRY *glDisableVariantClientStateEXTPROC) (GLuint id); +typedef GLuint (APIENTRY *glBindLightParameterEXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRY *glBindMaterialParameterEXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRY *glBindTexGenParameterEXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRY *glBindTextureUnitParameterEXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRY *glBindParameterEXTPROC) (GLenum value); +typedef GLboolean (APIENTRY *glIsVariantEnabledEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRY *glGetVariantBooleanvEXTPROC) (GLuint id, GLenum value, GLbyte * pbData); +typedef void (APIENTRY *glGetVariantIntegervEXTPROC) (GLuint id, GLenum value, GLint * pbData); +typedef void (APIENTRY *glGetVariantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat * pbData); +typedef void (APIENTRY *glGetVariantPointervEXTPROC) (GLuint id, GLenum value, GLvoid ** pbData); +typedef void (APIENTRY *glGetInvariantBooleanvEXTPROC) (GLuint id, GLenum value, GLbyte * pbData); +typedef void (APIENTRY *glGetInvariantIntegervEXTPROC) (GLuint id, GLenum value, GLint * pbData); +typedef void (APIENTRY *glGetInvariantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat * pbData); +typedef void (APIENTRY *glGetLocalConstantBooleanvEXTPROC) (GLuint id, GLenum value, GLbyte * pbData); +typedef void (APIENTRY *glGetLocalConstantIntegervEXTPROC) (GLuint id, GLenum value, GLint * pbData); +typedef void (APIENTRY *glGetLocalConstantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat * pbData); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBeginVertexShaderEXT(JNIEnv *env, jclass clazz, jlong function_pointer) { + glBeginVertexShaderEXTPROC glBeginVertexShaderEXT = (glBeginVertexShaderEXTPROC)((intptr_t)function_pointer); + glBeginVertexShaderEXT(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglEndVertexShaderEXT(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndVertexShaderEXTPROC glEndVertexShaderEXT = (glEndVertexShaderEXTPROC)((intptr_t)function_pointer); + glEndVertexShaderEXT(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindVertexShaderEXT(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glBindVertexShaderEXTPROC glBindVertexShaderEXT = (glBindVertexShaderEXTPROC)((intptr_t)function_pointer); + glBindVertexShaderEXT(id); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGenVertexShadersEXT(JNIEnv *env, jclass clazz, jint range, jlong function_pointer) { + glGenVertexShadersEXTPROC glGenVertexShadersEXT = (glGenVertexShadersEXTPROC)((intptr_t)function_pointer); + GLuint __result = glGenVertexShadersEXT(range); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglDeleteVertexShaderEXT(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glDeleteVertexShaderEXTPROC glDeleteVertexShaderEXT = (glDeleteVertexShaderEXTPROC)((intptr_t)function_pointer); + glDeleteVertexShaderEXT(id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglShaderOp1EXT(JNIEnv *env, jclass clazz, jint op, jint res, jint arg1, jlong function_pointer) { + glShaderOp1EXTPROC glShaderOp1EXT = (glShaderOp1EXTPROC)((intptr_t)function_pointer); + glShaderOp1EXT(op, res, arg1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglShaderOp2EXT(JNIEnv *env, jclass clazz, jint op, jint res, jint arg1, jint arg2, jlong function_pointer) { + glShaderOp2EXTPROC glShaderOp2EXT = (glShaderOp2EXTPROC)((intptr_t)function_pointer); + glShaderOp2EXT(op, res, arg1, arg2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglShaderOp3EXT(JNIEnv *env, jclass clazz, jint op, jint res, jint arg1, jint arg2, jint arg3, jlong function_pointer) { + glShaderOp3EXTPROC glShaderOp3EXT = (glShaderOp3EXTPROC)((intptr_t)function_pointer); + glShaderOp3EXT(op, res, arg1, arg2, arg3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglSwizzleEXT(JNIEnv *env, jclass clazz, jint res, jint in, jint outX, jint outY, jint outZ, jint outW, jlong function_pointer) { + glSwizzleEXTPROC glSwizzleEXT = (glSwizzleEXTPROC)((intptr_t)function_pointer); + glSwizzleEXT(res, in, outX, outY, outZ, outW); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglWriteMaskEXT(JNIEnv *env, jclass clazz, jint res, jint in, jint outX, jint outY, jint outZ, jint outW, jlong function_pointer) { + glWriteMaskEXTPROC glWriteMaskEXT = (glWriteMaskEXTPROC)((intptr_t)function_pointer); + glWriteMaskEXT(res, in, outX, outY, outZ, outW); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglInsertComponentEXT(JNIEnv *env, jclass clazz, jint res, jint src, jint num, jlong function_pointer) { + glInsertComponentEXTPROC glInsertComponentEXT = (glInsertComponentEXTPROC)((intptr_t)function_pointer); + glInsertComponentEXT(res, src, num); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglExtractComponentEXT(JNIEnv *env, jclass clazz, jint res, jint src, jint num, jlong function_pointer) { + glExtractComponentEXTPROC glExtractComponentEXT = (glExtractComponentEXTPROC)((intptr_t)function_pointer); + glExtractComponentEXT(res, src, num); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGenSymbolsEXT(JNIEnv *env, jclass clazz, jint dataType, jint storageType, jint range, jint components, jlong function_pointer) { + glGenSymbolsEXTPROC glGenSymbolsEXT = (glGenSymbolsEXTPROC)((intptr_t)function_pointer); + GLuint __result = glGenSymbolsEXT(dataType, storageType, range, components); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglSetInvariantEXT(JNIEnv *env, jclass clazz, jint id, jint type, jlong pAddr, jlong function_pointer) { + const GLvoid *pAddr_address = (const GLvoid *)(intptr_t)pAddr; + glSetInvariantEXTPROC glSetInvariantEXT = (glSetInvariantEXTPROC)((intptr_t)function_pointer); + glSetInvariantEXT(id, type, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglSetLocalConstantEXT(JNIEnv *env, jclass clazz, jint id, jint type, jlong pAddr, jlong function_pointer) { + const GLvoid *pAddr_address = (const GLvoid *)(intptr_t)pAddr; + glSetLocalConstantEXTPROC glSetLocalConstantEXT = (glSetLocalConstantEXTPROC)((intptr_t)function_pointer); + glSetLocalConstantEXT(id, type, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantbvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLbyte *pAddr_address = (const GLbyte *)(intptr_t)pAddr; + glVariantbvEXTPROC glVariantbvEXT = (glVariantbvEXTPROC)((intptr_t)function_pointer); + glVariantbvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantsvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLshort *pAddr_address = (const GLshort *)(intptr_t)pAddr; + glVariantsvEXTPROC glVariantsvEXT = (glVariantsvEXTPROC)((intptr_t)function_pointer); + glVariantsvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantivEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLint *pAddr_address = (const GLint *)(intptr_t)pAddr; + glVariantivEXTPROC glVariantivEXT = (glVariantivEXTPROC)((intptr_t)function_pointer); + glVariantivEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantfvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLfloat *pAddr_address = (const GLfloat *)(intptr_t)pAddr; + glVariantfvEXTPROC glVariantfvEXT = (glVariantfvEXTPROC)((intptr_t)function_pointer); + glVariantfvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantdvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLdouble *pAddr_address = (const GLdouble *)(intptr_t)pAddr; + glVariantdvEXTPROC glVariantdvEXT = (glVariantdvEXTPROC)((intptr_t)function_pointer); + glVariantdvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantubvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLubyte *pAddr_address = (const GLubyte *)(intptr_t)pAddr; + glVariantubvEXTPROC glVariantubvEXT = (glVariantubvEXTPROC)((intptr_t)function_pointer); + glVariantubvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantusvEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLushort *pAddr_address = (const GLushort *)(intptr_t)pAddr; + glVariantusvEXTPROC glVariantusvEXT = (glVariantusvEXTPROC)((intptr_t)function_pointer); + glVariantusvEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantuivEXT(JNIEnv *env, jclass clazz, jint id, jlong pAddr, jlong function_pointer) { + const GLuint *pAddr_address = (const GLuint *)(intptr_t)pAddr; + glVariantuivEXTPROC glVariantuivEXT = (glVariantuivEXTPROC)((intptr_t)function_pointer); + glVariantuivEXT(id, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantPointerEXT(JNIEnv *env, jclass clazz, jint id, jint type, jint stride, jlong pAddr, jlong function_pointer) { + const GLvoid *pAddr_address = (const GLvoid *)(intptr_t)pAddr; + glVariantPointerEXTPROC glVariantPointerEXT = (glVariantPointerEXTPROC)((intptr_t)function_pointer); + glVariantPointerEXT(id, type, stride, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglVariantPointerEXTBO(JNIEnv *env, jclass clazz, jint id, jint type, jint stride, jlong pAddr_buffer_offset, jlong function_pointer) { + const GLvoid *pAddr_address = (const GLvoid *)(intptr_t)offsetToPointer(pAddr_buffer_offset); + glVariantPointerEXTPROC glVariantPointerEXT = (glVariantPointerEXTPROC)((intptr_t)function_pointer); + glVariantPointerEXT(id, type, stride, pAddr_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglEnableVariantClientStateEXT(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glEnableVariantClientStateEXTPROC glEnableVariantClientStateEXT = (glEnableVariantClientStateEXTPROC)((intptr_t)function_pointer); + glEnableVariantClientStateEXT(id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglDisableVariantClientStateEXT(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glDisableVariantClientStateEXTPROC glDisableVariantClientStateEXT = (glDisableVariantClientStateEXTPROC)((intptr_t)function_pointer); + glDisableVariantClientStateEXT(id); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindLightParameterEXT(JNIEnv *env, jclass clazz, jint light, jint value, jlong function_pointer) { + glBindLightParameterEXTPROC glBindLightParameterEXT = (glBindLightParameterEXTPROC)((intptr_t)function_pointer); + GLuint __result = glBindLightParameterEXT(light, value); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindMaterialParameterEXT(JNIEnv *env, jclass clazz, jint face, jint value, jlong function_pointer) { + glBindMaterialParameterEXTPROC glBindMaterialParameterEXT = (glBindMaterialParameterEXTPROC)((intptr_t)function_pointer); + GLuint __result = glBindMaterialParameterEXT(face, value); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindTexGenParameterEXT(JNIEnv *env, jclass clazz, jint unit, jint coord, jint value, jlong function_pointer) { + glBindTexGenParameterEXTPROC glBindTexGenParameterEXT = (glBindTexGenParameterEXTPROC)((intptr_t)function_pointer); + GLuint __result = glBindTexGenParameterEXT(unit, coord, value); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindTextureUnitParameterEXT(JNIEnv *env, jclass clazz, jint unit, jint value, jlong function_pointer) { + glBindTextureUnitParameterEXTPROC glBindTextureUnitParameterEXT = (glBindTextureUnitParameterEXTPROC)((intptr_t)function_pointer); + GLuint __result = glBindTextureUnitParameterEXT(unit, value); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglBindParameterEXT(JNIEnv *env, jclass clazz, jint value, jlong function_pointer) { + glBindParameterEXTPROC glBindParameterEXT = (glBindParameterEXTPROC)((intptr_t)function_pointer); + GLuint __result = glBindParameterEXT(value); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglIsVariantEnabledEXT(JNIEnv *env, jclass clazz, jint id, jint cap, jlong function_pointer) { + glIsVariantEnabledEXTPROC glIsVariantEnabledEXT = (glIsVariantEnabledEXTPROC)((intptr_t)function_pointer); + GLboolean __result = glIsVariantEnabledEXT(id, cap); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetVariantBooleanvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLbyte *pbData_address = (GLbyte *)(intptr_t)pbData; + glGetVariantBooleanvEXTPROC glGetVariantBooleanvEXT = (glGetVariantBooleanvEXTPROC)((intptr_t)function_pointer); + glGetVariantBooleanvEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetVariantIntegervEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLint *pbData_address = (GLint *)(intptr_t)pbData; + glGetVariantIntegervEXTPROC glGetVariantIntegervEXT = (glGetVariantIntegervEXTPROC)((intptr_t)function_pointer); + glGetVariantIntegervEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetVariantFloatvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLfloat *pbData_address = (GLfloat *)(intptr_t)pbData; + glGetVariantFloatvEXTPROC glGetVariantFloatvEXT = (glGetVariantFloatvEXTPROC)((intptr_t)function_pointer); + glGetVariantFloatvEXT(id, value, pbData_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetVariantPointervEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong result_size, jlong function_pointer) { + glGetVariantPointervEXTPROC glGetVariantPointervEXT = (glGetVariantPointervEXTPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVariantPointervEXT(id, value, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetInvariantBooleanvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLbyte *pbData_address = (GLbyte *)(intptr_t)pbData; + glGetInvariantBooleanvEXTPROC glGetInvariantBooleanvEXT = (glGetInvariantBooleanvEXTPROC)((intptr_t)function_pointer); + glGetInvariantBooleanvEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetInvariantIntegervEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLint *pbData_address = (GLint *)(intptr_t)pbData; + glGetInvariantIntegervEXTPROC glGetInvariantIntegervEXT = (glGetInvariantIntegervEXTPROC)((intptr_t)function_pointer); + glGetInvariantIntegervEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetInvariantFloatvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLfloat *pbData_address = (GLfloat *)(intptr_t)pbData; + glGetInvariantFloatvEXTPROC glGetInvariantFloatvEXT = (glGetInvariantFloatvEXTPROC)((intptr_t)function_pointer); + glGetInvariantFloatvEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetLocalConstantBooleanvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLbyte *pbData_address = (GLbyte *)(intptr_t)pbData; + glGetLocalConstantBooleanvEXTPROC glGetLocalConstantBooleanvEXT = (glGetLocalConstantBooleanvEXTPROC)((intptr_t)function_pointer); + glGetLocalConstantBooleanvEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetLocalConstantIntegervEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLint *pbData_address = (GLint *)(intptr_t)pbData; + glGetLocalConstantIntegervEXTPROC glGetLocalConstantIntegervEXT = (glGetLocalConstantIntegervEXTPROC)((intptr_t)function_pointer); + glGetLocalConstantIntegervEXT(id, value, pbData_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexShader_nglGetLocalConstantFloatvEXT(JNIEnv *env, jclass clazz, jint id, jint value, jlong pbData, jlong function_pointer) { + GLfloat *pbData_address = (GLfloat *)(intptr_t)pbData; + glGetLocalConstantFloatvEXTPROC glGetLocalConstantFloatvEXT = (glGetLocalConstantFloatvEXTPROC)((intptr_t)function_pointer); + glGetLocalConstantFloatvEXT(id, value, pbData_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexWeighting.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexWeighting.c new file mode 100644 index 0000000..0fec001 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_EXTVertexWeighting.c @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexWeightfEXTPROC) (GLfloat weight); +typedef void (APIENTRY *glVertexWeightPointerEXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid * pPointer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexWeighting_nglVertexWeightfEXT(JNIEnv *env, jclass clazz, jfloat weight, jlong function_pointer) { + glVertexWeightfEXTPROC glVertexWeightfEXT = (glVertexWeightfEXTPROC)((intptr_t)function_pointer); + glVertexWeightfEXT(weight); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexWeighting_nglVertexWeightPointerEXT(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glVertexWeightPointerEXTPROC glVertexWeightPointerEXT = (glVertexWeightPointerEXTPROC)((intptr_t)function_pointer); + glVertexWeightPointerEXT(size, type, stride, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_EXTVertexWeighting_nglVertexWeightPointerEXTBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pPointer_buffer_offset, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pPointer_buffer_offset); + glVertexWeightPointerEXTPROC glVertexWeightPointerEXT = (glVertexWeightPointerEXTPROC)((intptr_t)function_pointer); + glVertexWeightPointerEXT(size, type, stride, pPointer_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL11.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL11.c new file mode 100644 index 0000000..718d068 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL11.c @@ -0,0 +1,1605 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glAccumPROC) (GLenum op, GLfloat value); +typedef void (APIENTRY *glAlphaFuncPROC) (GLenum func, GLfloat ref); +typedef void (APIENTRY *glClearColorPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRY *glClearAccumPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRY *glClearPROC) (GLbitfield mask); +typedef void (APIENTRY *glCallListsPROC) (GLsizei n, GLenum type, const GLvoid * lists); +typedef void (APIENTRY *glCallListPROC) (GLuint list); +typedef void (APIENTRY *glBlendFuncPROC) (GLenum sfactor, GLenum dfactor); +typedef void (APIENTRY *glBitmapPROC) (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); +typedef void (APIENTRY *glBindTexturePROC) (GLenum target, GLuint texture); +typedef void (APIENTRY *glPrioritizeTexturesPROC) (GLsizei n, const GLuint * textures, const GLfloat * priorities); +typedef GLboolean (APIENTRY *glAreTexturesResidentPROC) (GLsizei n, const GLuint * textures, GLboolean * residences); +typedef void (APIENTRY *glBeginPROC) (GLenum mode); +typedef void (APIENTRY *glEndPROC) (); +typedef void (APIENTRY *glArrayElementPROC) (GLint i); +typedef void (APIENTRY *glClearDepthPROC) (GLdouble depth); +typedef void (APIENTRY *glDeleteListsPROC) (GLuint list, GLsizei range); +typedef void (APIENTRY *glDeleteTexturesPROC) (GLsizei n, const GLuint * textures); +typedef void (APIENTRY *glCullFacePROC) (GLenum mode); +typedef void (APIENTRY *glCopyTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glCopyTexSubImage1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRY *glCopyTexImage2DPROC) (GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRY *glCopyTexImage1DPROC) (GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRY *glCopyPixelsPROC) (GLint x, GLint y, GLint width, GLint height, GLint type); +typedef void (APIENTRY *glColorPointerPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glColorMaterialPROC) (GLenum face, GLenum mode); +typedef void (APIENTRY *glColorMaskPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (APIENTRY *glColor3bPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRY *glColor3fPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRY *glColor3dPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRY *glColor3ubPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRY *glColor4bPROC) (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +typedef void (APIENTRY *glColor4fPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRY *glColor4dPROC) (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +typedef void (APIENTRY *glColor4ubPROC) (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +typedef void (APIENTRY *glClipPlanePROC) (GLenum plane, const GLdouble * equation); +typedef void (APIENTRY *glClearStencilPROC) (GLint s); +typedef void (APIENTRY *glEvalPoint1PROC) (GLint i); +typedef void (APIENTRY *glEvalPoint2PROC) (GLint i, GLint j); +typedef void (APIENTRY *glEvalMesh1PROC) (GLenum mode, GLint i1, GLint i2); +typedef void (APIENTRY *glEvalMesh2PROC) (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +typedef void (APIENTRY *glEvalCoord1fPROC) (GLfloat u); +typedef void (APIENTRY *glEvalCoord1dPROC) (GLdouble u); +typedef void (APIENTRY *glEvalCoord2fPROC) (GLfloat u, GLfloat v); +typedef void (APIENTRY *glEvalCoord2dPROC) (GLdouble u, GLdouble v); +typedef void (APIENTRY *glEnableClientStatePROC) (GLenum cap); +typedef void (APIENTRY *glDisableClientStatePROC) (GLenum cap); +typedef void (APIENTRY *glEnablePROC) (GLenum cap); +typedef void (APIENTRY *glDisablePROC) (GLenum cap); +typedef void (APIENTRY *glEdgeFlagPointerPROC) (GLint stride, const GLvoid * pointer); +typedef void (APIENTRY *glEdgeFlagPROC) (GLboolean flag); +typedef void (APIENTRY *glDrawPixelsPROC) (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glDrawElementsPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); +typedef void (APIENTRY *glDrawBufferPROC) (GLenum mode); +typedef void (APIENTRY *glDrawArraysPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRY *glDepthRangePROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRY *glDepthMaskPROC) (GLboolean flag); +typedef void (APIENTRY *glDepthFuncPROC) (GLenum func); +typedef void (APIENTRY *glFeedbackBufferPROC) (GLsizei size, GLenum type, GLfloat * buffer); +typedef void (APIENTRY *glGetPixelMapfvPROC) (GLenum map, GLfloat * values); +typedef void (APIENTRY *glGetPixelMapuivPROC) (GLenum map, GLuint * values); +typedef void (APIENTRY *glGetPixelMapusvPROC) (GLenum map, GLushort * values); +typedef void (APIENTRY *glGetMaterialfvPROC) (GLenum face, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMaterialivPROC) (GLenum face, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetMapfvPROC) (GLenum target, GLenum query, GLfloat * v); +typedef void (APIENTRY *glGetMapdvPROC) (GLenum target, GLenum query, GLdouble * v); +typedef void (APIENTRY *glGetMapivPROC) (GLenum target, GLenum query, GLint * v); +typedef void (APIENTRY *glGetLightfvPROC) (GLenum light, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetLightivPROC) (GLenum light, GLenum pname, GLint * params); +typedef GLint (APIENTRY *glGetErrorPROC) (); +typedef void (APIENTRY *glGetClipPlanePROC) (GLenum plane, GLdouble * equation); +typedef void (APIENTRY *glGetBooleanvPROC) (GLenum pname, GLboolean * params); +typedef void (APIENTRY *glGetDoublevPROC) (GLenum pname, GLdouble * params); +typedef void (APIENTRY *glGetFloatvPROC) (GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetIntegervPROC) (GLenum pname, GLint * params); +typedef void (APIENTRY *glGenTexturesPROC) (GLsizei n, GLuint * textures); +typedef GLuint (APIENTRY *glGenListsPROC) (GLsizei range); +typedef void (APIENTRY *glFrustumPROC) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRY *glFrontFacePROC) (GLenum mode); +typedef void (APIENTRY *glFogfPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glFogiPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glFogfvPROC) (GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glFogivPROC) (GLenum pname, const GLint * params); +typedef void (APIENTRY *glFlushPROC) (); +typedef void (APIENTRY *glFinishPROC) (); +typedef void (APIENTRY *glGetPointervPROC) (GLenum pname, GLvoid ** result); +typedef GLboolean (APIENTRY *glIsEnabledPROC) (GLenum cap); +typedef void (APIENTRY *glInterleavedArraysPROC) (GLenum format, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glInitNamesPROC) (); +typedef void (APIENTRY *glHintPROC) (GLenum target, GLenum mode); +typedef void (APIENTRY *glGetTexParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetTexParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexLevelParameterfvPROC) (GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetTexLevelParameterivPROC) (GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexImagePROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels); +typedef void (APIENTRY *glGetTexGenivPROC) (GLenum coord, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexGenfvPROC) (GLenum coord, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetTexGendvPROC) (GLenum coord, GLenum pname, GLdouble * params); +typedef void (APIENTRY *glGetTexEnvivPROC) (GLenum coord, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexEnvfvPROC) (GLenum coord, GLenum pname, GLfloat * params); +typedef const GLubyte * (APIENTRY *glGetStringPROC) (GLint name); +typedef void (APIENTRY *glGetPolygonStipplePROC) (GLubyte * mask); +typedef GLboolean (APIENTRY *glIsListPROC) (GLuint list); +typedef void (APIENTRY *glMaterialfPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRY *glMaterialiPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRY *glMaterialfvPROC) (GLenum face, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glMaterialivPROC) (GLenum face, GLenum pname, const GLint * params); +typedef void (APIENTRY *glMapGrid1fPROC) (GLint un, GLfloat u1, GLfloat u2); +typedef void (APIENTRY *glMapGrid1dPROC) (GLint un, GLdouble u1, GLdouble u2); +typedef void (APIENTRY *glMapGrid2fPROC) (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glMapGrid2dPROC) (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +typedef void (APIENTRY *glMap2fPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); +typedef void (APIENTRY *glMap2dPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); +typedef void (APIENTRY *glMap1fPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); +typedef void (APIENTRY *glMap1dPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); +typedef void (APIENTRY *glLogicOpPROC) (GLenum opcode); +typedef void (APIENTRY *glLoadNamePROC) (GLuint name); +typedef void (APIENTRY *glLoadMatrixfPROC) (const GLfloat * m); +typedef void (APIENTRY *glLoadMatrixdPROC) (const GLdouble * m); +typedef void (APIENTRY *glLoadIdentityPROC) (); +typedef void (APIENTRY *glListBasePROC) (GLuint base); +typedef void (APIENTRY *glLineWidthPROC) (GLfloat width); +typedef void (APIENTRY *glLineStipplePROC) (GLint factor, GLushort pattern); +typedef void (APIENTRY *glLightModelfPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glLightModeliPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glLightModelfvPROC) (GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glLightModelivPROC) (GLenum pname, const GLint * params); +typedef void (APIENTRY *glLightfPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRY *glLightiPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRY *glLightfvPROC) (GLenum light, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glLightivPROC) (GLenum light, GLenum pname, const GLint * params); +typedef GLboolean (APIENTRY *glIsTexturePROC) (GLuint texture); +typedef void (APIENTRY *glMatrixModePROC) (GLenum mode); +typedef void (APIENTRY *glPolygonStipplePROC) (const GLubyte * mask); +typedef void (APIENTRY *glPolygonOffsetPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRY *glPolygonModePROC) (GLenum face, GLenum mode); +typedef void (APIENTRY *glPointSizePROC) (GLfloat size); +typedef void (APIENTRY *glPixelZoomPROC) (GLfloat xfactor, GLfloat yfactor); +typedef void (APIENTRY *glPixelTransferfPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPixelTransferiPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glPixelStorefPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPixelStoreiPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glPixelMapfvPROC) (GLenum map, GLsizei mapsize, const GLfloat * values); +typedef void (APIENTRY *glPixelMapuivPROC) (GLenum map, GLsizei mapsize, const GLuint * values); +typedef void (APIENTRY *glPixelMapusvPROC) (GLenum map, GLsizei mapsize, const GLushort * values); +typedef void (APIENTRY *glPassThroughPROC) (GLfloat token); +typedef void (APIENTRY *glOrthoPROC) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRY *glNormalPointerPROC) (GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glNormal3bPROC) (GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRY *glNormal3fPROC) (GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRY *glNormal3dPROC) (GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRY *glNormal3iPROC) (GLint nx, GLint ny, GLint nz); +typedef void (APIENTRY *glNewListPROC) (GLuint list, GLenum mode); +typedef void (APIENTRY *glEndListPROC) (); +typedef void (APIENTRY *glMultMatrixfPROC) (const GLfloat * m); +typedef void (APIENTRY *glMultMatrixdPROC) (const GLdouble * m); +typedef void (APIENTRY *glShadeModelPROC) (GLenum mode); +typedef void (APIENTRY *glSelectBufferPROC) (GLsizei size, GLuint * buffer); +typedef void (APIENTRY *glScissorPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glScalefPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glScaledPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glRotatefPROC) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glRotatedPROC) (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef GLint (APIENTRY *glRenderModePROC) (GLenum mode); +typedef void (APIENTRY *glRectfPROC) (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +typedef void (APIENTRY *glRectdPROC) (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +typedef void (APIENTRY *glRectiPROC) (GLint x1, GLint y1, GLint x2, GLint y2); +typedef void (APIENTRY *glReadPixelsPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); +typedef void (APIENTRY *glReadBufferPROC) (GLenum mode); +typedef void (APIENTRY *glRasterPos2fPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY *glRasterPos2dPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY *glRasterPos2iPROC) (GLint x, GLint y); +typedef void (APIENTRY *glRasterPos3fPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glRasterPos3dPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glRasterPos3iPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRY *glRasterPos4fPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glRasterPos4dPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glRasterPos4iPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glPushNamePROC) (GLuint name); +typedef void (APIENTRY *glPopNamePROC) (); +typedef void (APIENTRY *glPushMatrixPROC) (); +typedef void (APIENTRY *glPopMatrixPROC) (); +typedef void (APIENTRY *glPushClientAttribPROC) (GLbitfield mask); +typedef void (APIENTRY *glPopClientAttribPROC) (); +typedef void (APIENTRY *glPushAttribPROC) (GLbitfield mask); +typedef void (APIENTRY *glPopAttribPROC) (); +typedef void (APIENTRY *glStencilFuncPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRY *glVertexPointerPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glVertex2fPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY *glVertex2dPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertex2iPROC) (GLint x, GLint y); +typedef void (APIENTRY *glVertex3fPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glVertex3dPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertex3iPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRY *glVertex4fPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glVertex4dPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertex4iPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glTranslatefPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glTranslatedPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glTexImage1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTexImage2DPROC) (GLenum target, GLint level, GLint internalformat, GLint width, GLint height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTexSubImage1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTexParameterfPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY *glTexParameteriPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glTexParameterfvPROC) (GLenum target, GLenum pname, const GLfloat * param); +typedef void (APIENTRY *glTexParameterivPROC) (GLenum target, GLenum pname, const GLint * param); +typedef void (APIENTRY *glTexGenfPROC) (GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRY *glTexGendPROC) (GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRY *glTexGenfvPROC) (GLenum coord, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glTexGendvPROC) (GLenum coord, GLenum pname, const GLdouble * params); +typedef void (APIENTRY *glTexGeniPROC) (GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRY *glTexGenivPROC) (GLenum coord, GLenum pname, const GLint * params); +typedef void (APIENTRY *glTexEnvfPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRY *glTexEnviPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glTexEnvfvPROC) (GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glTexEnvivPROC) (GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glTexCoordPointerPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glTexCoord1fPROC) (GLfloat s); +typedef void (APIENTRY *glTexCoord1dPROC) (GLdouble s); +typedef void (APIENTRY *glTexCoord2fPROC) (GLfloat s, GLfloat t); +typedef void (APIENTRY *glTexCoord2dPROC) (GLdouble s, GLdouble t); +typedef void (APIENTRY *glTexCoord3fPROC) (GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRY *glTexCoord3dPROC) (GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRY *glTexCoord4fPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRY *glTexCoord4dPROC) (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRY *glStencilOpPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (APIENTRY *glStencilMaskPROC) (GLuint mask); +typedef void (APIENTRY *glViewportPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglAccum(JNIEnv *env, jclass clazz, jint op, jfloat value, jlong function_pointer) { + glAccumPROC glAccum = (glAccumPROC)((intptr_t)function_pointer); + glAccum(op, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglAlphaFunc(JNIEnv *env, jclass clazz, jint func, jfloat ref, jlong function_pointer) { + glAlphaFuncPROC glAlphaFunc = (glAlphaFuncPROC)((intptr_t)function_pointer); + glAlphaFunc(func, ref); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClearColor(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha, jlong function_pointer) { + glClearColorPROC glClearColor = (glClearColorPROC)((intptr_t)function_pointer); + glClearColor(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClearAccum(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha, jlong function_pointer) { + glClearAccumPROC glClearAccum = (glClearAccumPROC)((intptr_t)function_pointer); + glClearAccum(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClear(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glClearPROC glClear = (glClearPROC)((intptr_t)function_pointer); + glClear(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCallLists(JNIEnv *env, jclass clazz, jint n, jint type, jlong lists, jlong function_pointer) { + const GLvoid *lists_address = (const GLvoid *)(intptr_t)lists; + glCallListsPROC glCallLists = (glCallListsPROC)((intptr_t)function_pointer); + glCallLists(n, type, lists_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCallList(JNIEnv *env, jclass clazz, jint list, jlong function_pointer) { + glCallListPROC glCallList = (glCallListPROC)((intptr_t)function_pointer); + glCallList(list); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglBlendFunc(JNIEnv *env, jclass clazz, jint sfactor, jint dfactor, jlong function_pointer) { + glBlendFuncPROC glBlendFunc = (glBlendFuncPROC)((intptr_t)function_pointer); + glBlendFunc(sfactor, dfactor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglBitmap(JNIEnv *env, jclass clazz, jint width, jint height, jfloat xorig, jfloat yorig, jfloat xmove, jfloat ymove, jlong bitmap, jlong function_pointer) { + const GLubyte *bitmap_address = (const GLubyte *)(intptr_t)bitmap; + glBitmapPROC glBitmap = (glBitmapPROC)((intptr_t)function_pointer); + glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglBitmapBO(JNIEnv *env, jclass clazz, jint width, jint height, jfloat xorig, jfloat yorig, jfloat xmove, jfloat ymove, jlong bitmap_buffer_offset, jlong function_pointer) { + const GLubyte *bitmap_address = (const GLubyte *)(intptr_t)offsetToPointer(bitmap_buffer_offset); + glBitmapPROC glBitmap = (glBitmapPROC)((intptr_t)function_pointer); + glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglBindTexture(JNIEnv *env, jclass clazz, jint target, jint texture, jlong function_pointer) { + glBindTexturePROC glBindTexture = (glBindTexturePROC)((intptr_t)function_pointer); + glBindTexture(target, texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPrioritizeTextures(JNIEnv *env, jclass clazz, jint n, jlong textures, jlong priorities, jlong function_pointer) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + const GLfloat *priorities_address = (const GLfloat *)(intptr_t)priorities; + glPrioritizeTexturesPROC glPrioritizeTextures = (glPrioritizeTexturesPROC)((intptr_t)function_pointer); + glPrioritizeTextures(n, textures_address, priorities_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL11_nglAreTexturesResident(JNIEnv *env, jclass clazz, jint n, jlong textures, jlong residences, jlong function_pointer) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + GLboolean *residences_address = (GLboolean *)(intptr_t)residences; + glAreTexturesResidentPROC glAreTexturesResident = (glAreTexturesResidentPROC)((intptr_t)function_pointer); + GLboolean __result = glAreTexturesResident(n, textures_address, residences_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglBegin(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glBeginPROC glBegin = (glBeginPROC)((intptr_t)function_pointer); + glBegin(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEnd(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndPROC glEnd = (glEndPROC)((intptr_t)function_pointer); + glEnd(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglArrayElement(JNIEnv *env, jclass clazz, jint i, jlong function_pointer) { + glArrayElementPROC glArrayElement = (glArrayElementPROC)((intptr_t)function_pointer); + glArrayElement(i); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClearDepth(JNIEnv *env, jclass clazz, jdouble depth, jlong function_pointer) { + glClearDepthPROC glClearDepth = (glClearDepthPROC)((intptr_t)function_pointer); + glClearDepth(depth); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDeleteLists(JNIEnv *env, jclass clazz, jint list, jint range, jlong function_pointer) { + glDeleteListsPROC glDeleteLists = (glDeleteListsPROC)((intptr_t)function_pointer); + glDeleteLists(list, range); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDeleteTextures(JNIEnv *env, jclass clazz, jint n, jlong textures, jlong function_pointer) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + glDeleteTexturesPROC glDeleteTextures = (glDeleteTexturesPROC)((intptr_t)function_pointer); + glDeleteTextures(n, textures_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCullFace(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glCullFacePROC glCullFace = (glCullFacePROC)((intptr_t)function_pointer); + glCullFace(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCopyTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyTexSubImage2DPROC glCopyTexSubImage2D = (glCopyTexSubImage2DPROC)((intptr_t)function_pointer); + glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCopyTexSubImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint x, jint y, jint width, jlong function_pointer) { + glCopyTexSubImage1DPROC glCopyTexSubImage1D = (glCopyTexSubImage1DPROC)((intptr_t)function_pointer); + glCopyTexSubImage1D(target, level, xoffset, x, y, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCopyTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint x, jint y, jint width, jint height, jint border, jlong function_pointer) { + glCopyTexImage2DPROC glCopyTexImage2D = (glCopyTexImage2DPROC)((intptr_t)function_pointer); + glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCopyTexImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint x, jint y, jint width, jint border, jlong function_pointer) { + glCopyTexImage1DPROC glCopyTexImage1D = (glCopyTexImage1DPROC)((intptr_t)function_pointer); + glCopyTexImage1D(target, level, internalFormat, x, y, width, border); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglCopyPixels(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint type, jlong function_pointer) { + glCopyPixelsPROC glCopyPixels = (glCopyPixelsPROC)((intptr_t)function_pointer); + glCopyPixels(x, y, width, height, type); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColorPointer(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glColorPointerPROC glColorPointer = (glColorPointerPROC)((intptr_t)function_pointer); + glColorPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColorPointerBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glColorPointerPROC glColorPointer = (glColorPointerPROC)((intptr_t)function_pointer); + glColorPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColorMaterial(JNIEnv *env, jclass clazz, jint face, jint mode, jlong function_pointer) { + glColorMaterialPROC glColorMaterial = (glColorMaterialPROC)((intptr_t)function_pointer); + glColorMaterial(face, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColorMask(JNIEnv *env, jclass clazz, jboolean red, jboolean green, jboolean blue, jboolean alpha, jlong function_pointer) { + glColorMaskPROC glColorMask = (glColorMaskPROC)((intptr_t)function_pointer); + glColorMask(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor3b(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glColor3bPROC glColor3b = (glColor3bPROC)((intptr_t)function_pointer); + glColor3b(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor3f(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jlong function_pointer) { + glColor3fPROC glColor3f = (glColor3fPROC)((intptr_t)function_pointer); + glColor3f(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor3d(JNIEnv *env, jclass clazz, jdouble red, jdouble green, jdouble blue, jlong function_pointer) { + glColor3dPROC glColor3d = (glColor3dPROC)((intptr_t)function_pointer); + glColor3d(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor3ub(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glColor3ubPROC glColor3ub = (glColor3ubPROC)((intptr_t)function_pointer); + glColor3ub(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor4b(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jbyte alpha, jlong function_pointer) { + glColor4bPROC glColor4b = (glColor4bPROC)((intptr_t)function_pointer); + glColor4b(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor4f(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha, jlong function_pointer) { + glColor4fPROC glColor4f = (glColor4fPROC)((intptr_t)function_pointer); + glColor4f(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor4d(JNIEnv *env, jclass clazz, jdouble red, jdouble green, jdouble blue, jdouble alpha, jlong function_pointer) { + glColor4dPROC glColor4d = (glColor4dPROC)((intptr_t)function_pointer); + glColor4d(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglColor4ub(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jbyte alpha, jlong function_pointer) { + glColor4ubPROC glColor4ub = (glColor4ubPROC)((intptr_t)function_pointer); + glColor4ub(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClipPlane(JNIEnv *env, jclass clazz, jint plane, jlong equation, jlong function_pointer) { + const GLdouble *equation_address = (const GLdouble *)(intptr_t)equation; + glClipPlanePROC glClipPlane = (glClipPlanePROC)((intptr_t)function_pointer); + glClipPlane(plane, equation_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglClearStencil(JNIEnv *env, jclass clazz, jint s, jlong function_pointer) { + glClearStencilPROC glClearStencil = (glClearStencilPROC)((intptr_t)function_pointer); + glClearStencil(s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalPoint1(JNIEnv *env, jclass clazz, jint i, jlong function_pointer) { + glEvalPoint1PROC glEvalPoint1 = (glEvalPoint1PROC)((intptr_t)function_pointer); + glEvalPoint1(i); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalPoint2(JNIEnv *env, jclass clazz, jint i, jint j, jlong function_pointer) { + glEvalPoint2PROC glEvalPoint2 = (glEvalPoint2PROC)((intptr_t)function_pointer); + glEvalPoint2(i, j); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalMesh1(JNIEnv *env, jclass clazz, jint mode, jint i1, jint i2, jlong function_pointer) { + glEvalMesh1PROC glEvalMesh1 = (glEvalMesh1PROC)((intptr_t)function_pointer); + glEvalMesh1(mode, i1, i2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalMesh2(JNIEnv *env, jclass clazz, jint mode, jint i1, jint i2, jint j1, jint j2, jlong function_pointer) { + glEvalMesh2PROC glEvalMesh2 = (glEvalMesh2PROC)((intptr_t)function_pointer); + glEvalMesh2(mode, i1, i2, j1, j2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalCoord1f(JNIEnv *env, jclass clazz, jfloat u, jlong function_pointer) { + glEvalCoord1fPROC glEvalCoord1f = (glEvalCoord1fPROC)((intptr_t)function_pointer); + glEvalCoord1f(u); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalCoord1d(JNIEnv *env, jclass clazz, jdouble u, jlong function_pointer) { + glEvalCoord1dPROC glEvalCoord1d = (glEvalCoord1dPROC)((intptr_t)function_pointer); + glEvalCoord1d(u); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalCoord2f(JNIEnv *env, jclass clazz, jfloat u, jfloat v, jlong function_pointer) { + glEvalCoord2fPROC glEvalCoord2f = (glEvalCoord2fPROC)((intptr_t)function_pointer); + glEvalCoord2f(u, v); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEvalCoord2d(JNIEnv *env, jclass clazz, jdouble u, jdouble v, jlong function_pointer) { + glEvalCoord2dPROC glEvalCoord2d = (glEvalCoord2dPROC)((intptr_t)function_pointer); + glEvalCoord2d(u, v); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEnableClientState(JNIEnv *env, jclass clazz, jint cap, jlong function_pointer) { + glEnableClientStatePROC glEnableClientState = (glEnableClientStatePROC)((intptr_t)function_pointer); + glEnableClientState(cap); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDisableClientState(JNIEnv *env, jclass clazz, jint cap, jlong function_pointer) { + glDisableClientStatePROC glDisableClientState = (glDisableClientStatePROC)((intptr_t)function_pointer); + glDisableClientState(cap); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEnable(JNIEnv *env, jclass clazz, jint cap, jlong function_pointer) { + glEnablePROC glEnable = (glEnablePROC)((intptr_t)function_pointer); + glEnable(cap); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDisable(JNIEnv *env, jclass clazz, jint cap, jlong function_pointer) { + glDisablePROC glDisable = (glDisablePROC)((intptr_t)function_pointer); + glDisable(cap); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEdgeFlagPointer(JNIEnv *env, jclass clazz, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glEdgeFlagPointerPROC glEdgeFlagPointer = (glEdgeFlagPointerPROC)((intptr_t)function_pointer); + glEdgeFlagPointer(stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEdgeFlagPointerBO(JNIEnv *env, jclass clazz, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glEdgeFlagPointerPROC glEdgeFlagPointer = (glEdgeFlagPointerPROC)((intptr_t)function_pointer); + glEdgeFlagPointer(stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEdgeFlag(JNIEnv *env, jclass clazz, jboolean flag, jlong function_pointer) { + glEdgeFlagPROC glEdgeFlag = (glEdgeFlagPROC)((intptr_t)function_pointer); + glEdgeFlag(flag); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawPixels(JNIEnv *env, jclass clazz, jint width, jint height, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glDrawPixelsPROC glDrawPixels = (glDrawPixelsPROC)((intptr_t)function_pointer); + glDrawPixels(width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawPixelsBO(JNIEnv *env, jclass clazz, jint width, jint height, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glDrawPixelsPROC glDrawPixels = (glDrawPixelsPROC)((intptr_t)function_pointer); + glDrawPixels(width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawElements(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsPROC glDrawElements = (glDrawElementsPROC)((intptr_t)function_pointer); + glDrawElements(mode, count, type, indices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawElementsBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsPROC glDrawElements = (glDrawElementsPROC)((intptr_t)function_pointer); + glDrawElements(mode, count, type, indices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawBuffer(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glDrawBufferPROC glDrawBuffer = (glDrawBufferPROC)((intptr_t)function_pointer); + glDrawBuffer(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDrawArrays(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jlong function_pointer) { + glDrawArraysPROC glDrawArrays = (glDrawArraysPROC)((intptr_t)function_pointer); + glDrawArrays(mode, first, count); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDepthRange(JNIEnv *env, jclass clazz, jdouble zNear, jdouble zFar, jlong function_pointer) { + glDepthRangePROC glDepthRange = (glDepthRangePROC)((intptr_t)function_pointer); + glDepthRange(zNear, zFar); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDepthMask(JNIEnv *env, jclass clazz, jboolean flag, jlong function_pointer) { + glDepthMaskPROC glDepthMask = (glDepthMaskPROC)((intptr_t)function_pointer); + glDepthMask(flag); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglDepthFunc(JNIEnv *env, jclass clazz, jint func, jlong function_pointer) { + glDepthFuncPROC glDepthFunc = (glDepthFuncPROC)((intptr_t)function_pointer); + glDepthFunc(func); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFeedbackBuffer(JNIEnv *env, jclass clazz, jint size, jint type, jlong buffer, jlong function_pointer) { + GLfloat *buffer_address = (GLfloat *)(intptr_t)buffer; + glFeedbackBufferPROC glFeedbackBuffer = (glFeedbackBufferPROC)((intptr_t)function_pointer); + glFeedbackBuffer(size, type, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapfv(JNIEnv *env, jclass clazz, jint map, jlong values, jlong function_pointer) { + GLfloat *values_address = (GLfloat *)(intptr_t)values; + glGetPixelMapfvPROC glGetPixelMapfv = (glGetPixelMapfvPROC)((intptr_t)function_pointer); + glGetPixelMapfv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapfvBO(JNIEnv *env, jclass clazz, jint map, jlong values_buffer_offset, jlong function_pointer) { + GLfloat *values_address = (GLfloat *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetPixelMapfvPROC glGetPixelMapfv = (glGetPixelMapfvPROC)((intptr_t)function_pointer); + glGetPixelMapfv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapuiv(JNIEnv *env, jclass clazz, jint map, jlong values, jlong function_pointer) { + GLuint *values_address = (GLuint *)(intptr_t)values; + glGetPixelMapuivPROC glGetPixelMapuiv = (glGetPixelMapuivPROC)((intptr_t)function_pointer); + glGetPixelMapuiv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapuivBO(JNIEnv *env, jclass clazz, jint map, jlong values_buffer_offset, jlong function_pointer) { + GLuint *values_address = (GLuint *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetPixelMapuivPROC glGetPixelMapuiv = (glGetPixelMapuivPROC)((intptr_t)function_pointer); + glGetPixelMapuiv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapusv(JNIEnv *env, jclass clazz, jint map, jlong values, jlong function_pointer) { + GLushort *values_address = (GLushort *)(intptr_t)values; + glGetPixelMapusvPROC glGetPixelMapusv = (glGetPixelMapusvPROC)((intptr_t)function_pointer); + glGetPixelMapusv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPixelMapusvBO(JNIEnv *env, jclass clazz, jint map, jlong values_buffer_offset, jlong function_pointer) { + GLushort *values_address = (GLushort *)(intptr_t)offsetToPointer(values_buffer_offset); + glGetPixelMapusvPROC glGetPixelMapusv = (glGetPixelMapusvPROC)((intptr_t)function_pointer); + glGetPixelMapusv(map, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetMaterialfv(JNIEnv *env, jclass clazz, jint face, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMaterialfvPROC glGetMaterialfv = (glGetMaterialfvPROC)((intptr_t)function_pointer); + glGetMaterialfv(face, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetMaterialiv(JNIEnv *env, jclass clazz, jint face, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMaterialivPROC glGetMaterialiv = (glGetMaterialivPROC)((intptr_t)function_pointer); + glGetMaterialiv(face, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetMapfv(JNIEnv *env, jclass clazz, jint target, jint query, jlong v, jlong function_pointer) { + GLfloat *v_address = (GLfloat *)(intptr_t)v; + glGetMapfvPROC glGetMapfv = (glGetMapfvPROC)((intptr_t)function_pointer); + glGetMapfv(target, query, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetMapdv(JNIEnv *env, jclass clazz, jint target, jint query, jlong v, jlong function_pointer) { + GLdouble *v_address = (GLdouble *)(intptr_t)v; + glGetMapdvPROC glGetMapdv = (glGetMapdvPROC)((intptr_t)function_pointer); + glGetMapdv(target, query, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetMapiv(JNIEnv *env, jclass clazz, jint target, jint query, jlong v, jlong function_pointer) { + GLint *v_address = (GLint *)(intptr_t)v; + glGetMapivPROC glGetMapiv = (glGetMapivPROC)((intptr_t)function_pointer); + glGetMapiv(target, query, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetLightfv(JNIEnv *env, jclass clazz, jint light, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetLightfvPROC glGetLightfv = (glGetLightfvPROC)((intptr_t)function_pointer); + glGetLightfv(light, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetLightiv(JNIEnv *env, jclass clazz, jint light, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetLightivPROC glGetLightiv = (glGetLightivPROC)((intptr_t)function_pointer); + glGetLightiv(light, pname, params_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL11_nglGetError(JNIEnv *env, jclass clazz, jlong function_pointer) { + glGetErrorPROC glGetError = (glGetErrorPROC)((intptr_t)function_pointer); + GLint __result = glGetError(); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetClipPlane(JNIEnv *env, jclass clazz, jint plane, jlong equation, jlong function_pointer) { + GLdouble *equation_address = (GLdouble *)(intptr_t)equation; + glGetClipPlanePROC glGetClipPlane = (glGetClipPlanePROC)((intptr_t)function_pointer); + glGetClipPlane(plane, equation_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetBooleanv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + GLboolean *params_address = (GLboolean *)(intptr_t)params; + glGetBooleanvPROC glGetBooleanv = (glGetBooleanvPROC)((intptr_t)function_pointer); + glGetBooleanv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetDoublev(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetDoublevPROC glGetDoublev = (glGetDoublevPROC)((intptr_t)function_pointer); + glGetDoublev(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetFloatv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetFloatvPROC glGetFloatv = (glGetFloatvPROC)((intptr_t)function_pointer); + glGetFloatv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetIntegerv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetIntegervPROC glGetIntegerv = (glGetIntegervPROC)((intptr_t)function_pointer); + glGetIntegerv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGenTextures(JNIEnv *env, jclass clazz, jint n, jlong textures, jlong function_pointer) { + GLuint *textures_address = (GLuint *)(intptr_t)textures; + glGenTexturesPROC glGenTextures = (glGenTexturesPROC)((intptr_t)function_pointer); + glGenTextures(n, textures_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL11_nglGenLists(JNIEnv *env, jclass clazz, jint range, jlong function_pointer) { + glGenListsPROC glGenLists = (glGenListsPROC)((intptr_t)function_pointer); + GLuint __result = glGenLists(range); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFrustum(JNIEnv *env, jclass clazz, jdouble left, jdouble right, jdouble bottom, jdouble top, jdouble zNear, jdouble zFar, jlong function_pointer) { + glFrustumPROC glFrustum = (glFrustumPROC)((intptr_t)function_pointer); + glFrustum(left, right, bottom, top, zNear, zFar); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFrontFace(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glFrontFacePROC glFrontFace = (glFrontFacePROC)((intptr_t)function_pointer); + glFrontFace(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFogf(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glFogfPROC glFogf = (glFogfPROC)((intptr_t)function_pointer); + glFogf(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFogi(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glFogiPROC glFogi = (glFogiPROC)((intptr_t)function_pointer); + glFogi(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFogfv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glFogfvPROC glFogfv = (glFogfvPROC)((intptr_t)function_pointer); + glFogfv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFogiv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glFogivPROC glFogiv = (glFogivPROC)((intptr_t)function_pointer); + glFogiv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFlush(JNIEnv *env, jclass clazz, jlong function_pointer) { + glFlushPROC glFlush = (glFlushPROC)((intptr_t)function_pointer); + glFlush(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglFinish(JNIEnv *env, jclass clazz, jlong function_pointer) { + glFinishPROC glFinish = (glFinishPROC)((intptr_t)function_pointer); + glFinish(); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL11_nglGetPointerv(JNIEnv *env, jclass clazz, jint pname, jlong result_size, jlong function_pointer) { + glGetPointervPROC glGetPointerv = (glGetPointervPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetPointerv(pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL11_nglIsEnabled(JNIEnv *env, jclass clazz, jint cap, jlong function_pointer) { + glIsEnabledPROC glIsEnabled = (glIsEnabledPROC)((intptr_t)function_pointer); + GLboolean __result = glIsEnabled(cap); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglInterleavedArrays(JNIEnv *env, jclass clazz, jint format, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glInterleavedArraysPROC glInterleavedArrays = (glInterleavedArraysPROC)((intptr_t)function_pointer); + glInterleavedArrays(format, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglInterleavedArraysBO(JNIEnv *env, jclass clazz, jint format, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glInterleavedArraysPROC glInterleavedArrays = (glInterleavedArraysPROC)((intptr_t)function_pointer); + glInterleavedArrays(format, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglInitNames(JNIEnv *env, jclass clazz, jlong function_pointer) { + glInitNamesPROC glInitNames = (glInitNamesPROC)((intptr_t)function_pointer); + glInitNames(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglHint(JNIEnv *env, jclass clazz, jint target, jint mode, jlong function_pointer) { + glHintPROC glHint = (glHintPROC)((intptr_t)function_pointer); + glHint(target, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexParameterfvPROC glGetTexParameterfv = (glGetTexParameterfvPROC)((intptr_t)function_pointer); + glGetTexParameterfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexParameterivPROC glGetTexParameteriv = (glGetTexParameterivPROC)((intptr_t)function_pointer); + glGetTexParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexLevelParameterfv(JNIEnv *env, jclass clazz, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexLevelParameterfvPROC glGetTexLevelParameterfv = (glGetTexLevelParameterfvPROC)((intptr_t)function_pointer); + glGetTexLevelParameterfv(target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexLevelParameteriv(JNIEnv *env, jclass clazz, jint target, jint level, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexLevelParameterivPROC glGetTexLevelParameteriv = (glGetTexLevelParameterivPROC)((intptr_t)function_pointer); + glGetTexLevelParameteriv(target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexImage(JNIEnv *env, jclass clazz, jint target, jint level, jint format, jint type, jlong pixels, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)pixels; + glGetTexImagePROC glGetTexImage = (glGetTexImagePROC)((intptr_t)function_pointer); + glGetTexImage(target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexImageBO(JNIEnv *env, jclass clazz, jint target, jint level, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glGetTexImagePROC glGetTexImage = (glGetTexImagePROC)((intptr_t)function_pointer); + glGetTexImage(target, level, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexGeniv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexGenivPROC glGetTexGeniv = (glGetTexGenivPROC)((intptr_t)function_pointer); + glGetTexGeniv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexGenfv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexGenfvPROC glGetTexGenfv = (glGetTexGenfvPROC)((intptr_t)function_pointer); + glGetTexGenfv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexGendv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetTexGendvPROC glGetTexGendv = (glGetTexGendvPROC)((intptr_t)function_pointer); + glGetTexGendv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexEnviv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexEnvivPROC glGetTexEnviv = (glGetTexEnvivPROC)((intptr_t)function_pointer); + glGetTexEnviv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetTexEnvfv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexEnvfvPROC glGetTexEnvfv = (glGetTexEnvfvPROC)((intptr_t)function_pointer); + glGetTexEnvfv(coord, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL11_nglGetString(JNIEnv *env, jclass clazz, jint name, jlong function_pointer) { + glGetStringPROC glGetString = (glGetStringPROC)((intptr_t)function_pointer); + const GLubyte * __result = glGetString(name); + return NewStringNativeUnsigned(env, __result); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPolygonStipple(JNIEnv *env, jclass clazz, jlong mask, jlong function_pointer) { + GLubyte *mask_address = (GLubyte *)(intptr_t)mask; + glGetPolygonStipplePROC glGetPolygonStipple = (glGetPolygonStipplePROC)((intptr_t)function_pointer); + glGetPolygonStipple(mask_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglGetPolygonStippleBO(JNIEnv *env, jclass clazz, jlong mask_buffer_offset, jlong function_pointer) { + GLubyte *mask_address = (GLubyte *)(intptr_t)offsetToPointer(mask_buffer_offset); + glGetPolygonStipplePROC glGetPolygonStipple = (glGetPolygonStipplePROC)((intptr_t)function_pointer); + glGetPolygonStipple(mask_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL11_nglIsList(JNIEnv *env, jclass clazz, jint list, jlong function_pointer) { + glIsListPROC glIsList = (glIsListPROC)((intptr_t)function_pointer); + GLboolean __result = glIsList(list); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMaterialf(JNIEnv *env, jclass clazz, jint face, jint pname, jfloat param, jlong function_pointer) { + glMaterialfPROC glMaterialf = (glMaterialfPROC)((intptr_t)function_pointer); + glMaterialf(face, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMateriali(JNIEnv *env, jclass clazz, jint face, jint pname, jint param, jlong function_pointer) { + glMaterialiPROC glMateriali = (glMaterialiPROC)((intptr_t)function_pointer); + glMateriali(face, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMaterialfv(JNIEnv *env, jclass clazz, jint face, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glMaterialfvPROC glMaterialfv = (glMaterialfvPROC)((intptr_t)function_pointer); + glMaterialfv(face, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMaterialiv(JNIEnv *env, jclass clazz, jint face, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glMaterialivPROC glMaterialiv = (glMaterialivPROC)((intptr_t)function_pointer); + glMaterialiv(face, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMapGrid1f(JNIEnv *env, jclass clazz, jint un, jfloat u1, jfloat u2, jlong function_pointer) { + glMapGrid1fPROC glMapGrid1f = (glMapGrid1fPROC)((intptr_t)function_pointer); + glMapGrid1f(un, u1, u2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMapGrid1d(JNIEnv *env, jclass clazz, jint un, jdouble u1, jdouble u2, jlong function_pointer) { + glMapGrid1dPROC glMapGrid1d = (glMapGrid1dPROC)((intptr_t)function_pointer); + glMapGrid1d(un, u1, u2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMapGrid2f(JNIEnv *env, jclass clazz, jint un, jfloat u1, jfloat u2, jint vn, jfloat v1, jfloat v2, jlong function_pointer) { + glMapGrid2fPROC glMapGrid2f = (glMapGrid2fPROC)((intptr_t)function_pointer); + glMapGrid2f(un, u1, u2, vn, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMapGrid2d(JNIEnv *env, jclass clazz, jint un, jdouble u1, jdouble u2, jint vn, jdouble v1, jdouble v2, jlong function_pointer) { + glMapGrid2dPROC glMapGrid2d = (glMapGrid2dPROC)((intptr_t)function_pointer); + glMapGrid2d(un, u1, u2, vn, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMap2f(JNIEnv *env, jclass clazz, jint target, jfloat u1, jfloat u2, jint ustride, jint uorder, jfloat v1, jfloat v2, jint vstride, jint vorder, jlong points, jlong function_pointer) { + const GLfloat *points_address = (const GLfloat *)(intptr_t)points; + glMap2fPROC glMap2f = (glMap2fPROC)((intptr_t)function_pointer); + glMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMap2d(JNIEnv *env, jclass clazz, jint target, jdouble u1, jdouble u2, jint ustride, jint uorder, jdouble v1, jdouble v2, jint vstride, jint vorder, jlong points, jlong function_pointer) { + const GLdouble *points_address = (const GLdouble *)(intptr_t)points; + glMap2dPROC glMap2d = (glMap2dPROC)((intptr_t)function_pointer); + glMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMap1f(JNIEnv *env, jclass clazz, jint target, jfloat u1, jfloat u2, jint stride, jint order, jlong points, jlong function_pointer) { + const GLfloat *points_address = (const GLfloat *)(intptr_t)points; + glMap1fPROC glMap1f = (glMap1fPROC)((intptr_t)function_pointer); + glMap1f(target, u1, u2, stride, order, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMap1d(JNIEnv *env, jclass clazz, jint target, jdouble u1, jdouble u2, jint stride, jint order, jlong points, jlong function_pointer) { + const GLdouble *points_address = (const GLdouble *)(intptr_t)points; + glMap1dPROC glMap1d = (glMap1dPROC)((intptr_t)function_pointer); + glMap1d(target, u1, u2, stride, order, points_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLogicOp(JNIEnv *env, jclass clazz, jint opcode, jlong function_pointer) { + glLogicOpPROC glLogicOp = (glLogicOpPROC)((intptr_t)function_pointer); + glLogicOp(opcode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLoadName(JNIEnv *env, jclass clazz, jint name, jlong function_pointer) { + glLoadNamePROC glLoadName = (glLoadNamePROC)((intptr_t)function_pointer); + glLoadName(name); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLoadMatrixf(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glLoadMatrixfPROC glLoadMatrixf = (glLoadMatrixfPROC)((intptr_t)function_pointer); + glLoadMatrixf(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLoadMatrixd(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glLoadMatrixdPROC glLoadMatrixd = (glLoadMatrixdPROC)((intptr_t)function_pointer); + glLoadMatrixd(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLoadIdentity(JNIEnv *env, jclass clazz, jlong function_pointer) { + glLoadIdentityPROC glLoadIdentity = (glLoadIdentityPROC)((intptr_t)function_pointer); + glLoadIdentity(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglListBase(JNIEnv *env, jclass clazz, jint base, jlong function_pointer) { + glListBasePROC glListBase = (glListBasePROC)((intptr_t)function_pointer); + glListBase(base); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLineWidth(JNIEnv *env, jclass clazz, jfloat width, jlong function_pointer) { + glLineWidthPROC glLineWidth = (glLineWidthPROC)((intptr_t)function_pointer); + glLineWidth(width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLineStipple(JNIEnv *env, jclass clazz, jint factor, jshort pattern, jlong function_pointer) { + glLineStipplePROC glLineStipple = (glLineStipplePROC)((intptr_t)function_pointer); + glLineStipple(factor, pattern); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightModelf(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glLightModelfPROC glLightModelf = (glLightModelfPROC)((intptr_t)function_pointer); + glLightModelf(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightModeli(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glLightModeliPROC glLightModeli = (glLightModeliPROC)((intptr_t)function_pointer); + glLightModeli(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightModelfv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glLightModelfvPROC glLightModelfv = (glLightModelfvPROC)((intptr_t)function_pointer); + glLightModelfv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightModeliv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glLightModelivPROC glLightModeliv = (glLightModelivPROC)((intptr_t)function_pointer); + glLightModeliv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightf(JNIEnv *env, jclass clazz, jint light, jint pname, jfloat param, jlong function_pointer) { + glLightfPROC glLightf = (glLightfPROC)((intptr_t)function_pointer); + glLightf(light, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLighti(JNIEnv *env, jclass clazz, jint light, jint pname, jint param, jlong function_pointer) { + glLightiPROC glLighti = (glLightiPROC)((intptr_t)function_pointer); + glLighti(light, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightfv(JNIEnv *env, jclass clazz, jint light, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glLightfvPROC glLightfv = (glLightfvPROC)((intptr_t)function_pointer); + glLightfv(light, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglLightiv(JNIEnv *env, jclass clazz, jint light, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glLightivPROC glLightiv = (glLightivPROC)((intptr_t)function_pointer); + glLightiv(light, pname, params_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL11_nglIsTexture(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glIsTexturePROC glIsTexture = (glIsTexturePROC)((intptr_t)function_pointer); + GLboolean __result = glIsTexture(texture); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMatrixMode(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glMatrixModePROC glMatrixMode = (glMatrixModePROC)((intptr_t)function_pointer); + glMatrixMode(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPolygonStipple(JNIEnv *env, jclass clazz, jlong mask, jlong function_pointer) { + const GLubyte *mask_address = (const GLubyte *)(intptr_t)mask; + glPolygonStipplePROC glPolygonStipple = (glPolygonStipplePROC)((intptr_t)function_pointer); + glPolygonStipple(mask_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPolygonStippleBO(JNIEnv *env, jclass clazz, jlong mask_buffer_offset, jlong function_pointer) { + const GLubyte *mask_address = (const GLubyte *)(intptr_t)offsetToPointer(mask_buffer_offset); + glPolygonStipplePROC glPolygonStipple = (glPolygonStipplePROC)((intptr_t)function_pointer); + glPolygonStipple(mask_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPolygonOffset(JNIEnv *env, jclass clazz, jfloat factor, jfloat units, jlong function_pointer) { + glPolygonOffsetPROC glPolygonOffset = (glPolygonOffsetPROC)((intptr_t)function_pointer); + glPolygonOffset(factor, units); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPolygonMode(JNIEnv *env, jclass clazz, jint face, jint mode, jlong function_pointer) { + glPolygonModePROC glPolygonMode = (glPolygonModePROC)((intptr_t)function_pointer); + glPolygonMode(face, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPointSize(JNIEnv *env, jclass clazz, jfloat size, jlong function_pointer) { + glPointSizePROC glPointSize = (glPointSizePROC)((intptr_t)function_pointer); + glPointSize(size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelZoom(JNIEnv *env, jclass clazz, jfloat xfactor, jfloat yfactor, jlong function_pointer) { + glPixelZoomPROC glPixelZoom = (glPixelZoomPROC)((intptr_t)function_pointer); + glPixelZoom(xfactor, yfactor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelTransferf(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPixelTransferfPROC glPixelTransferf = (glPixelTransferfPROC)((intptr_t)function_pointer); + glPixelTransferf(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelTransferi(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glPixelTransferiPROC glPixelTransferi = (glPixelTransferiPROC)((intptr_t)function_pointer); + glPixelTransferi(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelStoref(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPixelStorefPROC glPixelStoref = (glPixelStorefPROC)((intptr_t)function_pointer); + glPixelStoref(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelStorei(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glPixelStoreiPROC glPixelStorei = (glPixelStoreiPROC)((intptr_t)function_pointer); + glPixelStorei(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapfv(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glPixelMapfvPROC glPixelMapfv = (glPixelMapfvPROC)((intptr_t)function_pointer); + glPixelMapfv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapfvBO(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values_buffer_offset, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)offsetToPointer(values_buffer_offset); + glPixelMapfvPROC glPixelMapfv = (glPixelMapfvPROC)((intptr_t)function_pointer); + glPixelMapfv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapuiv(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values, jlong function_pointer) { + const GLuint *values_address = (const GLuint *)(intptr_t)values; + glPixelMapuivPROC glPixelMapuiv = (glPixelMapuivPROC)((intptr_t)function_pointer); + glPixelMapuiv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapuivBO(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values_buffer_offset, jlong function_pointer) { + const GLuint *values_address = (const GLuint *)(intptr_t)offsetToPointer(values_buffer_offset); + glPixelMapuivPROC glPixelMapuiv = (glPixelMapuivPROC)((intptr_t)function_pointer); + glPixelMapuiv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapusv(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values, jlong function_pointer) { + const GLushort *values_address = (const GLushort *)(intptr_t)values; + glPixelMapusvPROC glPixelMapusv = (glPixelMapusvPROC)((intptr_t)function_pointer); + glPixelMapusv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPixelMapusvBO(JNIEnv *env, jclass clazz, jint map, jint mapsize, jlong values_buffer_offset, jlong function_pointer) { + const GLushort *values_address = (const GLushort *)(intptr_t)offsetToPointer(values_buffer_offset); + glPixelMapusvPROC glPixelMapusv = (glPixelMapusvPROC)((intptr_t)function_pointer); + glPixelMapusv(map, mapsize, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPassThrough(JNIEnv *env, jclass clazz, jfloat token, jlong function_pointer) { + glPassThroughPROC glPassThrough = (glPassThroughPROC)((intptr_t)function_pointer); + glPassThrough(token); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglOrtho(JNIEnv *env, jclass clazz, jdouble left, jdouble right, jdouble bottom, jdouble top, jdouble zNear, jdouble zFar, jlong function_pointer) { + glOrthoPROC glOrtho = (glOrthoPROC)((intptr_t)function_pointer); + glOrtho(left, right, bottom, top, zNear, zFar); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormalPointer(JNIEnv *env, jclass clazz, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glNormalPointerPROC glNormalPointer = (glNormalPointerPROC)((intptr_t)function_pointer); + glNormalPointer(type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormalPointerBO(JNIEnv *env, jclass clazz, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glNormalPointerPROC glNormalPointer = (glNormalPointerPROC)((intptr_t)function_pointer); + glNormalPointer(type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormal3b(JNIEnv *env, jclass clazz, jbyte nx, jbyte ny, jbyte nz, jlong function_pointer) { + glNormal3bPROC glNormal3b = (glNormal3bPROC)((intptr_t)function_pointer); + glNormal3b(nx, ny, nz); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormal3f(JNIEnv *env, jclass clazz, jfloat nx, jfloat ny, jfloat nz, jlong function_pointer) { + glNormal3fPROC glNormal3f = (glNormal3fPROC)((intptr_t)function_pointer); + glNormal3f(nx, ny, nz); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormal3d(JNIEnv *env, jclass clazz, jdouble nx, jdouble ny, jdouble nz, jlong function_pointer) { + glNormal3dPROC glNormal3d = (glNormal3dPROC)((intptr_t)function_pointer); + glNormal3d(nx, ny, nz); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNormal3i(JNIEnv *env, jclass clazz, jint nx, jint ny, jint nz, jlong function_pointer) { + glNormal3iPROC glNormal3i = (glNormal3iPROC)((intptr_t)function_pointer); + glNormal3i(nx, ny, nz); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglNewList(JNIEnv *env, jclass clazz, jint list, jint mode, jlong function_pointer) { + glNewListPROC glNewList = (glNewListPROC)((intptr_t)function_pointer); + glNewList(list, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglEndList(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndListPROC glEndList = (glEndListPROC)((intptr_t)function_pointer); + glEndList(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMultMatrixf(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMultMatrixfPROC glMultMatrixf = (glMultMatrixfPROC)((intptr_t)function_pointer); + glMultMatrixf(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglMultMatrixd(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMultMatrixdPROC glMultMatrixd = (glMultMatrixdPROC)((intptr_t)function_pointer); + glMultMatrixd(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglShadeModel(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glShadeModelPROC glShadeModel = (glShadeModelPROC)((intptr_t)function_pointer); + glShadeModel(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglSelectBuffer(JNIEnv *env, jclass clazz, jint size, jlong buffer, jlong function_pointer) { + GLuint *buffer_address = (GLuint *)(intptr_t)buffer; + glSelectBufferPROC glSelectBuffer = (glSelectBufferPROC)((intptr_t)function_pointer); + glSelectBuffer(size, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglScissor(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jlong function_pointer) { + glScissorPROC glScissor = (glScissorPROC)((intptr_t)function_pointer); + glScissor(x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglScalef(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glScalefPROC glScalef = (glScalefPROC)((intptr_t)function_pointer); + glScalef(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglScaled(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glScaledPROC glScaled = (glScaledPROC)((intptr_t)function_pointer); + glScaled(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRotatef(JNIEnv *env, jclass clazz, jfloat angle, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glRotatefPROC glRotatef = (glRotatefPROC)((intptr_t)function_pointer); + glRotatef(angle, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRotated(JNIEnv *env, jclass clazz, jdouble angle, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glRotatedPROC glRotated = (glRotatedPROC)((intptr_t)function_pointer); + glRotated(angle, x, y, z); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL11_nglRenderMode(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glRenderModePROC glRenderMode = (glRenderModePROC)((intptr_t)function_pointer); + GLint __result = glRenderMode(mode); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRectf(JNIEnv *env, jclass clazz, jfloat x1, jfloat y1, jfloat x2, jfloat y2, jlong function_pointer) { + glRectfPROC glRectf = (glRectfPROC)((intptr_t)function_pointer); + glRectf(x1, y1, x2, y2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRectd(JNIEnv *env, jclass clazz, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jlong function_pointer) { + glRectdPROC glRectd = (glRectdPROC)((intptr_t)function_pointer); + glRectd(x1, y1, x2, y2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRecti(JNIEnv *env, jclass clazz, jint x1, jint y1, jint x2, jint y2, jlong function_pointer) { + glRectiPROC glRecti = (glRectiPROC)((intptr_t)function_pointer); + glRecti(x1, y1, x2, y2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglReadPixels(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jlong pixels, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)pixels; + glReadPixelsPROC glReadPixels = (glReadPixelsPROC)((intptr_t)function_pointer); + glReadPixels(x, y, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglReadPixelsBO(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glReadPixelsPROC glReadPixels = (glReadPixelsPROC)((intptr_t)function_pointer); + glReadPixels(x, y, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglReadBuffer(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glReadBufferPROC glReadBuffer = (glReadBufferPROC)((intptr_t)function_pointer); + glReadBuffer(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos2f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jlong function_pointer) { + glRasterPos2fPROC glRasterPos2f = (glRasterPos2fPROC)((intptr_t)function_pointer); + glRasterPos2f(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos2d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jlong function_pointer) { + glRasterPos2dPROC glRasterPos2d = (glRasterPos2dPROC)((intptr_t)function_pointer); + glRasterPos2d(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos2i(JNIEnv *env, jclass clazz, jint x, jint y, jlong function_pointer) { + glRasterPos2iPROC glRasterPos2i = (glRasterPos2iPROC)((intptr_t)function_pointer); + glRasterPos2i(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos3f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glRasterPos3fPROC glRasterPos3f = (glRasterPos3fPROC)((intptr_t)function_pointer); + glRasterPos3f(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos3d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glRasterPos3dPROC glRasterPos3d = (glRasterPos3dPROC)((intptr_t)function_pointer); + glRasterPos3d(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos3i(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jlong function_pointer) { + glRasterPos3iPROC glRasterPos3i = (glRasterPos3iPROC)((intptr_t)function_pointer); + glRasterPos3i(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos4f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glRasterPos4fPROC glRasterPos4f = (glRasterPos4fPROC)((intptr_t)function_pointer); + glRasterPos4f(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos4d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glRasterPos4dPROC glRasterPos4d = (glRasterPos4dPROC)((intptr_t)function_pointer); + glRasterPos4d(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglRasterPos4i(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jint w, jlong function_pointer) { + glRasterPos4iPROC glRasterPos4i = (glRasterPos4iPROC)((intptr_t)function_pointer); + glRasterPos4i(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPushName(JNIEnv *env, jclass clazz, jint name, jlong function_pointer) { + glPushNamePROC glPushName = (glPushNamePROC)((intptr_t)function_pointer); + glPushName(name); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPopName(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPopNamePROC glPopName = (glPopNamePROC)((intptr_t)function_pointer); + glPopName(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPushMatrix(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPushMatrixPROC glPushMatrix = (glPushMatrixPROC)((intptr_t)function_pointer); + glPushMatrix(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPopMatrix(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPopMatrixPROC glPopMatrix = (glPopMatrixPROC)((intptr_t)function_pointer); + glPopMatrix(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPushClientAttrib(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glPushClientAttribPROC glPushClientAttrib = (glPushClientAttribPROC)((intptr_t)function_pointer); + glPushClientAttrib(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPopClientAttrib(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPopClientAttribPROC glPopClientAttrib = (glPopClientAttribPROC)((intptr_t)function_pointer); + glPopClientAttrib(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPushAttrib(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glPushAttribPROC glPushAttrib = (glPushAttribPROC)((intptr_t)function_pointer); + glPushAttrib(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglPopAttrib(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPopAttribPROC glPopAttrib = (glPopAttribPROC)((intptr_t)function_pointer); + glPopAttrib(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglStencilFunc(JNIEnv *env, jclass clazz, jint func, jint ref, jint mask, jlong function_pointer) { + glStencilFuncPROC glStencilFunc = (glStencilFuncPROC)((intptr_t)function_pointer); + glStencilFunc(func, ref, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertexPointer(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glVertexPointerPROC glVertexPointer = (glVertexPointerPROC)((intptr_t)function_pointer); + glVertexPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertexPointerBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glVertexPointerPROC glVertexPointer = (glVertexPointerPROC)((intptr_t)function_pointer); + glVertexPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex2f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jlong function_pointer) { + glVertex2fPROC glVertex2f = (glVertex2fPROC)((intptr_t)function_pointer); + glVertex2f(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex2d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jlong function_pointer) { + glVertex2dPROC glVertex2d = (glVertex2dPROC)((intptr_t)function_pointer); + glVertex2d(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex2i(JNIEnv *env, jclass clazz, jint x, jint y, jlong function_pointer) { + glVertex2iPROC glVertex2i = (glVertex2iPROC)((intptr_t)function_pointer); + glVertex2i(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex3f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glVertex3fPROC glVertex3f = (glVertex3fPROC)((intptr_t)function_pointer); + glVertex3f(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex3d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertex3dPROC glVertex3d = (glVertex3dPROC)((intptr_t)function_pointer); + glVertex3d(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex3i(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jlong function_pointer) { + glVertex3iPROC glVertex3i = (glVertex3iPROC)((intptr_t)function_pointer); + glVertex3i(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex4f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glVertex4fPROC glVertex4f = (glVertex4fPROC)((intptr_t)function_pointer); + glVertex4f(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex4d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertex4dPROC glVertex4d = (glVertex4dPROC)((intptr_t)function_pointer); + glVertex4d(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglVertex4i(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertex4iPROC glVertex4i = (glVertex4iPROC)((intptr_t)function_pointer); + glVertex4i(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTranslatef(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glTranslatefPROC glTranslatef = (glTranslatefPROC)((intptr_t)function_pointer); + glTranslatef(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTranslated(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glTranslatedPROC glTranslated = (glTranslatedPROC)((intptr_t)function_pointer); + glTranslated(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage1DPROC glTexImage1D = (glTexImage1DPROC)((intptr_t)function_pointer); + glTexImage1D(target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexImage1DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexImage1DPROC glTexImage1D = (glTexImage1DPROC)((intptr_t)function_pointer); + glTexImage1D(target, level, internalformat, width, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage2DPROC glTexImage2D = (glTexImage2DPROC)((intptr_t)function_pointer); + glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexImage2DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexImage2DPROC glTexImage2D = (glTexImage2DPROC)((intptr_t)function_pointer); + glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexSubImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage1DPROC glTexSubImage1D = (glTexSubImage1DPROC)((intptr_t)function_pointer); + glTexSubImage1D(target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexSubImage1DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexSubImage1DPROC glTexSubImage1D = (glTexSubImage1DPROC)((intptr_t)function_pointer); + glTexSubImage1D(target, level, xoffset, width, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage2DPROC glTexSubImage2D = (glTexSubImage2DPROC)((intptr_t)function_pointer); + glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexSubImage2DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexSubImage2DPROC glTexSubImage2D = (glTexSubImage2DPROC)((intptr_t)function_pointer); + glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexParameterf(JNIEnv *env, jclass clazz, jint target, jint pname, jfloat param, jlong function_pointer) { + glTexParameterfPROC glTexParameterf = (glTexParameterfPROC)((intptr_t)function_pointer); + glTexParameterf(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexParameteri(JNIEnv *env, jclass clazz, jint target, jint pname, jint param, jlong function_pointer) { + glTexParameteriPROC glTexParameteri = (glTexParameteriPROC)((intptr_t)function_pointer); + glTexParameteri(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong param, jlong function_pointer) { + const GLfloat *param_address = (const GLfloat *)(intptr_t)param; + glTexParameterfvPROC glTexParameterfv = (glTexParameterfvPROC)((intptr_t)function_pointer); + glTexParameterfv(target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong param, jlong function_pointer) { + const GLint *param_address = (const GLint *)(intptr_t)param; + glTexParameterivPROC glTexParameteriv = (glTexParameterivPROC)((intptr_t)function_pointer); + glTexParameteriv(target, pname, param_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGenf(JNIEnv *env, jclass clazz, jint coord, jint pname, jfloat param, jlong function_pointer) { + glTexGenfPROC glTexGenf = (glTexGenfPROC)((intptr_t)function_pointer); + glTexGenf(coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGend(JNIEnv *env, jclass clazz, jint coord, jint pname, jdouble param, jlong function_pointer) { + glTexGendPROC glTexGend = (glTexGendPROC)((intptr_t)function_pointer); + glTexGend(coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGenfv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glTexGenfvPROC glTexGenfv = (glTexGenfvPROC)((intptr_t)function_pointer); + glTexGenfv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGendv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glTexGendvPROC glTexGendv = (glTexGendvPROC)((intptr_t)function_pointer); + glTexGendv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGeni(JNIEnv *env, jclass clazz, jint coord, jint pname, jint param, jlong function_pointer) { + glTexGeniPROC glTexGeni = (glTexGeniPROC)((intptr_t)function_pointer); + glTexGeni(coord, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexGeniv(JNIEnv *env, jclass clazz, jint coord, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glTexGenivPROC glTexGeniv = (glTexGenivPROC)((intptr_t)function_pointer); + glTexGeniv(coord, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexEnvf(JNIEnv *env, jclass clazz, jint target, jint pname, jfloat param, jlong function_pointer) { + glTexEnvfPROC glTexEnvf = (glTexEnvfPROC)((intptr_t)function_pointer); + glTexEnvf(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexEnvi(JNIEnv *env, jclass clazz, jint target, jint pname, jint param, jlong function_pointer) { + glTexEnviPROC glTexEnvi = (glTexEnviPROC)((intptr_t)function_pointer); + glTexEnvi(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexEnvfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glTexEnvfvPROC glTexEnvfv = (glTexEnvfvPROC)((intptr_t)function_pointer); + glTexEnvfv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexEnviv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glTexEnvivPROC glTexEnviv = (glTexEnvivPROC)((intptr_t)function_pointer); + glTexEnviv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoordPointer(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glTexCoordPointerPROC glTexCoordPointer = (glTexCoordPointerPROC)((intptr_t)function_pointer); + glTexCoordPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoordPointerBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glTexCoordPointerPROC glTexCoordPointer = (glTexCoordPointerPROC)((intptr_t)function_pointer); + glTexCoordPointer(size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord1f(JNIEnv *env, jclass clazz, jfloat s, jlong function_pointer) { + glTexCoord1fPROC glTexCoord1f = (glTexCoord1fPROC)((intptr_t)function_pointer); + glTexCoord1f(s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord1d(JNIEnv *env, jclass clazz, jdouble s, jlong function_pointer) { + glTexCoord1dPROC glTexCoord1d = (glTexCoord1dPROC)((intptr_t)function_pointer); + glTexCoord1d(s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord2f(JNIEnv *env, jclass clazz, jfloat s, jfloat t, jlong function_pointer) { + glTexCoord2fPROC glTexCoord2f = (glTexCoord2fPROC)((intptr_t)function_pointer); + glTexCoord2f(s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord2d(JNIEnv *env, jclass clazz, jdouble s, jdouble t, jlong function_pointer) { + glTexCoord2dPROC glTexCoord2d = (glTexCoord2dPROC)((intptr_t)function_pointer); + glTexCoord2d(s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord3f(JNIEnv *env, jclass clazz, jfloat s, jfloat t, jfloat r, jlong function_pointer) { + glTexCoord3fPROC glTexCoord3f = (glTexCoord3fPROC)((intptr_t)function_pointer); + glTexCoord3f(s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord3d(JNIEnv *env, jclass clazz, jdouble s, jdouble t, jdouble r, jlong function_pointer) { + glTexCoord3dPROC glTexCoord3d = (glTexCoord3dPROC)((intptr_t)function_pointer); + glTexCoord3d(s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord4f(JNIEnv *env, jclass clazz, jfloat s, jfloat t, jfloat r, jfloat q, jlong function_pointer) { + glTexCoord4fPROC glTexCoord4f = (glTexCoord4fPROC)((intptr_t)function_pointer); + glTexCoord4f(s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglTexCoord4d(JNIEnv *env, jclass clazz, jdouble s, jdouble t, jdouble r, jdouble q, jlong function_pointer) { + glTexCoord4dPROC glTexCoord4d = (glTexCoord4dPROC)((intptr_t)function_pointer); + glTexCoord4d(s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglStencilOp(JNIEnv *env, jclass clazz, jint fail, jint zfail, jint zpass, jlong function_pointer) { + glStencilOpPROC glStencilOp = (glStencilOpPROC)((intptr_t)function_pointer); + glStencilOp(fail, zfail, zpass); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglStencilMask(JNIEnv *env, jclass clazz, jint mask, jlong function_pointer) { + glStencilMaskPROC glStencilMask = (glStencilMaskPROC)((intptr_t)function_pointer); + glStencilMask(mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL11_nglViewport(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jlong function_pointer) { + glViewportPROC glViewport = (glViewportPROC)((intptr_t)function_pointer); + glViewport(x, y, width, height); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL12.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL12.c new file mode 100644 index 0000000..864b2a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL12.c @@ -0,0 +1,51 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawRangeElementsPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); +typedef void (APIENTRY *glTexImage3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); +typedef void (APIENTRY *glCopyTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglDrawRangeElements(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawRangeElementsPROC glDrawRangeElements = (glDrawRangeElementsPROC)((intptr_t)function_pointer); + glDrawRangeElements(mode, start, end, count, type, indices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglDrawRangeElementsBO(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices_buffer_offset, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawRangeElementsPROC glDrawRangeElements = (glDrawRangeElementsPROC)((intptr_t)function_pointer); + glDrawRangeElements(mode, start, end, count, type, indices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglTexImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage3DPROC glTexImage3D = (glTexImage3DPROC)((intptr_t)function_pointer); + glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglTexImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexImage3DPROC glTexImage3D = (glTexImage3DPROC)((intptr_t)function_pointer); + glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage3DPROC glTexSubImage3D = (glTexSubImage3DPROC)((intptr_t)function_pointer); + glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglTexSubImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels_buffer_offset, jlong function_pointer) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexSubImage3DPROC glTexSubImage3D = (glTexSubImage3DPROC)((intptr_t)function_pointer); + glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL12_nglCopyTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint x, jint y, jint width, jint height, jlong function_pointer) { + glCopyTexSubImage3DPROC glCopyTexSubImage3D = (glCopyTexSubImage3DPROC)((intptr_t)function_pointer); + glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL13.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL13.c new file mode 100644 index 0000000..26cbd2c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL13.c @@ -0,0 +1,191 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glActiveTexturePROC) (GLenum texture); +typedef void (APIENTRY *glClientActiveTexturePROC) (GLenum texture); +typedef void (APIENTRY *glCompressedTexImage1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTexImage2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTexImage3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTexSubImage1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glCompressedTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef void (APIENTRY *glGetCompressedTexImagePROC) (GLenum target, GLint lod, GLvoid * img); +typedef void (APIENTRY *glMultiTexCoord1fPROC) (GLenum target, GLfloat s); +typedef void (APIENTRY *glMultiTexCoord1dPROC) (GLenum target, GLdouble s); +typedef void (APIENTRY *glMultiTexCoord2fPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRY *glMultiTexCoord2dPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRY *glMultiTexCoord3fPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRY *glMultiTexCoord3dPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRY *glMultiTexCoord4fPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRY *glMultiTexCoord4dPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRY *glLoadTransposeMatrixfPROC) (const GLfloat * m); +typedef void (APIENTRY *glLoadTransposeMatrixdPROC) (const GLdouble * m); +typedef void (APIENTRY *glMultTransposeMatrixfPROC) (const GLfloat * m); +typedef void (APIENTRY *glMultTransposeMatrixdPROC) (const GLdouble * m); +typedef void (APIENTRY *glSampleCoveragePROC) (GLfloat value, GLboolean invert); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglActiveTexture(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glActiveTexturePROC glActiveTexture = (glActiveTexturePROC)((intptr_t)function_pointer); + glActiveTexture(texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglClientActiveTexture(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glClientActiveTexturePROC glClientActiveTexture = (glClientActiveTexturePROC)((intptr_t)function_pointer); + glClientActiveTexture(texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage1DPROC glCompressedTexImage1D = (glCompressedTexImage1DPROC)((intptr_t)function_pointer); + glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage1DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexImage1DPROC glCompressedTexImage1D = (glCompressedTexImage1DPROC)((intptr_t)function_pointer); + glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage2DPROC glCompressedTexImage2D = (glCompressedTexImage2DPROC)((intptr_t)function_pointer); + glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage2DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexImage2DPROC glCompressedTexImage2D = (glCompressedTexImage2DPROC)((intptr_t)function_pointer); + glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage3DPROC glCompressedTexImage3D = (glCompressedTexImage3DPROC)((intptr_t)function_pointer); + glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexImage3DPROC glCompressedTexImage3D = (glCompressedTexImage3DPROC)((intptr_t)function_pointer); + glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage1D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage1DPROC glCompressedTexSubImage1D = (glCompressedTexSubImage1DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage1DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint width, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexSubImage1DPROC glCompressedTexSubImage1D = (glCompressedTexSubImage1DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage2DPROC glCompressedTexSubImage2D = (glCompressedTexSubImage2DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage2DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexSubImage2DPROC glCompressedTexSubImage2D = (glCompressedTexSubImage2DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage3DPROC glCompressedTexSubImage3D = (glCompressedTexSubImage3DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglCompressedTexSubImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexSubImage3DPROC glCompressedTexSubImage3D = (glCompressedTexSubImage3DPROC)((intptr_t)function_pointer); + glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglGetCompressedTexImage(JNIEnv *env, jclass clazz, jint target, jint lod, jlong img, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetCompressedTexImagePROC glGetCompressedTexImage = (glGetCompressedTexImagePROC)((intptr_t)function_pointer); + glGetCompressedTexImage(target, lod, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglGetCompressedTexImageBO(JNIEnv *env, jclass clazz, jint target, jint lod, jlong img_buffer_offset, jlong function_pointer) { + GLvoid *img_address = (GLvoid *)(intptr_t)offsetToPointer(img_buffer_offset); + glGetCompressedTexImagePROC glGetCompressedTexImage = (glGetCompressedTexImagePROC)((intptr_t)function_pointer); + glGetCompressedTexImage(target, lod, img_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord1f(JNIEnv *env, jclass clazz, jint target, jfloat s, jlong function_pointer) { + glMultiTexCoord1fPROC glMultiTexCoord1f = (glMultiTexCoord1fPROC)((intptr_t)function_pointer); + glMultiTexCoord1f(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord1d(JNIEnv *env, jclass clazz, jint target, jdouble s, jlong function_pointer) { + glMultiTexCoord1dPROC glMultiTexCoord1d = (glMultiTexCoord1dPROC)((intptr_t)function_pointer); + glMultiTexCoord1d(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord2f(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jlong function_pointer) { + glMultiTexCoord2fPROC glMultiTexCoord2f = (glMultiTexCoord2fPROC)((intptr_t)function_pointer); + glMultiTexCoord2f(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord2d(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jlong function_pointer) { + glMultiTexCoord2dPROC glMultiTexCoord2d = (glMultiTexCoord2dPROC)((intptr_t)function_pointer); + glMultiTexCoord2d(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord3f(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jfloat r, jlong function_pointer) { + glMultiTexCoord3fPROC glMultiTexCoord3f = (glMultiTexCoord3fPROC)((intptr_t)function_pointer); + glMultiTexCoord3f(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord3d(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jdouble r, jlong function_pointer) { + glMultiTexCoord3dPROC glMultiTexCoord3d = (glMultiTexCoord3dPROC)((intptr_t)function_pointer); + glMultiTexCoord3d(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord4f(JNIEnv *env, jclass clazz, jint target, jfloat s, jfloat t, jfloat r, jfloat q, jlong function_pointer) { + glMultiTexCoord4fPROC glMultiTexCoord4f = (glMultiTexCoord4fPROC)((intptr_t)function_pointer); + glMultiTexCoord4f(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord4d(JNIEnv *env, jclass clazz, jint target, jdouble s, jdouble t, jdouble r, jdouble q, jlong function_pointer) { + glMultiTexCoord4dPROC glMultiTexCoord4d = (glMultiTexCoord4dPROC)((intptr_t)function_pointer); + glMultiTexCoord4d(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglLoadTransposeMatrixf(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glLoadTransposeMatrixfPROC glLoadTransposeMatrixf = (glLoadTransposeMatrixfPROC)((intptr_t)function_pointer); + glLoadTransposeMatrixf(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglLoadTransposeMatrixd(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glLoadTransposeMatrixdPROC glLoadTransposeMatrixd = (glLoadTransposeMatrixdPROC)((intptr_t)function_pointer); + glLoadTransposeMatrixd(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultTransposeMatrixf(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLfloat *m_address = (const GLfloat *)(intptr_t)m; + glMultTransposeMatrixfPROC glMultTransposeMatrixf = (glMultTransposeMatrixfPROC)((intptr_t)function_pointer); + glMultTransposeMatrixf(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultTransposeMatrixd(JNIEnv *env, jclass clazz, jlong m, jlong function_pointer) { + const GLdouble *m_address = (const GLdouble *)(intptr_t)m; + glMultTransposeMatrixdPROC glMultTransposeMatrixd = (glMultTransposeMatrixdPROC)((intptr_t)function_pointer); + glMultTransposeMatrixd(m_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglSampleCoverage(JNIEnv *env, jclass clazz, jfloat value, jboolean invert, jlong function_pointer) { + glSampleCoveragePROC glSampleCoverage = (glSampleCoveragePROC)((intptr_t)function_pointer); + glSampleCoverage(value, invert); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL14.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL14.c new file mode 100644 index 0000000..400f68b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL14.c @@ -0,0 +1,156 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendEquationPROC) (GLenum mode); +typedef void (APIENTRY *glBlendColorPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRY *glFogCoordfPROC) (GLfloat coord); +typedef void (APIENTRY *glFogCoorddPROC) (GLdouble coord); +typedef void (APIENTRY *glFogCoordPointerPROC) (GLenum type, GLsizei stride, const GLvoid * data); +typedef void (APIENTRY *glMultiDrawArraysPROC) (GLenum mode, GLint * piFirst, GLsizei * piCount, GLsizei primcount); +typedef void (APIENTRY *glPointParameteriPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glPointParameterfPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glPointParameterivPROC) (GLenum pname, const GLint * params); +typedef void (APIENTRY *glPointParameterfvPROC) (GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glSecondaryColor3bPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRY *glSecondaryColor3fPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRY *glSecondaryColor3dPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRY *glSecondaryColor3ubPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRY *glSecondaryColorPointerPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * data); +typedef void (APIENTRY *glBlendFuncSeparatePROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRY *glWindowPos2fPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRY *glWindowPos2dPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRY *glWindowPos2iPROC) (GLint x, GLint y); +typedef void (APIENTRY *glWindowPos3fPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glWindowPos3dPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glWindowPos3iPROC) (GLint x, GLint y, GLint z); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglBlendEquation(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glBlendEquationPROC glBlendEquation = (glBlendEquationPROC)((intptr_t)function_pointer); + glBlendEquation(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglBlendColor(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha, jlong function_pointer) { + glBlendColorPROC glBlendColor = (glBlendColorPROC)((intptr_t)function_pointer); + glBlendColor(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglFogCoordf(JNIEnv *env, jclass clazz, jfloat coord, jlong function_pointer) { + glFogCoordfPROC glFogCoordf = (glFogCoordfPROC)((intptr_t)function_pointer); + glFogCoordf(coord); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglFogCoordd(JNIEnv *env, jclass clazz, jdouble coord, jlong function_pointer) { + glFogCoorddPROC glFogCoordd = (glFogCoorddPROC)((intptr_t)function_pointer); + glFogCoordd(coord); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglFogCoordPointer(JNIEnv *env, jclass clazz, jint type, jint stride, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glFogCoordPointerPROC glFogCoordPointer = (glFogCoordPointerPROC)((intptr_t)function_pointer); + glFogCoordPointer(type, stride, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglFogCoordPointerBO(JNIEnv *env, jclass clazz, jint type, jint stride, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glFogCoordPointerPROC glFogCoordPointer = (glFogCoordPointerPROC)((intptr_t)function_pointer); + glFogCoordPointer(type, stride, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglMultiDrawArrays(JNIEnv *env, jclass clazz, jint mode, jlong piFirst, jlong piCount, jint primcount, jlong function_pointer) { + GLint *piFirst_address = (GLint *)(intptr_t)piFirst; + GLsizei *piCount_address = (GLsizei *)(intptr_t)piCount; + glMultiDrawArraysPROC glMultiDrawArrays = (glMultiDrawArraysPROC)((intptr_t)function_pointer); + glMultiDrawArrays(mode, piFirst_address, piCount_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglPointParameteri(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glPointParameteriPROC glPointParameteri = (glPointParameteriPROC)((intptr_t)function_pointer); + glPointParameteri(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglPointParameterf(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glPointParameterfPROC glPointParameterf = (glPointParameterfPROC)((intptr_t)function_pointer); + glPointParameterf(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglPointParameteriv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glPointParameterivPROC glPointParameteriv = (glPointParameterivPROC)((intptr_t)function_pointer); + glPointParameteriv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglPointParameterfv(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glPointParameterfvPROC glPointParameterfv = (glPointParameterfvPROC)((intptr_t)function_pointer); + glPointParameterfv(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColor3b(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glSecondaryColor3bPROC glSecondaryColor3b = (glSecondaryColor3bPROC)((intptr_t)function_pointer); + glSecondaryColor3b(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColor3f(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jlong function_pointer) { + glSecondaryColor3fPROC glSecondaryColor3f = (glSecondaryColor3fPROC)((intptr_t)function_pointer); + glSecondaryColor3f(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColor3d(JNIEnv *env, jclass clazz, jdouble red, jdouble green, jdouble blue, jlong function_pointer) { + glSecondaryColor3dPROC glSecondaryColor3d = (glSecondaryColor3dPROC)((intptr_t)function_pointer); + glSecondaryColor3d(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColor3ub(JNIEnv *env, jclass clazz, jbyte red, jbyte green, jbyte blue, jlong function_pointer) { + glSecondaryColor3ubPROC glSecondaryColor3ub = (glSecondaryColor3ubPROC)((intptr_t)function_pointer); + glSecondaryColor3ub(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColorPointer(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glSecondaryColorPointerPROC glSecondaryColorPointer = (glSecondaryColorPointerPROC)((intptr_t)function_pointer); + glSecondaryColorPointer(size, type, stride, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglSecondaryColorPointerBO(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong data_buffer_offset, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glSecondaryColorPointerPROC glSecondaryColorPointer = (glSecondaryColorPointerPROC)((intptr_t)function_pointer); + glSecondaryColorPointer(size, type, stride, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglBlendFuncSeparate(JNIEnv *env, jclass clazz, jint sfactorRGB, jint dfactorRGB, jint sfactorAlpha, jint dfactorAlpha, jlong function_pointer) { + glBlendFuncSeparatePROC glBlendFuncSeparate = (glBlendFuncSeparatePROC)((intptr_t)function_pointer); + glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos2f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jlong function_pointer) { + glWindowPos2fPROC glWindowPos2f = (glWindowPos2fPROC)((intptr_t)function_pointer); + glWindowPos2f(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos2d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jlong function_pointer) { + glWindowPos2dPROC glWindowPos2d = (glWindowPos2dPROC)((intptr_t)function_pointer); + glWindowPos2d(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos2i(JNIEnv *env, jclass clazz, jint x, jint y, jlong function_pointer) { + glWindowPos2iPROC glWindowPos2i = (glWindowPos2iPROC)((intptr_t)function_pointer); + glWindowPos2i(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos3f(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glWindowPos3fPROC glWindowPos3f = (glWindowPos3fPROC)((intptr_t)function_pointer); + glWindowPos3f(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos3d(JNIEnv *env, jclass clazz, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glWindowPos3dPROC glWindowPos3d = (glWindowPos3dPROC)((intptr_t)function_pointer); + glWindowPos3d(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL14_nglWindowPos3i(JNIEnv *env, jclass clazz, jint x, jint y, jint z, jlong function_pointer) { + glWindowPos3iPROC glWindowPos3i = (glWindowPos3iPROC)((intptr_t)function_pointer); + glWindowPos3i(x, y, z); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL15.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL15.c new file mode 100644 index 0000000..c7556d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL15.c @@ -0,0 +1,137 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindBufferPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRY *glDeleteBuffersPROC) (GLsizei n, const GLuint * buffers); +typedef void (APIENTRY *glGenBuffersPROC) (GLsizei n, GLuint * buffers); +typedef GLboolean (APIENTRY *glIsBufferPROC) (GLuint buffer); +typedef void (APIENTRY *glBufferDataPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); +typedef void (APIENTRY *glBufferSubDataPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); +typedef void (APIENTRY *glGetBufferSubDataPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data); +typedef GLvoid * (APIENTRY *glMapBufferPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRY *glUnmapBufferPROC) (GLenum target); +typedef void (APIENTRY *glGetBufferParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetBufferPointervPROC) (GLenum target, GLenum pname, GLvoid ** pointer); +typedef void (APIENTRY *glGenQueriesPROC) (GLsizei n, GLuint * ids); +typedef void (APIENTRY *glDeleteQueriesPROC) (GLsizei n, GLuint * ids); +typedef GLboolean (APIENTRY *glIsQueryPROC) (GLuint id); +typedef void (APIENTRY *glBeginQueryPROC) (GLenum target, GLuint id); +typedef void (APIENTRY *glEndQueryPROC) (GLenum target); +typedef void (APIENTRY *glGetQueryivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetQueryObjectivPROC) (GLenum id, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetQueryObjectuivPROC) (GLenum id, GLenum pname, GLuint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglBindBuffer(JNIEnv *env, jclass clazz, jint target, jint buffer, jlong function_pointer) { + glBindBufferPROC glBindBuffer = (glBindBufferPROC)((intptr_t)function_pointer); + glBindBuffer(target, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglDeleteBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers, jlong function_pointer) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + glDeleteBuffersPROC glDeleteBuffers = (glDeleteBuffersPROC)((intptr_t)function_pointer); + glDeleteBuffers(n, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGenBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers, jlong function_pointer) { + GLuint *buffers_address = (GLuint *)(intptr_t)buffers; + glGenBuffersPROC glGenBuffers = (glGenBuffersPROC)((intptr_t)function_pointer); + glGenBuffers(n, buffers_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL15_nglIsBuffer(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glIsBufferPROC glIsBuffer = (glIsBufferPROC)((intptr_t)function_pointer); + GLboolean __result = glIsBuffer(buffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglBufferData(JNIEnv *env, jclass clazz, jint target, jlong size, jlong data, jint usage, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferDataPROC glBufferData = (glBufferDataPROC)((intptr_t)function_pointer); + glBufferData(target, size, data_address, usage); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglBufferSubData(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferSubDataPROC glBufferSubData = (glBufferSubDataPROC)((intptr_t)function_pointer); + glBufferSubData(target, offset, size, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetBufferSubData(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetBufferSubDataPROC glGetBufferSubData = (glGetBufferSubDataPROC)((intptr_t)function_pointer); + glGetBufferSubData(target, offset, size, data_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL15_nglMapBuffer(JNIEnv *env, jclass clazz, jint target, jint access, jlong result_size, jobject old_buffer, jlong function_pointer) { + glMapBufferPROC glMapBuffer = (glMapBufferPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapBuffer(target, access); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL15_nglUnmapBuffer(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glUnmapBufferPROC glUnmapBuffer = (glUnmapBufferPROC)((intptr_t)function_pointer); + GLboolean __result = glUnmapBuffer(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetBufferParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetBufferParameterivPROC glGetBufferParameteriv = (glGetBufferParameterivPROC)((intptr_t)function_pointer); + glGetBufferParameteriv(target, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL15_nglGetBufferPointerv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong result_size, jlong function_pointer) { + glGetBufferPointervPROC glGetBufferPointerv = (glGetBufferPointervPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetBufferPointerv(target, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGenQueries(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenQueriesPROC glGenQueries = (glGenQueriesPROC)((intptr_t)function_pointer); + glGenQueries(n, ids_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglDeleteQueries(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glDeleteQueriesPROC glDeleteQueries = (glDeleteQueriesPROC)((intptr_t)function_pointer); + glDeleteQueries(n, ids_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL15_nglIsQuery(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glIsQueryPROC glIsQuery = (glIsQueryPROC)((intptr_t)function_pointer); + GLboolean __result = glIsQuery(id); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglBeginQuery(JNIEnv *env, jclass clazz, jint target, jint id, jlong function_pointer) { + glBeginQueryPROC glBeginQuery = (glBeginQueryPROC)((intptr_t)function_pointer); + glBeginQuery(target, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglEndQuery(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glEndQueryPROC glEndQuery = (glEndQueryPROC)((intptr_t)function_pointer); + glEndQuery(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetQueryiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryivPROC glGetQueryiv = (glGetQueryivPROC)((intptr_t)function_pointer); + glGetQueryiv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetQueryObjectiv(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryObjectivPROC glGetQueryObjectiv = (glGetQueryObjectivPROC)((intptr_t)function_pointer); + glGetQueryObjectiv(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetQueryObjectuiv(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetQueryObjectuivPROC glGetQueryObjectuiv = (glGetQueryObjectuivPROC)((intptr_t)function_pointer); + glGetQueryObjectuiv(id, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL20.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL20.c new file mode 100644 index 0000000..681debc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL20.c @@ -0,0 +1,503 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glShaderSourcePROC) (GLuint shader, GLsizei count, const GLchar ** string, const GLint* length); +typedef GLint (APIENTRY *glCreateShaderPROC) (GLuint type); +typedef GLboolean (APIENTRY *glIsShaderPROC) (GLuint shader); +typedef void (APIENTRY *glCompileShaderPROC) (GLuint shader); +typedef void (APIENTRY *glDeleteShaderPROC) (GLuint shader); +typedef GLint (APIENTRY *glCreateProgramPROC) (); +typedef GLboolean (APIENTRY *glIsProgramPROC) (GLint program); +typedef void (APIENTRY *glAttachShaderPROC) (GLuint program, GLuint shader); +typedef void (APIENTRY *glDetachShaderPROC) (GLuint program, GLuint shader); +typedef void (APIENTRY *glLinkProgramPROC) (GLuint program); +typedef void (APIENTRY *glUseProgramPROC) (GLuint program); +typedef void (APIENTRY *glValidateProgramPROC) (GLuint program); +typedef void (APIENTRY *glDeleteProgramPROC) (GLuint program); +typedef void (APIENTRY *glUniform1fPROC) (GLint location, GLfloat v0); +typedef void (APIENTRY *glUniform2fPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRY *glUniform3fPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glUniform4fPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRY *glUniform1iPROC) (GLint location, GLint v0); +typedef void (APIENTRY *glUniform2iPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRY *glUniform3iPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRY *glUniform4iPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRY *glUniform1fvPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform2fvPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform3fvPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform4fvPROC) (GLint location, GLsizei count, const GLfloat * values); +typedef void (APIENTRY *glUniform1ivPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform2ivPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform3ivPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniform4ivPROC) (GLint location, GLsizei count, const GLint * values); +typedef void (APIENTRY *glUniformMatrix2fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix3fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix4fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef void (APIENTRY *glGetShaderivPROC) (GLuint shader, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetProgramivPROC) (GLuint program, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetShaderInfoLogPROC) (GLuint shader, GLsizei maxLength, GLsizei * length, GLchar * infoLog); +typedef void (APIENTRY *glGetProgramInfoLogPROC) (GLuint program, GLsizei maxLength, GLsizei * length, GLchar * infoLog); +typedef void (APIENTRY *glGetAttachedShadersPROC) (GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (APIENTRY *glGetUniformLocationPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glGetActiveUniformPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (APIENTRY *glGetUniformfvPROC) (GLuint program, GLint location, GLfloat * params); +typedef void (APIENTRY *glGetUniformivPROC) (GLuint program, GLint location, GLint * params); +typedef void (APIENTRY *glGetShaderSourcePROC) (GLuint shader, GLsizei maxLength, GLsizei * length, GLchar * source); +typedef void (APIENTRY *glVertexAttrib1sPROC) (GLuint index, GLshort x); +typedef void (APIENTRY *glVertexAttrib1fPROC) (GLuint index, GLfloat x); +typedef void (APIENTRY *glVertexAttrib1dPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY *glVertexAttrib2sPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRY *glVertexAttrib2fPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRY *glVertexAttrib2dPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertexAttrib3sPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY *glVertexAttrib3fPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glVertexAttrib3dPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertexAttrib4sPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY *glVertexAttrib4fPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glVertexAttrib4dPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertexAttrib4NubPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRY *glVertexAttribPointerPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * buffer); +typedef void (APIENTRY *glEnableVertexAttribArrayPROC) (GLuint index); +typedef void (APIENTRY *glDisableVertexAttribArrayPROC) (GLuint index); +typedef void (APIENTRY *glGetVertexAttribfvPROC) (GLuint index, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetVertexAttribdvPROC) (GLuint index, GLenum pname, GLdouble * params); +typedef void (APIENTRY *glGetVertexAttribivPROC) (GLuint index, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVertexAttribPointervPROC) (GLuint index, GLenum pname, GLvoid ** pointer); +typedef void (APIENTRY *glBindAttribLocationPROC) (GLuint program, GLuint index, const GLchar * name); +typedef void (APIENTRY *glGetActiveAttribPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef GLint (APIENTRY *glGetAttribLocationPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glDrawBuffersPROC) (GLsizei size, const GLenum * buffers); +typedef void (APIENTRY *glStencilOpSeparatePROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRY *glStencilFuncSeparatePROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRY *glStencilMaskSeparatePROC) (GLenum face, GLuint mask); +typedef void (APIENTRY *glBlendEquationSeparatePROC) (GLenum modeRGB, GLenum modeAlpha); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglShaderSource(JNIEnv *env, jclass clazz, jint shader, jint count, jlong string, jint length, jlong function_pointer) { + const GLchar *string_address = (const GLchar *)(intptr_t)string; + glShaderSourcePROC glShaderSource = (glShaderSourcePROC)((intptr_t)function_pointer); + glShaderSource(shader, count, (const GLchar **)&string_address, (const GLint*)&length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglShaderSource3(JNIEnv *env, jclass clazz, jint shader, jint count, jlong strings, jlong length, jlong function_pointer) { + const GLchar *strings_address = (const GLchar *)(intptr_t)strings; + int _str_i; + GLchar *_str_address; + GLchar **strings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + const GLint *length_address = (const GLint *)(intptr_t)length; + glShaderSourcePROC glShaderSource = (glShaderSourcePROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i] = _str_address; + _str_address += length_address[_str_i++]; + } + glShaderSource(shader, count, (const GLchar **)strings_str, length_address); + free(strings_str); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL20_nglCreateShader(JNIEnv *env, jclass clazz, jint type, jlong function_pointer) { + glCreateShaderPROC glCreateShader = (glCreateShaderPROC)((intptr_t)function_pointer); + GLint __result = glCreateShader(type); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL20_nglIsShader(JNIEnv *env, jclass clazz, jint shader, jlong function_pointer) { + glIsShaderPROC glIsShader = (glIsShaderPROC)((intptr_t)function_pointer); + GLboolean __result = glIsShader(shader); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglCompileShader(JNIEnv *env, jclass clazz, jint shader, jlong function_pointer) { + glCompileShaderPROC glCompileShader = (glCompileShaderPROC)((intptr_t)function_pointer); + glCompileShader(shader); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglDeleteShader(JNIEnv *env, jclass clazz, jint shader, jlong function_pointer) { + glDeleteShaderPROC glDeleteShader = (glDeleteShaderPROC)((intptr_t)function_pointer); + glDeleteShader(shader); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL20_nglCreateProgram(JNIEnv *env, jclass clazz, jlong function_pointer) { + glCreateProgramPROC glCreateProgram = (glCreateProgramPROC)((intptr_t)function_pointer); + GLint __result = glCreateProgram(); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL20_nglIsProgram(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glIsProgramPROC glIsProgram = (glIsProgramPROC)((intptr_t)function_pointer); + GLboolean __result = glIsProgram(program); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglAttachShader(JNIEnv *env, jclass clazz, jint program, jint shader, jlong function_pointer) { + glAttachShaderPROC glAttachShader = (glAttachShaderPROC)((intptr_t)function_pointer); + glAttachShader(program, shader); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglDetachShader(JNIEnv *env, jclass clazz, jint program, jint shader, jlong function_pointer) { + glDetachShaderPROC glDetachShader = (glDetachShaderPROC)((intptr_t)function_pointer); + glDetachShader(program, shader); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglLinkProgram(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glLinkProgramPROC glLinkProgram = (glLinkProgramPROC)((intptr_t)function_pointer); + glLinkProgram(program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUseProgram(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glUseProgramPROC glUseProgram = (glUseProgramPROC)((intptr_t)function_pointer); + glUseProgram(program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglValidateProgram(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glValidateProgramPROC glValidateProgram = (glValidateProgramPROC)((intptr_t)function_pointer); + glValidateProgram(program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglDeleteProgram(JNIEnv *env, jclass clazz, jint program, jlong function_pointer) { + glDeleteProgramPROC glDeleteProgram = (glDeleteProgramPROC)((intptr_t)function_pointer); + glDeleteProgram(program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform1f(JNIEnv *env, jclass clazz, jint location, jfloat v0, jlong function_pointer) { + glUniform1fPROC glUniform1f = (glUniform1fPROC)((intptr_t)function_pointer); + glUniform1f(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform2f(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jlong function_pointer) { + glUniform2fPROC glUniform2f = (glUniform2fPROC)((intptr_t)function_pointer); + glUniform2f(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform3f(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jfloat v2, jlong function_pointer) { + glUniform3fPROC glUniform3f = (glUniform3fPROC)((intptr_t)function_pointer); + glUniform3f(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform4f(JNIEnv *env, jclass clazz, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3, jlong function_pointer) { + glUniform4fPROC glUniform4f = (glUniform4fPROC)((intptr_t)function_pointer); + glUniform4f(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform1i(JNIEnv *env, jclass clazz, jint location, jint v0, jlong function_pointer) { + glUniform1iPROC glUniform1i = (glUniform1iPROC)((intptr_t)function_pointer); + glUniform1i(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform2i(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jlong function_pointer) { + glUniform2iPROC glUniform2i = (glUniform2iPROC)((intptr_t)function_pointer); + glUniform2i(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform3i(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glUniform3iPROC glUniform3i = (glUniform3iPROC)((intptr_t)function_pointer); + glUniform3i(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform4i(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glUniform4iPROC glUniform4i = (glUniform4iPROC)((intptr_t)function_pointer); + glUniform4i(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform1fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform1fvPROC glUniform1fv = (glUniform1fvPROC)((intptr_t)function_pointer); + glUniform1fv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform2fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform2fvPROC glUniform2fv = (glUniform2fvPROC)((intptr_t)function_pointer); + glUniform2fv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform3fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform3fvPROC glUniform3fv = (glUniform3fvPROC)((intptr_t)function_pointer); + glUniform3fv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform4fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glUniform4fvPROC glUniform4fv = (glUniform4fvPROC)((intptr_t)function_pointer); + glUniform4fv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform1iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform1ivPROC glUniform1iv = (glUniform1ivPROC)((intptr_t)function_pointer); + glUniform1iv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform2iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform2ivPROC glUniform2iv = (glUniform2ivPROC)((intptr_t)function_pointer); + glUniform2iv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform3iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform3ivPROC glUniform3iv = (glUniform3ivPROC)((intptr_t)function_pointer); + glUniform3iv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniform4iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong values, jlong function_pointer) { + const GLint *values_address = (const GLint *)(intptr_t)values; + glUniform4ivPROC glUniform4iv = (glUniform4ivPROC)((intptr_t)function_pointer); + glUniform4iv(location, count, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniformMatrix2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix2fvPROC glUniformMatrix2fv = (glUniformMatrix2fvPROC)((intptr_t)function_pointer); + glUniformMatrix2fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniformMatrix3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix3fvPROC glUniformMatrix3fv = (glUniformMatrix3fvPROC)((intptr_t)function_pointer); + glUniformMatrix3fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglUniformMatrix4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix4fvPROC glUniformMatrix4fv = (glUniformMatrix4fvPROC)((intptr_t)function_pointer); + glUniformMatrix4fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetShaderiv(JNIEnv *env, jclass clazz, jint shader, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetShaderivPROC glGetShaderiv = (glGetShaderivPROC)((intptr_t)function_pointer); + glGetShaderiv(shader, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetProgramiv(JNIEnv *env, jclass clazz, jint program, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramivPROC glGetProgramiv = (glGetProgramivPROC)((intptr_t)function_pointer); + glGetProgramiv(program, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetShaderInfoLog(JNIEnv *env, jclass clazz, jint shader, jint maxLength, jlong length, jlong infoLog, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetShaderInfoLogPROC glGetShaderInfoLog = (glGetShaderInfoLogPROC)((intptr_t)function_pointer); + glGetShaderInfoLog(shader, maxLength, length_address, infoLog_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetProgramInfoLog(JNIEnv *env, jclass clazz, jint program, jint maxLength, jlong length, jlong infoLog, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetProgramInfoLogPROC glGetProgramInfoLog = (glGetProgramInfoLogPROC)((intptr_t)function_pointer); + glGetProgramInfoLog(program, maxLength, length_address, infoLog_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetAttachedShaders(JNIEnv *env, jclass clazz, jint program, jint maxCount, jlong count, jlong shaders, jlong function_pointer) { + GLsizei *count_address = (GLsizei *)(intptr_t)count; + GLuint *shaders_address = (GLuint *)(intptr_t)shaders; + glGetAttachedShadersPROC glGetAttachedShaders = (glGetAttachedShadersPROC)((intptr_t)function_pointer); + glGetAttachedShaders(program, maxCount, count_address, shaders_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL20_nglGetUniformLocation(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetUniformLocationPROC glGetUniformLocation = (glGetUniformLocationPROC)((intptr_t)function_pointer); + GLint __result = glGetUniformLocation(program, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetActiveUniform(JNIEnv *env, jclass clazz, jint program, jint index, jint maxLength, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveUniformPROC glGetActiveUniform = (glGetActiveUniformPROC)((intptr_t)function_pointer); + glGetActiveUniform(program, index, maxLength, length_address, size_address, type_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetUniformfv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetUniformfvPROC glGetUniformfv = (glGetUniformfvPROC)((intptr_t)function_pointer); + glGetUniformfv(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetUniformiv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetUniformivPROC glGetUniformiv = (glGetUniformivPROC)((intptr_t)function_pointer); + glGetUniformiv(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetShaderSource(JNIEnv *env, jclass clazz, jint shader, jint maxLength, jlong length, jlong source, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *source_address = (GLchar *)(intptr_t)source; + glGetShaderSourcePROC glGetShaderSource = (glGetShaderSourcePROC)((intptr_t)function_pointer); + glGetShaderSource(shader, maxLength, length_address, source_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib1s(JNIEnv *env, jclass clazz, jint index, jshort x, jlong function_pointer) { + glVertexAttrib1sPROC glVertexAttrib1s = (glVertexAttrib1sPROC)((intptr_t)function_pointer); + glVertexAttrib1s(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib1f(JNIEnv *env, jclass clazz, jint index, jfloat x, jlong function_pointer) { + glVertexAttrib1fPROC glVertexAttrib1f = (glVertexAttrib1fPROC)((intptr_t)function_pointer); + glVertexAttrib1f(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib1d(JNIEnv *env, jclass clazz, jint index, jdouble x, jlong function_pointer) { + glVertexAttrib1dPROC glVertexAttrib1d = (glVertexAttrib1dPROC)((intptr_t)function_pointer); + glVertexAttrib1d(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib2s(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jlong function_pointer) { + glVertexAttrib2sPROC glVertexAttrib2s = (glVertexAttrib2sPROC)((intptr_t)function_pointer); + glVertexAttrib2s(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib2f(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jlong function_pointer) { + glVertexAttrib2fPROC glVertexAttrib2f = (glVertexAttrib2fPROC)((intptr_t)function_pointer); + glVertexAttrib2f(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib2d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jlong function_pointer) { + glVertexAttrib2dPROC glVertexAttrib2d = (glVertexAttrib2dPROC)((intptr_t)function_pointer); + glVertexAttrib2d(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib3s(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jlong function_pointer) { + glVertexAttrib3sPROC glVertexAttrib3s = (glVertexAttrib3sPROC)((intptr_t)function_pointer); + glVertexAttrib3s(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib3f(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glVertexAttrib3fPROC glVertexAttrib3f = (glVertexAttrib3fPROC)((intptr_t)function_pointer); + glVertexAttrib3f(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib3d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertexAttrib3dPROC glVertexAttrib3d = (glVertexAttrib3dPROC)((intptr_t)function_pointer); + glVertexAttrib3d(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib4s(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jshort w, jlong function_pointer) { + glVertexAttrib4sPROC glVertexAttrib4s = (glVertexAttrib4sPROC)((intptr_t)function_pointer); + glVertexAttrib4s(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib4f(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glVertexAttrib4fPROC glVertexAttrib4f = (glVertexAttrib4fPROC)((intptr_t)function_pointer); + glVertexAttrib4f(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib4d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertexAttrib4dPROC glVertexAttrib4d = (glVertexAttrib4dPROC)((intptr_t)function_pointer); + glVertexAttrib4d(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttrib4Nub(JNIEnv *env, jclass clazz, jint index, jbyte x, jbyte y, jbyte z, jbyte w, jlong function_pointer) { + glVertexAttrib4NubPROC glVertexAttrib4Nub = (glVertexAttrib4NubPROC)((intptr_t)function_pointer); + glVertexAttrib4Nub(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttribPointer(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribPointerPROC glVertexAttribPointer = (glVertexAttribPointerPROC)((intptr_t)function_pointer); + glVertexAttribPointer(index, size, type, normalized, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglVertexAttribPointerBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer_buffer_offset, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribPointerPROC glVertexAttribPointer = (glVertexAttribPointerPROC)((intptr_t)function_pointer); + glVertexAttribPointer(index, size, type, normalized, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglEnableVertexAttribArray(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glEnableVertexAttribArrayPROC glEnableVertexAttribArray = (glEnableVertexAttribArrayPROC)((intptr_t)function_pointer); + glEnableVertexAttribArray(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglDisableVertexAttribArray(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glDisableVertexAttribArrayPROC glDisableVertexAttribArray = (glDisableVertexAttribArrayPROC)((intptr_t)function_pointer); + glDisableVertexAttribArray(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetVertexAttribfv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVertexAttribfvPROC glGetVertexAttribfv = (glGetVertexAttribfvPROC)((intptr_t)function_pointer); + glGetVertexAttribfv(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetVertexAttribdv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVertexAttribdvPROC glGetVertexAttribdv = (glGetVertexAttribdvPROC)((intptr_t)function_pointer); + glGetVertexAttribdv(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetVertexAttribiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribivPROC glGetVertexAttribiv = (glGetVertexAttribivPROC)((intptr_t)function_pointer); + glGetVertexAttribiv(index, pname, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL20_nglGetVertexAttribPointerv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong result_size, jlong function_pointer) { + glGetVertexAttribPointervPROC glGetVertexAttribPointerv = (glGetVertexAttribPointervPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVertexAttribPointerv(index, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetVertexAttribPointerv2(JNIEnv *env, jclass clazz, jint index, jint pname, jlong pointer, jlong function_pointer) { + GLvoid *pointer_address = (GLvoid *)(intptr_t)pointer; + glGetVertexAttribPointervPROC glGetVertexAttribPointerv = (glGetVertexAttribPointervPROC)((intptr_t)function_pointer); + glGetVertexAttribPointerv(index, pname, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglBindAttribLocation(JNIEnv *env, jclass clazz, jint program, jint index, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glBindAttribLocationPROC glBindAttribLocation = (glBindAttribLocationPROC)((intptr_t)function_pointer); + glBindAttribLocation(program, index, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglGetActiveAttrib(JNIEnv *env, jclass clazz, jint program, jint index, jint maxLength, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *size_address = (GLint *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveAttribPROC glGetActiveAttrib = (glGetActiveAttribPROC)((intptr_t)function_pointer); + glGetActiveAttrib(program, index, maxLength, length_address, size_address, type_address, name_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL20_nglGetAttribLocation(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetAttribLocationPROC glGetAttribLocation = (glGetAttribLocationPROC)((intptr_t)function_pointer); + GLint __result = glGetAttribLocation(program, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglDrawBuffers(JNIEnv *env, jclass clazz, jint size, jlong buffers, jlong function_pointer) { + const GLenum *buffers_address = (const GLenum *)(intptr_t)buffers; + glDrawBuffersPROC glDrawBuffers = (glDrawBuffersPROC)((intptr_t)function_pointer); + glDrawBuffers(size, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglStencilOpSeparate(JNIEnv *env, jclass clazz, jint face, jint sfail, jint dpfail, jint dppass, jlong function_pointer) { + glStencilOpSeparatePROC glStencilOpSeparate = (glStencilOpSeparatePROC)((intptr_t)function_pointer); + glStencilOpSeparate(face, sfail, dpfail, dppass); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglStencilFuncSeparate(JNIEnv *env, jclass clazz, jint face, jint func, jint ref, jint mask, jlong function_pointer) { + glStencilFuncSeparatePROC glStencilFuncSeparate = (glStencilFuncSeparatePROC)((intptr_t)function_pointer); + glStencilFuncSeparate(face, func, ref, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglStencilMaskSeparate(JNIEnv *env, jclass clazz, jint face, jint mask, jlong function_pointer) { + glStencilMaskSeparatePROC glStencilMaskSeparate = (glStencilMaskSeparatePROC)((intptr_t)function_pointer); + glStencilMaskSeparate(face, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL20_nglBlendEquationSeparate(JNIEnv *env, jclass clazz, jint modeRGB, jint modeAlpha, jlong function_pointer) { + glBlendEquationSeparatePROC glBlendEquationSeparate = (glBlendEquationSeparatePROC)((intptr_t)function_pointer); + glBlendEquationSeparate(modeRGB, modeAlpha); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL21.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL21.c new file mode 100644 index 0000000..aa48f7f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL21.c @@ -0,0 +1,48 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glUniformMatrix2x3fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix3x2fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix2x4fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix4x2fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix3x4fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef void (APIENTRY *glUniformMatrix4x3fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix2x3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix2x3fvPROC glUniformMatrix2x3fv = (glUniformMatrix2x3fvPROC)((intptr_t)function_pointer); + glUniformMatrix2x3fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix3x2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix3x2fvPROC glUniformMatrix3x2fv = (glUniformMatrix3x2fvPROC)((intptr_t)function_pointer); + glUniformMatrix3x2fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix2x4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix2x4fvPROC glUniformMatrix2x4fv = (glUniformMatrix2x4fvPROC)((intptr_t)function_pointer); + glUniformMatrix2x4fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix4x2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix4x2fvPROC glUniformMatrix4x2fv = (glUniformMatrix4x2fvPROC)((intptr_t)function_pointer); + glUniformMatrix4x2fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix3x4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix3x4fvPROC glUniformMatrix3x4fv = (glUniformMatrix3x4fvPROC)((intptr_t)function_pointer); + glUniformMatrix3x4fv(location, count, transpose, matrices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL21_nglUniformMatrix4x3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices, jlong function_pointer) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix4x3fvPROC glUniformMatrix4x3fv = (glUniformMatrix4x3fvPROC)((intptr_t)function_pointer); + glUniformMatrix4x3fv(location, count, transpose, matrices_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL30.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL30.c new file mode 100644 index 0000000..2b569e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL30.c @@ -0,0 +1,578 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLubyte * (APIENTRY *glGetStringiPROC) (GLenum name, GLuint index); +typedef void (APIENTRY *glClearBufferfvPROC) (GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (APIENTRY *glClearBufferivPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (APIENTRY *glClearBufferuivPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (APIENTRY *glClearBufferfiPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (APIENTRY *glVertexAttribI1iPROC) (GLuint index, GLint x); +typedef void (APIENTRY *glVertexAttribI2iPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRY *glVertexAttribI3iPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRY *glVertexAttribI4iPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glVertexAttribI1uiPROC) (GLuint index, GLuint x); +typedef void (APIENTRY *glVertexAttribI2uiPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRY *glVertexAttribI3uiPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRY *glVertexAttribI4uiPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRY *glVertexAttribI1ivPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI2ivPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI3ivPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI4ivPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glVertexAttribI1uivPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI2uivPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI3uivPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI4uivPROC) (GLuint index, const GLuint * v); +typedef void (APIENTRY *glVertexAttribI4bvPROC) (GLuint index, const GLbyte * v); +typedef void (APIENTRY *glVertexAttribI4svPROC) (GLuint index, const GLshort * v); +typedef void (APIENTRY *glVertexAttribI4ubvPROC) (GLuint index, const GLubyte * v); +typedef void (APIENTRY *glVertexAttribI4usvPROC) (GLuint index, const GLushort * v); +typedef void (APIENTRY *glVertexAttribIPointerPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * buffer); +typedef void (APIENTRY *glGetVertexAttribIivPROC) (GLuint index, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVertexAttribIuivPROC) (GLuint index, GLenum pname, GLuint * params); +typedef void (APIENTRY *glUniform1uiPROC) (GLint location, GLuint v0); +typedef void (APIENTRY *glUniform2uiPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRY *glUniform3uiPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRY *glUniform4uiPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRY *glUniform1uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform2uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform3uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glUniform4uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef void (APIENTRY *glGetUniformuivPROC) (GLuint program, GLint location, GLuint * params); +typedef void (APIENTRY *glBindFragDataLocationPROC) (GLuint program, GLuint colorNumber, const GLchar * name); +typedef GLint (APIENTRY *glGetFragDataLocationPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glBeginConditionalRenderPROC) (GLuint id, GLenum mode); +typedef void (APIENTRY *glEndConditionalRenderPROC) (); +typedef GLvoid * (APIENTRY *glMapBufferRangePROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRY *glFlushMappedBufferRangePROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRY *glClampColorPROC) (GLenum target, GLenum clamp); +typedef GLboolean (APIENTRY *glIsRenderbufferPROC) (GLuint renderbuffer); +typedef void (APIENTRY *glBindRenderbufferPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRY *glDeleteRenderbuffersPROC) (GLint n, const GLuint * renderbuffers); +typedef void (APIENTRY *glGenRenderbuffersPROC) (GLint n, GLuint * renderbuffers); +typedef void (APIENTRY *glRenderbufferStoragePROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glGetRenderbufferParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef GLboolean (APIENTRY *glIsFramebufferPROC) (GLuint framebuffer); +typedef void (APIENTRY *glBindFramebufferPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRY *glDeleteFramebuffersPROC) (GLint n, const GLuint * framebuffers); +typedef void (APIENTRY *glGenFramebuffersPROC) (GLint n, GLuint * framebuffers); +typedef GLenum (APIENTRY *glCheckFramebufferStatusPROC) (GLenum target); +typedef void (APIENTRY *glFramebufferTexture1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTexture2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRY *glFramebufferTexture3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRY *glFramebufferRenderbufferPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRY *glGetFramebufferAttachmentParameterivPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (APIENTRY *glGenerateMipmapPROC) (GLenum target); +typedef void (APIENTRY *glRenderbufferStorageMultisamplePROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glBlitFramebufferPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRY *glTexParameterIivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glTexParameterIuivPROC) (GLenum target, GLenum pname, GLuint * params); +typedef void (APIENTRY *glGetTexParameterIivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetTexParameterIuivPROC) (GLenum target, GLenum pname, GLuint * params); +typedef void (APIENTRY *glFramebufferTextureLayerPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRY *glColorMaskiPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRY *glGetBooleani_vPROC) (GLenum value, GLuint index, GLboolean * data); +typedef void (APIENTRY *glGetIntegeri_vPROC) (GLenum value, GLuint index, GLint * data); +typedef void (APIENTRY *glEnableiPROC) (GLenum target, GLuint index); +typedef void (APIENTRY *glDisableiPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRY *glIsEnablediPROC) (GLenum target, GLuint index); +typedef void (APIENTRY *glBindBufferRangePROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRY *glBindBufferBasePROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRY *glBeginTransformFeedbackPROC) (GLenum primitiveMode); +typedef void (APIENTRY *glEndTransformFeedbackPROC) (); +typedef void (APIENTRY *glTransformFeedbackVaryingsPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); +typedef void (APIENTRY *glGetTransformFeedbackVaryingPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (APIENTRY *glBindVertexArrayPROC) (GLuint array); +typedef void (APIENTRY *glDeleteVertexArraysPROC) (GLsizei n, const GLuint * arrays); +typedef void (APIENTRY *glGenVertexArraysPROC) (GLsizei n, GLuint * arrays); +typedef GLboolean (APIENTRY *glIsVertexArrayPROC) (GLuint array); + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL30_nglGetStringi(JNIEnv *env, jclass clazz, jint name, jint index, jlong function_pointer) { + glGetStringiPROC glGetStringi = (glGetStringiPROC)((intptr_t)function_pointer); + GLubyte * __result = glGetStringi(name, index); + return NewStringNativeUnsigned(env, __result); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglClearBufferfv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glClearBufferfvPROC glClearBufferfv = (glClearBufferfvPROC)((intptr_t)function_pointer); + glClearBufferfv(buffer, drawbuffer, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglClearBufferiv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glClearBufferivPROC glClearBufferiv = (glClearBufferivPROC)((intptr_t)function_pointer); + glClearBufferiv(buffer, drawbuffer, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglClearBufferuiv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glClearBufferuivPROC glClearBufferuiv = (glClearBufferuivPROC)((intptr_t)function_pointer); + glClearBufferuiv(buffer, drawbuffer, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglClearBufferfi(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jfloat depth, jint stencil, jlong function_pointer) { + glClearBufferfiPROC glClearBufferfi = (glClearBufferfiPROC)((intptr_t)function_pointer); + glClearBufferfi(buffer, drawbuffer, depth, stencil); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI1i(JNIEnv *env, jclass clazz, jint index, jint x, jlong function_pointer) { + glVertexAttribI1iPROC glVertexAttribI1i = (glVertexAttribI1iPROC)((intptr_t)function_pointer); + glVertexAttribI1i(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI2i(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jlong function_pointer) { + glVertexAttribI2iPROC glVertexAttribI2i = (glVertexAttribI2iPROC)((intptr_t)function_pointer); + glVertexAttribI2i(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI3i(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jlong function_pointer) { + glVertexAttribI3iPROC glVertexAttribI3i = (glVertexAttribI3iPROC)((intptr_t)function_pointer); + glVertexAttribI3i(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4i(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertexAttribI4iPROC glVertexAttribI4i = (glVertexAttribI4iPROC)((intptr_t)function_pointer); + glVertexAttribI4i(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI1ui(JNIEnv *env, jclass clazz, jint index, jint x, jlong function_pointer) { + glVertexAttribI1uiPROC glVertexAttribI1ui = (glVertexAttribI1uiPROC)((intptr_t)function_pointer); + glVertexAttribI1ui(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI2ui(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jlong function_pointer) { + glVertexAttribI2uiPROC glVertexAttribI2ui = (glVertexAttribI2uiPROC)((intptr_t)function_pointer); + glVertexAttribI2ui(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI3ui(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jlong function_pointer) { + glVertexAttribI3uiPROC glVertexAttribI3ui = (glVertexAttribI3uiPROC)((intptr_t)function_pointer); + glVertexAttribI3ui(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4ui(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glVertexAttribI4uiPROC glVertexAttribI4ui = (glVertexAttribI4uiPROC)((intptr_t)function_pointer); + glVertexAttribI4ui(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI1iv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI1ivPROC glVertexAttribI1iv = (glVertexAttribI1ivPROC)((intptr_t)function_pointer); + glVertexAttribI1iv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI2iv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI2ivPROC glVertexAttribI2iv = (glVertexAttribI2ivPROC)((intptr_t)function_pointer); + glVertexAttribI2iv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI3iv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI3ivPROC glVertexAttribI3iv = (glVertexAttribI3ivPROC)((intptr_t)function_pointer); + glVertexAttribI3iv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4iv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI4ivPROC glVertexAttribI4iv = (glVertexAttribI4ivPROC)((intptr_t)function_pointer); + glVertexAttribI4iv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI1uiv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI1uivPROC glVertexAttribI1uiv = (glVertexAttribI1uivPROC)((intptr_t)function_pointer); + glVertexAttribI1uiv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI2uiv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI2uivPROC glVertexAttribI2uiv = (glVertexAttribI2uivPROC)((intptr_t)function_pointer); + glVertexAttribI2uiv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI3uiv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI3uivPROC glVertexAttribI3uiv = (glVertexAttribI3uivPROC)((intptr_t)function_pointer); + glVertexAttribI3uiv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4uiv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI4uivPROC glVertexAttribI4uiv = (glVertexAttribI4uivPROC)((intptr_t)function_pointer); + glVertexAttribI4uiv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4bv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLbyte *v_address = (const GLbyte *)(intptr_t)v; + glVertexAttribI4bvPROC glVertexAttribI4bv = (glVertexAttribI4bvPROC)((intptr_t)function_pointer); + glVertexAttribI4bv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4sv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribI4svPROC glVertexAttribI4sv = (glVertexAttribI4svPROC)((intptr_t)function_pointer); + glVertexAttribI4sv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4ubv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLubyte *v_address = (const GLubyte *)(intptr_t)v; + glVertexAttribI4ubvPROC glVertexAttribI4ubv = (glVertexAttribI4ubvPROC)((intptr_t)function_pointer); + glVertexAttribI4ubv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribI4usv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLushort *v_address = (const GLushort *)(intptr_t)v; + glVertexAttribI4usvPROC glVertexAttribI4usv = (glVertexAttribI4usvPROC)((intptr_t)function_pointer); + glVertexAttribI4usv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribIPointer(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribIPointerPROC glVertexAttribIPointer = (glVertexAttribIPointerPROC)((intptr_t)function_pointer); + glVertexAttribIPointer(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglVertexAttribIPointerBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer_buffer_offset, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribIPointerPROC glVertexAttribIPointer = (glVertexAttribIPointerPROC)((intptr_t)function_pointer); + glVertexAttribIPointer(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetVertexAttribIiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribIivPROC glGetVertexAttribIiv = (glGetVertexAttribIivPROC)((intptr_t)function_pointer); + glGetVertexAttribIiv(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetVertexAttribIuiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetVertexAttribIuivPROC glGetVertexAttribIuiv = (glGetVertexAttribIuivPROC)((intptr_t)function_pointer); + glGetVertexAttribIuiv(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform1ui(JNIEnv *env, jclass clazz, jint location, jint v0, jlong function_pointer) { + glUniform1uiPROC glUniform1ui = (glUniform1uiPROC)((intptr_t)function_pointer); + glUniform1ui(location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform2ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jlong function_pointer) { + glUniform2uiPROC glUniform2ui = (glUniform2uiPROC)((intptr_t)function_pointer); + glUniform2ui(location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform3ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glUniform3uiPROC glUniform3ui = (glUniform3uiPROC)((intptr_t)function_pointer); + glUniform3ui(location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform4ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glUniform4uiPROC glUniform4ui = (glUniform4uiPROC)((intptr_t)function_pointer); + glUniform4ui(location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform1uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform1uivPROC glUniform1uiv = (glUniform1uivPROC)((intptr_t)function_pointer); + glUniform1uiv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform2uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform2uivPROC glUniform2uiv = (glUniform2uivPROC)((intptr_t)function_pointer); + glUniform2uiv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform3uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform3uivPROC glUniform3uiv = (glUniform3uivPROC)((intptr_t)function_pointer); + glUniform3uiv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglUniform4uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform4uivPROC glUniform4uiv = (glUniform4uivPROC)((intptr_t)function_pointer); + glUniform4uiv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetUniformuiv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetUniformuivPROC glGetUniformuiv = (glGetUniformuivPROC)((intptr_t)function_pointer); + glGetUniformuiv(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindFragDataLocation(JNIEnv *env, jclass clazz, jint program, jint colorNumber, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glBindFragDataLocationPROC glBindFragDataLocation = (glBindFragDataLocationPROC)((intptr_t)function_pointer); + glBindFragDataLocation(program, colorNumber, name_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL30_nglGetFragDataLocation(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetFragDataLocationPROC glGetFragDataLocation = (glGetFragDataLocationPROC)((intptr_t)function_pointer); + GLint __result = glGetFragDataLocation(program, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBeginConditionalRender(JNIEnv *env, jclass clazz, jint id, jint mode, jlong function_pointer) { + glBeginConditionalRenderPROC glBeginConditionalRender = (glBeginConditionalRenderPROC)((intptr_t)function_pointer); + glBeginConditionalRender(id, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglEndConditionalRender(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndConditionalRenderPROC glEndConditionalRender = (glEndConditionalRenderPROC)((intptr_t)function_pointer); + glEndConditionalRender(); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_GL30_nglMapBufferRange(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length, jint access, jobject old_buffer, jlong function_pointer) { + glMapBufferRangePROC glMapBufferRange = (glMapBufferRangePROC)((intptr_t)function_pointer); + GLvoid * __result = glMapBufferRange(target, offset, length, access); + return safeNewBufferCached(env, __result, length, old_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFlushMappedBufferRange(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length, jlong function_pointer) { + glFlushMappedBufferRangePROC glFlushMappedBufferRange = (glFlushMappedBufferRangePROC)((intptr_t)function_pointer); + glFlushMappedBufferRange(target, offset, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglClampColor(JNIEnv *env, jclass clazz, jint target, jint clamp, jlong function_pointer) { + glClampColorPROC glClampColor = (glClampColorPROC)((intptr_t)function_pointer); + glClampColor(target, clamp); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL30_nglIsRenderbuffer(JNIEnv *env, jclass clazz, jint renderbuffer, jlong function_pointer) { + glIsRenderbufferPROC glIsRenderbuffer = (glIsRenderbufferPROC)((intptr_t)function_pointer); + GLboolean __result = glIsRenderbuffer(renderbuffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindRenderbuffer(JNIEnv *env, jclass clazz, jint target, jint renderbuffer, jlong function_pointer) { + glBindRenderbufferPROC glBindRenderbuffer = (glBindRenderbufferPROC)((intptr_t)function_pointer); + glBindRenderbuffer(target, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglDeleteRenderbuffers(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers, jlong function_pointer) { + const GLuint *renderbuffers_address = (const GLuint *)(intptr_t)renderbuffers; + glDeleteRenderbuffersPROC glDeleteRenderbuffers = (glDeleteRenderbuffersPROC)((intptr_t)function_pointer); + glDeleteRenderbuffers(n, renderbuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGenRenderbuffers(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers, jlong function_pointer) { + GLuint *renderbuffers_address = (GLuint *)(intptr_t)renderbuffers; + glGenRenderbuffersPROC glGenRenderbuffers = (glGenRenderbuffersPROC)((intptr_t)function_pointer); + glGenRenderbuffers(n, renderbuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglRenderbufferStorage(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height, jlong function_pointer) { + glRenderbufferStoragePROC glRenderbufferStorage = (glRenderbufferStoragePROC)((intptr_t)function_pointer); + glRenderbufferStorage(target, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetRenderbufferParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetRenderbufferParameterivPROC glGetRenderbufferParameteriv = (glGetRenderbufferParameterivPROC)((intptr_t)function_pointer); + glGetRenderbufferParameteriv(target, pname, params_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL30_nglIsFramebuffer(JNIEnv *env, jclass clazz, jint framebuffer, jlong function_pointer) { + glIsFramebufferPROC glIsFramebuffer = (glIsFramebufferPROC)((intptr_t)function_pointer); + GLboolean __result = glIsFramebuffer(framebuffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindFramebuffer(JNIEnv *env, jclass clazz, jint target, jint framebuffer, jlong function_pointer) { + glBindFramebufferPROC glBindFramebuffer = (glBindFramebufferPROC)((intptr_t)function_pointer); + glBindFramebuffer(target, framebuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglDeleteFramebuffers(JNIEnv *env, jclass clazz, jint n, jlong framebuffers, jlong function_pointer) { + const GLuint *framebuffers_address = (const GLuint *)(intptr_t)framebuffers; + glDeleteFramebuffersPROC glDeleteFramebuffers = (glDeleteFramebuffersPROC)((intptr_t)function_pointer); + glDeleteFramebuffers(n, framebuffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGenFramebuffers(JNIEnv *env, jclass clazz, jint n, jlong framebuffers, jlong function_pointer) { + GLuint *framebuffers_address = (GLuint *)(intptr_t)framebuffers; + glGenFramebuffersPROC glGenFramebuffers = (glGenFramebuffersPROC)((intptr_t)function_pointer); + glGenFramebuffers(n, framebuffers_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL30_nglCheckFramebufferStatus(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glCheckFramebufferStatusPROC glCheckFramebufferStatus = (glCheckFramebufferStatusPROC)((intptr_t)function_pointer); + GLenum __result = glCheckFramebufferStatus(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFramebufferTexture1D(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glFramebufferTexture1DPROC glFramebufferTexture1D = (glFramebufferTexture1DPROC)((intptr_t)function_pointer); + glFramebufferTexture1D(target, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFramebufferTexture2D(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jlong function_pointer) { + glFramebufferTexture2DPROC glFramebufferTexture2D = (glFramebufferTexture2DPROC)((intptr_t)function_pointer); + glFramebufferTexture2D(target, attachment, textarget, texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFramebufferTexture3D(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint zoffset, jlong function_pointer) { + glFramebufferTexture3DPROC glFramebufferTexture3D = (glFramebufferTexture3DPROC)((intptr_t)function_pointer); + glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFramebufferRenderbuffer(JNIEnv *env, jclass clazz, jint target, jint attachment, jint renderbuffertarget, jint renderbuffer, jlong function_pointer) { + glFramebufferRenderbufferPROC glFramebufferRenderbuffer = (glFramebufferRenderbufferPROC)((intptr_t)function_pointer); + glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetFramebufferAttachmentParameteriv(JNIEnv *env, jclass clazz, jint target, jint attachment, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFramebufferAttachmentParameterivPROC glGetFramebufferAttachmentParameteriv = (glGetFramebufferAttachmentParameterivPROC)((intptr_t)function_pointer); + glGetFramebufferAttachmentParameteriv(target, attachment, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGenerateMipmap(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glGenerateMipmapPROC glGenerateMipmap = (glGenerateMipmapPROC)((intptr_t)function_pointer); + glGenerateMipmap(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglRenderbufferStorageMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jlong function_pointer) { + glRenderbufferStorageMultisamplePROC glRenderbufferStorageMultisample = (glRenderbufferStorageMultisamplePROC)((intptr_t)function_pointer); + glRenderbufferStorageMultisample(target, samples, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBlitFramebuffer(JNIEnv *env, jclass clazz, jint srcX0, jint srcY0, jint srcX1, jint srcY1, jint dstX0, jint dstY0, jint dstX1, jint dstY1, jint mask, jint filter, jlong function_pointer) { + glBlitFramebufferPROC glBlitFramebuffer = (glBlitFramebufferPROC)((intptr_t)function_pointer); + glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglTexParameterIiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glTexParameterIivPROC glTexParameterIiv = (glTexParameterIivPROC)((intptr_t)function_pointer); + glTexParameterIiv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglTexParameterIuiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glTexParameterIuivPROC glTexParameterIuiv = (glTexParameterIuivPROC)((intptr_t)function_pointer); + glTexParameterIuiv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetTexParameterIiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexParameterIivPROC glGetTexParameterIiv = (glGetTexParameterIivPROC)((intptr_t)function_pointer); + glGetTexParameterIiv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetTexParameterIuiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetTexParameterIuivPROC glGetTexParameterIuiv = (glGetTexParameterIuivPROC)((intptr_t)function_pointer); + glGetTexParameterIuiv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglFramebufferTextureLayer(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer, jlong function_pointer) { + glFramebufferTextureLayerPROC glFramebufferTextureLayer = (glFramebufferTextureLayerPROC)((intptr_t)function_pointer); + glFramebufferTextureLayer(target, attachment, texture, level, layer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglColorMaski(JNIEnv *env, jclass clazz, jint buf, jboolean r, jboolean g, jboolean b, jboolean a, jlong function_pointer) { + glColorMaskiPROC glColorMaski = (glColorMaskiPROC)((intptr_t)function_pointer); + glColorMaski(buf, r, g, b, a); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetBooleani_1v(JNIEnv *env, jclass clazz, jint value, jint index, jlong data, jlong function_pointer) { + GLboolean *data_address = (GLboolean *)(intptr_t)data; + glGetBooleani_vPROC glGetBooleani_v = (glGetBooleani_vPROC)((intptr_t)function_pointer); + glGetBooleani_v(value, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetIntegeri_1v(JNIEnv *env, jclass clazz, jint value, jint index, jlong data, jlong function_pointer) { + GLint *data_address = (GLint *)(intptr_t)data; + glGetIntegeri_vPROC glGetIntegeri_v = (glGetIntegeri_vPROC)((intptr_t)function_pointer); + glGetIntegeri_v(value, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglEnablei(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glEnableiPROC glEnablei = (glEnableiPROC)((intptr_t)function_pointer); + glEnablei(target, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglDisablei(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glDisableiPROC glDisablei = (glDisableiPROC)((intptr_t)function_pointer); + glDisablei(target, index); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL30_nglIsEnabledi(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glIsEnablediPROC glIsEnabledi = (glIsEnablediPROC)((intptr_t)function_pointer); + GLboolean __result = glIsEnabledi(target, index); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindBufferRange(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong size, jlong function_pointer) { + glBindBufferRangePROC glBindBufferRange = (glBindBufferRangePROC)((intptr_t)function_pointer); + glBindBufferRange(target, index, buffer, offset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindBufferBase(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong function_pointer) { + glBindBufferBasePROC glBindBufferBase = (glBindBufferBasePROC)((intptr_t)function_pointer); + glBindBufferBase(target, index, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBeginTransformFeedback(JNIEnv *env, jclass clazz, jint primitiveMode, jlong function_pointer) { + glBeginTransformFeedbackPROC glBeginTransformFeedback = (glBeginTransformFeedbackPROC)((intptr_t)function_pointer); + glBeginTransformFeedback(primitiveMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglEndTransformFeedback(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndTransformFeedbackPROC glEndTransformFeedback = (glEndTransformFeedbackPROC)((intptr_t)function_pointer); + glEndTransformFeedback(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglTransformFeedbackVaryings(JNIEnv *env, jclass clazz, jint program, jint count, jlong varyings, jint bufferMode, jlong function_pointer) { + const GLchar *varyings_address = (const GLchar *)(intptr_t)varyings; + int _str_i; + GLchar *_str_address; + GLchar **varyings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + glTransformFeedbackVaryingsPROC glTransformFeedbackVaryings = (glTransformFeedbackVaryingsPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)varyings_address; + while ( _str_i < count ) { + varyings_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glTransformFeedbackVaryings(program, count, (const GLchar **)varyings_str, bufferMode); + free(varyings_str); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGetTransformFeedbackVarying(JNIEnv *env, jclass clazz, jint program, jint index, jint bufSize, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetTransformFeedbackVaryingPROC glGetTransformFeedbackVarying = (glGetTransformFeedbackVaryingPROC)((intptr_t)function_pointer); + glGetTransformFeedbackVarying(program, index, bufSize, length_address, size_address, type_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglBindVertexArray(JNIEnv *env, jclass clazz, jint array, jlong function_pointer) { + glBindVertexArrayPROC glBindVertexArray = (glBindVertexArrayPROC)((intptr_t)function_pointer); + glBindVertexArray(array); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglDeleteVertexArrays(JNIEnv *env, jclass clazz, jint n, jlong arrays, jlong function_pointer) { + const GLuint *arrays_address = (const GLuint *)(intptr_t)arrays; + glDeleteVertexArraysPROC glDeleteVertexArrays = (glDeleteVertexArraysPROC)((intptr_t)function_pointer); + glDeleteVertexArrays(n, arrays_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL30_nglGenVertexArrays(JNIEnv *env, jclass clazz, jint n, jlong arrays, jlong function_pointer) { + GLuint *arrays_address = (GLuint *)(intptr_t)arrays; + glGenVertexArraysPROC glGenVertexArrays = (glGenVertexArraysPROC)((intptr_t)function_pointer); + glGenVertexArrays(n, arrays_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL30_nglIsVertexArray(JNIEnv *env, jclass clazz, jint array, jlong function_pointer) { + glIsVertexArrayPROC glIsVertexArray = (glIsVertexArrayPROC)((intptr_t)function_pointer); + GLboolean __result = glIsVertexArray(array); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL31.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL31.c new file mode 100644 index 0000000..92013cf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL31.c @@ -0,0 +1,106 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawArraysInstancedPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRY *glDrawElementsInstancedPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); +typedef void (APIENTRY *glCopyBufferSubDataPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); +typedef void (APIENTRY *glPrimitiveRestartIndexPROC) (GLuint index); +typedef void (APIENTRY *glTexBufferPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRY *glGetUniformIndicesPROC) (GLuint program, GLsizei uniformCount, const GLchar ** uniformNames, GLuint * uniformIndices); +typedef void (APIENTRY *glGetActiveUniformsivPROC) (GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetActiveUniformNamePROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef GLuint (APIENTRY *glGetUniformBlockIndexPROC) (GLuint program, const GLchar * uniformBlockName); +typedef void (APIENTRY *glGetActiveUniformBlockivPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetActiveUniformBlockNamePROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (APIENTRY *glUniformBlockBindingPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglDrawArraysInstanced(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jint primcount, jlong function_pointer) { + glDrawArraysInstancedPROC glDrawArraysInstanced = (glDrawArraysInstancedPROC)((intptr_t)function_pointer); + glDrawArraysInstanced(mode, first, count, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglDrawElementsInstanced(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedPROC glDrawElementsInstanced = (glDrawElementsInstancedPROC)((intptr_t)function_pointer); + glDrawElementsInstanced(mode, count, type, indices_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglDrawElementsInstancedBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedPROC glDrawElementsInstanced = (glDrawElementsInstancedPROC)((intptr_t)function_pointer); + glDrawElementsInstanced(mode, count, type, indices_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglCopyBufferSubData(JNIEnv *env, jclass clazz, jint readtarget, jint writetarget, jlong readoffset, jlong writeoffset, jlong size, jlong function_pointer) { + glCopyBufferSubDataPROC glCopyBufferSubData = (glCopyBufferSubDataPROC)((intptr_t)function_pointer); + glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglPrimitiveRestartIndex(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glPrimitiveRestartIndexPROC glPrimitiveRestartIndex = (glPrimitiveRestartIndexPROC)((intptr_t)function_pointer); + glPrimitiveRestartIndex(index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglTexBuffer(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint buffer, jlong function_pointer) { + glTexBufferPROC glTexBuffer = (glTexBufferPROC)((intptr_t)function_pointer); + glTexBuffer(target, internalformat, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglGetUniformIndices(JNIEnv *env, jclass clazz, jint program, jint uniformCount, jlong uniformNames, jlong uniformIndices, jlong function_pointer) { + const GLchar *uniformNames_address = (const GLchar *)(intptr_t)uniformNames; + int _str_i; + GLchar *_str_address; + GLchar **uniformNames_str = (GLchar **) malloc(uniformCount * sizeof(GLchar *)); + GLuint *uniformIndices_address = (GLuint *)(intptr_t)uniformIndices; + glGetUniformIndicesPROC glGetUniformIndices = (glGetUniformIndicesPROC)((intptr_t)function_pointer); + _str_i = 0; + _str_address = (GLchar *)uniformNames_address; + while ( _str_i < uniformCount ) { + uniformNames_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glGetUniformIndices(program, uniformCount, (const GLchar **)uniformNames_str, uniformIndices_address); + free(uniformNames_str); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglGetActiveUniformsiv(JNIEnv *env, jclass clazz, jint program, jint uniformCount, jlong uniformIndices, jint pname, jlong params, jlong function_pointer) { + const GLuint *uniformIndices_address = (const GLuint *)(intptr_t)uniformIndices; + GLint *params_address = (GLint *)(intptr_t)params; + glGetActiveUniformsivPROC glGetActiveUniformsiv = (glGetActiveUniformsivPROC)((intptr_t)function_pointer); + glGetActiveUniformsiv(program, uniformCount, uniformIndices_address, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglGetActiveUniformName(JNIEnv *env, jclass clazz, jint program, jint uniformIndex, jint bufSize, jlong length, jlong uniformName, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *uniformName_address = (GLchar *)(intptr_t)uniformName; + glGetActiveUniformNamePROC glGetActiveUniformName = (glGetActiveUniformNamePROC)((intptr_t)function_pointer); + glGetActiveUniformName(program, uniformIndex, bufSize, length_address, uniformName_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL31_nglGetUniformBlockIndex(JNIEnv *env, jclass clazz, jint program, jlong uniformBlockName, jlong function_pointer) { + const GLchar *uniformBlockName_address = (const GLchar *)(intptr_t)uniformBlockName; + glGetUniformBlockIndexPROC glGetUniformBlockIndex = (glGetUniformBlockIndexPROC)((intptr_t)function_pointer); + GLuint __result = glGetUniformBlockIndex(program, uniformBlockName_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglGetActiveUniformBlockiv(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetActiveUniformBlockivPROC glGetActiveUniformBlockiv = (glGetActiveUniformBlockivPROC)((intptr_t)function_pointer); + glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglGetActiveUniformBlockName(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint bufSize, jlong length, jlong uniformBlockName, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *uniformBlockName_address = (GLchar *)(intptr_t)uniformBlockName; + glGetActiveUniformBlockNamePROC glGetActiveUniformBlockName = (glGetActiveUniformBlockNamePROC)((intptr_t)function_pointer); + glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length_address, uniformBlockName_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL31_nglUniformBlockBinding(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint uniformBlockBinding, jlong function_pointer) { + glUniformBlockBindingPROC glUniformBlockBinding = (glUniformBlockBindingPROC)((intptr_t)function_pointer); + glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL32.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL32.c new file mode 100644 index 0000000..8714fe6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL32.c @@ -0,0 +1,144 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetBufferParameteri64vPROC) (GLenum target, GLenum pname, GLint64EXT * params); +typedef void (APIENTRY *glDrawElementsBaseVertexPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLint basevertex); +typedef void (APIENTRY *glDrawRangeElementsBaseVertexPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices, GLint basevertex); +typedef void (APIENTRY *glDrawElementsInstancedBaseVertexPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount, GLint basevertex); +typedef void (APIENTRY *glProvokingVertexPROC) (GLenum mode); +typedef void (APIENTRY *glTexImage2DMultisamplePROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRY *glTexImage3DMultisamplePROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRY *glGetMultisamplefvPROC) (GLenum pname, GLuint index, GLfloat * val); +typedef void (APIENTRY *glSampleMaskiPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRY *glFramebufferTexturePROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef GLsync (APIENTRY *glFenceSyncPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRY *glIsSyncPROC) (GLsync sync); +typedef void (APIENTRY *glDeleteSyncPROC) (GLsync sync); +typedef GLenum (APIENTRY *glClientWaitSyncPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRY *glWaitSyncPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRY *glGetInteger64vPROC) (GLenum pname, GLint64 * data); +typedef void (APIENTRY *glGetInteger64i_vPROC) (GLenum value, GLuint index, GLint64 * data); +typedef void (APIENTRY *glGetSyncivPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglGetBufferParameteri64v(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint64EXT *params_address = (GLint64EXT *)(intptr_t)params; + glGetBufferParameteri64vPROC glGetBufferParameteri64v = (glGetBufferParameteri64vPROC)((intptr_t)function_pointer); + glGetBufferParameteri64v(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawElementsBaseVertex(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsBaseVertexPROC glDrawElementsBaseVertex = (glDrawElementsBaseVertexPROC)((intptr_t)function_pointer); + glDrawElementsBaseVertex(mode, count, type, indices_address, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawElementsBaseVertexBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsBaseVertexPROC glDrawElementsBaseVertex = (glDrawElementsBaseVertexPROC)((intptr_t)function_pointer); + glDrawElementsBaseVertex(mode, count, type, indices_address, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawRangeElementsBaseVertex(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawRangeElementsBaseVertexPROC glDrawRangeElementsBaseVertex = (glDrawRangeElementsBaseVertexPROC)((intptr_t)function_pointer); + glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices_address, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawRangeElementsBaseVertexBO(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices_buffer_offset, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawRangeElementsBaseVertexPROC glDrawRangeElementsBaseVertex = (glDrawRangeElementsBaseVertexPROC)((intptr_t)function_pointer); + glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices_address, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawElementsInstancedBaseVertex(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedBaseVertexPROC glDrawElementsInstancedBaseVertex = (glDrawElementsInstancedBaseVertexPROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseVertex(mode, count, type, indices_address, primcount, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDrawElementsInstancedBaseVertexBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jint basevertex, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedBaseVertexPROC glDrawElementsInstancedBaseVertex = (glDrawElementsInstancedBaseVertexPROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseVertex(mode, count, type, indices_address, primcount, basevertex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglProvokingVertex(JNIEnv *env, jclass clazz, jint mode, jlong function_pointer) { + glProvokingVertexPROC glProvokingVertex = (glProvokingVertexPROC)((intptr_t)function_pointer); + glProvokingVertex(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglTexImage2DMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jboolean fixedsamplelocations, jlong function_pointer) { + glTexImage2DMultisamplePROC glTexImage2DMultisample = (glTexImage2DMultisamplePROC)((intptr_t)function_pointer); + glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglTexImage3DMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jint depth, jboolean fixedsamplelocations, jlong function_pointer) { + glTexImage3DMultisamplePROC glTexImage3DMultisample = (glTexImage3DMultisamplePROC)((intptr_t)function_pointer); + glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglGetMultisamplefv(JNIEnv *env, jclass clazz, jint pname, jint index, jlong val, jlong function_pointer) { + GLfloat *val_address = (GLfloat *)(intptr_t)val; + glGetMultisamplefvPROC glGetMultisamplefv = (glGetMultisamplefvPROC)((intptr_t)function_pointer); + glGetMultisamplefv(pname, index, val_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglSampleMaski(JNIEnv *env, jclass clazz, jint index, jint mask, jlong function_pointer) { + glSampleMaskiPROC glSampleMaski = (glSampleMaskiPROC)((intptr_t)function_pointer); + glSampleMaski(index, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglFramebufferTexture(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jlong function_pointer) { + glFramebufferTexturePROC glFramebufferTexture = (glFramebufferTexturePROC)((intptr_t)function_pointer); + glFramebufferTexture(target, attachment, texture, level); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_GL32_nglFenceSync(JNIEnv *env, jclass clazz, jint condition, jint flags, jlong function_pointer) { + glFenceSyncPROC glFenceSync = (glFenceSyncPROC)((intptr_t)function_pointer); + GLsync __result = glFenceSync(condition, flags); + return (intptr_t)__result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL32_nglIsSync(JNIEnv *env, jclass clazz, jlong sync, jlong function_pointer) { + glIsSyncPROC glIsSync = (glIsSyncPROC)((intptr_t)function_pointer); + GLboolean __result = glIsSync((GLsync)(intptr_t)sync); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglDeleteSync(JNIEnv *env, jclass clazz, jlong sync, jlong function_pointer) { + glDeleteSyncPROC glDeleteSync = (glDeleteSyncPROC)((intptr_t)function_pointer); + glDeleteSync((GLsync)(intptr_t)sync); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL32_nglClientWaitSync(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout, jlong function_pointer) { + glClientWaitSyncPROC glClientWaitSync = (glClientWaitSyncPROC)((intptr_t)function_pointer); + GLenum __result = glClientWaitSync((GLsync)(intptr_t)sync, flags, timeout); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglWaitSync(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout, jlong function_pointer) { + glWaitSyncPROC glWaitSync = (glWaitSyncPROC)((intptr_t)function_pointer); + glWaitSync((GLsync)(intptr_t)sync, flags, timeout); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglGetInteger64v(JNIEnv *env, jclass clazz, jint pname, jlong data, jlong function_pointer) { + GLint64 *data_address = (GLint64 *)(intptr_t)data; + glGetInteger64vPROC glGetInteger64v = (glGetInteger64vPROC)((intptr_t)function_pointer); + glGetInteger64v(pname, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglGetInteger64i_1v(JNIEnv *env, jclass clazz, jint value, jint index, jlong data, jlong function_pointer) { + GLint64 *data_address = (GLint64 *)(intptr_t)data; + glGetInteger64i_vPROC glGetInteger64i_v = (glGetInteger64i_vPROC)((intptr_t)function_pointer); + glGetInteger64i_v(value, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32_nglGetSynciv(JNIEnv *env, jclass clazz, jlong sync, jint pname, jint bufSize, jlong length, jlong values, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *values_address = (GLint *)(intptr_t)values; + glGetSyncivPROC glGetSynciv = (glGetSyncivPROC)((intptr_t)function_pointer); + glGetSynciv((GLsync)(intptr_t)sync, pname, bufSize, length_address, values_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL33.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL33.c new file mode 100644 index 0000000..0694284 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL33.c @@ -0,0 +1,389 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindFragDataLocationIndexedPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (APIENTRY *glGetFragDataIndexPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glGenSamplersPROC) (GLsizei count, GLuint * samplers); +typedef void (APIENTRY *glDeleteSamplersPROC) (GLsizei count, const GLuint * samplers); +typedef GLboolean (APIENTRY *glIsSamplerPROC) (GLuint sampler); +typedef void (APIENTRY *glBindSamplerPROC) (GLenum unit, GLuint sampler); +typedef void (APIENTRY *glSamplerParameteriPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRY *glSamplerParameterfPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRY *glSamplerParameterivPROC) (GLuint sampler, GLenum pname, const GLint * params); +typedef void (APIENTRY *glSamplerParameterfvPROC) (GLuint sampler, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glSamplerParameterIivPROC) (GLuint sampler, GLenum pname, const GLint * params); +typedef void (APIENTRY *glSamplerParameterIuivPROC) (GLuint sampler, GLenum pname, const GLuint * params); +typedef void (APIENTRY *glGetSamplerParameterivPROC) (GLuint sampler, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetSamplerParameterfvPROC) (GLuint sampler, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetSamplerParameterIivPROC) (GLuint sampler, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetSamplerParameterIuivPROC) (GLuint sampler, GLenum pname, GLint * params); +typedef void (APIENTRY *glQueryCounterPROC) (GLuint id, GLenum target); +typedef void (APIENTRY *glGetQueryObjecti64vPROC) (GLuint id, GLenum pname, GLint64 * params); +typedef void (APIENTRY *glGetQueryObjectui64vPROC) (GLuint id, GLenum pname, GLuint64 * params); +typedef void (APIENTRY *glVertexAttribDivisorPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRY *glVertexP2uiPROC) (GLenum type, GLuint value); +typedef void (APIENTRY *glVertexP3uiPROC) (GLenum type, GLuint value); +typedef void (APIENTRY *glVertexP4uiPROC) (GLenum type, GLuint value); +typedef void (APIENTRY *glVertexP2uivPROC) (GLenum type, const GLuint * value); +typedef void (APIENTRY *glVertexP3uivPROC) (GLenum type, const GLuint * value); +typedef void (APIENTRY *glVertexP4uivPROC) (GLenum type, const GLuint * value); +typedef void (APIENTRY *glTexCoordP1uiPROC) (GLenum type, GLuint coords); +typedef void (APIENTRY *glTexCoordP2uiPROC) (GLenum type, GLuint coords); +typedef void (APIENTRY *glTexCoordP3uiPROC) (GLenum type, GLuint coords); +typedef void (APIENTRY *glTexCoordP4uiPROC) (GLenum type, GLuint coords); +typedef void (APIENTRY *glTexCoordP1uivPROC) (GLenum type, const GLuint * coords); +typedef void (APIENTRY *glTexCoordP2uivPROC) (GLenum type, const GLuint * coords); +typedef void (APIENTRY *glTexCoordP3uivPROC) (GLenum type, const GLuint * coords); +typedef void (APIENTRY *glTexCoordP4uivPROC) (GLenum type, const GLuint * coords); +typedef void (APIENTRY *glMultiTexCoordP1uiPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRY *glMultiTexCoordP2uiPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRY *glMultiTexCoordP3uiPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRY *glMultiTexCoordP4uiPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRY *glMultiTexCoordP1uivPROC) (GLenum texture, GLenum type, const GLuint * coords); +typedef void (APIENTRY *glMultiTexCoordP2uivPROC) (GLenum texture, GLenum type, const GLuint * coords); +typedef void (APIENTRY *glMultiTexCoordP3uivPROC) (GLenum texture, GLenum type, const GLuint * coords); +typedef void (APIENTRY *glMultiTexCoordP4uivPROC) (GLenum texture, GLenum type, const GLuint * coords); +typedef void (APIENTRY *glNormalP3uiPROC) (GLenum type, GLuint coords); +typedef void (APIENTRY *glNormalP3uivPROC) (GLenum type, const GLuint * coords); +typedef void (APIENTRY *glColorP3uiPROC) (GLenum type, GLuint color); +typedef void (APIENTRY *glColorP4uiPROC) (GLenum type, GLuint color); +typedef void (APIENTRY *glColorP3uivPROC) (GLenum type, const GLuint * color); +typedef void (APIENTRY *glColorP4uivPROC) (GLenum type, const GLuint * color); +typedef void (APIENTRY *glSecondaryColorP3uiPROC) (GLenum type, GLuint color); +typedef void (APIENTRY *glSecondaryColorP3uivPROC) (GLenum type, const GLuint * color); +typedef void (APIENTRY *glVertexAttribP1uiPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRY *glVertexAttribP2uiPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRY *glVertexAttribP3uiPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRY *glVertexAttribP4uiPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRY *glVertexAttribP1uivPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (APIENTRY *glVertexAttribP2uivPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (APIENTRY *glVertexAttribP3uivPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (APIENTRY *glVertexAttribP4uivPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint * value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglBindFragDataLocationIndexed(JNIEnv *env, jclass clazz, jint program, jint colorNumber, jint index, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glBindFragDataLocationIndexedPROC glBindFragDataLocationIndexed = (glBindFragDataLocationIndexedPROC)((intptr_t)function_pointer); + glBindFragDataLocationIndexed(program, colorNumber, index, name_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL33_nglGetFragDataIndex(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetFragDataIndexPROC glGetFragDataIndex = (glGetFragDataIndexPROC)((intptr_t)function_pointer); + GLint __result = glGetFragDataIndex(program, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGenSamplers(JNIEnv *env, jclass clazz, jint count, jlong samplers, jlong function_pointer) { + GLuint *samplers_address = (GLuint *)(intptr_t)samplers; + glGenSamplersPROC glGenSamplers = (glGenSamplersPROC)((intptr_t)function_pointer); + glGenSamplers(count, samplers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglDeleteSamplers(JNIEnv *env, jclass clazz, jint count, jlong samplers, jlong function_pointer) { + const GLuint *samplers_address = (const GLuint *)(intptr_t)samplers; + glDeleteSamplersPROC glDeleteSamplers = (glDeleteSamplersPROC)((intptr_t)function_pointer); + glDeleteSamplers(count, samplers_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL33_nglIsSampler(JNIEnv *env, jclass clazz, jint sampler, jlong function_pointer) { + glIsSamplerPROC glIsSampler = (glIsSamplerPROC)((intptr_t)function_pointer); + GLboolean __result = glIsSampler(sampler); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglBindSampler(JNIEnv *env, jclass clazz, jint unit, jint sampler, jlong function_pointer) { + glBindSamplerPROC glBindSampler = (glBindSamplerPROC)((intptr_t)function_pointer); + glBindSampler(unit, sampler); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameteri(JNIEnv *env, jclass clazz, jint sampler, jint pname, jint param, jlong function_pointer) { + glSamplerParameteriPROC glSamplerParameteri = (glSamplerParameteriPROC)((intptr_t)function_pointer); + glSamplerParameteri(sampler, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameterf(JNIEnv *env, jclass clazz, jint sampler, jint pname, jfloat param, jlong function_pointer) { + glSamplerParameterfPROC glSamplerParameterf = (glSamplerParameterfPROC)((intptr_t)function_pointer); + glSamplerParameterf(sampler, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameteriv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glSamplerParameterivPROC glSamplerParameteriv = (glSamplerParameterivPROC)((intptr_t)function_pointer); + glSamplerParameteriv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameterfv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glSamplerParameterfvPROC glSamplerParameterfv = (glSamplerParameterfvPROC)((intptr_t)function_pointer); + glSamplerParameterfv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameterIiv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glSamplerParameterIivPROC glSamplerParameterIiv = (glSamplerParameterIivPROC)((intptr_t)function_pointer); + glSamplerParameterIiv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSamplerParameterIuiv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glSamplerParameterIuivPROC glSamplerParameterIuiv = (glSamplerParameterIuivPROC)((intptr_t)function_pointer); + glSamplerParameterIuiv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetSamplerParameteriv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetSamplerParameterivPROC glGetSamplerParameteriv = (glGetSamplerParameterivPROC)((intptr_t)function_pointer); + glGetSamplerParameteriv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetSamplerParameterfv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetSamplerParameterfvPROC glGetSamplerParameterfv = (glGetSamplerParameterfvPROC)((intptr_t)function_pointer); + glGetSamplerParameterfv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetSamplerParameterIiv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetSamplerParameterIivPROC glGetSamplerParameterIiv = (glGetSamplerParameterIivPROC)((intptr_t)function_pointer); + glGetSamplerParameterIiv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetSamplerParameterIuiv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetSamplerParameterIuivPROC glGetSamplerParameterIuiv = (glGetSamplerParameterIuivPROC)((intptr_t)function_pointer); + glGetSamplerParameterIuiv(sampler, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglQueryCounter(JNIEnv *env, jclass clazz, jint id, jint target, jlong function_pointer) { + glQueryCounterPROC glQueryCounter = (glQueryCounterPROC)((intptr_t)function_pointer); + glQueryCounter(id, target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetQueryObjecti64v(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint64 *params_address = (GLint64 *)(intptr_t)params; + glGetQueryObjecti64vPROC glGetQueryObjecti64v = (glGetQueryObjecti64vPROC)((intptr_t)function_pointer); + glGetQueryObjecti64v(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglGetQueryObjectui64v(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLuint64 *params_address = (GLuint64 *)(intptr_t)params; + glGetQueryObjectui64vPROC glGetQueryObjectui64v = (glGetQueryObjectui64vPROC)((intptr_t)function_pointer); + glGetQueryObjectui64v(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribDivisor(JNIEnv *env, jclass clazz, jint index, jint divisor, jlong function_pointer) { + glVertexAttribDivisorPROC glVertexAttribDivisor = (glVertexAttribDivisorPROC)((intptr_t)function_pointer); + glVertexAttribDivisor(index, divisor); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP2ui(JNIEnv *env, jclass clazz, jint type, jint value, jlong function_pointer) { + glVertexP2uiPROC glVertexP2ui = (glVertexP2uiPROC)((intptr_t)function_pointer); + glVertexP2ui(type, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP3ui(JNIEnv *env, jclass clazz, jint type, jint value, jlong function_pointer) { + glVertexP3uiPROC glVertexP3ui = (glVertexP3uiPROC)((intptr_t)function_pointer); + glVertexP3ui(type, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP4ui(JNIEnv *env, jclass clazz, jint type, jint value, jlong function_pointer) { + glVertexP4uiPROC glVertexP4ui = (glVertexP4uiPROC)((intptr_t)function_pointer); + glVertexP4ui(type, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP2uiv(JNIEnv *env, jclass clazz, jint type, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexP2uivPROC glVertexP2uiv = (glVertexP2uivPROC)((intptr_t)function_pointer); + glVertexP2uiv(type, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP3uiv(JNIEnv *env, jclass clazz, jint type, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexP3uivPROC glVertexP3uiv = (glVertexP3uivPROC)((intptr_t)function_pointer); + glVertexP3uiv(type, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexP4uiv(JNIEnv *env, jclass clazz, jint type, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexP4uivPROC glVertexP4uiv = (glVertexP4uivPROC)((intptr_t)function_pointer); + glVertexP4uiv(type, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP1ui(JNIEnv *env, jclass clazz, jint type, jint coords, jlong function_pointer) { + glTexCoordP1uiPROC glTexCoordP1ui = (glTexCoordP1uiPROC)((intptr_t)function_pointer); + glTexCoordP1ui(type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP2ui(JNIEnv *env, jclass clazz, jint type, jint coords, jlong function_pointer) { + glTexCoordP2uiPROC glTexCoordP2ui = (glTexCoordP2uiPROC)((intptr_t)function_pointer); + glTexCoordP2ui(type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP3ui(JNIEnv *env, jclass clazz, jint type, jint coords, jlong function_pointer) { + glTexCoordP3uiPROC glTexCoordP3ui = (glTexCoordP3uiPROC)((intptr_t)function_pointer); + glTexCoordP3ui(type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP4ui(JNIEnv *env, jclass clazz, jint type, jint coords, jlong function_pointer) { + glTexCoordP4uiPROC glTexCoordP4ui = (glTexCoordP4uiPROC)((intptr_t)function_pointer); + glTexCoordP4ui(type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP1uiv(JNIEnv *env, jclass clazz, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glTexCoordP1uivPROC glTexCoordP1uiv = (glTexCoordP1uivPROC)((intptr_t)function_pointer); + glTexCoordP1uiv(type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP2uiv(JNIEnv *env, jclass clazz, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glTexCoordP2uivPROC glTexCoordP2uiv = (glTexCoordP2uivPROC)((intptr_t)function_pointer); + glTexCoordP2uiv(type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP3uiv(JNIEnv *env, jclass clazz, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glTexCoordP3uivPROC glTexCoordP3uiv = (glTexCoordP3uivPROC)((intptr_t)function_pointer); + glTexCoordP3uiv(type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglTexCoordP4uiv(JNIEnv *env, jclass clazz, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glTexCoordP4uivPROC glTexCoordP4uiv = (glTexCoordP4uivPROC)((intptr_t)function_pointer); + glTexCoordP4uiv(type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP1ui(JNIEnv *env, jclass clazz, jint texture, jint type, jint coords, jlong function_pointer) { + glMultiTexCoordP1uiPROC glMultiTexCoordP1ui = (glMultiTexCoordP1uiPROC)((intptr_t)function_pointer); + glMultiTexCoordP1ui(texture, type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP2ui(JNIEnv *env, jclass clazz, jint texture, jint type, jint coords, jlong function_pointer) { + glMultiTexCoordP2uiPROC glMultiTexCoordP2ui = (glMultiTexCoordP2uiPROC)((intptr_t)function_pointer); + glMultiTexCoordP2ui(texture, type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP3ui(JNIEnv *env, jclass clazz, jint texture, jint type, jint coords, jlong function_pointer) { + glMultiTexCoordP3uiPROC glMultiTexCoordP3ui = (glMultiTexCoordP3uiPROC)((intptr_t)function_pointer); + glMultiTexCoordP3ui(texture, type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP4ui(JNIEnv *env, jclass clazz, jint texture, jint type, jint coords, jlong function_pointer) { + glMultiTexCoordP4uiPROC glMultiTexCoordP4ui = (glMultiTexCoordP4uiPROC)((intptr_t)function_pointer); + glMultiTexCoordP4ui(texture, type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP1uiv(JNIEnv *env, jclass clazz, jint texture, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glMultiTexCoordP1uivPROC glMultiTexCoordP1uiv = (glMultiTexCoordP1uivPROC)((intptr_t)function_pointer); + glMultiTexCoordP1uiv(texture, type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP2uiv(JNIEnv *env, jclass clazz, jint texture, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glMultiTexCoordP2uivPROC glMultiTexCoordP2uiv = (glMultiTexCoordP2uivPROC)((intptr_t)function_pointer); + glMultiTexCoordP2uiv(texture, type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP3uiv(JNIEnv *env, jclass clazz, jint texture, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glMultiTexCoordP3uivPROC glMultiTexCoordP3uiv = (glMultiTexCoordP3uivPROC)((intptr_t)function_pointer); + glMultiTexCoordP3uiv(texture, type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglMultiTexCoordP4uiv(JNIEnv *env, jclass clazz, jint texture, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glMultiTexCoordP4uivPROC glMultiTexCoordP4uiv = (glMultiTexCoordP4uivPROC)((intptr_t)function_pointer); + glMultiTexCoordP4uiv(texture, type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglNormalP3ui(JNIEnv *env, jclass clazz, jint type, jint coords, jlong function_pointer) { + glNormalP3uiPROC glNormalP3ui = (glNormalP3uiPROC)((intptr_t)function_pointer); + glNormalP3ui(type, coords); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglNormalP3uiv(JNIEnv *env, jclass clazz, jint type, jlong coords, jlong function_pointer) { + const GLuint *coords_address = (const GLuint *)(intptr_t)coords; + glNormalP3uivPROC glNormalP3uiv = (glNormalP3uivPROC)((intptr_t)function_pointer); + glNormalP3uiv(type, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglColorP3ui(JNIEnv *env, jclass clazz, jint type, jint color, jlong function_pointer) { + glColorP3uiPROC glColorP3ui = (glColorP3uiPROC)((intptr_t)function_pointer); + glColorP3ui(type, color); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglColorP4ui(JNIEnv *env, jclass clazz, jint type, jint color, jlong function_pointer) { + glColorP4uiPROC glColorP4ui = (glColorP4uiPROC)((intptr_t)function_pointer); + glColorP4ui(type, color); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglColorP3uiv(JNIEnv *env, jclass clazz, jint type, jlong color, jlong function_pointer) { + const GLuint *color_address = (const GLuint *)(intptr_t)color; + glColorP3uivPROC glColorP3uiv = (glColorP3uivPROC)((intptr_t)function_pointer); + glColorP3uiv(type, color_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglColorP4uiv(JNIEnv *env, jclass clazz, jint type, jlong color, jlong function_pointer) { + const GLuint *color_address = (const GLuint *)(intptr_t)color; + glColorP4uivPROC glColorP4uiv = (glColorP4uivPROC)((intptr_t)function_pointer); + glColorP4uiv(type, color_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSecondaryColorP3ui(JNIEnv *env, jclass clazz, jint type, jint color, jlong function_pointer) { + glSecondaryColorP3uiPROC glSecondaryColorP3ui = (glSecondaryColorP3uiPROC)((intptr_t)function_pointer); + glSecondaryColorP3ui(type, color); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglSecondaryColorP3uiv(JNIEnv *env, jclass clazz, jint type, jlong color, jlong function_pointer) { + const GLuint *color_address = (const GLuint *)(intptr_t)color; + glSecondaryColorP3uivPROC glSecondaryColorP3uiv = (glSecondaryColorP3uivPROC)((intptr_t)function_pointer); + glSecondaryColorP3uiv(type, color_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP1ui(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jint value, jlong function_pointer) { + glVertexAttribP1uiPROC glVertexAttribP1ui = (glVertexAttribP1uiPROC)((intptr_t)function_pointer); + glVertexAttribP1ui(index, type, normalized, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP2ui(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jint value, jlong function_pointer) { + glVertexAttribP2uiPROC glVertexAttribP2ui = (glVertexAttribP2uiPROC)((intptr_t)function_pointer); + glVertexAttribP2ui(index, type, normalized, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP3ui(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jint value, jlong function_pointer) { + glVertexAttribP3uiPROC glVertexAttribP3ui = (glVertexAttribP3uiPROC)((intptr_t)function_pointer); + glVertexAttribP3ui(index, type, normalized, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP4ui(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jint value, jlong function_pointer) { + glVertexAttribP4uiPROC glVertexAttribP4ui = (glVertexAttribP4uiPROC)((intptr_t)function_pointer); + glVertexAttribP4ui(index, type, normalized, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP1uiv(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexAttribP1uivPROC glVertexAttribP1uiv = (glVertexAttribP1uivPROC)((intptr_t)function_pointer); + glVertexAttribP1uiv(index, type, normalized, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP2uiv(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexAttribP2uivPROC glVertexAttribP2uiv = (glVertexAttribP2uivPROC)((intptr_t)function_pointer); + glVertexAttribP2uiv(index, type, normalized, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP3uiv(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexAttribP3uivPROC glVertexAttribP3uiv = (glVertexAttribP3uivPROC)((intptr_t)function_pointer); + glVertexAttribP3uiv(index, type, normalized, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL33_nglVertexAttribP4uiv(JNIEnv *env, jclass clazz, jint index, jint type, jboolean normalized, jlong value, jlong function_pointer) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glVertexAttribP4uivPROC glVertexAttribP4uiv = (glVertexAttribP4uivPROC)((intptr_t)function_pointer); + glVertexAttribP4uiv(index, type, normalized, value_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL40.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL40.c new file mode 100644 index 0000000..fcc9150 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL40.c @@ -0,0 +1,327 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendEquationiPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRY *glBlendEquationSeparateiPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRY *glBlendFunciPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRY *glBlendFuncSeparateiPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRY *glDrawArraysIndirectPROC) (GLenum mode, const GLvoid * indirect); +typedef void (APIENTRY *glDrawElementsIndirectPROC) (GLenum mode, GLenum type, const GLvoid * indirect); +typedef void (APIENTRY *glUniform1dPROC) (GLint location, GLdouble x); +typedef void (APIENTRY *glUniform2dPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRY *glUniform3dPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glUniform4dPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glUniform1dvPROC) (GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glUniform2dvPROC) (GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glUniform3dvPROC) (GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glUniform4dvPROC) (GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix2dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix3dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix4dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix2x3dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix2x4dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix3x2dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix3x4dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix4x2dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glUniformMatrix4x3dvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glGetUniformdvPROC) (GLuint program, GLint location, GLdouble * params); +typedef void (APIENTRY *glMinSampleShadingPROC) (GLfloat value); +typedef GLint (APIENTRY *glGetSubroutineUniformLocationPROC) (GLuint program, GLenum shadertype, const GLbyte * name); +typedef GLuint (APIENTRY *glGetSubroutineIndexPROC) (GLuint program, GLenum shadertype, const GLbyte * name); +typedef void (APIENTRY *glGetActiveSubroutineUniformivPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); +typedef void (APIENTRY *glGetActiveSubroutineUniformNamePROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei * length, GLchar * name); +typedef void (APIENTRY *glGetActiveSubroutineNamePROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei * length, GLchar * name); +typedef void (APIENTRY *glUniformSubroutinesuivPROC) (GLenum shadertype, GLsizei count, const GLuint * indices); +typedef void (APIENTRY *glGetUniformSubroutineuivPROC) (GLenum shadertype, GLint location, GLuint * params); +typedef void (APIENTRY *glGetProgramStageivPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint * values); +typedef void (APIENTRY *glPatchParameteriPROC) (GLenum pname, GLint value); +typedef void (APIENTRY *glPatchParameterfvPROC) (GLenum pname, const GLfloat * values); +typedef void (APIENTRY *glBindTransformFeedbackPROC) (GLenum target, GLuint id); +typedef void (APIENTRY *glDeleteTransformFeedbacksPROC) (GLsizei n, const GLuint * ids); +typedef void (APIENTRY *glGenTransformFeedbacksPROC) (GLsizei n, GLuint * ids); +typedef GLboolean (APIENTRY *glIsTransformFeedbackPROC) (GLuint id); +typedef void (APIENTRY *glPauseTransformFeedbackPROC) (); +typedef void (APIENTRY *glResumeTransformFeedbackPROC) (); +typedef void (APIENTRY *glDrawTransformFeedbackPROC) (GLenum mode, GLuint id); +typedef void (APIENTRY *glDrawTransformFeedbackStreamPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRY *glBeginQueryIndexedPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRY *glEndQueryIndexedPROC) (GLenum target, GLuint index); +typedef void (APIENTRY *glGetQueryIndexedivPROC) (GLenum target, GLuint index, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBlendEquationi(JNIEnv *env, jclass clazz, jint buf, jint mode, jlong function_pointer) { + glBlendEquationiPROC glBlendEquationi = (glBlendEquationiPROC)((intptr_t)function_pointer); + glBlendEquationi(buf, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBlendEquationSeparatei(JNIEnv *env, jclass clazz, jint buf, jint modeRGB, jint modeAlpha, jlong function_pointer) { + glBlendEquationSeparateiPROC glBlendEquationSeparatei = (glBlendEquationSeparateiPROC)((intptr_t)function_pointer); + glBlendEquationSeparatei(buf, modeRGB, modeAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBlendFunci(JNIEnv *env, jclass clazz, jint buf, jint src, jint dst, jlong function_pointer) { + glBlendFunciPROC glBlendFunci = (glBlendFunciPROC)((intptr_t)function_pointer); + glBlendFunci(buf, src, dst); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBlendFuncSeparatei(JNIEnv *env, jclass clazz, jint buf, jint srcRGB, jint dstRGB, jint srcAlpha, jint dstAlpha, jlong function_pointer) { + glBlendFuncSeparateiPROC glBlendFuncSeparatei = (glBlendFuncSeparateiPROC)((intptr_t)function_pointer); + glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawArraysIndirect(JNIEnv *env, jclass clazz, jint mode, jlong indirect, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glDrawArraysIndirectPROC glDrawArraysIndirect = (glDrawArraysIndirectPROC)((intptr_t)function_pointer); + glDrawArraysIndirect(mode, indirect_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawArraysIndirectBO(JNIEnv *env, jclass clazz, jint mode, jlong indirect_buffer_offset, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glDrawArraysIndirectPROC glDrawArraysIndirect = (glDrawArraysIndirectPROC)((intptr_t)function_pointer); + glDrawArraysIndirect(mode, indirect_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawElementsIndirect(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glDrawElementsIndirectPROC glDrawElementsIndirect = (glDrawElementsIndirectPROC)((intptr_t)function_pointer); + glDrawElementsIndirect(mode, type, indirect_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawElementsIndirectBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glDrawElementsIndirectPROC glDrawElementsIndirect = (glDrawElementsIndirectPROC)((intptr_t)function_pointer); + glDrawElementsIndirect(mode, type, indirect_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform1d(JNIEnv *env, jclass clazz, jint location, jdouble x, jlong function_pointer) { + glUniform1dPROC glUniform1d = (glUniform1dPROC)((intptr_t)function_pointer); + glUniform1d(location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform2d(JNIEnv *env, jclass clazz, jint location, jdouble x, jdouble y, jlong function_pointer) { + glUniform2dPROC glUniform2d = (glUniform2dPROC)((intptr_t)function_pointer); + glUniform2d(location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform3d(JNIEnv *env, jclass clazz, jint location, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glUniform3dPROC glUniform3d = (glUniform3dPROC)((intptr_t)function_pointer); + glUniform3d(location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform4d(JNIEnv *env, jclass clazz, jint location, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glUniform4dPROC glUniform4d = (glUniform4dPROC)((intptr_t)function_pointer); + glUniform4d(location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform1dv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniform1dvPROC glUniform1dv = (glUniform1dvPROC)((intptr_t)function_pointer); + glUniform1dv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform2dv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniform2dvPROC glUniform2dv = (glUniform2dvPROC)((intptr_t)function_pointer); + glUniform2dv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform3dv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniform3dvPROC glUniform3dv = (glUniform3dvPROC)((intptr_t)function_pointer); + glUniform3dv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniform4dv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniform4dvPROC glUniform4dv = (glUniform4dvPROC)((intptr_t)function_pointer); + glUniform4dv(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix2dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix2dvPROC glUniformMatrix2dv = (glUniformMatrix2dvPROC)((intptr_t)function_pointer); + glUniformMatrix2dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix3dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix3dvPROC glUniformMatrix3dv = (glUniformMatrix3dvPROC)((intptr_t)function_pointer); + glUniformMatrix3dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix4dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix4dvPROC glUniformMatrix4dv = (glUniformMatrix4dvPROC)((intptr_t)function_pointer); + glUniformMatrix4dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix2x3dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix2x3dvPROC glUniformMatrix2x3dv = (glUniformMatrix2x3dvPROC)((intptr_t)function_pointer); + glUniformMatrix2x3dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix2x4dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix2x4dvPROC glUniformMatrix2x4dv = (glUniformMatrix2x4dvPROC)((intptr_t)function_pointer); + glUniformMatrix2x4dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix3x2dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix3x2dvPROC glUniformMatrix3x2dv = (glUniformMatrix3x2dvPROC)((intptr_t)function_pointer); + glUniformMatrix3x2dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix3x4dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix3x4dvPROC glUniformMatrix3x4dv = (glUniformMatrix3x4dvPROC)((intptr_t)function_pointer); + glUniformMatrix3x4dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix4x2dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix4x2dvPROC glUniformMatrix4x2dv = (glUniformMatrix4x2dvPROC)((intptr_t)function_pointer); + glUniformMatrix4x2dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformMatrix4x3dv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glUniformMatrix4x3dvPROC glUniformMatrix4x3dv = (glUniformMatrix4x3dvPROC)((intptr_t)function_pointer); + glUniformMatrix4x3dv(location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetUniformdv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetUniformdvPROC glGetUniformdv = (glGetUniformdvPROC)((intptr_t)function_pointer); + glGetUniformdv(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglMinSampleShading(JNIEnv *env, jclass clazz, jfloat value, jlong function_pointer) { + glMinSampleShadingPROC glMinSampleShading = (glMinSampleShadingPROC)((intptr_t)function_pointer); + glMinSampleShading(value); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL40_nglGetSubroutineUniformLocation(JNIEnv *env, jclass clazz, jint program, jint shadertype, jlong name, jlong function_pointer) { + const GLbyte *name_address = (const GLbyte *)(intptr_t)name; + glGetSubroutineUniformLocationPROC glGetSubroutineUniformLocation = (glGetSubroutineUniformLocationPROC)((intptr_t)function_pointer); + GLint __result = glGetSubroutineUniformLocation(program, shadertype, name_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL40_nglGetSubroutineIndex(JNIEnv *env, jclass clazz, jint program, jint shadertype, jlong name, jlong function_pointer) { + const GLbyte *name_address = (const GLbyte *)(intptr_t)name; + glGetSubroutineIndexPROC glGetSubroutineIndex = (glGetSubroutineIndexPROC)((intptr_t)function_pointer); + GLuint __result = glGetSubroutineIndex(program, shadertype, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetActiveSubroutineUniformiv(JNIEnv *env, jclass clazz, jint program, jint shadertype, jint index, jint pname, jlong values, jlong function_pointer) { + GLint *values_address = (GLint *)(intptr_t)values; + glGetActiveSubroutineUniformivPROC glGetActiveSubroutineUniformiv = (glGetActiveSubroutineUniformivPROC)((intptr_t)function_pointer); + glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetActiveSubroutineUniformName(JNIEnv *env, jclass clazz, jint program, jint shadertype, jint index, jint bufsize, jlong length, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveSubroutineUniformNamePROC glGetActiveSubroutineUniformName = (glGetActiveSubroutineUniformNamePROC)((intptr_t)function_pointer); + glGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetActiveSubroutineName(JNIEnv *env, jclass clazz, jint program, jint shadertype, jint index, jint bufsize, jlong length, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveSubroutineNamePROC glGetActiveSubroutineName = (glGetActiveSubroutineNamePROC)((intptr_t)function_pointer); + glGetActiveSubroutineName(program, shadertype, index, bufsize, length_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglUniformSubroutinesuiv(JNIEnv *env, jclass clazz, jint shadertype, jint count, jlong indices, jlong function_pointer) { + const GLuint *indices_address = (const GLuint *)(intptr_t)indices; + glUniformSubroutinesuivPROC glUniformSubroutinesuiv = (glUniformSubroutinesuivPROC)((intptr_t)function_pointer); + glUniformSubroutinesuiv(shadertype, count, indices_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetUniformSubroutineuiv(JNIEnv *env, jclass clazz, jint shadertype, jint location, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetUniformSubroutineuivPROC glGetUniformSubroutineuiv = (glGetUniformSubroutineuivPROC)((intptr_t)function_pointer); + glGetUniformSubroutineuiv(shadertype, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetProgramStageiv(JNIEnv *env, jclass clazz, jint program, jint shadertype, jint pname, jlong values, jlong function_pointer) { + GLint *values_address = (GLint *)(intptr_t)values; + glGetProgramStageivPROC glGetProgramStageiv = (glGetProgramStageivPROC)((intptr_t)function_pointer); + glGetProgramStageiv(program, shadertype, pname, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglPatchParameteri(JNIEnv *env, jclass clazz, jint pname, jint value, jlong function_pointer) { + glPatchParameteriPROC glPatchParameteri = (glPatchParameteriPROC)((intptr_t)function_pointer); + glPatchParameteri(pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglPatchParameterfv(JNIEnv *env, jclass clazz, jint pname, jlong values, jlong function_pointer) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glPatchParameterfvPROC glPatchParameterfv = (glPatchParameterfvPROC)((intptr_t)function_pointer); + glPatchParameterfv(pname, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBindTransformFeedback(JNIEnv *env, jclass clazz, jint target, jint id, jlong function_pointer) { + glBindTransformFeedbackPROC glBindTransformFeedback = (glBindTransformFeedbackPROC)((intptr_t)function_pointer); + glBindTransformFeedback(target, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDeleteTransformFeedbacks(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDeleteTransformFeedbacksPROC glDeleteTransformFeedbacks = (glDeleteTransformFeedbacksPROC)((intptr_t)function_pointer); + glDeleteTransformFeedbacks(n, ids_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGenTransformFeedbacks(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenTransformFeedbacksPROC glGenTransformFeedbacks = (glGenTransformFeedbacksPROC)((intptr_t)function_pointer); + glGenTransformFeedbacks(n, ids_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL40_nglIsTransformFeedback(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glIsTransformFeedbackPROC glIsTransformFeedback = (glIsTransformFeedbackPROC)((intptr_t)function_pointer); + GLboolean __result = glIsTransformFeedback(id); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglPauseTransformFeedback(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPauseTransformFeedbackPROC glPauseTransformFeedback = (glPauseTransformFeedbackPROC)((intptr_t)function_pointer); + glPauseTransformFeedback(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglResumeTransformFeedback(JNIEnv *env, jclass clazz, jlong function_pointer) { + glResumeTransformFeedbackPROC glResumeTransformFeedback = (glResumeTransformFeedbackPROC)((intptr_t)function_pointer); + glResumeTransformFeedback(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawTransformFeedback(JNIEnv *env, jclass clazz, jint mode, jint id, jlong function_pointer) { + glDrawTransformFeedbackPROC glDrawTransformFeedback = (glDrawTransformFeedbackPROC)((intptr_t)function_pointer); + glDrawTransformFeedback(mode, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglDrawTransformFeedbackStream(JNIEnv *env, jclass clazz, jint mode, jint id, jint stream, jlong function_pointer) { + glDrawTransformFeedbackStreamPROC glDrawTransformFeedbackStream = (glDrawTransformFeedbackStreamPROC)((intptr_t)function_pointer); + glDrawTransformFeedbackStream(mode, id, stream); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglBeginQueryIndexed(JNIEnv *env, jclass clazz, jint target, jint index, jint id, jlong function_pointer) { + glBeginQueryIndexedPROC glBeginQueryIndexed = (glBeginQueryIndexedPROC)((intptr_t)function_pointer); + glBeginQueryIndexed(target, index, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglEndQueryIndexed(JNIEnv *env, jclass clazz, jint target, jint index, jlong function_pointer) { + glEndQueryIndexedPROC glEndQueryIndexed = (glEndQueryIndexedPROC)((intptr_t)function_pointer); + glEndQueryIndexed(target, index); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL40_nglGetQueryIndexediv(JNIEnv *env, jclass clazz, jint target, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryIndexedivPROC glGetQueryIndexediv = (glGetQueryIndexedivPROC)((intptr_t)function_pointer); + glGetQueryIndexediv(target, index, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL41.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL41.c new file mode 100644 index 0000000..b0baa64 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL41.c @@ -0,0 +1,637 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glReleaseShaderCompilerPROC) (); +typedef void (APIENTRY *glShaderBinaryPROC) (GLsizei count, const GLuint * shaders, GLenum binaryformat, const GLvoid * binary, GLsizei length); +typedef void (APIENTRY *glGetShaderPrecisionFormatPROC) (GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); +typedef void (APIENTRY *glDepthRangefPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRY *glClearDepthfPROC) (GLfloat d); +typedef void (APIENTRY *glGetProgramBinaryPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, GLvoid * binary); +typedef void (APIENTRY *glProgramBinaryPROC) (GLuint program, GLenum binaryFormat, const GLvoid * binary, GLsizei length); +typedef void (APIENTRY *glProgramParameteriPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRY *glUseProgramStagesPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRY *glActiveShaderProgramPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRY *glCreateShaderProgramvPROC) (GLenum type, GLsizei count, const GLchar ** string); +typedef void (APIENTRY *glBindProgramPipelinePROC) (GLuint pipeline); +typedef void (APIENTRY *glDeleteProgramPipelinesPROC) (GLsizei n, const GLuint * pipelines); +typedef void (APIENTRY *glGenProgramPipelinesPROC) (GLsizei n, GLuint * pipelines); +typedef GLboolean (APIENTRY *glIsProgramPipelinePROC) (GLuint pipeline); +typedef void (APIENTRY *glGetProgramPipelineivPROC) (GLuint pipeline, GLenum pname, GLint * params); +typedef void (APIENTRY *glProgramUniform1iPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRY *glProgramUniform2iPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRY *glProgramUniform3iPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRY *glProgramUniform4iPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRY *glProgramUniform1fPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRY *glProgramUniform2fPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRY *glProgramUniform3fPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRY *glProgramUniform4fPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRY *glProgramUniform1dPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRY *glProgramUniform2dPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRY *glProgramUniform3dPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRY *glProgramUniform4dPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRY *glProgramUniform1ivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform2ivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform3ivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform4ivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform1fvPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform2fvPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform3fvPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform4fvPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (APIENTRY *glProgramUniform1dvPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform2dvPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform3dvPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform4dvPROC) (GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (APIENTRY *glProgramUniform1uiPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRY *glProgramUniform2uiPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRY *glProgramUniform3uiPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRY *glProgramUniform4uiPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRY *glProgramUniform1uivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform2uivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform3uivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniform4uivPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (APIENTRY *glProgramUniformMatrix2fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix2dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix2x3fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3x2fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix2x4fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4x2fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix3x4fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix4x3fvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (APIENTRY *glProgramUniformMatrix2x3dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3x2dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix2x4dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4x2dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix3x4dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glProgramUniformMatrix4x3dvPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (APIENTRY *glValidateProgramPipelinePROC) (GLuint pipeline); +typedef void (APIENTRY *glGetProgramPipelineInfoLogPROC) (GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (APIENTRY *glVertexAttribL1dPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY *glVertexAttribL2dPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertexAttribL3dPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertexAttribL4dPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertexAttribL1dvPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL2dvPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL3dvPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribL4dvPROC) (GLuint index, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribLPointerPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); +typedef void (APIENTRY *glGetVertexAttribLdvPROC) (GLuint index, GLenum pname, GLdouble * params); +typedef void (APIENTRY *glViewportArrayvPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (APIENTRY *glViewportIndexedfPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRY *glViewportIndexedfvPROC) (GLuint index, const GLfloat * v); +typedef void (APIENTRY *glScissorArrayvPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (APIENTRY *glScissorIndexedPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRY *glScissorIndexedvPROC) (GLuint index, const GLint * v); +typedef void (APIENTRY *glDepthRangeArrayvPROC) (GLuint first, GLsizei count, const GLdouble * v); +typedef void (APIENTRY *glDepthRangeIndexedPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRY *glGetFloati_vPROC) (GLenum target, GLuint index, GLfloat * data); +typedef void (APIENTRY *glGetDoublei_vPROC) (GLenum target, GLuint index, GLdouble * data); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglReleaseShaderCompiler(JNIEnv *env, jclass clazz, jlong function_pointer) { + glReleaseShaderCompilerPROC glReleaseShaderCompiler = (glReleaseShaderCompilerPROC)((intptr_t)function_pointer); + glReleaseShaderCompiler(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglShaderBinary(JNIEnv *env, jclass clazz, jint count, jlong shaders, jint binaryformat, jlong binary, jint length, jlong function_pointer) { + const GLuint *shaders_address = (const GLuint *)(intptr_t)shaders; + const GLvoid *binary_address = (const GLvoid *)(intptr_t)binary; + glShaderBinaryPROC glShaderBinary = (glShaderBinaryPROC)((intptr_t)function_pointer); + glShaderBinary(count, shaders_address, binaryformat, binary_address, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetShaderPrecisionFormat(JNIEnv *env, jclass clazz, jint shadertype, jint precisiontype, jlong range, jlong precision, jlong function_pointer) { + GLint *range_address = (GLint *)(intptr_t)range; + GLint *precision_address = (GLint *)(intptr_t)precision; + glGetShaderPrecisionFormatPROC glGetShaderPrecisionFormat = (glGetShaderPrecisionFormatPROC)((intptr_t)function_pointer); + glGetShaderPrecisionFormat(shadertype, precisiontype, range_address, precision_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglDepthRangef(JNIEnv *env, jclass clazz, jfloat n, jfloat f, jlong function_pointer) { + glDepthRangefPROC glDepthRangef = (glDepthRangefPROC)((intptr_t)function_pointer); + glDepthRangef(n, f); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglClearDepthf(JNIEnv *env, jclass clazz, jfloat d, jlong function_pointer) { + glClearDepthfPROC glClearDepthf = (glClearDepthfPROC)((intptr_t)function_pointer); + glClearDepthf(d); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetProgramBinary(JNIEnv *env, jclass clazz, jint program, jint bufSize, jlong length, jlong binaryFormat, jlong binary, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLenum *binaryFormat_address = (GLenum *)(intptr_t)binaryFormat; + GLvoid *binary_address = (GLvoid *)(intptr_t)binary; + glGetProgramBinaryPROC glGetProgramBinary = (glGetProgramBinaryPROC)((intptr_t)function_pointer); + glGetProgramBinary(program, bufSize, length_address, binaryFormat_address, binary_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramBinary(JNIEnv *env, jclass clazz, jint program, jint binaryFormat, jlong binary, jint length, jlong function_pointer) { + const GLvoid *binary_address = (const GLvoid *)(intptr_t)binary; + glProgramBinaryPROC glProgramBinary = (glProgramBinaryPROC)((intptr_t)function_pointer); + glProgramBinary(program, binaryFormat, binary_address, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramParameteri(JNIEnv *env, jclass clazz, jint program, jint pname, jint value, jlong function_pointer) { + glProgramParameteriPROC glProgramParameteri = (glProgramParameteriPROC)((intptr_t)function_pointer); + glProgramParameteri(program, pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglUseProgramStages(JNIEnv *env, jclass clazz, jint pipeline, jint stages, jint program, jlong function_pointer) { + glUseProgramStagesPROC glUseProgramStages = (glUseProgramStagesPROC)((intptr_t)function_pointer); + glUseProgramStages(pipeline, stages, program); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglActiveShaderProgram(JNIEnv *env, jclass clazz, jint pipeline, jint program, jlong function_pointer) { + glActiveShaderProgramPROC glActiveShaderProgram = (glActiveShaderProgramPROC)((intptr_t)function_pointer); + glActiveShaderProgram(pipeline, program); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL41_nglCreateShaderProgramv(JNIEnv *env, jclass clazz, jint type, jint count, jlong string, jlong function_pointer) { + const GLchar *string_address = (const GLchar *)(intptr_t)string; + glCreateShaderProgramvPROC glCreateShaderProgramv = (glCreateShaderProgramvPROC)((intptr_t)function_pointer); + GLuint __result = glCreateShaderProgramv(type, count, (const GLchar **)&string_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL41_nglCreateShaderProgramv2(JNIEnv *env, jclass clazz, jint type, jint count, jlong strings, jlong function_pointer) { + const GLchar *strings_address = (const GLchar *)(intptr_t)strings; + int _str_i; + GLchar *_str_address; + GLchar **strings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + glCreateShaderProgramvPROC glCreateShaderProgramv = (glCreateShaderProgramvPROC)((intptr_t)function_pointer); + GLuint __result; + _str_i = 0; + _str_address = (GLchar *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + __result = glCreateShaderProgramv(type, count, (const GLchar **)&strings_str); + free(strings_str); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL41_nglCreateShaderProgramv3(JNIEnv *env, jclass clazz, jint type, jint count, jobjectArray strings, jlong function_pointer) { + int _ptr_i; + jobject _ptr_object; + GLchar **strings_ptr = (GLchar **) malloc(count * sizeof(GLchar *)); + glCreateShaderProgramvPROC glCreateShaderProgramv = (glCreateShaderProgramvPROC)((intptr_t)function_pointer); + GLuint __result; + _ptr_i = 0; + while ( _ptr_i < count ) { + _ptr_object = (*env)->GetObjectArrayElement(env, strings, _ptr_i); + strings_ptr[_ptr_i++] = (GLchar *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = glCreateShaderProgramv(type, count, (const GLchar **)strings_ptr); + free(strings_ptr); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglBindProgramPipeline(JNIEnv *env, jclass clazz, jint pipeline, jlong function_pointer) { + glBindProgramPipelinePROC glBindProgramPipeline = (glBindProgramPipelinePROC)((intptr_t)function_pointer); + glBindProgramPipeline(pipeline); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglDeleteProgramPipelines(JNIEnv *env, jclass clazz, jint n, jlong pipelines, jlong function_pointer) { + const GLuint *pipelines_address = (const GLuint *)(intptr_t)pipelines; + glDeleteProgramPipelinesPROC glDeleteProgramPipelines = (glDeleteProgramPipelinesPROC)((intptr_t)function_pointer); + glDeleteProgramPipelines(n, pipelines_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGenProgramPipelines(JNIEnv *env, jclass clazz, jint n, jlong pipelines, jlong function_pointer) { + GLuint *pipelines_address = (GLuint *)(intptr_t)pipelines; + glGenProgramPipelinesPROC glGenProgramPipelines = (glGenProgramPipelinesPROC)((intptr_t)function_pointer); + glGenProgramPipelines(n, pipelines_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL41_nglIsProgramPipeline(JNIEnv *env, jclass clazz, jint pipeline, jlong function_pointer) { + glIsProgramPipelinePROC glIsProgramPipeline = (glIsProgramPipelinePROC)((intptr_t)function_pointer); + GLboolean __result = glIsProgramPipeline(pipeline); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetProgramPipelineiv(JNIEnv *env, jclass clazz, jint pipeline, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramPipelineivPROC glGetProgramPipelineiv = (glGetProgramPipelineivPROC)((intptr_t)function_pointer); + glGetProgramPipelineiv(pipeline, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1i(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jlong function_pointer) { + glProgramUniform1iPROC glProgramUniform1i = (glProgramUniform1iPROC)((intptr_t)function_pointer); + glProgramUniform1i(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2i(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jlong function_pointer) { + glProgramUniform2iPROC glProgramUniform2i = (glProgramUniform2iPROC)((intptr_t)function_pointer); + glProgramUniform2i(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3i(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glProgramUniform3iPROC glProgramUniform3i = (glProgramUniform3iPROC)((intptr_t)function_pointer); + glProgramUniform3i(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4i(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glProgramUniform4iPROC glProgramUniform4i = (glProgramUniform4iPROC)((intptr_t)function_pointer); + glProgramUniform4i(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1f(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jlong function_pointer) { + glProgramUniform1fPROC glProgramUniform1f = (glProgramUniform1fPROC)((intptr_t)function_pointer); + glProgramUniform1f(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2f(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jlong function_pointer) { + glProgramUniform2fPROC glProgramUniform2f = (glProgramUniform2fPROC)((intptr_t)function_pointer); + glProgramUniform2f(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3f(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jlong function_pointer) { + glProgramUniform3fPROC glProgramUniform3f = (glProgramUniform3fPROC)((intptr_t)function_pointer); + glProgramUniform3f(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4f(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3, jlong function_pointer) { + glProgramUniform4fPROC glProgramUniform4f = (glProgramUniform4fPROC)((intptr_t)function_pointer); + glProgramUniform4f(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1d(JNIEnv *env, jclass clazz, jint program, jint location, jdouble v0, jlong function_pointer) { + glProgramUniform1dPROC glProgramUniform1d = (glProgramUniform1dPROC)((intptr_t)function_pointer); + glProgramUniform1d(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2d(JNIEnv *env, jclass clazz, jint program, jint location, jdouble v0, jdouble v1, jlong function_pointer) { + glProgramUniform2dPROC glProgramUniform2d = (glProgramUniform2dPROC)((intptr_t)function_pointer); + glProgramUniform2d(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3d(JNIEnv *env, jclass clazz, jint program, jint location, jdouble v0, jdouble v1, jdouble v2, jlong function_pointer) { + glProgramUniform3dPROC glProgramUniform3d = (glProgramUniform3dPROC)((intptr_t)function_pointer); + glProgramUniform3d(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4d(JNIEnv *env, jclass clazz, jint program, jint location, jdouble v0, jdouble v1, jdouble v2, jdouble v3, jlong function_pointer) { + glProgramUniform4dPROC glProgramUniform4d = (glProgramUniform4dPROC)((intptr_t)function_pointer); + glProgramUniform4d(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1iv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform1ivPROC glProgramUniform1iv = (glProgramUniform1ivPROC)((intptr_t)function_pointer); + glProgramUniform1iv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2iv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform2ivPROC glProgramUniform2iv = (glProgramUniform2ivPROC)((intptr_t)function_pointer); + glProgramUniform2iv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3iv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform3ivPROC glProgramUniform3iv = (glProgramUniform3ivPROC)((intptr_t)function_pointer); + glProgramUniform3iv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4iv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform4ivPROC glProgramUniform4iv = (glProgramUniform4ivPROC)((intptr_t)function_pointer); + glProgramUniform4iv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform1fvPROC glProgramUniform1fv = (glProgramUniform1fvPROC)((intptr_t)function_pointer); + glProgramUniform1fv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform2fvPROC glProgramUniform2fv = (glProgramUniform2fvPROC)((intptr_t)function_pointer); + glProgramUniform2fv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform3fvPROC glProgramUniform3fv = (glProgramUniform3fvPROC)((intptr_t)function_pointer); + glProgramUniform3fv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform4fvPROC glProgramUniform4fv = (glProgramUniform4fvPROC)((intptr_t)function_pointer); + glProgramUniform4fv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform1dvPROC glProgramUniform1dv = (glProgramUniform1dvPROC)((intptr_t)function_pointer); + glProgramUniform1dv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform2dvPROC glProgramUniform2dv = (glProgramUniform2dvPROC)((intptr_t)function_pointer); + glProgramUniform2dv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform3dvPROC glProgramUniform3dv = (glProgramUniform3dvPROC)((intptr_t)function_pointer); + glProgramUniform3dv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniform4dvPROC glProgramUniform4dv = (glProgramUniform4dvPROC)((intptr_t)function_pointer); + glProgramUniform4dv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1ui(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jlong function_pointer) { + glProgramUniform1uiPROC glProgramUniform1ui = (glProgramUniform1uiPROC)((intptr_t)function_pointer); + glProgramUniform1ui(program, location, v0); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2ui(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jlong function_pointer) { + glProgramUniform2uiPROC glProgramUniform2ui = (glProgramUniform2uiPROC)((intptr_t)function_pointer); + glProgramUniform2ui(program, location, v0, v1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3ui(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jlong function_pointer) { + glProgramUniform3uiPROC glProgramUniform3ui = (glProgramUniform3uiPROC)((intptr_t)function_pointer); + glProgramUniform3ui(program, location, v0, v1, v2); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4ui(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jint v3, jlong function_pointer) { + glProgramUniform4uiPROC glProgramUniform4ui = (glProgramUniform4uiPROC)((intptr_t)function_pointer); + glProgramUniform4ui(program, location, v0, v1, v2, v3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform1uiv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform1uivPROC glProgramUniform1uiv = (glProgramUniform1uivPROC)((intptr_t)function_pointer); + glProgramUniform1uiv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform2uiv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform2uivPROC glProgramUniform2uiv = (glProgramUniform2uivPROC)((intptr_t)function_pointer); + glProgramUniform2uiv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform3uiv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform3uivPROC glProgramUniform3uiv = (glProgramUniform3uivPROC)((intptr_t)function_pointer); + glProgramUniform3uiv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniform4uiv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform4uivPROC glProgramUniform4uiv = (glProgramUniform4uivPROC)((intptr_t)function_pointer); + glProgramUniform4uiv(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2fvPROC glProgramUniformMatrix2fv = (glProgramUniformMatrix2fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3fvPROC glProgramUniformMatrix3fv = (glProgramUniformMatrix3fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4fvPROC glProgramUniformMatrix4fv = (glProgramUniformMatrix4fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2dvPROC glProgramUniformMatrix2dv = (glProgramUniformMatrix2dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3dvPROC glProgramUniformMatrix3dv = (glProgramUniformMatrix3dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4dvPROC glProgramUniformMatrix4dv = (glProgramUniformMatrix4dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2x3fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2x3fvPROC glProgramUniformMatrix2x3fv = (glProgramUniformMatrix2x3fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x3fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3x2fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3x2fvPROC glProgramUniformMatrix3x2fv = (glProgramUniformMatrix3x2fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x2fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2x4fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2x4fvPROC glProgramUniformMatrix2x4fv = (glProgramUniformMatrix2x4fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x4fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4x2fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4x2fvPROC glProgramUniformMatrix4x2fv = (glProgramUniformMatrix4x2fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x2fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3x4fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3x4fvPROC glProgramUniformMatrix3x4fv = (glProgramUniformMatrix3x4fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x4fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4x3fv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4x3fvPROC glProgramUniformMatrix4x3fv = (glProgramUniformMatrix4x3fvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x3fv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2x3dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2x3dvPROC glProgramUniformMatrix2x3dv = (glProgramUniformMatrix2x3dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x3dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3x2dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3x2dvPROC glProgramUniformMatrix3x2dv = (glProgramUniformMatrix3x2dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x2dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix2x4dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix2x4dvPROC glProgramUniformMatrix2x4dv = (glProgramUniformMatrix2x4dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix2x4dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4x2dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4x2dvPROC glProgramUniformMatrix4x2dv = (glProgramUniformMatrix4x2dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x2dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix3x4dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix3x4dvPROC glProgramUniformMatrix3x4dv = (glProgramUniformMatrix3x4dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix3x4dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglProgramUniformMatrix4x3dv(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value, jlong function_pointer) { + const GLdouble *value_address = (const GLdouble *)(intptr_t)value; + glProgramUniformMatrix4x3dvPROC glProgramUniformMatrix4x3dv = (glProgramUniformMatrix4x3dvPROC)((intptr_t)function_pointer); + glProgramUniformMatrix4x3dv(program, location, count, transpose, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglValidateProgramPipeline(JNIEnv *env, jclass clazz, jint pipeline, jlong function_pointer) { + glValidateProgramPipelinePROC glValidateProgramPipeline = (glValidateProgramPipelinePROC)((intptr_t)function_pointer); + glValidateProgramPipeline(pipeline); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetProgramPipelineInfoLog(JNIEnv *env, jclass clazz, jint pipeline, jint bufSize, jlong length, jlong infoLog, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetProgramPipelineInfoLogPROC glGetProgramPipelineInfoLog = (glGetProgramPipelineInfoLogPROC)((intptr_t)function_pointer); + glGetProgramPipelineInfoLog(pipeline, bufSize, length_address, infoLog_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL1d(JNIEnv *env, jclass clazz, jint index, jdouble x, jlong function_pointer) { + glVertexAttribL1dPROC glVertexAttribL1d = (glVertexAttribL1dPROC)((intptr_t)function_pointer); + glVertexAttribL1d(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL2d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jlong function_pointer) { + glVertexAttribL2dPROC glVertexAttribL2d = (glVertexAttribL2dPROC)((intptr_t)function_pointer); + glVertexAttribL2d(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL3d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertexAttribL3dPROC glVertexAttribL3d = (glVertexAttribL3dPROC)((intptr_t)function_pointer); + glVertexAttribL3d(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL4d(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertexAttribL4dPROC glVertexAttribL4d = (glVertexAttribL4dPROC)((intptr_t)function_pointer); + glVertexAttribL4d(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL1dv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL1dvPROC glVertexAttribL1dv = (glVertexAttribL1dvPROC)((intptr_t)function_pointer); + glVertexAttribL1dv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL2dv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL2dvPROC glVertexAttribL2dv = (glVertexAttribL2dvPROC)((intptr_t)function_pointer); + glVertexAttribL2dv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL3dv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL3dvPROC glVertexAttribL3dv = (glVertexAttribL3dvPROC)((intptr_t)function_pointer); + glVertexAttribL3dv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribL4dv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribL4dvPROC glVertexAttribL4dv = (glVertexAttribL4dvPROC)((intptr_t)function_pointer); + glVertexAttribL4dv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribLPointer(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong pointer, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)pointer; + glVertexAttribLPointerPROC glVertexAttribLPointer = (glVertexAttribLPointerPROC)((intptr_t)function_pointer); + glVertexAttribLPointer(index, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglVertexAttribLPointerBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong pointer_buffer_offset, jlong function_pointer) { + const GLvoid *pointer_address = (const GLvoid *)(intptr_t)offsetToPointer(pointer_buffer_offset); + glVertexAttribLPointerPROC glVertexAttribLPointer = (glVertexAttribLPointerPROC)((intptr_t)function_pointer); + glVertexAttribLPointer(index, size, type, stride, pointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetVertexAttribLdv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVertexAttribLdvPROC glGetVertexAttribLdv = (glGetVertexAttribLdvPROC)((intptr_t)function_pointer); + glGetVertexAttribLdv(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglViewportArrayv(JNIEnv *env, jclass clazz, jint first, jint count, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glViewportArrayvPROC glViewportArrayv = (glViewportArrayvPROC)((intptr_t)function_pointer); + glViewportArrayv(first, count, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglViewportIndexedf(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jfloat w, jfloat h, jlong function_pointer) { + glViewportIndexedfPROC glViewportIndexedf = (glViewportIndexedfPROC)((intptr_t)function_pointer); + glViewportIndexedf(index, x, y, w, h); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglViewportIndexedfv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glViewportIndexedfvPROC glViewportIndexedfv = (glViewportIndexedfvPROC)((intptr_t)function_pointer); + glViewportIndexedfv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglScissorArrayv(JNIEnv *env, jclass clazz, jint first, jint count, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glScissorArrayvPROC glScissorArrayv = (glScissorArrayvPROC)((intptr_t)function_pointer); + glScissorArrayv(first, count, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglScissorIndexed(JNIEnv *env, jclass clazz, jint index, jint left, jint bottom, jint width, jint height, jlong function_pointer) { + glScissorIndexedPROC glScissorIndexed = (glScissorIndexedPROC)((intptr_t)function_pointer); + glScissorIndexed(index, left, bottom, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglScissorIndexedv(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glScissorIndexedvPROC glScissorIndexedv = (glScissorIndexedvPROC)((intptr_t)function_pointer); + glScissorIndexedv(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglDepthRangeArrayv(JNIEnv *env, jclass clazz, jint first, jint count, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glDepthRangeArrayvPROC glDepthRangeArrayv = (glDepthRangeArrayvPROC)((intptr_t)function_pointer); + glDepthRangeArrayv(first, count, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglDepthRangeIndexed(JNIEnv *env, jclass clazz, jint index, jdouble n, jdouble f, jlong function_pointer) { + glDepthRangeIndexedPROC glDepthRangeIndexed = (glDepthRangeIndexedPROC)((intptr_t)function_pointer); + glDepthRangeIndexed(index, n, f); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetFloati_1v(JNIEnv *env, jclass clazz, jint target, jint index, jlong data, jlong function_pointer) { + GLfloat *data_address = (GLfloat *)(intptr_t)data; + glGetFloati_vPROC glGetFloati_v = (glGetFloati_vPROC)((intptr_t)function_pointer); + glGetFloati_v(target, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL41_nglGetDoublei_1v(JNIEnv *env, jclass clazz, jint target, jint index, jlong data, jlong function_pointer) { + GLdouble *data_address = (GLdouble *)(intptr_t)data; + glGetDoublei_vPROC glGetDoublei_v = (glGetDoublei_vPROC)((intptr_t)function_pointer); + glGetDoublei_v(target, index, data_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL42.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL42.c new file mode 100644 index 0000000..4714419 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL42.c @@ -0,0 +1,94 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetActiveAtomicCounterBufferivPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); +typedef void (APIENTRY *glTexStorage1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRY *glTexStorage2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRY *glTexStorage3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRY *glDrawTransformFeedbackInstancedPROC) (GLenum mode, GLuint id, GLsizei primcount); +typedef void (APIENTRY *glDrawTransformFeedbackStreamInstancedPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); +typedef void (APIENTRY *glDrawArraysInstancedBaseInstancePROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); +typedef void (APIENTRY *glDrawElementsInstancedBaseInstancePROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount, GLuint baseinstance); +typedef void (APIENTRY *glDrawElementsInstancedBaseVertexBaseInstancePROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRY *glBindImageTexturePROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRY *glMemoryBarrierPROC) (GLbitfield barriers); +typedef void (APIENTRY *glGetInternalformativPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglGetActiveAtomicCounterBufferiv(JNIEnv *env, jclass clazz, jint program, jint bufferIndex, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetActiveAtomicCounterBufferivPROC glGetActiveAtomicCounterBufferiv = (glGetActiveAtomicCounterBufferivPROC)((intptr_t)function_pointer); + glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglTexStorage1D(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jlong function_pointer) { + glTexStorage1DPROC glTexStorage1D = (glTexStorage1DPROC)((intptr_t)function_pointer); + glTexStorage1D(target, levels, internalformat, width); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglTexStorage2D(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height, jlong function_pointer) { + glTexStorage2DPROC glTexStorage2D = (glTexStorage2DPROC)((intptr_t)function_pointer); + glTexStorage2D(target, levels, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglTexStorage3D(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height, jint depth, jlong function_pointer) { + glTexStorage3DPROC glTexStorage3D = (glTexStorage3DPROC)((intptr_t)function_pointer); + glTexStorage3D(target, levels, internalformat, width, height, depth); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawTransformFeedbackInstanced(JNIEnv *env, jclass clazz, jint mode, jint id, jint primcount, jlong function_pointer) { + glDrawTransformFeedbackInstancedPROC glDrawTransformFeedbackInstanced = (glDrawTransformFeedbackInstancedPROC)((intptr_t)function_pointer); + glDrawTransformFeedbackInstanced(mode, id, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawTransformFeedbackStreamInstanced(JNIEnv *env, jclass clazz, jint mode, jint id, jint stream, jint primcount, jlong function_pointer) { + glDrawTransformFeedbackStreamInstancedPROC glDrawTransformFeedbackStreamInstanced = (glDrawTransformFeedbackStreamInstancedPROC)((intptr_t)function_pointer); + glDrawTransformFeedbackStreamInstanced(mode, id, stream, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawArraysInstancedBaseInstance(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jint primcount, jint baseinstance, jlong function_pointer) { + glDrawArraysInstancedBaseInstancePROC glDrawArraysInstancedBaseInstance = (glDrawArraysInstancedBaseInstancePROC)((intptr_t)function_pointer); + glDrawArraysInstancedBaseInstance(mode, first, count, primcount, baseinstance); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseInstance(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jint baseinstance, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedBaseInstancePROC glDrawElementsInstancedBaseInstance = (glDrawElementsInstancedBaseInstancePROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseInstance(mode, count, type, indices_address, primcount, baseinstance); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseInstanceBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jint baseinstance, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedBaseInstancePROC glDrawElementsInstancedBaseInstance = (glDrawElementsInstancedBaseInstancePROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseInstance(mode, count, type, indices_address, primcount, baseinstance); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseVertexBaseInstance(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount, jint basevertex, jint baseinstance, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstancedBaseVertexBaseInstancePROC glDrawElementsInstancedBaseVertexBaseInstance = (glDrawElementsInstancedBaseVertexBaseInstancePROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices_address, primcount, basevertex, baseinstance); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseVertexBaseInstanceBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jint basevertex, jint baseinstance, jlong function_pointer) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstancedBaseVertexBaseInstancePROC glDrawElementsInstancedBaseVertexBaseInstance = (glDrawElementsInstancedBaseVertexBaseInstancePROC)((intptr_t)function_pointer); + glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices_address, primcount, basevertex, baseinstance); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglBindImageTexture(JNIEnv *env, jclass clazz, jint unit, jint texture, jint level, jboolean layered, jint layer, jint access, jint format, jlong function_pointer) { + glBindImageTexturePROC glBindImageTexture = (glBindImageTexturePROC)((intptr_t)function_pointer); + glBindImageTexture(unit, texture, level, layered, layer, access, format); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglMemoryBarrier(JNIEnv *env, jclass clazz, jint barriers, jlong function_pointer) { + glMemoryBarrierPROC glMemoryBarrier = (glMemoryBarrierPROC)((intptr_t)function_pointer); + glMemoryBarrier(barriers); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglGetInternalformativ(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint pname, jint bufSize, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetInternalformativPROC glGetInternalformativ = (glGetInternalformativPROC)((intptr_t)function_pointer); + glGetInternalformativ(target, internalformat, pname, bufSize, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL43.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL43.c new file mode 100644 index 0000000..904121f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL43.c @@ -0,0 +1,312 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glClearBufferDataPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glClearBufferSubDataPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glDispatchComputePROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRY *glDispatchComputeIndirectPROC) (GLintptr indirect); +typedef void (APIENTRY *glCopyImageSubDataPROC) (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 (APIENTRY *glDebugMessageControlPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (APIENTRY *glDebugMessageInsertPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (APIENTRY *glDebugMessageCallbackPROC) (GLDEBUGPROC callback, GLvoid * userParam); +typedef GLuint (APIENTRY *glGetDebugMessageLogPROC) (GLuint count, GLsizei bufsize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (APIENTRY *glPushDebugGroupPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef void (APIENTRY *glPopDebugGroupPROC) (); +typedef void (APIENTRY *glObjectLabelPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (APIENTRY *glGetObjectLabelPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (APIENTRY *glObjectPtrLabelPROC) (GLvoid * ptr, GLsizei length, const GLchar * label); +typedef void (APIENTRY *glGetObjectPtrLabelPROC) (GLvoid * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (APIENTRY *glFramebufferParameteriPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRY *glGetFramebufferParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetInternalformati64vPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 * params); +typedef void (APIENTRY *glInvalidateTexSubImagePROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRY *glInvalidateTexImagePROC) (GLuint texture, GLint level); +typedef void (APIENTRY *glInvalidateBufferSubDataPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRY *glInvalidateBufferDataPROC) (GLuint buffer); +typedef void (APIENTRY *glInvalidateFramebufferPROC) (GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (APIENTRY *glInvalidateSubFramebufferPROC) (GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRY *glMultiDrawArraysIndirectPROC) (GLenum mode, const GLvoid * indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRY *glMultiDrawElementsIndirectPROC) (GLenum mode, GLenum type, const GLvoid * indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRY *glGetProgramInterfaceivPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint * params); +typedef GLuint (APIENTRY *glGetProgramResourceIndexPROC) (GLuint program, GLenum programInterface, const GLchar * name); +typedef void (APIENTRY *glGetProgramResourceNamePROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (APIENTRY *glGetProgramResourceivPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei bufSize, GLsizei * length, GLint * params); +typedef GLint (APIENTRY *glGetProgramResourceLocationPROC) (GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (APIENTRY *glGetProgramResourceLocationIndexPROC) (GLuint program, GLenum programInterface, const GLchar * name); +typedef void (APIENTRY *glShaderStorageBlockBindingPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRY *glTexBufferRangePROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRY *glTexStorage2DMultisamplePROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRY *glTexStorage3DMultisamplePROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRY *glTextureViewPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRY *glBindVertexBufferPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRY *glVertexAttribFormatPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRY *glVertexAttribIFormatPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRY *glVertexAttribLFormatPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRY *glVertexAttribBindingPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRY *glVertexBindingDivisorPROC) (GLuint bindingindex, GLuint divisor); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglClearBufferData(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearBufferDataPROC glClearBufferData = (glClearBufferDataPROC)((intptr_t)function_pointer); + glClearBufferData(target, internalformat, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglClearBufferSubData(JNIEnv *env, jclass clazz, jint target, jint internalformat, jlong offset, jlong size, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearBufferSubDataPROC glClearBufferSubData = (glClearBufferSubDataPROC)((intptr_t)function_pointer); + glClearBufferSubData(target, internalformat, offset, size, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglDispatchCompute(JNIEnv *env, jclass clazz, jint num_groups_x, jint num_groups_y, jint num_groups_z, jlong function_pointer) { + glDispatchComputePROC glDispatchCompute = (glDispatchComputePROC)((intptr_t)function_pointer); + glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglDispatchComputeIndirect(JNIEnv *env, jclass clazz, jlong indirect, jlong function_pointer) { + glDispatchComputeIndirectPROC glDispatchComputeIndirect = (glDispatchComputeIndirectPROC)((intptr_t)function_pointer); + glDispatchComputeIndirect(indirect); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglCopyImageSubData(JNIEnv *env, jclass clazz, jint srcName, jint srcTarget, jint srcLevel, jint srcX, jint srcY, jint srcZ, jint dstName, jint dstTarget, jint dstLevel, jint dstX, jint dstY, jint dstZ, jint srcWidth, jint srcHeight, jint srcDepth, jlong function_pointer) { + glCopyImageSubDataPROC glCopyImageSubData = (glCopyImageSubDataPROC)((intptr_t)function_pointer); + glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglDebugMessageControl(JNIEnv *env, jclass clazz, jint source, jint type, jint severity, jint count, jlong ids, jboolean enabled, jlong function_pointer) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDebugMessageControlPROC glDebugMessageControl = (glDebugMessageControlPROC)((intptr_t)function_pointer); + glDebugMessageControl(source, type, severity, count, ids_address, enabled); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglDebugMessageInsert(JNIEnv *env, jclass clazz, jint source, jint type, jint id, jint severity, jint length, jlong buf, jlong function_pointer) { + const GLchar *buf_address = (const GLchar *)(intptr_t)buf; + glDebugMessageInsertPROC glDebugMessageInsert = (glDebugMessageInsertPROC)((intptr_t)function_pointer); + glDebugMessageInsert(source, type, id, severity, length, buf_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglDebugMessageCallback(JNIEnv *env, jclass clazz, jlong callback, jlong userParam, jlong function_pointer) { + glDebugMessageCallbackPROC glDebugMessageCallback = (glDebugMessageCallbackPROC)((intptr_t)function_pointer); + glDebugMessageCallback((GLDEBUGPROC)(intptr_t)callback, (GLvoid *)(intptr_t)userParam); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL43_nglGetDebugMessageLog(JNIEnv *env, jclass clazz, jint count, jint bufsize, jlong sources, jlong types, jlong ids, jlong severities, jlong lengths, jlong messageLog, jlong function_pointer) { + GLenum *sources_address = (GLenum *)(intptr_t)sources; + GLenum *types_address = (GLenum *)(intptr_t)types; + GLuint *ids_address = (GLuint *)(intptr_t)ids; + GLenum *severities_address = (GLenum *)(intptr_t)severities; + GLsizei *lengths_address = (GLsizei *)(intptr_t)lengths; + GLchar *messageLog_address = (GLchar *)(intptr_t)messageLog; + glGetDebugMessageLogPROC glGetDebugMessageLog = (glGetDebugMessageLogPROC)((intptr_t)function_pointer); + GLuint __result = glGetDebugMessageLog(count, bufsize, sources_address, types_address, ids_address, severities_address, lengths_address, messageLog_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglPushDebugGroup(JNIEnv *env, jclass clazz, jint source, jint id, jint length, jlong message, jlong function_pointer) { + const GLchar *message_address = (const GLchar *)(intptr_t)message; + glPushDebugGroupPROC glPushDebugGroup = (glPushDebugGroupPROC)((intptr_t)function_pointer); + glPushDebugGroup(source, id, length, message_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglPopDebugGroup(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPopDebugGroupPROC glPopDebugGroup = (glPopDebugGroupPROC)((intptr_t)function_pointer); + glPopDebugGroup(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglObjectLabel(JNIEnv *env, jclass clazz, jint identifier, jint name, jint length, jlong label, jlong function_pointer) { + const GLchar *label_address = (const GLchar *)(intptr_t)label; + glObjectLabelPROC glObjectLabel = (glObjectLabelPROC)((intptr_t)function_pointer); + glObjectLabel(identifier, name, length, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetObjectLabel(JNIEnv *env, jclass clazz, jint identifier, jint name, jint bufSize, jlong length, jlong label, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *label_address = (GLchar *)(intptr_t)label; + glGetObjectLabelPROC glGetObjectLabel = (glGetObjectLabelPROC)((intptr_t)function_pointer); + glGetObjectLabel(identifier, name, bufSize, length_address, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglObjectPtrLabel(JNIEnv *env, jclass clazz, jlong ptr, jint length, jlong label, jlong function_pointer) { + const GLchar *label_address = (const GLchar *)(intptr_t)label; + glObjectPtrLabelPROC glObjectPtrLabel = (glObjectPtrLabelPROC)((intptr_t)function_pointer); + glObjectPtrLabel((GLvoid *)(intptr_t)ptr, length, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetObjectPtrLabel(JNIEnv *env, jclass clazz, jlong ptr, jint bufSize, jlong length, jlong label, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *label_address = (GLchar *)(intptr_t)label; + glGetObjectPtrLabelPROC glGetObjectPtrLabel = (glGetObjectPtrLabelPROC)((intptr_t)function_pointer); + glGetObjectPtrLabel((GLvoid *)(intptr_t)ptr, bufSize, length_address, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglFramebufferParameteri(JNIEnv *env, jclass clazz, jint target, jint pname, jint param, jlong function_pointer) { + glFramebufferParameteriPROC glFramebufferParameteri = (glFramebufferParameteriPROC)((intptr_t)function_pointer); + glFramebufferParameteri(target, pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetFramebufferParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFramebufferParameterivPROC glGetFramebufferParameteriv = (glGetFramebufferParameterivPROC)((intptr_t)function_pointer); + glGetFramebufferParameteriv(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetInternalformati64v(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint pname, jint bufSize, jlong params, jlong function_pointer) { + GLint64 *params_address = (GLint64 *)(intptr_t)params; + glGetInternalformati64vPROC glGetInternalformati64v = (glGetInternalformati64vPROC)((intptr_t)function_pointer); + glGetInternalformati64v(target, internalformat, pname, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateTexSubImage(JNIEnv *env, jclass clazz, jint texture, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jlong function_pointer) { + glInvalidateTexSubImagePROC glInvalidateTexSubImage = (glInvalidateTexSubImagePROC)((intptr_t)function_pointer); + glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateTexImage(JNIEnv *env, jclass clazz, jint texture, jint level, jlong function_pointer) { + glInvalidateTexImagePROC glInvalidateTexImage = (glInvalidateTexImagePROC)((intptr_t)function_pointer); + glInvalidateTexImage(texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateBufferSubData(JNIEnv *env, jclass clazz, jint buffer, jlong offset, jlong length, jlong function_pointer) { + glInvalidateBufferSubDataPROC glInvalidateBufferSubData = (glInvalidateBufferSubDataPROC)((intptr_t)function_pointer); + glInvalidateBufferSubData(buffer, offset, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateBufferData(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glInvalidateBufferDataPROC glInvalidateBufferData = (glInvalidateBufferDataPROC)((intptr_t)function_pointer); + glInvalidateBufferData(buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateFramebuffer(JNIEnv *env, jclass clazz, jint target, jint numAttachments, jlong attachments, jlong function_pointer) { + const GLenum *attachments_address = (const GLenum *)(intptr_t)attachments; + glInvalidateFramebufferPROC glInvalidateFramebuffer = (glInvalidateFramebufferPROC)((intptr_t)function_pointer); + glInvalidateFramebuffer(target, numAttachments, attachments_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglInvalidateSubFramebuffer(JNIEnv *env, jclass clazz, jint target, jint numAttachments, jlong attachments, jint x, jint y, jint width, jint height, jlong function_pointer) { + const GLenum *attachments_address = (const GLenum *)(intptr_t)attachments; + glInvalidateSubFramebufferPROC glInvalidateSubFramebuffer = (glInvalidateSubFramebufferPROC)((intptr_t)function_pointer); + glInvalidateSubFramebuffer(target, numAttachments, attachments_address, x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglMultiDrawArraysIndirect(JNIEnv *env, jclass clazz, jint mode, jlong indirect, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawArraysIndirectPROC glMultiDrawArraysIndirect = (glMultiDrawArraysIndirectPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirect(mode, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglMultiDrawArraysIndirectBO(JNIEnv *env, jclass clazz, jint mode, jlong indirect_buffer_offset, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawArraysIndirectPROC glMultiDrawArraysIndirect = (glMultiDrawArraysIndirectPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirect(mode, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglMultiDrawElementsIndirect(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawElementsIndirectPROC glMultiDrawElementsIndirect = (glMultiDrawElementsIndirectPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirect(mode, type, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglMultiDrawElementsIndirectBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jint primcount, jint stride, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawElementsIndirectPROC glMultiDrawElementsIndirect = (glMultiDrawElementsIndirectPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirect(mode, type, indirect_address, primcount, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramInterfaceiv(JNIEnv *env, jclass clazz, jint program, jint programInterface, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramInterfaceivPROC glGetProgramInterfaceiv = (glGetProgramInterfaceivPROC)((intptr_t)function_pointer); + glGetProgramInterfaceiv(program, programInterface, pname, params_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramResourceIndex(JNIEnv *env, jclass clazz, jint program, jint programInterface, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetProgramResourceIndexPROC glGetProgramResourceIndex = (glGetProgramResourceIndexPROC)((intptr_t)function_pointer); + GLuint __result = glGetProgramResourceIndex(program, programInterface, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramResourceName(JNIEnv *env, jclass clazz, jint program, jint programInterface, jint index, jint bufSize, jlong length, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetProgramResourceNamePROC glGetProgramResourceName = (glGetProgramResourceNamePROC)((intptr_t)function_pointer); + glGetProgramResourceName(program, programInterface, index, bufSize, length_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramResourceiv(JNIEnv *env, jclass clazz, jint program, jint programInterface, jint index, jint propCount, jlong props, jint bufSize, jlong length, jlong params, jlong function_pointer) { + const GLenum *props_address = (const GLenum *)(intptr_t)props; + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramResourceivPROC glGetProgramResourceiv = (glGetProgramResourceivPROC)((intptr_t)function_pointer); + glGetProgramResourceiv(program, programInterface, index, propCount, props_address, bufSize, length_address, params_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramResourceLocation(JNIEnv *env, jclass clazz, jint program, jint programInterface, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetProgramResourceLocationPROC glGetProgramResourceLocation = (glGetProgramResourceLocationPROC)((intptr_t)function_pointer); + GLint __result = glGetProgramResourceLocation(program, programInterface, name_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL43_nglGetProgramResourceLocationIndex(JNIEnv *env, jclass clazz, jint program, jint programInterface, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetProgramResourceLocationIndexPROC glGetProgramResourceLocationIndex = (glGetProgramResourceLocationIndexPROC)((intptr_t)function_pointer); + GLint __result = glGetProgramResourceLocationIndex(program, programInterface, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglShaderStorageBlockBinding(JNIEnv *env, jclass clazz, jint program, jint storageBlockIndex, jint storageBlockBinding, jlong function_pointer) { + glShaderStorageBlockBindingPROC glShaderStorageBlockBinding = (glShaderStorageBlockBindingPROC)((intptr_t)function_pointer); + glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglTexBufferRange(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint buffer, jlong offset, jlong size, jlong function_pointer) { + glTexBufferRangePROC glTexBufferRange = (glTexBufferRangePROC)((intptr_t)function_pointer); + glTexBufferRange(target, internalformat, buffer, offset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglTexStorage2DMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jboolean fixedsamplelocations, jlong function_pointer) { + glTexStorage2DMultisamplePROC glTexStorage2DMultisample = (glTexStorage2DMultisamplePROC)((intptr_t)function_pointer); + glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglTexStorage3DMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height, jint depth, jboolean fixedsamplelocations, jlong function_pointer) { + glTexStorage3DMultisamplePROC glTexStorage3DMultisample = (glTexStorage3DMultisamplePROC)((intptr_t)function_pointer); + glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglTextureView(JNIEnv *env, jclass clazz, jint texture, jint target, jint origtexture, jint internalformat, jint minlevel, jint numlevels, jint minlayer, jint numlayers, jlong function_pointer) { + glTextureViewPROC glTextureView = (glTextureViewPROC)((intptr_t)function_pointer); + glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglBindVertexBuffer(JNIEnv *env, jclass clazz, jint bindingindex, jint buffer, jlong offset, jint stride, jlong function_pointer) { + glBindVertexBufferPROC glBindVertexBuffer = (glBindVertexBufferPROC)((intptr_t)function_pointer); + glBindVertexBuffer(bindingindex, buffer, offset, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglVertexAttribFormat(JNIEnv *env, jclass clazz, jint attribindex, jint size, jint type, jboolean normalized, jint relativeoffset, jlong function_pointer) { + glVertexAttribFormatPROC glVertexAttribFormat = (glVertexAttribFormatPROC)((intptr_t)function_pointer); + glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglVertexAttribIFormat(JNIEnv *env, jclass clazz, jint attribindex, jint size, jint type, jint relativeoffset, jlong function_pointer) { + glVertexAttribIFormatPROC glVertexAttribIFormat = (glVertexAttribIFormatPROC)((intptr_t)function_pointer); + glVertexAttribIFormat(attribindex, size, type, relativeoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglVertexAttribLFormat(JNIEnv *env, jclass clazz, jint attribindex, jint size, jint type, jint relativeoffset, jlong function_pointer) { + glVertexAttribLFormatPROC glVertexAttribLFormat = (glVertexAttribLFormatPROC)((intptr_t)function_pointer); + glVertexAttribLFormat(attribindex, size, type, relativeoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglVertexAttribBinding(JNIEnv *env, jclass clazz, jint attribindex, jint bindingindex, jlong function_pointer) { + glVertexAttribBindingPROC glVertexAttribBinding = (glVertexAttribBindingPROC)((intptr_t)function_pointer); + glVertexAttribBinding(attribindex, bindingindex); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL43_nglVertexBindingDivisor(JNIEnv *env, jclass clazz, jint bindingindex, jint divisor, jlong function_pointer) { + glVertexBindingDivisorPROC glVertexBindingDivisor = (glVertexBindingDivisorPROC)((intptr_t)function_pointer); + glVertexBindingDivisor(bindingindex, divisor); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL44.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL44.c new file mode 100644 index 0000000..e654aa2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GL44.c @@ -0,0 +1,73 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBufferStoragePROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLbitfield flags); +typedef void (APIENTRY *glClearTexImagePROC) (GLuint texture, GLint level, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glClearTexSubImagePROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data); +typedef void (APIENTRY *glBindBuffersBasePROC) (GLenum target, GLuint first, GLsizei count, const GLuint * buffers); +typedef void (APIENTRY *glBindBuffersRangePROC) (GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes); +typedef void (APIENTRY *glBindTexturesPROC) (GLuint first, GLsizei count, const GLuint * textures); +typedef void (APIENTRY *glBindSamplersPROC) (GLuint first, GLsizei count, const GLuint * samplers); +typedef void (APIENTRY *glBindImageTexturesPROC) (GLuint first, GLsizei count, const GLuint * textures); +typedef void (APIENTRY *glBindVertexBuffersPROC) (GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBufferStorage(JNIEnv *env, jclass clazz, jint target, jlong size, jlong data, jint flags, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferStoragePROC glBufferStorage = (glBufferStoragePROC)((intptr_t)function_pointer); + glBufferStorage(target, size, data_address, flags); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglClearTexImage(JNIEnv *env, jclass clazz, jint texture, jint level, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearTexImagePROC glClearTexImage = (glClearTexImagePROC)((intptr_t)function_pointer); + glClearTexImage(texture, level, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglClearTexSubImage(JNIEnv *env, jclass clazz, jint texture, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong data, jlong function_pointer) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glClearTexSubImagePROC glClearTexSubImage = (glClearTexSubImagePROC)((intptr_t)function_pointer); + glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindBuffersBase(JNIEnv *env, jclass clazz, jint target, jint first, jint count, jlong buffers, jlong function_pointer) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + glBindBuffersBasePROC glBindBuffersBase = (glBindBuffersBasePROC)((intptr_t)function_pointer); + glBindBuffersBase(target, first, count, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindBuffersRange(JNIEnv *env, jclass clazz, jint target, jint first, jint count, jlong buffers, jlong offsets, jlong sizes, jlong function_pointer) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + const GLintptr *offsets_address = (const GLintptr *)(intptr_t)offsets; + const GLsizeiptr *sizes_address = (const GLsizeiptr *)(intptr_t)sizes; + glBindBuffersRangePROC glBindBuffersRange = (glBindBuffersRangePROC)((intptr_t)function_pointer); + glBindBuffersRange(target, first, count, buffers_address, offsets_address, sizes_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindTextures(JNIEnv *env, jclass clazz, jint first, jint count, jlong textures, jlong function_pointer) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + glBindTexturesPROC glBindTextures = (glBindTexturesPROC)((intptr_t)function_pointer); + glBindTextures(first, count, textures_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindSamplers(JNIEnv *env, jclass clazz, jint first, jint count, jlong samplers, jlong function_pointer) { + const GLuint *samplers_address = (const GLuint *)(intptr_t)samplers; + glBindSamplersPROC glBindSamplers = (glBindSamplersPROC)((intptr_t)function_pointer); + glBindSamplers(first, count, samplers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindImageTextures(JNIEnv *env, jclass clazz, jint first, jint count, jlong textures, jlong function_pointer) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + glBindImageTexturesPROC glBindImageTextures = (glBindImageTexturesPROC)((intptr_t)function_pointer); + glBindImageTextures(first, count, textures_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL44_nglBindVertexBuffers(JNIEnv *env, jclass clazz, jint first, jint count, jlong buffers, jlong offsets, jlong strides, jlong function_pointer) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + const GLintptr *offsets_address = (const GLintptr *)(intptr_t)offsets; + const GLsizei *strides_address = (const GLsizei *)(intptr_t)strides; + glBindVertexBuffersPROC glBindVertexBuffers = (glBindVertexBuffersPROC)((intptr_t)function_pointer); + glBindVertexBuffers(first, count, buffers_address, offsets_address, strides_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYFrameTerminator.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYFrameTerminator.c new file mode 100644 index 0000000..46b8509 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYFrameTerminator.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glFrameTerminatorGREMEDYPROC) (); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GREMEDYFrameTerminator_nglFrameTerminatorGREMEDY(JNIEnv *env, jclass clazz, jlong function_pointer) { + glFrameTerminatorGREMEDYPROC glFrameTerminatorGREMEDY = (glFrameTerminatorGREMEDYPROC)((intptr_t)function_pointer); + glFrameTerminatorGREMEDY(); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYStringMarker.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYStringMarker.c new file mode 100644 index 0000000..6bde87a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_GREMEDYStringMarker.c @@ -0,0 +1,13 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glStringMarkerGREMEDYPROC) (GLsizei len, const GLbyte * string); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GREMEDYStringMarker_nglStringMarkerGREMEDY(JNIEnv *env, jclass clazz, jint len, jlong string, jlong function_pointer) { + const GLbyte *string_address = (const GLbyte *)(intptr_t)string; + glStringMarkerGREMEDYPROC glStringMarkerGREMEDY = (glStringMarkerGREMEDYPROC)((intptr_t)function_pointer); + glStringMarkerGREMEDY(len, string_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_INTELMapTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_INTELMapTexture.c new file mode 100644 index 0000000..66d5229 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_INTELMapTexture.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLvoid * (APIENTRY *glMapTexture2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint * stride, GLenum * layout); +typedef void (APIENTRY *glUnmapTexture2DINTELPROC) (GLuint texture, GLint level); +typedef void (APIENTRY *glSyncTextureINTELPROC) (GLuint texture); + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_INTELMapTexture_nglMapTexture2DINTEL(JNIEnv *env, jclass clazz, jint texture, jint level, jlong length, jint access, jlong stride, jlong layout, jobject old_buffer, jlong function_pointer) { + GLint *stride_address = (GLint *)(intptr_t)stride; + GLenum *layout_address = (GLenum *)(intptr_t)layout; + glMapTexture2DINTELPROC glMapTexture2DINTEL = (glMapTexture2DINTELPROC)((intptr_t)function_pointer); + GLvoid * __result = glMapTexture2DINTEL(texture, level, access, stride_address, layout_address); + return safeNewBufferCached(env, __result, length, old_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_INTELMapTexture_nglUnmapTexture2DINTEL(JNIEnv *env, jclass clazz, jint texture, jint level, jlong function_pointer) { + glUnmapTexture2DINTELPROC glUnmapTexture2DINTEL = (glUnmapTexture2DINTELPROC)((intptr_t)function_pointer); + glUnmapTexture2DINTEL(texture, level); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_INTELMapTexture_nglSyncTextureINTEL(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glSyncTextureINTELPROC glSyncTextureINTEL = (glSyncTextureINTELPROC)((intptr_t)function_pointer); + glSyncTextureINTEL(texture); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessMultiDrawIndirect.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessMultiDrawIndirect.c new file mode 100644 index 0000000..bca1268 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessMultiDrawIndirect.c @@ -0,0 +1,32 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMultiDrawArraysIndirectBindlessNVPROC) (GLenum mode, const GLvoid * indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRY *glMultiDrawElementsIndirectBindlessNVPROC) (GLenum mode, GLenum type, const GLvoid * indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessMultiDrawIndirect_nglMultiDrawArraysIndirectBindlessNV(JNIEnv *env, jclass clazz, jint mode, jlong indirect, jint drawCount, jint stride, jint vertexBufferCount, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawArraysIndirectBindlessNVPROC glMultiDrawArraysIndirectBindlessNV = (glMultiDrawArraysIndirectBindlessNVPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectBindlessNV(mode, indirect_address, drawCount, stride, vertexBufferCount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessMultiDrawIndirect_nglMultiDrawArraysIndirectBindlessNVBO(JNIEnv *env, jclass clazz, jint mode, jlong indirect_buffer_offset, jint drawCount, jint stride, jint vertexBufferCount, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawArraysIndirectBindlessNVPROC glMultiDrawArraysIndirectBindlessNV = (glMultiDrawArraysIndirectBindlessNVPROC)((intptr_t)function_pointer); + glMultiDrawArraysIndirectBindlessNV(mode, indirect_address, drawCount, stride, vertexBufferCount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessMultiDrawIndirect_nglMultiDrawElementsIndirectBindlessNV(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect, jint drawCount, jint stride, jint vertexBufferCount, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)indirect; + glMultiDrawElementsIndirectBindlessNVPROC glMultiDrawElementsIndirectBindlessNV = (glMultiDrawElementsIndirectBindlessNVPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectBindlessNV(mode, type, indirect_address, drawCount, stride, vertexBufferCount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessMultiDrawIndirect_nglMultiDrawElementsIndirectBindlessNVBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jint drawCount, jint stride, jint vertexBufferCount, jlong function_pointer) { + const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); + glMultiDrawElementsIndirectBindlessNVPROC glMultiDrawElementsIndirectBindlessNV = (glMultiDrawElementsIndirectBindlessNVPROC)((intptr_t)function_pointer); + glMultiDrawElementsIndirectBindlessNV(mode, type, indirect_address, drawCount, stride, vertexBufferCount); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessTexture.c new file mode 100644 index 0000000..0b98088 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBindlessTexture.c @@ -0,0 +1,91 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GLuint64 (APIENTRY *glGetTextureHandleNVPROC) (GLuint texture); +typedef GLuint64 (APIENTRY *glGetTextureSamplerHandleNVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRY *glMakeTextureHandleResidentNVPROC) (GLuint64 handle); +typedef void (APIENTRY *glMakeTextureHandleNonResidentNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRY *glGetImageHandleNVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRY *glMakeImageHandleResidentNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRY *glMakeImageHandleNonResidentNVPROC) (GLuint64 handle); +typedef void (APIENTRY *glUniformHandleui64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRY *glUniformHandleui64vNVPROC) (GLint location, GLsizei count, const GLuint64 * value); +typedef void (APIENTRY *glProgramUniformHandleui64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRY *glProgramUniformHandleui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 * values); +typedef GLboolean (APIENTRY *glIsTextureHandleResidentNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRY *glIsImageHandleResidentNVPROC) (GLuint64 handle); + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglGetTextureHandleNV(JNIEnv *env, jclass clazz, jint texture, jlong function_pointer) { + glGetTextureHandleNVPROC glGetTextureHandleNV = (glGetTextureHandleNVPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetTextureHandleNV(texture); + return __result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglGetTextureSamplerHandleNV(JNIEnv *env, jclass clazz, jint texture, jint sampler, jlong function_pointer) { + glGetTextureSamplerHandleNVPROC glGetTextureSamplerHandleNV = (glGetTextureSamplerHandleNVPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetTextureSamplerHandleNV(texture, sampler); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglMakeTextureHandleResidentNV(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeTextureHandleResidentNVPROC glMakeTextureHandleResidentNV = (glMakeTextureHandleResidentNVPROC)((intptr_t)function_pointer); + glMakeTextureHandleResidentNV(handle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglMakeTextureHandleNonResidentNV(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeTextureHandleNonResidentNVPROC glMakeTextureHandleNonResidentNV = (glMakeTextureHandleNonResidentNVPROC)((intptr_t)function_pointer); + glMakeTextureHandleNonResidentNV(handle); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglGetImageHandleNV(JNIEnv *env, jclass clazz, jint texture, jint level, jboolean layered, jint layer, jint format, jlong function_pointer) { + glGetImageHandleNVPROC glGetImageHandleNV = (glGetImageHandleNVPROC)((intptr_t)function_pointer); + GLuint64 __result = glGetImageHandleNV(texture, level, layered, layer, format); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglMakeImageHandleResidentNV(JNIEnv *env, jclass clazz, jlong handle, jint access, jlong function_pointer) { + glMakeImageHandleResidentNVPROC glMakeImageHandleResidentNV = (glMakeImageHandleResidentNVPROC)((intptr_t)function_pointer); + glMakeImageHandleResidentNV(handle, access); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglMakeImageHandleNonResidentNV(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glMakeImageHandleNonResidentNVPROC glMakeImageHandleNonResidentNV = (glMakeImageHandleNonResidentNVPROC)((intptr_t)function_pointer); + glMakeImageHandleNonResidentNV(handle); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglUniformHandleui64NV(JNIEnv *env, jclass clazz, jint location, jlong value, jlong function_pointer) { + glUniformHandleui64NVPROC glUniformHandleui64NV = (glUniformHandleui64NVPROC)((intptr_t)function_pointer); + glUniformHandleui64NV(location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglUniformHandleui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64 *value_address = (const GLuint64 *)(intptr_t)value; + glUniformHandleui64vNVPROC glUniformHandleui64vNV = (glUniformHandleui64vNVPROC)((intptr_t)function_pointer); + glUniformHandleui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglProgramUniformHandleui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong value, jlong function_pointer) { + glProgramUniformHandleui64NVPROC glProgramUniformHandleui64NV = (glProgramUniformHandleui64NVPROC)((intptr_t)function_pointer); + glProgramUniformHandleui64NV(program, location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglProgramUniformHandleui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong values, jlong function_pointer) { + const GLuint64 *values_address = (const GLuint64 *)(intptr_t)values; + glProgramUniformHandleui64vNVPROC glProgramUniformHandleui64vNV = (glProgramUniformHandleui64vNVPROC)((intptr_t)function_pointer); + glProgramUniformHandleui64vNV(program, location, count, values_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglIsTextureHandleResidentNV(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glIsTextureHandleResidentNVPROC glIsTextureHandleResidentNV = (glIsTextureHandleResidentNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsTextureHandleResidentNV(handle); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVBindlessTexture_nglIsImageHandleResidentNV(JNIEnv *env, jclass clazz, jlong handle, jlong function_pointer) { + glIsImageHandleResidentNVPROC glIsImageHandleResidentNV = (glIsImageHandleResidentNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsImageHandleResidentNV(handle); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBlendEquationAdvanced.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBlendEquationAdvanced.c new file mode 100644 index 0000000..9eeece8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVBlendEquationAdvanced.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBlendParameteriNVPROC) (GLenum pname, GLint value); +typedef void (APIENTRY *glBlendBarrierNVPROC) (); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBlendEquationAdvanced_nglBlendParameteriNV(JNIEnv *env, jclass clazz, jint pname, jint value, jlong function_pointer) { + glBlendParameteriNVPROC glBlendParameteriNV = (glBlendParameteriNVPROC)((intptr_t)function_pointer); + glBlendParameteriNV(pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBlendEquationAdvanced_nglBlendBarrierNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glBlendBarrierNVPROC glBlendBarrierNV = (glBlendBarrierNVPROC)((intptr_t)function_pointer); + glBlendBarrierNV(); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVConditionalRender.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVConditionalRender.c new file mode 100644 index 0000000..1026cdb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVConditionalRender.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBeginConditionalRenderNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRY *glEndConditionalRenderNVPROC) (); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVConditionalRender_nglBeginConditionalRenderNV(JNIEnv *env, jclass clazz, jint id, jint mode, jlong function_pointer) { + glBeginConditionalRenderNVPROC glBeginConditionalRenderNV = (glBeginConditionalRenderNVPROC)((intptr_t)function_pointer); + glBeginConditionalRenderNV(id, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVConditionalRender_nglEndConditionalRenderNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndConditionalRenderNVPROC glEndConditionalRenderNV = (glEndConditionalRenderNVPROC)((intptr_t)function_pointer); + glEndConditionalRenderNV(); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVCopyImage.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVCopyImage.c new file mode 100644 index 0000000..8008e77 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVCopyImage.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glCopyImageSubDataNVPROC) (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); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVCopyImage_nglCopyImageSubDataNV(JNIEnv *env, jclass clazz, jint srcName, jint srcTarget, jint srcLevel, jint srcX, jint srcY, jint srcZ, jint dstName, jint dstTarget, jint dstLevel, jint dstX, jint dstY, jint dstZ, jint width, jint height, jint depth, jlong function_pointer) { + glCopyImageSubDataNVPROC glCopyImageSubDataNV = (glCopyImageSubDataNVPROC)((intptr_t)function_pointer); + glCopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDepthBufferFloat.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDepthBufferFloat.c new file mode 100644 index 0000000..f7db3ee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDepthBufferFloat.c @@ -0,0 +1,24 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDepthRangedNVPROC) (GLdouble n, GLdouble f); +typedef void (APIENTRY *glClearDepthdNVPROC) (GLdouble d); +typedef void (APIENTRY *glDepthBoundsdNVPROC) (GLdouble zmin, GLdouble zmax); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVDepthBufferFloat_nglDepthRangedNV(JNIEnv *env, jclass clazz, jdouble n, jdouble f, jlong function_pointer) { + glDepthRangedNVPROC glDepthRangedNV = (glDepthRangedNVPROC)((intptr_t)function_pointer); + glDepthRangedNV(n, f); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVDepthBufferFloat_nglClearDepthdNV(JNIEnv *env, jclass clazz, jdouble d, jlong function_pointer) { + glClearDepthdNVPROC glClearDepthdNV = (glClearDepthdNVPROC)((intptr_t)function_pointer); + glClearDepthdNV(d); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVDepthBufferFloat_nglDepthBoundsdNV(JNIEnv *env, jclass clazz, jdouble zmin, jdouble zmax, jlong function_pointer) { + glDepthBoundsdNVPROC glDepthBoundsdNV = (glDepthBoundsdNVPROC)((intptr_t)function_pointer); + glDepthBoundsdNV(zmin, zmax); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDrawTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDrawTexture.c new file mode 100644 index 0000000..c8ca713 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVDrawTexture.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glDrawTextureNVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVDrawTexture_nglDrawTextureNV(JNIEnv *env, jclass clazz, jint texture, jint sampler, jfloat x0, jfloat y0, jfloat x1, jfloat y1, jfloat z, jfloat s0, jfloat t0, jfloat s1, jfloat t1, jlong function_pointer) { + glDrawTextureNVPROC glDrawTextureNV = (glDrawTextureNVPROC)((intptr_t)function_pointer); + glDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVEvaluators.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVEvaluators.c new file mode 100644 index 0000000..edd31ee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVEvaluators.c @@ -0,0 +1,68 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetMapControlPointsNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, const GLvoid * pPoints); +typedef void (APIENTRY *glMapControlPointsNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * pPoints); +typedef void (APIENTRY *glMapParameterfvNVPROC) (GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glMapParameterivNVPROC) (GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glGetMapParameterfvNVPROC) (GLenum target, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glGetMapParameterivNVPROC) (GLenum target, GLenum pname, const GLint * params); +typedef void (APIENTRY *glGetMapAttribParameterfvNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetMapAttribParameterivNVPROC) (GLenum target, GLuint index, GLenum pname, GLint * params); +typedef void (APIENTRY *glEvalMapsNVPROC) (GLenum target, GLenum mode); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglGetMapControlPointsNV(JNIEnv *env, jclass clazz, jint target, jint index, jint type, jint ustride, jint vstride, jboolean packed, jlong pPoints, jlong function_pointer) { + const GLvoid *pPoints_address = (const GLvoid *)(intptr_t)pPoints; + glGetMapControlPointsNVPROC glGetMapControlPointsNV = (glGetMapControlPointsNVPROC)((intptr_t)function_pointer); + glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, pPoints_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglMapControlPointsNV(JNIEnv *env, jclass clazz, jint target, jint index, jint type, jint ustride, jint vstride, jint uorder, jint vorder, jboolean packed, jlong pPoints, jlong function_pointer) { + const GLvoid *pPoints_address = (const GLvoid *)(intptr_t)pPoints; + glMapControlPointsNVPROC glMapControlPointsNV = (glMapControlPointsNVPROC)((intptr_t)function_pointer); + glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, pPoints_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglMapParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glMapParameterfvNVPROC glMapParameterfvNV = (glMapParameterfvNVPROC)((intptr_t)function_pointer); + glMapParameterfvNV(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglMapParameterivNV(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glMapParameterivNVPROC glMapParameterivNV = (glMapParameterivNVPROC)((intptr_t)function_pointer); + glMapParameterivNV(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglGetMapParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glGetMapParameterfvNVPROC glGetMapParameterfvNV = (glGetMapParameterfvNVPROC)((intptr_t)function_pointer); + glGetMapParameterfvNV(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglGetMapParameterivNV(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glGetMapParameterivNVPROC glGetMapParameterivNV = (glGetMapParameterivNVPROC)((intptr_t)function_pointer); + glGetMapParameterivNV(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglGetMapAttribParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetMapAttribParameterfvNVPROC glGetMapAttribParameterfvNV = (glGetMapAttribParameterfvNVPROC)((intptr_t)function_pointer); + glGetMapAttribParameterfvNV(target, index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglGetMapAttribParameterivNV(JNIEnv *env, jclass clazz, jint target, jint index, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetMapAttribParameterivNVPROC glGetMapAttribParameterivNV = (glGetMapAttribParameterivNVPROC)((intptr_t)function_pointer); + glGetMapAttribParameterivNV(target, index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVEvaluators_nglEvalMapsNV(JNIEnv *env, jclass clazz, jint target, jint mode, jlong function_pointer) { + glEvalMapsNVPROC glEvalMapsNV = (glEvalMapsNVPROC)((intptr_t)function_pointer); + glEvalMapsNV(target, mode); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVExplicitMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVExplicitMultisample.c new file mode 100644 index 0000000..554b778 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVExplicitMultisample.c @@ -0,0 +1,25 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGetMultisamplefvNVPROC) (GLenum pname, GLuint index, GLfloat * val); +typedef void (APIENTRY *glSampleMaskIndexedNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRY *glTexRenderbufferNVPROC) (GLenum target, GLuint renderbuffer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVExplicitMultisample_nglGetMultisamplefvNV(JNIEnv *env, jclass clazz, jint pname, jint index, jlong val, jlong function_pointer) { + GLfloat *val_address = (GLfloat *)(intptr_t)val; + glGetMultisamplefvNVPROC glGetMultisamplefvNV = (glGetMultisamplefvNVPROC)((intptr_t)function_pointer); + glGetMultisamplefvNV(pname, index, val_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVExplicitMultisample_nglSampleMaskIndexedNV(JNIEnv *env, jclass clazz, jint index, jint mask, jlong function_pointer) { + glSampleMaskIndexedNVPROC glSampleMaskIndexedNV = (glSampleMaskIndexedNVPROC)((intptr_t)function_pointer); + glSampleMaskIndexedNV(index, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVExplicitMultisample_nglTexRenderbufferNV(JNIEnv *env, jclass clazz, jint target, jint renderbuffer, jlong function_pointer) { + glTexRenderbufferNVPROC glTexRenderbufferNV = (glTexRenderbufferNVPROC)((intptr_t)function_pointer); + glTexRenderbufferNV(target, renderbuffer); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFence.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFence.c new file mode 100644 index 0000000..9b754dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFence.c @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGenFencesNVPROC) (GLsizei n, GLuint * piFences); +typedef void (APIENTRY *glDeleteFencesNVPROC) (GLsizei n, const GLuint * piFences); +typedef void (APIENTRY *glSetFenceNVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (APIENTRY *glTestFenceNVPROC) (GLuint fence); +typedef void (APIENTRY *glFinishFenceNVPROC) (GLuint fence); +typedef GLboolean (APIENTRY *glIsFenceNVPROC) (GLuint fence); +typedef void (APIENTRY *glGetFenceivNVPROC) (GLuint fence, GLenum pname, GLint * piParams); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFence_nglGenFencesNV(JNIEnv *env, jclass clazz, jint n, jlong piFences, jlong function_pointer) { + GLuint *piFences_address = (GLuint *)(intptr_t)piFences; + glGenFencesNVPROC glGenFencesNV = (glGenFencesNVPROC)((intptr_t)function_pointer); + glGenFencesNV(n, piFences_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFence_nglDeleteFencesNV(JNIEnv *env, jclass clazz, jint n, jlong piFences, jlong function_pointer) { + const GLuint *piFences_address = (const GLuint *)(intptr_t)piFences; + glDeleteFencesNVPROC glDeleteFencesNV = (glDeleteFencesNVPROC)((intptr_t)function_pointer); + glDeleteFencesNV(n, piFences_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFence_nglSetFenceNV(JNIEnv *env, jclass clazz, jint fence, jint condition, jlong function_pointer) { + glSetFenceNVPROC glSetFenceNV = (glSetFenceNVPROC)((intptr_t)function_pointer); + glSetFenceNV(fence, condition); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVFence_nglTestFenceNV(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glTestFenceNVPROC glTestFenceNV = (glTestFenceNVPROC)((intptr_t)function_pointer); + GLboolean __result = glTestFenceNV(fence); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFence_nglFinishFenceNV(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glFinishFenceNVPROC glFinishFenceNV = (glFinishFenceNVPROC)((intptr_t)function_pointer); + glFinishFenceNV(fence); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVFence_nglIsFenceNV(JNIEnv *env, jclass clazz, jint fence, jlong function_pointer) { + glIsFenceNVPROC glIsFenceNV = (glIsFenceNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsFenceNV(fence); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFence_nglGetFenceivNV(JNIEnv *env, jclass clazz, jint fence, jint pname, jlong piParams, jlong function_pointer) { + GLint *piParams_address = (GLint *)(intptr_t)piParams; + glGetFenceivNVPROC glGetFenceivNV = (glGetFenceivNVPROC)((intptr_t)function_pointer); + glGetFenceivNV(fence, pname, piParams_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFragmentProgram.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFragmentProgram.c new file mode 100644 index 0000000..efd086b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFragmentProgram.c @@ -0,0 +1,36 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramNamedParameter4fNVPROC) (GLuint id, GLsizei length, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glProgramNamedParameter4dNVPROC) (GLuint id, GLsizei length, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glGetProgramNamedParameterfvNVPROC) (GLuint id, GLsizei length, const GLubyte * name, GLfloat * params); +typedef void (APIENTRY *glGetProgramNamedParameterdvNVPROC) (GLuint id, GLsizei length, const GLubyte * name, GLdouble * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFragmentProgram_nglProgramNamedParameter4fNV(JNIEnv *env, jclass clazz, jint id, jint length, jlong name, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + const GLubyte *name_address = (const GLubyte *)(intptr_t)name; + glProgramNamedParameter4fNVPROC glProgramNamedParameter4fNV = (glProgramNamedParameter4fNVPROC)((intptr_t)function_pointer); + glProgramNamedParameter4fNV(id, length, name_address, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFragmentProgram_nglProgramNamedParameter4dNV(JNIEnv *env, jclass clazz, jint id, jint length, jlong name, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + const GLubyte *name_address = (const GLubyte *)(intptr_t)name; + glProgramNamedParameter4dNVPROC glProgramNamedParameter4dNV = (glProgramNamedParameter4dNVPROC)((intptr_t)function_pointer); + glProgramNamedParameter4dNV(id, length, name_address, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFragmentProgram_nglGetProgramNamedParameterfvNV(JNIEnv *env, jclass clazz, jint id, jint length, jlong name, jlong params, jlong function_pointer) { + const GLubyte *name_address = (const GLubyte *)(intptr_t)name; + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetProgramNamedParameterfvNVPROC glGetProgramNamedParameterfvNV = (glGetProgramNamedParameterfvNVPROC)((intptr_t)function_pointer); + glGetProgramNamedParameterfvNV(id, length, name_address, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFragmentProgram_nglGetProgramNamedParameterdvNV(JNIEnv *env, jclass clazz, jint id, jint length, jlong name, jlong params, jlong function_pointer) { + const GLubyte *name_address = (const GLubyte *)(intptr_t)name; + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetProgramNamedParameterdvNVPROC glGetProgramNamedParameterdvNV = (glGetProgramNamedParameterdvNVPROC)((intptr_t)function_pointer); + glGetProgramNamedParameterdvNV(id, length, name_address, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFramebufferMultisampleCoverage.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFramebufferMultisampleCoverage.c new file mode 100644 index 0000000..a4a3545 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVFramebufferMultisampleCoverage.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glRenderbufferStorageMultisampleCoverageNVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVFramebufferMultisampleCoverage_nglRenderbufferStorageMultisampleCoverageNV(JNIEnv *env, jclass clazz, jint target, jint coverageSamples, jint colorSamples, jint internalformat, jint width, jint height, jlong function_pointer) { + glRenderbufferStorageMultisampleCoverageNVPROC glRenderbufferStorageMultisampleCoverageNV = (glRenderbufferStorageMultisampleCoverageNVPROC)((intptr_t)function_pointer); + glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGeometryProgram4.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGeometryProgram4.c new file mode 100644 index 0000000..0f23996 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGeometryProgram4.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramVertexLimitNVPROC) (GLenum target, GLint limit); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGeometryProgram4_nglProgramVertexLimitNV(JNIEnv *env, jclass clazz, jint target, jint limit, jlong function_pointer) { + glProgramVertexLimitNVPROC glProgramVertexLimitNV = (glProgramVertexLimitNVPROC)((intptr_t)function_pointer); + glProgramVertexLimitNV(target, limit); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuProgram4.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuProgram4.c new file mode 100644 index 0000000..f74de4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuProgram4.c @@ -0,0 +1,114 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramLocalParameterI4iNVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glProgramLocalParameterI4ivNVPROC) (GLenum target, GLuint index, const GLint * params); +typedef void (APIENTRY *glProgramLocalParametersI4ivNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (APIENTRY *glProgramLocalParameterI4uiNVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRY *glProgramLocalParameterI4uivNVPROC) (GLenum target, GLuint index, const GLuint * params); +typedef void (APIENTRY *glProgramLocalParametersI4uivNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (APIENTRY *glProgramEnvParameterI4iNVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRY *glProgramEnvParameterI4ivNVPROC) (GLenum target, GLuint index, const GLint * params); +typedef void (APIENTRY *glProgramEnvParametersI4ivNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (APIENTRY *glProgramEnvParameterI4uiNVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRY *glProgramEnvParameterI4uivNVPROC) (GLenum target, GLuint index, const GLuint * params); +typedef void (APIENTRY *glProgramEnvParametersI4uivNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (APIENTRY *glGetProgramLocalParameterIivNVPROC) (GLenum target, GLuint index, GLint * params); +typedef void (APIENTRY *glGetProgramLocalParameterIuivNVPROC) (GLenum target, GLuint index, GLuint * params); +typedef void (APIENTRY *glGetProgramEnvParameterIivNVPROC) (GLenum target, GLuint index, GLint * params); +typedef void (APIENTRY *glGetProgramEnvParameterIuivNVPROC) (GLenum target, GLuint index, GLuint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParameterI4iNV(JNIEnv *env, jclass clazz, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glProgramLocalParameterI4iNVPROC glProgramLocalParameterI4iNV = (glProgramLocalParameterI4iNVPROC)((intptr_t)function_pointer); + glProgramLocalParameterI4iNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParameterI4ivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glProgramLocalParameterI4ivNVPROC glProgramLocalParameterI4ivNV = (glProgramLocalParameterI4ivNVPROC)((intptr_t)function_pointer); + glProgramLocalParameterI4ivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParametersI4ivNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glProgramLocalParametersI4ivNVPROC glProgramLocalParametersI4ivNV = (glProgramLocalParametersI4ivNVPROC)((intptr_t)function_pointer); + glProgramLocalParametersI4ivNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParameterI4uiNV(JNIEnv *env, jclass clazz, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glProgramLocalParameterI4uiNVPROC glProgramLocalParameterI4uiNV = (glProgramLocalParameterI4uiNVPROC)((intptr_t)function_pointer); + glProgramLocalParameterI4uiNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParameterI4uivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glProgramLocalParameterI4uivNVPROC glProgramLocalParameterI4uivNV = (glProgramLocalParameterI4uivNVPROC)((intptr_t)function_pointer); + glProgramLocalParameterI4uivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramLocalParametersI4uivNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glProgramLocalParametersI4uivNVPROC glProgramLocalParametersI4uivNV = (glProgramLocalParametersI4uivNVPROC)((intptr_t)function_pointer); + glProgramLocalParametersI4uivNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParameterI4iNV(JNIEnv *env, jclass clazz, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glProgramEnvParameterI4iNVPROC glProgramEnvParameterI4iNV = (glProgramEnvParameterI4iNVPROC)((intptr_t)function_pointer); + glProgramEnvParameterI4iNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParameterI4ivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glProgramEnvParameterI4ivNVPROC glProgramEnvParameterI4ivNV = (glProgramEnvParameterI4ivNVPROC)((intptr_t)function_pointer); + glProgramEnvParameterI4ivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParametersI4ivNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glProgramEnvParametersI4ivNVPROC glProgramEnvParametersI4ivNV = (glProgramEnvParametersI4ivNVPROC)((intptr_t)function_pointer); + glProgramEnvParametersI4ivNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParameterI4uiNV(JNIEnv *env, jclass clazz, jint target, jint index, jint x, jint y, jint z, jint w, jlong function_pointer) { + glProgramEnvParameterI4uiNVPROC glProgramEnvParameterI4uiNV = (glProgramEnvParameterI4uiNVPROC)((intptr_t)function_pointer); + glProgramEnvParameterI4uiNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParameterI4uivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glProgramEnvParameterI4uivNVPROC glProgramEnvParameterI4uivNV = (glProgramEnvParameterI4uivNVPROC)((intptr_t)function_pointer); + glProgramEnvParameterI4uivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglProgramEnvParametersI4uivNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glProgramEnvParametersI4uivNVPROC glProgramEnvParametersI4uivNV = (glProgramEnvParametersI4uivNVPROC)((intptr_t)function_pointer); + glProgramEnvParametersI4uivNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglGetProgramLocalParameterIivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramLocalParameterIivNVPROC glGetProgramLocalParameterIivNV = (glGetProgramLocalParameterIivNVPROC)((intptr_t)function_pointer); + glGetProgramLocalParameterIivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglGetProgramLocalParameterIuivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetProgramLocalParameterIuivNVPROC glGetProgramLocalParameterIuivNV = (glGetProgramLocalParameterIuivNVPROC)((intptr_t)function_pointer); + glGetProgramLocalParameterIuivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglGetProgramEnvParameterIivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramEnvParameterIivNVPROC glGetProgramEnvParameterIivNV = (glGetProgramEnvParameterIivNVPROC)((intptr_t)function_pointer); + glGetProgramEnvParameterIivNV(target, index, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuProgram4_nglGetProgramEnvParameterIuivNV(JNIEnv *env, jclass clazz, jint target, jint index, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetProgramEnvParameterIuivNVPROC glGetProgramEnvParameterIuivNV = (glGetProgramEnvParameterIuivNVPROC)((intptr_t)function_pointer); + glGetProgramEnvParameterIuivNV(target, index, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuShader5.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuShader5.c new file mode 100644 index 0000000..233bdbd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVGpuShader5.c @@ -0,0 +1,228 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glUniform1i64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRY *glUniform2i64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRY *glUniform3i64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRY *glUniform4i64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRY *glUniform1i64vNVPROC) (GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glUniform2i64vNVPROC) (GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glUniform3i64vNVPROC) (GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glUniform4i64vNVPROC) (GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glUniform1ui64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRY *glUniform2ui64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRY *glUniform3ui64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRY *glUniform4ui64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRY *glUniform1ui64vNVPROC) (GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glUniform2ui64vNVPROC) (GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glUniform3ui64vNVPROC) (GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glUniform4ui64vNVPROC) (GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glGetUniformi64vNVPROC) (GLuint program, GLint location, GLint64EXT * params); +typedef void (APIENTRY *glGetUniformui64vNVPROC) (GLuint program, GLint location, GLuint64EXT * params); +typedef void (APIENTRY *glProgramUniform1i64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRY *glProgramUniform2i64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRY *glProgramUniform3i64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRY *glProgramUniform4i64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRY *glProgramUniform1i64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glProgramUniform2i64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glProgramUniform3i64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glProgramUniform4i64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (APIENTRY *glProgramUniform1ui64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRY *glProgramUniform2ui64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRY *glProgramUniform3ui64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRY *glProgramUniform4ui64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRY *glProgramUniform1ui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glProgramUniform2ui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glProgramUniform3ui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glProgramUniform4ui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform1i64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong function_pointer) { + glUniform1i64NVPROC glUniform1i64NV = (glUniform1i64NVPROC)((intptr_t)function_pointer); + glUniform1i64NV(location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform2i64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong function_pointer) { + glUniform2i64NVPROC glUniform2i64NV = (glUniform2i64NVPROC)((intptr_t)function_pointer); + glUniform2i64NV(location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform3i64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong z, jlong function_pointer) { + glUniform3i64NVPROC glUniform3i64NV = (glUniform3i64NVPROC)((intptr_t)function_pointer); + glUniform3i64NV(location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform4i64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glUniform4i64NVPROC glUniform4i64NV = (glUniform4i64NVPROC)((intptr_t)function_pointer); + glUniform4i64NV(location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform1i64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glUniform1i64vNVPROC glUniform1i64vNV = (glUniform1i64vNVPROC)((intptr_t)function_pointer); + glUniform1i64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform2i64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glUniform2i64vNVPROC glUniform2i64vNV = (glUniform2i64vNVPROC)((intptr_t)function_pointer); + glUniform2i64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform3i64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glUniform3i64vNVPROC glUniform3i64vNV = (glUniform3i64vNVPROC)((intptr_t)function_pointer); + glUniform3i64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform4i64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glUniform4i64vNVPROC glUniform4i64vNV = (glUniform4i64vNVPROC)((intptr_t)function_pointer); + glUniform4i64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform1ui64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong function_pointer) { + glUniform1ui64NVPROC glUniform1ui64NV = (glUniform1ui64NVPROC)((intptr_t)function_pointer); + glUniform1ui64NV(location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform2ui64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong function_pointer) { + glUniform2ui64NVPROC glUniform2ui64NV = (glUniform2ui64NVPROC)((intptr_t)function_pointer); + glUniform2ui64NV(location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform3ui64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong z, jlong function_pointer) { + glUniform3ui64NVPROC glUniform3ui64NV = (glUniform3ui64NVPROC)((intptr_t)function_pointer); + glUniform3ui64NV(location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform4ui64NV(JNIEnv *env, jclass clazz, jint location, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glUniform4ui64NVPROC glUniform4ui64NV = (glUniform4ui64NVPROC)((intptr_t)function_pointer); + glUniform4ui64NV(location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform1ui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glUniform1ui64vNVPROC glUniform1ui64vNV = (glUniform1ui64vNVPROC)((intptr_t)function_pointer); + glUniform1ui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform2ui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glUniform2ui64vNVPROC glUniform2ui64vNV = (glUniform2ui64vNVPROC)((intptr_t)function_pointer); + glUniform2ui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform3ui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glUniform3ui64vNVPROC glUniform3ui64vNV = (glUniform3ui64vNVPROC)((intptr_t)function_pointer); + glUniform3ui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglUniform4ui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glUniform4ui64vNVPROC glUniform4ui64vNV = (glUniform4ui64vNVPROC)((intptr_t)function_pointer); + glUniform4ui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglGetUniformi64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLint64EXT *params_address = (GLint64EXT *)(intptr_t)params; + glGetUniformi64vNVPROC glGetUniformi64vNV = (glGetUniformi64vNVPROC)((intptr_t)function_pointer); + glGetUniformi64vNV(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglGetUniformui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetUniformui64vNVPROC glGetUniformui64vNV = (glGetUniformui64vNVPROC)((intptr_t)function_pointer); + glGetUniformui64vNV(program, location, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform1i64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong function_pointer) { + glProgramUniform1i64NVPROC glProgramUniform1i64NV = (glProgramUniform1i64NVPROC)((intptr_t)function_pointer); + glProgramUniform1i64NV(program, location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform2i64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong function_pointer) { + glProgramUniform2i64NVPROC glProgramUniform2i64NV = (glProgramUniform2i64NVPROC)((intptr_t)function_pointer); + glProgramUniform2i64NV(program, location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform3i64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong z, jlong function_pointer) { + glProgramUniform3i64NVPROC glProgramUniform3i64NV = (glProgramUniform3i64NVPROC)((intptr_t)function_pointer); + glProgramUniform3i64NV(program, location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform4i64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glProgramUniform4i64NVPROC glProgramUniform4i64NV = (glProgramUniform4i64NVPROC)((intptr_t)function_pointer); + glProgramUniform4i64NV(program, location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform1i64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glProgramUniform1i64vNVPROC glProgramUniform1i64vNV = (glProgramUniform1i64vNVPROC)((intptr_t)function_pointer); + glProgramUniform1i64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform2i64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glProgramUniform2i64vNVPROC glProgramUniform2i64vNV = (glProgramUniform2i64vNVPROC)((intptr_t)function_pointer); + glProgramUniform2i64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform3i64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glProgramUniform3i64vNVPROC glProgramUniform3i64vNV = (glProgramUniform3i64vNVPROC)((intptr_t)function_pointer); + glProgramUniform3i64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform4i64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLint64EXT *value_address = (const GLint64EXT *)(intptr_t)value; + glProgramUniform4i64vNVPROC glProgramUniform4i64vNV = (glProgramUniform4i64vNVPROC)((intptr_t)function_pointer); + glProgramUniform4i64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform1ui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong function_pointer) { + glProgramUniform1ui64NVPROC glProgramUniform1ui64NV = (glProgramUniform1ui64NVPROC)((intptr_t)function_pointer); + glProgramUniform1ui64NV(program, location, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform2ui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong function_pointer) { + glProgramUniform2ui64NVPROC glProgramUniform2ui64NV = (glProgramUniform2ui64NVPROC)((intptr_t)function_pointer); + glProgramUniform2ui64NV(program, location, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform3ui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong z, jlong function_pointer) { + glProgramUniform3ui64NVPROC glProgramUniform3ui64NV = (glProgramUniform3ui64NVPROC)((intptr_t)function_pointer); + glProgramUniform3ui64NV(program, location, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform4ui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glProgramUniform4ui64NVPROC glProgramUniform4ui64NV = (glProgramUniform4ui64NVPROC)((intptr_t)function_pointer); + glProgramUniform4ui64NV(program, location, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform1ui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glProgramUniform1ui64vNVPROC glProgramUniform1ui64vNV = (glProgramUniform1ui64vNVPROC)((intptr_t)function_pointer); + glProgramUniform1ui64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform2ui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glProgramUniform2ui64vNVPROC glProgramUniform2ui64vNV = (glProgramUniform2ui64vNVPROC)((intptr_t)function_pointer); + glProgramUniform2ui64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform3ui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glProgramUniform3ui64vNVPROC glProgramUniform3ui64vNV = (glProgramUniform3ui64vNVPROC)((intptr_t)function_pointer); + glProgramUniform3ui64vNV(program, location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVGpuShader5_nglProgramUniform4ui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glProgramUniform4ui64vNVPROC glProgramUniform4ui64vNV = (glProgramUniform4ui64vNVPROC)((intptr_t)function_pointer); + glProgramUniform4ui64vNV(program, location, count, value_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVHalfFloat.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVHalfFloat.c new file mode 100644 index 0000000..389d076 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVHalfFloat.c @@ -0,0 +1,160 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertex2hNVPROC) (GLhalf x, GLhalf y); +typedef void (APIENTRY *glVertex3hNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (APIENTRY *glVertex4hNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (APIENTRY *glNormal3hNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (APIENTRY *glColor3hNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (APIENTRY *glColor4hNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (APIENTRY *glTexCoord1hNVPROC) (GLhalf s); +typedef void (APIENTRY *glTexCoord2hNVPROC) (GLhalf s, GLhalf t); +typedef void (APIENTRY *glTexCoord3hNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (APIENTRY *glTexCoord4hNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (APIENTRY *glMultiTexCoord1hNVPROC) (GLenum target, GLhalf s); +typedef void (APIENTRY *glMultiTexCoord2hNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (APIENTRY *glMultiTexCoord3hNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (APIENTRY *glMultiTexCoord4hNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (APIENTRY *glFogCoordhNVPROC) (GLhalf fog); +typedef void (APIENTRY *glSecondaryColor3hNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (APIENTRY *glVertexWeighthNVPROC) (GLhalf weight); +typedef void (APIENTRY *glVertexAttrib1hNVPROC) (GLuint index, GLhalf x); +typedef void (APIENTRY *glVertexAttrib2hNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (APIENTRY *glVertexAttrib3hNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (APIENTRY *glVertexAttrib4hNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (APIENTRY *glVertexAttribs1hvNVPROC) (GLuint index, GLsizei n, const GLhalf * attribs); +typedef void (APIENTRY *glVertexAttribs2hvNVPROC) (GLuint index, GLsizei n, const GLhalf * attribs); +typedef void (APIENTRY *glVertexAttribs3hvNVPROC) (GLuint index, GLsizei n, const GLhalf * attribs); +typedef void (APIENTRY *glVertexAttribs4hvNVPROC) (GLuint index, GLsizei n, const GLhalf * attribs); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertex2hNV(JNIEnv *env, jclass clazz, jshort x, jshort y, jlong function_pointer) { + glVertex2hNVPROC glVertex2hNV = (glVertex2hNVPROC)((intptr_t)function_pointer); + glVertex2hNV(x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertex3hNV(JNIEnv *env, jclass clazz, jshort x, jshort y, jshort z, jlong function_pointer) { + glVertex3hNVPROC glVertex3hNV = (glVertex3hNVPROC)((intptr_t)function_pointer); + glVertex3hNV(x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertex4hNV(JNIEnv *env, jclass clazz, jshort x, jshort y, jshort z, jshort w, jlong function_pointer) { + glVertex4hNVPROC glVertex4hNV = (glVertex4hNVPROC)((intptr_t)function_pointer); + glVertex4hNV(x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglNormal3hNV(JNIEnv *env, jclass clazz, jshort nx, jshort ny, jshort nz, jlong function_pointer) { + glNormal3hNVPROC glNormal3hNV = (glNormal3hNVPROC)((intptr_t)function_pointer); + glNormal3hNV(nx, ny, nz); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglColor3hNV(JNIEnv *env, jclass clazz, jshort red, jshort green, jshort blue, jlong function_pointer) { + glColor3hNVPROC glColor3hNV = (glColor3hNVPROC)((intptr_t)function_pointer); + glColor3hNV(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglColor4hNV(JNIEnv *env, jclass clazz, jshort red, jshort green, jshort blue, jshort alpha, jlong function_pointer) { + glColor4hNVPROC glColor4hNV = (glColor4hNVPROC)((intptr_t)function_pointer); + glColor4hNV(red, green, blue, alpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglTexCoord1hNV(JNIEnv *env, jclass clazz, jshort s, jlong function_pointer) { + glTexCoord1hNVPROC glTexCoord1hNV = (glTexCoord1hNVPROC)((intptr_t)function_pointer); + glTexCoord1hNV(s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglTexCoord2hNV(JNIEnv *env, jclass clazz, jshort s, jshort t, jlong function_pointer) { + glTexCoord2hNVPROC glTexCoord2hNV = (glTexCoord2hNVPROC)((intptr_t)function_pointer); + glTexCoord2hNV(s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglTexCoord3hNV(JNIEnv *env, jclass clazz, jshort s, jshort t, jshort r, jlong function_pointer) { + glTexCoord3hNVPROC glTexCoord3hNV = (glTexCoord3hNVPROC)((intptr_t)function_pointer); + glTexCoord3hNV(s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglTexCoord4hNV(JNIEnv *env, jclass clazz, jshort s, jshort t, jshort r, jshort q, jlong function_pointer) { + glTexCoord4hNVPROC glTexCoord4hNV = (glTexCoord4hNVPROC)((intptr_t)function_pointer); + glTexCoord4hNV(s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglMultiTexCoord1hNV(JNIEnv *env, jclass clazz, jint target, jshort s, jlong function_pointer) { + glMultiTexCoord1hNVPROC glMultiTexCoord1hNV = (glMultiTexCoord1hNVPROC)((intptr_t)function_pointer); + glMultiTexCoord1hNV(target, s); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglMultiTexCoord2hNV(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jlong function_pointer) { + glMultiTexCoord2hNVPROC glMultiTexCoord2hNV = (glMultiTexCoord2hNVPROC)((intptr_t)function_pointer); + glMultiTexCoord2hNV(target, s, t); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglMultiTexCoord3hNV(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jshort r, jlong function_pointer) { + glMultiTexCoord3hNVPROC glMultiTexCoord3hNV = (glMultiTexCoord3hNVPROC)((intptr_t)function_pointer); + glMultiTexCoord3hNV(target, s, t, r); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglMultiTexCoord4hNV(JNIEnv *env, jclass clazz, jint target, jshort s, jshort t, jshort r, jshort q, jlong function_pointer) { + glMultiTexCoord4hNVPROC glMultiTexCoord4hNV = (glMultiTexCoord4hNVPROC)((intptr_t)function_pointer); + glMultiTexCoord4hNV(target, s, t, r, q); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglFogCoordhNV(JNIEnv *env, jclass clazz, jshort fog, jlong function_pointer) { + glFogCoordhNVPROC glFogCoordhNV = (glFogCoordhNVPROC)((intptr_t)function_pointer); + glFogCoordhNV(fog); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglSecondaryColor3hNV(JNIEnv *env, jclass clazz, jshort red, jshort green, jshort blue, jlong function_pointer) { + glSecondaryColor3hNVPROC glSecondaryColor3hNV = (glSecondaryColor3hNVPROC)((intptr_t)function_pointer); + glSecondaryColor3hNV(red, green, blue); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexWeighthNV(JNIEnv *env, jclass clazz, jshort weight, jlong function_pointer) { + glVertexWeighthNVPROC glVertexWeighthNV = (glVertexWeighthNVPROC)((intptr_t)function_pointer); + glVertexWeighthNV(weight); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttrib1hNV(JNIEnv *env, jclass clazz, jint index, jshort x, jlong function_pointer) { + glVertexAttrib1hNVPROC glVertexAttrib1hNV = (glVertexAttrib1hNVPROC)((intptr_t)function_pointer); + glVertexAttrib1hNV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttrib2hNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jlong function_pointer) { + glVertexAttrib2hNVPROC glVertexAttrib2hNV = (glVertexAttrib2hNVPROC)((intptr_t)function_pointer); + glVertexAttrib2hNV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttrib3hNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jlong function_pointer) { + glVertexAttrib3hNVPROC glVertexAttrib3hNV = (glVertexAttrib3hNVPROC)((intptr_t)function_pointer); + glVertexAttrib3hNV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttrib4hNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jshort w, jlong function_pointer) { + glVertexAttrib4hNVPROC glVertexAttrib4hNV = (glVertexAttrib4hNVPROC)((intptr_t)function_pointer); + glVertexAttrib4hNV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttribs1hvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong attribs, jlong function_pointer) { + const GLhalf *attribs_address = (const GLhalf *)(intptr_t)attribs; + glVertexAttribs1hvNVPROC glVertexAttribs1hvNV = (glVertexAttribs1hvNVPROC)((intptr_t)function_pointer); + glVertexAttribs1hvNV(index, n, attribs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttribs2hvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong attribs, jlong function_pointer) { + const GLhalf *attribs_address = (const GLhalf *)(intptr_t)attribs; + glVertexAttribs2hvNVPROC glVertexAttribs2hvNV = (glVertexAttribs2hvNVPROC)((intptr_t)function_pointer); + glVertexAttribs2hvNV(index, n, attribs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttribs3hvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong attribs, jlong function_pointer) { + const GLhalf *attribs_address = (const GLhalf *)(intptr_t)attribs; + glVertexAttribs3hvNVPROC glVertexAttribs3hvNV = (glVertexAttribs3hvNVPROC)((intptr_t)function_pointer); + glVertexAttribs3hvNV(index, n, attribs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVHalfFloat_nglVertexAttribs4hvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong attribs, jlong function_pointer) { + const GLhalf *attribs_address = (const GLhalf *)(intptr_t)attribs; + glVertexAttribs4hvNVPROC glVertexAttribs4hvNV = (glVertexAttribs4hvNVPROC)((intptr_t)function_pointer); + glVertexAttribs4hvNV(index, n, attribs_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVOcclusionQuery.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVOcclusionQuery.c new file mode 100644 index 0000000..38ecb0a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVOcclusionQuery.c @@ -0,0 +1,53 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glGenOcclusionQueriesNVPROC) (GLsizei n, GLuint * piIDs); +typedef void (APIENTRY *glDeleteOcclusionQueriesNVPROC) (GLsizei n, const GLuint * piIDs); +typedef GLboolean (APIENTRY *glIsOcclusionQueryNVPROC) (GLuint id); +typedef void (APIENTRY *glBeginOcclusionQueryNVPROC) (GLuint id); +typedef void (APIENTRY *glEndOcclusionQueryNVPROC) (); +typedef void (APIENTRY *glGetOcclusionQueryuivNVPROC) (GLuint id, GLenum pname, GLuint * params); +typedef void (APIENTRY *glGetOcclusionQueryivNVPROC) (GLuint id, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglGenOcclusionQueriesNV(JNIEnv *env, jclass clazz, jint n, jlong piIDs, jlong function_pointer) { + GLuint *piIDs_address = (GLuint *)(intptr_t)piIDs; + glGenOcclusionQueriesNVPROC glGenOcclusionQueriesNV = (glGenOcclusionQueriesNVPROC)((intptr_t)function_pointer); + glGenOcclusionQueriesNV(n, piIDs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglDeleteOcclusionQueriesNV(JNIEnv *env, jclass clazz, jint n, jlong piIDs, jlong function_pointer) { + const GLuint *piIDs_address = (const GLuint *)(intptr_t)piIDs; + glDeleteOcclusionQueriesNVPROC glDeleteOcclusionQueriesNV = (glDeleteOcclusionQueriesNVPROC)((intptr_t)function_pointer); + glDeleteOcclusionQueriesNV(n, piIDs_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglIsOcclusionQueryNV(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glIsOcclusionQueryNVPROC glIsOcclusionQueryNV = (glIsOcclusionQueryNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsOcclusionQueryNV(id); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglBeginOcclusionQueryNV(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glBeginOcclusionQueryNVPROC glBeginOcclusionQueryNV = (glBeginOcclusionQueryNVPROC)((intptr_t)function_pointer); + glBeginOcclusionQueryNV(id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglEndOcclusionQueryNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndOcclusionQueryNVPROC glEndOcclusionQueryNV = (glEndOcclusionQueryNVPROC)((intptr_t)function_pointer); + glEndOcclusionQueryNV(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglGetOcclusionQueryuivNV(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetOcclusionQueryuivNVPROC glGetOcclusionQueryuivNV = (glGetOcclusionQueryuivNVPROC)((intptr_t)function_pointer); + glGetOcclusionQueryuivNV(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVOcclusionQuery_nglGetOcclusionQueryivNV(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetOcclusionQueryivNVPROC glGetOcclusionQueryivNV = (glGetOcclusionQueryivNVPROC)((intptr_t)function_pointer); + glGetOcclusionQueryivNV(id, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVParameterBufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVParameterBufferObject.c new file mode 100644 index 0000000..1f87766 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVParameterBufferObject.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glProgramBufferParametersfvNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params); +typedef void (APIENTRY *glProgramBufferParametersIivNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params); +typedef void (APIENTRY *glProgramBufferParametersIuivNVPROC) (GLenum target, GLuint buffer, GLuint index, GLuint count, const GLuint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVParameterBufferObject_nglProgramBufferParametersfvNV(JNIEnv *env, jclass clazz, jint target, jint buffer, jint index, jint count, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramBufferParametersfvNVPROC glProgramBufferParametersfvNV = (glProgramBufferParametersfvNVPROC)((intptr_t)function_pointer); + glProgramBufferParametersfvNV(target, buffer, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVParameterBufferObject_nglProgramBufferParametersIivNV(JNIEnv *env, jclass clazz, jint target, jint buffer, jint index, jint count, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glProgramBufferParametersIivNVPROC glProgramBufferParametersIivNV = (glProgramBufferParametersIivNVPROC)((intptr_t)function_pointer); + glProgramBufferParametersIivNV(target, buffer, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVParameterBufferObject_nglProgramBufferParametersIuivNV(JNIEnv *env, jclass clazz, jint target, jint buffer, jint index, jint count, jlong params, jlong function_pointer) { + const GLuint *params_address = (const GLuint *)(intptr_t)params; + glProgramBufferParametersIuivNVPROC glProgramBufferParametersIuivNV = (glProgramBufferParametersIuivNVPROC)((intptr_t)function_pointer); + glProgramBufferParametersIuivNV(target, buffer, index, count, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPathRendering.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPathRendering.c new file mode 100644 index 0000000..6522fde --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPathRendering.c @@ -0,0 +1,350 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPathCommandsNVPROC) (GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const GLvoid * coords); +typedef void (APIENTRY *glPathCoordsNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const GLvoid * coords); +typedef void (APIENTRY *glPathSubCommandsNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const GLvoid * coords); +typedef void (APIENTRY *glPathSubCoordsNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const GLvoid * coords); +typedef void (APIENTRY *glPathStringNVPROC) (GLuint path, GLenum format, GLsizei length, const GLvoid * pathString); +typedef void (APIENTRY *glPathGlyphsNVPROC) (GLuint firstPathName, GLenum fontTarget, const GLvoid * fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const GLvoid * charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRY *glPathGlyphRangeNVPROC) (GLuint firstPathName, GLenum fontTarget, const GLvoid * fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRY *glWeightPathsNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint * paths, const GLfloat * weights); +typedef void (APIENTRY *glCopyPathNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRY *glInterpolatePathsNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRY *glTransformPathNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat * transformValues); +typedef void (APIENTRY *glPathParameterivNVPROC) (GLuint path, GLenum pname, const GLint * value); +typedef void (APIENTRY *glPathParameteriNVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRY *glPathParameterfvNVPROC) (GLuint path, GLenum pname, const GLint * value); +typedef void (APIENTRY *glPathParameterfNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRY *glPathDashArrayNVPROC) (GLuint path, GLsizei dashCount, const GLfloat * dashArray); +typedef GLuint (APIENTRY *glGenPathsNVPROC) (GLsizei range); +typedef void (APIENTRY *glDeletePathsNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRY *glIsPathNVPROC) (GLuint path); +typedef void (APIENTRY *glPathStencilFuncNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRY *glPathStencilDepthOffsetNVPROC) (GLfloat factor, GLint units); +typedef void (APIENTRY *glStencilFillPathNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRY *glStencilStrokePathNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRY *glStencilFillPathInstancedNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues); +typedef void (APIENTRY *glStencilStrokePathInstancedNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues); +typedef void (APIENTRY *glPathCoverDepthFuncNVPROC) (GLenum zfunc); +typedef void (APIENTRY *glPathColorGenNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat * coeffs); +typedef void (APIENTRY *glPathTexGenNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat * coeffs); +typedef void (APIENTRY *glPathFogGenNVPROC) (GLenum genMode); +typedef void (APIENTRY *glCoverFillPathNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRY *glCoverStrokePathNVPROC) (GLuint name, GLenum coverMode); +typedef void (APIENTRY *glCoverFillPathInstancedNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (APIENTRY *glCoverStrokePathInstancedNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (APIENTRY *glGetPathParameterivNVPROC) (GLuint name, GLenum param, GLint * value); +typedef void (APIENTRY *glGetPathParameterfvNVPROC) (GLuint name, GLenum param, GLfloat * value); +typedef void (APIENTRY *glGetPathCommandsNVPROC) (GLuint name, GLubyte * commands); +typedef void (APIENTRY *glGetPathCoordsNVPROC) (GLuint name, GLfloat * coords); +typedef void (APIENTRY *glGetPathDashArrayNVPROC) (GLuint name, GLfloat * dashArray); +typedef void (APIENTRY *glGetPathMetricsNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLsizei stride, GLfloat * metrics); +typedef void (APIENTRY *glGetPathMetricRangeNVPROC) (GLbitfield metricQueryMask, GLuint fistPathName, GLsizei numPaths, GLsizei stride, GLfloat * metrics); +typedef void (APIENTRY *glGetPathSpacingNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const GLvoid * paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat * returnedSpacing); +typedef void (APIENTRY *glGetPathColorGenivNVPROC) (GLenum color, GLenum pname, GLint * value); +typedef void (APIENTRY *glGetPathColorGenfvNVPROC) (GLenum color, GLenum pname, GLfloat * value); +typedef void (APIENTRY *glGetPathTexGenivNVPROC) (GLenum texCoordSet, GLenum pname, GLint * value); +typedef void (APIENTRY *glGetPathTexGenfvNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat * value); +typedef GLboolean (APIENTRY *glIsPointInFillPathNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRY *glIsPointInStrokePathNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRY *glGetPathLengthNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRY *glPointAlongPathNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat * x, GLfloat * y, GLfloat * tangentX, GLfloat * tangentY); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathCommandsNV(JNIEnv *env, jclass clazz, jint path, jint numCommands, jlong commands, jint numCoords, jint coordType, jlong coords, jlong function_pointer) { + const GLubyte *commands_address = (const GLubyte *)(intptr_t)commands; + const GLvoid *coords_address = (const GLvoid *)(intptr_t)coords; + glPathCommandsNVPROC glPathCommandsNV = (glPathCommandsNVPROC)((intptr_t)function_pointer); + glPathCommandsNV(path, numCommands, commands_address, numCoords, coordType, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathCoordsNV(JNIEnv *env, jclass clazz, jint path, jint numCoords, jint coordType, jlong coords, jlong function_pointer) { + const GLvoid *coords_address = (const GLvoid *)(intptr_t)coords; + glPathCoordsNVPROC glPathCoordsNV = (glPathCoordsNVPROC)((intptr_t)function_pointer); + glPathCoordsNV(path, numCoords, coordType, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathSubCommandsNV(JNIEnv *env, jclass clazz, jint path, jint commandStart, jint commandsToDelete, jint numCommands, jlong commands, jint numCoords, jint coordType, jlong coords, jlong function_pointer) { + const GLubyte *commands_address = (const GLubyte *)(intptr_t)commands; + const GLvoid *coords_address = (const GLvoid *)(intptr_t)coords; + glPathSubCommandsNVPROC glPathSubCommandsNV = (glPathSubCommandsNVPROC)((intptr_t)function_pointer); + glPathSubCommandsNV(path, commandStart, commandsToDelete, numCommands, commands_address, numCoords, coordType, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathSubCoordsNV(JNIEnv *env, jclass clazz, jint path, jint coordStart, jint numCoords, jint coordType, jlong coords, jlong function_pointer) { + const GLvoid *coords_address = (const GLvoid *)(intptr_t)coords; + glPathSubCoordsNVPROC glPathSubCoordsNV = (glPathSubCoordsNVPROC)((intptr_t)function_pointer); + glPathSubCoordsNV(path, coordStart, numCoords, coordType, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathStringNV(JNIEnv *env, jclass clazz, jint path, jint format, jint length, jlong pathString, jlong function_pointer) { + const GLvoid *pathString_address = (const GLvoid *)(intptr_t)pathString; + glPathStringNVPROC glPathStringNV = (glPathStringNVPROC)((intptr_t)function_pointer); + glPathStringNV(path, format, length, pathString_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathGlyphsNV(JNIEnv *env, jclass clazz, jint firstPathName, jint fontTarget, jlong fontName, jint fontStyle, jint numGlyphs, jint type, jlong charcodes, jint handleMissingGlyphs, jint pathParameterTemplate, jfloat emScale, jlong function_pointer) { + const GLvoid *fontName_address = (const GLvoid *)(intptr_t)fontName; + const GLvoid *charcodes_address = (const GLvoid *)(intptr_t)charcodes; + glPathGlyphsNVPROC glPathGlyphsNV = (glPathGlyphsNVPROC)((intptr_t)function_pointer); + glPathGlyphsNV(firstPathName, fontTarget, fontName_address, fontStyle, numGlyphs, type, charcodes_address, handleMissingGlyphs, pathParameterTemplate, emScale); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathGlyphRangeNV(JNIEnv *env, jclass clazz, jint firstPathName, jint fontTarget, jlong fontName, jint fontStyle, jint firstGlyph, jint numGlyphs, jint handleMissingGlyphs, jint pathParameterTemplate, jfloat emScale, jlong function_pointer) { + const GLvoid *fontName_address = (const GLvoid *)(intptr_t)fontName; + glPathGlyphRangeNVPROC glPathGlyphRangeNV = (glPathGlyphRangeNVPROC)((intptr_t)function_pointer); + glPathGlyphRangeNV(firstPathName, fontTarget, fontName_address, fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglWeightPathsNV(JNIEnv *env, jclass clazz, jint resultPath, jint numPaths, jlong paths, jlong weights, jlong function_pointer) { + const GLuint *paths_address = (const GLuint *)(intptr_t)paths; + const GLfloat *weights_address = (const GLfloat *)(intptr_t)weights; + glWeightPathsNVPROC glWeightPathsNV = (glWeightPathsNVPROC)((intptr_t)function_pointer); + glWeightPathsNV(resultPath, numPaths, paths_address, weights_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglCopyPathNV(JNIEnv *env, jclass clazz, jint resultPath, jint srcPath, jlong function_pointer) { + glCopyPathNVPROC glCopyPathNV = (glCopyPathNVPROC)((intptr_t)function_pointer); + glCopyPathNV(resultPath, srcPath); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglInterpolatePathsNV(JNIEnv *env, jclass clazz, jint resultPath, jint pathA, jint pathB, jfloat weight, jlong function_pointer) { + glInterpolatePathsNVPROC glInterpolatePathsNV = (glInterpolatePathsNVPROC)((intptr_t)function_pointer); + glInterpolatePathsNV(resultPath, pathA, pathB, weight); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglTransformPathNV(JNIEnv *env, jclass clazz, jint resultPath, jint srcPath, jint transformType, jlong transformValues, jlong function_pointer) { + const GLfloat *transformValues_address = (const GLfloat *)(intptr_t)transformValues; + glTransformPathNVPROC glTransformPathNV = (glTransformPathNVPROC)((intptr_t)function_pointer); + glTransformPathNV(resultPath, srcPath, transformType, transformValues_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathParameterivNV(JNIEnv *env, jclass clazz, jint path, jint pname, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glPathParameterivNVPROC glPathParameterivNV = (glPathParameterivNVPROC)((intptr_t)function_pointer); + glPathParameterivNV(path, pname, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathParameteriNV(JNIEnv *env, jclass clazz, jint path, jint pname, jint value, jlong function_pointer) { + glPathParameteriNVPROC glPathParameteriNV = (glPathParameteriNVPROC)((intptr_t)function_pointer); + glPathParameteriNV(path, pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathParameterfvNV(JNIEnv *env, jclass clazz, jint path, jint pname, jlong value, jlong function_pointer) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glPathParameterfvNVPROC glPathParameterfvNV = (glPathParameterfvNVPROC)((intptr_t)function_pointer); + glPathParameterfvNV(path, pname, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathParameterfNV(JNIEnv *env, jclass clazz, jint path, jint pname, jfloat value, jlong function_pointer) { + glPathParameterfNVPROC glPathParameterfNV = (glPathParameterfNVPROC)((intptr_t)function_pointer); + glPathParameterfNV(path, pname, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathDashArrayNV(JNIEnv *env, jclass clazz, jint path, jint dashCount, jlong dashArray, jlong function_pointer) { + const GLfloat *dashArray_address = (const GLfloat *)(intptr_t)dashArray; + glPathDashArrayNVPROC glPathDashArrayNV = (glPathDashArrayNVPROC)((intptr_t)function_pointer); + glPathDashArrayNV(path, dashCount, dashArray_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGenPathsNV(JNIEnv *env, jclass clazz, jint range, jlong function_pointer) { + glGenPathsNVPROC glGenPathsNV = (glGenPathsNVPROC)((intptr_t)function_pointer); + GLuint __result = glGenPathsNV(range); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglDeletePathsNV(JNIEnv *env, jclass clazz, jint path, jint range, jlong function_pointer) { + glDeletePathsNVPROC glDeletePathsNV = (glDeletePathsNVPROC)((intptr_t)function_pointer); + glDeletePathsNV(path, range); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglIsPathNV(JNIEnv *env, jclass clazz, jint path, jlong function_pointer) { + glIsPathNVPROC glIsPathNV = (glIsPathNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsPathNV(path); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathStencilFuncNV(JNIEnv *env, jclass clazz, jint func, jint ref, jint mask, jlong function_pointer) { + glPathStencilFuncNVPROC glPathStencilFuncNV = (glPathStencilFuncNVPROC)((intptr_t)function_pointer); + glPathStencilFuncNV(func, ref, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathStencilDepthOffsetNV(JNIEnv *env, jclass clazz, jfloat factor, jint units, jlong function_pointer) { + glPathStencilDepthOffsetNVPROC glPathStencilDepthOffsetNV = (glPathStencilDepthOffsetNVPROC)((intptr_t)function_pointer); + glPathStencilDepthOffsetNV(factor, units); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglStencilFillPathNV(JNIEnv *env, jclass clazz, jint path, jint fillMode, jint mask, jlong function_pointer) { + glStencilFillPathNVPROC glStencilFillPathNV = (glStencilFillPathNVPROC)((intptr_t)function_pointer); + glStencilFillPathNV(path, fillMode, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglStencilStrokePathNV(JNIEnv *env, jclass clazz, jint path, jint reference, jint mask, jlong function_pointer) { + glStencilStrokePathNVPROC glStencilStrokePathNV = (glStencilStrokePathNVPROC)((intptr_t)function_pointer); + glStencilStrokePathNV(path, reference, mask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglStencilFillPathInstancedNV(JNIEnv *env, jclass clazz, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jint fillMode, jint mask, jint transformType, jlong transformValues, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + const GLfloat *transformValues_address = (const GLfloat *)(intptr_t)transformValues; + glStencilFillPathInstancedNVPROC glStencilFillPathInstancedNV = (glStencilFillPathInstancedNVPROC)((intptr_t)function_pointer); + glStencilFillPathInstancedNV(numPaths, pathNameType, paths_address, pathBase, fillMode, mask, transformType, transformValues_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglStencilStrokePathInstancedNV(JNIEnv *env, jclass clazz, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jint reference, jint mask, jint transformType, jlong transformValues, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + const GLfloat *transformValues_address = (const GLfloat *)(intptr_t)transformValues; + glStencilStrokePathInstancedNVPROC glStencilStrokePathInstancedNV = (glStencilStrokePathInstancedNVPROC)((intptr_t)function_pointer); + glStencilStrokePathInstancedNV(numPaths, pathNameType, paths_address, pathBase, reference, mask, transformType, transformValues_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathCoverDepthFuncNV(JNIEnv *env, jclass clazz, jint zfunc, jlong function_pointer) { + glPathCoverDepthFuncNVPROC glPathCoverDepthFuncNV = (glPathCoverDepthFuncNVPROC)((intptr_t)function_pointer); + glPathCoverDepthFuncNV(zfunc); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathColorGenNV(JNIEnv *env, jclass clazz, jint color, jint genMode, jint colorFormat, jlong coeffs, jlong function_pointer) { + const GLfloat *coeffs_address = (const GLfloat *)(intptr_t)coeffs; + glPathColorGenNVPROC glPathColorGenNV = (glPathColorGenNVPROC)((intptr_t)function_pointer); + glPathColorGenNV(color, genMode, colorFormat, coeffs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathTexGenNV(JNIEnv *env, jclass clazz, jint texCoordSet, jint genMode, jint components, jlong coeffs, jlong function_pointer) { + const GLfloat *coeffs_address = (const GLfloat *)(intptr_t)coeffs; + glPathTexGenNVPROC glPathTexGenNV = (glPathTexGenNVPROC)((intptr_t)function_pointer); + glPathTexGenNV(texCoordSet, genMode, components, coeffs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPathFogGenNV(JNIEnv *env, jclass clazz, jint genMode, jlong function_pointer) { + glPathFogGenNVPROC glPathFogGenNV = (glPathFogGenNVPROC)((intptr_t)function_pointer); + glPathFogGenNV(genMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglCoverFillPathNV(JNIEnv *env, jclass clazz, jint path, jint coverMode, jlong function_pointer) { + glCoverFillPathNVPROC glCoverFillPathNV = (glCoverFillPathNVPROC)((intptr_t)function_pointer); + glCoverFillPathNV(path, coverMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglCoverStrokePathNV(JNIEnv *env, jclass clazz, jint name, jint coverMode, jlong function_pointer) { + glCoverStrokePathNVPROC glCoverStrokePathNV = (glCoverStrokePathNVPROC)((intptr_t)function_pointer); + glCoverStrokePathNV(name, coverMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglCoverFillPathInstancedNV(JNIEnv *env, jclass clazz, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jint coverMode, jint transformType, jlong transformValues, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + const GLfloat *transformValues_address = (const GLfloat *)(intptr_t)transformValues; + glCoverFillPathInstancedNVPROC glCoverFillPathInstancedNV = (glCoverFillPathInstancedNVPROC)((intptr_t)function_pointer); + glCoverFillPathInstancedNV(numPaths, pathNameType, paths_address, pathBase, coverMode, transformType, transformValues_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglCoverStrokePathInstancedNV(JNIEnv *env, jclass clazz, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jint coverMode, jint transformType, jlong transformValues, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + const GLfloat *transformValues_address = (const GLfloat *)(intptr_t)transformValues; + glCoverStrokePathInstancedNVPROC glCoverStrokePathInstancedNV = (glCoverStrokePathInstancedNVPROC)((intptr_t)function_pointer); + glCoverStrokePathInstancedNV(numPaths, pathNameType, paths_address, pathBase, coverMode, transformType, transformValues_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathParameterivNV(JNIEnv *env, jclass clazz, jint name, jint param, jlong value, jlong function_pointer) { + GLint *value_address = (GLint *)(intptr_t)value; + glGetPathParameterivNVPROC glGetPathParameterivNV = (glGetPathParameterivNVPROC)((intptr_t)function_pointer); + glGetPathParameterivNV(name, param, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathParameterfvNV(JNIEnv *env, jclass clazz, jint name, jint param, jlong value, jlong function_pointer) { + GLfloat *value_address = (GLfloat *)(intptr_t)value; + glGetPathParameterfvNVPROC glGetPathParameterfvNV = (glGetPathParameterfvNVPROC)((intptr_t)function_pointer); + glGetPathParameterfvNV(name, param, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathCommandsNV(JNIEnv *env, jclass clazz, jint name, jlong commands, jlong function_pointer) { + GLubyte *commands_address = (GLubyte *)(intptr_t)commands; + glGetPathCommandsNVPROC glGetPathCommandsNV = (glGetPathCommandsNVPROC)((intptr_t)function_pointer); + glGetPathCommandsNV(name, commands_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathCoordsNV(JNIEnv *env, jclass clazz, jint name, jlong coords, jlong function_pointer) { + GLfloat *coords_address = (GLfloat *)(intptr_t)coords; + glGetPathCoordsNVPROC glGetPathCoordsNV = (glGetPathCoordsNVPROC)((intptr_t)function_pointer); + glGetPathCoordsNV(name, coords_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathDashArrayNV(JNIEnv *env, jclass clazz, jint name, jlong dashArray, jlong function_pointer) { + GLfloat *dashArray_address = (GLfloat *)(intptr_t)dashArray; + glGetPathDashArrayNVPROC glGetPathDashArrayNV = (glGetPathDashArrayNVPROC)((intptr_t)function_pointer); + glGetPathDashArrayNV(name, dashArray_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathMetricsNV(JNIEnv *env, jclass clazz, jint metricQueryMask, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jint stride, jlong metrics, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + GLfloat *metrics_address = (GLfloat *)(intptr_t)metrics; + glGetPathMetricsNVPROC glGetPathMetricsNV = (glGetPathMetricsNVPROC)((intptr_t)function_pointer); + glGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths_address, pathBase, stride, metrics_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathMetricRangeNV(JNIEnv *env, jclass clazz, jint metricQueryMask, jint fistPathName, jint numPaths, jint stride, jlong metrics, jlong function_pointer) { + GLfloat *metrics_address = (GLfloat *)(intptr_t)metrics; + glGetPathMetricRangeNVPROC glGetPathMetricRangeNV = (glGetPathMetricRangeNVPROC)((intptr_t)function_pointer); + glGetPathMetricRangeNV(metricQueryMask, fistPathName, numPaths, stride, metrics_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathSpacingNV(JNIEnv *env, jclass clazz, jint pathListMode, jint numPaths, jint pathNameType, jlong paths, jint pathBase, jfloat advanceScale, jfloat kerningScale, jint transformType, jlong returnedSpacing, jlong function_pointer) { + const GLvoid *paths_address = (const GLvoid *)(intptr_t)paths; + GLfloat *returnedSpacing_address = (GLfloat *)(intptr_t)returnedSpacing; + glGetPathSpacingNVPROC glGetPathSpacingNV = (glGetPathSpacingNVPROC)((intptr_t)function_pointer); + glGetPathSpacingNV(pathListMode, numPaths, pathNameType, paths_address, pathBase, advanceScale, kerningScale, transformType, returnedSpacing_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathColorGenivNV(JNIEnv *env, jclass clazz, jint color, jint pname, jlong value, jlong function_pointer) { + GLint *value_address = (GLint *)(intptr_t)value; + glGetPathColorGenivNVPROC glGetPathColorGenivNV = (glGetPathColorGenivNVPROC)((intptr_t)function_pointer); + glGetPathColorGenivNV(color, pname, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathColorGenfvNV(JNIEnv *env, jclass clazz, jint color, jint pname, jlong value, jlong function_pointer) { + GLfloat *value_address = (GLfloat *)(intptr_t)value; + glGetPathColorGenfvNVPROC glGetPathColorGenfvNV = (glGetPathColorGenfvNVPROC)((intptr_t)function_pointer); + glGetPathColorGenfvNV(color, pname, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathTexGenivNV(JNIEnv *env, jclass clazz, jint texCoordSet, jint pname, jlong value, jlong function_pointer) { + GLint *value_address = (GLint *)(intptr_t)value; + glGetPathTexGenivNVPROC glGetPathTexGenivNV = (glGetPathTexGenivNVPROC)((intptr_t)function_pointer); + glGetPathTexGenivNV(texCoordSet, pname, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathTexGenfvNV(JNIEnv *env, jclass clazz, jint texCoordSet, jint pname, jlong value, jlong function_pointer) { + GLfloat *value_address = (GLfloat *)(intptr_t)value; + glGetPathTexGenfvNVPROC glGetPathTexGenfvNV = (glGetPathTexGenfvNVPROC)((intptr_t)function_pointer); + glGetPathTexGenfvNV(texCoordSet, pname, value_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglIsPointInFillPathNV(JNIEnv *env, jclass clazz, jint path, jint mask, jfloat x, jfloat y, jlong function_pointer) { + glIsPointInFillPathNVPROC glIsPointInFillPathNV = (glIsPointInFillPathNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsPointInFillPathNV(path, mask, x, y); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglIsPointInStrokePathNV(JNIEnv *env, jclass clazz, jint path, jfloat x, jfloat y, jlong function_pointer) { + glIsPointInStrokePathNVPROC glIsPointInStrokePathNV = (glIsPointInStrokePathNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsPointInStrokePathNV(path, x, y); + return __result; +} + +JNIEXPORT jfloat JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglGetPathLengthNV(JNIEnv *env, jclass clazz, jint path, jint startSegment, jint numSegments, jlong function_pointer) { + glGetPathLengthNVPROC glGetPathLengthNV = (glGetPathLengthNVPROC)((intptr_t)function_pointer); + GLfloat __result = glGetPathLengthNV(path, startSegment, numSegments); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVPathRendering_nglPointAlongPathNV(JNIEnv *env, jclass clazz, jint path, jint startSegment, jint numSegments, jfloat distance, jlong x, jlong y, jlong tangentX, jlong tangentY, jlong function_pointer) { + GLfloat *x_address = (GLfloat *)(intptr_t)x; + GLfloat *y_address = (GLfloat *)(intptr_t)y; + GLfloat *tangentX_address = (GLfloat *)(intptr_t)tangentX; + GLfloat *tangentY_address = (GLfloat *)(intptr_t)tangentY; + glPointAlongPathNVPROC glPointAlongPathNV = (glPointAlongPathNVPROC)((intptr_t)function_pointer); + GLboolean __result = glPointAlongPathNV(path, startSegment, numSegments, distance, x_address, y_address, tangentX_address, tangentY_address); + return __result; +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPixelDataRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPixelDataRange.c new file mode 100644 index 0000000..9eaf9f2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPixelDataRange.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPixelDataRangeNVPROC) (GLenum target, GLsizei length, GLvoid * data); +typedef void (APIENTRY *glFlushPixelDataRangeNVPROC) (GLenum target); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPixelDataRange_nglPixelDataRangeNV(JNIEnv *env, jclass clazz, jint target, jint length, jlong data, jlong function_pointer) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glPixelDataRangeNVPROC glPixelDataRangeNV = (glPixelDataRangeNVPROC)((intptr_t)function_pointer); + glPixelDataRangeNV(target, length, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPixelDataRange_nglFlushPixelDataRangeNV(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glFlushPixelDataRangeNVPROC glFlushPixelDataRangeNV = (glFlushPixelDataRangeNVPROC)((intptr_t)function_pointer); + glFlushPixelDataRangeNV(target); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPointSprite.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPointSprite.c new file mode 100644 index 0000000..0e4656b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPointSprite.c @@ -0,0 +1,19 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPointParameteriNVPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glPointParameterivNVPROC) (GLenum pname, const GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPointSprite_nglPointParameteriNV(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glPointParameteriNVPROC glPointParameteriNV = (glPointParameteriNVPROC)((intptr_t)function_pointer); + glPointParameteriNV(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPointSprite_nglPointParameterivNV(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glPointParameterivNVPROC glPointParameterivNV = (glPointParameterivNVPROC)((intptr_t)function_pointer); + glPointParameterivNV(pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPresentVideo.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPresentVideo.c new file mode 100644 index 0000000..2b39f48 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPresentVideo.c @@ -0,0 +1,46 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPresentFrameKeyedNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRY *glPresentFrameDualFillNVPROC) (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 (APIENTRY *glGetVideoivNVPROC) (GLuint video_slot, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVideouivNVPROC) (GLuint video_slot, GLenum pname, GLuint * params); +typedef void (APIENTRY *glGetVideoi64vNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT * params); +typedef void (APIENTRY *glGetVideoui64vNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglPresentFrameKeyedNV(JNIEnv *env, jclass clazz, jint video_slot, jlong minPresentTime, jint beginPresentTimeId, jint presentDurationId, jint type, jint target0, jint fill0, jint key0, jint target1, jint fill1, jint key1, jlong function_pointer) { + glPresentFrameKeyedNVPROC glPresentFrameKeyedNV = (glPresentFrameKeyedNVPROC)((intptr_t)function_pointer); + glPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglPresentFrameDualFillNV(JNIEnv *env, jclass clazz, jint video_slot, jlong minPresentTime, jint beginPresentTimeId, jint presentDurationId, jint type, jint target0, jint fill0, jint target1, jint fill1, jint target2, jint fill2, jint target3, jint fill3, jlong function_pointer) { + glPresentFrameDualFillNVPROC glPresentFrameDualFillNV = (glPresentFrameDualFillNVPROC)((intptr_t)function_pointer); + glPresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglGetVideoivNV(JNIEnv *env, jclass clazz, jint video_slot, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVideoivNVPROC glGetVideoivNV = (glGetVideoivNVPROC)((intptr_t)function_pointer); + glGetVideoivNV(video_slot, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglGetVideouivNV(JNIEnv *env, jclass clazz, jint video_slot, jint pname, jlong params, jlong function_pointer) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetVideouivNVPROC glGetVideouivNV = (glGetVideouivNVPROC)((intptr_t)function_pointer); + glGetVideouivNV(video_slot, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglGetVideoi64vNV(JNIEnv *env, jclass clazz, jint video_slot, jint pname, jlong params, jlong function_pointer) { + GLint64EXT *params_address = (GLint64EXT *)(intptr_t)params; + glGetVideoi64vNVPROC glGetVideoi64vNV = (glGetVideoi64vNVPROC)((intptr_t)function_pointer); + glGetVideoi64vNV(video_slot, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPresentVideo_nglGetVideoui64vNV(JNIEnv *env, jclass clazz, jint video_slot, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetVideoui64vNVPROC glGetVideoui64vNV = (glGetVideoui64vNVPROC)((intptr_t)function_pointer); + glGetVideoui64vNV(video_slot, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPrimitiveRestart.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPrimitiveRestart.c new file mode 100644 index 0000000..a9f8862 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVPrimitiveRestart.c @@ -0,0 +1,18 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glPrimitiveRestartNVPROC) (); +typedef void (APIENTRY *glPrimitiveRestartIndexNVPROC) (GLuint index); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPrimitiveRestart_nglPrimitiveRestartNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPrimitiveRestartNVPROC glPrimitiveRestartNV = (glPrimitiveRestartNVPROC)((intptr_t)function_pointer); + glPrimitiveRestartNV(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPrimitiveRestart_nglPrimitiveRestartIndexNV(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { + glPrimitiveRestartIndexNVPROC glPrimitiveRestartIndexNV = (glPrimitiveRestartIndexNVPROC)((intptr_t)function_pointer); + glPrimitiveRestartIndexNV(index); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVProgram.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVProgram.c new file mode 100644 index 0000000..7ff9b5b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVProgram.c @@ -0,0 +1,70 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glLoadProgramNVPROC) (GLenum target, GLuint programID, GLsizei length, const GLvoid * string); +typedef void (APIENTRY *glBindProgramNVPROC) (GLenum target, GLuint programID); +typedef void (APIENTRY *glDeleteProgramsNVPROC) (GLsizei n, const GLuint * programs); +typedef void (APIENTRY *glGenProgramsNVPROC) (GLsizei n, GLuint * programs); +typedef void (APIENTRY *glGetProgramivNVPROC) (GLuint programID, GLenum parameterName, GLint * params); +typedef void (APIENTRY *glGetProgramStringNVPROC) (GLuint programID, GLenum parameterName, GLvoid * paramString); +typedef GLboolean (APIENTRY *glIsProgramNVPROC) (GLuint programID); +typedef GLboolean (APIENTRY *glAreProgramsResidentNVPROC) (GLsizei n, const GLuint * programIDs, GLboolean * programResidences); +typedef void (APIENTRY *glRequestResidentProgramsNVPROC) (GLsizei n, GLuint * programIDs); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglLoadProgramNV(JNIEnv *env, jclass clazz, jint target, jint programID, jint length, jlong string, jlong function_pointer) { + const GLvoid *string_address = (const GLvoid *)(intptr_t)string; + glLoadProgramNVPROC glLoadProgramNV = (glLoadProgramNVPROC)((intptr_t)function_pointer); + glLoadProgramNV(target, programID, length, string_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglBindProgramNV(JNIEnv *env, jclass clazz, jint target, jint programID, jlong function_pointer) { + glBindProgramNVPROC glBindProgramNV = (glBindProgramNVPROC)((intptr_t)function_pointer); + glBindProgramNV(target, programID); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglDeleteProgramsNV(JNIEnv *env, jclass clazz, jint n, jlong programs, jlong function_pointer) { + const GLuint *programs_address = (const GLuint *)(intptr_t)programs; + glDeleteProgramsNVPROC glDeleteProgramsNV = (glDeleteProgramsNVPROC)((intptr_t)function_pointer); + glDeleteProgramsNV(n, programs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglGenProgramsNV(JNIEnv *env, jclass clazz, jint n, jlong programs, jlong function_pointer) { + GLuint *programs_address = (GLuint *)(intptr_t)programs; + glGenProgramsNVPROC glGenProgramsNV = (glGenProgramsNVPROC)((intptr_t)function_pointer); + glGenProgramsNV(n, programs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglGetProgramivNV(JNIEnv *env, jclass clazz, jint programID, jint parameterName, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramivNVPROC glGetProgramivNV = (glGetProgramivNVPROC)((intptr_t)function_pointer); + glGetProgramivNV(programID, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglGetProgramStringNV(JNIEnv *env, jclass clazz, jint programID, jint parameterName, jlong paramString, jlong function_pointer) { + GLvoid *paramString_address = (GLvoid *)(intptr_t)paramString; + glGetProgramStringNVPROC glGetProgramStringNV = (glGetProgramStringNVPROC)((intptr_t)function_pointer); + glGetProgramStringNV(programID, parameterName, paramString_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVProgram_nglIsProgramNV(JNIEnv *env, jclass clazz, jint programID, jlong function_pointer) { + glIsProgramNVPROC glIsProgramNV = (glIsProgramNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsProgramNV(programID); + return __result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVProgram_nglAreProgramsResidentNV(JNIEnv *env, jclass clazz, jint n, jlong programIDs, jlong programResidences, jlong function_pointer) { + const GLuint *programIDs_address = (const GLuint *)(intptr_t)programIDs; + GLboolean *programResidences_address = (GLboolean *)(intptr_t)programResidences; + glAreProgramsResidentNVPROC glAreProgramsResidentNV = (glAreProgramsResidentNVPROC)((intptr_t)function_pointer); + GLboolean __result = glAreProgramsResidentNV(n, programIDs_address, programResidences_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVProgram_nglRequestResidentProgramsNV(JNIEnv *env, jclass clazz, jint n, jlong programIDs, jlong function_pointer) { + GLuint *programIDs_address = (GLuint *)(intptr_t)programIDs; + glRequestResidentProgramsNVPROC glRequestResidentProgramsNV = (glRequestResidentProgramsNVPROC)((intptr_t)function_pointer); + glRequestResidentProgramsNV(n, programIDs_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners.c new file mode 100644 index 0000000..36994b4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners.c @@ -0,0 +1,92 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glCombinerParameterfNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRY *glCombinerParameterfvNVPROC) (GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glCombinerParameteriNVPROC) (GLenum pname, GLint param); +typedef void (APIENTRY *glCombinerParameterivNVPROC) (GLenum pname, const GLint * params); +typedef void (APIENTRY *glCombinerInputNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY *glCombinerOutputNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRY *glFinalCombinerInputNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRY *glGetCombinerInputParameterfvNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetCombinerInputParameterivNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetCombinerOutputParameterfvNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetCombinerOutputParameterivNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetFinalCombinerInputParameterfvNVPROC) (GLenum variable, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetFinalCombinerInputParameterivNVPROC) (GLenum variable, GLenum pname, GLint * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerParameterfNV(JNIEnv *env, jclass clazz, jint pname, jfloat param, jlong function_pointer) { + glCombinerParameterfNVPROC glCombinerParameterfNV = (glCombinerParameterfNVPROC)((intptr_t)function_pointer); + glCombinerParameterfNV(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerParameterfvNV(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glCombinerParameterfvNVPROC glCombinerParameterfvNV = (glCombinerParameterfvNVPROC)((intptr_t)function_pointer); + glCombinerParameterfvNV(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerParameteriNV(JNIEnv *env, jclass clazz, jint pname, jint param, jlong function_pointer) { + glCombinerParameteriNVPROC glCombinerParameteriNV = (glCombinerParameteriNVPROC)((intptr_t)function_pointer); + glCombinerParameteriNV(pname, param); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerParameterivNV(JNIEnv *env, jclass clazz, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glCombinerParameterivNVPROC glCombinerParameterivNV = (glCombinerParameterivNVPROC)((intptr_t)function_pointer); + glCombinerParameterivNV(pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerInputNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint variable, jint input, jint mapping, jint componentUsage, jlong function_pointer) { + glCombinerInputNVPROC glCombinerInputNV = (glCombinerInputNVPROC)((intptr_t)function_pointer); + glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglCombinerOutputNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint abOutput, jint cdOutput, jint sumOutput, jint scale, jint bias, jboolean abDotProduct, jboolean cdDotProduct, jboolean muxSum, jlong function_pointer) { + glCombinerOutputNVPROC glCombinerOutputNV = (glCombinerOutputNVPROC)((intptr_t)function_pointer); + glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglFinalCombinerInputNV(JNIEnv *env, jclass clazz, jint variable, jint input, jint mapping, jint componentUsage, jlong function_pointer) { + glFinalCombinerInputNVPROC glFinalCombinerInputNV = (glFinalCombinerInputNVPROC)((intptr_t)function_pointer); + glFinalCombinerInputNV(variable, input, mapping, componentUsage); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetCombinerInputParameterfvNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint variable, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetCombinerInputParameterfvNVPROC glGetCombinerInputParameterfvNV = (glGetCombinerInputParameterfvNVPROC)((intptr_t)function_pointer); + glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetCombinerInputParameterivNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint variable, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetCombinerInputParameterivNVPROC glGetCombinerInputParameterivNV = (glGetCombinerInputParameterivNVPROC)((intptr_t)function_pointer); + glGetCombinerInputParameterivNV(stage, portion, variable, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetCombinerOutputParameterfvNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetCombinerOutputParameterfvNVPROC glGetCombinerOutputParameterfvNV = (glGetCombinerOutputParameterfvNVPROC)((intptr_t)function_pointer); + glGetCombinerOutputParameterfvNV(stage, portion, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetCombinerOutputParameterivNV(JNIEnv *env, jclass clazz, jint stage, jint portion, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetCombinerOutputParameterivNVPROC glGetCombinerOutputParameterivNV = (glGetCombinerOutputParameterivNVPROC)((intptr_t)function_pointer); + glGetCombinerOutputParameterivNV(stage, portion, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetFinalCombinerInputParameterfvNV(JNIEnv *env, jclass clazz, jint variable, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetFinalCombinerInputParameterfvNVPROC glGetFinalCombinerInputParameterfvNV = (glGetFinalCombinerInputParameterfvNVPROC)((intptr_t)function_pointer); + glGetFinalCombinerInputParameterfvNV(variable, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners_nglGetFinalCombinerInputParameterivNV(JNIEnv *env, jclass clazz, jint variable, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFinalCombinerInputParameterivNVPROC glGetFinalCombinerInputParameterivNV = (glGetFinalCombinerInputParameterivNVPROC)((intptr_t)function_pointer); + glGetFinalCombinerInputParameterivNV(variable, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners2.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners2.c new file mode 100644 index 0000000..cec6843 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVRegisterCombiners2.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glCombinerStageParameterfvNVPROC) (GLenum stage, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glGetCombinerStageParameterfvNVPROC) (GLenum stage, GLenum pname, GLfloat * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners2_nglCombinerStageParameterfvNV(JNIEnv *env, jclass clazz, jint stage, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glCombinerStageParameterfvNVPROC glCombinerStageParameterfvNV = (glCombinerStageParameterfvNVPROC)((intptr_t)function_pointer); + glCombinerStageParameterfvNV(stage, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVRegisterCombiners2_nglGetCombinerStageParameterfvNV(JNIEnv *env, jclass clazz, jint stage, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetCombinerStageParameterfvNVPROC glGetCombinerStageParameterfvNV = (glGetCombinerStageParameterfvNVPROC)((intptr_t)function_pointer); + glGetCombinerStageParameterfvNV(stage, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVShaderBufferLoad.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVShaderBufferLoad.c new file mode 100644 index 0000000..d9989bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVShaderBufferLoad.c @@ -0,0 +1,91 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glMakeBufferResidentNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRY *glMakeBufferNonResidentNVPROC) (GLenum target); +typedef GLboolean (APIENTRY *glIsBufferResidentNVPROC) (GLenum target); +typedef void (APIENTRY *glMakeNamedBufferResidentNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRY *glMakeNamedBufferNonResidentNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRY *glIsNamedBufferResidentNVPROC) (GLuint buffer); +typedef void (APIENTRY *glGetBufferParameterui64vNVPROC) (GLenum target, GLenum pname, GLuint64EXT * params); +typedef void (APIENTRY *glGetNamedBufferParameterui64vNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT * params); +typedef void (APIENTRY *glGetIntegerui64vNVPROC) (GLenum value, GLuint64EXT * result); +typedef void (APIENTRY *glUniformui64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRY *glUniformui64vNVPROC) (GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (APIENTRY *glProgramUniformui64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRY *glProgramUniformui64vNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglMakeBufferResidentNV(JNIEnv *env, jclass clazz, jint target, jint access, jlong function_pointer) { + glMakeBufferResidentNVPROC glMakeBufferResidentNV = (glMakeBufferResidentNVPROC)((intptr_t)function_pointer); + glMakeBufferResidentNV(target, access); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglMakeBufferNonResidentNV(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glMakeBufferNonResidentNVPROC glMakeBufferNonResidentNV = (glMakeBufferNonResidentNVPROC)((intptr_t)function_pointer); + glMakeBufferNonResidentNV(target); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglIsBufferResidentNV(JNIEnv *env, jclass clazz, jint target, jlong function_pointer) { + glIsBufferResidentNVPROC glIsBufferResidentNV = (glIsBufferResidentNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsBufferResidentNV(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglMakeNamedBufferResidentNV(JNIEnv *env, jclass clazz, jint buffer, jint access, jlong function_pointer) { + glMakeNamedBufferResidentNVPROC glMakeNamedBufferResidentNV = (glMakeNamedBufferResidentNVPROC)((intptr_t)function_pointer); + glMakeNamedBufferResidentNV(buffer, access); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglMakeNamedBufferNonResidentNV(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glMakeNamedBufferNonResidentNVPROC glMakeNamedBufferNonResidentNV = (glMakeNamedBufferNonResidentNVPROC)((intptr_t)function_pointer); + glMakeNamedBufferNonResidentNV(buffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglIsNamedBufferResidentNV(JNIEnv *env, jclass clazz, jint buffer, jlong function_pointer) { + glIsNamedBufferResidentNVPROC glIsNamedBufferResidentNV = (glIsNamedBufferResidentNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsNamedBufferResidentNV(buffer); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglGetBufferParameterui64vNV(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetBufferParameterui64vNVPROC glGetBufferParameterui64vNV = (glGetBufferParameterui64vNVPROC)((intptr_t)function_pointer); + glGetBufferParameterui64vNV(target, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglGetNamedBufferParameterui64vNV(JNIEnv *env, jclass clazz, jint buffer, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetNamedBufferParameterui64vNVPROC glGetNamedBufferParameterui64vNV = (glGetNamedBufferParameterui64vNVPROC)((intptr_t)function_pointer); + glGetNamedBufferParameterui64vNV(buffer, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglGetIntegerui64vNV(JNIEnv *env, jclass clazz, jint value, jlong result, jlong function_pointer) { + GLuint64EXT *result_address = (GLuint64EXT *)(intptr_t)result; + glGetIntegerui64vNVPROC glGetIntegerui64vNV = (glGetIntegerui64vNVPROC)((intptr_t)function_pointer); + glGetIntegerui64vNV(value, result_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglUniformui64NV(JNIEnv *env, jclass clazz, jint location, jlong value, jlong function_pointer) { + glUniformui64NVPROC glUniformui64NV = (glUniformui64NVPROC)((intptr_t)function_pointer); + glUniformui64NV(location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglUniformui64vNV(JNIEnv *env, jclass clazz, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glUniformui64vNVPROC glUniformui64vNV = (glUniformui64vNVPROC)((intptr_t)function_pointer); + glUniformui64vNV(location, count, value_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglProgramUniformui64NV(JNIEnv *env, jclass clazz, jint program, jint location, jlong value, jlong function_pointer) { + glProgramUniformui64NVPROC glProgramUniformui64NV = (glProgramUniformui64NVPROC)((intptr_t)function_pointer); + glProgramUniformui64NV(program, location, value); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVShaderBufferLoad_nglProgramUniformui64vNV(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value, jlong function_pointer) { + const GLuint64EXT *value_address = (const GLuint64EXT *)(intptr_t)value; + glProgramUniformui64vNVPROC glProgramUniformui64vNV = (glProgramUniformui64vNVPROC)((intptr_t)function_pointer); + glProgramUniformui64vNV(program, location, count, value_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureBarrier.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureBarrier.c new file mode 100644 index 0000000..125541e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureBarrier.c @@ -0,0 +1,12 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTextureBarrierNVPROC) (); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureBarrier_nglTextureBarrierNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glTextureBarrierNVPROC glTextureBarrierNV = (glTextureBarrierNVPROC)((intptr_t)function_pointer); + glTextureBarrierNV(); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureMultisample.c new file mode 100644 index 0000000..89c6862 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTextureMultisample.c @@ -0,0 +1,42 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glTexImage2DMultisampleCoverageNVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRY *glTexImage3DMultisampleCoverageNVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRY *glTextureImage2DMultisampleNVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRY *glTextureImage3DMultisampleNVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRY *glTextureImage2DMultisampleCoverageNVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRY *glTextureImage3DMultisampleCoverageNVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTexImage2DMultisampleCoverageNV(JNIEnv *env, jclass clazz, jint target, jint coverageSamples, jint colorSamples, jint internalFormat, jint width, jint height, jboolean fixedSampleLocations, jlong function_pointer) { + glTexImage2DMultisampleCoverageNVPROC glTexImage2DMultisampleCoverageNV = (glTexImage2DMultisampleCoverageNVPROC)((intptr_t)function_pointer); + glTexImage2DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTexImage3DMultisampleCoverageNV(JNIEnv *env, jclass clazz, jint target, jint coverageSamples, jint colorSamples, jint internalFormat, jint width, jint height, jint depth, jboolean fixedSampleLocations, jlong function_pointer) { + glTexImage3DMultisampleCoverageNVPROC glTexImage3DMultisampleCoverageNV = (glTexImage3DMultisampleCoverageNVPROC)((intptr_t)function_pointer); + glTexImage3DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTextureImage2DMultisampleNV(JNIEnv *env, jclass clazz, jint texture, jint target, jint samples, jint internalFormat, jint width, jint height, jboolean fixedSampleLocations, jlong function_pointer) { + glTextureImage2DMultisampleNVPROC glTextureImage2DMultisampleNV = (glTextureImage2DMultisampleNVPROC)((intptr_t)function_pointer); + glTextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTextureImage3DMultisampleNV(JNIEnv *env, jclass clazz, jint texture, jint target, jint samples, jint internalFormat, jint width, jint height, jint depth, jboolean fixedSampleLocations, jlong function_pointer) { + glTextureImage3DMultisampleNVPROC glTextureImage3DMultisampleNV = (glTextureImage3DMultisampleNVPROC)((intptr_t)function_pointer); + glTextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTextureImage2DMultisampleCoverageNV(JNIEnv *env, jclass clazz, jint texture, jint target, jint coverageSamples, jint colorSamples, jint internalFormat, jint width, jint height, jboolean fixedSampleLocations, jlong function_pointer) { + glTextureImage2DMultisampleCoverageNVPROC glTextureImage2DMultisampleCoverageNV = (glTextureImage2DMultisampleCoverageNVPROC)((intptr_t)function_pointer); + glTextureImage2DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTextureMultisample_nglTextureImage3DMultisampleCoverageNV(JNIEnv *env, jclass clazz, jint texture, jint target, jint coverageSamples, jint colorSamples, jint internalFormat, jint width, jint height, jint depth, jboolean fixedSampleLocations, jlong function_pointer) { + glTextureImage3DMultisampleCoverageNVPROC glTextureImage3DMultisampleCoverageNV = (glTextureImage3DMultisampleCoverageNVPROC)((intptr_t)function_pointer); + glTextureImage3DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback.c new file mode 100644 index 0000000..95cfd71 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback.c @@ -0,0 +1,82 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindBufferRangeNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRY *glBindBufferOffsetNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRY *glBindBufferBaseNVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRY *glTransformFeedbackAttribsNVPROC) (GLsizei count, const GLint * attribs, GLenum bufferMode); +typedef void (APIENTRY *glTransformFeedbackVaryingsNVPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); +typedef void (APIENTRY *glBeginTransformFeedbackNVPROC) (GLenum primitiveMode); +typedef void (APIENTRY *glEndTransformFeedbackNVPROC) (); +typedef GLint (APIENTRY *glGetVaryingLocationNVPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glGetActiveVaryingNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (APIENTRY *glActiveVaryingNVPROC) (GLuint program, const GLchar * name); +typedef void (APIENTRY *glGetTransformFeedbackVaryingNVPROC) (GLuint program, GLuint index, GLint * location); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglBindBufferRangeNV(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong size, jlong function_pointer) { + glBindBufferRangeNVPROC glBindBufferRangeNV = (glBindBufferRangeNVPROC)((intptr_t)function_pointer); + glBindBufferRangeNV(target, index, buffer, offset, size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglBindBufferOffsetNV(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong function_pointer) { + glBindBufferOffsetNVPROC glBindBufferOffsetNV = (glBindBufferOffsetNVPROC)((intptr_t)function_pointer); + glBindBufferOffsetNV(target, index, buffer, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglBindBufferBaseNV(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong function_pointer) { + glBindBufferBaseNVPROC glBindBufferBaseNV = (glBindBufferBaseNVPROC)((intptr_t)function_pointer); + glBindBufferBaseNV(target, index, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglTransformFeedbackAttribsNV(JNIEnv *env, jclass clazz, jint count, jlong attribs, jint bufferMode, jlong function_pointer) { + const GLint *attribs_address = (const GLint *)(intptr_t)attribs; + glTransformFeedbackAttribsNVPROC glTransformFeedbackAttribsNV = (glTransformFeedbackAttribsNVPROC)((intptr_t)function_pointer); + glTransformFeedbackAttribsNV(count, attribs_address, bufferMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglTransformFeedbackVaryingsNV(JNIEnv *env, jclass clazz, jint program, jint count, jlong locations, jint bufferMode, jlong function_pointer) { + const GLint *locations_address = (const GLint *)(intptr_t)locations; + glTransformFeedbackVaryingsNVPROC glTransformFeedbackVaryingsNV = (glTransformFeedbackVaryingsNVPROC)((intptr_t)function_pointer); + glTransformFeedbackVaryingsNV(program, count, locations_address, bufferMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglBeginTransformFeedbackNV(JNIEnv *env, jclass clazz, jint primitiveMode, jlong function_pointer) { + glBeginTransformFeedbackNVPROC glBeginTransformFeedbackNV = (glBeginTransformFeedbackNVPROC)((intptr_t)function_pointer); + glBeginTransformFeedbackNV(primitiveMode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglEndTransformFeedbackNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glEndTransformFeedbackNVPROC glEndTransformFeedbackNV = (glEndTransformFeedbackNVPROC)((intptr_t)function_pointer); + glEndTransformFeedbackNV(); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglGetVaryingLocationNV(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glGetVaryingLocationNVPROC glGetVaryingLocationNV = (glGetVaryingLocationNVPROC)((intptr_t)function_pointer); + GLint __result = glGetVaryingLocationNV(program, name_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglGetActiveVaryingNV(JNIEnv *env, jclass clazz, jint program, jint index, jint bufSize, jlong length, jlong size, jlong type, jlong name, jlong function_pointer) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveVaryingNVPROC glGetActiveVaryingNV = (glGetActiveVaryingNVPROC)((intptr_t)function_pointer); + glGetActiveVaryingNV(program, index, bufSize, length_address, size_address, type_address, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglActiveVaryingNV(JNIEnv *env, jclass clazz, jint program, jlong name, jlong function_pointer) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glActiveVaryingNVPROC glActiveVaryingNV = (glActiveVaryingNVPROC)((intptr_t)function_pointer); + glActiveVaryingNV(program, name_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback_nglGetTransformFeedbackVaryingNV(JNIEnv *env, jclass clazz, jint program, jint index, jlong location, jlong function_pointer) { + GLint *location_address = (GLint *)(intptr_t)location; + glGetTransformFeedbackVaryingNVPROC glGetTransformFeedbackVaryingNV = (glGetTransformFeedbackVaryingNVPROC)((intptr_t)function_pointer); + glGetTransformFeedbackVaryingNV(program, index, location_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback2.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback2.c new file mode 100644 index 0000000..900c94f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVTransformFeedback2.c @@ -0,0 +1,51 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBindTransformFeedbackNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRY *glDeleteTransformFeedbacksNVPROC) (GLsizei n, const GLuint * ids); +typedef void (APIENTRY *glGenTransformFeedbacksNVPROC) (GLsizei n, GLuint * ids); +typedef GLboolean (APIENTRY *glIsTransformFeedbackNVPROC) (GLuint id); +typedef void (APIENTRY *glPauseTransformFeedbackNVPROC) (); +typedef void (APIENTRY *glResumeTransformFeedbackNVPROC) (); +typedef void (APIENTRY *glDrawTransformFeedbackNVPROC) (GLenum mode, GLuint id); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglBindTransformFeedbackNV(JNIEnv *env, jclass clazz, jint target, jint id, jlong function_pointer) { + glBindTransformFeedbackNVPROC glBindTransformFeedbackNV = (glBindTransformFeedbackNVPROC)((intptr_t)function_pointer); + glBindTransformFeedbackNV(target, id); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglDeleteTransformFeedbacksNV(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDeleteTransformFeedbacksNVPROC glDeleteTransformFeedbacksNV = (glDeleteTransformFeedbacksNVPROC)((intptr_t)function_pointer); + glDeleteTransformFeedbacksNV(n, ids_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglGenTransformFeedbacksNV(JNIEnv *env, jclass clazz, jint n, jlong ids, jlong function_pointer) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenTransformFeedbacksNVPROC glGenTransformFeedbacksNV = (glGenTransformFeedbacksNVPROC)((intptr_t)function_pointer); + glGenTransformFeedbacksNV(n, ids_address); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglIsTransformFeedbackNV(JNIEnv *env, jclass clazz, jint id, jlong function_pointer) { + glIsTransformFeedbackNVPROC glIsTransformFeedbackNV = (glIsTransformFeedbackNVPROC)((intptr_t)function_pointer); + GLboolean __result = glIsTransformFeedbackNV(id); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglPauseTransformFeedbackNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glPauseTransformFeedbackNVPROC glPauseTransformFeedbackNV = (glPauseTransformFeedbackNVPROC)((intptr_t)function_pointer); + glPauseTransformFeedbackNV(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglResumeTransformFeedbackNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glResumeTransformFeedbackNVPROC glResumeTransformFeedbackNV = (glResumeTransformFeedbackNVPROC)((intptr_t)function_pointer); + glResumeTransformFeedbackNV(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVTransformFeedback2_nglDrawTransformFeedbackNV(JNIEnv *env, jclass clazz, jint mode, jint id, jlong function_pointer) { + glDrawTransformFeedbackNVPROC glDrawTransformFeedbackNV = (glDrawTransformFeedbackNVPROC)((intptr_t)function_pointer); + glDrawTransformFeedbackNV(mode, id); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexArrayRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexArrayRange.c new file mode 100644 index 0000000..6776cb7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexArrayRange.c @@ -0,0 +1,33 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexArrayRangeNVPROC) (GLsizei size, const GLvoid * pPointer); +typedef void (APIENTRY *glFlushVertexArrayRangeNVPROC) (); +typedef GLvoid * (APIENTRY *glAllocateMemoryNVPROC) (GLint size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (APIENTRY *glFreeMemoryNVPROC) (GLvoid * pointer); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexArrayRange_nglVertexArrayRangeNV(JNIEnv *env, jclass clazz, jint size, jlong pPointer, jlong function_pointer) { + const GLvoid *pPointer_address = (const GLvoid *)(intptr_t)pPointer; + glVertexArrayRangeNVPROC glVertexArrayRangeNV = (glVertexArrayRangeNVPROC)((intptr_t)function_pointer); + glVertexArrayRangeNV(size, pPointer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexArrayRange_nglFlushVertexArrayRangeNV(JNIEnv *env, jclass clazz, jlong function_pointer) { + glFlushVertexArrayRangeNVPROC glFlushVertexArrayRangeNV = (glFlushVertexArrayRangeNVPROC)((intptr_t)function_pointer); + glFlushVertexArrayRangeNV(); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_NVVertexArrayRange_nglAllocateMemoryNV(JNIEnv *env, jclass clazz, jint size, jfloat readFrequency, jfloat writeFrequency, jfloat priority, jlong result_size, jlong function_pointer) { + glAllocateMemoryNVPROC glAllocateMemoryNV = (glAllocateMemoryNVPROC)((intptr_t)function_pointer); + GLvoid * __result = glAllocateMemoryNV(size, readFrequency, writeFrequency, priority); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexArrayRange_nglFreeMemoryNV(JNIEnv *env, jclass clazz, jlong pointer, jlong function_pointer) { + GLvoid *pointer_address = (GLvoid *)(intptr_t)pointer; + glFreeMemoryNVPROC glFreeMemoryNV = (glFreeMemoryNVPROC)((intptr_t)function_pointer); + glFreeMemoryNV(pointer_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexAttribInteger64bit.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexAttribInteger64bit.c new file mode 100644 index 0000000..c8b3c92 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexAttribInteger64bit.c @@ -0,0 +1,130 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glVertexAttribL1i64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRY *glVertexAttribL2i64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRY *glVertexAttribL3i64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRY *glVertexAttribL4i64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRY *glVertexAttribL1i64vNVPROC) (GLuint index, const GLint64EXT * v); +typedef void (APIENTRY *glVertexAttribL2i64vNVPROC) (GLuint index, const GLint64EXT * v); +typedef void (APIENTRY *glVertexAttribL3i64vNVPROC) (GLuint index, const GLint64EXT * v); +typedef void (APIENTRY *glVertexAttribL4i64vNVPROC) (GLuint index, const GLint64EXT * v); +typedef void (APIENTRY *glVertexAttribL1ui64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRY *glVertexAttribL2ui64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRY *glVertexAttribL3ui64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRY *glVertexAttribL4ui64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRY *glVertexAttribL1ui64vNVPROC) (GLuint index, const GLuint64EXT * v); +typedef void (APIENTRY *glVertexAttribL2ui64vNVPROC) (GLuint index, const GLuint64EXT * v); +typedef void (APIENTRY *glVertexAttribL3ui64vNVPROC) (GLuint index, const GLuint64EXT * v); +typedef void (APIENTRY *glVertexAttribL4ui64vNVPROC) (GLuint index, const GLuint64EXT * v); +typedef void (APIENTRY *glGetVertexAttribLi64vNVPROC) (GLuint index, GLenum pname, GLint64EXT * params); +typedef void (APIENTRY *glGetVertexAttribLui64vNVPROC) (GLuint index, GLenum pname, GLuint64EXT * params); +typedef void (APIENTRY *glVertexAttribLFormatNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL1i64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong function_pointer) { + glVertexAttribL1i64NVPROC glVertexAttribL1i64NV = (glVertexAttribL1i64NVPROC)((intptr_t)function_pointer); + glVertexAttribL1i64NV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL2i64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong function_pointer) { + glVertexAttribL2i64NVPROC glVertexAttribL2i64NV = (glVertexAttribL2i64NVPROC)((intptr_t)function_pointer); + glVertexAttribL2i64NV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL3i64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong z, jlong function_pointer) { + glVertexAttribL3i64NVPROC glVertexAttribL3i64NV = (glVertexAttribL3i64NVPROC)((intptr_t)function_pointer); + glVertexAttribL3i64NV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL4i64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glVertexAttribL4i64NVPROC glVertexAttribL4i64NV = (glVertexAttribL4i64NVPROC)((intptr_t)function_pointer); + glVertexAttribL4i64NV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL1i64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint64EXT *v_address = (const GLint64EXT *)(intptr_t)v; + glVertexAttribL1i64vNVPROC glVertexAttribL1i64vNV = (glVertexAttribL1i64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL1i64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL2i64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint64EXT *v_address = (const GLint64EXT *)(intptr_t)v; + glVertexAttribL2i64vNVPROC glVertexAttribL2i64vNV = (glVertexAttribL2i64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL2i64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL3i64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint64EXT *v_address = (const GLint64EXT *)(intptr_t)v; + glVertexAttribL3i64vNVPROC glVertexAttribL3i64vNV = (glVertexAttribL3i64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL3i64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL4i64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLint64EXT *v_address = (const GLint64EXT *)(intptr_t)v; + glVertexAttribL4i64vNVPROC glVertexAttribL4i64vNV = (glVertexAttribL4i64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL4i64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL1ui64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong function_pointer) { + glVertexAttribL1ui64NVPROC glVertexAttribL1ui64NV = (glVertexAttribL1ui64NVPROC)((intptr_t)function_pointer); + glVertexAttribL1ui64NV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL2ui64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong function_pointer) { + glVertexAttribL2ui64NVPROC glVertexAttribL2ui64NV = (glVertexAttribL2ui64NVPROC)((intptr_t)function_pointer); + glVertexAttribL2ui64NV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL3ui64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong z, jlong function_pointer) { + glVertexAttribL3ui64NVPROC glVertexAttribL3ui64NV = (glVertexAttribL3ui64NVPROC)((intptr_t)function_pointer); + glVertexAttribL3ui64NV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL4ui64NV(JNIEnv *env, jclass clazz, jint index, jlong x, jlong y, jlong z, jlong w, jlong function_pointer) { + glVertexAttribL4ui64NVPROC glVertexAttribL4ui64NV = (glVertexAttribL4ui64NVPROC)((intptr_t)function_pointer); + glVertexAttribL4ui64NV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL1ui64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint64EXT *v_address = (const GLuint64EXT *)(intptr_t)v; + glVertexAttribL1ui64vNVPROC glVertexAttribL1ui64vNV = (glVertexAttribL1ui64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL1ui64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL2ui64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint64EXT *v_address = (const GLuint64EXT *)(intptr_t)v; + glVertexAttribL2ui64vNVPROC glVertexAttribL2ui64vNV = (glVertexAttribL2ui64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL2ui64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL3ui64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint64EXT *v_address = (const GLuint64EXT *)(intptr_t)v; + glVertexAttribL3ui64vNVPROC glVertexAttribL3ui64vNV = (glVertexAttribL3ui64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL3ui64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribL4ui64vNV(JNIEnv *env, jclass clazz, jint index, jlong v, jlong function_pointer) { + const GLuint64EXT *v_address = (const GLuint64EXT *)(intptr_t)v; + glVertexAttribL4ui64vNVPROC glVertexAttribL4ui64vNV = (glVertexAttribL4ui64vNVPROC)((intptr_t)function_pointer); + glVertexAttribL4ui64vNV(index, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglGetVertexAttribLi64vNV(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLint64EXT *params_address = (GLint64EXT *)(intptr_t)params; + glGetVertexAttribLi64vNVPROC glGetVertexAttribLi64vNV = (glGetVertexAttribLi64vNVPROC)((intptr_t)function_pointer); + glGetVertexAttribLi64vNV(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglGetVertexAttribLui64vNV(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params, jlong function_pointer) { + GLuint64EXT *params_address = (GLuint64EXT *)(intptr_t)params; + glGetVertexAttribLui64vNVPROC glGetVertexAttribLui64vNV = (glGetVertexAttribLui64vNVPROC)((intptr_t)function_pointer); + glGetVertexAttribLui64vNV(index, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexAttribInteger64bit_nglVertexAttribLFormatNV(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong function_pointer) { + glVertexAttribLFormatNVPROC glVertexAttribLFormatNV = (glVertexAttribLFormatNVPROC)((intptr_t)function_pointer); + glVertexAttribLFormatNV(index, size, type, stride); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexBufferUnifiedMemory.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexBufferUnifiedMemory.c new file mode 100644 index 0000000..f9cc07e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexBufferUnifiedMemory.c @@ -0,0 +1,79 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBufferAddressRangeNVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRY *glVertexFormatNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRY *glNormalFormatNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRY *glColorFormatNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRY *glIndexFormatNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRY *glTexCoordFormatNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRY *glEdgeFlagFormatNVPROC) (GLsizei stride); +typedef void (APIENTRY *glSecondaryColorFormatNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRY *glFogCoordFormatNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRY *glVertexAttribFormatNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRY *glVertexAttribIFormatNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRY *glGetIntegerui64i_vNVPROC) (GLenum value, GLuint index, GLuint64EXT * result); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglBufferAddressRangeNV(JNIEnv *env, jclass clazz, jint pname, jint index, jlong address, jlong length, jlong function_pointer) { + glBufferAddressRangeNVPROC glBufferAddressRangeNV = (glBufferAddressRangeNVPROC)((intptr_t)function_pointer); + glBufferAddressRangeNV(pname, index, address, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglVertexFormatNV(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong function_pointer) { + glVertexFormatNVPROC glVertexFormatNV = (glVertexFormatNVPROC)((intptr_t)function_pointer); + glVertexFormatNV(size, type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglNormalFormatNV(JNIEnv *env, jclass clazz, jint type, jint stride, jlong function_pointer) { + glNormalFormatNVPROC glNormalFormatNV = (glNormalFormatNVPROC)((intptr_t)function_pointer); + glNormalFormatNV(type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglColorFormatNV(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong function_pointer) { + glColorFormatNVPROC glColorFormatNV = (glColorFormatNVPROC)((intptr_t)function_pointer); + glColorFormatNV(size, type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglIndexFormatNV(JNIEnv *env, jclass clazz, jint type, jint stride, jlong function_pointer) { + glIndexFormatNVPROC glIndexFormatNV = (glIndexFormatNVPROC)((intptr_t)function_pointer); + glIndexFormatNV(type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglTexCoordFormatNV(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong function_pointer) { + glTexCoordFormatNVPROC glTexCoordFormatNV = (glTexCoordFormatNVPROC)((intptr_t)function_pointer); + glTexCoordFormatNV(size, type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglEdgeFlagFormatNV(JNIEnv *env, jclass clazz, jint stride, jlong function_pointer) { + glEdgeFlagFormatNVPROC glEdgeFlagFormatNV = (glEdgeFlagFormatNVPROC)((intptr_t)function_pointer); + glEdgeFlagFormatNV(stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglSecondaryColorFormatNV(JNIEnv *env, jclass clazz, jint size, jint type, jint stride, jlong function_pointer) { + glSecondaryColorFormatNVPROC glSecondaryColorFormatNV = (glSecondaryColorFormatNVPROC)((intptr_t)function_pointer); + glSecondaryColorFormatNV(size, type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglFogCoordFormatNV(JNIEnv *env, jclass clazz, jint type, jint stride, jlong function_pointer) { + glFogCoordFormatNVPROC glFogCoordFormatNV = (glFogCoordFormatNVPROC)((intptr_t)function_pointer); + glFogCoordFormatNV(type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglVertexAttribFormatNV(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong function_pointer) { + glVertexAttribFormatNVPROC glVertexAttribFormatNV = (glVertexAttribFormatNVPROC)((intptr_t)function_pointer); + glVertexAttribFormatNV(index, size, type, normalized, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglVertexAttribIFormatNV(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong function_pointer) { + glVertexAttribIFormatNVPROC glVertexAttribIFormatNV = (glVertexAttribIFormatNVPROC)((intptr_t)function_pointer); + glVertexAttribIFormatNV(index, size, type, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglGetIntegerui64i_1vNV(JNIEnv *env, jclass clazz, jint value, jint index, jlong result, jlong function_pointer) { + GLuint64EXT *result_address = (GLuint64EXT *)(intptr_t)result; + glGetIntegerui64i_vNVPROC glGetIntegerui64i_vNV = (glGetIntegerui64i_vNVPROC)((intptr_t)function_pointer); + glGetIntegerui64i_vNV(value, index, result_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexProgram.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexProgram.c new file mode 100644 index 0000000..6120a37 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVertexProgram.c @@ -0,0 +1,270 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glExecuteProgramNVPROC) (GLenum target, GLuint id, const GLfloat * params); +typedef void (APIENTRY *glGetProgramParameterfvNVPROC) (GLenum target, GLuint index, GLenum parameterName, GLfloat * params); +typedef void (APIENTRY *glGetProgramParameterdvNVPROC) (GLenum target, GLuint index, GLenum parameterName, GLdouble * params); +typedef void (APIENTRY *glGetTrackMatrixivNVPROC) (GLenum target, GLuint address, GLenum parameterName, GLint * params); +typedef void (APIENTRY *glGetVertexAttribfvNVPROC) (GLuint index, GLenum parameterName, GLfloat * params); +typedef void (APIENTRY *glGetVertexAttribdvNVPROC) (GLuint index, GLenum parameterName, GLdouble * params); +typedef void (APIENTRY *glGetVertexAttribivNVPROC) (GLuint index, GLenum parameterName, GLint * params); +typedef void (APIENTRY *glGetVertexAttribPointervNVPROC) (GLuint index, GLenum parameterName, GLvoid ** pointer); +typedef void (APIENTRY *glProgramParameter4fNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glProgramParameter4dNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glProgramParameters4fvNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat * params); +typedef void (APIENTRY *glProgramParameters4dvNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble * params); +typedef void (APIENTRY *glTrackMatrixNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRY *glVertexAttribPointerNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * buffer); +typedef void (APIENTRY *glVertexAttrib1sNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRY *glVertexAttrib1fNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRY *glVertexAttrib1dNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRY *glVertexAttrib2sNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRY *glVertexAttrib2fNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRY *glVertexAttrib2dNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRY *glVertexAttrib3sNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRY *glVertexAttrib3fNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRY *glVertexAttrib3dNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRY *glVertexAttrib4sNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRY *glVertexAttrib4fNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRY *glVertexAttrib4dNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRY *glVertexAttrib4ubNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRY *glVertexAttribs1svNVPROC) (GLuint index, GLsizei n, const GLshort * v); +typedef void (APIENTRY *glVertexAttribs1fvNVPROC) (GLuint index, GLsizei n, const GLfloat * v); +typedef void (APIENTRY *glVertexAttribs1dvNVPROC) (GLuint index, GLsizei n, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribs2svNVPROC) (GLuint index, GLsizei n, const GLshort * v); +typedef void (APIENTRY *glVertexAttribs2fvNVPROC) (GLuint index, GLsizei n, const GLfloat * v); +typedef void (APIENTRY *glVertexAttribs2dvNVPROC) (GLuint index, GLsizei n, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribs3svNVPROC) (GLuint index, GLsizei n, const GLshort * v); +typedef void (APIENTRY *glVertexAttribs3fvNVPROC) (GLuint index, GLsizei n, const GLfloat * v); +typedef void (APIENTRY *glVertexAttribs3dvNVPROC) (GLuint index, GLsizei n, const GLdouble * v); +typedef void (APIENTRY *glVertexAttribs4svNVPROC) (GLuint index, GLsizei n, const GLshort * v); +typedef void (APIENTRY *glVertexAttribs4fvNVPROC) (GLuint index, GLsizei n, const GLfloat * v); +typedef void (APIENTRY *glVertexAttribs4dvNVPROC) (GLuint index, GLsizei n, const GLdouble * v); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglExecuteProgramNV(JNIEnv *env, jclass clazz, jint target, jint id, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glExecuteProgramNVPROC glExecuteProgramNV = (glExecuteProgramNVPROC)((intptr_t)function_pointer); + glExecuteProgramNV(target, id, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetProgramParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint parameterName, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetProgramParameterfvNVPROC glGetProgramParameterfvNV = (glGetProgramParameterfvNVPROC)((intptr_t)function_pointer); + glGetProgramParameterfvNV(target, index, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetProgramParameterdvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint parameterName, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetProgramParameterdvNVPROC glGetProgramParameterdvNV = (glGetProgramParameterdvNVPROC)((intptr_t)function_pointer); + glGetProgramParameterdvNV(target, index, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetTrackMatrixivNV(JNIEnv *env, jclass clazz, jint target, jint address, jint parameterName, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTrackMatrixivNVPROC glGetTrackMatrixivNV = (glGetTrackMatrixivNVPROC)((intptr_t)function_pointer); + glGetTrackMatrixivNV(target, address, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetVertexAttribfvNV(JNIEnv *env, jclass clazz, jint index, jint parameterName, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVertexAttribfvNVPROC glGetVertexAttribfvNV = (glGetVertexAttribfvNVPROC)((intptr_t)function_pointer); + glGetVertexAttribfvNV(index, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetVertexAttribdvNV(JNIEnv *env, jclass clazz, jint index, jint parameterName, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVertexAttribdvNVPROC glGetVertexAttribdvNV = (glGetVertexAttribdvNVPROC)((intptr_t)function_pointer); + glGetVertexAttribdvNV(index, parameterName, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetVertexAttribivNV(JNIEnv *env, jclass clazz, jint index, jint parameterName, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribivNVPROC glGetVertexAttribivNV = (glGetVertexAttribivNVPROC)((intptr_t)function_pointer); + glGetVertexAttribivNV(index, parameterName, params_address); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetVertexAttribPointervNV(JNIEnv *env, jclass clazz, jint index, jint parameterName, jlong result_size, jlong function_pointer) { + glGetVertexAttribPointervNVPROC glGetVertexAttribPointervNV = (glGetVertexAttribPointervNVPROC)((intptr_t)function_pointer); + GLvoid * __result; + glGetVertexAttribPointervNV(index, parameterName, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglProgramParameter4fNV(JNIEnv *env, jclass clazz, jint target, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glProgramParameter4fNVPROC glProgramParameter4fNV = (glProgramParameter4fNVPROC)((intptr_t)function_pointer); + glProgramParameter4fNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglProgramParameter4dNV(JNIEnv *env, jclass clazz, jint target, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glProgramParameter4dNVPROC glProgramParameter4dNV = (glProgramParameter4dNVPROC)((intptr_t)function_pointer); + glProgramParameter4dNV(target, index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglProgramParameters4fvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glProgramParameters4fvNVPROC glProgramParameters4fvNV = (glProgramParameters4fvNVPROC)((intptr_t)function_pointer); + glProgramParameters4fvNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglProgramParameters4dvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint count, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glProgramParameters4dvNVPROC glProgramParameters4dvNV = (glProgramParameters4dvNVPROC)((intptr_t)function_pointer); + glProgramParameters4dvNV(target, index, count, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglTrackMatrixNV(JNIEnv *env, jclass clazz, jint target, jint address, jint matrix, jint transform, jlong function_pointer) { + glTrackMatrixNVPROC glTrackMatrixNV = (glTrackMatrixNVPROC)((intptr_t)function_pointer); + glTrackMatrixNV(target, address, matrix, transform); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribPointerNV(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribPointerNVPROC glVertexAttribPointerNV = (glVertexAttribPointerNVPROC)((intptr_t)function_pointer); + glVertexAttribPointerNV(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribPointerNVBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer_buffer_offset, jlong function_pointer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribPointerNVPROC glVertexAttribPointerNV = (glVertexAttribPointerNVPROC)((intptr_t)function_pointer); + glVertexAttribPointerNV(index, size, type, stride, buffer_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib1sNV(JNIEnv *env, jclass clazz, jint index, jshort x, jlong function_pointer) { + glVertexAttrib1sNVPROC glVertexAttrib1sNV = (glVertexAttrib1sNVPROC)((intptr_t)function_pointer); + glVertexAttrib1sNV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib1fNV(JNIEnv *env, jclass clazz, jint index, jfloat x, jlong function_pointer) { + glVertexAttrib1fNVPROC glVertexAttrib1fNV = (glVertexAttrib1fNVPROC)((intptr_t)function_pointer); + glVertexAttrib1fNV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib1dNV(JNIEnv *env, jclass clazz, jint index, jdouble x, jlong function_pointer) { + glVertexAttrib1dNVPROC glVertexAttrib1dNV = (glVertexAttrib1dNVPROC)((intptr_t)function_pointer); + glVertexAttrib1dNV(index, x); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib2sNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jlong function_pointer) { + glVertexAttrib2sNVPROC glVertexAttrib2sNV = (glVertexAttrib2sNVPROC)((intptr_t)function_pointer); + glVertexAttrib2sNV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib2fNV(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jlong function_pointer) { + glVertexAttrib2fNVPROC glVertexAttrib2fNV = (glVertexAttrib2fNVPROC)((intptr_t)function_pointer); + glVertexAttrib2fNV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib2dNV(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jlong function_pointer) { + glVertexAttrib2dNVPROC glVertexAttrib2dNV = (glVertexAttrib2dNVPROC)((intptr_t)function_pointer); + glVertexAttrib2dNV(index, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib3sNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jlong function_pointer) { + glVertexAttrib3sNVPROC glVertexAttrib3sNV = (glVertexAttrib3sNVPROC)((intptr_t)function_pointer); + glVertexAttrib3sNV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib3fNV(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jfloat z, jlong function_pointer) { + glVertexAttrib3fNVPROC glVertexAttrib3fNV = (glVertexAttrib3fNVPROC)((intptr_t)function_pointer); + glVertexAttrib3fNV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib3dNV(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jlong function_pointer) { + glVertexAttrib3dNVPROC glVertexAttrib3dNV = (glVertexAttrib3dNVPROC)((intptr_t)function_pointer); + glVertexAttrib3dNV(index, x, y, z); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib4sNV(JNIEnv *env, jclass clazz, jint index, jshort x, jshort y, jshort z, jshort w, jlong function_pointer) { + glVertexAttrib4sNVPROC glVertexAttrib4sNV = (glVertexAttrib4sNVPROC)((intptr_t)function_pointer); + glVertexAttrib4sNV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib4fNV(JNIEnv *env, jclass clazz, jint index, jfloat x, jfloat y, jfloat z, jfloat w, jlong function_pointer) { + glVertexAttrib4fNVPROC glVertexAttrib4fNV = (glVertexAttrib4fNVPROC)((intptr_t)function_pointer); + glVertexAttrib4fNV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib4dNV(JNIEnv *env, jclass clazz, jint index, jdouble x, jdouble y, jdouble z, jdouble w, jlong function_pointer) { + glVertexAttrib4dNVPROC glVertexAttrib4dNV = (glVertexAttrib4dNVPROC)((intptr_t)function_pointer); + glVertexAttrib4dNV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttrib4ubNV(JNIEnv *env, jclass clazz, jint index, jbyte x, jbyte y, jbyte z, jbyte w, jlong function_pointer) { + glVertexAttrib4ubNVPROC glVertexAttrib4ubNV = (glVertexAttrib4ubNVPROC)((intptr_t)function_pointer); + glVertexAttrib4ubNV(index, x, y, z, w); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs1svNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribs1svNVPROC glVertexAttribs1svNV = (glVertexAttribs1svNVPROC)((intptr_t)function_pointer); + glVertexAttribs1svNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs1fvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glVertexAttribs1fvNVPROC glVertexAttribs1fvNV = (glVertexAttribs1fvNVPROC)((intptr_t)function_pointer); + glVertexAttribs1fvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs1dvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribs1dvNVPROC glVertexAttribs1dvNV = (glVertexAttribs1dvNVPROC)((intptr_t)function_pointer); + glVertexAttribs1dvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs2svNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribs2svNVPROC glVertexAttribs2svNV = (glVertexAttribs2svNVPROC)((intptr_t)function_pointer); + glVertexAttribs2svNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs2fvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glVertexAttribs2fvNVPROC glVertexAttribs2fvNV = (glVertexAttribs2fvNVPROC)((intptr_t)function_pointer); + glVertexAttribs2fvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs2dvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribs2dvNVPROC glVertexAttribs2dvNV = (glVertexAttribs2dvNVPROC)((intptr_t)function_pointer); + glVertexAttribs2dvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs3svNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribs3svNVPROC glVertexAttribs3svNV = (glVertexAttribs3svNVPROC)((intptr_t)function_pointer); + glVertexAttribs3svNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs3fvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glVertexAttribs3fvNVPROC glVertexAttribs3fvNV = (glVertexAttribs3fvNVPROC)((intptr_t)function_pointer); + glVertexAttribs3fvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs3dvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribs3dvNVPROC glVertexAttribs3dvNV = (glVertexAttribs3dvNVPROC)((intptr_t)function_pointer); + glVertexAttribs3dvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs4svNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLshort *v_address = (const GLshort *)(intptr_t)v; + glVertexAttribs4svNVPROC glVertexAttribs4svNV = (glVertexAttribs4svNVPROC)((intptr_t)function_pointer); + glVertexAttribs4svNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs4fvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glVertexAttribs4fvNVPROC glVertexAttribs4fvNV = (glVertexAttribs4fvNVPROC)((intptr_t)function_pointer); + glVertexAttribs4fvNV(index, n, v_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglVertexAttribs4dvNV(JNIEnv *env, jclass clazz, jint index, jint n, jlong v, jlong function_pointer) { + const GLdouble *v_address = (const GLdouble *)(intptr_t)v; + glVertexAttribs4dvNVPROC glVertexAttribs4dvNV = (glVertexAttribs4dvNVPROC)((intptr_t)function_pointer); + glVertexAttribs4dvNV(index, n, v_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVideoCapture.c b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVideoCapture.c new file mode 100644 index 0000000..1fd9d51 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengl/org_lwjgl_opengl_NVVideoCapture.c @@ -0,0 +1,88 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef void (APIENTRY *glBeginVideoCaptureNVPROC) (GLuint video_capture_slot); +typedef void (APIENTRY *glBindVideoCaptureStreamBufferNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRY *glBindVideoCaptureStreamTextureNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRY *glEndVideoCaptureNVPROC) (GLuint video_capture_slot); +typedef void (APIENTRY *glGetVideoCaptureivNVPROC) (GLuint video_capture_slot, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVideoCaptureStreamivNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint * params); +typedef void (APIENTRY *glGetVideoCaptureStreamfvNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat * params); +typedef void (APIENTRY *glGetVideoCaptureStreamdvNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble * params); +typedef GLenum (APIENTRY *glVideoCaptureNVPROC) (GLuint video_capture_slot, GLuint * sequence_num, GLuint64EXT * capture_time); +typedef void (APIENTRY *glVideoCaptureStreamParameterivNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint * params); +typedef void (APIENTRY *glVideoCaptureStreamParameterfvNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat * params); +typedef void (APIENTRY *glVideoCaptureStreamParameterdvNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble * params); + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglBeginVideoCaptureNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jlong function_pointer) { + glBeginVideoCaptureNVPROC glBeginVideoCaptureNV = (glBeginVideoCaptureNVPROC)((intptr_t)function_pointer); + glBeginVideoCaptureNV(video_capture_slot); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglBindVideoCaptureStreamBufferNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint frame_region, jlong offset, jlong function_pointer) { + glBindVideoCaptureStreamBufferNVPROC glBindVideoCaptureStreamBufferNV = (glBindVideoCaptureStreamBufferNVPROC)((intptr_t)function_pointer); + glBindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglBindVideoCaptureStreamTextureNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint frame_region, jint target, jint texture, jlong function_pointer) { + glBindVideoCaptureStreamTextureNVPROC glBindVideoCaptureStreamTextureNV = (glBindVideoCaptureStreamTextureNVPROC)((intptr_t)function_pointer); + glBindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglEndVideoCaptureNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jlong function_pointer) { + glEndVideoCaptureNVPROC glEndVideoCaptureNV = (glEndVideoCaptureNVPROC)((intptr_t)function_pointer); + glEndVideoCaptureNV(video_capture_slot); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglGetVideoCaptureivNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVideoCaptureivNVPROC glGetVideoCaptureivNV = (glGetVideoCaptureivNVPROC)((intptr_t)function_pointer); + glGetVideoCaptureivNV(video_capture_slot, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglGetVideoCaptureStreamivNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVideoCaptureStreamivNVPROC glGetVideoCaptureStreamivNV = (glGetVideoCaptureStreamivNVPROC)((intptr_t)function_pointer); + glGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglGetVideoCaptureStreamfvNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVideoCaptureStreamfvNVPROC glGetVideoCaptureStreamfvNV = (glGetVideoCaptureStreamfvNVPROC)((intptr_t)function_pointer); + glGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglGetVideoCaptureStreamdvNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + GLdouble *params_address = (GLdouble *)(intptr_t)params; + glGetVideoCaptureStreamdvNVPROC glGetVideoCaptureStreamdvNV = (glGetVideoCaptureStreamdvNVPROC)((intptr_t)function_pointer); + glGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, params_address); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglVideoCaptureNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jlong sequence_num, jlong capture_time, jlong function_pointer) { + GLuint *sequence_num_address = (GLuint *)(intptr_t)sequence_num; + GLuint64EXT *capture_time_address = (GLuint64EXT *)(intptr_t)capture_time; + glVideoCaptureNVPROC glVideoCaptureNV = (glVideoCaptureNVPROC)((intptr_t)function_pointer); + GLenum __result = glVideoCaptureNV(video_capture_slot, sequence_num_address, capture_time_address); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglVideoCaptureStreamParameterivNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glVideoCaptureStreamParameterivNVPROC glVideoCaptureStreamParameterivNV = (glVideoCaptureStreamParameterivNVPROC)((intptr_t)function_pointer); + glVideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglVideoCaptureStreamParameterfvNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glVideoCaptureStreamParameterfvNVPROC glVideoCaptureStreamParameterfvNV = (glVideoCaptureStreamParameterfvNVPROC)((intptr_t)function_pointer); + glVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVideoCapture_nglVideoCaptureStreamParameterdvNV(JNIEnv *env, jclass clazz, jint video_capture_slot, jint stream, jint pname, jlong params, jlong function_pointer) { + const GLdouble *params_address = (const GLdouble *)(intptr_t)params; + glVideoCaptureStreamParameterdvNVPROC glVideoCaptureStreamParameterdvNV = (glVideoCaptureStreamParameterdvNVPROC)((intptr_t)function_pointer); + glVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params_address); +} + diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_AMDPerformanceMonitor.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_AMDPerformanceMonitor.c new file mode 100644 index 0000000..af3b404 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_AMDPerformanceMonitor.c @@ -0,0 +1,106 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorGroupsAMDPROC) (GLint * numGroups, GLsizei groupsSize, GLuint * groups); +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorCountersAMDPROC) (GLuint group, GLint * numCounters, GLint * maxActiveCounters, GLsizei countersSize, GLuint * counters); +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorGroupStringAMDPROC) (GLuint group, GLsizei bufSize, GLsizei * length, GLchar * groupString); +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorCounterStringAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei * length, GLchar * counterString); +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorCounterInfoAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glGenPerfMonitorsAMDPROC) (GLsizei n, GLuint * monitors); +typedef GL_APICALL void (GL_APIENTRY *glDeletePerfMonitorsAMDPROC) (GLsizei n, GLuint * monitors); +typedef GL_APICALL void (GL_APIENTRY *glSelectPerfMonitorCountersAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint * counterList); +typedef GL_APICALL void (GL_APIENTRY *glBeginPerfMonitorAMDPROC) (GLuint monitor); +typedef GL_APICALL void (GL_APIENTRY *glEndPerfMonitorAMDPROC) (GLuint monitor); +typedef GL_APICALL void (GL_APIENTRY *glGetPerfMonitorCounterDataAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint * data, GLint * bytesWritten); + +static glGetPerfMonitorGroupsAMDPROC glGetPerfMonitorGroupsAMD; +static glGetPerfMonitorCountersAMDPROC glGetPerfMonitorCountersAMD; +static glGetPerfMonitorGroupStringAMDPROC glGetPerfMonitorGroupStringAMD; +static glGetPerfMonitorCounterStringAMDPROC glGetPerfMonitorCounterStringAMD; +static glGetPerfMonitorCounterInfoAMDPROC glGetPerfMonitorCounterInfoAMD; +static glGenPerfMonitorsAMDPROC glGenPerfMonitorsAMD; +static glDeletePerfMonitorsAMDPROC glDeletePerfMonitorsAMD; +static glSelectPerfMonitorCountersAMDPROC glSelectPerfMonitorCountersAMD; +static glBeginPerfMonitorAMDPROC glBeginPerfMonitorAMD; +static glEndPerfMonitorAMDPROC glEndPerfMonitorAMD; +static glGetPerfMonitorCounterDataAMDPROC glGetPerfMonitorCounterDataAMD; + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorGroupsAMD(JNIEnv *env, jclass clazz, jlong numGroups, jint groupsSize, jlong groups) { + GLint *numGroups_address = (GLint *)(intptr_t)numGroups; + GLuint *groups_address = (GLuint *)(intptr_t)groups; + glGetPerfMonitorGroupsAMD(numGroups_address, groupsSize, groups_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCountersAMD(JNIEnv *env, jclass clazz, jint group, jlong numCounters, jlong maxActiveCounters, jint countersSize, jlong counters) { + GLint *numCounters_address = (GLint *)(intptr_t)numCounters; + GLint *maxActiveCounters_address = (GLint *)(intptr_t)maxActiveCounters; + GLuint *counters_address = (GLuint *)(intptr_t)counters; + glGetPerfMonitorCountersAMD(group, numCounters_address, maxActiveCounters_address, countersSize, counters_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorGroupStringAMD(JNIEnv *env, jclass clazz, jint group, jint bufSize, jlong length, jlong groupString) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *groupString_address = (GLchar *)(intptr_t)groupString; + glGetPerfMonitorGroupStringAMD(group, bufSize, length_address, groupString_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterStringAMD(JNIEnv *env, jclass clazz, jint group, jint counter, jint bufSize, jlong length, jlong counterString) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *counterString_address = (GLchar *)(intptr_t)counterString; + glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length_address, counterString_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterInfoAMD(JNIEnv *env, jclass clazz, jint group, jint counter, jint pname, jlong data) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glGetPerfMonitorCounterInfoAMD(group, counter, pname, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGenPerfMonitorsAMD(JNIEnv *env, jclass clazz, jint n, jlong monitors) { + GLuint *monitors_address = (GLuint *)(intptr_t)monitors; + glGenPerfMonitorsAMD(n, monitors_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglDeletePerfMonitorsAMD(JNIEnv *env, jclass clazz, jint n, jlong monitors) { + GLuint *monitors_address = (GLuint *)(intptr_t)monitors; + glDeletePerfMonitorsAMD(n, monitors_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglSelectPerfMonitorCountersAMD(JNIEnv *env, jclass clazz, jint monitor, jboolean enable, jint group, jint numCounters, jlong counterList) { + GLuint *counterList_address = (GLuint *)(intptr_t)counterList; + glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList_address); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglBeginPerfMonitorAMD(JNIEnv *env, jclass clazz, jint monitor) { + glBeginPerfMonitorAMD(monitor); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglEndPerfMonitorAMD(JNIEnv *env, jclass clazz, jint monitor) { + glEndPerfMonitorAMD(monitor); +} + +static void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterDataAMD(JNIEnv *env, jclass clazz, jint monitor, jint pname, jint dataSize, jlong data, jlong bytesWritten) { + GLuint *data_address = (GLuint *)(intptr_t)data; + GLint *bytesWritten_address = (GLint *)(intptr_t)bytesWritten; + glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data_address, bytesWritten_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_AMDPerformanceMonitor_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetPerfMonitorGroupsAMD", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorGroupsAMD, "glGetPerfMonitorGroupsAMD", (void *)&glGetPerfMonitorGroupsAMD, false}, + {"nglGetPerfMonitorCountersAMD", "(IJJIJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCountersAMD, "glGetPerfMonitorCountersAMD", (void *)&glGetPerfMonitorCountersAMD, false}, + {"nglGetPerfMonitorGroupStringAMD", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorGroupStringAMD, "glGetPerfMonitorGroupStringAMD", (void *)&glGetPerfMonitorGroupStringAMD, false}, + {"nglGetPerfMonitorCounterStringAMD", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterStringAMD, "glGetPerfMonitorCounterStringAMD", (void *)&glGetPerfMonitorCounterStringAMD, false}, + {"nglGetPerfMonitorCounterInfoAMD", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterInfoAMD, "glGetPerfMonitorCounterInfoAMD", (void *)&glGetPerfMonitorCounterInfoAMD, false}, + {"nglGenPerfMonitorsAMD", "(IJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGenPerfMonitorsAMD, "glGenPerfMonitorsAMD", (void *)&glGenPerfMonitorsAMD, false}, + {"nglDeletePerfMonitorsAMD", "(IJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglDeletePerfMonitorsAMD, "glDeletePerfMonitorsAMD", (void *)&glDeletePerfMonitorsAMD, false}, + {"nglSelectPerfMonitorCountersAMD", "(IZIIJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglSelectPerfMonitorCountersAMD, "glSelectPerfMonitorCountersAMD", (void *)&glSelectPerfMonitorCountersAMD, false}, + {"nglBeginPerfMonitorAMD", "(I)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglBeginPerfMonitorAMD, "glBeginPerfMonitorAMD", (void *)&glBeginPerfMonitorAMD, false}, + {"nglEndPerfMonitorAMD", "(I)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglEndPerfMonitorAMD, "glEndPerfMonitorAMD", (void *)&glEndPerfMonitorAMD, false}, + {"nglGetPerfMonitorCounterDataAMD", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_AMDPerformanceMonitor_nglGetPerfMonitorCounterDataAMD, "glGetPerfMonitorCounterDataAMD", (void *)&glGetPerfMonitorCounterDataAMD, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferBlit.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferBlit.c new file mode 100644 index 0000000..c46b89b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferBlit.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBlitFramebufferANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +static glBlitFramebufferANGLEPROC glBlitFramebufferANGLE; + +static void JNICALL Java_org_lwjgl_opengles_ANGLEFramebufferBlit_nglBlitFramebufferANGLE(JNIEnv *env, jclass clazz, jint srcX0, jint srcY0, jint srcX1, jint srcY1, jint dstX0, jint dstY0, jint dstX1, jint dstY1, jint mask, jint filter) { + glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_ANGLEFramebufferBlit_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBlitFramebufferANGLE", "(IIIIIIIIII)V", (void *)&Java_org_lwjgl_opengles_ANGLEFramebufferBlit_nglBlitFramebufferANGLE, "glBlitFramebufferANGLE", (void *)&glBlitFramebufferANGLE, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferMultisample.c new file mode 100644 index 0000000..f520d79 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ANGLEFramebufferMultisample.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageMultisampleANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +static glRenderbufferStorageMultisampleANGLEPROC glRenderbufferStorageMultisampleANGLE; + +static void JNICALL Java_org_lwjgl_opengles_ANGLEFramebufferMultisample_nglRenderbufferStorageMultisampleANGLE(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height) { + glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_ANGLEFramebufferMultisample_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglRenderbufferStorageMultisampleANGLE", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_ANGLEFramebufferMultisample_nglRenderbufferStorageMultisampleANGLE, "glRenderbufferStorageMultisampleANGLE", (void *)&glRenderbufferStorageMultisampleANGLE, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLEFramebufferMultisample.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLEFramebufferMultisample.c new file mode 100644 index 0000000..669b8be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLEFramebufferMultisample.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageMultisampleAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glResolveMultisampleFramebufferAPPLEPROC) (); + +static glRenderbufferStorageMultisampleAPPLEPROC glRenderbufferStorageMultisampleAPPLE; +static glResolveMultisampleFramebufferAPPLEPROC glResolveMultisampleFramebufferAPPLE; + +static void JNICALL Java_org_lwjgl_opengles_APPLEFramebufferMultisample_nglRenderbufferStorageMultisampleAPPLE(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height) { + glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_APPLEFramebufferMultisample_nglResolveMultisampleFramebufferAPPLE(JNIEnv *env, jclass clazz) { + glResolveMultisampleFramebufferAPPLE(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_APPLEFramebufferMultisample_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglRenderbufferStorageMultisampleAPPLE", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_APPLEFramebufferMultisample_nglRenderbufferStorageMultisampleAPPLE, "glRenderbufferStorageMultisampleAPPLE", (void *)&glRenderbufferStorageMultisampleAPPLE, false}, + {"nglResolveMultisampleFramebufferAPPLE", "()V", (void *)&Java_org_lwjgl_opengles_APPLEFramebufferMultisample_nglResolveMultisampleFramebufferAPPLE, "glResolveMultisampleFramebufferAPPLE", (void *)&glResolveMultisampleFramebufferAPPLE, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLESync.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLESync.c new file mode 100644 index 0000000..040bf03 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_APPLESync.c @@ -0,0 +1,69 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL GLsync (GL_APIENTRY *glFenceSyncAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsSyncAPPLEPROC) (GLsync sync); +typedef GL_APICALL void (GL_APIENTRY *glDeleteSyncAPPLEPROC) (GLsync sync); +typedef GL_APICALL GLenum (GL_APIENTRY *glClientWaitSyncAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GL_APICALL void (GL_APIENTRY *glWaitSyncAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GL_APICALL void (GL_APIENTRY *glGetInteger64vAPPLEPROC) (GLenum pname, GLint64 * params); +typedef GL_APICALL void (GL_APIENTRY *glGetSyncivAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values); + +static glFenceSyncAPPLEPROC glFenceSyncAPPLE; +static glIsSyncAPPLEPROC glIsSyncAPPLE; +static glDeleteSyncAPPLEPROC glDeleteSyncAPPLE; +static glClientWaitSyncAPPLEPROC glClientWaitSyncAPPLE; +static glWaitSyncAPPLEPROC glWaitSyncAPPLE; +static glGetInteger64vAPPLEPROC glGetInteger64vAPPLE; +static glGetSyncivAPPLEPROC glGetSyncivAPPLE; + +static jlong JNICALL Java_org_lwjgl_opengles_APPLESync_nglFenceSyncAPPLE(JNIEnv *env, jclass clazz, jint condition, jint flags) { + GLsync __result = glFenceSyncAPPLE(condition, flags); + return (intptr_t)__result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_APPLESync_nglIsSyncAPPLE(JNIEnv *env, jclass clazz, jlong sync) { + GLboolean __result = glIsSyncAPPLE((GLsync)(intptr_t)sync); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_APPLESync_nglDeleteSyncAPPLE(JNIEnv *env, jclass clazz, jlong sync) { + glDeleteSyncAPPLE((GLsync)(intptr_t)sync); +} + +static jint JNICALL Java_org_lwjgl_opengles_APPLESync_nglClientWaitSyncAPPLE(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout) { + GLenum __result = glClientWaitSyncAPPLE((GLsync)(intptr_t)sync, flags, timeout); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_APPLESync_nglWaitSyncAPPLE(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout) { + glWaitSyncAPPLE((GLsync)(intptr_t)sync, flags, timeout); +} + +static void JNICALL Java_org_lwjgl_opengles_APPLESync_nglGetInteger64vAPPLE(JNIEnv *env, jclass clazz, jint pname, jlong params) { + GLint64 *params_address = (GLint64 *)(intptr_t)params; + glGetInteger64vAPPLE(pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_APPLESync_nglGetSyncivAPPLE(JNIEnv *env, jclass clazz, jlong sync, jint pname, jint bufSize, jlong length, jlong values) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *values_address = (GLint *)(intptr_t)values; + glGetSyncivAPPLE((GLsync)(intptr_t)sync, pname, bufSize, length_address, values_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_APPLESync_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglFenceSyncAPPLE", "(II)J", (void *)&Java_org_lwjgl_opengles_APPLESync_nglFenceSyncAPPLE, "glFenceSyncAPPLE", (void *)&glFenceSyncAPPLE, false}, + {"nglIsSyncAPPLE", "(J)Z", (void *)&Java_org_lwjgl_opengles_APPLESync_nglIsSyncAPPLE, "glIsSyncAPPLE", (void *)&glIsSyncAPPLE, false}, + {"nglDeleteSyncAPPLE", "(J)V", (void *)&Java_org_lwjgl_opengles_APPLESync_nglDeleteSyncAPPLE, "glDeleteSyncAPPLE", (void *)&glDeleteSyncAPPLE, false}, + {"nglClientWaitSyncAPPLE", "(JIJ)I", (void *)&Java_org_lwjgl_opengles_APPLESync_nglClientWaitSyncAPPLE, "glClientWaitSyncAPPLE", (void *)&glClientWaitSyncAPPLE, false}, + {"nglWaitSyncAPPLE", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_APPLESync_nglWaitSyncAPPLE, "glWaitSyncAPPLE", (void *)&glWaitSyncAPPLE, false}, + {"nglGetInteger64vAPPLE", "(IJ)V", (void *)&Java_org_lwjgl_opengles_APPLESync_nglGetInteger64vAPPLE, "glGetInteger64vAPPLE", (void *)&glGetInteger64vAPPLE, false}, + {"nglGetSyncivAPPLE", "(JIIJJ)V", (void *)&Java_org_lwjgl_opengles_APPLESync_nglGetSyncivAPPLE, "glGetSyncivAPPLE", (void *)&glGetSyncivAPPLE, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ARBDrawBuffers.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ARBDrawBuffers.c new file mode 100644 index 0000000..dbff863 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_ARBDrawBuffers.c @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glDrawBuffersARBPROC) (GLsizei size, const GLenum * buffers); + +static glDrawBuffersARBPROC glDrawBuffersARB; + +static void JNICALL Java_org_lwjgl_opengles_ARBDrawBuffers_nglDrawBuffersARB(JNIEnv *env, jclass clazz, jint size, jlong buffers) { + const GLenum *buffers_address = (const GLenum *)(intptr_t)buffers; + glDrawBuffersARB(size, buffers_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_ARBDrawBuffers_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglDrawBuffersARB", "(IJ)V", (void *)&Java_org_lwjgl_opengles_ARBDrawBuffers_nglDrawBuffersARB, "glDrawBuffersARB", (void *)&glDrawBuffersARB, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTBlendMinmax.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTBlendMinmax.c new file mode 100644 index 0000000..12b7fe5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTBlendMinmax.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBlendEquationEXTPROC) (GLenum mode); + +static glBlendEquationEXTPROC glBlendEquationEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTBlendMinmax_nglBlendEquationEXT(JNIEnv *env, jclass clazz, jint mode) { + glBlendEquationEXT(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTBlendMinmax_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBlendEquationEXT", "(I)V", (void *)&Java_org_lwjgl_opengles_EXTBlendMinmax_nglBlendEquationEXT, "glBlendEquationEXT", (void *)&glBlendEquationEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTCopyTextureLevels.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTCopyTextureLevels.c new file mode 100644 index 0000000..9e7ca38 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTCopyTextureLevels.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glCopyTextureLevelsAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); + +static glCopyTextureLevelsAPPLEPROC glCopyTextureLevelsAPPLE; + +static void JNICALL Java_org_lwjgl_opengles_EXTCopyTextureLevels_nglCopyTextureLevelsAPPLE(JNIEnv *env, jclass clazz, jint destinationTexture, jint sourceTexture, jint sourceBaseLevel, jint sourceLevelCount) { + glCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTCopyTextureLevels_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglCopyTextureLevelsAPPLE", "(IIII)V", (void *)&Java_org_lwjgl_opengles_EXTCopyTextureLevels_nglCopyTextureLevelsAPPLE, "glCopyTextureLevelsAPPLE", (void *)&glCopyTextureLevelsAPPLE, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugLabel.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugLabel.c new file mode 100644 index 0000000..208e69e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugLabel.c @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glLabelObjectEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar * label); +typedef GL_APICALL void (GL_APIENTRY *glGetObjectLabelEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei * length, GLchar * label); + +static glLabelObjectEXTPROC glLabelObjectEXT; +static glGetObjectLabelEXTPROC glGetObjectLabelEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTDebugLabel_nglLabelObjectEXT(JNIEnv *env, jclass clazz, jint type, jint object, jint length, jlong label) { + const GLchar *label_address = (const GLchar *)(intptr_t)label; + glLabelObjectEXT(type, object, length, label_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTDebugLabel_nglGetObjectLabelEXT(JNIEnv *env, jclass clazz, jint type, jint object, jint bufSize, jlong length, jlong label) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *label_address = (GLchar *)(intptr_t)label; + glGetObjectLabelEXT(type, object, bufSize, length_address, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTDebugLabel_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglLabelObjectEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTDebugLabel_nglLabelObjectEXT, "glLabelObjectEXT", (void *)&glLabelObjectEXT, false}, + {"nglGetObjectLabelEXT", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_EXTDebugLabel_nglGetObjectLabelEXT, "glGetObjectLabelEXT", (void *)&glGetObjectLabelEXT, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugMarker.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugMarker.c new file mode 100644 index 0000000..d9c7168 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDebugMarker.c @@ -0,0 +1,36 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glInsertEventMarkerEXTPROC) (GLsizei length, const GLchar * marker); +typedef GL_APICALL void (GL_APIENTRY *glPushGroupMarkerEXTPROC) (GLsizei length, const GLchar * marker); +typedef GL_APICALL void (GL_APIENTRY *glPopGroupMarkerEXTPROC) (); + +static glInsertEventMarkerEXTPROC glInsertEventMarkerEXT; +static glPushGroupMarkerEXTPROC glPushGroupMarkerEXT; +static glPopGroupMarkerEXTPROC glPopGroupMarkerEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTDebugMarker_nglInsertEventMarkerEXT(JNIEnv *env, jclass clazz, jint length, jlong marker) { + const GLchar *marker_address = (const GLchar *)(intptr_t)marker; + glInsertEventMarkerEXT(length, marker_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTDebugMarker_nglPushGroupMarkerEXT(JNIEnv *env, jclass clazz, jint length, jlong marker) { + const GLchar *marker_address = (const GLchar *)(intptr_t)marker; + glPushGroupMarkerEXT(length, marker_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTDebugMarker_nglPopGroupMarkerEXT(JNIEnv *env, jclass clazz) { + glPopGroupMarkerEXT(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTDebugMarker_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglInsertEventMarkerEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTDebugMarker_nglInsertEventMarkerEXT, "glInsertEventMarkerEXT", (void *)&glInsertEventMarkerEXT, false}, + {"nglPushGroupMarkerEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTDebugMarker_nglPushGroupMarkerEXT, "glPushGroupMarkerEXT", (void *)&glPushGroupMarkerEXT, false}, + {"nglPopGroupMarkerEXT", "()V", (void *)&Java_org_lwjgl_opengles_EXTDebugMarker_nglPopGroupMarkerEXT, "glPopGroupMarkerEXT", (void *)&glPopGroupMarkerEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDiscardFramebuffer.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDiscardFramebuffer.c new file mode 100644 index 0000000..8b7e7ce --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTDiscardFramebuffer.c @@ -0,0 +1,21 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glDiscardFramebufferEXTPROC) (GLenum target, GLsizei numAttachments, const GLenum * attachments); + +static glDiscardFramebufferEXTPROC glDiscardFramebufferEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTDiscardFramebuffer_nglDiscardFramebufferEXT(JNIEnv *env, jclass clazz, jint target, jint numAttachments, jlong attachments) { + const GLenum *attachments_address = (const GLenum *)(intptr_t)attachments; + glDiscardFramebufferEXT(target, numAttachments, attachments_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTDiscardFramebuffer_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglDiscardFramebufferEXT", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_EXTDiscardFramebuffer_nglDiscardFramebufferEXT, "glDiscardFramebufferEXT", (void *)&glDiscardFramebufferEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMapBufferRange.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMapBufferRange.c new file mode 100644 index 0000000..9810e41 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMapBufferRange.c @@ -0,0 +1,28 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL GLvoid * (GL_APIENTRY *glMapBufferRangeEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GL_APICALL void (GL_APIENTRY *glFlushMappedBufferRangeEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); + +static glMapBufferRangeEXTPROC glMapBufferRangeEXT; +static glFlushMappedBufferRangeEXTPROC glFlushMappedBufferRangeEXT; + +static jobject JNICALL Java_org_lwjgl_opengles_EXTMapBufferRange_nglMapBufferRangeEXT(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length, jint access, jobject old_buffer) { + GLvoid * __result = glMapBufferRangeEXT(target, offset, length, access); + return safeNewBufferCached(env, __result, length, old_buffer); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTMapBufferRange_nglFlushMappedBufferRangeEXT(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length) { + glFlushMappedBufferRangeEXT(target, offset, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTMapBufferRange_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglMapBufferRangeEXT", "(IJJIJLjava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_EXTMapBufferRange_nglMapBufferRangeEXT, "glMapBufferRangeEXT", (void *)&glMapBufferRangeEXT, false}, + {"nglFlushMappedBufferRangeEXT", "(IJJ)V", (void *)&Java_org_lwjgl_opengles_EXTMapBufferRange_nglFlushMappedBufferRangeEXT, "glFlushMappedBufferRangeEXT", (void *)&glFlushMappedBufferRangeEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiDrawArrays.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiDrawArrays.c new file mode 100644 index 0000000..4f2588e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiDrawArrays.c @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glMultiDrawArraysEXTPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount); + +static glMultiDrawArraysEXTPROC glMultiDrawArraysEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTMultiDrawArrays_nglMultiDrawArraysEXT(JNIEnv *env, jclass clazz, jint mode, jlong first, jlong count, jint primcount) { + GLint *first_address = (GLint *)(intptr_t)first; + GLsizei *count_address = (GLsizei *)(intptr_t)count; + glMultiDrawArraysEXT(mode, first_address, count_address, primcount); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTMultiDrawArrays_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglMultiDrawArraysEXT", "(IJJI)V", (void *)&Java_org_lwjgl_opengles_EXTMultiDrawArrays_nglMultiDrawArraysEXT, "glMultiDrawArraysEXT", (void *)&glMultiDrawArraysEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultisampledRenderToTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultisampledRenderToTexture.c new file mode 100644 index 0000000..9a93665 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultisampledRenderToTexture.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageMultisampleEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTexture2DMultisampleEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); + +static glRenderbufferStorageMultisampleEXTPROC glRenderbufferStorageMultisampleEXT; +static glFramebufferTexture2DMultisampleEXTPROC glFramebufferTexture2DMultisampleEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTMultisampledRenderToTexture_nglRenderbufferStorageMultisampleEXT(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height) { + glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTMultisampledRenderToTexture_nglFramebufferTexture2DMultisampleEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint samples) { + glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTMultisampledRenderToTexture_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglRenderbufferStorageMultisampleEXT", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_EXTMultisampledRenderToTexture_nglRenderbufferStorageMultisampleEXT, "glRenderbufferStorageMultisampleEXT", (void *)&glRenderbufferStorageMultisampleEXT, false}, + {"nglFramebufferTexture2DMultisampleEXT", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_EXTMultisampledRenderToTexture_nglFramebufferTexture2DMultisampleEXT, "glFramebufferTexture2DMultisampleEXT", (void *)&glFramebufferTexture2DMultisampleEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiviewDrawBuffers.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiviewDrawBuffers.c new file mode 100644 index 0000000..5ae2855 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTMultiviewDrawBuffers.c @@ -0,0 +1,38 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glReadBufferIndexedEXTPROC) (GLenum src, GLint index); +typedef GL_APICALL void (GL_APIENTRY *glDrawBuffersIndexedEXTPROC) (GLint n, const GLenum * location, const GLint * indices); +typedef GL_APICALL void (GL_APIENTRY *glGetIntegeri_vEXTPROC) (GLenum target, GLuint index, GLint * data); + +static glReadBufferIndexedEXTPROC glReadBufferIndexedEXT; +static glDrawBuffersIndexedEXTPROC glDrawBuffersIndexedEXT; +static glGetIntegeri_vEXTPROC glGetIntegeri_vEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglReadBufferIndexedEXT(JNIEnv *env, jclass clazz, jint src, jint index) { + glReadBufferIndexedEXT(src, index); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglDrawBuffersIndexedEXT(JNIEnv *env, jclass clazz, jint n, jlong location, jlong indices) { + const GLenum *location_address = (const GLenum *)(intptr_t)location; + const GLint *indices_address = (const GLint *)(intptr_t)indices; + glDrawBuffersIndexedEXT(n, location_address, indices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglGetIntegeri_1vEXT(JNIEnv *env, jclass clazz, jint target, jint index, jlong data) { + GLint *data_address = (GLint *)(intptr_t)data; + glGetIntegeri_vEXT(target, index, data_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglReadBufferIndexedEXT", "(II)V", (void *)&Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglReadBufferIndexedEXT, "glReadBufferIndexedEXT", (void *)&glReadBufferIndexedEXT, false}, + {"nglDrawBuffersIndexedEXT", "(IJJ)V", (void *)&Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglDrawBuffersIndexedEXT, "glDrawBuffersIndexedEXT", (void *)&glDrawBuffersIndexedEXT, false}, + {"nglGetIntegeri_vEXT", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_EXTMultiviewDrawBuffers_nglGetIntegeri_1vEXT, "glGetIntegeri_vEXT", (void *)&glGetIntegeri_vEXT, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTOcclusionQueryBoolean.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTOcclusionQueryBoolean.c new file mode 100644 index 0000000..0cac9ee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTOcclusionQueryBoolean.c @@ -0,0 +1,68 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGenQueriesEXTPROC) (GLsizei n, GLuint * ids); +typedef GL_APICALL void (GL_APIENTRY *glDeleteQueriesEXTPROC) (GLsizei n, GLuint * ids); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsQueryEXTPROC) (GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glBeginQueryEXTPROC) (GLenum target, GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glEndQueryEXTPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glGetQueryivEXTPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetQueryObjectuivEXTPROC) (GLuint id, GLenum pname, GLint * params); + +static glGenQueriesEXTPROC glGenQueriesEXT; +static glDeleteQueriesEXTPROC glDeleteQueriesEXT; +static glIsQueryEXTPROC glIsQueryEXT; +static glBeginQueryEXTPROC glBeginQueryEXT; +static glEndQueryEXTPROC glEndQueryEXT; +static glGetQueryivEXTPROC glGetQueryivEXT; +static glGetQueryObjectuivEXTPROC glGetQueryObjectuivEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGenQueriesEXT(JNIEnv *env, jclass clazz, jint n, jlong ids) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenQueriesEXT(n, ids_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglDeleteQueriesEXT(JNIEnv *env, jclass clazz, jint n, jlong ids) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glDeleteQueriesEXT(n, ids_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglIsQueryEXT(JNIEnv *env, jclass clazz, jint id) { + GLboolean __result = glIsQueryEXT(id); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglBeginQueryEXT(JNIEnv *env, jclass clazz, jint target, jint id) { + glBeginQueryEXT(target, id); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglEndQueryEXT(JNIEnv *env, jclass clazz, jint target) { + glEndQueryEXT(target); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGetQueryivEXT(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryivEXT(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGetQueryObjectuivEXT(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryObjectuivEXT(id, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGenQueriesEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGenQueriesEXT, "glGenQueriesEXT", (void *)&glGenQueriesEXT, false}, + {"nglDeleteQueriesEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglDeleteQueriesEXT, "glDeleteQueriesEXT", (void *)&glDeleteQueriesEXT, false}, + {"nglIsQueryEXT", "(I)Z", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglIsQueryEXT, "glIsQueryEXT", (void *)&glIsQueryEXT, false}, + {"nglBeginQueryEXT", "(II)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglBeginQueryEXT, "glBeginQueryEXT", (void *)&glBeginQueryEXT, false}, + {"nglEndQueryEXT", "(I)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglEndQueryEXT, "glEndQueryEXT", (void *)&glEndQueryEXT, false}, + {"nglGetQueryivEXT", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGetQueryivEXT, "glGetQueryivEXT", (void *)&glGetQueryivEXT, false}, + {"nglGetQueryObjectuivEXT", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_EXTOcclusionQueryBoolean_nglGetQueryObjectuivEXT, "glGetQueryObjectuivEXT", (void *)&glGetQueryObjectuivEXT, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTRobustness.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTRobustness.c new file mode 100644 index 0000000..96ba7b9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTRobustness.c @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL GLenum (GL_APIENTRY *glGetGraphicsResetStatusEXTPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glReadnPixelsEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glGetnUniformfvEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetnUniformivEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint * params); + +static glGetGraphicsResetStatusEXTPROC glGetGraphicsResetStatusEXT; +static glReadnPixelsEXTPROC glReadnPixelsEXT; +static glGetnUniformfvEXTPROC glGetnUniformfvEXT; +static glGetnUniformivEXTPROC glGetnUniformivEXT; + +static jint JNICALL Java_org_lwjgl_opengles_EXTRobustness_nglGetGraphicsResetStatusEXT(JNIEnv *env, jclass clazz) { + GLenum __result = glGetGraphicsResetStatusEXT(); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_EXTRobustness_nglReadnPixelsEXT(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jint bufSize, jlong data) { + GLvoid *data_address = (GLvoid *)(intptr_t)data; + glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTRobustness_nglGetnUniformfvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetnUniformfvEXT(program, location, bufSize, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTRobustness_nglGetnUniformivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint bufSize, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetnUniformivEXT(program, location, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTRobustness_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetGraphicsResetStatusEXT", "()I", (void *)&Java_org_lwjgl_opengles_EXTRobustness_nglGetGraphicsResetStatusEXT, "glGetGraphicsResetStatusEXT", (void *)&glGetGraphicsResetStatusEXT, false}, + {"nglReadnPixelsEXT", "(IIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTRobustness_nglReadnPixelsEXT, "glReadnPixelsEXT", (void *)&glReadnPixelsEXT, false}, + {"nglGetnUniformfvEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTRobustness_nglGetnUniformfvEXT, "glGetnUniformfvEXT", (void *)&glGetnUniformfvEXT, false}, + {"nglGetnUniformivEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTRobustness_nglGetnUniformivEXT, "glGetnUniformivEXT", (void *)&glGetnUniformivEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTSeparateShaderObjects.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTSeparateShaderObjects.c new file mode 100644 index 0000000..1d19488 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTSeparateShaderObjects.c @@ -0,0 +1,277 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glUseProgramStagesEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glActiveShaderProgramEXTPROC) (GLuint pipeline, GLuint program); +typedef GL_APICALL GLuint (GL_APIENTRY *glCreateShaderProgramvEXTPROC) (GLenum type, GLsizei count, const GLchar ** string); +typedef GL_APICALL void (GL_APIENTRY *glBindProgramPipelineEXTPROC) (GLuint pipeline); +typedef GL_APICALL void (GL_APIENTRY *glDeleteProgramPipelinesEXTPROC) (GLsizei n, const GLuint * pipelines); +typedef GL_APICALL void (GL_APIENTRY *glGenProgramPipelinesEXTPROC) (GLsizei n, GLuint * pipelines); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsProgramPipelineEXTPROC) (GLuint pipeline); +typedef GL_APICALL void (GL_APIENTRY *glProgramParameteriEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef GL_APICALL void (GL_APIENTRY *glGetProgramPipelineivEXTPROC) (GLuint pipeline, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform1iEXTPROC) (GLuint program, GLint location, GLint v0); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform2iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform3iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform4iEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform1fEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform2fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform3fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform4fEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform1ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform2ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform3ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform4ivEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform1fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform2fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform3fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniform4fvEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniformMatrix2fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniformMatrix3fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glProgramUniformMatrix4fvEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glValidateProgramPipelineEXTPROC) (GLuint pipeline); +typedef GL_APICALL void (GL_APIENTRY *glGetProgramPipelineInfoLogEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); + +static glUseProgramStagesEXTPROC glUseProgramStagesEXT; +static glActiveShaderProgramEXTPROC glActiveShaderProgramEXT; +static glCreateShaderProgramvEXTPROC glCreateShaderProgramvEXT; +static glBindProgramPipelineEXTPROC glBindProgramPipelineEXT; +static glDeleteProgramPipelinesEXTPROC glDeleteProgramPipelinesEXT; +static glGenProgramPipelinesEXTPROC glGenProgramPipelinesEXT; +static glIsProgramPipelineEXTPROC glIsProgramPipelineEXT; +static glProgramParameteriEXTPROC glProgramParameteriEXT; +static glGetProgramPipelineivEXTPROC glGetProgramPipelineivEXT; +static glProgramUniform1iEXTPROC glProgramUniform1iEXT; +static glProgramUniform2iEXTPROC glProgramUniform2iEXT; +static glProgramUniform3iEXTPROC glProgramUniform3iEXT; +static glProgramUniform4iEXTPROC glProgramUniform4iEXT; +static glProgramUniform1fEXTPROC glProgramUniform1fEXT; +static glProgramUniform2fEXTPROC glProgramUniform2fEXT; +static glProgramUniform3fEXTPROC glProgramUniform3fEXT; +static glProgramUniform4fEXTPROC glProgramUniform4fEXT; +static glProgramUniform1ivEXTPROC glProgramUniform1ivEXT; +static glProgramUniform2ivEXTPROC glProgramUniform2ivEXT; +static glProgramUniform3ivEXTPROC glProgramUniform3ivEXT; +static glProgramUniform4ivEXTPROC glProgramUniform4ivEXT; +static glProgramUniform1fvEXTPROC glProgramUniform1fvEXT; +static glProgramUniform2fvEXTPROC glProgramUniform2fvEXT; +static glProgramUniform3fvEXTPROC glProgramUniform3fvEXT; +static glProgramUniform4fvEXTPROC glProgramUniform4fvEXT; +static glProgramUniformMatrix2fvEXTPROC glProgramUniformMatrix2fvEXT; +static glProgramUniformMatrix3fvEXTPROC glProgramUniformMatrix3fvEXT; +static glProgramUniformMatrix4fvEXTPROC glProgramUniformMatrix4fvEXT; +static glValidateProgramPipelineEXTPROC glValidateProgramPipelineEXT; +static glGetProgramPipelineInfoLogEXTPROC glGetProgramPipelineInfoLogEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglUseProgramStagesEXT(JNIEnv *env, jclass clazz, jint pipeline, jint stages, jint program) { + glUseProgramStagesEXT(pipeline, stages, program); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglActiveShaderProgramEXT(JNIEnv *env, jclass clazz, jint pipeline, jint program) { + glActiveShaderProgramEXT(pipeline, program); +} + +static jint JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT(JNIEnv *env, jclass clazz, jint type, jint count, jlong string) { + const GLchar *string_address = (const GLchar *)(intptr_t)string; + GLuint __result = glCreateShaderProgramvEXT(type, count, (const GLchar **)&string_address); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT2(JNIEnv *env, jclass clazz, jint type, jint count, jlong strings) { + const GLchar *strings_address = (const GLchar *)(intptr_t)strings; + int _str_i; + GLchar *_str_address; + GLchar **strings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + GLuint __result; + _str_i = 0; + _str_address = (GLchar *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + __result = glCreateShaderProgramvEXT(type, count, (const GLchar **)&strings_str); + free(strings_str); + return __result; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT3(JNIEnv *env, jclass clazz, jint type, jint count, jobjectArray strings) { + int _ptr_i; + jobject _ptr_object; + GLchar **strings_ptr = (GLchar **) malloc(count * sizeof(GLchar *)); + GLuint __result; + _ptr_i = 0; + while ( _ptr_i < count ) { + _ptr_object = (*env)->GetObjectArrayElement(env, strings, _ptr_i); + strings_ptr[_ptr_i++] = (GLchar *)(*env)->GetDirectBufferAddress(env, _ptr_object); + } + __result = glCreateShaderProgramvEXT(type, count, (const GLchar **)strings_ptr); + free(strings_ptr); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglBindProgramPipelineEXT(JNIEnv *env, jclass clazz, jint pipeline) { + glBindProgramPipelineEXT(pipeline); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglDeleteProgramPipelinesEXT(JNIEnv *env, jclass clazz, jint n, jlong pipelines) { + const GLuint *pipelines_address = (const GLuint *)(intptr_t)pipelines; + glDeleteProgramPipelinesEXT(n, pipelines_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGenProgramPipelinesEXT(JNIEnv *env, jclass clazz, jint n, jlong pipelines) { + GLuint *pipelines_address = (GLuint *)(intptr_t)pipelines; + glGenProgramPipelinesEXT(n, pipelines_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglIsProgramPipelineEXT(JNIEnv *env, jclass clazz, jint pipeline) { + GLboolean __result = glIsProgramPipelineEXT(pipeline); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramParameteriEXT(JNIEnv *env, jclass clazz, jint program, jint pname, jint value) { + glProgramParameteriEXT(program, pname, value); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGetProgramPipelineivEXT(JNIEnv *env, jclass clazz, jint pipeline, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramPipelineivEXT(pipeline, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0) { + glProgramUniform1iEXT(program, location, v0); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1) { + glProgramUniform2iEXT(program, location, v0, v1); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2) { + glProgramUniform3iEXT(program, location, v0, v1, v2); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4iEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint v0, jint v1, jint v2, jint v3) { + glProgramUniform4iEXT(program, location, v0, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0) { + glProgramUniform1fEXT(program, location, v0); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1) { + glProgramUniform2fEXT(program, location, v0, v1); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2) { + glProgramUniform3fEXT(program, location, v0, v1, v2); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4fEXT(JNIEnv *env, jclass clazz, jint program, jint location, jfloat v0, jfloat v1, jfloat v2, jfloat v3) { + glProgramUniform4fEXT(program, location, v0, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform1ivEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform2ivEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform3ivEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4ivEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glProgramUniform4ivEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform1fvEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform2fvEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform3fvEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniform4fvEXT(program, location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix2fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix2fvEXT(program, location, count, transpose, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix3fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix3fvEXT(program, location, count, transpose, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix4fvEXT(JNIEnv *env, jclass clazz, jint program, jint location, jint count, jboolean transpose, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glProgramUniformMatrix4fvEXT(program, location, count, transpose, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglValidateProgramPipelineEXT(JNIEnv *env, jclass clazz, jint pipeline) { + glValidateProgramPipelineEXT(pipeline); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGetProgramPipelineInfoLogEXT(JNIEnv *env, jclass clazz, jint pipeline, jint bufSize, jlong length, jlong infoLog) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetProgramPipelineInfoLogEXT(pipeline, bufSize, length_address, infoLog_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTSeparateShaderObjects_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglUseProgramStagesEXT", "(III)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglUseProgramStagesEXT, "glUseProgramStagesEXT", (void *)&glUseProgramStagesEXT, false}, + {"nglActiveShaderProgramEXT", "(II)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglActiveShaderProgramEXT, "glActiveShaderProgramEXT", (void *)&glActiveShaderProgramEXT, false}, + {"nglCreateShaderProgramvEXT", "(IIJ)I", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT, "glCreateShaderProgramvEXT", (void *)&glCreateShaderProgramvEXT, false}, + {"nglCreateShaderProgramvEXT2", "(IIJ)I", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT2, "glCreateShaderProgramvEXT", (void *)&glCreateShaderProgramvEXT, false}, + {"nglCreateShaderProgramvEXT3", "(II[Ljava/nio/ByteBuffer;)I", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglCreateShaderProgramvEXT3, "glCreateShaderProgramvEXT", (void *)&glCreateShaderProgramvEXT, false}, + {"nglBindProgramPipelineEXT", "(I)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglBindProgramPipelineEXT, "glBindProgramPipelineEXT", (void *)&glBindProgramPipelineEXT, false}, + {"nglDeleteProgramPipelinesEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglDeleteProgramPipelinesEXT, "glDeleteProgramPipelinesEXT", (void *)&glDeleteProgramPipelinesEXT, false}, + {"nglGenProgramPipelinesEXT", "(IJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGenProgramPipelinesEXT, "glGenProgramPipelinesEXT", (void *)&glGenProgramPipelinesEXT, false}, + {"nglIsProgramPipelineEXT", "(I)Z", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglIsProgramPipelineEXT, "glIsProgramPipelineEXT", (void *)&glIsProgramPipelineEXT, false}, + {"nglProgramParameteriEXT", "(III)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramParameteriEXT, "glProgramParameteriEXT", (void *)&glProgramParameteriEXT, false}, + {"nglGetProgramPipelineivEXT", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGetProgramPipelineivEXT, "glGetProgramPipelineivEXT", (void *)&glGetProgramPipelineivEXT, false}, + {"nglProgramUniform1iEXT", "(III)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1iEXT, "glProgramUniform1iEXT", (void *)&glProgramUniform1iEXT, false}, + {"nglProgramUniform2iEXT", "(IIII)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2iEXT, "glProgramUniform2iEXT", (void *)&glProgramUniform2iEXT, false}, + {"nglProgramUniform3iEXT", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3iEXT, "glProgramUniform3iEXT", (void *)&glProgramUniform3iEXT, false}, + {"nglProgramUniform4iEXT", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4iEXT, "glProgramUniform4iEXT", (void *)&glProgramUniform4iEXT, false}, + {"nglProgramUniform1fEXT", "(IIF)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1fEXT, "glProgramUniform1fEXT", (void *)&glProgramUniform1fEXT, false}, + {"nglProgramUniform2fEXT", "(IIFF)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2fEXT, "glProgramUniform2fEXT", (void *)&glProgramUniform2fEXT, false}, + {"nglProgramUniform3fEXT", "(IIFFF)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3fEXT, "glProgramUniform3fEXT", (void *)&glProgramUniform3fEXT, false}, + {"nglProgramUniform4fEXT", "(IIFFFF)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4fEXT, "glProgramUniform4fEXT", (void *)&glProgramUniform4fEXT, false}, + {"nglProgramUniform1ivEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1ivEXT, "glProgramUniform1ivEXT", (void *)&glProgramUniform1ivEXT, false}, + {"nglProgramUniform2ivEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2ivEXT, "glProgramUniform2ivEXT", (void *)&glProgramUniform2ivEXT, false}, + {"nglProgramUniform3ivEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3ivEXT, "glProgramUniform3ivEXT", (void *)&glProgramUniform3ivEXT, false}, + {"nglProgramUniform4ivEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4ivEXT, "glProgramUniform4ivEXT", (void *)&glProgramUniform4ivEXT, false}, + {"nglProgramUniform1fvEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform1fvEXT, "glProgramUniform1fvEXT", (void *)&glProgramUniform1fvEXT, false}, + {"nglProgramUniform2fvEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform2fvEXT, "glProgramUniform2fvEXT", (void *)&glProgramUniform2fvEXT, false}, + {"nglProgramUniform3fvEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform3fvEXT, "glProgramUniform3fvEXT", (void *)&glProgramUniform3fvEXT, false}, + {"nglProgramUniform4fvEXT", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniform4fvEXT, "glProgramUniform4fvEXT", (void *)&glProgramUniform4fvEXT, false}, + {"nglProgramUniformMatrix2fvEXT", "(IIIZJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix2fvEXT, "glProgramUniformMatrix2fvEXT", (void *)&glProgramUniformMatrix2fvEXT, false}, + {"nglProgramUniformMatrix3fvEXT", "(IIIZJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix3fvEXT, "glProgramUniformMatrix3fvEXT", (void *)&glProgramUniformMatrix3fvEXT, false}, + {"nglProgramUniformMatrix4fvEXT", "(IIIZJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglProgramUniformMatrix4fvEXT, "glProgramUniformMatrix4fvEXT", (void *)&glProgramUniformMatrix4fvEXT, false}, + {"nglValidateProgramPipelineEXT", "(I)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglValidateProgramPipelineEXT, "glValidateProgramPipelineEXT", (void *)&glValidateProgramPipelineEXT, false}, + {"nglGetProgramPipelineInfoLogEXT", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_EXTSeparateShaderObjects_nglGetProgramPipelineInfoLogEXT, "glGetProgramPipelineInfoLogEXT", (void *)&glGetProgramPipelineInfoLogEXT, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureArray.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureArray.c new file mode 100644 index 0000000..1a70b23 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureArray.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTextureLayerEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + +static glFramebufferTextureLayerEXTPROC glFramebufferTextureLayerEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureArray_nglFramebufferTextureLayerEXT(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer) { + glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTTextureArray_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglFramebufferTextureLayerEXT", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureArray_nglFramebufferTextureLayerEXT, "glFramebufferTextureLayerEXT", (void *)&glFramebufferTextureLayerEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureStorage.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureStorage.c new file mode 100644 index 0000000..b1e2d77 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_EXTTextureStorage.c @@ -0,0 +1,55 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glTexStorage1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef GL_APICALL void (GL_APIENTRY *glTexStorage2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glTexStorage3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef GL_APICALL void (GL_APIENTRY *glTextureStorage1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef GL_APICALL void (GL_APIENTRY *glTextureStorage2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glTextureStorage3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +static glTexStorage1DEXTPROC glTexStorage1DEXT; +static glTexStorage2DEXTPROC glTexStorage2DEXT; +static glTexStorage3DEXTPROC glTexStorage3DEXT; +static glTextureStorage1DEXTPROC glTextureStorage1DEXT; +static glTextureStorage2DEXTPROC glTextureStorage2DEXT; +static glTextureStorage3DEXTPROC glTextureStorage3DEXT; + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage1DEXT(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width) { + glTexStorage1DEXT(target, levels, internalformat, width); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage2DEXT(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height) { + glTexStorage2DEXT(target, levels, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage3DEXT(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height, jint depth) { + glTexStorage3DEXT(target, levels, internalformat, width, height, depth); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage1DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width) { + glTextureStorage1DEXT(texture, target, levels, internalformat, width); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage2DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width, jint height) { + glTextureStorage2DEXT(texture, target, levels, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage3DEXT(JNIEnv *env, jclass clazz, jint texture, jint target, jint levels, jint internalformat, jint width, jint height, jint depth) { + glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_EXTTextureStorage_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglTexStorage1DEXT", "(IIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage1DEXT, "glTexStorage1DEXT", (void *)&glTexStorage1DEXT, false}, + {"nglTexStorage2DEXT", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage2DEXT, "glTexStorage2DEXT", (void *)&glTexStorage2DEXT, false}, + {"nglTexStorage3DEXT", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTexStorage3DEXT, "glTexStorage3DEXT", (void *)&glTexStorage3DEXT, false}, + {"nglTextureStorage1DEXT", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage1DEXT, "glTextureStorage1DEXT", (void *)&glTextureStorage1DEXT, false}, + {"nglTextureStorage2DEXT", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage2DEXT, "glTextureStorage2DEXT", (void *)&glTextureStorage2DEXT, false}, + {"nglTextureStorage3DEXT", "(IIIIIII)V", (void *)&Java_org_lwjgl_opengles_EXTTextureStorage_nglTextureStorage3DEXT, "glTextureStorage3DEXT", (void *)&glTextureStorage3DEXT, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES20.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES20.c new file mode 100644 index 0000000..2a02394 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES20.c @@ -0,0 +1,1124 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glActiveTexturePROC) (GLenum texture); +typedef GL_APICALL void (GL_APIENTRY *glAttachShaderPROC) (GLuint program, GLuint shader); +typedef GL_APICALL void (GL_APIENTRY *glBindAttribLocationPROC) (GLuint program, GLuint index, const GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glBindBufferPROC) (GLenum target, GLuint buffer); +typedef GL_APICALL void (GL_APIENTRY *glBindFramebufferPROC) (GLenum target, GLuint framebuffer); +typedef GL_APICALL void (GL_APIENTRY *glBindRenderbufferPROC) (GLenum target, GLuint renderbuffer); +typedef GL_APICALL void (GL_APIENTRY *glBindTexturePROC) (GLenum target, GLuint texture); +typedef GL_APICALL void (GL_APIENTRY *glBlendColorPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef GL_APICALL void (GL_APIENTRY *glBlendEquationPROC) (GLenum mode); +typedef GL_APICALL void (GL_APIENTRY *glBlendEquationSeparatePROC) (GLenum modeRGB, GLenum modeAlpha); +typedef GL_APICALL void (GL_APIENTRY *glBlendFuncPROC) (GLenum sfactor, GLenum dfactor); +typedef GL_APICALL void (GL_APIENTRY *glBlendFuncSeparatePROC) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef GL_APICALL void (GL_APIENTRY *glBufferDataPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); +typedef GL_APICALL void (GL_APIENTRY *glBufferSubDataPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); +typedef GL_APICALL GLenum (GL_APIENTRY *glCheckFramebufferStatusPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glClearPROC) (GLbitfield mask); +typedef GL_APICALL void (GL_APIENTRY *glClearColorPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef GL_APICALL void (GL_APIENTRY *glClearDepthfPROC) (GLclampf depth); +typedef GL_APICALL void (GL_APIENTRY *glClearStencilPROC) (GLint s); +typedef GL_APICALL void (GL_APIENTRY *glColorMaskPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef GL_APICALL void (GL_APIENTRY *glCompileShaderPROC) (GLuint shader); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexImage2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glCopyTexImage2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef GL_APICALL void (GL_APIENTRY *glCopyTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GL_APICALL GLuint (GL_APIENTRY *glCreateProgramPROC) (); +typedef GL_APICALL GLuint (GL_APIENTRY *glCreateShaderPROC) (GLenum type); +typedef GL_APICALL void (GL_APIENTRY *glCullFacePROC) (GLenum mode); +typedef GL_APICALL void (GL_APIENTRY *glDeleteBuffersPROC) (GLsizei n, const GLuint * buffers); +typedef GL_APICALL void (GL_APIENTRY *glDeleteFramebuffersPROC) (GLint n, const GLuint * framebuffers); +typedef GL_APICALL void (GL_APIENTRY *glDeleteProgramPROC) (GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glDeleteRenderbuffersPROC) (GLint n, const GLuint * renderbuffers); +typedef GL_APICALL void (GL_APIENTRY *glDeleteShaderPROC) (GLuint shader); +typedef GL_APICALL void (GL_APIENTRY *glDeleteTexturesPROC) (GLsizei n, const GLuint * textures); +typedef GL_APICALL void (GL_APIENTRY *glDepthFuncPROC) (GLenum func); +typedef GL_APICALL void (GL_APIENTRY *glDepthMaskPROC) (GLboolean flag); +typedef GL_APICALL void (GL_APIENTRY *glDepthRangefPROC) (GLclampf zNear, GLclampf zFar); +typedef GL_APICALL void (GL_APIENTRY *glDetachShaderPROC) (GLuint program, GLuint shader); +typedef GL_APICALL void (GL_APIENTRY *glDisablePROC) (GLenum cap); +typedef GL_APICALL void (GL_APIENTRY *glDisableVertexAttribArrayPROC) (GLuint index); +typedef GL_APICALL void (GL_APIENTRY *glDrawArraysPROC) (GLenum mode, GLint first, GLsizei count); +typedef GL_APICALL void (GL_APIENTRY *glDrawElementsPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices); +typedef GL_APICALL void (GL_APIENTRY *glEnablePROC) (GLenum cap); +typedef GL_APICALL void (GL_APIENTRY *glEnableVertexAttribArrayPROC) (GLuint index); +typedef GL_APICALL void (GL_APIENTRY *glFinishPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glFlushPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferRenderbufferPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTexture2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef GL_APICALL void (GL_APIENTRY *glFrontFacePROC) (GLenum mode); +typedef GL_APICALL void (GL_APIENTRY *glGenBuffersPROC) (GLsizei n, GLuint * buffers); +typedef GL_APICALL void (GL_APIENTRY *glGenerateMipmapPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glGenFramebuffersPROC) (GLint n, GLuint * framebuffers); +typedef GL_APICALL void (GL_APIENTRY *glGenRenderbuffersPROC) (GLint n, GLuint * renderbuffers); +typedef GL_APICALL void (GL_APIENTRY *glGenTexturesPROC) (GLsizei n, GLuint * textures); +typedef GL_APICALL void (GL_APIENTRY *glGetActiveAttribPROC) (GLuint program, GLuint index, GLsizei bufsize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glGetActiveUniformPROC) (GLuint program, GLuint index, GLsizei bufsize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glGetAttachedShadersPROC) (GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GL_APICALL GLint (GL_APIENTRY *glGetAttribLocationPROC) (GLuint program, const GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glGetBooleanvPROC) (GLenum pname, GLboolean * params); +typedef GL_APICALL void (GL_APIENTRY *glGetBufferParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL GLenum (GL_APIENTRY *glGetErrorPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glGetFloatvPROC) (GLenum pname, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetFramebufferAttachmentParameterivPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetIntegervPROC) (GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetProgramivPROC) (GLuint program, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetProgramInfoLogPROC) (GLuint program, GLsizei bufsize, GLsizei * length, GLchar * infoLog); +typedef GL_APICALL void (GL_APIENTRY *glGetRenderbufferParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetShaderivPROC) (GLuint shader, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetShaderInfoLogPROC) (GLuint shader, GLsizei bufsize, GLsizei * length, GLchar * infoLog); +typedef GL_APICALL void (GL_APIENTRY *glGetShaderPrecisionFormatPROC) (GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); +typedef GL_APICALL void (GL_APIENTRY *glGetShaderSourcePROC) (GLuint shader, GLsizei bufsize, GLsizei * length, GLchar * source); +typedef GL_APICALL const GLubyte * (GL_APIENTRY *glGetStringPROC) (GLenum name); +typedef GL_APICALL void (GL_APIENTRY *glGetTexParameterfvPROC) (GLenum target, GLenum pname, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetTexParameterivPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetUniformfvPROC) (GLuint program, GLint location, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetUniformivPROC) (GLuint program, GLint location, GLint * params); +typedef GL_APICALL GLint (GL_APIENTRY *glGetUniformLocationPROC) (GLuint program, const GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glGetVertexAttribfvPROC) (GLuint index, GLenum pname, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetVertexAttribivPROC) (GLuint index, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetVertexAttribPointervPROC) (GLuint index, GLenum pname, GLvoid ** pointer); +typedef GL_APICALL void (GL_APIENTRY *glHintPROC) (GLenum target, GLenum mode); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsBufferPROC) (GLuint buffer); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsEnabledPROC) (GLenum cap); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsFramebufferPROC) (GLuint framebuffer); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsProgramPROC) (GLuint program); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsRenderbufferPROC) (GLuint renderbuffer); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsShaderPROC) (GLuint shader); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsTexturePROC) (GLuint texture); +typedef GL_APICALL void (GL_APIENTRY *glLineWidthPROC) (GLfloat width); +typedef GL_APICALL void (GL_APIENTRY *glLinkProgramPROC) (GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glPixelStoreiPROC) (GLenum pname, GLint param); +typedef GL_APICALL void (GL_APIENTRY *glPolygonOffsetPROC) (GLfloat factor, GLfloat units); +typedef GL_APICALL void (GL_APIENTRY *glReadPixelsPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glReleaseShaderCompilerPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStoragePROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glSampleCoveragePROC) (GLclampf value, GLboolean invert); +typedef GL_APICALL void (GL_APIENTRY *glScissorPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glShaderBinaryPROC) (GLsizei n, const GLuint * shaders, GLenum binaryformat, const GLvoid * binary, GLsizei length); +typedef GL_APICALL void (GL_APIENTRY *glShaderSourcePROC) (GLuint shader, GLsizei count, const GLchar ** string, const GLint* length); +typedef GL_APICALL void (GL_APIENTRY *glStencilFuncPROC) (GLenum func, GLint ref, GLuint mask); +typedef GL_APICALL void (GL_APIENTRY *glStencilFuncSeparatePROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef GL_APICALL void (GL_APIENTRY *glStencilMaskPROC) (GLuint mask); +typedef GL_APICALL void (GL_APIENTRY *glStencilMaskSeparatePROC) (GLenum face, GLuint mask); +typedef GL_APICALL void (GL_APIENTRY *glStencilOpPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef GL_APICALL void (GL_APIENTRY *glStencilOpSeparatePROC) (GLenum face, GLenum fail, GLenum zfail, GLenum zpass); +typedef GL_APICALL void (GL_APIENTRY *glTexImage2DPROC) (GLenum target, GLint level, GLint internalformat, GLint width, GLint height, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glTexParameterfPROC) (GLenum target, GLenum pname, GLfloat param); +typedef GL_APICALL void (GL_APIENTRY *glTexParameterfvPROC) (GLenum target, GLenum pname, const GLfloat * param); +typedef GL_APICALL void (GL_APIENTRY *glTexParameteriPROC) (GLenum target, GLenum pname, GLint param); +typedef GL_APICALL void (GL_APIENTRY *glTexParameterivPROC) (GLenum target, GLenum pname, const GLint * param); +typedef GL_APICALL void (GL_APIENTRY *glTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glUniform1fPROC) (GLint location, GLfloat x); +typedef GL_APICALL void (GL_APIENTRY *glUniform1fvPROC) (GLint location, GLsizei count, const GLfloat * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform1iPROC) (GLint location, GLint x); +typedef GL_APICALL void (GL_APIENTRY *glUniform1ivPROC) (GLint location, GLsizei count, const GLint * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform2fPROC) (GLint location, GLfloat x, GLfloat y); +typedef GL_APICALL void (GL_APIENTRY *glUniform2fvPROC) (GLint location, GLsizei count, const GLfloat * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform2iPROC) (GLint location, GLint x, GLint y); +typedef GL_APICALL void (GL_APIENTRY *glUniform2ivPROC) (GLint location, GLsizei count, const GLint * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform3fPROC) (GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef GL_APICALL void (GL_APIENTRY *glUniform3fvPROC) (GLint location, GLsizei count, const GLfloat * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform3iPROC) (GLint location, GLint x, GLint y, GLint z); +typedef GL_APICALL void (GL_APIENTRY *glUniform3ivPROC) (GLint location, GLsizei count, const GLint * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform4fPROC) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef GL_APICALL void (GL_APIENTRY *glUniform4fvPROC) (GLint location, GLsizei count, const GLfloat * v); +typedef GL_APICALL void (GL_APIENTRY *glUniform4iPROC) (GLint location, GLint x, GLint y, GLint z, GLint w); +typedef GL_APICALL void (GL_APIENTRY *glUniform4ivPROC) (GLint location, GLsizei count, const GLint * v); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix2fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix3fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix4fvPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUseProgramPROC) (GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glValidateProgramPROC) (GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib1fPROC) (GLuint indx, GLfloat x); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib1fvPROC) (GLuint indx, const GLfloat * values); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib2fPROC) (GLuint indx, GLfloat x, GLfloat y); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib2fvPROC) (GLuint indx, const GLfloat * values); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib3fPROC) (GLuint indx, GLfloat x, GLfloat y, GLfloat z); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib3fvPROC) (GLuint indx, const GLfloat * values); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib4fPROC) (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttrib4fvPROC) (GLuint indx, const GLfloat * values); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribPointerPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * buffer); +typedef GL_APICALL void (GL_APIENTRY *glViewportPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +static glActiveTexturePROC glActiveTexture; +static glAttachShaderPROC glAttachShader; +static glBindAttribLocationPROC glBindAttribLocation; +static glBindBufferPROC glBindBuffer; +static glBindFramebufferPROC glBindFramebuffer; +static glBindRenderbufferPROC glBindRenderbuffer; +static glBindTexturePROC glBindTexture; +static glBlendColorPROC glBlendColor; +static glBlendEquationPROC glBlendEquation; +static glBlendEquationSeparatePROC glBlendEquationSeparate; +static glBlendFuncPROC glBlendFunc; +static glBlendFuncSeparatePROC glBlendFuncSeparate; +static glBufferDataPROC glBufferData; +static glBufferSubDataPROC glBufferSubData; +static glCheckFramebufferStatusPROC glCheckFramebufferStatus; +static glClearPROC glClear; +static glClearColorPROC glClearColor; +static glClearDepthfPROC glClearDepthf; +static glClearStencilPROC glClearStencil; +static glColorMaskPROC glColorMask; +static glCompileShaderPROC glCompileShader; +static glCompressedTexImage2DPROC glCompressedTexImage2D; +static glCompressedTexSubImage2DPROC glCompressedTexSubImage2D; +static glCopyTexImage2DPROC glCopyTexImage2D; +static glCopyTexSubImage2DPROC glCopyTexSubImage2D; +static glCreateProgramPROC glCreateProgram; +static glCreateShaderPROC glCreateShader; +static glCullFacePROC glCullFace; +static glDeleteBuffersPROC glDeleteBuffers; +static glDeleteFramebuffersPROC glDeleteFramebuffers; +static glDeleteProgramPROC glDeleteProgram; +static glDeleteRenderbuffersPROC glDeleteRenderbuffers; +static glDeleteShaderPROC glDeleteShader; +static glDeleteTexturesPROC glDeleteTextures; +static glDepthFuncPROC glDepthFunc; +static glDepthMaskPROC glDepthMask; +static glDepthRangefPROC glDepthRangef; +static glDetachShaderPROC glDetachShader; +static glDisablePROC glDisable; +static glDisableVertexAttribArrayPROC glDisableVertexAttribArray; +static glDrawArraysPROC glDrawArrays; +static glDrawElementsPROC glDrawElements; +static glEnablePROC glEnable; +static glEnableVertexAttribArrayPROC glEnableVertexAttribArray; +static glFinishPROC glFinish; +static glFlushPROC glFlush; +static glFramebufferRenderbufferPROC glFramebufferRenderbuffer; +static glFramebufferTexture2DPROC glFramebufferTexture2D; +static glFrontFacePROC glFrontFace; +static glGenBuffersPROC glGenBuffers; +static glGenerateMipmapPROC glGenerateMipmap; +static glGenFramebuffersPROC glGenFramebuffers; +static glGenRenderbuffersPROC glGenRenderbuffers; +static glGenTexturesPROC glGenTextures; +static glGetActiveAttribPROC glGetActiveAttrib; +static glGetActiveUniformPROC glGetActiveUniform; +static glGetAttachedShadersPROC glGetAttachedShaders; +static glGetAttribLocationPROC glGetAttribLocation; +static glGetBooleanvPROC glGetBooleanv; +static glGetBufferParameterivPROC glGetBufferParameteriv; +static glGetErrorPROC glGetError; +static glGetFloatvPROC glGetFloatv; +static glGetFramebufferAttachmentParameterivPROC glGetFramebufferAttachmentParameteriv; +static glGetIntegervPROC glGetIntegerv; +static glGetProgramivPROC glGetProgramiv; +static glGetProgramInfoLogPROC glGetProgramInfoLog; +static glGetRenderbufferParameterivPROC glGetRenderbufferParameteriv; +static glGetShaderivPROC glGetShaderiv; +static glGetShaderInfoLogPROC glGetShaderInfoLog; +static glGetShaderPrecisionFormatPROC glGetShaderPrecisionFormat; +static glGetShaderSourcePROC glGetShaderSource; +static glGetStringPROC glGetString; +static glGetTexParameterfvPROC glGetTexParameterfv; +static glGetTexParameterivPROC glGetTexParameteriv; +static glGetUniformfvPROC glGetUniformfv; +static glGetUniformivPROC glGetUniformiv; +static glGetUniformLocationPROC glGetUniformLocation; +static glGetVertexAttribfvPROC glGetVertexAttribfv; +static glGetVertexAttribivPROC glGetVertexAttribiv; +static glGetVertexAttribPointervPROC glGetVertexAttribPointerv; +static glHintPROC glHint; +static glIsBufferPROC glIsBuffer; +static glIsEnabledPROC glIsEnabled; +static glIsFramebufferPROC glIsFramebuffer; +static glIsProgramPROC glIsProgram; +static glIsRenderbufferPROC glIsRenderbuffer; +static glIsShaderPROC glIsShader; +static glIsTexturePROC glIsTexture; +static glLineWidthPROC glLineWidth; +static glLinkProgramPROC glLinkProgram; +static glPixelStoreiPROC glPixelStorei; +static glPolygonOffsetPROC glPolygonOffset; +static glReadPixelsPROC glReadPixels; +static glReleaseShaderCompilerPROC glReleaseShaderCompiler; +static glRenderbufferStoragePROC glRenderbufferStorage; +static glSampleCoveragePROC glSampleCoverage; +static glScissorPROC glScissor; +static glShaderBinaryPROC glShaderBinary; +static glShaderSourcePROC glShaderSource; +static glStencilFuncPROC glStencilFunc; +static glStencilFuncSeparatePROC glStencilFuncSeparate; +static glStencilMaskPROC glStencilMask; +static glStencilMaskSeparatePROC glStencilMaskSeparate; +static glStencilOpPROC glStencilOp; +static glStencilOpSeparatePROC glStencilOpSeparate; +static glTexImage2DPROC glTexImage2D; +static glTexParameterfPROC glTexParameterf; +static glTexParameterfvPROC glTexParameterfv; +static glTexParameteriPROC glTexParameteri; +static glTexParameterivPROC glTexParameteriv; +static glTexSubImage2DPROC glTexSubImage2D; +static glUniform1fPROC glUniform1f; +static glUniform1fvPROC glUniform1fv; +static glUniform1iPROC glUniform1i; +static glUniform1ivPROC glUniform1iv; +static glUniform2fPROC glUniform2f; +static glUniform2fvPROC glUniform2fv; +static glUniform2iPROC glUniform2i; +static glUniform2ivPROC glUniform2iv; +static glUniform3fPROC glUniform3f; +static glUniform3fvPROC glUniform3fv; +static glUniform3iPROC glUniform3i; +static glUniform3ivPROC glUniform3iv; +static glUniform4fPROC glUniform4f; +static glUniform4fvPROC glUniform4fv; +static glUniform4iPROC glUniform4i; +static glUniform4ivPROC glUniform4iv; +static glUniformMatrix2fvPROC glUniformMatrix2fv; +static glUniformMatrix3fvPROC glUniformMatrix3fv; +static glUniformMatrix4fvPROC glUniformMatrix4fv; +static glUseProgramPROC glUseProgram; +static glValidateProgramPROC glValidateProgram; +static glVertexAttrib1fPROC glVertexAttrib1f; +static glVertexAttrib1fvPROC glVertexAttrib1fv; +static glVertexAttrib2fPROC glVertexAttrib2f; +static glVertexAttrib2fvPROC glVertexAttrib2fv; +static glVertexAttrib3fPROC glVertexAttrib3f; +static glVertexAttrib3fvPROC glVertexAttrib3fv; +static glVertexAttrib4fPROC glVertexAttrib4f; +static glVertexAttrib4fvPROC glVertexAttrib4fv; +static glVertexAttribPointerPROC glVertexAttribPointer; +static glViewportPROC glViewport; + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglActiveTexture(JNIEnv *env, jclass clazz, jint texture) { + glActiveTexture(texture); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglAttachShader(JNIEnv *env, jclass clazz, jint program, jint shader) { + glAttachShader(program, shader); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBindAttribLocation(JNIEnv *env, jclass clazz, jint program, jint index, jlong name) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + glBindAttribLocation(program, index, name_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBindBuffer(JNIEnv *env, jclass clazz, jint target, jint buffer) { + glBindBuffer(target, buffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBindFramebuffer(JNIEnv *env, jclass clazz, jint target, jint framebuffer) { + glBindFramebuffer(target, framebuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBindRenderbuffer(JNIEnv *env, jclass clazz, jint target, jint renderbuffer) { + glBindRenderbuffer(target, renderbuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBindTexture(JNIEnv *env, jclass clazz, jint target, jint texture) { + glBindTexture(target, texture); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBlendColor(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha) { + glBlendColor(red, green, blue, alpha); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBlendEquation(JNIEnv *env, jclass clazz, jint mode) { + glBlendEquation(mode); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBlendEquationSeparate(JNIEnv *env, jclass clazz, jint modeRGB, jint modeAlpha) { + glBlendEquationSeparate(modeRGB, modeAlpha); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBlendFunc(JNIEnv *env, jclass clazz, jint sfactor, jint dfactor) { + glBlendFunc(sfactor, dfactor); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBlendFuncSeparate(JNIEnv *env, jclass clazz, jint srcRGB, jint dstRGB, jint srcAlpha, jint dstAlpha) { + glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBufferData(JNIEnv *env, jclass clazz, jint target, jlong size, jlong data, jint usage) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferData(target, size, data_address, usage); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglBufferSubData(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong size, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glBufferSubData(target, offset, size, data_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglCheckFramebufferStatus(JNIEnv *env, jclass clazz, jint target) { + GLenum __result = glCheckFramebufferStatus(target); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglClear(JNIEnv *env, jclass clazz, jint mask) { + glClear(mask); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglClearColor(JNIEnv *env, jclass clazz, jfloat red, jfloat green, jfloat blue, jfloat alpha) { + glClearColor(red, green, blue, alpha); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglClearDepthf(JNIEnv *env, jclass clazz, jfloat depth) { + glClearDepthf(depth); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglClearStencil(JNIEnv *env, jclass clazz, jint s) { + glClearStencil(s); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglColorMask(JNIEnv *env, jclass clazz, jboolean red, jboolean green, jboolean blue, jboolean alpha) { + glColorMask(red, green, blue, alpha); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCompileShader(JNIEnv *env, jclass clazz, jint shader) { + glCompileShader(shader); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCompressedTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCompressedTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCopyTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint x, jint y, jint width, jint height, jint border) { + glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCopyTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint x, jint y, jint width, jint height) { + glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglCreateProgram(JNIEnv *env, jclass clazz) { + GLuint __result = glCreateProgram(); + return __result; +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglCreateShader(JNIEnv *env, jclass clazz, jint type) { + GLuint __result = glCreateShader(type); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglCullFace(JNIEnv *env, jclass clazz, jint mode) { + glCullFace(mode); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers) { + const GLuint *buffers_address = (const GLuint *)(intptr_t)buffers; + glDeleteBuffers(n, buffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteFramebuffers(JNIEnv *env, jclass clazz, jint n, jlong framebuffers) { + const GLuint *framebuffers_address = (const GLuint *)(intptr_t)framebuffers; + glDeleteFramebuffers(n, framebuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteProgram(JNIEnv *env, jclass clazz, jint program) { + glDeleteProgram(program); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteRenderbuffers(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers) { + const GLuint *renderbuffers_address = (const GLuint *)(intptr_t)renderbuffers; + glDeleteRenderbuffers(n, renderbuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteShader(JNIEnv *env, jclass clazz, jint shader) { + glDeleteShader(shader); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDeleteTextures(JNIEnv *env, jclass clazz, jint n, jlong textures) { + const GLuint *textures_address = (const GLuint *)(intptr_t)textures; + glDeleteTextures(n, textures_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDepthFunc(JNIEnv *env, jclass clazz, jint func) { + glDepthFunc(func); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDepthMask(JNIEnv *env, jclass clazz, jboolean flag) { + glDepthMask(flag); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDepthRangef(JNIEnv *env, jclass clazz, jfloat zNear, jfloat zFar) { + glDepthRangef(zNear, zFar); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDetachShader(JNIEnv *env, jclass clazz, jint program, jint shader) { + glDetachShader(program, shader); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDisable(JNIEnv *env, jclass clazz, jint cap) { + glDisable(cap); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDisableVertexAttribArray(JNIEnv *env, jclass clazz, jint index) { + glDisableVertexAttribArray(index); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDrawArrays(JNIEnv *env, jclass clazz, jint mode, jint first, jint count) { + glDrawArrays(mode, first, count); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDrawElements(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElements(mode, count, type, indices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglDrawElementsBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElements(mode, count, type, indices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglEnable(JNIEnv *env, jclass clazz, jint cap) { + glEnable(cap); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglEnableVertexAttribArray(JNIEnv *env, jclass clazz, jint index) { + glEnableVertexAttribArray(index); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglFinish(JNIEnv *env, jclass clazz) { + glFinish(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglFlush(JNIEnv *env, jclass clazz) { + glFlush(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglFramebufferRenderbuffer(JNIEnv *env, jclass clazz, jint target, jint attachment, jint renderbuffertarget, jint renderbuffer) { + glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglFramebufferTexture2D(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level) { + glFramebufferTexture2D(target, attachment, textarget, texture, level); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglFrontFace(JNIEnv *env, jclass clazz, jint mode) { + glFrontFace(mode); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGenBuffers(JNIEnv *env, jclass clazz, jint n, jlong buffers) { + GLuint *buffers_address = (GLuint *)(intptr_t)buffers; + glGenBuffers(n, buffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGenerateMipmap(JNIEnv *env, jclass clazz, jint target) { + glGenerateMipmap(target); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGenFramebuffers(JNIEnv *env, jclass clazz, jint n, jlong framebuffers) { + GLuint *framebuffers_address = (GLuint *)(intptr_t)framebuffers; + glGenFramebuffers(n, framebuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGenRenderbuffers(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers) { + GLuint *renderbuffers_address = (GLuint *)(intptr_t)renderbuffers; + glGenRenderbuffers(n, renderbuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGenTextures(JNIEnv *env, jclass clazz, jint n, jlong textures) { + GLuint *textures_address = (GLuint *)(intptr_t)textures; + glGenTextures(n, textures_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetActiveAttrib(JNIEnv *env, jclass clazz, jint program, jint index, jint bufsize, jlong length, jlong size, jlong type, jlong name) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *size_address = (GLint *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveAttrib(program, index, bufsize, length_address, size_address, type_address, name_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetActiveUniform(JNIEnv *env, jclass clazz, jint program, jint index, jint bufsize, jlong length, jlong size, jlong type, jlong name) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetActiveUniform(program, index, bufsize, length_address, size_address, type_address, name_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetAttachedShaders(JNIEnv *env, jclass clazz, jint program, jint maxCount, jlong count, jlong shaders) { + GLsizei *count_address = (GLsizei *)(intptr_t)count; + GLuint *shaders_address = (GLuint *)(intptr_t)shaders; + glGetAttachedShaders(program, maxCount, count_address, shaders_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglGetAttribLocation(JNIEnv *env, jclass clazz, jint program, jlong name) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + GLint __result = glGetAttribLocation(program, name_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetBooleanv(JNIEnv *env, jclass clazz, jint pname, jlong params) { + GLboolean *params_address = (GLboolean *)(intptr_t)params; + glGetBooleanv(pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetBufferParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetBufferParameteriv(target, pname, params_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglGetError(JNIEnv *env, jclass clazz) { + GLenum __result = glGetError(); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetFloatv(JNIEnv *env, jclass clazz, jint pname, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetFloatv(pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetFramebufferAttachmentParameteriv(JNIEnv *env, jclass clazz, jint target, jint attachment, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFramebufferAttachmentParameteriv(target, attachment, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetIntegerv(JNIEnv *env, jclass clazz, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetIntegerv(pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetProgramiv(JNIEnv *env, jclass clazz, jint program, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetProgramiv(program, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetProgramInfoLog(JNIEnv *env, jclass clazz, jint program, jint bufsize, jlong length, jlong infoLog) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetProgramInfoLog(program, bufsize, length_address, infoLog_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetRenderbufferParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetRenderbufferParameteriv(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetShaderiv(JNIEnv *env, jclass clazz, jint shader, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetShaderiv(shader, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetShaderInfoLog(JNIEnv *env, jclass clazz, jint shader, jint bufsize, jlong length, jlong infoLog) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *infoLog_address = (GLchar *)(intptr_t)infoLog; + glGetShaderInfoLog(shader, bufsize, length_address, infoLog_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetShaderPrecisionFormat(JNIEnv *env, jclass clazz, jint shadertype, jint precisiontype, jlong range, jlong precision) { + GLint *range_address = (GLint *)(intptr_t)range; + GLint *precision_address = (GLint *)(intptr_t)precision; + glGetShaderPrecisionFormat(shadertype, precisiontype, range_address, precision_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetShaderSource(JNIEnv *env, jclass clazz, jint shader, jint bufsize, jlong length, jlong source) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *source_address = (GLchar *)(intptr_t)source; + glGetShaderSource(shader, bufsize, length_address, source_address); +} + +static jobject JNICALL Java_org_lwjgl_opengles_GLES20_nglGetString(JNIEnv *env, jclass clazz, jint name) { + const GLubyte * __result = glGetString(name); + return NewStringNativeUnsigned(env, __result); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetTexParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexParameterfv(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetTexParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexParameteriv(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetUniformfv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetUniformfv(program, location, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetUniformiv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetUniformiv(program, location, params_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES20_nglGetUniformLocation(JNIEnv *env, jclass clazz, jint program, jlong name) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + GLint __result = glGetUniformLocation(program, name_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribfv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetVertexAttribfv(index, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribiv(index, pname, params_address); +} + +static jobject JNICALL Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribPointerv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong result_size) { + GLvoid * __result; + glGetVertexAttribPointerv(index, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglHint(JNIEnv *env, jclass clazz, jint target, jint mode) { + glHint(target, mode); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsBuffer(JNIEnv *env, jclass clazz, jint buffer) { + GLboolean __result = glIsBuffer(buffer); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsEnabled(JNIEnv *env, jclass clazz, jint cap) { + GLboolean __result = glIsEnabled(cap); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsFramebuffer(JNIEnv *env, jclass clazz, jint framebuffer) { + GLboolean __result = glIsFramebuffer(framebuffer); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsProgram(JNIEnv *env, jclass clazz, jint program) { + GLboolean __result = glIsProgram(program); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsRenderbuffer(JNIEnv *env, jclass clazz, jint renderbuffer) { + GLboolean __result = glIsRenderbuffer(renderbuffer); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsShader(JNIEnv *env, jclass clazz, jint shader) { + GLboolean __result = glIsShader(shader); + return __result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES20_nglIsTexture(JNIEnv *env, jclass clazz, jint texture) { + GLboolean __result = glIsTexture(texture); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglLineWidth(JNIEnv *env, jclass clazz, jfloat width) { + glLineWidth(width); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglLinkProgram(JNIEnv *env, jclass clazz, jint program) { + glLinkProgram(program); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglPixelStorei(JNIEnv *env, jclass clazz, jint pname, jint param) { + glPixelStorei(pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglPolygonOffset(JNIEnv *env, jclass clazz, jfloat factor, jfloat units) { + glPolygonOffset(factor, units); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglReadPixels(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint format, jint type, jlong pixels) { + GLvoid *pixels_address = (GLvoid *)(intptr_t)pixels; + glReadPixels(x, y, width, height, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglReleaseShaderCompiler(JNIEnv *env, jclass clazz) { + glReleaseShaderCompiler(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglRenderbufferStorage(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height) { + glRenderbufferStorage(target, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglSampleCoverage(JNIEnv *env, jclass clazz, jfloat value, jboolean invert) { + glSampleCoverage(value, invert); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglScissor(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height) { + glScissor(x, y, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglShaderBinary(JNIEnv *env, jclass clazz, jint n, jlong shaders, jint binaryformat, jlong binary, jint length) { + const GLuint *shaders_address = (const GLuint *)(intptr_t)shaders; + const GLvoid *binary_address = (const GLvoid *)(intptr_t)binary; + glShaderBinary(n, shaders_address, binaryformat, binary_address, length); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglShaderSource(JNIEnv *env, jclass clazz, jint shader, jint count, jlong string, jint length) { + const GLchar *string_address = (const GLchar *)(intptr_t)string; + glShaderSource(shader, count, (const GLchar **)&string_address, (const GLint*)&length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLES20_nglShaderSource3(JNIEnv *env, jclass clazz, jint shader, jint count, jlong strings, jlong length) { + const GLchar *strings_address = (const GLchar *)(intptr_t)strings; + int _str_i; + GLchar *_str_address; + GLchar **strings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + const GLint *length_address = (const GLint *)(intptr_t)length; + _str_i = 0; + _str_address = (GLchar *)strings_address; + while ( _str_i < count ) { + strings_str[_str_i] = _str_address; + _str_address += length_address[_str_i++]; + } + glShaderSource(shader, count, (const GLchar **)strings_str, length_address); + free(strings_str); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilFunc(JNIEnv *env, jclass clazz, jint func, jint ref, jint mask) { + glStencilFunc(func, ref, mask); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilFuncSeparate(JNIEnv *env, jclass clazz, jint face, jint func, jint ref, jint mask) { + glStencilFuncSeparate(face, func, ref, mask); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilMask(JNIEnv *env, jclass clazz, jint mask) { + glStencilMask(mask); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilMaskSeparate(JNIEnv *env, jclass clazz, jint face, jint mask) { + glStencilMaskSeparate(face, mask); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilOp(JNIEnv *env, jclass clazz, jint fail, jint zfail, jint zpass) { + glStencilOp(fail, zfail, zpass); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglStencilOpSeparate(JNIEnv *env, jclass clazz, jint face, jint fail, jint zfail, jint zpass) { + glStencilOpSeparate(face, fail, zfail, zpass); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint border, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexParameterf(JNIEnv *env, jclass clazz, jint target, jint pname, jfloat param) { + glTexParameterf(target, pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexParameterfv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong param) { + const GLfloat *param_address = (const GLfloat *)(intptr_t)param; + glTexParameterfv(target, pname, param_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexParameteri(JNIEnv *env, jclass clazz, jint target, jint pname, jint param) { + glTexParameteri(target, pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexParameteriv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong param) { + const GLint *param_address = (const GLint *)(intptr_t)param; + glTexParameteriv(target, pname, param_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglTexSubImage2D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint width, jint height, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform1f(JNIEnv *env, jclass clazz, jint location, jfloat x) { + glUniform1f(location, x); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform1fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glUniform1fv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform1i(JNIEnv *env, jclass clazz, jint location, jint x) { + glUniform1i(location, x); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform1iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glUniform1iv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform2f(JNIEnv *env, jclass clazz, jint location, jfloat x, jfloat y) { + glUniform2f(location, x, y); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform2fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glUniform2fv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform2i(JNIEnv *env, jclass clazz, jint location, jint x, jint y) { + glUniform2i(location, x, y); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform2iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glUniform2iv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform3f(JNIEnv *env, jclass clazz, jint location, jfloat x, jfloat y, jfloat z) { + glUniform3f(location, x, y, z); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform3fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glUniform3fv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform3i(JNIEnv *env, jclass clazz, jint location, jint x, jint y, jint z) { + glUniform3i(location, x, y, z); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform3iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glUniform3iv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform4f(JNIEnv *env, jclass clazz, jint location, jfloat x, jfloat y, jfloat z, jfloat w) { + glUniform4f(location, x, y, z, w); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform4fv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLfloat *v_address = (const GLfloat *)(intptr_t)v; + glUniform4fv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform4i(JNIEnv *env, jclass clazz, jint location, jint x, jint y, jint z, jint w) { + glUniform4i(location, x, y, z, w); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniform4iv(JNIEnv *env, jclass clazz, jint location, jint count, jlong v) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glUniform4iv(location, count, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniformMatrix2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix2fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniformMatrix3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix3fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUniformMatrix4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + const GLfloat *matrices_address = (const GLfloat *)(intptr_t)matrices; + glUniformMatrix4fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglUseProgram(JNIEnv *env, jclass clazz, jint program) { + glUseProgram(program); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglValidateProgram(JNIEnv *env, jclass clazz, jint program) { + glValidateProgram(program); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib1f(JNIEnv *env, jclass clazz, jint indx, jfloat x) { + glVertexAttrib1f(indx, x); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib1fv(JNIEnv *env, jclass clazz, jint indx, jlong values) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glVertexAttrib1fv(indx, values_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib2f(JNIEnv *env, jclass clazz, jint indx, jfloat x, jfloat y) { + glVertexAttrib2f(indx, x, y); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib2fv(JNIEnv *env, jclass clazz, jint indx, jlong values) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glVertexAttrib2fv(indx, values_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib3f(JNIEnv *env, jclass clazz, jint indx, jfloat x, jfloat y, jfloat z) { + glVertexAttrib3f(indx, x, y, z); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib3fv(JNIEnv *env, jclass clazz, jint indx, jlong values) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glVertexAttrib3fv(indx, values_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib4f(JNIEnv *env, jclass clazz, jint indx, jfloat x, jfloat y, jfloat z, jfloat w) { + glVertexAttrib4f(indx, x, y, z, w); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttrib4fv(JNIEnv *env, jclass clazz, jint indx, jlong values) { + const GLfloat *values_address = (const GLfloat *)(intptr_t)values; + glVertexAttrib4fv(indx, values_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttribPointer(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribPointer(index, size, type, normalized, stride, buffer_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglVertexAttribPointerBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong buffer_buffer_offset) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribPointer(index, size, type, normalized, stride, buffer_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES20_nglViewport(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height) { + glViewport(x, y, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLES20_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglActiveTexture", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglActiveTexture, "glActiveTexture", (void *)&glActiveTexture, false}, + {"nglAttachShader", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglAttachShader, "glAttachShader", (void *)&glAttachShader, false}, + {"nglBindAttribLocation", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBindAttribLocation, "glBindAttribLocation", (void *)&glBindAttribLocation, false}, + {"nglBindBuffer", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBindBuffer, "glBindBuffer", (void *)&glBindBuffer, false}, + {"nglBindFramebuffer", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBindFramebuffer, "glBindFramebuffer", (void *)&glBindFramebuffer, false}, + {"nglBindRenderbuffer", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBindRenderbuffer, "glBindRenderbuffer", (void *)&glBindRenderbuffer, false}, + {"nglBindTexture", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBindTexture, "glBindTexture", (void *)&glBindTexture, false}, + {"nglBlendColor", "(FFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBlendColor, "glBlendColor", (void *)&glBlendColor, false}, + {"nglBlendEquation", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBlendEquation, "glBlendEquation", (void *)&glBlendEquation, false}, + {"nglBlendEquationSeparate", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBlendEquationSeparate, "glBlendEquationSeparate", (void *)&glBlendEquationSeparate, false}, + {"nglBlendFunc", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBlendFunc, "glBlendFunc", (void *)&glBlendFunc, false}, + {"nglBlendFuncSeparate", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBlendFuncSeparate, "glBlendFuncSeparate", (void *)&glBlendFuncSeparate, false}, + {"nglBufferData", "(IJJI)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBufferData, "glBufferData", (void *)&glBufferData, false}, + {"nglBufferSubData", "(IJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglBufferSubData, "glBufferSubData", (void *)&glBufferSubData, false}, + {"nglCheckFramebufferStatus", "(I)I", (void *)&Java_org_lwjgl_opengles_GLES20_nglCheckFramebufferStatus, "glCheckFramebufferStatus", (void *)&glCheckFramebufferStatus, false}, + {"nglClear", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglClear, "glClear", (void *)&glClear, false}, + {"nglClearColor", "(FFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglClearColor, "glClearColor", (void *)&glClearColor, false}, + {"nglClearDepthf", "(F)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglClearDepthf, "glClearDepthf", (void *)&glClearDepthf, false}, + {"nglClearStencil", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglClearStencil, "glClearStencil", (void *)&glClearStencil, false}, + {"nglColorMask", "(ZZZZ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglColorMask, "glColorMask", (void *)&glColorMask, false}, + {"nglCompileShader", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCompileShader, "glCompileShader", (void *)&glCompileShader, false}, + {"nglCompressedTexImage2D", "(IIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCompressedTexImage2D, "glCompressedTexImage2D", (void *)&glCompressedTexImage2D, false}, + {"nglCompressedTexSubImage2D", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCompressedTexSubImage2D, "glCompressedTexSubImage2D", (void *)&glCompressedTexSubImage2D, false}, + {"nglCopyTexImage2D", "(IIIIIIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCopyTexImage2D, "glCopyTexImage2D", (void *)&glCopyTexImage2D, false}, + {"nglCopyTexSubImage2D", "(IIIIIIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCopyTexSubImage2D, "glCopyTexSubImage2D", (void *)&glCopyTexSubImage2D, false}, + {"nglCreateProgram", "()I", (void *)&Java_org_lwjgl_opengles_GLES20_nglCreateProgram, "glCreateProgram", (void *)&glCreateProgram, false}, + {"nglCreateShader", "(I)I", (void *)&Java_org_lwjgl_opengles_GLES20_nglCreateShader, "glCreateShader", (void *)&glCreateShader, false}, + {"nglCullFace", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglCullFace, "glCullFace", (void *)&glCullFace, false}, + {"nglDeleteBuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteBuffers, "glDeleteBuffers", (void *)&glDeleteBuffers, false}, + {"nglDeleteFramebuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteFramebuffers, "glDeleteFramebuffers", (void *)&glDeleteFramebuffers, false}, + {"nglDeleteProgram", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteProgram, "glDeleteProgram", (void *)&glDeleteProgram, false}, + {"nglDeleteRenderbuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteRenderbuffers, "glDeleteRenderbuffers", (void *)&glDeleteRenderbuffers, false}, + {"nglDeleteShader", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteShader, "glDeleteShader", (void *)&glDeleteShader, false}, + {"nglDeleteTextures", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDeleteTextures, "glDeleteTextures", (void *)&glDeleteTextures, false}, + {"nglDepthFunc", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDepthFunc, "glDepthFunc", (void *)&glDepthFunc, false}, + {"nglDepthMask", "(Z)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDepthMask, "glDepthMask", (void *)&glDepthMask, false}, + {"nglDepthRangef", "(FF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDepthRangef, "glDepthRangef", (void *)&glDepthRangef, false}, + {"nglDetachShader", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDetachShader, "glDetachShader", (void *)&glDetachShader, false}, + {"nglDisable", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDisable, "glDisable", (void *)&glDisable, false}, + {"nglDisableVertexAttribArray", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDisableVertexAttribArray, "glDisableVertexAttribArray", (void *)&glDisableVertexAttribArray, false}, + {"nglDrawArrays", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDrawArrays, "glDrawArrays", (void *)&glDrawArrays, false}, + {"nglDrawElements", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDrawElements, "glDrawElements", (void *)&glDrawElements, false}, + {"nglDrawElementsBO", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglDrawElementsBO, "glDrawElements", (void *)&glDrawElements, false}, + {"nglEnable", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglEnable, "glEnable", (void *)&glEnable, false}, + {"nglEnableVertexAttribArray", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglEnableVertexAttribArray, "glEnableVertexAttribArray", (void *)&glEnableVertexAttribArray, false}, + {"nglFinish", "()V", (void *)&Java_org_lwjgl_opengles_GLES20_nglFinish, "glFinish", (void *)&glFinish, false}, + {"nglFlush", "()V", (void *)&Java_org_lwjgl_opengles_GLES20_nglFlush, "glFlush", (void *)&glFlush, false}, + {"nglFramebufferRenderbuffer", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglFramebufferRenderbuffer, "glFramebufferRenderbuffer", (void *)&glFramebufferRenderbuffer, false}, + {"nglFramebufferTexture2D", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglFramebufferTexture2D, "glFramebufferTexture2D", (void *)&glFramebufferTexture2D, false}, + {"nglFrontFace", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglFrontFace, "glFrontFace", (void *)&glFrontFace, false}, + {"nglGenBuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGenBuffers, "glGenBuffers", (void *)&glGenBuffers, false}, + {"nglGenerateMipmap", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGenerateMipmap, "glGenerateMipmap", (void *)&glGenerateMipmap, false}, + {"nglGenFramebuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGenFramebuffers, "glGenFramebuffers", (void *)&glGenFramebuffers, false}, + {"nglGenRenderbuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGenRenderbuffers, "glGenRenderbuffers", (void *)&glGenRenderbuffers, false}, + {"nglGenTextures", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGenTextures, "glGenTextures", (void *)&glGenTextures, false}, + {"nglGetActiveAttrib", "(IIIJJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetActiveAttrib, "glGetActiveAttrib", (void *)&glGetActiveAttrib, false}, + {"nglGetActiveUniform", "(IIIJJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetActiveUniform, "glGetActiveUniform", (void *)&glGetActiveUniform, false}, + {"nglGetAttachedShaders", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetAttachedShaders, "glGetAttachedShaders", (void *)&glGetAttachedShaders, false}, + {"nglGetAttribLocation", "(IJ)I", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetAttribLocation, "glGetAttribLocation", (void *)&glGetAttribLocation, false}, + {"nglGetBooleanv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetBooleanv, "glGetBooleanv", (void *)&glGetBooleanv, false}, + {"nglGetBufferParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetBufferParameteriv, "glGetBufferParameteriv", (void *)&glGetBufferParameteriv, false}, + {"nglGetError", "()I", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetError, "glGetError", (void *)&glGetError, false}, + {"nglGetFloatv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetFloatv, "glGetFloatv", (void *)&glGetFloatv, false}, + {"nglGetFramebufferAttachmentParameteriv", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv", (void *)&glGetFramebufferAttachmentParameteriv, false}, + {"nglGetIntegerv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetIntegerv, "glGetIntegerv", (void *)&glGetIntegerv, false}, + {"nglGetProgramiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetProgramiv, "glGetProgramiv", (void *)&glGetProgramiv, false}, + {"nglGetProgramInfoLog", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetProgramInfoLog, "glGetProgramInfoLog", (void *)&glGetProgramInfoLog, false}, + {"nglGetRenderbufferParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetRenderbufferParameteriv, "glGetRenderbufferParameteriv", (void *)&glGetRenderbufferParameteriv, false}, + {"nglGetShaderiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetShaderiv, "glGetShaderiv", (void *)&glGetShaderiv, false}, + {"nglGetShaderInfoLog", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetShaderInfoLog, "glGetShaderInfoLog", (void *)&glGetShaderInfoLog, false}, + {"nglGetShaderPrecisionFormat", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetShaderPrecisionFormat, "glGetShaderPrecisionFormat", (void *)&glGetShaderPrecisionFormat, false}, + {"nglGetShaderSource", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetShaderSource, "glGetShaderSource", (void *)&glGetShaderSource, false}, + {"nglGetString", "(I)Ljava/lang/String;", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetString, "glGetString", (void *)&glGetString, false}, + {"nglGetTexParameterfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetTexParameterfv, "glGetTexParameterfv", (void *)&glGetTexParameterfv, false}, + {"nglGetTexParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetTexParameteriv, "glGetTexParameteriv", (void *)&glGetTexParameteriv, false}, + {"nglGetUniformfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetUniformfv, "glGetUniformfv", (void *)&glGetUniformfv, false}, + {"nglGetUniformiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetUniformiv, "glGetUniformiv", (void *)&glGetUniformiv, false}, + {"nglGetUniformLocation", "(IJ)I", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetUniformLocation, "glGetUniformLocation", (void *)&glGetUniformLocation, false}, + {"nglGetVertexAttribfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribfv, "glGetVertexAttribfv", (void *)&glGetVertexAttribfv, false}, + {"nglGetVertexAttribiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribiv, "glGetVertexAttribiv", (void *)&glGetVertexAttribiv, false}, + {"nglGetVertexAttribPointerv", "(IIJ)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_GLES20_nglGetVertexAttribPointerv, "glGetVertexAttribPointerv", (void *)&glGetVertexAttribPointerv, false}, + {"nglHint", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglHint, "glHint", (void *)&glHint, false}, + {"nglIsBuffer", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsBuffer, "glIsBuffer", (void *)&glIsBuffer, false}, + {"nglIsEnabled", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsEnabled, "glIsEnabled", (void *)&glIsEnabled, false}, + {"nglIsFramebuffer", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsFramebuffer, "glIsFramebuffer", (void *)&glIsFramebuffer, false}, + {"nglIsProgram", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsProgram, "glIsProgram", (void *)&glIsProgram, false}, + {"nglIsRenderbuffer", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsRenderbuffer, "glIsRenderbuffer", (void *)&glIsRenderbuffer, false}, + {"nglIsShader", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsShader, "glIsShader", (void *)&glIsShader, false}, + {"nglIsTexture", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES20_nglIsTexture, "glIsTexture", (void *)&glIsTexture, false}, + {"nglLineWidth", "(F)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglLineWidth, "glLineWidth", (void *)&glLineWidth, false}, + {"nglLinkProgram", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglLinkProgram, "glLinkProgram", (void *)&glLinkProgram, false}, + {"nglPixelStorei", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglPixelStorei, "glPixelStorei", (void *)&glPixelStorei, false}, + {"nglPolygonOffset", "(FF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglPolygonOffset, "glPolygonOffset", (void *)&glPolygonOffset, false}, + {"nglReadPixels", "(IIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglReadPixels, "glReadPixels", (void *)&glReadPixels, false}, + {"nglReleaseShaderCompiler", "()V", (void *)&Java_org_lwjgl_opengles_GLES20_nglReleaseShaderCompiler, "glReleaseShaderCompiler", (void *)&glReleaseShaderCompiler, false}, + {"nglRenderbufferStorage", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglRenderbufferStorage, "glRenderbufferStorage", (void *)&glRenderbufferStorage, false}, + {"nglSampleCoverage", "(FZ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglSampleCoverage, "glSampleCoverage", (void *)&glSampleCoverage, false}, + {"nglScissor", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglScissor, "glScissor", (void *)&glScissor, false}, + {"nglShaderBinary", "(IJIJI)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglShaderBinary, "glShaderBinary", (void *)&glShaderBinary, false}, + {"nglShaderSource", "(IIJI)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglShaderSource, "glShaderSource", (void *)&glShaderSource, false}, + {"nglShaderSource3", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglShaderSource3, "glShaderSource", (void *)&glShaderSource, false}, + {"nglStencilFunc", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilFunc, "glStencilFunc", (void *)&glStencilFunc, false}, + {"nglStencilFuncSeparate", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilFuncSeparate, "glStencilFuncSeparate", (void *)&glStencilFuncSeparate, false}, + {"nglStencilMask", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilMask, "glStencilMask", (void *)&glStencilMask, false}, + {"nglStencilMaskSeparate", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilMaskSeparate, "glStencilMaskSeparate", (void *)&glStencilMaskSeparate, false}, + {"nglStencilOp", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilOp, "glStencilOp", (void *)&glStencilOp, false}, + {"nglStencilOpSeparate", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglStencilOpSeparate, "glStencilOpSeparate", (void *)&glStencilOpSeparate, false}, + {"nglTexImage2D", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexImage2D, "glTexImage2D", (void *)&glTexImage2D, false}, + {"nglTexParameterf", "(IIF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexParameterf, "glTexParameterf", (void *)&glTexParameterf, false}, + {"nglTexParameterfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexParameterfv, "glTexParameterfv", (void *)&glTexParameterfv, false}, + {"nglTexParameteri", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexParameteri, "glTexParameteri", (void *)&glTexParameteri, false}, + {"nglTexParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexParameteriv, "glTexParameteriv", (void *)&glTexParameteriv, false}, + {"nglTexSubImage2D", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglTexSubImage2D, "glTexSubImage2D", (void *)&glTexSubImage2D, false}, + {"nglUniform1f", "(IF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform1f, "glUniform1f", (void *)&glUniform1f, false}, + {"nglUniform1fv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform1fv, "glUniform1fv", (void *)&glUniform1fv, false}, + {"nglUniform1i", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform1i, "glUniform1i", (void *)&glUniform1i, false}, + {"nglUniform1iv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform1iv, "glUniform1iv", (void *)&glUniform1iv, false}, + {"nglUniform2f", "(IFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform2f, "glUniform2f", (void *)&glUniform2f, false}, + {"nglUniform2fv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform2fv, "glUniform2fv", (void *)&glUniform2fv, false}, + {"nglUniform2i", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform2i, "glUniform2i", (void *)&glUniform2i, false}, + {"nglUniform2iv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform2iv, "glUniform2iv", (void *)&glUniform2iv, false}, + {"nglUniform3f", "(IFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform3f, "glUniform3f", (void *)&glUniform3f, false}, + {"nglUniform3fv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform3fv, "glUniform3fv", (void *)&glUniform3fv, false}, + {"nglUniform3i", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform3i, "glUniform3i", (void *)&glUniform3i, false}, + {"nglUniform3iv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform3iv, "glUniform3iv", (void *)&glUniform3iv, false}, + {"nglUniform4f", "(IFFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform4f, "glUniform4f", (void *)&glUniform4f, false}, + {"nglUniform4fv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform4fv, "glUniform4fv", (void *)&glUniform4fv, false}, + {"nglUniform4i", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform4i, "glUniform4i", (void *)&glUniform4i, false}, + {"nglUniform4iv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniform4iv, "glUniform4iv", (void *)&glUniform4iv, false}, + {"nglUniformMatrix2fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniformMatrix2fv, "glUniformMatrix2fv", (void *)&glUniformMatrix2fv, false}, + {"nglUniformMatrix3fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniformMatrix3fv, "glUniformMatrix3fv", (void *)&glUniformMatrix3fv, false}, + {"nglUniformMatrix4fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUniformMatrix4fv, "glUniformMatrix4fv", (void *)&glUniformMatrix4fv, false}, + {"nglUseProgram", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglUseProgram, "glUseProgram", (void *)&glUseProgram, false}, + {"nglValidateProgram", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglValidateProgram, "glValidateProgram", (void *)&glValidateProgram, false}, + {"nglVertexAttrib1f", "(IF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib1f, "glVertexAttrib1f", (void *)&glVertexAttrib1f, false}, + {"nglVertexAttrib1fv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib1fv, "glVertexAttrib1fv", (void *)&glVertexAttrib1fv, false}, + {"nglVertexAttrib2f", "(IFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib2f, "glVertexAttrib2f", (void *)&glVertexAttrib2f, false}, + {"nglVertexAttrib2fv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib2fv, "glVertexAttrib2fv", (void *)&glVertexAttrib2fv, false}, + {"nglVertexAttrib3f", "(IFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib3f, "glVertexAttrib3f", (void *)&glVertexAttrib3f, false}, + {"nglVertexAttrib3fv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib3fv, "glVertexAttrib3fv", (void *)&glVertexAttrib3fv, false}, + {"nglVertexAttrib4f", "(IFFFF)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib4f, "glVertexAttrib4f", (void *)&glVertexAttrib4f, false}, + {"nglVertexAttrib4fv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttrib4fv, "glVertexAttrib4fv", (void *)&glVertexAttrib4fv, false}, + {"nglVertexAttribPointer", "(IIIZIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttribPointer, "glVertexAttribPointer", (void *)&glVertexAttribPointer, false}, + {"nglVertexAttribPointerBO", "(IIIZIJ)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglVertexAttribPointerBO, "glVertexAttribPointer", (void *)&glVertexAttribPointer, false}, + {"nglViewport", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES20_nglViewport, "glViewport", (void *)&glViewport, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES30.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES30.c new file mode 100644 index 0000000..315749c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_GLES30.c @@ -0,0 +1,885 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glReadBufferPROC) (GLenum mode); +typedef GL_APICALL void (GL_APIENTRY *glDrawRangeElementsPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices); +typedef GL_APICALL void (GL_APIENTRY *glTexImage3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glCopyTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexImage3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glGenQueriesPROC) (GLsizei n, GLuint * ids); +typedef GL_APICALL void (GL_APIENTRY *glDeleteQueriesPROC) (GLsizei n, GLuint * ids); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsQueryPROC) (GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glBeginQueryPROC) (GLenum target, GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glEndQueryPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glGetQueryivPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetQueryObjectuivPROC) (GLenum id, GLenum pname, GLuint * params); +typedef GL_APICALL GLboolean (GL_APIENTRY *glUnmapBufferPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glGetBufferPointervPROC) (GLenum target, GLenum pname, GLvoid ** pointer); +typedef GL_APICALL void (GL_APIENTRY *glDrawBuffersPROC) (GLsizei size, const GLenum * buffers); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix2x3fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix3x2fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix2x4fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix4x2fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix3x4fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glUniformMatrix4x3fvPROC) (GLint location, GLsizei count, GLboolean transpose, GLfloat * matrices); +typedef GL_APICALL void (GL_APIENTRY *glBlitFramebufferPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageMultisamplePROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTextureLayerPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef GL_APICALL GLvoid * (GL_APIENTRY *glMapBufferRangePROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GL_APICALL void (GL_APIENTRY *glFlushMappedBufferRangePROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef GL_APICALL void (GL_APIENTRY *glBindVertexArrayPROC) (GLuint array); +typedef GL_APICALL void (GL_APIENTRY *glDeleteVertexArraysPROC) (GLsizei n, const GLuint * arrays); +typedef GL_APICALL void (GL_APIENTRY *glGenVertexArraysPROC) (GLsizei n, GLuint * arrays); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsVertexArrayPROC) (GLuint array); +typedef GL_APICALL void (GL_APIENTRY *glGetIntegeri_vPROC) (GLenum value, GLuint index, GLint * data); +typedef GL_APICALL void (GL_APIENTRY *glBeginTransformFeedbackPROC) (GLenum primitiveMode); +typedef GL_APICALL void (GL_APIENTRY *glEndTransformFeedbackPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glBindBufferRangePROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef GL_APICALL void (GL_APIENTRY *glBindBufferBasePROC) (GLenum target, GLuint index, GLuint buffer); +typedef GL_APICALL void (GL_APIENTRY *glTransformFeedbackVaryingsPROC) (GLuint program, GLsizei count, const GLchar ** varyings, GLenum bufferMode); +typedef GL_APICALL void (GL_APIENTRY *glGetTransformFeedbackVaryingPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribIPointerPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * buffer); +typedef GL_APICALL void (GL_APIENTRY *glGetVertexAttribIivPROC) (GLuint index, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetVertexAttribIuivPROC) (GLuint index, GLenum pname, GLuint * params); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribI4iPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribI4uiPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribI4ivPROC) (GLuint index, const GLint * v); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribI4uivPROC) (GLuint index, const GLuint * v); +typedef GL_APICALL void (GL_APIENTRY *glGetUniformuivPROC) (GLuint program, GLint location, GLuint * params); +typedef GL_APICALL GLint (GL_APIENTRY *glGetFragDataLocationPROC) (GLuint program, const GLchar * name); +typedef GL_APICALL void (GL_APIENTRY *glUniform1uiPROC) (GLint location, GLuint v0); +typedef GL_APICALL void (GL_APIENTRY *glUniform2uiPROC) (GLint location, GLuint v0, GLuint v1); +typedef GL_APICALL void (GL_APIENTRY *glUniform3uiPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef GL_APICALL void (GL_APIENTRY *glUniform4uiPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef GL_APICALL void (GL_APIENTRY *glUniform1uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef GL_APICALL void (GL_APIENTRY *glUniform2uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef GL_APICALL void (GL_APIENTRY *glUniform3uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef GL_APICALL void (GL_APIENTRY *glUniform4uivPROC) (GLint location, GLsizei count, const GLuint * value); +typedef GL_APICALL void (GL_APIENTRY *glClearBufferfvPROC) (GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glClearBufferivPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glClearBufferuivPROC) (GLenum buffer, GLint drawbuffer, const GLint * value); +typedef GL_APICALL void (GL_APIENTRY *glClearBufferfiPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef GL_APICALL GLubyte * (GL_APIENTRY *glGetStringiPROC) (GLenum name, GLuint index); +typedef GL_APICALL void (GL_APIENTRY *glCopyBufferSubDataPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); +typedef GL_APICALL void (GL_APIENTRY *glGetUniformIndicesPROC) (GLuint program, GLsizei uniformCount, const GLchar ** uniformNames, GLuint * uniformIndices); +typedef GL_APICALL void (GL_APIENTRY *glGetActiveUniformsivPROC) (GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef GL_APICALL GLuint (GL_APIENTRY *glGetUniformBlockIndexPROC) (GLuint program, const GLchar * uniformBlockName); +typedef GL_APICALL void (GL_APIENTRY *glGetActiveUniformBlockivPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetActiveUniformBlockNamePROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef GL_APICALL void (GL_APIENTRY *glUniformBlockBindingPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef GL_APICALL void (GL_APIENTRY *glDrawArraysInstancedPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef GL_APICALL void (GL_APIENTRY *glDrawElementsInstancedPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount); +typedef GL_APICALL GLsync (GL_APIENTRY *glFenceSyncPROC) (GLenum condition, GLbitfield flags); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsSyncPROC) (GLsync sync); +typedef GL_APICALL void (GL_APIENTRY *glDeleteSyncPROC) (GLsync sync); +typedef GL_APICALL GLenum (GL_APIENTRY *glClientWaitSyncPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GL_APICALL void (GL_APIENTRY *glWaitSyncPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GL_APICALL void (GL_APIENTRY *glGetInteger64vPROC) (GLenum pname, GLint64 * data); +typedef GL_APICALL void (GL_APIENTRY *glGetInteger64i_vPROC) (GLenum value, GLuint index, GLint64 * data); +typedef GL_APICALL void (GL_APIENTRY *glGetSyncivPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * values); +typedef GL_APICALL void (GL_APIENTRY *glGetBufferParameteri64vPROC) (GLenum target, GLenum pname, GLint64 * params); +typedef GL_APICALL void (GL_APIENTRY *glGenSamplersPROC) (GLsizei count, GLuint * samplers); +typedef GL_APICALL void (GL_APIENTRY *glDeleteSamplersPROC) (GLsizei count, const GLuint * samplers); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsSamplerPROC) (GLuint sampler); +typedef GL_APICALL void (GL_APIENTRY *glBindSamplerPROC) (GLenum unit, GLuint sampler); +typedef GL_APICALL void (GL_APIENTRY *glSamplerParameteriPROC) (GLuint sampler, GLenum pname, GLint param); +typedef GL_APICALL void (GL_APIENTRY *glSamplerParameterfPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef GL_APICALL void (GL_APIENTRY *glSamplerParameterivPROC) (GLuint sampler, GLenum pname, const GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glSamplerParameterfvPROC) (GLuint sampler, GLenum pname, const GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetSamplerParameterivPROC) (GLuint sampler, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGetSamplerParameterfvPROC) (GLuint sampler, GLenum pname, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glVertexAttribDivisorPROC) (GLuint index, GLuint divisor); +typedef GL_APICALL void (GL_APIENTRY *glBindTransformFeedbackPROC) (GLenum target, GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glDeleteTransformFeedbacksPROC) (GLsizei n, const GLuint * ids); +typedef GL_APICALL void (GL_APIENTRY *glGenTransformFeedbacksPROC) (GLsizei n, GLuint * ids); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsTransformFeedbackPROC) (GLuint id); +typedef GL_APICALL void (GL_APIENTRY *glPauseTransformFeedbackPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glResumeTransformFeedbackPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glGetProgramBinaryPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, GLvoid * binary); +typedef GL_APICALL void (GL_APIENTRY *glProgramBinaryPROC) (GLuint program, GLenum binaryFormat, const GLvoid * binary, GLsizei length); +typedef GL_APICALL void (GL_APIENTRY *glProgramParameteriPROC) (GLuint program, GLenum pname, GLint value); +typedef GL_APICALL void (GL_APIENTRY *glInvalidateFramebufferPROC) (GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef GL_APICALL void (GL_APIENTRY *glInvalidateSubFramebufferPROC) (GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glTexStorage2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glTexStorage3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef GL_APICALL void (GL_APIENTRY *glGetInternalformativPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint * params); + +static glReadBufferPROC glReadBuffer; +static glDrawRangeElementsPROC glDrawRangeElements; +static glTexImage3DPROC glTexImage3D; +static glTexSubImage3DPROC glTexSubImage3D; +static glCopyTexSubImage3DPROC glCopyTexSubImage3D; +static glCompressedTexImage3DPROC glCompressedTexImage3D; +static glCompressedTexSubImage3DPROC glCompressedTexSubImage3D; +static glGenQueriesPROC glGenQueries; +static glDeleteQueriesPROC glDeleteQueries; +static glIsQueryPROC glIsQuery; +static glBeginQueryPROC glBeginQuery; +static glEndQueryPROC glEndQuery; +static glGetQueryivPROC glGetQueryiv; +static glGetQueryObjectuivPROC glGetQueryObjectuiv; +static glUnmapBufferPROC glUnmapBuffer; +static glGetBufferPointervPROC glGetBufferPointerv; +static glDrawBuffersPROC glDrawBuffers; +static glUniformMatrix2x3fvPROC glUniformMatrix2x3fv; +static glUniformMatrix3x2fvPROC glUniformMatrix3x2fv; +static glUniformMatrix2x4fvPROC glUniformMatrix2x4fv; +static glUniformMatrix4x2fvPROC glUniformMatrix4x2fv; +static glUniformMatrix3x4fvPROC glUniformMatrix3x4fv; +static glUniformMatrix4x3fvPROC glUniformMatrix4x3fv; +static glBlitFramebufferPROC glBlitFramebuffer; +static glRenderbufferStorageMultisamplePROC glRenderbufferStorageMultisample; +static glFramebufferTextureLayerPROC glFramebufferTextureLayer; +static glMapBufferRangePROC glMapBufferRange; +static glFlushMappedBufferRangePROC glFlushMappedBufferRange; +static glBindVertexArrayPROC glBindVertexArray; +static glDeleteVertexArraysPROC glDeleteVertexArrays; +static glGenVertexArraysPROC glGenVertexArrays; +static glIsVertexArrayPROC glIsVertexArray; +static glGetIntegeri_vPROC glGetIntegeri_v; +static glBeginTransformFeedbackPROC glBeginTransformFeedback; +static glEndTransformFeedbackPROC glEndTransformFeedback; +static glBindBufferRangePROC glBindBufferRange; +static glBindBufferBasePROC glBindBufferBase; +static glTransformFeedbackVaryingsPROC glTransformFeedbackVaryings; +static glGetTransformFeedbackVaryingPROC glGetTransformFeedbackVarying; +static glVertexAttribIPointerPROC glVertexAttribIPointer; +static glGetVertexAttribIivPROC glGetVertexAttribIiv; +static glGetVertexAttribIuivPROC glGetVertexAttribIuiv; +static glVertexAttribI4iPROC glVertexAttribI4i; +static glVertexAttribI4uiPROC glVertexAttribI4ui; +static glVertexAttribI4ivPROC glVertexAttribI4iv; +static glVertexAttribI4uivPROC glVertexAttribI4uiv; +static glGetUniformuivPROC glGetUniformuiv; +static glGetFragDataLocationPROC glGetFragDataLocation; +static glUniform1uiPROC glUniform1ui; +static glUniform2uiPROC glUniform2ui; +static glUniform3uiPROC glUniform3ui; +static glUniform4uiPROC glUniform4ui; +static glUniform1uivPROC glUniform1uiv; +static glUniform2uivPROC glUniform2uiv; +static glUniform3uivPROC glUniform3uiv; +static glUniform4uivPROC glUniform4uiv; +static glClearBufferfvPROC glClearBufferfv; +static glClearBufferivPROC glClearBufferiv; +static glClearBufferuivPROC glClearBufferuiv; +static glClearBufferfiPROC glClearBufferfi; +static glGetStringiPROC glGetStringi; +static glCopyBufferSubDataPROC glCopyBufferSubData; +static glGetUniformIndicesPROC glGetUniformIndices; +static glGetActiveUniformsivPROC glGetActiveUniformsiv; +static glGetUniformBlockIndexPROC glGetUniformBlockIndex; +static glGetActiveUniformBlockivPROC glGetActiveUniformBlockiv; +static glGetActiveUniformBlockNamePROC glGetActiveUniformBlockName; +static glUniformBlockBindingPROC glUniformBlockBinding; +static glDrawArraysInstancedPROC glDrawArraysInstanced; +static glDrawElementsInstancedPROC glDrawElementsInstanced; +static glFenceSyncPROC glFenceSync; +static glIsSyncPROC glIsSync; +static glDeleteSyncPROC glDeleteSync; +static glClientWaitSyncPROC glClientWaitSync; +static glWaitSyncPROC glWaitSync; +static glGetInteger64vPROC glGetInteger64v; +static glGetInteger64i_vPROC glGetInteger64i_v; +static glGetSyncivPROC glGetSynciv; +static glGetBufferParameteri64vPROC glGetBufferParameteri64v; +static glGenSamplersPROC glGenSamplers; +static glDeleteSamplersPROC glDeleteSamplers; +static glIsSamplerPROC glIsSampler; +static glBindSamplerPROC glBindSampler; +static glSamplerParameteriPROC glSamplerParameteri; +static glSamplerParameterfPROC glSamplerParameterf; +static glSamplerParameterivPROC glSamplerParameteriv; +static glSamplerParameterfvPROC glSamplerParameterfv; +static glGetSamplerParameterivPROC glGetSamplerParameteriv; +static glGetSamplerParameterfvPROC glGetSamplerParameterfv; +static glVertexAttribDivisorPROC glVertexAttribDivisor; +static glBindTransformFeedbackPROC glBindTransformFeedback; +static glDeleteTransformFeedbacksPROC glDeleteTransformFeedbacks; +static glGenTransformFeedbacksPROC glGenTransformFeedbacks; +static glIsTransformFeedbackPROC glIsTransformFeedback; +static glPauseTransformFeedbackPROC glPauseTransformFeedback; +static glResumeTransformFeedbackPROC glResumeTransformFeedback; +static glGetProgramBinaryPROC glGetProgramBinary; +static glProgramBinaryPROC glProgramBinary; +static glProgramParameteriPROC glProgramParameteri; +static glInvalidateFramebufferPROC glInvalidateFramebuffer; +static glInvalidateSubFramebufferPROC glInvalidateSubFramebuffer; +static glTexStorage2DPROC glTexStorage2D; +static glTexStorage3DPROC glTexStorage3D; +static glGetInternalformativPROC glGetInternalformativ; + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglReadBuffer(JNIEnv *env, jclass clazz, jint mode) { + glReadBuffer(mode); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawRangeElements(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawRangeElements(mode, start, end, count, type, indices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawRangeElementsBO(JNIEnv *env, jclass clazz, jint mode, jint start, jint end, jint count, jint type, jlong indices_buffer_offset) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawRangeElements(mode, start, end, count, type, indices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels_buffer_offset) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexSubImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels_buffer_offset) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)offsetToPointer(pixels_buffer_offset); + glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCopyTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint x, jint y, jint width, jint height) { + glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCompressedTexImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCompressedTexImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data_buffer_offset) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCompressedTexSubImage3D(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCompressedTexSubImage3DBO(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data_buffer_offset) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)offsetToPointer(data_buffer_offset); + glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGenQueries(JNIEnv *env, jclass clazz, jint n, jlong ids) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenQueries(n, ids_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDeleteQueries(JNIEnv *env, jclass clazz, jint n, jlong ids) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glDeleteQueries(n, ids_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglIsQuery(JNIEnv *env, jclass clazz, jint id) { + GLboolean __result = glIsQuery(id); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBeginQuery(JNIEnv *env, jclass clazz, jint target, jint id) { + glBeginQuery(target, id); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglEndQuery(JNIEnv *env, jclass clazz, jint target) { + glEndQuery(target); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetQueryiv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetQueryiv(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetQueryObjectuiv(JNIEnv *env, jclass clazz, jint id, jint pname, jlong params) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetQueryObjectuiv(id, pname, params_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglUnmapBuffer(JNIEnv *env, jclass clazz, jint target) { + GLboolean __result = glUnmapBuffer(target); + return __result; +} + +static jobject JNICALL Java_org_lwjgl_opengles_GLES30_nglGetBufferPointerv(JNIEnv *env, jclass clazz, jint target, jint pname, jlong result_size) { + GLvoid * __result; + glGetBufferPointerv(target, pname, &__result); + return safeNewBuffer(env, __result, result_size); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawBuffers(JNIEnv *env, jclass clazz, jint size, jlong buffers) { + const GLenum *buffers_address = (const GLenum *)(intptr_t)buffers; + glDrawBuffers(size, buffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix2x3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix2x3fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix3x2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix3x2fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix2x4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix2x4fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix4x2fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix4x2fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix3x4fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix3x4fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformMatrix4x3fv(JNIEnv *env, jclass clazz, jint location, jint count, jboolean transpose, jlong matrices) { + GLfloat *matrices_address = (GLfloat *)(intptr_t)matrices; + glUniformMatrix4x3fv(location, count, transpose, matrices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBlitFramebuffer(JNIEnv *env, jclass clazz, jint srcX0, jint srcY0, jint srcX1, jint srcY1, jint dstX0, jint dstY0, jint dstX1, jint dstY1, jint mask, jint filter) { + glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglRenderbufferStorageMultisample(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height) { + glRenderbufferStorageMultisample(target, samples, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglFramebufferTextureLayer(JNIEnv *env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer) { + glFramebufferTextureLayer(target, attachment, texture, level, layer); +} + +static jobject JNICALL Java_org_lwjgl_opengles_GLES30_nglMapBufferRange(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length, jint access, jobject old_buffer) { + GLvoid * __result = glMapBufferRange(target, offset, length, access); + return safeNewBufferCached(env, __result, length, old_buffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglFlushMappedBufferRange(JNIEnv *env, jclass clazz, jint target, jlong offset, jlong length) { + glFlushMappedBufferRange(target, offset, length); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBindVertexArray(JNIEnv *env, jclass clazz, jint array) { + glBindVertexArray(array); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDeleteVertexArrays(JNIEnv *env, jclass clazz, jint n, jlong arrays) { + const GLuint *arrays_address = (const GLuint *)(intptr_t)arrays; + glDeleteVertexArrays(n, arrays_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGenVertexArrays(JNIEnv *env, jclass clazz, jint n, jlong arrays) { + GLuint *arrays_address = (GLuint *)(intptr_t)arrays; + glGenVertexArrays(n, arrays_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglIsVertexArray(JNIEnv *env, jclass clazz, jint array) { + GLboolean __result = glIsVertexArray(array); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetIntegeri_1v(JNIEnv *env, jclass clazz, jint value, jint index, jlong data) { + GLint *data_address = (GLint *)(intptr_t)data; + glGetIntegeri_v(value, index, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBeginTransformFeedback(JNIEnv *env, jclass clazz, jint primitiveMode) { + glBeginTransformFeedback(primitiveMode); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglEndTransformFeedback(JNIEnv *env, jclass clazz) { + glEndTransformFeedback(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBindBufferRange(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer, jlong offset, jlong size) { + glBindBufferRange(target, index, buffer, offset, size); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBindBufferBase(JNIEnv *env, jclass clazz, jint target, jint index, jint buffer) { + glBindBufferBase(target, index, buffer); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTransformFeedbackVaryings(JNIEnv *env, jclass clazz, jint program, jint count, jlong varyings, jint bufferMode) { + const GLchar *varyings_address = (const GLchar *)(intptr_t)varyings; + int _str_i; + GLchar *_str_address; + GLchar **varyings_str = (GLchar **) malloc(count * sizeof(GLchar *)); + _str_i = 0; + _str_address = (GLchar *)varyings_address; + while ( _str_i < count ) { + varyings_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glTransformFeedbackVaryings(program, count, (const GLchar **)varyings_str, bufferMode); + free(varyings_str); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetTransformFeedbackVarying(JNIEnv *env, jclass clazz, jint program, jint index, jint bufSize, jlong length, jlong size, jlong type, jlong name) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLsizei *size_address = (GLsizei *)(intptr_t)size; + GLenum *type_address = (GLenum *)(intptr_t)type; + GLchar *name_address = (GLchar *)(intptr_t)name; + glGetTransformFeedbackVarying(program, index, bufSize, length_address, size_address, type_address, name_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribIPointer(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)buffer; + glVertexAttribIPointer(index, size, type, stride, buffer_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribIPointerBO(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jint stride, jlong buffer_buffer_offset) { + const GLvoid *buffer_address = (const GLvoid *)(intptr_t)offsetToPointer(buffer_buffer_offset); + glVertexAttribIPointer(index, size, type, stride, buffer_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetVertexAttribIiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetVertexAttribIiv(index, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetVertexAttribIuiv(JNIEnv *env, jclass clazz, jint index, jint pname, jlong params) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetVertexAttribIuiv(index, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4i(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w) { + glVertexAttribI4i(index, x, y, z, w); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4ui(JNIEnv *env, jclass clazz, jint index, jint x, jint y, jint z, jint w) { + glVertexAttribI4ui(index, x, y, z, w); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4iv(JNIEnv *env, jclass clazz, jint index, jlong v) { + const GLint *v_address = (const GLint *)(intptr_t)v; + glVertexAttribI4iv(index, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4uiv(JNIEnv *env, jclass clazz, jint index, jlong v) { + const GLuint *v_address = (const GLuint *)(intptr_t)v; + glVertexAttribI4uiv(index, v_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetUniformuiv(JNIEnv *env, jclass clazz, jint program, jint location, jlong params) { + GLuint *params_address = (GLuint *)(intptr_t)params; + glGetUniformuiv(program, location, params_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES30_nglGetFragDataLocation(JNIEnv *env, jclass clazz, jint program, jlong name) { + const GLchar *name_address = (const GLchar *)(intptr_t)name; + GLint __result = glGetFragDataLocation(program, name_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform1ui(JNIEnv *env, jclass clazz, jint location, jint v0) { + glUniform1ui(location, v0); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform2ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1) { + glUniform2ui(location, v0, v1); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform3ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2) { + glUniform3ui(location, v0, v1, v2); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform4ui(JNIEnv *env, jclass clazz, jint location, jint v0, jint v1, jint v2, jint v3) { + glUniform4ui(location, v0, v1, v2, v3); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform1uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform1uiv(location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform2uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform2uiv(location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform3uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform3uiv(location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniform4uiv(JNIEnv *env, jclass clazz, jint location, jint count, jlong value) { + const GLuint *value_address = (const GLuint *)(intptr_t)value; + glUniform4uiv(location, count, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglClearBufferfv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glClearBufferfv(buffer, drawbuffer, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglClearBufferiv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glClearBufferiv(buffer, drawbuffer, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglClearBufferuiv(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jlong value) { + const GLint *value_address = (const GLint *)(intptr_t)value; + glClearBufferuiv(buffer, drawbuffer, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglClearBufferfi(JNIEnv *env, jclass clazz, jint buffer, jint drawbuffer, jfloat depth, jint stencil) { + glClearBufferfi(buffer, drawbuffer, depth, stencil); +} + +static jobject JNICALL Java_org_lwjgl_opengles_GLES30_nglGetStringi(JNIEnv *env, jclass clazz, jint name, jint index) { + GLubyte * __result = glGetStringi(name, index); + return NewStringNativeUnsigned(env, __result); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglCopyBufferSubData(JNIEnv *env, jclass clazz, jint readtarget, jint writetarget, jlong readoffset, jlong writeoffset, jlong size) { + glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetUniformIndices(JNIEnv *env, jclass clazz, jint program, jint uniformCount, jlong uniformNames, jlong uniformIndices) { + const GLchar *uniformNames_address = (const GLchar *)(intptr_t)uniformNames; + int _str_i; + GLchar *_str_address; + GLchar **uniformNames_str = (GLchar **) malloc(uniformCount * sizeof(GLchar *)); + GLuint *uniformIndices_address = (GLuint *)(intptr_t)uniformIndices; + _str_i = 0; + _str_address = (GLchar *)uniformNames_address; + while ( _str_i < uniformCount ) { + uniformNames_str[_str_i++] = _str_address; + _str_address += strlen(_str_address) + 1; + } + glGetUniformIndices(program, uniformCount, (const GLchar **)uniformNames_str, uniformIndices_address); + free(uniformNames_str); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformsiv(JNIEnv *env, jclass clazz, jint program, jint uniformCount, jlong uniformIndices, jint pname, jlong params) { + const GLuint *uniformIndices_address = (const GLuint *)(intptr_t)uniformIndices; + GLint *params_address = (GLint *)(intptr_t)params; + glGetActiveUniformsiv(program, uniformCount, uniformIndices_address, pname, params_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES30_nglGetUniformBlockIndex(JNIEnv *env, jclass clazz, jint program, jlong uniformBlockName) { + const GLchar *uniformBlockName_address = (const GLchar *)(intptr_t)uniformBlockName; + GLuint __result = glGetUniformBlockIndex(program, uniformBlockName_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformBlockiv(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformBlockName(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint bufSize, jlong length, jlong uniformBlockName) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *uniformBlockName_address = (GLchar *)(intptr_t)uniformBlockName; + glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length_address, uniformBlockName_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglUniformBlockBinding(JNIEnv *env, jclass clazz, jint program, jint uniformBlockIndex, jint uniformBlockBinding) { + glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawArraysInstanced(JNIEnv *env, jclass clazz, jint mode, jint first, jint count, jint primcount) { + glDrawArraysInstanced(mode, first, count, primcount); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawElementsInstanced(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices, jint primcount) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)indices; + glDrawElementsInstanced(mode, count, type, indices_address, primcount); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDrawElementsInstancedBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount) { + const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); + glDrawElementsInstanced(mode, count, type, indices_address, primcount); +} + +static jlong JNICALL Java_org_lwjgl_opengles_GLES30_nglFenceSync(JNIEnv *env, jclass clazz, jint condition, jint flags) { + GLsync __result = glFenceSync(condition, flags); + return (intptr_t)__result; +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglIsSync(JNIEnv *env, jclass clazz, jlong sync) { + GLboolean __result = glIsSync((GLsync)(intptr_t)sync); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDeleteSync(JNIEnv *env, jclass clazz, jlong sync) { + glDeleteSync((GLsync)(intptr_t)sync); +} + +static jint JNICALL Java_org_lwjgl_opengles_GLES30_nglClientWaitSync(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout) { + GLenum __result = glClientWaitSync((GLsync)(intptr_t)sync, flags, timeout); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglWaitSync(JNIEnv *env, jclass clazz, jlong sync, jint flags, jlong timeout) { + glWaitSync((GLsync)(intptr_t)sync, flags, timeout); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetInteger64v(JNIEnv *env, jclass clazz, jint pname, jlong data) { + GLint64 *data_address = (GLint64 *)(intptr_t)data; + glGetInteger64v(pname, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetInteger64i_1v(JNIEnv *env, jclass clazz, jint value, jint index, jlong data) { + GLint64 *data_address = (GLint64 *)(intptr_t)data; + glGetInteger64i_v(value, index, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetSynciv(JNIEnv *env, jclass clazz, jlong sync, jint pname, jint bufSize, jlong length, jlong values) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLint *values_address = (GLint *)(intptr_t)values; + glGetSynciv((GLsync)(intptr_t)sync, pname, bufSize, length_address, values_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetBufferParameteri64v(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint64 *params_address = (GLint64 *)(intptr_t)params; + glGetBufferParameteri64v(target, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGenSamplers(JNIEnv *env, jclass clazz, jint count, jlong samplers) { + GLuint *samplers_address = (GLuint *)(intptr_t)samplers; + glGenSamplers(count, samplers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDeleteSamplers(JNIEnv *env, jclass clazz, jint count, jlong samplers) { + const GLuint *samplers_address = (const GLuint *)(intptr_t)samplers; + glDeleteSamplers(count, samplers_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglIsSampler(JNIEnv *env, jclass clazz, jint sampler) { + GLboolean __result = glIsSampler(sampler); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBindSampler(JNIEnv *env, jclass clazz, jint unit, jint sampler) { + glBindSampler(unit, sampler); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglSamplerParameteri(JNIEnv *env, jclass clazz, jint sampler, jint pname, jint param) { + glSamplerParameteri(sampler, pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglSamplerParameterf(JNIEnv *env, jclass clazz, jint sampler, jint pname, jfloat param) { + glSamplerParameterf(sampler, pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglSamplerParameteriv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params) { + const GLint *params_address = (const GLint *)(intptr_t)params; + glSamplerParameteriv(sampler, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglSamplerParameterfv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params) { + const GLfloat *params_address = (const GLfloat *)(intptr_t)params; + glSamplerParameterfv(sampler, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetSamplerParameteriv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetSamplerParameteriv(sampler, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetSamplerParameterfv(JNIEnv *env, jclass clazz, jint sampler, jint pname, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetSamplerParameterfv(sampler, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglVertexAttribDivisor(JNIEnv *env, jclass clazz, jint index, jint divisor) { + glVertexAttribDivisor(index, divisor); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglBindTransformFeedback(JNIEnv *env, jclass clazz, jint target, jint id) { + glBindTransformFeedback(target, id); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglDeleteTransformFeedbacks(JNIEnv *env, jclass clazz, jint n, jlong ids) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDeleteTransformFeedbacks(n, ids_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGenTransformFeedbacks(JNIEnv *env, jclass clazz, jint n, jlong ids) { + GLuint *ids_address = (GLuint *)(intptr_t)ids; + glGenTransformFeedbacks(n, ids_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_GLES30_nglIsTransformFeedback(JNIEnv *env, jclass clazz, jint id) { + GLboolean __result = glIsTransformFeedback(id); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglPauseTransformFeedback(JNIEnv *env, jclass clazz) { + glPauseTransformFeedback(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglResumeTransformFeedback(JNIEnv *env, jclass clazz) { + glResumeTransformFeedback(); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetProgramBinary(JNIEnv *env, jclass clazz, jint program, jint bufSize, jlong length, jlong binaryFormat, jlong binary) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLenum *binaryFormat_address = (GLenum *)(intptr_t)binaryFormat; + GLvoid *binary_address = (GLvoid *)(intptr_t)binary; + glGetProgramBinary(program, bufSize, length_address, binaryFormat_address, binary_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglProgramBinary(JNIEnv *env, jclass clazz, jint program, jint binaryFormat, jlong binary, jint length) { + const GLvoid *binary_address = (const GLvoid *)(intptr_t)binary; + glProgramBinary(program, binaryFormat, binary_address, length); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglProgramParameteri(JNIEnv *env, jclass clazz, jint program, jint pname, jint value) { + glProgramParameteri(program, pname, value); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglInvalidateFramebuffer(JNIEnv *env, jclass clazz, jint target, jint numAttachments, jlong attachments) { + const GLenum *attachments_address = (const GLenum *)(intptr_t)attachments; + glInvalidateFramebuffer(target, numAttachments, attachments_address); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglInvalidateSubFramebuffer(JNIEnv *env, jclass clazz, jint target, jint numAttachments, jlong attachments, jint x, jint y, jint width, jint height) { + const GLenum *attachments_address = (const GLenum *)(intptr_t)attachments; + glInvalidateSubFramebuffer(target, numAttachments, attachments_address, x, y, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexStorage2D(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height) { + glTexStorage2D(target, levels, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglTexStorage3D(JNIEnv *env, jclass clazz, jint target, jint levels, jint internalformat, jint width, jint height, jint depth) { + glTexStorage3D(target, levels, internalformat, width, height, depth); +} + +static void JNICALL Java_org_lwjgl_opengles_GLES30_nglGetInternalformativ(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint pname, jint bufSize, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetInternalformativ(target, internalformat, pname, bufSize, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_GLES30_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglReadBuffer", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglReadBuffer, "glReadBuffer", (void *)&glReadBuffer, false}, + {"nglDrawRangeElements", "(IIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawRangeElements, "glDrawRangeElements", (void *)&glDrawRangeElements, false}, + {"nglDrawRangeElementsBO", "(IIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawRangeElementsBO, "glDrawRangeElements", (void *)&glDrawRangeElements, false}, + {"nglTexImage3D", "(IIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexImage3D, "glTexImage3D", (void *)&glTexImage3D, false}, + {"nglTexImage3DBO", "(IIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexImage3DBO, "glTexImage3D", (void *)&glTexImage3D, false}, + {"nglTexSubImage3D", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexSubImage3D, "glTexSubImage3D", (void *)&glTexSubImage3D, false}, + {"nglTexSubImage3DBO", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexSubImage3DBO, "glTexSubImage3D", (void *)&glTexSubImage3D, false}, + {"nglCopyTexSubImage3D", "(IIIIIIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCopyTexSubImage3D, "glCopyTexSubImage3D", (void *)&glCopyTexSubImage3D, false}, + {"nglCompressedTexImage3D", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCompressedTexImage3D, "glCompressedTexImage3D", (void *)&glCompressedTexImage3D, false}, + {"nglCompressedTexImage3DBO", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCompressedTexImage3DBO, "glCompressedTexImage3D", (void *)&glCompressedTexImage3D, false}, + {"nglCompressedTexSubImage3D", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCompressedTexSubImage3D, "glCompressedTexSubImage3D", (void *)&glCompressedTexSubImage3D, false}, + {"nglCompressedTexSubImage3DBO", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCompressedTexSubImage3DBO, "glCompressedTexSubImage3D", (void *)&glCompressedTexSubImage3D, false}, + {"nglGenQueries", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGenQueries, "glGenQueries", (void *)&glGenQueries, false}, + {"nglDeleteQueries", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDeleteQueries, "glDeleteQueries", (void *)&glDeleteQueries, false}, + {"nglIsQuery", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglIsQuery, "glIsQuery", (void *)&glIsQuery, false}, + {"nglBeginQuery", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBeginQuery, "glBeginQuery", (void *)&glBeginQuery, false}, + {"nglEndQuery", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglEndQuery, "glEndQuery", (void *)&glEndQuery, false}, + {"nglGetQueryiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetQueryiv, "glGetQueryiv", (void *)&glGetQueryiv, false}, + {"nglGetQueryObjectuiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetQueryObjectuiv, "glGetQueryObjectuiv", (void *)&glGetQueryObjectuiv, false}, + {"nglUnmapBuffer", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglUnmapBuffer, "glUnmapBuffer", (void *)&glUnmapBuffer, false}, + {"nglGetBufferPointerv", "(IIJ)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetBufferPointerv, "glGetBufferPointerv", (void *)&glGetBufferPointerv, false}, + {"nglDrawBuffers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawBuffers, "glDrawBuffers", (void *)&glDrawBuffers, false}, + {"nglUniformMatrix2x3fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix2x3fv, "glUniformMatrix2x3fv", (void *)&glUniformMatrix2x3fv, false}, + {"nglUniformMatrix3x2fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix3x2fv, "glUniformMatrix3x2fv", (void *)&glUniformMatrix3x2fv, false}, + {"nglUniformMatrix2x4fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix2x4fv, "glUniformMatrix2x4fv", (void *)&glUniformMatrix2x4fv, false}, + {"nglUniformMatrix4x2fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix4x2fv, "glUniformMatrix4x2fv", (void *)&glUniformMatrix4x2fv, false}, + {"nglUniformMatrix3x4fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix3x4fv, "glUniformMatrix3x4fv", (void *)&glUniformMatrix3x4fv, false}, + {"nglUniformMatrix4x3fv", "(IIZJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformMatrix4x3fv, "glUniformMatrix4x3fv", (void *)&glUniformMatrix4x3fv, false}, + {"nglBlitFramebuffer", "(IIIIIIIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBlitFramebuffer, "glBlitFramebuffer", (void *)&glBlitFramebuffer, false}, + {"nglRenderbufferStorageMultisample", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglRenderbufferStorageMultisample, "glRenderbufferStorageMultisample", (void *)&glRenderbufferStorageMultisample, false}, + {"nglFramebufferTextureLayer", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglFramebufferTextureLayer, "glFramebufferTextureLayer", (void *)&glFramebufferTextureLayer, false}, + {"nglMapBufferRange", "(IJJIJLjava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_GLES30_nglMapBufferRange, "glMapBufferRange", (void *)&glMapBufferRange, false}, + {"nglFlushMappedBufferRange", "(IJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglFlushMappedBufferRange, "glFlushMappedBufferRange", (void *)&glFlushMappedBufferRange, false}, + {"nglBindVertexArray", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBindVertexArray, "glBindVertexArray", (void *)&glBindVertexArray, false}, + {"nglDeleteVertexArrays", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDeleteVertexArrays, "glDeleteVertexArrays", (void *)&glDeleteVertexArrays, false}, + {"nglGenVertexArrays", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGenVertexArrays, "glGenVertexArrays", (void *)&glGenVertexArrays, false}, + {"nglIsVertexArray", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglIsVertexArray, "glIsVertexArray", (void *)&glIsVertexArray, false}, + {"nglGetIntegeri_v", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetIntegeri_1v, "glGetIntegeri_v", (void *)&glGetIntegeri_v, false}, + {"nglBeginTransformFeedback", "(I)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBeginTransformFeedback, "glBeginTransformFeedback", (void *)&glBeginTransformFeedback, false}, + {"nglEndTransformFeedback", "()V", (void *)&Java_org_lwjgl_opengles_GLES30_nglEndTransformFeedback, "glEndTransformFeedback", (void *)&glEndTransformFeedback, false}, + {"nglBindBufferRange", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBindBufferRange, "glBindBufferRange", (void *)&glBindBufferRange, false}, + {"nglBindBufferBase", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBindBufferBase, "glBindBufferBase", (void *)&glBindBufferBase, false}, + {"nglTransformFeedbackVaryings", "(IIJI)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTransformFeedbackVaryings, "glTransformFeedbackVaryings", (void *)&glTransformFeedbackVaryings, false}, + {"nglGetTransformFeedbackVarying", "(IIIJJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetTransformFeedbackVarying, "glGetTransformFeedbackVarying", (void *)&glGetTransformFeedbackVarying, false}, + {"nglVertexAttribIPointer", "(IIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribIPointer, "glVertexAttribIPointer", (void *)&glVertexAttribIPointer, false}, + {"nglVertexAttribIPointerBO", "(IIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribIPointerBO, "glVertexAttribIPointer", (void *)&glVertexAttribIPointer, false}, + {"nglGetVertexAttribIiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetVertexAttribIiv, "glGetVertexAttribIiv", (void *)&glGetVertexAttribIiv, false}, + {"nglGetVertexAttribIuiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetVertexAttribIuiv, "glGetVertexAttribIuiv", (void *)&glGetVertexAttribIuiv, false}, + {"nglVertexAttribI4i", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4i, "glVertexAttribI4i", (void *)&glVertexAttribI4i, false}, + {"nglVertexAttribI4ui", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4ui, "glVertexAttribI4ui", (void *)&glVertexAttribI4ui, false}, + {"nglVertexAttribI4iv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4iv, "glVertexAttribI4iv", (void *)&glVertexAttribI4iv, false}, + {"nglVertexAttribI4uiv", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribI4uiv, "glVertexAttribI4uiv", (void *)&glVertexAttribI4uiv, false}, + {"nglGetUniformuiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetUniformuiv, "glGetUniformuiv", (void *)&glGetUniformuiv, false}, + {"nglGetFragDataLocation", "(IJ)I", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetFragDataLocation, "glGetFragDataLocation", (void *)&glGetFragDataLocation, false}, + {"nglUniform1ui", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform1ui, "glUniform1ui", (void *)&glUniform1ui, false}, + {"nglUniform2ui", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform2ui, "glUniform2ui", (void *)&glUniform2ui, false}, + {"nglUniform3ui", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform3ui, "glUniform3ui", (void *)&glUniform3ui, false}, + {"nglUniform4ui", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform4ui, "glUniform4ui", (void *)&glUniform4ui, false}, + {"nglUniform1uiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform1uiv, "glUniform1uiv", (void *)&glUniform1uiv, false}, + {"nglUniform2uiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform2uiv, "glUniform2uiv", (void *)&glUniform2uiv, false}, + {"nglUniform3uiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform3uiv, "glUniform3uiv", (void *)&glUniform3uiv, false}, + {"nglUniform4uiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniform4uiv, "glUniform4uiv", (void *)&glUniform4uiv, false}, + {"nglClearBufferfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglClearBufferfv, "glClearBufferfv", (void *)&glClearBufferfv, false}, + {"nglClearBufferiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglClearBufferiv, "glClearBufferiv", (void *)&glClearBufferiv, false}, + {"nglClearBufferuiv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglClearBufferuiv, "glClearBufferuiv", (void *)&glClearBufferuiv, false}, + {"nglClearBufferfi", "(IIFI)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglClearBufferfi, "glClearBufferfi", (void *)&glClearBufferfi, false}, + {"nglGetStringi", "(II)Ljava/lang/String;", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetStringi, "glGetStringi", (void *)&glGetStringi, false}, + {"nglCopyBufferSubData", "(IIJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglCopyBufferSubData, "glCopyBufferSubData", (void *)&glCopyBufferSubData, false}, + {"nglGetUniformIndices", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetUniformIndices, "glGetUniformIndices", (void *)&glGetUniformIndices, false}, + {"nglGetActiveUniformsiv", "(IIJIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformsiv, "glGetActiveUniformsiv", (void *)&glGetActiveUniformsiv, false}, + {"nglGetUniformBlockIndex", "(IJ)I", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetUniformBlockIndex, "glGetUniformBlockIndex", (void *)&glGetUniformBlockIndex, false}, + {"nglGetActiveUniformBlockiv", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformBlockiv, "glGetActiveUniformBlockiv", (void *)&glGetActiveUniformBlockiv, false}, + {"nglGetActiveUniformBlockName", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetActiveUniformBlockName, "glGetActiveUniformBlockName", (void *)&glGetActiveUniformBlockName, false}, + {"nglUniformBlockBinding", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglUniformBlockBinding, "glUniformBlockBinding", (void *)&glUniformBlockBinding, false}, + {"nglDrawArraysInstanced", "(IIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawArraysInstanced, "glDrawArraysInstanced", (void *)&glDrawArraysInstanced, false}, + {"nglDrawElementsInstanced", "(IIIJI)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawElementsInstanced, "glDrawElementsInstanced", (void *)&glDrawElementsInstanced, false}, + {"nglDrawElementsInstancedBO", "(IIIJI)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDrawElementsInstancedBO, "glDrawElementsInstanced", (void *)&glDrawElementsInstanced, false}, + {"nglFenceSync", "(II)J", (void *)&Java_org_lwjgl_opengles_GLES30_nglFenceSync, "glFenceSync", (void *)&glFenceSync, false}, + {"nglIsSync", "(J)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglIsSync, "glIsSync", (void *)&glIsSync, false}, + {"nglDeleteSync", "(J)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDeleteSync, "glDeleteSync", (void *)&glDeleteSync, false}, + {"nglClientWaitSync", "(JIJ)I", (void *)&Java_org_lwjgl_opengles_GLES30_nglClientWaitSync, "glClientWaitSync", (void *)&glClientWaitSync, false}, + {"nglWaitSync", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglWaitSync, "glWaitSync", (void *)&glWaitSync, false}, + {"nglGetInteger64v", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetInteger64v, "glGetInteger64v", (void *)&glGetInteger64v, false}, + {"nglGetInteger64i_v", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetInteger64i_1v, "glGetInteger64i_v", (void *)&glGetInteger64i_v, true}, + {"nglGetSynciv", "(JIIJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetSynciv, "glGetSynciv", (void *)&glGetSynciv, false}, + {"nglGetBufferParameteri64v", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetBufferParameteri64v, "glGetBufferParameteri64v", (void *)&glGetBufferParameteri64v, false}, + {"nglGenSamplers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGenSamplers, "glGenSamplers", (void *)&glGenSamplers, false}, + {"nglDeleteSamplers", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDeleteSamplers, "glDeleteSamplers", (void *)&glDeleteSamplers, false}, + {"nglIsSampler", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglIsSampler, "glIsSampler", (void *)&glIsSampler, false}, + {"nglBindSampler", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBindSampler, "glBindSampler", (void *)&glBindSampler, false}, + {"nglSamplerParameteri", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglSamplerParameteri, "glSamplerParameteri", (void *)&glSamplerParameteri, false}, + {"nglSamplerParameterf", "(IIF)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglSamplerParameterf, "glSamplerParameterf", (void *)&glSamplerParameterf, false}, + {"nglSamplerParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglSamplerParameteriv, "glSamplerParameteriv", (void *)&glSamplerParameteriv, false}, + {"nglSamplerParameterfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglSamplerParameterfv, "glSamplerParameterfv", (void *)&glSamplerParameterfv, false}, + {"nglGetSamplerParameteriv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetSamplerParameteriv, "glGetSamplerParameteriv", (void *)&glGetSamplerParameteriv, false}, + {"nglGetSamplerParameterfv", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetSamplerParameterfv, "glGetSamplerParameterfv", (void *)&glGetSamplerParameterfv, false}, + {"nglVertexAttribDivisor", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglVertexAttribDivisor, "glVertexAttribDivisor", (void *)&glVertexAttribDivisor, false}, + {"nglBindTransformFeedback", "(II)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglBindTransformFeedback, "glBindTransformFeedback", (void *)&glBindTransformFeedback, false}, + {"nglDeleteTransformFeedbacks", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglDeleteTransformFeedbacks, "glDeleteTransformFeedbacks", (void *)&glDeleteTransformFeedbacks, false}, + {"nglGenTransformFeedbacks", "(IJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGenTransformFeedbacks, "glGenTransformFeedbacks", (void *)&glGenTransformFeedbacks, false}, + {"nglIsTransformFeedback", "(I)Z", (void *)&Java_org_lwjgl_opengles_GLES30_nglIsTransformFeedback, "glIsTransformFeedback", (void *)&glIsTransformFeedback, false}, + {"nglPauseTransformFeedback", "()V", (void *)&Java_org_lwjgl_opengles_GLES30_nglPauseTransformFeedback, "glPauseTransformFeedback", (void *)&glPauseTransformFeedback, false}, + {"nglResumeTransformFeedback", "()V", (void *)&Java_org_lwjgl_opengles_GLES30_nglResumeTransformFeedback, "glResumeTransformFeedback", (void *)&glResumeTransformFeedback, false}, + {"nglGetProgramBinary", "(IIJJJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetProgramBinary, "glGetProgramBinary", (void *)&glGetProgramBinary, false}, + {"nglProgramBinary", "(IIJI)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglProgramBinary, "glProgramBinary", (void *)&glProgramBinary, false}, + {"nglProgramParameteri", "(III)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglProgramParameteri, "glProgramParameteri", (void *)&glProgramParameteri, false}, + {"nglInvalidateFramebuffer", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglInvalidateFramebuffer, "glInvalidateFramebuffer", (void *)&glInvalidateFramebuffer, false}, + {"nglInvalidateSubFramebuffer", "(IIJIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglInvalidateSubFramebuffer, "glInvalidateSubFramebuffer", (void *)&glInvalidateSubFramebuffer, false}, + {"nglTexStorage2D", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexStorage2D, "glTexStorage2D", (void *)&glTexStorage2D, false}, + {"nglTexStorage3D", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglTexStorage3D, "glTexStorage3D", (void *)&glTexStorage3D, false}, + {"nglGetInternalformativ", "(IIIIJ)V", (void *)&Java_org_lwjgl_opengles_GLES30_nglGetInternalformativ, "glGetInternalformativ", (void *)&glGetInternalformativ, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_IMGMultisampledRenderToTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_IMGMultisampledRenderToTexture.c new file mode 100644 index 0000000..ba0d133 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_IMGMultisampledRenderToTexture.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageMultisampleIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTexture2DMultisampleIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); + +static glRenderbufferStorageMultisampleIMGPROC glRenderbufferStorageMultisampleIMG; +static glFramebufferTexture2DMultisampleIMGPROC glFramebufferTexture2DMultisampleIMG; + +static void JNICALL Java_org_lwjgl_opengles_IMGMultisampledRenderToTexture_nglRenderbufferStorageMultisampleIMG(JNIEnv *env, jclass clazz, jint target, jint samples, jint internalformat, jint width, jint height) { + glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_IMGMultisampledRenderToTexture_nglFramebufferTexture2DMultisampleIMG(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint samples) { + glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_IMGMultisampledRenderToTexture_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglRenderbufferStorageMultisampleIMG", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_IMGMultisampledRenderToTexture_nglRenderbufferStorageMultisampleIMG, "glRenderbufferStorageMultisampleIMG", (void *)&glRenderbufferStorageMultisampleIMG, false}, + {"nglFramebufferTexture2DMultisampleIMG", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_IMGMultisampledRenderToTexture_nglFramebufferTexture2DMultisampleIMG, "glFramebufferTexture2DMultisampleIMG", (void *)&glFramebufferTexture2DMultisampleIMG, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_KHRDebug.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_KHRDebug.c new file mode 100644 index 0000000..489fb19 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_KHRDebug.c @@ -0,0 +1,100 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glDebugMessageControlPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef GL_APICALL void (GL_APIENTRY *glDebugMessageInsertPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef GL_APICALL void (GL_APIENTRY *glDebugMessageCallbackPROC) (GLDEBUGPROC callback, GLvoid * userParam); +typedef GL_APICALL GLuint (GL_APIENTRY *glGetDebugMessageLogPROC) (GLuint count, GLsizei bufsize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef GL_APICALL void (GL_APIENTRY *glPushDebugGroupPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef GL_APICALL void (GL_APIENTRY *glPopDebugGroupPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glObjectLabelPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef GL_APICALL void (GL_APIENTRY *glGetObjectLabelPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef GL_APICALL void (GL_APIENTRY *glObjectPtrLabelPROC) (GLvoid * ptr, GLsizei length, const GLchar * label); +typedef GL_APICALL void (GL_APIENTRY *glGetObjectPtrLabelPROC) (GLvoid * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); + +static glDebugMessageControlPROC glDebugMessageControl; +static glDebugMessageInsertPROC glDebugMessageInsert; +static glDebugMessageCallbackPROC glDebugMessageCallback; +static glGetDebugMessageLogPROC glGetDebugMessageLog; +static glPushDebugGroupPROC glPushDebugGroup; +static glPopDebugGroupPROC glPopDebugGroup; +static glObjectLabelPROC glObjectLabel; +static glGetObjectLabelPROC glGetObjectLabel; +static glObjectPtrLabelPROC glObjectPtrLabel; +static glGetObjectPtrLabelPROC glGetObjectPtrLabel; + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageControl(JNIEnv *env, jclass clazz, jint source, jint type, jint severity, jint count, jlong ids, jboolean enabled) { + const GLuint *ids_address = (const GLuint *)(intptr_t)ids; + glDebugMessageControl(source, type, severity, count, ids_address, enabled); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageInsert(JNIEnv *env, jclass clazz, jint source, jint type, jint id, jint severity, jint length, jlong buf) { + const GLchar *buf_address = (const GLchar *)(intptr_t)buf; + glDebugMessageInsert(source, type, id, severity, length, buf_address); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageCallback(JNIEnv *env, jclass clazz, jlong callback, jlong userParam) { + glDebugMessageCallback((GLDEBUGPROC)(intptr_t)callback, (GLvoid *)(intptr_t)userParam); +} + +static jint JNICALL Java_org_lwjgl_opengles_KHRDebug_nglGetDebugMessageLog(JNIEnv *env, jclass clazz, jint count, jint bufsize, jlong sources, jlong types, jlong ids, jlong severities, jlong lengths, jlong messageLog) { + GLenum *sources_address = (GLenum *)(intptr_t)sources; + GLenum *types_address = (GLenum *)(intptr_t)types; + GLuint *ids_address = (GLuint *)(intptr_t)ids; + GLenum *severities_address = (GLenum *)(intptr_t)severities; + GLsizei *lengths_address = (GLsizei *)(intptr_t)lengths; + GLchar *messageLog_address = (GLchar *)(intptr_t)messageLog; + GLuint __result = glGetDebugMessageLog(count, bufsize, sources_address, types_address, ids_address, severities_address, lengths_address, messageLog_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglPushDebugGroup(JNIEnv *env, jclass clazz, jint source, jint id, jint length, jlong message) { + const GLchar *message_address = (const GLchar *)(intptr_t)message; + glPushDebugGroup(source, id, length, message_address); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglPopDebugGroup(JNIEnv *env, jclass clazz) { + glPopDebugGroup(); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglObjectLabel(JNIEnv *env, jclass clazz, jint identifier, jint name, jint length, jlong label) { + const GLchar *label_address = (const GLchar *)(intptr_t)label; + glObjectLabel(identifier, name, length, label_address); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglGetObjectLabel(JNIEnv *env, jclass clazz, jint identifier, jint name, jint bufSize, jlong length, jlong label) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *label_address = (GLchar *)(intptr_t)label; + glGetObjectLabel(identifier, name, bufSize, length_address, label_address); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglObjectPtrLabel(JNIEnv *env, jclass clazz, jlong ptr, jint length, jlong label) { + const GLchar *label_address = (const GLchar *)(intptr_t)label; + glObjectPtrLabel((GLvoid *)(intptr_t)ptr, length, label_address); +} + +static void JNICALL Java_org_lwjgl_opengles_KHRDebug_nglGetObjectPtrLabel(JNIEnv *env, jclass clazz, jlong ptr, jint bufSize, jlong length, jlong label) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *label_address = (GLchar *)(intptr_t)label; + glGetObjectPtrLabel((GLvoid *)(intptr_t)ptr, bufSize, length_address, label_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_KHRDebug_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglDebugMessageControl", "(IIIIJZ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageControl, "glDebugMessageControl", (void *)&glDebugMessageControl, false}, + {"nglDebugMessageInsert", "(IIIIIJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageInsert, "glDebugMessageInsert", (void *)&glDebugMessageInsert, false}, + {"nglDebugMessageCallback", "(JJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglDebugMessageCallback, "glDebugMessageCallback", (void *)&glDebugMessageCallback, false}, + {"nglGetDebugMessageLog", "(IIJJJJJJ)I", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglGetDebugMessageLog, "glGetDebugMessageLog", (void *)&glGetDebugMessageLog, false}, + {"nglPushDebugGroup", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglPushDebugGroup, "glPushDebugGroup", (void *)&glPushDebugGroup, false}, + {"nglPopDebugGroup", "()V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglPopDebugGroup, "glPopDebugGroup", (void *)&glPopDebugGroup, false}, + {"nglObjectLabel", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglObjectLabel, "glObjectLabel", (void *)&glObjectLabel, false}, + {"nglGetObjectLabel", "(IIIJJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglGetObjectLabel, "glGetObjectLabel", (void *)&glGetObjectLabel, false}, + {"nglObjectPtrLabel", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglObjectPtrLabel, "glObjectPtrLabel", (void *)&glObjectPtrLabel, false}, + {"nglGetObjectPtrLabel", "(JIJJ)V", (void *)&Java_org_lwjgl_opengles_KHRDebug_nglGetObjectPtrLabel, "glGetObjectPtrLabel", (void *)&glGetObjectPtrLabel, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVCoverageSample.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVCoverageSample.c new file mode 100644 index 0000000..eb161a0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVCoverageSample.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glCoverageMaskNVPROC) (GLboolean mask); +typedef GL_APICALL void (GL_APIENTRY *glCoverageOperationNVPROC) (GLenum operation); + +static glCoverageMaskNVPROC glCoverageMaskNV; +static glCoverageOperationNVPROC glCoverageOperationNV; + +static void JNICALL Java_org_lwjgl_opengles_NVCoverageSample_nglCoverageMaskNV(JNIEnv *env, jclass clazz, jboolean mask) { + glCoverageMaskNV(mask); +} + +static void JNICALL Java_org_lwjgl_opengles_NVCoverageSample_nglCoverageOperationNV(JNIEnv *env, jclass clazz, jint operation) { + glCoverageOperationNV(operation); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVCoverageSample_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglCoverageMaskNV", "(Z)V", (void *)&Java_org_lwjgl_opengles_NVCoverageSample_nglCoverageMaskNV, "glCoverageMaskNV", (void *)&glCoverageMaskNV, false}, + {"nglCoverageOperationNV", "(I)V", (void *)&Java_org_lwjgl_opengles_NVCoverageSample_nglCoverageOperationNV, "glCoverageOperationNV", (void *)&glCoverageOperationNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawBuffers.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawBuffers.c new file mode 100644 index 0000000..8f515bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawBuffers.c @@ -0,0 +1,22 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glDrawBuffersNVPROC) (GLsizei n, const GLenum * bufs); + +static glDrawBuffersNVPROC glDrawBuffersNV; + +static void JNICALL Java_org_lwjgl_opengles_NVDrawBuffers_nglDrawBuffersNV(JNIEnv *env, jclass clazz, jint n, jlong bufs) { + const GLenum *bufs_address = (const GLenum *)(intptr_t)bufs; + glDrawBuffersNV(n, bufs_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVDrawBuffers_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglDrawBuffersNV", "(IJ)V", (void *)&Java_org_lwjgl_opengles_NVDrawBuffers_nglDrawBuffersNV, "glDrawBuffersNV", (void *)&glDrawBuffersNV, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawPath.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawPath.c new file mode 100644 index 0000000..c6e27d6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawPath.c @@ -0,0 +1,110 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL GLuint (GL_APIENTRY *glCreatePathNVPROC) (GLenum datatype, GLsizei numCommands, const GLubyte * commands); +typedef GL_APICALL void (GL_APIENTRY *glDeletePathNVPROC) (GLuint path); +typedef GL_APICALL void (GL_APIENTRY *glPathVerticesNVPROC) (GLuint path, const GLvoid * vertices); +typedef GL_APICALL void (GL_APIENTRY *glPathParameterfNVPROC) (GLuint path, GLenum paramType, GLfloat param); +typedef GL_APICALL void (GL_APIENTRY *glPathParameteriNVPROC) (GLuint path, GLenum paramType, GLint param); +typedef GL_APICALL GLuint (GL_APIENTRY *glCreatePathProgramNVPROC) (); +typedef GL_APICALL void (GL_APIENTRY *glPathMatrixNVPROC) (GLenum target, const GLfloat * value); +typedef GL_APICALL void (GL_APIENTRY *glDrawPathNVPROC) (GLuint path, GLenum mode); +typedef GL_APICALL GLuint (GL_APIENTRY *glCreatePathbufferNVPROC) (GLsizei capacity); +typedef GL_APICALL void (GL_APIENTRY *glDeletePathbufferNVPROC) (GLuint buffer); +typedef GL_APICALL void (GL_APIENTRY *glPathbufferPathNVPROC) (GLuint buffer, GLint index, GLuint path); +typedef GL_APICALL void (GL_APIENTRY *glPathbufferPositionNVPROC) (GLuint buffer, GLint index, GLfloat x, GLfloat y); +typedef GL_APICALL void (GL_APIENTRY *glDrawPathbufferNVPROC) (GLuint buffer, GLenum mode); + +static glCreatePathNVPROC glCreatePathNV; +static glDeletePathNVPROC glDeletePathNV; +static glPathVerticesNVPROC glPathVerticesNV; +static glPathParameterfNVPROC glPathParameterfNV; +static glPathParameteriNVPROC glPathParameteriNV; +static glCreatePathProgramNVPROC glCreatePathProgramNV; +static glPathMatrixNVPROC glPathMatrixNV; +static glDrawPathNVPROC glDrawPathNV; +static glCreatePathbufferNVPROC glCreatePathbufferNV; +static glDeletePathbufferNVPROC glDeletePathbufferNV; +static glPathbufferPathNVPROC glPathbufferPathNV; +static glPathbufferPositionNVPROC glPathbufferPositionNV; +static glDrawPathbufferNVPROC glDrawPathbufferNV; + +static jint JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathNV(JNIEnv *env, jclass clazz, jint datatype, jint numCommands, jlong commands) { + const GLubyte *commands_address = (const GLubyte *)(intptr_t)commands; + GLuint __result = glCreatePathNV(datatype, numCommands, commands_address); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglDeletePathNV(JNIEnv *env, jclass clazz, jint path) { + glDeletePathNV(path); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathVerticesNV(JNIEnv *env, jclass clazz, jint path, jlong vertices) { + const GLvoid *vertices_address = (const GLvoid *)(intptr_t)vertices; + glPathVerticesNV(path, vertices_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathParameterfNV(JNIEnv *env, jclass clazz, jint path, jint paramType, jfloat param) { + glPathParameterfNV(path, paramType, param); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathParameteriNV(JNIEnv *env, jclass clazz, jint path, jint paramType, jint param) { + glPathParameteriNV(path, paramType, param); +} + +static jint JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathProgramNV(JNIEnv *env, jclass clazz) { + GLuint __result = glCreatePathProgramNV(); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathMatrixNV(JNIEnv *env, jclass clazz, jint target, jlong value) { + const GLfloat *value_address = (const GLfloat *)(intptr_t)value; + glPathMatrixNV(target, value_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglDrawPathNV(JNIEnv *env, jclass clazz, jint path, jint mode) { + glDrawPathNV(path, mode); +} + +static jint JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathbufferNV(JNIEnv *env, jclass clazz, jint capacity) { + GLuint __result = glCreatePathbufferNV(capacity); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglDeletePathbufferNV(JNIEnv *env, jclass clazz, jint buffer) { + glDeletePathbufferNV(buffer); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathbufferPathNV(JNIEnv *env, jclass clazz, jint buffer, jint index, jint path) { + glPathbufferPathNV(buffer, index, path); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglPathbufferPositionNV(JNIEnv *env, jclass clazz, jint buffer, jint index, jfloat x, jfloat y) { + glPathbufferPositionNV(buffer, index, x, y); +} + +static void JNICALL Java_org_lwjgl_opengles_NVDrawPath_nglDrawPathbufferNV(JNIEnv *env, jclass clazz, jint buffer, jint mode) { + glDrawPathbufferNV(buffer, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVDrawPath_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglCreatePathNV", "(IIJ)I", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathNV, "glCreatePathNV", (void *)&glCreatePathNV, false}, + {"nglDeletePathNV", "(I)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglDeletePathNV, "glDeletePathNV", (void *)&glDeletePathNV, false}, + {"nglPathVerticesNV", "(IJ)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathVerticesNV, "glPathVerticesNV", (void *)&glPathVerticesNV, false}, + {"nglPathParameterfNV", "(IIF)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathParameterfNV, "glPathParameterfNV", (void *)&glPathParameterfNV, false}, + {"nglPathParameteriNV", "(III)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathParameteriNV, "glPathParameteriNV", (void *)&glPathParameteriNV, false}, + {"nglCreatePathProgramNV", "()I", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathProgramNV, "glCreatePathProgramNV", (void *)&glCreatePathProgramNV, false}, + {"nglPathMatrixNV", "(IJ)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathMatrixNV, "glPathMatrixNV", (void *)&glPathMatrixNV, false}, + {"nglDrawPathNV", "(II)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglDrawPathNV, "glDrawPathNV", (void *)&glDrawPathNV, false}, + {"nglCreatePathbufferNV", "(I)I", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglCreatePathbufferNV, "glCreatePathbufferNV", (void *)&glCreatePathbufferNV, false}, + {"nglDeletePathbufferNV", "(I)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglDeletePathbufferNV, "glDeletePathbufferNV", (void *)&glDeletePathbufferNV, false}, + {"nglPathbufferPathNV", "(III)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathbufferPathNV, "glPathbufferPathNV", (void *)&glPathbufferPathNV, false}, + {"nglPathbufferPositionNV", "(IIFF)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglPathbufferPositionNV, "glPathbufferPositionNV", (void *)&glPathbufferPositionNV, false}, + {"nglDrawPathbufferNV", "(II)V", (void *)&Java_org_lwjgl_opengles_NVDrawPath_nglDrawPathbufferNV, "glDrawPathbufferNV", (void *)&glDrawPathbufferNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawTexture.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawTexture.c new file mode 100644 index 0000000..018473b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVDrawTexture.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glDrawTextureNVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +static glDrawTextureNVPROC glDrawTextureNV; + +static void JNICALL Java_org_lwjgl_opengles_NVDrawTexture_nglDrawTextureNV(JNIEnv *env, jclass clazz, jint texture, jint sampler, jfloat x0, jfloat y0, jfloat x1, jfloat y1, jfloat z, jfloat s0, jfloat t0, jfloat s1, jfloat t1) { + glDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVDrawTexture_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglDrawTextureNV", "(IIFFFFFFFFF)V", (void *)&Java_org_lwjgl_opengles_NVDrawTexture_nglDrawTextureNV, "glDrawTextureNV", (void *)&glDrawTextureNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFence.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFence.c new file mode 100644 index 0000000..5155ccf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFence.c @@ -0,0 +1,67 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGenFencesNVPROC) (GLsizei n, GLuint * fences); +typedef GL_APICALL void (GL_APIENTRY *glDeleteFencesNVPROC) (GLsizei n, const GLuint * fences); +typedef GL_APICALL void (GL_APIENTRY *glSetFenceNVPROC) (GLuint fence, GLenum condition); +typedef GL_APICALL GLboolean (GL_APIENTRY *glTestFenceNVPROC) (GLuint fence); +typedef GL_APICALL void (GL_APIENTRY *glFinishFenceNVPROC) (GLuint fence); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsFenceNVPROC) (GLuint fence); +typedef GL_APICALL void (GL_APIENTRY *glGetFenceivNVPROC) (GLuint fence, GLenum pname, GLint * params); + +static glGenFencesNVPROC glGenFencesNV; +static glDeleteFencesNVPROC glDeleteFencesNV; +static glSetFenceNVPROC glSetFenceNV; +static glTestFenceNVPROC glTestFenceNV; +static glFinishFenceNVPROC glFinishFenceNV; +static glIsFenceNVPROC glIsFenceNV; +static glGetFenceivNVPROC glGetFenceivNV; + +static void JNICALL Java_org_lwjgl_opengles_NVFence_nglGenFencesNV(JNIEnv *env, jclass clazz, jint n, jlong fences) { + GLuint *fences_address = (GLuint *)(intptr_t)fences; + glGenFencesNV(n, fences_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVFence_nglDeleteFencesNV(JNIEnv *env, jclass clazz, jint n, jlong fences) { + const GLuint *fences_address = (const GLuint *)(intptr_t)fences; + glDeleteFencesNV(n, fences_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVFence_nglSetFenceNV(JNIEnv *env, jclass clazz, jint fence, jint condition) { + glSetFenceNV(fence, condition); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_NVFence_nglTestFenceNV(JNIEnv *env, jclass clazz, jint fence) { + GLboolean __result = glTestFenceNV(fence); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_NVFence_nglFinishFenceNV(JNIEnv *env, jclass clazz, jint fence) { + glFinishFenceNV(fence); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_NVFence_nglIsFenceNV(JNIEnv *env, jclass clazz, jint fence) { + GLboolean __result = glIsFenceNV(fence); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_NVFence_nglGetFenceivNV(JNIEnv *env, jclass clazz, jint fence, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFenceivNV(fence, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVFence_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGenFencesNV", "(IJ)V", (void *)&Java_org_lwjgl_opengles_NVFence_nglGenFencesNV, "glGenFencesNV", (void *)&glGenFencesNV, false}, + {"nglDeleteFencesNV", "(IJ)V", (void *)&Java_org_lwjgl_opengles_NVFence_nglDeleteFencesNV, "glDeleteFencesNV", (void *)&glDeleteFencesNV, false}, + {"nglSetFenceNV", "(II)V", (void *)&Java_org_lwjgl_opengles_NVFence_nglSetFenceNV, "glSetFenceNV", (void *)&glSetFenceNV, false}, + {"nglTestFenceNV", "(I)Z", (void *)&Java_org_lwjgl_opengles_NVFence_nglTestFenceNV, "glTestFenceNV", (void *)&glTestFenceNV, false}, + {"nglFinishFenceNV", "(I)V", (void *)&Java_org_lwjgl_opengles_NVFence_nglFinishFenceNV, "glFinishFenceNV", (void *)&glFinishFenceNV, false}, + {"nglIsFenceNV", "(I)Z", (void *)&Java_org_lwjgl_opengles_NVFence_nglIsFenceNV, "glIsFenceNV", (void *)&glIsFenceNV, false}, + {"nglGetFenceivNV", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_NVFence_nglGetFenceivNV, "glGetFenceivNV", (void *)&glGetFenceivNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFramebufferVertexAttribArray.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFramebufferVertexAttribArray.c new file mode 100644 index 0000000..f32054b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVFramebufferVertexAttribArray.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glFramebufferVertexAttribArrayNVPROC) (GLenum target, GLenum attachment, GLenum buffertarget, GLuint bufferobject, GLint size, GLenum type, GLboolean normalized, GLintptr offset, GLsizeiptr width, GLsizeiptr height, GLsizei stride); + +static glFramebufferVertexAttribArrayNVPROC glFramebufferVertexAttribArrayNV; + +static void JNICALL Java_org_lwjgl_opengles_NVFramebufferVertexAttribArray_nglFramebufferVertexAttribArrayNV(JNIEnv *env, jclass clazz, jint target, jint attachment, jint buffertarget, jint bufferobject, jint size, jint type, jboolean normalized, jlong offset, jlong width, jlong height, jint stride) { + glFramebufferVertexAttribArrayNV(target, attachment, buffertarget, bufferobject, size, type, normalized, offset, width, height, stride); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVFramebufferVertexAttribArray_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglFramebufferVertexAttribArrayNV", "(IIIIIIZJJJI)V", (void *)&Java_org_lwjgl_opengles_NVFramebufferVertexAttribArray_nglFramebufferVertexAttribArrayNV, "glFramebufferVertexAttribArrayNV", (void *)&glFramebufferVertexAttribArrayNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVGetTexImage.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVGetTexImage.c new file mode 100644 index 0000000..1a75e2c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVGetTexImage.c @@ -0,0 +1,46 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGetTexImageNVPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid * img); +typedef GL_APICALL void (GL_APIENTRY *glGetCompressedTexImageNVPROC) (GLenum target, GLint level, GLvoid * img); +typedef GL_APICALL void (GL_APIENTRY *glGetTexLevelParameterfvNVPROC) (GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef GL_APICALL void (GL_APIENTRY *glGetTexLevelParameterivNVPROC) (GLenum target, GLint level, GLenum pname, GLint * params); + +static glGetTexImageNVPROC glGetTexImageNV; +static glGetCompressedTexImageNVPROC glGetCompressedTexImageNV; +static glGetTexLevelParameterfvNVPROC glGetTexLevelParameterfvNV; +static glGetTexLevelParameterivNVPROC glGetTexLevelParameterivNV; + +static void JNICALL Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexImageNV(JNIEnv *env, jclass clazz, jint target, jint level, jint format, jint type, jlong img) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetTexImageNV(target, level, format, type, img_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVGetTexImage_nglGetCompressedTexImageNV(JNIEnv *env, jclass clazz, jint target, jint level, jlong img) { + GLvoid *img_address = (GLvoid *)(intptr_t)img; + glGetCompressedTexImageNV(target, level, img_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexLevelParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint level, jint pname, jlong params) { + GLfloat *params_address = (GLfloat *)(intptr_t)params; + glGetTexLevelParameterfvNV(target, level, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexLevelParameterivNV(JNIEnv *env, jclass clazz, jint target, jint level, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetTexLevelParameterivNV(target, level, pname, params_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVGetTexImage_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetTexImageNV", "(IIIIJ)V", (void *)&Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexImageNV, "glGetTexImageNV", (void *)&glGetTexImageNV, false}, + {"nglGetCompressedTexImageNV", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_NVGetTexImage_nglGetCompressedTexImageNV, "glGetCompressedTexImageNV", (void *)&glGetCompressedTexImageNV, false}, + {"nglGetTexLevelParameterfvNV", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexLevelParameterfvNV, "glGetTexLevelParameterfvNV", (void *)&glGetTexLevelParameterfvNV, false}, + {"nglGetTexLevelParameterivNV", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_NVGetTexImage_nglGetTexLevelParameterivNV, "glGetTexLevelParameterivNV", (void *)&glGetTexLevelParameterivNV, false}, + + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVReadBuffer.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVReadBuffer.c new file mode 100644 index 0000000..65a0ab3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVReadBuffer.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glReadBufferNVPROC) (GLenum mode); + +static glReadBufferNVPROC glReadBufferNV; + +static void JNICALL Java_org_lwjgl_opengles_NVReadBuffer_nglReadBufferNV(JNIEnv *env, jclass clazz, jint mode) { + glReadBufferNV(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVReadBuffer_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglReadBufferNV", "(I)V", (void *)&Java_org_lwjgl_opengles_NVReadBuffer_nglReadBufferNV, "glReadBufferNV", (void *)&glReadBufferNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVSystemTime.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVSystemTime.c new file mode 100644 index 0000000..2a812b0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_NVSystemTime.c @@ -0,0 +1,29 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL EGLuint64NV (GL_APIENTRY *glGetSystemTimeFrequencyNVPROC) (); +typedef GL_APICALL EGLuint64NV (GL_APIENTRY *glGetSystemTimeNVPROC) (); + +static glGetSystemTimeFrequencyNVPROC glGetSystemTimeFrequencyNV; +static glGetSystemTimeNVPROC glGetSystemTimeNV; + +static jlong JNICALL Java_org_lwjgl_opengles_NVSystemTime_nglGetSystemTimeFrequencyNV(JNIEnv *env, jclass clazz) { + EGLuint64NV __result = glGetSystemTimeFrequencyNV(); + return __result; +} + +static jlong JNICALL Java_org_lwjgl_opengles_NVSystemTime_nglGetSystemTimeNV(JNIEnv *env, jclass clazz) { + EGLuint64NV __result = glGetSystemTimeNV(); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_NVSystemTime_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetSystemTimeFrequencyNV", "()J", (void *)&Java_org_lwjgl_opengles_NVSystemTime_nglGetSystemTimeFrequencyNV, "glGetSystemTimeFrequencyNV", (void *)&glGetSystemTimeFrequencyNV, false}, + {"nglGetSystemTimeNV", "()J", (void *)&Java_org_lwjgl_opengles_NVSystemTime_nglGetSystemTimeNV, "glGetSystemTimeNV", (void *)&glGetSystemTimeNV, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendEquationSeparate.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendEquationSeparate.c new file mode 100644 index 0000000..0a1339b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendEquationSeparate.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBlendEquationSeparateOESPROC) (GLenum modeRGB, GLenum modeAlpha); + +static glBlendEquationSeparateOESPROC glBlendEquationSeparateOES; + +static void JNICALL Java_org_lwjgl_opengles_OESBlendEquationSeparate_nglBlendEquationSeparateOES(JNIEnv *env, jclass clazz, jint modeRGB, jint modeAlpha) { + glBlendEquationSeparateOES(modeRGB, modeAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESBlendEquationSeparate_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBlendEquationSeparateOES", "(II)V", (void *)&Java_org_lwjgl_opengles_OESBlendEquationSeparate_nglBlendEquationSeparateOES, "glBlendEquationSeparateOES", (void *)&glBlendEquationSeparateOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendFuncSeparate.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendFuncSeparate.c new file mode 100644 index 0000000..9c5b3a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendFuncSeparate.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBlendFuncSeparateOESPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +static glBlendFuncSeparateOESPROC glBlendFuncSeparateOES; + +static void JNICALL Java_org_lwjgl_opengles_OESBlendFuncSeparate_nglBlendFuncSeparateOES(JNIEnv *env, jclass clazz, jint sfactorRGB, jint dfactorRGB, jint sfactorAlpha, jint dfactorAlpha) { + glBlendFuncSeparateOES(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESBlendFuncSeparate_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBlendFuncSeparateOES", "(IIII)V", (void *)&Java_org_lwjgl_opengles_OESBlendFuncSeparate_nglBlendFuncSeparateOES, "glBlendFuncSeparateOES", (void *)&glBlendFuncSeparateOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendSubtract.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendSubtract.c new file mode 100644 index 0000000..ca822ae --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESBlendSubtract.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBlendEquationOESPROC) (GLenum mode); + +static glBlendEquationOESPROC glBlendEquationOES; + +static void JNICALL Java_org_lwjgl_opengles_OESBlendSubtract_nglBlendEquationOES(JNIEnv *env, jclass clazz, jint mode) { + glBlendEquationOES(mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESBlendSubtract_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBlendEquationOES", "(I)V", (void *)&Java_org_lwjgl_opengles_OESBlendSubtract_nglBlendEquationOES, "glBlendEquationOES", (void *)&glBlendEquationOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImage.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImage.c new file mode 100644 index 0000000..5184858 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImage.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glEGLImageTargetTexture2DOESPROC) (GLenum target, GLeglImageOES image); +typedef GL_APICALL void (GL_APIENTRY *glEGLImageTargetRenderbufferStorageOESPROC) (GLenum target, GLeglImageOES image); + +static glEGLImageTargetTexture2DOESPROC glEGLImageTargetTexture2DOES; +static glEGLImageTargetRenderbufferStorageOESPROC glEGLImageTargetRenderbufferStorageOES; + +static void JNICALL Java_org_lwjgl_opengles_OESEGLImage_nglEGLImageTargetTexture2DOES(JNIEnv *env, jclass clazz, jint target, jlong image) { + glEGLImageTargetTexture2DOES(target, (GLeglImageOES)(intptr_t)image); +} + +static void JNICALL Java_org_lwjgl_opengles_OESEGLImage_nglEGLImageTargetRenderbufferStorageOES(JNIEnv *env, jclass clazz, jint target, jlong image) { + glEGLImageTargetRenderbufferStorageOES(target, (GLeglImageOES)(intptr_t)image); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESEGLImage_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglEGLImageTargetTexture2DOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESEGLImage_nglEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", (void *)&glEGLImageTargetTexture2DOES, false}, + {"nglEGLImageTargetRenderbufferStorageOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESEGLImage_nglEGLImageTargetRenderbufferStorageOES, "glEGLImageTargetRenderbufferStorageOES", (void *)&glEGLImageTargetRenderbufferStorageOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImageExternal.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImageExternal.c new file mode 100644 index 0000000..c3aa36a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESEGLImageExternal.c @@ -0,0 +1,20 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glEGLImageTargetTexture2DOESPROC) (GLenum target, GLeglImageOES image); + +static glEGLImageTargetTexture2DOESPROC glEGLImageTargetTexture2DOES; + +static void JNICALL Java_org_lwjgl_opengles_OESEGLImageExternal_nglEGLImageTargetTexture2DOES(JNIEnv *env, jclass clazz, jint target, jlong image) { + glEGLImageTargetTexture2DOES(target, (GLeglImageOES)(intptr_t)image); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESEGLImageExternal_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglEGLImageTargetTexture2DOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESEGLImageExternal_nglEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES", (void *)&glEGLImageTargetTexture2DOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESFramebufferObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESFramebufferObject.c new file mode 100644 index 0000000..ca04953 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESFramebufferObject.c @@ -0,0 +1,127 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsRenderbufferOESPROC) (GLuint renderbuffer); +typedef GL_APICALL void (GL_APIENTRY *glBindRenderbufferOESPROC) (GLenum target, GLuint renderbuffer); +typedef GL_APICALL void (GL_APIENTRY *glDeleteRenderbuffersOESPROC) (GLint n, const GLuint * renderbuffers); +typedef GL_APICALL void (GL_APIENTRY *glGenRenderbuffersOESPROC) (GLint n, GLuint * renderbuffers); +typedef GL_APICALL void (GL_APIENTRY *glRenderbufferStorageOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glGetRenderbufferParameterivOESPROC) (GLenum target, GLenum pname, GLint * params); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsFramebufferOESPROC) (GLuint framebuffer); +typedef GL_APICALL void (GL_APIENTRY *glBindFramebufferOESPROC) (GLenum target, GLuint framebuffer); +typedef GL_APICALL void (GL_APIENTRY *glDeleteFramebuffersOESPROC) (GLint n, const GLuint * framebuffers); +typedef GL_APICALL void (GL_APIENTRY *glGenFramebuffersOESPROC) (GLint n, GLuint * framebuffers); +typedef GL_APICALL GLenum (GL_APIENTRY *glCheckFramebufferStatusOESPROC) (GLenum target); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTexture2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferRenderbufferOESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef GL_APICALL void (GL_APIENTRY *glGetFramebufferAttachmentParameterivOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glGenerateMipmapOESPROC) (GLenum target); + +static glIsRenderbufferOESPROC glIsRenderbufferOES; +static glBindRenderbufferOESPROC glBindRenderbufferOES; +static glDeleteRenderbuffersOESPROC glDeleteRenderbuffersOES; +static glGenRenderbuffersOESPROC glGenRenderbuffersOES; +static glRenderbufferStorageOESPROC glRenderbufferStorageOES; +static glGetRenderbufferParameterivOESPROC glGetRenderbufferParameterivOES; +static glIsFramebufferOESPROC glIsFramebufferOES; +static glBindFramebufferOESPROC glBindFramebufferOES; +static glDeleteFramebuffersOESPROC glDeleteFramebuffersOES; +static glGenFramebuffersOESPROC glGenFramebuffersOES; +static glCheckFramebufferStatusOESPROC glCheckFramebufferStatusOES; +static glFramebufferTexture2DOESPROC glFramebufferTexture2DOES; +static glFramebufferRenderbufferOESPROC glFramebufferRenderbufferOES; +static glGetFramebufferAttachmentParameterivOESPROC glGetFramebufferAttachmentParameterivOES; +static glGenerateMipmapOESPROC glGenerateMipmapOES; + +static jboolean JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglIsRenderbufferOES(JNIEnv *env, jclass clazz, jint renderbuffer) { + GLboolean __result = glIsRenderbufferOES(renderbuffer); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglBindRenderbufferOES(JNIEnv *env, jclass clazz, jint target, jint renderbuffer) { + glBindRenderbufferOES(target, renderbuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglDeleteRenderbuffersOES(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers) { + const GLuint *renderbuffers_address = (const GLuint *)(intptr_t)renderbuffers; + glDeleteRenderbuffersOES(n, renderbuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglGenRenderbuffersOES(JNIEnv *env, jclass clazz, jint n, jlong renderbuffers) { + GLuint *renderbuffers_address = (GLuint *)(intptr_t)renderbuffers; + glGenRenderbuffersOES(n, renderbuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglRenderbufferStorageOES(JNIEnv *env, jclass clazz, jint target, jint internalformat, jint width, jint height) { + glRenderbufferStorageOES(target, internalformat, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglGetRenderbufferParameterivOES(JNIEnv *env, jclass clazz, jint target, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetRenderbufferParameterivOES(target, pname, params_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglIsFramebufferOES(JNIEnv *env, jclass clazz, jint framebuffer) { + GLboolean __result = glIsFramebufferOES(framebuffer); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglBindFramebufferOES(JNIEnv *env, jclass clazz, jint target, jint framebuffer) { + glBindFramebufferOES(target, framebuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglDeleteFramebuffersOES(JNIEnv *env, jclass clazz, jint n, jlong framebuffers) { + const GLuint *framebuffers_address = (const GLuint *)(intptr_t)framebuffers; + glDeleteFramebuffersOES(n, framebuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglGenFramebuffersOES(JNIEnv *env, jclass clazz, jint n, jlong framebuffers) { + GLuint *framebuffers_address = (GLuint *)(intptr_t)framebuffers; + glGenFramebuffersOES(n, framebuffers_address); +} + +static jint JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglCheckFramebufferStatusOES(JNIEnv *env, jclass clazz, jint target) { + GLenum __result = glCheckFramebufferStatusOES(target); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglFramebufferTexture2DOES(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level) { + glFramebufferTexture2DOES(target, attachment, textarget, texture, level); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglFramebufferRenderbufferOES(JNIEnv *env, jclass clazz, jint target, jint attachment, jint renderbuffertarget, jint renderbuffer) { + glFramebufferRenderbufferOES(target, attachment, renderbuffertarget, renderbuffer); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglGetFramebufferAttachmentParameterivOES(JNIEnv *env, jclass clazz, jint target, jint attachment, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glGetFramebufferAttachmentParameterivOES(target, attachment, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_nglGenerateMipmapOES(JNIEnv *env, jclass clazz, jint target) { + glGenerateMipmapOES(target); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESFramebufferObject_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglIsRenderbufferOES", "(I)Z", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglIsRenderbufferOES, "glIsRenderbufferOES", (void *)&glIsRenderbufferOES, false}, + {"nglBindRenderbufferOES", "(II)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglBindRenderbufferOES, "glBindRenderbufferOES", (void *)&glBindRenderbufferOES, false}, + {"nglDeleteRenderbuffersOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglDeleteRenderbuffersOES, "glDeleteRenderbuffersOES", (void *)&glDeleteRenderbuffersOES, false}, + {"nglGenRenderbuffersOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglGenRenderbuffersOES, "glGenRenderbuffersOES", (void *)&glGenRenderbuffersOES, false}, + {"nglRenderbufferStorageOES", "(IIII)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglRenderbufferStorageOES, "glRenderbufferStorageOES", (void *)&glRenderbufferStorageOES, false}, + {"nglGetRenderbufferParameterivOES", "(IIJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglGetRenderbufferParameterivOES, "glGetRenderbufferParameterivOES", (void *)&glGetRenderbufferParameterivOES, false}, + {"nglIsFramebufferOES", "(I)Z", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglIsFramebufferOES, "glIsFramebufferOES", (void *)&glIsFramebufferOES, false}, + {"nglBindFramebufferOES", "(II)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglBindFramebufferOES, "glBindFramebufferOES", (void *)&glBindFramebufferOES, false}, + {"nglDeleteFramebuffersOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglDeleteFramebuffersOES, "glDeleteFramebuffersOES", (void *)&glDeleteFramebuffersOES, false}, + {"nglGenFramebuffersOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglGenFramebuffersOES, "glGenFramebuffersOES", (void *)&glGenFramebuffersOES, false}, + {"nglCheckFramebufferStatusOES", "(I)I", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglCheckFramebufferStatusOES, "glCheckFramebufferStatusOES", (void *)&glCheckFramebufferStatusOES, false}, + {"nglFramebufferTexture2DOES", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglFramebufferTexture2DOES, "glFramebufferTexture2DOES", (void *)&glFramebufferTexture2DOES, false}, + {"nglFramebufferRenderbufferOES", "(IIII)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglFramebufferRenderbufferOES, "glFramebufferRenderbufferOES", (void *)&glFramebufferRenderbufferOES, false}, + {"nglGetFramebufferAttachmentParameterivOES", "(IIIJ)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglGetFramebufferAttachmentParameterivOES, "glGetFramebufferAttachmentParameterivOES", (void *)&glGetFramebufferAttachmentParameterivOES, false}, + {"nglGenerateMipmapOES", "(I)V", (void *)&Java_org_lwjgl_opengles_OESFramebufferObject_nglGenerateMipmapOES, "glGenerateMipmapOES", (void *)&glGenerateMipmapOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESGetProgramBinary.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESGetProgramBinary.c new file mode 100644 index 0000000..628cb76 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESGetProgramBinary.c @@ -0,0 +1,31 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGetProgramBinaryOESPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, GLvoid * binary); +typedef GL_APICALL void (GL_APIENTRY *glProgramBinaryOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid * binary, GLint length); + +static glGetProgramBinaryOESPROC glGetProgramBinaryOES; +static glProgramBinaryOESPROC glProgramBinaryOES; + +static void JNICALL Java_org_lwjgl_opengles_OESGetProgramBinary_nglGetProgramBinaryOES(JNIEnv *env, jclass clazz, jint program, jint bufSize, jlong length, jlong binaryFormat, jlong binary) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLenum *binaryFormat_address = (GLenum *)(intptr_t)binaryFormat; + GLvoid *binary_address = (GLvoid *)(intptr_t)binary; + glGetProgramBinaryOES(program, bufSize, length_address, binaryFormat_address, binary_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESGetProgramBinary_nglProgramBinaryOES(JNIEnv *env, jclass clazz, jint program, jint binaryFormat, jlong binary, jint length) { + const GLvoid *binary_address = (const GLvoid *)(intptr_t)binary; + glProgramBinaryOES(program, binaryFormat, binary_address, length); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESGetProgramBinary_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetProgramBinaryOES", "(IIJJJ)V", (void *)&Java_org_lwjgl_opengles_OESGetProgramBinary_nglGetProgramBinaryOES, "glGetProgramBinaryOES", (void *)&glGetProgramBinaryOES, false}, + {"nglProgramBinaryOES", "(IIJI)V", (void *)&Java_org_lwjgl_opengles_OESGetProgramBinary_nglProgramBinaryOES, "glProgramBinaryOES", (void *)&glProgramBinaryOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESMapbuffer.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESMapbuffer.c new file mode 100644 index 0000000..174dec9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESMapbuffer.c @@ -0,0 +1,38 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGetBufferPointervOESPROC) (GLenum target, GLenum pname, GLvoid ** pointer); +typedef GL_APICALL GLvoid * (GL_APIENTRY *glMapBufferOESPROC) (GLenum target, GLenum access); +typedef GL_APICALL GLboolean (GL_APIENTRY *glUnmapBufferOESPROC) (GLenum target); + +static glGetBufferPointervOESPROC glGetBufferPointervOES; +static glMapBufferOESPROC glMapBufferOES; +static glUnmapBufferOESPROC glUnmapBufferOES; + +static jobject JNICALL Java_org_lwjgl_opengles_OESMapbuffer_nglGetBufferPointervOES(JNIEnv *env, jclass clazz, jint target, jint pname, jlong result_size, jobject old_buffer) { + GLvoid * __result; + glGetBufferPointervOES(target, pname, &__result); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +static jobject JNICALL Java_org_lwjgl_opengles_OESMapbuffer_nglMapBufferOES(JNIEnv *env, jclass clazz, jint target, jint access, jlong result_size, jobject old_buffer) { + GLvoid * __result = glMapBufferOES(target, access); + return safeNewBufferCached(env, __result, result_size, old_buffer); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_OESMapbuffer_nglUnmapBufferOES(JNIEnv *env, jclass clazz, jint target) { + GLboolean __result = glUnmapBufferOES(target); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESMapbuffer_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetBufferPointervOES", "(IIJLjava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_OESMapbuffer_nglGetBufferPointervOES, "glGetBufferPointervOES", (void *)&glGetBufferPointervOES, false}, + {"nglMapBufferOES", "(IIJLjava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_OESMapbuffer_nglMapBufferOES, "glMapBufferOES", (void *)&glMapBufferOES, false}, + {"nglUnmapBufferOES", "(I)Z", (void *)&Java_org_lwjgl_opengles_OESMapbuffer_nglUnmapBufferOES, "glUnmapBufferOES", (void *)&glUnmapBufferOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESTexture3D.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESTexture3D.c new file mode 100644 index 0000000..409c7d4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESTexture3D.c @@ -0,0 +1,59 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glTexImage3DOESPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glTexSubImage3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels); +typedef GL_APICALL void (GL_APIENTRY *glCopyTexSubImage3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexImage3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glCompressedTexSubImage3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data); +typedef GL_APICALL void (GL_APIENTRY *glFramebufferTexture3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + +static glTexImage3DOESPROC glTexImage3DOES; +static glTexSubImage3DOESPROC glTexSubImage3DOES; +static glCopyTexSubImage3DOESPROC glCopyTexSubImage3DOES; +static glCompressedTexImage3DOESPROC glCompressedTexImage3DOES; +static glCompressedTexSubImage3DOESPROC glCompressedTexSubImage3DOES; +static glFramebufferTexture3DOESPROC glFramebufferTexture3DOES; + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglTexImage3DOES(JNIEnv *env, jclass clazz, jint target, jint level, jint internalFormat, jint width, jint height, jint depth, jint border, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexImage3DOES(target, level, internalFormat, width, height, depth, border, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglTexSubImage3DOES(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong pixels) { + const GLvoid *pixels_address = (const GLvoid *)(intptr_t)pixels; + glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglCopyTexSubImage3DOES(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint x, jint y, jint width, jint height) { + glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglCompressedTexImage3DOES(JNIEnv *env, jclass clazz, jint target, jint level, jint internalformat, jint width, jint height, jint depth, jint border, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglCompressedTexSubImage3DOES(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint imageSize, jlong data) { + const GLvoid *data_address = (const GLvoid *)(intptr_t)data; + glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESTexture3D_nglFramebufferTexture3DOES(JNIEnv *env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint zoffset) { + glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESTexture3D_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglTexImage3DOES", "(IIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglTexImage3DOES, "glTexImage3DOES", (void *)&glTexImage3DOES, false}, + {"nglTexSubImage3DOES", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglTexSubImage3DOES, "glTexSubImage3DOES", (void *)&glTexSubImage3DOES, false}, + {"nglCopyTexSubImage3DOES", "(IIIIIIIII)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglCopyTexSubImage3DOES, "glCopyTexSubImage3DOES", (void *)&glCopyTexSubImage3DOES, false}, + {"nglCompressedTexImage3DOES", "(IIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglCompressedTexImage3DOES, "glCompressedTexImage3DOES", (void *)&glCompressedTexImage3DOES, false}, + {"nglCompressedTexSubImage3DOES", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglCompressedTexSubImage3DOES, "glCompressedTexSubImage3DOES", (void *)&glCompressedTexSubImage3DOES, false}, + {"nglFramebufferTexture3DOES", "(IIIIII)V", (void *)&Java_org_lwjgl_opengles_OESTexture3D_nglFramebufferTexture3DOES, "glFramebufferTexture3DOES", (void *)&glFramebufferTexture3DOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESVertexArrayObject.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESVertexArrayObject.c new file mode 100644 index 0000000..9f69123 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_OESVertexArrayObject.c @@ -0,0 +1,44 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glBindVertexArrayOESPROC) (GLuint array); +typedef GL_APICALL void (GL_APIENTRY *glDeleteVertexArraysOESPROC) (GLsizei n, const GLuint * arrays); +typedef GL_APICALL void (GL_APIENTRY *glGenVertexArraysOESPROC) (GLsizei n, GLuint * arrays); +typedef GL_APICALL GLboolean (GL_APIENTRY *glIsVertexArrayOESPROC) (GLuint array); + +static glBindVertexArrayOESPROC glBindVertexArrayOES; +static glDeleteVertexArraysOESPROC glDeleteVertexArraysOES; +static glGenVertexArraysOESPROC glGenVertexArraysOES; +static glIsVertexArrayOESPROC glIsVertexArrayOES; + +static void JNICALL Java_org_lwjgl_opengles_OESVertexArrayObject_nglBindVertexArrayOES(JNIEnv *env, jclass clazz, jint array) { + glBindVertexArrayOES(array); +} + +static void JNICALL Java_org_lwjgl_opengles_OESVertexArrayObject_nglDeleteVertexArraysOES(JNIEnv *env, jclass clazz, jint n, jlong arrays) { + const GLuint *arrays_address = (const GLuint *)(intptr_t)arrays; + glDeleteVertexArraysOES(n, arrays_address); +} + +static void JNICALL Java_org_lwjgl_opengles_OESVertexArrayObject_nglGenVertexArraysOES(JNIEnv *env, jclass clazz, jint n, jlong arrays) { + GLuint *arrays_address = (GLuint *)(intptr_t)arrays; + glGenVertexArraysOES(n, arrays_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_OESVertexArrayObject_nglIsVertexArrayOES(JNIEnv *env, jclass clazz, jint array) { + GLboolean __result = glIsVertexArrayOES(array); + return __result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESVertexArrayObject_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglBindVertexArrayOES", "(I)V", (void *)&Java_org_lwjgl_opengles_OESVertexArrayObject_nglBindVertexArrayOES, "glBindVertexArrayOES", (void *)&glBindVertexArrayOES, false}, + {"nglDeleteVertexArraysOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESVertexArrayObject_nglDeleteVertexArraysOES, "glDeleteVertexArraysOES", (void *)&glDeleteVertexArraysOES, false}, + {"nglGenVertexArraysOES", "(IJ)V", (void *)&Java_org_lwjgl_opengles_OESVertexArrayObject_nglGenVertexArraysOES, "glGenVertexArraysOES", (void *)&glGenVertexArraysOES, false}, + {"nglIsVertexArrayOES", "(I)Z", (void *)&Java_org_lwjgl_opengles_OESVertexArrayObject_nglIsVertexArrayOES, "glIsVertexArrayOES", (void *)&glIsVertexArrayOES, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMDriverControl.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMDriverControl.c new file mode 100644 index 0000000..89be9b8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMDriverControl.c @@ -0,0 +1,45 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glGetDriverControlsQCOMPROC) (GLint * num, GLsizei size, GLuint * driverControls); +typedef GL_APICALL void (GL_APIENTRY *glGetDriverControlStringQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei * length, GLchar * driverControlString); +typedef GL_APICALL void (GL_APIENTRY *glEnableDriverControlQCOMPROC) (GLuint driverControl); +typedef GL_APICALL void (GL_APIENTRY *glDisableDriverControlQCOMPROC) (GLuint driverControl); + +static glGetDriverControlsQCOMPROC glGetDriverControlsQCOM; +static glGetDriverControlStringQCOMPROC glGetDriverControlStringQCOM; +static glEnableDriverControlQCOMPROC glEnableDriverControlQCOM; +static glDisableDriverControlQCOMPROC glDisableDriverControlQCOM; + +static void JNICALL Java_org_lwjgl_opengles_QCOMDriverControl_nglGetDriverControlsQCOM(JNIEnv *env, jclass clazz, jlong num, jint size, jlong driverControls) { + GLint *num_address = (GLint *)(intptr_t)num; + GLuint *driverControls_address = (GLuint *)(intptr_t)driverControls; + glGetDriverControlsQCOM(num_address, size, driverControls_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMDriverControl_nglGetDriverControlStringQCOM(JNIEnv *env, jclass clazz, jint driverControl, jint bufSize, jlong length, jlong driverControlString) { + GLsizei *length_address = (GLsizei *)(intptr_t)length; + GLchar *driverControlString_address = (GLchar *)(intptr_t)driverControlString; + glGetDriverControlStringQCOM(driverControl, bufSize, length_address, driverControlString_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMDriverControl_nglEnableDriverControlQCOM(JNIEnv *env, jclass clazz, jint driverControl) { + glEnableDriverControlQCOM(driverControl); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMDriverControl_nglDisableDriverControlQCOM(JNIEnv *env, jclass clazz, jint driverControl) { + glDisableDriverControlQCOM(driverControl); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_QCOMDriverControl_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglGetDriverControlsQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMDriverControl_nglGetDriverControlsQCOM, "glGetDriverControlsQCOM", (void *)&glGetDriverControlsQCOM, false}, + {"nglGetDriverControlStringQCOM", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_QCOMDriverControl_nglGetDriverControlStringQCOM, "glGetDriverControlStringQCOM", (void *)&glGetDriverControlStringQCOM, false}, + {"nglEnableDriverControlQCOM", "(I)V", (void *)&Java_org_lwjgl_opengles_QCOMDriverControl_nglEnableDriverControlQCOM, "glEnableDriverControlQCOM", (void *)&glEnableDriverControlQCOM, false}, + {"nglDisableDriverControlQCOM", "(I)V", (void *)&Java_org_lwjgl_opengles_QCOMDriverControl_nglDisableDriverControlQCOM, "glDisableDriverControlQCOM", (void *)&glDisableDriverControlQCOM, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet.c new file mode 100644 index 0000000..c7ebcc1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet.c @@ -0,0 +1,81 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glExtGetTexturesQCOMPROC) (GLuint * textures, GLint maxTextures, GLint * numTextures); +typedef GL_APICALL void (GL_APIENTRY *glExtGetBuffersQCOMPROC) (GLuint * buffers, GLint maxBuffers, GLint * numBuffers); +typedef GL_APICALL void (GL_APIENTRY *glExtGetRenderbuffersQCOMPROC) (GLuint * renderbuffers, GLint maxRenderbuffers, GLint * numRenderbuffers); +typedef GL_APICALL void (GL_APIENTRY *glExtGetFramebuffersQCOMPROC) (GLuint * framebuffers, GLint maxFramebuffers, GLint * numFramebuffers); +typedef GL_APICALL void (GL_APIENTRY *glExtGetTexLevelParameterivQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint * params); +typedef GL_APICALL void (GL_APIENTRY *glExtTexObjectStateOverrideiQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef GL_APICALL void (GL_APIENTRY *glExtGetTexSubImageQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid * texels); +typedef GL_APICALL void (GL_APIENTRY *glExtGetBufferPointervQCOMPROC) (GLenum target, GLvoid ** params); + +static glExtGetTexturesQCOMPROC glExtGetTexturesQCOM; +static glExtGetBuffersQCOMPROC glExtGetBuffersQCOM; +static glExtGetRenderbuffersQCOMPROC glExtGetRenderbuffersQCOM; +static glExtGetFramebuffersQCOMPROC glExtGetFramebuffersQCOM; +static glExtGetTexLevelParameterivQCOMPROC glExtGetTexLevelParameterivQCOM; +static glExtTexObjectStateOverrideiQCOMPROC glExtTexObjectStateOverrideiQCOM; +static glExtGetTexSubImageQCOMPROC glExtGetTexSubImageQCOM; +static glExtGetBufferPointervQCOMPROC glExtGetBufferPointervQCOM; + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexturesQCOM(JNIEnv *env, jclass clazz, jlong textures, jint maxTextures, jlong numTextures) { + GLuint *textures_address = (GLuint *)(intptr_t)textures; + GLint *numTextures_address = (GLint *)(intptr_t)numTextures; + glExtGetTexturesQCOM(textures_address, maxTextures, numTextures_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetBuffersQCOM(JNIEnv *env, jclass clazz, jlong buffers, jint maxBuffers, jlong numBuffers) { + GLuint *buffers_address = (GLuint *)(intptr_t)buffers; + GLint *numBuffers_address = (GLint *)(intptr_t)numBuffers; + glExtGetBuffersQCOM(buffers_address, maxBuffers, numBuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetRenderbuffersQCOM(JNIEnv *env, jclass clazz, jlong renderbuffers, jint maxRenderbuffers, jlong numRenderbuffers) { + GLuint *renderbuffers_address = (GLuint *)(intptr_t)renderbuffers; + GLint *numRenderbuffers_address = (GLint *)(intptr_t)numRenderbuffers; + glExtGetRenderbuffersQCOM(renderbuffers_address, maxRenderbuffers, numRenderbuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetFramebuffersQCOM(JNIEnv *env, jclass clazz, jlong framebuffers, jint maxFramebuffers, jlong numFramebuffers) { + GLuint *framebuffers_address = (GLuint *)(intptr_t)framebuffers; + GLint *numFramebuffers_address = (GLint *)(intptr_t)numFramebuffers; + glExtGetFramebuffersQCOM(framebuffers_address, maxFramebuffers, numFramebuffers_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexLevelParameterivQCOM(JNIEnv *env, jclass clazz, jint texture, jint face, jint level, jint pname, jlong params) { + GLint *params_address = (GLint *)(intptr_t)params; + glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtTexObjectStateOverrideiQCOM(JNIEnv *env, jclass clazz, jint target, jint pname, jint param) { + glExtTexObjectStateOverrideiQCOM(target, pname, param); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexSubImageQCOM(JNIEnv *env, jclass clazz, jint target, jint level, jint xoffset, jint yoffset, jint zoffset, jint width, jint height, jint depth, jint format, jint type, jlong texels) { + GLvoid *texels_address = (GLvoid *)(intptr_t)texels; + glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels_address); +} + +static jobject JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetBufferPointervQCOM(JNIEnv *env, jclass clazz, jint target, jlong result_size) { + GLvoid * __result; + glExtGetBufferPointervQCOM(target, &__result); + return safeNewBuffer(env, __result, result_size); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglExtGetTexturesQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexturesQCOM, "glExtGetTexturesQCOM", (void *)&glExtGetTexturesQCOM, false}, + {"nglExtGetBuffersQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetBuffersQCOM, "glExtGetBuffersQCOM", (void *)&glExtGetBuffersQCOM, false}, + {"nglExtGetRenderbuffersQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetRenderbuffersQCOM, "glExtGetRenderbuffersQCOM", (void *)&glExtGetRenderbuffersQCOM, false}, + {"nglExtGetFramebuffersQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetFramebuffersQCOM, "glExtGetFramebuffersQCOM", (void *)&glExtGetFramebuffersQCOM, false}, + {"nglExtGetTexLevelParameterivQCOM", "(IIIIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexLevelParameterivQCOM, "glExtGetTexLevelParameterivQCOM", (void *)&glExtGetTexLevelParameterivQCOM, false}, + {"nglExtTexObjectStateOverrideiQCOM", "(III)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtTexObjectStateOverrideiQCOM, "glExtTexObjectStateOverrideiQCOM", (void *)&glExtTexObjectStateOverrideiQCOM, false}, + {"nglExtGetTexSubImageQCOM", "(IIIIIIIIIIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetTexSubImageQCOM, "glExtGetTexSubImageQCOM", (void *)&glExtGetTexSubImageQCOM, false}, + {"nglExtGetBufferPointervQCOM", "(IJ)Ljava/nio/ByteBuffer;", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet_nglExtGetBufferPointervQCOM, "glExtGetBufferPointervQCOM", (void *)&glExtGetBufferPointervQCOM, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet2.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet2.c new file mode 100644 index 0000000..cce4dd9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMExtendedGet2.c @@ -0,0 +1,48 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glExtGetShadersQCOMPROC) (GLuint * shaders, GLint maxShaders, GLint * numShaders); +typedef GL_APICALL void (GL_APIENTRY *glExtGetProgramsQCOMPROC) (GLuint * programs, GLint maxPrograms, GLint * numPrograms); +typedef GL_APICALL GLboolean (GL_APIENTRY *glExtIsProgramBinaryQCOMPROC) (GLuint program); +typedef GL_APICALL void (GL_APIENTRY *glExtGetProgramBinarySourceQCOMPROC) (GLuint program, GLenum shadertype, GLchar * source, GLint * length); + +static glExtGetShadersQCOMPROC glExtGetShadersQCOM; +static glExtGetProgramsQCOMPROC glExtGetProgramsQCOM; +static glExtIsProgramBinaryQCOMPROC glExtIsProgramBinaryQCOM; +static glExtGetProgramBinarySourceQCOMPROC glExtGetProgramBinarySourceQCOM; + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetShadersQCOM(JNIEnv *env, jclass clazz, jlong shaders, jint maxShaders, jlong numShaders) { + GLuint *shaders_address = (GLuint *)(intptr_t)shaders; + GLint *numShaders_address = (GLint *)(intptr_t)numShaders; + glExtGetShadersQCOM(shaders_address, maxShaders, numShaders_address); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetProgramsQCOM(JNIEnv *env, jclass clazz, jlong programs, jint maxPrograms, jlong numPrograms) { + GLuint *programs_address = (GLuint *)(intptr_t)programs; + GLint *numPrograms_address = (GLint *)(intptr_t)numPrograms; + glExtGetProgramsQCOM(programs_address, maxPrograms, numPrograms_address); +} + +static jboolean JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtIsProgramBinaryQCOM(JNIEnv *env, jclass clazz, jint program) { + GLboolean __result = glExtIsProgramBinaryQCOM(program); + return __result; +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetProgramBinarySourceQCOM(JNIEnv *env, jclass clazz, jint program, jint shadertype, jlong source, jlong length) { + GLchar *source_address = (GLchar *)(intptr_t)source; + GLint *length_address = (GLint *)(intptr_t)length; + glExtGetProgramBinarySourceQCOM(program, shadertype, source_address, length_address); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_QCOMExtendedGet2_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglExtGetShadersQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetShadersQCOM, "glExtGetShadersQCOM", (void *)&glExtGetShadersQCOM, false}, + {"nglExtGetProgramsQCOM", "(JIJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetProgramsQCOM, "glExtGetProgramsQCOM", (void *)&glExtGetProgramsQCOM, false}, + {"nglExtIsProgramBinaryQCOM", "(I)Z", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtIsProgramBinaryQCOM, "glExtIsProgramBinaryQCOM", (void *)&glExtIsProgramBinaryQCOM, false}, + {"nglExtGetProgramBinarySourceQCOM", "(IIJJ)V", (void *)&Java_org_lwjgl_opengles_QCOMExtendedGet2_nglExtGetProgramBinarySourceQCOM, "glExtGetProgramBinarySourceQCOM", (void *)&glExtGetProgramBinarySourceQCOM, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMTiledRendering.c b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMTiledRendering.c new file mode 100644 index 0000000..6c59096 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/generated/opengles/org_lwjgl_opengles_QCOMTiledRendering.c @@ -0,0 +1,27 @@ +/* MACHINE GENERATED FILE, DO NOT EDIT */ + +#include <jni.h> +#include "extgl.h" + +typedef GL_APICALL void (GL_APIENTRY *glStartTilingQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef GL_APICALL void (GL_APIENTRY *glEndTilingQCOMPROC) (GLbitfield preserveMask); + +static glStartTilingQCOMPROC glStartTilingQCOM; +static glEndTilingQCOMPROC glEndTilingQCOM; + +static void JNICALL Java_org_lwjgl_opengles_QCOMTiledRendering_nglStartTilingQCOM(JNIEnv *env, jclass clazz, jint x, jint y, jint width, jint height, jint preserveMask) { + glStartTilingQCOM(x, y, width, height, preserveMask); +} + +static void JNICALL Java_org_lwjgl_opengles_QCOMTiledRendering_nglEndTilingQCOM(JNIEnv *env, jclass clazz, jint preserveMask) { + glEndTilingQCOM(preserveMask); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengles_QCOMTiledRendering_initNativeStubs(JNIEnv *env, jclass clazz) { + JavaMethodAndExtFunction functions[] = { + {"nglStartTilingQCOM", "(IIIII)V", (void *)&Java_org_lwjgl_opengles_QCOMTiledRendering_nglStartTilingQCOM, "glStartTilingQCOM", (void *)&glStartTilingQCOM, false}, + {"nglEndTilingQCOM", "(I)V", (void *)&Java_org_lwjgl_opengles_QCOMTiledRendering_nglEndTilingQCOM, "glEndTilingQCOM", (void *)&glEndTilingQCOM, false} + }; + int num_functions = NUMFUNCTIONS(functions); + extgl_InitializeClass(env, clazz, num_functions, functions); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/linux_al.c b/etc/lwjgl-2.9.1/src/native/linux/linux_al.c new file mode 100644 index 0000000..1d915e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/linux_al.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "org_lwjgl_openal_AL.h" +#include "extal.h" +#include "common_tools.h" + +#include <dlfcn.h> + +static void* handleOAL; + +void *extal_NativeGetFunctionPointer(const char *function) { + return dlsym(handleOAL, function); +} + +void extal_LoadLibrary(JNIEnv *env, jstring path) { + char *path_str = GetStringNativeChars(env, path); + printfDebugJava(env, "Testing '%s'", path_str); + handleOAL = dlopen(path_str, RTLD_LAZY); + if (handleOAL != NULL) { + printfDebugJava(env, "Found OpenAL at '%s'", path_str); + } else { + throwException(env, "Could not load OpenAL library"); + } + free(path_str); +} + +void extal_UnloadLibrary() { + if (handleOAL != NULL) { + dlclose(handleOAL); + handleOAL = NULL; + } +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/linux_cl.c b/etc/lwjgl-2.9.1/src/native/linux/linux_cl.c new file mode 100644 index 0000000..3fbd194 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/linux_cl.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "extcl.h" +#include "common_tools.h" + +#include <dlfcn.h> + +static void* handleOCL; + +void *extcl_NativeGetFunctionPointer(const char *function) { + return dlsym(handleOCL, function); +} + +void extcl_LoadLibrary(JNIEnv *env, jstring path) { + char *path_str = GetStringNativeChars(env, path); + printfDebugJava(env, "Testing '%s'", path_str); + handleOCL = dlopen(path_str, RTLD_LAZY); + if (handleOCL != NULL) { + printfDebugJava(env, "Found OpenCL at '%s'", path_str); + } else { + throwException(env, "Could not load OpenCL library"); + } + free(path_str); +} + +void extcl_UnloadLibrary() { + if (handleOCL != NULL) { + dlclose(handleOCL); + handleOCL = NULL; + } +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/lwjgl.map b/etc/lwjgl-2.9.1/src/native/linux/lwjgl.map new file mode 100644 index 0000000..939db7b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/lwjgl.map @@ -0,0 +1,7 @@ +{ + global: + Java_*; + JNI_OnLoad; + JNI_OnUnload; + local: *; +}; diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.c new file mode 100644 index 0000000..c0073d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * GLX extension implementations. + * + * @author Spasi + */ +#include "GLX.h" + +/* NV_present_video functions */ + +typedef struct { + GLXExtensions extension_flags; + GLXContext context; +} X11Context; + +jint extgl_EnumerateVideoDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + jlong *devices_address = ((jlong *)safeGetBufferAddress(env, devices)) + devices_position; + unsigned int *result; + int i, elements; + + result = lwjgl_glXEnumerateVideoDevicesNV(peer_info->display, peer_info->screen, &elements); + if ( devices_address != NULL ) { + for ( i = 0; i < elements; i++ ) + devices_address[i] = (jlong)result[i]; + } + XFree(result); + + return elements; +} + +jboolean extgl_BindVideoDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + const int *attrib_list_address = ((const int *)safeGetBufferAddress(env, attrib_list)) + attrib_list_position; + + return lwjgl_glXBindVideoDeviceNV(peer_info->display, video_slot, (unsigned int)video_device, attrib_list_address); +} + +jboolean extgl_QueryContextNV(JNIEnv *env, jobject peer_info_handle, jobject context_handle, jint attrib, jobject value, jint value_position) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + int *value_address = ((int *)(*env)->GetDirectBufferAddress(env, value)) + value_position; + + return lwjgl_glXQueryContext(peer_info->display, context_info->context, attrib, value_address) == GLX_BAD_ATTRIBUTE ? 0 : 1; +} + +/* NV_video_capture functions */ + +jboolean extgl_BindVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong device) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + + return lwjgl_glXBindVideoCaptureDeviceNV(peer_info->display, video_slot, (GLXVideoCaptureDeviceNV)device); +} + +jint extgl_EnumerateVideoCaptureDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + jlong *devices_address = ((jlong *)safeGetBufferAddress(env, devices)) + devices_position; + GLXVideoCaptureDeviceNV *result; + int i, elements; + + result = lwjgl_glXEnumerateVideoCaptureDevicesNV(peer_info->display, peer_info->screen, &elements); + if ( devices_address != NULL ) { + for ( i = 0; i < elements; i++ ) + devices_address[i] = (jlong)result[i]; + } + XFree(devices); + + return elements; +} + +jboolean extgl_LockVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + + lwjgl_glXLockVideoCaptureDeviceNV(peer_info->display, (GLXVideoCaptureDeviceNV)device); + return true; +} + +jboolean extgl_QueryVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device, jint attribute, jobject value, jint value_position) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + int *value_address = ((int *)(*env)->GetDirectBufferAddress(env, value)) + value_position; + + return lwjgl_glXQueryVideoCaptureDeviceNV(peer_info->display, (GLXVideoCaptureDeviceNV)device, attribute, value_address); +} + +jboolean extgl_ReleaseVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + + lwjgl_glXReleaseVideoCaptureDeviceNV(peer_info->display, (GLXVideoCaptureDeviceNV)device); + return true; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.h new file mode 100644 index 0000000..1a6b8fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/GLX.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * GLX extension implementations. + * + * @author Spasi + */ +#ifndef __LWJGL_GLX_H +#define __LWJGL_GLX_H + +#include <jni.h> +#include "common_tools.h" +#include "context.h" + +#include "extgl.h" +#include "extgl_glx.h" + +/* NV_present_video functions */ +extern jint extgl_EnumerateVideoDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); +extern jboolean extgl_BindVideoDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position); +extern jboolean extgl_QueryContextNV(JNIEnv *env, jobject peer_info_handle, jobject context_handle, jint attrib, jobject value, jint value_position); + +/* NV_video_capture functions */ +extern jboolean extgl_BindVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong device); +extern jint extgl_EnumerateVideoCaptureDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); +extern jboolean extgl_LockVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); +extern jboolean extgl_QueryVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device, jint attribute, jobject value, jint value_position); +extern jboolean extgl_ReleaseVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/context.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/context.c new file mode 100644 index 0000000..4b851f6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/context.c @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Include file to access public window features + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "extgl_glx.h" +#include "context.h" + +XVisualInfo *getVisualInfoFromPeerInfo(JNIEnv *env, X11PeerInfo *peer_info) { + XVisualInfo *vis_info; + if (!peer_info->glx13) { + XVisualInfo template; + template.visualid = peer_info->config.glx_config.visualid; + template.depth = peer_info->config.glx_config.depth; + template.screen = peer_info->screen; + int num_infos; + vis_info = XGetVisualInfo(peer_info->display, VisualIDMask | VisualScreenMask | VisualDepthMask, &template, &num_infos); + if (vis_info == NULL) { + throwException(env, "Could not find VisualInfo from peer info"); + return NULL; + } + // Check the assumption from GLX 1.3 docs that a VisualInfo is uniquely identified by its + // {VisualID, screen, depth} tuple + if (num_infos != 1) { + XFree(vis_info); + throwException(env, "No unique VisualInfo matches peer info"); + return NULL; + } + } else { + GLXFBConfig *configs = getFBConfigFromPeerInfo(env, peer_info); + if (configs == NULL) + return NULL; + vis_info = lwjgl_glXGetVisualFromFBConfig(peer_info->display, configs[0]); + if (vis_info == NULL) + throwException(env, "Could not get VisualInfo from GLX 1.3 config"); + XFree(configs); + } + return vis_info; +} + +GLXFBConfig *getFBConfigFromPeerInfo(JNIEnv *env, X11PeerInfo *peer_info) { + int attribs[] = {GLX_FBCONFIG_ID, peer_info->config.glx13_config.config_id, None, None}; + int num_elements; + GLXFBConfig *configs = lwjgl_glXChooseFBConfig(peer_info->display, peer_info->screen, attribs, &num_elements); + if (configs == NULL) { + throwException(env, "Could not find GLX 1.3 config from peer info"); + return NULL; + } + // Check that only one FBConfig matches the config id + if (num_elements != 1) { + XFree(configs); + throwException(env, "No unique GLX 1.3 config matches peer info"); + return NULL; + } + return configs; +} + +static int convertToBPE(int bpp) { + int bpe; + switch (bpp) { + case 0: + bpe = 0; + break; + case 32: + case 24: + bpe = 8; + break; + case 16: /* Fall through */ + default: + bpe = 4; + break; + } + return bpe; +} + +static GLXFBConfig *chooseVisualGLX13FromBPP(JNIEnv *env, Display *disp, int screen, jobject pixel_format, int bpp, int drawable_type, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + + bool stereo = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + bool floating_point = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + bool floating_point_packed = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + + int bpe = convertToBPE(bpp); + int accum_bpe = convertToBPE(accum_bpp); + attrib_list_t attrib_list; + initAttribList(&attrib_list); + int render_type; + + if ( floating_point ) + render_type = GLX_RGBA_FLOAT_BIT; + else if ( floating_point_packed ) + render_type = GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT; + else + render_type = GLX_RGBA_BIT; + + putAttrib(&attrib_list, GLX_RENDER_TYPE); putAttrib(&attrib_list, render_type); + putAttrib(&attrib_list, GLX_DOUBLEBUFFER); putAttrib(&attrib_list, double_buffer ? True : False); + putAttrib(&attrib_list, GLX_DRAWABLE_TYPE); putAttrib(&attrib_list, drawable_type); + putAttrib(&attrib_list, GLX_DEPTH_SIZE); putAttrib(&attrib_list, depth); + putAttrib(&attrib_list, GLX_RED_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_GREEN_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_BLUE_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_ALPHA_SIZE); putAttrib(&attrib_list, alpha); + putAttrib(&attrib_list, GLX_STENCIL_SIZE); putAttrib(&attrib_list, stencil); + putAttrib(&attrib_list, GLX_AUX_BUFFERS); putAttrib(&attrib_list, num_aux_buffers); + putAttrib(&attrib_list, GLX_ACCUM_RED_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_GREEN_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_BLUE_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_ALPHA_SIZE); putAttrib(&attrib_list, accum_alpha); + if (stereo) { + putAttrib(&attrib_list, GLX_STEREO); putAttrib(&attrib_list, True); + } + // Assume the caller has checked support for multisample + if (samples > 0) { + putAttrib(&attrib_list, GLX_SAMPLE_BUFFERS_ARB); putAttrib(&attrib_list, 1); + putAttrib(&attrib_list, GLX_SAMPLES_ARB); putAttrib(&attrib_list, samples); // GLX_COVERAGE_SAMPLES_NV if colorSamples > 0 + if ( colorSamples > 0 ) { + putAttrib(&attrib_list, GLX_COLOR_SAMPLES_NV); putAttrib(&attrib_list, colorSamples); + } + } + if (sRGB) { + putAttrib(&attrib_list, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB); putAttrib(&attrib_list, True); + } + putAttrib(&attrib_list, None); putAttrib(&attrib_list, None); + int num_formats = 0; + GLXFBConfig* configs = lwjgl_glXChooseFBConfig(disp, screen, attrib_list.attribs, &num_formats); + if (num_formats > 0) { + return configs; + } else { + if (configs != NULL) + XFree(configs); + return NULL; + } +} + +GLXFBConfig *chooseVisualGLX13(JNIEnv *env, Display *disp, int screen, jobject pixel_format, bool use_display_bpp, int drawable_type, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int bpp; + if (use_display_bpp) { + bpp = XDefaultDepthOfScreen(XScreenOfDisplay(disp, screen)); + GLXFBConfig *configs = chooseVisualGLX13FromBPP(env, disp, screen, pixel_format, bpp, drawable_type, double_buffer); + if (configs != NULL) + return configs; + else + bpp = 16; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return chooseVisualGLX13FromBPP(env, disp, screen, pixel_format, bpp, drawable_type, double_buffer); +} + +static XVisualInfo *chooseVisualGLXFromBPP(JNIEnv *env, Display *disp, int screen, jobject pixel_format, int bpp, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + + bool stereo = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + + int bpe = convertToBPE(bpp); + int accum_bpe = convertToBPE(accum_bpp); + attrib_list_t attrib_list; + initAttribList(&attrib_list); + putAttrib(&attrib_list, GLX_RGBA); + putAttrib(&attrib_list, GLX_DOUBLEBUFFER); + putAttrib(&attrib_list, GLX_DEPTH_SIZE); putAttrib(&attrib_list, depth); + putAttrib(&attrib_list, GLX_RED_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_GREEN_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_BLUE_SIZE); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, GLX_ALPHA_SIZE); putAttrib(&attrib_list, alpha); + putAttrib(&attrib_list, GLX_STENCIL_SIZE); putAttrib(&attrib_list, stencil); + putAttrib(&attrib_list, GLX_AUX_BUFFERS); putAttrib(&attrib_list, num_aux_buffers); + putAttrib(&attrib_list, GLX_ACCUM_RED_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_GREEN_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_BLUE_SIZE); putAttrib(&attrib_list, accum_bpe); + putAttrib(&attrib_list, GLX_ACCUM_ALPHA_SIZE); putAttrib(&attrib_list, accum_alpha); + if (stereo) + putAttrib(&attrib_list, GLX_STEREO); + // Assume the caller has checked support for multisample + if (samples > 0) { + putAttrib(&attrib_list, GLX_SAMPLE_BUFFERS_ARB); putAttrib(&attrib_list, 1); + putAttrib(&attrib_list, GLX_SAMPLES_ARB); putAttrib(&attrib_list, samples); // GLX_COVERAGE_SAMPLES_NV if colorSamples > 0 + if ( colorSamples > 0 ) + putAttrib(&attrib_list, GLX_COLOR_SAMPLES_NV); putAttrib(&attrib_list, colorSamples); + } + if (sRGB) + putAttrib(&attrib_list, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB); + putAttrib(&attrib_list, None); + return lwjgl_glXChooseVisual(disp, screen, attrib_list.attribs); +} + +XVisualInfo *chooseVisualGLX(JNIEnv *env, Display *disp, int screen, jobject pixel_format, bool use_display_bpp, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int bpp; + if (use_display_bpp) { + bpp = XDefaultDepthOfScreen(XScreenOfDisplay(disp, screen)); + XVisualInfo *vis_info = chooseVisualGLXFromBPP(env, disp, screen, pixel_format, bpp, double_buffer); + if (vis_info != NULL) + return vis_info; + else + bpp = 16; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return chooseVisualGLXFromBPP(env, disp, screen, pixel_format, bpp, double_buffer); +} + +static void dumpVisualInfo(JNIEnv *env, Display *display, GLXExtensions *extension_flags, XVisualInfo *vis_info) { + int alpha, depth, stencil, r, g, b; + int sample_buffers = 0; + int samples = 0; + lwjgl_glXGetConfig(display, vis_info, GLX_RED_SIZE, &r); + lwjgl_glXGetConfig(display, vis_info, GLX_GREEN_SIZE, &g); + lwjgl_glXGetConfig(display, vis_info, GLX_BLUE_SIZE, &b); + lwjgl_glXGetConfig(display, vis_info, GLX_ALPHA_SIZE, &alpha); + lwjgl_glXGetConfig(display, vis_info, GLX_DEPTH_SIZE, &depth); + lwjgl_glXGetConfig(display, vis_info, GLX_STENCIL_SIZE, &stencil); + if (extension_flags->GLX_ARB_multisample) { + lwjgl_glXGetConfig(display, vis_info, GLX_SAMPLE_BUFFERS_ARB, &sample_buffers); + lwjgl_glXGetConfig(display, vis_info, GLX_SAMPLES_ARB, &samples); + } + printfDebugJava(env, "Pixel format info: r = %d, g = %d, b = %d, a = %d, depth = %d, stencil = %d, sample buffers = %d, samples = %d", r, g, b, alpha, depth, stencil, sample_buffers, samples); +} + +bool initPeerInfo(JNIEnv *env, jobject peer_info_handle, Display *display, int screen, jobject pixel_format, bool use_display_bpp, int drawable_type, bool double_buffered, bool force_glx13) { + if ((*env)->GetDirectBufferCapacity(env, peer_info_handle) < sizeof(X11PeerInfo)) { + throwException(env, "Handle too small"); + return false; + } + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + GLXExtensions extension_flags; + if (!extgl_InitGLX(display, screen, &extension_flags)) { + throwException(env, "Could not init GLX"); + return false; + } + if (!extension_flags.GLX13 && force_glx13) { + throwException(env, "GLX13 is required, but is not available"); + return false; + } + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + if (samples > 0 && !extension_flags.GLX_ARB_multisample) { + throwException(env, "Samples > 0 specified but there's no support for GLX_ARB_multisample"); + return false; + } + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + if (colorSamples > 0 && !extension_flags.GLX_NV_multisample_coverage) { + throwException(env, "Color samples > 0 specified but there's no support for GLX_NV_multisample_coverage"); + return false; + } + bool floating_point = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + if (floating_point && !(extension_flags.GLX13 && extension_flags.GLX_ARB_fbconfig_float)) { // We need GLX13 to support floating point + throwException(env, "Floating point specified but there's no support for GLX_ARB_fbconfig_float"); + return false; + } + bool floating_point_packed = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + if (floating_point_packed && !(extension_flags.GLX13 && extension_flags.GLX_EXT_fbconfig_packed_float)) { // We need GLX13 to support packed floating point + throwException(env, "Packed floating point specified but there's no support for GLX_EXT_fbconfig_packed_float"); + return false; + } + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + if (sRGB && !extension_flags.GLX_ARB_framebuffer_sRGB) { + throwException(env, "sRGB specified but there's no support for GLX_ARB_framebuffer_sRGB"); + return false; + } + + peer_info->glx13 = extension_flags.GLX13; + if (peer_info->glx13) { + GLXFBConfig *configs = chooseVisualGLX13(env, display, screen, pixel_format, use_display_bpp, drawable_type, double_buffered); + if (configs == NULL) { + throwException(env, "Could not choose GLX13 config"); + return false; + } + if (isDebugEnabled()) { + XVisualInfo *vis_info = lwjgl_glXGetVisualFromFBConfig(display, configs[0]); + if (vis_info != NULL) { + dumpVisualInfo(env, display, &extension_flags, vis_info); + XFree(vis_info); + } + } + int config_id; + int result = lwjgl_glXGetFBConfigAttrib(display, configs[0], GLX_FBCONFIG_ID, &config_id); + XFree(configs); + if (result != Success) { + throwException(env, "Could not get GLX_FBCONFIG_ID from GLXFBConfig"); + return false; + } + peer_info->config.glx13_config.config_id = config_id; + } else { + XVisualInfo *vis_info = chooseVisualGLX(env, display, screen, pixel_format, use_display_bpp, double_buffered); + if (vis_info == NULL) { + throwException(env, "Could not choose visual"); + return false; + } + peer_info->config.glx_config.visualid = vis_info->visualid; + peer_info->config.glx_config.depth = vis_info->depth; + peer_info->screen = vis_info->screen; + if (isDebugEnabled()) + dumpVisualInfo(env, display, &extension_flags, vis_info); + XFree(vis_info); + } + peer_info->display = display; + peer_info->screen = screen; + peer_info->drawable = None; + return true; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/context.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/context.h new file mode 100644 index 0000000..ea4c414 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/context.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Include file to access public window features + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#ifndef _LWJGL_CONTEXT_H_INCLUDED_ +#define _LWJGL_CONTEXT_H_INCLUDED_ + +#include <jni.h> +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "extgl_glx.h" + +typedef struct { + VisualID visualid; + int depth; +} GLXConfig; + +typedef struct { + GLXFBConfigID config_id; +} GLX13Config; + +typedef struct { + Display *display; + int screen; + GLXDrawable drawable; + // This flag determines the appropriate glx struct + bool glx13; + union { + GLXConfig glx_config; + GLX13Config glx13_config; + } config; +} X11PeerInfo; + +/* GLX 1.3 chooser */ +extern GLXFBConfig *chooseVisualGLX13(JNIEnv *env, Display *disp, int screen, jobject pixel_format, bool use_display_bpp, int drawable_type, bool double_buffer); + +/* Default GLX chooser*/ +extern XVisualInfo *chooseVisualGLX(JNIEnv *env, Display *disp, int screen, jobject pixel_format, bool use_display_bpp, bool double_buffer); + +extern XVisualInfo *getVisualInfoFromPeerInfo(JNIEnv *env, X11PeerInfo *peer_info); +extern GLXFBConfig *getFBConfigFromPeerInfo(JNIEnv *env, X11PeerInfo *peer_info); + +extern bool initPeerInfo(JNIEnv *env, jobject peer_info_handle, Display *display, int screen, jobject pixel_format, bool use_display_bpp, int drawable_type, bool double_buffered, bool force_glx13); + +#endif /* _LWJGL_CONTEXT_H_INCLUDED_ */ diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/display.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/display.c new file mode 100644 index 0000000..dbd0693 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/display.c @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Linux specific library for display handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/extensions/xf86vmode.h> +#include <X11/extensions/Xrandr.h> +#include <X11/Xutil.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_LinuxDisplay.h" + +#define NUM_XRANDR_RETRIES 5 + +typedef struct { + int width; + int height; + int freq; + union { + int size_index; // Data for Xrandr extension + XF86VidModeModeInfo xf86vm_modeinfo; // Data for XF86VidMode extension + } mode_data; +} mode_info; + +static bool getXF86VidModeVersion(JNIEnv *env, Display *disp, int *major, int *minor) { + int event_base, error_base; + + if (!XF86VidModeQueryExtension(disp, &event_base, &error_base)) { + printfDebugJava(env, "XF86VidMode extension not available"); + return false; + } + if (!XF86VidModeQueryVersion(disp, major, minor)) { + throwException(env, "Could not query XF86VidMode version"); + return false; + } + printfDebugJava(env, "XF86VidMode extension version %i.%i", *major, *minor); + return true; +} + +static bool getXrandrVersion(JNIEnv *env, Display *disp, int *major, int *minor) { + int event_base, error_base; + + if (!XRRQueryExtension(disp, &event_base, &error_base)) { + printfDebugJava(env, "Xrandr extension not available"); + return false; + } + if (!XRRQueryVersion(disp, major, minor)) { + throwException(env, "Could not query Xrandr version"); + return false; + } + printfDebugJava(env, "Xrandr extension version %i.%i", *major, *minor); + return true; +} + +static bool isXrandrSupported(JNIEnv *env, Display *disp) { + int major, minor; + if (!getXrandrVersion(env, disp, &major, &minor)) + return false; + return major >= 1; +} + +static bool isXF86VidModeSupported(JNIEnv *env, Display *disp) { + int minor_ver, major_ver; + if (!getXF86VidModeVersion(env, disp, &major_ver, &minor_ver)) + return false; + return major_ver >= 2; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXrandrSupported(JNIEnv *env, jclass unused, jlong display) { + Display *disp = (Display *)(intptr_t)display; + jboolean result = isXrandrSupported(env, disp) ? JNI_TRUE : JNI_FALSE; + return result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXF86VidModeSupported(JNIEnv *env, jclass unused, jlong display) { + Display *disp = (Display *)(intptr_t)display; + jboolean result = isXF86VidModeSupported(env, disp) ? JNI_TRUE : JNI_FALSE; + return result; +} + +static mode_info *getXrandrDisplayModes(Display *disp, int screen, int *num_modes) { + int num_randr_sizes; + XRRScreenSize *sizes = XRRSizes(disp, screen, &num_randr_sizes); + mode_info *avail_modes = NULL; + int list_size = 0; + /* Count number of modes */ + int i; + int mode_index = 0; + for (i = 0; i < num_randr_sizes; i++) { + int num_randr_rates; + short *freqs = XRRRates(disp, screen, i, &num_randr_rates); + int j; + for (j = 0; j < num_randr_rates; j++) { + if (list_size <= mode_index) { + list_size += 1; + avail_modes = (mode_info *)realloc(avail_modes, sizeof(mode_info)*list_size); + if (avail_modes == NULL) + return NULL; + } + avail_modes[mode_index].width = sizes[i].width; + avail_modes[mode_index].height = sizes[i].height; + avail_modes[mode_index].freq = freqs[j]; + avail_modes[mode_index].mode_data.size_index = i; + mode_index++; + } + } + *num_modes = mode_index; + return avail_modes; +} + +static mode_info *getXF86VidModeDisplayModes(Display *disp, int screen, int *num_modes) { + int num_xf86vm_modes; + XF86VidModeModeInfo **avail_xf86vm_modes; + XF86VidModeGetAllModeLines(disp, screen, &num_xf86vm_modes, &avail_xf86vm_modes); + mode_info *avail_modes = (mode_info *)malloc(sizeof(mode_info)*num_xf86vm_modes); + if (avail_modes == NULL) { + XFree(avail_xf86vm_modes); + return NULL; + } + int i; + for (i = 0; i < num_xf86vm_modes; i++) { + avail_modes[i].width = avail_xf86vm_modes[i]->hdisplay; + avail_modes[i].height = avail_xf86vm_modes[i]->vdisplay; + avail_modes[i].freq = 0; // No frequency support in XF86VidMode + avail_modes[i].mode_data.xf86vm_modeinfo = *avail_xf86vm_modes[i]; + } + XFree(avail_xf86vm_modes); + *num_modes = num_xf86vm_modes; + return avail_modes; +} + +static mode_info *getDisplayModes(Display *disp, int screen, jint extension, int *num_modes) { + switch (extension) { + case org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE: + return getXF86VidModeDisplayModes(disp, screen, num_modes); + case org_lwjgl_opengl_LinuxDisplay_XRANDR: + return getXrandrDisplayModes(disp, screen, num_modes); + case org_lwjgl_opengl_LinuxDisplay_NONE: + // fall through + default: + return NULL; + } +} + +static bool setXF86VidModeMode(Display *disp, int screen, mode_info *mode) { + return True == XF86VidModeSwitchToMode(disp, screen, &mode->mode_data.xf86vm_modeinfo); +} + +/* Try to set the mode specified through XRandR. + * Return value is the Status code of the mode switch + * The timestamp parameter is filled with the latest timestamp returned from XRRConfigTimes + */ +static Status trySetXrandrMode(Display *disp, int screen, mode_info *mode, Time *timestamp) { + Status status; + Drawable root_window = RootWindow(disp, screen); + XRRScreenConfiguration *screen_configuration = XRRGetScreenInfo(disp, root_window); + Time config_time; + *timestamp = XRRConfigTimes(screen_configuration, &config_time); + Rotation current_rotation; + XRRConfigCurrentConfiguration(screen_configuration, &current_rotation); + status = XRRSetScreenConfigAndRate(disp, screen_configuration, root_window, mode->mode_data.size_index, current_rotation, mode->freq, *timestamp); + XRRFreeScreenConfigInfo(screen_configuration); + return status; +} + +static bool setXrandrMode(Display *disp, int screen, mode_info *mode) { + int iteration; + Time timestamp; + Status status = trySetXrandrMode(disp, screen, mode, &timestamp); + if (status == 0) + return true; // Success + Time new_timestamp; + for (iteration = 0; iteration < NUM_XRANDR_RETRIES; iteration++) { + status = trySetXrandrMode(disp, screen, mode, &new_timestamp); + if (status == 0) + return true; // Success + if (new_timestamp == timestamp) { + return false; // Failure, and the stamps are equal meaning that the failure is not merely transient + } + timestamp = new_timestamp; + } + return false; +} + +static bool setMode(JNIEnv *env, Display *disp, int screen, jint extension, int width, int height, int freq) { + int num_modes, i; + mode_info *avail_modes = getDisplayModes(disp, screen, extension, &num_modes); + if (avail_modes == NULL) { + printfDebugJava(env, "Could not get display modes"); + return false; + } + bool result = false; + for (i = 0; i < num_modes; ++i) { + printfDebugJava(env, "Mode %d: %dx%d @%d", i, avail_modes[i].width, avail_modes[i].height, avail_modes[i].freq); + if (avail_modes[i].width == width && avail_modes[i].height == height && avail_modes[i].freq == freq) { + switch (extension) { + case org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE: + if (!setXF86VidModeMode(disp, screen, &avail_modes[i])) { + printfDebugJava(env, "Could not switch mode"); + continue; + } + break; + case org_lwjgl_opengl_LinuxDisplay_XRANDR: + if (!setXrandrMode(disp, screen, &avail_modes[i])) { + printfDebugJava(env, "Could not switch mode"); + continue; + } + break; + case org_lwjgl_opengl_LinuxDisplay_NONE: // Should never happen, since NONE imply no available display modes + default: // Should never happen + continue; + } + result = true; + break; + } + } + free(avail_modes); + XFlush(disp); + return result; +} + +static int getGammaRampLengthOfDisplay(JNIEnv *env, Display *disp, int screen) { + int ramp_size; + if (XF86VidModeGetGammaRampSize(disp, screen, &ramp_size) == False) { + throwException(env, "XF86VidModeGetGammaRampSize call failed"); + return 0; + } + return ramp_size; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nConvertToNativeRamp(JNIEnv *env, jclass unused, jobject ramp_buffer, jint buffer_offset, jint length) { + const jfloat *ramp_ptr = (const jfloat *)(*env)->GetDirectBufferAddress(env, ramp_buffer) + buffer_offset; + jobject native_ramp = newJavaManagedByteBuffer(env, length*3*sizeof(unsigned short)); + if (native_ramp == NULL) { + throwException(env, "Failed to allocate gamma ramp buffer"); + return NULL; + } + unsigned short *native_ramp_ptr = (unsigned short *)(*env)->GetDirectBufferAddress(env, native_ramp); + int i; + for (i = 0; i < length; i++) { + float scaled_gamma = ramp_ptr[i]*0xffff; + short scaled_gamma_short = (unsigned short)roundf(scaled_gamma); + native_ramp_ptr[i] = scaled_gamma_short; + native_ramp_ptr[i + length] = scaled_gamma_short; + native_ramp_ptr[i + length*2] = scaled_gamma_short; + } + return native_ramp; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentGammaRamp(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + int ramp_size = getGammaRampLengthOfDisplay(env, disp, screen); + jobject ramp_buffer = newJavaManagedByteBuffer(env, sizeof(unsigned short)*3*ramp_size); + if (ramp_buffer == NULL) { + throwException(env, "Could not allocate gamma ramp buffer"); + return NULL; + } + unsigned short *ramp = (unsigned short *)(*env)->GetDirectBufferAddress(env, ramp_buffer); + if (!XF86VidModeGetGammaRamp(disp, screen, ramp_size, ramp, + ramp + ramp_size, ramp + ramp_size*2)) { + throwException(env, "Could not get the current gamma ramp"); + return NULL; + } + return ramp_buffer; +} + +static void setGamma(JNIEnv *env, Display *disp, int screen, jobject ramp_buffer) { + if (ramp_buffer == NULL) + return; + unsigned short *ramp_ptr = (unsigned short *)(*env)->GetDirectBufferAddress(env, ramp_buffer); + jlong capacity = (*env)->GetDirectBufferCapacity(env, ramp_buffer); + int size = capacity/(sizeof(unsigned short)*3); + if (size == 0) + return; + if (XF86VidModeSetGammaRamp(disp, screen, size, ramp_ptr, ramp_ptr + size, ramp_ptr + size*2) == False) { + throwException(env, "Could not set gamma ramp."); + } +} + +static bool switchDisplayMode(JNIEnv * env, Display *disp, int screen, jint extension, jobject mode) { + if (mode == NULL) { + throwException(env, "mode must be non-null"); + return false; + } + jclass cls_displayMode = (*env)->GetObjectClass(env, mode); + jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); + jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); + jfieldID fid_freq = (*env)->GetFieldID(env, cls_displayMode, "freq", "I"); + int width = (*env)->GetIntField(env, mode, fid_width); + int height = (*env)->GetIntField(env, mode, fid_height); + int freq = (*env)->GetIntField(env, mode, fid_freq); + if (!setMode(env, disp, screen, extension, width, height, freq)) { + throwException(env, "Could not switch mode."); + return false; + } + return true; +} + +static jobjectArray getAvailableDisplayModes(JNIEnv * env, Display *disp, int screen, jint extension) { + int num_modes, i; + mode_info *avail_modes; + int bpp = XDefaultDepth(disp, screen); + avail_modes = getDisplayModes(disp, screen, extension, &num_modes); + if (avail_modes == NULL) { + printfDebugJava(env, "Could not get display modes"); + return NULL; + } + // Allocate an array of DisplayModes big enough + jclass displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + jobjectArray ret = (*env)->NewObjectArray(env, num_modes, displayModeClass, NULL); + jmethodID displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); + + for (i = 0; i < num_modes; i++) { + jobject displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, avail_modes[i].width, avail_modes[i].height, bpp, avail_modes[i].freq); + (*env)->SetObjectArrayElement(env, ret, i, displayMode); + } + free(avail_modes); + return ret; +} + +static jobject getCurrentXRandrMode(JNIEnv * env, Display *disp, int screen) { + Drawable root_window = RootWindow(disp, screen); + XRRScreenConfiguration *config = XRRGetScreenInfo(disp, root_window); + if (config == NULL) { + throwException(env, "Could not get current screen configuration."); + return NULL; + } + short rate = XRRConfigCurrentRate(config); + Rotation current_rotation; + SizeID size_index = XRRConfigCurrentConfiguration(config, &current_rotation); + int n_sizes; + XRRScreenSize *sizes = XRRConfigSizes(config, &n_sizes); + if (size_index >= n_sizes) { + throwFormattedException(env, "Xrandr current index (%d) is larger than or equals to the number of sizes (%d).", size_index, n_sizes); + XRRFreeScreenConfigInfo(config); + return NULL; + } + XRRScreenSize current_size = sizes[size_index]; + XRRFreeScreenConfigInfo(config); + int bpp = XDefaultDepth(disp, screen); + jclass displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + jmethodID displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); + jobject displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, current_size.width, current_size.height, bpp, rate); + return displayMode; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentXRandrMode(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return getCurrentXRandrMode(env, disp, screen); +} + +JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetAvailableDisplayModes(JNIEnv *env, jclass clazz, jlong display, jint screen, jint extension) { + Display *disp = (Display *)(intptr_t)display; + return getAvailableDisplayModes(env, disp, screen, extension); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSwitchDisplayMode(JNIEnv *env, jclass clazz, jlong display, jint screen, jint extension, jobject mode) { + Display *disp = (Display *)(intptr_t)display; + switchDisplayMode(env, disp, screen, extension, mode); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetGammaRampLength(JNIEnv *env, jclass clazz, jlong display_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + return (jint)getGammaRampLengthOfDisplay(env, disp, screen); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetGammaRamp(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject gamma_buffer) { + Display *disp = (Display *)(intptr_t)display; + setGamma(env, disp, screen, gamma_buffer); +} + diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.c new file mode 100644 index 0000000..b9ed67a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.c @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include <dlfcn.h> +#include "extgl_glx.h" + +glXGetFBConfigsPROC lwjgl_glXGetFBConfigs = NULL; +glXChooseFBConfigPROC lwjgl_glXChooseFBConfig = NULL; +glXGetFBConfigAttribPROC lwjgl_glXGetFBConfigAttrib = NULL; +glXGetVisualFromFBConfigPROC lwjgl_glXGetVisualFromFBConfig = NULL; +glXCreateWindowPROC lwjgl_glXCreateWindow = NULL; +glXDestroyWindowPROC lwjgl_glXDestroyWindow = NULL; +glXCreatePixmapPROC lwjgl_glXCreatePixmap = NULL; +glXDestroyPixmapPROC lwjgl_glXDestroyPixmap = NULL; +glXCreatePbufferPROC lwjgl_glXCreatePbuffer = NULL; +glXDestroyPbufferPROC lwjgl_glXDestroyPbuffer = NULL; +glXQueryDrawablePROC lwjgl_glXQueryDrawable = NULL; +glXCreateNewContextPROC lwjgl_glXCreateNewContext = NULL; +glXMakeContextCurrentPROC lwjgl_glXMakeContextCurrent = NULL; +glXGetCurrentReadDrawablePROC lwjgl_glXGetCurrentReadDrawable = NULL; +glXGetCurrentDisplayPROC lwjgl_glXGetCurrentDisplay = NULL; +glXQueryContextPROC lwjgl_glXQueryContext = NULL; +glXSelectEventPROC lwjgl_glXSelectEvent = NULL; +glXGetSelectedEventPROC lwjgl_glXGetSelectedEvent = NULL; +glXChooseVisualPROC lwjgl_glXChooseVisual = NULL; +glXCopyContextPROC lwjgl_glXCopyContext = NULL; +glXCreateContextPROC lwjgl_glXCreateContext = NULL; +glXCreateGLXPixmapPROC lwjgl_glXCreateGLXPixmap = NULL; +glXDestroyContextPROC lwjgl_glXDestroyContext = NULL; +glXDestroyGLXPixmapPROC lwjgl_glXDestroyGLXPixmap = NULL; +glXGetConfigPROC lwjgl_glXGetConfig = NULL; +glXGetCurrentContextPROC lwjgl_glXGetCurrentContext = NULL; +glXGetCurrentDrawablePROC lwjgl_glXGetCurrentDrawable = NULL; +glXIsDirectPROC lwjgl_glXIsDirect = NULL; +glXMakeCurrentPROC lwjgl_glXMakeCurrent = NULL; +glXQueryExtensionPROC lwjgl_glXQueryExtension = NULL; +glXQueryVersionPROC lwjgl_glXQueryVersion = NULL; +glXSwapBuffersPROC lwjgl_glXSwapBuffers = NULL; +glXUseXFontPROC lwjgl_glXUseXFont = NULL; +glXWaitGLPROC lwjgl_glXWaitGL = NULL; +glXWaitXPROC lwjgl_glXWaitX = NULL; +glXGetClientStringPROC lwjgl_glXGetClientString = NULL; +glXQueryServerStringPROC lwjgl_glXQueryServerString = NULL; +glXQueryExtensionsStringPROC lwjgl_glXQueryExtensionsString = NULL; + +/* GLX_SGI_swap_control */ +glXSwapIntervalSGIPROC lwjgl_glXSwapIntervalSGI = NULL; + +/* GLX_EXT_swap_control */ +glXSwapIntervalEXTPROC lwjgl_glXSwapIntervalEXT = NULL; + +/* GLX_ARB_create_context */ +glXCreateContextAttribsARBPROC lwjgl_glXCreateContextAttribsARB = NULL; + +/* GLX_NV_present_video */ +glXEnumerateVideoDevicesNVPROC lwjgl_glXEnumerateVideoDevicesNV = NULL; +glXBindVideoDeviceNVPROC lwjgl_glXBindVideoDeviceNV = NULL; + +/* GLX_NV_video_capture */ +glXBindVideoCaptureDeviceNVPROC lwjgl_glXBindVideoCaptureDeviceNV = NULL; +glXEnumerateVideoCaptureDevicesNVPROC lwjgl_glXEnumerateVideoCaptureDevicesNV = NULL; +glXLockVideoCaptureDeviceNVPROC lwjgl_glXLockVideoCaptureDeviceNV = NULL; +glXQueryVideoCaptureDeviceNVPROC lwjgl_glXQueryVideoCaptureDeviceNV = NULL; +glXReleaseVideoCaptureDeviceNVPROC lwjgl_glXReleaseVideoCaptureDeviceNV = NULL; + +static void * lib_gl_handle = NULL; + +typedef void * (APIENTRY * glXGetProcAddressARBPROC) (const GLubyte *procName); + +static glXGetProcAddressARBPROC lwjgl_glXGetProcAddressARB; + +static GLXExtensions symbols_flags; + +/** returns true if the extention is available */ +static inline bool GLXQueryExtension(const GLubyte *exts, const char *name) { + return extgl_QueryExtension(exts, name); +} + +static void extgl_InitGLX13() { + ExtFunction functions[] = { + {"glXGetFBConfigs", (void*)&lwjgl_glXGetFBConfigs}, + {"glXChooseFBConfig", (void*)&lwjgl_glXChooseFBConfig}, + {"glXGetFBConfigAttrib", (void*)&lwjgl_glXGetFBConfigAttrib}, + {"glXGetVisualFromFBConfig", (void*)&lwjgl_glXGetVisualFromFBConfig}, + {"glXCreateWindow", (void*)&lwjgl_glXCreateWindow}, + {"glXDestroyWindow", (void*)&lwjgl_glXDestroyWindow}, + {"glXCreatePixmap", (void*)&lwjgl_glXCreatePixmap}, + {"glXDestroyPixmap", (void*)&lwjgl_glXDestroyPixmap}, + {"glXCreatePbuffer", (void*)&lwjgl_glXCreatePbuffer}, + {"glXDestroyPbuffer", (void*)&lwjgl_glXDestroyPbuffer}, + {"glXQueryDrawable", (void*)&lwjgl_glXQueryDrawable}, + {"glXCreateNewContext", (void*)&lwjgl_glXCreateNewContext}, + {"glXMakeContextCurrent", (void*)&lwjgl_glXMakeContextCurrent}, + {"glXGetCurrentReadDrawable", (void*)&lwjgl_glXGetCurrentReadDrawable}, + {"glXGetCurrentDisplay", (void*)&lwjgl_glXGetCurrentDisplay}, + {"glXQueryContext", (void*)&lwjgl_glXQueryContext}, + {"glXSelectEvent", (void*)&lwjgl_glXSelectEvent}, + {"glXGetSelectedEvent", (void*)&lwjgl_glXGetSelectedEvent}}; + symbols_flags.GLX13 = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLX12(void) { + ExtFunction functions[] = { + {"glXChooseVisual", (void*)&lwjgl_glXChooseVisual}, + {"glXCopyContext", (void*)&lwjgl_glXCopyContext}, + {"glXCreateContext", (void*)&lwjgl_glXCreateContext}, + {"glXCreateGLXPixmap", (void*)&lwjgl_glXCreateGLXPixmap}, + {"glXDestroyContext", (void*)&lwjgl_glXDestroyContext}, + {"glXDestroyGLXPixmap", (void*)&lwjgl_glXDestroyGLXPixmap}, + {"glXGetConfig", (void*)&lwjgl_glXGetConfig}, + {"glXGetCurrentContext", (void*)&lwjgl_glXGetCurrentContext}, + {"glXGetCurrentDrawable", (void*)&lwjgl_glXGetCurrentDrawable}, + {"glXIsDirect", (void*)&lwjgl_glXIsDirect}, + {"glXMakeCurrent", (void*)&lwjgl_glXMakeCurrent}, + {"glXQueryExtension", (void*)&lwjgl_glXQueryExtension}, + {"glXQueryVersion", (void*)&lwjgl_glXQueryVersion}, + {"glXSwapBuffers", (void*)&lwjgl_glXSwapBuffers}, + {"glXUseXFont", (void*)&lwjgl_glXUseXFont}, + {"glXWaitGL", (void*)&lwjgl_glXWaitGL}, + {"glXWaitX", (void*)&lwjgl_glXWaitX}, + {"glXGetClientString", (void*)&lwjgl_glXGetClientString}, + {"glXQueryServerString", (void*)&lwjgl_glXQueryServerString}, + {"glXQueryExtensionsString", (void*)&lwjgl_glXQueryExtensionsString}}; + symbols_flags.GLX12 = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXSGISwapControl() { + ExtFunction functions[] = { + {"glXSwapIntervalSGI", (void*)&lwjgl_glXSwapIntervalSGI}}; + symbols_flags.GLX_SGI_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXEXTSwapControl() { + ExtFunction functions[] = { + {"glXSwapIntervalEXT", (void*)&lwjgl_glXSwapIntervalEXT}}; + symbols_flags.GLX_EXT_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXARBCreateContext() { + ExtFunction functions[] = { + {"glXCreateContextAttribsARB", (void*)&lwjgl_glXCreateContextAttribsARB}}; + symbols_flags.GLX_ARB_create_context = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXNVPresentVideo() { + ExtFunction functions[] = { + { "glXEnumerateVideoDevicesNV", (void*)&lwjgl_glXEnumerateVideoDevicesNV }, + { "glXBindVideoDeviceNV", (void*)&lwjgl_glXBindVideoDeviceNV } + }; + + symbols_flags.GLX_NV_present_video = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXNVVideoCapture() { + ExtFunction functions[] = { + { "glXBindVideoCaptureDeviceNV", (void*)&lwjgl_glXBindVideoCaptureDeviceNV }, + { "glXEnumerateVideoCaptureDevicesNV", (void*)&lwjgl_glXEnumerateVideoCaptureDevicesNV }, + { "glXLockVideoCaptureDeviceNV", (void*)&lwjgl_glXLockVideoCaptureDeviceNV }, + { "glXQueryVideoCaptureDeviceNV", (void*)&lwjgl_glXQueryVideoCaptureDeviceNV }, + { "glXReleaseVideoCaptureDeviceNV", (void*)&lwjgl_glXReleaseVideoCaptureDeviceNV } + }; + + symbols_flags.GLX_NV_video_capture = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXSupportedExtensions(Display *disp, int screen, GLXExtensions *extension_flags) { + const GLubyte *exts = (const GLubyte *)lwjgl_glXQueryExtensionsString(disp, screen); + +/* extension_flags.GLX_EXT_visual_info = GLXQueryExtension(exts, "GLX_EXT_visual_info"); + extension_flags.GLX_EXT_visual_rating = GLXQueryExtension(exts, "GLX_EXT_visual_rating");*/ + extension_flags->GLX_SGI_swap_control = symbols_flags.GLX_SGI_swap_control && GLXQueryExtension(exts, "GLX_SGI_swap_control"); + extension_flags->GLX_EXT_swap_control = symbols_flags.GLX_EXT_swap_control && GLXQueryExtension(exts, "GLX_EXT_swap_control"); + extension_flags->GLX_ARB_multisample = GLXQueryExtension(exts, "GLX_ARB_multisample"); + extension_flags->GLX_ARB_fbconfig_float = GLXQueryExtension(exts, "GLX_ARB_fbconfig_float"); + extension_flags->GLX_EXT_fbconfig_packed_float = GLXQueryExtension(exts, "GLX_EXT_fbconfig_packed_float"); + extension_flags->GLX_ARB_framebuffer_sRGB = GLXQueryExtension(exts, "GLX_ARB_framebuffer_sRGB") || GLXQueryExtension(exts, "GLX_EXT_framebuffer_sRGB"); + extension_flags->GLX_ARB_create_context = GLXQueryExtension(exts, "GLX_ARB_create_context"); + extension_flags->GLX_NV_multisample_coverage = GLXQueryExtension(exts, "GLX_NV_multisample_coverage"); + extension_flags->GLX_NV_present_video = GLXQueryExtension(exts, "GLX_NV_present_video"); + extension_flags->GLX_NV_video_capture = GLXQueryExtension(exts, "GLX_NV_video_capture"); +} + +bool extgl_Open(JNIEnv *env) { + if (lib_gl_handle != NULL) + return true; + /* + * Actually we don't need the RTLD_GLOBAL flag, since the symbols + * we load should be private to us. However, according to the + * documentation at + * + * http://dri.sourceforge.net/doc/DRIuserguide.html + * + * DRI drivers need this flag to work properly + */ + lib_gl_handle = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); + if (lib_gl_handle == NULL) { + throwFormattedException(env, "Error loading libGL.so.1: %s", dlerror()); + return false; + } + lwjgl_glXGetProcAddressARB = (glXGetProcAddressARBPROC)dlsym(lib_gl_handle, "glXGetProcAddressARB"); + if (lwjgl_glXGetProcAddressARB == NULL) { + extgl_Close(); + throwException(env, "Could not get address of glXGetProcAddressARB"); + return false; + } + /* Unlike Windows, GLX function addresses are context-independent + * so we only have to initialize the addresses once at load + */ + extgl_InitGLX12(); + extgl_InitGLX13(); + extgl_InitGLXSGISwapControl(); + extgl_InitGLXEXTSwapControl(); + extgl_InitGLXARBCreateContext(); + extgl_InitGLXNVPresentVideo(); + extgl_InitGLXNVVideoCapture(); + return true; +} + +void *extgl_GetProcAddress(const char *name) { + void *t = (void*)lwjgl_glXGetProcAddressARB((const GLubyte*)name); + if (t == NULL) { + t = dlsym(lib_gl_handle, name); + if (t == NULL) { + printfDebug("Could not locate symbol %s\n", name); + } + } + return t; +} + +void extgl_Close(void) { + dlclose(lib_gl_handle); + lib_gl_handle = NULL; +} + +bool extgl_InitGLX(Display *disp, int screen, GLXExtensions *extension_flags) { + int major, minor; + /* Assume glx ver >= 1.2 */ + // Check GLX 1.2 symbols available + if (!symbols_flags.GLX12) + return false; + if (lwjgl_glXQueryVersion(disp, &major, &minor) != True) + return false; + bool glx12 = major > 1 || (major == 1 && minor >= 2); + // Check GLX 1.2 version + if (!glx12) + return false; + extension_flags->GLX12 = glx12; + extension_flags->GLX13 = major > 1 || (major == 1 && minor >= 3); + extension_flags->GLX14 = major > 1 || (major == 1 && minor >= 4); + extgl_InitGLXSupportedExtensions(disp, screen, extension_flags); + return true; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.h new file mode 100644 index 0000000..a3a4e51 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/extgl_glx.h @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef EXTGL_GLX_H +#define EXTGL_GLX_H + +#include <X11/Xutil.h> +#include "extgl.h" + +/* + * Names for attributes to lwjgl_glXGetConfig. + */ +#define GLX_USE_GL 1 /* support GLX rendering */ +#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */ +#define GLX_LEVEL 3 /* level in plane stacking */ +#define GLX_RGBA 4 /* true if RGBA mode */ +#define GLX_DOUBLEBUFFER 5 /* double buffering supported */ +#define GLX_STEREO 6 /* stereo buffering supported */ +#define GLX_AUX_BUFFERS 7 /* number of aux buffers */ +#define GLX_RED_SIZE 8 /* number of red component bits */ +#define GLX_GREEN_SIZE 9 /* number of green component bits */ +#define GLX_BLUE_SIZE 10 /* number of blue component bits */ +#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */ +#define GLX_DEPTH_SIZE 12 /* number of depth bits */ +#define GLX_STENCIL_SIZE 13 /* number of stencil bits */ +#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */ +#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */ +#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */ +#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */ + +#define GLX_SAMPLE_BUFFERS_ARB 100000 /* number of multisample buffers */ +#define GLX_SAMPLES_ARB 100001 /* number of multisample samples */ + +/* + * FBConfig-specific attributes + */ +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_CONFIG_CAVEAT 0x20 /* Like visual_info VISUAL_CAVEAT */ +#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_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_VISUAL_ID 0x800B + +#define GLX_DRAWABLE_TYPE_SGIX GLX_DRAWABLE_TYPE +#define GLX_RENDER_TYPE_SGIX GLX_RENDER_TYPE +#define GLX_X_RENDERABLE_SGIX GLX_X_RENDERABLE +#define GLX_FBCONFIG_ID_SGIX GLX_FBCONFIG_ID +#define GLX_MAX_PBUFFER_WIDTH_SGIX GLX_MAX_PBUFFER_WIDTH +#define GLX_MAX_PBUFFER_HEIGHT_SGIX GLX_MAX_PBUFFER_HEIGHT +#define GLX_MAX_PBUFFER_PIXELS_SGIX GLX_MAX_PBUFFER_PIXELS +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A + +/* + * Error return values from lwjgl_glXGetConfig. Success is indicated by + * a value of 0. + */ +#define GLX_BAD_SCREEN 1 /* screen # is bad */ +#define GLX_BAD_ATTRIBUTE 2 /* attribute to get is bad */ +#define GLX_NO_EXTENSION 3 /* no glx extension on server */ +#define GLX_BAD_VISUAL 4 /* visual # not known by GLX */ +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + + +/* FBConfig attribute values */ + +/* + * Generic "don't care" value for lwjgl_glX ChooseFBConfig attributes (except + * GLX_LEVEL). + */ +#define GLX_DONT_CARE 0xFFFFFFFF + +/* GLX_RENDER_TYPE bits */ +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_RGBA_BIT_SGIX GLX_RGBA_BIT +#define GLX_COLOR_INDEX_BIT_SGIX GLX_COLOR_INDEX_BIT + +/* GLX_DRAWABLE_TYPE bits */ +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_WINDOW_BIT_SGIX GLX_WINDOW_BIT +#define GLX_PIXMAP_BIT_SGIX GLX_PIXMAP_BIT +#define GLX_PBUFFER_BIT_SGIX GLX_PBUFFER_BIT + +/* GLX_CONFIG_CAVEAT attribute values */ +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_NON_CONFORMANT_CONFIG 0x800D + +/* GLX_X_VISUAL_TYPE attribute values */ +#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 + +/* GLX_TRANSPARENT_TYPE attribute values */ +/* #define GLX_NONE 0x8000 */ +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 + +/* lwjgl_glXCreateGLXPbuffer attributes */ +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_PBUFFER_HEIGHT 0x8040 /* New for GLX 1.3 */ +#define GLX_PBUFFER_WIDTH 0x8041 /* New for GLX 1.3 */ +#define GLX_PRESERVED_CONTENTS_SGIX GLX_PRESERVED_CONTENTS +#define GLX_LARGEST_PBUFFER_SGIX GLX_LARGEST_PBUFFER + +/* lwjgl_glXQueryGLXPBuffer attributes */ +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_WIDTH_SGIX GLX_WIDTH +#define GLX_HEIGHT_SGIX GLX_HEIGHT +#define GLX_EVENT_MASK_SGIX GLX_EVENT_MASK + +/* lwjgl_glXCreateNewContext render_type attribute values */ +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_RGBA_TYPE_SGIX GLX_RGBA_TYPE +#define GLX_COLOR_INDEX_TYPE_SGIX GLX_COLOR_INDEX_TYPE + +/* lwjgl_glXQueryContext attributes */ +/* #define GLX_FBCONFIG_ID 0x8013 */ +/* #define GLX_RENDER_TYPE 0x8011 */ +#define GLX_SCREEN 0x800C + +/* lwjgl_glXSelectEvent event mask bits */ +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_PBUFFER_CLOBBER_MASK_SGIX GLX_PBUFFER_CLOBBER_MASK + +/* GLXPbufferClobberEvent event_type values */ +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_DAMAGED_SGIX GLX_DAMAGED +#define GLX_SAVED_SGIX GLX_SAVED + +/* GLXPbufferClobberEvent draw_type values */ +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_WINDOW_SGIX GLX_WINDOW +#define GLX_PBUFFER_SGIX GLX_PBUFFER + +/* GLXPbufferClobberEvent buffer_mask bits */ +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX GLX_FRONT_LEFT_BUFFER_BIT +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX GLX_FRONT_RIGHT_BUFFER_BIT +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX GLX_BACK_LEFT_BUFFER_BIT +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX GLX_BACK_RIGHT_BUFFER_BIT +#define GLX_AUX_BUFFERS_BIT_SGIX GLX_AUX_BUFFERS_BIT +#define GLX_DEPTH_BUFFER_BIT_SGIX GLX_DEPTH_BUFFER_BIT +#define GLX_STENCIL_BUFFER_BIT_SGIX GLX_STENCIL_BUFFER_BIT +#define GLX_ACCUM_BUFFER_BIT_SGIX GLX_ACCUM_BUFFER_BIT + +/* + * Extension return values from lwjgl_glXGetConfig. These are also + * accepted as parameter values for lwjgl_glXChooseVisual. + */ + +#define GLX_X_VISUAL_TYPE_EXT 0x22 /* visual_info extension type */ +#define GLX_TRANSPARENT_TYPE_EXT 0x23 /* visual_info extension */ +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 /* visual_info extension */ +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 /* visual_info extension */ +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 /* visual_info extension */ +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 /* visual_info extension */ +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 /* visual_info extension */ + +/* Property values for visual_type */ +#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 + +/* Property values for transparent pixel */ +#define GLX_NONE_EXT 0x8000 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +/* Property values for visual_rating */ +#define GLX_VISUAL_CAVEAT_EXT 0x20 /* visual_rating extension type */ +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +/* + * Names for attributes to lwjgl_glXGetClientString. + */ +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +/* + * Names for attributes to lwjgl_glXQueryContextInfoEXT. + */ +#define GLX_SHARE_CONTEXT_EXT 0x800A /* id of share context */ +#define GLX_VISUAL_ID_EXT 0x800B /* id of context's visual */ +#define GLX_SCREEN_EXT 0x800C /* screen number */ + +/* NV_float_buffer */ +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +/* GLX_ARB_fbconfig_float */ +#define GLX_RGBA_FLOAT_TYPE 0x20B9 +#define GLX_RGBA_FLOAT_BIT 0x0004 + +/* GLX_ARB_fbconfig_float */ +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 + +/* GLX_ARB_framebuffer_sRGB */ +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 + +/* GLX_ARB_create_context */ +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + +/* GLX_NV_multisample_coverage */ +#define GLX_COVERAGE_SAMPLES_NV 100001 +#define GLX_COLOR_SAMPLES_NV 0x20B3 + +/* GLX_NV_present_video */ +#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 + +/* GLX_NV_video_capture */ +#define GLX_DEVICE_ID_NV 0x20CD +#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF +#define GLX_UNIQUE_ID_NV 0x20CE + +typedef XID GLXContextID; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef XID GLXFBConfigID; + +typedef struct __GLXcontextRec *GLXContext; + +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef GLXFBConfig * (APIENTRY * glXGetFBConfigsPROC) (Display *dpy, int screen, int *nelements); +typedef GLXFBConfig * (APIENTRY * glXChooseFBConfigPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef int (APIENTRY * glXGetFBConfigAttribPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef XVisualInfo * (APIENTRY * glXGetVisualFromFBConfigPROC) (Display *dpy, GLXFBConfig config); +typedef GLXWindow (APIENTRY * glXCreateWindowPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void (APIENTRY * glXDestroyWindowPROC) (Display *dpy, GLXWindow win); +typedef GLXPixmap (APIENTRY * glXCreatePixmapPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef void (APIENTRY * glXDestroyPixmapPROC) (Display *dpy, GLXPixmap pixmap); +typedef GLXPbuffer (APIENTRY * glXCreatePbufferPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef void (APIENTRY * glXDestroyPbufferPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void (APIENTRY * glXQueryDrawablePROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef GLXContext (APIENTRY * glXCreateNewContextPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef Bool (APIENTRY * glXMakeContextCurrentPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable (APIENTRY * glXGetCurrentReadDrawablePROC) (void); +typedef Display * (APIENTRY * glXGetCurrentDisplayPROC) (void); +typedef int (APIENTRY * glXQueryContextPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void (APIENTRY * glXSelectEventPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); +typedef void (APIENTRY * glXGetSelectedEventPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); + +typedef GLXContextID (APIENTRY * glXGetContextIDEXTPROC) (const GLXContext ctx); +typedef GLXDrawable (APIENTRY * glXGetCurrentDrawableEXTPROC) (void); +typedef GLXContext (APIENTRY * glXImportContextEXTPROC) (Display *dpy, GLXContextID contextID); +typedef void (APIENTRY * glXFreeContextEXTPROC) (Display *dpy, GLXContext ctx); +typedef int (APIENTRY * glXQueryContextInfoEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); + +typedef XVisualInfo* (APIENTRY * glXChooseVisualPROC) (Display *dpy, int screen, int *attribList); +typedef void (APIENTRY * glXCopyContextPROC) (Display *dpy, GLXContext src, GLXContext dst, unsigned long mask); +typedef GLXContext (APIENTRY * glXCreateContextPROC) (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +typedef GLXPixmap (APIENTRY * glXCreateGLXPixmapPROC) (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +typedef void (APIENTRY * glXDestroyContextPROC) (Display *dpy, GLXContext ctx); +typedef void (APIENTRY * glXDestroyGLXPixmapPROC) (Display *dpy, GLXPixmap pix); +typedef int (APIENTRY * glXGetConfigPROC) (Display *dpy, XVisualInfo *vis, int attrib, int *value); +typedef GLXContext (APIENTRY * glXGetCurrentContextPROC) (void); +typedef GLXDrawable (APIENTRY * glXGetCurrentDrawablePROC) (void); +typedef Bool (APIENTRY * glXIsDirectPROC) (Display *dpy, GLXContext ctx); +typedef Bool (APIENTRY * glXMakeCurrentPROC) (Display *dpy, GLXDrawable drawable, GLXContext ctx); +typedef Bool (APIENTRY * glXQueryExtensionPROC) (Display *dpy, int *errorBase, int *eventBase); +typedef Bool (APIENTRY * glXQueryVersionPROC) (Display *dpy, int *major, int *minor); +typedef void (APIENTRY * glXSwapBuffersPROC) (Display *dpy, GLXDrawable drawable); +typedef void (APIENTRY * glXUseXFontPROC) (Font font, int first, int count, int listBase); +typedef void (APIENTRY * glXWaitGLPROC) (void); +typedef void (APIENTRY * glXWaitXPROC) (void); +typedef const char * (APIENTRY * glXGetClientStringPROC) (Display *dpy, int name ); +typedef const char * (APIENTRY * glXQueryServerStringPROC) (Display *dpy, int screen, int name ); +typedef const char * (APIENTRY * glXQueryExtensionsStringPROC) (Display *dpy, int screen ); + +/* GLX_SGI_swap_control */ +typedef void (APIENTRY * glXSwapIntervalSGIPROC)(int interval); + +/* GLX_EXT_swap_control */ +typedef void (APIENTRY * glXSwapIntervalEXTPROC)(Display *dpy, GLXDrawable drawable, int interval); + +/* GLX_ARB_create_context */ +typedef GLXContext (APIENTRY * glXCreateContextAttribsARBPROC) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); + +/* GLX_NV_present_video */ +typedef unsigned int * (APIENTRY * glXEnumerateVideoDevicesNVPROC) (Display *dpy, int screen, int *nelements); +typedef int (APIENTRY * glXBindVideoDeviceNVPROC) (Display *dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); + +/* GLX_NV_video_capture */ +typedef XID GLXVideoCaptureDeviceNV; +typedef int (APIENTRY * glXBindVideoCaptureDeviceNVPROC) (Display *dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); +typedef GLXVideoCaptureDeviceNV * (APIENTRY * glXEnumerateVideoCaptureDevicesNVPROC) (Display *dpy, int screen, int *nelements); +typedef void (APIENTRY * glXLockVideoCaptureDeviceNVPROC) (Display *dpy, GLXVideoCaptureDeviceNV device); +typedef int (APIENTRY * glXQueryVideoCaptureDeviceNVPROC) (Display *dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); +typedef void (APIENTRY * glXReleaseVideoCaptureDeviceNVPROC) (Display *dpy, GLXVideoCaptureDeviceNV device); + +typedef struct { + bool GLX12; + bool GLX13; + bool GLX14; +/* bool GLX_EXT_visual_info; + bool GLX_EXT_visual_rating;*/ + bool GLX_SGI_swap_control; + bool GLX_EXT_swap_control; + bool GLX_ARB_multisample; + bool GLX_ARB_fbconfig_float; + bool GLX_EXT_fbconfig_packed_float; + bool GLX_ARB_framebuffer_sRGB; + bool GLX_ARB_create_context; + bool GLX_NV_multisample_coverage; + bool GLX_NV_present_video; + bool GLX_NV_video_capture; +} GLXExtensions; + +/* Add _ to global symbols to avoid symbol clash with the OpenGL library */ +extern glXGetFBConfigsPROC lwjgl_glXGetFBConfigs; +extern glXChooseFBConfigPROC lwjgl_glXChooseFBConfig; +extern glXGetFBConfigAttribPROC lwjgl_glXGetFBConfigAttrib; +extern glXGetVisualFromFBConfigPROC lwjgl_glXGetVisualFromFBConfig; +extern glXCreateWindowPROC lwjgl_glXCreateWindow; +extern glXDestroyWindowPROC lwjgl_glXDestroyWindow; +extern glXCreatePixmapPROC lwjgl_glXCreatePixmap; +extern glXDestroyPixmapPROC lwjgl_glXDestroyPixmap; +extern glXCreatePbufferPROC lwjgl_glXCreatePbuffer; +extern glXDestroyPbufferPROC lwjgl_glXDestroyPbuffer; +extern glXQueryDrawablePROC lwjgl_glXQueryDrawable; +extern glXCreateNewContextPROC lwjgl_glXCreateNewContext; +extern glXMakeContextCurrentPROC lwjgl_glXMakeContextCurrent; +extern glXGetCurrentReadDrawablePROC lwjgl_glXGetCurrentReadDrawable; +extern glXGetCurrentDisplayPROC lwjgl_glXGetCurrentDisplay; +extern glXQueryContextPROC lwjgl_glXQueryContext; +extern glXSelectEventPROC lwjgl_glXSelectEvent; +extern glXGetSelectedEventPROC lwjgl_glXGetSelectedEvent; + +extern glXChooseVisualPROC lwjgl_glXChooseVisual; +extern glXCopyContextPROC lwjgl_glXCopyContext; +extern glXCreateContextPROC lwjgl_glXCreateContext; +extern glXCreateGLXPixmapPROC lwjgl_glXCreateGLXPixmap; +extern glXDestroyContextPROC lwjgl_glXDestroyContext; +extern glXDestroyGLXPixmapPROC lwjgl_glXDestroyGLXPixmap; +extern glXGetConfigPROC lwjgl_glXGetConfig; +extern glXGetCurrentContextPROC lwjgl_glXGetCurrentContext; +extern glXGetCurrentDrawablePROC lwjgl_glXGetCurrentDrawable; +extern glXIsDirectPROC lwjgl_glXIsDirect; +extern glXMakeCurrentPROC lwjgl_glXMakeCurrent; +extern glXQueryExtensionPROC lwjgl_glXQueryExtension; +extern glXQueryVersionPROC lwjgl_glXQueryVersion; +extern glXSwapBuffersPROC lwjgl_glXSwapBuffers; +extern glXUseXFontPROC lwjgl_glXUseXFont; +extern glXWaitGLPROC lwjgl_glXWaitGL; +extern glXWaitXPROC lwjgl_glXWaitX; +extern glXGetClientStringPROC lwjgl_glXGetClientString; +extern glXQueryServerStringPROC lwjgl_glXQueryServerString; +extern glXQueryExtensionsStringPROC lwjgl_glXQueryExtensionsString; + +extern glXSwapIntervalSGIPROC lwjgl_glXSwapIntervalSGI; +extern glXSwapIntervalEXTPROC lwjgl_glXSwapIntervalEXT; + +extern glXCreateContextAttribsARBPROC lwjgl_glXCreateContextAttribsARB; + +/* GLX_NV_present_video */ +extern glXEnumerateVideoDevicesNVPROC lwjgl_glXEnumerateVideoDevicesNV; +extern glXBindVideoDeviceNVPROC lwjgl_glXBindVideoDeviceNV; + +/* GLX_NV_video_capture */ +extern glXBindVideoCaptureDeviceNVPROC lwjgl_glXBindVideoCaptureDeviceNV; +extern glXEnumerateVideoCaptureDevicesNVPROC lwjgl_glXEnumerateVideoCaptureDevicesNV; +extern glXLockVideoCaptureDeviceNVPROC lwjgl_glXLockVideoCaptureDeviceNV; +extern glXQueryVideoCaptureDeviceNVPROC lwjgl_glXQueryVideoCaptureDeviceNV; +extern glXReleaseVideoCaptureDeviceNVPROC lwjgl_glXReleaseVideoCaptureDeviceNV; + +extern bool extgl_InitGLX(Display *disp, int screen, GLXExtensions *extension_flags); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Display.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Display.c new file mode 100644 index 0000000..3e8ea6f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Display.c @@ -0,0 +1,670 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Linux specific display functions. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/extensions/xf86vmode.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <jni.h> +#include <jawt_md.h> +#include "common_tools.h" +#include "extgl.h" +#include "extgl_glx.h" +#include "context.h" +#include "org_lwjgl_opengl_LinuxDisplay.h" +#include "org_lwjgl_opengl_LinuxDisplayPeerInfo.h" +#include "org_lwjgl_LinuxSysImplementation.h" + +#define ERR_MSG_SIZE 1024 + +typedef struct { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} MotifWmHints; + +#define MWM_HINTS_DECORATIONS (1L << 1) + +static GLXWindow glx_window = None; + +static Colormap cmap; +static int current_depth; + +static Visual *current_visual; + +static bool checkXError(JNIEnv *env, Display *disp) { + XSync(disp, False); + return (*env)->ExceptionCheck(env) == JNI_FALSE; +} + +static int global_error_handler(Display *disp, XErrorEvent *error) { + JNIEnv *env = getThreadEnv(); + if (env != NULL) { + jclass org_lwjgl_LinuxDisplay_class = (*env)->FindClass(env, "org/lwjgl/opengl/LinuxDisplay"); + if (org_lwjgl_LinuxDisplay_class == NULL) { + // Don't propagate error + (*env)->ExceptionClear(env); + return 0; + } + jmethodID handler_method = (*env)->GetStaticMethodID(env, org_lwjgl_LinuxDisplay_class, "globalErrorHandler", "(JJJJJJJ)I"); + if (handler_method == NULL) + return 0; + return (*env)->CallStaticIntMethod(env, org_lwjgl_LinuxDisplay_class, handler_method, (jlong)(intptr_t)disp, (jlong)(intptr_t)error, + (jlong)(intptr_t)error->display, (jlong)error->serial, (jlong)error->error_code, (jlong)error->request_code, (jlong)error->minor_code); + } else + return 0; +} + +static jlong openDisplay(JNIEnv *env) { + Display *display_connection = XOpenDisplay(NULL); + if (display_connection == NULL) { + throwException(env, "Could not open X display connection"); + return (intptr_t)NULL; + } + return (intptr_t)display_connection; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion + (JNIEnv *env, jobject ignored) { + return org_lwjgl_LinuxSysImplementation_JNI_VERSION; +} + +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getErrorText(JNIEnv *env, jclass unused, jlong display_ptr, jlong error_code) { + Display *disp = (Display *)(intptr_t)display_ptr; + char err_msg_buffer[ERR_MSG_SIZE]; + XGetErrorText(disp, error_code, err_msg_buffer, ERR_MSG_SIZE); + err_msg_buffer[ERR_MSG_SIZE - 1] = '\0'; + return NewStringNativeWithLength(env, err_msg_buffer, strlen(err_msg_buffer)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_callErrorHandler(JNIEnv *env, jclass unused, jlong handler_ptr, jlong display_ptr, jlong event_ptr) { + XErrorHandler handler = (XErrorHandler)(intptr_t)handler_ptr; + Display *disp = (Display *)(intptr_t)display_ptr; + XErrorEvent *event = (XErrorEvent *)(intptr_t)event_ptr; + return (jint)handler(disp, event); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_setErrorHandler(JNIEnv *env, jclass unused) { + return (intptr_t)XSetErrorHandler(global_error_handler); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_resetErrorHandler(JNIEnv *env, jclass unused, jlong handler_ptr) { + XErrorHandler handler = (XErrorHandler)(intptr_t)handler_ptr; + return (intptr_t)XSetErrorHandler(handler); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSync(JNIEnv *env, jclass unused, jlong display_ptr, jboolean throw_away_events) { + Display *disp = (Display *)(intptr_t)display_ptr; + XSync(disp, throw_away_events ? True : False); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_sync(JNIEnv *env, jclass unused, jlong display_ptr, jboolean throw_away_events) { + Display *disp = (Display *)(intptr_t)display_ptr; + XSync(disp, throw_away_events ? True : False); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetDefaultScreen(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XDefaultScreen(disp); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nInternAtom(JNIEnv *env, jclass unused, jlong display_ptr, jstring atom_name_obj, jboolean only_if_exists) { + Display *disp = (Display *)(intptr_t)display_ptr; + char *atom_name = GetStringNativeChars(env, atom_name_obj); + if (atom_name == NULL) + return 0; + Atom atom = XInternAtom(disp, atom_name, only_if_exists ? True : False); + free(atom_name); + return atom; +} + +static void setDecorations(Display *disp, Window window, int dec) { + Atom motif_hints_atom = XInternAtom(disp, "_MOTIF_WM_HINTS", False); + MotifWmHints motif_hints; + motif_hints.flags = MWM_HINTS_DECORATIONS; + motif_hints.decorations = dec; + XChangeProperty(disp, window, motif_hints_atom, motif_hints_atom, 32, PropModeReplace, (unsigned char *)&motif_hints, sizeof(MotifWmHints)/sizeof(long)); +} + +static bool isLegacyFullscreen(jint window_mode) { + return window_mode == org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_LEGACY; +} + +static void setWindowTitle(Display *disp, Window window, jlong title, jint len) { + // ASCII fallback if XChangeProperty fails. + XStoreName(disp, window, (const char *)(intptr_t)title); + + // Set the UTF-8 encoded title + XChangeProperty(disp, window, + XInternAtom(disp, "_NET_WM_NAME", False), + XInternAtom(disp, "UTF8_STRING", False), + 8, PropModeReplace, (const unsigned char *)(intptr_t)title, + len); +} + +static void setClassHint(Display *disp, Window window, jlong wm_name, jlong wm_class) { + XClassHint* hint = XAllocClassHint(); + + hint->res_name = (const unsigned char *)(intptr_t)wm_name; + hint->res_class = (const unsigned char *)(intptr_t)wm_class; + + XSetClassHint(disp, window, hint); + + XFree(hint); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_openDisplay(JNIEnv *env, jclass clazz) { + return openDisplay(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_closeDisplay(JNIEnv *env, jclass clazz, jlong display) { + Display *disp = (Display *)(intptr_t)display; + XCloseDisplay(disp); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDrawable(JNIEnv *env, jclass clazz, jlong window, jobject peer_info_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + if (peer_info->glx13) + peer_info->drawable = glx_window; + else + peer_info->drawable = window; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDefaultPeerInfo(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle, jobject pixel_format) { + Display *disp = (Display *)(intptr_t)display; + initPeerInfo(env, peer_info_handle, disp, screen, pixel_format, true, GLX_WINDOW_BIT, true, false); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetTitle(JNIEnv * env, jclass clazz, jlong display, jlong window_ptr, jlong title, jint len) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + setWindowTitle(disp, window, title, len); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetClassHint(JNIEnv * env, jclass clazz, jlong display, jlong window_ptr, jlong wm_name, jlong wm_class) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + setClassHint(disp, window, wm_name, wm_class); +} + +static void destroyWindow(JNIEnv *env, Display *disp, Window window) { + if (glx_window != None) { + lwjgl_glXDestroyWindow(disp, glx_window); + glx_window = None; + } + XDestroyWindow(disp, window); + XFreeColormap(disp, cmap); +} + +static bool isNetWMFullscreenSupported(JNIEnv *env, Display *disp, int screen) { + unsigned long nitems; + Atom actual_type; + int actual_format; + unsigned long bytes_after; + Atom *supported_list; + Atom netwm_supported_atom = XInternAtom(disp, "_NET_SUPPORTED", False); + int result = XGetWindowProperty(disp, RootWindow(disp, screen), netwm_supported_atom, 0, 10000, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, (void *)&supported_list); + if (result != Success) { + throwException(env, "Unable to query _NET_SUPPORTED window property"); + return false; + } + Atom fullscreen_atom = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False); + bool supported = false; + unsigned long i; + for (i = 0; i < nitems; i++) { + if (fullscreen_atom == supported_list[i]) { + supported = true; + break; + } + } + XFree(supported_list); + return supported; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsNetWMFullscreenSupported(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return isNetWMFullscreenSupported(env, disp, screen) ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nReshape(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jint x, jint y, jint width, jint height) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XMoveWindow(disp, window, x, y); + XResizeWindow(disp, window, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_synchronize(JNIEnv *env, jclass clazz, jlong display, jboolean synchronize) { + Display *disp = (Display *)(intptr_t)display; + XSynchronize(disp, synchronize ? True : False); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getRootWindow(JNIEnv *env, jclass clazz, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return RootWindow(disp, screen); +} + +static Window getCurrentWindow(JNIEnv *env, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + + Window parent = (Window)window_ptr; + Window win, root; + + Window *children; + unsigned int nchildren; + + do { + win = parent; + + if (XQueryTree(disp, win, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return 0; + } + + if (children != NULL) XFree(children); + } while (parent != root); + + return win; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetX(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = getCurrentWindow(env, display_ptr, window_ptr); + + XWindowAttributes win_attribs; + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.x; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetY(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = getCurrentWindow(env, display_ptr, window_ptr); + + XWindowAttributes win_attribs; + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.y; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetWidth(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.width; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetHeight(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.height; +} + +static void updateWindowHints(JNIEnv *env, Display *disp, Window window) { + XWMHints* win_hints = XAllocWMHints(); + if (win_hints == NULL) { + throwException(env, "XAllocWMHints failed"); + return; + } + + win_hints->flags = InputHint; + win_hints->input = True; + + XSetWMHints(disp, window, win_hints); + XFree(win_hints); + XFlush(disp); +} + +static void updateWindowBounds(Display *disp, Window win, int x, int y, int width, int height, jboolean position, jboolean resizable) { + XSizeHints *window_hints = XAllocSizeHints(); + + if (position) { + window_hints->flags |= PPosition; + window_hints->x = x; + window_hints->y = y; + } + + if (!resizable) { + window_hints->flags |= PMinSize | PMaxSize; + window_hints->min_width = width; + window_hints->max_width = width; + window_hints->min_height = height; + window_hints->max_height = height; + } + + XSetWMNormalHints(disp, win, window_hints); + XFree(window_hints); +} + +static Window createWindow(JNIEnv* env, Display *disp, int screen, jint window_mode, X11PeerInfo *peer_info, int x, int y, int width, int height, jboolean undecorated, long parent_handle, jboolean resizable) { + Window parent = (Window)parent_handle; + Window win; + XSetWindowAttributes attribs; + int attribmask; + + XVisualInfo *vis_info = getVisualInfoFromPeerInfo(env, peer_info); + if (vis_info == NULL) + return false; + cmap = XCreateColormap(disp, parent, vis_info->visual, AllocNone); + attribs.colormap = cmap; + attribs.border_pixel = 0; + attribs.event_mask = ExposureMask | FocusChangeMask | VisibilityChangeMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask| EnterWindowMask | LeaveWindowMask; + attribmask = CWColormap | CWEventMask | CWBorderPixel; + if (isLegacyFullscreen(window_mode)) { + attribmask |= CWOverrideRedirect; + attribs.override_redirect = True; + } + win = XCreateWindow(disp, parent, x, y, width, height, 0, vis_info->depth, InputOutput, vis_info->visual, attribmask, &attribs); + + current_depth = vis_info->depth; + current_visual = vis_info->visual; + + XFree(vis_info); + if (!checkXError(env, disp)) { + XFreeColormap(disp, cmap); + return false; + } +// printfDebugJava(env, "Created window"); + if (undecorated) { + // Use Motif decoration hint property and hope the window manager respects them + setDecorations(disp, win, 0); + } + + if (RootWindow(disp, screen) == parent_handle) { // only set hints when Display.setParent isn't used + updateWindowBounds(disp, win, x, y, width, height, JNI_TRUE, resizable); + updateWindowHints(env, disp, win); + } + +#define NUM_ATOMS 1 + Atom protocol_atoms[NUM_ATOMS] = {XInternAtom(disp, "WM_DELETE_WINDOW", False)/*, XInternAtom(disp, "WM_TAKE_FOCUS", False)*/}; + XSetWMProtocols(disp, win, protocol_atoms, NUM_ATOMS); + if (window_mode == org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_NETWM) { + Atom fullscreen_atom = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False); + XChangeProperty(disp, win, XInternAtom(disp, "_NET_WM_STATE", False), + XInternAtom(disp, "ATOM", False), 32, PropModeReplace, (const unsigned char*)&fullscreen_atom, 1); + } + if (!checkXError(env, disp)) { + destroyWindow(env, disp, win); + return 0; + } + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_reparentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr, jlong parent_ptr, jint x, jint y) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window parent = (Window)parent_ptr; + XReparentWindow(disp, window, parent, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_mapRaised(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XMapRaised(disp, window); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getParentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window root, parent; + Window *children; + unsigned int nchildren; + if (XQueryTree(disp, window, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return None; + } + if (children != NULL) + XFree(children); + return parent; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getChildCount(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window root, parent; + Window *children; + unsigned int nchildren; + if (XQueryTree(disp, window, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return None; + } + if (children != NULL) + XFree(children); + + return nchildren; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_hasProperty(JNIEnv *env, jclass unusued, jlong display, jlong window_ptr, jlong property_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Atom property = (Atom)property_ptr; + int num_props; + Atom *properties = XListProperties(disp, window, &num_props); + if (properties == NULL) + return JNI_FALSE; + jboolean result = JNI_FALSE; + for (int i = 0; i < num_props; i++) { + if (properties[i] == property) { + result = JNI_TRUE; + break; + } + } + XFree(properties); + return result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetInputFocus(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + int revert_mode; + Window win; + XGetInputFocus(disp, &win, &revert_mode); + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetInputFocus(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jlong time) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XSetInputFocus(disp, window, RevertToParent, time); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateWindow(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle, jobject mode, jint window_mode, jint x, jint y, jboolean undecorated, jlong parent_handle, jboolean resizable) { + Display *disp = (Display *)(intptr_t)display; + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + GLXFBConfig *fb_config = NULL; + if (peer_info->glx13) { + fb_config = getFBConfigFromPeerInfo(env, peer_info); + if (fb_config == NULL) + return 0; + } + jclass cls_displayMode = (*env)->GetObjectClass(env, mode); + jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); + jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); + int width = (*env)->GetIntField(env, mode, fid_width); + int height = (*env)->GetIntField(env, mode, fid_height); + Window win = createWindow(env, disp, screen, window_mode, peer_info, x, y, width, height, undecorated, parent_handle, resizable); + if ((*env)->ExceptionOccurred(env)) { + return 0; + } + if (peer_info->glx13) { + glx_window = lwjgl_glXCreateWindow(disp, *fb_config, win, NULL); + XFree(fb_config); + } + if (!checkXError(env, disp)) { + lwjgl_glXDestroyWindow(disp, glx_window); + destroyWindow(env, disp, win); + } + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowSize(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jint width, jint height, jboolean resizable) { + Display *disp = (Display *)(intptr_t)display; + Window win = (Window)window_ptr; + updateWindowBounds(disp, win, 0, 0, width, height, JNI_FALSE, resizable); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyWindow(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + destroyWindow(env, disp, window); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nLockAWT(JNIEnv *env, jclass clazz) { + JAWT jawt; + jawt.version = JAWT_VERSION_1_4; + if (JAWT_GetAWT(env, &jawt) != JNI_TRUE) { + throwException(env, "GetAWT failed"); + return; + } + jawt.Lock(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUnlockAWT(JNIEnv *env, jclass clazz) { + JAWT jawt; + jawt.version = JAWT_VERSION_1_4; + if (JAWT_GetAWT(env, &jawt) != JNI_TRUE) { + throwException(env, "GetAWT failed"); + return; + } + jawt.Unlock(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowIcon + (JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jobject icons_buffer, jint icons_buffer_size) +{ + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + const unsigned char *icons_char_buffer = (const unsigned char *)(*env)->GetDirectBufferAddress(env, icons_buffer); + + int length = icons_buffer_size/4; + unsigned long icons_long_buffer[length]; + int i = 0; + + // copy byte array to long array + for (i = 0; i < icons_buffer_size; i += 4) { + unsigned long argb = (icons_char_buffer[i] << 24) | + (icons_char_buffer[i+1] << 16) | + (icons_char_buffer[i+2] << 8) | + (icons_char_buffer[i+3]); + icons_long_buffer[i/4] = argb; + } + + XChangeProperty(disp, window, + XInternAtom(disp, "_NET_WM_ICON", False), + XInternAtom(disp, "CARDINAL", False), + 32, PropModeReplace, (const unsigned char*) icons_long_buffer, length); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabKeyboard(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XUngrabKeyboard(disp, CurrentTime); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabKeyboard(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + return XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabPointer(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jlong cursor_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + Cursor cursor = (Cursor)cursor_ptr; + int grab_mask = PointerMotionMask | ButtonPressMask | ButtonReleaseMask; + return XGrabPointer(disp, win, False, grab_mask, GrabModeAsync, GrabModeAsync, win, cursor, CurrentTime); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetViewPort(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + XF86VidModeSetViewPort(disp, screen, win_attribs.x, win_attribs.y); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabPointer(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XUngrabPointer(disp, CurrentTime); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDefineCursor(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jlong cursor_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + Cursor cursor = (Cursor)cursor_ptr; + XDefineCursor(disp, win, cursor); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateBlankCursor(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + unsigned int best_width, best_height; + if (XQueryBestCursor(disp, win, 1, 1, &best_width, &best_height) == 0) { + throwException(env, "Could not query best cursor size"); + return false; + } + Pixmap mask = XCreatePixmap(disp, win, best_width, best_height, 1); + XGCValues gc_values; + gc_values.foreground = 0; + GC gc = XCreateGC(disp, mask, GCForeground, &gc_values); + XFillRectangle(disp, mask, gc, 0, 0, best_width, best_height); + XFreeGC(disp, gc); + XColor dummy_color; + Cursor cursor = XCreatePixmapCursor(disp, mask, mask, &dummy_color, &dummy_color, 0, 0); + XFreePixmap(disp, mask); + return cursor; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIconifyWindow(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XIconifyWindow(disp, win, screen); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.c new file mode 100644 index 0000000..9ed67dc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <jawt_md.h> +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "awt_tools.h" +#include "org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h" +#include "context.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo_getScreenFromSurfaceInfo + (JNIEnv *env, jclass clazz, jobject lock_buffer_handle) { + const AWTSurfaceLock *awt_lock = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + // Get the platform-specific drawing info + JAWT_X11DrawingSurfaceInfo *dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)awt_lock->dsi->platformInfo; + + XVisualInfo template; + int num_infos; + template.visualid = dsi_x11->visualID; + template.depth = dsi_x11->depth; + XVisualInfo *vis_info = XGetVisualInfo(dsi_x11->display, VisualIDMask | VisualDepthMask, &template, &num_infos); + if (vis_info == NULL) { + throwException(env, "Could not determine screen"); + return -1; + } + int screen = vis_info[0].screen; + XFree(vis_info); + return screen; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo_nInitHandle + (JNIEnv *env, jclass clazz, int screen, jobject lock_buffer_handle, jobject peer_info_handle) { + const AWTSurfaceLock *awt_lock = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + X11PeerInfo *peer_info = (X11PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + // Get the platform-specific drawing info + JAWT_X11DrawingSurfaceInfo *dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)awt_lock->dsi->platformInfo; + + peer_info->display = dsi_x11->display; + peer_info->screen = screen; + peer_info->drawable = dsi_x11->drawable; + peer_info->glx13 = false; + peer_info->config.glx_config.visualid = dsi_x11->visualID; + peer_info->config.glx_config.depth = dsi_x11->depth; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h new file mode 100644 index 0000000..76bea8c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo +#define _Included_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo + * Method: getScreenFromSurfaceInfo + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo_getScreenFromSurfaceInfo + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo + * Method: nInitHandle + * Signature: (ILjava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxAWTGLCanvasPeerInfo_nInitHandle + (JNIEnv *, jclass, jint, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.c new file mode 100644 index 0000000..8b05317 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "org_lwjgl_opengl_LinuxCanvasImplementation.h" +#include "extgl_glx.h" +#include "context.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxCanvasImplementation_nFindVisualIDFromFormat + (JNIEnv *env, jclass clazz, jlong display, jint screen, jobject pixel_format) { + Display *disp = (Display *)(intptr_t)display; + GLXExtensions extension_flags; + if (!extgl_InitGLX(disp, screen, &extension_flags)) { + throwException(env, "Could not initialize GLX"); + return -1; + } + XVisualInfo *vis_info = chooseVisualGLX(env, disp, screen, pixel_format, true, true); + if (vis_info == NULL) { + throwException(env, "Could not choose a VisualInfo"); + return -1; + } + + VisualID vis_id = vis_info->visualid; + XFree(vis_info); + return vis_id; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.h new file mode 100644 index 0000000..b6cd1ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxCanvasImplementation.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxCanvasImplementation */ + +#ifndef _Included_org_lwjgl_opengl_LinuxCanvasImplementation +#define _Included_org_lwjgl_opengl_LinuxCanvasImplementation +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxCanvasImplementation + * Method: nFindVisualIDFromFormat + * Signature: (JILorg/lwjgl/opengl/PixelFormat;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxCanvasImplementation_nFindVisualIDFromFormat + (JNIEnv *, jclass, jlong, jint, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c new file mode 100644 index 0000000..844883e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "org_lwjgl_opengl_LinuxContextImplementation.h" +#include "extgl_glx.h" +#include "context.h" +#include "common_tools.h" + +typedef struct { + GLXExtensions extension_flags; + GLXContext context; +} X11Context; + +static bool checkContext(JNIEnv *env, Display *display, GLXContext context) { + if (context == NULL) { + throwException(env, "Could not create GLX context"); + return false; + } + /* + * Ditched the requirement that contexts have to be direct. It was + * never true that all accelerated contexts are direct, but it + * was a reasonable test until the appearance of Xgl and AIGLX. + * Now the test is at best useless, and at worst wrong, + * in case the current X server accelerates indirect rendering. + */ +/* jboolean allow_software_acceleration = getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL"); + if (!allow_software_acceleration && lwjgl_glXIsDirect(display, context) == False) { + lwjgl_glXDestroyContext(display, context); + throwException(env, "Could not create a direct GLX context"); + return false; + }*/ + return true; +} + +static void createContextGLX13(JNIEnv *env, X11PeerInfo *peer_info, X11Context *context_info, jobject attribs, GLXContext shared_context) { + GLXFBConfig *config = getFBConfigFromPeerInfo(env, peer_info); + if (config == NULL) + return; + GLXContext context; + if (attribs) { + const int *attrib_list = (const int *)(*env)->GetDirectBufferAddress(env, attribs); + context = lwjgl_glXCreateContextAttribsARB(peer_info->display, *config, shared_context, True, attrib_list); + } else { + int render_type; + if (lwjgl_glXGetFBConfigAttrib(peer_info->display, *config, GLX_RENDER_TYPE, &render_type) != 0) { + throwException(env, "Could not get GLX_RENDER_TYPE attribute"); + return; + } + int context_render_type = (render_type & GLX_RGBA_FLOAT_BIT) != 0 ? GLX_RGBA_FLOAT_TYPE : GLX_RGBA_TYPE; + context = lwjgl_glXCreateNewContext(peer_info->display, *config, context_render_type, shared_context, True); + } + XFree(config); + if (!checkContext(env, peer_info->display, context)) + return; + context_info->context = context; +} + +static void createContextGLX(JNIEnv *env, X11PeerInfo *peer_info, X11Context *context_info, GLXContext shared_context) { + XVisualInfo *vis_info = getVisualInfoFromPeerInfo(env, peer_info); + if (vis_info == NULL) + return; + GLXContext context = lwjgl_glXCreateContext(peer_info->display, vis_info, shared_context, True); + XFree(vis_info); + if (!checkContext(env, peer_info->display, context)) + return; + context_info->context = context; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_getGLXContext(JNIEnv *env, jclass clazz, jobject context_handle) { + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + return (intptr_t)context_info->context; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_getDisplay(JNIEnv *env, jclass clazz, jobject peer_info_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->display; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nSetSwapInterval + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject context_handle, jint value) +{ + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + + if (context_info->extension_flags.GLX_EXT_swap_control) { + lwjgl_glXSwapIntervalEXT(peer_info->display, peer_info->drawable, value); + } + else if (context_info->extension_flags.GLX_SGI_swap_control) { + lwjgl_glXSwapIntervalSGI(value); + } +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nCreate + (JNIEnv *env , jclass clazz, jobject peer_handle, jobject attribs, jobject shared_context_handle) { + jobject context_handle = newJavaManagedByteBuffer(env, sizeof(X11Context)); + if (context_handle == NULL) { + throwException(env, "Could not allocate handle buffer"); + return NULL; + } + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_handle); + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + GLXExtensions extension_flags; + if (!extgl_InitGLX(peer_info->display, peer_info->screen, &extension_flags)) { + throwException(env, "Could not initialize GLX"); + return NULL; + } + GLXContext shared_context = NULL; + if (shared_context_handle != NULL) { + X11Context *shared_context_info = (*env)->GetDirectBufferAddress(env, shared_context_handle); + shared_context = shared_context_info->context; + } + if (peer_info->glx13) { + createContextGLX13(env, peer_info, context_info, extension_flags.GLX_ARB_create_context ? attribs : NULL, shared_context); + } else { + createContextGLX(env, peer_info, context_info, shared_context); + } + context_info->extension_flags = extension_flags; + return context_handle; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nDestroy + (JNIEnv *env, jclass clazz, jobject peer_handle, jobject context_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_handle); + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + lwjgl_glXDestroyContext(peer_info->display, context_info->context); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nReleaseCurrentContext + (JNIEnv *env , jclass clazz, jobject peer_info_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + Bool result; + if (peer_info->glx13) { + result = lwjgl_glXMakeContextCurrent(peer_info->display, None, None, NULL); + } else { + result = lwjgl_glXMakeCurrent(peer_info->display, None, NULL); + } + if (!result) + throwException(env, "Could not release current context"); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nMakeCurrent + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject context_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + Bool result; + if (peer_info->glx13) { + result = lwjgl_glXMakeContextCurrent(peer_info->display, peer_info->drawable, peer_info->drawable, context_info->context); + } else { + result = lwjgl_glXMakeCurrent(peer_info->display, peer_info->drawable, context_info->context); + } + if (!result) + throwException(env, "Could not make context current"); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nIsCurrent + (JNIEnv *env, jclass clazz, jobject context_handle) { + X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); + return context_info->context == lwjgl_glXGetCurrentContext(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nSwapBuffers + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + lwjgl_glXSwapBuffers(peer_info->display, peer_info->drawable); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.h new file mode 100644 index 0000000..b4caf56 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.h @@ -0,0 +1,85 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxContextImplementation */ + +#ifndef _Included_org_lwjgl_opengl_LinuxContextImplementation +#define _Included_org_lwjgl_opengl_LinuxContextImplementation +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nCreate + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nCreate + (JNIEnv *, jclass, jobject, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: getGLXContext + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_getGLXContext + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: getDisplay + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_getDisplay + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nSwapBuffers + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nSwapBuffers + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nReleaseCurrentContext + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nReleaseCurrentContext + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nMakeCurrent + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nMakeCurrent + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nIsCurrent + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nIsCurrent + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nSetSwapInterval + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nSetSwapInterval + (JNIEnv *, jclass, jobject, jobject, jint); + +/* + * Class: org_lwjgl_opengl_LinuxContextImplementation + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nDestroy + (JNIEnv *, jclass, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxDisplayPeerInfo.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxDisplayPeerInfo.h new file mode 100644 index 0000000..3f453ff --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxDisplayPeerInfo.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxDisplayPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_LinuxDisplayPeerInfo +#define _Included_org_lwjgl_opengl_LinuxDisplayPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxDisplayPeerInfo + * Method: initDefaultPeerInfo + * Signature: (JILjava/nio/ByteBuffer;Lorg/lwjgl/opengl/PixelFormat;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDefaultPeerInfo + (JNIEnv *, jclass, jlong, jint, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxDisplayPeerInfo + * Method: initDrawable + * Signature: (JLjava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDrawable + (JNIEnv *, jclass, jlong, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxPbufferPeerInfo.h b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxPbufferPeerInfo.h new file mode 100644 index 0000000..bf21d53 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_LinuxPbufferPeerInfo.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxPbufferPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_LinuxPbufferPeerInfo +#define _Included_org_lwjgl_opengl_LinuxPbufferPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxPbufferPeerInfo + * Method: nInitHandle + * Signature: (JILjava/nio/ByteBuffer;IILorg/lwjgl/opengl/PixelFormat;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxPbufferPeerInfo_nInitHandle + (JNIEnv *, jclass, jlong, jint, jobject, jint, jint, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxPbufferPeerInfo + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxPbufferPeerInfo_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Pbuffer.c b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Pbuffer.c new file mode 100644 index 0000000..cb15439 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengl/org_lwjgl_opengl_Pbuffer.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Linux Pbuffer. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <stdlib.h> +#include "org_lwjgl_opengl_LinuxPbufferPeerInfo.h" +#include "org_lwjgl_opengl_Pbuffer.h" +#include "extgl.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetPbufferCapabilities + (JNIEnv *env, jclass clazz, jlong display, jint screen) +{ + Display *disp = (Display *)(intptr_t)display; + GLXExtensions extension_flags; + if (!extgl_InitGLX(disp, screen, &extension_flags)) + return 0; + // Only support the GLX 1.3 Pbuffers and ignore the GLX_SGIX_pbuffer extension + return extension_flags.GLX13 ? org_lwjgl_opengl_Pbuffer_PBUFFER_SUPPORTED : 0; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxPbufferPeerInfo_nInitHandle + (JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle, jint width, jint height, jobject pixel_format) { + Display *disp = (Display *)(intptr_t)display; + GLXExtensions extension_flags; + if (!extgl_InitGLX(disp, screen, &extension_flags) || !extension_flags.GLX13) { + throwException(env, "No Pbuffer support"); + return; + } + bool result = initPeerInfo(env, peer_info_handle, disp, screen, pixel_format, false, GLX_PBUFFER_BIT, false, true); + if (!result) + return; + const int buffer_attribs[] = {GLX_PBUFFER_WIDTH, width, + GLX_PBUFFER_HEIGHT, height, + GLX_PRESERVED_CONTENTS, True, + GLX_LARGEST_PBUFFER, False, + None, None}; + + X11PeerInfo *peer_info = (X11PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + GLXFBConfig *config = getFBConfigFromPeerInfo(env, peer_info); + if (config != NULL) { + GLXPbuffer buffer = lwjgl_glXCreatePbuffer(peer_info->display, *config, buffer_attribs); + XFree(config); + peer_info->drawable = buffer; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxPbufferPeerInfo_nDestroy + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + X11PeerInfo *peer_info = (X11PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + lwjgl_glXDestroyPbuffer(peer_info->display, peer_info->drawable); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengles/context.c b/etc/lwjgl-2.9.1/src/native/linux/opengles/context.c new file mode 100644 index 0000000..17d519c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengles/context.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: context.c 3116 2008-08-19 16:46:03Z spasi $ + * + * Include file to access public window features + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3116 $ + */ + +#include "context.h" + +bool initPeerInfo(JNIEnv *env, jobject peer_info_handle, Display *display, int screen) { + /* + if ((*env)->GetDirectBufferCapacity(env, peer_info_handle) < sizeof(X11PeerInfo)) { + throwException(env, "Handle too small"); + return false; + } + */ + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + + peer_info->display = display; + peer_info->screen = screen; + return true; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengles/context.h b/etc/lwjgl-2.9.1/src/native/linux/opengles/context.h new file mode 100644 index 0000000..ea5129d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengles/context.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: context.h 2985 2008-04-07 18:42:36Z matzon $ + * + * Include file to access public window features + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2985 $ + */ + +#ifndef _LWJGL_CONTEXT_H_INCLUDED_ +#define _LWJGL_CONTEXT_H_INCLUDED_ + +#include <jni.h> +#include <X11/Xlib.h> +#include "extgl.h" + +typedef struct { + Display *display; + int screen; + jlong drawable; +} X11PeerInfo; + +extern bool initPeerInfo(JNIEnv *env, jobject peer_info_handle, Display *display, int screen); + +#endif /* _LWJGL_CONTEXT_H_INCLUDED_ */ diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengles/display.c b/etc/lwjgl-2.9.1/src/native/linux/opengles/display.c new file mode 100644 index 0000000..89eda41 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengles/display.c @@ -0,0 +1,409 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: display.c 2985 2008-04-07 18:42:36Z matzon $ + * + * Linux specific library for display handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2985 $ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/extensions/xf86vmode.h> +#include <X11/extensions/Xrandr.h> +#include <X11/Xutil.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_LinuxDisplay.h" + +#define NUM_XRANDR_RETRIES 5 + +typedef struct { + int width; + int height; + int freq; + union { + int size_index; // Data for Xrandr extension + XF86VidModeModeInfo xf86vm_modeinfo; // Data for XF86VidMode extension + } mode_data; +} mode_info; + +static bool getXF86VidModeVersion(JNIEnv *env, Display *disp, int *major, int *minor) { + int event_base, error_base; + + if (!XF86VidModeQueryExtension(disp, &event_base, &error_base)) { + printfDebugJava(env, "XF86VidMode extension not available"); + return false; + } + if (!XF86VidModeQueryVersion(disp, major, minor)) { + throwException(env, "Could not query XF86VidMode version"); + return false; + } + printfDebugJava(env, "XF86VidMode extension version %i.%i", *major, *minor); + return true; +} + +static bool getXrandrVersion(JNIEnv *env, Display *disp, int *major, int *minor) { + int event_base, error_base; + + if (!XRRQueryExtension(disp, &event_base, &error_base)) { + printfDebugJava(env, "Xrandr extension not available"); + return false; + } + if (!XRRQueryVersion(disp, major, minor)) { + throwException(env, "Could not query Xrandr version"); + return false; + } + printfDebugJava(env, "Xrandr extension version %i.%i", *major, *minor); + return true; +} + +static bool isXrandrSupported(JNIEnv *env, Display *disp) { + int major, minor; + if (!getXrandrVersion(env, disp, &major, &minor)) + return false; + return major >= 1; +} + +static bool isXF86VidModeSupported(JNIEnv *env, Display *disp) { + int minor_ver, major_ver; + if (!getXF86VidModeVersion(env, disp, &major_ver, &minor_ver)) + return false; + return major_ver >= 2; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXrandrSupported(JNIEnv *env, jclass unused, jlong display) { + Display *disp = (Display *)(intptr_t)display; + jboolean result = isXrandrSupported(env, disp) ? JNI_TRUE : JNI_FALSE; + return result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXF86VidModeSupported(JNIEnv *env, jclass unused, jlong display) { + Display *disp = (Display *)(intptr_t)display; + jboolean result = isXF86VidModeSupported(env, disp) ? JNI_TRUE : JNI_FALSE; + return result; +} + +static mode_info *getXrandrDisplayModes(Display *disp, int screen, int *num_modes) { + int num_randr_sizes; + XRRScreenSize *sizes = XRRSizes(disp, screen, &num_randr_sizes); + mode_info *avail_modes = NULL; + int list_size = 0; + /* Count number of modes */ + int i; + int mode_index = 0; + for (i = 0; i < num_randr_sizes; i++) { + int num_randr_rates; + short *freqs = XRRRates(disp, screen, i, &num_randr_rates); + int j; + for (j = 0; j < num_randr_rates; j++) { + if (list_size <= mode_index) { + list_size += 1; + avail_modes = (mode_info *)realloc(avail_modes, sizeof(mode_info)*list_size); + if (avail_modes == NULL) + return NULL; + } + avail_modes[mode_index].width = sizes[i].width; + avail_modes[mode_index].height = sizes[i].height; + avail_modes[mode_index].freq = freqs[j]; + avail_modes[mode_index].mode_data.size_index = i; + mode_index++; + } + } + *num_modes = mode_index; + return avail_modes; +} + +static mode_info *getXF86VidModeDisplayModes(Display *disp, int screen, int *num_modes) { + int num_xf86vm_modes; + XF86VidModeModeInfo **avail_xf86vm_modes; + XF86VidModeGetAllModeLines(disp, screen, &num_xf86vm_modes, &avail_xf86vm_modes); + mode_info *avail_modes = (mode_info *)malloc(sizeof(mode_info)*num_xf86vm_modes); + if (avail_modes == NULL) { + XFree(avail_xf86vm_modes); + return NULL; + } + int i; + for (i = 0; i < num_xf86vm_modes; i++) { + avail_modes[i].width = avail_xf86vm_modes[i]->hdisplay; + avail_modes[i].height = avail_xf86vm_modes[i]->vdisplay; + avail_modes[i].freq = 0; // No frequency support in XF86VidMode + avail_modes[i].mode_data.xf86vm_modeinfo = *avail_xf86vm_modes[i]; + } + XFree(avail_xf86vm_modes); + *num_modes = num_xf86vm_modes; + return avail_modes; +} + +static mode_info *getDisplayModes(Display *disp, int screen, jint extension, int *num_modes) { + switch (extension) { + case org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE: + return getXF86VidModeDisplayModes(disp, screen, num_modes); + case org_lwjgl_opengl_LinuxDisplay_XRANDR: + return getXrandrDisplayModes(disp, screen, num_modes); + case org_lwjgl_opengl_LinuxDisplay_NONE: + // fall through + default: + return NULL; + } +} + +static bool setXF86VidModeMode(Display *disp, int screen, mode_info *mode) { + return True == XF86VidModeSwitchToMode(disp, screen, &mode->mode_data.xf86vm_modeinfo); +} + +/* Try to set the mode specified through XRandR. + * Return value is the Status code of the mode switch + * The timestamp parameter is filled with the latest timestamp returned from XRRConfigTimes + */ +static Status trySetXrandrMode(Display *disp, int screen, mode_info *mode, Time *timestamp) { + Status status; + Drawable root_window = RootWindow(disp, screen); + XRRScreenConfiguration *screen_configuration = XRRGetScreenInfo(disp, root_window); + Time config_time; + *timestamp = XRRConfigTimes(screen_configuration, &config_time); + Rotation current_rotation; + XRRConfigCurrentConfiguration(screen_configuration, &current_rotation); + status = XRRSetScreenConfigAndRate(disp, screen_configuration, root_window, mode->mode_data.size_index, current_rotation, mode->freq, *timestamp); + XRRFreeScreenConfigInfo(screen_configuration); + return status; +} + +static bool setXrandrMode(Display *disp, int screen, mode_info *mode) { + int iteration; + Time timestamp; + Status status = trySetXrandrMode(disp, screen, mode, &timestamp); + if (status == 0) + return true; // Success + Time new_timestamp; + for (iteration = 0; iteration < NUM_XRANDR_RETRIES; iteration++) { + status = trySetXrandrMode(disp, screen, mode, &new_timestamp); + if (status == 0) + return true; // Success + if (new_timestamp == timestamp) { + return false; // Failure, and the stamps are equal meaning that the failure is not merely transient + } + timestamp = new_timestamp; + } + return false; +} + +static bool setMode(JNIEnv *env, Display *disp, int screen, jint extension, int width, int height, int freq) { + int num_modes, i; + mode_info *avail_modes = getDisplayModes(disp, screen, extension, &num_modes); + if (avail_modes == NULL) { + printfDebugJava(env, "Could not get display modes"); + return false; + } + bool result = false; + for (i = 0; i < num_modes; ++i) { + printfDebugJava(env, "Mode %d: %dx%d @%d", i, avail_modes[i].width, avail_modes[i].height, avail_modes[i].freq); + if (avail_modes[i].width == width && avail_modes[i].height == height && avail_modes[i].freq == freq) { + switch (extension) { + case org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE: + if (!setXF86VidModeMode(disp, screen, &avail_modes[i])) { + printfDebugJava(env, "Could not switch mode"); + continue; + } + break; + case org_lwjgl_opengl_LinuxDisplay_XRANDR: + if (!setXrandrMode(disp, screen, &avail_modes[i])) { + printfDebugJava(env, "Could not switch mode"); + continue; + } + break; + case org_lwjgl_opengl_LinuxDisplay_NONE: // Should never happen, since NONE imply no available display modes + default: // Should never happen + continue; + } + result = true; + break; + } + } + free(avail_modes); + XFlush(disp); + return result; +} + +static int getGammaRampLengthOfDisplay(JNIEnv *env, Display *disp, int screen) { + int ramp_size; + if (XF86VidModeGetGammaRampSize(disp, screen, &ramp_size) == False) { + throwException(env, "XF86VidModeGetGammaRampSize call failed"); + return 0; + } + return ramp_size; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nConvertToNativeRamp(JNIEnv *env, jclass unused, jobject ramp_buffer, jint buffer_offset, jint length) { + const jfloat *ramp_ptr = (const jfloat *)(*env)->GetDirectBufferAddress(env, ramp_buffer) + buffer_offset; + jobject native_ramp = newJavaManagedByteBuffer(env, length*3*sizeof(unsigned short)); + if (native_ramp == NULL) { + throwException(env, "Failed to allocate gamma ramp buffer"); + return NULL; + } + unsigned short *native_ramp_ptr = (unsigned short *)(*env)->GetDirectBufferAddress(env, native_ramp); + int i; + for (i = 0; i < length; i++) { + float scaled_gamma = ramp_ptr[i]*0xffff; + short scaled_gamma_short = (unsigned short)roundf(scaled_gamma); + native_ramp_ptr[i] = scaled_gamma_short; + native_ramp_ptr[i + length] = scaled_gamma_short; + native_ramp_ptr[i + length*2] = scaled_gamma_short; + } + return native_ramp; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentGammaRamp(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + int ramp_size = getGammaRampLengthOfDisplay(env, disp, screen); + jobject ramp_buffer = newJavaManagedByteBuffer(env, sizeof(unsigned short)*3*ramp_size); + if (ramp_buffer == NULL) { + throwException(env, "Could not allocate gamma ramp buffer"); + return NULL; + } + unsigned short *ramp = (unsigned short *)(*env)->GetDirectBufferAddress(env, ramp_buffer); + if (!XF86VidModeGetGammaRamp(disp, screen, ramp_size, ramp, ramp + ramp_size, ramp + ramp_size*2)) { + throwException(env, "Could not get the current gamma ramp"); + return NULL; + } + return ramp_buffer; +} + +static void setGamma(JNIEnv *env, Display *disp, int screen, jobject ramp_buffer) { + if (ramp_buffer == NULL) + return; + unsigned short *ramp_ptr = (unsigned short *)(*env)->GetDirectBufferAddress(env, ramp_buffer); + jlong capacity = (*env)->GetDirectBufferCapacity(env, ramp_buffer); + int size = capacity/(sizeof(unsigned short)*3); + if (size == 0) + return; + if (XF86VidModeSetGammaRamp(disp, screen, size, ramp_ptr, ramp_ptr + size, ramp_ptr + size*2) == False) { + throwException(env, "Could not set gamma ramp."); + } +} + +static bool switchDisplayMode(JNIEnv * env, Display *disp, int screen, jint extension, jobject mode) { + if (mode == NULL) { + throwException(env, "mode must be non-null"); + return false; + } + jclass cls_displayMode = (*env)->GetObjectClass(env, mode); + jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); + jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); + jfieldID fid_freq = (*env)->GetFieldID(env, cls_displayMode, "freq", "I"); + int width = (*env)->GetIntField(env, mode, fid_width); + int height = (*env)->GetIntField(env, mode, fid_height); + int freq = (*env)->GetIntField(env, mode, fid_freq); + if (!setMode(env, disp, screen, extension, width, height, freq)) { + throwException(env, "Could not switch mode."); + return false; + } + return true; +} + +static jobjectArray getAvailableDisplayModes(JNIEnv * env, Display *disp, int screen, jint extension) { + int num_modes, i; + mode_info *avail_modes; + int bpp = XDefaultDepth(disp, screen); + avail_modes = getDisplayModes(disp, screen, extension, &num_modes); + if (avail_modes == NULL) { + printfDebugJava(env, "Could not get display modes"); + return NULL; + } + // Allocate an array of DisplayModes big enough + jclass displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + jobjectArray ret = (*env)->NewObjectArray(env, num_modes, displayModeClass, NULL); + jmethodID displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); + + for (i = 0; i < num_modes; i++) { + jobject displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, avail_modes[i].width, avail_modes[i].height, bpp, avail_modes[i].freq); + (*env)->SetObjectArrayElement(env, ret, i, displayMode); + } + free(avail_modes); + return ret; +} + +static jobject getCurrentXRandrMode(JNIEnv * env, Display *disp, int screen) { + Drawable root_window = RootWindow(disp, screen); + XRRScreenConfiguration *config = XRRGetScreenInfo(disp, root_window); + if (config == NULL) { + throwException(env, "Could not get current screen configuration."); + return NULL; + } + short rate = XRRConfigCurrentRate(config); + Rotation current_rotation; + SizeID size_index = XRRConfigCurrentConfiguration(config, &current_rotation); + int n_sizes; + XRRScreenSize *sizes = XRRConfigSizes(config, &n_sizes); + if (size_index >= n_sizes) { + throwFormattedException(env, "Xrandr current index (%d) is larger than or equals to the number of sizes (%d).", size_index, n_sizes); + XRRFreeScreenConfigInfo(config); + return NULL; + } + XRRScreenSize current_size = sizes[size_index]; + XRRFreeScreenConfigInfo(config); + int bpp = XDefaultDepth(disp, screen); + jclass displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + jmethodID displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); + jobject displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, current_size.width, current_size.height, bpp, rate); + return displayMode; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentXRandrMode(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return getCurrentXRandrMode(env, disp, screen); +} + +JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetAvailableDisplayModes(JNIEnv *env, jclass clazz, jlong display, jint screen, jint extension) { + Display *disp = (Display *)(intptr_t)display; + return getAvailableDisplayModes(env, disp, screen, extension); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSwitchDisplayMode(JNIEnv *env, jclass clazz, jlong display, jint screen, jint extension, jobject mode) { + Display *disp = (Display *)(intptr_t)display; + switchDisplayMode(env, disp, screen, extension, mode); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetGammaRampLength(JNIEnv *env, jclass clazz, jlong display_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + return (jint)getGammaRampLengthOfDisplay(env, disp, screen); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetGammaRamp(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject gamma_buffer) { + Display *disp = (Display *)(intptr_t)display; + setGamma(env, disp, screen, gamma_buffer); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengles/extgl_glx.c b/etc/lwjgl-2.9.1/src/native/linux/opengles/extgl_glx.c new file mode 100644 index 0000000..32b2ff7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengles/extgl_glx.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include <stdio.h> +#include <string.h> +#include <dlfcn.h> +#include "extgl.h" + +static void * lib_gl_handle = NULL; + +bool extgl_Open(JNIEnv *env) { + if ( lib_gl_handle != NULL ) + return true; + + lib_gl_handle = dlopen("libGLESv2.so", RTLD_LAZY | RTLD_GLOBAL); + if (lib_gl_handle == NULL) { + throwFormattedException(env, "Error loading libGLESv2.so: %s", dlerror()); + return false; + } + return true; +} + +void extgl_Close(void) { + dlclose(lib_gl_handle); + lib_gl_handle = NULL; +} + +void *extgl_GetProcAddress(const char *name) { + void *t = eglGetProcAddress(name); + + if ( t == NULL ) { + t = dlsym(lib_gl_handle, name); + if ( t == NULL ) + printfDebug("Could not locate symbol %s\n", name); + } + + //if ( t != NULL ) + //printfDebug("Located symbol %s\n", name); + + return t; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/linux/opengles/org_lwjgl_opengl_Display.c b/etc/lwjgl-2.9.1/src/native/linux/opengles/org_lwjgl_opengl_Display.c new file mode 100644 index 0000000..0132bb7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/opengles/org_lwjgl_opengl_Display.c @@ -0,0 +1,658 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_opengl_Display.c 3555 2011-07-02 20:50:27Z kappa1 $ + * + * Linux specific display functions. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 3555 $ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/extensions/xf86vmode.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <jni.h> +#include <jawt_md.h> +#include "common_tools.h" +#include "extgl.h" +#include "context.h" +#include "org_lwjgl_opengl_LinuxDisplay.h" +//#include "org_lwjgl_opengl_LinuxDisplayPeerInfo.h" +#include "org_lwjgl_LinuxSysImplementation.h" + +#define ERR_MSG_SIZE 1024 + +typedef struct { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} MotifWmHints; + +#define MWM_HINTS_DECORATIONS (1L << 1) + +static Colormap cmap; +static int current_depth; + +static Visual *current_visual; + +static bool checkXError(JNIEnv *env, Display *disp) { + XSync(disp, False); + return (*env)->ExceptionCheck(env) == JNI_FALSE; +} + +static int global_error_handler(Display *disp, XErrorEvent *error) { + JNIEnv *env = getThreadEnv(); + if (env != NULL) { + jclass org_lwjgl_LinuxDisplay_class = (*env)->FindClass(env, "org/lwjgl/opengl/LinuxDisplay"); + if (org_lwjgl_LinuxDisplay_class == NULL) { + // Don't propagate error + (*env)->ExceptionClear(env); + return 0; + } + jmethodID handler_method = (*env)->GetStaticMethodID(env, org_lwjgl_LinuxDisplay_class, "globalErrorHandler", "(JJJJJJJ)I"); + if (handler_method == NULL) + return 0; + return (*env)->CallStaticIntMethod(env, org_lwjgl_LinuxDisplay_class, handler_method, (jlong)(intptr_t)disp, (jlong)(intptr_t)error, + (jlong)(intptr_t)error->display, (jlong)error->serial, (jlong)error->error_code, (jlong)error->request_code, (jlong)error->minor_code); + } else + return 0; +} + +static jlong openDisplay(JNIEnv *env) { + Display *display_connection = XOpenDisplay(NULL); + if (display_connection == NULL) { + throwException(env, "Could not open X display connection"); + return (intptr_t)NULL; + } + return (intptr_t)display_connection; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion + (JNIEnv *env, jobject ignored) { + return org_lwjgl_LinuxSysImplementation_JNI_VERSION; +} + +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getErrorText(JNIEnv *env, jclass unused, jlong display_ptr, jlong error_code) { + Display *disp = (Display *)(intptr_t)display_ptr; + char err_msg_buffer[ERR_MSG_SIZE]; + XGetErrorText(disp, error_code, err_msg_buffer, ERR_MSG_SIZE); + err_msg_buffer[ERR_MSG_SIZE - 1] = '\0'; + return NewStringNativeWithLength(env, err_msg_buffer, strlen(err_msg_buffer)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_callErrorHandler(JNIEnv *env, jclass unused, jlong handler_ptr, jlong display_ptr, jlong event_ptr) { + XErrorHandler handler = (XErrorHandler)(intptr_t)handler_ptr; + Display *disp = (Display *)(intptr_t)display_ptr; + XErrorEvent *event = (XErrorEvent *)(intptr_t)event_ptr; + return (jint)handler(disp, event); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_setErrorHandler(JNIEnv *env, jclass unused) { + return (intptr_t)XSetErrorHandler(global_error_handler); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_resetErrorHandler(JNIEnv *env, jclass unused, jlong handler_ptr) { + XErrorHandler handler = (XErrorHandler)(intptr_t)handler_ptr; + return (intptr_t)XSetErrorHandler(handler); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSync(JNIEnv *env, jclass unused, jlong display_ptr, jboolean throw_away_events) { + Display *disp = (Display *)(intptr_t)display_ptr; + XSync(disp, throw_away_events ? True : False); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_sync(JNIEnv *env, jclass unused, jlong display_ptr, jboolean throw_away_events) { + Display *disp = (Display *)(intptr_t)display_ptr; + XSync(disp, throw_away_events ? True : False); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetDefaultScreen(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XDefaultScreen(disp); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nInternAtom(JNIEnv *env, jclass unused, jlong display_ptr, jstring atom_name_obj, jboolean only_if_exists) { + Display *disp = (Display *)(intptr_t)display_ptr; + char *atom_name = GetStringNativeChars(env, atom_name_obj); + if (atom_name == NULL) + return 0; + Atom atom = XInternAtom(disp, atom_name, only_if_exists ? True : False); + free(atom_name); + return atom; +} + +static void setDecorations(Display *disp, Window window, int dec) { + Atom motif_hints_atom = XInternAtom(disp, "_MOTIF_WM_HINTS", False); + MotifWmHints motif_hints; + motif_hints.flags = MWM_HINTS_DECORATIONS; + motif_hints.decorations = dec; + XChangeProperty(disp, window, motif_hints_atom, motif_hints_atom, 32, PropModeReplace, (unsigned char *)&motif_hints, sizeof(MotifWmHints)/sizeof(long)); +} + +static bool isLegacyFullscreen(jint window_mode) { + return window_mode == org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_LEGACY; +} + +static void setWindowTitle(Display *disp, Window window, jlong title, jint len) { + // ASCII fallback if XChangeProperty fails. + XStoreName(disp, window, (const char *)(intptr_t)title); + + // Set the UTF-8 encoded title + XChangeProperty(disp, window, + XInternAtom(disp, "_NET_WM_NAME", False), + XInternAtom(disp, "UTF8_STRING", False), + 8, PropModeReplace, (const unsigned char *)(intptr_t)title, + len); +} + +static void setClassHint(Display *disp, Window window, jlong wm_name, jlong wm_class) { + XClassHint* hint = XAllocClassHint(); + + hint->res_name = (const unsigned char *)(intptr_t)wm_name; + hint->res_class = (const unsigned char *)(intptr_t)wm_class; + + XSetClassHint(disp, window, hint); + + XFree(hint); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_openDisplay(JNIEnv *env, jclass clazz) { + return openDisplay(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_closeDisplay(JNIEnv *env, jclass clazz, jlong display) { + Display *disp = (Display *)(intptr_t)display; + XCloseDisplay(disp); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDrawable(JNIEnv *env, jclass clazz, jlong window, jobject peer_info_handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->drawable = window; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplayPeerInfo_initDefaultPeerInfo(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle) { + //Display *disp = (Display *)(intptr_t)display; + //initPeerInfo(env, peer_info_handle, disp, screen); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetTitle(JNIEnv * env, jclass clazz, jlong display, jlong window_ptr, jlong title, jint len) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + setWindowTitle(disp, window, title, len); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetClassHint(JNIEnv * env, jclass clazz, jlong display, jlong window_ptr, jlong wm_name, jlong wm_class) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + setClassHint(disp, window, wm_name, wm_class); +} + +static void destroyWindow(JNIEnv *env, Display *disp, Window window) { + XDestroyWindow(disp, window); + XFreeColormap(disp, cmap); +} + +static bool isNetWMFullscreenSupported(JNIEnv *env, Display *disp, int screen) { + unsigned long nitems; + Atom actual_type; + int actual_format; + unsigned long bytes_after; + Atom *supported_list; + Atom netwm_supported_atom = XInternAtom(disp, "_NET_SUPPORTED", False); + int result = XGetWindowProperty(disp, RootWindow(disp, screen), netwm_supported_atom, 0, 10000, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, (void *)&supported_list); + if (result != Success) { + throwException(env, "Unable to query _NET_SUPPORTED window property"); + return false; + } + Atom fullscreen_atom = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False); + bool supported = false; + unsigned long i; + for (i = 0; i < nitems; i++) { + if (fullscreen_atom == supported_list[i]) { + supported = true; + break; + } + } + XFree(supported_list); + return supported; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsNetWMFullscreenSupported(JNIEnv *env, jclass unused, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return isNetWMFullscreenSupported(env, disp, screen) ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nReshape(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jint x, jint y, jint width, jint height) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XMoveWindow(disp, window, x, y); + XResizeWindow(disp, window, width, height); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_synchronize(JNIEnv *env, jclass clazz, jlong display, jboolean synchronize) { + Display *disp = (Display *)(intptr_t)display; + XSynchronize(disp, synchronize ? True : False); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getRootWindow(JNIEnv *env, jclass clazz, jlong display, jint screen) { + Display *disp = (Display *)(intptr_t)display; + return RootWindow(disp, screen); +} + +static Window getCurrentWindow(JNIEnv *env, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + + Window parent = (Window)window_ptr; + Window win, root; + + Window *children; + unsigned int nchildren; + + do { + win = parent; + + if (XQueryTree(disp, win, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return 0; + } + + if (children != NULL) XFree(children); + } while (parent != root); + + return win; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetX(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = getCurrentWindow(env, display_ptr, window_ptr); + + XWindowAttributes win_attribs; + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.x; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetY(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = getCurrentWindow(env, display_ptr, window_ptr); + + XWindowAttributes win_attribs; + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.y; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetWidth(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.width; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetHeight(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + + return win_attribs.height; +} + +static void updateWindowHints(JNIEnv *env, Display *disp, Window window) { + XWMHints* win_hints = XAllocWMHints(); + if (win_hints == NULL) { + throwException(env, "XAllocWMHints failed"); + return; + } + + win_hints->flags = InputHint; + win_hints->input = True; + + XSetWMHints(disp, window, win_hints); + XFree(win_hints); + XFlush(disp); +} + +static void updateWindowBounds(Display *disp, Window win, int x, int y, int width, int height, jboolean position, jboolean resizable) { + XSizeHints *window_hints = XAllocSizeHints(); + + if (position) { + window_hints->flags |= PPosition; + window_hints->x = x; + window_hints->y = y; + } + + if (!resizable) { + window_hints->flags |= PMinSize | PMaxSize; + window_hints->min_width = width; + window_hints->max_width = width; + window_hints->min_height = height; + window_hints->max_height = height; + } + + XSetWMNormalHints(disp, win, window_hints); + XFree(window_hints); +} + +static Window createWindow(JNIEnv* env, Display *disp, int screen, jint window_mode, X11PeerInfo *peer_info, int x, int y, int width, int height, jboolean undecorated, long parent_handle, jboolean resizable) { + Window parent = (Window)parent_handle; + Window win; + XSetWindowAttributes attribs; + unsigned int attribmask; + + XVisualInfo vis_info; + if ( !XMatchVisualInfo(disp, screen, DefaultDepth(disp, screen), TrueColor, &vis_info) ) { + throwException(env, "Failed to acquire X visual."); + return false; + } + + cmap = XCreateColormap(disp, parent, vis_info.visual, AllocNone); + if (!checkXError(env, disp)) { + return false; + } + attribs.colormap = cmap; + attribs.border_pixel = 0; + attribs.event_mask = ExposureMask | FocusChangeMask | VisibilityChangeMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; + attribmask = CWColormap | CWEventMask | CWBorderPixel | CWBackPixel; + if (isLegacyFullscreen(window_mode)) { + attribmask |= CWOverrideRedirect; + attribs.override_redirect = True; + } + win = XCreateWindow(disp, parent, x, y, width, height, 0, vis_info.depth, InputOutput, vis_info.visual, attribmask, &attribs); + + current_depth = vis_info.depth; + current_visual = vis_info.visual; + + if (!checkXError(env, disp)) { + XFreeColormap(disp, cmap); + return false; + } + if (undecorated) { + // Use Motif decoration hint property and hope the window manager respects them + setDecorations(disp, win, 0); + } + + if (RootWindow(disp, screen) == parent_handle) { // only set hints when Display.setParent isn't used + updateWindowBounds(disp, win, x, y, width, height, JNI_TRUE, resizable); + updateWindowHints(env, disp, win); + } + +#define NUM_ATOMS 1 + Atom protocol_atoms[NUM_ATOMS] = {XInternAtom(disp, "WM_DELETE_WINDOW", False)/*, XInternAtom(disp, "WM_TAKE_FOCUS", False)*/}; + XSetWMProtocols(disp, win, protocol_atoms, NUM_ATOMS); + if (window_mode == org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_NETWM) { + Atom fullscreen_atom = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False); + XChangeProperty(disp, win, XInternAtom(disp, "_NET_WM_STATE", False), + XInternAtom(disp, "ATOM", False), 32, PropModeReplace, (const unsigned char*)&fullscreen_atom, 1); + } + if (!checkXError(env, disp)) { + destroyWindow(env, disp, win); + return 0; + } + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_reparentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr, jlong parent_ptr, jint x, jint y) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window parent = (Window)parent_ptr; + XReparentWindow(disp, window, parent, x, y); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_mapRaised(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XMapRaised(disp, window); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getParentWindow(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window root, parent; + Window *children; + unsigned int nchildren; + if (XQueryTree(disp, window, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return None; + } + if (children != NULL) + XFree(children); + return parent; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getChildCount(JNIEnv *env, jclass unused, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Window root, parent; + Window *children; + unsigned int nchildren; + if (XQueryTree(disp, window, &root, &parent, &children, &nchildren) == 0) { + throwException(env, "XQueryTree failed"); + return None; + } + if (children != NULL) + XFree(children); + + return nchildren; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_hasProperty(JNIEnv *env, jclass unusued, jlong display, jlong window_ptr, jlong property_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + Atom property = (Atom)property_ptr; + int num_props; + Atom *properties = XListProperties(disp, window, &num_props); + if (properties == NULL) + return JNI_FALSE; + jboolean result = JNI_FALSE; + for (int i = 0; i < num_props; i++) { + if (properties[i] == property) { + result = JNI_TRUE; + break; + } + } + XFree(properties); + return result; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetInputFocus(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + int revert_mode; + Window win; + XGetInputFocus(disp, &win, &revert_mode); + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetInputFocus(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jlong time) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + XSetInputFocus(disp, window, RevertToParent, time); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateWindow(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle, jobject mode, jint window_mode, jint x, jint y, jboolean undecorated, jlong parent_handle, jboolean resizable) { + Display *disp = (Display *)(intptr_t)display; + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); + + jclass cls_displayMode = (*env)->GetObjectClass(env, mode); + + jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); + jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); + + int width = (*env)->GetIntField(env, mode, fid_width); + int height = (*env)->GetIntField(env, mode, fid_height); + + Window win = createWindow(env, disp, screen, window_mode, peer_info, x, y, width, height, undecorated, parent_handle, resizable); + + if ((*env)->ExceptionOccurred(env)) + return 0; + + if (!checkXError(env, disp)) + destroyWindow(env, disp, win); + + return win; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowSize(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jint width, jint height, jboolean resizable) { + Display *disp = (Display *)(intptr_t)display; + Window win = (Window)window_ptr; + updateWindowBounds(disp, win, 0, 0, width, height, JNI_FALSE, resizable); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyWindow(JNIEnv *env, jclass clazz, jlong display, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + destroyWindow(env, disp, window); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nLockAWT(JNIEnv *env, jclass clazz) { + JAWT jawt; + jawt.version = JAWT_VERSION_1_4; + if (JAWT_GetAWT(env, &jawt) != JNI_TRUE) { + throwException(env, "GetAWT failed"); + return; + } + jawt.Lock(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUnlockAWT(JNIEnv *env, jclass clazz) { + JAWT jawt; + jawt.version = JAWT_VERSION_1_4; + if (JAWT_GetAWT(env, &jawt) != JNI_TRUE) { + throwException(env, "GetAWT failed"); + return; + } + jawt.Unlock(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowIcon + (JNIEnv *env, jclass clazz, jlong display, jlong window_ptr, jobject icons_buffer, jint icons_buffer_size) +{ + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + const unsigned char *icons_char_buffer = (const unsigned char *)(*env)->GetDirectBufferAddress(env, icons_buffer); + + int length = icons_buffer_size/4; + unsigned long icons_long_buffer[length]; + int i = 0; + + // copy byte array to long array + for (i = 0; i < icons_buffer_size; i += 4) { + unsigned long argb = (icons_char_buffer[i] << 24) | + (icons_char_buffer[i+1] << 16) | + (icons_char_buffer[i+2] << 8) | + (icons_char_buffer[i+3]); + icons_long_buffer[i/4] = argb; + } + + XChangeProperty(disp, window, + XInternAtom(disp, "_NET_WM_ICON", False), + XInternAtom(disp, "CARDINAL", False), + 32, PropModeReplace, (const unsigned char*) icons_long_buffer, length); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabKeyboard(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XUngrabKeyboard(disp, CurrentTime); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabKeyboard(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + return XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabPointer(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jlong cursor_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + Cursor cursor = (Cursor)cursor_ptr; + int grab_mask = PointerMotionMask | ButtonPressMask | ButtonReleaseMask; + return XGrabPointer(disp, win, False, grab_mask, GrabModeAsync, GrabModeAsync, win, cursor, CurrentTime); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetViewPort(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWindowAttributes win_attribs; + + XGetWindowAttributes(disp, win, &win_attribs); + XF86VidModeSetViewPort(disp, screen, win_attribs.x, win_attribs.y); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabPointer(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XUngrabPointer(disp, CurrentTime); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDefineCursor(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jlong cursor_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + Cursor cursor = (Cursor)cursor_ptr; + XDefineCursor(disp, win, cursor); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateBlankCursor(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + unsigned int best_width, best_height; + if (XQueryBestCursor(disp, win, 1, 1, &best_width, &best_height) == 0) { + throwException(env, "Could not query best cursor size"); + return false; + } + Pixmap mask = XCreatePixmap(disp, win, best_width, best_height, 1); + XGCValues gc_values; + gc_values.foreground = 0; + GC gc = XCreateGC(disp, mask, GCForeground, &gc_values); + XFillRectangle(disp, mask, gc, 0, 0, best_width, best_height); + XFreeGC(disp, gc); + XColor dummy_color; + Cursor cursor = XCreatePixmapCursor(disp, mask, mask, &dummy_color, &dummy_color, 0, 0); + XFreePixmap(disp, mask); + return cursor; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIconifyWindow(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint screen) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XIconifyWindow(disp, win, screen); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_LinuxSysImplementation.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_LinuxSysImplementation.h new file mode 100644 index 0000000..b268012 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_LinuxSysImplementation.h @@ -0,0 +1,15 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_LinuxSysImplementation */ + +#ifndef _Included_org_lwjgl_LinuxSysImplementation +#define _Included_org_lwjgl_LinuxSysImplementation +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_LinuxSysImplementation_JNI_VERSION +#define org_lwjgl_LinuxSysImplementation_JNI_VERSION 19L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_input_Cursor.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_input_Cursor.c new file mode 100644 index 0000000..8fedeff --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_input_Cursor.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Linux cursor handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xcursor/Xcursor.h> +#include "org_lwjgl_input_Cursor.h" +#include "org_lwjgl_opengl_LinuxDisplay.h" +#include "common_tools.h" + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetNativeCursorCapabilities + (JNIEnv *env, jclass clazz, jlong display) { + Display *disp = (Display *)(intptr_t)display; + int caps = 0; + XcursorBool argb_supported = XcursorSupportsARGB(disp); + XcursorBool anim_supported = XcursorSupportsAnim(disp); + if (argb_supported) + caps |= org_lwjgl_input_Cursor_CURSOR_8_BIT_ALPHA | org_lwjgl_input_Cursor_CURSOR_ONE_BIT_TRANSPARENCY; + if (anim_supported) + caps |= org_lwjgl_input_Cursor_CURSOR_ANIMATION; + return caps; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetMinCursorSize + (JNIEnv *env, jclass clazz, jlong display, jlong window_ptr) +{ + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + unsigned int width_return = 0; + unsigned int height_return = 0; + XQueryBestCursor(disp, window, 1, 1, &width_return, &height_return); + return width_return > height_return ? width_return : height_return; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetMaxCursorSize + (JNIEnv *env, jclass clazz, jlong display, jlong window_ptr) +{ + Display *disp = (Display *)(intptr_t)display; + Window window = (Window)window_ptr; + unsigned int width_return = 0; + unsigned int height_return = 0; + XQueryBestCursor(disp, window, 0xffffffff, 0xffffffff, &width_return, &height_return); + return width_return > height_return ? height_return : width_return; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor + (JNIEnv *env, jclass clazz, jlong display, jint width, jint height, jint x_hotspot, jint y_hotspot, jint num_images, jobject image_buffer, jint images_offset, jobject delay_buffer, jint delays_offset) +{ + Display *disp = (Display *)(intptr_t)display; + const int *delays = NULL; + if (delay_buffer != NULL) + delays = (const int *)(*env)->GetDirectBufferAddress(env, delay_buffer) + delays_offset; + XcursorPixel *pixels = (XcursorPixel *)(*env)->GetDirectBufferAddress(env, image_buffer) + images_offset; + int stride = width*height; + XcursorImages *cursor_images = XcursorImagesCreate(num_images); + if (cursor_images == NULL) { + throwException(env, "Could not allocate cursor."); + return None; + } + cursor_images->nimage = num_images; + int i; + for (i = 0; i < num_images; i++) { + XcursorImage *cursor_image = XcursorImageCreate(width, height); + cursor_image->xhot = x_hotspot; + cursor_image->yhot = y_hotspot; + cursor_image->pixels = &(pixels[stride*i]); + if (num_images > 1) + cursor_image->delay = delays[i]; + cursor_images->images[i] = cursor_image; + } + Cursor cursor = XcursorImagesLoadCursor(disp, cursor_images); + XcursorImagesDestroy(cursor_images); + return cursor; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyCursor + (JNIEnv *env, jclass clazz, jlong display, jlong cursor_ptr) +{ + Display *disp = (Display *)(intptr_t)display; + Cursor cursor = (Cursor)cursor_ptr; + XFreeCursor(disp, cursor); +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_Display.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_Display.c new file mode 100644 index 0000000..e69de29 diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay.h new file mode 100644 index 0000000..d77d776 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay.h @@ -0,0 +1,495 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxDisplay */ + +#ifndef _Included_org_lwjgl_opengl_LinuxDisplay +#define _Included_org_lwjgl_opengl_LinuxDisplay +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_LinuxDisplay_CurrentTime +#define org_lwjgl_opengl_LinuxDisplay_CurrentTime 0L +#undef org_lwjgl_opengl_LinuxDisplay_GrabSuccess +#define org_lwjgl_opengl_LinuxDisplay_GrabSuccess 0L +#undef org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeOff +#define org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeOff 0L +#undef org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeOn +#define org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeOn 1L +#undef org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeDefault +#define org_lwjgl_opengl_LinuxDisplay_AutoRepeatModeDefault 2L +#undef org_lwjgl_opengl_LinuxDisplay_None +#define org_lwjgl_opengl_LinuxDisplay_None 0L +#undef org_lwjgl_opengl_LinuxDisplay_KeyPressMask +#define org_lwjgl_opengl_LinuxDisplay_KeyPressMask 1L +#undef org_lwjgl_opengl_LinuxDisplay_KeyReleaseMask +#define org_lwjgl_opengl_LinuxDisplay_KeyReleaseMask 2L +#undef org_lwjgl_opengl_LinuxDisplay_ButtonPressMask +#define org_lwjgl_opengl_LinuxDisplay_ButtonPressMask 4L +#undef org_lwjgl_opengl_LinuxDisplay_ButtonReleaseMask +#define org_lwjgl_opengl_LinuxDisplay_ButtonReleaseMask 8L +#undef org_lwjgl_opengl_LinuxDisplay_NotifyAncestor +#define org_lwjgl_opengl_LinuxDisplay_NotifyAncestor 0L +#undef org_lwjgl_opengl_LinuxDisplay_NotifyNonlinear +#define org_lwjgl_opengl_LinuxDisplay_NotifyNonlinear 3L +#undef org_lwjgl_opengl_LinuxDisplay_NotifyPointer +#define org_lwjgl_opengl_LinuxDisplay_NotifyPointer 5L +#undef org_lwjgl_opengl_LinuxDisplay_NotifyPointerRoot +#define org_lwjgl_opengl_LinuxDisplay_NotifyPointerRoot 6L +#undef org_lwjgl_opengl_LinuxDisplay_NotifyDetailNone +#define org_lwjgl_opengl_LinuxDisplay_NotifyDetailNone 7L +#undef org_lwjgl_opengl_LinuxDisplay_SetModeInsert +#define org_lwjgl_opengl_LinuxDisplay_SetModeInsert 0L +#undef org_lwjgl_opengl_LinuxDisplay_SaveSetRoot +#define org_lwjgl_opengl_LinuxDisplay_SaveSetRoot 1L +#undef org_lwjgl_opengl_LinuxDisplay_SaveSetUnmap +#define org_lwjgl_opengl_LinuxDisplay_SaveSetUnmap 1L +#undef org_lwjgl_opengl_LinuxDisplay_X_SetInputFocus +#define org_lwjgl_opengl_LinuxDisplay_X_SetInputFocus 42L +#undef org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_LEGACY +#define org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_LEGACY 1L +#undef org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_NETWM +#define org_lwjgl_opengl_LinuxDisplay_FULLSCREEN_NETWM 2L +#undef org_lwjgl_opengl_LinuxDisplay_WINDOWED +#define org_lwjgl_opengl_LinuxDisplay_WINDOWED 3L +#undef org_lwjgl_opengl_LinuxDisplay_XRANDR +#define org_lwjgl_opengl_LinuxDisplay_XRANDR 10L +#undef org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE +#define org_lwjgl_opengl_LinuxDisplay_XF86VIDMODE 11L +#undef org_lwjgl_opengl_LinuxDisplay_NONE +#define org_lwjgl_opengl_LinuxDisplay_NONE 12L +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetCurrentGammaRamp + * Signature: (JI)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentGammaRamp + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nIsXrandrSupported + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXrandrSupported + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nIsXF86VidModeSupported + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsXF86VidModeSupported + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nIsNetWMFullscreenSupported + * Signature: (JI)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIsNetWMFullscreenSupported + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nLockAWT + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nLockAWT + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nUnlockAWT + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUnlockAWT + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: callErrorHandler + * Signature: (JJJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_callErrorHandler + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: setErrorHandler + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_setErrorHandler + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: resetErrorHandler + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_resetErrorHandler + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: synchronize + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_synchronize + (JNIEnv *, jclass, jlong, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: getErrorText + * Signature: (JJ)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getErrorText + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: openDisplay + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_openDisplay + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: closeDisplay + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_closeDisplay + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetDefaultScreen + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetDefaultScreen + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nUngrabKeyboard + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabKeyboard + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGrabKeyboard + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabKeyboard + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGrabPointer + * Signature: (JJJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGrabPointer + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetViewPort + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetViewPort + (JNIEnv *, jclass, jlong, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nUngrabPointer + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nUngrabPointer + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nDefineCursor + * Signature: (JJJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDefineCursor + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nCreateWindow + * Signature: (JILjava/nio/ByteBuffer;Lorg/lwjgl/opengl/DisplayMode;IIIZJZ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateWindow + (JNIEnv *, jclass, jlong, jint, jobject, jobject, jint, jint, jint, jboolean, jlong, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: getRootWindow + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getRootWindow + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: hasProperty + * Signature: (JJJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxDisplay_hasProperty + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: getParentWindow + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getParentWindow + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: getChildCount + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getChildCount + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: mapRaised + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_mapRaised + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: reparentWindow + * Signature: (JJJII)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_reparentWindow + (JNIEnv *, jclass, jlong, jlong, jlong, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetInputFocus + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetInputFocus + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetInputFocus + * Signature: (JJJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetInputFocus + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetWindowSize + * Signature: (JJIIZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowSize + (JNIEnv *, jclass, jlong, jlong, jint, jint, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetX + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetX + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetY + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetY + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetWidth + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetWidth + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetHeight + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetHeight + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nDestroyWindow + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyWindow + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSwitchDisplayMode + * Signature: (JIILorg/lwjgl/opengl/DisplayMode;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSwitchDisplayMode + (JNIEnv *, jclass, jlong, jint, jint, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nInternAtom + * Signature: (JLjava/lang/String;Z)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nInternAtom + (JNIEnv *, jclass, jlong, jstring, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetGammaRampLength + * Signature: (JI)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetGammaRampLength + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetGammaRamp + * Signature: (JILjava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetGammaRamp + (JNIEnv *, jclass, jlong, jint, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nConvertToNativeRamp + * Signature: (Ljava/nio/FloatBuffer;II)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nConvertToNativeRamp + (JNIEnv *, jclass, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetCurrentXRandrMode + * Signature: (JI)Lorg/lwjgl/opengl/DisplayMode; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetCurrentXRandrMode + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetTitle + * Signature: (JJJI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetTitle + (JNIEnv *, jclass, jlong, jlong, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nReshape + * Signature: (JJIIII)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nReshape + (JNIEnv *, jclass, jlong, jlong, jint, jint, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetAvailableDisplayModes + * Signature: (JII)[Lorg/lwjgl/opengl/DisplayMode; + */ +JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetAvailableDisplayModes + (JNIEnv *, jclass, jlong, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSync + * Signature: (JZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSync + (JNIEnv *, jclass, jlong, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nIconifyWindow + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIconifyWindow + (JNIEnv *, jclass, jlong, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetNativeCursorCapabilities + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetNativeCursorCapabilities + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetMinCursorSize + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetMinCursorSize + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetMaxCursorSize + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetMaxCursorSize + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nCreateCursor + * Signature: (JIIIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateCursor + (JNIEnv *, jclass, jlong, jint, jint, jint, jint, jint, jobject, jint, jobject, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nCreateBlankCursor + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateBlankCursor + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nDestroyCursor + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nDestroyCursor + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nGetPbufferCapabilities + * Signature: (JI)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nGetPbufferCapabilities + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxDisplay + * Method: nSetWindowIcon + * Signature: (JJLjava/nio/ByteBuffer;ILjava/nio/ByteBuffer;III)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetWindowIcon + (JNIEnv *, jclass, jlong, jlong, jobject, jint, jobject, jint, jint, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz.h new file mode 100644 index 0000000..e8601c6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxDisplay_Compiz */ + +#ifndef _Included_org_lwjgl_opengl_LinuxDisplay_Compiz +#define _Included_org_lwjgl_opengl_LinuxDisplay_Compiz +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz_Provider.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz_Provider.h new file mode 100644 index 0000000..4b26cc9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxDisplay_Compiz_Provider.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxDisplay_Compiz_Provider */ + +#ifndef _Included_org_lwjgl_opengl_LinuxDisplay_Compiz_Provider +#define _Included_org_lwjgl_opengl_LinuxDisplay_Compiz_Provider +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.c new file mode 100644 index 0000000..1498450 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_opengl_LinuxEvent.c 2598 2006-10-24 08:33:09Z elias_naur $ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2598 $ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <jni.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_LinuxEvent.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxEvent_createEventBuffer(JNIEnv *env, jclass unused) { + return newJavaManagedByteBuffer(env, sizeof(XEvent)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_getPending(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + return XPending(disp); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nSetWindow(JNIEnv *env, jclass unused, jobject event_buffer, jlong window_ptr) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + Window window = (Window)window_ptr; + event->xany.window = window; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nSendEvent(JNIEnv *env, jclass unused, jobject event_buffer, jlong display_ptr, jlong window_ptr, jboolean propagate, jlong eventmask) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + Display *disp = (Display *)(intptr_t)display_ptr; + Window window = (Window)window_ptr; + XSendEvent(disp, window, propagate == JNI_TRUE ? True : False, eventmask, event); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetFocusDetail(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xfocus.detail; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetFocusMode(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xfocus.mode; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxEvent_nFilterEvent(JNIEnv *env, jclass unused, jobject event_buffer, jlong window_ptr) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + Window window = (Window)window_ptr; + return XFilterEvent(event, window) == True ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nNextEvent(JNIEnv *env, jclass unused, jlong display_ptr, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + Display *disp = (Display *)(intptr_t)display_ptr; + XNextEvent(disp, event); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetType(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->type; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetWindow(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xany.window; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientMessageType(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xclient.message_type; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientData(JNIEnv *env, jclass unused, jobject event_buffer, jint index) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xclient.data.l[index]; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientFormat(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xclient.format; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonTime(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.time; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonState(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.state; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonType(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.type; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonButton(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.button; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonRoot(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.root; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonXRoot(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.x_root; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonYRoot(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.y_root; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonX(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.x; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonY(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xbutton.y; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyAddress(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + XKeyEvent *key_event = &(event->xkey); + return (jlong)(intptr_t)key_event; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyTime(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xkey.time; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyType(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xkey.type; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyKeyCode(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xkey.keycode; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyState(JNIEnv *env, jclass unused, jobject event_buffer) { + XEvent *event = (XEvent *)(*env)->GetDirectBufferAddress(env, event_buffer); + return event->xkey.state; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.h new file mode 100644 index 0000000..a967cc5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxEvent.h @@ -0,0 +1,257 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxEvent */ + +#ifndef _Included_org_lwjgl_opengl_LinuxEvent +#define _Included_org_lwjgl_opengl_LinuxEvent +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_LinuxEvent_FocusIn +#define org_lwjgl_opengl_LinuxEvent_FocusIn 9L +#undef org_lwjgl_opengl_LinuxEvent_FocusOut +#define org_lwjgl_opengl_LinuxEvent_FocusOut 10L +#undef org_lwjgl_opengl_LinuxEvent_KeyPress +#define org_lwjgl_opengl_LinuxEvent_KeyPress 2L +#undef org_lwjgl_opengl_LinuxEvent_KeyRelease +#define org_lwjgl_opengl_LinuxEvent_KeyRelease 3L +#undef org_lwjgl_opengl_LinuxEvent_ButtonPress +#define org_lwjgl_opengl_LinuxEvent_ButtonPress 4L +#undef org_lwjgl_opengl_LinuxEvent_ButtonRelease +#define org_lwjgl_opengl_LinuxEvent_ButtonRelease 5L +#undef org_lwjgl_opengl_LinuxEvent_MotionNotify +#define org_lwjgl_opengl_LinuxEvent_MotionNotify 6L +#undef org_lwjgl_opengl_LinuxEvent_EnterNotify +#define org_lwjgl_opengl_LinuxEvent_EnterNotify 7L +#undef org_lwjgl_opengl_LinuxEvent_LeaveNotify +#define org_lwjgl_opengl_LinuxEvent_LeaveNotify 8L +#undef org_lwjgl_opengl_LinuxEvent_UnmapNotify +#define org_lwjgl_opengl_LinuxEvent_UnmapNotify 18L +#undef org_lwjgl_opengl_LinuxEvent_MapNotify +#define org_lwjgl_opengl_LinuxEvent_MapNotify 19L +#undef org_lwjgl_opengl_LinuxEvent_Expose +#define org_lwjgl_opengl_LinuxEvent_Expose 12L +#undef org_lwjgl_opengl_LinuxEvent_ConfigureNotify +#define org_lwjgl_opengl_LinuxEvent_ConfigureNotify 22L +#undef org_lwjgl_opengl_LinuxEvent_ClientMessage +#define org_lwjgl_opengl_LinuxEvent_ClientMessage 33L +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: createEventBuffer + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxEvent_createEventBuffer + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: getPending + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_getPending + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nSendEvent + * Signature: (Ljava/nio/ByteBuffer;JJZJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nSendEvent + (JNIEnv *, jclass, jobject, jlong, jlong, jboolean, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nFilterEvent + * Signature: (Ljava/nio/ByteBuffer;J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxEvent_nFilterEvent + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nNextEvent + * Signature: (JLjava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nNextEvent + (JNIEnv *, jclass, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetType + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetType + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetWindow + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetWindow + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nSetWindow + * Signature: (Ljava/nio/ByteBuffer;J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxEvent_nSetWindow + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetFocusMode + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetFocusMode + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetFocusDetail + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetFocusDetail + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetClientMessageType + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientMessageType + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetClientData + * Signature: (Ljava/nio/ByteBuffer;I)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientData + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetClientFormat + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetClientFormat + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonTime + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonTime + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonState + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonState + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonType + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonType + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonButton + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonButton + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonRoot + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonRoot + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonXRoot + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonXRoot + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonYRoot + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonYRoot + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonX + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonX + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetButtonY + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetButtonY + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetKeyAddress + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyAddress + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetKeyTime + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyTime + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetKeyType + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyType + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetKeyKeyCode + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyKeyCode + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxEvent + * Method: nGetKeyState + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxEvent_nGetKeyState + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c new file mode 100644 index 0000000..268127c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_input_Keyboard.c 2399 2006-06-30 19:28:00Z elias_naur $ + * + * Linux keyboard handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2399 $ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/XKBlib.h> +#include <X11/Xutil.h> +#include <X11/keysym.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_LinuxKeyboard.h" + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_getModifierMapping(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + XModifierKeymap *modifier_map = XGetModifierMapping(disp); + return (intptr_t)modifier_map; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_nSetDetectableKeyRepeat(JNIEnv *env, jclass unused, jlong display_ptr, jboolean set_enabled) { + Display *disp = (Display *)(intptr_t)display_ptr; + Bool enabled = set_enabled == JNI_TRUE ? True : False; + Bool result = XkbSetDetectableAutoRepeat(disp, enabled, NULL); + return result == enabled ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_freeModifierMapping(JNIEnv *env, jclass unused, jlong mapping_ptr) { + XModifierKeymap *modifier_map = (XModifierKeymap *)(intptr_t)mapping_ptr; + XFreeModifiermap(modifier_map); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_getMaxKeyPerMod(JNIEnv *env, jclass unsused, jlong mapping_ptr) { + XModifierKeymap *modifier_map = (XModifierKeymap *)(intptr_t)mapping_ptr; + return modifier_map->max_keypermod; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupModifierMap(JNIEnv *env, jclass unused, jlong mapping_ptr, jint index) { + XModifierKeymap *modifier_map = (XModifierKeymap *)(intptr_t)mapping_ptr; + KeyCode key_code = modifier_map->modifiermap[index]; + return key_code; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_keycodeToKeySym(JNIEnv *env, jclass unused, jlong display_ptr, jint key_code) { + Display *disp = (Display *)(intptr_t)display_ptr; + KeySym key_sym = XKeycodeToKeysym(disp, key_code, 0); + return key_sym; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_openIM(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + XSetLocaleModifiers ("@im=none"); + XIM xim = XOpenIM(disp, NULL, NULL, NULL); + return (intptr_t)xim; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_createIC(JNIEnv *env, jclass unused, jlong xim_ptr, jlong window_ptr) { + Window win = (Window)window_ptr; + XIM xim = (XIM)(intptr_t)xim_ptr; + XIC xic = XCreateIC(xim, XNClientWindow, win, XNFocusWindow, win, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, NULL); + return (intptr_t)xic; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_setupIMEventMask(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jlong xic_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XIC xic = (XIC)(intptr_t)xic_ptr; + long im_event_mask; + XWindowAttributes win_attributes; + + XGetWindowAttributes(disp, win, &win_attributes); + XGetICValues(xic, XNFilterEvents, &im_event_mask, NULL); + XSelectInput(disp, win, win_attributes.your_event_mask | im_event_mask); + XSetICFocus(xic); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_destroyIC(JNIEnv *env, jclass unused, jlong xic_ptr) { + XIC xic = (XIC)(intptr_t)xic_ptr; + XDestroyIC(xic); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_closeIM(JNIEnv *env, jclass unused, jlong xim_ptr) { + XIM xim = (XIM)(intptr_t)xim_ptr; + XCloseIM(xim); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupKeysym(JNIEnv *env, jclass unused, jlong event_ptr, jint index) { + XKeyEvent *event = (XKeyEvent *)(intptr_t)event_ptr; + return XLookupKeysym(event, index); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_toUpper(JNIEnv *env, jclass unused, jlong keysym) { + KeySym lower_case, upper_case; + XConvertCase(keysym, &lower_case, &upper_case); + return upper_case; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupString(JNIEnv *env, jclass unused, jlong event_ptr, jobject buffer_obj, jobject compose_status_obj) { + XKeyEvent *event = (XKeyEvent *)(intptr_t)event_ptr; + char *buffer = (char *)(*env)->GetDirectBufferAddress(env, buffer_obj); + int capacity = (*env)->GetDirectBufferCapacity(env, buffer_obj); + XComposeStatus *status = (XComposeStatus *)(*env)->GetDirectBufferAddress(env, compose_status_obj); + return XLookupString(event, buffer, capacity, NULL, status); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_allocateComposeStatus(JNIEnv *env, jclass unused) { + return newJavaManagedByteBuffer(env, sizeof(XComposeStatus)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_utf8LookupString(JNIEnv *env, jclass unused, jlong xic_ptr, jlong event_ptr, jobject buffer_obj, jint buffer_position, jint buffer_size) { + XIC xic = (XIC)(intptr_t)xic_ptr; + XKeyEvent *event = (XKeyEvent *)(intptr_t)event_ptr; + char *buffer = buffer_position + (char *)(*env)->GetDirectBufferAddress(env, buffer_obj); + Status status; + size_t num_bytes = Xutf8LookupString(xic, event, buffer, buffer_size, NULL, &status); + positionBuffer(env, buffer_obj, num_bytes); + return status; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.h new file mode 100644 index 0000000..0c638c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.h @@ -0,0 +1,155 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxKeyboard */ + +#ifndef _Included_org_lwjgl_opengl_LinuxKeyboard +#define _Included_org_lwjgl_opengl_LinuxKeyboard +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_LinuxKeyboard_LockMapIndex +#define org_lwjgl_opengl_LinuxKeyboard_LockMapIndex 1L +#undef org_lwjgl_opengl_LinuxKeyboard_NoSymbol +#define org_lwjgl_opengl_LinuxKeyboard_NoSymbol 0i64 +#undef org_lwjgl_opengl_LinuxKeyboard_ShiftMask +#define org_lwjgl_opengl_LinuxKeyboard_ShiftMask 1i64 +#undef org_lwjgl_opengl_LinuxKeyboard_LockMask +#define org_lwjgl_opengl_LinuxKeyboard_LockMask 2i64 +#undef org_lwjgl_opengl_LinuxKeyboard_XLookupChars +#define org_lwjgl_opengl_LinuxKeyboard_XLookupChars 2L +#undef org_lwjgl_opengl_LinuxKeyboard_XLookupBoth +#define org_lwjgl_opengl_LinuxKeyboard_XLookupBoth 4L +#undef org_lwjgl_opengl_LinuxKeyboard_KEYBOARD_BUFFER_SIZE +#define org_lwjgl_opengl_LinuxKeyboard_KEYBOARD_BUFFER_SIZE 50L +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: getModifierMapping + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_getModifierMapping + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: freeModifierMapping + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_freeModifierMapping + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: getMaxKeyPerMod + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_getMaxKeyPerMod + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: lookupModifierMap + * Signature: (JI)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupModifierMap + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: keycodeToKeySym + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_keycodeToKeySym + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: openIM + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_openIM + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: createIC + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_createIC + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: setupIMEventMask + * Signature: (JJJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_setupIMEventMask + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: allocateComposeStatus + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_allocateComposeStatus + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: nSetDetectableKeyRepeat + * Signature: (JZ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_nSetDetectableKeyRepeat + (JNIEnv *, jclass, jlong, jboolean); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: destroyIC + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_destroyIC + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: closeIM + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_closeIM + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: lookupString + * Signature: (JLjava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupString + (JNIEnv *, jclass, jlong, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: utf8LookupString + * Signature: (JJLjava/nio/ByteBuffer;II)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_utf8LookupString + (JNIEnv *, jclass, jlong, jlong, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: lookupKeysym + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_lookupKeysym + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_LinuxKeyboard + * Method: toUpper + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxKeyboard_toUpper + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.c new file mode 100644 index 0000000..a801e7d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_input_Keyboard.c 2399 2006-06-30 19:28:00Z elias_naur $ + * + * Linux mouse handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: 2399 $ + */ + +#include <X11/X.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "common_tools.h" +#include "org_lwjgl_opengl_LinuxMouse.h" + +static void getWindowAttributes(jlong display_ptr, jlong window_ptr, XWindowAttributes *attr) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XGetWindowAttributes(disp, win, attr); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetWindowHeight(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + XWindowAttributes window_attributes; + getWindowAttributes(display_ptr, window_ptr, &window_attributes); + return window_attributes.height; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetWindowWidth(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr) { + XWindowAttributes window_attributes; + getWindowAttributes(display_ptr, window_ptr, &window_attributes); + return window_attributes.width; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxMouse_nWarpCursor(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint x, jint y) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XWarpPointer(disp, None, win, 0, 0, 0, 0, x, y); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxMouse_nQueryPointer(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jobject result_buffer) { + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + Window root_return, child_return; + int root_x, root_y, win_x, win_y; + unsigned int mask_return; + jint *result = (jint *)(*env)->GetDirectBufferAddress(env, result_buffer); + int result_size = (*env)->GetDirectBufferCapacity(env, result_buffer); + if (result_size < 4) { + throwFormattedException(env, "Not enough space in result buffer (%d)", result_size); + return (intptr_t)NULL; + } + + XQueryPointer(disp, win, &root_return, &child_return, &root_x, &root_y, &win_x, &win_y, &mask_return); + result[0] = root_x; + result[1] = root_y; + result[2] = win_x; + result[3] = win_y; + return root_return; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxMouse_nSendWarpEvent(JNIEnv *env, jclass unusued, jlong display_ptr, jlong window_ptr, jlong warp_atom_ptr, jint x, jint y) { + Atom warp_atom = (Atom)warp_atom_ptr; + Display *disp = (Display *)(intptr_t)display_ptr; + Window win = (Window)window_ptr; + XEvent warp_event; + warp_event.type = ClientMessage; + warp_event.xclient.window = win; + warp_event.xclient.message_type = warp_atom; + warp_event.xclient.format = 32; + warp_event.xclient.data.l[0] = x; + warp_event.xclient.data.l[1] = y; + XSendEvent(disp, win, False, 0, &warp_event); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetButtonCount(JNIEnv *env, jclass unused, jlong display_ptr) { + Display *disp = (Display *)(intptr_t)display_ptr; + + int count = 256; + + unsigned char * pointer_map = malloc(sizeof(unsigned char) * count); + count = XGetPointerMapping(disp, pointer_map, count); + + free(pointer_map); + + return count; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.h new file mode 100644 index 0000000..680043b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxMouse.h @@ -0,0 +1,87 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxMouse */ + +#ifndef _Included_org_lwjgl_opengl_LinuxMouse +#define _Included_org_lwjgl_opengl_LinuxMouse +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_LinuxMouse_POINTER_WARP_BORDER +#define org_lwjgl_opengl_LinuxMouse_POINTER_WARP_BORDER 10L +#undef org_lwjgl_opengl_LinuxMouse_WHEEL_SCALE +#define org_lwjgl_opengl_LinuxMouse_WHEEL_SCALE 120L +#undef org_lwjgl_opengl_LinuxMouse_Button1 +#define org_lwjgl_opengl_LinuxMouse_Button1 1L +#undef org_lwjgl_opengl_LinuxMouse_Button2 +#define org_lwjgl_opengl_LinuxMouse_Button2 2L +#undef org_lwjgl_opengl_LinuxMouse_Button3 +#define org_lwjgl_opengl_LinuxMouse_Button3 3L +#undef org_lwjgl_opengl_LinuxMouse_Button4 +#define org_lwjgl_opengl_LinuxMouse_Button4 4L +#undef org_lwjgl_opengl_LinuxMouse_Button5 +#define org_lwjgl_opengl_LinuxMouse_Button5 5L +#undef org_lwjgl_opengl_LinuxMouse_Button6 +#define org_lwjgl_opengl_LinuxMouse_Button6 6L +#undef org_lwjgl_opengl_LinuxMouse_Button7 +#define org_lwjgl_opengl_LinuxMouse_Button7 7L +#undef org_lwjgl_opengl_LinuxMouse_Button8 +#define org_lwjgl_opengl_LinuxMouse_Button8 8L +#undef org_lwjgl_opengl_LinuxMouse_Button9 +#define org_lwjgl_opengl_LinuxMouse_Button9 9L +#undef org_lwjgl_opengl_LinuxMouse_ButtonPress +#define org_lwjgl_opengl_LinuxMouse_ButtonPress 4L +#undef org_lwjgl_opengl_LinuxMouse_ButtonRelease +#define org_lwjgl_opengl_LinuxMouse_ButtonRelease 5L +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nSendWarpEvent + * Signature: (JJJII)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxMouse_nSendWarpEvent + (JNIEnv *, jclass, jlong, jlong, jlong, jint, jint); + +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nGetWindowHeight + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetWindowHeight + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nGetWindowWidth + * Signature: (JJ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetWindowWidth + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nGetButtonCount + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxMouse_nGetButtonCount + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nQueryPointer + * Signature: (JJLjava/nio/IntBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxMouse_nQueryPointer + (JNIEnv *, jclass, jlong, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxMouse + * Method: nWarpCursor + * Signature: (JJII)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxMouse_nWarpCursor + (JNIEnv *, jclass, jlong, jlong, jint, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.c b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.c new file mode 100644 index 0000000..7d07f28 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include "org_lwjgl_opengl_LinuxPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_createHandle + (JNIEnv *env, jclass clazz) { + return newJavaManagedByteBuffer(env, sizeof(X11PeerInfo)); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_nGetDisplay(JNIEnv *env, jclass unused, jobject handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, handle); + return (jlong)(intptr_t)peer_info->display; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_nGetDrawable(JNIEnv *env, jclass unused, jobject handle) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, handle); + return peer_info->drawable; +} diff --git a/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.h b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.h new file mode 100644 index 0000000..579493d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/linux/org_lwjgl_opengl_LinuxPeerInfo.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_LinuxPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_LinuxPeerInfo +#define _Included_org_lwjgl_opengl_LinuxPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_LinuxPeerInfo + * Method: createHandle + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_createHandle + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_LinuxPeerInfo + * Method: nGetDisplay + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_nGetDisplay + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_LinuxPeerInfo + * Method: nGetDrawable + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxPeerInfo_nGetDrawable + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/context.h b/etc/lwjgl-2.9.1/src/native/macosx/context.h new file mode 100644 index 0000000..73960f9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/context.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Base Win32 display + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author mojang + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + */ + +#ifndef __LWJGL_CONTEXT_H +#define __LWJGL_CONTEXT_H + +#include <Cocoa/Cocoa.h> +#include <OpenGL/gl.h> +#include <OpenGL/glext.h> +#include "common_tools.h" +#include <jawt_md.h> + +enum { + NSControlLeftKeyMask = 0x0001, + NSControlRightKeyMask = 0x2000, + NSShiftLeftKeyMask = 0x0002, + NSShiftRightKeyMask = 0x0004, + NSCommandLeftKeyMask = 0x0008, + NSCommandRightKeyMask = 0x0010, + NSAlternateLeftKeyMask = 0x0020, + NSAlternateRightKeyMask = 0x0040 +}; + +@class NSOpenGLContext, NSOpenGLPixelFormat, MacOSXOpenGLView, MacOSXKeyableWindow; + +typedef struct { + MacOSXKeyableWindow *window; + + NSRect display_rect; + + MacOSXOpenGLView *view; + NSOpenGLContext *context; + + // Native objects for Java callbacks + jobject jdisplay; + jobject jmouse; + jobject jkeyboard; + + jboolean fullscreen; + jboolean undecorated; + jboolean resizable; + jboolean parented; + + jboolean enableFullscreenModeAPI; + jboolean enableHighDPI; + + jboolean resized; + +} MacOSXWindowInfo; + +@interface MacOSXOpenGLView : NSView +{ + @public + MacOSXWindowInfo* _parent; + + @private + NSOpenGLContext* _openGLContext; + NSOpenGLPixelFormat* _pixelFormat; + NSTrackingArea * _trackingArea; +} + ++ (NSOpenGLPixelFormat*)defaultPixelFormat; +- (BOOL)windowShouldClose:(id)sender; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +- (id)initWithFrame:(NSRect)frameRect pixelFormat:(NSOpenGLPixelFormat*)format; +- (void)setOpenGLContext:(NSOpenGLContext*)context; +- (NSOpenGLContext*)openGLContext; +- (void)clearGLContext; +- (void)prepareOpenGL; +- (void)update; +- (void)lockFocus; +- (void)setPixelFormat:(NSOpenGLPixelFormat*)pixelFormat; +- (NSOpenGLPixelFormat*)pixelFormat; +- (void)setParent:(MacOSXWindowInfo*)parent; +- (BOOL)acceptsFirstResponder; +@end + +@interface GLLayer : CAOpenGLLayer { + @public + JAWT_MacOSXDrawingSurfaceInfo *macosx_dsi; + JAWT_Rectangle canvasBounds; + MacOSXWindowInfo *window_info; + bool setViewport; + bool autoResizable; + + @private + CGLContextObj contextObject; + int fboID; + int imageRenderBufferID; + int depthRenderBufferID; + int fboWidth; + int fboHeight; +} + +- (void) attachLayer; +- (void) removeLayer; +- (void) blitFrameBuffer; + +- (int) getWidth; +- (int) getHeight; +@end + +typedef struct { + bool isCALayer; + bool isWindowed; + MacOSXWindowInfo *window_info; + NSOpenGLPixelFormat *pixel_format; + NSOpenGLPixelBuffer *pbuffer; + NSView *parent; + GLLayer *glLayer; +} MacOSXPeerInfo; + +@interface MacOSXKeyableWindow : NSWindow ++ (void)createWindow; ++ (void)destroyWindow; +- (BOOL)canBecomeKeyWindow; +@end + +NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool gl32, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered); +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/context.m b/etc/lwjgl-2.9.1/src/native/macosx/context.m new file mode 100644 index 0000000..9229437 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/context.m @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#import <CoreFoundation/CoreFoundation.h> +#import "context.h" + +static CFBundleRef opengl_bundle = NULL; + +void *extgl_GetProcAddress(const char *name) { + CFStringRef cf_name = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8); + void *address = CFBundleGetFunctionPointerForName(opengl_bundle, cf_name); + CFRelease(cf_name); + if (address == NULL) + printfDebug("Could not locate symbol %s\n", name); + return address; +} + +static CFBundleRef loadFramework(JNIEnv *env) { + CFStringRef framework_path = CFSTR("/System/Library/Frameworks/OpenGL.framework"); + if (framework_path == NULL) { + printfDebugJava(env, "Failed to allocate string"); + return NULL; + } + CFURLRef url = CFURLCreateWithFileSystemPath(NULL, framework_path, kCFURLPOSIXPathStyle, TRUE); + if (url == NULL) { + printfDebugJava(env, "Failed to allocate URL"); + return NULL; + } + CFBundleRef opengl_bundle = CFBundleCreate(NULL, url); + CFRelease(url); + return opengl_bundle; +} + +bool extgl_Open(JNIEnv *env) { + if (opengl_bundle != NULL) + return true; + opengl_bundle = loadFramework(env); + if (opengl_bundle != NULL) { + return true; + } else { + throwException(env, "Could not load OpenGL library"); + return false; + } +} + +void extgl_Close(void) +{ + if (opengl_bundle != NULL) { + CFRelease(opengl_bundle); + opengl_bundle = NULL; + } +} + +NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool gl32, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered) { + int bpp; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + if (use_display_bpp) + { + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { // if OS X 10.6+ use newer api + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(kCGDirectMainDisplay); + CFStringRef pixEnc = CGDisplayModeCopyPixelEncoding(mode); + if (CFStringCompare(pixEnc, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + bpp = 32; + else if(CFStringCompare(pixEnc, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + bpp = 16; + else if(CFStringCompare(pixEnc, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) + bpp = 8; + } else { + bpp = CGDisplayBitsPerPixel(kCGDirectMainDisplay); + } + } + else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + bool stereo = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + bool floating_point = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + // TODO: Add floating_point_packed attribute below + bool floating_point_packed = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + // TODO: Add sRGB attribute below + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + + attrib_list_t attribs; + jboolean allow_software_acceleration = getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL"); + initAttribList(&attribs); + if (!allow_software_acceleration) + putAttrib(&attribs, NSOpenGLPFAAccelerated); + if (double_buffered) + putAttrib(&attribs, NSOpenGLPFADoubleBuffer); + putAttrib(&attribs, NSOpenGLPFAMinimumPolicy); + putAttrib(&attribs, NSOpenGLPFAColorSize); putAttrib(&attribs, bpp); + putAttrib(&attribs, NSOpenGLPFAAlphaSize); putAttrib(&attribs, alpha); + putAttrib(&attribs, NSOpenGLPFADepthSize); putAttrib(&attribs, depth); + putAttrib(&attribs, NSOpenGLPFAStencilSize); putAttrib(&attribs, stencil); + putAttrib(&attribs, NSOpenGLPFAAccumSize); putAttrib(&attribs, accum_bpp + accum_alpha); + putAttrib(&attribs, NSOpenGLPFASampleBuffers); putAttrib(&attribs, samples > 0 ? 1 : 0); + putAttrib(&attribs, NSOpenGLPFASamples); putAttrib(&attribs, samples); + putAttrib(&attribs, NSOpenGLPFAAuxBuffers); putAttrib(&attribs, num_aux_buffers); + if (gl32) { + putAttrib(&attribs, 99); // NSOpenGLPFAOpenGLProfile + putAttrib(&attribs, 0x3200); // NSOpenGLProfileVersion3_2Core + } else { + if (support_window) + putAttrib(&attribs, NSOpenGLPFAWindow); + if (support_pbuffer) + putAttrib(&attribs, NSOpenGLPFAPixelBuffer); + } + if (stereo) + putAttrib(&attribs, NSOpenGLPFAStereo); + if (floating_point) + putAttrib(&attribs, NSOpenGLPFAColorFloat); + putAttrib(&attribs, 0); + NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:(NSOpenGLPixelFormatAttribute *)attribs.attribs]; + + if (fmt == nil) { + throwException(env, "Could not create pixel format"); + return NULL; + } + return fmt; +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/macosx_al.c b/etc/lwjgl-2.9.1/src/native/macosx/macosx_al.c new file mode 100644 index 0000000..160904d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/macosx_al.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <mach-o/dyld.h> +#include <stdlib.h> +#include <string.h> +#include <CoreFoundation/CoreFoundation.h> +#include "extal.h" +#include "common_tools.h" + +/** + * $Id$ + * + * This file contains the AL extension assigning mechanism + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + */ + +static const struct mach_header* handleOAL = NULL; +static CFBundleRef openal_bundle = NULL; + +void *extal_NativeGetFunctionPointer(const char *function) { + void *address = NULL; + if (handleOAL != NULL) { + char *mac_symbol_name = (char *)malloc((strlen(function) + 2)*sizeof(char)); + if (mac_symbol_name == NULL) + return NULL; + mac_symbol_name[0] = '_'; + strcpy(&(mac_symbol_name[1]), function); + NSSymbol symbol = NSLookupSymbolInImage(handleOAL, mac_symbol_name, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + free(mac_symbol_name); + if (symbol != NULL) { + address = NSAddressOfSymbol(symbol); + } + } else if (openal_bundle != NULL) { + CFStringRef cf_function = CFStringCreateWithCString(NULL, function, kCFStringEncodingUTF8); + address = CFBundleGetFunctionPointerForName(openal_bundle, cf_function); + CFRelease(cf_function); + } + return address; +} + +static CFBundleRef tryLoadFramework(JNIEnv *env) { + CFStringRef framework_path = CFSTR("/System/Library/Frameworks/OpenAL.framework"); + if (framework_path == NULL) { + printfDebugJava(env, "Failed to allocate string"); + return NULL; + } + CFURLRef url = CFURLCreateWithFileSystemPath(NULL, framework_path, kCFURLPOSIXPathStyle, TRUE); + if (url == NULL) { + printfDebugJava(env, "Failed to allocate URL"); + return NULL; + } + CFBundleRef openal_bundle = CFBundleCreate(NULL, url); + CFRelease(url); + return openal_bundle; +} + +void extal_LoadLibrary(JNIEnv *env, jstring path) { + const char *path_str = (*env)->GetStringUTFChars(env, path, NULL); + printfDebugJava(env, "Testing '%s'", path_str); + handleOAL = NSAddImage(path_str, NSADDIMAGE_OPTION_RETURN_ON_ERROR); + if (handleOAL != NULL) { + printfDebugJava(env, "Found OpenAL at '%s'", path_str); + } else { + throwException(env, "Could not load OpenAL library"); + } + (*env)->ReleaseStringUTFChars(env, path, path_str); +} + +/** + * Unloads the OpenAL Library + */ +void extal_UnloadLibrary() { + if (openal_bundle != NULL) { + CFRelease(openal_bundle); + openal_bundle = NULL; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_openal_AL_nCreateDefault(JNIEnv *env, jclass clazz) { + openal_bundle = tryLoadFramework(env); + if (openal_bundle != NULL) + printfDebugJava(env, "Found OpenAL Bundle"); + else + throwException(env, "Could not load OpenAL framework"); +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/macosx_cl.c b/etc/lwjgl-2.9.1/src/native/macosx/macosx_cl.c new file mode 100644 index 0000000..aeca29f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/macosx_cl.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <mach-o/dyld.h> +#include <stdlib.h> +#include <string.h> +#include <CoreFoundation/CoreFoundation.h> +#include "extcl.h" +#include "common_tools.h" + +/** + * OpenCL library management + */ +static const struct mach_header* handleOCL = NULL; +static CFBundleRef opencl_bundle = NULL; + +void *extcl_NativeGetFunctionPointer(const char *function) { + void *address = NULL; + if (handleOCL != NULL) { + char *mac_symbol_name = (char *)malloc((strlen(function) + 2)*sizeof(char)); + if (mac_symbol_name == NULL) + return NULL; + mac_symbol_name[0] = '_'; + strcpy(&(mac_symbol_name[1]), function); + NSSymbol symbol = NSLookupSymbolInImage(handleOCL, mac_symbol_name, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + free(mac_symbol_name); + if (symbol != NULL) { + address = NSAddressOfSymbol(symbol); + } + } else if (opencl_bundle != NULL) { + CFStringRef cf_function = CFStringCreateWithCString(NULL, function, kCFStringEncodingUTF8); + address = CFBundleGetFunctionPointerForName(opencl_bundle, cf_function); + CFRelease(cf_function); + } + return address; +} + +static CFBundleRef tryLoadFramework(JNIEnv *env) { + CFStringRef framework_path = CFSTR("/System/Library/Frameworks/OpenCL.framework"); + if (framework_path == NULL) { + printfDebugJava(env, "Failed to allocate string"); + return NULL; + } + CFURLRef url = CFURLCreateWithFileSystemPath(NULL, framework_path, kCFURLPOSIXPathStyle, TRUE); + if (url == NULL) { + printfDebugJava(env, "Failed to allocate URL"); + return NULL; + } + CFBundleRef opencl_bundle = CFBundleCreate(NULL, url); + CFRelease(url); + return opencl_bundle; +} + +void extcl_LoadLibrary(JNIEnv *env, jstring path) { + const char *path_str = (*env)->GetStringUTFChars(env, path, NULL); + printfDebugJava(env, "Testing '%s'", path_str); + handleOCL = NSAddImage(path_str, NSADDIMAGE_OPTION_RETURN_ON_ERROR); + if (handleOCL != NULL) { + printfDebugJava(env, "Found OpenCL at '%s'", path_str); + } else { + throwException(env, "Could not load OpenCL library"); + } + (*env)->ReleaseStringUTFChars(env, path, path_str); +} + +/** + * Unloads the OpenCL Library + */ +void extcl_UnloadLibrary() { + if (opencl_bundle != NULL) { + CFRelease(opencl_bundle); + opencl_bundle = NULL; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opencl_CL_nCreateDefault(JNIEnv *env, jclass clazz) { + opencl_bundle = tryLoadFramework(env); + if (opencl_bundle != NULL) + printfDebugJava(env, "Found OpenCL Bundle"); + else + throwException(env, "Could not load OpenCL framework"); +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_MacOSXSysImplementation.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_MacOSXSysImplementation.h new file mode 100644 index 0000000..705eb08 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_MacOSXSysImplementation.h @@ -0,0 +1,15 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_MacOSXSysImplementation */ + +#ifndef _Included_org_lwjgl_MacOSXSysImplementation +#define _Included_org_lwjgl_MacOSXSysImplementation +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_MacOSXSysImplementation_JNI_VERSION +#define org_lwjgl_MacOSXSysImplementation_JNI_VERSION 25L +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_Display.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_Display.m new file mode 100644 index 0000000..c7c97ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_Display.m @@ -0,0 +1,891 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Mac OS X specific display functions. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author mojang + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + */ + +#import <AppKit/NSApplication.h> +#import <Cocoa/Cocoa.h> +#import <Carbon/Carbon.h> +#import <jni.h> +#import <unistd.h> +#import "common_tools.h" +#import "org_lwjgl_opengl_MacOSXDisplay.h" +#import "org_lwjgl_MacOSXSysImplementation.h" +#import "context.h" + +static NSOpenGLPixelFormat *default_format = nil; + +static NSAutoreleasePool *pool; + +static MacOSXPeerInfo *peer_info; + +static bool leftMouseDown = false; +static bool rightMouseDown = false; + +static NSUInteger lastModifierFlags = 0; + +@implementation MacOSXKeyableWindow + ++ (void) createWindow { + MacOSXWindowInfo *window_info = peer_info->window_info; + + int width = window_info->display_rect.size.width; + int height = window_info->display_rect.size.height; + + NSRect view_rect = NSMakeRect(0.0, 0.0, width, height); + window_info->view = [[MacOSXOpenGLView alloc] initWithFrame:view_rect pixelFormat:peer_info->pixel_format]; + [window_info->view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + + // Inform the view of its parent window info; + [window_info->view setParent:window_info]; + + if (window_info->enableHighDPI) { + // call method using runtime selector as its a 10.7+ api and allows compiling on older SDK's + [window_info->view performSelector:NSSelectorFromString(@"setWantsBestResolutionOpenGLSurface:") withObject:YES]; + } + + // set nsapp delegate for catching app quit events + [NSApp setDelegate:window_info->view]; + + if (window_info->context != nil) { + [window_info->view setOpenGLContext:window_info->context]; + } + + if (!window_info->fullscreen) { + + if (window_info->parented) { + window_info->window = [peer_info->parent window]; + [peer_info->parent addSubview:window_info->view]; + } + else { + + int default_window_mask = NSBorderlessWindowMask; // undecorated + + if (!window_info->undecorated) { + default_window_mask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask; + } + + if (window_info->resizable) { + default_window_mask |= NSResizableWindowMask; + } + + window_info->window = [[MacOSXKeyableWindow alloc] initWithContentRect:window_info->display_rect styleMask:default_window_mask backing:NSBackingStoreBuffered defer:NO]; + + [window_info->window setContentView:window_info->view]; + [window_info->window setContentView:window_info->view]; // call twice to fix issue + + // set NSView as delegate of NSWindow to get windowShouldClose events + [window_info->window setDelegate:window_info->view]; + } + + // disable any fixed backbuffer size to allow resizing + CGLContextObj cgcontext = (CGLContextObj)[[window_info->view openGLContext] CGLContextObj]; + CGLDisable(cgcontext, kCGLCESurfaceBackingSize); + } + else { + // set a fixed backbuffer size for fullscreen + CGLContextObj cgcontext = (CGLContextObj)[window_info->context CGLContextObj]; + GLint dim[2] = {width, height}; + CGLSetParameter(cgcontext, kCGLCPSurfaceBackingSize, dim); + CGLEnable(cgcontext, kCGLCESurfaceBackingSize); + + // enter fullscreen mode + [window_info->view enterFullScreenMode: [NSScreen mainScreen] withOptions: nil ]; + window_info->window = [window_info->view window]; + + // adjust the NSView bounds to correct mouse coordinates in fullscreen + NSSize windowSize = [window_info->window frame].size; + NSSize newBounds = NSMakeSize(windowSize.width/width*windowSize.width, windowSize.height/height*windowSize.height); + [window_info->view setBoundsSize:newBounds]; + } + + if (window_info->enableFullscreenModeAPI && window_info->resizable) { + // manually create OS X 10.7+ mask to allow compilation on previous OS X versions + NSUInteger NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7; + [window_info->window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; + } + + [window_info->window makeFirstResponder:window_info->view]; + [window_info->window setInitialFirstResponder:window_info->view]; + [window_info->window makeKeyAndOrderFront:[NSApplication sharedApplication]]; +} + ++ (void) destroyWindow { + MacOSXWindowInfo *window_info = peer_info->window_info; + + if (window_info->fullscreen) { + [window_info->view exitFullScreenModeWithOptions: nil]; + window_info->window = nil; + } + else { + if (peer_info->isCALayer) { + peer_info->isCALayer = false; + [peer_info->glLayer removeLayer]; + [peer_info->glLayer release]; + peer_info->glLayer = nil; + return; + } + + if (window_info->window != nil) { + // if the nsview has no parent then close window + if ([window_info->window contentView] == window_info->view) { + // release the nsview and remove it from any parent nsview + [window_info->view removeFromSuperviewWithoutNeedingDisplay]; + [window_info->window close]; + window_info->window = nil; + } + else { + // release the nsview and remove it from any parent nsview + [window_info->view removeFromSuperviewWithoutNeedingDisplay]; + } + } + } +} + +- (BOOL)canBecomeKeyWindow; +{ + return YES; +} +@end + +@implementation MacOSXOpenGLView + ++ (NSOpenGLPixelFormat*)defaultPixelFormat { + NSOpenGLPixelFormatAttribute defaultAttribs[] = { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFAColorSize, 32, + 0 + }; + if (default_format == nil) { + default_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:defaultAttribs]; + } + return default_format; +} + +- (BOOL)windowShouldClose:(id)sender { + if (_parent != nil) { + JNIEnv *env = attachCurrentThread(); + jclass display_class = (*env)->GetObjectClass(env, _parent->jdisplay); + jmethodID close_callback = (*env)->GetMethodID(env, display_class, "doHandleQuit", "()V"); + (*env)->CallVoidMethod(env, _parent->jdisplay, close_callback); + } + return NO; +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { + [self windowShouldClose:nil]; + return NSTerminateCancel; +} + +- (id)initWithFrame:(NSRect)frameRect pixelFormat:(NSOpenGLPixelFormat*)format { + self = [super initWithFrame:frameRect]; + if (self != nil) { + _pixelFormat = [format retain]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(_surfaceNeedsUpdate:) + name:NSViewGlobalFrameDidChangeNotification + object:self]; + } + return self; +} + +- (void) _surfaceNeedsUpdate:(NSNotification*)notification { + [self update]; +} + +- (void)setOpenGLContext:(NSOpenGLContext*)context { + _openGLContext = context; +} + +- (NSOpenGLContext*)openGLContext { + return _openGLContext; +} + +- (void)clearGLContext { + [_openGLContext release]; + _openGLContext = nil; +} + +- (void)prepareOpenGL { + +} + +- (void)update { + [_openGLContext update]; +} + +- (void)lockFocus { + [super lockFocus]; + + NSOpenGLContext* context = [self openGLContext]; + + if (context == nil) return; + + if ([context view] != self) { + [context setView:self]; + } + + [context makeCurrentContext]; +} + +- (void)setPixelFormat:(NSOpenGLPixelFormat*)pixelFormat { + _pixelFormat = [pixelFormat retain]; +} + +- (NSOpenGLPixelFormat*)pixelFormat { + return _pixelFormat; +} + +- (BOOL)acceptsFirstResponder { + return YES; +} + +- (void)setParent:(MacOSXWindowInfo*)parent { + _parent = parent; +} + +- (void)keyDown:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jkeyboard == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); + jmethodID keydown = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(ILjava/lang/String;J)V"); + + // convert key characters from NSString to jstring + const char *unichars = [[event characters] UTF8String]; + jstring characters = (*env)->NewStringUTF(env, unichars); + + (*env)->CallVoidMethod(env, _parent->jkeyboard, keydown, [event keyCode], characters, time); +} + +- (void)keyUp:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jkeyboard == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); + jmethodID keyup = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(ILjava/lang/String;J)V"); + + // convert key characters from NSString to jstring + const char *unichars = [[event characters] UTF8String]; + jstring characters = (*env)->NewStringUTF(env, unichars); + + (*env)->CallVoidMethod(env, _parent->jkeyboard, keyup, [event keyCode], characters, time); +} + +- (void)flagsChanged:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jkeyboard == nil) { + return; + } + long time = [event timestamp] * 1000000000; + + NSUInteger modifierFlags = [event modifierFlags]; + unsigned short keyCode = [event keyCode]; + + NSUInteger mask = ~0; + + switch(keyCode) { + case kVK_Control : mask = NSControlLeftKeyMask; break; + case kVK_Shift : mask = NSShiftLeftKeyMask; break; + case kVK_RightShift : mask = NSShiftRightKeyMask; break; + case kVK_Command : mask = NSCommandLeftKeyMask; break; + case 0x36 : mask = NSCommandRightKeyMask; break; // Should be: kVK_RightCommand -- missing O.o + case kVK_Option : mask = NSAlternateLeftKeyMask; break; + case kVK_RightOption : mask = NSAlternateRightKeyMask; break; + case kVK_RightControl: mask = NSControlRightKeyMask; break; + case kVK_CapsLock : mask = NSAlphaShiftKeyMask; break; + case kVK_Function : mask = NSFunctionKeyMask; break; + // case 0x?? : mask = NSNumericPadKeyMask; break; // Didn't have the keycode for this one :( + default: + // key code not specified when left Command key + Tab moves focus to another Window, therefore manually detect and specify correct key code + if (((lastModifierFlags & NSCommandLeftKeyMask) == NSCommandLeftKeyMask) && ((modifierFlags & NSCommandLeftKeyMask) != NSCommandLeftKeyMask)) { + keyCode = kVK_Command; // left command key code + } + // key code not specified when right Command key + Tab moves focus to another Window, therefore manually detect and specify correct key code + else if (((lastModifierFlags & NSCommandLeftKeyMask) == NSCommandLeftKeyMask) && ((modifierFlags & NSCommandLeftKeyMask) != NSCommandLeftKeyMask)) { + keyCode = 0x36; // right command key code + } + else { + NSLog(@"Unknown modifier with keycode: %d\n", [event keyCode]); + return; + } + } + + // save current modifierFlags for next use + lastModifierFlags = [event modifierFlags]; + + jclass keyboard_class = (*env)->GetObjectClass(env, _parent->jkeyboard); + + jmethodID keyMethod; + if ((modifierFlags & mask) == mask) { + keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyPressed", "(ILjava/lang/String;J)V"); + } else { + keyMethod = (*env)->GetMethodID(env, keyboard_class, "keyReleased", "(ILjava/lang/String;J)V"); + } + + (*env)->CallVoidMethod(env, _parent->jkeyboard, keyMethod, keyCode, NULL, time); +} + +- (void)mouseButtonState:(NSEvent *)event :(int)button :(int)state { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jkeyboard == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousebutton = (*env)->GetMethodID(env, mouse_class, "setButton", "(IIJ)V"); + (*env)->CallVoidMethod(env, _parent->jmouse, mousebutton, button, state, time); +} + +- (void)mouseDown:(NSEvent *)event { + if ([event modifierFlags] & NSControlKeyMask) { + rightMouseDown = true; + [self rightMouseDown:event]; + return; + } + + leftMouseDown = true; + [self mouseButtonState:event :0 :1]; +} + +- (void)rightMouseDown:(NSEvent *)event { + [self mouseButtonState:event :1 :1]; +} + +- (void)otherMouseDown:(NSEvent *)event { + [self mouseButtonState:event :2 :1]; +} + +- (void)mouseUp:(NSEvent *)event { + if (rightMouseDown) { + rightMouseDown = false; + [self rightMouseUp:event]; + } + + if (leftMouseDown) { + leftMouseDown = false; + [self mouseButtonState:event :0 :0]; + } +} + +- (void)rightMouseUp:(NSEvent *)event { + [self mouseButtonState:event :1 :0]; +} + +- (void)otherMouseUp:(NSEvent *)event { + [self mouseButtonState:event :2 :0]; +} + +- (void)mouseDragged:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jmouse == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousemove = (*env)->GetMethodID(env, mouse_class, "mouseMoved", "(FFFFFJ)V"); + NSPoint loc = [self convertPoint:[event locationInWindow] toView:nil]; + (*env)->CallVoidMethod(env, _parent->jmouse, mousemove, loc.x, loc.y, [event deltaX], [event deltaY], 0.0f, time); +} + +- (void)rightMouseDragged:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jmouse == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousemove = (*env)->GetMethodID(env, mouse_class, "mouseMoved", "(FFFFFJ)V"); + NSPoint loc = [self convertPoint:[event locationInWindow] toView:nil]; + (*env)->CallVoidMethod(env, _parent->jmouse, mousemove, loc.x, loc.y, [event deltaX], [event deltaY], 0.0f, time); +} + +- (void)otherMouseDragged:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jmouse == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousemove = (*env)->GetMethodID(env, mouse_class, "mouseMoved", "(FFFFFJ)V"); + NSPoint loc = [self convertPoint:[event locationInWindow] toView:nil]; + (*env)->CallVoidMethod(env, _parent->jmouse, mousemove, loc.x, loc.y, [event deltaX], [event deltaY], 0.0f, time); +} + +- (void)mouseMoved:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil || _parent->jmouse == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousemove = (*env)->GetMethodID(env, mouse_class, "mouseMoved", "(FFFFFJ)V"); + NSPoint loc = [self convertPoint:[event locationInWindow] toView:nil]; + (*env)->CallVoidMethod(env, _parent->jmouse, mousemove, loc.x, loc.y, [event deltaX], [event deltaY], 0.0f, time); +} + +- (void)scrollWheel:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || event == nil || _parent == nil) { + return; + } + long time = [event timestamp] * 1000000000; + jclass mouse_class = (*env)->GetObjectClass(env, _parent->jmouse); + jmethodID mousemove = (*env)->GetMethodID(env, mouse_class, "mouseMoved", "(FFFFFJ)V"); + NSPoint loc = [self convertPoint:[event locationInWindow] toView:nil]; + (*env)->CallVoidMethod(env, _parent->jmouse, mousemove, loc.x, loc.y, [event deltaX], [event deltaY], 1.0f, time); +} + +- (void)viewDidMoveToWindow { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(windowResized:) + name:NSWindowDidResizeNotification + object:[self window]]; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (void)windowResized:(NSNotification *)notification; +{ + if (_parent != nil) { + _parent->display_rect = [self frame]; + _parent->resized = JNI_TRUE; + } +} + +- (void)viewDidChangeBackingProperties { + JNIEnv *env = attachCurrentThread(); + if (env == nil || _parent == nil || _parent->jdisplay == nil) { + return; + } + + jclass display_class = (*env)->GetObjectClass(env, _parent->jdisplay); + jmethodID setScaleFactor_callback = (*env)->GetMethodID(env, display_class, "setScaleFactor", "(F)V"); + + CGFloat scaleFactor; + + // call method using runtime selector as its a 10.7+ api and allows compiling on older SDK's + SEL selector = NSSelectorFromString(@"backingScaleFactor"); + + // as we are using a runtime selector, we need to use NSInvocations to get a CGFloat value back from it + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[[self window] class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:[self window]]; + [invocation invoke]; + [invocation getReturnValue:&scaleFactor]; + + (*env)->CallVoidMethod(env, _parent->jdisplay, setScaleFactor_callback, scaleFactor); +} + +-(void)updateTrackingAreas { + if(_trackingArea != nil) { + [self removeTrackingArea:_trackingArea]; + [_trackingArea release]; + } + + int options = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways); + _trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] + options:options + owner:self + userInfo:nil]; + [self addTrackingArea:_trackingArea]; + + // since nstrackingarea's don't know if mouse is inside or outside on creation + // manually detect this and send a fake mouse entered/exited message + NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream]; + mouseLocation = [self convertPoint:mouseLocation fromView:nil]; + + if (NSPointInRect(mouseLocation, [self bounds])) { + [self mouseEntered:nil]; + } + else { + [self mouseExited:nil]; + } +} + +-(void)mouseEntered:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || _parent == nil || _parent->jdisplay == nil) { + return; + } + + jclass display_class = (*env)->GetObjectClass(env, _parent->jdisplay); + jmethodID mouseInsideWindow_callback = (*env)->GetMethodID(env, display_class, "mouseInsideWindow", "(Z)V"); + (*env)->CallVoidMethod(env, _parent->jdisplay, mouseInsideWindow_callback, JNI_TRUE); +} + +-(void)mouseExited:(NSEvent *)event { + JNIEnv *env = attachCurrentThread(); + if (env == nil || _parent == nil || _parent->jdisplay == nil) { + return; + } + + jclass display_class = (*env)->GetObjectClass(env, _parent->jdisplay); + jmethodID mouseInsideWindow_callback = (*env)->GetMethodID(env, display_class, "mouseInsideWindow", "(Z)V"); + (*env)->CallVoidMethod(env, _parent->jdisplay, mouseInsideWindow_callback, JNI_FALSE); +} + +- (void) drawRect:(NSRect)rect { + // set black as the default background color + // for the nsview to avoid white flash on fullscreen + [[NSColor blackColor] setFill]; + NSRectFill(rect); +} +@end + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsMiniaturized(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + return (jboolean)[window_info->window isMiniaturized]; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsFocused(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + // Display is focused if nswindow is key window and nsview is first responder in that nswindow + return (jboolean)([[window_info->view window] isKeyWindow] && [[window_info->view window] firstResponder] == window_info->view); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nResizeWindow(JNIEnv *env, jobject this, jobject window_handle, jint x, jint y, jint width, jint height) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + window_info->display_rect = NSMakeRect(x, y, width, height); + [window_info->window setFrame:window_info->display_rect display:false]; + [window_info->view update]; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nWasResized(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + jboolean was_resized = window_info->resized; + window_info->resized = JNI_FALSE; + return was_resized; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetWidth(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + jint width = window_info->display_rect.size.width; + return width; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetHeight(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + jint height = window_info->display_rect.size.height; + return height; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nSetResizable(JNIEnv *env, jobject this, jobject window_handle, jboolean resizable) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + NSUInteger style_mask = [window_info->window styleMask]; + if (resizable == true) { + style_mask |= NSResizableWindowMask; + } else { + style_mask &= ~NSResizableWindowMask; + } + [window_info->window setStyleMask:style_mask]; + + if (window_info->enableFullscreenModeAPI) { + if (resizable) { + // manually create OS X 10.7+ mask to allow compilation on previous OS X versions + NSUInteger NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7; + [window_info->window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; + } + else { + // manually create OS X 10.7+ mask to allow compilation on previous OS X versions + NSUInteger NSFullScreenWindowMask = 1 << 14; + // on disabling resizing exit fullscreen mode exit otherwise will be stuck in it + if ((style_mask & NSFullScreenWindowMask) == NSFullScreenWindowMask) { + // call method using runtime selector as its a 10.7+ api and allows compiling on older SDK's + [window_info->window performSelector:NSSelectorFromString(@"toggleFullScreen:") withObject:nil]; + } + [window_info->window setCollectionBehavior:NSWindowCollectionBehaviorDefault]; + } + } +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetX(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + jint x = [[window_info->view window] frame].origin.x; + return x; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetY(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + + NSRect screenRect = [[window_info->window screen] frame]; + NSRect winRect = [[window_info->view window] frame]; + + // get top corner of window frame, also flip coords so origin is in top left + jint y = screenRect.size.height - (winRect.origin.y + winRect.size.height) - 1; + return y; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nSetTitle(JNIEnv *env, jobject this, jobject window_handle, jobject title_buffer) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + const char *title_cstr = (const char *)(*env)->GetDirectBufferAddress(env, title_buffer); + NSString *title = [[NSString alloc] initWithUTF8String:title_cstr]; + [window_info->window performSelectorOnMainThread:@selector(setTitle:) withObject:title waitUntilDone:NO]; +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nCreateWindow(JNIEnv *env, jobject this, jint x, jint y, jint width, jint height, jboolean fullscreen, jboolean undecorated, jboolean resizable, jboolean parented, jboolean enableFullscreenModeAPI, jboolean enableHighDPI, jobject peer_info_handle, jobject window_handle) { + + pool = [[NSAutoreleasePool alloc] init]; + + peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + if (peer_info->isCALayer && !fullscreen) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + window_info->fullscreen = fullscreen; + window_info->undecorated = undecorated; + window_info->parented = parented; + window_info->enableFullscreenModeAPI = enableFullscreenModeAPI; + + return window_handle; + } + + if (window_handle == NULL) { + window_handle = newJavaManagedByteBuffer(env, sizeof(MacOSXWindowInfo)); + if (window_handle == NULL) { + throwException(env, "Could not create handle buffer"); + return NULL; + } + } + + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + + window_info->fullscreen = fullscreen; + window_info->undecorated = undecorated; + window_info->resizable = resizable; + window_info->parented = parented; + window_info->enableFullscreenModeAPI = enableFullscreenModeAPI; + window_info->enableHighDPI = enableHighDPI; + + peer_info->window_info = window_info; + peer_info->isWindowed = true; + + window_info->display_rect = NSMakeRect(x, [[NSScreen mainScreen] frame].size.height - y - height, width, height); + + // Cache the necessary info for window-close callbacks into the JVM + if (window_info->jdisplay == NULL) { + window_info->jdisplay = (*env)->NewGlobalRef(env, this); + } + + // create window on main thread + [MacOSXKeyableWindow performSelectorOnMainThread:@selector(createWindow) withObject:nil waitUntilDone:YES]; + + return window_handle; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyWindow(JNIEnv *env, jobject this, jobject window_handle) { + + // destroy window on main thread + [MacOSXKeyableWindow performSelectorOnMainThread:@selector(destroyWindow) withObject:nil waitUntilDone:YES]; + + [pool drain]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyCALayer(JNIEnv *env, jobject this, jobject peer_info_handle) { + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + if (peer_info->isCALayer) { + peer_info->isCALayer = false; + [peer_info->glLayer performSelectorOnMainThread:@selector(removeLayer) withObject:nil waitUntilDone:YES]; + [peer_info->glLayer release]; + peer_info->glLayer = nil; + } +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsNativeMode(JNIEnv *env, jobject this, jobject peer_info_handle) { + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + if (peer_info->isCALayer) { + return JNI_FALSE; + } + else { + return JNI_TRUE; + } +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetCurrentDisplayMode(JNIEnv *env, jobject this) { + + jclass displayClass = (*env)->GetObjectClass(env, this); + jmethodID createDisplayModeMethod = (*env)->GetMethodID(env, displayClass, "createDisplayMode", "(IIII)Ljava/lang/Object;"); + + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { // if OS X 10.6+ use newer api + + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(kCGDirectMainDisplay); + + int width = (int) CGDisplayModeGetWidth(mode); + int height = (int) CGDisplayModeGetHeight(mode); + int refreshRate = (int)CGDisplayModeGetRefreshRate(mode); + int bitsPerPixel; + + // get bitsPerPixel + CFStringRef pixelEncoding = CGDisplayModeCopyPixelEncoding(mode); + + if(CFStringCompare(pixelEncoding, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { + bitsPerPixel = 16; + } + else { + bitsPerPixel = 32; + } + + jobject displayMode = (*env)->CallObjectMethod(env, this, createDisplayModeMethod, width, height, bitsPerPixel, refreshRate); + + return displayMode; + + } else { + + CFDictionaryRef mode = CGDisplayCurrentMode(CGMainDisplayID()); + + long bitsPerPixel = 0; + long width = 0; + long height = 0; + long refreshRate = 0; + + CFNumberRef value; + + value = CFDictionaryGetValue(mode, kCGDisplayBitsPerPixel); + CFNumberGetValue(value, kCFNumberLongType, &bitsPerPixel); + + value = CFDictionaryGetValue(mode, kCGDisplayWidth); + CFNumberGetValue(value, kCFNumberLongType, &width); + + value = CFDictionaryGetValue(mode, kCGDisplayHeight); + CFNumberGetValue(value, kCFNumberLongType, &height); + + value = CFDictionaryGetValue(mode, kCGDisplayRefreshRate); + CFNumberGetValue(value, kCFNumberLongType, &refreshRate); + + jobject displayMode = (*env)->CallObjectMethod(env, this, createDisplayModeMethod, width, height, bitsPerPixel, refreshRate); + + return displayMode; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetDisplayModes(JNIEnv *env, jobject this, jobject modesList) { + + jclass displayClass = (*env)->GetObjectClass(env, this); + jmethodID addDisplayModeMethod = (*env)->GetMethodID(env, displayClass, "addDisplayMode", "(Ljava/lang/Object;IIII)V"); + + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { // if OS X 10.6+ use newer api + + CFArrayRef modes = CGDisplayCopyAllDisplayModes(kCGDirectMainDisplay, NULL); + + int i = 0; + + for (i = 0; i < CFArrayGetCount(modes); i++) { + CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(modes, i); + + int width = (int) CGDisplayModeGetWidth(mode); + int height = (int) CGDisplayModeGetHeight(mode); + int refreshRate = (int)CGDisplayModeGetRefreshRate(mode); + int bitsPerPixel; + + // get bitsPerPixel + CFStringRef pixelEncoding = CGDisplayModeCopyPixelEncoding(mode); + if(CFStringCompare(pixelEncoding, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { + bitsPerPixel = 32; + } + else if(CFStringCompare(pixelEncoding, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { + bitsPerPixel = 16; + } + else { + continue; // ignore DisplayMode of other bitsPerPixel rates + } + + (*env)->CallVoidMethod(env, this, addDisplayModeMethod, modesList, width, height, bitsPerPixel, refreshRate); + } + + } else { + + CFArrayRef modes = CGDisplayAvailableModes(CGMainDisplayID()); + CFIndex index, count; + CFDictionaryRef mode; + + count = CFArrayGetCount(modes); + + for (index = 0; index < count; index++) { + mode = CFArrayGetValueAtIndex(modes, index); + + long bitsPerPixel = 0; + long width = 0; + long height = 0; + long refreshRate = 0; + + CFNumberRef value; + + value = CFDictionaryGetValue(mode, kCGDisplayBitsPerPixel); + CFNumberGetValue(value, kCFNumberLongType, &bitsPerPixel); + + value = CFDictionaryGetValue(mode, kCGDisplayWidth); + CFNumberGetValue(value, kCFNumberLongType, &width); + + value = CFDictionaryGetValue(mode, kCGDisplayHeight); + CFNumberGetValue(value, kCFNumberLongType, &height); + + value = CFDictionaryGetValue(mode, kCGDisplayRefreshRate); + CFNumberGetValue(value, kCFNumberLongType, &refreshRate); + + (*env)->CallVoidMethod(env, this, addDisplayModeMethod, modesList, width, height, bitsPerPixel, refreshRate); + } + } + +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion(JNIEnv *env, jobject ignored) { + return org_lwjgl_MacOSXSysImplementation_JNI_VERSION; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_restoreGamma(JNIEnv *env, jobject this) { + CGDisplayRestoreColorSyncSettings(); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_setGammaRamp(JNIEnv *env, jobject this, jobject gamma_buffer) { + const CGGammaValue *values = (*env)->GetDirectBufferAddress(env, gamma_buffer); + uint32_t table_size = (*env)->GetDirectBufferCapacity(env, gamma_buffer); + CGDisplayErr err = CGSetDisplayTransferByTable(kCGDirectMainDisplay, table_size, values, values, values); + if (err != CGDisplayNoErr) { + throwException(env, "Could not set display gamma"); + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXAWTMouse.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXAWTMouse.m new file mode 100644 index 0000000..6fc7be0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXAWTMouse.m @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Mac OS X mouse handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <ApplicationServices/ApplicationServices.h> +#include "org_lwjgl_opengl_MacOSXMouseEventQueue.h" +#include "common_tools.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nGrabMouse(JNIEnv *env, jclass unused, jboolean grab) { + CGAssociateMouseAndMouseCursorPosition(grab == JNI_TRUE ? FALSE : TRUE); + if (grab) + CGDisplayHideCursor(kCGDirectMainDisplay); + else + CGDisplayShowCursor(kCGDirectMainDisplay); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nWarpCursor(JNIEnv *env, jclass unused, jint x, jint y) { + CGPoint p; + p.x = x; + p.y = y; + CGWarpMouseCursorPosition(p); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_getMouseDeltas(JNIEnv *env, jclass unused, jobject delta_buffer) { + CGMouseDelta dx, dy; + CGGetLastMouseDelta(&dx, &dy); + int buffer_length = (*env)->GetDirectBufferCapacity(env, delta_buffer); + if (buffer_length != 2) { + printfDebugJava(env, "Delta buffer not large enough!"); + return; + } + jint *buffer = (*env)->GetDirectBufferAddress(env, delta_buffer); + buffer[0] = dx; + buffer[1] = dy; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.h new file mode 100644 index 0000000..13ccb34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXCanvasPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXCanvasPeerInfo +#define _Included_org_lwjgl_opengl_MacOSXCanvasPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_MacOSXCanvasPeerInfo + * Method: nInitHandle + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;ZII)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle + (JNIEnv *, jclass, jobject, jobject, jobject, jboolean, jint, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXCanvasPeerInfo + * Method: nSetLayerPosition + * Signature: (Ljava/nio/ByteBuffer;II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nSetLayerPosition + (JNIEnv *, jclass, jobject, jint, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m new file mode 100644 index 0000000..91e4364 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author Pelle Johnsen + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + */ + +#import <Cocoa/Cocoa.h> +#include <jni.h> +#include <jawt_md.h> +#include "awt_tools.h" +#include "org_lwjgl_opengl_MacOSXCanvasPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle +(JNIEnv *env, jclass clazz, jobject lock_buffer_handle, jobject peer_info_handle, jobject window_handle, jboolean forceCALayer, jboolean autoResizable, jint x, jint y) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + AWTSurfaceLock *surface = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + JAWT_MacOSXDrawingSurfaceInfo *macosx_dsi = (JAWT_MacOSXDrawingSurfaceInfo *)surface->dsi->platformInfo; + + // force CALayer usage or check if CALayer is supported (i.e. on Java 5 and Java 6) + if(forceCALayer || (surface->awt.version & 0x80000000)) { //JAWT_MACOSX_USE_CALAYER) { + + if (macosx_dsi != NULL) { + + if (window_handle == NULL) { + window_handle = newJavaManagedByteBuffer(env, sizeof(MacOSXWindowInfo)); + if (window_handle == NULL) { + throwException(env, "Could not create handle buffer"); + } + } else if (peer_info->window_info->window != nil) { + return window_handle; + } + + if (peer_info->isCALayer) { + [peer_info->glLayer release]; + } + + peer_info->glLayer = [GLLayer new]; + + peer_info->glLayer->macosx_dsi = macosx_dsi; + peer_info->glLayer->canvasBounds = (JAWT_Rectangle)surface->dsi->bounds; + peer_info->window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + peer_info->glLayer->window_info = peer_info->window_info; + peer_info->glLayer->autoResizable = autoResizable; + + // ensure the CALayer size is correct, needed for Java 7+ + peer_info->glLayer.frame = CGRectMake(x, y, peer_info->glLayer->canvasBounds.width, peer_info->glLayer->canvasBounds.height); + + [peer_info->glLayer performSelectorOnMainThread:@selector(createWindow:) withObject:peer_info->pixel_format waitUntilDone:YES]; + + peer_info->isCALayer = true; + peer_info->isWindowed = true; + peer_info->parent = nil; + + [pool release]; + return window_handle; + } + } + + // no CALayer support, fallback to using legacy method of getting the NSView of an AWT Canvas + peer_info->parent = macosx_dsi->cocoaViewRef; + peer_info->isCALayer = false; + peer_info->isWindowed = true; + + [pool release]; + return NULL; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nSetLayerPosition +(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint x, jint y) { + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + if (peer_info->glLayer != nil) { + NSPoint point = NSMakePoint(x, y); + NSValue *value = [NSValue valueWithPoint:point]; + [peer_info->glLayer performSelectorOnMainThread:@selector(updatePosition:) withObject:value waitUntilDone:NO]; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nSetLayerBounds +(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint x, jint y, jint width, jint height) { + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + if (peer_info->glLayer != nil) { + NSRect rect = NSMakeRect(x, y, width, height); + NSValue *value = [NSValue valueWithRect:rect]; + [peer_info->glLayer performSelectorOnMainThread:@selector(updateBounds:) withObject:value waitUntilDone:NO]; + } +} + +@implementation GLLayer + +- (void) attachLayer { + self.asynchronous = YES; + self.needsDisplayOnBoundsChange = YES; + self.opaque = NO; + if (autoResizable) { + self.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; + } + else { + self.autoresizingMask = kCALayerNotSizable; + } + + // get root layer of the AWT Canvas and add self to it + id <JAWT_SurfaceLayers> surfaceLayers = (id <JAWT_SurfaceLayers>)macosx_dsi; + + if (surfaceLayers.layer != self) { + surfaceLayers.layer = self; + + // flip CALayer y position, needed for Java 7 workaround + self.frame = CGRectMake(self.frame.origin.x, + self.superlayer.bounds.size.height - self.frame.origin.y - self.frame.size.height, + self.frame.size.width, self.frame.size.height); + } +} + +- (void) removeLayer { + + // clean up resources + glDeleteFramebuffersEXT(1, &fboID); + glDeleteRenderbuffersEXT(1, &imageRenderBufferID); + glDeleteRenderbuffersEXT(1, &depthRenderBufferID); + + // finish any pending blits before destroying the offscreen window to prevent crashes + glFinish(); + + // destroy offscreen Display window + [self destroyWindow]; + + // remove self from root layer + [self removeFromSuperlayer]; +} + +- (void)updatePosition:(NSValue*)value { + NSPoint point = [value pointValue]; + self.position = CGPointMake(point.x, self.superlayer.bounds.size.height - point.y - self.bounds.size.height); +} + +- (void)updateBounds:(NSValue*)value { + NSRect rect = [value rectValue]; + self.frame = CGRectMake(rect.origin.x, self.superlayer.bounds.size.height - rect.origin.y - self.bounds.size.height, rect.size.width, rect.size.height); +} + +- (int) getWidth { + return canvasBounds.width; +} + +- (int) getHeight { + return canvasBounds.height; +} + +- (void) createWindow:(NSOpenGLPixelFormat*)pixel_format { + if (window_info->window != nil) { + [window_info->window close]; + } + + window_info->display_rect = [[NSScreen mainScreen] frame]; + + window_info->view = [[MacOSXOpenGLView alloc] initWithFrame:window_info->display_rect pixelFormat:pixel_format]; + + window_info->window = [[MacOSXKeyableWindow alloc] initWithContentRect:window_info->display_rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; + [window_info->window setContentView:window_info->view]; + + [window_info->window orderOut:nil]; +} + +- (void) destroyWindow { + if (window_info->window != nil) { + [window_info->view removeFromSuperviewWithoutNeedingDisplay]; + [window_info->window close]; + window_info->window = nil; + } +} + +- (void) blitFrameBuffer { + + // get the size of the CALayer/AWT Canvas + int width = self.bounds.size.width; + int height = self.bounds.size.height; + + if (width != fboWidth || height != fboHeight) { + + // store current fbo/renderbuffers for later deletion + int oldFboID = fboID; + int oldImageRenderBufferID = imageRenderBufferID; + int oldDepthRenderBufferID = depthRenderBufferID; + + // create new fbo + int tempFBO; + glGenFramebuffersEXT(1, &tempFBO); + + // create new render buffers + glGenRenderbuffersEXT(1, &imageRenderBufferID); + glGenRenderbuffersEXT(1, &depthRenderBufferID); + + // switch to new fbo to attach render buffers + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, tempFBO); + + // initialize and attach image render buffer + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, imageRenderBufferID); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, imageRenderBufferID); + + // initialize and attach depth render buffer + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthRenderBufferID); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthRenderBufferID); + + // clear garbage background on new fbo + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + // blit frameBuffer to the new fbo + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, tempFBO); + glBlitFramebufferEXT(0, 0, width, height, + 0, 0, width, height, + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, + GL_NEAREST); + + glFinish(); // finish before using new fbo and resizing the window + + // set new fbo and its sizes + fboID = tempFBO; + fboWidth = width; + fboHeight = height; + + // set the size of the offscreen frame buffer window + window_info->display_rect = NSMakeRect(0, 0, width, height); + + // clean up the old fbo and renderBuffers + glDeleteFramebuffersEXT(1, &oldFboID); + glDeleteRenderbuffersEXT(1, &oldImageRenderBufferID); + glDeleteRenderbuffersEXT(1, &oldDepthRenderBufferID); + } + else { + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fboID); + + glBlitFramebufferEXT(0, 0, width, height, + 0, 0, width, height, + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, + GL_NEAREST); + } + + // restore default framebuffer + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +} + +-(void)drawInCGLContext:(CGLContextObj)glContext + pixelFormat:(CGLPixelFormatObj)pixelFormat + forLayerTime:(CFTimeInterval)timeInterval + displayTime:(const CVTimeStamp *)timeStamp { + + // set the current context + CGLSetCurrentContext(glContext); + + // get the size of the CALayer/AWT Canvas + int width = self.bounds.size.width; + int height = self.bounds.size.height; + + if (width != fboWidth || height != fboHeight) { + // clear garbage background before lwjgl fbo blit + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + } + + // read the LWJGL FBO and blit it into this CALayers FBO + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, fboID); + glBlitFramebufferEXT(0, 0, width, height, + 0, 0, width, height, + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, + GL_NEAREST); + + // call super to finalize the drawing - by default all it does is call glFlush() + [super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:timeInterval displayTime:timeStamp]; +} + +-(BOOL)canDrawInCGLContext:(CGLContextObj)glContext + pixelFormat:(CGLPixelFormatObj)pixelFormat + forLayerTime:(CFTimeInterval)timeInterval + displayTime:(const CVTimeStamp *)timeStamp { + return YES; +} + +- (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat { + CGLCreateContext(pixelFormat, [window_info->context CGLContextObj], &contextObject); + return contextObject; +} + +- (void)releaseCGLContext:(CGLContextObj)glContext { + CGLClearDrawable(contextObject); + // disable releasing context due to nvidia crash bug when releasing shared contexts + //CGLDestroyContext(contextObject); +} + +- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask { + return CGLGetPixelFormat([window_info->context CGLContextObj]); +} + +- (void)releaseCGLPixelFormat:(CGLPixelFormatObj)pixelFormat { + +} + +@end \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.h new file mode 100644 index 0000000..88e91a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.h @@ -0,0 +1,101 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXContextImplementation */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXContextImplementation +#define _Included_org_lwjgl_opengl_MacOSXContextImplementation +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nCreate + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nCreate + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: getCGLShareGroup + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_getCGLShareGroup + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nSwapBuffers + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nSwapBuffers + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nUpdate + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nUpdate + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nReleaseCurrentContext + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nReleaseCurrentContext + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: clearDrawable + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_clearDrawable + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: setView + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_setView + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nMakeCurrent + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nMakeCurrent + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nIsCurrent + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nIsCurrent + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nSetSwapInterval + * Signature: (Ljava/nio/ByteBuffer;I)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nSetSwapInterval + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXContextImplementation + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.m new file mode 100644 index 0000000..cc83f6e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXContextImplementation.m @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision$ + */ + +#import <jni.h> +#import <OpenGL/CGLCurrent.h> +#import <OpenGL/CGLTypes.h> +#import <OpenGL/CGLDevice.h> +#import <Cocoa/Cocoa.h> +#import "org_lwjgl_opengl_MacOSXContextImplementation.h" +#import "context.h" +#import "common_tools.h" + +typedef struct { + NSOpenGLContext *context; + MacOSXPeerInfo *peer_info; +} MacOSXContext; + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nCreate + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject shared_context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXPeerInfo *peer_info; + MacOSXContext *shared_context_info; + MacOSXContext *context_info; + NSOpenGLContext *context; + NSOpenGLContext *shared_context = NULL; + + jobject context_handle = newJavaManagedByteBuffer(env, sizeof(MacOSXContext)); + if (context_handle == NULL) { + throwException(env, "Could not create handle buffer"); + return NULL; + } + peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + if (shared_context_handle != NULL) { + shared_context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, shared_context_handle); + shared_context = shared_context_info->context; + } + context = [[NSOpenGLContext alloc] initWithFormat:peer_info->pixel_format shareContext:shared_context]; + if (context == NULL) { + throwException(env, "Could not create context"); + return NULL; + } + + if (peer_info->isWindowed) { + if (peer_info->window_info->fullscreen) { + // set a fixed backbuffer size for fullscreen + CGLContextObj cgcontext = (CGLContextObj)[context CGLContextObj]; + NSSize displaySize = peer_info->window_info->display_rect.size; + GLint dim[2] = {displaySize.width, displaySize.height}; + CGLSetParameter(cgcontext, kCGLCPSurfaceBackingSize, dim); + CGLEnable(cgcontext, kCGLCESurfaceBackingSize); + } + else { + // disable any fixed backbuffer size to allow resizing + CGLContextObj cgcontext = (CGLContextObj)[context CGLContextObj]; + CGLDisable(cgcontext, kCGLCESurfaceBackingSize); + } + + [peer_info->window_info->view setOpenGLContext:context]; + peer_info->window_info->context = context; + } + + context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + context_info->context = context; + context_info->peer_info = peer_info; + + [pool release]; + return context_handle; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_getCGLShareGroup + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + CGLContextObj cgl_context = [context_info->context CGLContextObj]; + CGLShareGroupObj share_group = CGLGetShareGroup(cgl_context); + [pool release]; + return (jlong)share_group; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nSwapBuffers + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + [context_info->context flushBuffer]; + + if (context_info->peer_info->isCALayer) { + // blit the contents of buffer to CALayer + [context_info->peer_info->glLayer blitFrameBuffer]; + } + + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nUpdate + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + [context_info->context update]; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_clearDrawable +(JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + [context_info->context clearDrawable]; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nReleaseCurrentContext + (JNIEnv *env, jclass clazz) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + [NSOpenGLContext clearCurrentContext]; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_setView + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + if (peer_info->isWindowed) { + if (peer_info->isCALayer && [context_info->context view] != peer_info->window_info->view) { + // mark glViewport to be set manually when setting a new context view + peer_info->glLayer->setViewport = YES; + } + + [context_info->context setView: peer_info->window_info->view]; + } + else { + [context_info->context setPixelBuffer:peer_info->pbuffer cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0]; + } + + if (peer_info->isCALayer) { + // if using a CALayer, attach it to AWT Canvas and create a shared opengl context with current context + [peer_info->glLayer performSelectorOnMainThread:@selector(attachLayer) withObject:nil waitUntilDone:NO]; + } + + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nMakeCurrent + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + [context_info->context makeCurrentContext]; + + if (context_info->peer_info->isCALayer && context_info->peer_info->glLayer->setViewport) { + context_info->peer_info->glLayer->setViewport = NO; + glViewport(0, 0, [context_info->peer_info->glLayer getWidth], [context_info->peer_info->glLayer getHeight]); + } + + [pool release]; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nIsCurrent + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + bool result = context_info->context == [NSOpenGLContext currentContext]; + [pool release]; + return result ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nSetSwapInterval + (JNIEnv *env, jclass clazz, jobject context_handle, jint int_value) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + GLint value = int_value; + [context_info->context setValues:&value forParameter:NSOpenGLCPSwapInterval]; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nDestroy + (JNIEnv *env, jclass clazz, jobject context_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + MacOSXContext *context_info = (MacOSXContext *)(*env)->GetDirectBufferAddress(env, context_handle); + + if (context_info->peer_info->isCALayer) { + context_info->peer_info->isCALayer = false; + [context_info->peer_info->glLayer performSelectorOnMainThread:@selector(removeLayer) withObject:nil waitUntilDone:YES]; + [context_info->peer_info->glLayer release]; + context_info->peer_info->glLayer = nil; + // don't release context due to nvidia driver bug when releasing shared contexts + [context_info->context retain]; + } + + [context_info->context clearDrawable]; + + if (context_info->peer_info->isWindowed) { + [context_info->peer_info->window_info->view setOpenGLContext:nil]; + [context_info->context release]; + context_info->context = nil; + context_info->peer_info->window_info->context = nil; + } + else { + // don't release context due to nvidia driver bug when releasing shared contexts + //[context_info->context release]; + //context_info->context = nil; + } + + [pool release]; +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXDisplay.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXDisplay.h new file mode 100644 index 0000000..98519f0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXDisplay.h @@ -0,0 +1,161 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXDisplay */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXDisplay +#define _Included_org_lwjgl_opengl_MacOSXDisplay +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_MacOSXDisplay_PBUFFER_HANDLE_SIZE +#define org_lwjgl_opengl_MacOSXDisplay_PBUFFER_HANDLE_SIZE 24L +#undef org_lwjgl_opengl_MacOSXDisplay_GAMMA_LENGTH +#define org_lwjgl_opengl_MacOSXDisplay_GAMMA_LENGTH 256L +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nCreateWindow + * Signature: (IIIIZZZZLjava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nCreateWindow + (JNIEnv *, jobject, jint, jint, jint, jint, jboolean, jboolean, jboolean, jboolean, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetCurrentDisplayMode + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetCurrentDisplayMode + (JNIEnv *, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetDisplayModes + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetDisplayModes + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nIsMiniaturized + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsMiniaturized + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nIsFocused + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsFocused + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nSetResizable + * Signature: (Ljava/nio/ByteBuffer;Z)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nSetResizable + (JNIEnv *, jobject, jobject, jboolean); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nResizeWindow + * Signature: (Ljava/nio/ByteBuffer;IIII)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nResizeWindow + (JNIEnv *, jobject, jobject, jint, jint, jint, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nWasResized + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nWasResized + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetX + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetX + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetY + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetY + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetWidth + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetWidth + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nGetHeight + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGetHeight + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nIsNativeMode + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nIsNativeMode + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nDestroyCALayer + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyCALayer + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nDestroyWindow + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyWindow + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: setGammaRamp + * Signature: (Ljava/nio/FloatBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_setGammaRamp + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: restoreGamma + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_restoreGamma + (JNIEnv *, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXDisplay + * Method: nSetTitle + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nSetTitle + (JNIEnv *, jobject, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXMouseEventQueue.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXMouseEventQueue.h new file mode 100644 index 0000000..20c8579 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXMouseEventQueue.h @@ -0,0 +1,43 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXMouseEventQueue */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXMouseEventQueue +#define _Included_org_lwjgl_opengl_MacOSXMouseEventQueue +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_MacOSXMouseEventQueue_QUEUE_SIZE +#define org_lwjgl_opengl_MacOSXMouseEventQueue_QUEUE_SIZE 200L +#undef org_lwjgl_opengl_MacOSXMouseEventQueue_WHEEL_SCALE +#define org_lwjgl_opengl_MacOSXMouseEventQueue_WHEEL_SCALE 120L +#undef org_lwjgl_opengl_MacOSXMouseEventQueue_NUM_BUTTONS +#define org_lwjgl_opengl_MacOSXMouseEventQueue_NUM_BUTTONS 3L +/* + * Class: org_lwjgl_opengl_MacOSXMouseEventQueue + * Method: getMouseDeltas + * Signature: (Ljava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_getMouseDeltas + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXMouseEventQueue + * Method: nWarpCursor + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nWarpCursor + (JNIEnv *, jclass, jint, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXMouseEventQueue + * Method: nGrabMouse + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nGrabMouse + (JNIEnv *, jclass, jboolean); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.h new file mode 100644 index 0000000..18ebf07 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.h @@ -0,0 +1,31 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXNativeKeyboard */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXNativeKeyboard +#define _Included_org_lwjgl_opengl_MacOSXNativeKeyboard +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_MacOSXNativeKeyboard_QUEUE_SIZE +#define org_lwjgl_opengl_MacOSXNativeKeyboard_QUEUE_SIZE 200L +/* + * Class: org_lwjgl_opengl_MacOSXNativeKeyboard + * Method: nRegisterKeyListener + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeKeyboard_nRegisterKeyListener + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeKeyboard + * Method: nUnregisterKeyListener + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeKeyboard_nUnregisterKeyListener + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.m new file mode 100644 index 0000000..319351a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeKeyboard.m @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_opengl_MacOSXNativeKeyboard.m 3055 2012-08-29 0:46:00Z mojang $ + * + * Mac OS X native keyboard functions. + * + * @author mojang + * @version $Revision: 3055 $ + */ + +#import <AppKit/NSApplication.h> +#import <Cocoa/Cocoa.h> +#import <jni.h> +#import <unistd.h> +#import "common_tools.h" +#import "org_lwjgl_opengl_MacOSXNativeKeyboard.h" +#import "context.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeKeyboard_nRegisterKeyListener(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + window_info->jkeyboard = (*env)->NewGlobalRef(env, this); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeKeyboard_nUnregisterKeyListener(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + window_info->jkeyboard = NULL; +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.h new file mode 100644 index 0000000..1bd9769 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.h @@ -0,0 +1,75 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXNativeMouse */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXNativeMouse +#define _Included_org_lwjgl_opengl_MacOSXNativeMouse +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_MacOSXNativeMouse_QUEUE_SIZE +#define org_lwjgl_opengl_MacOSXNativeMouse_QUEUE_SIZE 200L +#undef org_lwjgl_opengl_MacOSXNativeMouse_WHEEL_SCALE +#define org_lwjgl_opengl_MacOSXNativeMouse_WHEEL_SCALE 120L +#undef org_lwjgl_opengl_MacOSXNativeMouse_NUM_BUTTONS +#define org_lwjgl_opengl_MacOSXNativeMouse_NUM_BUTTONS 3L +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nSetCursorPosition + * Signature: (Ljava/nio/ByteBuffer;II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nSetCursorPosition + (JNIEnv *, jobject, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nGrabMouse + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nGrabMouse + (JNIEnv *, jclass, jboolean); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nRegisterMouseListener + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nRegisterMouseListener + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nUnregisterMouseListener + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nUnregisterMouseListener + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nCreateCursor + * Signature: (IIIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nCreateCursor + (JNIEnv *, jclass, jint, jint, jint, jint, jint, jobject, jint, jobject, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nDestroyCursor + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nDestroyCursor + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_MacOSXNativeMouse + * Method: nSetCursor + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nSetCursor + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.m new file mode 100644 index 0000000..2f7455c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXNativeMouse.m @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_opengl_MacOSXNativeKeyboard.m 3055 2012-08-29 0:46:00Z mojang $ + * + * Mac OS X native keyboard functions. + * + * @author mojang + * @author kappaOne <one.kappa@gmail.com> + * @version $Revision: 3055 $ + */ + +#import <AppKit/NSApplication.h> +#import <Cocoa/Cocoa.h> +#import <jni.h> +#import <unistd.h> +#import "common_tools.h" +#import "org_lwjgl_opengl_MacOSXNativeMouse.h" +#import "context.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nGrabMouse(JNIEnv *env, jclass this, jboolean grab) { + CGAssociateMouseAndMouseCursorPosition(grab == JNI_TRUE ? FALSE : TRUE); + if (grab) { + CGDisplayHideCursor(kCGDirectMainDisplay); + } + else { + CGDisplayShowCursor(kCGDirectMainDisplay); + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nSetCursorPosition(JNIEnv *env, jclass this, jobject window_handle, jint x, jint y) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + + CGPoint p; + + if (window_info->fullscreen) { + NSPoint point = NSMakePoint(x, y); + + // convert point to window/screen coordinates + point = [window_info->view convertPoint:point fromView:nil]; + + p.x = point.x; + p.y = point.y; + } + else { + NSRect screenRect = [[window_info->window screen] frame]; + NSRect viewRect = [window_info->view frame]; + NSRect winRect = [window_info->window frame]; + + // get window coords of the view origin + NSPoint viewPoint = [window_info->view convertPoint:viewRect.origin fromView:nil]; + + // convert y to screen coordinates, origin bottom left + p.y = winRect.origin.y + viewPoint.y + (viewRect.size.height - y - 1); + + p.x = winRect.origin.x + viewPoint.x + x; + // flip y coordinates (origin top left) to allow use with CGDisplayMoveCursorToPoint + p.y = screenRect.size.height - p.y - 1; + } + + CGDisplayMoveCursorToPoint(CGMainDisplayID(), p); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nRegisterMouseListener(JNIEnv *env, jobject _this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + [window_info->window setAcceptsMouseMovedEvents:YES]; + window_info->jmouse = (*env)->NewGlobalRef(env, _this); + + // since initial mouse location is not reported until mouse is moved + // manually get the mouse location and report it with a fake event + NSPoint mouseLocation = [window_info->window mouseLocationOutsideOfEventStream]; + mouseLocation = [window_info->view convertPoint:mouseLocation fromView:nil]; + + NSEvent *mouseLocationEvent = [NSEvent + mouseEventWithType:NSMouseMoved + location:mouseLocation + modifierFlags:NSMouseMovedMask + timestamp:0 + windowNumber:[window_info->window windowNumber] + context:nil + eventNumber:0 + clickCount:0 + pressure:0]; + + [window_info->view mouseMoved:mouseLocationEvent]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nUnregisterMouseListener(JNIEnv *env, jobject this, jobject window_handle) { + MacOSXWindowInfo *window_info = (MacOSXWindowInfo *)(*env)->GetDirectBufferAddress(env, window_handle); + [window_info->window setAcceptsMouseMovedEvents:NO]; + window_info->jmouse = nil; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nCreateCursor(JNIEnv *env, jobject _this, jint width, jint height, jint x_hotspot, jint y_hotspot, jint num_images, jobject image_buffer, jint images_offset, jobject delay_buffer, jint delays_offset) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + jlong *bytes = (jint *)(*env)->GetDirectBufferAddress(env, image_buffer) + images_offset; + + NSBitmapImageRep *bitmap = [[[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:width pixelsHigh:height + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSDeviceRGBColorSpace + bitmapFormat:NSAlphaNonpremultipliedBitmapFormat + bytesPerRow:width*4 + bitsPerPixel:32] autorelease]; + memcpy((void*)bitmap.bitmapData, (void*)bytes, width*height*4); + + NSImage *image = [[[NSImage alloc] initWithSize:NSMakeSize(width, height)] autorelease]; + + [image addRepresentation:bitmap]; + + + NSCursor *cursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(x_hotspot, y_hotspot)]; + + [pool release]; + + return (jlong)cursor; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nDestroyCursor(JNIEnv *env, jobject _this, jlong cursor_pointer) { + if (cursor_pointer != 0) { + NSCursor *cursor = (NSCursor *)cursor_pointer; + [cursor release]; + } +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXNativeMouse_nSetCursor(JNIEnv *env, jobject _this, jlong cursor_pointer) { + if (cursor_pointer == 0) { + // restore default cursor + [[NSCursor arrowCursor] performSelectorOnMainThread:@selector(set) withObject:nil waitUntilDone:NO]; + } + else { + NSCursor *cursor = (NSCursor *)cursor_pointer; + [cursor performSelectorOnMainThread:@selector(set) withObject:nil waitUntilDone:NO]; + } +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.h new file mode 100644 index 0000000..0f4c385 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXPbufferPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXPbufferPeerInfo +#define _Included_org_lwjgl_opengl_MacOSXPbufferPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_MacOSXPbufferPeerInfo + * Method: nCreate + * Signature: (Ljava/nio/ByteBuffer;II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPbufferPeerInfo_nCreate + (JNIEnv *, jclass, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_MacOSXPbufferPeerInfo + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPbufferPeerInfo_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.m new file mode 100644 index 0000000..3dd0f0b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPbufferPeerInfo.m @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#import <jni.h> +#import <Cocoa/Cocoa.h> +#import "org_lwjgl_opengl_MacOSXPbufferPeerInfo.h" +#import "context.h" +#import "common_tools.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPbufferPeerInfo_nCreate(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint width, jint height) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSOpenGLPixelBuffer *pbuffer = nil; + // check if the texture is power of 2 + if ( (( width > 0 ) && ( width & ( width-1)) == 0) || (( height > 0 ) && ( height & ( height-1)) == 0) ) + { + pbuffer = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_2D + textureInternalFormat:GL_RGBA + textureMaxMipMapLevel:0 + pixelsWide:width + pixelsHigh:height]; + } + else + { + pbuffer = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_RECTANGLE_EXT + textureInternalFormat:GL_RGBA + textureMaxMipMapLevel:0 + pixelsWide:width + pixelsHigh:height]; + } + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->pbuffer = pbuffer; + peer_info->isWindowed = false; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPbufferPeerInfo_nDestroy + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + [peer_info->pbuffer release]; + [pool release]; +} diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.h b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.h new file mode 100644 index 0000000..8344cc9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_MacOSXPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_MacOSXPeerInfo +#define _Included_org_lwjgl_opengl_MacOSXPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_MacOSXPeerInfo + * Method: createHandle + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_createHandle + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_MacOSXPeerInfo + * Method: nChoosePixelFormat + * Signature: (Ljava/nio/ByteBuffer;Lorg/lwjgl/opengl/PixelFormat;ZZZZZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_nChoosePixelFormat + (JNIEnv *, jclass, jobject, jobject, jboolean, jboolean, jboolean, jboolean, jboolean); + +/* + * Class: org_lwjgl_opengl_MacOSXPeerInfo + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.m b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.m new file mode 100644 index 0000000..f06991d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/macosx/org_lwjgl_opengl_MacOSXPeerInfo.m @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#import <jni.h> +#import <Cocoa/Cocoa.h> +#import "org_lwjgl_opengl_MacOSXPeerInfo.h" +#import "context.h" +#import "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_createHandle + (JNIEnv *env, jclass clazz) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + jobject handle = newJavaManagedByteBuffer(env, sizeof(MacOSXPeerInfo)); + [pool release]; + return handle; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_nChoosePixelFormat + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject pixel_format, jboolean gl32, jboolean use_display_bpp, jboolean support_window, jboolean support_pbuffer, jboolean double_buffered) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + NSOpenGLPixelFormat *macosx_pixel_format = choosePixelFormat(env, pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered); + if (pixel_format == nil) { + throwException(env, "Could not find pixel format"); + return; + } + peer_info->pixel_format = macosx_pixel_format; + [pool release]; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_nDestroy + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + [peer_info->pixel_format release]; + [pool release]; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/LWJGL.c b/etc/lwjgl-2.9.1/src/native/windows/LWJGL.c new file mode 100644 index 0000000..e5f93b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/LWJGL.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Basic DLL stub. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <stdio.h> +#include <jni.h> +#include "org_lwjgl_opengl_WindowsDisplay.h" + +HINSTANCE dll_handle; + +/* + * DLL entry point for Windows. Called when Java loads the .dll + */ +BOOL WINAPI DllMain( + HINSTANCE hinstDLL, // handle to DLL module + DWORD fdwReason, // reason for calling function + LPVOID lpvReserved // reserved + ) +{ + dll_handle = hinstDLL; + return TRUE; // Success +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDllInstance(JNIEnv *env, jclass unused) { + return (LONG_PTR)dll_handle; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/Window.h b/etc/lwjgl-2.9.1/src/native/windows/Window.h new file mode 100644 index 0000000..1f4db9b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/Window.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Include file to access public window features + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ +#ifndef _LWJGL_WINDOW_H_INCLUDED_ + #define _LWJGL_WINDOW_H_INCLUDED_ + + #define WIN32_LEAN_AND_MEAN + #ifndef _WIN32_WINDOWS + #define _WIN32_WINDOWS 0x0500 + #endif + #ifndef WINVER + #define WINVER 0x0500 + #endif + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0400 + #endif + + #define _UNICODE + #include <tchar.h> + + #define UNICODE + #include <windows.h> + #include <jni.h> + #include "common_tools.h" + + #ifdef _PRIVATE_WINDOW_H_ + #define WINDOW_H_API + #else + #define WINDOW_H_API extern + #endif /* _PRIVATE_WINDOW_H_ */ + +#endif /* _LWJGL_WINDOW_H_INCLUDED_ */ diff --git a/etc/lwjgl-2.9.1/src/native/windows/display.c b/etc/lwjgl-2.9.1/src/native/windows/display.c new file mode 100644 index 0000000..5ea487a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/display.c @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Windows specific library for display handling. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +#include <windows.h> +#include <jni.h> +#include "org_lwjgl_opengl_WindowsDisplay.h" +#include "display.h" +#include "common_tools.h" + +static jobject createDisplayMode(JNIEnv *env, DEVMODE *devmode) { + jclass displayModeClass; + + jmethodID displayModeConstructor; + + displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + if (displayModeClass == NULL) + return NULL; + displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); + if (displayModeConstructor == NULL) + return NULL; + + return (*env)->NewObject(env, displayModeClass, displayModeConstructor, + devmode->dmPelsWidth, devmode->dmPelsHeight, + devmode->dmBitsPerPel, devmode->dmDisplayFrequency); +} + +/** + * Choose displaymodes using extended codepath (multiple displaydevices) + */ +jobjectArray getAvailableDisplayModes(JNIEnv * env) { + + int i = 0, j = 0, n = 0; + +// DISPLAY_DEVICE DisplayDevice; + DEVMODE DevMode; + jobject *display_mode_objects = NULL; + int list_size = 0; + + jclass displayModeClass; + jobjectArray ret; + displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + + ZeroMemory(&DevMode, sizeof(DEVMODE)); +// ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE)); + + DevMode.dmSize = sizeof(DEVMODE); +// DisplayDevice.cb = sizeof(DISPLAY_DEVICE); + + /* Multi-monitor stuff commented out since we're only really interested in the primary monitor */ +/* while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) { + // continue if mirroring device + if((DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) != 0) { + continue; + } + + j = 0; + while(EnumDisplaySettings((const char *) DisplayDevice.DeviceName, j++, &DevMode) != 0) {*/ + while(EnumDisplaySettings(NULL, j++, &DevMode) != 0) { + // Filter out indexed modes + if (DevMode.dmBitsPerPel > 8 && ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN | CDS_TEST) == DISP_CHANGE_SUCCESSFUL) { + jobject displayMode; + if (list_size <= n) { + list_size += 1; + display_mode_objects = (jobject *)realloc(display_mode_objects, sizeof(jobject)*list_size); + if (display_mode_objects == NULL) + return NULL; + } + displayMode = createDisplayMode(env, &DevMode); + display_mode_objects[n++] = displayMode; + } + } +// } + printfDebugJava(env, "Found %d displaymodes", n); + + ret = (*env)->NewObjectArray(env, n, displayModeClass, NULL); + for (i = 0; i < n; i++) { + (*env)->SetObjectArrayElement(env, ret, i, display_mode_objects[i]); + } + free(display_mode_objects); + return ret; +} + +void switchDisplayMode(JNIEnv * env, jobject mode) { + DEVMODE devmode; + + jclass cls_displayMode = (*env)->GetObjectClass(env, mode); + jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); + jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); + jfieldID fid_bpp = (*env)->GetFieldID(env, cls_displayMode, "bpp", "I"); + jfieldID fid_freq = (*env)->GetFieldID(env, cls_displayMode, "freq", "I"); + + int width = (*env)->GetIntField(env, mode, fid_width); + int height = (*env)->GetIntField(env, mode, fid_height); + int bpp = (*env)->GetIntField(env, mode, fid_bpp); + int freq = (*env)->GetIntField(env, mode, fid_freq); + LONG cdsret; + + ZeroMemory(&devmode, sizeof(DEVMODE)); + devmode.dmSize = sizeof(DEVMODE); + devmode.dmBitsPerPel = bpp; + devmode.dmPelsWidth = width; + devmode.dmPelsHeight = height; + devmode.dmDisplayFrequency = freq; + devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + if (freq != 0) + devmode.dmFields |= DM_DISPLAYFREQUENCY; + cdsret = ChangeDisplaySettings(&devmode, CDS_FULLSCREEN); + + if (cdsret != DISP_CHANGE_SUCCESSFUL) { + /* What's the proper way to do this multiply with 2 thing, if at all necessary? */ +/* // Failed: so let's check to see if it's a wierd dual screen display + printfDebugJava(env, "Failed to set display mode (%ld) ... assuming dual monitors", cdsret); + devmode.dmPelsWidth = width * 2; + cdsret = ChangeDisplaySettings(&devmode, CDS_FULLSCREEN); + + if (cdsret != DISP_CHANGE_SUCCESSFUL) { + printfDebugJava(env, "Failed to set display mode using dual monitors (%ld)", cdsret);*/ + throwFormattedException(env, "Failed to set display mode (%ld).", cdsret); + return; +// } + } +} + +static jobject createNativeGammaBuffer(JNIEnv *env) { + return newJavaManagedByteBuffer(env, sizeof(WORD)*3*org_lwjgl_opengl_WindowsDisplay_GAMMA_LENGTH); +} + +jobject getCurrentGammaRamp(JNIEnv *env) { + jobject gamma_buffer; + WORD *gamma; + HDC screenDC; + + gamma_buffer = createNativeGammaBuffer(env); + if (gamma_buffer == NULL) + return NULL; + gamma = (WORD *)(*env)->GetDirectBufferAddress(env, gamma_buffer); + + // Get the screen + screenDC = GetDC(NULL); + if (screenDC == NULL) { + throwException(env, "Couldn't get screen DC!"); + return NULL; + } + // Get the default gamma ramp + if (GetDeviceGammaRamp(screenDC, gamma) == FALSE) { + printfDebugJava(env, "Failed to get initial device gamma"); + } + ReleaseDC(NULL, screenDC); + return gamma_buffer; +} + +void setGammaRamp(JNIEnv * env, jobject gammaRampBuffer) { + HDC screenDC; + WORD *gammaRamp = (WORD *)(*env)->GetDirectBufferAddress(env, gammaRampBuffer); + + screenDC = GetDC(NULL); + if (SetDeviceGammaRamp(screenDC, gammaRamp) == FALSE) { + throwException(env, "Failed to set device gamma."); + } + ReleaseDC(NULL, screenDC); +} + +jobject convertToNativeRamp(JNIEnv *env, jobject float_gamma_obj) { + int i; + float scaledRampEntry; + WORD rampEntry; + const float *gammaRamp = (const float *)(*env)->GetDirectBufferAddress(env, float_gamma_obj); + jint gamma_ramp_length = (jint)(*env)->GetDirectBufferCapacity(env, float_gamma_obj); + jobject native_ramp; + WORD *native_ramp_buffer; + + native_ramp = createNativeGammaBuffer(env); + if (native_ramp == NULL) + return NULL; + native_ramp_buffer = (WORD *)(*env)->GetDirectBufferAddress(env, native_ramp); + // Turn array of floats into array of RGB WORDs + + for (i = 0; i < gamma_ramp_length; i++) { + scaledRampEntry = gammaRamp[i]*0xffff; + rampEntry = (WORD)scaledRampEntry; + native_ramp_buffer[i] = rampEntry; + native_ramp_buffer[i + org_lwjgl_opengl_WindowsDisplay_GAMMA_LENGTH] = rampEntry; + native_ramp_buffer[i + 2*org_lwjgl_opengl_WindowsDisplay_GAMMA_LENGTH] = rampEntry; + } + return native_ramp; +} + +jobject getCurrentDisplayMode(JNIEnv * env) { + DEVMODE devmode; + if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode)) { + throwFormattedException(env, "Couldn't get current display settings (%ld)", GetLastError()); + return NULL; + } + return createDisplayMode(env, &devmode); +} + +void resetDisplayMode(JNIEnv * env) { + // Under Windows, all we have to do is: + ChangeDisplaySettings(NULL, 0); +} + +jobject getVersion(JNIEnv * env, char *driver) +{ + DWORD var = 0; + DWORD dwInfoSize; + LPVOID lpInfoBuff; + BOOL bRetval; + jclass version_class; + jmethodID version_cons; + jobject ret = NULL; + + version_class = (*env)->FindClass(env, "org/lwjgl/opengl/WindowsFileVersion"); + if (version_class == NULL) + return NULL; + version_cons = (*env)->GetMethodID(env, version_class, "<init>", "(II)V"); + if (version_cons == NULL) + return NULL; + + dwInfoSize = GetFileVersionInfoSize(driver, &var); + lpInfoBuff = malloc(dwInfoSize); + if (lpInfoBuff == NULL) { + throwException(env, "Failed to allocate lpInfoBuff"); + return NULL; + } + bRetval = GetFileVersionInfo(driver, 0, dwInfoSize, lpInfoBuff); + if (bRetval != 0) { + VS_FIXEDFILEINFO * fxdFileInfo; + + UINT uiLen = 0; + bRetval = VerQueryValue(lpInfoBuff, TEXT("\\"), (void *)&fxdFileInfo, &uiLen); + if (bRetval != 0) + ret = (*env)->NewObject(env, version_class, version_cons, fxdFileInfo->dwProductVersionMS, fxdFileInfo->dwProductVersionLS); + } + + free(lpInfoBuff); + + return ret; +} + diff --git a/etc/lwjgl-2.9.1/src/native/windows/display.h b/etc/lwjgl-2.9.1/src/native/windows/display.h new file mode 100644 index 0000000..9a5eb77 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/display.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Windows specific library for display handling. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +#ifndef _DISPLAY_H +#define _DISPLAY_H + +#include <jni.h> + +extern jobjectArray getAvailableDisplayModes(JNIEnv *env); +extern void switchDisplayMode(JNIEnv * env, jobject mode); +extern void resetDisplayMode(JNIEnv * env); +extern void restoreDisplayMode(void); +extern void setGammaRamp(JNIEnv * env, jobject gammaRampBuffer); +extern jobject getCurrentGammaRamp(JNIEnv *env); +extern jobject getCurrentDisplayMode(JNIEnv * env); +extern jobject getVersion(JNIEnv * env, char *driver); +extern jobject convertToNativeRamp(JNIEnv *env, jobject float_gamma_obj); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.c new file mode 100644 index 0000000..b4fde7f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * WGL extension implementations. + * + * @author Spasi + */ +#include "WGL.h" + +/* NV_present_video functions */ + +jint extgl_EnumerateVideoDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + HVIDEOOUTPUTDEVICENV *devices_address = ((HVIDEOOUTPUTDEVICENV *)safeGetBufferAddress(env, devices)) + devices_position; + + return peer_info->extensions.wglEnumerateVideoDevicesNV(peer_info->drawable_hdc, devices_address); +} + +jboolean extgl_BindVideoDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + const int *attrib_list_address = ((const int *)safeGetBufferAddress(env, attrib_list)) + attrib_list_position; + + return peer_info->extensions.wglBindVideoDeviceNV(peer_info->drawable_hdc, video_slot, video_device == 0 ? INVALID_HANDLE_VALUE : (HVIDEOOUTPUTDEVICENV)(intptr_t)video_device, attrib_list_address); +} + +jboolean extgl_QueryContextNV(JNIEnv *env, jobject peer_info_handle, jobject context_handle, jint attrib, jobject value, jint value_position) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + int *value_address = ((int *)(*env)->GetDirectBufferAddress(env, value)) + value_position; + + return peer_info->extensions.wglQueryCurrentContextNV(attrib, value_address); +} + +/* NV_video_capture functions */ + +jboolean extgl_BindVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong device) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + return peer_info->extensions.wglBindVideoCaptureDeviceNV(video_slot, (HVIDEOINPUTDEVICENV)(intptr_t)device); +} + +jint extgl_EnumerateVideoCaptureDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + HVIDEOINPUTDEVICENV *devices_address = ((HVIDEOINPUTDEVICENV *)safeGetBufferAddress(env, devices)) + devices_position; + + return peer_info->extensions.wglEnumerateVideoCaptureDevicesNV(peer_info->drawable_hdc, devices_address); +} + +jboolean extgl_LockVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + return peer_info->extensions.wglLockVideoCaptureDeviceNV(peer_info->drawable_hdc, (HVIDEOINPUTDEVICENV)(intptr_t)device); +} + +jboolean extgl_QueryVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device, jint attribute, jobject value, jint value_position) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + int *value_address = ((int *)(*env)->GetDirectBufferAddress(env, value)) + value_position; + + return peer_info->extensions.wglQueryVideoCaptureDeviceNV(peer_info->drawable_hdc, (HVIDEOINPUTDEVICENV)(intptr_t)device, attribute, value_address); +} + +jboolean extgl_ReleaseVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + + return peer_info->extensions.wglReleaseVideoCaptureDeviceNV(peer_info->drawable_hdc, (HVIDEOINPUTDEVICENV)(intptr_t)device); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.h new file mode 100644 index 0000000..6a00e2d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/WGL.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * WGL extension implementations. + * + * @author Spasi + */ +#ifndef __LWJGL_WGL_H +#define __LWJGL_WGL_H + +#include <jni.h> +#include "common_tools.h" +#include "context.h" + +#include "extgl.h" +#include "extgl_wgl.h" + +/* NV_present_video functions */ +extern jint extgl_EnumerateVideoDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); +extern jboolean extgl_BindVideoDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong video_device, jobject attrib_list, jint attrib_list_position); +extern jboolean extgl_QueryContextNV(JNIEnv *env, jobject peer_info_handle, jobject context_handle, jint attrib, jobject value, jint value_position); + +/* NV_video_capture functions */ +extern jboolean extgl_BindVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jint video_slot, jlong device); +extern jint extgl_EnumerateVideoCaptureDevicesNV(JNIEnv *env, jobject peer_info_handle, jobject devices, jint devices_position); +extern jboolean extgl_LockVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); +extern jboolean extgl_QueryVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device, jint attribute, jobject value, jint value_position); +extern jboolean extgl_ReleaseVideoCaptureDeviceNV(JNIEnv *env, jobject peer_info_handle, jlong device); + +#endif \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/context.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/context.c new file mode 100644 index 0000000..97c54b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/context.c @@ -0,0 +1,501 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naue <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <malloc.h> +#include "Window.h" +#include "extgl.h" +#include "extgl_wgl.h" +#include "context.h" + +extern HINSTANCE dll_handle; // Handle to the LWJGL dll + +#define _CONTEXT_PRIVATE_CLASS_NAME _T("__lwjgl_context_class_name") + +/* + * Register the LWJGL window class. + * Returns true for success, or false for failure + */ +bool registerWindow(WNDPROC win_proc, LPCTSTR class_name) +{ + WNDCLASS windowClass; + memset(&windowClass, 0, sizeof(windowClass)); + windowClass.style = CS_OWNDC; + windowClass.lpfnWndProc = win_proc; + windowClass.cbClsExtra = 0; + windowClass.cbWndExtra = 0; + windowClass.hInstance = dll_handle; + windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.hbrBackground = NULL; + windowClass.lpszMenuName = NULL; + windowClass.lpszClassName = class_name; + + if (RegisterClass(&windowClass) == 0) { + printfDebug("Failed to register window class\n"); + return false; + } + return true; +} + +static LRESULT CALLBACK dummyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +bool applyPixelFormat(JNIEnv *env, HDC hdc, int iPixelFormat) { + PIXELFORMATDESCRIPTOR desc; + if (DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &desc) == 0) { + throwFormattedException(env, "DescribePixelFormat failed (%d)", GetLastError()); + return false; + } + + // make that the pixel format of the device context + if (SetPixelFormat(hdc, iPixelFormat, &desc) == FALSE) { + throwFormattedException(env, "SetPixelFormat failed (%d)", GetLastError()); + return false; + } + return true; +} + +/* + * Close the window + */ +void closeWindow(HWND *hwnd, HDC *hdc) +{ + // Release device context + if (*hdc != NULL && *hwnd != NULL) { + ReleaseDC(*hwnd, *hdc); + *hdc = NULL; + } + + // Close the window + if (*hwnd != NULL) { + ShowWindow(*hwnd, SW_HIDE); + DestroyWindow(*hwnd); + *hwnd = NULL; + } +} + +void getWindowFlags(DWORD *windowflags_return, DWORD *exstyle_return, bool undecorated, bool child_window) { + DWORD exstyle, windowflags; + if (undecorated) { + exstyle = WS_EX_APPWINDOW; + windowflags = WS_POPUP; + } else if (child_window) { + exstyle = 0; + windowflags = WS_CHILD; + } else { + exstyle = WS_EX_APPWINDOW; + windowflags = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU; + } + windowflags = windowflags | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; + *windowflags_return = windowflags; + *exstyle_return = exstyle; +} + +HWND createWindow(LPCTSTR window_class_name, int x, int y, int width, int height, bool undecorated, bool child_window, HWND parent) +{ + RECT clientSize; + DWORD exstyle, windowflags; + HWND new_hwnd; + + getWindowFlags(&windowflags, &exstyle, undecorated, child_window); + + clientSize.bottom = height; + clientSize.left = 0; + clientSize.right = width; + clientSize.top = 0; + + AdjustWindowRectEx( + &clientSize, // client-rectangle structure + windowflags, // window styles + FALSE, // menu-present option + exstyle // extended window style + ); + // Create the window now, using that class: + new_hwnd = CreateWindowEx ( + exstyle, + window_class_name, + _T(""), + windowflags, + x, y, clientSize.right - clientSize.left, clientSize.bottom - clientSize.top, + parent, + NULL, + dll_handle, + NULL); + + return new_hwnd; +} + +static int convertToBPE(int bpp) { + int bpe; + switch (bpp) { + case 0: + bpe = 0; + break; + case 32: + case 24: + bpe = 8; + break; + case 16: /* Fall through */ + default: + bpe = 4; + break; + } + return bpe; +} + +static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, int bpp, bool window, bool pbuffer, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + + jboolean stereo = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + jboolean floating_point = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + jboolean floating_point_packed = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + jboolean sRGB = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + + int pixel_type; + int iPixelFormat; + unsigned int num_formats_returned; + attrib_list_t attrib_list; + GLuint *pixelFormatCaps_ptr; + jlong pixelFormatCapsSize; + BOOL result; + jlong i; + int bpe = convertToBPE(bpp); + + if ( floating_point ) + pixel_type = WGL_TYPE_RGBA_FLOAT_ARB; + else if ( floating_point_packed ) + pixel_type = WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT; + else + pixel_type = WGL_TYPE_RGBA_ARB; + + initAttribList(&attrib_list); + if (window) { + putAttrib(&attrib_list, WGL_DRAW_TO_WINDOW_ARB); putAttrib(&attrib_list, TRUE); + } + if (pbuffer) { + putAttrib(&attrib_list, WGL_DRAW_TO_PBUFFER_ARB); putAttrib(&attrib_list, TRUE); + } + if (!getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL")) { + putAttrib(&attrib_list, WGL_ACCELERATION_ARB); putAttrib(&attrib_list, WGL_FULL_ACCELERATION_ARB); + } + putAttrib(&attrib_list, WGL_PIXEL_TYPE_ARB); putAttrib(&attrib_list, pixel_type); + if ( double_buffer || samples == 0 ) { + // Skip this for FALSE + MSAA: NV drivers won't return any PixelFormat + putAttrib(&attrib_list, WGL_DOUBLE_BUFFER_ARB); putAttrib(&attrib_list, double_buffer ? TRUE : FALSE); + } + putAttrib(&attrib_list, WGL_SUPPORT_OPENGL_ARB); putAttrib(&attrib_list, TRUE); + putAttrib(&attrib_list, WGL_RED_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_GREEN_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_BLUE_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_ALPHA_BITS_ARB); putAttrib(&attrib_list, alpha); + putAttrib(&attrib_list, WGL_DEPTH_BITS_ARB); putAttrib(&attrib_list, depth); + putAttrib(&attrib_list, WGL_STENCIL_BITS_ARB); putAttrib(&attrib_list, stencil); + // Assume caller checked extension availability + if (samples > 0) { + putAttrib(&attrib_list, WGL_SAMPLE_BUFFERS_ARB); putAttrib(&attrib_list, 1); + putAttrib(&attrib_list, WGL_SAMPLES_ARB); putAttrib(&attrib_list, samples); // WGL_COVERAGE_SAMPLES_NV if colorSamples > 0 + if ( colorSamples > 0 ) { + putAttrib(&attrib_list, WGL_COLOR_SAMPLES_NV); putAttrib(&attrib_list, colorSamples); + } + } + putAttrib(&attrib_list, WGL_ACCUM_BITS_ARB); putAttrib(&attrib_list, accum_bpp); + putAttrib(&attrib_list, WGL_ACCUM_ALPHA_BITS_ARB); putAttrib(&attrib_list, accum_alpha); + putAttrib(&attrib_list, WGL_STEREO_ARB); putAttrib(&attrib_list, stereo ? TRUE : FALSE); + putAttrib(&attrib_list, WGL_AUX_BUFFERS_ARB); putAttrib(&attrib_list, num_aux_buffers); + if (sRGB) { + putAttrib(&attrib_list, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); putAttrib(&attrib_list, TRUE); + } + + // Assume caller checked extension availability + if (pixelFormatCaps != NULL) { + pixelFormatCaps_ptr = (GLuint *)(*env)->GetDirectBufferAddress(env, pixelFormatCaps); + pixelFormatCapsSize = (*env)->GetDirectBufferCapacity(env, pixelFormatCaps); + + for (i = 0; i < pixelFormatCapsSize; i++) + putAttrib(&attrib_list, pixelFormatCaps_ptr[i]); + } + putAttrib(&attrib_list, 0); putAttrib(&attrib_list, 0); + result = extensions->wglChoosePixelFormatARB(hdc, attrib_list.attribs, NULL, 1, &iPixelFormat, &num_formats_returned); + + if (result == FALSE || num_formats_returned < 1) { + throwFormattedException(env, "Failed to find ARB pixel format %d %d\n", result, num_formats_returned); + return -1; + } + return iPixelFormat; +} + +static int findPixelFormatARB(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) { + int bpp; + int iPixelFormat; + int fallback_bpp = 16; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + if (use_hdc_bpp) { + bpp = GetDeviceCaps(hdc, BITSPIXEL); + iPixelFormat = findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer); + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionClear(env); + printfDebugJava(env, "Failed to find ARB pixel format with HDC depth %d, falling back to %d\n", bpp, fallback_bpp); + bpp = fallback_bpp; + } else + return iPixelFormat; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer); +} + +/* + * Find an appropriate pixel format + */ +static int findPixelFormatFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format, int bpp, bool double_buffer) +{ + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + jboolean stereo = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + unsigned int flags = PFD_DRAW_TO_WINDOW | // support window + PFD_SUPPORT_OPENGL | + (double_buffer ? PFD_DOUBLEBUFFER : 0) | + (stereo ? PFD_STEREO : 0); + PIXELFORMATDESCRIPTOR desc; + int iPixelFormat; + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd + 1, // version number + flags, // RGBA type + PFD_TYPE_RGBA, + (BYTE)bpp, + 0, 0, 0, 0, 0, 0, // color bits ignored + (BYTE)alpha, + 0, // shift bit ignored + accum_bpp + accum_alpha, // no accumulation buffer + 0, 0, 0, 0, // accum bits ignored + (BYTE)depth, + (BYTE)stencil, + num_aux_buffers, + PFD_MAIN_PLANE, // main layer + 0, // reserved + 0, 0, 0 // layer masks ignored + }; + // get the best available match of pixel format for the device context + iPixelFormat = ChoosePixelFormat(hdc, &pfd); + if (iPixelFormat == 0) { + throwException(env, "Failed to choose pixel format"); + return -1; + } + + if (DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &desc) == 0) { + throwException(env, "Could not describe pixel format"); + return -1; + } + + if (desc.cColorBits < bpp) { + throwException(env, "Insufficient color precision"); + return -1; + } + + if (desc.cAlphaBits < alpha) { + throwException(env, "Insufficient alpha precision"); + return -1; + } + + if (desc.cStencilBits < stencil) { + throwException(env, "Insufficient stencil precision"); + return -1; + } + + if (desc.cDepthBits < depth) { + throwException(env, "Insufficient depth buffer precision"); + return -1; + } + + if ((desc.dwFlags & PFD_GENERIC_FORMAT) != 0) { + jboolean allowSoftwareOpenGL = getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL"); + // secondary check for software override + if(!allowSoftwareOpenGL) { + throwException(env, "Pixel format not accelerated"); + return -1; + } + } + + if ((desc.dwFlags & flags) != flags) { + throwException(env, "Capabilities not supported"); + return -1; + } + return iPixelFormat; +} + +static int findPixelFormatDefault(JNIEnv *env, HDC hdc, jobject pixel_format, bool use_hdc_bpp, bool double_buffer) { + int bpp; + int iPixelFormat; + int fallback_bpp = 16; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + if (use_hdc_bpp) { + bpp = GetDeviceCaps(hdc, BITSPIXEL); + iPixelFormat = findPixelFormatFromBPP(env, hdc, pixel_format, bpp, double_buffer); + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionClear(env); + printfDebugJava(env, "Failed to find pixel format with HDC depth %d, falling back to %d\n", bpp, fallback_bpp); + bpp = fallback_bpp; + } else + return iPixelFormat; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return findPixelFormatFromBPP(env, hdc, pixel_format, bpp, double_buffer); +} + +static bool validateAndGetExtensions(JNIEnv *env, WGLExtensions *extensions, HDC dummy_hdc, HGLRC dummy_hglrc, int samples, int colorSamples, bool floating_point, bool floating_point_packed, bool sRGB, jobject pixelFormatCaps) { + if (!wglMakeCurrent(dummy_hdc, dummy_hglrc)) { + throwException(env, "Could not bind context to dummy window"); + return false; + } + extgl_InitWGL(extensions); + + if (!extensions->WGL_ARB_pixel_format) { + throwException(env, "No support for WGL_ARB_pixel_format"); + return false; + } + if (samples > 0 && !extensions->WGL_ARB_multisample) { + throwException(env, "No support for WGL_ARB_multisample"); + return false; + } + if (colorSamples > 0 && !extensions->WGL_NV_multisample_coverage) { + throwException(env, "No support for WGL_NV_multisample_coverage"); + return false; + } + /* + * Apparently, some drivers don't report WGL_ARB_pixel_format_float + * even though GL_ARB_color_buffer_float and WGL_ATI_color_format_float + * is supported. + */ + if (floating_point && !(extensions->WGL_ARB_pixel_format_float || extensions->WGL_ATI_pixel_format_float)) { + throwException(env, "No support for WGL_ARB_pixel_format_float nor WGL_ATI_pixel_format_float"); + return false; + } + if (floating_point_packed && !(extensions->WGL_EXT_pixel_format_packed_float)) { + throwException(env, "No support for WGL_EXT_pixel_format_packed_float"); + return false; + } + if (sRGB && !(extensions->WGL_ARB_framebuffer_sRGB)) { + throwException(env, "No support for WGL_ARB_framebuffer_sRGB"); + return false; + } + if (pixelFormatCaps != NULL && !extensions->WGL_ARB_render_texture) { + throwException(env, "No support for WGL_ARB_render_texture"); + return false; + } + return true; +} + +int findPixelFormatOnDC(JNIEnv *env, HDC hdc, int origin_x, int origin_y, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) { + HGLRC dummy_hglrc; + HDC saved_current_hdc; + HGLRC saved_current_hglrc; + WGLExtensions extensions; + HWND dummy_hwnd; + HDC dummy_hdc; + int pixel_format_id; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + bool floating_point = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + bool floating_point_packed = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + bool use_arb_selection = samples > 0 || floating_point || floating_point_packed || sRGB || pbuffer || pixelFormatCaps != NULL; + + pixel_format_id = findPixelFormatDefault(env, hdc, pixel_format, use_hdc_bpp, double_buffer); + if (!(*env)->ExceptionOccurred(env) && use_arb_selection) { + dummy_hwnd = createDummyWindow(origin_x, origin_y); + if (dummy_hwnd == NULL) { + throwException(env, "Could not create dummy window"); + return -1; + } + dummy_hdc = GetDC(dummy_hwnd); + if (!applyPixelFormat(env, dummy_hdc, pixel_format_id)) { + closeWindow(&dummy_hwnd, &dummy_hdc); + return -1; + } + dummy_hglrc = wglCreateContext(dummy_hdc); + if (dummy_hglrc == NULL) { + closeWindow(&dummy_hwnd, &dummy_hdc); + throwException(env, "Failed to create OpenGL rendering context"); + return -1; + } + // Save the current HDC and HGLRC to avoid disruption + saved_current_hdc = wglGetCurrentDC(); + saved_current_hglrc = wglGetCurrentContext(); + if (validateAndGetExtensions(env, &extensions, dummy_hdc, dummy_hglrc, samples, colorSamples, floating_point, floating_point_packed, sRGB, pixelFormatCaps)) { + pixel_format_id = findPixelFormatARB(env, hdc, &extensions, pixel_format, pixelFormatCaps, use_hdc_bpp, window, pbuffer, double_buffer); + } + wglMakeCurrent(saved_current_hdc, saved_current_hglrc); + wglDeleteContext(dummy_hglrc); + closeWindow(&dummy_hwnd, &dummy_hdc); + } + return pixel_format_id; +} + +static bool registerDummyWindow() { + static bool window_registered = false; + if (!window_registered) { + if (!registerWindow(dummyWindowProc, _CONTEXT_PRIVATE_CLASS_NAME)) { + return false; + } + window_registered = true; + } + return true; +} + +HWND createDummyWindow(int origin_x, int origin_y) { + if (!registerDummyWindow()) + return NULL; + return createWindow(_CONTEXT_PRIVATE_CLASS_NAME, origin_x, origin_y, 1, 1, false, false, NULL); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/context.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/context.h new file mode 100644 index 0000000..65c5dd4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/context.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#ifndef __LWJGL_CONTEXT_H +#define __LWJGL_CONTEXT_H + +#include "Window.h" +#include "extgl.h" +#include "extgl_wgl.h" + +typedef struct { + union { + HWND hwnd; + HPBUFFERARB pbuffer; + } u; + HDC drawable_hdc; + WGLExtensions extensions; +} WindowsPeerInfo; + +/* + * Register the LWJGL window class. + * Returns true for success, or false for failure + */ +extern bool registerWindow(); + +extern bool applyPixelFormat(JNIEnv *env, HDC hdc, int iPixelFormat); + +/* + * Close the window + */ +extern void closeWindow(HWND *hwnd, HDC *hdc); + +/** + * Create a dummy window suitable to create contexts from + */ +extern HWND createDummyWindow(int x, int y); + +/** + * Return appropriate window and extended style flags from the given fullscreen and undecorated property + */ +extern void getWindowFlags(DWORD *windowflags_return, DWORD *exstyle_return, bool undecorated, bool child_window); + +/* + * Create a window with the specified position, size, and + * fullscreen attribute. The window will have DirectInput associated + * with it. + * + * Returns true for success, or false for failure + */ +extern HWND createWindow(LPCTSTR window_class_name, int x, int y, int width, int height, bool undecorated, bool child_window, HWND parent); + +extern int findPixelFormatOnDC(JNIEnv *env, HDC hdc, int origin_x, int origin_y, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.c new file mode 100644 index 0000000..f7b75af --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.c @@ -0,0 +1,216 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2001-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. +------------------------------------------------------------------------------*/ +/* + Lev Povalahev + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ + +*/ + +#include <stdio.h> +#include <string.h> +#include "extgl_wgl.h" +#include "extgl.h" + +static HMODULE lib_gl_handle = NULL; + +void *extgl_GetProcAddress(const char *name) { + void *t = wglGetProcAddress(name); + if (t == NULL) + { + t = GetProcAddress(lib_gl_handle, name); + if (t == NULL) + { + printfDebug("Could not locate symbol %s\n", name); + } + } + return t; +} + +bool extgl_Open(JNIEnv *env) { + if (lib_gl_handle != NULL) + return true; + // load the dynamic libraries for OpenGL + lib_gl_handle = LoadLibrary("opengl32.dll"); + if (lib_gl_handle == NULL) { + throwException(env, "Could not load OpenGL library"); + return false; + } + return true; +} + +void extgl_Close(void) { + FreeLibrary(lib_gl_handle); + lib_gl_handle = NULL; +} + +/** returns true if the extension is available */ +static bool WGLQueryExtension(WGLExtensions *extensions, const char *name) { + const GLubyte *extension_string; + + if (!extensions->WGL_ARB_extensions_string) + if (!extensions->WGL_EXT_extensions_string) + return false; + else + extension_string = (GLubyte*)extensions->wglGetExtensionsStringEXT(); + else + extension_string = (GLubyte*)extensions->wglGetExtensionsStringARB(wglGetCurrentDC()); + return extgl_QueryExtension(extension_string, name); +} + +/*---------------------------------------------------------------------*/ + +static void extgl_InitWGLARBPbuffer(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglCreatePbufferARB", (void *)&extensions->wglCreatePbufferARB}, + {"wglGetPbufferDCARB", (void *)&extensions->wglGetPbufferDCARB}, + {"wglReleasePbufferDCARB", (void *)&extensions->wglReleasePbufferDCARB}, + {"wglDestroyPbufferARB", (void *)&extensions->wglDestroyPbufferARB}, + {"wglQueryPbufferARB", (void *)&extensions->wglQueryPbufferARB}}; + if (extensions->WGL_ARB_pbuffer) + extensions->WGL_ARB_pbuffer = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLARBPixelFormat(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglGetPixelFormatAttribivARB", (void *)&extensions->wglGetPixelFormatAttribivARB}, + {"wglGetPixelFormatAttribfvARB", (void *)&extensions->wglGetPixelFormatAttribfvARB}, + {"wglChoosePixelFormatARB", (void *)&extensions->wglChoosePixelFormatARB}}; + if (extensions->WGL_ARB_pixel_format) + extensions->WGL_ARB_pixel_format = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLARBRenderTexture(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglBindTexImageARB", (void *)&extensions->wglBindTexImageARB}, + {"wglReleaseTexImageARB", (void *)&extensions->wglReleaseTexImageARB}, + {"wglSetPbufferAttribARB", (void *)&extensions->wglSetPbufferAttribARB}}; + if (extensions->WGL_ARB_render_texture) + extensions->WGL_ARB_render_texture = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLEXTSwapControl(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglSwapIntervalEXT", (void *)&extensions->wglSwapIntervalEXT}, + {"wglGetSwapIntervalEXT", (void *)&extensions->wglGetSwapIntervalEXT}}; + if (extensions->WGL_EXT_swap_control) + extensions->WGL_EXT_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLARBMakeCurrentRead(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglMakeContextCurrentARB", (void *)&extensions->wglMakeContextCurrentARB}, + {"wglGetCurrentReadDCARB", (void *)&extensions->wglGetCurrentReadDCARB}}; + if (extensions->WGL_ARB_make_current_read) + extensions->WGL_ARB_make_current_read = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLARBCreateContext(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglCreateContextAttribsARB", (void *)&extensions->wglCreateContextAttribsARB} + }; + if (extensions->WGL_ARB_create_context) + extensions->WGL_ARB_create_context = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLNVPresentVideo(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglEnumerateVideoDevicesNV", (void *)&extensions->wglEnumerateVideoDevicesNV}, + {"wglBindVideoDeviceNV", (void *)&extensions->wglBindVideoDeviceNV}, + {"wglQueryCurrentContextNV", (void *)&extensions->wglQueryCurrentContextNV} + }; + + if (extensions->WGL_NV_present_video) + extensions->WGL_NV_present_video = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLNVVideoCapture(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglBindVideoCaptureDeviceNV", (void *)&extensions->wglBindVideoCaptureDeviceNV}, + {"wglEnumerateVideoCaptureDevicesNV", (void *)&extensions->wglEnumerateVideoCaptureDevicesNV}, + {"wglLockVideoCaptureDeviceNV", (void *)&extensions->wglLockVideoCaptureDeviceNV}, + {"wglQueryVideoCaptureDeviceNV", (void *)&extensions->wglQueryVideoCaptureDeviceNV}, + {"wglReleaseVideoCaptureDeviceNV", (void *)&extensions->wglReleaseVideoCaptureDeviceNV} + }; + + if (extensions->WGL_NV_video_capture) + extensions->WGL_NV_video_capture = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +/*---------------------------------------------------------------------*/ + +static void extgl_InitSupportedWGLExtensions(WGLExtensions *extensions) { + extensions->WGL_ARB_buffer_region = WGLQueryExtension(extensions, "WGL_ARB_buffer_region"); + extensions->WGL_ARB_make_current_read = WGLQueryExtension(extensions, "WGL_ARB_make_current_read"); + extensions->WGL_ARB_multisample = WGLQueryExtension(extensions, "WGL_ARB_multisample"); + extensions->WGL_ARB_pixel_format_float = WGLQueryExtension(extensions, "WGL_ARB_pixel_format_float"); + extensions->WGL_ATI_pixel_format_float = WGLQueryExtension(extensions, "WGL_ATI_pixel_format_float"); + extensions->WGL_ARB_pbuffer = WGLQueryExtension(extensions, "WGL_ARB_pbuffer"); + extensions->WGL_ARB_pixel_format = WGLQueryExtension(extensions, "WGL_ARB_pixel_format"); + extensions->WGL_ARB_render_texture = WGLQueryExtension(extensions, "WGL_ARB_render_texture"); + extensions->WGL_EXT_swap_control = WGLQueryExtension(extensions, "WGL_EXT_swap_control"); + extensions->WGL_NV_render_depth_texture = WGLQueryExtension(extensions, "WGL_NV_render_depth_texture"); + extensions->WGL_NV_render_texture_rectangle = WGLQueryExtension(extensions, "WGL_NV_render_texture_rectangle"); + extensions->WGL_ARB_framebuffer_sRGB = WGLQueryExtension(extensions, "WGL_ARB_framebuffer_sRGB") || WGLQueryExtension(extensions, "WGL_EXT_framebuffer_sRGB"); + extensions->WGL_EXT_pixel_format_packed_float = WGLQueryExtension(extensions, "WGL_EXT_pixel_format_packed_float"); + extensions->WGL_ARB_create_context = WGLQueryExtension(extensions, "WGL_ARB_create_context"); + extensions->WGL_NV_multisample_coverage = WGLQueryExtension(extensions, "WGL_NV_multisample_coverage"); + extensions->WGL_NV_present_video = WGLQueryExtension(extensions, "WGL_NV_present_video"); + extensions->WGL_NV_video_capture = WGLQueryExtension(extensions, "WGL_NV_video_capture"); +} + +static void extgl_InitWGLEXTExtensionsString(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglGetExtensionsStringEXT", (void *)&extensions->wglGetExtensionsStringEXT} + }; + extensions->WGL_EXT_extensions_string = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitWGLARBExtensionsString(WGLExtensions *extensions) { + ExtFunction functions[] = { + {"wglGetExtensionsStringARB", (void *)&extensions->wglGetExtensionsStringARB} + }; + extensions->WGL_ARB_extensions_string = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +void extgl_InitWGL(WGLExtensions *extensions) { + extgl_InitWGLARBExtensionsString(extensions); + extgl_InitWGLEXTExtensionsString(extensions); + + extgl_InitSupportedWGLExtensions(extensions); + + extgl_InitWGLARBMakeCurrentRead(extensions); + extgl_InitWGLEXTSwapControl(extensions); + extgl_InitWGLARBRenderTexture(extensions); + extgl_InitWGLARBPixelFormat(extensions); + extgl_InitWGLARBPbuffer(extensions); + extgl_InitWGLARBCreateContext(extensions); + extgl_InitWGLNVPresentVideo(extensions); + extgl_InitWGLNVVideoCapture(extensions); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.h new file mode 100644 index 0000000..4c3d9e5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/extgl_wgl.h @@ -0,0 +1,299 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2001-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. +------------------------------------------------------------------------------*/ +/* + Lev Povalahev + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ + +*/ + +#ifndef _EXTGL_WGL_H +#define _EXTGL_WGL_H + +#include <windows.h> +#include "extgl.h" +#include "common_tools.h" + +/*-------------------------------------------------------------------*/ +/*------------WGL_EXT_EXTENSION_STRING-------------------------------*/ +/*-------------------------------------------------------------------*/ + +typedef const char* (APIENTRY * wglGetExtensionsStringEXTPROC) (); + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_EXTENSION_STRING-------------------------------*/ +/*-------------------------------------------------------------------*/ + +typedef const char* (APIENTRY * wglGetExtensionsStringARBPROC) (HDC hdc); + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_PBUFFER----------------------------------------*/ +/*-------------------------------------------------------------------*/ + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#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 (APIENTRY * wglCreatePbufferARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); +typedef HDC (APIENTRY * wglGetPbufferDCARBPROC) (HPBUFFERARB hPbuffer); +typedef int (APIENTRY * wglReleasePbufferDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); +typedef BOOL (APIENTRY * wglDestroyPbufferARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (APIENTRY * wglQueryPbufferARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_PIXEL_FORMAT-----------------------------------*/ +/*-------------------------------------------------------------------*/ + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_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 +#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 + +typedef BOOL (APIENTRY * wglGetPixelFormatAttribivARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); +typedef BOOL (APIENTRY * wglGetPixelFormatAttribfvARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); +typedef BOOL (APIENTRY * wglChoosePixelFormatARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); + +typedef BOOL (APIENTRY * wglBindTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (APIENTRY * wglReleaseTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (APIENTRY * wglSetPbufferAttribARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); + +/*-------------------------------------------------------------------*/ +/*------------WGL_EXT_SWAP_CONTROL-----------------------------------*/ +/*-------------------------------------------------------------------*/ + +typedef BOOL (APIENTRY * wglSwapIntervalEXTPROC) (int interval); +typedef int (APIENTRY * wglGetSwapIntervalEXTPROC) (void); + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_MAKE_CURRENT_READ------------------------------*/ +/*-------------------------------------------------------------------*/ + +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 + +typedef BOOL (APIENTRY * wglMakeContextCurrentARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +typedef HDC (APIENTRY * wglGetCurrentReadDCARBPROC) (void); + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_MULTISAMPLE------------------------------------*/ +/*-------------------------------------------------------------------*/ + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +/*-------------------------------------------------------------------*/ +/*------------WGL_ARB_pixel_format_float ----------------------------*/ +/*-------------------------------------------------------------------*/ + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +/*-------------------------------------------------------------------*/ +/*------------WGL_ATI_pixel_format_float ----------------------------*/ +/*-------------------------------------------------------------------*/ + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 + +/*------------------------------------------------------------------*/ +/*------------ WGL_ARB_framebuffer_sRGB ----------------------------*/ +/*------------------------------------------------------------------*/ + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 + +/*---------------------------------------------------------------------------*/ +/*------------ WGL_EXT_pixel_format_packed_float ----------------------------*/ +/*---------------------------------------------------------------------------*/ + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +/*----------------------------------------------------------------*/ +/*------------ WGL_ARB_create_context ----------------------------*/ +/*----------------------------------------------------------------*/ + +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 + +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + +#define ERROR_INVALID_VERSION_ARB 0x2095 + +typedef HGLRC (APIENTRY * wglCreateContextAttribsARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); + +/*---------------------------------------------------------------------*/ +/*------------ WGL_NV_multisample_coverage ----------------------------*/ +/*---------------------------------------------------------------------*/ + +#define WGL_COVERAGE_SAMPLES_NV 0x2042 +#define WGL_COLOR_SAMPLES_NV 0x20B9 + +/*--------------------------------------------------------------*/ +/*------------ WGL_NV_present_video ----------------------------*/ +/*--------------------------------------------------------------*/ + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +typedef int (APIENTRY * wglEnumerateVideoDevicesNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV *phDeviceList); +typedef BOOL (APIENTRY * wglBindVideoDeviceNVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList); +typedef BOOL (APIENTRY * wglQueryCurrentContextNVPROC) (int iAttribute, int *piValue); + +/*--------------------------------------------------------------*/ +/*------------ WGL_NV_video_capture ----------------------------*/ +/*--------------------------------------------------------------*/ + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +typedef BOOL (APIENTRY * wglBindVideoCaptureDeviceNVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); +typedef UINT (APIENTRY * wglEnumerateVideoCaptureDevicesNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList); +typedef BOOL (APIENTRY * wglLockVideoCaptureDeviceNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); +typedef BOOL (APIENTRY * wglQueryVideoCaptureDeviceNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue); +typedef BOOL (APIENTRY * wglReleaseVideoCaptureDeviceNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); + +/*---------------------------------------------------------------------*/ + +typedef struct { + bool WGL_ARB_buffer_region; + bool WGL_ARB_extensions_string; + bool WGL_ARB_make_current_read; + bool WGL_ARB_multisample; + bool WGL_ARB_pbuffer; + bool WGL_ARB_pixel_format; + bool WGL_ARB_render_texture; + bool WGL_EXT_extensions_string; + bool WGL_EXT_swap_control; + bool WGL_NV_render_depth_texture; + bool WGL_NV_render_texture_rectangle; + bool WGL_ARB_pixel_format_float; + bool WGL_ATI_pixel_format_float; + bool WGL_ARB_framebuffer_sRGB; + bool WGL_EXT_pixel_format_packed_float; + bool WGL_ARB_create_context; + bool WGL_NV_multisample_coverage; + bool WGL_NV_present_video; + bool WGL_NV_video_capture; + + wglGetExtensionsStringEXTPROC wglGetExtensionsStringEXT; + + wglGetExtensionsStringARBPROC wglGetExtensionsStringARB; + + wglCreatePbufferARBPROC wglCreatePbufferARB; + wglGetPbufferDCARBPROC wglGetPbufferDCARB; + wglReleasePbufferDCARBPROC wglReleasePbufferDCARB; + wglDestroyPbufferARBPROC wglDestroyPbufferARB; + wglQueryPbufferARBPROC wglQueryPbufferARB; + + wglGetPixelFormatAttribivARBPROC wglGetPixelFormatAttribivARB; + wglGetPixelFormatAttribfvARBPROC wglGetPixelFormatAttribfvARB; + wglChoosePixelFormatARBPROC wglChoosePixelFormatARB; + + wglBindTexImageARBPROC wglBindTexImageARB; + wglReleaseTexImageARBPROC wglReleaseTexImageARB; + wglSetPbufferAttribARBPROC wglSetPbufferAttribARB; + + wglSwapIntervalEXTPROC wglSwapIntervalEXT; + wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT; + + wglMakeContextCurrentARBPROC wglMakeContextCurrentARB; + wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB; + + wglCreateContextAttribsARBPROC wglCreateContextAttribsARB; + + wglEnumerateVideoDevicesNVPROC wglEnumerateVideoDevicesNV; + wglBindVideoDeviceNVPROC wglBindVideoDeviceNV; + wglQueryCurrentContextNVPROC wglQueryCurrentContextNV; + + wglBindVideoCaptureDeviceNVPROC wglBindVideoCaptureDeviceNV; + wglEnumerateVideoCaptureDevicesNVPROC wglEnumerateVideoCaptureDevicesNV; + wglLockVideoCaptureDeviceNVPROC wglLockVideoCaptureDeviceNV; + wglQueryVideoCaptureDeviceNVPROC wglQueryVideoCaptureDeviceNV; + wglReleaseVideoCaptureDeviceNVPROC wglReleaseVideoCaptureDeviceNV; +} WGLExtensions; + +extern void extgl_InitWGL(WGLExtensions *extensions); + + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_Pbuffer.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_Pbuffer.c new file mode 100644 index 0000000..b2f1e6f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_Pbuffer.c @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Windows Pbuffer. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <stdlib.h> +#include "org_lwjgl_opengl_WindowsDisplay.h" +#include "org_lwjgl_opengl_Pbuffer.h" +#include "context.h" + +#include "extgl.h" +#include "extgl_wgl.h" + +#include "common_tools.h" + +static bool isPbufferSupported(WGLExtensions *extensions) { + return extensions->WGL_ARB_pixel_format && extensions->WGL_ARB_pbuffer; +} + +static bool getExtensions(JNIEnv *env, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps) { + int origin_x = 0; int origin_y = 0; + HWND dummy_hwnd; + HDC dummy_hdc; + HGLRC dummy_context; + HDC saved_hdc; + HGLRC saved_context; + int pixel_format_id; + + dummy_hwnd = createDummyWindow(origin_x, origin_y); + if (dummy_hwnd == NULL) { + throwException(env, "Could not create dummy window"); + return false; + } + dummy_hdc = GetDC(dummy_hwnd); + pixel_format_id = findPixelFormatOnDC(env, dummy_hdc, origin_x, origin_y, pixel_format, pixelFormatCaps, false, true, false, false); + if (pixel_format_id == -1) { + closeWindow(&dummy_hwnd, &dummy_hdc); + return false; + } + if (!applyPixelFormat(env, dummy_hdc, pixel_format_id)) { + closeWindow(&dummy_hwnd, &dummy_hdc); + return false; + } + dummy_context = wglCreateContext(dummy_hdc); + if (dummy_context == NULL) { + closeWindow(&dummy_hwnd, &dummy_hdc); + throwException(env, "Could not create dummy context"); + return false; + } + saved_hdc = wglGetCurrentDC(); + saved_context = wglGetCurrentContext(); + if (!wglMakeCurrent(dummy_hdc, dummy_context)) { + wglMakeCurrent(saved_hdc, saved_context); + closeWindow(&dummy_hwnd, &dummy_hdc); + wglDeleteContext(dummy_context); + throwException(env, "Could not make dummy context current"); + return false; + } + extgl_InitWGL(extensions); + if (!wglMakeCurrent(saved_hdc, saved_context)) + printfDebugJava(env, "ERROR: Could not restore current context"); + closeWindow(&dummy_hwnd, &dummy_hdc); + wglDeleteContext(dummy_context); + return true; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetPbufferCapabilities + (JNIEnv *env, jobject self, jobject pixel_format) +{ + int caps = 0; + WGLExtensions extensions; + if (!getExtensions(env, &extensions, pixel_format, NULL)) + return 0; + if (isPbufferSupported(&extensions)) + caps |= org_lwjgl_opengl_Pbuffer_PBUFFER_SUPPORTED; + + if (extensions.WGL_ARB_render_texture) + caps |= org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_SUPPORTED; + + if (extensions.WGL_NV_render_texture_rectangle) + caps |= org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_RECTANGLE_SUPPORTED; + + if (extensions.WGL_NV_render_depth_texture) + caps |= org_lwjgl_opengl_Pbuffer_RENDER_DEPTH_TEXTURE_SUPPORTED; + + return caps; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nCreate + (JNIEnv *env, jobject self, jobject peer_info_handle, + jint width, jint height, jobject pixel_format, + jobject pixelFormatCaps, jobject pBufferAttribs) +{ + int origin_x = 0; int origin_y = 0; + HWND dummy_hwnd; + HDC dummy_hdc; + HPBUFFERARB Pbuffer; + HDC Pbuffer_dc; + WGLExtensions extensions; + const int *pBufferAttribs_ptr; + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + int pixel_format_id; + + if ( pBufferAttribs != NULL ) { + pBufferAttribs_ptr = (const int *)(*env)->GetDirectBufferAddress(env, pBufferAttribs); + } else { + pBufferAttribs_ptr = NULL; + } + if (!getExtensions(env, &extensions, pixel_format, pixelFormatCaps)) + return; + dummy_hwnd = createDummyWindow(origin_x, origin_y); + if (dummy_hwnd == NULL) { + throwException(env, "Could not create dummy window"); + return; + } + dummy_hdc = GetDC(dummy_hwnd); + pixel_format_id = findPixelFormatOnDC(env, dummy_hdc, origin_x, origin_y, pixel_format, pixelFormatCaps, false, false, true, false); + if (pixel_format_id == -1) { + closeWindow(&dummy_hwnd, &dummy_hdc); + return; + } + Pbuffer = extensions.wglCreatePbufferARB(dummy_hdc, pixel_format_id, width, height, pBufferAttribs_ptr); + closeWindow(&dummy_hwnd, &dummy_hdc); + if (Pbuffer == NULL) { + throwException(env, "Could not create Pbuffer"); + return; + } + Pbuffer_dc = extensions.wglGetPbufferDCARB(Pbuffer); + if (Pbuffer_dc == NULL) { + extensions.wglDestroyPbufferARB(Pbuffer); + throwException(env, "Could not get Pbuffer DC"); + return; + } + peer_info->extensions = extensions; + peer_info->u.pbuffer = Pbuffer; + peer_info->drawable_hdc = Pbuffer_dc; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nDestroy + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->extensions.wglReleasePbufferDCARB(peer_info->u.pbuffer, peer_info->drawable_hdc); + peer_info->extensions.wglDestroyPbufferARB(peer_info->u.pbuffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nIsBufferLost + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + BOOL buffer_lost; + peer_info->extensions.wglQueryPbufferARB(peer_info->u.pbuffer, WGL_PBUFFER_LOST_ARB, &buffer_lost); + return buffer_lost ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nSetPbufferAttrib + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jint attrib, jint value) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + int attribs[3]; + + attribs[0] = attrib; + attribs[1] = value; + attribs[2] = 0; + + peer_info->extensions.wglSetPbufferAttribARB(peer_info->u.pbuffer, attribs); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nBindTexImageToPbuffer + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->extensions.wglBindTexImageARB(peer_info->u.pbuffer, buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nReleaseTexImageFromPbuffer + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->extensions.wglReleaseTexImageARB(peer_info->u.pbuffer, buffer); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.c new file mode 100644 index 0000000..266f068 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.c @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include "org_lwjgl_opengl_WindowsContextImplementation.h" +#include "context.h" +#include "extgl_wgl.h" +#include "common_tools.h" + +typedef struct { + HGLRC context; +} WindowsContext; + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nCreate + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject attribs, jobject shared_context_handle) { + WindowsPeerInfo *peer_info; + WindowsContext *shared_context_info; + WindowsContext *context_info; + HGLRC context; + HGLRC shared_context = NULL; + + // -- We need to create a temporary context to detect the presence of WGL_ARB_create_context + HDC saved_current_hdc; + HGLRC saved_current_hglrc; + WGLExtensions extensions; + const int *attribList = attribs == NULL ? NULL : ((const int *)(*env)->GetDirectBufferAddress(env, attribs)); + + jobject context_handle = newJavaManagedByteBuffer(env, sizeof(WindowsContext)); + if (context_handle == NULL) { + throwException(env, "Could not create handle buffer"); + return NULL; + } + + peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + if (shared_context_handle != NULL) { + shared_context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, shared_context_handle); + shared_context = shared_context_info->context; + } + + // Create the context + context = wglCreateContext(peer_info->drawable_hdc); + if (context == NULL) { + throwException(env, "Could not create context"); + return NULL; + } + + // Save the current HDC and HGLRC to avoid disruption + saved_current_hdc = wglGetCurrentDC(); + saved_current_hglrc = wglGetCurrentContext(); + + // Make context current and detect extensions + if (!wglMakeCurrent(peer_info->drawable_hdc, context)) { + throwException(env, "Could not bind dummy context"); + return NULL; + } + extgl_InitWGL(&extensions); + peer_info->extensions = extensions; + + // Restore previous context + wglMakeCurrent(saved_current_hdc, saved_current_hglrc); + + // + if ( extensions.WGL_ARB_create_context ) { // We support WGL_ARB_create_context, use the new context creation routine + // If we have no context to share and no special attributes, we don't have to recreate the context - wglCreateContext is equivalent to wglCreateContextAttribs(hdc,0,NULL). + if ( shared_context != NULL || attribList != NULL ) { + // Delete the oldschool context + wglDeleteContext(context); + // Create a new context using WGL_ARB_create_context + context = (HGLRC)extensions.wglCreateContextAttribsARB(peer_info->drawable_hdc, shared_context, attribList); + if (context == NULL) { + throwException(env, "Could not create context (WGL_ARB_create_context)"); + return NULL; + } + } + } else { // We don't support WGL_ARB_create_context, use the old context creation routine + if (shared_context != NULL && !wglShareLists(shared_context, context)) { // Use wglShareLists to share context data + wglDeleteContext(context); + throwException(env, "Could not share contexts"); + return NULL; + } + } + + context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, context_handle); + context_info->context = context; + return context_handle; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_getHGLRC(JNIEnv *env, jclass clazz, jobject context_handle) { + WindowsContext *context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, context_handle); + return (intptr_t)context_info->context; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_getHDC(JNIEnv *env, jclass clazz, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->drawable_hdc; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nSwapBuffers + (JNIEnv *env, jclass clazz, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + SwapBuffers(peer_info->drawable_hdc); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nReleaseCurrentContext + (JNIEnv *env, jclass clazz) { + wglMakeCurrent(NULL, NULL); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nMakeCurrent + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject context_handle) { + WindowsContext *context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, context_handle); + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + if (!wglMakeCurrent(peer_info->drawable_hdc, context_info->context)) + throwException(env, "Could not make context current"); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nIsCurrent + (JNIEnv *env, jclass clazz, jobject context_handle) { + WindowsContext *context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, context_handle); + return wglGetCurrentContext() == context_info->context; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nSetSwapInterval + (JNIEnv *env, jclass clazz, jint value) { + WGLExtensions extensions; + extgl_InitWGL(&extensions); + if (extensions.WGL_EXT_swap_control) { + return extensions.wglSwapIntervalEXT(value) ? JNI_TRUE : JNI_FALSE; + } else + return JNI_FALSE; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nDestroy + (JNIEnv *env, jclass clazz, jobject context_handle) { + WindowsContext *context_info = (WindowsContext *)(*env)->GetDirectBufferAddress(env, context_handle); + wglDeleteContext(context_info->context); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.h new file mode 100644 index 0000000..185d09b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsContextImplementation.h @@ -0,0 +1,85 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsContextImplementation */ + +#ifndef _Included_org_lwjgl_opengl_WindowsContextImplementation +#define _Included_org_lwjgl_opengl_WindowsContextImplementation +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nCreate + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nCreate + (JNIEnv *, jclass, jobject, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: getHGLRC + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_getHGLRC + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: getHDC + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_getHDC + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nSwapBuffers + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nSwapBuffers + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nReleaseCurrentContext + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nReleaseCurrentContext + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nMakeCurrent + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nMakeCurrent + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nIsCurrent + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nIsCurrent + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nSetSwapInterval + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nSetSwapInterval + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengl_WindowsContextImplementation + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPbufferPeerInfo.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPbufferPeerInfo.h new file mode 100644 index 0000000..2ed72b8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPbufferPeerInfo.h @@ -0,0 +1,61 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsPbufferPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_WindowsPbufferPeerInfo +#define _Included_org_lwjgl_opengl_WindowsPbufferPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nCreate + * Signature: (Ljava/nio/ByteBuffer;IILorg/lwjgl/opengl/PixelFormat;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nCreate + (JNIEnv *, jclass, jobject, jint, jint, jobject, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nIsBufferLost + * Signature: (Ljava/nio/ByteBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nIsBufferLost + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nSetPbufferAttrib + * Signature: (Ljava/nio/ByteBuffer;II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nSetPbufferAttrib + (JNIEnv *, jclass, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nBindTexImageToPbuffer + * Signature: (Ljava/nio/ByteBuffer;I)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nBindTexImageToPbuffer + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nReleaseTexImageFromPbuffer + * Signature: (Ljava/nio/ByteBuffer;I)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nReleaseTexImageFromPbuffer + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: org_lwjgl_opengl_WindowsPbufferPeerInfo + * Method: nDestroy + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nDestroy + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.c b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.c new file mode 100644 index 0000000..00c9421 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include "org_lwjgl_opengl_WindowsPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_createHandle(JNIEnv *env, jclass clazz) { + return newJavaManagedByteBuffer(env, sizeof(WindowsPeerInfo)); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nChoosePixelFormat + (JNIEnv *env, jclass clazz, jlong hdc_ptr, jint origin_x, jint origin_y, jobject pixel_format, jobject pixel_format_caps, jboolean use_hdc_bpp, jboolean window, jboolean pbuffer, jboolean double_buffer) { + HDC hdc = (HDC)(INT_PTR)hdc_ptr; + return findPixelFormatOnDC(env, hdc, origin_x, origin_y, pixel_format, pixel_format_caps, use_hdc_bpp, window, pbuffer, double_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_setPixelFormat + (JNIEnv *env, jclass clazz, jlong hdc_ptr, jint pixel_format) { + HDC hdc = (HDC)(INT_PTR)hdc_ptr; + applyPixelFormat(env, hdc, pixel_format); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHdc(JNIEnv *env, jclass unused, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->drawable_hdc; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHwnd(JNIEnv *env, jclass unused, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->u.hwnd; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.h b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.h new file mode 100644 index 0000000..b0a2ff9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengl/org_lwjgl_opengl_WindowsPeerInfo.h @@ -0,0 +1,53 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_WindowsPeerInfo +#define _Included_org_lwjgl_opengl_WindowsPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: createHandle + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_createHandle + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nChoosePixelFormat + * Signature: (JIILorg/lwjgl/opengl/PixelFormat;Ljava/nio/IntBuffer;ZZZZ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nChoosePixelFormat + (JNIEnv *, jclass, jlong, jint, jint, jobject, jobject, jboolean, jboolean, jboolean, jboolean); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: setPixelFormat + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_setPixelFormat + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nGetHdc + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHdc + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nGetHwnd + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHwnd + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengles/context.c b/etc/lwjgl-2.9.1/src/native/windows/opengles/context.c new file mode 100644 index 0000000..94c9696 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengles/context.c @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: context.c -1 $ + * + * @author elias_naue <elias_naur@users.sourceforge.net> + * @version $Revision: -1 $ + */ + +#include <malloc.h> +#include "Window.h" +#include "extgl.h" +/*#include "extgl_wgl.h"*/ +#include "context.h" + +extern HINSTANCE dll_handle; // Handle to the LWJGL dll + +#define _CONTEXT_PRIVATE_CLASS_NAME _T("__lwjgl_context_class_name") + +/* + * Register the LWJGL window class. + * Returns true for success, or false for failure + */ +bool registerWindow(WNDPROC win_proc, LPCTSTR class_name) +{ + WNDCLASS windowClass; + memset(&windowClass, 0, sizeof(windowClass)); + windowClass.style = CS_OWNDC; + windowClass.lpfnWndProc = win_proc; + windowClass.cbClsExtra = 0; + windowClass.cbWndExtra = 0; + windowClass.hInstance = dll_handle; + windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.hbrBackground = NULL; + windowClass.lpszMenuName = NULL; + windowClass.lpszClassName = class_name; + + if (RegisterClass(&windowClass) == 0) { + printfDebug("Failed to register window class\n"); + return false; + } + return true; +} + +static LRESULT CALLBACK dummyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +/* +bool applyPixelFormat(JNIEnv *env, HDC hdc, int iPixelFormat) { + PIXELFORMATDESCRIPTOR desc; + if (DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &desc) == 0) { + throwFormattedException(env, "DescribePixelFormat failed (%d)", GetLastError()); + return false; + } + + // make that the pixel format of the device context + if (SetPixelFormat(hdc, iPixelFormat, &desc) == FALSE) { + throwFormattedException(env, "SetPixelFormat failed (%d)", GetLastError()); + return false; + } + return true; +} +*/ + +/* + * Close the window + */ +void closeWindow(HWND *hwnd, HDC *hdc) +{ + // Release device context + if (*hdc != NULL && *hwnd != NULL) { + ReleaseDC(*hwnd, *hdc); + *hdc = NULL; + } + + // Close the window + if (*hwnd != NULL) { + ShowWindow(*hwnd, SW_HIDE); + DestroyWindow(*hwnd); + *hwnd = NULL; + } +} + +void getWindowFlags(DWORD *windowflags_return, DWORD *exstyle_return, bool undecorated, bool child_window) { + DWORD exstyle, windowflags; + if (undecorated) { + exstyle = WS_EX_APPWINDOW; + windowflags = WS_POPUP; + } else if (child_window) { + exstyle = 0; + windowflags = WS_CHILDWINDOW; + } else { + exstyle = WS_EX_APPWINDOW; + windowflags = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU; + } + windowflags = windowflags | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; + *windowflags_return = windowflags; + *exstyle_return = exstyle; +} + +HWND createWindow(LPCTSTR window_class_name, int x, int y, int width, int height, bool undecorated, bool child_window, HWND parent) +{ + RECT clientSize; + DWORD exstyle, windowflags; + HWND new_hwnd; + + getWindowFlags(&windowflags, &exstyle, undecorated, child_window); + + clientSize.bottom = height; + clientSize.left = 0; + clientSize.right = width; + clientSize.top = 0; + + AdjustWindowRectEx( + &clientSize, // client-rectangle structure + windowflags, // window styles + FALSE, // menu-present option + exstyle // extended window style + ); + // Create the window now, using that class: + new_hwnd = CreateWindowEx ( + exstyle, + window_class_name, + _T(""), + windowflags, + x, y, clientSize.right - clientSize.left, clientSize.bottom - clientSize.top, + parent, + NULL, + dll_handle, + NULL); + + return new_hwnd; +} + +/* +static int convertToBPE(int bpp) { + int bpe; + switch (bpp) { + case 0: + bpe = 0; + break; + case 32: + case 24: + bpe = 8; + break; + case 16: // Fall through + default: + bpe = 4; + break; + } + return bpe; +} +*/ + +/* +static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, int bpp, bool window, bool pbuffer, bool double_buffer) { + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + + jboolean stereo = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + jboolean floating_point = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + jboolean floating_point_packed = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + jboolean sRGB = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + + int pixel_type; + int iPixelFormat; + unsigned int num_formats_returned; + attrib_list_t attrib_list; + GLuint *pixelFormatCaps_ptr; + jlong pixelFormatCapsSize; + BOOL result; + jlong i; + int bpe = convertToBPE(bpp); + + if ( floating_point ) + pixel_type = WGL_TYPE_RGBA_FLOAT_ARB; + else if ( floating_point_packed ) + pixel_type = WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT; + else + pixel_type = WGL_TYPE_RGBA_ARB; + + initAttribList(&attrib_list); + if (window) { + putAttrib(&attrib_list, WGL_DRAW_TO_WINDOW_ARB); putAttrib(&attrib_list, TRUE); + } + if (pbuffer) { + putAttrib(&attrib_list, WGL_DRAW_TO_PBUFFER_ARB); putAttrib(&attrib_list, TRUE); + } + if (!getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL")) { + putAttrib(&attrib_list, WGL_ACCELERATION_ARB); putAttrib(&attrib_list, WGL_FULL_ACCELERATION_ARB); + } + putAttrib(&attrib_list, WGL_PIXEL_TYPE_ARB); putAttrib(&attrib_list, pixel_type); + putAttrib(&attrib_list, WGL_DOUBLE_BUFFER_ARB); putAttrib(&attrib_list, double_buffer ? TRUE : FALSE); + putAttrib(&attrib_list, WGL_SUPPORT_OPENGL_ARB); putAttrib(&attrib_list, TRUE); + putAttrib(&attrib_list, WGL_RED_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_GREEN_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_BLUE_BITS_ARB); putAttrib(&attrib_list, bpe); + putAttrib(&attrib_list, WGL_ALPHA_BITS_ARB); putAttrib(&attrib_list, alpha); + putAttrib(&attrib_list, WGL_DEPTH_BITS_ARB); putAttrib(&attrib_list, depth); + putAttrib(&attrib_list, WGL_STENCIL_BITS_ARB); putAttrib(&attrib_list, stencil); + // Assume caller checked extension availability + if (samples > 0) { + putAttrib(&attrib_list, WGL_SAMPLE_BUFFERS_ARB); putAttrib(&attrib_list, 1); + putAttrib(&attrib_list, WGL_SAMPLES_ARB); putAttrib(&attrib_list, samples); // WGL_COVERAGE_SAMPLES_NV if colorSamples > 0 + if ( colorSamples > 0 ) { + putAttrib(&attrib_list, WGL_COLOR_SAMPLES_NV); putAttrib(&attrib_list, colorSamples); + } + } + putAttrib(&attrib_list, WGL_ACCUM_BITS_ARB); putAttrib(&attrib_list, accum_bpp); + putAttrib(&attrib_list, WGL_ACCUM_ALPHA_BITS_ARB); putAttrib(&attrib_list, accum_alpha); + putAttrib(&attrib_list, WGL_STEREO_ARB); putAttrib(&attrib_list, stereo ? TRUE : FALSE); + putAttrib(&attrib_list, WGL_AUX_BUFFERS_ARB); putAttrib(&attrib_list, num_aux_buffers); + if (sRGB) { + putAttrib(&attrib_list, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); putAttrib(&attrib_list, TRUE); + } + + // Assume caller checked extension availability + if (pixelFormatCaps != NULL) { + pixelFormatCaps_ptr = (GLuint *)(*env)->GetDirectBufferAddress(env, pixelFormatCaps); + pixelFormatCapsSize = (*env)->GetDirectBufferCapacity(env, pixelFormatCaps); + + for (i = 0; i < pixelFormatCapsSize; i++) + putAttrib(&attrib_list, pixelFormatCaps_ptr[i]); + } + putAttrib(&attrib_list, 0); putAttrib(&attrib_list, 0); + result = extensions->wglChoosePixelFormatARB(hdc, attrib_list.attribs, NULL, 1, &iPixelFormat, &num_formats_returned); + + if (result == FALSE || num_formats_returned < 1) { + throwFormattedException(env, "Failed to find ARB pixel format %d %d\n", result, num_formats_returned); + return -1; + } + return iPixelFormat; +} + +static int findPixelFormatARB(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) { + int bpp; + int iPixelFormat; + int fallback_bpp = 16; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + if (use_hdc_bpp) { + bpp = GetDeviceCaps(hdc, BITSPIXEL); + iPixelFormat = findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer); + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionClear(env); + printfDebugJava(env, "Failed to find ARB pixel format with HDC depth %d, falling back to %d\n", bpp, fallback_bpp); + bpp = fallback_bpp; + } else + return iPixelFormat; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer); +} +*/ + +/* + * Find an appropriate pixel format + */ + /* +static int findPixelFormatFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format, int bpp, bool double_buffer) +{ + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I")); + int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I")); + int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I")); + int num_aux_buffers = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "num_aux_buffers", "I")); + int accum_bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_bpp", "I")); + int accum_alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "accum_alpha", "I")); + jboolean stereo = (*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stereo", "Z")); + unsigned int flags = PFD_DRAW_TO_WINDOW | // support window + PFD_SUPPORT_OPENGL | + (double_buffer ? PFD_DOUBLEBUFFER : 0) | + (stereo ? PFD_STEREO : 0); + PIXELFORMATDESCRIPTOR desc; + int iPixelFormat; + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd + 1, // version number + flags, // RGBA type + PFD_TYPE_RGBA, + (BYTE)bpp, + 0, 0, 0, 0, 0, 0, // color bits ignored + (BYTE)alpha, + 0, // shift bit ignored + accum_bpp + accum_alpha, // no accumulation buffer + 0, 0, 0, 0, // accum bits ignored + (BYTE)depth, + (BYTE)stencil, + num_aux_buffers, + PFD_MAIN_PLANE, // main layer + 0, // reserved + 0, 0, 0 // layer masks ignored + }; + // get the best available match of pixel format for the device context + iPixelFormat = ChoosePixelFormat(hdc, &pfd); + if (iPixelFormat == 0) { + throwException(env, "Failed to choose pixel format"); + return -1; + } + + if (DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &desc) == 0) { + throwException(env, "Could not describe pixel format"); + return -1; + } + + if (desc.cColorBits < bpp) { + throwException(env, "Insufficient color precision"); + return -1; + } + + if (desc.cAlphaBits < alpha) { + throwException(env, "Insufficient alpha precision"); + return -1; + } + + if (desc.cStencilBits < stencil) { + throwException(env, "Insufficient stencil precision"); + return -1; + } + + if (desc.cDepthBits < depth) { + throwException(env, "Insufficient depth buffer precision"); + return -1; + } + + if ((desc.dwFlags & PFD_GENERIC_FORMAT) != 0) { + jboolean allowSoftwareOpenGL = getBooleanProperty(env, "org.lwjgl.opengl.Display.allowSoftwareOpenGL"); + // secondary check for software override + if(!allowSoftwareOpenGL) { + throwException(env, "Pixel format not accelerated"); + return -1; + } + } + + if ((desc.dwFlags & flags) != flags) { + throwException(env, "Capabilities not supported"); + return -1; + } + return iPixelFormat; +} + +static int findPixelFormatDefault(JNIEnv *env, HDC hdc, jobject pixel_format, bool use_hdc_bpp, bool double_buffer) { + int bpp; + int iPixelFormat; + int fallback_bpp = 16; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + if (use_hdc_bpp) { + bpp = GetDeviceCaps(hdc, BITSPIXEL); + iPixelFormat = findPixelFormatFromBPP(env, hdc, pixel_format, bpp, double_buffer); + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionClear(env); + printfDebugJava(env, "Failed to find pixel format with HDC depth %d, falling back to %d\n", bpp, fallback_bpp); + bpp = fallback_bpp; + } else + return iPixelFormat; + } else + bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I")); + return findPixelFormatFromBPP(env, hdc, pixel_format, bpp, double_buffer); +} +*/ + +/* +static bool validateAndGetExtensions(JNIEnv *env, WGLExtensions *extensions, HDC dummy_hdc, HGLRC dummy_hglrc, int samples, int colorSamples, bool floating_point, bool floating_point_packed, bool sRGB, jobject pixelFormatCaps) { + if (!wglMakeCurrent(dummy_hdc, dummy_hglrc)) { + throwException(env, "Could not bind context to dummy window"); + return false; + } + extgl_InitWGL(extensions); + + if (!extensions->WGL_ARB_pixel_format) { + throwException(env, "No support for WGL_ARB_pixel_format"); + return false; + } + if (samples > 0 && !extensions->WGL_ARB_multisample) { + throwException(env, "No support for WGL_ARB_multisample"); + return false; + } + if (colorSamples > 0 && !extensions->WGL_NV_multisample_coverage) { + throwException(env, "No support for WGL_NV_multisample_coverage"); + return false; + } + + // Apparently, some drivers don't report WGL_ARB_pixel_format_float + // even though GL_ARB_color_buffer_float and WGL_ATI_color_format_float + // is supported. + if (floating_point && !(extensions->WGL_ARB_pixel_format_float || extensions->WGL_ATI_pixel_format_float)) { + throwException(env, "No support for WGL_ARB_pixel_format_float nor WGL_ATI_pixel_format_float"); + return false; + } + if (floating_point_packed && !(extensions->WGL_EXT_pixel_format_packed_float)) { + throwException(env, "No support for WGL_EXT_pixel_format_packed_float"); + return false; + } + if (sRGB && !(extensions->WGL_ARB_framebuffer_sRGB)) { + throwException(env, "No support for WGL_ARB_framebuffer_sRGB"); + return false; + } + if (pixelFormatCaps != NULL && !extensions->WGL_ARB_render_texture) { + throwException(env, "No support for WGL_ARB_render_texture"); + return false; + } + return true; +} + +int findPixelFormatOnDC(JNIEnv *env, HDC hdc, int origin_x, int origin_y, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) { + HGLRC dummy_hglrc; + HDC saved_current_hdc; + HGLRC saved_current_hglrc; + WGLExtensions extensions; + HWND dummy_hwnd; + HDC dummy_hdc; + int pixel_format_id; + jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format); + + int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I")); + int colorSamples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "colorSamples", "I")); + bool floating_point = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point", "Z")); + bool floating_point_packed = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "floating_point_packed", "Z")); + bool sRGB = (bool)(*env)->GetBooleanField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "sRGB", "Z")); + bool use_arb_selection = samples > 0 || floating_point || floating_point_packed || sRGB || pbuffer || pixelFormatCaps != NULL; + + pixel_format_id = findPixelFormatDefault(env, hdc, pixel_format, use_hdc_bpp, double_buffer); + if (!(*env)->ExceptionOccurred(env) && use_arb_selection) { + dummy_hwnd = createDummyWindow(origin_x, origin_y); + if (dummy_hwnd == NULL) { + throwException(env, "Could not create dummy window"); + return -1; + } + dummy_hdc = GetDC(dummy_hwnd); + if (!applyPixelFormat(env, dummy_hdc, pixel_format_id)) { + closeWindow(&dummy_hwnd, &dummy_hdc); + return -1; + } + dummy_hglrc = wglCreateContext(dummy_hdc); + if (dummy_hglrc == NULL) { + closeWindow(&dummy_hwnd, &dummy_hdc); + throwException(env, "Failed to create OpenGL rendering context"); + return -1; + } + // Save the current HDC and HGLRC to avoid disruption + saved_current_hdc = wglGetCurrentDC(); + saved_current_hglrc = wglGetCurrentContext(); + if (validateAndGetExtensions(env, &extensions, dummy_hdc, dummy_hglrc, samples, colorSamples, floating_point, floating_point_packed, sRGB, pixelFormatCaps)) { + pixel_format_id = findPixelFormatARB(env, hdc, &extensions, pixel_format, pixelFormatCaps, use_hdc_bpp, window, pbuffer, double_buffer); + } + wglMakeCurrent(saved_current_hdc, saved_current_hglrc); + wglDeleteContext(dummy_hglrc); + closeWindow(&dummy_hwnd, &dummy_hdc); + } + return pixel_format_id; +} +*/ + +static bool registerDummyWindow() { + static bool window_registered = false; + if (!window_registered) { + if (!registerWindow(dummyWindowProc, _CONTEXT_PRIVATE_CLASS_NAME)) { + return false; + } + window_registered = true; + } + return true; +} + +HWND createDummyWindow(int origin_x, int origin_y) { + if (!registerDummyWindow()) + return NULL; + return createWindow(_CONTEXT_PRIVATE_CLASS_NAME, origin_x, origin_y, 1, 1, false, false, NULL); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengles/context.h b/etc/lwjgl-2.9.1/src/native/windows/opengles/context.h new file mode 100644 index 0000000..402f256 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengles/context.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: context.h -1 $ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: -1 $ + */ + +#ifndef __LWJGL_CONTEXT_H +#define __LWJGL_CONTEXT_H + +#include "Window.h" +#include "extgl.h" + +typedef struct { + union { + HWND hwnd; + } u; + HDC drawable_hdc; +} WindowsPeerInfo; + +/* + * Register the LWJGL window class. + * Returns true for success, or false for failure + */ +extern bool registerWindow(); + +//extern bool applyPixelFormat(JNIEnv *env, HDC hdc, int iPixelFormat); + +/* + * Close the window + */ +extern void closeWindow(HWND *hwnd, HDC *hdc); + +/** + * Create a dummy window suitable to create contexts from + */ +extern HWND createDummyWindow(int x, int y); + +/** + * Return appropriate window and extended style flags from the given fullscreen and undecorated property + */ +extern void getWindowFlags(DWORD *windowflags_return, DWORD *exstyle_return, bool undecorated, bool child_window); + +/* + * Create a window with the specified position, size, and + * fullscreen attribute. The window will have DirectInput associated + * with it. + * + * Returns true for success, or false for failure + */ +extern HWND createWindow(LPCTSTR window_class_name, int x, int y, int width, int height, bool undecorated, bool child_window, HWND parent); + +//extern int findPixelFormatOnDC(JNIEnv *env, HDC hdc, int origin_x, int origin_y, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer); + +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengles/extgl_wgl.c b/etc/lwjgl-2.9.1/src/native/windows/opengles/extgl_wgl.c new file mode 100644 index 0000000..d1c57e3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengles/extgl_wgl.c @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2001-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. +------------------------------------------------------------------------------*/ +/* + Lev Povalahev + + levp@gmx.net + + http://www.uni-karlsruhe.de/~uli2/ + +*/ + +#include <stdio.h> +#include <string.h> +#include "extgl.h" + +static HMODULE lib_gl_handle = NULL; + +void *extgl_GetProcAddress(const char *name) { + void *t = eglGetProcAddress(name); + if (t == NULL) + { + t = GetProcAddress(lib_gl_handle, name); + if (t == NULL) + { + printfDebug("Could not locate symbol %s\n", name); + } + } + return t; +} + +bool extgl_Open(JNIEnv *env) { + if (lib_gl_handle != NULL) + return true; + // load the dynamic libraries for OpenGL + lib_gl_handle = LoadLibrary("libGLESv2.dll"); + if (lib_gl_handle == NULL) { + throwException(env, "Could not load OpenGL ES library"); + return false; + } + return true; +} + +void extgl_Close(void) { + FreeLibrary(lib_gl_handle); + lib_gl_handle = NULL; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.c b/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.c new file mode 100644 index 0000000..353cb4f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_opengl_WindowsPeerInfo.c -1 $ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision: -1 $ + */ + +#include <jni.h> +#include "org_lwjgl_opengl_WindowsPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_createHandle(JNIEnv *env, jclass clazz) { + return newJavaManagedByteBuffer(env, sizeof(WindowsPeerInfo)); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHdc(JNIEnv *env, jclass unused, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->drawable_hdc; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHwnd(JNIEnv *env, jclass unused, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + return (intptr_t)peer_info->u.hwnd; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.h b/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.h new file mode 100644 index 0000000..b0a2ff9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/opengles/org_lwjgl_opengl_WindowsPeerInfo.h @@ -0,0 +1,53 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_WindowsPeerInfo +#define _Included_org_lwjgl_opengl_WindowsPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: createHandle + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_createHandle + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nChoosePixelFormat + * Signature: (JIILorg/lwjgl/opengl/PixelFormat;Ljava/nio/IntBuffer;ZZZZ)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nChoosePixelFormat + (JNIEnv *, jclass, jlong, jint, jint, jobject, jobject, jboolean, jboolean, jboolean, jboolean); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: setPixelFormat + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_setPixelFormat + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nGetHdc + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHdc + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsPeerInfo + * Method: nGetHwnd + * Signature: (Ljava/nio/ByteBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nGetHwnd + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_Sys.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_Sys.c new file mode 100644 index 0000000..7858834 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_Sys.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Windows system library. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +#include "Window.h" +#include "mmsystem.h" +#include "org_lwjgl_WindowsSysImplementation.h" +#include "common_tools.h" +#include <malloc.h> +#include <commctrl.h> + +JNIEXPORT jlong JNICALL Java_org_lwjgl_WindowsSysImplementation_nGetTime(JNIEnv * env, jclass unused) { + DWORD time; + + timeBeginPeriod(1); + time = timeGetTime(); + timeEndPeriod(1); + + return time; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_WindowsSysImplementation_nAlert(JNIEnv * env, jclass unused, jlong hwnd_ptr, jlong title, jlong message) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + MessageBox(hwnd, (LPCTSTR)(intptr_t)message, (LPCTSTR)(intptr_t)title, MB_OK | MB_TOPMOST); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_WindowsSysImplementation_initCommonControls(JNIEnv * env, jclass unused) { + InitCommonControls(); +} + +JNIEXPORT jstring JNICALL Java_org_lwjgl_WindowsSysImplementation_nGetClipboard + (JNIEnv * env, jclass unused) +{ + // Check to see if there's text available in the clipboard + BOOL textAvailable = IsClipboardFormatAvailable(CF_TEXT); + BOOL unicodeAvailable = IsClipboardFormatAvailable(CF_UNICODETEXT); + void *clipboard_data; + jstring ret; + HANDLE hglb; + const wchar_t * str; + + if (unicodeAvailable) { + if (!OpenClipboard(NULL)) + return NULL; + hglb = GetClipboardData(CF_UNICODETEXT); + if (hglb == NULL) { + CloseClipboard(); + return NULL; + } + clipboard_data = GlobalLock(hglb); + if (clipboard_data == NULL) { + CloseClipboard(); + return NULL; + } + str = (const wchar_t *)clipboard_data; + ret = (*env)->NewString(env, str, (jsize)wcslen(str)); + } else if (textAvailable) { + if (!OpenClipboard(NULL)) + return NULL; + hglb = GetClipboardData(CF_TEXT); + if (hglb == NULL) { + CloseClipboard(); + return NULL; + } + clipboard_data = GlobalLock(hglb); + if (clipboard_data == NULL) { + CloseClipboard(); + return NULL; + } + ret = NewStringNativeWithLength(env, (const char *) clipboard_data, (jsize)strlen(clipboard_data)); + } else { + return NULL; + } + GlobalUnlock(hglb); + CloseClipboard(); + return ret; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_WindowsSysImplementation.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_WindowsSysImplementation.h new file mode 100644 index 0000000..b8c010e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_WindowsSysImplementation.h @@ -0,0 +1,47 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_WindowsSysImplementation */ + +#ifndef _Included_org_lwjgl_WindowsSysImplementation +#define _Included_org_lwjgl_WindowsSysImplementation +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_WindowsSysImplementation_JNI_VERSION +#define org_lwjgl_WindowsSysImplementation_JNI_VERSION 24L +/* + * Class: org_lwjgl_WindowsSysImplementation + * Method: nGetTime + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_WindowsSysImplementation_nGetTime + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_WindowsSysImplementation + * Method: nAlert + * Signature: (JJJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_WindowsSysImplementation_nAlert + (JNIEnv *, jclass, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_WindowsSysImplementation + * Method: initCommonControls + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_WindowsSysImplementation_initCommonControls + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_WindowsSysImplementation + * Method: nGetClipboard + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_lwjgl_WindowsSysImplementation_nGetClipboard + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_input_Cursor.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_input_Cursor.c new file mode 100644 index 0000000..effe595 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_input_Cursor.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * win32 mouse handling. + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include "Window.h" +#include "org_lwjgl_input_Cursor.h" +#include "org_lwjgl_opengl_WindowsDisplay.h" +#include "common_tools.h" + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateCursor +(JNIEnv *env, jclass unused, jint width, jint height, jint x_hotspot, jint y_hotspot, jint num_images, jobject image_buffer, jint images_offset, jobject delay_buffer, jint delays_offset) +{ + unsigned char col0, col1, col2, col3, col4, col5, col6, col7; + unsigned char mask; + BITMAPINFO bitmapInfo; + + HBITMAP cursorMask; + HCURSOR *cursor_handle; + + HCURSOR cursor = NULL; + ICONINFO iconInfo; + char *ptrCursorImage; + HBITMAP colorDIB; + int *srcPtr; + char *dstPtr; + int bitWidth; + int scanlinePad; + int imageSize; // Size in bits + unsigned char *maskPixels; + int pixelCount = 0; + int maskCount = 0; + HBITMAP colorBitmap; + int x, y; + HDC hDC; + jobject handle_buffer = newJavaManagedByteBuffer(env, sizeof(HCURSOR)); + + int *pixels; + if (handle_buffer == NULL) { + throwException(env, "Could not allocate handle"); + return NULL; + } + pixels = (int *)(*env)->GetDirectBufferAddress(env, image_buffer) + images_offset; + + memset(&bitmapInfo, 0, sizeof(BITMAPINFO)); + bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmapInfo.bmiHeader.biWidth = width; + bitmapInfo.bmiHeader.biHeight = -height; + bitmapInfo.bmiHeader.biPlanes = 1; + + bitmapInfo.bmiHeader.biBitCount = 24; + bitmapInfo.bmiHeader.biCompression = BI_RGB; + + hDC = GetDC(NULL); + + colorDIB = CreateDIBSection(hDC, (BITMAPINFO*)&(bitmapInfo), + DIB_RGB_COLORS, + (void*)&(ptrCursorImage), + NULL, 0); + srcPtr = pixels; + dstPtr = ptrCursorImage; + if (!dstPtr) { + throwException(env, "Could not allocate DIB section."); + ReleaseDC(NULL, hDC); + return NULL; + } + for (y = 0; y < height; y++ ) { + for (x = 0; x < width; x++ ) { + dstPtr[2] = (*srcPtr >> 0x10) & 0xFF; + dstPtr[1] = (*srcPtr >> 0x08) & 0xFF; + dstPtr[0] = *srcPtr & 0xFF; + + srcPtr++; + dstPtr += 3; + } + } + + colorBitmap = CreateDIBitmap(hDC, + (BITMAPINFOHEADER*)&bitmapInfo.bmiHeader, + CBM_INIT, + (void *)ptrCursorImage, + (BITMAPINFO*)&bitmapInfo, + DIB_RGB_COLORS); + + DeleteObject(colorDIB); + + // Convert alpha map to pixel packed mask + bitWidth = width >> 3; + scanlinePad = bitWidth & (sizeof(WORD) - 1); + imageSize = (bitWidth + scanlinePad)*height; // Size in bits + maskPixels = (unsigned char*)malloc(sizeof(unsigned char)*imageSize); + memset(maskPixels, 0, imageSize); + for (y = 0; y < height; y++) + for (x = 0; x < bitWidth; x++) { + col0 = (pixels[pixelCount++] & 0x01000000) >> 17; + col1 = (pixels[pixelCount++] & 0x01000000) >> 18; + col2 = (pixels[pixelCount++] & 0x01000000) >> 19; + col3 = (pixels[pixelCount++] & 0x01000000) >> 20; + col4 = (pixels[pixelCount++] & 0x01000000) >> 21; + col5 = (pixels[pixelCount++] & 0x01000000) >> 22; + col6 = (pixels[pixelCount++] & 0x01000000) >> 23; + col7 = (pixels[pixelCount++] & 0x01000000) >> 24; + mask = col0 | col1 | col2 | col3 | col4 | col5 | col6 | col7; + maskPixels[maskCount++] = ~mask; // 1 is tranparant, 0 opaque + } + + cursorMask = CreateBitmap(width, height, 1, 1, maskPixels); + + memset(&iconInfo, 0, sizeof(ICONINFO)); + iconInfo.hbmMask = cursorMask; + iconInfo.hbmColor = colorBitmap; + iconInfo.fIcon = FALSE; + iconInfo.xHotspot = x_hotspot; + iconInfo.yHotspot = y_hotspot; + cursor = CreateIconIndirect(&iconInfo); + DeleteObject(colorBitmap); + DeleteObject(cursorMask); + free(maskPixels); + ReleaseDC(NULL, hDC); + + cursor_handle = (HCURSOR *)(*env)->GetDirectBufferAddress(env, handle_buffer); + *cursor_handle = cursor; + return handle_buffer; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_doDestroyCursor +(JNIEnv *env, jclass unused, jobject handle_buffer) +{ + HCURSOR *cursor_handle = (HCURSOR *)(*env)->GetDirectBufferAddress(env, handle_buffer); + DestroyCursor(*cursor_handle); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_Display.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_Display.c new file mode 100644 index 0000000..4c9c788 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_Display.c @@ -0,0 +1,539 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * Base Windows display + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + */ + +#define _PRIVATE_WINDOW_H_ +#include <malloc.h> +#include "Window.h" +#include <windowsx.h> +/*#include "extgl_wgl.h"*/ +#include "common_tools.h" +#include "display.h" +#include "org_lwjgl_opengl_WindowsDisplay.h" +#include "org_lwjgl_WindowsSysImplementation.h" +#include "context.h" +#include <commctrl.h> + +#define WINDOWCLASSNAME _T("LWJGL") + +static jclass windowsDisplayClass; +static jmethodID javaWindowProc; + +/* + * WindowProc for the GL window. + */ +static LRESULT CALLBACK lwjglWindowProc(HWND hWnd, + UINT msg, + WPARAM wParam, + LPARAM lParam) +{ + /* + jclass display_class; + jclass display_class_global; + jmethodID handleMessage_method; + LONG message_time; + */ + JNIEnv *env = getThreadEnv(); + if (env != NULL && !(*env)->ExceptionOccurred(env)) { + /* + * We'll cache a global reference to the WindowsDisplay class in the window's user data. + * This is not so much to avoid lookup overhead as it is to avoid problems + * with AWT. Specifically, awt code can indirectly call this message handler + * when it does a SendMessage on the main thread to the currently focused window, + * which could be a LWJGL window. The FindClass will then fail because the calling + * internal awt class is using the system class loader, not the application loader + * where lwjgl is found. + * + * The very first message sent to this handler is sent when + * a window is created, where we are sure that the calling class' classloader has + * LWJGL classes in it. + */ + + /* + display_class_global = (jclass)(LONG_PTR)GetWindowLongPtr(hWnd, GWLP_USERDATA); + if (display_class_global == NULL) { + display_class = (*env)->FindClass(env, "org/lwjgl/opengl/WindowsDisplay"); + if (display_class != NULL) { + display_class_global = (*env)->NewGlobalRef(env, display_class); + if (display_class_global != NULL) + SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)display_class_global); + } + } + if (display_class_global != NULL) { + message_time = GetMessageTime(); + handleMessage_method = (*env)->GetStaticMethodID(env, display_class_global, "handleMessage", "(JIJJJ)J"); + if (handleMessage_method != NULL) + return (*env)->CallStaticLongMethod(env, display_class_global, handleMessage_method, (jlong)(intptr_t)hWnd, (jint)msg, (jlong)wParam, (jlong)lParam, (jlong)message_time); + + } + */ + + return (*env)->CallStaticLongMethod( + env, windowsDisplayClass, javaWindowProc, + (jlong)(intptr_t)hWnd, (jint)msg, (jlong)wParam, (jlong)lParam, (jlong)GetMessageTime() + ); + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowProc(JNIEnv *env, jclass clazz, jobject method) { + windowsDisplayClass = clazz; + javaWindowProc = (*env)->FromReflectedMethod(env, method); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_defWindowProc(JNIEnv *env, jclass unused, jlong hWnd, jint msg, jlong wParam, jlong lParam) { + return DefWindowProc((HWND)(INT_PTR)hWnd, msg, wParam, lParam); +} + +/* + * Handle native Windows messages + */ +static void handleMessages(JNIEnv *env) { + /* + * Now's our chance to deal with Windows messages that are + * otherwise just piling up and causing everything not to + * work properly + */ + MSG msg; + while (!(*env)->ExceptionOccurred(env) && PeekMessage( + &msg, // message information + NULL, // handle to window + 0, // first message + 0, // last message + PM_REMOVE // removal options + )) + { + if (msg.message == WM_QUIT) + break; + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDC(JNIEnv *env, jclass unused, jlong hwnd_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + return (INT_PTR)GetDC(hwnd); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetTitle + (JNIEnv * env, jclass unused, jlong hwnd_ptr, jlong title) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + SetWindowText(hwnd, (LPCTSTR)(intptr_t)title); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nUpdate(JNIEnv * env, jclass class) { + handleMessages(env); +} + +JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getAvailableDisplayModes(JNIEnv *env, jobject self) { + return getAvailableDisplayModes(env); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion + (JNIEnv *env, jobject ignored) { + return org_lwjgl_WindowsSysImplementation_JNI_VERSION; +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateWindow(JNIEnv *env, jclass unused, jint x, jint y, jint width, jint height, jboolean undecorated, jboolean child_window, jlong parent_hwnd) { + HWND hwnd; + static bool oneShotInitialised = false; + if (!oneShotInitialised) { + if (!registerWindow(lwjglWindowProc, WINDOWCLASSNAME)) { + throwException(env, "Could not register window class"); + return 0; + } + oneShotInitialised = true; + } + + hwnd = createWindow(WINDOWCLASSNAME, x, y, width, height, undecorated, child_window, (HWND)(INT_PTR)parent_hwnd); + return (INT_PTR)hwnd; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseDC(JNIEnv *env, jclass clazz, jlong hwnd_ptr, jlong hdc_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + HDC hdc = (HDC)(INT_PTR)hdc_ptr; + ReleaseDC(hwnd, hdc); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nDestroyWindow(JNIEnv *env, jclass clazz, jlong hwnd_ptr) { + jclass display_class_global; + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + display_class_global = (jclass)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_USERDATA); + ShowWindow(hwnd, SW_HIDE); + DestroyWindow(hwnd); + if (display_class_global != NULL) + (*env)->DeleteGlobalRef(env, display_class_global); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clientToScreen(JNIEnv *env, jclass unused, jlong hwnd_int, jobject buffer_handle) { + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + POINT point; + jint *buffer = (jint *)(*env)->GetDirectBufferAddress(env, buffer_handle); + jlong size = (*env)->GetDirectBufferCapacity(env, buffer_handle); + if (size < 2) { + throwFormattedRuntimeException(env, "Buffer size < 2", size); + return; + } + point.x = buffer[0]; + point.y = buffer[1]; + ClientToScreen(hwnd, &point); + buffer[0] = point.x; + buffer[1] = point.y; +} + + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getWindowRect(JNIEnv *env, jclass unused, jlong hwnd_int, jobject buffer_handle) { + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + RECT *buffer = (RECT *)(*env)->GetDirectBufferAddress(env, buffer_handle); + jlong size = (*env)->GetDirectBufferCapacity(env, buffer_handle); + if (size < 4) { + throwFormattedRuntimeException(env, "Buffer size < 4", size); + return false; + } + return GetWindowRect(hwnd, buffer); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getForegroundWindow(JNIEnv *env, jclass unused) { + return (INT_PTR)GetForegroundWindow(); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDesktopWindow(JNIEnv *env, jclass unused) { + return (INT_PTR)GetDesktopWindow(); +} + +static void copyBufferToRect(JNIEnv *env, jobject buffer_handle, RECT *rect) { + jint *buffer = (jint *)(*env)->GetDirectBufferAddress(env, buffer_handle); + jlong size = (*env)->GetDirectBufferCapacity(env, buffer_handle); + if (size < 4) { + throwFormattedRuntimeException(env, "Buffer size < 4", size); + return; + } + rect->top = buffer[0]; + rect->bottom = buffer[1]; + rect->left = buffer[2]; + rect->right = buffer[3]; +} + +static void copyRectToBuffer(JNIEnv *env, RECT *rect, jobject buffer_handle) { + jint *buffer = (jint *)(*env)->GetDirectBufferAddress(env, buffer_handle); + jlong size = (*env)->GetDirectBufferCapacity(env, buffer_handle); + if (size < 4) { + throwFormattedRuntimeException(env, "Buffer size < 4", size); + return; + } + buffer[0] = rect->top; + buffer[1] = rect->bottom; + buffer[2] = rect->left; + buffer[3] = rect->right; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clipCursor(JNIEnv *env, jclass unused, jobject handle_buffer) { + RECT clip_rect; + LPRECT clip_rect_ptr; + if (handle_buffer != NULL) { + copyBufferToRect(env, handle_buffer, &clip_rect); + clip_rect_ptr = &clip_rect; + } else + clip_rect_ptr = NULL; + if (ClipCursor(clip_rect_ptr) == 0) + throwFormattedException(env, "ClipCursor failed (%d)", GetLastError()); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSwitchDisplayMode(JNIEnv *env, jobject self, jobject mode) { + switchDisplayMode(env, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nResetDisplayMode(JNIEnv *env, jobject self) { + resetDisplayMode(env); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getCurrentDisplayMode(JNIEnv *env, jclass unused) { + return getCurrentDisplayMode(env); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_convertToNativeRamp(JNIEnv *env, jclass unused, jobject float_ramp) { + return convertToNativeRamp(env, float_ramp); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getCurrentGammaRamp(JNIEnv *env, jclass unused) { + return getCurrentGammaRamp(env); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetGammaRamp(JNIEnv *env, jclass unused, jobject gamma_buffer) { + setGammaRamp(env, gamma_buffer); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_showWindow(JNIEnv *env, jclass unused, jlong hwnd_ptr, jint mode) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + ShowWindow(hwnd, mode); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setForegroundWindow(JNIEnv *env, jclass unused, jlong hwnd_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + SetForegroundWindow(hwnd); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setFocus(JNIEnv *env, jclass unused, jlong hwnd_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + SetFocus(hwnd); +} + +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetVersion(JNIEnv *env, jobject self, jstring driver) { + char *driver_str; + jstring result; + driver_str = GetStringNativeChars(env, driver); + if (driver_str == NULL) + return NULL; + result = getVersion(env, driver_str); + free(driver_str); + return result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReshape(JNIEnv *env, jclass unused, jlong hwnd_ptr, jint x, jint y, jint width, jint height, jboolean undecorated, jboolean child) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + DWORD exstyle, windowflags; + RECT clientSize; + + getWindowFlags(&windowflags, &exstyle, undecorated, child); + + // If we're not a fullscreen window, adjust the height to account for the + // height of the title bar: + clientSize.bottom = height; + clientSize.left = 0; + clientSize.right = width; + clientSize.top = 0; + + AdjustWindowRectEx( + &clientSize, // client-rectangle structure + windowflags, // window styles + FALSE, // menu-present option + exstyle // extended window style + ); + SetWindowPos(hwnd, HWND_TOP, x, y, clientSize.right - clientSize.left, clientSize.bottom - clientSize.top, SWP_NOZORDER); +} + +static HICON createWindowIcon(JNIEnv *env, jint *pixels, jint width, jint height) { + BITMAPV5HEADER bitmapInfo; + HBITMAP cursorMask; + HBITMAP colorBitmap; + ICONINFO iconInfo; + HICON icon; + char *ptrCursorImage; + int x, y; + char *dstPtr; + int imageSize; + unsigned char *maskPixels; + int widthInBytes; + int scanlineWidth; + HBITMAP colorDIB; + + memset(&bitmapInfo, 0, sizeof(BITMAPV5HEADER)); + bitmapInfo.bV5Size = sizeof(BITMAPV5HEADER); + bitmapInfo.bV5Width = width; + bitmapInfo.bV5Height = -height; + bitmapInfo.bV5Planes = 1; + bitmapInfo.bV5BitCount = 32; + bitmapInfo.bV5Compression = BI_BITFIELDS; + bitmapInfo.bV5RedMask = 0x00FF0000; + bitmapInfo.bV5GreenMask = 0x0000FF00; + bitmapInfo.bV5BlueMask = 0x000000FF; + bitmapInfo.bV5AlphaMask = 0xFF000000; + + colorDIB = CreateDIBSection(GetDC(NULL), (BITMAPINFO*)&(bitmapInfo), + DIB_RGB_COLORS, (void*)&(ptrCursorImage), NULL, 0); + if (!ptrCursorImage) { + throwException(env, "Could not allocate DIB section."); + } + + for (y = 0; y < height; y++ ) { + dstPtr = ptrCursorImage + width*4*y;; + for (x = 0; x < width; x++ ) { + dstPtr[0] = (pixels[y*width+x] >> 0x10) & 0xFF; + dstPtr[1] = (pixels[y*width+x] >> 0x08) & 0xFF; + dstPtr[2] = pixels[y*width+x] & 0xFF; + dstPtr[3] = (pixels[y*width+x] >> 0x18) & 0xFF; + dstPtr += 4; + } + } + + + colorBitmap = CreateDIBitmap(GetDC(NULL), + (BITMAPINFOHEADER*)&bitmapInfo, + CBM_INIT, + (void *)ptrCursorImage, + (BITMAPINFO*)&bitmapInfo, + DIB_RGB_COLORS); + + DeleteObject(colorDIB); + + // Convert alpha map to pixel packed mask + + // number of bytes it takes to fit a bit packed scan line. + widthInBytes = (width & 0x7) != 0 ? (width >> 3) + 1 : (width >> 3); + + // number of bytes it takes to fit WORD padded scan line. + scanlineWidth = widthInBytes; + if (scanlineWidth % sizeof(WORD) != 0) { + scanlineWidth = (scanlineWidth / sizeof(WORD)) * sizeof(WORD) + sizeof(WORD); + } + imageSize = scanlineWidth*height; + maskPixels = (unsigned char*)malloc(sizeof(unsigned char)*imageSize); + memset(maskPixels, 0xFF, sizeof(unsigned char)*imageSize); + + cursorMask = CreateBitmap(width, height, 1, 1, maskPixels); + + memset(&iconInfo, 0, sizeof(ICONINFO)); + iconInfo.hbmMask = cursorMask; + iconInfo.hbmColor = colorBitmap; + iconInfo.fIcon = TRUE; + iconInfo.xHotspot = 0; + iconInfo.yHotspot = 0; + icon = CreateIconIndirect(&iconInfo); + DeleteObject(colorBitmap); + DeleteObject(cursorMask); + free(maskPixels); + + return icon; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_destroyIcon + (JNIEnv *env, jclass clazz, jlong handle) { + HICON icon = (HICON)(INT_PTR)handle; + DestroyIcon(icon); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_createIcon + (JNIEnv *env, jclass clazz, jint width, jint height, jobject iconBuffer) { + jint *imgData = (jint *)(*env)->GetDirectBufferAddress(env, iconBuffer); + return (INT_PTR)createWindowIcon(env, imgData, width, height); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_sendMessage + (JNIEnv *env, jclass clazz, jlong hwnd_ptr, jlong msg, jlong wparam, jlong lparam) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + return SendMessage(hwnd, (UINT)msg, (WPARAM)wparam, (LPARAM)lparam); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowLongPtr + (JNIEnv *env, jclass clazz, jlong hwnd_ptr, jint nindex, jlong longPtr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + return SetWindowLongPtr(hwnd, nindex, (LONG_PTR) longPtr); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getWindowLongPtr + (JNIEnv *env, jclass clazz, jlong hwnd_ptr, jint nindex) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + jlong result = GetWindowLongPtr(hwnd, nindex); + return result; +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowPos + (JNIEnv *env, jclass clazz, jlong hwnd_ptr, jlong hwnd_after_ptr, jint x, jint y, jint width, jint height, jlong uflags) { + jboolean result; + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + HWND hwnd_after = (HWND)(INT_PTR)hwnd_after_ptr; + + result = SetWindowPos(hwnd, hwnd_after, x, y, width, height, (UINT) uflags); + return result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetCursorPosition +(JNIEnv * env, jclass unused, jint x, jint y) { + if (!SetCursorPos(x, y)) + printfDebugJava(env, "SetCursorPos failed"); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getClientRect + (JNIEnv *env, jclass unused, jlong hwnd_int, jobject rect_buffer) { + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + RECT clientRect; + GetClientRect(hwnd, &clientRect); + copyRectToBuffer(env, &clientRect, rect_buffer); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_adjustWindowRectEx + (JNIEnv *env, jclass unused, jobject rect_buffer, jint style, jboolean menu, jint styleex) { + jboolean result; + RECT clientRect; + copyBufferToRect(env, rect_buffer, &clientRect); + result = AdjustWindowRectEx(&clientRect, style, menu, styleex); + copyRectToBuffer(env, &clientRect, rect_buffer); + return result; +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetNativeCursor + (JNIEnv *env, jclass unused, jlong hwnd_int, jobject handle_buffer) +{ + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + HCURSOR *cursor_handle; + HCURSOR cursor; + if (handle_buffer != NULL) { + cursor_handle = (HCURSOR *)(*env)->GetDirectBufferAddress(env, handle_buffer); + cursor = *cursor_handle; + SetClassLongPtr(hwnd, GCLP_HCURSOR, (LONG_PTR)cursor); + SetCursor(cursor); + } else { + SetClassLongPtr(hwnd, GCLP_HCURSOR, (LONG_PTR)NULL); + SetCursor(LoadCursor(NULL, IDC_ARROW)); + } +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getSystemMetrics(JNIEnv *env, jclass unused, jint index) { + return GetSystemMetrics(index); +} + +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetCapture(JNIEnv *env, jclass unused, jlong hwnd_int) { + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + return (INT_PTR) SetCapture(hwnd); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseCapture(JNIEnv *env, jclass unused) { + return ReleaseCapture(); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nTrackMouseEvent(JNIEnv *env, jclass clazz, jlong hwnd_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + return TrackMouseEvent(&tme); +} + diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.c new file mode 100644 index 0000000..402fcf8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <jawt_md.h> +#include "awt_tools.h" +#include "org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo_nInitHandle + (JNIEnv *env, jclass clazz, jobject lock_buffer_handle, jobject peer_info_handle) { + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + AWTSurfaceLock *surface = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + JAWT_Win32DrawingSurfaceInfo *win32_dsi = (JAWT_Win32DrawingSurfaceInfo *)surface->dsi->platformInfo; + peer_info->drawable_hdc = win32_dsi->hdc; + peer_info->u.hwnd = win32_dsi->hwnd; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h new file mode 100644 index 0000000..8499690 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo +#define _Included_org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo + * Method: nInitHandle + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo_nInitHandle + (JNIEnv *, jclass, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay.h new file mode 100644 index 0000000..9810d8d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay.h @@ -0,0 +1,545 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsDisplay */ + +#ifndef _Included_org_lwjgl_opengl_WindowsDisplay +#define _Included_org_lwjgl_opengl_WindowsDisplay +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_WindowsDisplay_GAMMA_LENGTH +#define org_lwjgl_opengl_WindowsDisplay_GAMMA_LENGTH 256L +#undef org_lwjgl_opengl_WindowsDisplay_WM_WINDOWPOSCHANGED +#define org_lwjgl_opengl_WindowsDisplay_WM_WINDOWPOSCHANGED 71L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MOVE +#define org_lwjgl_opengl_WindowsDisplay_WM_MOVE 3L +#undef org_lwjgl_opengl_WindowsDisplay_WM_CANCELMODE +#define org_lwjgl_opengl_WindowsDisplay_WM_CANCELMODE 31L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MOUSEMOVE +#define org_lwjgl_opengl_WindowsDisplay_WM_MOUSEMOVE 512L +#undef org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONDOWN 513L +#undef org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONUP +#define org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONUP 514L +#undef org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONDBLCLK +#define org_lwjgl_opengl_WindowsDisplay_WM_LBUTTONDBLCLK 515L +#undef org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONDOWN 516L +#undef org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONUP +#define org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONUP 517L +#undef org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONDBLCLK +#define org_lwjgl_opengl_WindowsDisplay_WM_RBUTTONDBLCLK 518L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONDOWN 519L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONUP +#define org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONUP 520L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONDBLCLK +#define org_lwjgl_opengl_WindowsDisplay_WM_MBUTTONDBLCLK 521L +#undef org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONDOWN 523L +#undef org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONUP +#define org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONUP 524L +#undef org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONDBLCLK +#define org_lwjgl_opengl_WindowsDisplay_WM_XBUTTONDBLCLK 525L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MOUSEWHEEL +#define org_lwjgl_opengl_WindowsDisplay_WM_MOUSEWHEEL 522L +#undef org_lwjgl_opengl_WindowsDisplay_WM_CAPTURECHANGED +#define org_lwjgl_opengl_WindowsDisplay_WM_CAPTURECHANGED 533L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MOUSELEAVE +#define org_lwjgl_opengl_WindowsDisplay_WM_MOUSELEAVE 675L +#undef org_lwjgl_opengl_WindowsDisplay_WM_ENTERSIZEMOVE +#define org_lwjgl_opengl_WindowsDisplay_WM_ENTERSIZEMOVE 561L +#undef org_lwjgl_opengl_WindowsDisplay_WM_EXITSIZEMOVE +#define org_lwjgl_opengl_WindowsDisplay_WM_EXITSIZEMOVE 562L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SIZING +#define org_lwjgl_opengl_WindowsDisplay_WM_SIZING 532L +#undef org_lwjgl_opengl_WindowsDisplay_WM_KEYDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_KEYDOWN 256L +#undef org_lwjgl_opengl_WindowsDisplay_WM_KEYUP +#define org_lwjgl_opengl_WindowsDisplay_WM_KEYUP 257L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SYSKEYUP +#define org_lwjgl_opengl_WindowsDisplay_WM_SYSKEYUP 261L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SYSKEYDOWN +#define org_lwjgl_opengl_WindowsDisplay_WM_SYSKEYDOWN 260L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SYSCHAR +#define org_lwjgl_opengl_WindowsDisplay_WM_SYSCHAR 262L +#undef org_lwjgl_opengl_WindowsDisplay_WM_CHAR +#define org_lwjgl_opengl_WindowsDisplay_WM_CHAR 258L +#undef org_lwjgl_opengl_WindowsDisplay_WM_GETICON +#define org_lwjgl_opengl_WindowsDisplay_WM_GETICON 127L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SETICON +#define org_lwjgl_opengl_WindowsDisplay_WM_SETICON 128L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SETCURSOR +#define org_lwjgl_opengl_WindowsDisplay_WM_SETCURSOR 32L +#undef org_lwjgl_opengl_WindowsDisplay_WM_MOUSEACTIVATE +#define org_lwjgl_opengl_WindowsDisplay_WM_MOUSEACTIVATE 33L +#undef org_lwjgl_opengl_WindowsDisplay_WM_QUIT +#define org_lwjgl_opengl_WindowsDisplay_WM_QUIT 18L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SYSCOMMAND +#define org_lwjgl_opengl_WindowsDisplay_WM_SYSCOMMAND 274L +#undef org_lwjgl_opengl_WindowsDisplay_WM_PAINT +#define org_lwjgl_opengl_WindowsDisplay_WM_PAINT 15L +#undef org_lwjgl_opengl_WindowsDisplay_WM_KILLFOCUS +#define org_lwjgl_opengl_WindowsDisplay_WM_KILLFOCUS 8L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SETFOCUS +#define org_lwjgl_opengl_WindowsDisplay_WM_SETFOCUS 7L +#undef org_lwjgl_opengl_WindowsDisplay_SC_SIZE +#define org_lwjgl_opengl_WindowsDisplay_SC_SIZE 61440L +#undef org_lwjgl_opengl_WindowsDisplay_SC_MOVE +#define org_lwjgl_opengl_WindowsDisplay_SC_MOVE 61456L +#undef org_lwjgl_opengl_WindowsDisplay_SC_MINIMIZE +#define org_lwjgl_opengl_WindowsDisplay_SC_MINIMIZE 61472L +#undef org_lwjgl_opengl_WindowsDisplay_SC_MAXIMIZE +#define org_lwjgl_opengl_WindowsDisplay_SC_MAXIMIZE 61488L +#undef org_lwjgl_opengl_WindowsDisplay_SC_NEXTWINDOW +#define org_lwjgl_opengl_WindowsDisplay_SC_NEXTWINDOW 61504L +#undef org_lwjgl_opengl_WindowsDisplay_SC_PREVWINDOW +#define org_lwjgl_opengl_WindowsDisplay_SC_PREVWINDOW 61520L +#undef org_lwjgl_opengl_WindowsDisplay_SC_CLOSE +#define org_lwjgl_opengl_WindowsDisplay_SC_CLOSE 61536L +#undef org_lwjgl_opengl_WindowsDisplay_SC_VSCROLL +#define org_lwjgl_opengl_WindowsDisplay_SC_VSCROLL 61552L +#undef org_lwjgl_opengl_WindowsDisplay_SC_HSCROLL +#define org_lwjgl_opengl_WindowsDisplay_SC_HSCROLL 61568L +#undef org_lwjgl_opengl_WindowsDisplay_SC_MOUSEMENU +#define org_lwjgl_opengl_WindowsDisplay_SC_MOUSEMENU 61584L +#undef org_lwjgl_opengl_WindowsDisplay_SC_KEYMENU +#define org_lwjgl_opengl_WindowsDisplay_SC_KEYMENU 61696L +#undef org_lwjgl_opengl_WindowsDisplay_SC_ARRANGE +#define org_lwjgl_opengl_WindowsDisplay_SC_ARRANGE 61712L +#undef org_lwjgl_opengl_WindowsDisplay_SC_RESTORE +#define org_lwjgl_opengl_WindowsDisplay_SC_RESTORE 61728L +#undef org_lwjgl_opengl_WindowsDisplay_SC_TASKLIST +#define org_lwjgl_opengl_WindowsDisplay_SC_TASKLIST 61744L +#undef org_lwjgl_opengl_WindowsDisplay_SC_SCREENSAVE +#define org_lwjgl_opengl_WindowsDisplay_SC_SCREENSAVE 61760L +#undef org_lwjgl_opengl_WindowsDisplay_SC_HOTKEY +#define org_lwjgl_opengl_WindowsDisplay_SC_HOTKEY 61776L +#undef org_lwjgl_opengl_WindowsDisplay_SC_DEFAULT +#define org_lwjgl_opengl_WindowsDisplay_SC_DEFAULT 61792L +#undef org_lwjgl_opengl_WindowsDisplay_SC_MONITORPOWER +#define org_lwjgl_opengl_WindowsDisplay_SC_MONITORPOWER 61808L +#undef org_lwjgl_opengl_WindowsDisplay_SC_CONTEXTHELP +#define org_lwjgl_opengl_WindowsDisplay_SC_CONTEXTHELP 61824L +#undef org_lwjgl_opengl_WindowsDisplay_SC_SEPARATOR +#define org_lwjgl_opengl_WindowsDisplay_SC_SEPARATOR 61455L +#undef org_lwjgl_opengl_WindowsDisplay_SM_CXCURSOR +#define org_lwjgl_opengl_WindowsDisplay_SM_CXCURSOR 13L +#undef org_lwjgl_opengl_WindowsDisplay_SM_CYCURSOR +#define org_lwjgl_opengl_WindowsDisplay_SM_CYCURSOR 14L +#undef org_lwjgl_opengl_WindowsDisplay_SM_CMOUSEBUTTONS +#define org_lwjgl_opengl_WindowsDisplay_SM_CMOUSEBUTTONS 43L +#undef org_lwjgl_opengl_WindowsDisplay_SM_MOUSEWHEELPRESENT +#define org_lwjgl_opengl_WindowsDisplay_SM_MOUSEWHEELPRESENT 75L +#undef org_lwjgl_opengl_WindowsDisplay_SIZE_RESTORED +#define org_lwjgl_opengl_WindowsDisplay_SIZE_RESTORED 0L +#undef org_lwjgl_opengl_WindowsDisplay_SIZE_MINIMIZED +#define org_lwjgl_opengl_WindowsDisplay_SIZE_MINIMIZED 1L +#undef org_lwjgl_opengl_WindowsDisplay_SIZE_MAXIMIZED +#define org_lwjgl_opengl_WindowsDisplay_SIZE_MAXIMIZED 2L +#undef org_lwjgl_opengl_WindowsDisplay_WM_SIZE +#define org_lwjgl_opengl_WindowsDisplay_WM_SIZE 5L +#undef org_lwjgl_opengl_WindowsDisplay_WM_ACTIVATE +#define org_lwjgl_opengl_WindowsDisplay_WM_ACTIVATE 6L +#undef org_lwjgl_opengl_WindowsDisplay_WA_INACTIVE +#define org_lwjgl_opengl_WindowsDisplay_WA_INACTIVE 0L +#undef org_lwjgl_opengl_WindowsDisplay_WA_ACTIVE +#define org_lwjgl_opengl_WindowsDisplay_WA_ACTIVE 1L +#undef org_lwjgl_opengl_WindowsDisplay_WA_CLICKACTIVE +#define org_lwjgl_opengl_WindowsDisplay_WA_CLICKACTIVE 2L +#undef org_lwjgl_opengl_WindowsDisplay_SW_NORMAL +#define org_lwjgl_opengl_WindowsDisplay_SW_NORMAL 1L +#undef org_lwjgl_opengl_WindowsDisplay_SW_SHOWMINNOACTIVE +#define org_lwjgl_opengl_WindowsDisplay_SW_SHOWMINNOACTIVE 7L +#undef org_lwjgl_opengl_WindowsDisplay_SW_SHOWDEFAULT +#define org_lwjgl_opengl_WindowsDisplay_SW_SHOWDEFAULT 10L +#undef org_lwjgl_opengl_WindowsDisplay_SW_RESTORE +#define org_lwjgl_opengl_WindowsDisplay_SW_RESTORE 9L +#undef org_lwjgl_opengl_WindowsDisplay_SW_MAXIMIZE +#define org_lwjgl_opengl_WindowsDisplay_SW_MAXIMIZE 3L +#undef org_lwjgl_opengl_WindowsDisplay_ICON_SMALL +#define org_lwjgl_opengl_WindowsDisplay_ICON_SMALL 0L +#undef org_lwjgl_opengl_WindowsDisplay_ICON_BIG +#define org_lwjgl_opengl_WindowsDisplay_ICON_BIG 1L +#undef org_lwjgl_opengl_WindowsDisplay_HWND_TOP +#define org_lwjgl_opengl_WindowsDisplay_HWND_TOP 0i64 +#undef org_lwjgl_opengl_WindowsDisplay_HWND_BOTTOM +#define org_lwjgl_opengl_WindowsDisplay_HWND_BOTTOM 1i64 +#undef org_lwjgl_opengl_WindowsDisplay_HWND_TOPMOST +#define org_lwjgl_opengl_WindowsDisplay_HWND_TOPMOST -1i64 +#undef org_lwjgl_opengl_WindowsDisplay_HWND_NOTOPMOST +#define org_lwjgl_opengl_WindowsDisplay_HWND_NOTOPMOST -2i64 +#undef org_lwjgl_opengl_WindowsDisplay_SWP_NOSIZE +#define org_lwjgl_opengl_WindowsDisplay_SWP_NOSIZE 1L +#undef org_lwjgl_opengl_WindowsDisplay_SWP_NOMOVE +#define org_lwjgl_opengl_WindowsDisplay_SWP_NOMOVE 2L +#undef org_lwjgl_opengl_WindowsDisplay_SWP_NOZORDER +#define org_lwjgl_opengl_WindowsDisplay_SWP_NOZORDER 4L +#undef org_lwjgl_opengl_WindowsDisplay_SWP_FRAMECHANGED +#define org_lwjgl_opengl_WindowsDisplay_SWP_FRAMECHANGED 32L +#undef org_lwjgl_opengl_WindowsDisplay_GWL_STYLE +#define org_lwjgl_opengl_WindowsDisplay_GWL_STYLE -16L +#undef org_lwjgl_opengl_WindowsDisplay_GWL_EXSTYLE +#define org_lwjgl_opengl_WindowsDisplay_GWL_EXSTYLE -20L +#undef org_lwjgl_opengl_WindowsDisplay_WS_THICKFRAME +#define org_lwjgl_opengl_WindowsDisplay_WS_THICKFRAME 262144L +#undef org_lwjgl_opengl_WindowsDisplay_WS_MAXIMIZEBOX +#define org_lwjgl_opengl_WindowsDisplay_WS_MAXIMIZEBOX 65536L +#undef org_lwjgl_opengl_WindowsDisplay_HTCLIENT +#define org_lwjgl_opengl_WindowsDisplay_HTCLIENT 1L +#undef org_lwjgl_opengl_WindowsDisplay_MK_XBUTTON1 +#define org_lwjgl_opengl_WindowsDisplay_MK_XBUTTON1 32L +#undef org_lwjgl_opengl_WindowsDisplay_MK_XBUTTON2 +#define org_lwjgl_opengl_WindowsDisplay_MK_XBUTTON2 64L +#undef org_lwjgl_opengl_WindowsDisplay_XBUTTON1 +#define org_lwjgl_opengl_WindowsDisplay_XBUTTON1 1L +#undef org_lwjgl_opengl_WindowsDisplay_XBUTTON2 +#define org_lwjgl_opengl_WindowsDisplay_XBUTTON2 2L +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nCreateWindow + * Signature: (IIIIZZJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateWindow + (JNIEnv *, jclass, jint, jint, jint, jint, jboolean, jboolean, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nReleaseDC + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseDC + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nDestroyWindow + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nDestroyWindow + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: clipCursor + * Signature: (Ljava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clipCursor + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSwitchDisplayMode + * Signature: (Lorg/lwjgl/opengl/DisplayMode;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSwitchDisplayMode + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: showWindow + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_showWindow + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: setForegroundWindow + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setForegroundWindow + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: setFocus + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setFocus + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nResetDisplayMode + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nResetDisplayMode + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: convertToNativeRamp + * Signature: (Ljava/nio/FloatBuffer;)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_convertToNativeRamp + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getCurrentGammaRamp + * Signature: ()Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getCurrentGammaRamp + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSetGammaRamp + * Signature: (Ljava/nio/ByteBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetGammaRamp + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nGetVersion + * Signature: (Ljava/lang/String;)Lorg/lwjgl/opengl/WindowsFileVersion; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetVersion + (JNIEnv *, jobject, jstring); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getCurrentDisplayMode + * Signature: ()Lorg/lwjgl/opengl/DisplayMode; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getCurrentDisplayMode + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSetTitle + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetTitle + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nUpdate + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nUpdate + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nReshape + * Signature: (JIIIIZZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReshape + (JNIEnv *, jclass, jlong, jint, jint, jint, jint, jboolean, jboolean); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getAvailableDisplayModes + * Signature: ()[Lorg/lwjgl/opengl/DisplayMode; + */ +JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getAvailableDisplayModes + (JNIEnv *, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSetCursorPosition + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetCursorPosition + (JNIEnv *, jclass, jint, jint); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSetNativeCursor + * Signature: (JLjava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetNativeCursor + (JNIEnv *, jclass, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getSystemMetrics + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getSystemMetrics + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getDllInstance + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDllInstance + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getDC + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDC + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getDesktopWindow + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getDesktopWindow + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getForegroundWindow + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getForegroundWindow + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nCreateCursor + * Signature: (IIIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateCursor + (JNIEnv *, jclass, jint, jint, jint, jint, jint, jobject, jint, jobject, jint); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: doDestroyCursor + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_doDestroyCursor + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nGetPbufferCapabilities + * Signature: (Lorg/lwjgl/opengl/PixelFormat;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetPbufferCapabilities + (JNIEnv *, jobject, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: createIcon + * Signature: (IILjava/nio/IntBuffer;)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_createIcon + (JNIEnv *, jclass, jint, jint, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: destroyIcon + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_destroyIcon + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: sendMessage + * Signature: (JJJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_sendMessage + (JNIEnv *, jclass, jlong, jlong, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: setWindowLongPtr + * Signature: (JIJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowLongPtr + (JNIEnv *, jclass, jlong, jint, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getWindowLongPtr + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getWindowLongPtr + (JNIEnv *, jclass, jlong, jint); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: setWindowPos + * Signature: (JJIIIIJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowPos + (JNIEnv *, jclass, jlong, jlong, jint, jint, jint, jint, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nSetCapture + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nSetCapture + (JNIEnv *, jclass, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nReleaseCapture + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseCapture + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getClientRect + * Signature: (JLjava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getClientRect + (JNIEnv *, jclass, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: clientToScreen + * Signature: (JLjava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clientToScreen + (JNIEnv *, jclass, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: setWindowProc + * Signature: (Ljava/lang/reflect/Method;)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setWindowProc + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: defWindowProc + * Signature: (JIJJ)J + */ +JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_defWindowProc + (JNIEnv *, jclass, jlong, jint, jlong, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: getWindowRect + * Signature: (JLjava/nio/IntBuffer;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getWindowRect + (JNIEnv *, jobject, jlong, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: nTrackMouseEvent + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nTrackMouseEvent + (JNIEnv *, jobject, jlong); + +/* + * Class: org_lwjgl_opengl_WindowsDisplay + * Method: adjustWindowRectEx + * Signature: (Ljava/nio/IntBuffer;IZI)Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_adjustWindowRectEx + (JNIEnv *, jobject, jobject, jint, jboolean, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.c new file mode 100644 index 0000000..55d201f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include "Window.h" +#include "org_lwjgl_opengl_WindowsDisplayPeerInfo.h" +#include "context.h" +#include "common_tools.h" + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_nInitDC + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jlong hwnd_ptr, jlong hdc_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + HDC hdc = (HDC)(INT_PTR)hdc_ptr; + WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); + peer_info->drawable_hdc = hdc; + peer_info->u.hwnd = hwnd; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.h new file mode 100644 index 0000000..9f431eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplayPeerInfo.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsDisplayPeerInfo */ + +#ifndef _Included_org_lwjgl_opengl_WindowsDisplayPeerInfo +#define _Included_org_lwjgl_opengl_WindowsDisplayPeerInfo +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsDisplayPeerInfo + * Method: nInitDC + * Signature: (Ljava/nio/ByteBuffer;JJ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_nInitDC + (JNIEnv *, jclass, jobject, jlong, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay_Rect.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay_Rect.h new file mode 100644 index 0000000..834dffd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsDisplay_Rect.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsDisplay_Rect */ + +#ifndef _Included_org_lwjgl_opengl_WindowsDisplay_Rect +#define _Included_org_lwjgl_opengl_WindowsDisplay_Rect +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.c new file mode 100644 index 0000000..f09a587 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id: org_lwjgl_input_Keyboard.c 2385 2006-06-23 16:45:21Z elias_naur $ + * + * @author elias_naue <elias_naur@users.sourceforge.net> + * @version $Revision: 2385 $ + */ + +#include "Window.h" +#include <jni.h> +#include "org_lwjgl_opengl_WindowsKeyboard.h" + +JNIEXPORT jshort JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetKeyState(JNIEnv *env, jclass unused, jint virt_key) { + return GetKeyState(virt_key); +} + +JNIEXPORT jshort JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetAsyncKeyState(JNIEnv *env, jclass unused, jint virt_key) { + return GetAsyncKeyState(virt_key); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_MapVirtualKey(JNIEnv *env, jclass unused, jint uCode, jint uMapType) { + return MapVirtualKey(uCode, uMapType); +} + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_isWindowsNT(JNIEnv *env, jclass unused) { + OSVERSIONINFO osvi; + + osvi.dwOSVersionInfoSize = sizeof(osvi); + GetVersionEx(&osvi); + return osvi.dwPlatformId == VER_PLATFORM_WIN32_NT ? JNI_TRUE : JNI_FALSE; +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_ToUnicode(JNIEnv *env, jclass unused, jint wVirtKey, jint wScanCode, jobject lpKeyState_obj, jobject pwszBuff_obj, jint cchBuff, jint flags) { + const PBYTE lpKeyState = (*env)->GetDirectBufferAddress(env, lpKeyState_obj); + LPWSTR pwszBuff = (*env)->GetDirectBufferAddress(env, pwszBuff_obj); + return ToUnicode(wVirtKey, wScanCode, lpKeyState, pwszBuff, cchBuff, flags); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_ToAscii(JNIEnv *env, jclass unused, jint wVirtKey, jint wScanCode, jobject lpKeyState_obj, jobject lpChar_obj, jint flags) { + const PBYTE lpKeyState = (*env)->GetDirectBufferAddress(env, lpKeyState_obj); + LPWORD lpChar = (*env)->GetDirectBufferAddress(env, lpChar_obj); + return ToAscii(wVirtKey, wScanCode, lpKeyState, lpChar, flags); +} + +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetKeyboardState(JNIEnv *env, jclass unused, jobject lpKeyState_obj) { + PBYTE lpKeyState = (*env)->GetDirectBufferAddress(env, lpKeyState_obj); + return GetKeyboardState(lpKeyState); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.h new file mode 100644 index 0000000..4840e39 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsKeyboard.h @@ -0,0 +1,69 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsKeyboard */ + +#ifndef _Included_org_lwjgl_opengl_WindowsKeyboard +#define _Included_org_lwjgl_opengl_WindowsKeyboard +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: isWindowsNT + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_isWindowsNT + (JNIEnv *, jclass); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: MapVirtualKey + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_MapVirtualKey + (JNIEnv *, jclass, jint, jint); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: ToUnicode + * Signature: (IILjava/nio/ByteBuffer;Ljava/nio/CharBuffer;II)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_ToUnicode + (JNIEnv *, jclass, jint, jint, jobject, jobject, jint, jint); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: ToAscii + * Signature: (IILjava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_ToAscii + (JNIEnv *, jclass, jint, jint, jobject, jobject, jint); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: GetKeyboardState + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetKeyboardState + (JNIEnv *, jclass, jobject); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: GetKeyState + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetKeyState + (JNIEnv *, jclass, jint); + +/* + * Class: org_lwjgl_opengl_WindowsKeyboard + * Method: GetAsyncKeyState + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_org_lwjgl_opengl_WindowsKeyboard_GetAsyncKeyState + (JNIEnv *, jclass, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.c b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.c new file mode 100644 index 0000000..ed32be9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * $Id$ + * + * @author elias_naur <elias_naur@users.sourceforge.net> + * @version $Revision$ + */ + +#include <jni.h> +#include <windows.h> +#include "org_lwjgl_opengl_WindowsRegistry.h" +#include "common_tools.h" + +/* + * Return a string containing the queried value, or NULL of the method fails. + * In that case, a java exception is thrown. + */ +static jstring queryRegistrationKey(JNIEnv *env, HKEY root_key, LPCTSTR subkey, LPCTSTR value) { + DWORD buf_size = 1; + char *result; + HKEY hKey; + LONG lRet; + jstring java_result; + + + if(RegOpenKeyEx(root_key, + TEXT(subkey), + 0, + KEY_QUERY_VALUE, + &hKey) != ERROR_SUCCESS) { + throwException(env, "Failed to open registry key"); + return NULL; + } + + result = (char *)malloc(buf_size); + if (result == NULL) { + RegCloseKey(hKey); + throwException(env, "Failed to allocate buffer"); + return NULL; + } + + while (1) { + lRet = RegQueryValueEx(hKey, + TEXT(value), + NULL, + NULL, + (LPBYTE)result, + &buf_size); + if (lRet != ERROR_SUCCESS && lRet != ERROR_MORE_DATA) { + RegCloseKey(hKey); + free(result); + throwException(env, "Failed query key value"); + return NULL; + } + if (lRet == ERROR_SUCCESS) { + RegCloseKey(hKey); + // make sure the result has a terminating null + buf_size += 1; + result = (char *)realloc(result, buf_size); + if (result == NULL) { + throwException(env, "Failed to resize buffer"); + return NULL; + } + result[buf_size - 1] = '\0'; + java_result = NewStringNativeWithLength(env, result, (jsize)strlen(result)); + free(result); + return java_result; + } + result = (char *)realloc(result, buf_size); + if (result == NULL) { + RegCloseKey(hKey); + throwException(env, "Failed to resize buffer"); + return NULL; + } + } +} + +static HKEY enumToRootKey(jint root_key_enum) { + switch (root_key_enum) { + case org_lwjgl_opengl_WindowsRegistry_HKEY_CLASSES_ROOT: + return HKEY_CLASSES_ROOT; + case org_lwjgl_opengl_WindowsRegistry_HKEY_CURRENT_USER: + return HKEY_CURRENT_USER; + case org_lwjgl_opengl_WindowsRegistry_HKEY_LOCAL_MACHINE: + return HKEY_LOCAL_MACHINE; + case org_lwjgl_opengl_WindowsRegistry_HKEY_USERS: + return HKEY_USERS; + default: + return 0; + } +} + +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_WindowsRegistry_nQueryRegistrationKey (JNIEnv *env, jclass unused, jint root_key, jstring subkey, jstring value) { + HKEY root = enumToRootKey(root_key); + char *subkey_native; + char *value_native; + jstring result; + + subkey_native = GetStringNativeChars(env, subkey); + if (subkey_native == NULL) { + throwException(env, "Failed to fetch the native string"); + return NULL; + } + value_native = GetStringNativeChars(env, value); + if (value_native == NULL) { + free(subkey_native); + throwException(env, "Failed to fetch the native string"); + return NULL; + } + result = queryRegistrationKey(env, root, subkey_native, value_native); + free(subkey_native); + free(value_native); + return result; +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.h b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.h new file mode 100644 index 0000000..eb2e67c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/org_lwjgl_opengl_WindowsRegistry.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_lwjgl_opengl_WindowsRegistry */ + +#ifndef _Included_org_lwjgl_opengl_WindowsRegistry +#define _Included_org_lwjgl_opengl_WindowsRegistry +#ifdef __cplusplus +extern "C" { +#endif +#undef org_lwjgl_opengl_WindowsRegistry_HKEY_CLASSES_ROOT +#define org_lwjgl_opengl_WindowsRegistry_HKEY_CLASSES_ROOT 1L +#undef org_lwjgl_opengl_WindowsRegistry_HKEY_CURRENT_USER +#define org_lwjgl_opengl_WindowsRegistry_HKEY_CURRENT_USER 2L +#undef org_lwjgl_opengl_WindowsRegistry_HKEY_LOCAL_MACHINE +#define org_lwjgl_opengl_WindowsRegistry_HKEY_LOCAL_MACHINE 3L +#undef org_lwjgl_opengl_WindowsRegistry_HKEY_USERS +#define org_lwjgl_opengl_WindowsRegistry_HKEY_USERS 4L +/* + * Class: org_lwjgl_opengl_WindowsRegistry + * Method: nQueryRegistrationKey + * Signature: (ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_WindowsRegistry_nQueryRegistrationKey + (JNIEnv *, jclass, jint, jstring, jstring); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/etc/lwjgl-2.9.1/src/native/windows/windows_al.c b/etc/lwjgl-2.9.1/src/native/windows/windows_al.c new file mode 100644 index 0000000..3f7cf6a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/windows_al.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "extal.h" +#include "common_tools.h" + +/** + * $Id$ + * + * This file contains the AL extension assigning mechanism + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + */ +/* Handle to OpenAL Library */ +static HMODULE handleOAL; + +void *extal_NativeGetFunctionPointer(const char *function) { + return GetProcAddress(handleOAL, function); +} + +void extal_LoadLibrary(JNIEnv *env, jstring path) { + char *path_str = GetStringNativeChars(env, path); + printfDebugJava(env, "Testing '%s'", path_str); + handleOAL = LoadLibrary(path_str); + if (handleOAL != NULL) { + printfDebugJava(env, "Found OpenAL at '%s'", path_str); + } else { + throwFormattedException(env, "Could not load OpenAL library (%d)", GetLastError()); + } + free(path_str); +} + +/** + * Unloads the OpenAL Library + */ +void extal_UnloadLibrary() { + FreeLibrary(handleOAL); +} diff --git a/etc/lwjgl-2.9.1/src/native/windows/windows_cl.c b/etc/lwjgl-2.9.1/src/native/windows/windows_cl.c new file mode 100644 index 0000000..7b24fdb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/native/windows/windows_cl.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <windows.h> +#include "extcl.h" +#include "common_tools.h" + +/** + * This file contains the CL extension assigning mechanism + * + * @author Spasi + */ + +/* Handle to OpenCL Library */ +static HMODULE handleOCL; + +void * extcl_NativeGetFunctionPointer(const char *func_name) { + return GetProcAddress(handleOCL, func_name); +} + +void extcl_LoadLibrary(JNIEnv *env, jstring path) { + char *path_str = GetStringNativeChars(env, path); + printfDebugJava(env, "Testing '%s'", path_str); + handleOCL = LoadLibrary(path_str); + if (handleOCL != NULL) { + printfDebugJava(env, "Found OpenCL at '%s'", path_str); + } else { + throwFormattedException(env, "Could not load OpenCL library (%d)", GetLastError()); + } + free(path_str); +} + +/** + * Unloads the OpenCL Library + */ +void extcl_UnloadLibrary() { + if ( handleOCL != NULL ) { + FreeLibrary(handleOCL); + handleOCL = NULL; + } +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL10.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL10.java new file mode 100644 index 0000000..5c3392a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL10.java @@ -0,0 +1,1256 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.Buffer; +import java.nio.IntBuffer; +import java.nio.FloatBuffer; +import java.nio.DoubleBuffer; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.openal.*; + +/** + * <br> + * This is the core OpenAL class. This class implements + * AL.h version 1.0 + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ + * $Id$ + */ +public interface AL10 { + /** Bad value */ + int AL_INVALID = -1; + + /** Disable value */ + int AL_NONE = 0; + + /** Boolean False */ + int AL_FALSE = 0; + + /** Boolean True */ + int AL_TRUE = 1; + + /** + * Indicate the type of SOURCE. + * Sources can be spatialized + */ + int AL_SOURCE_TYPE = 0x1027; + + /** Indicate source has absolute coordinates */ + int AL_SOURCE_ABSOLUTE = 0x201; + + /** Indicate Source has listener relative coordinates */ + int AL_SOURCE_RELATIVE = 0x202; + + /** + * Directional source, inner cone angle, in degrees + * Range: [0-360] + * Default: 360 + */ + int AL_CONE_INNER_ANGLE = 0x1001; + + /** + * Directional source, outer cone angle, in degrees. + * Range: [0-360] + * Default: 360 + */ + int AL_CONE_OUTER_ANGLE = 0x1002; + + /** + * Specify the pitch to be applied, either at source, + * or on mixer results, at listener. + * Range: [0.5-2.0] + * Default: 1.0 + */ + int AL_PITCH = 0x1003; + + /** + * Specify the current location in three dimensional space. + * OpenAL, like OpenGL, uses a right handed coordinate system, + * where in a frontal default view X (thumb) points right, + * Y points up (index finger), and Z points towards the + * viewer/camera (middle finger). + * To switch from a left handed coordinate system, flip the + * sign on the Z coordinate. + * Listener position is always in the world coordinate system. + */ + int AL_POSITION = 0x1004; + + /** Specify the current direction as forward vector. */ + int AL_DIRECTION = 0x1005; + + /** Specify the current velocity in three dimensional space. */ + int AL_VELOCITY = 0x1006; + + /** + * Indicate whether source has to loop infinite. + * Type: ALboolean + * Range: [TRUE, FALSE] + * Default: FALSE + */ + int AL_LOOPING = 0x1007; + + /** + * Indicate the buffer to provide sound samples. + * Type: ALuint. + * Range: any valid Buffer id. + */ + int AL_BUFFER = 0x1009; + + /** + * Indicate the gain (volume amplification) applied. + * Type: ALfloat. + * Range: ]0.0- ] + * A value of 1.0 means un-attenuated/unchanged. + * Each division by 2 equals an attenuation of -6dB. + * Each multiplicaton with 2 equals an amplification of +6dB. + * A value of 0.0 is meaningless with respect to a logarithmic + * scale; it is interpreted as zero volume - the channel + * is effectively disabled. + */ + int AL_GAIN = 0x100A; + + /** + * Indicate minimum source attenuation. + * Type: ALfloat + * Range: [0.0 - 1.0] + */ + int AL_MIN_GAIN = 0x100D; + + /** + * Indicate maximum source attenuation. + * Type: ALfloat + * Range: [0.0 - 1.0] + */ + int AL_MAX_GAIN = 0x100E; + + /** + * Specify the current orientation. + * Type: ALfv6 (at/up) + * Range: N/A + */ + int AL_ORIENTATION = 0x100F; + + /* byte offset into source (in canon format). -1 if source + * is not playing. Don't set this, get this. + * + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + */ + int AL_REFERENCE_DISTANCE = 0x1020; + + /** + * Indicate the rolloff factor for the source. + * Type: ALfloat + * Range: [0.0 - ] + * Default: 1.0 + */ + int AL_ROLLOFF_FACTOR = 0x1021; + + /** + * Indicate the gain (volume amplification) applied. + * Type: ALfloat. + * Range: ]0.0- ] + * A value of 1.0 means un-attenuated/unchanged. + * Each division by 2 equals an attenuation of -6dB. + * Each multiplicaton with 2 equals an amplification of +6dB. + * A value of 0.0 is meaningless with respect to a logarithmic + * scale; it is interpreted as zero volume - the channel + * is effectively disabled. + */ + int AL_CONE_OUTER_GAIN = 0x1022; + + /** + * Specify the maximum distance. + * Type: ALfloat + * Range: [0.0 - ] + */ + int AL_MAX_DISTANCE = 0x1023; + + /** + * Specify the channel mask. (Creative) + * Type: ALuint + * Range: [0 - 255] + */ + int AL_CHANNEL_MASK = 0x3000; + + /** Source state information */ + int AL_SOURCE_STATE = 0x1010; + + /** Source state information */ + int AL_INITIAL = 0x1011; + + /** Source state information */ + int AL_PLAYING = 0x1012; + + /** Source state information */ + int AL_PAUSED = 0x1013; + + /** Source state information */ + int AL_STOPPED = 0x1014; + + /** Buffer Queue params */ + int AL_BUFFERS_QUEUED = 0x1015; + + /** Buffer Queue params */ + int AL_BUFFERS_PROCESSED = 0x1016; + + /** Sound buffers: format specifier. */ + int AL_FORMAT_MONO8 = 0x1100; + + /** Sound buffers: format specifier. */ + int AL_FORMAT_MONO16 = 0x1101; + + /** Sound buffers: format specifier. */ + int AL_FORMAT_STEREO8 = 0x1102; + + /** Sound buffers: format specifier. */ + int AL_FORMAT_STEREO16 = 0x1103; + + /** Ogg Vorbis format specifier. */ + int AL_FORMAT_VORBIS_EXT = 0x10003; + + /** + * Sound buffers: frequency, in units of Hertz [Hz]. + * This is the number of samples per second. Half of the + * sample frequency marks the maximum significant + * frequency component. + */ + int AL_FREQUENCY = 0x2001; + + /** + * Sound buffers: The number of bits per sample for the + * data contained in the buffer. + */ + int AL_BITS = 0x2002; + + /** + * Sound buffers: The number of channels for the data + * contained in the buffer. + */ + int AL_CHANNELS = 0x2003; + + /** + * Sound buffers: Size in bytes of the buffer data. + */ + int AL_SIZE = 0x2004; + + /** + * @deprecated This token is a relict of the early OpenAL days and is + * no longer supported. Neither the OpenAL spec nor OpenAL Soft define + * it. + */ + @Deprecated + int AL_DATA = 0x2005; + + /** + * Buffer state. + * + * Not supported for public use (yet). + */ + int AL_UNUSED = 0x2010; + + /** + * Buffer state. + * + * Not supported for public use (yet). + */ + int AL_PENDING = 0x2011; + + /** + * Buffer state. + * + * Not supported for public use (yet). + */ + int AL_PROCESSED = 0x2012; + + /** Errors: No Error. */ + int AL_NO_ERROR = AL_FALSE; + + /** Illegal name passed as an argument to an AL call. */ + int AL_INVALID_NAME = 0xA001; + + /** Illegal enum passed as an argument to an AL call. */ + int AL_INVALID_ENUM = 0xA002; + + /** + * Illegal value passed as an argument to an AL call. + * Applies to parameter values, but not to enumerations. + */ + int AL_INVALID_VALUE = 0xA003; + + /** + * A function was called at inappropriate time, + * or in an inappropriate way, causing an illegal state. + * This can be an incompatible ALenum, object ID, + * and/or function. + */ + int AL_INVALID_OPERATION = 0xA004; + + /** + * A function could not be completed, + * because there is not enough memory available. + */ + int AL_OUT_OF_MEMORY = 0xA005; + + /** Context strings: Vendor */ + int AL_VENDOR = 0xB001; + + /** Context strings: Version */ + int AL_VERSION = 0xB002; + + /** Context strings: Renderer */ + int AL_RENDERER = 0xB003; + + /** Context strings: Extensions */ + int AL_EXTENSIONS = 0xB004; + + /** Doppler scale. Default 1.0 */ + int AL_DOPPLER_FACTOR = 0xC000; + + /** Doppler velocity. Default 1.0 */ + int AL_DOPPLER_VELOCITY = 0xC001; + + /** Distance model. Default INVERSE_DISTANCE_CLAMPED */ + int AL_DISTANCE_MODEL = 0xD000; + + /** Distance model */ + int AL_INVERSE_DISTANCE = 0xD001; + + /** Distance model */ + int AL_INVERSE_DISTANCE_CLAMPED = 0xD002; + + /** + * The application can temporarily disable certain AL capabilities on a per Context + * basis. This allows the driver implementation to optimize for certain subsets of + * operations. Enabling and disabling capabilities is handled using a function pair. + * + * @param capability name of a capability to enable + */ + @ALvoid + void alEnable(int capability); + + /** + * The application can temporarily disable certain AL capabilities on a per Context + * basis. This allows the driver implementation to optimize for certain subsets of + * operations. Enabling and disabling capabilities is handled using a function pair. + * + * @param capability name of a capability to disable + */ + @ALvoid + void alDisable(@ALenum int capability); + + /** + * The application can also query whether a given capability is currently enabled or + * not. + * <p> + * If the token used to specify target is not legal, an AL_INVALID_ENUM error will be + * generated. + * </p> + * <p> + * At this time, this mechanism is not used. There are no valid targets. + * </p> + * + * @param capability name of a capability to check + * @return true if named feature is enabled + */ + boolean alIsEnabled(@ALenum int capability); + + /** + * Hinting for implementation + * NOTE: This method is a NOP, but is provided for completeness. + * + * @param target The target to hint + * @param mode Mode to hint + */ +// @ALvoid +// void alHint(@ALenum int target, @ALenum int mode); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @return boolean state described by pname will be returned. + */ + boolean alGetBoolean(@ALenum int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @return int state described by pname will be returned. + */ + int alGetInteger(@ALenum int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @return float state described by pname will be returned. + */ + float alGetFloat(@ALenum int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @return double state described by pname will be returned. + */ + double alGetDouble(@ALenum int pname); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @param pname state to be queried + * @param data Buffer to place the integers in + */ + @StripPostfix("data") + @ALvoid + void alGetIntegerv(@ALenum int pname, @OutParameter @Check("1") IntBuffer data); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @param pname state to be queried + * @param data Buffer to place the floats in + */ + @StripPostfix("data") + @ALvoid + void alGetFloatv(@ALenum int pname, @OutParameter @Check("1") FloatBuffer data); + + /** + * Like OpenGL, AL uses a simplified interface for querying global state. + * + * Legal values are e.g. AL_DOPPLER_FACTOR, AL_DOPPLER_VELOCITY, + * AL_DISTANCE_MODEL. + * <p> + * <code>null</code> destinations are quietly ignored. AL_INVALID_ENUM is the response to errors + * in specifying pName. The amount of memory required in the destination + * depends on the actual state requested. + * </p> + * + * @param pname state to be queried + * @param data Buffer to place the doubles in + */ + @StripPostfix("data") + @ALvoid + void alGetDoublev(@ALenum int pname, @OutParameter @Check("1") DoubleBuffer data); + + /** + * The application can retrieve state information global to the current AL Context. + * GetString will return a pointer to a constant string. Valid values for param are + * VERSION, RENDERER, VENDOR, and EXTENSIONS, as well as the error codes + * defined by AL. The application can use GetString to retrieve a string for an error + * code. + * + * @param pname The property to be returned + * @return OpenAL String property + */ + @NoErrorCheck + String alGetString(@ALenum int pname); + + /** + * The AL detects only a subset of those conditions that could be considered errors. + * This is because in many cases error checking would adversely impact the + * performance of an error-free program. + * <p> + * Each detectable error is assigned a numeric + * code. When an error is detected by AL, a flag is set and the error code is recorded. + * Further errors, if they occur, do not affect this recorded code. When GetError is + * called, the code is returned and the flag is cleared, so that a further error will again + * record its code. If a call to GetError returns AL_NO_ERROR then there has been no + * detectable error since the last call to GetError (or since the AL was initialized). + * </p> + * <p> + * Error codes can be mapped to strings. The GetString function returns a pointer to a + * constant (literal) string that is identical to the identifier used for the enumeration + * value, as defined in the specification. + * </p> + * <p> + * AL_NO_ERROR - "No Error" token.<br> + * AL_INVALID_NAME - Invalid Name parameter.<br> + * AL_INVALID_ENUM - Invalid parameter.<br> + * AL_INVALID_VALUE - Invalid enum parameter value.<br> + * AL_INVALID_OPERATION - Illegal call.<br> + * AL_OUT_OF_MEMORY - Unable to allocate memory.<br> + * </p> + * <p> + * The table summarizes the AL errors. Currently, when an error flag is set, results of + * AL operations are undefined only if AL_OUT_OF_MEMORY has occured. In other + * cases, the command generating the error is ignored so that it has no effect on AL + * state or output buffer contents. If the error generating command returns a value, it + * returns zero. If the generating command modifies values through a pointer + * argument, no change is made to these values. These error semantics apply only to + * AL errors, not to system errors such as memory access errors. + * </p> + * <p> + * Several error generation conditions are implicit in the description of the various AL + * commands. First, if a command that requires an enumerated value is passed a value + * that is not one of those specified as allowable for that command, the error + * AL_INVALID_ENUM results. This is the case even if the argument is a pointer to a + * symbolic constant if that value is not allowable for the given command. This will + * occur whether the value is allowable for other functions, or an invalid integer value. + * </p> + * <p> + * Integer parameters that are used as names for AL objects such as Buffers and + * Sources are checked for validity. If an invalid name parameter is specified in an AL + * command, an AL_INVALID_NAME error will be generated, and the command is + * ignored. + * </p> + * <p> + * If a negative integer is provided where an argument of type sizei is specified, the + * error AL_INVALID_VALUE results. The same error will result from attempts to set + * integral and floating point values for attributes exceeding the legal range for these. + * The specification does not guarantee that the implementation emits + * AL_INVALID_VALUE if a NaN or Infinity value is passed in for a float or double + * argument (as the specification does not enforce possibly expensive testing of + * floating point values). + * </p> + * <p> + * Commands can be invalid. For example, certain commands might not be applicable + * to a given object. There are also illegal combinations of tokens and values as + * arguments to a command. AL responds to any such illegal command with an + * AL_INVALID_OPERATION error. + * </p> + * <p> + * If memory is exhausted as a side effect of the execution of an AL command, either + * on system level or by exhausting the allocated resources at AL's internal disposal, + * the error AL_OUT_OF_MEMORY may be generated. This can also happen independent + * of recent commands if AL has to request memory for an internal task and fails to + * allocate the required memory from the operating system. + * </p> + * <p> + * Otherwise errors are generated only for conditions that are explicitely described in + * this specification. + * </p> + * + * @return current error state + */ + @NoErrorCheck + @ALenum int alGetError(); + + /** + * To verify that a given extension is available for the current context and the device it + * is associated with, use this method. + * <p> + * A <code>null</code> name argument returns AL_FALSE, as do invalid and unsupported string + * tokens. A <code>null</code> deviceHandle will result in an INVALID_DEVICE error. + * </p> + * + * @param fname String describing the desired extension + * @return true if extension is available, false if not + */ + boolean alIsExtensionPresent(String fname); + + /** + * <p> + * To obtain enumeration values for extensions, the application has to use + * GetEnumValue of an extension token. Enumeration values are defined within the + * AL namespace and allocated according to specification of the core API and the + * extensions, thus they are context-independent. + * </p> + * <p> + * Returns 0 if the enumeration can not be found. The presence of an enum value does + * not guarantee the applicability of an extension to the current context. A non-zero + * return indicates merely that the implementation is aware of the existence of this + * extension. Implementations should not attempt to return 0 to indicate that the + * extensions is not supported for the current context. + * </p> + * + * @param ename String describing an OpenAL enum + * @return Actual int for the described enumeration name + */ + @ALenum int alGetEnumValue(String ename); + + /** + * Listener attributes are changed using the Listener group of commands. + * + * @param pname name of the attribute to be set + * @param value value to set the attribute to + */ + @ALvoid + void alListeneri(@ALenum int pname, int value); + + /** + * Listener attributes are changed using the Listener group of commands. + * + * @param pname name of the attribute to be set + * @param value floating point value to set the attribute to + */ + @ALvoid + void alListenerf(@ALenum int pname, float value); + + /** + * Listener attributes are changed using the Listener group of commands. + * + * @param pname name of the attribute to be set + * @param value FloatBuffer containing value to set the attribute to + */ + @StripPostfix("value") + @ALvoid + void alListenerfv(@ALenum int pname, @Check("1") @Const FloatBuffer value); + + /** + * Listener attributes are changed using the Listener group of commands. + * + * @param pname name of the attribute to be set + * @param v1 value value 1 + * @param v2 value value 2 + * @param v3 float value 3 + */ + @ALvoid + void alListener3f(@ALenum int pname, float v1, float v2, float v3); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * + * @param pname name of the attribute to be retrieved + * @return int + */ + void alGetListeneri(@ALenum int pname, @Result @ALint int value); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * + * @param pname name of the attribute to be retrieved + * @return float + */ + void alGetListenerf(@ALenum int pname, @Result float value); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * + * @param pname name of the attribute to be retrieved + * @param floatdata Buffer to write floats to + */ + // TODO: What's the real minimum number of elements? + @StripPostfix("floatdata") + @ALvoid + void alGetListenerfv(@ALenum int pname, @OutParameter @Check("1") FloatBuffer floatdata); + + /** + * The application requests a number of Sources using GenSources. + * + * @param sources array holding sources + */ + @ALvoid + void alGenSources(@AutoSize("sources") @ALsizei int n, @OutParameter @ALuint IntBuffer sources); + + @Alternate(value = "alGenSources", nativeAlt = true) + @ALvoid + void alGenSources2(@Constant("1") @ALsizei int n, @Result @ALuint int source); + + /** + * The application requests deletion of a number of Sources by DeleteSources. + * + * @param sources Source array to delete from + */ + @ALvoid + void alDeleteSources(@AutoSize("sources") @ALsizei int n, @ALuint IntBuffer sources); + + @Alternate(value = "alDeleteSources", nativeAlt = true) + @ALvoid + void alDeleteSources2(@Constant("1") @ALsizei int n, @Indirect @ALuint int source); + + /** + * The application can verify whether a source name is valid using the IsSource query. + * + * @param id id of source to be testes for validity + * @return true if id is valid, false if not + */ + boolean alIsSource(@ALuint int id); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to det property on + * @param pname property to set + * @param value value of property + */ + @ALvoid + void alSourcei(@ALuint int source, @ALenum int pname, int value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to det property on + * @param pname property to set + * @param value value of property + */ + @ALvoid + void alSourcef(@ALuint int source, @ALenum int pname, float value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to set property on + * @param pname property to set + * @param value FloatBuffer containing value of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("value") + @ALvoid + void alSourcefv(@ALuint int source, @ALenum int pname, @Check("1") @Const FloatBuffer value); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to set property on + * @param pname property to set + * @param v1 value 1 of property + * @param v2 value 2 of property + * @param v3 value 3 of property + */ + @ALvoid + void alSource3f( + @ALuint int source, + @ALenum int pname, + float v1, + float v2, + float v3); + + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * + * @param source source to get property from + * @param pname name of property + * @return int + */ + @ALvoid + void alGetSourcei(@ALuint int source, @ALenum int pname, @Result int value); + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * + * @param source source to get property from + * @param pname name of property + * @return float + */ + @ALvoid + void alGetSourcef(@ALuint int source, @ALenum int pname, @Result float value); + + /** + * Source state is maintained inside the AL implementation, and the current attributes + * can be queried. The performance of such queries is implementation dependent, no + * performance guarantees are made. + * + * @param source Source to get property from + * @param pname property to get + * @param floatdata Buffer to write floats to + */ + // TODO: What's the correct minimum value? + @StripPostfix("floatdata") + @ALvoid + void alGetSourcefv(@ALuint int source, @ALenum int pname, @OutParameter @Check("1") FloatBuffer floatdata); + + /** + * Play() applied to an AL_INITIAL Source will promote the Source to AL_PLAYING, thus + * the data found in the Buffer will be fed into the processing, starting at the + * beginning. Play() applied to a AL_PLAYING Source will restart the Source from the + * beginning. It will not affect the configuration, and will leave the Source in + * AL_PLAYING state, but reset the sampling offset to the beginning. Play() applied to a + * AL_PAUSED Source will resume processing using the Source state as preserved at the + * Pause() operation. Play() applied to a AL_STOPPED Source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately. + * + * @param sources array of sources to play + */ + @StripPostfix("sources") + @ALvoid + void alSourcePlayv(@AutoSize("sources") @ALsizei int n, @ALuint IntBuffer sources); + + /** + * Pause() applied to an AL_INITIAL Source is a legal NOP. Pause() applied to a + * AL_PLAYING Source will change its state to AL_PAUSED. The Source is exempt from + * processing, its current state is preserved. Pause() applied to a AL_PAUSED Source is a + * legal NOP. Pause() applied to a AL_STOPPED Source is a legal NOP. + * + * @param sources array of sources to pause + */ + @StripPostfix("sources") + @ALvoid + void alSourcePausev(@AutoSize("sources") @ALsizei int n, @ALuint IntBuffer sources); + + /** + * Stop() applied to an AL_INITIAL Source is a legal NOP. Stop() applied to a AL_PLAYING + * Source will change its state to AL_STOPPED. The Source is exempt from processing, + * its current state is preserved. Stop() applied to a AL_PAUSED Source will change its + * state to AL_STOPPED, with the same consequences as on a AL_PLAYING Source. Stop() + * applied to a AL_STOPPED Source is a legal NOP. + * + * @param sources array of sources to stop + */ + @StripPostfix("sources") + @ALvoid + void alSourceStopv(@AutoSize("sources") @ALsizei int n, @ALuint IntBuffer sources); + + /** + * Rewind() applied to an AL_INITIAL Source is a legal NOP. Rewind() applied to a + * AL_PLAYING Source will change its state to AL_STOPPED then AL_INITIAL. The Source is + * exempt from processing, its current state is preserved, with the exception of the + * sampling offset which is reset to the beginning. Rewind() applied to a AL_PAUSED + * Source will change its state to AL_INITIAL, with the same consequences as on a + * AL_PLAYING Source. Rewind() applied to a AL_STOPPED Source promotes the Source to + * AL_INITIAL, resetting the sampling offset to the beginning. + * + * @param sources array of sources to rewind + */ + @StripPostfix("sources") + @ALvoid + void alSourceRewindv(@AutoSize("sources") @ALsizei int n, @ALuint IntBuffer sources); + + /** + * Play() applied to an AL_INITIAL Source will promote the Source to AL_PLAYING, thus + * the data found in the Buffer will be fed into the processing, starting at the + * beginning. Play() applied to a AL_PLAYING Source will restart the Source from the + * beginning. It will not affect the configuration, and will leave the Source in + * AL_PLAYING state, but reset the sampling offset to the beginning. Play() applied to a + * AL_PAUSED Source will resume processing using the Source state as preserved at the + * Pause() operation. Play() applied to a AL_STOPPED Source will propagate it to + * AL_INITIAL then to AL_PLAYING immediately. + * + * @param source Source to play + */ + @ALvoid + void alSourcePlay(@ALuint int source); + + /** + * Pause() applied to an AL_INITIAL Source is a legal NOP. Pause() applied to a + * AL_PLAYING Source will change its state to AL_PAUSED. The Source is exempt from + * processing, its current state is preserved. Pause() applied to a AL_PAUSED Source is a + * legal NOP. Pause() applied to a AL_STOPPED Source is a legal NOP. + * + * @param source Source to pause + */ + @ALvoid + void alSourcePause(@ALuint int source); + + /** + * Stop() applied to an AL_INITIAL Source is a legal NOP. Stop() applied to a AL_PLAYING + * Source will change its state to AL_STOPPED. The Source is exempt from processing, + * its current state is preserved. Stop() applied to a AL_PAUSED Source will change its + * state to AL_STOPPED, with the same consequences as on a AL_PLAYING Source. Stop() + * applied to a AL_STOPPED Source is a legal NOP. + * + * @param source Source to stop + */ + @ALvoid + void alSourceStop(@ALuint int source); + + /** + * Rewind() applied to an AL_INITIAL Source is a legal NOP. Rewind() applied to a + * AL_PLAYING Source will change its state to AL_STOPPED then AL_INITIAL. The Source is + * exempt from processing, its current state is preserved, with the exception of the + * sampling offset which is reset to the beginning. Rewind() applied to a AL_PAUSED + * Source will change its state to AL_INITIAL, with the same consequences as on a + * AL_PLAYING Source. Rewind() applied to a AL_STOPPED Source promotes the Source to + * AL_INITIAL, resetting the sampling offset to the beginning. + * + * @param source Source to rewind + */ + @ALvoid + void alSourceRewind(@ALuint int source); + + /** + * The application requests a number of Buffers using GenBuffers. + * + * @param buffers holding buffers + */ + @ALvoid + void alGenBuffers(@AutoSize("buffers") @ALsizei int n, @OutParameter @ALuint IntBuffer buffers); + + @Alternate(value = "alGenBuffers", nativeAlt = true) + @ALvoid + void alGenBuffers2(@Constant("1") @ALsizei int n, @Result @ALuint int buffer); + + /** + * <p> + * The application requests deletion of a number of Buffers by calling DeleteBuffers. + * </p> + * <p> + * Once deleted, Names are no longer valid for use with AL function calls. Any such + * use will cause an AL_INVALID_NAME error. The implementation is free to defer actual + * release of resources. + * </p> + * <p> + * IsBuffer(bname) can be used to verify deletion of a buffer. Deleting bufferName 0 is + * a legal NOP in both scalar and vector forms of the command. The same is true for + * unused buffer names, e.g. such as not allocated yet, or as released already. + * + * @param buffers Buffer to delete from + */ + @ALvoid + void alDeleteBuffers(@AutoSize("buffers") @ALsizei int n, @ALuint IntBuffer buffers); + + @Alternate(value = "alDeleteBuffers", nativeAlt = true) + @ALvoid + void alDeleteBuffers2(@Constant("1") @ALsizei int n, @Indirect @ALuint int buffer); + + /** + * The application can verify whether a buffer Name is valid using the IsBuffer query. + * + * @param buffer buffer to be tested for validity + * @return true if supplied buffer is valid, false if not + */ + boolean alIsBuffer(@ALuint int buffer); + + /** + * <p> + * A special case of Buffer state is the actual sound sample data stored in asociation + * with the Buffer. Applications can specify sample data using BufferData. + * </p> + * <p> + * The data specified is copied to an internal software, or if possible, hardware buffer. + * The implementation is free to apply decompression, conversion, resampling, and + * filtering as needed. The internal format of the Buffer is not exposed to the + * application, and not accessible. Valid formats are AL_FORMAT_MONO8, + * AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16. An + * implementation may expose other formats, see the chapter on Extensions for + * information on determining if additional formats are supported. + * </p> + * <p> + * Applications should always check for an error condition after attempting to specify + * buffer data in case an implementation has to generate an AL_OUT_OF_MEMORY or + * conversion related AL_INVALID_VALUE error. The application is free to reuse the + * memory specified by the data pointer once the call to BufferData returns. The + * implementation has to dereference, e.g. copy, the data during BufferData execution. + * </p> + * + * @param buffer Buffer to fill + * @param format format sound data is in + * @param data location of data + * @param freq frequency of data + */ + @ALvoid + void alBufferData( + @ALuint int buffer, + @ALenum int format, + @ALbyte + @ALshort + @ALint + Buffer data, + @AutoSize("data") + @ALsizei int size, + @ALsizei int freq); + + /** + * Buffer state is maintained inside the AL implementation and can be queried in full.<br> + * ALC_FREQUENCY - specified in samples per second, i.e. units of Hertz [Hz].<br> + * ALC_SIZE - Size in bytes of the buffer data.<br> + * + * @param buffer buffer to get property from + * @param pname name of property to retrieve + */ + @ALvoid + void alGetBufferi(@ALuint int buffer, @ALenum int pname, @Result int value); + + /** + * Buffer state is maintained inside the AL implementation and can be queried in full.<br> + * ALC_FREQUENCY - specified in samples per second, i.e. units of Hertz [Hz].<br> + * ALC_SIZE - Size in bytes of the buffer data.<br> + * + * @param buffer buffer to get property from + * @param pname name of property to retrieve + * @return float + */ + @ALvoid + void alGetBufferf(@ALuint int buffer, @ALenum int pname, @Result float value); + + /** + * <p> + * The application can queue up one or multiple buffer names using + * SourceQueueBuffers. The buffers will be queued in the sequence in which they + * appear in the array. + * </p> + * <p> + * This command is legal on a Source in any state (to allow for streaming, queueing + * has to be possible on a AL_PLAYING Source). Queues are read-only with exception of + * the unqueue operation. The Buffer Name AL_NONE (i.e. 0) can be queued. + * </p> + * + * @param source source to queue buffers onto + * @param buffers buffers to be queued + */ + @ALvoid + void alSourceQueueBuffers(@ALuint int source, @AutoSize("buffers") @ALsizei int n, @ALuint IntBuffer buffers); + + @Alternate(value = "alSourceQueueBuffers", nativeAlt = true) + @ALvoid + void alSourceQueueBuffers2(@ALuint int source, @Constant("1") @ALsizei int n, @Indirect @ALuint int buffer); + + /** + * <p> + * Once a queue entry for a buffer has been appended to a queue and is pending + * processing, it should not be changed. Removal of a given queue entry is not possible + * unless either the Source is AL_STOPPED (in which case then entire queue is considered + * processed), or if the queue entry has already been processed (AL_PLAYING or AL_PAUSED + * Source). + * </p> + * <p> + * The Unqueue command removes a number of buffers entries that have finished + * processing, in the order of appearance, from the queue. The operation will fail if + * more buffers are requested than available, leaving the destination arguments + * unchanged. An AL_INVALID_VALUE error will be thrown. If no error, the destination + * argument will have been updated accordingly. + * </p> + * + * @param source source to unqueue buffers from + * @param buffers IntBuffer containing list of names that were unqueued + */ + @ALvoid + void alSourceUnqueueBuffers(@ALuint int source, @AutoSize("buffers") @ALsizei int n, @OutParameter @ALuint IntBuffer buffers); + + @Alternate(value = "alSourceUnqueueBuffers", nativeAlt = true) + @ALvoid + void alSourceUnqueueBuffers2(@ALuint int source, @Constant("1") @ALsizei int n, @Result @ALuint int buffer); + + /** + * <p> + * Samples usually use the entire dynamic range of the chosen format/encoding, + * independent of their real world intensity. In other words, a jet engine and a + * clockwork both will have samples with full amplitude. The application will then + * have to adjust Source AL_GAIN accordingly to account for relative differences. + * </p> + * <p> + * Source AL_GAIN is then attenuated by distance. The effective attenuation of a Source + * depends on many factors, among which distance attenuation and source and + * Listener AL_GAIN are only some of the contributing factors. Even if the source and + * Listener AL_GAIN exceed 1.0 (amplification beyond the guaranteed dynamic range), + * distance and other attenuation might ultimately limit the overall AL_GAIN to a value + * below 1.0. + * </p> + * <p> + * AL currently supports three modes of operation with respect to distance + * attenuation. It supports two distance-dependent attenuation models, one which is + * similar to the IASIG I3DL2 (and DS3D) model. The application choses one of these + * two models (or can chose to disable distance-dependent attenuation effects model) + * on a per-context basis. + * </p> + * <p> + * Legal arguments are AL_NONE, AL_INVERSE_DISTANCE, and + * AL_INVERSE_DISTANCE_CLAMPED. + * <br> + * <br> + * AL_NONE bypasses all distance attenuation + * calculation for all Sources. The implementation is expected to optimize this + * situation. + * <br> + * <br> + * AL_INVERSE_DISTANCE_CLAMPED is the DS3D model, with + * AL_REFERENCE_DISTANCE indicating both the reference distance and the distance + * below which gain will be clamped. + * <br> + * <br> + * AL_INVERSE_DISTANCE is equivalent to the DS3D + * model with the exception that AL_REFERENCE_DISTANCE does not imply any + * clamping. + * <br> + * <br> + * The AL implementation is still free to apply any range clamping as + * necessary. The current distance model chosen can be queried using GetIntegerv and + * AL_DISTANCE_MODEL. + * </p> + * + * @param value distance model to be set + */ + @ALvoid + void alDistanceModel(@ALenum int value); + + /** + * The Doppler Effect depends on the velocities of Source and Listener relative to the + * medium, and the propagation speed of sound in that medium. The application + * might want to emphasize or de-emphasize the Doppler Effect as physically accurate + * calculation might not give the desired results. The amount of frequency shift (pitch + * change) is proportional to the speed of listener and source along their line of sight. + * The application can increase or decrease that frequency shift by specifying the + * scaling factor AL should apply to the result of the calculation. + * <br> + * <br> + * The Doppler Effect as implemented by AL is described by the formula below. Effects + * of the medium (air, water) moving with respect to listener and source are ignored. + * AL_DOPPLER_VELOCITY is the propagation speed relative to which the Source + * velocities are interpreted. + * + * <p> + * <pre> + * VD: AL_DOPPLER_VELOCITY + * DF: AL_DOPPLER_FACTOR + * vl: Listener velocity (scalar, projected on source-listener vector) + * vs: Source verlocity (scalar, projected on source-listener vector) + * f: Frequency in sample + * f': effective Doppler shifted frequency + * + * f' = DF * f * (VD-vl)/(VD+vs) + * + * vl<0, vs>0 : source and listener approaching each other + * vl>0, vs<0 : source and listener moving away from each other + * </pre> + * </p> + * <p> + * The implementation has to clamp the projected Listener velocity vl, if abs(vl) is + * greater or equal VD. It similarly has to clamp the projected Source velocity vs if + * abs(vs) is greater or equal VD. + * </p> + * <p> + * There are two API calls global to the current context that provide control of the two + * related parameters. + * </p> + * <p> + * AL_DOPPLER_FACTOR is a simple scaling to exaggerate or + * deemphasize the Doppler (pitch) shift resulting from the calculation. + * </p> + * <p> + * A negative value will result in an AL_INVALID_VALUE error, the command is then + * ignored. The default value is 1. The current setting can be queried using GetFloatv + * and AL_DOPPLER_FACTOR. The implementation is free to optimize the case of + * AL_DOPPLER_FACTOR being set to zero, as this effectively disables the effect. + * </p> + * + * @param value Doppler scale value to set + */ + @ALvoid + void alDopplerFactor(float value); + + /** + * The Doppler Effect depends on the velocities of Source and Listener relative to the + * medium, and the propagation speed of sound in that medium. The application + * might want to emphasize or de-emphasize the Doppler Effect as physically accurate + * calculation might not give the desired results. The amount of frequency shift (pitch + * change) is proportional to the speed of listener and source along their line of sight. + * The application can increase or decrease that frequency shift by specifying the + * scaling factor AL should apply to the result of the calculation. + * <br> + * <br> + * The Doppler Effect as implemented by AL is described by the formula below. Effects + * of the medium (air, water) moving with respect to listener and source are ignored. + * AL_DOPPLER_VELOCITY is the propagation speed relative to which the Source + * velocities are interpreted. + * + * <p> + * <pre> + * VD: AL_DOPPLER_VELOCITY + * DF: AL_DOPPLER_FACTOR + * vl: Listener velocity (scalar, projected on source-listener vector) + * vs: Source verlocity (scalar, projected on source-listener vector) + * f: Frequency in sample + * f': effective Doppler shifted frequency + * + * f' = DF * f * (VD-vl)/(VD+vs) + * + * vl<0, vs>0 : source and listener approaching each other + * vl>0, vs<0 : source and listener moving away from each other + * </pre> + * </p> + * <p> + * The implementation has to clamp the projected Listener velocity vl, if abs(vl) is + * greater or equal VD. It similarly has to clamp the projected Source velocity vs if + * abs(vs) is greater or equal VD. + * </p> + * <p> + * There are two API calls global to the current context that provide control of the two + * related parameters. + * </p> + * <p> + * AL_DOPPLER_VELOCITY allows the application to change the reference (propagation) + * velocity used in the Doppler Effect calculation. This permits the application to use a + * velocity scale appropriate to its purposes. + * </p> + * <p> + * A negative or zero value will result in an AL_INVALID_VALUE error, the command is + * then ignored. The default value is 1. The current setting can be queried using + * GetFloatv and AL_DOPPLER_VELOCITY. + * </p> + * + * @param value Doppler velocity value to set + */ + @ALvoid + void alDopplerVelocity(float value); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL11.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL11.java new file mode 100644 index 0000000..1fb6b52 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/AL11.java @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.IntBuffer; +import java.nio.FloatBuffer; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.openal.ALenum; +import org.lwjgl.util.generator.openal.ALuint; +import org.lwjgl.util.generator.openal.ALvoid; + +/** + * <br> + * This is the core OpenAL class. This class implements + * AL.h version 1.1 + * + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision: 2286 $ + * $Id: AL10.java 2286 2006-03-23 19:32:21Z matzon $ + */ +public interface AL11 { + + /** Source buffer position information in seconds */ + public static final int AL_SEC_OFFSET = 0x1024; + + /** Source buffer position information in samples */ + public static final int AL_SAMPLE_OFFSET = 0x1025; + + /** Source buffer position information in bytes */ + public static final int AL_BYTE_OFFSET = 0x1026; + + /** Type of source: Buffer has been attached using AL_BUFFER */ + public static final int AL_STATIC = 0x1028; + + /** Type of source: if one or more Buffers have been attached using alSourceQueueBuffers */ + public static final int AL_STREAMING = 0x1029; + + /** Type of source: when it has the NULL buffer attached */ + public static final int AL_UNDETERMINED = 0x1030; + + /** @see AL10#AL_INVALID_OPERATION */ + public static final int AL_ILLEGAL_COMMAND = 0xA004; + + /** Speed of Sound in units per second */ + public static final int AL_SPEED_OF_SOUND = 0xC003; + + public static final int AL_LINEAR_DISTANCE = 0xD003; + public static final int AL_LINEAR_DISTANCE_CLAMPED = 0xD004; + public static final int AL_EXPONENT_DISTANCE = 0xD005; + public static final int AL_EXPONENT_DISTANCE_CLAMPED = 0xD006; + + /** + * Listener attributes are changed using the Listener group of commands. + * + * @param pname name of the attribute to be set + * @param v1 value value 1 + * @param v2 value value 2 + * @param v3 value value 3 + */ + @ALvoid + void alListener3i(@ALenum int pname, int v1, int v2, int v3); + + /** + * Listener state is maintained inside the AL implementation and can be queried in + * full. + * + * @param pname name of the attribute to be retrieved + * @param intdata Buffer to write ints to + */ + // TODO: What's the real minimum number of elements? + @StripPostfix("intdata") + @ALvoid + void alGetListeneriv(@ALenum int pname, @OutParameter @Check("1") FloatBuffer intdata); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to set property on + * @param pname property to set + * @param v1 value 1 of property + * @param v2 value 2 of property + * @param v3 value 3 of property + */ + @ALvoid + void alSource3i(@ALuint int source, @ALenum int pname, int v1, int v2, int v3); + + /** + * Specifies the position and other properties as taken into account during + * sound processing. + * + * @param source Source to set property on + * @param pname property to set + * @param value IntBuffer containing value of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("value") + @ALvoid + void alSourceiv(@ALuint int source, @ALenum int pname, @Check("1") @Const IntBuffer value); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param value value of property + */ + @ALvoid + void alBufferf(@ALuint int buffer, @ALenum int pname, float value); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param v1 value of property + * @param v2 value of property + * @param v3 value of property + */ + @ALvoid + void alBuffer3f(@ALuint int buffer, @ALenum int pname, float v1, float v2, float v3); + + /** + * This function sets a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param value FloatBuffer containing value of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("value") + @ALvoid + void alBufferfv(@ALuint int buffer, @ALenum int pname, @Check("1") @Const FloatBuffer value); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param value value of property + */ + @ALvoid + void alBufferi(@ALuint int buffer, @ALenum int pname, int value); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param v1 value of property + * @param v2 value of property + * @param v3 value of property + */ + @ALvoid + void alBuffer3i(@ALuint int buffer, @ALenum int pname, int v1, int v2, int v3); + + /** + * This function sets an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to set property on + * @param pname property to set + * @param value IntBuffer containing value of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("value") + @ALvoid + void alBufferiv(@ALuint int buffer, @ALenum int pname, @Check("1") @Const IntBuffer value); + + /** + * This function retrieves an integer property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to get property from + * @param pname name of property + * @return int + */ + @ALvoid + void alGetBufferi(@ALuint int buffer, @ALenum int pname, @Result int value); + + /** + * This function retrieves an integer property of a buffer. + * + * @param buffer Buffer to get property from + * @param pname name of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("values") + @ALvoid + void alGetBufferiv(@ALuint int buffer, @ALenum int pname, @OutParameter @Check("1") IntBuffer values); + + /** + * This function retrieves a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to get property from + * @param pname name of property + * @return floating point property + */ + @ALvoid + void alGetBufferf(@ALuint int buffer, @ALenum int pname, @Result float value); + + /** + * This function retrieves a floating point property of a buffer. + * <i>note: There are no relevant buffer properties defined in OpenAL 1.1 which can be affected by + * this call, but this function may be used by OpenAL extensions.</i> + * + * @param buffer Buffer to get property from + * @param pname name of property + */ + // TODO: What's the correct minimum value? + @StripPostfix("values") + @ALvoid + void alGetBufferfv(@ALuint int buffer, @ALenum int pname, @OutParameter @Check("1") FloatBuffer values); + + /** + * <p> + * AL_SPEED_OF_SOUND allows the application to change the reference (propagation) + * speed used in the Doppler calculation. The source and listener velocities should be + * expressed in the same units as the speed of sound. + * </p> + * <p> + * A negative or zero value will result in an AL_INVALID_VALUE error, and the + * command is ignored. The default value is 343.3 (appropriate for velocity units of meters + * and air as the propagation medium). The current setting can be queried using + * alGetFloat{v} and AL_SPEED_OF_SOUND. + * Distance and velocity units are completely independent of one another (so you could use + * different units for each if desired). + * </p> + * + * @param value distance model to be set + */ + @ALvoid + void alSpeedOfSound(float value); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/EFX10.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/EFX10.java new file mode 100644 index 0000000..40a69df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/openal/EFX10.java @@ -0,0 +1,731 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.openal; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.openal.ALenum; +import org.lwjgl.util.generator.openal.ALsizei; +import org.lwjgl.util.generator.openal.ALuint; +import org.lwjgl.util.generator.openal.ALvoid; +import org.lwjgl.util.generator.Alternate; + +/** + * Implementation of the OpenAL extension ALC_EXT_EFX (version 1.0). Contains necessary fields, + * methods and a range of supplementary fields containing minimum, maximum and default values of + * the former fields. + * <p> + * On top of regular functions defined in the ALC_EXT_EFX, there are also several convenience + * functions. Namely alGen... and alDelete... which do not take a Java buffer parameter and + * automatically create or delete a single object, without the overhead of using a buffer. + * <p> + * For comments and specification of functions and fields, refer to the "Effects Extension Guide" + * which is part of the OpenAL SDK and can be downloaded from: + * http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx + * + * @author Ciardhubh <ciardhubh[at]ciardhubh.de> + * @version $Revision$ + * $Id$ + */ +public interface EFX10 { + + // ALC properties + String ALC_EXT_EFX_NAME = "ALC_EXT_EFX"; + int ALC_EFX_MAJOR_VERSION = 0x20001; + int ALC_EFX_MINOR_VERSION = 0x20002; + int ALC_MAX_AUXILIARY_SENDS = 0x20003; + + // Listener properties + int AL_METERS_PER_UNIT = 0x20004; + + // Source properties + int AL_DIRECT_FILTER = 0x20005; + int AL_AUXILIARY_SEND_FILTER = 0x20006; + int AL_AIR_ABSORPTION_FACTOR = 0x20007; + int AL_ROOM_ROLLOFF_FACTOR = 0x20008; + int AL_CONE_OUTER_GAINHF = 0x20009; + int AL_DIRECT_FILTER_GAINHF_AUTO = 0x2000A; + int AL_AUXILIARY_SEND_FILTER_GAIN_AUTO = 0x2000B; + int AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO = 0x2000C; + + // Auxiliary effect slot properties + int AL_EFFECTSLOT_EFFECT = 0x0001; + int AL_EFFECTSLOT_GAIN = 0x0002; + int AL_EFFECTSLOT_AUXILIARY_SEND_AUTO = 0x0003; + // NULL auxiliary slot ID to disable a source send + int AL_EFFECTSLOT_NULL = 0x0000; + + // Effect parameters + // Reverb + int AL_REVERB_DENSITY = 0x0001; + int AL_REVERB_DIFFUSION = 0x0002; + int AL_REVERB_GAIN = 0x0003; + int AL_REVERB_GAINHF = 0x0004; + int AL_REVERB_DECAY_TIME = 0x0005; + int AL_REVERB_DECAY_HFRATIO = 0x0006; + int AL_REVERB_REFLECTIONS_GAIN = 0x0007; + int AL_REVERB_REFLECTIONS_DELAY = 0x0008; + int AL_REVERB_LATE_REVERB_GAIN = 0x0009; + int AL_REVERB_LATE_REVERB_DELAY = 0x000A; + int AL_REVERB_AIR_ABSORPTION_GAINHF = 0x000B; + int AL_REVERB_ROOM_ROLLOFF_FACTOR = 0x000C; + int AL_REVERB_DECAY_HFLIMIT = 0x000D; + // EAX Reverb + int AL_EAXREVERB_DENSITY = 0x0001; + int AL_EAXREVERB_DIFFUSION = 0x0002; + int AL_EAXREVERB_GAIN = 0x0003; + int AL_EAXREVERB_GAINHF = 0x0004; + int AL_EAXREVERB_GAINLF = 0x0005; + int AL_EAXREVERB_DECAY_TIME = 0x0006; + int AL_EAXREVERB_DECAY_HFRATIO = 0x0007; + int AL_EAXREVERB_DECAY_LFRATIO = 0x0008; + int AL_EAXREVERB_REFLECTIONS_GAIN = 0x0009; + int AL_EAXREVERB_REFLECTIONS_DELAY = 0x000A; + int AL_EAXREVERB_REFLECTIONS_PAN = 0x000B; + int AL_EAXREVERB_LATE_REVERB_GAIN = 0x000C; + int AL_EAXREVERB_LATE_REVERB_DELAY = 0x000D; + int AL_EAXREVERB_LATE_REVERB_PAN = 0x000E; + int AL_EAXREVERB_ECHO_TIME = 0x000F; + int AL_EAXREVERB_ECHO_DEPTH = 0x0010; + int AL_EAXREVERB_MODULATION_TIME = 0x0011; + int AL_EAXREVERB_MODULATION_DEPTH = 0x0012; + int AL_EAXREVERB_AIR_ABSORPTION_GAINHF = 0x0013; + int AL_EAXREVERB_HFREFERENCE = 0x0014; + int AL_EAXREVERB_LFREFERENCE = 0x0015; + int AL_EAXREVERB_ROOM_ROLLOFF_FACTOR = 0x0016; + int AL_EAXREVERB_DECAY_HFLIMIT = 0x0017; + // Chorus + int AL_CHORUS_WAVEFORM = 0x0001; + int AL_CHORUS_PHASE = 0x0002; + int AL_CHORUS_RATE = 0x0003; + int AL_CHORUS_DEPTH = 0x0004; + int AL_CHORUS_FEEDBACK = 0x0005; + int AL_CHORUS_DELAY = 0x0006; + // Distortion + int AL_DISTORTION_EDGE = 0x0001; + int AL_DISTORTION_GAIN = 0x0002; + int AL_DISTORTION_LOWPASS_CUTOFF = 0x0003; + int AL_DISTORTION_EQCENTER = 0x0004; + int AL_DISTORTION_EQBANDWIDTH = 0x0005; + // Echo + int AL_ECHO_DELAY = 0x0001; + int AL_ECHO_LRDELAY = 0x0002; + int AL_ECHO_DAMPING = 0x0003; + int AL_ECHO_FEEDBACK = 0x0004; + int AL_ECHO_SPREAD = 0x0005; + // Flanger + int AL_FLANGER_WAVEFORM = 0x0001; + int AL_FLANGER_PHASE = 0x0002; + int AL_FLANGER_RATE = 0x0003; + int AL_FLANGER_DEPTH = 0x0004; + int AL_FLANGER_FEEDBACK = 0x0005; + int AL_FLANGER_DELAY = 0x0006; + // Frequency shifter + int AL_FREQUENCY_SHIFTER_FREQUENCY = 0x0001; + int AL_FREQUENCY_SHIFTER_LEFT_DIRECTION = 0x0002; + int AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION = 0x0003; + // Vocal morpher + int AL_VOCAL_MORPHER_PHONEMEA = 0x0001; + int AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING = 0x0002; + int AL_VOCAL_MORPHER_PHONEMEB = 0x0003; + int AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING = 0x0004; + int AL_VOCAL_MORPHER_WAVEFORM = 0x0005; + int AL_VOCAL_MORPHER_RATE = 0x0006; + // Pitch shifter + int AL_PITCH_SHIFTER_COARSE_TUNE = 0x0001; + int AL_PITCH_SHIFTER_FINE_TUNE = 0x0002; + // Ring modulator + int AL_RING_MODULATOR_FREQUENCY = 0x0001; + int AL_RING_MODULATOR_HIGHPASS_CUTOFF = 0x0002; + int AL_RING_MODULATOR_WAVEFORM = 0x0003; + // Autowah + int AL_AUTOWAH_ATTACK_TIME = 0x0001; + int AL_AUTOWAH_RELEASE_TIME = 0x0002; + int AL_AUTOWAH_RESONANCE = 0x0003; + int AL_AUTOWAH_PEAK_GAIN = 0x0004; + // Compressor + int AL_COMPRESSOR_ONOFF = 0x0001; + // Equalizer + int AL_EQUALIZER_LOW_GAIN = 0x0001; + int AL_EQUALIZER_LOW_CUTOFF = 0x0002; + int AL_EQUALIZER_MID1_GAIN = 0x0003; + int AL_EQUALIZER_MID1_CENTER = 0x0004; + int AL_EQUALIZER_MID1_WIDTH = 0x0005; + int AL_EQUALIZER_MID2_GAIN = 0x0006; + int AL_EQUALIZER_MID2_CENTER = 0x0007; + int AL_EQUALIZER_MID2_WIDTH = 0x0008; + int AL_EQUALIZER_HIGH_GAIN = 0x0009; + int AL_EQUALIZER_HIGH_CUTOFF = 0x000A; + // Effect type + int AL_EFFECT_FIRST_PARAMETER = 0x0000; + int AL_EFFECT_LAST_PARAMETER = 0x8000; + int AL_EFFECT_TYPE = 0x8001; + // Effect types, used with AL_EFFECT_TYPE + int AL_EFFECT_NULL = 0x0000; + int AL_EFFECT_REVERB = 0x0001; + int AL_EFFECT_CHORUS = 0x0002; + int AL_EFFECT_DISTORTION = 0x0003; + int AL_EFFECT_ECHO = 0x0004; + int AL_EFFECT_FLANGER = 0x0005; + int AL_EFFECT_FREQUENCY_SHIFTER = 0x0006; + int AL_EFFECT_VOCAL_MORPHER = 0x0007; + int AL_EFFECT_PITCH_SHIFTER = 0x0008; + int AL_EFFECT_RING_MODULATOR = 0x0009; + int AL_EFFECT_AUTOWAH = 0x000A; + int AL_EFFECT_COMPRESSOR = 0x000B; + int AL_EFFECT_EQUALIZER = 0x000C; + int AL_EFFECT_EAXREVERB = 0x8000; + + // Filter properties + // Lowpass + int AL_LOWPASS_GAIN = 0x0001; + int AL_LOWPASS_GAINHF = 0x0002; + // Highpass + int AL_HIGHPASS_GAIN = 0x0001; + int AL_HIGHPASS_GAINLF = 0x0002; + // Bandpass + int AL_BANDPASS_GAIN = 0x0001; + int AL_BANDPASS_GAINLF = 0x0002; + int AL_BANDPASS_GAINHF = 0x0003; + // Filter type + int AL_FILTER_FIRST_PARAMETER = 0x0000; + int AL_FILTER_LAST_PARAMETER = 0x8000; + int AL_FILTER_TYPE = 0x8001; + // Filter types, used with the AL_FILTER_TYPE property + int AL_FILTER_NULL = 0x0000; + int AL_FILTER_LOWPASS = 0x0001; + int AL_FILTER_HIGHPASS = 0x0002; + int AL_FILTER_BANDPASS = 0x0003; + + // Auxiliary effect slot object functions + @ALvoid + void alGenAuxiliaryEffectSlots(@AutoSize("auxiliaryeffectslots") @ALsizei int n, @OutParameter @ALuint IntBuffer auxiliaryeffectslots); + + @Alternate(value = "alGenAuxiliaryEffectSlots", nativeAlt = true) + @ALvoid + void alGenAuxiliaryEffectSlots2(@Constant("1") @ALsizei int n, @Result @ALuint int auxiliaryeffectslot); + + @ALvoid + void alDeleteAuxiliaryEffectSlots(@AutoSize("auxiliaryeffectslots") @ALsizei int n, @OutParameter @ALuint IntBuffer auxiliaryeffectslots); + + @Alternate(value = "alDeleteAuxiliaryEffectSlots", nativeAlt = true) + @ALvoid + void alDeleteAuxiliaryEffectSlots2(@Constant("1") @ALsizei int n, @Indirect @ALuint int auxiliaryeffectslot); + + boolean alIsAuxiliaryEffectSlot(@ALuint int auxiliaryeffectslot); + + @ALvoid + void alAuxiliaryEffectSloti(@ALuint int auxiliaryeffectslot, @ALenum int param, int value); + + @StripPostfix("values") + @ALvoid + void alAuxiliaryEffectSlotiv(@ALuint int auxiliaryeffectslot, @ALenum int param, @Check("1") @Const IntBuffer values); + + @ALvoid + void alAuxiliaryEffectSlotf(@ALuint int auxiliaryeffectslot, @ALenum int param, float value); + + @StripPostfix("values") + @ALvoid + void alAuxiliaryEffectSlotfv(@ALuint int auxiliaryeffectslot, @ALenum int param, @Check("1") @Const FloatBuffer values); + + @ALvoid + void alGetAuxiliaryEffectSloti(@ALuint int auxiliaryeffectslot, @ALenum int param, @Result int value); + + @StripPostfix("intdata") + @ALvoid + void alGetAuxiliaryEffectSlotiv(@ALuint int auxiliaryeffectslot, @ALenum int param, @OutParameter @Check("1") IntBuffer intdata); + + @ALvoid + void alGetAuxiliaryEffectSlotf(@ALuint int auxiliaryeffectslot, @ALenum int param, @Result float value); + + @StripPostfix("floatdata") + @ALvoid + void alGetAuxiliaryEffectSlotfv(@ALuint int auxiliaryeffectslot, @ALenum int param, @OutParameter @Check("1") FloatBuffer floatdata); + + // Effect object functions + @ALvoid + void alGenEffects(@AutoSize("effects") @ALsizei int n, @OutParameter @ALuint IntBuffer effects); + + @Alternate(value = "alGenEffects", nativeAlt = true) + @ALvoid + void alGenEffects2(@Constant("1") @ALsizei int n, @Result @ALuint int effect); + + @ALvoid + void alDeleteEffects(@AutoSize("effects") @ALsizei int n, @OutParameter @ALuint IntBuffer effects); + + @Alternate(value = "alDeleteEffects", nativeAlt = true) + @ALvoid + void alDeleteEffects2(@Constant("1") @ALsizei int n, @Indirect @ALuint int effect); + + boolean alIsEffect(@ALuint int effect); + + @ALvoid + void alEffecti(@ALuint int effect, @ALenum int param, int value); + + @StripPostfix("values") + @ALvoid + void alEffectiv(@ALuint int effect, @ALenum int param, @Check("1") @Const IntBuffer values); + + @ALvoid + void alEffectf(@ALuint int effect, @ALenum int param, float value); + + @StripPostfix("values") + @ALvoid + void alEffectfv(@ALuint int effect, @ALenum int param, @Check("1") @Const FloatBuffer values); + + @ALvoid + void alGetEffecti(@ALuint int effect, @ALenum int param, @Result int value); + + @StripPostfix("intdata") + @ALvoid + void alGetEffectiv(@ALuint int effect, @ALenum int param, @OutParameter @Check("1") IntBuffer intdata); + + @ALvoid + void alGetEffectf(@ALuint int effect, @ALenum int param, @Result float value); + + @StripPostfix("floatdata") + @ALvoid + void alGetEffectfv(@ALuint int effect, @ALenum int param, @OutParameter @Check("1") FloatBuffer floatdata); + + // Filter object functions + @ALvoid + void alGenFilters(@AutoSize("filters") @ALsizei int n, @OutParameter @ALuint IntBuffer filters); + + @Alternate(value = "alGenFilters", nativeAlt = true) + @ALvoid + void alGenFilters2(@Constant("1") @ALsizei int n, @Result @ALuint int filter); + + @ALvoid + void alDeleteFilters(@AutoSize("filters") @ALsizei int n, @OutParameter @ALuint IntBuffer filters); + + @Alternate(value = "alDeleteFilters", nativeAlt = true) + @ALvoid + void alDeleteFilters2(@Constant("1") @ALsizei int n, @Indirect @ALuint int filter); + + boolean alIsFilter(@ALuint int filter); + + @ALvoid + void alFilteri(@ALuint int filter, @ALenum int param, int value); + + @StripPostfix("values") + @ALvoid + void alFilteriv(@ALuint int filter, @ALenum int param, @Check("1") @Const IntBuffer values); + + @ALvoid + void alFilterf(@ALuint int filter, @ALenum int param, float value); + + @StripPostfix("values") + @ALvoid + void alFilterfv(@ALuint int filter, @ALenum int param, @Check("1") @Const FloatBuffer values); + + @ALvoid + void alGetFilteri(@ALuint int filter, @ALenum int param, @Result int value); + + @StripPostfix("intdata") + @ALvoid + void alGetFilteriv(@ALuint int filter, @ALenum int param, @OutParameter @Check("1") IntBuffer intdata); + + @ALvoid + void alGetFilterf(@ALuint int filter, @ALenum int param, @Result float value); + + @StripPostfix("floatdata") + @ALvoid + void alGetFilterfv(@ALuint int filter, @ALenum int param, @OutParameter @Check("1") FloatBuffer floatdata); + + // Source property value ranges and defaults + float AL_MIN_AIR_ABSORPTION_FACTOR = 0.0f; + float AL_MAX_AIR_ABSORPTION_FACTOR = 10.0f; + float AL_DEFAULT_AIR_ABSORPTION_FACTOR = 0.0f; + float AL_MIN_ROOM_ROLLOFF_FACTOR = 0.0f; + float AL_MAX_ROOM_ROLLOFF_FACTOR = 10.0f; + float AL_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + float AL_MIN_CONE_OUTER_GAINHF = 0.0f; + float AL_MAX_CONE_OUTER_GAINHF = 1.0f; + float AL_DEFAULT_CONE_OUTER_GAINHF = 1.0f; + int AL_MIN_DIRECT_FILTER_GAINHF_AUTO = AL10.AL_FALSE; + int AL_MAX_DIRECT_FILTER_GAINHF_AUTO = AL10.AL_TRUE; + int AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO = AL10.AL_TRUE; + int AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO = AL10.AL_FALSE; + int AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO = AL10.AL_TRUE; + int AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO = AL10.AL_TRUE; + int AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO = AL10.AL_FALSE; + int AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO = AL10.AL_TRUE; + int AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO = AL10.AL_TRUE; + + // Listener property value ranges and defaults + float AL_MIN_METERS_PER_UNIT = Float.MIN_VALUE; + float AL_MAX_METERS_PER_UNIT = Float.MAX_VALUE; + float AL_DEFAULT_METERS_PER_UNIT = 1.0f; + + // Effect parameter ranges and defaults + // Reverb + float AL_REVERB_MIN_DENSITY = 0.0f; + float AL_REVERB_MAX_DENSITY = 1.0f; + float AL_REVERB_DEFAULT_DENSITY = 1.0f; + float AL_REVERB_MIN_DIFFUSION = 0.0f; + float AL_REVERB_MAX_DIFFUSION = 1.0f; + float AL_REVERB_DEFAULT_DIFFUSION = 1.0f; + float AL_REVERB_MIN_GAIN = 0.0f; + float AL_REVERB_MAX_GAIN = 1.0f; + float AL_REVERB_DEFAULT_GAIN = 0.32f; + float AL_REVERB_MIN_GAINHF = 0.0f; + float AL_REVERB_MAX_GAINHF = 1.0f; + float AL_REVERB_DEFAULT_GAINHF = 0.89f; + float AL_REVERB_MIN_DECAY_TIME = 0.1f; + float AL_REVERB_MAX_DECAY_TIME = 20.0f; + float AL_REVERB_DEFAULT_DECAY_TIME = 1.49f; + float AL_REVERB_MIN_DECAY_HFRATIO = 0.1f; + float AL_REVERB_MAX_DECAY_HFRATIO = 2.0f; + float AL_REVERB_DEFAULT_DECAY_HFRATIO = 0.83f; + float AL_REVERB_MIN_REFLECTIONS_GAIN = 0.0f; + float AL_REVERB_MAX_REFLECTIONS_GAIN = 3.16f; + float AL_REVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f; + float AL_REVERB_MIN_REFLECTIONS_DELAY = 0.0f; + float AL_REVERB_MAX_REFLECTIONS_DELAY = 0.3f; + float AL_REVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f; + float AL_REVERB_MIN_LATE_REVERB_GAIN = 0.0f; + float AL_REVERB_MAX_LATE_REVERB_GAIN = 10.0f; + float AL_REVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f; + float AL_REVERB_MIN_LATE_REVERB_DELAY = 0.0f; + float AL_REVERB_MAX_LATE_REVERB_DELAY = 0.1f; + float AL_REVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f; + float AL_REVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f; + float AL_REVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f; + float AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f; + float AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f; + float AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f; + float AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + int AL_REVERB_MIN_DECAY_HFLIMIT = AL10.AL_FALSE; + int AL_REVERB_MAX_DECAY_HFLIMIT = AL10.AL_TRUE; + int AL_REVERB_DEFAULT_DECAY_HFLIMIT = AL10.AL_TRUE; + // EAX reverb + float AL_EAXREVERB_MIN_DENSITY = 0.0f; + float AL_EAXREVERB_MAX_DENSITY = 1.0f; + float AL_EAXREVERB_DEFAULT_DENSITY = 1.0f; + float AL_EAXREVERB_MIN_DIFFUSION = 0.0f; + float AL_EAXREVERB_MAX_DIFFUSION = 1.0f; + float AL_EAXREVERB_DEFAULT_DIFFUSION = 1.0f; + float AL_EAXREVERB_MIN_GAIN = 0.0f; + float AL_EAXREVERB_MAX_GAIN = 1.0f; + float AL_EAXREVERB_DEFAULT_GAIN = 0.32f; + float AL_EAXREVERB_MIN_GAINHF = 0.0f; + float AL_EAXREVERB_MAX_GAINHF = 1.0f; + float AL_EAXREVERB_DEFAULT_GAINHF = 0.89f; + float AL_EAXREVERB_MIN_GAINLF = 0.0f; + float AL_EAXREVERB_MAX_GAINLF = 1.0f; + float AL_EAXREVERB_DEFAULT_GAINLF = 1.0f; + float AL_EAXREVERB_MIN_DECAY_TIME = 0.1f; + float AL_EAXREVERB_MAX_DECAY_TIME = 20.0f; + float AL_EAXREVERB_DEFAULT_DECAY_TIME = 1.49f; + float AL_EAXREVERB_MIN_DECAY_HFRATIO = 0.1f; + float AL_EAXREVERB_MAX_DECAY_HFRATIO = 2.0f; + float AL_EAXREVERB_DEFAULT_DECAY_HFRATIO = 0.83f; + float AL_EAXREVERB_MIN_DECAY_LFRATIO = 0.1f; + float AL_EAXREVERB_MAX_DECAY_LFRATIO = 2.0f; + float AL_EAXREVERB_DEFAULT_DECAY_LFRATIO = 1.0f; + float AL_EAXREVERB_MIN_REFLECTIONS_GAIN = 0.0f; + float AL_EAXREVERB_MAX_REFLECTIONS_GAIN = 3.16f; + float AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN = 0.05f; + float AL_EAXREVERB_MIN_REFLECTIONS_DELAY = 0.0f; + float AL_EAXREVERB_MAX_REFLECTIONS_DELAY = 0.3f; + float AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY = 0.007f; + float AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ = 0.0f; + float AL_EAXREVERB_MIN_LATE_REVERB_GAIN = 0.0f; + float AL_EAXREVERB_MAX_LATE_REVERB_GAIN = 10.0f; + float AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN = 1.26f; + float AL_EAXREVERB_MIN_LATE_REVERB_DELAY = 0.0f; + float AL_EAXREVERB_MAX_LATE_REVERB_DELAY = 0.1f; + float AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY = 0.011f; + float AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ = 0.0f; + float AL_EAXREVERB_MIN_ECHO_TIME = 0.075f; + float AL_EAXREVERB_MAX_ECHO_TIME = 0.25f; + float AL_EAXREVERB_DEFAULT_ECHO_TIME = 0.25f; + float AL_EAXREVERB_MIN_ECHO_DEPTH = 0.0f; + float AL_EAXREVERB_MAX_ECHO_DEPTH = 1.0f; + float AL_EAXREVERB_DEFAULT_ECHO_DEPTH = 0.0f; + float AL_EAXREVERB_MIN_MODULATION_TIME = 0.04f; + float AL_EAXREVERB_MAX_MODULATION_TIME = 4.0f; + float AL_EAXREVERB_DEFAULT_MODULATION_TIME = 0.25f; + float AL_EAXREVERB_MIN_MODULATION_DEPTH = 0.0f; + float AL_EAXREVERB_MAX_MODULATION_DEPTH = 1.0f; + float AL_EAXREVERB_DEFAULT_MODULATION_DEPTH = 0.0f; + float AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF = 0.892f; + float AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF = 1.0f; + float AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF = 0.994f; + float AL_EAXREVERB_MIN_HFREFERENCE = 1000.0f; + float AL_EAXREVERB_MAX_HFREFERENCE = 20000.0f; + float AL_EAXREVERB_DEFAULT_HFREFERENCE = 5000.0f; + float AL_EAXREVERB_MIN_LFREFERENCE = 20.0f; + float AL_EAXREVERB_MAX_LFREFERENCE = 1000.0f; + float AL_EAXREVERB_DEFAULT_LFREFERENCE = 250.0f; + float AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR = 0.0f; + float AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR = 10.0f; + float AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR = 0.0f; + int AL_EAXREVERB_MIN_DECAY_HFLIMIT = AL10.AL_FALSE; + int AL_EAXREVERB_MAX_DECAY_HFLIMIT = AL10.AL_TRUE; + int AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT = AL10.AL_TRUE; + // Chorus + int AL_CHORUS_WAVEFORM_SINUSOID = 0; + int AL_CHORUS_WAVEFORM_TRIANGLE = 1; + int AL_CHORUS_MIN_WAVEFORM = 0; + int AL_CHORUS_MAX_WAVEFORM = 1; + int AL_CHORUS_DEFAULT_WAVEFORM = 1; + int AL_CHORUS_MIN_PHASE = -180; + int AL_CHORUS_MAX_PHASE = 180; + int AL_CHORUS_DEFAULT_PHASE = 90; + float AL_CHORUS_MIN_RATE = 0.0f; + float AL_CHORUS_MAX_RATE = 10.0f; + float AL_CHORUS_DEFAULT_RATE = 1.1f; + float AL_CHORUS_MIN_DEPTH = 0.0f; + float AL_CHORUS_MAX_DEPTH = 1.0f; + float AL_CHORUS_DEFAULT_DEPTH = 0.1f; + float AL_CHORUS_MIN_FEEDBACK = -1.0f; + float AL_CHORUS_MAX_FEEDBACK = 1.0f; + float AL_CHORUS_DEFAULT_FEEDBACK = 0.25f; + float AL_CHORUS_MIN_DELAY = 0.0f; + float AL_CHORUS_MAX_DELAY = 0.016f; + float AL_CHORUS_DEFAULT_DELAY = 0.016f; + // Distortion + float AL_DISTORTION_MIN_EDGE = 0.0f; + float AL_DISTORTION_MAX_EDGE = 1.0f; + float AL_DISTORTION_DEFAULT_EDGE = 0.2f; + float AL_DISTORTION_MIN_GAIN = 0.01f; + float AL_DISTORTION_MAX_GAIN = 1.0f; + float AL_DISTORTION_DEFAULT_GAIN = 0.05f; + float AL_DISTORTION_MIN_LOWPASS_CUTOFF = 80.0f; + float AL_DISTORTION_MAX_LOWPASS_CUTOFF = 24000.0f; + float AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF = 8000.0f; + float AL_DISTORTION_MIN_EQCENTER = 80.0f; + float AL_DISTORTION_MAX_EQCENTER = 24000.0f; + float AL_DISTORTION_DEFAULT_EQCENTER = 3600.0f; + float AL_DISTORTION_MIN_EQBANDWIDTH = 80.0f; + float AL_DISTORTION_MAX_EQBANDWIDTH = 24000.0f; + float AL_DISTORTION_DEFAULT_EQBANDWIDTH = 3600.0f; + // Echo + float AL_ECHO_MIN_DELAY = 0.0f; + float AL_ECHO_MAX_DELAY = 0.207f; + float AL_ECHO_DEFAULT_DELAY = 0.1f; + float AL_ECHO_MIN_LRDELAY = 0.0f; + float AL_ECHO_MAX_LRDELAY = 0.404f; + float AL_ECHO_DEFAULT_LRDELAY = 0.1f; + float AL_ECHO_MIN_DAMPING = 0.0f; + float AL_ECHO_MAX_DAMPING = 0.99f; + float AL_ECHO_DEFAULT_DAMPING = 0.5f; + float AL_ECHO_MIN_FEEDBACK = 0.0f; + float AL_ECHO_MAX_FEEDBACK = 1.0f; + float AL_ECHO_DEFAULT_FEEDBACK = 0.5f; + float AL_ECHO_MIN_SPREAD = -1.0f; + float AL_ECHO_MAX_SPREAD = 1.0f; + float AL_ECHO_DEFAULT_SPREAD = -1.0f; + // Flanger + int AL_FLANGER_WAVEFORM_SINUSOID = 0; + int AL_FLANGER_WAVEFORM_TRIANGLE = 1; + int AL_FLANGER_MIN_WAVEFORM = 0; + int AL_FLANGER_MAX_WAVEFORM = 1; + int AL_FLANGER_DEFAULT_WAVEFORM = 1; + int AL_FLANGER_MIN_PHASE = -180; + int AL_FLANGER_MAX_PHASE = 180; + int AL_FLANGER_DEFAULT_PHASE = 0; + float AL_FLANGER_MIN_RATE = 0.0f; + float AL_FLANGER_MAX_RATE = 10.0f; + float AL_FLANGER_DEFAULT_RATE = 0.27f; + float AL_FLANGER_MIN_DEPTH = 0.0f; + float AL_FLANGER_MAX_DEPTH = 1.0f; + float AL_FLANGER_DEFAULT_DEPTH = 1.0f; + float AL_FLANGER_MIN_FEEDBACK = -1.0f; + float AL_FLANGER_MAX_FEEDBACK = 1.0f; + float AL_FLANGER_DEFAULT_FEEDBACK = -0.5f; + float AL_FLANGER_MIN_DELAY = 0.0f; + float AL_FLANGER_MAX_DELAY = 0.004f; + float AL_FLANGER_DEFAULT_DELAY = 0.002f; + // Frequency shifter + float AL_FREQUENCY_SHIFTER_MIN_FREQUENCY = 0.0f; + float AL_FREQUENCY_SHIFTER_MAX_FREQUENCY = 24000.0f; + float AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY = 0.0f; + int AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION = 0; + int AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION = 2; + int AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION = 0; + int AL_FREQUENCY_SHIFTER_DIRECTION_DOWN = 0; + int AL_FREQUENCY_SHIFTER_DIRECTION_UP = 1; + int AL_FREQUENCY_SHIFTER_DIRECTION_OFF = 2; + int AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION = 0; + int AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION = 2; + int AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION = 0; + // Vocal morpher + int AL_VOCAL_MORPHER_MIN_PHONEMEA = 0; + int AL_VOCAL_MORPHER_MAX_PHONEMEA = 29; + int AL_VOCAL_MORPHER_DEFAULT_PHONEMEA = 0; + int AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING = -24; + int AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING = 24; + int AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING = 0; + int AL_VOCAL_MORPHER_MIN_PHONEMEB = 0; + int AL_VOCAL_MORPHER_MAX_PHONEMEB = 29; + int AL_VOCAL_MORPHER_DEFAULT_PHONEMEB = 10; + int AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING = -24; + int AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING = 24; + int AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING = 0; + int AL_VOCAL_MORPHER_PHONEME_A = 0; + int AL_VOCAL_MORPHER_PHONEME_E = 1; + int AL_VOCAL_MORPHER_PHONEME_I = 2; + int AL_VOCAL_MORPHER_PHONEME_O = 3; + int AL_VOCAL_MORPHER_PHONEME_U = 4; + int AL_VOCAL_MORPHER_PHONEME_AA = 5; + int AL_VOCAL_MORPHER_PHONEME_AE = 6; + int AL_VOCAL_MORPHER_PHONEME_AH = 7; + int AL_VOCAL_MORPHER_PHONEME_AO = 8; + int AL_VOCAL_MORPHER_PHONEME_EH = 9; + int AL_VOCAL_MORPHER_PHONEME_ER = 10; + int AL_VOCAL_MORPHER_PHONEME_IH = 11; + int AL_VOCAL_MORPHER_PHONEME_IY = 12; + int AL_VOCAL_MORPHER_PHONEME_UH = 13; + int AL_VOCAL_MORPHER_PHONEME_UW = 14; + int AL_VOCAL_MORPHER_PHONEME_B = 15; + int AL_VOCAL_MORPHER_PHONEME_D = 16; + int AL_VOCAL_MORPHER_PHONEME_F = 17; + int AL_VOCAL_MORPHER_PHONEME_G = 18; + int AL_VOCAL_MORPHER_PHONEME_J = 19; + int AL_VOCAL_MORPHER_PHONEME_K = 20; + int AL_VOCAL_MORPHER_PHONEME_L = 21; + int AL_VOCAL_MORPHER_PHONEME_M = 22; + int AL_VOCAL_MORPHER_PHONEME_N = 23; + int AL_VOCAL_MORPHER_PHONEME_P = 24; + int AL_VOCAL_MORPHER_PHONEME_R = 25; + int AL_VOCAL_MORPHER_PHONEME_S = 26; + int AL_VOCAL_MORPHER_PHONEME_T = 27; + int AL_VOCAL_MORPHER_PHONEME_V = 28; + int AL_VOCAL_MORPHER_PHONEME_Z = 29; + int AL_VOCAL_MORPHER_WAVEFORM_SINUSOID = 0; + int AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE = 1; + int AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH = 2; + int AL_VOCAL_MORPHER_MIN_WAVEFORM = 0; + int AL_VOCAL_MORPHER_MAX_WAVEFORM = 2; + int AL_VOCAL_MORPHER_DEFAULT_WAVEFORM = 0; + float AL_VOCAL_MORPHER_MIN_RATE = 0.0f; + float AL_VOCAL_MORPHER_MAX_RATE = 10.0f; + float AL_VOCAL_MORPHER_DEFAULT_RATE = 1.41f; + // Pitch shifter + int AL_PITCH_SHIFTER_MIN_COARSE_TUNE = -12; + int AL_PITCH_SHIFTER_MAX_COARSE_TUNE = 12; + int AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE = 12; + int AL_PITCH_SHIFTER_MIN_FINE_TUNE = -50; + int AL_PITCH_SHIFTER_MAX_FINE_TUNE = 50; + int AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE = 0; + // Ring modulator + float AL_RING_MODULATOR_MIN_FREQUENCY = 0.0f; + float AL_RING_MODULATOR_MAX_FREQUENCY = 8000.0f; + float AL_RING_MODULATOR_DEFAULT_FREQUENCY = 440.0f; + float AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF = 0.0f; + float AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF = 24000.0f; + float AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF = 800.0f; + int AL_RING_MODULATOR_SINUSOID = 0; + int AL_RING_MODULATOR_SAWTOOTH = 1; + int AL_RING_MODULATOR_SQUARE = 2; + int AL_RING_MODULATOR_MIN_WAVEFORM = 0; + int AL_RING_MODULATOR_MAX_WAVEFORM = 2; + int AL_RING_MODULATOR_DEFAULT_WAVEFORM = 0; + // Autowah + float AL_AUTOWAH_MIN_ATTACK_TIME = 0.0001f; + float AL_AUTOWAH_MAX_ATTACK_TIME = 1.0f; + float AL_AUTOWAH_DEFAULT_ATTACK_TIME = 0.06f; + float AL_AUTOWAH_MIN_RELEASE_TIME = 0.0001f; + float AL_AUTOWAH_MAX_RELEASE_TIME = 1.0f; + float AL_AUTOWAH_DEFAULT_RELEASE_TIME = 0.06f; + float AL_AUTOWAH_MIN_RESONANCE = 2.0f; + float AL_AUTOWAH_MAX_RESONANCE = 1000.0f; + float AL_AUTOWAH_DEFAULT_RESONANCE = 1000.0f; + float AL_AUTOWAH_MIN_PEAK_GAIN = 0.00003f; + float AL_AUTOWAH_MAX_PEAK_GAIN = 31621.0f; + float AL_AUTOWAH_DEFAULT_PEAK_GAIN = 11.22f; + // Compressor + int AL_COMPRESSOR_MIN_ONOFF = 0; + int AL_COMPRESSOR_MAX_ONOFF = 1; + int AL_COMPRESSOR_DEFAULT_ONOFF = 1; + // Equalizer + float AL_EQUALIZER_MIN_LOW_GAIN = 0.126f; + float AL_EQUALIZER_MAX_LOW_GAIN = 7.943f; + float AL_EQUALIZER_DEFAULT_LOW_GAIN = 1.0f; + float AL_EQUALIZER_MIN_LOW_CUTOFF = 50.0f; + float AL_EQUALIZER_MAX_LOW_CUTOFF = 800.0f; + float AL_EQUALIZER_DEFAULT_LOW_CUTOFF = 200.0f; + float AL_EQUALIZER_MIN_MID1_GAIN = 0.126f; + float AL_EQUALIZER_MAX_MID1_GAIN = 7.943f; + float AL_EQUALIZER_DEFAULT_MID1_GAIN = 1.0f; + float AL_EQUALIZER_MIN_MID1_CENTER = 200.0f; + float AL_EQUALIZER_MAX_MID1_CENTER = 3000.0f; + float AL_EQUALIZER_DEFAULT_MID1_CENTER = 500.0f; + float AL_EQUALIZER_MIN_MID1_WIDTH = 0.01f; + float AL_EQUALIZER_MAX_MID1_WIDTH = 1.0f; + float AL_EQUALIZER_DEFAULT_MID1_WIDTH = 1.0f; + float AL_EQUALIZER_MIN_MID2_GAIN = 0.126f; + float AL_EQUALIZER_MAX_MID2_GAIN = 7.943f; + float AL_EQUALIZER_DEFAULT_MID2_GAIN = 1.0f; + float AL_EQUALIZER_MIN_MID2_CENTER = 1000.0f; + float AL_EQUALIZER_MAX_MID2_CENTER = 8000.0f; + float AL_EQUALIZER_DEFAULT_MID2_CENTER = 3000.0f; + float AL_EQUALIZER_MIN_MID2_WIDTH = 0.01f; + float AL_EQUALIZER_MAX_MID2_WIDTH = 1.0f; + float AL_EQUALIZER_DEFAULT_MID2_WIDTH = 1.0f; + float AL_EQUALIZER_MIN_HIGH_GAIN = 0.126f; + float AL_EQUALIZER_MAX_HIGH_GAIN = 7.943f; + float AL_EQUALIZER_DEFAULT_HIGH_GAIN = 1.0f; + float AL_EQUALIZER_MIN_HIGH_CUTOFF = 4000.0f; + float AL_EQUALIZER_MAX_HIGH_CUTOFF = 16000.0f; + float AL_EQUALIZER_DEFAULT_HIGH_CUTOFF = 6000.0f; + + // Filter parameter ranges and defaults + // Lowpass + float LOWPASS_MIN_GAIN = 0.0f; + float LOWPASS_MAX_GAIN = 1.0f; + float LOWPASS_DEFAULT_GAIN = 1.0f; + float LOWPASS_MIN_GAINHF = 0.0f; + float LOWPASS_MAX_GAINHF = 1.0f; + float LOWPASS_DEFAULT_GAINHF = 1.0f; + // Highpass + float HIGHPASS_MIN_GAIN = 0.0f; + float HIGHPASS_MAX_GAIN = 1.0f; + float HIGHPASS_DEFAULT_GAIN = 1.0f; + float HIGHPASS_MIN_GAINLF = 0.0f; + float HIGHPASS_MAX_GAINLF = 1.0f; + float HIGHPASS_DEFAULT_GAINLF = 1.0f; + // Bandpass + float BANDPASS_MIN_GAIN = 0.0f; + float BANDPASS_MAX_GAIN = 1.0f; + float BANDPASS_DEFAULT_GAIN = 1.0f; + float BANDPASS_MIN_GAINHF = 0.0f; + float BANDPASS_MAX_GAINHF = 1.0f; + float BANDPASS_DEFAULT_GAINHF = 1.0f; + float BANDPASS_MIN_GAINLF = 0.0f; + float BANDPASS_MAX_GAINLF = 1.0f; + float BANDPASS_DEFAULT_GAINLF = 1.0f; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_attribute_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_attribute_query.java new file mode 100644 index 0000000..78bd3a8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_attribute_query.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_device_attribute_query { + + /** + * Accepted as the &lt;param_name&gt; parameter of clGetDeviceInfo. Return the + * offset in nano-seconds between an event timestamp and Epoch. + */ + int CL_DEVICE_PROFILING_TIMER_OFFSET_AMD = 0x4036; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_memory_flags.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_memory_flags.java new file mode 100644 index 0000000..91a7d5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_device_memory_flags.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_device_memory_flags { + + /** Alloc from GPU's CPU visible heap. */ + int CL_MEM_USE_PERSISTENT_MEM_AMD = (1 << 6); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_fp64.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_fp64.java new file mode 100644 index 0000000..cc0c287 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_fp64.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_fp64 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops.java new file mode 100644 index 0000000..1efa22e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_media_ops { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops2.java new file mode 100644 index 0000000..a2fbd0a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_media_ops2.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_media_ops2 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_offline_devices.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_offline_devices.java new file mode 100644 index 0000000..41db2a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_offline_devices.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_offline_devices { + + int CL_CONTEXT_OFFLINE_DEVICES_AMD = 0x403F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_popcnt.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_popcnt.java new file mode 100644 index 0000000..4fd0696 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_popcnt.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_popcnt { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_printf.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_printf.java new file mode 100644 index 0000000..a992531 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_printf.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_printf { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_vec3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_vec3.java new file mode 100644 index 0000000..eac6417 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/AMD_vec3.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface AMD_vec3 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_ContextLoggingFunctions.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_ContextLoggingFunctions.java new file mode 100644 index 0000000..150d9e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_ContextLoggingFunctions.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.ByteBuffer; + +@Private +@CLPlatformExtension +@CLDeviceExtension +public interface APPLE_ContextLoggingFunctions { + + @Extern + void clLogMessagesToSystemLogAPPLE(@Check @Const @cl_char ByteBuffer errstr, + @Const @cl_void ByteBuffer private_info, + @AutoSize("private_info") @size_t long cb, + @Check @cl_void ByteBuffer user_data); + + @Extern + void clLogMessagesToStdoutAPPLE(@Check @Const @cl_char ByteBuffer errstr, + @Const @cl_void ByteBuffer private_info, + @AutoSize("private_info") @size_t long cb, + @Check @cl_void ByteBuffer user_data); + + @Extern + void clLogMessagesToStderrAPPLE(@Check @Const @cl_char ByteBuffer errstr, + @Const @cl_void ByteBuffer private_info, + @AutoSize("private_info") @size_t long cb, + @Check @cl_void ByteBuffer user_data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_SetMemObjectDestructor.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_SetMemObjectDestructor.java new file mode 100644 index 0000000..7004569 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_SetMemObjectDestructor.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Code; +import org.lwjgl.util.generator.Constant; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.CLPlatformExtension; +import org.lwjgl.util.generator.opencl.cl_int; + +@CLPlatformExtension +@CLDeviceExtension +public interface APPLE_SetMemObjectDestructor { + + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clSetMemObjectDestructorAPPLE(@PointerWrapper("cl_mem") CLMem memobj, + @PointerWrapper("cl_mem_object_destructor_callback") CLMemObjectDestructorCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java new file mode 100644 index 0000000..c964e68 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/APPLE_gl_sharing.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.ByteBuffer; + +@CLPlatformExtension +@CLDeviceExtension +@Extension(postfix = "APPLE", className = "APPLEGLSharing") +public interface APPLE_gl_sharing { + + /** + * This enumerated value can be specified as part of the &lt;properties&gt; argument passed to clCreateContext + * to allow OpenCL compliant devices in an existing CGL share group to be used as the devices in + * the newly created CL context. GL objects that were allocated in the given CGL share group can + * now be shared between CL and GL. + */ + int CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE = 0x10000000; + + /** + * Returns a cl_device_id for the CL device associated with the virtual screen for + * the given CGL context. Return type: cl_device_id + */ + int CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE = 0x10000002; + + /** + * Returns an array of cl_device_ids for the CL device(s) corresponding to + * the virtual screen(s) for the given CGL context. Return type: cl_device_id[] + */ + int CL_CGL_DEVICES_FOR_SUPPORTED_VIRTUAL_SCREENS_APPLE = 0x10000003; + + /** Error code returned by clGetGLContextInfoAPPLE if an invalid platform_gl_ctx is provided */ + int CL_INVALID_GL_CONTEXT_APPLE = -1000; + + @Code( + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret);" + ) + @cl_int + int clGetGLContextInfoAPPLE(@PointerWrapper("cl_context") CLContext context, + @Check("1") @NativeType("cl_void") PointerBuffer platform_gl_ctx, + @NativeType("cl_gl_platform_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10.java new file mode 100644 index 0000000..b2395b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10.java @@ -0,0 +1,1161 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** The core OpenCL 1.0 API */ +public interface CL10 { + + /** Error Codes */ + int CL_SUCCESS = 0, + CL_DEVICE_NOT_FOUND = -1, + CL_DEVICE_NOT_AVAILABLE = -2, + CL_COMPILER_NOT_AVAILABLE = -3, + CL_MEM_OBJECT_ALLOCATION_FAILURE = -4, + CL_OUT_OF_RESOURCES = -5, + CL_OUT_OF_HOST_MEMORY = -6, + CL_PROFILING_INFO_NOT_AVAILABLE = -7, + CL_MEM_COPY_OVERLAP = -8, + CL_IMAGE_FORMAT_MISMATCH = -9, + CL_IMAGE_FORMAT_NOT_SUPPORTED = -10, + CL_BUILD_PROGRAM_FAILURE = -11, + CL_MAP_FAILURE = -12, + + CL_INVALID_VALUE = -30, + CL_INVALID_DEVICE_TYPE = -31, + CL_INVALID_PLATFORM = -32, + CL_INVALID_DEVICE = -33, + CL_INVALID_CONTEXT = -34, + CL_INVALID_QUEUE_PROPERTIES = -35, + CL_INVALID_COMMAND_QUEUE = -36, + CL_INVALID_HOST_PTR = -37, + CL_INVALID_MEM_OBJECT = -38, + CL_INVALID_IMAGE_FORMAT_DESCRIPTOR = -39, + CL_INVALID_IMAGE_SIZE = -40, + CL_INVALID_SAMPLER = -41, + CL_INVALID_BINARY = -42, + CL_INVALID_BUILD_OPTIONS = -43, + CL_INVALID_PROGRAM = -44, + CL_INVALID_PROGRAM_EXECUTABLE = -45, + CL_INVALID_KERNEL_NAME = -46, + CL_INVALID_KERNEL_DEFINITION = -47, + CL_INVALID_KERNEL = -48, + CL_INVALID_ARG_INDEX = -49, + CL_INVALID_ARG_VALUE = -50, + CL_INVALID_ARG_SIZE = -51, + CL_INVALID_KERNEL_ARGS = -52, + CL_INVALID_WORK_DIMENSION = -53, + CL_INVALID_WORK_GROUP_SIZE = -54, + CL_INVALID_WORK_ITEM_SIZE = -55, + CL_INVALID_GLOBAL_OFFSET = -56, + CL_INVALID_EVENT_WAIT_LIST = -57, + CL_INVALID_EVENT = -58, + CL_INVALID_OPERATION = -59, + CL_INVALID_GL_OBJECT = -60, + CL_INVALID_BUFFER_SIZE = -61, + CL_INVALID_MIP_LEVEL = -62, + CL_INVALID_GLOBAL_WORK_SIZE = -63; + + /** OpenCL Version */ + int CL_VERSION_1_0 = 1; + + /** cl_bool */ + int CL_FALSE = 0, + CL_TRUE = 1; + + /** cl_platform_info */ + int CL_PLATFORM_PROFILE = 0x0900, + CL_PLATFORM_VERSION = 0x0901, + CL_PLATFORM_NAME = 0x0902, + CL_PLATFORM_VENDOR = 0x0903, + CL_PLATFORM_EXTENSIONS = 0x0904; + + /** cl_device_type - bitfield */ + int CL_DEVICE_TYPE_DEFAULT = (1 << 0), + CL_DEVICE_TYPE_CPU = (1 << 1), + CL_DEVICE_TYPE_GPU = (1 << 2), + CL_DEVICE_TYPE_ACCELERATOR = (1 << 3), + CL_DEVICE_TYPE_ALL = 0xFFFFFFFF; + + /** cl_device_info */ + int CL_DEVICE_TYPE = 0x1000, + CL_DEVICE_VENDOR_ID = 0x1001, + CL_DEVICE_MAX_COMPUTE_UNITS = 0x1002, + CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = 0x1003, + CL_DEVICE_MAX_WORK_GROUP_SIZE = 0x1004, + CL_DEVICE_MAX_WORK_ITEM_SIZES = 0x1005, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR = 0x1006, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT = 0x1007, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_ = 0x1008, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG = 0x1009, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT = 0x100A, + CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE = 0x100B, + CL_DEVICE_MAX_CLOCK_FREQUENCY = 0x100C, + CL_DEVICE_ADDRESS_BITS = 0x100D, + CL_DEVICE_MAX_READ_IMAGE_ARGS = 0x100E, + CL_DEVICE_MAX_WRITE_IMAGE_ARGS = 0x100F, + CL_DEVICE_MAX_MEM_ALLOC_SIZE = 0x1010, + CL_DEVICE_IMAGE2D_MAX_WIDTH = 0x1011, + CL_DEVICE_IMAGE2D_MAX_HEIGHT = 0x1012, + CL_DEVICE_IMAGE3D_MAX_WIDTH = 0x1013, + CL_DEVICE_IMAGE3D_MAX_HEIGHT = 0x1014, + CL_DEVICE_IMAGE3D_MAX_DEPTH = 0x1015, + CL_DEVICE_IMAGE_SUPPORT = 0x1016, + CL_DEVICE_MAX_PARAMETER_SIZE = 0x1017, + CL_DEVICE_MAX_SAMPLERS = 0x1018, + CL_DEVICE_MEM_BASE_ADDR_ALIGN = 0x1019, + CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE = 0x101A, + CL_DEVICE_SINGLE_FP_CONFIG = 0x101B, + CL_DEVICE_GLOBAL_MEM_CACHE_TYPE = 0x101C, + CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = 0x101D, + CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = 0x101E, + CL_DEVICE_GLOBAL_MEM_SIZE = 0x101F, + CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE = 0x1020, + CL_DEVICE_MAX_CONSTANT_ARGS = 0x1021, + CL_DEVICE_LOCAL_MEM_TYPE = 0x1022, + CL_DEVICE_LOCAL_MEM_SIZE = 0x1023, + CL_DEVICE_ERROR_CORRECTION_SUPPORT = 0x1024, + CL_DEVICE_PROFILING_TIMER_RESOLUTION = 0x1025, + CL_DEVICE_ENDIAN_LITTLE = 0x1026, + CL_DEVICE_AVAILABLE = 0x1027, + CL_DEVICE_COMPILER_AVAILABLE = 0x1028, + CL_DEVICE_EXECUTION_CAPABILITIES = 0x1029, + CL_DEVICE_QUEUE_PROPERTIES = 0x102A, + CL_DEVICE_NAME = 0x102B, + CL_DEVICE_VENDOR = 0x102C, + CL_DRIVER_VERSION = 0x102D, + CL_DEVICE_PROFILE = 0x102E, + CL_DEVICE_VERSION = 0x102F, + CL_DEVICE_EXTENSIONS = 0x1030, + CL_DEVICE_PLATFORM = 0x1031; + /* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */ + /* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */ + + /** cl_device_fp_config - bitfield */ + int CL_FP_DENORM = (1 << 0), + CL_FP_INF_NAN = (1 << 1), + CL_FP_ROUND_TO_NEAREST = (1 << 2), + CL_FP_ROUND_TO_ZERO = (1 << 3), + CL_FP_ROUND_TO_INF = (1 << 4), + CL_FP_FMA = (1 << 5); + + /** cl_device_mem_cache_type */ + int CL_NONE = 0x0, + CL_READ_ONLY_CACHE = 0x1, + CL_READ_WRITE_CACHE = 0x2; + + /** cl_device_local_mem_type */ + int CL_LOCAL = 0x1, + CL_GLOBAL = 0x2; + + /** cl_device_exec_capabilities - bitfield */ + int CL_EXEC_KERNEL = (1 << 0), + CL_EXEC_NATIVE_KERNEL = (1 << 1); + + /** cl_command_queue_properties - bitfield */ + int CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE = (1 << 0), + CL_QUEUE_PROFILING_ENABLE = (1 << 1); + + /** cl_context_info */ + int CL_CONTEXT_REFERENCE_COUNT = 0x1080, + CL_CONTEXT_DEVICES = 0x1081, + CL_CONTEXT_PROPERTIES = 0x1082; + + /** cl_context_info + cl_context_properties */ + int CL_CONTEXT_PLATFORM = 0x1084; + + /** cl_command_queue_info */ + int CL_QUEUE_CONTEXT = 0x1090, + CL_QUEUE_DEVICE = 0x1091, + CL_QUEUE_REFERENCE_COUNT = 0x1092, + CL_QUEUE_PROPERTIES = 0x1093; + + /** cl_mem_flags - bitfield */ + int CL_MEM_READ_WRITE = (1 << 0), + CL_MEM_WRITE_ONLY = (1 << 1), + CL_MEM_READ_ONLY = (1 << 2), + CL_MEM_USE_HOST_PTR = (1 << 3), + CL_MEM_ALLOC_HOST_PTR = (1 << 4), + CL_MEM_COPY_HOST_PTR = (1 << 5); + + /** cl_channel_order */ + int CL_R = 0x10B0, + CL_A = 0x10B1, + CL_RG = 0x10B2, + CL_RA = 0x10B3, + CL_RGB = 0x10B4, + CL_RGBA = 0x10B5, + CL_BGRA = 0x10B6, + CL_ARGB = 0x10B7, + CL_INTENSITY = 0x10B8, + CL_LUMINANCE = 0x10B9; + + /** cl_channel_type */ + int CL_SNORM_INT8 = 0x10D0, + CL_SNORM_INT16 = 0x10D1, + CL_UNORM_INT8 = 0x10D2, + CL_UNORM_INT16 = 0x10D3, + CL_UNORM_SHORT_565 = 0x10D4, + CL_UNORM_SHORT_555 = 0x10D5, + CL_UNORM_INT_101010 = 0x10D6, + CL_SIGNED_INT8 = 0x10D7, + CL_SIGNED_INT16 = 0x10D8, + CL_SIGNED_INT32 = 0x10D9, + CL_UNSIGNED_INT8 = 0x10DA, + CL_UNSIGNED_INT16 = 0x10DB, + CL_UNSIGNED_INT32 = 0x10DC, + CL_HALF_FLOAT = 0x10DD, + CL_FLOAT = 0x10DE; + + /** cl_mem_object_type */ + int CL_MEM_OBJECT_BUFFER = 0x10F0, + CL_MEM_OBJECT_IMAGE2D = 0x10F1, + CL_MEM_OBJECT_IMAGE3D = 0x10F2; + + /** cl_mem_info */ + int CL_MEM_TYPE = 0x1100, + CL_MEM_FLAGS = 0x1101, + CL_MEM_SIZE = 0x1102, + CL_MEM_HOST_PTR = 0x1103, + CL_MEM_MAP_COUNT = 0x1104, + CL_MEM_REFERENCE_COUNT = 0x1105, + CL_MEM_CONTEXT = 0x1106; + + /** cl_image_info */ + int CL_IMAGE_FORMAT = 0x1110, + CL_IMAGE_ELEMENT_SIZE = 0x1111, + CL_IMAGE_ROW_PITCH = 0x1112, + CL_IMAGE_SLICE_PITCH = 0x1113, + CL_IMAGE_WIDTH = 0x1114, + CL_IMAGE_HEIGHT = 0x1115, + CL_IMAGE_DEPTH = 0x1116; + + /** cl_addressing_mode */ + int CL_ADDRESS_NONE = 0x1130, + CL_ADDRESS_CLAMP_TO_EDGE = 0x1131, + CL_ADDRESS_CLAMP = 0x1132, + CL_ADDRESS_REPEAT = 0x1133; + + /** cl_filter_mode */ + int CL_FILTER_NEAREST = 0x1140, + CL_FILTER_LINEAR = 0x1141; + + /** cl_sampler_info */ + int CL_SAMPLER_REFERENCE_COUNT = 0x1150, + CL_SAMPLER_CONTEXT = 0x1151, + CL_SAMPLER_NORMALIZED_COORDS = 0x1152, + CL_SAMPLER_ADDRESSING_MODE = 0x1153, + CL_SAMPLER_FILTER_MODE = 0x1154; + + /** cl_map_flags - bitfield */ + int CL_MAP_READ = (1 << 0), + CL_MAP_WRITE = (1 << 1); + + /** cl_program_info */ + int CL_PROGRAM_REFERENCE_COUNT = 0x1160, + CL_PROGRAM_CONTEXT = 0x1161, + CL_PROGRAM_NUM_DEVICES = 0x1162, + CL_PROGRAM_DEVICES = 0x1163, + CL_PROGRAM_SOURCE = 0x1164, + CL_PROGRAM_BINARY_SIZES = 0x1165, + CL_PROGRAM_BINARIES = 0x1166; + + /** cl_program_build_info */ + int CL_PROGRAM_BUILD_STATUS = 0x1181, + CL_PROGRAM_BUILD_OPTIONS = 0x1182, + CL_PROGRAM_BUILD_LOG = 0x1183; + + /** cl_build_status */ + int CL_BUILD_SUCCESS = 0, + CL_BUILD_NONE = -1, + CL_BUILD_ERROR = -2, + CL_BUILD_IN_PROGRESS = -3; + + /** cl_kernel_info */ + int CL_KERNEL_FUNCTION_NAME = 0x1190, + CL_KERNEL_NUM_ARGS = 0x1191, + CL_KERNEL_REFERENCE_COUNT = 0x1192, + CL_KERNEL_CONTEXT = 0x1193, + CL_KERNEL_PROGRAM = 0x1194; + + /** cl_kernel_work_group_info */ + int CL_KERNEL_WORK_GROUP_SIZE = 0x11B0, + CL_KERNEL_COMPILE_WORK_GROUP_SIZE = 0x11B1, + CL_KERNEL_LOCAL_MEM_SIZE = 0x11B2; + + /** cl_event_info */ + int CL_EVENT_COMMAND_QUEUE = 0x11D0, + CL_EVENT_COMMAND_TYPE = 0x11D1, + CL_EVENT_REFERENCE_COUNT = 0x11D2, + CL_EVENT_COMMAND_EXECUTION_STATUS = 0x11D3; + + /** cl_command_type */ + int CL_COMMAND_NDRANGE_KERNEL = 0x11F0, + CL_COMMAND_TASK = 0x11F1, + CL_COMMAND_NATIVE_KERNEL = 0x11F2, + CL_COMMAND_READ_BUFFER = 0x11F3, + CL_COMMAND_WRITE_BUFFER = 0x11F4, + CL_COMMAND_COPY_BUFFER = 0x11F5, + CL_COMMAND_READ_IMAGE = 0x11F6, + CL_COMMAND_WRITE_IMAGE = 0x11F7, + CL_COMMAND_COPY_IMAGE = 0x11F8, + CL_COMMAND_COPY_IMAGE_TO_BUFFER = 0x11F9, + CL_COMMAND_COPY_BUFFER_TO_IMAGE = 0x11FA, + CL_COMMAND_MAP_BUFFER = 0x11FB, + CL_COMMAND_MAP_IMAGE = 0x11FC, + CL_COMMAND_UNMAP_MEM_OBJECT = 0x11FD, + CL_COMMAND_MARKER = 0x11FE, + CL_COMMAND_ACQUIRE_GL_OBJECTS = 0x11FF, + CL_COMMAND_RELEASE_GL_OBJECTS = 0x1200; + + /** command execution status */ + int CL_COMPLETE = 0x0, + CL_RUNNING = 0x1, + CL_SUBMITTED = 0x2, + CL_QUEUED = 0x3; + + /** cl_profiling_info */ + int CL_PROFILING_COMMAND_QUEUED = 0x1280, + CL_PROFILING_COMMAND_SUBMIT = 0x1281, + CL_PROFILING_COMMAND_START = 0x1282, + CL_PROFILING_COMMAND_END = 0x1283; + + /* Platform API */ + + @Code( + javaBeforeNative = "\t\tif ( num_platforms == null ) num_platforms = APIUtil.getBufferInt();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && platforms != null ) CLPlatform.registerCLPlatforms(platforms, num_platforms);" + ) + @cl_int + int clGetPlatformIDs(@AutoSize(value = "platforms", canBeNull = true) @cl_uint int num_entries, + @OutParameter @Check(canBeNull = true) @NativeType("cl_platform_id") PointerBuffer platforms, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_platforms); + + @cl_int + int clGetPlatformInfo(@PointerWrapper(value = "cl_platform_id", canBeNull = true) CLPlatform platform, + @NativeType("cl_platform_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Code( + javaBeforeNative = "\t\telse\n" + + "\t\t\tnum_devices = APIUtil.getBufferInt();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && devices != null ) platform.registerCLDevices(devices, num_devices);" + ) + @cl_int + int clGetDeviceIDs(@PointerWrapper("cl_platform_id") CLPlatform platform, + @NativeType("cl_device_type") long device_type, + @AutoSize(value = "devices", canBeNull = true) @cl_uint int num_entries, + @OutParameter @Check(canBeNull = true) @NativeType("cl_device_id") PointerBuffer devices, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_devices); + + @cl_int + int clGetDeviceInfo(@PointerWrapper("cl_device_id") CLDevice device, + @NativeType("cl_device_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + /** LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. */ + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);", + // Associate context with the GlobalRef, so we can delete it later. + javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);" + ) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)") + CLContext clCreateContext(@NullTerminated @Check("3") @Const @NativeType("cl_context_properties") PointerBuffer properties, + @AutoSize("devices") @cl_uint int num_devices, + @Check("1") @Const @NativeType("cl_device_id") PointerBuffer devices, + @PointerWrapper(value = "cl_create_context_callback", canBeNull = true) CLContextCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + /** LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. */ + @Alternate("clCreateContext") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);", + // Associate context with the GlobalRef, so we can delete it later. + javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);" + ) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)") + CLContext clCreateContext(@NullTerminated @Check("3") @Const @NativeType("cl_context_properties") PointerBuffer properties, + @Constant("1") @cl_uint int num_devices, + @Constant(value = "APIUtil.getPointer(device)", keepParam = true) CLDevice device, + @PointerWrapper(value = "cl_create_context_callback", canBeNull = true) CLContextCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + /** LWJGL requires CL_CONTEXT_PLATFORM to be present in the cl_context_properties buffer. */ + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = pfn_notify == null || pfn_notify.isCustom() ? 0 : CallbackUtil.createGlobalRef(pfn_notify);", + // Associate context with the GlobalRef, so we can delete it later. + javaFinally = "\t\t\tif ( __result != null ) __result.setContextCallback(user_data);" + ) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_context", params = "APIUtil.getCLPlatform(properties)") + CLContext clCreateContextFromType(@NullTerminated @Check("3") @Const @NativeType("cl_context_properties") PointerBuffer properties, + @NativeType("cl_device_type") long device_type, + @PointerWrapper(value = "cl_create_context_callback", canBeNull = true) CLContextCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) context.retain();") + @cl_int + int clRetainContext(@PointerWrapper("cl_context") CLContext context); + + @Code( + javaBeforeNative = "\t\tAPIUtil.releaseObjects(context);", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) context.releaseImpl();" + ) + @cl_int + int clReleaseContext(@PointerWrapper("cl_context") CLContext context); + + @Code( + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) context.getParent().registerCLDevices(param_value, param_value_size_ret);" + ) + @cl_int + int clGetContextInfo(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_context_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_command_queue", params = "context, device") + CLCommandQueue clCreateCommandQueue(@PointerWrapper("cl_context") CLContext context, + @PointerWrapper("cl_device_id") CLDevice device, + @NativeType("cl_command_queue_properties") long properties, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.retain();") + @cl_int + int clRetainCommandQueue(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue); + + @Code( + javaBeforeNative = "\t\tAPIUtil.releaseObjects(command_queue);", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.release();" + ) + @cl_int + int clReleaseCommandQueue(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue); + + @cl_int + int clGetCommandQueueInfo(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @NativeType("cl_command_queue_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @GenerateAutos + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateBuffer(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @AutoSize("host_ptr") @size_t long size, + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer host_ptr, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueReadBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @cl_bool int blocking_read, + @size_t long offset, + @AutoSize("ptr") @size_t long size, + @OutParameter + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueWriteBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @cl_bool int blocking_write, + @size_t long offset, + @AutoSize("ptr") @size_t long size, + @Const + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueCopyBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem src_buffer, + @PointerWrapper("cl_mem") CLMem dst_buffer, + @size_t long src_offset, + @size_t long dst_offset, + @size_t long size, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result != null ) command_queue.registerCLEvent(event);") + @Check(value = "errcode_ret", canBeNull = true) + @cl_void + @AutoSize("size") + ByteBuffer clEnqueueMapBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @cl_bool int blocking_map, + @NativeType("cl_map_flags") long map_flags, + @size_t long offset, + @size_t long size, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateImage2D(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @Check("2 * 4") @Const @NativeType("cl_image_format") ByteBuffer image_format, + @size_t long image_width, + @size_t long image_height, + @size_t long image_row_pitch, + @Check(value = "CLChecks.calculateImage2DSize(image_format, image_width, image_height, image_row_pitch)", canBeNull = true) + @cl_byte + @cl_short + @cl_int + @cl_float Buffer host_ptr, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateImage3D(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @Check("2 * 4") @Const @NativeType("cl_image_format") ByteBuffer image_format, + @size_t long image_width, + @size_t long image_height, + @size_t long image_depth, + @size_t long image_row_pitch, + @size_t long image_slice_pitch, + @Check(value = "CLChecks.calculateImage3DSize(image_format, image_width, image_height, image_height, image_row_pitch, image_slice_pitch)", canBeNull = true) + @cl_byte + @cl_short + @cl_int + @cl_float Buffer host_ptr, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @cl_int + int clGetSupportedImageFormats(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("cl_mem_object_type") int image_type, + @AutoSize(value = "image_formats", expression = " / (2 * 4)", canBeNull = true) @cl_uint int num_entries, + @OutParameter @Check(canBeNull = true) @NativeType("cl_image_format") ByteBuffer image_formats, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_image_formats); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueReadImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem image, + @cl_bool int blocking_read, + @Check("3") @Const @NativeType("size_t") PointerBuffer origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @size_t long row_pitch, + @size_t long slice_pitch, + @OutParameter @Check("CLChecks.calculateImageSize(region, row_pitch, slice_pitch)") + @cl_byte + @cl_short + @cl_int + @cl_float Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueWriteImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem image, + @cl_bool int blocking_write, + @Check("3") @Const @NativeType("size_t") PointerBuffer origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @size_t long input_row_pitch, + @size_t long input_slice_pitch, + @Check("CLChecks.calculateImageSize(region, input_row_pitch, input_slice_pitch)") @Const + @cl_byte + @cl_short + @cl_int + @cl_float Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueCopyImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem src_image, + @PointerWrapper("cl_mem") CLMem dst_image, + @Check("3") @Const @NativeType("size_t") PointerBuffer src_origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer dst_origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueCopyImageToBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem src_image, + @PointerWrapper("cl_mem") CLMem dst_buffer, + @Check("3") @Const @NativeType("size_t") PointerBuffer src_origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @size_t long dst_offset, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueCopyBufferToImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem src_buffer, + @PointerWrapper("cl_mem") CLMem dst_image, + @size_t long src_offset, + @Check("3") @Const @NativeType("size_t") PointerBuffer dst_origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result != null ) command_queue.registerCLEvent(event);") + @Check(value = "errcode_ret", canBeNull = true) + @cl_void + @AutoSize(value = "extcl_CalculateImageSize(region_address, *image_row_pitch_address, image_slice_pitch_address == NULL ? 0 : *image_slice_pitch_address)", isNative = true) + ByteBuffer clEnqueueMapImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem image, + @cl_bool int blocking_map, + @NativeType("cl_map_flags") long map_flags, + @Check("3") @Const @NativeType("size_t") PointerBuffer origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @OutParameter @Check("1") @NativeType("size_t") PointerBuffer image_row_pitch, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer image_slice_pitch, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @cl_int + int clGetImageInfo(@PointerWrapper("cl_mem") CLMem image, + @NativeType("cl_image_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) memobj.retain();") + @cl_int + int clRetainMemObject(@PointerWrapper("cl_mem") CLMem memobj); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) memobj.release();") + @cl_int + int clReleaseMemObject(@PointerWrapper("cl_mem") CLMem memobj); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueUnmapMemObject(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem memobj, + @Check @cl_void ByteBuffer mapped_ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clGetMemObjectInfo(@PointerWrapper("cl_mem") CLMem memobj, + @NativeType("cl_mem_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_sampler", params = "context") + CLSampler clCreateSampler(@PointerWrapper("cl_context") CLContext context, + @cl_bool int normalized_coords, + @NativeType("cl_addressing_mode") int addressing_mode, + @NativeType("cl_filter_mode") int filter_mode, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) sampler.retain();") + @cl_int + int clRetainSampler(@PointerWrapper("cl_sampler") CLSampler sampler); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) sampler.release();") + @cl_int + int clReleaseSampler(@PointerWrapper("cl_sampler") CLSampler sampler); + + @cl_int + int clGetSamplerInfo(@PointerWrapper("cl_sampler") CLSampler sampler, + @NativeType("cl_sampler_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + // ------[ clCreateProgramWithSource ]------ + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithSource(@PointerWrapper("cl_context") CLContext context, + @Constant("1") @cl_uint int count, + @Check @Indirect @Const @cl_char ByteBuffer string, + @AutoSize("string") @Indirect @Const @size_t long lengths, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate(value = "clCreateProgramWithSource", nativeAlt = true) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithSource2(@PointerWrapper("cl_context") CLContext context, + @AutoSize("lengths") @cl_uint int count, + @Check("APIUtil.getSize(lengths)") @PointerArray(value = "count", lengths = "lengths") @Const @NativeType("cl_char") ByteBuffer strings, + @Check("1") @Const @NativeType("size_t") PointerBuffer lengths, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate(value = "clCreateProgramWithSource", nativeAlt = true) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithSource3(@PointerWrapper("cl_context") CLContext context, + @Constant("strings.length") @cl_uint int count, + @Check("1") @PointerArray(value = "count") @Const @NativeType("cl_char") ByteBuffer[] strings, + @Constant("APIUtil.getLengths(strings)") @Const @NativeType("size_t") PointerBuffer lengths, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate("clCreateProgramWithSource") + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithSource(@PointerWrapper("cl_context") CLContext context, + @Constant("1") @cl_uint int count, + CharSequence string, + @Constant("string.length()") @Indirect @Const @size_t long lengths, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate(value = "clCreateProgramWithSource", nativeAlt = true) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithSource4(@PointerWrapper("cl_context") CLContext context, + @Constant("strings.length") @cl_uint int count, + @Const @PointerArray(value = "count", lengths = "lengths") CharSequence[] strings, + @Constant("APIUtil.getLengths(strings)") @Const @NativeType("size_t") PointerBuffer lengths, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + // ------[ clCreateProgramWithBinary ]------ + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithBinary(@PointerWrapper("cl_context") CLContext context, + @Constant("1") @cl_uint int num_devices, + @Const @Indirect @PointerWrapper("cl_device_id") CLDevice device, + @AutoSize("binary") @Const @Indirect @size_t long lengths, + @Const @Indirect @cl_uchar ByteBuffer binary, + @OutParameter @Check("1") @cl_int IntBuffer binary_status, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate(value = "clCreateProgramWithBinary", nativeAlt = true) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithBinary2(@PointerWrapper("cl_context") CLContext context, + @AutoSize("device_list") @cl_uint int num_devices, + @Check("1") @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check("device_list.remaining()") @Const @NativeType("size_t") PointerBuffer lengths, + @Check("APIUtil.getSize(lengths)") @PointerArray(value = "num_devices", lengths = "lengths") @Const @NativeType("cl_uchar") ByteBuffer binaries, + @OutParameter @Check("device_list.remaining()") @cl_int IntBuffer binary_status, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate(value = "clCreateProgramWithBinary", nativeAlt = true) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithBinary3(@PointerWrapper("cl_context") CLContext context, + @Constant("binaries.length") @cl_uint int num_devices, + @Check("binaries.length") @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Constant("APIUtil.getLengths(binaries)") @Const @NativeType("size_t") PointerBuffer lengths, + @Check("1") @PointerArray("num_devices") @Const @NativeType("cl_uchar") ByteBuffer[] binaries, + @OutParameter @Check("binaries.length") @cl_int IntBuffer binary_status, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) program.retain();") + @cl_int + int clRetainProgram(@PointerWrapper("cl_program") CLProgram program); + + @Code( + javaBeforeNative = "\t\tAPIUtil.releaseObjects(program);", + javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) program.release();" + ) + @cl_int + int clReleaseProgram(@PointerWrapper("cl_program") CLProgram program); + + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clBuildProgram(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check @NullTerminated @Const @cl_char ByteBuffer options, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Alternate("clBuildProgram") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clBuildProgram(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @NullTerminated @Const CharSequence options, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Alternate("clBuildProgram") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clBuildProgram(@PointerWrapper("cl_program") CLProgram program, + @Constant("1") @cl_uint int num_devices, + @Constant(value = "APIUtil.getPointer(device)", keepParam = true) CLDevice device, + @NullTerminated @Const CharSequence options, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLBuildProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @cl_int + int clUnloadCompiler(); + + @cl_int + int clGetProgramInfo(@PointerWrapper("cl_program") CLProgram program, + @NativeType("cl_program_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + /** + * This method can be used to get program binaries. The binary for each device (in the + * order returned by <code>CL_PROGRAM_DEVICES</code>) will be written sequentially to + * the <code>param_value</code> buffer. The buffer size must be big enough to hold + * all the binaries, as returned by <code>CL_PROGRAM_BINARY_SIZES</code>. + * + * @param program the program + * @param param_value the buffers where the binaries will be written to. + * @param param_value_size_ret optional size result + * + * @return the error code + */ + @Alternate(value = "clGetProgramInfo", nativeAlt = true) + @cl_int + int clGetProgramInfo2(@PointerWrapper("cl_program") CLProgram program, + @Constant("CL_PROGRAM_BINARIES") @NativeType("cl_program_info") int param_name, + @Constant(value = "sizes_len * sizeof(cl_uchar *)", isNative = true) @size_t long param_value_size, + @Constant("sizes.remaining()") @Helper(passToNative = true) @size_t long sizes_len, + @Helper(passToNative = true) @Check("1") @Const @NativeType("size_t") PointerBuffer sizes, + @OutParameter @Check("APIUtil.getSize(sizes)") @PointerArray(value = "sizes_len", lengths = "sizes") @NativeType("cl_uchar") ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + /** + * This method can be used to get program binaries. The binary for each device (in the + * order returned by <code>CL_PROGRAM_DEVICES</code>) will be written to the corresponding + * slot of the <code>param_value</code> array. The size of each buffer must be big enough to + * hold the corresponding binary, as returned by <code>CL_PROGRAM_BINARY_SIZES</code>. + * + * @param program the program + * @param param_value the buffers where the binaries will be written to. + * @param param_value_size_ret optional size result + * + * @return the error code + */ + @Alternate(value = "clGetProgramInfo", nativeAlt = true) + @cl_int + int clGetProgramInfo3(@PointerWrapper("cl_program") CLProgram program, + @Constant("CL_PROGRAM_BINARIES") @NativeType("cl_program_info") int param_name, + @Constant(value = "param_value_len * sizeof(cl_uchar *)", isNative = true) @size_t long param_value_size, + @Constant("param_value.length") @Helper(passToNative = true) @size_t long param_value_len, + @PointerArray("param_value_len") @NativeType("cl_uchar") ByteBuffer[] param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @cl_int + int clGetProgramBuildInfo(@PointerWrapper("cl_program") CLProgram program, + @PointerWrapper("cl_device_id") CLDevice device, + @NativeType("cl_program_build_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_kernel", params = "program") + CLKernel clCreateKernel(@PointerWrapper("cl_program") CLProgram program, + @NullTerminated @Const @cl_char ByteBuffer kernel_name, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate("clCreateKernel") + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_kernel", params = "program") + CLKernel clCreateKernel(@PointerWrapper("cl_program") CLProgram program, + @NullTerminated @Const CharSequence kernel_name, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS && kernels != null ) program.registerCLKernels(kernels);") + @cl_int + int clCreateKernelsInProgram(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "kernels", canBeNull = true) @cl_uint int num_kernels, + @OutParameter @Check(canBeNull = true) @NativeType("cl_kernel") PointerBuffer kernels, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_kernels_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) kernel.retain();") + @cl_int + int clRetainKernel(@PointerWrapper("cl_kernel") CLKernel kernel); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) kernel.release();") + @cl_int + int clReleaseKernel(@PointerWrapper("cl_kernel") CLKernel kernel); + + @GenerateAutos + @cl_int + int clSetKernelArg(@PointerWrapper("cl_kernel") CLKernel kernel, + @cl_uint int arg_index, + @AutoSize("arg_value") @size_t long arg_size, + @Const + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer arg_value); + + @Alternate("clSetKernelArg") + @cl_int + int clSetKernelArg(@PointerWrapper("cl_kernel") CLKernel kernel, + @cl_uint int arg_index, + @Constant("PointerBuffer.getPointerSize()") @size_t long arg_size, + @Check(canBeNull = true) @Const + @Constant(value = "APIUtil.getPointerSafe(arg_value)", keepParam = true) CLObject arg_value); + + // This is used by CLKernelUtil. Assumes arg_value.position() == 0. + + @Alternate("clSetKernelArg") + @Private + @cl_int + int clSetKernelArg3(@PointerWrapper("cl_kernel") CLKernel kernel, + @cl_uint int arg_index, + @size_t long arg_size, + @Constant(value = "MemoryUtil.getAddress0(arg_value)", keepParam = true) Buffer arg_value); + + @cl_int + int clGetKernelInfo(@PointerWrapper("cl_kernel") CLKernel kernel, + @NativeType("cl_kernel_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @cl_int + int clGetKernelWorkGroupInfo(@PointerWrapper("cl_kernel") CLKernel kernel, + @PointerWrapper(value = "cl_device_id", canBeNull = true) CLDevice device, + @NativeType("cl_kernel_work_group_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueNDRangeKernel(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_kernel") CLKernel kernel, + @cl_uint int work_dim, + @Check(value = "work_dim", canBeNull = true) @Const @NativeType("size_t") PointerBuffer global_work_offset, + @Check(value = "work_dim", canBeNull = true) @Const @NativeType("size_t") PointerBuffer global_work_size, + @Check(value = "work_dim", canBeNull = true) @Const @NativeType("size_t") PointerBuffer local_work_size, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueTask(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_kernel") CLKernel kernel, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + /** + * Enqueues a native kernel to the specified command queue. The <code>mem_list</code> parameter + * can be used to pass a list of <code>CLMem</code> objects that will be mapped to global memory space and + * exposed as a <code>ByteBuffer</code> array in the <code>CLNativeKernel#execute</code> method. The + * <code>sizes</code> parameter will be used to allocate direct <code>ByteBuffer</code>s with the correct + * capacities. The user is responsible for passing appropriate values to avoid crashes. + * + * @param command_queue the command queue + * @param user_func the native kernel + * @param mem_list the CLMem objects + * @param sizes the CLMem object sizes + * @param event_wait_list the event wait list + * @param event the queue event + * + * @return the error code + */ + @Code( + tryBlock = true, + // Build the args buffer and create a GlobalRef to the user_func object. + javaBeforeNative = "\t\tlong user_func_ref = CallbackUtil.createGlobalRef(user_func);\n" + + "\t\tByteBuffer args = APIUtil.getNativeKernelArgs(user_func_ref, mem_list, sizes);", + // Register CLEvent + javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_func_ref);", + nativeAfterVars = "\tvoid **args_mem_loc = num_mem_objects == 0 ? NULL : (void **)malloc(num_mem_objects * sizeof(void *));", + nativeBeforeCall = "\t_ptr_i = 0;\n" + + "\twhile ( _ptr_i < num_mem_objects ) {\n" + + "\t\targs_mem_loc[_ptr_i] = (cl_void *)((char *)args_address + (12 + 4 + _ptr_i * (4 + sizeof(void *))));\n" + + "\t\t_ptr_i++;\n" + + "\t}", + nativeAfterCall = "\tfree(args_mem_loc);" + ) + @cl_int + int clEnqueueNativeKernel(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_native_kernel_func") CLNativeKernel user_func, + @Constant("MemoryUtil.getAddress0(args)") @cl_void ByteBuffer args, + @AutoSize("args") @size_t long cb_args, + @Constant("mem_list == null ? 0 : mem_list.length") @cl_uint int num_mem_objects, + @Check(value = "1", canBeNull = true) @PointerArray("num_mem_objects") @Const @NativeType("cl_mem") CLMem[] mem_list, + @Check(value = "mem_list.length", canBeNull = true) @Helper long[] sizes, + @Constant(value = "(const void**)args_mem_loc", isNative = true) @Const @Indirect @cl_void ByteBuffer args_mem_loc, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clWaitForEvents(@AutoSize("event_list") @cl_uint int num_events, + @Check("1") @Const @NativeType("cl_event") PointerBuffer event_list); + + @Alternate("clWaitForEvents") + @cl_int + int clWaitForEvents(@Constant("1") @cl_uint int num_events, + @Constant(value = "APIUtil.getPointer(event)", keepParam = true) CLEvent event); + + @cl_int + int clGetEventInfo(@PointerWrapper("cl_event") CLEvent event, + @NativeType("cl_event_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) event.retain();") + @cl_int + int clRetainEvent(@PointerWrapper("cl_event") CLEvent event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) event.release();") + @cl_int + int clReleaseEvent(@PointerWrapper("cl_event") CLEvent event); + + @Code(javaAfterNative = "\t\tif ( __result == CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueMarker(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @OutParameter @Check("1") @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clEnqueueBarrier(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue); + + @cl_int + int clEnqueueWaitForEvents(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize("event_list") @cl_uint int num_events, + @Check("1") @Const @NativeType("cl_event") PointerBuffer event_list); + + @Alternate("clEnqueueWaitForEvents") + @cl_int + int clEnqueueWaitForEvents(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @Constant("1") @cl_uint int num_events, + @Constant(value = "APIUtil.getPointer(event)", keepParam = true) CLEvent event); + + @cl_int + int clGetEventProfilingInfo(@PointerWrapper("cl_event") CLEvent event, + @NativeType("cl_profiling_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @cl_int + int clFlush(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue); + + @cl_int + int clFinish(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue); + + @Private + @PointerWrapper("void *") + CLFunctionAddress clGetExtensionFunctionAddress(@NullTerminated @Const @cl_char ByteBuffer func_name); + + @Alternate("clGetExtensionFunctionAddress") + @Private + @PointerWrapper("void *") + CLFunctionAddress clGetExtensionFunctionAddress(@NullTerminated CharSequence func_name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10GL.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10GL.java new file mode 100644 index 0000000..ad5e0ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL10GL.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.cl_int; +import org.lwjgl.util.generator.opencl.cl_uint; +import org.lwjgl.util.generator.opencl.cl_void; +import org.lwjgl.util.generator.opencl.size_t; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** The core OpenCL 1.0 OpenGL interrop functionality. */ +public interface CL10GL { + + /** cl_gl_object_type */ + int CL_GL_OBJECT_BUFFER = 0x2000, + CL_GL_OBJECT_TEXTURE2D = 0x2001, + CL_GL_OBJECT_TEXTURE3D = 0x2002, + CL_GL_OBJECT_RENDERBUFFER = 0x2003; + + /** cl_gl_texture_info */ + int CL_GL_TEXTURE_TARGET = 0x2004, + CL_GL_MIPMAP_LEVEL = 0x2005; + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateFromGLBuffer(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("GLuint") int bufobj, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateFromGLTexture2D(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("GLenum") int target, + @NativeType("GLint") int miplevel, + @NativeType("GLuint") int texture, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateFromGLTexture3D(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("GLenum") int target, + @NativeType("GLint") int miplevel, + @NativeType("GLuint") int texture, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateFromGLRenderbuffer(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("GLuint") int renderbuffer, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @cl_int + int clGetGLObjectInfo(@PointerWrapper("cl_mem") CLMem memobj, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_gl_object_type") IntBuffer gl_object_type, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("GLuint") IntBuffer gl_object_name); + + @cl_int + int clGetGLTextureInfo(@PointerWrapper("cl_mem") CLMem memobj, + @NativeType("cl_gl_texture_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueAcquireGLObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize("mem_objects") @cl_uint int num_objects, + @Check("1") @Const @NativeType("cl_mem") PointerBuffer mem_objects, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Alternate("clEnqueueAcquireGLObjects") + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueAcquireGLObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @Constant("1") @cl_uint int num_objects, + @Constant(value = "APIUtil.getPointer(mem_object)", keepParam = true) CLMem mem_object, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueReleaseGLObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize("mem_objects") @cl_uint int num_objects, + @Check("1") @Const @NativeType("cl_mem") PointerBuffer mem_objects, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Alternate("clEnqueueReleaseGLObjects") + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueReleaseGLObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @Constant("1") @cl_uint int num_objects, + @Constant(value = "APIUtil.getPointer(mem_object)", keepParam = true) CLMem mem_object, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL11.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL11.java new file mode 100644 index 0000000..a2c8710 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL11.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +/** The core OpenCL 1.1 API */ +public interface CL11 { + + /** Error Codes */ + int CL_MISALIGNED_SUB_BUFFER_OFFSET = -13, + CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST = -14, + CL_INVALID_PROPERTY = -64; + + /** OpenCL Version */ + int CL_VERSION_1_1 = 1; + + /** cl_device_info */ + int CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF = 0x1034, + CL_DEVICE_HOST_UNIFIED_MEMORY = 0x1035, + CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR = 0x1036, + CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT = 0x1037, + CL_DEVICE_NATIVE_VECTOR_WIDTH_INT = 0x1038, + CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG = 0x1039, + CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT = 0x103A, + CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE = 0x103B, + CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF = 0x103C, + CL_DEVICE_OPENCL_C_VERSION = 0x103D; + + /** cl_device_fp_config - bitfield */ + int CL_FP_SOFT_FLOAT = (1 << 6); + + /** cl_context_info */ + int CL_CONTEXT_NUM_DEVICES = 0x1083; + + /** cl_channel_order */ + int CL_Rx = 0x10BA, + CL_RGx = 0x10BB, + CL_RGBx = 0x10BC; + + /** cl_mem_info */ + int CL_MEM_ASSOCIATED_MEMOBJECT = 0x1107, + CL_MEM_OFFSET = 0x1108; + + /** cl_addressing_mode */ + int CL_ADDRESS_MIRRORED_REPEAT = 0x1134; + + /** cl_kernel_work_group_info */ + int CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x11B3, + CL_KERNEL_PRIVATE_MEM_SIZE = 0x11B4; + + /** cl_event_info */ + int CL_EVENT_CONTEXT = 0x11D4; + + /** cl_command_type */ + int CL_COMMAND_READ_BUFFER_RECT = 0x1201, + CL_COMMAND_WRITE_BUFFER_RECT = 0x1202, + CL_COMMAND_COPY_BUFFER_RECT = 0x1203, + CL_COMMAND_USER = 0x1204; + + /** cl_buffer_create_type */ + int CL_BUFFER_CREATE_TYPE_REGION = 0x1220; + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", factory = "CLMem.create", params = "buffer.getParent()") + CLMem clCreateSubBuffer(@PointerWrapper("cl_mem") CLMem buffer, + @NativeType("cl_mem_flags") long flags, + @NativeType("cl_buffer_create_type") int buffer_create_type, + @Const @Check("2 * PointerBuffer.getPointerSize()") @NativeType("cl_void") ByteBuffer buffer_create_info, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clSetMemObjectDestructorCallback(@PointerWrapper("cl_mem") CLMem memobj, + @PointerWrapper("cl_mem_object_destructor_callback") CLMemObjectDestructorCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueReadBufferRect(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @cl_bool int blocking_read, + @Const @Check("3") @NativeType("size_t") PointerBuffer buffer_offset, + @Const @Check("3") @NativeType("size_t") PointerBuffer host_offset, + @Const @Check("3") @NativeType("size_t") PointerBuffer region, + @size_t long buffer_row_pitch, + @size_t long buffer_slice_pitch, + @size_t long host_row_pitch, + @size_t long host_slice_pitch, + @OutParameter @Check("CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)") + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Const @Check(canBeNull = true) @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueWriteBufferRect(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @cl_bool int blocking_write, + @Const @Check("3") @NativeType("size_t") PointerBuffer buffer_offset, + @Const @Check("3") @NativeType("size_t") PointerBuffer host_offset, + @Const @Check("3") @NativeType("size_t") PointerBuffer region, + @size_t long buffer_row_pitch, + @size_t long buffer_slice_pitch, + @size_t long host_row_pitch, + @size_t long host_slice_pitch, + @Const @Check("CLChecks.calculateBufferRectSize(host_offset, region, host_row_pitch, host_slice_pitch)") + @cl_byte + @cl_short + @cl_int + @cl_long + @cl_float + @cl_double Buffer ptr, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Const @Check(canBeNull = true) @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueCopyBufferRect(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem src_buffer, + @PointerWrapper("cl_mem") CLMem dst_buffer, + @Const @Check("3") @NativeType("size_t") PointerBuffer src_origin, + @Const @Check("3") @NativeType("size_t") PointerBuffer dst_origin, + @Const @Check("3") @NativeType("size_t") PointerBuffer region, + @size_t long src_row_pitch, + @size_t long src_slice_pitch, + @size_t long dst_row_pitch, + @size_t long dst_slice_pitch, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Const @Check(canBeNull = true) @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_event", params = "context") + CLEvent clCreateUserEvent(@PointerWrapper("cl_context") CLContext context, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @cl_int + int clSetUserEventStatus(@PointerWrapper("cl_event") CLEvent event, + @cl_int int execution_status); + + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tpfn_notify.setRegistry(event.getParentRegistry());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clSetEventCallback(@PointerWrapper("cl_event") CLEvent event, + @cl_int int command_exec_callback_type, + @PointerWrapper("cl_event_callback") CLEventCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12.java new file mode 100644 index 0000000..2dcc3ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12.java @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +/** The core OpenCL 1.1 API */ +public interface CL12 { + + /** Error Codes */ + int CL_COMPILE_PROGRAM_FAILURE = -15, + CL_LINKER_NOT_AVAILABLE = -16, + CL_LINK_PROGRAM_FAILURE = -17, + CL_DEVICE_PARTITION_FAILED = -18, + CL_KERNEL_ARG_INFO_NOT_AVAILABLE = -19, + CL_INVALID_IMAGE_DESCRIPTOR = -65, + CL_INVALID_COMPILER_OPTIONS = -66, + CL_INVALID_LINKER_OPTIONS = -67, + CL_INVALID_DEVICE_PARTITION_COUNT = -68; + + /** OpenCL Version */ + int CL_VERSION_1_2 = 1; + + /** cl_bool */ + int CL_BLOCKING = CL10.CL_TRUE, + CL_NON_BLOCKING = CL10.CL_FALSE; + + /** cl_device_type - bitfield */ + int CL_DEVICE_TYPE_CUSTOM = (1 << 4); + + /* cl_device_info */ + int CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032, + CL_DEVICE_LINKER_AVAILABLE = 0x103E, + CL_DEVICE_BUILT_IN_KERNELS = 0x103F, + CL_DEVICE_IMAGE_MAX_BUFFER_SIZE = 0x1040, + CL_DEVICE_IMAGE_MAX_ARRAY_SIZE = 0x1041, + CL_DEVICE_PARENT_DEVICE = 0x1042, + CL_DEVICE_PARTITION_MAX_SUB_DEVICES = 0x1043, + CL_DEVICE_PARTITION_PROPERTIES = 0x1044, + CL_DEVICE_PARTITION_AFFINITY_DOMAIN = 0x1045, + CL_DEVICE_PARTITION_TYPE = 0x1046, + CL_DEVICE_REFERENCE_COUNT = 0x1047, + CL_DEVICE_PREFERRED_INTEROP_USER_SYNC = 0x1048, + CL_DEVICE_PRINTF_BUFFER_SIZE = 0x1049; + + /* cl_device_fp_config - bitfield */ + int CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT = (1 << 7); + + /* cl_context_properties */ + int CL_CONTEXT_INTEROP_USER_SYNC = 0x1085; + + /* cl_device_partition_property */ + int CL_DEVICE_PARTITION_EQUALLY = 0x1086, + CL_DEVICE_PARTITION_BY_COUNTS = 0x1087, + CL_DEVICE_PARTITION_BY_COUNTS_LIST_END = 0x0, + CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN = 0x1088; + + /* cl_device_affinity_domain */ + int CL_DEVICE_AFFINITY_DOMAIN_NUMA = (1 << 0), + CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE = (1 << 1), + CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE = (1 << 2), + CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE = (1 << 3), + CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE = (1 << 4), + CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE = (1 << 5); + + /* cl_mem_flags - bitfield */ + int CL_MEM_HOST_WRITE_ONLY = (1 << 7), + CL_MEM_HOST_READ_ONLY = (1 << 8), + CL_MEM_HOST_NO_ACCESS = (1 << 9); + + /* cl_mem_migration_flags - bitfield */ + int CL_MIGRATE_MEM_OBJECT_HOST = (1 << 0), + CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED = (1 << 1); + + /* cl_mem_object_type */ + int CL_MEM_OBJECT_IMAGE2D_ARRAY = 0x10F3, + CL_MEM_OBJECT_IMAGE1D = 0x10F4, + CL_MEM_OBJECT_IMAGE1D_ARRAY = 0x10F5, + CL_MEM_OBJECT_IMAGE1D_BUFFER = 0x10F6; + + /* cl_image_info */ + int CL_IMAGE_ARRAY_SIZE = 0x1117, + CL_IMAGE_BUFFER = 0x1118, + CL_IMAGE_NUM_MIP_LEVELS = 0x1119, + CL_IMAGE_NUM_SAMPLES = 0x111A; + + /* cl_map_flags - bitfield */ + int CL_MAP_WRITE_INVALIDATE_REGION = (1 << 2); + + /* cl_program_info */ + int CL_PROGRAM_NUM_KERNELS = 0x1167, + CL_PROGRAM_KERNEL_NAMES = 0x1168; + + /* cl_program_build_info */ + int CL_PROGRAM_BINARY_TYPE = 0x1184; + + /* cl_program_binary_type */ + int CL_PROGRAM_BINARY_TYPE_NONE = 0x0, + CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT = 0x1, + CL_PROGRAM_BINARY_TYPE_LIBRARY = 0x2, + CL_PROGRAM_BINARY_TYPE_EXECUTABLE = 0x4; + + /* cl_kernel_info */ + int CL_KERNEL_ATTRIBUTES = 0x1195; + + /* cl_kernel_arg_info */ + int CL_KERNEL_ARG_ADDRESS_QUALIFIER = 0x1196, + CL_KERNEL_ARG_ACCESS_QUALIFIER = 0x1197, + CL_KERNEL_ARG_TYPE_NAME = 0x1198, + CL_KERNEL_ARG_TYPE_QUALIFIER = 0x1199, + CL_KERNEL_ARG_NAME = 0x119A; + + /* cl_kernel_arg_address_qualifier */ + int CL_KERNEL_ARG_ADDRESS_GLOBAL = 0x119A, + CL_KERNEL_ARG_ADDRESS_LOCAL = 0x119B, + CL_KERNEL_ARG_ADDRESS_CONSTANT = 0x119C, + CL_KERNEL_ARG_ADDRESS_PRIVATE = 0x119D; + + /* cl_kernel_arg_access_qualifier */ + int CL_KERNEL_ARG_ACCESS_READ_ONLY = 0x11A0, + CL_KERNEL_ARG_ACCESS_WRITE_ONLY = 0x11A1, + CL_KERNEL_ARG_ACCESS_READ_WRITE = 0x11A2, + CL_KERNEL_ARG_ACCESS_NONE = 0x11A3; + + /* cl_kernel_arg_type_qualifer */ + int CL_KERNEL_ARG_TYPE_NONE = 0, + CL_KERNEL_ARG_TYPE_CONST = (1 << 0), + CL_KERNEL_ARG_TYPE_RESTRICT = (1 << 1), + CL_KERNEL_ARG_TYPE_VOLATILE = (1 << 2); + + /* cl_kernel_work_group_info */ + int CL_KERNEL_GLOBAL_WORK_SIZE = 0x11B5; + + /* cl_command_type */ + int CL_COMMAND_BARRIER = 0x1205, + CL_COMMAND_MIGRATE_MEM_OBJECTS = 0x1206, + CL_COMMAND_FILL_BUFFER = 0x1207, + CL_COMMAND_FILL_IMAGE = 0x1208; + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.retain();") + @cl_int + int clRetainDevice(@PointerWrapper("cl_device_id") CLDevice device); + + /** + * Warning: LWJGL will not automatically release any objects associated with sub-devices. + * The user is responsible for tracking and releasing everything prior to calling this method. + * + * @param device the parent CLDevice + * + * @return the error code + */ + @Code( + javaBeforeNative = "\t\tAPIUtil.releaseObjects(device);", + javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.release();" + ) + @cl_int + int clReleaseDevice(@PointerWrapper("cl_device_id") CLDevice device); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS && out_devices != null ) in_device.registerSubCLDevices(out_devices);") + @cl_int + int clCreateSubDevices( + @PointerWrapper("cl_device_id") CLDevice in_device, + @NullTerminated @Const @NativeType("cl_device_partition_property") LongBuffer properties, + @AutoSize(value = "out_devices", canBeNull = true) @cl_uint int num_devices, + @OutParameter @Check(canBeNull = true) @NativeType("cl_device_id") PointerBuffer out_devices, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_devices_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateImage(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @Check("2 * 4") @Const @NativeType("cl_image_format") ByteBuffer image_format, + // On x64 there's 4 byte padding after image_type (to align image_width) + @Check("7 * PointerBuffer.getPointerSize() + 2 * 4 + PointerBuffer.getPointerSize()") @Const @NativeType("cl_image_desc") ByteBuffer image_desc, + @Check(canBeNull = true) + @cl_byte + @cl_short + @cl_int + @cl_float Buffer host_ptr, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithBuiltInKernels(@PointerWrapper("cl_context") CLContext context, + @AutoSize("device_list") @cl_uint int num_devices, + @Check("1") @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check @Const @cl_char ByteBuffer kernel_names, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + @Alternate("clCreateProgramWithBuiltInKernels") + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clCreateProgramWithBuiltInKernels(@PointerWrapper("cl_context") CLContext context, + @AutoSize("device_list") @cl_uint int num_devices, + @Check("1") @Const @NativeType("cl_device_id") PointerBuffer device_list, + CharSequence kernel_names, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + + /** Single null-terminated header include name. */ + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clCompileProgram(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check @NullTerminated @Const @cl_char ByteBuffer options, + @Constant("1") @cl_uint int num_input_headers, + @Check("1") @Const @NativeType("cl_program") PointerBuffer input_header, + @NullTerminated @Check @Const @cl_char @Indirect ByteBuffer header_include_name, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + /** Multiple null-terminated header include names, one after the other. */ + @Alternate(value = "clCompileProgram", nativeAlt = true, javaAlt = true) + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clCompileProgramMulti(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check @NullTerminated @Const @cl_char ByteBuffer options, + @AutoSize("input_headers") @cl_uint int num_input_headers, + @Check("1") @Const @NativeType("cl_program") PointerBuffer input_headers, + @NullTerminated("input_headers.remaining()") @Check @Const @Indirect @cl_char @PointerArray("num_input_headers") ByteBuffer header_include_names, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Alternate(value = "clCompileProgram", nativeAlt = true) + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clCompileProgram3(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @Check @NullTerminated @Const @cl_char ByteBuffer options, + @Constant("header_include_names.length") @cl_uint int num_input_headers, + @Check("header_include_names.length") @Const @NativeType("cl_program") PointerBuffer input_headers, + @NullTerminated @Check("1") @PointerArray(value = "num_input_headers") @Const @NativeType("cl_char") ByteBuffer[] header_include_names, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Alternate("clCompileProgram") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clCompileProgram(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @NullTerminated CharSequence options, + @Constant("1") @cl_uint int num_input_headers, + @Check("1") @Const @NativeType("cl_program") PointerBuffer input_header, + @NullTerminated @Const CharSequence header_include_name, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Alternate(value = "clCompileProgram", nativeAlt = true, skipNative = true) + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(program.getParent());", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(__result, user_data);" + ) + @cl_int + int clCompileProgramMulti(@PointerWrapper("cl_program") CLProgram program, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @NullTerminated CharSequence options, + @AutoSize("input_header") @cl_uint int num_input_headers, + @Check("1") @Const @NativeType("cl_program") PointerBuffer input_header, + @NullTerminated @PointerArray(value = "num_input_headers") @Const CharSequence[] header_include_name, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLCompileProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(context);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data);" + ) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clLinkProgram(@PointerWrapper("cl_context") CLContext context, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @NullTerminated @Check @Const @cl_char ByteBuffer options, + @AutoSize("input_programs") @cl_uint int num_input_programs, + @Check @Const @NativeType("cl_program") PointerBuffer input_programs, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLLinkProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data, + @OutParameter @Check("1") @cl_int IntBuffer errcode_ret); + + @Alternate("clLinkProgram") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);\n" + + "\t\tif ( pfn_notify != null ) pfn_notify.setContext(context);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tCallbackUtil.checkCallback(errcode_ret.get(errcode_ret.position()), user_data);" + ) + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_program", params = "context") + CLProgram clLinkProgram(@PointerWrapper("cl_context") CLContext context, + @AutoSize(value = "device_list", canBeNull = true) @cl_uint int num_devices, + @Check(canBeNull = true) @Const @NativeType("cl_device_id") PointerBuffer device_list, + @NullTerminated CharSequence options, + @AutoSize("input_programs") @cl_uint int num_input_programs, + @Check @Const @NativeType("cl_program") PointerBuffer input_programs, + @PointerWrapper(value = "cl_program_callback", canBeNull = true) CLLinkProgramCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data, + @OutParameter @Check("1") @cl_int IntBuffer errcode_ret); + + @cl_int + int clUnloadPlatformCompiler(@PointerWrapper("cl_platform_id") CLPlatform platform); + + @cl_int + int clGetKernelArgInfo(@PointerWrapper("cl_kernel") CLKernel kernel, + @cl_uint int arg_indx, + @NativeType("cl_kernel_arg_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + + @cl_int + int clEnqueueFillBuffer(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem buffer, + @Check @Const @cl_void ByteBuffer pattern, + @AutoSize("pattern") @size_t long pattern_size, + @size_t long offset, + @size_t long size, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clEnqueueFillImage(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @PointerWrapper("cl_mem") CLMem image, + @Check("4 * 4") @Const @cl_void ByteBuffer fill_color, + @Check("3") @Const @NativeType("size_t") PointerBuffer origin, + @Check("3") @Const @NativeType("size_t") PointerBuffer region, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clEnqueueMigrateMemObjects(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize("mem_objects") @cl_uint int num_mem_objects, + @Check @Const @NativeType("cl_mem") PointerBuffer mem_objects, + @NativeType("cl_mem_migration_flags") long flags, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clEnqueueMarkerWithWaitList(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @cl_int + int clEnqueueBarrierWithWaitList(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Optional(reason = "Missing from AMD CL 1.2 preview drivers.") + @Code( + tryBlock = true, + // Create a GlobalRef to the callback object. + javaBeforeNative = "\t\tlong user_data = CallbackUtil.createGlobalRef(pfn_notify);", + // Check if we need to delete the GlobalRef. + javaFinally = "\t\t\tcontext.setPrintfCallback(user_data, __result);" + ) + @cl_int + int clSetPrintfCallback(@PointerWrapper("cl_context") CLContext context, + @PointerWrapper("cl_printf_callback") CLPrintfCallback pfn_notify, + @Constant("user_data") @PointerWrapper("void *") long user_data); + + @Private + @PointerWrapper("void *") + CLFunctionAddress clGetExtensionFunctionAddressForPlatform(@PointerWrapper("cl_platform_id") CLPlatform platform, + @NullTerminated @Const @cl_char ByteBuffer func_name); + + @Alternate("clGetExtensionFunctionAddressForPlatform") + @Private + @PointerWrapper("void *") + CLFunctionAddress clGetExtensionFunctionAddressForPlatform(@PointerWrapper("cl_platform_id") CLPlatform platform, + @NullTerminated CharSequence func_name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12GL.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12GL.java new file mode 100644 index 0000000..1e6a9fc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/CL12GL.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.NativeType; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opencl.cl_int; + +import java.nio.IntBuffer; + +/** The core OpenCL 1.2 OpenGL interrop functionality. */ +public interface CL12GL { + + /* cl_gl_object_type */ + int CL_GL_OBJECT_TEXTURE2D_ARRAY = 0x200E, + CL_GL_OBJECT_TEXTURE1D = 0x200F, + CL_GL_OBJECT_TEXTURE1D_ARRAY = 0x2010, + CL_GL_OBJECT_TEXTURE_BUFFER = 0x2011; + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_mem", params = "context") + CLMem clCreateFromGLTexture(@PointerWrapper("cl_context") CLContext context, + @NativeType("cl_mem_flags") long flags, + @NativeType("GLenum") int target, + @NativeType("GLint") int miplevel, + @NativeType("GLuint") int texture, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_32.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_32.java new file mode 100644 index 0000000..a4bfb85 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_32.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface EXT_atomic_counters_32 { + + /** CLDevice query: Max number of atomic counters that can be used by a kernel. */ + int CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT = 0x4032; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_64.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_64.java new file mode 100644 index 0000000..1e239ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_atomic_counters_64.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface EXT_atomic_counters_64 { + + /** CLDevice query: Max number of atomic counters that can be used by a kernel. */ + int CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT = 0x4032; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_device_fission.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_device_fission.java new file mode 100644 index 0000000..4022cd3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_device_fission.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.cl_int; +import org.lwjgl.util.generator.opencl.cl_uint; + +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +@CLDeviceExtension +public interface EXT_device_fission { + + /** + * Accepted as a property name in the &lt;properties&gt; parameter of + * clCreateSubDeviceEXT: + */ + int CL_DEVICE_PARTITION_EQUALLY_EXT = 0x4050, + CL_DEVICE_PARTITION_BY_COUNTS_EXT = 0x4051, + CL_DEVICE_PARTITION_BY_NAMES_EXT = 0x4052, + CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT = 0x4053; + + /** + * Accepted as a property name, when accompanying the + * CL_DEVICE_PARITION_BY_AFFINITY_DOMAIN_EXT property, in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + int CL_AFFINITY_DOMAIN_L1_CACHE_EXT = 0x1, + CL_AFFINITY_DOMAIN_L2_CACHE_EXT = 0x2, + CL_AFFINITY_DOMAIN_L3_CACHE_EXT = 0x3, + CL_AFFINITY_DOMAIN_L4_CACHE_EXT = 0x4, + CL_AFFINITY_DOMAIN_NUMA_EXT = 0x10, + CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT = 0x100; + + /** + * Accepted as a property being queried in the &lt;param_name&gt; argument of + * clGetDeviceInfo: + */ + int CL_DEVICE_PARENT_DEVICE_EXT = 0x4054, + CL_DEVICE_PARITION_TYPES_EXT = 0x4055, + CL_DEVICE_AFFINITY_DOMAINS_EXT = 0x4056, + CL_DEVICE_REFERENCE_COUNT_EXT = 0x4057, + CL_DEVICE_PARTITION_STYLE_EXT = 0x4058; + + /** + * Accepted as the property list terminator in the &lt;properties&gt; parameter of + * clCreateSubDeviceEXT: + */ + int CL_PROPERTIES_LIST_END_EXT = 0x0; + + /** + * Accepted as the partition counts list terminator in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + int CL_PARTITION_BY_COUNTS_LIST_END_EXT = 0x0; + + /** + * Accepted as the partition names list terminator in the &lt;properties&gt; + * parameter of clCreateSubDeviceEXT: + */ + int CL_PARTITION_BY_NAMES_LIST_END_EXT = -1; + + /** + * Returned by clCreateSubDevicesEXT when the indicated partition scheme is + * supported by the implementation, but the implementation can not further + * partition the device in this way. + */ + int CL_DEVICE_PARTITION_FAILED_EXT = -1057; + + /** + * Returned by clCreateSubDevicesEXT when the total number of compute units + * requested exceeds CL_DEVICE_MAX_COMPUTE_UNITS, or the number of compute + * units for any one sub-device is less than 1. + */ + int CL_INVALID_PARTITION_COUNT_EXT = -1058; + + /** + * Returned by clCreateSubDevicesEXT when a compute unit name appearing in a + * name list following CL_DEVICE_PARTITION_BY_NAMES_EXT is not in range. + */ + int CL_INVALID_PARTITION_NAME_EXT = -1059; + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.retain();") + @cl_int + int clRetainDeviceEXT(@PointerWrapper("cl_device_id") CLDevice device); + + /** + * Warning: LWJGL will not automatically release any objects associated with sub-devices. + * The user is responsible for tracking and releasing everything prior to calling this method. + * + * @param device the parent CLDevice + * + * @return the error code + */ + @Code( + javaBeforeNative = "\t\tAPIUtil.releaseObjects(device);", + javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) device.release();" + ) + @cl_int + int clReleaseDeviceEXT(@PointerWrapper("cl_device_id") CLDevice device); + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS && out_devices != null ) in_device.registerSubCLDevices(out_devices);") + @cl_int + int clCreateSubDevicesEXT( + @PointerWrapper("cl_device_id") CLDevice in_device, + @NullTerminated @Const @NativeType("cl_device_partition_property_ext") LongBuffer properties, + @AutoSize(value = "out_devices", canBeNull = true) @cl_uint int num_entries, + @OutParameter @Check(canBeNull = true) @NativeType("cl_device_id") PointerBuffer out_devices, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_devices); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_migrate_memobject.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_migrate_memobject.java new file mode 100644 index 0000000..76f272c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/EXT_migrate_memobject.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.cl_bitfield; +import org.lwjgl.util.generator.opencl.cl_int; +import org.lwjgl.util.generator.opencl.cl_uint; + +@CLDeviceExtension +public interface EXT_migrate_memobject { + + /** + * Besides a value of zero, the following cl_mem_migration_flags_ext values are + * allowed: + */ + int CL_MIGRATE_MEM_OBJECT_HOST_EXT = 0x1; + + /** + * Returned in the &lt;param_value&gt; parameter of the clGetEventInfo when + * &lt;param_name&gt; is CL_EVENT_COMMAND_TYPE: + */ + int CL_COMMAND_MIGRATE_MEM_OBJECT_EXT = 0x4040; + + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueMigrateMemObjectEXT(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @AutoSize("mem_objects") @cl_uint int num_mem_objects, + @Check("1") @Const @NativeType("cl_mem") PointerBuffer mem_objects, + @cl_bitfield @NativeType("cl_mem_migration_flags_ext") long flags, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + + @Alternate("clEnqueueMigrateMemObjectEXT") + @Code(javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS ) command_queue.registerCLEvent(event);") + @cl_int + int clEnqueueMigrateMemObjectEXT(@PointerWrapper("cl_command_queue") CLCommandQueue command_queue, + @Constant("1") @cl_uint int num_mem_objects, + @Constant(value = "APIUtil.getPointer(mem_object)", keepParam = true) CLMem mem_object, + @cl_bitfield @NativeType("cl_mem_migration_flags_ext") long flags, + @AutoSize(value = "event_wait_list", canBeNull = true) @cl_uint int num_events_in_wait_list, + @Check(canBeNull = true) @Const @NativeType("cl_event") PointerBuffer event_wait_list, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("cl_event") PointerBuffer event); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_immediate_execution.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_immediate_execution.java new file mode 100644 index 0000000..e2729aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_immediate_execution.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface INTEL_immediate_execution { + + // TODO: Update when spec is released publicly. + + /** cl_command_queue_properties - bitfield */ + int CL_QUEUE_IMMEDIATE_EXECUTION_ENABLE_INTEL = (1 << 2); + + /** cl_device_exec_capabilities - bitfield */ + int CL_EXEC_IMMEDIATE_EXECUTION_INTEL = (1 << 2); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_printf.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_printf.java new file mode 100644 index 0000000..8b45af5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_printf.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface INTEL_printf { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_thread_local_exec.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_thread_local_exec.java new file mode 100644 index 0000000..63167f3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/INTEL_thread_local_exec.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface INTEL_thread_local_exec { + + /** + * Allows the user to execute OpenCL tasks and kernels with + * the user application's threads. This token that can + * be passed to clCreateCommandQueue, creating a queue with the "thread + * local exec" capability. + * <p/> + * All enqueue APIs (e.g., clEnqueueRead) submitted to such a queue + * never enqueue commands. An Enqueue API call is executed by the + * caller host-thread itself without involving any of the OpenCL + * runtime threads, much like function calls. + */ + int CL_QUEUE_THREAD_LOCAL_EXEC_ENABLE_INTEL = (1 << 31); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_3d_image_writes.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_3d_image_writes.java new file mode 100644 index 0000000..72072de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_3d_image_writes.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_3d_image_writes { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_byte_addressable_store.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_byte_addressable_store.java new file mode 100644 index 0000000..eb6a35a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_byte_addressable_store.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_byte_addressable_store { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_d3d10_sharing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_d3d10_sharing.java new file mode 100644 index 0000000..e392546 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_d3d10_sharing.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLPlatformExtension; + +@CLPlatformExtension +public interface KHR_d3d10_sharing { + // Not implemented +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_depth_images.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_depth_images.java new file mode 100644 index 0000000..9dc87b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_depth_images.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_depth_images { + + /** cl_channel_order */ + int CL_DEPTH = 0x10BD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp16.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp16.java new file mode 100644 index 0000000..be8dd54 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp16.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_fp16 { + + /** cl_device_info */ + int CL_DEVICE_HALF_FP_CONFIG = 0x1033; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp64.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp64.java new file mode 100644 index 0000000..93194c7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_fp64.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_fp64 { + + /** cl_device_info */ + int CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_depth_images.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_depth_images.java new file mode 100644 index 0000000..a0db7a9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_depth_images.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Extension; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRGLDepthImages") +public interface KHR_gl_depth_images { + + /** cl_channel_order */ + int CL_DEPTH_STENCIL = 0x10BE; + + /** cl_channel_type */ + int CL_UNORM_INT24 = 0x10DF; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_event.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_event.java new file mode 100644 index 0000000..8ecd197 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_event.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.opengl.GLSync; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.CLPlatformExtension; +import org.lwjgl.util.generator.opencl.cl_int; + +import java.nio.IntBuffer; + +@Imports("org.lwjgl.opengl.GLSync") +@CLPlatformExtension +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRGLEvent") +public interface KHR_gl_event { + + /** Returned by clGetEventInfo when param_name is CL_EVENT_COMMAND_TYPE: */ + int CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR = 0x200D; + + @Check(value = "errcode_ret", canBeNull = true) + @PointerWrapper(value = "cl_event", params = "context") + CLEvent clCreateEventFromGLsyncKHR(@PointerWrapper("cl_context") CLContext context, + @PointerWrapper("cl_GLsync") GLSync sync, + @OutParameter @Check(value = "1", canBeNull = true) @cl_int IntBuffer errcode_ret); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_msaa_sharing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_msaa_sharing.java new file mode 100644 index 0000000..4d8ebc7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_msaa_sharing.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Extension; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRGLMsaaSharing") +public interface KHR_gl_msaa_sharing { + + /** cl_gl_texture_info */ + int CL_GL_NUM_SAMPLES = 0x2012; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java new file mode 100644 index 0000000..2e5467a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_gl_sharing.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.*; + +import java.nio.ByteBuffer; + +@CLPlatformExtension +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRGLSharing") +public interface KHR_gl_sharing { + + /** + * Returned by clCreateContext, clCreateContextFromType, and + * clGetGLContextInfoKHR when an invalid OpenGL context or share group + * object handle is specified in &lt;properties&gt;: + */ + int CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR = -1000; + + /** Accepted as the &lt;param_name&gt; argument of clGetGLContextInfoKHR: */ + int CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR = 0x2006, + CL_DEVICES_FOR_GL_CONTEXT_KHR = 0x2007; + + /** + * Accepted as an attribute name in the 'properties' argument of + * clCreateContext and clCreateContextFromType: + */ + int CL_GL_CONTEXT_KHR = 0x2008, + CL_EGL_DISPLAY_KHR = 0x2009, + CL_GLX_DISPLAY_KHR = 0x200A, + CL_WGL_HDC_KHR = 0x200B, + CL_CGL_SHAREGROUP_KHR = 0x200C; + + @Code( + javaBeforeNative = "\t\tif ( param_value_size_ret == null && APIUtil.isDevicesParam(param_name) ) param_value_size_ret = APIUtil.getBufferPointer();", + javaAfterNative = "\t\tif ( __result == CL10.CL_SUCCESS && param_value != null && APIUtil.isDevicesParam(param_name) ) APIUtil.getCLPlatform(properties).registerCLDevices(param_value, param_value_size_ret);" + ) + @cl_int + int clGetGLContextInfoKHR(@NullTerminated @Const @NativeType("cl_context_properties") PointerBuffer properties, + @NativeType("cl_gl_context_info") int param_name, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_base_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_base_atomics.java new file mode 100644 index 0000000..78f4b44 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_base_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_global_int32_base_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_extended_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_extended_atomics.java new file mode 100644 index 0000000..30abb2d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_global_int32_extended_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_global_int32_extended_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_icd.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_icd.java new file mode 100644 index 0000000..633fe0c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_icd.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.CLPlatformExtension; +import org.lwjgl.util.generator.opencl.cl_int; +import org.lwjgl.util.generator.opencl.cl_uint; + +import java.nio.IntBuffer; + +@CLPlatformExtension +@Extension(postfix = "KHR", className = "KHRICD") +public interface KHR_icd { + + /** Accepted as &lt;param_name&gt; to the function clGetPlatformInfo */ + int CL_PLATFORM_ICD_SUFFIX_KHR = 0x0920; + + /** Returned by clGetPlatformIDs when no platforms are found */ + int CL_PLATFORM_NOT_FOUND_KHR = -1001; + + @Optional(reason = "AMD Stream does not expose this (version tested: 2.5)") + @cl_int + int clIcdGetPlatformIDsKHR(@AutoSize(value = "platforms", canBeNull = true) @cl_uint int num_entries, + @OutParameter @Check(canBeNull = true) @NativeType("cl_platform_id") PointerBuffer platforms, + @OutParameter @Check(value = "1", canBeNull = true) @cl_uint IntBuffer num_platforms); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_image2d_from_buffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_image2d_from_buffer.java new file mode 100644 index 0000000..4b48f8b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_image2d_from_buffer.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Extension; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRImage2DFromBuffer") +public interface KHR_image2d_from_buffer { + + /** cl_device_info */ + int CL_DEVICE_IMAGE_PITCH_ALIGNMENT = 0x104A, + CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT = 0x104B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_initialize_memory.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_initialize_memory.java new file mode 100644 index 0000000..af4556b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_initialize_memory.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_initialize_memory { + + /** cl_context_properties */ + int CL_CONTEXT_MEMORY_INITIALIZE_KHR = 0x200E; + + /** */ + int CL_CONTEXT_MEMORY_INITIALIZE_LOCAL_KHR = 0x1, // TODO: Find value + CL_CONTEXT_MEMORY_INITIALIZE_PRIVATE_KHR = 0x2; // TODO: Find value + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_base_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_base_atomics.java new file mode 100644 index 0000000..52d6125 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_base_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_int64_base_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_extended_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_extended_atomics.java new file mode 100644 index 0000000..271567c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_int64_extended_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_int64_extended_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_base_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_base_atomics.java new file mode 100644 index 0000000..b2dfbc4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_base_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_local_int32_base_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_extended_atomics.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_extended_atomics.java new file mode 100644 index 0000000..68585b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_local_int32_extended_atomics.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_local_int32_extended_atomics { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image.java new file mode 100644 index 0000000..77fc09b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_mipmap_image { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image_writes.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image_writes.java new file mode 100644 index 0000000..73c602d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_mipmap_image_writes.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_mipmap_image_writes { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_select_fprounding_mode.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_select_fprounding_mode.java new file mode 100644 index 0000000..28407f5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_select_fprounding_mode.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_select_fprounding_mode { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_spir.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_spir.java new file mode 100644 index 0000000..87a75d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_spir.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.Extension; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +@Extension(postfix = "KHR", className = "KHRSPIR") +public interface KHR_spir { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_srgb_image_writes.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_srgb_image_writes.java new file mode 100644 index 0000000..a0d675d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_srgb_image_writes.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface KHR_srgb_image_writes { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_subgroups.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_subgroups.java new file mode 100644 index 0000000..f40674f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_subgroups.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.cl_int; +import org.lwjgl.util.generator.opencl.cl_void; +import org.lwjgl.util.generator.opencl.size_t; + +import java.nio.ByteBuffer; + +@CLDeviceExtension +public interface KHR_subgroups { + + @cl_int + int clGetKernelSubGroupInfoKHR(@PointerWrapper("cl_kernel") CLKernel kernel, + @PointerWrapper(value = "cl_device_id", canBeNull = true) CLDevice device, + @NativeType("cl_kernel_sub_group_info") int param_name, + @AutoSize(value = "input_value", canBeNull = true) @size_t long input_value_size, + @Check(canBeNull = true) @Const @cl_void ByteBuffer input_value, + @AutoSize(value = "param_value", canBeNull = true) @size_t long param_value_size, + @OutParameter @Check(canBeNull = true) @cl_void ByteBuffer param_value, + @OutParameter @Check(value = "1", canBeNull = true) @NativeType("size_t") PointerBuffer param_value_size_ret); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_terminate_context.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_terminate_context.java new file mode 100644 index 0000000..5178263 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/KHR_terminate_context.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opencl.CLDeviceExtension; +import org.lwjgl.util.generator.opencl.cl_int; + +@CLDeviceExtension +public interface KHR_terminate_context { + + int CL_DEVICE_TERMINATE_CAPABILITY_KHR = 0x200F, + CL_CONTEXT_TERMINATE_KHR = 0x2010; + + @cl_int + int clTerminateContextKHR(@PointerWrapper("cl_context") CLContext context); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_compiler_options.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_compiler_options.java new file mode 100644 index 0000000..3c91c66 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_compiler_options.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface NV_compiler_options { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_device_attribute_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_device_attribute_query.java new file mode 100644 index 0000000..147ab6d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_device_attribute_query.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface NV_device_attribute_query { + + /** Accepted as the &lt;param_name&gt; parameter of clGetDeviceInfo. */ + int CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV = 0x4000, + CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV = 0x4001, + CL_DEVICE_REGISTERS_PER_BLOCK_NV = 0x4002, + CL_DEVICE_WARP_SIZE_NV = 0x4003, + CL_DEVICE_GPU_OVERLAP_NV = 0x4004, + CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV = 0x4005, + CL_DEVICE_INTEGRATED_MEMORY_NV = 0x4006; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_pragma_unroll.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_pragma_unroll.java new file mode 100644 index 0000000..4b04a35 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opencl/NV_pragma_unroll.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opencl; + +import org.lwjgl.util.generator.opencl.CLDeviceExtension; + +@CLDeviceExtension +public interface NV_pragma_unroll { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_blend_minmax_factor.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_blend_minmax_factor.java new file mode 100644 index 0000000..d73ddca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_blend_minmax_factor.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_blend_minmax_factor { + + /** + * Accepted by the &lt;mode&gt; parameter of BlendEquation and BlendEquationi, and by + * the &lt;modeRGB> and &lt;modeAlpha&gt; parameters of BlendEquationSeparate and + * BlendEquationSeparatei: + */ + int GL_FACTOR_MIN_AMD = 0x901C, + GL_FACTOR_MAX_AMD = 0x901D; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_conservative_depth.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_conservative_depth.java new file mode 100644 index 0000000..f7d461b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_conservative_depth.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_conservative_depth { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_debug_output.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_debug_output.java new file mode 100644 index 0000000..3c5e843 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_debug_output.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.Alias; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Alias(value = "AMDX_debug_output", postfix = "X") +public interface AMD_debug_output { + + /** Tokens accepted by GetIntegerv: */ + int GL_MAX_DEBUG_MESSAGE_LENGTH_AMD = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_AMD = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_AMD = 0x9145; + + /** + * Tokens accepted by DebugMessageEnableAMD, GetDebugMessageLogAMD, + * DebugMessageInsertAMD, and DEBUGPROCAMD callback function + * for &lt;severity&gt;: + */ + int GL_DEBUG_SEVERITY_HIGH_AMD = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_AMD = 0x9147, + GL_DEBUG_SEVERITY_LOW_AMD = 0x9148; + + /** + * Tokens accepted by DebugMessageEnableAMD, GetDebugMessageLogAMD, + * and DEBUGPROCAMD callback function for &lt;category&gt;: + */ + int GL_DEBUG_CATEGORY_API_ERROR_AMD = 0x9149, + GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD = 0x914A, + GL_DEBUG_CATEGORY_DEPRECATION_AMD = 0x914B, + GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD = 0x914C, + GL_DEBUG_CATEGORY_PERFORMANCE_AMD = 0x914D, + GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD = 0x914E, + GL_DEBUG_CATEGORY_APPLICATION_AMD = 0x914F, + GL_DEBUG_CATEGORY_OTHER_AMD = 0x9150; + + void glDebugMessageEnableAMD(@GLenum int category, @GLenum int severity, @AutoSize(value = "ids", canBeNull = true) @GLsizei int count, @Check(canBeNull = true) @Const @GLuint IntBuffer ids, boolean enabled); + + void glDebugMessageInsertAMD(@GLenum int category, @GLenum int severity, @GLuint int id, @AutoSize("buf") @GLsizei int length, @Const @GLchar ByteBuffer buf); + + @Alternate("glDebugMessageInsertAMD") + void glDebugMessageInsertAMD(@GLenum int category, @GLenum int severity, @GLuint int id, @Constant("buf.length()") @GLsizei int length, CharSequence buf); + + /** + * The {@code AMDDebugOutputCallback.Handler} implementation passed to this method will be used for + * AMD_debug_output messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * + * @param callback the callback function to use + */ + @Code( + // Create a GlobalRef to the callback object and register it with the current context. + javaBeforeNative = "\t\tlong userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler());\n" + + "\t\tCallbackUtil.registerContextCallbackAMD(userParam);" + ) + void glDebugMessageCallbackAMD(@PointerWrapper(value = "GLDEBUGPROCAMD", canBeNull = true) AMDDebugOutputCallback callback, + @Constant("userParam") @PointerWrapper("GLvoid *") long userParam); + + @GLuint + int glGetDebugMessageLogAMD(@GLuint int count, + @AutoSize(value = "messageLog", canBeNull = true) @GLsizei int logSize, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer categories, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer severities, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer ids, + @Check(value = "count", canBeNull = true) @GLsizei IntBuffer lengths, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer messageLog); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_depth_clamp_separate.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_depth_clamp_separate.java new file mode 100644 index 0000000..b806795 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_depth_clamp_separate.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_depth_clamp_separate { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_DEPTH_CLAMP_NEAR_AMD = 0x901E, + GL_DEPTH_CLAMP_FAR_AMD = 0x901F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_draw_buffers_blend.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_draw_buffers_blend.java new file mode 100644 index 0000000..7c7ace9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_draw_buffers_blend.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface AMD_draw_buffers_blend { + + void glBlendFuncIndexedAMD(@GLuint int buf, @GLenum int src, @GLenum int dst); + + void glBlendFuncSeparateIndexedAMD(@GLuint int buf, @GLenum int srcRGB, @GLenum int dstRGB, + @GLenum int srcAlpha, @GLenum int dstAlpha); + + void glBlendEquationIndexedAMD(@GLuint int buf, @GLenum int mode); + + void glBlendEquationSeparateIndexedAMD(@GLuint int buf, @GLenum int modeRGB, + @GLenum int modeAlpha); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_interleaved_elements.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_interleaved_elements.java new file mode 100644 index 0000000..456060c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_interleaved_elements.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface AMD_interleaved_elements { + + /** + * Accepted by the &lt;pname&gt; parameter of VertexAttribParameteriAMD and + * GetVertexAttrib{iv|dv|fv|Iiv|Iuiv|Ldv}: + */ + int GL_VERTEX_ELEMENT_SWIZZLE_AMD = 0x91A4; + + /** Selected by the &lt;pname&gt; parameter of ProgramParameteri and GetProgramiv: */ + int GL_VERTEX_ID_SWIZZLE_AMD = 0x91A5; + + void glVertexAttribParameteriAMD(@GLuint int index, @GLenum int pname, int param); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_multi_draw_indirect.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_multi_draw_indirect.java new file mode 100644 index 0000000..d641939 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_multi_draw_indirect.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface AMD_multi_draw_indirect { + + void glMultiDrawArraysIndirectAMD(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Alternate("glMultiDrawArraysIndirectAMD") + void glMultiDrawArraysIndirectAMD(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + void glMultiDrawElementsIndirectAMD(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Alternate("glMultiDrawElementsIndirectAMD") + void glMultiDrawElementsIndirectAMD(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_name_gen_delete.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_name_gen_delete.java new file mode 100644 index 0000000..6c4158c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_name_gen_delete.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface AMD_name_gen_delete { + + /** Accepted as the &lt;identifier&gt; parameter of GenNamesAMD and DeleteNamesAMD: */ + int GL_DATA_BUFFER_AMD = 0x9151, + GL_PERFORMANCE_MONITOR_AMD = 0x9152, + GL_QUERY_OBJECT_AMD = 0x9153, + GL_VERTEX_ARRAY_OBJECT_AMD = 0x9154, + GL_SAMPLER_OBJECT_AMD = 0x9155; + + void glGenNamesAMD(@GLenum int identifier, @AutoSize("names") @GLuint int num, @OutParameter @GLuint IntBuffer names); + + @Alternate("glGenNamesAMD") + @GLreturn("names") + void glGenNamesAMD2(@GLenum int identifier, @Constant("1") @GLsizei int num, @OutParameter @GLuint IntBuffer names); + + void glDeleteNamesAMD(@GLenum int identifier, @AutoSize("names") @GLsizei int num, @Const @GLuint IntBuffer names); + + @Alternate("glDeleteNamesAMD") + void glDeleteNamesAMD(@GLenum int identifier, @Constant("1") @GLsizei int num, @Constant(value = "APIUtil.getInt(caps, name)", keepParam = true) int name); + + boolean glIsNameAMD(@GLenum int identifier, @GLuint int name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_performance_monitor.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_performance_monitor.java new file mode 100644 index 0000000..7f31231 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_performance_monitor.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface AMD_performance_monitor { + + /** Accepted by the &lt;pame&gt; parameter of GetPerfMonitorCounterInfoAMD */ + int GL_COUNTER_TYPE_AMD = 0x8BC0, + GL_COUNTER_RANGE_AMD = 0x8BC1; + + /** + * Returned as a valid value in &lt;data&gt; parameter of + * GetPerfMonitorCounterInfoAMD if &lt;pname&gt; = COUNTER_TYPE_AMD + */ + int GL_UNSIGNED_INT64_AMD = 0x8BC2, + GL_PERCENTAGE_AMD = 0x8BC3; + + /** Accepted by the &lt;pname&gt; parameter of GetPerfMonitorCounterDataAMD */ + int GL_PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4, + GL_PERFMON_RESULT_SIZE_AMD = 0x8BC5, + GL_PERFMON_RESULT_AMD = 0x8BC6; + + void glGetPerfMonitorGroupsAMD(@OutParameter @Check(value = "1", canBeNull = true) @GLint IntBuffer numGroups, + @AutoSize("groups") @GLsizei int groupsSize, @GLuint IntBuffer groups); + + void glGetPerfMonitorCountersAMD(@GLuint int group, + @OutParameter @Check(value = "1") @GLint IntBuffer numCounters, + @OutParameter @Check(value = "1") @GLint IntBuffer maxActiveCounters, + @AutoSize(value = "counters", canBeNull = true) @GLsizei int countersSize, + @Check(canBeNull = true) @GLuint IntBuffer counters); + + void glGetPerfMonitorGroupStringAMD(@GLuint int group, + @AutoSize(value = "groupString", canBeNull = true) @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer groupString); + + @Alternate("glGetPerfMonitorGroupStringAMD") + @GLreturn(value = "groupString", maxLength = "bufSize") + void glGetPerfMonitorGroupStringAMD2(@GLuint int group, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(groupString_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer groupString); + + void glGetPerfMonitorCounterStringAMD(@GLuint int group, @GLuint int counter, @AutoSize(value = "counterString", canBeNull = true) @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer counterString); + + @Alternate("glGetPerfMonitorCounterStringAMD") + @GLreturn(value = "counterString", maxLength = "bufSize") + void glGetPerfMonitorCounterStringAMD2(@GLuint int group, @GLuint int counter, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(counterString_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer counterString); + + void glGetPerfMonitorCounterInfoAMD(@GLuint int group, @GLuint int counter, @GLenum int pname, @Check(value = "16") @GLvoid ByteBuffer data); + + void glGenPerfMonitorsAMD(@AutoSize("monitors") @GLsizei int n, @OutParameter @GLuint IntBuffer monitors); + + @Alternate("glGenPerfMonitorsAMD") + @GLreturn("monitors") + void glGenPerfMonitorsAMD2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer monitors); + + void glDeletePerfMonitorsAMD(@AutoSize("monitors") @GLsizei int n, @GLuint IntBuffer monitors); + + @Alternate("glDeletePerfMonitorsAMD") + void glDeletePerfMonitorsAMD(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, monitor)", keepParam = true) int monitor); + + void glSelectPerfMonitorCountersAMD(@GLuint int monitor, boolean enable, @GLuint int group, @AutoSize("counterList") int numCounters, @GLuint IntBuffer counterList); + + @Alternate("glSelectPerfMonitorCountersAMD") + void glSelectPerfMonitorCountersAMD(@GLuint int monitor, boolean enable, @GLuint int group, @Constant("1") int numCounters, @Constant(value = "APIUtil.getInt(caps, counter)", keepParam = true) int counter); + + void glBeginPerfMonitorAMD(@GLuint int monitor); + + void glEndPerfMonitorAMD(@GLuint int monitor); + + void glGetPerfMonitorCounterDataAMD(@GLuint int monitor, @GLenum int pname, @AutoSize("data") @GLsizei int dataSize, + @OutParameter @GLuint IntBuffer data, + @OutParameter @GLint @Check(value = "1", canBeNull = true) IntBuffer bytesWritten); + + @Alternate("glGetPerfMonitorCounterDataAMD") + @GLreturn("data") + void glGetPerfMonitorCounterDataAMD2(@GLuint int monitor, @GLenum int pname, @Constant("4") @GLsizei int dataSize, + @OutParameter @GLuint IntBuffer data, + @OutParameter @GLint @Constant("0L") IntBuffer bytesWritten); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_pinned_memory.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_pinned_memory.java new file mode 100644 index 0000000..2aa7d8a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_pinned_memory.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_pinned_memory { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, GetBufferPointerv, MapBufferRange: + */ + int GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD = 0x9160; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_query_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_query_buffer_object.java new file mode 100644 index 0000000..00bd209 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_query_buffer_object.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_query_buffer_object { + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + int GL_QUERY_RESULT_NO_WAIT_AMD = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv + * and GetBufferPointerv: + */ + int GL_QUERY_BUFFER_AMD = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_QUERY_BUFFER_BINDING_AMD = 0x9193; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sample_positions.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sample_positions.java new file mode 100644 index 0000000..b3447e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sample_positions.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.FloatBuffer; + +public interface AMD_sample_positions { + + /** Accepted by the &lt;pname&gt; parameter of GetFloatv: */ + int GL_SUBSAMPLE_DISTANCE_AMD = 0x883F; + + @StripPostfix("val") + void glSetMultisamplefvAMD(@GLenum int pname, @GLuint int index, @Check("2") @Const FloatBuffer val); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_seamless_cubemap_per_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_seamless_cubemap_per_texture.java new file mode 100644 index 0000000..f0ce360 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_seamless_cubemap_per_texture.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_seamless_cubemap_per_texture { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_CUBE_MAP_SEAMLESS = ARB_seamless_cube_map.GL_TEXTURE_CUBE_MAP_SEAMLESS; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_atomic_counter_ops.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_atomic_counter_ops.java new file mode 100644 index 0000000..88f225b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_atomic_counter_ops.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_shader_atomic_counter_ops { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_stencil_export.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_stencil_export.java new file mode 100644 index 0000000..c7824fa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_stencil_export.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_shader_stencil_export { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_trinary_minmax.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_trinary_minmax.java new file mode 100644 index 0000000..0dae3dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_shader_trinary_minmax.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_shader_trinary_minmax { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sparse_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sparse_texture.java new file mode 100644 index 0000000..767da31 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_sparse_texture.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface AMD_sparse_texture { + + /** Accepted by the &lt;flags&gt; parameter to TexStorageSparseAMD and TextureStorageSparseAMD: */ + int GL_TEXTURE_STORAGE_SPARSE_BIT_AMD = 0x00000001; + + /** Accepted by the &lt;pname&gt; parameter to GetInternalformativ: */ + int GL_VIRTUAL_PAGE_SIZE_X_AMD = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_AMD = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_AMD = 0x9197; + + /** + * Accepted by the &lt;pname&gt; parameter to GetIntegerv, GetFloatv, GetDoublev, + * GetInteger64v, and GetBooleanv: + */ + int GL_MAX_SPARSE_TEXTURE_SIZE_AMD = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS = 0x919A; + + /** Accepted by the &lt;pname&gt; parameter of GetTexParameter{if}v: */ + int GL_MIN_SPARSE_LEVEL_AMD = 0x919B; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter{if}{v} and + * GetTexParameter{if}v: + */ + int GL_MIN_LOD_WARNING_AMD = 0x919C; + + void glTexStorageSparseAMD(@GLenum int target, + @GLenum int internalFormat, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + @GLsizei int layers, + @GLbitfield int flags); + + void glTextureStorageSparseAMD(@GLuint int texture, + @GLenum int target, + @GLenum int internalFormat, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + @GLsizei int layers, + @GLbitfield int flags); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_stencil_operation_extended.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_stencil_operation_extended.java new file mode 100644 index 0000000..b248d36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_stencil_operation_extended.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface AMD_stencil_operation_extended { + + /** + * Accepted by the &lt;sfail&gt;, &lt;dpfail&gt; and &lt;dppass&gt; parameters of StencilOp + * and StencilOpSeparate: + */ + int GL_SET_AMD = 0x874A, + GL_AND = 0x1501, + GL_XOR = 0x1506, + GL_OR = 0x1507, + GL_NOR = 0x1508, + GL_EQUIV = 0x1509, + GL_NAND = 0x150E, + GL_REPLACE_VALUE_AMD = 0x874B; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerv, GetFloatv, GetBooleanv + * GetDoublev and GetInteger64v: + */ + int GL_STENCIL_OP_VALUE_AMD = 0x874C, + GL_STENCIL_BACK_OP_VALUE_AMD = 0x874D; + + void glStencilOpValueAMD(@GLenum int face, @GLuint int value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_texture_texture4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_texture_texture4.java new file mode 100644 index 0000000..5958ace --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_texture_texture4.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_texture_texture4 { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_transform_feedback3_lines_triangles.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_transform_feedback3_lines_triangles.java new file mode 100644 index 0000000..71bb1be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_transform_feedback3_lines_triangles.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_transform_feedback3_lines_triangles { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_layer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_layer.java new file mode 100644 index 0000000..80d867c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_layer.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_vertex_shader_layer { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_tessellator.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_tessellator.java new file mode 100644 index 0000000..7427a4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_tessellator.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface AMD_vertex_shader_tessellator { + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_BUFFER_AMD = 0x9001; + int GL_INT_SAMPLER_BUFFER_AMD = 0x9002; + int GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD = 0x9003; + + /** Accepted by TessellationModeAMD */ + int GL_DISCRETE_AMD = 0x9006; + int GL_CONTINUOUS_AMD = 0x9007; + + /** Accepted by GetIntegerv */ + int GL_TESSELLATION_MODE_AMD = 0x9004; + + /** Accepted by GetFloatv */ + int GL_TESSELLATION_FACTOR_AMD = 0x9005; + + void glTessellationFactorAMD(float factor); + + void glTessellationModeAMD(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_viewport_index.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_viewport_index.java new file mode 100644 index 0000000..1e8d3fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/AMD_vertex_shader_viewport_index.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface AMD_vertex_shader_viewport_index { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_aux_depth_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_aux_depth_stencil.java new file mode 100644 index 0000000..bfc1d9a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_aux_depth_stencil.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_aux_depth_stencil { + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv. */ + int GL_AUX_DEPTH_STENCIL_APPLE = 0x8A14; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_client_storage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_client_storage.java new file mode 100644 index 0000000..c911ba8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_client_storage.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_client_storage { + + /** Accepted by the &lt;pname&gt; parameters of PixelStore: */ + int GL_UNPACK_CLIENT_STORAGE_APPLE = 0x85B2; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_element_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_element_array.java new file mode 100644 index 0000000..e2a0049 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_element_array.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.IntBuffer; + +public interface APPLE_element_array { + + /** + * Accepted by the &lt;array&gt; parameter of EnableClientState and + * DisableClientState and the &lt;value&gt; parameter of IsEnabled: + */ + int GL_ELEMENT_ARRAY_APPLE = 0x8768; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_ELEMENT_ARRAY_TYPE_APPLE = 0x8769; + + /** Accepted by the &lt;pname&gt; parameter of GetPointerv: */ + int GL_ELEMENT_ARRAY_POINTER_APPLE = 0x876A; + + void glElementPointerAPPLE(@AutoType("pointer") @GLenum int type, + @Check + @Const + @GLubyte + @GLushort + @GLuint Buffer pointer); + + void glDrawElementArrayAPPLE(@GLenum int mode, int first, @GLsizei int count); + + void glDrawRangeElementArrayAPPLE(@GLenum int mode, @GLuint int start, @GLuint int end, int first, @GLsizei int count); + + void glMultiDrawElementArrayAPPLE(@GLenum int mode, + @Const IntBuffer first, + @Const @Check("first.remaining()") @GLsizei IntBuffer count, + @AutoSize("first") @GLsizei int primcount); + + void glMultiDrawRangeElementArrayAPPLE(@GLenum int mode, @GLuint int start, @GLuint int end, + @Const IntBuffer first, + @Const @Check("first.remaining()") @GLsizei IntBuffer count, + @AutoSize("first") @GLsizei int primcount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_fence.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_fence.java new file mode 100644 index 0000000..f4914b8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_fence.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface APPLE_fence { + + /** Accepted by the &lt;object&gt; parameter of TestObjectAPPLE and FinishObjectAPPLE: */ + int GL_DRAW_PIXELS_APPLE = 0x8A0A; + int GL_FENCE_APPLE = 0x8A0B; + + void glGenFencesAPPLE(@AutoSize("fences") @GLsizei int n, @OutParameter @GLuint IntBuffer fences); + + @Alternate("glGenFencesAPPLE") + @GLreturn("fences") + void glGenFencesAPPLE2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer fences); + + void glDeleteFencesAPPLE(@AutoSize("fences") @GLsizei int n, @Const @GLuint IntBuffer fences); + + @Alternate("glDeleteFencesAPPLE") + void glDeleteFencesAPPLE(@Constant("1") @GLsizei int n, @Const @GLuint @Constant(value = "APIUtil.getInt(caps, fence)", keepParam = true) int fence); + + void glSetFenceAPPLE(@GLuint int fence); + + boolean glIsFenceAPPLE(@GLuint int fence); + + boolean glTestFenceAPPLE(@GLuint int fence); + + void glFinishFenceAPPLE(@GLuint int fence); + + boolean glTestObjectAPPLE(@GLenum int object, @GLuint int name); + + void glFinishObjectAPPLE(@GLenum int object, int name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_float_pixels.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_float_pixels.java new file mode 100644 index 0000000..7332173 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_float_pixels.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_float_pixels { + + /** + * Accepted by the parameters of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + int GL_HALF_APPLE = 0x140B; + + /** Accepted by the GetBooleanv: */ + int GL_COLOR_FLOAT_APPLE = 0x8A0F; + + /** + * Accepted by the parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA_FLOAT32_APPLE = 0x8814; + int GL_RGB_FLOAT32_APPLE = 0x8815; + int GL_ALPHA_FLOAT32_APPLE = 0x8816; + int GL_INTENSITY_FLOAT32_APPLE = 0x8817; + int GL_LUMINANCE_FLOAT32_APPLE = 0x8818; + int GL_LUMINANCE_ALPHA_FLOAT32_APPLE = 0x8819; + int GL_RGBA_FLOAT16_APPLE = 0x881A; + int GL_RGB_FLOAT16_APPLE = 0x881B; + int GL_ALPHA_FLOAT16_APPLE = 0x881C; + int GL_INTENSITY_FLOAT16_APPLE = 0x881D; + int GL_LUMINANCE_FLOAT16_APPLE = 0x881E; + int GL_LUMINANCE_ALPHA_FLOAT16_APPLE = 0x881F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_flush_buffer_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_flush_buffer_range.java new file mode 100644 index 0000000..23c902e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_flush_buffer_range.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLsizeiptr; + +public interface APPLE_flush_buffer_range { + + /** + * Accepted by the &lt;pname&gt; parameter of BufferParameteriAPPLE and + * GetBufferParameteriv: + */ + int GL_BUFFER_SERIALIZED_MODIFY_APPLE = 0x8A12; + int GL_BUFFER_FLUSHING_UNMAP_APPLE = 0x8A13; + + void glBufferParameteriAPPLE(@GLenum int target, @GLenum int pname, int param); + + void glFlushMappedBufferRangeAPPLE(@GLenum int target, @GLintptr long offset, @GLsizeiptr long size); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_object_purgeable.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_object_purgeable.java new file mode 100644 index 0000000..438c972 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_object_purgeable.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface APPLE_object_purgeable { + + /** + * Accepted by the &lt;option&gt; parameter of ObjectPurgeable, and returned + * by ObjectPurgeable: + */ + int GL_RELEASED_APPLE = 0x8A19; + int GL_VOLATILE_APPLE = 0x8A1A; + + /** + * Accepted by the &lt;option&gt; parameters of ObjectUnpurgeable, and + * returned by ObjectUnpurgeable: + */ + int GL_RETAINED_APPLE = 0x8A1B; + int GL_UNDEFINED_APPLE = 0x8A1C; + + /** Accepted by the &lt;pname&gt; parameters of GetObjectParameteriv: */ + int GL_PURGEABLE_APPLE = 0x8A1D; + + /** + * Accepted by the &lt;objectType&gt; parameters of ObjectPurgeableAPPLE, + * ObjectUnpurgeableAPPLE and GetObjectParameteriv: + */ + int GL_BUFFER_OBJECT_APPLE = 0x85B3; + + @GLenum + int glObjectPurgeableAPPLE(@GLenum int objectType, @GLuint int name, @GLenum int option); + + @GLenum + int glObjectUnpurgeableAPPLE(@GLenum int objectType, @GLuint int name, @GLenum int option); + + @StripPostfix("params") + void glGetObjectParameterivAPPLE(@GLenum int objectType, @GLuint int name, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetObjectParameterivAPPLE") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetObjectParameterivAPPLE2(@GLenum int objectType, @GLuint int name, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_packed_pixels.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_packed_pixels.java new file mode 100644 index 0000000..3a5470c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_packed_pixels.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_packed_pixels { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, SeparableFilter3D, + * GetSeparableFilter, ColorTable, GetColorTable, TexImage4DSGIS, + * and TexSubImage4DSGIS: + */ + int GL_UNSIGNED_BYTE_3_3_2 = 0x8032; + int GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362; + int GL_UNSIGNED_SHORT_5_6_5 = 0x8363; + int GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364; + int GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033; + int GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365; + int GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034; + int GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366; + int GL_UNSIGNED_INT_8_8_8_8 = 0x8035; + int GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367; + int GL_UNSIGNED_INT_10_10_10_2 = 0x8036; + int GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_rgb_422.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_rgb_422.java new file mode 100644 index 0000000..1ad5fe6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_rgb_422.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_rgb_422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + int GL_RGB_422_APPLE = 0x8A1F; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA; + int GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_row_bytes.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_row_bytes.java new file mode 100644 index 0000000..d191b16 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_row_bytes.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_row_bytes { + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStorei and the &lt;pname&gt; + * parameter of GetIntegerv: + */ + int GL_PACK_ROW_BYTES_APPLE = 0x8A15; + int GL_UNPACK_ROW_BYTES_APPLE = 0x8A16; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_texture_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_texture_range.java new file mode 100644 index 0000000..5f22462 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_texture_range.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public interface APPLE_texture_range { + + /** + * Accepted by the <pname> parameters of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and + * GetTexParameterfv: + */ + int GL_TEXTURE_STORAGE_HINT_APPLE = 0x85BC; + + /** + * Accepted by the <param> parameters of TexParameteri, TexParameterf, + * TexParameteriv, and TexParameterfv: + */ + int GL_STORAGE_PRIVATE_APPLE = 0x85BD; + int GL_STORAGE_CACHED_APPLE = 0x85BE; + int GL_STORAGE_SHARED_APPLE = 0x85BF; + + /** + * Accepted by the <pname> parameters of GetTexParameteriv and + * GetTexParameterfv: + */ + int GL_TEXTURE_RANGE_LENGTH_APPLE = 0x85B7; + + /** Accepted by the <pname> parameters of GetTexParameterPointerv: */ + int GL_TEXTURE_RANGE_POINTER_APPLE = 0x85B8; + + void glTextureRangeAPPLE(@GLenum int target, @AutoSize("pointer") @GLsizei int length, @GLvoid ByteBuffer pointer); + + void glGetTexParameterPointervAPPLE(@GLenum int target, @GLenum int pname, @Result @GLvoid Buffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_object.java new file mode 100644 index 0000000..d1cd1c7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_object.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface APPLE_vertex_array_object { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_VERTEX_ARRAY_BINDING_APPLE = 0x85B5; + + void glBindVertexArrayAPPLE(@GLuint int array); + + void glDeleteVertexArraysAPPLE(@AutoSize("arrays") @GLsizei int n, @Const @GLuint IntBuffer arrays); + + @Alternate("glDeleteVertexArraysAPPLE") + void glDeleteVertexArraysAPPLE(@Constant("1") @GLsizei int n, @Const @GLuint @Constant(value = "APIUtil.getInt(caps, array)", keepParam = true) int array); + + void glGenVertexArraysAPPLE(@AutoSize("arrays") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Alternate("glGenVertexArraysAPPLE") + @GLreturn("arrays") + void glGenVertexArraysAPPLE2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + boolean glIsVertexArrayAPPLE(@GLuint int array); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_range.java new file mode 100644 index 0000000..37503eb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_array_range.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; + +public interface APPLE_vertex_array_range { + + /** + * Accepted by the &lt;cap&gt; parameter of EnableClientState, DisableClientState, + * and IsEnabled: + */ + int GL_VERTEX_ARRAY_RANGE_APPLE = 0x851D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + + int GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE = 0x851E; + int GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE = 0x8520; + + /** Accepted by the &lt;pname&gt; parameter of GetPointerv: */ + + int GL_VERTEX_ARRAY_RANGE_POINTER_APPLE = 0x8521; + + /** + * Accepted by the &lt;pname&gt; parameter of VertexArrayParameteriAPPLE, + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + + int GL_VERTEX_ARRAY_STORAGE_HINT_APPLE = 0x851F; + + /** Accepted by the &lt;param&gt; parameter of VertexArrayParameteriAPPLE: */ + + int GL_STORAGE_CACHED_APPLE = 0x85BE; + int GL_STORAGE_SHARED_APPLE = 0x85BF; + + /** Accepted by the &lt;object&gt; parameter of TestObjectAPPLE and FinishObjectAPPLE: */ + int GL_DRAW_PIXELS_APPLE = 0x8A0A; + int GL_FENCE_APPLE = 0x8A0B; + + void glVertexArrayRangeAPPLE(@AutoSize("pointer") @GLsizei int length, @GLvoid ByteBuffer pointer); + + void glFlushVertexArrayRangeAPPLE(@AutoSize("pointer") @GLsizei int length, @GLvoid ByteBuffer pointer); + + void glVertexArrayParameteriAPPLE(@GLenum int pname, int param); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_program_evaluators.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_program_evaluators.java new file mode 100644 index 0000000..a330c2a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_vertex_program_evaluators.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; + +public interface APPLE_vertex_program_evaluators { + + /** + * Accepted by the &lt;pname&gt; parameter of EnableVertexAttribAPPLE, + * DisableVertexAttribAPPLE, and IsVertexAttribEnabledAPPLE. + */ + int GL_VERTEX_ATTRIB_MAP1_APPLE = 0x8A00; + int GL_VERTEX_ATTRIB_MAP2_APPLE = 0x8A01; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribdvARB, + * GetVertexAttribfvARB, and GetVertexAttribivARB. + */ + int GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE = 0x8A02; + int GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE = 0x8A03; + int GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE = 0x8A04; + int GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE = 0x8A05; + int GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE = 0x8A06; + int GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE = 0x8A07; + int GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE = 0x8A08; + int GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE = 0x8A09; + + void glEnableVertexAttribAPPLE(@GLuint int index, @GLenum int pname); + + void glDisableVertexAttribAPPLE(@GLuint int index, @GLenum int pname); + + boolean glIsVertexAttribEnabledAPPLE(@GLuint int index, @GLenum int pname); + + void glMapVertexAttrib1dAPPLE(@GLuint int index, @GLuint int size, double u1, double u2, + int stride, int order, @Check @Const DoubleBuffer points); + + void glMapVertexAttrib1fAPPLE(@GLuint int index, @GLuint int size, float u1, float u2, + int stride, int order, @Check @Const FloatBuffer points); + + void glMapVertexAttrib2dAPPLE(@GLuint int index, @GLuint int size, double u1, double u2, + int ustride, int uorder, double v1, double v2, int vstride, int vorder, + @Check @Const DoubleBuffer points); + + void glMapVertexAttrib2fAPPLE(@GLuint int index, @GLuint int size, float u1, float u2, + int ustride, int uorder, float v1, float v2, int vstride, int vorder, + @Check @Const FloatBuffer points); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_ycbcr_422.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_ycbcr_422.java new file mode 100644 index 0000000..0a3e880 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/APPLE_ycbcr_422.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface APPLE_ycbcr_422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, + * SeparableFilter2D, SeparableFilter3D, GetSeparableFilter, ColorTable, + * GetColorTable: + */ + int GL_YCBCR_422_APPLE = 0x85B9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter, + * SeparableFilter2D, SeparableFilter3D, GetSeparableFilter, ColorTable, + * GetColorTable: + */ + int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA; + int GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES2_compatibility.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES2_compatibility.java new file mode 100644 index 0000000..f89e891 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES2_compatibility.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface ARB_ES2_compatibility { + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_SHADER_COMPILER = 0x8DFA, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Accepted by the &lt;type&gt; parameter of VertexAttribPointer: */ + int GL_FIXED = 0x140C; + + /** + * Accepted by the &lt;precisiontype&gt; parameter of + * GetShaderPrecisionFormat: + */ + int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Accepted by the &lt;format&gt; parameter of most commands taking sized internal formats: */ + int GL_RGB565 = 0x8D62; + + @Reuse("GL41") + void glReleaseShaderCompiler(); + + @Reuse("GL41") + void glShaderBinary(@AutoSize("shaders") @GLsizei int count, @Const @GLuint IntBuffer shaders, + @GLenum int binaryformat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + @Reuse("GL41") + void glGetShaderPrecisionFormat(@GLenum int shadertype, @GLenum int precisiontype, + @OutParameter @Check("2") IntBuffer range, + @OutParameter @Check("1") IntBuffer precision); + + @Reuse("GL41") + void glDepthRangef(@GLclampf float n, @GLclampf float f); + + @Reuse("GL41") + void glClearDepthf(@GLclampf float d); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES3_compatibility.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES3_compatibility.java new file mode 100644 index 0000000..b7f7465 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_ES3_compatibility.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_ES3_compatibility { + + /** Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D */ + int GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** Accepted by the &lt;target&gt; parameter of Enable and Disable: */ + int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * GetQueryIndexediv and GetQueryiv: + */ + int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** Accepted by the &lt;value&gt; parameter of the GetInteger* functions: */ + int GL_MAX_ELEMENT_INDEX = 0x8D6B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_arrays_of_arrays.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_arrays_of_arrays.java new file mode 100644 index 0000000..9643a23 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_arrays_of_arrays.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_arrays_of_arrays { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_base_instance.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_base_instance.java new file mode 100644 index 0000000..1e2f84c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_base_instance.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface ARB_base_instance { + + @Reuse("GL42") + void glDrawArraysInstancedBaseInstance(@GLenum int mode, + int first, + @GLsizei int count, + @GLsizei int primcount, + @GLuint int baseinstance); + + @Reuse("GL42") + void glDrawElementsInstancedBaseInstance(@GLenum int mode, + @AutoSize("indices") @GLsizei int count, + @AutoType("indices") @GLenum int type, + @Const + @BufferObject(BufferKind.ElementVBO) + @GLubyte + @GLushort + @GLuint Buffer indices, + @GLsizei int primcount, + @GLuint int baseinstance); + + @Reuse("GL42") + void glDrawElementsInstancedBaseVertexBaseInstance(@GLenum int mode, + @AutoSize("indices") @GLsizei int count, + @AutoType("indices") @GLenum int type, + @Const + @BufferObject(BufferKind.ElementVBO) + @GLubyte + @GLushort + @GLuint Buffer indices, + @GLsizei int primcount, + int basevertex, + @GLuint int baseinstance); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_bindless_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_bindless_texture.java new file mode 100644 index 0000000..030976e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_bindless_texture.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.LongBuffer; + +public interface ARB_bindless_texture { + + /** Accepted by the &lt;type&gt; parameter of VertexAttribLPointer: */ + int GL_UNSIGNED_INT64_ARB = 0x140F; + + @GLuint64 + long glGetTextureHandleARB(@GLuint int texture); + + @GLuint64 + long glGetTextureSamplerHandleARB(@GLuint int texture, @GLuint int sampler); + + void glMakeTextureHandleResidentARB(@GLuint64 long handle); + + void glMakeTextureHandleNonResidentARB(@GLuint64 long handle); + + @GLuint64 + long glGetImageHandleARB(@GLuint int texture, int level, boolean layered, int layer, @GLenum int format); + + void glMakeImageHandleResidentARB(@GLuint64 long handle, @GLenum int access); + + void glMakeImageHandleNonResidentARB(@GLuint64 long handle); + + void glUniformHandleui64ARB(int location, @GLuint64 long value); + + @StripPostfix("value") + void glUniformHandleui64vARB(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64 LongBuffer value); + + void glProgramUniformHandleui64ARB(@GLuint int program, int location, @GLuint64 long value); + + @StripPostfix("values") + void glProgramUniformHandleui64vARB(@GLuint int program, int location, @AutoSize("values") @GLsizei int count, @Const @GLuint64 LongBuffer values); + + boolean glIsTextureHandleResidentARB(@GLuint64 long handle); + + boolean glIsImageHandleResidentARB(@GLuint64 long handle); + + void glVertexAttribL1ui64ARB(@GLuint int index, @GLuint64EXT long x); + + @StripPostfix("v") + void glVertexAttribL1ui64vARB(@GLuint int index, @Check("1") @Const @GLuint64EXT LongBuffer v); + + @StripPostfix("params") + void glGetVertexAttribLui64vARB(@GLuint int index, @GLenum int pname, @Check("4") @GLuint64EXT LongBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_blend_func_extended.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_blend_func_extended.java new file mode 100644 index 0000000..938913f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_blend_func_extended.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.ByteBuffer; + +public interface ARB_blend_func_extended { + + /** + * Accepted by the &lt;src&gt; and &lt;dst&gt; parameters of BlendFunc and + * BlendFunci, and by the &lt;srcRGB&gt;, &lt;dstRGB&gt;, &lt;srcAlpha&gt; and &lt;dstAlpha&gt; + * parameters of BlendFuncSeparate and BlendFuncSeparatei: + */ + int GL_SRC1_COLOR = 0x88F9; + int GL_SRC1_ALPHA = GL15.GL_SRC1_ALPHA; + int GL_ONE_MINUS_SRC1_COLOR = 0x88FA; + int GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + @Reuse("GL33") + void glBindFragDataLocationIndexed(@GLuint int program, @GLuint int colorNumber, @GLuint int index, @NullTerminated @Const @GLchar ByteBuffer name); + + @Reuse("GL33") + @Alternate("glBindFragDataLocationIndexed") + void glBindFragDataLocationIndexed(@GLuint int program, @GLuint int colorNumber, @GLuint int index, @NullTerminated CharSequence name); + + @Reuse("GL33") + int glGetFragDataIndex(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Reuse("GL33") + @Alternate("glGetFragDataIndex") + int glGetFragDataIndex(@GLuint int program, @NullTerminated CharSequence name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_object.java new file mode 100644 index 0000000..4087a8c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_object.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "ARB", isFinal = false) +public interface ARB_buffer_object { + + /** Accepted by the &lt;usage&gt; parameter of BufferDataARB: */ + int GL_STREAM_DRAW_ARB = 0x88E0; + int GL_STREAM_READ_ARB = 0x88E1; + int GL_STREAM_COPY_ARB = 0x88E2; + int GL_STATIC_DRAW_ARB = 0x88E4; + int GL_STATIC_READ_ARB = 0x88E5; + int GL_STATIC_COPY_ARB = 0x88E6; + int GL_DYNAMIC_DRAW_ARB = 0x88E8; + int GL_DYNAMIC_READ_ARB = 0x88E9; + int GL_DYNAMIC_COPY_ARB = 0x88EA; + + /** Accepted by the &lt;access&gt; parameter of MapBufferARB: */ + int GL_READ_ONLY_ARB = 0x88B8; + int GL_WRITE_ONLY_ARB = 0x88B9; + int GL_READ_WRITE_ARB = 0x88BA; + + /** Accepted by the &lt;pname&gt; parameter of GetBufferParameterivARB: */ + int GL_BUFFER_SIZE_ARB = 0x8764; + int GL_BUFFER_USAGE_ARB = 0x8765; + int GL_BUFFER_ACCESS_ARB = 0x88BB; + int GL_BUFFER_MAPPED_ARB = 0x88BC; + int GL_BUFFER_MAP_POINTER_ARB = 0x88BD; + + @Code(" StateTracker.bindBuffer(caps, target, buffer);") + void glBindBufferARB(@GLenum int target, @GLuint int buffer); + + void glDeleteBuffersARB(@AutoSize("buffers") @GLsizei int n, @Const @GLuint IntBuffer buffers); + + @Alternate("glDeleteBuffersARB") + void glDeleteBuffersARB(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, buffer)", keepParam = true) int buffer); + + void glGenBuffersARB(@AutoSize("buffers") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + @Alternate("glGenBuffersARB") + @GLreturn("buffers") + void glGenBuffersARB2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + boolean glIsBufferARB(@GLuint int buffer); + + @GenerateAutos + void glBufferDataARB(@GLenum int target, @AutoSize("data") @GLsizeiptrARB long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data, @GLenum int usage); + + void glBufferSubDataARB(@GLenum int target, @GLintptrARB long offset, @AutoSize("data") @GLsizeiptrARB long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + void glGetBufferSubDataARB(@GLenum int target, @GLintptrARB long offset, @AutoSize("data") @GLsizeiptrARB long size, + @OutParameter + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + /** + * glMapBufferARB maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferARB like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferARB(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferARB(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameterARB internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult + @GLvoid + @AutoSize("GLChecks.getBufferObjectSizeARB(caps, target)") + ByteBuffer glMapBufferARB(@GLenum int target, @GLenum int access); + + boolean glUnmapBufferARB(@GLenum int target); + + @StripPostfix("params") + void glGetBufferParameterivARB(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteriARB} instead. */ + @Alternate("glGetBufferParameterivARB") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "ARBBufferObject", method = "glGetBufferParameteriARB") + @Deprecated + void glGetBufferParameterivARB2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetBufferParameterivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameterivARB3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("pointer") + @AutoSize("GLChecks.getBufferObjectSizeARB(caps, target)") + void glGetBufferPointervARB(@GLenum int target, @GLenum int pname, @Result @GLvoid ByteBuffer pointer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_storage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_storage.java new file mode 100644 index 0000000..38b04d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_buffer_storage.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +@Dependent +public interface ARB_buffer_storage { + + /** + * Accepted in the &lt;flags&gt; parameter of BufferStorage and + * NamedBufferStorageEXT: + */ + int GL_MAP_PERSISTENT_BIT = 0x0040, + GL_MAP_COHERENT_BIT = 0x0080, + GL_DYNAMIC_STORAGE_BIT = 0x0100, + GL_CLIENT_STORAGE_BIT = 0x0200; + + /** Accepted by the &lt;pname&gt; parameter of GetBufferParameter{i|i64}v:\ */ + + int GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: */ + int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x00004000; + + @Reuse("GL44") + void glBufferStorage(@GLenum int target, + @AutoSize("data") @GLsizeiptr long size, + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data, + @GLbitfield int flags); + + @Reuse("GL44") + @Alternate("glBufferStorage") + void glBufferStorage2(@GLenum int target, + @GLsizeiptr long size, + @Constant("0L") @Const Buffer data, + @GLbitfield int flags); + + @Dependent("GL_EXT_direct_state_access") + void glNamedBufferStorageEXT(@GLuint int buffer, + @AutoSize("data") @GLsizeiptr long size, + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data, + @GLbitfield int flags); + + @Dependent("GL_EXT_direct_state_access") + @Alternate("glNamedBufferStorageEXT") + void glNamedBufferStorageEXT2(@GLuint int buffer, + @GLsizeiptr long size, + @Constant("0L") @Const Buffer data, + @GLbitfield int flags); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_cl_event.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_cl_event.java new file mode 100644 index 0000000..8b5398d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_cl_event.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.opencl.CLContext; +import org.lwjgl.opencl.CLEvent; +import org.lwjgl.util.generator.Extension; +import org.lwjgl.util.generator.Imports; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opengl.GLbitfield; + +@Imports("org.lwjgl.opencl.*") +@Extension(postfix = "ARB", className = "ARBCLEvent") +public interface ARB_cl_event { + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE. */ + int GL_SYNC_CL_EVENT_ARB = 0x8240; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION. */ + int GL_SYNC_CL_EVENT_COMPLETE_ARB = 0x8241; + + @PointerWrapper("GLsync") + GLSync glCreateSyncFromCLeventARB(@PointerWrapper("cl_context") CLContext context, @PointerWrapper("cl_event") CLEvent event, @GLbitfield int flags); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_buffer_object.java new file mode 100644 index 0000000..00ad077 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_buffer_object.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; + +@Dependent +public interface ARB_clear_buffer_object { + + @Reuse("GL43") + void glClearBufferData(@GLenum int target, + @GLenum int internalformat, + @GLenum int format, + @GLenum int type, + @Check("1") @Const @GLvoid ByteBuffer data); + + @Reuse("GL43") + void glClearBufferSubData(@GLenum int target, + @GLenum int internalformat, + @GLintptr long offset, + @AutoSize("data") @GLsizeiptr long size, + @GLenum int format, + @GLenum int type, + @Const @GLvoid ByteBuffer data); + + @Dependent("GL_EXT_direct_state_access") + void glClearNamedBufferDataEXT(@GLuint int buffer, + @GLenum int internalformat, + @GLenum int format, + @GLenum int type, + @Check("1") @Const @GLvoid ByteBuffer data); + + @Dependent("GL_EXT_direct_state_access") + void glClearNamedBufferSubDataEXT(@GLuint int buffer, + @GLenum int internalformat, + @GLintptr long offset, + @AutoSize("data") @GLsizeiptr long size, + @GLenum int format, + @GLenum int type, + @Const @GLvoid ByteBuffer data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_texture.java new file mode 100644 index 0000000..9715945 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_clear_texture.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface ARB_clear_texture { + + /** + * Accepted by the &lt;pname&gt; parameter for GetInternalformativ and + * GetInternalformati64v: + */ + int GL_CLEAR_TEXTURE = 0x9365; + + @Reuse("GL44") + void glClearTexImage(@GLuint int texture, int level, + @GLenum int format, @GLenum int type, + @Check(value = "1", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data); + + @Reuse("GL44") + void glClearTexSubImage(@GLuint int texture, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @GLenum int type, + @Check(value = "1", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_color_buffer_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_color_buffer_float.java new file mode 100644 index 0000000..5a11a19 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_color_buffer_float.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ARB_color_buffer_float { + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_RGBA_FLOAT_MODE_ARB = 0x8820; + + /** + * Accepted by the &lt;target&gt; parameter of ClampColorARB and the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + int GL_CLAMP_VERTEX_COLOR_ARB = 0x891A; + int GL_CLAMP_FRAGMENT_COLOR_ARB = 0x891B; + int GL_CLAMP_READ_COLOR_ARB = 0x891C; + + /** Accepted by the &lt;clamp&gt; parameter of ClampColorARB. */ + int GL_FIXED_ONLY_ARB = 0x891D; + + /** + * Accepted as a value in the &lt;piAttribIList&gt; and &lt;pfAttribFList&gt; + * parameter arrays of wglChoosePixelFormatARB, and returned in the + * &lt;piValues&gt; parameter array of wglGetPixelFormatAttribivARB, and the + * &lt;pfValues&gt; parameter array of wglGetPixelFormatAttribfvARB: + */ + int WGL_TYPE_RGBA_FLOAT_ARB = 0x21A0; + + /** + * Accepted as values of the &lt;render_type&gt; arguments in the + * glXCreateNewContext and glXCreateContext functions + */ + int GLX_RGBA_FLOAT_TYPE = 0x20B9; + + /** Accepted as a bit set in the GLX_RENDER_TYPE variable */ + int GLX_RGBA_FLOAT_BIT = 0x00000004; + + void glClampColorARB(@GLenum int target, @GLenum int clamp); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compatibility.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compatibility.java new file mode 100644 index 0000000..5d053e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compatibility.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_compatibility { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compressed_texture_pixel_storage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compressed_texture_pixel_storage.java new file mode 100644 index 0000000..3f1b68d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compressed_texture_pixel_storage.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_compressed_texture_pixel_storage { + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStore[fi], GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_shader.java new file mode 100644 index 0000000..6ed66b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_shader.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_compute_shader { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned in the + * &lt;params&gt; parameter by GetShaderiv: + */ + int GL_COMPUTE_SHADER = 0x91B9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + int GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + + int GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: */ + int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: */ + int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** Accepted by the &lt;stages&gt; parameter of UseProgramStages: */ + int GL_COMPUTE_SHADER_BIT = 0x00000020; + + @Reuse("GL43") + void glDispatchCompute(@GLuint int num_groups_x, + @GLuint int num_groups_y, + @GLuint int num_groups_z); + + @Reuse("GL43") + void glDispatchComputeIndirect(@GLintptr long indirect); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_variable_group_size.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_variable_group_size.java new file mode 100644 index 0000000..0bd6100 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_compute_variable_group_size.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_compute_variable_group_size { + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + int GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB = 0x9344, + GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB = 0x90EB; + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + int GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB = 0x9345, + GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB = 0x91BF; + + void glDispatchComputeGroupSizeARB(@GLuint int num_groups_x, @GLuint int num_groups_y, + @GLuint int num_groups_z, @GLuint int group_size_x, + @GLuint int group_size_y, @GLuint int group_size_z); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_conservative_depth.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_conservative_depth.java new file mode 100644 index 0000000..8ba78c5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_conservative_depth.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_conservative_depth { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_buffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_buffer.java new file mode 100644 index 0000000..d36b4e9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_buffer.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLsizeiptr; + +public interface ARB_copy_buffer { + + /** + * Accepted by the target parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, + * and CopyBufferSubData: + */ + int GL_COPY_READ_BUFFER = 0x8F36; + int GL_COPY_WRITE_BUFFER = 0x8F37; + + @Reuse("GL31") + void glCopyBufferSubData(@GLenum int readTarget, @GLenum int writeTarget, + @GLintptr long readOffset, @GLintptr long writeOffset, + @GLsizeiptr long size); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_image.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_image.java new file mode 100644 index 0000000..958c4db --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_copy_image.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_copy_image { + + @Reuse("GL43") + void glCopyImageSubData( + @GLuint int srcName, @GLenum int srcTarget, int srcLevel, + int srcX, int srcY, int srcZ, + @GLuint int dstName, @GLenum int dstTarget, int dstLevel, + int dstX, int dstY, int dstZ, + @GLsizei int srcWidth, @GLsizei int srcHeight, @GLsizei int srcDepth); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_debug_output.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_debug_output.java new file mode 100644 index 0000000..df8eda0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_debug_output.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface ARB_debug_output { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, + * and IsEnabled: + */ + int GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB = 0x8242; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_MAX_DEBUG_MESSAGE_LENGTH_ARB = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES_ARB = 0x9144, + GL_DEBUG_LOGGED_MESSAGES_ARB = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243; + + /** Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: */ + int GL_DEBUG_CALLBACK_FUNCTION_ARB = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM_ARB = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, + * and the &lt;sources&gt; parameter of GetDebugMessageLogARB: + */ + int GL_DEBUG_SOURCE_API_ARB = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY_ARB = 0x8249, + GL_DEBUG_SOURCE_APPLICATION_ARB = 0x824A, + GL_DEBUG_SOURCE_OTHER_ARB = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB, + * and the &lt;types&gt; parameter of GetDebugMessageLogARB: + */ + int GL_DEBUG_TYPE_ERROR_ARB = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E, + GL_DEBUG_TYPE_PORTABILITY_ARB = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE_ARB = 0x8250, + GL_DEBUG_TYPE_OTHER_ARB = 0x8251; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControlARB, DebugMessageInsertARB and DEBUGPROCARB + * callback functions, and the &lt;severities&gt; parameter of + * GetDebugMessageLogARB: + */ + int GL_DEBUG_SEVERITY_HIGH_ARB = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM_ARB = 0x9147, + GL_DEBUG_SEVERITY_LOW_ARB = 0x9148; + + void glDebugMessageControlARB(@GLenum int source, + @GLenum int type, + @GLenum int severity, + @AutoSize(value = "ids", canBeNull = true) @GLsizei int count, + @Check(canBeNull = true) @Const @GLuint IntBuffer ids, + boolean enabled); + + void glDebugMessageInsertARB(@GLenum int source, @GLenum int type, @GLuint int id, @GLenum int severity, @AutoSize("buf") @GLsizei int length, @Const @GLchar ByteBuffer buf); + + @Alternate("glDebugMessageInsertARB") + void glDebugMessageInsertARB(@GLenum int source, @GLenum int type, @GLuint int id, @GLenum int severity, @Constant("buf.length()") @GLsizei int length, CharSequence buf); + + /** + * The {@code ARBDebugOutputCallback.Handler} implementation passed to this method will be used for + * ARB_debug_output messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * + * @param callback the callback function to use + */ + @Code( + // Create a GlobalRef to the callback object and register it with the current context. + javaBeforeNative = "\t\tlong userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler());\n" + + "\t\tCallbackUtil.registerContextCallbackARB(userParam);" + ) + void glDebugMessageCallbackARB(@PointerWrapper(value = "GLDEBUGPROCARB", canBeNull = true) ARBDebugOutputCallback callback, + @Constant("userParam") @PointerWrapper("GLvoid *") long userParam); + + @GLuint + int glGetDebugMessageLogARB(@GLuint int count, + @AutoSize(value = "messageLog", canBeNull = true) @GLsizei int logSize, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer sources, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer types, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer ids, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer severities, + @Check(value = "count", canBeNull = true) @GLsizei IntBuffer lengths, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer messageLog); + + // Not really useful and a pain to implement in Java + //void glGetPointerv(@GLenum int pname, void**params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_buffer_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_buffer_float.java new file mode 100644 index 0000000..7e4c372 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_buffer_float.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_depth_buffer_float { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + int GL_DEPTH_COMPONENT32F = 0x8CAC; + int GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_clamp.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_clamp.java new file mode 100644 index 0000000..c81bf96 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_clamp.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_depth_clamp { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_DEPTH_CLAMP = 0x864F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_texture.java new file mode 100644 index 0000000..4998f08 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_depth_texture.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_depth_texture { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * CopyTexImage1D and CopyTexImage2D: + */ + int GL_DEPTH_COMPONENT16_ARB = 0x81A5; + int GL_DEPTH_COMPONENT24_ARB = 0x81A6; + int GL_DEPTH_COMPONENT32_ARB = 0x81A7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + int GL_TEXTURE_DEPTH_SIZE_ARB = 0x884A; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_DEPTH_TEXTURE_MODE_ARB = 0x884B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers.java new file mode 100644 index 0000000..10d1f4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.*; + +public interface ARB_draw_buffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_DRAW_BUFFERS_ARB = 0x8824; + int GL_DRAW_BUFFER0_ARB = 0x8825; + int GL_DRAW_BUFFER1_ARB = 0x8826; + int GL_DRAW_BUFFER2_ARB = 0x8827; + int GL_DRAW_BUFFER3_ARB = 0x8828; + int GL_DRAW_BUFFER4_ARB = 0x8829; + int GL_DRAW_BUFFER5_ARB = 0x882A; + int GL_DRAW_BUFFER6_ARB = 0x882B; + int GL_DRAW_BUFFER7_ARB = 0x882C; + int GL_DRAW_BUFFER8_ARB = 0x882D; + int GL_DRAW_BUFFER9_ARB = 0x882E; + int GL_DRAW_BUFFER10_ARB = 0x882F; + int GL_DRAW_BUFFER11_ARB = 0x8830; + int GL_DRAW_BUFFER12_ARB = 0x8831; + int GL_DRAW_BUFFER13_ARB = 0x8832; + int GL_DRAW_BUFFER14_ARB = 0x8833; + int GL_DRAW_BUFFER15_ARB = 0x8834; + + void glDrawBuffersARB(@AutoSize("buffers") @GLsizei int size, @Const @GLenum IntBuffer buffers); + + @Alternate("glDrawBuffersARB") + void glDrawBuffersARB(@Constant("1") @GLsizei int size, @Constant(value = "APIUtil.getInt(caps, buffer)", keepParam = true) int buffer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers_blend.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers_blend.java new file mode 100644 index 0000000..924f13b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_buffers_blend.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_draw_buffers_blend { + + void glBlendEquationiARB(@GLuint int buf, @GLenum int mode); + + void glBlendEquationSeparateiARB(@GLuint int buf, @GLenum int modeRGB, @GLenum int modeAlpha); + + void glBlendFunciARB(@GLuint int buf, @GLenum int src, @GLenum int dst); + + void glBlendFuncSeparateiARB(@GLuint int buf, @GLenum int srcRGB, @GLenum int dstRGB, @GLenum int srcAlpha, @GLenum int dstAlpha); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_elements_base_vertex.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_elements_base_vertex.java new file mode 100644 index 0000000..63339ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_elements_base_vertex.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface ARB_draw_elements_base_vertex { + + @Reuse("GL32") + void glDrawElementsBaseVertex(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, int basevertex); + + @Reuse("GL32") + void glDrawRangeElementsBaseVertex(@GLenum int mode, @GLuint int start, @GLuint int end, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, int basevertex); + + @Reuse("GL32") + void glDrawElementsInstancedBaseVertex(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount, int basevertex); + + //void glMultiDrawElementsBaseVertex(@GLenum int mode, @GLsizei*count, @GLenum int type, void**indices, @GLsizei int primcount, int*basevertex) + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_indirect.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_indirect.java new file mode 100644 index 0000000..523e3cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_indirect.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface ARB_draw_indirect { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, and + * CopyBufferSubData: + */ + int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + @Reuse("GL40") + void glDrawArraysIndirect(@GLenum int mode, @BufferObject(BufferKind.IndirectBO) @Check("4 * 4") @Const @GLvoid ByteBuffer indirect); + + @Reuse("GL40") + @Alternate("glDrawArraysIndirect") + void glDrawArraysIndirect(@GLenum int mode, @BufferObject(BufferKind.IndirectBO) @Check("4") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect); + + @Reuse("GL40") + void glDrawElementsIndirect(@GLenum int mode, @GLenum int type, @BufferObject(BufferKind.IndirectBO) @Check("5 * 4") @Const @GLvoid ByteBuffer indirect); + + @Reuse("GL40") + @Alternate("glDrawElementsIndirect") + void glDrawElementsIndirect(@GLenum int mode, @GLenum int type, @BufferObject(BufferKind.IndirectBO) @Check("5") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_instanced.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_instanced.java new file mode 100644 index 0000000..b0f9bbd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_draw_instanced.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface ARB_draw_instanced { + + void glDrawArraysInstancedARB(@GLenum int mode, int first, @GLsizei int count, @GLsizei int primcount); + + void glDrawElementsInstancedARB(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_enhanced_layouts.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_enhanced_layouts.java new file mode 100644 index 0000000..0f280bb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_enhanced_layouts.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_enhanced_layouts { + + /** Accepted in the &lt;props&gt; array of GetProgramResourceiv: */ + int GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_attrib_location.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_attrib_location.java new file mode 100644 index 0000000..07617df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_attrib_location.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_explicit_attrib_location { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_uniform_location.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_uniform_location.java new file mode 100644 index 0000000..8d01b58 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_explicit_uniform_location.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_explicit_uniform_location { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_coord_conventions.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_coord_conventions.java new file mode 100644 index 0000000..d4eedab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_coord_conventions.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_fragment_coord_conventions { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_layer_viewport.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_layer_viewport.java new file mode 100644 index 0000000..68fb0c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_layer_viewport.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_fragment_layer_viewport { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program.java new file mode 100644 index 0000000..cc767c9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_fragment_program extends ARB_program { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of ProgramStringARB, BindProgramARB, + * ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, + * GetProgramivARB and GetProgramStringARB. + */ + int GL_FRAGMENT_PROGRAM_ARB = 0x8804; + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + int GL_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x8805; + int GL_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x8806; + int GL_PROGRAM_TEX_INDIRECTIONS_ARB = 0x8807; + int GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x8808; + int GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x8809; + int GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x880A; + int GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = 0x880B; + int GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = 0x880C; + int GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = 0x880D; + int GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = 0x880E; + int GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = 0x880F; + int GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = 0x8810; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_TEXTURE_COORDS_ARB = 0x8871; + int GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; +} + diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program_shadow.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program_shadow.java new file mode 100644 index 0000000..1900de0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_program_shadow.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_fragment_program_shadow { + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_shader.java new file mode 100644 index 0000000..85fb0c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_fragment_shader.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_fragment_shader { + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShaderObjectARB and + * returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: + */ + int GL_FRAGMENT_SHADER_ARB = 0x8B30; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = 0x8B49; + int GL_MAX_TEXTURE_COORDS_ARB = 0x8871; + int GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; + + /** + * Accepted by the &lt;target&gt; parameter of Hint and the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB = 0x8B8B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_no_attachments.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_no_attachments.java new file mode 100644 index 0000000..6efe5c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_no_attachments.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +@Dependent +@Extension(postfix = "") +public interface ARB_framebuffer_no_attachments { + + /** + * Accepted by the &lt;pname&gt; parameter of FramebufferParameteri, + * GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT: + */ + int GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + @Reuse("GL43") + void glFramebufferParameteri(@GLenum int target, @GLenum int pname, int param); + + @Reuse("GL43") + @StripPostfix("params") + void glGetFramebufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Reuse("GL43") + @Alternate("glGetFramebufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("GL_EXT_direct_state_access") + void glNamedFramebufferParameteriEXT(@GLuint int framebuffer, @GLenum int pname, + int param); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "params", extension = "EXT") + void glGetNamedFramebufferParameterivEXT(@GLuint int framebuffer, @GLenum int pname, + @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetNamedFramebufferParameterivEXT") + @GLreturn("params") + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "params", extension = "EXT") + void glGetNamedFramebufferParameterivEXT2(@GLuint int framebuffer, @GLenum int pname, + @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_object.java new file mode 100644 index 0000000..06966a5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_object.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_framebuffer_object { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + int GL_FRAMEBUFFER = 0x8D40; + int GL_READ_FRAMEBUFFER = 0x8CA8; + int GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbuffer, + * RenderbufferStorage, and GetRenderbufferParameteriv, and + * returned by GetFramebufferAttachmentParameteriv: + */ + int GL_RENDERBUFFER = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorage: + */ + int GL_STENCIL_INDEX1 = 0x8D46; + int GL_STENCIL_INDEX4 = 0x8D47; + int GL_STENCIL_INDEX8 = 0x8D48; + int GL_STENCIL_INDEX16 = 0x8D49; + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_WIDTH = 0x8D42; + int GL_RENDERBUFFER_HEIGHT = 0x8D43; + int GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44; + int GL_RENDERBUFFER_RED_SIZE = 0x8D50; + int GL_RENDERBUFFER_GREEN_SIZE = 0x8D51; + int GL_RENDERBUFFER_BLUE_SIZE = 0x8D52; + int GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53; + int GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54; + int GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55; + int GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0; + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; + int GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; + int GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; + int GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; + int GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; + int GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; + int GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: */ + int GL_SRGB = 0x8C40; + int GL_UNSIGNED_NORMALIZED = 0x8C17; + int GL_FRAMEBUFFER_DEFAULT = 0x8218; + int GL_INDEX = 0x8222; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv + */ + int GL_COLOR_ATTACHMENT0 = 0x8CE0; + int GL_COLOR_ATTACHMENT1 = 0x8CE1; + int GL_COLOR_ATTACHMENT2 = 0x8CE2; + int GL_COLOR_ATTACHMENT3 = 0x8CE3; + int GL_COLOR_ATTACHMENT4 = 0x8CE4; + int GL_COLOR_ATTACHMENT5 = 0x8CE5; + int GL_COLOR_ATTACHMENT6 = 0x8CE6; + int GL_COLOR_ATTACHMENT7 = 0x8CE7; + int GL_COLOR_ATTACHMENT8 = 0x8CE8; + int GL_COLOR_ATTACHMENT9 = 0x8CE9; + int GL_COLOR_ATTACHMENT10 = 0x8CEA; + int GL_COLOR_ATTACHMENT11 = 0x8CEB; + int GL_COLOR_ATTACHMENT12 = 0x8CEC; + int GL_COLOR_ATTACHMENT13 = 0x8CED; + int GL_COLOR_ATTACHMENT14 = 0x8CEE; + int GL_COLOR_ATTACHMENT15 = 0x8CEF; + int GL_DEPTH_ATTACHMENT = 0x8D00; + int GL_STENCIL_ATTACHMENT = 0x8D20; + int GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_SAMPLES = 0x8D57; + + /** Returned by CheckFramebufferStatus(): */ + int GL_FRAMEBUFFER_COMPLETE = 0x8CD5; + int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6; + int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7; + int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB; + int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC; + int GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD; + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; + int GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAMEBUFFER_BINDING = 0x8CA6; // alias DRAW_FRAMEBUFFER_BINDING + int GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6; + int GL_READ_FRAMEBUFFER_BINDING = 0x8CAA; + int GL_RENDERBUFFER_BINDING = 0x8CA7; + int GL_MAX_COLOR_ATTACHMENTS = 0x8CDF; + int GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** Returned by GetError(): */ + int GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506; + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + * CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv: + */ + int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage: + */ + int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv: + */ + int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: */ + int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + @Reuse("GL30") + boolean glIsRenderbuffer(@GLuint int renderbuffer); + + @Reuse("GL30") + void glBindRenderbuffer(@GLenum int target, @GLuint int renderbuffer); + + @Reuse("GL30") + void glDeleteRenderbuffers(@AutoSize("renderbuffers") @GLsizei int n, @Const @GLuint IntBuffer renderbuffers); + + @Reuse("GL30") + @Alternate("glDeleteRenderbuffers") + void glDeleteRenderbuffers(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, renderbuffer)", keepParam = true) int renderbuffer); + + @Reuse("GL30") + void glGenRenderbuffers(@AutoSize("renderbuffers") @GLsizei int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Reuse("GL30") + @Alternate("glGenRenderbuffers") + @GLreturn("renderbuffers") + void glGenRenderbuffers2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Reuse("GL30") + void glRenderbufferStorage(@GLenum int target, @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + @Reuse("GL30") + void glRenderbufferStorageMultisample(@GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + @Reuse("GL30") + @StripPostfix("params") + void glGetRenderbufferParameteriv(@GLenum int target, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. */ + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "ARBFramebufferObject", method = "glGetRenderbufferParameteri") + @Deprecated + void glGetRenderbufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL30") + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetRenderbufferParameteriv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL30") + boolean glIsFramebuffer(@GLuint int framebuffer); + + @Reuse("GL30") + void glBindFramebuffer(@GLenum int target, @GLuint int framebuffer); + + @Reuse("GL30") + void glDeleteFramebuffers(@AutoSize("framebuffers") @GLsizei int n, @Const @GLuint IntBuffer framebuffers); + + @Reuse("GL30") + @Alternate("glDeleteFramebuffers") + void glDeleteFramebuffers(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, framebuffer)", keepParam = true) int framebuffer); + + @Reuse("GL30") + void glGenFramebuffers(@AutoSize("framebuffers") @GLsizei int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Reuse("GL30") + @Alternate("glGenFramebuffers") + @GLreturn("framebuffers") + void glGenFramebuffers2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Reuse("GL30") + @GLenum + int glCheckFramebufferStatus(@GLenum int target); + + @Reuse("GL30") + void glFramebufferTexture1D(@GLenum int target, @GLenum int attachment, + @GLenum int textarget, @GLuint int texture, int level); + + @Reuse("GL30") + void glFramebufferTexture2D(@GLenum int target, @GLenum int attachment, + @GLenum int textarget, @GLuint int texture, int level); + + @Reuse("GL30") + void glFramebufferTexture3D(@GLenum int target, @GLenum int attachment, + @GLenum int textarget, @GLuint int texture, + int level, int layer); + + @Reuse("GL30") + void glFramebufferTextureLayer(@GLenum int target, @GLenum int attachment, + @GLuint int texture, int level, int layer); + + @Reuse("GL30") + void glFramebufferRenderbuffer(@GLenum int target, @GLenum int attachment, + @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + @Reuse("GL30") + @StripPostfix("params") + void glGetFramebufferAttachmentParameteriv(@GLenum int target, @GLenum int attachment, + @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. */ + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL30", method = "glGetFramebufferAttachmentParameteri") + @Deprecated + void glGetFramebufferAttachmentParameteriv2(@GLenum int target, @GLenum int attachment, + @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL30") + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferAttachmentParameteriv3(@GLenum int target, @GLenum int attachment, + @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL30") + void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, + int dstX0, int dstY0, int dstX1, int dstY1, + @GLbitfield int mask, @GLenum int filter); + + @Reuse("GL30") + void glGenerateMipmap(@GLenum int target); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_sRGB.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_sRGB.java new file mode 100644 index 0000000..d62a171 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_framebuffer_sRGB.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_framebuffer_sRGB { + + /** + * Accepted by the &lt;attribList&gt; parameter of glXChooseVisual, and by + * the &lt;attrib&gt; parameter of glXGetConfig: + */ + int GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20B2; + + /** + * Accepted by the &lt;piAttributes&gt; parameter of + * wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and + * the &lt;piAttribIList&gt; and &lt;pfAttribIList&gt; of wglChoosePixelFormatEXT: + */ + int WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x20A9; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB_ARB = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB_CAPABLE_ARB = 0x8DBA; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_geometry_shader4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_geometry_shader4.java new file mode 100644 index 0000000..7f17ccc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_geometry_shader4.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_geometry_shader4 { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + int GL_GEOMETRY_SHADER_ARB = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + int GL_GEOMETRY_VERTICES_OUT_ARB = 0x8DDA; + int GL_GEOMETRY_INPUT_TYPE_ARB = 0x8DDB; + int GL_GEOMETRY_OUTPUT_TYPE_ARB = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = 0x8C29; + int GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = 0x8DDD; + int GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = 0x8DDE; + int GL_MAX_VARYING_COMPONENTS_ARB = 0x8B4B; + int GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = 0x8DDF; + int GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = 0x8DE0; + int GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + int GL_LINES_ADJACENCY_ARB = 0xA; + int GL_LINE_STRIP_ADJACENCY_ARB = 0xB; + int GL_TRIANGLES_ADJACENCY_ARB = 0xC; + int GL_TRIANGLE_STRIP_ADJACENCY_ARB = 0xD; + + /** Returned by CheckFramebufferStatusEXT: */ + int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = 0x8DA8; + int GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = 0x8DA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = 0x8DA7; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_ARB = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + int GL_PROGRAM_POINT_SIZE_ARB = 0x8642; + + void glProgramParameteriARB(@GLuint int program, @GLenum int pname, int value); + + void glFramebufferTextureARB(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level); + + void glFramebufferTextureLayerARB(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + + void glFramebufferTextureFaceARB(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, @GLenum int face); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_get_program_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_get_program_binary.java new file mode 100644 index 0000000..e6f4774 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_get_program_binary.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface ARB_get_program_binary { + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev: + */ + int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + @Reuse("GL41") + void glGetProgramBinary(@GLuint int program, @AutoSize("binary") @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @Check("1") @GLenum IntBuffer binaryFormat, + @OutParameter @GLvoid ByteBuffer binary); + + @Reuse("GL41") + void glProgramBinary(@GLuint int program, @GLenum int binaryFormat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + @Reuse("GL41") + void glProgramParameteri(@GLuint int program, @GLenum int pname, int value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader5.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader5.java new file mode 100644 index 0000000..7f2a031 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader5.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_gpu_shader5 { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev, and GetInteger64v: + */ + int GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A; + int GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B; + int GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C; + int GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D; + int GL_MAX_VERTEX_STREAMS = 0x8E71; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader_fp64.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader_fp64.java new file mode 100644 index 0000000..c7c8f2a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_gpu_shader_fp64.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +@Dependent +@Extension(postfix = "") +public interface ARB_gpu_shader_fp64 { + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + int GL_DOUBLE = GL11.GL_DOUBLE; + int GL_DOUBLE_VEC2 = 0x8FFC; + int GL_DOUBLE_VEC3 = 0x8FFD; + int GL_DOUBLE_VEC4 = 0x8FFE; + int GL_DOUBLE_MAT2 = 0x8F46; + int GL_DOUBLE_MAT3 = 0x8F47; + int GL_DOUBLE_MAT4 = 0x8F48; + int GL_DOUBLE_MAT2x3 = 0x8F49; + int GL_DOUBLE_MAT2x4 = 0x8F4A; + int GL_DOUBLE_MAT3x2 = 0x8F4B; + int GL_DOUBLE_MAT3x4 = 0x8F4C; + int GL_DOUBLE_MAT4x2 = 0x8F4D; + int GL_DOUBLE_MAT4x3 = 0x8F4E; + + @Reuse("GL40") + void glUniform1d(int location, double x); + + @Reuse("GL40") + void glUniform2d(int location, double x, double y); + + @Reuse("GL40") + void glUniform3d(int location, double x, double y, double z); + + @Reuse("GL40") + void glUniform4d(int location, double x, double y, double z, double w); + + @Reuse("GL40") + @StripPostfix("value") + void glUniform1dv(int location, @AutoSize("value") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniform2dv(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniform3dv(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniform4dv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix2dv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix3dv(int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix4dv(int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix2x3dv(int location, @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix2x4dv(int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix3x2dv(int location, @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix3x4dv(int location, @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix4x2dv(int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("value") + void glUniformMatrix4x3dv(int location, @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL40") + @StripPostfix("params") + void glGetUniformdv(@GLuint int program, int location, @OutParameter @Check DoubleBuffer params); + + // ---- + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform1dEXT(@GLuint int program, int location, double x); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform2dEXT(@GLuint int program, int location, double x, double y); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform3dEXT(@GLuint int program, int location, double x, double y, double z); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform4dEXT(@GLuint int program, int location, double x, double y, double z, double w); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value="value", extension="EXT") + void glProgramUniform1dvEXT(@GLuint int program, int location, @AutoSize(value = "value") @GLsizei int count, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniform2dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniform3dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniform4dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix2dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix3dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix4dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix2x3dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix2x4dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix3x2dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix3x4dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix4x2dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix(value = "value", extension = "EXT") + void glProgramUniformMatrix4x3dvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_pixel.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_pixel.java new file mode 100644 index 0000000..8aaca95 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_pixel.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_half_float_pixel { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, + * SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, + * and GetColorTable: + */ + int GL_HALF_FLOAT_ARB = 0x140B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_vertex.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_vertex.java new file mode 100644 index 0000000..9838535 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_half_float_vertex.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_half_float_vertex { + + /** + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, + * and VertexAttribPointer: + */ + int GL_HALF_FLOAT = 0x140B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_imaging.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_imaging.java new file mode 100644 index 0000000..fa97eb6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_imaging.java @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +/** + * <p/> + * The GL12 imaging subset extension. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +@Extension(postfix = "") +@DeprecatedGL +public interface ARB_imaging { + + int GL_CONSTANT_COLOR = 0x8001; + int GL_ONE_MINUS_CONSTANT_COLOR = 0x8002; + int GL_CONSTANT_ALPHA = 0x8003; + int GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; + int GL_BLEND_COLOR = 0x8005; + int GL_FUNC_ADD = 0x8006; + int GL_MIN = 0x8007; + int GL_MAX = 0x8008; + int GL_BLEND_EQUATION = 0x8009; + int GL_FUNC_SUBTRACT = 0x800A; + int GL_FUNC_REVERSE_SUBTRACT = 0x800B; + int GL_COLOR_MATRIX = 0x80B1; + int GL_COLOR_MATRIX_STACK_DEPTH = 0x80B2; + int GL_MAX_COLOR_MATRIX_STACK_DEPTH = 0x80B3; + int GL_POST_COLOR_MATRIX_RED_SCALE = 0x80B4; + int GL_POST_COLOR_MATRIX_GREEN_SCALE = 0x80B5; + int GL_POST_COLOR_MATRIX_BLUE_SCALE = 0x80B6; + int GL_POST_COLOR_MATRIX_ALPHA_SCALE = 0x80B7; + int GL_POST_COLOR_MATRIX_RED_BIAS = 0x80B8; + int GL_POST_COLOR_MATRIX_GREEN_BIAS = 0x80B9; + int GL_POST_COLOR_MATRIX_BLUE_BIAS = 0x80BA; + int GL_POST_COLOR_MATRIX_ALPHA_BIAS = 0x80BB; + int GL_COLOR_TABLE = 0x80D0; + int GL_POST_CONVOLUTION_COLOR_TABLE = 0x80D1; + int GL_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D2; + int GL_PROXY_COLOR_TABLE = 0x80D3; + int GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = 0x80D4; + int GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = 0x80D5; + int GL_COLOR_TABLE_SCALE = 0x80D6; + int GL_COLOR_TABLE_BIAS = 0x80D7; + int GL_COLOR_TABLE_FORMAT = 0x80D8; + int GL_COLOR_TABLE_WIDTH = 0x80D9; + int GL_COLOR_TABLE_RED_SIZE = 0x80DA; + int GL_COLOR_TABLE_GREEN_SIZE = 0x80DB; + int GL_COLOR_TABLE_BLUE_SIZE = 0x80DC; + int GL_COLOR_TABLE_ALPHA_SIZE = 0x80DD; + int GL_COLOR_TABLE_LUMINANCE_SIZE = 0x80DE; + int GL_COLOR_TABLE_INTENSITY_SIZE = 0x80DF; + int GL_CONVOLUTION_1D = 0x8010; + int GL_CONVOLUTION_2D = 0x8011; + int GL_SEPARABLE_2D = 0x8012; + int GL_CONVOLUTION_BORDER_MODE = 0x8013; + int GL_CONVOLUTION_FILTER_SCALE = 0x8014; + int GL_CONVOLUTION_FILTER_BIAS = 0x8015; + int GL_REDUCE = 0x8016; + int GL_CONVOLUTION_FORMAT = 0x8017; + int GL_CONVOLUTION_WIDTH = 0x8018; + int GL_CONVOLUTION_HEIGHT = 0x8019; + int GL_MAX_CONVOLUTION_WIDTH = 0x801A; + int GL_MAX_CONVOLUTION_HEIGHT = 0x801B; + int GL_POST_CONVOLUTION_RED_SCALE = 0x801C; + int GL_POST_CONVOLUTION_GREEN_SCALE = 0x801D; + int GL_POST_CONVOLUTION_BLUE_SCALE = 0x801E; + int GL_POST_CONVOLUTION_ALPHA_SCALE = 0x801F; + int GL_POST_CONVOLUTION_RED_BIAS = 0x8020; + int GL_POST_CONVOLUTION_GREEN_BIAS = 0x8021; + int GL_POST_CONVOLUTION_BLUE_BIAS = 0x8022; + int GL_POST_CONVOLUTION_ALPHA_BIAS = 0x8023; + int GL_IGNORE_BORDER = 0x8150; + int GL_CONSTANT_BORDER = 0x8151; + int GL_REPLICATE_BORDER = 0x8153; + int GL_CONVOLUTION_BORDER_COLOR = 0x8154; + int GL_HISTOGRAM = 0x8024; + int GL_PROXY_HISTOGRAM = 0x8025; + int GL_HISTOGRAM_WIDTH = 0x8026; + int GL_HISTOGRAM_FORMAT = 0x8027; + int GL_HISTOGRAM_RED_SIZE = 0x8028; + int GL_HISTOGRAM_GREEN_SIZE = 0x8029; + int GL_HISTOGRAM_BLUE_SIZE = 0x802A; + int GL_HISTOGRAM_ALPHA_SIZE = 0x802B; + int GL_HISTOGRAM_LUMINANCE_SIZE = 0x802C; + int GL_HISTOGRAM_SINK = 0x802D; + int GL_MINMAX = 0x802E; + int GL_MINMAX_FORMAT = 0x802F; + int GL_MINMAX_SINK = 0x8030; + int GL_TABLE_TOO_LARGE = 0x8031; + + @DeprecatedGL + void glColorTable(@GLenum int target, @GLenum int internalFormat, @GLsizei int width, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("256") + @Const + @GLbyte + @GLfloat + @GLdouble Buffer data); + + @DeprecatedGL + void glColorSubTable(@GLenum int target, @GLsizei int start, @GLsizei int count, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("256") + @Const + @GLbyte + @GLfloat + @GLdouble Buffer data); + + @StripPostfix("params") + @DeprecatedGL + void glColorTableParameteriv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glColorTableParameterfv(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @DeprecatedGL + void glCopyColorSubTable(@GLenum int target, @GLsizei int start, int x, int y, @GLsizei int width); + + @DeprecatedGL + void glCopyColorTable(@GLenum int target, @GLenum int internalformat, int x, int y, @GLsizei int width); + + @DeprecatedGL + void glGetColorTable(@GLenum int target, @GLenum int format, @GLenum int type, + @OutParameter + @Check("256") + @GLbyte + @GLfloat + @GLdouble Buffer data); + + @StripPostfix("params") + @DeprecatedGL + void glGetColorTableParameteriv(@GLenum int target, @GLenum int pname, @Check("4") IntBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetColorTableParameterfv(@GLenum int target, @GLenum int pname, @Check("4") FloatBuffer params); + + @Reuse("GL14") + void glBlendEquation(@GLenum int mode); + + @Reuse("GL14") + void glBlendColor(@GLclampf float red, @GLclampf float green, @GLclampf float blue, @GLclampf float alpha); + + @DeprecatedGL + void glHistogram(@GLenum int target, @GLsizei int width, @GLenum int internalformat, boolean sink); + + @DeprecatedGL + void glResetHistogram(@GLenum int target); + + @DeprecatedGL + void glGetHistogram(@GLenum int target, boolean reset, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("256") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer values); + + @StripPostfix("params") + @DeprecatedGL + void glGetHistogramParameterfv(@GLenum int target, @GLenum int pname, @OutParameter @Check("256") FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetHistogramParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("256") IntBuffer params); + + @DeprecatedGL + void glMinmax(@GLenum int target, @GLenum int internalformat, boolean sink); + + @DeprecatedGL + void glResetMinmax(@GLenum int target); + + @DeprecatedGL + void glGetMinmax(@GLenum int target, boolean reset, @GLenum int format, @GLenum int types, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("4") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer values); + + @StripPostfix("params") + @DeprecatedGL + void glGetMinmaxParameterfv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetMinmaxParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @DeprecatedGL + void glConvolutionFilter1D(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(image, format, type, width, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer image); + + @DeprecatedGL + void glConvolutionFilter2D(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(image, format, type, width, height, 1)") + @Const + @GLbyte + @GLshort + @GLint Buffer image); + + @DeprecatedGL + void glConvolutionParameterf(@GLenum int target, @GLenum int pname, float params); + + @StripPostfix("params") + @DeprecatedGL + void glConvolutionParameterfv(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @DeprecatedGL + void glConvolutionParameteri(@GLenum int target, @GLenum int pname, int params); + + @StripPostfix("params") + @DeprecatedGL + void glConvolutionParameteriv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @DeprecatedGL + void glCopyConvolutionFilter1D(@GLenum int target, @GLenum int internalformat, int x, int y, @GLsizei int width); + + @DeprecatedGL + void glCopyConvolutionFilter2D(@GLenum int target, @GLenum int internalformat, int x, int y, @GLsizei int width, @GLsizei int height); + + // TODO: check buffer size valid + @DeprecatedGL + void glGetConvolutionFilter(@GLenum int target, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer image); + + @StripPostfix("params") + @DeprecatedGL + void glGetConvolutionParameterfv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetConvolutionParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + // TODO: check buffer size valid + @DeprecatedGL + void glSeparableFilter2D(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer row, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer column); + + // TODO: check buffer size valid + @DeprecatedGL + void glGetSeparableFilter(@GLenum int target, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer row, + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint + @GLdouble Buffer column, + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint + @GLdouble Buffer span); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_indirect_parameters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_indirect_parameters.java new file mode 100644 index 0000000..057e0a7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_indirect_parameters.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface ARB_indirect_parameters { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, and CopyBufferSubData: + */ + int GL_PARAMETER_BUFFER_ARB = 0x80EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + int GL_PARAMETER_BUFFER_BINDING_ARB = 0x80EF; + + void glMultiDrawArraysIndirectCountARB(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 * 4 : stride) * maxdrawcount") @Const @GLvoid ByteBuffer indirect, + @GLintptr long drawcount, + @GLsizei int maxdrawcount, + @GLsizei int stride); + + @Alternate("glMultiDrawArraysIndirectCountARB") + void glMultiDrawArraysIndirectCountARB(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 : stride >> 2) * maxdrawcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLintptr long drawcount, + @GLsizei int maxdrawcount, + @GLsizei int stride); + + void glMultiDrawElementsIndirectCountARB(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 * 4 : stride) * maxdrawcount") @Const @GLvoid ByteBuffer indirect, + @GLintptr long drawcount, + @GLsizei int maxdrawcount, + @GLsizei int stride); + + @Alternate("glMultiDrawElementsIndirectCountARB") + void glMultiDrawElementsIndirectCountARB(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 : stride >> 2) * maxdrawcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLintptr long drawcount, + @GLsizei int maxdrawcount, + @GLsizei int stride); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_instanced_arrays.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_instanced_arrays.java new file mode 100644 index 0000000..a770471 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_instanced_arrays.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_instanced_arrays { + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, and GetVertexAttribiv: + */ + int GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB = 0x88FE; + + void glVertexAttribDivisorARB(@GLuint int index, @GLuint int divisor); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query.java new file mode 100644 index 0000000..b649473 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_internalformat_query { + + /** Accepted by the &lt;pname&gt; parameter of GetInternalformativ: */ + int GL_NUM_SAMPLE_COUNTS = 0x9380; + + @StripPostfix("params") + @Reuse("GL42") + void glGetInternalformativ(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @AutoSize("params") @GLsizei int bufSize, @OutParameter IntBuffer params); + + @Alternate("glGetInternalformativ") + @StripPostfix("params") + @GLreturn("params") + @Reuse("GL42") + void glGetInternalformativ2(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @Constant("1") @GLsizei int bufSize, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query2.java new file mode 100644 index 0000000..af2f9f2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_internalformat_query2.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLint64; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.LongBuffer; + +@Extension(postfix = "") +public interface ARB_internalformat_query2 { + + /** + * Accepted by the &lt;target&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + int GL_TEXTURE_1D = 0x0DE0, + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D = 0x0DE1, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009, + GL_TEXTURE_RECTANGLE = 0x84F5, + GL_TEXTURE_BUFFER = 0x8C2A, + GL_RENDERBUFFER = 0x8D41, + GL_TEXTURE_2D_MULTISAMPLE = 0x9100, + GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + int GL_SAMPLES = 0x80A9, + GL_NUM_SAMPLE_COUNTS = 0x9380, + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_SRGB_DECODE_ARB = 0x8299, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** + * Returned as possible responses for various &lt;pname&gt; queries + * to GetInternalformativ and GetInternalformati64v + */ + int GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + @Reuse("GL43") + @StripPostfix("params") + void glGetInternalformati64v(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @AutoSize("params") @GLsizei int bufSize, @OutParameter @GLint64 LongBuffer params); + + @Reuse("GL43") + @Alternate("glGetInternalformati64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetInternalformati64v2(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @Constant("1") @GLsizei int bufSize, @OutParameter @GLint64 LongBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_invalidate_subdata.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_invalidate_subdata.java new file mode 100644 index 0000000..8f0d984 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_invalidate_subdata.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; + +public interface ARB_invalidate_subdata { + + @Reuse("GL43") + void glInvalidateTexSubImage(@GLuint int texture, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + @Reuse("GL43") + void glInvalidateTexImage(@GLuint int texture, int level); + + @Reuse("GL43") + void glInvalidateBufferSubData(@GLuint int buffer, @GLintptr long offset, @GLsizeiptr long length); + + @Reuse("GL43") + void glInvalidateBufferData(@GLuint int buffer); + + @Reuse("GL43") + void glInvalidateFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments); + + @Reuse("GL43") + void glInvalidateSubFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments, + int x, int y, @GLsizei int width, @GLsizei int height); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_alignment.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_alignment.java new file mode 100644 index 0000000..cbee3dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_alignment.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_map_buffer_alignment { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_range.java new file mode 100644 index 0000000..c636a8d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_map_buffer_range.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; + +public interface ARB_map_buffer_range { + + /** Accepted by the &lt;access&gt; parameter of MapBufferRange: */ + int GL_MAP_READ_BIT = 0x0001; + int GL_MAP_WRITE_BIT = 0x0002; + int GL_MAP_INVALIDATE_RANGE_BIT = 0x0004; + int GL_MAP_INVALIDATE_BUFFER_BIT = 0x0008; + int GL_MAP_FLUSH_EXPLICIT_BIT = 0x0010; + int GL_MAP_UNSYNCHRONIZED_BIT = 0x0020; + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @Reuse("GL30") + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length, @GLbitfield int access); + + @Reuse("GL30") + void glFlushMappedBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_matrix_palette.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_matrix_palette.java new file mode 100644 index 0000000..a7a3858 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_matrix_palette.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ARB_matrix_palette { + + int GL_MATRIX_PALETTE_ARB = 0x8840; + int GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = 0x8841; + int GL_MAX_PALETTE_MATRICES_ARB = 0x8842; + int GL_CURRENT_PALETTE_MATRIX_ARB = 0x8843; + int GL_MATRIX_INDEX_ARRAY_ARB = 0x8844; + int GL_CURRENT_MATRIX_INDEX_ARB = 0x8845; + int GL_MATRIX_INDEX_ARRAY_SIZE_ARB = 0x8846; + int GL_MATRIX_INDEX_ARRAY_TYPE_ARB = 0x8847; + int GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = 0x8848; + int GL_MATRIX_INDEX_ARRAY_POINTER_ARB = 0x8849; + + void glCurrentPaletteMatrixARB(int index); + + void glMatrixIndexPointerARB(int size, @AutoType("pPointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLubyte + @GLushort + @GLuint Buffer pPointer); + + @StripPostfix("pIndices") + void glMatrixIndexubvARB(@AutoSize("pIndices") int size, @GLubyte ByteBuffer pIndices); + + @StripPostfix("pIndices") + void glMatrixIndexusvARB(@AutoSize("pIndices") int size, @GLushort ShortBuffer pIndices); + + @StripPostfix("pIndices") + void glMatrixIndexuivARB(@AutoSize("pIndices") int size, @GLuint IntBuffer pIndices); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_bind.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_bind.java new file mode 100644 index 0000000..e74d12b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_bind.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; + +public interface ARB_multi_bind { + + @Reuse("GL44") + void glBindBuffersBase(@GLenum int target, @GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers); + + @Reuse("GL44") + void glBindBuffersRange(@GLenum int target, @GLuint int first, @GLsizei int count, + @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers, + @Check(value = "count", canBeNull = true) @Const @GLintptr PointerBuffer offsets, + @Check(value = "count", canBeNull = true) @Const @GLsizeiptr PointerBuffer sizes); + + @Reuse("GL44") + void glBindTextures(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer textures); + + @Reuse("GL44") + void glBindSamplers(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer samplers); + + @Reuse("GL44") + void glBindImageTextures(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer textures); + + @Reuse("GL44") + void glBindVertexBuffers(@GLuint int first, @GLsizei int count, + @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers, + @Check(value = "count", canBeNull = true) @Const @GLintptr PointerBuffer offsets, + @Check(value = "count", canBeNull = true) @Const @GLsizei IntBuffer strides); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_draw_indirect.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_draw_indirect.java new file mode 100644 index 0000000..e218e80 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multi_draw_indirect.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface ARB_multi_draw_indirect { + + @Reuse("GL43") + void glMultiDrawArraysIndirect(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Reuse("GL43") + @Alternate("glMultiDrawArraysIndirect") + void glMultiDrawArraysIndirect(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Reuse("GL43") + void glMultiDrawElementsIndirect(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Reuse("GL43") + @Alternate("glMultiDrawElementsIndirect") + void glMultiDrawElementsIndirect(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multisample.java new file mode 100644 index 0000000..23e1293 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multisample.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLclampf; + +public interface ARB_multisample { + + int GL_MULTISAMPLE_ARB = 0x809D; + int GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = 0x809E; + int GL_SAMPLE_ALPHA_TO_ONE_ARB = 0x809F; + int GL_SAMPLE_COVERAGE_ARB = 0x80A0; + int GL_SAMPLE_BUFFERS_ARB = 0x80A8; + int GL_SAMPLES_ARB = 0x80A9; + int GL_SAMPLE_COVERAGE_VALUE_ARB = 0x80AA; + int GL_SAMPLE_COVERAGE_INVERT_ARB = 0x80AB; + int GL_MULTISAMPLE_BIT_ARB = 0x20000000; + + void glSampleCoverageARB(@GLclampf float value, boolean invert); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multitexture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multitexture.java new file mode 100644 index 0000000..bec30cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_multitexture.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ARB_multitexture { + + int GL_TEXTURE0_ARB = 0x84C0; + int GL_TEXTURE1_ARB = 0x84C1; + int GL_TEXTURE2_ARB = 0x84C2; + int GL_TEXTURE3_ARB = 0x84C3; + int GL_TEXTURE4_ARB = 0x84C4; + int GL_TEXTURE5_ARB = 0x84C5; + int GL_TEXTURE6_ARB = 0x84C6; + int GL_TEXTURE7_ARB = 0x84C7; + int GL_TEXTURE8_ARB = 0x84C8; + int GL_TEXTURE9_ARB = 0x84C9; + int GL_TEXTURE10_ARB = 0x84CA; + int GL_TEXTURE11_ARB = 0x84CB; + int GL_TEXTURE12_ARB = 0x84CC; + int GL_TEXTURE13_ARB = 0x84CD; + int GL_TEXTURE14_ARB = 0x84CE; + int GL_TEXTURE15_ARB = 0x84CF; + int GL_TEXTURE16_ARB = 0x84D0; + int GL_TEXTURE17_ARB = 0x84D1; + int GL_TEXTURE18_ARB = 0x84D2; + int GL_TEXTURE19_ARB = 0x84D3; + int GL_TEXTURE20_ARB = 0x84D4; + int GL_TEXTURE21_ARB = 0x84D5; + int GL_TEXTURE22_ARB = 0x84D6; + int GL_TEXTURE23_ARB = 0x84D7; + int GL_TEXTURE24_ARB = 0x84D8; + int GL_TEXTURE25_ARB = 0x84D9; + int GL_TEXTURE26_ARB = 0x84DA; + int GL_TEXTURE27_ARB = 0x84DB; + int GL_TEXTURE28_ARB = 0x84DC; + int GL_TEXTURE29_ARB = 0x84DD; + int GL_TEXTURE30_ARB = 0x84DE; + int GL_TEXTURE31_ARB = 0x84DF; + int GL_ACTIVE_TEXTURE_ARB = 0x84E0; + int GL_CLIENT_ACTIVE_TEXTURE_ARB = 0x84E1; + int GL_MAX_TEXTURE_UNITS_ARB = 0x84E2; + + void glClientActiveTextureARB(@GLenum int texture); + + void glActiveTextureARB(@GLenum int texture); + + @NoErrorCheck + void glMultiTexCoord1fARB(@GLenum int target, float s); + + @NoErrorCheck + void glMultiTexCoord1dARB(@GLenum int target, double s); + + @NoErrorCheck + void glMultiTexCoord1iARB(@GLenum int target, int s); + + @NoErrorCheck + void glMultiTexCoord1sARB(@GLenum int target, short s); + + @NoErrorCheck + void glMultiTexCoord2fARB(@GLenum int target, float s, float t); + + @NoErrorCheck + void glMultiTexCoord2dARB(@GLenum int target, double s, double t); + + @NoErrorCheck + void glMultiTexCoord2iARB(@GLenum int target, int s, int t); + + @NoErrorCheck + void glMultiTexCoord2sARB(@GLenum int target, short s, short t); + + @NoErrorCheck + void glMultiTexCoord3fARB(@GLenum int target, float s, float t, float r); + + @NoErrorCheck + void glMultiTexCoord3dARB(@GLenum int target, double s, double t, double r); + + @NoErrorCheck + void glMultiTexCoord3iARB(@GLenum int target, int s, int t, int r); + + @NoErrorCheck + void glMultiTexCoord3sARB(@GLenum int target, short s, short t, short r); + + @NoErrorCheck + void glMultiTexCoord4fARB(@GLenum int target, float s, float t, float r, float q); + + @NoErrorCheck + void glMultiTexCoord4dARB(@GLenum int target, double s, double t, double r, double q); + + @NoErrorCheck + void glMultiTexCoord4iARB(@GLenum int target, int s, int t, int r, int q); + + @NoErrorCheck + void glMultiTexCoord4sARB(@GLenum int target, short s, short t, short r, short q); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query.java new file mode 100644 index 0000000..62ac833 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface ARB_occlusion_query { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQueryARB, EndQueryARB, + * and GetQueryivARB: + */ + int GL_SAMPLES_PASSED_ARB = 0x8914; + + /** Accepted by the &lt;pname&gt; parameter of GetQueryivARB: */ + int GL_QUERY_COUNTER_BITS_ARB = 0x8864; + int GL_CURRENT_QUERY_ARB = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectivARB and + * GetQueryObjectuivARB: + */ + int GL_QUERY_RESULT_ARB = 0x8866; + int GL_QUERY_RESULT_AVAILABLE_ARB = 0x8867; + + void glGenQueriesARB(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenQueriesARB") + @GLreturn("ids") + void glGenQueriesARB2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + void glDeleteQueriesARB(@AutoSize("ids") @GLsizei int n, @GLuint IntBuffer ids); + + @Alternate("glDeleteQueriesARB") + void glDeleteQueriesARB(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, id)", keepParam = true) int id); + + boolean glIsQueryARB(@GLuint int id); + + void glBeginQueryARB(@GLenum int target, @GLuint int id); + + void glEndQueryARB(@GLenum int target); + + @StripPostfix("params") + void glGetQueryivARB(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetQueryiARB} instead. */ + @Alternate("glGetQueryivARB") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "ARBOcclusionQuery", method = "glGetQueryiARB") + @Deprecated + void glGetQueryivARB2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetQueryivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryivARB3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectivARB(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetQueryObjectivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectivARB2(@GLuint int id, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectuivARB(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetQueryObjectuivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectuivARB2(@GLuint int id, @GLenum int pname, @OutParameter IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query2.java new file mode 100644 index 0000000..fb53b5c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_occlusion_query2.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_occlusion_query2 { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + int GL_ANY_SAMPLES_PASSED = 0x8C2F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_pixel_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_pixel_buffer_object.java new file mode 100644 index 0000000..06d4596 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_pixel_buffer_object.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_pixel_buffer_object extends ARB_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv: + */ + int GL_PIXEL_PACK_BUFFER_ARB = 0x88EB; + int GL_PIXEL_UNPACK_BUFFER_ARB = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PIXEL_PACK_BUFFER_BINDING_ARB = 0x88ED; + int GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = 0x88EF; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_parameters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_parameters.java new file mode 100644 index 0000000..403caaa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_parameters.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.*; + +public interface ARB_point_parameters { + + int GL_POINT_SIZE_MIN_ARB = 0x8126; + int GL_POINT_SIZE_MAX_ARB = 0x8127; + int GL_POINT_FADE_THRESHOLD_SIZE_ARB = 0x8128; + int GL_POINT_DISTANCE_ATTENUATION_ARB = 0x8129; + + void glPointParameterfARB(@GLenum int pname, float param); + + @StripPostfix("pfParams") + void glPointParameterfvARB(@GLenum int pname, @Check("4") @Const FloatBuffer pfParams); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_sprite.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_sprite.java new file mode 100644 index 0000000..3abb52f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_point_sprite.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_point_sprite { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the &lt;target&gt; parameter of TexEnvi, TexEnviv, + * TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv: + */ + int GL_POINT_SPRITE_ARB = 0x8861; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_ARB, then the value of + * &lt;pname&gt; may be: + */ + int GL_COORD_REPLACE_ARB = 0x8862; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program.java new file mode 100644 index 0000000..e56fa9b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +@Extension(postfix = "ARB", isFinal = false) +public interface ARB_program { + + /** Accepted by the &lt;format&gt; parameter of ProgramStringARB: */ + int GL_PROGRAM_FORMAT_ASCII_ARB = 0x8875; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_PROGRAM_LENGTH_ARB = 0x8627; + int GL_PROGRAM_FORMAT_ARB = 0x8876; + int GL_PROGRAM_BINDING_ARB = 0x8677; + int GL_PROGRAM_INSTRUCTIONS_ARB = 0x88A0; + int GL_MAX_PROGRAM_INSTRUCTIONS_ARB = 0x88A1; + int GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A2; + int GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = 0x88A3; + int GL_PROGRAM_TEMPORARIES_ARB = 0x88A4; + int GL_MAX_PROGRAM_TEMPORARIES_ARB = 0x88A5; + int GL_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A6; + int GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = 0x88A7; + int GL_PROGRAM_PARAMETERS_ARB = 0x88A8; + int GL_MAX_PROGRAM_PARAMETERS_ARB = 0x88A9; + int GL_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AA; + int GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = 0x88AB; + int GL_PROGRAM_ATTRIBS_ARB = 0x88AC; + int GL_MAX_PROGRAM_ATTRIBS_ARB = 0x88AD; + int GL_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AE; + int GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = 0x88AF; + int GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = 0x88B4; + int GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = 0x88B5; + int GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = 0x88B6; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramStringARB: */ + int GL_PROGRAM_STRING_ARB = 0x8628; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PROGRAM_ERROR_POSITION_ARB = 0x864B; + int GL_CURRENT_MATRIX_ARB = 0x8641; + int GL_TRANSPOSE_CURRENT_MATRIX_ARB = 0x88B7; + int GL_CURRENT_MATRIX_STACK_DEPTH_ARB = 0x8640; + int GL_MAX_PROGRAM_MATRICES_ARB = 0x862F; + int GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = 0x862E; + + /** Accepted by the &lt;name&gt; parameter of GetString: */ + int GL_PROGRAM_ERROR_STRING_ARB = 0x8874; + + /** Accepted by the &lt;mode&gt; parameter of MatrixMode: */ + int GL_MATRIX0_ARB = 0x88C0; + int GL_MATRIX1_ARB = 0x88C1; + int GL_MATRIX2_ARB = 0x88C2; + int GL_MATRIX3_ARB = 0x88C3; + int GL_MATRIX4_ARB = 0x88C4; + int GL_MATRIX5_ARB = 0x88C5; + int GL_MATRIX6_ARB = 0x88C6; + int GL_MATRIX7_ARB = 0x88C7; + int GL_MATRIX8_ARB = 0x88C8; + int GL_MATRIX9_ARB = 0x88C9; + int GL_MATRIX10_ARB = 0x88CA; + int GL_MATRIX11_ARB = 0x88CB; + int GL_MATRIX12_ARB = 0x88CC; + int GL_MATRIX13_ARB = 0x88CD; + int GL_MATRIX14_ARB = 0x88CE; + int GL_MATRIX15_ARB = 0x88CF; + int GL_MATRIX16_ARB = 0x88D0; + int GL_MATRIX17_ARB = 0x88D1; + int GL_MATRIX18_ARB = 0x88D2; + int GL_MATRIX19_ARB = 0x88D3; + int GL_MATRIX20_ARB = 0x88D4; + int GL_MATRIX21_ARB = 0x88D5; + int GL_MATRIX22_ARB = 0x88D6; + int GL_MATRIX23_ARB = 0x88D7; + int GL_MATRIX24_ARB = 0x88D8; + int GL_MATRIX25_ARB = 0x88D9; + int GL_MATRIX26_ARB = 0x88DA; + int GL_MATRIX27_ARB = 0x88DB; + int GL_MATRIX28_ARB = 0x88DC; + int GL_MATRIX29_ARB = 0x88DD; + int GL_MATRIX30_ARB = 0x88DE; + int GL_MATRIX31_ARB = 0x88DF; + + void glProgramStringARB(@GLenum int target, @GLenum int format, @AutoSize("string") @GLsizei int length, @Const @GLbyte Buffer string); + + @Alternate("glProgramStringARB") + void glProgramStringARB(@GLenum int target, @GLenum int format, @Constant("string.length()") @GLsizei int length, CharSequence string); + + void glBindProgramARB(@GLenum int target, @GLuint int program); + + void glDeleteProgramsARB(@AutoSize("programs") @GLsizei int n, @Const @GLuint IntBuffer programs); + + @Alternate("glDeleteProgramsARB") + void glDeleteProgramsARB(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, program)", keepParam = true) int program); + + void glGenProgramsARB(@AutoSize("programs") @GLsizei int n, @OutParameter @GLuint IntBuffer programs); + + @Alternate("glGenProgramsARB") + @GLreturn("programs") + void glGenProgramsARB2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer programs); + + void glProgramEnvParameter4fARB(int target, int index, float x, float y, float z, float w); + + void glProgramEnvParameter4dARB(int target, int index, double x, double y, double z, double w); + + @StripPostfix("params") + void glProgramEnvParameter4fvARB(@GLenum int target, @GLuint int index, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glProgramEnvParameter4dvARB(@GLenum int target, @GLuint int index, @Check("4") @Const DoubleBuffer params); + + void glProgramLocalParameter4fARB(@GLenum int target, @GLuint int index, float x, float y, float z, float w); + + void glProgramLocalParameter4dARB(@GLenum int target, @GLuint int index, double x, double y, double z, double w); + + @StripPostfix("params") + void glProgramLocalParameter4fvARB(@GLenum int target, @GLuint int index, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glProgramLocalParameter4dvARB(@GLenum int target, @GLuint int index, @Check("4") @Const DoubleBuffer params); + + @StripPostfix("params") + void glGetProgramEnvParameterfvARB(@GLenum int target, @GLuint int index, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetProgramEnvParameterdvARB(@GLenum int target, @GLuint int index, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetProgramLocalParameterfvARB(@GLenum int target, @GLuint int index, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetProgramLocalParameterdvARB(@GLenum int target, @GLuint int index, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetProgramivARB(@GLenum int target, @GLenum int parameterName, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetProgramiARB} instead. */ + @Alternate("glGetProgramivARB") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "ARBProgram", method = "glGetProgramiARB") + @Deprecated + void glGetProgramivARB2(@GLenum int target, @GLenum int parameterName, @OutParameter IntBuffer params); + + @Alternate("glGetProgramivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramivARB3(@GLenum int target, @GLenum int parameterName, @OutParameter IntBuffer params); + + void glGetProgramStringARB(@GLenum int target, @GLenum int parameterName, @OutParameter @Check @GLbyte Buffer paramString); + + @Alternate("glGetProgramStringARB") + @Code("\t\tint programLength = glGetProgramiARB(target, GL_PROGRAM_LENGTH_ARB);") + @GLreturn(value="paramString", maxLength = "programLength", forceMaxLength = true) + void glGetProgramStringARB2(@GLenum int target, @GLenum int parameterName, @OutParameter @GLchar ByteBuffer paramString); + + boolean glIsProgramARB(@GLuint int program); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program_interface_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program_interface_query.java new file mode 100644 index 0000000..4a0d023 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_program_interface_query.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_program_interface_query { + + /** + * Accepted by the &lt;programInterface&gt; parameter of GetProgramInterfaceiv, + * GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex: + */ + int GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramInterfaceiv: */ + int GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** Accepted in the &lt;props&gt; array of GetProgramResourceiv: */ + int GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + @Reuse("GL43") + @StripPostfix("params") + void glGetProgramInterfaceiv(@GLuint int program, @GLenum int programInterface, + @GLenum int pname, @Check("1") @OutParameter IntBuffer params); + + @Reuse("GL43") + @Alternate("glGetProgramInterfaceiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramInterfaceiv2(@GLuint int program, @GLenum int programInterface, + @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL43") + @GLuint + int glGetProgramResourceIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Reuse("GL43") + @Alternate("glGetProgramResourceIndex") + @GLuint + int glGetProgramResourceIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + + @Reuse("GL43") + void glGetProgramResourceName(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @AutoSize(value = "name", canBeNull = true) @GLsizei int bufSize, @Check(value = "1", canBeNull = true) @OutParameter @GLsizei IntBuffer length, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer name); + + @Reuse("GL43") + @Alternate("glGetProgramResourceName") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetProgramResourceName2(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @Reuse("GL43") + @StripPostfix("params") + void glGetProgramResourceiv(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @AutoSize("props") @GLsizei int propCount, + @Const @GLenum IntBuffer props, @AutoSize("params") @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @OutParameter @GLsizei IntBuffer length, @OutParameter IntBuffer params); + + @Reuse("GL43") + int glGetProgramResourceLocation(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Reuse("GL43") + @Alternate("glGetProgramResourceLocation") + int glGetProgramResourceLocation(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + + @Reuse("GL43") + int glGetProgramResourceLocationIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Reuse("GL43") + @Alternate("glGetProgramResourceLocationIndex") + int glGetProgramResourceLocationIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_provoking_vertex.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_provoking_vertex.java new file mode 100644 index 0000000..0bca11b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_provoking_vertex.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ARB_provoking_vertex { + + /** Accepted by the &lt;mode&gt; parameter of ProvokingVertex: */ + int GL_FIRST_VERTEX_CONVENTION = 0x8E4D; + int GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PROVOKING_VERTEX = 0x8E4F; + int GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + @Reuse("GL32") + void glProvokingVertex(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_query_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_query_buffer_object.java new file mode 100644 index 0000000..84da512 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_query_buffer_object.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_query_buffer_object { + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv, GetBufferParameteri64v, GetBufferPointerv, + * ClearBufferSubData, and the &lt;readtarget&gt; and &lt;writetarget&gt; parameters of + * CopyBufferSubData: + */ + int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** Accepted in the &lt;barriers&gt; bitfield in MemoryBarrier: */ + int GL_QUERY_BUFFER_BARRIER_BIT = 0x00008000; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robust_buffer_access_behavior.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robust_buffer_access_behavior.java new file mode 100644 index 0000000..b7f9177 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robust_buffer_access_behavior.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_robust_buffer_access_behavior { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness.java new file mode 100644 index 0000000..6b8f31e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +@Dependent +@DeprecatedGL +public interface ARB_robustness { + + /** Returned by GetGraphicsResetStatusARB: */ + int GL_NO_ERROR = 0x0000, + GL_GUILTY_CONTEXT_RESET_ARB = 0x8253, + GL_INNOCENT_CONTEXT_RESET_ARB = 0x8254, + GL_UNKNOWN_CONTEXT_RESET_ARB = 0x8255; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_RESET_NOTIFICATION_STRATEGY_ARB = 0x8256; + + /** + * Returned by GetIntegerv and related simple queries when + * &lt;value&gt; is RESET_NOTIFICATION_STRATEGY_ARB: + */ + int GL_LOSE_CONTEXT_ON_RESET_ARB = 0x8252, + GL_NO_RESET_NOTIFICATION_ARB = 0x8261; + + /** Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: */ + int GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB = 0x00000004; + + @GLenum + int glGetGraphicsResetStatusARB(); + + @DeprecatedGL + void glGetnMapdvARB(@GLenum int target, @GLenum int query, @Constant("v.remaining() << 3") @GLsizei int bufSize, @OutParameter @Check DoubleBuffer v); + + @DeprecatedGL + void glGetnMapfvARB(@GLenum int target, @GLenum int query, @Constant("v.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check FloatBuffer v); + + @DeprecatedGL + void glGetnMapivARB(@GLenum int target, @GLenum int query, @Constant("v.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check IntBuffer v); + + @DeprecatedGL + void glGetnPixelMapfvARB(@GLenum int map, @Constant("values.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check FloatBuffer values); + + @DeprecatedGL + void glGetnPixelMapuivARB(@GLenum int map, @Constant("values.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check @GLuint IntBuffer values); + + @DeprecatedGL + void glGetnPixelMapusvARB(@GLenum int map, @Constant("values.remaining() << 1") @GLsizei int bufSize, @OutParameter @Check @GLushort ShortBuffer values); + + @DeprecatedGL + void glGetnPolygonStippleARB(@AutoSize("pattern") @GLsizei int bufSize, @OutParameter @GLubyte ByteBuffer pattern); + + void glGetnTexImageARB(@GLenum int target, int level, @GLenum int format, @GLenum int type, @AutoSize("img") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer img); + + void glReadnPixelsARB(int x, int y, @GLsizei int width, @GLsizei int height, + @GLenum int format, @GLenum int type, @AutoSize("data") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + @Dependent("GL_ARB_imaging") + void glGetnColorTableARB(@GLenum int target, @GLenum int format, @GLenum int type, @AutoSize("table") @GLsizei int bufSize, + @OutParameter + @GLbyte + @GLfloat + @GLdouble Buffer table); + + @Dependent("GL_ARB_imaging") + void glGetnConvolutionFilterARB(@GLenum int target, @GLenum int format, @GLenum int type, @AutoSize("image") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer image); + + @Dependent("GL_ARB_imaging") + void glGetnSeparableFilterARB(@GLenum int target, @GLenum int format, @GLenum int type, + @AutoSize("row") @GLsizei int rowBufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer row, + @AutoSize("column") @GLsizei int columnBufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer column, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer span); + + @Dependent("GL_ARB_imaging") + void glGetnHistogramARB(@GLenum int target, boolean reset, @GLenum int format, @GLenum int type, @AutoSize("values") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer values); + + @Dependent("GL_ARB_imaging") + void glGetnMinmaxARB(@GLenum int target, boolean reset, @GLenum int format, @GLenum int type, @AutoSize("values") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer values); + + @Dependent("OpenGL13") + void glGetnCompressedTexImageARB(@GLenum int target, int lod, @AutoSize("img") @GLsizei int bufSize, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @GLbyte + @GLshort + @GLint Buffer img); + + @Dependent("OpenGL20") + void glGetnUniformfvARB(@GLuint int program, int location, @Constant("params.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check FloatBuffer params); + + @Dependent("OpenGL20") + void glGetnUniformivARB(@GLuint int program, int location, @Constant("params.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check IntBuffer params); + + @Dependent("OpenGL20") + void glGetnUniformuivARB(@GLuint int program, int location, @Constant("params.remaining() << 2") @GLsizei int bufSize, @OutParameter @Check @GLuint IntBuffer params); + + @Dependent("OpenGL20") + void glGetnUniformdvARB(@GLuint int program, int location, @Constant("params.remaining() << 3") @GLsizei int bufSize, @OutParameter @Check DoubleBuffer params); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness_isolation.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness_isolation.java new file mode 100644 index 0000000..fc2341f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_robustness_isolation.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_robustness_isolation { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sample_shading.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sample_shading.java new file mode 100644 index 0000000..4c2ac57 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sample_shading.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLclampf; + +public interface ARB_sample_shading { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_SAMPLE_SHADING_ARB = 0x8C36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + int GL_MIN_SAMPLE_SHADING_VALUE_ARB = 0x8C37; + + void glMinSampleShadingARB(@GLclampf float value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sampler_objects.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sampler_objects.java new file mode 100644 index 0000000..24057c1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sampler_objects.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_sampler_objects { + + /** + * Accepted by the &lt;value&gt; parameter of the GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev functions: + */ + int GL_SAMPLER_BINDING = 0x8919; + + @Reuse("GL33") + void glGenSamplers(@AutoSize("samplers") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + @Reuse("GL33") + @Alternate("glGenSamplers") + @GLreturn("samplers") + void glGenSamplers2(@Constant("1") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + @Reuse("GL33") + void glDeleteSamplers(@AutoSize("samplers") @GLsizei int count, @Const @GLuint IntBuffer samplers); + + @Reuse("GL33") + @Alternate("glDeleteSamplers") + void glDeleteSamplers(@Constant("1") @GLsizei int count, @Constant(value = "APIUtil.getInt(caps, sampler)", keepParam = true) int sampler); + + @Reuse("GL33") + boolean glIsSampler(@GLuint int sampler); + + @Reuse("GL33") + void glBindSampler(@GLenum int unit, @GLuint int sampler); + + @Reuse("GL33") + void glSamplerParameteri(@GLuint int sampler, @GLenum int pname, int param); + + @Reuse("GL33") + void glSamplerParameterf(@GLuint int sampler, @GLenum int pname, float param); + + @Reuse("GL33") + @StripPostfix("params") + void glSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glSamplerParameterIiv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glSamplerParameterIuiv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const @GLuint IntBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glGetSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Reuse("GL33") + @Alternate("glGetSamplerParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameteriv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glGetSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Reuse("GL33") + @Alternate("glGetSamplerParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterfv2(@GLuint int sampler, @GLenum int pname, @OutParameter FloatBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glGetSamplerParameterIiv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Reuse("GL33") + @Alternate("glGetSamplerParameterIiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterIiv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glGetSamplerParameterIuiv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Reuse("GL33") + @Alternate("glGetSamplerParameterIuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterIuiv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cube_map.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cube_map.java new file mode 100644 index 0000000..0a58ffb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cube_map.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_seamless_cube_map { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cubemap_per_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cubemap_per_texture.java new file mode 100644 index 0000000..2d10ca3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_seamless_cubemap_per_texture.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_seamless_cubemap_per_texture { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameter{if}, + * TexParameter{if}v, GetTexParameter{if}v, SamplerParameter{if}, + * SamplerParameter{if}v, and GetSamplerParameter{if}v: + */ + int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_separate_shader_objects.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_separate_shader_objects.java new file mode 100644 index 0000000..1937ed0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_separate_shader_objects.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_separate_shader_objects { + + /** Accepted by &lt;stages&gt; parameter to UseProgramStages: */ + int GL_VERTEX_SHADER_BIT = 0x00000001, + GL_FRAGMENT_SHADER_BIT = 0x00000002, + GL_GEOMETRY_SHADER_BIT = 0x00000004, + GL_TESS_CONTROL_SHADER_BIT = 0x00000008, + GL_TESS_EVALUATION_SHADER_BIT = 0x00000010, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + int GL_PROGRAM_SEPARABLE = 0x8258; + + /** Accepted by &lt;type&gt; parameter to GetProgramPipelineiv: */ + int GL_ACTIVE_PROGRAM = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + @Reuse("GL41") + void glUseProgramStages(@GLuint int pipeline, @GLbitfield int stages, @GLuint int program); + + @Reuse("GL41") + void glActiveShaderProgram(@GLuint int pipeline, @GLuint int program); + + /** Single null-terminated source code string. */ + @Reuse("GL41") + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated @Check @Const @Indirect @GLchar ByteBuffer string); + + /** Multiple null-terminated source code strings, one after the other. */ + @Reuse("GL41") + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv2(@GLenum int type, @GLsizei int count, @NullTerminated("count") @Check @Const @Indirect @GLchar @PointerArray("count") ByteBuffer strings); + + @Reuse("GL41") + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv3(@GLenum int type, @Constant("strings.length") @GLsizei int count, @NullTerminated @Check("1") @PointerArray(value = "count") @Const @NativeType("GLchar") ByteBuffer[] strings); + + @Reuse("GL41") + @Alternate("glCreateShaderProgramv") + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated CharSequence string); + + @Reuse("GL41") + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true, skipNative = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv2(@GLenum int type, @Constant("strings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings); + + @Reuse("GL41") + void glBindProgramPipeline(@GLuint int pipeline); + + @Reuse("GL41") + void glDeleteProgramPipelines(@AutoSize("pipelines") @GLsizei int n, @Const @GLuint IntBuffer pipelines); + + @Reuse("GL41") + @Alternate("glDeleteProgramPipelines") + void glDeleteProgramPipelines(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, pipeline)", keepParam = true) int pipeline); + + @Reuse("GL41") + void glGenProgramPipelines(@AutoSize("pipelines") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + @Reuse("GL41") + @Alternate("glGenProgramPipelines") + @GLreturn("pipelines") + void glGenProgramPipelines2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + @Reuse("GL41") + boolean glIsProgramPipeline(@GLuint int pipeline); + + @Reuse("GL41") + void glProgramParameteri(@GLuint int program, @GLenum int pname, int value); + + @Reuse("GL41") + @StripPostfix("params") + void glGetProgramPipelineiv(@GLuint int pipeline, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Reuse("GL41") + @Alternate("glGetProgramPipelineiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramPipelineiv2(@GLuint int pipeline, @GLenum int pname, @OutParameter IntBuffer params); + + @Reuse("GL41") + void glProgramUniform1i(@GLuint int program, int location, int v0); + + @Reuse("GL41") + void glProgramUniform2i(@GLuint int program, int location, int v0, int v1); + + @Reuse("GL41") + void glProgramUniform3i(@GLuint int program, int location, int v0, int v1, int v2); + + @Reuse("GL41") + void glProgramUniform4i(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + @Reuse("GL41") + void glProgramUniform1f(@GLuint int program, int location, float v0); + + @Reuse("GL41") + void glProgramUniform2f(@GLuint int program, int location, float v0, float v1); + + @Reuse("GL41") + void glProgramUniform3f(@GLuint int program, int location, float v0, float v1, float v2); + + @Reuse("GL41") + void glProgramUniform4f(@GLuint int program, int location, float v0, float v1, float v2, float v3); + + @Reuse("GL41") + void glProgramUniform1d(@GLuint int program, int location, double v0); + + @Reuse("GL41") + void glProgramUniform2d(@GLuint int program, int location, double v0, double v1); + + @Reuse("GL41") + void glProgramUniform3d(@GLuint int program, int location, double v0, double v1, double v2); + + @Reuse("GL41") + void glProgramUniform4d(@GLuint int program, int location, double v0, double v1, double v2, double v3); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform1iv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform2iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform3iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform4iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform1fv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform2fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform3fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform4fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform1dv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform2dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform3dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform4dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const DoubleBuffer value); + + @Reuse("GL41") + void glProgramUniform1ui(@GLuint int program, int location, int v0); + + @Reuse("GL41") + void glProgramUniform2ui(@GLuint int program, int location, int v0, int v1); + + @Reuse("GL41") + void glProgramUniform3ui(@GLuint int program, int location, int v0, int v1, int v2); + + @Reuse("GL41") + void glProgramUniform4ui(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform1uiv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform2uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform3uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniform4uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2x3fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3x2fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2x4fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4x2fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3x4fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4x3fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2x3dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3x2dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix2x4dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4x2dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix3x4dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + @StripPostfix("value") + void glProgramUniformMatrix4x3dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @Reuse("GL41") + void glValidateProgramPipeline(@GLuint int pipeline); + + @Reuse("GL41") + void glGetProgramPipelineInfoLog(@GLuint int pipeline, @AutoSize("infoLog") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Reuse("GL41") + @Alternate("glGetProgramPipelineInfoLog") + @GLreturn(value = "infoLog", maxLength = "bufSize") + void glGetProgramPipelineInfoLog2(@GLuint int pipeline, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_atomic_counters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_atomic_counters.java new file mode 100644 index 0000000..3d07369 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_atomic_counters.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_shader_atomic_counters { + + /** Accepted by the &lt;target&gt; parameter of BindBufferBase and BindBufferRange: */ + int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv: + */ + int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_64v: */ + int GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: */ + int GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: */ + int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** Returned in &lt;params&gt; by GetActiveUniform and GetActiveUniformsiv: */ + int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + @StripPostfix("params") + @Reuse("GL42") + void glGetActiveAtomicCounterBufferiv(@GLuint int program, @GLuint int bufferIndex, @GLenum int pname, @Check("1") @OutParameter IntBuffer params); + + @Alternate("glGetActiveAtomicCounterBufferiv") + @StripPostfix("params") + @GLreturn("params") + @Reuse("GL42") + void glGetActiveAtomicCounterBufferiv2(@GLuint int program, @GLuint int bufferIndex, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_bit_encoding.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_bit_encoding.java new file mode 100644 index 0000000..0c7a561 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_bit_encoding.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_bit_encoding { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_draw_parameters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_draw_parameters.java new file mode 100644 index 0000000..28f4126 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_draw_parameters.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_draw_parameters { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_group_vote.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_group_vote.java new file mode 100644 index 0000000..9e142b7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_group_vote.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_group_vote { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_load_store.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_load_store.java new file mode 100644 index 0000000..72ff184 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_load_store.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_shader_image_load_store { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: */ + int GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: */ + int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x00000001, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x00000002, + GL_UNIFORM_BARRIER_BIT = 0x00000004, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x00000008, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x00000020, + GL_COMMAND_BARRIER_BIT = 0x00000040, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x00000080, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x00000100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x00000200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x00000400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x00000800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x00001000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv: + */ + int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the &lt;data&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv when &lt;value&gt; is + * IMAGE_FORMAT_COMPATIBILITY_TYPE: + */ + int GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + @Reuse("GL42") + void glBindImageTexture(@GLuint int unit, @GLuint int texture, int level, + boolean layered, int layer, @GLenum int access, + @GLenum int format); + + @Reuse("GL42") + void glMemoryBarrier(@GLbitfield int barriers); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_size.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_size.java new file mode 100644 index 0000000..cc968b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_image_size.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_image_size { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_objects.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_objects.java new file mode 100644 index 0000000..20cb80a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_objects.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface ARB_shader_objects { + + /** Accepted by the &lt;pname&gt; argument of GetHandleARB: */ + int GL_PROGRAM_OBJECT_ARB = 0x8B40; + + /** Accepted by the &lt;pname&gt; parameter of GetObjectParameter{fi}vARB: */ + int GL_OBJECT_TYPE_ARB = 0x8B4E; + int GL_OBJECT_SUBTYPE_ARB = 0x8B4F; + int GL_OBJECT_DELETE_STATUS_ARB = 0x8B80; + int GL_OBJECT_COMPILE_STATUS_ARB = 0x8B81; + int GL_OBJECT_LINK_STATUS_ARB = 0x8B82; + int GL_OBJECT_VALIDATE_STATUS_ARB = 0x8B83; + int GL_OBJECT_INFO_LOG_LENGTH_ARB = 0x8B84; + int GL_OBJECT_ATTACHED_OBJECTS_ARB = 0x8B85; + int GL_OBJECT_ACTIVE_UNIFORMS_ARB = 0x8B86; + int GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = 0x8B87; + int GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = 0x8B88; + + /** Returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: */ + int GL_SHADER_OBJECT_ARB = 0x8B48; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniformARB: */ + int GL_FLOAT_VEC2_ARB = 0x8B50; + int GL_FLOAT_VEC3_ARB = 0x8B51; + int GL_FLOAT_VEC4_ARB = 0x8B52; + int GL_INT_VEC2_ARB = 0x8B53; + int GL_INT_VEC3_ARB = 0x8B54; + int GL_INT_VEC4_ARB = 0x8B55; + int GL_BOOL_ARB = 0x8B56; + int GL_BOOL_VEC2_ARB = 0x8B57; + int GL_BOOL_VEC3_ARB = 0x8B58; + int GL_BOOL_VEC4_ARB = 0x8B59; + int GL_FLOAT_MAT2_ARB = 0x8B5A; + int GL_FLOAT_MAT3_ARB = 0x8B5B; + int GL_FLOAT_MAT4_ARB = 0x8B5C; + int GL_SAMPLER_1D_ARB = 0x8B5D; + int GL_SAMPLER_2D_ARB = 0x8B5E; + int GL_SAMPLER_3D_ARB = 0x8B5F; + int GL_SAMPLER_CUBE_ARB = 0x8B60; + int GL_SAMPLER_1D_SHADOW_ARB = 0x8B61; + int GL_SAMPLER_2D_SHADOW_ARB = 0x8B62; + int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + + void glDeleteObjectARB(@GLhandleARB int obj); + + @GLhandleARB + int glGetHandleARB(@GLenum int pname); + + void glDetachObjectARB(@GLhandleARB int containerObj, @GLhandleARB int attachedObj); + + @GLhandleARB + int glCreateShaderObjectARB(@GLenum int shaderType); + + /** + * The ARB_shader_objects extension allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + */ + void glShaderSourceARB(@GLhandleARB int shader, @Constant("1") @GLsizei int count, + @Indirect @Const @GLcharARB @Check ByteBuffer string, + @AutoSize("string") @Indirect @Const @GLint int length); + + @Alternate("glShaderSourceARB") + void glShaderSourceARB2(@GLhandleARB int shader, @Constant("1") @GLsizei int count, CharSequence string, @Constant("string.length()") @Indirect @Const int length); + + @Alternate(value = "glShaderSourceARB", nativeAlt = true) + void glShaderSourceARB3(@GLhandleARB int shader, @Constant("strings.length") @GLsizei int count, + @Const @PointerArray(value = "count", lengths = "length") CharSequence[] strings, + @Constant("APIUtil.getLengths(caps, strings)") @Const IntBuffer length); + + void glCompileShaderARB(@GLhandleARB int shaderObj); + + @GLhandleARB + int glCreateProgramObjectARB(); + + void glAttachObjectARB(@GLhandleARB int containerObj, @GLhandleARB int obj); + + void glLinkProgramARB(@GLhandleARB int programObj); + + void glUseProgramObjectARB(@GLhandleARB int programObj); + + void glValidateProgramARB(@GLhandleARB int programObj); + + void glUniform1fARB(int location, float v0); + + void glUniform2fARB(int location, float v0, float v1); + + void glUniform3fARB(int location, float v0, float v1, float v2); + + void glUniform4fARB(int location, float v0, float v1, float v2, float v3); + + void glUniform1iARB(int location, int v0); + + void glUniform2iARB(int location, int v0, int v1); + + void glUniform3iARB(int location, int v0, int v1, int v2); + + void glUniform4iARB(int location, int v0, int v1, int v2, int v3); + + @StripPostfix("values") + void glUniform1fvARB(int location, @AutoSize("values") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform2fvARB(int location, @AutoSize(value = "values", expression = " >> 1") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform3fvARB(int location, @AutoSize(value = "values", expression = " / 3") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform4fvARB(int location, @AutoSize(value = "values", expression = " >> 2") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform1ivARB(int location, @AutoSize(value = "values") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform2ivARB(int location, @AutoSize(value = "values", expression = " >> 1") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform3ivARB(int location, @AutoSize(value = "values", expression = " / 3") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform4ivARB(int location, @AutoSize(value = "values", expression = " >> 2") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("matrices") + void glUniformMatrix2fvARB(int location, @AutoSize(value = "matrices", expression = " >> 2") @GLsizei int count, boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3fvARB(int location, @AutoSize(value = "matrices", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4fvARB(int location, @AutoSize(value = "matrices", expression = " >> 4") @GLsizei int count, boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("params") + void glGetObjectParameterfvARB(@GLhandleARB int obj, @GLenum int pname, @OutParameter @Check FloatBuffer params); + + @Alternate("glGetObjectParameterfvARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetObjectParameterfvARB2(@GLhandleARB int obj, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetObjectParameterivARB(@GLhandleARB int obj, @GLenum int pname, @OutParameter @Check IntBuffer params); + + @Alternate("glGetObjectParameterivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetObjectParameterivARB2(@GLhandleARB int obj, @GLenum int pname, @OutParameter IntBuffer params); + + void glGetInfoLogARB(@GLhandleARB int obj, @AutoSize("infoLog") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLcharARB ByteBuffer infoLog); + + @Alternate("glGetInfoLogARB") + @GLreturn(value = "infoLog", maxLength = "maxLength") + void glGetInfoLogARB2(@GLhandleARB int obj, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLcharARB ByteBuffer infoLog); + + void glGetAttachedObjectsARB(@GLhandleARB int containerObj, @AutoSize("obj") @GLsizei int maxCount, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer count, + @OutParameter @GLhandleARB IntBuffer obj); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a <b>null-terminated</b> string. + * + * @param programObj + * @param name + */ + int glGetUniformLocationARB(@GLhandleARB int programObj, @NullTerminated @Const @GLcharARB ByteBuffer name); + + @Alternate("glGetUniformLocationARB") + int glGetUniformLocationARB(@GLhandleARB int programObj, @NullTerminated CharSequence name); + + void glGetActiveUniformARB(@GLhandleARB int programObj, @GLuint int index, @AutoSize("name") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveUniformARB") + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveUniformARB2(@GLhandleARB int programObj, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") IntBuffer type, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns only the uniform name. */ + @Alternate(value = "glGetActiveUniformARB", javaAlt = true) + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveUniformARB(@GLhandleARB int programObj, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1)") IntBuffer length, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns only the uniform size. */ + @Alternate(value = "glGetActiveUniformARB", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveUniformSizeARB(@GLhandleARB int programObj, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLcharARB @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns only the uniform type. */ + @Alternate(value = "glGetActiveUniformARB", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveUniformTypeARB(@GLhandleARB int programObj, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLcharARB @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + @StripPostfix("params") + void glGetUniformfvARB(@GLhandleARB int programObj, int location, @OutParameter @Check FloatBuffer params); + + @StripPostfix("params") + void glGetUniformivARB(@GLhandleARB int programObj, int location, @OutParameter @Check IntBuffer params); + + void glGetShaderSourceARB(@GLhandleARB int obj, @AutoSize("source") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLcharARB ByteBuffer source); + + @Alternate("glGetShaderSourceARB") + @GLreturn(value = "source", maxLength = "maxLength") + void glGetShaderSourceARB2(@GLhandleARB int obj, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(source_length)") IntBuffer length, + @OutParameter @GLcharARB ByteBuffer source); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_precision.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_precision.java new file mode 100644 index 0000000..6de3426 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_precision.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_precision { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_stencil_export.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_stencil_export.java new file mode 100644 index 0000000..9cc71c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_stencil_export.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_stencil_export { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_storage_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_storage_buffer_object.java new file mode 100644 index 0000000..21eb78c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_storage_buffer_object.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_shader_storage_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetIntegeri_v, + * GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** Accepted in the &lt;barriers&gt; bitfield in glMemoryBarrier: */ + int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** + * Alias for the existing token + * MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS: + */ + int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + @Reuse("GL43") + void glShaderStorageBlockBinding(@GLuint int program, @GLuint int storageBlockIndex, + @GLuint int storageBlockBinding); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_subroutine.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_subroutine.java new file mode 100644 index 0000000..2cfd3fc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_subroutine.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_shader_subroutine { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramStageiv: */ + int GL_ACTIVE_SUBROUTINES = 0x8DE5; + int GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6; + int GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47; + int GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48; + int GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_SUBROUTINES = 0x8DE7; + int GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveSubroutineUniformiv: */ + int GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A; + int GL_COMPATIBLE_SUBROUTINES = 0x8E4B; + int GL_UNIFORM_SIZE = GL31.GL_UNIFORM_SIZE; + int GL_UNIFORM_NAME_LENGTH = GL31.GL_UNIFORM_NAME_LENGTH; + + @Reuse("GL40") + int glGetSubroutineUniformLocation(@GLuint int program, @GLenum int shadertype, @Const @NullTerminated ByteBuffer name); + + @Alternate("glGetSubroutineUniformLocation") + @Reuse("GL40") + int glGetSubroutineUniformLocation(@GLuint int program, @GLenum int shadertype, @NullTerminated CharSequence name); + + @Reuse("GL40") + @GLuint + int glGetSubroutineIndex(@GLuint int program, @GLenum int shadertype, @Const @NullTerminated ByteBuffer name); + + @Alternate("glGetSubroutineIndex") + @Reuse("GL40") + int glGetSubroutineIndex(@GLuint int program, @GLenum int shadertype, @NullTerminated CharSequence name); + + @Reuse("GL40") + @StripPostfix("values") + void glGetActiveSubroutineUniformiv(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLenum int pname, + @Check("1") @OutParameter IntBuffer values); + + @Reuse("GL40") + @Alternate("glGetActiveSubroutineUniformiv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetActiveSubroutineUniformiv2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLenum int pname, + @OutParameter IntBuffer values); + + @Reuse("GL40") + void glGetActiveSubroutineUniformName(@GLuint int program, @GLenum int shadertype, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter ByteBuffer name); + + @Reuse("GL40") + @Alternate("glGetActiveSubroutineUniformName") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveSubroutineUniformName2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @Reuse("GL40") + void glGetActiveSubroutineName(@GLuint int program, @GLenum int shadertype, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter ByteBuffer name); + + @Reuse("GL40") + @Alternate("glGetActiveSubroutineName") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveSubroutineName2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @Reuse("GL40") + @StripPostfix("indices") + void glUniformSubroutinesuiv(@GLenum int shadertype, @AutoSize("indices") @GLsizei int count, @Const @GLuint IntBuffer indices); + + @Reuse("GL40") + @StripPostfix("params") + void glGetUniformSubroutineuiv(@GLenum int shadertype, int location, @Check("1") @OutParameter @GLuint IntBuffer params); + + @Reuse("GL40") + @Alternate("glGetUniformSubroutineuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetUniformSubroutineuiv2(@GLenum int shadertype, int location, @OutParameter @GLuint IntBuffer params); + + @Reuse("GL40") + @StripPostfix("values") + void glGetProgramStageiv(@GLuint int program, @GLenum int shadertype, @GLenum int pname, @Check("1") @OutParameter IntBuffer values); + + @Reuse("GL40") + @Alternate("glGetProgramStageiv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetProgramStageiv2(@GLuint int program, @GLenum int shadertype, @GLenum int pname, @OutParameter IntBuffer values); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_texture_lod.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_texture_lod.java new file mode 100644 index 0000000..e646dea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shader_texture_lod.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shader_texture_lod { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_100.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_100.java new file mode 100644 index 0000000..a9b9865 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_100.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shading_language_100 { + + /** + * Accepted by the &lt;name&gt; parameter of GetString: + */ + int GL_SHADING_LANGUAGE_VERSION_ARB = 0x8B8C; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_420pack.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_420pack.java new file mode 100644 index 0000000..44d9dda --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_420pack.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shading_language_420pack { + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_include.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_include.java new file mode 100644 index 0000000..7f705d6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_include.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface ARB_shading_language_include { + + /** Accepted by the &lt;type&gt; parameter of NamedStringARB: */ + int GL_SHADER_INCLUDE_ARB = 0x8DAE; + + /** Accepted by the &lt;pname&gt; parameter of GetNamedStringivARB: */ + int GL_NAMED_STRING_LENGTH_ARB = 0x8DE9; + int GL_NAMED_STRING_TYPE_ARB = 0x8DEA; + + void glNamedStringARB(@GLenum int type, + @AutoSize("name") int namelen, @Const @GLchar ByteBuffer name, + @AutoSize("string") int stringlen, @Const @GLchar ByteBuffer string); + + @Alternate("glNamedStringARB") + void glNamedStringARB(@GLenum int type, + @Constant("name.length()") int namelen, CharSequence name, + @Constant("string.length()") int stringlen, CharSequence string); + + void glDeleteNamedStringARB(@AutoSize("name") int namelen, @Const @GLchar ByteBuffer name); + + @Alternate("glDeleteNamedStringARB") + void glDeleteNamedStringARB(@Constant("name.length()") int namelen, CharSequence name); + + void glCompileShaderIncludeARB(@GLuint int shader, @GLsizei int count, + @Const @NullTerminated("count") @PointerArray("count") @GLchar ByteBuffer path, + @Constant("0L") @Const IntBuffer length); + + @Alternate(value = "glCompileShaderIncludeARB", nativeAlt = true) + void glCompileShaderIncludeARB2(@GLuint int shader, @Constant("path.length") @GLsizei int count, + @Const @PointerArray(value = "count", lengths = "length") CharSequence[] path, + @Constant("APIUtil.getLengths(caps, path)") @Const IntBuffer length); + + boolean glIsNamedStringARB(@AutoSize("name") int namelen, @Const @GLchar ByteBuffer name); + + @Alternate("glIsNamedStringARB") + boolean glIsNamedStringARB(@Constant("name.length()") int namelen, CharSequence name); + + void glGetNamedStringARB(@AutoSize("name") int namelen, @Const @GLchar ByteBuffer name, + @AutoSize("string") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) IntBuffer stringlen, + @OutParameter @GLchar ByteBuffer string); + + @Alternate("glGetNamedStringARB") + void glGetNamedStringARB(@Constant("name.length()") int namelen, CharSequence name, + @AutoSize("string") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) IntBuffer stringlen, + @OutParameter @GLchar ByteBuffer string); + + @Alternate("glGetNamedStringARB") + @GLreturn(value = "string", maxLength = "bufSize") + void glGetNamedStringARB2(@Constant("name.length()") int namelen, CharSequence name, + @GLsizei int bufSize, + @OutParameter @Constant("MemoryUtil.getAddress0(string_length)") IntBuffer stringlen, + @OutParameter @GLchar ByteBuffer string); + + @StripPostfix("params") + void glGetNamedStringivARB(@AutoSize("name") int namelen, @Const @GLchar ByteBuffer name, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetNamedStringivARB") + @StripPostfix(value = "params", postfix = "v") + void glGetNamedStringivARB(@Constant("name.length()") int namelen, CharSequence name, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetNamedStringivARB") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetNamedStringivARB2(@Constant("name.length()") int namelen, CharSequence name, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_packing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_packing.java new file mode 100644 index 0000000..169f12f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shading_language_packing.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shading_language_packing { + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow.java new file mode 100644 index 0000000..c3d9c36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shadow { + int GL_TEXTURE_COMPARE_MODE_ARB = 0x884C; + int GL_TEXTURE_COMPARE_FUNC_ARB = 0x884D; + int GL_COMPARE_R_TO_TEXTURE_ARB = 0x884E; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow_ambient.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow_ambient.java new file mode 100644 index 0000000..e2cea05 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_shadow_ambient.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_shadow_ambient { + int GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = 0x80BF; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sparse_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sparse_texture.java new file mode 100644 index 0000000..a55ff15 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sparse_texture.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Dependent; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +@Dependent +public interface ARB_sparse_texture { + + /** + * Accepted by the &lt;pname&gt; parameter to TexParameter{i f}{v}, + * TexParameterI{u}v, GetTexParameter{if}v and GetTexParameterIi{u}v: + */ + int GL_TEXTURE_SPARSE_ARB = 0x91A6, + GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexParameter{if}v and + * GetTexParameterIi{u}v: + */ + int GL_NUM_SPARSE_LEVELS_ARB = 0x91AA; + + /** Accepted by the &lt;pname&gt; parameter to GetInternalformativ: */ + int GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8, + GL_VIRTUAL_PAGE_SIZE_X_ARB = 0x9195, + GL_VIRTUAL_PAGE_SIZE_Y_ARB = 0x9196, + GL_VIRTUAL_PAGE_SIZE_Z_ARB = 0x9197; + + /** + * Accepted by the &lt;pname&gt; parameter to GetIntegerv, GetFloatv, GetDoublev, + * GetInteger64v, and GetBooleanv: + */ + int GL_MAX_SPARSE_TEXTURE_SIZE_ARB = 0x9198, + GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB = 0x9199, + GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB = 0x919A, + GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9; + + void glTexPageCommitmentARB(@GLenum int target, + int level, + int xoffset, + int yoffset, + int zoffset, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + boolean commit); + + @Dependent("GL_EXT_direct_state_access") + void glTexturePageCommitmentEXT(@GLuint int texture, + @GLenum int target, + int level, + int xoffset, + int yoffset, + int zoffset, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + boolean commit); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_stencil_texturing.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_stencil_texturing.java new file mode 100644 index 0000000..a698aff --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_stencil_texturing.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_stencil_texturing { + + /** Accepted by the &lt;pname&gt; parameter of TexParameter* and GetTexParameter*: */ + int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sync.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sync.java new file mode 100644 index 0000000..6a3d9d2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_sync.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +@Extension(postfix = "") +public interface ARB_sync { + + /** Accepted as the &lt;pname&gt; parameter of GetInteger64v: */ + int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** Accepted as the &lt;pname&gt; parameter of GetSynciv: */ + int GL_OBJECT_TYPE = 0x9112; + int GL_SYNC_CONDITION = 0x9113; + int GL_SYNC_STATUS = 0x9114; + int GL_SYNC_FLAGS = 0x9115; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE: */ + int GL_SYNC_FENCE = 0x9116; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION: */ + int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_STATUS: */ + int GL_UNSIGNALED = 0x9118; + int GL_SIGNALED = 0x9119; + + /** Accepted in the &lt;flags&gt; parameter of ClientWaitSync: */ + int GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001; + + /** Accepted in the &lt;timeout&gt; parameter of WaitSync: */ + long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFl; + + /** Returned by ClientWaitSync: */ + int GL_ALREADY_SIGNALED = 0x911A; + int GL_TIMEOUT_EXPIRED = 0x911B; + int GL_CONDITION_SATISFIED = 0x911C; + int GL_WAIT_FAILED = 0x911D; + + @Reuse("GL32") + @PointerWrapper("GLsync") + GLSync glFenceSync(@GLenum int condition, @GLbitfield int flags); + + @Reuse("GL32") + boolean glIsSync(@PointerWrapper("GLsync") GLSync sync); + + @Reuse("GL32") + void glDeleteSync(@PointerWrapper("GLsync") GLSync sync); + + @Reuse("GL32") + @GLenum + int glClientWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + @Reuse("GL32") + void glWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + @Reuse("GL32") + @StripPostfix("params") + void glGetInteger64v(@GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer params); + + @Reuse("GL32") + @Alternate("glGetInteger64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetInteger64v2(@GLenum int pname, @OutParameter @GLint64 LongBuffer params); + + @Reuse("GL32") + @StripPostfix("values") + void glGetSynciv(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @AutoSize("values") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter IntBuffer values); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetSynci} instead. */ + @Alternate("glGetSynciv") + @GLreturn("values") + @StripPostfix("values") + @Reuse(value = "GL32", method = "glGetSynci") + @Deprecated + void glGetSynciv2(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); + + @Reuse("GL32") + @Alternate("glGetSynciv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetSynciv3(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_tessellation_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_tessellation_shader.java new file mode 100644 index 0000000..4177afc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_tessellation_shader.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.FloatBuffer; + +@Extension(postfix = "") +public interface ARB_tessellation_shader { + + /** + * Accepted by the &lt;mode&gt; parameter of Begin and all vertex array functions + * that implicitly call Begin: + */ + int GL_PATCHES = 0xE; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameteri, GetBooleanv, + * GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v: + */ + int GL_PATCH_VERTICES = 0x8E72; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameterfv, GetBooleanv, + * GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v: + */ + int GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73; + int GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75; + int GL_TESS_GEN_MODE = 0x8E76; + int GL_TESS_GEN_SPACING = 0x8E77; + int GL_TESS_GEN_VERTEX_ORDER = 0x8E78; + int GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_MODE: */ + int GL_TRIANGLES = GL11.GL_TRIANGLES; + int GL_QUADS = GL11.GL_QUADS; + int GL_ISOLINES = 0x8E7A; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_SPACING: */ + int GL_EQUAL = GL11.GL_EQUAL; + int GL_FRACTIONAL_ODD = 0x8E7B; + int GL_FRACTIONAL_EVEN = 0x8E7C; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_VERTEX_ORDER: */ + int GL_CCW = GL11.GL_CCW; + int GL_CW = GL11.GL_CW; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_POINT_MODE: */ + int GL_FALSE = GL11.GL_FALSE; + int GL_TRUE = GL11.GL_TRUE; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, + * GetIntegerv, and GetInteger64v: + */ + int GL_MAX_PATCH_VERTICES = 0x8E7D; + int GL_MAX_TESS_GEN_LEVEL = 0x8E7E; + int GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F; + int GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80; + int GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81; + int GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82; + int GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83; + int GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84; + int GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85; + int GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86; + int GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89; + int GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A; + int GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C; + int GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D; + int GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E; + int GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: */ + int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0; + int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + int GL_TESS_EVALUATION_SHADER = 0x8E87; + int GL_TESS_CONTROL_SHADER = 0x8E88; + + @Reuse("GL40") + void glPatchParameteri(@GLenum int pname, int value); + + @Reuse("GL40") + @StripPostfix("values") + void glPatchParameterfv(@GLenum int pname, @Check("4") @Const FloatBuffer values); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_border_clamp.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_border_clamp.java new file mode 100644 index 0000000..3530b1f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_border_clamp.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_border_clamp { + int GL_CLAMP_TO_BORDER_ARB = 0x812D; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object.java new file mode 100644 index 0000000..3e863c6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_texture_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, MapBufferRangeARB, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBufferARB, + * and the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + int GL_TEXTURE_BUFFER_ARB = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + int GL_MAX_TEXTURE_BUFFER_SIZE_ARB = 0x8C2B; + int GL_TEXTURE_BINDING_BUFFER_ARB = 0x8C2C; + int GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = 0x8C2D; + int GL_TEXTURE_BUFFER_FORMAT_ARB = 0x8C2E; + + void glTexBufferARB(@GLenum int target, @GLenum int internalformat, @GLuint int buffer); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object_rgb32.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object_rgb32.java new file mode 100644 index 0000000..31721b4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_object_rgb32.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Alias; + +@Alias("EXT_texture_buffer_object_rgb32") +public interface ARB_texture_buffer_object_rgb32 { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_range.java new file mode 100644 index 0000000..363b095 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_buffer_range.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Dependent; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLsizeiptr; +import org.lwjgl.util.generator.opengl.GLuint; + +@Dependent +public interface ARB_texture_buffer_range { + + /** Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: */ + int GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + @Reuse("GL43") + void glTexBufferRange(@GLenum int target, + @GLenum int internalformat, + @GLuint int buffer, + @GLintptr long offset, + @GLsizeiptr long size); + + @Dependent("GL_EXT_direct_state_access") + void glTextureBufferRangeEXT(@GLuint int texture, + @GLenum int target, + @GLenum int internalformat, + @GLuint int buffer, + @GLintptr long offset, + @GLsizeiptr long size); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression.java new file mode 100644 index 0000000..77b0fd7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.*; + +public interface ARB_texture_compression { + int GL_COMPRESSED_ALPHA_ARB = 0x84E9; + int GL_COMPRESSED_LUMINANCE_ARB = 0x84EA; + int GL_COMPRESSED_LUMINANCE_ALPHA_ARB = 0x84EB; + int GL_COMPRESSED_INTENSITY_ARB = 0x84EC; + int GL_COMPRESSED_RGB_ARB = 0x84ED; + int GL_COMPRESSED_RGBA_ARB = 0x84EE; + int GL_TEXTURE_COMPRESSION_HINT_ARB = 0x84EF; + int GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = 0x86A0; + int GL_TEXTURE_COMPRESSED_ARB = 0x86A1; + int GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A2; + int GL_COMPRESSED_TEXTURE_FORMATS_ARB = 0x86A3; + + void glCompressedTexImage1DARB(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, int border, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glCompressedTexImage2DARB(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, int border, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glCompressedTexImage3DARB(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glCompressedTexSubImage1DARB(@GLenum int target, int level, int xoffset, @GLsizei int width, @GLenum int format, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glCompressedTexSubImage2DARB(@GLenum int target, int level, int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glCompressedTexSubImage3DARB(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @AutoSize("pData") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer pData); + + void glGetCompressedTexImageARB(@GLenum int target, int lod, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLvoid + ByteBuffer pImg); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_bptc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_bptc.java new file mode 100644 index 0000000..c4776cd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_bptc.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Alias; +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "ARB", className = "ARBTextureCompressionBPTC") +@Alias("EXT_texture_compression_bptc") +public interface ARB_texture_compression_bptc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, TexImage3D, + * CopyTexImage2D, CopyTexImage3D, CompressedTexImage2DARB, and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB and CompressedTexSubImage3DARB: + */ + int GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C; + int GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D; + int GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E; + int GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_rgtc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_rgtc.java new file mode 100644 index 0000000..f0a14df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_compression_rgtc.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "ARB", className = "ARBTextureCompressionRGTC") +public interface ARB_texture_compression_rgtc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map.java new file mode 100644 index 0000000..eb41182 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_cube_map { + int GL_NORMAL_MAP_ARB = 0x8511; + int GL_REFLECTION_MAP_ARB = 0x8512; + int GL_TEXTURE_CUBE_MAP_ARB = 0x8513; + int GL_TEXTURE_BINDING_CUBE_MAP_ARB = 0x8514; + int GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x8515; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x8516; + int GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x8517; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x8518; + int GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x8519; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x851A; + int GL_PROXY_TEXTURE_CUBE_MAP_ARB = 0x851B; + int GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = 0x851C; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map_array.java new file mode 100644 index 0000000..dd5d95e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_cube_map_array.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_cube_map_array { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap: + * <p/> + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + * <p/> + * Accepted by the &lt;tex&gt; parameter of GetTexImage: + */ + int GL_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x9009; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + */ + int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900C; + int GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D; + int GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E; + int GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_add.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_add.java new file mode 100644 index 0000000..5b3f0e6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_add.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_env_add { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_combine.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_combine.java new file mode 100644 index 0000000..c733fcc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_combine.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_env_combine { + int GL_COMBINE_ARB = 0x8570; + + int GL_COMBINE_RGB_ARB = 0x8571; + int GL_COMBINE_ALPHA_ARB = 0x8572; + + int GL_SOURCE0_RGB_ARB = 0x8580; + int GL_SOURCE1_RGB_ARB = 0x8581; + int GL_SOURCE2_RGB_ARB = 0x8582; + int GL_SOURCE0_ALPHA_ARB = 0x8588; + int GL_SOURCE1_ALPHA_ARB = 0x8589; + int GL_SOURCE2_ALPHA_ARB = 0x858A; + + int GL_OPERAND0_RGB_ARB = 0x8590; + int GL_OPERAND1_RGB_ARB = 0x8591; + int GL_OPERAND2_RGB_ARB = 0x8592; + int GL_OPERAND0_ALPHA_ARB = 0x8598; + int GL_OPERAND1_ALPHA_ARB = 0x8599; + int GL_OPERAND2_ALPHA_ARB = 0x859A; + + int GL_RGB_SCALE_ARB = 0x8573; + + int GL_ADD_SIGNED_ARB = 0x8574; + int GL_INTERPOLATE_ARB = 0x8575; + int GL_SUBTRACT_ARB = 0x84E7; + + int GL_CONSTANT_ARB = 0x8576; + int GL_PRIMARY_COLOR_ARB = 0x8577; + int GL_PREVIOUS_ARB = 0x8578; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_crossbar.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_crossbar.java new file mode 100644 index 0000000..da2e481 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_crossbar.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_env_crossbar { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_dot3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_dot3.java new file mode 100644 index 0000000..7bcf541 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_env_dot3.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_env_dot3 { + int GL_DOT3_RGB_ARB = 0x86AE; + int GL_DOT3_RGBA_ARB = 0x86AF; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_float.java new file mode 100644 index 0000000..652eb9d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_float.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_float { + + /** + * Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: + */ + int GL_TEXTURE_RED_TYPE_ARB = 0x8C10; + int GL_TEXTURE_GREEN_TYPE_ARB = 0x8C11; + int GL_TEXTURE_BLUE_TYPE_ARB = 0x8C12; + int GL_TEXTURE_ALPHA_TYPE_ARB = 0x8C13; + int GL_TEXTURE_LUMINANCE_TYPE_ARB = 0x8C14; + int GL_TEXTURE_INTENSITY_TYPE_ARB = 0x8C15; + int GL_TEXTURE_DEPTH_TYPE_ARB = 0x8C16; + + /** + * Returned by the &lt;params&gt; parameter of GetTexLevelParameter: + */ + int GL_UNSIGNED_NORMALIZED_ARB = 0x8C17; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA32F_ARB = 0x8814; + int GL_RGB32F_ARB = 0x8815; + int GL_ALPHA32F_ARB = 0x8816; + int GL_INTENSITY32F_ARB = 0x8817; + int GL_LUMINANCE32F_ARB = 0x8818; + int GL_LUMINANCE_ALPHA32F_ARB = 0x8819; + int GL_RGBA16F_ARB = 0x881A; + int GL_RGB16F_ARB = 0x881B; + int GL_ALPHA16F_ARB = 0x881C; + int GL_INTENSITY16F_ARB = 0x881D; + int GL_LUMINANCE16F_ARB = 0x881E; + int GL_LUMINANCE_ALPHA16F_ARB = 0x881F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_gather.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_gather.java new file mode 100644 index 0000000..bc1af49 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_gather.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_gather { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E; + int GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F; + int GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB = 0x8F9F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirror_clamp_to_edge.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirror_clamp_to_edge.java new file mode 100644 index 0000000..7d06c41 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirror_clamp_to_edge.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_mirror_clamp_to_edge { + + /** + * Accepted by the &lt;param&gt; parameter of TexParameter{if}, SamplerParameter{if} + * and SamplerParameter{if}v, and by the &lt;params&gt; parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when + * their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or + * TEXTURE_WRAP_R: + */ + int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirrored_repeat.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirrored_repeat.java new file mode 100644 index 0000000..e952210 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_mirrored_repeat.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_mirrored_repeat { + int GL_MIRRORED_REPEAT_ARB = 0x8370; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_multisample.java new file mode 100644 index 0000000..348961d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_multisample.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.FloatBuffer; + +@Extension(postfix = "") +public interface ARB_texture_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetMultisamplefv: */ + int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_SAMPLE_MASK = 0x8E51; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v and + * GetIntegeri_v: + */ + int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage2DMultisample: + */ + int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** Accepted by the &lt;target&gt; parameter of TexImage2DMultisample: */ + int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage3DMultisample: + */ + int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the &lt;target&gt; parameter of TexImage3DMultisample: */ + int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_SAMPLE_MASK_WORDS = 0x8E59; + int GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E; + int GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; + int GL_MAX_INTEGER_SAMPLES = 0x9110; + int GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104; + int GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter */ + int GL_TEXTURE_SAMPLES = 0x9106; + int GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_2D_MULTISAMPLE = 0x9108; + int GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109; + int GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A; + int GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B; + int GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C; + int GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + @Reuse("GL32") + void glTexImage2DMultisample(@GLenum int target, @GLsizei int samples, int internalformat, + @GLsizei int width, @GLsizei int height, + boolean fixedsamplelocations); + + @Reuse("GL32") + void glTexImage3DMultisample(@GLenum int target, @GLsizei int samples, int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + boolean fixedsamplelocations); + + @Reuse("GL32") + @StripPostfix("val") + void glGetMultisamplefv(@GLenum int pname, @GLuint int index, @OutParameter @Check("2") FloatBuffer val); + + @Reuse("GL32") + void glSampleMaski(@GLuint int index, @GLbitfield int mask); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_non_power_of_two.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_non_power_of_two.java new file mode 100644 index 0000000..ece2a36 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_non_power_of_two.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_non_power_of_two { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_levels.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_levels.java new file mode 100644 index 0000000..1c3f382 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_levels.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_query_levels { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_lod.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_lod.java new file mode 100644 index 0000000..d54023a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_query_lod.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_query_lod { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rectangle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rectangle.java new file mode 100644 index 0000000..87e1d48 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rectangle.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_rectangle { + + /** + Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + TexParameterfv and TexParameteriv: + Accepted by the &lt;target&gt; parameter of GetTexImage, + GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + int GL_TEXTURE_RECTANGLE_ARB = 0x84F5; + + /** + Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv and GetDoublev: + */ + int GL_TEXTURE_BINDING_RECTANGLE_ARB = 0x84F6; + + /** + Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + int GL_PROXY_TEXTURE_RECTANGLE_ARB = 0x84F7; + + /** + Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + GetIntegerv and GetFloatv: + */ + int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = 0x84F8; + + /** + Returned by &lt;type&gt; parameter of GetActiveUniform when the location + &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + + /** + Returned by &lt;type&gt; parameter of GetActiveUniform when the location + &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rg.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rg.java new file mode 100644 index 0000000..5fc55b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rg.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_rg { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, and CopyTexImage2D: + */ + int GL_R8 = 0x8229; + int GL_R16 = 0x822A; + + int GL_RG8 = 0x822B; + int GL_RG16 = 0x822C; + + int GL_R16F = 0x822D; + int GL_R32F = 0x822E; + + int GL_RG16F = 0x822F; + int GL_RG32F = 0x8230; + + int GL_R8I = 0x8231; + int GL_R8UI = 0x8232; + int GL_R16I = 0x8233; + int GL_R16UI = 0x8234; + int GL_R32I = 0x8235; + int GL_R32UI = 0x8236; + + int GL_RG8I = 0x8237; + int GL_RG8UI = 0x8238; + int GL_RG16I = 0x8239; + int GL_RG16UI = 0x823A; + int GL_RG32I = 0x823B; + int GL_RG32UI = 0x823C; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage3D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + int GL_RG = 0x8227; + int GL_RG_INTEGER = 0x8228; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rgb10_a2ui.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rgb10_a2ui.java new file mode 100644 index 0000000..6c30ac4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_rgb10_a2ui.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "ARB", className = "ARBTextureRGB10_A2UI") +public interface ARB_texture_rgb10_a2ui { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample: + */ + int GL_RGB10_A2UI = 0x906F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_stencil8.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_stencil8.java new file mode 100644 index 0000000..68cc97d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_stencil8.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_stencil8 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage.java new file mode 100644 index 0000000..73ff637 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Alias; +import org.lwjgl.util.generator.Dependent; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +@Dependent +@Alias(value = "EXT_texture_storage", postfix = "EXT") +public interface ARB_texture_storage { + + /** Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: */ + int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + @Reuse("GL42") + void glTexStorage1D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width); + + @Reuse("GL42") + void glTexStorage2D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + @Reuse("GL42") + void glTexStorage3D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + @Dependent("GL_EXT_direct_state_access") + void glTextureStorage1DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width); + + @Dependent("GL_EXT_direct_state_access") + void glTextureStorage2DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + @Dependent("GL_EXT_direct_state_access") + void glTextureStorage3DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage_multisample.java new file mode 100644 index 0000000..fa03499 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_storage_multisample.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Dependent; +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +@Dependent +public interface ARB_texture_storage_multisample { + + @Reuse("GL43") + void glTexStorage2DMultisample(@GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + boolean fixedsamplelocations); + + @Reuse("GL43") + void glTexStorage3DMultisample(@GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + boolean fixedsamplelocations); + + @Dependent("GL_EXT_direct_state_access") + void glTextureStorage2DMultisampleEXT(@GLuint int texture, + @GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + boolean fixedsamplelocations); + + @Dependent("GL_EXT_direct_state_access") + void glTextureStorage3DMultisampleEXT(@GLuint int texture, + @GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + boolean fixedsamplelocations); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_swizzle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_swizzle.java new file mode 100644 index 0000000..f5c13a4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_swizzle.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_texture_swizzle { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_R = 0x8E42; + int GL_TEXTURE_SWIZZLE_G = 0x8E43; + int GL_TEXTURE_SWIZZLE_B = 0x8E44; + int GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_view.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_view.java new file mode 100644 index 0000000..9391632 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_texture_view.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_texture_view { + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv and + * GetTexParameteriv: + */ + int GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE, + GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + @Reuse("GL43") + void glTextureView(@GLuint int texture, @GLenum int target, @GLuint int origtexture, + @GLenum int internalformat, + @GLuint int minlevel, @GLuint int numlevels, + @GLuint int minlayer, @GLuint int numlayers); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_timer_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_timer_query.java new file mode 100644 index 0000000..3deca94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_timer_query.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.LongBuffer; + +@Extension(postfix = "") +public interface ARB_timer_query { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the &lt;target&gt; parameter of GetQueryiv and QueryCounter. + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_TIMESTAMP = 0x8E28; + + @Reuse("GL33") + void glQueryCounter(@GLuint int id, @GLenum int target); + + @Reuse("GL33") + @StripPostfix("params") + void glGetQueryObjecti64v(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer params); + + @Reuse("GL33") + @Alternate("glGetQueryObjecti64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjecti64v2(@GLuint int id, @GLenum int pname, @OutParameter @GLint64 LongBuffer params); + + @Reuse("GL33") + @StripPostfix("params") + void glGetQueryObjectui64v(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLuint64 LongBuffer params); + + @Reuse("GL33") + @Alternate("glGetQueryObjectui64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectui64v2(@GLuint int id, @GLenum int pname, @OutParameter @GLuint64 LongBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback2.java new file mode 100644 index 0000000..8066b35 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback2.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface ARB_transform_feedback2 { + + /** Accepted by the &lt;target&gt; parameter of BindTransformFeedback: */ + int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = 0x8E23; + int GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = 0x8E24; + int GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + @Reuse("GL40") + void glBindTransformFeedback(@GLenum int target, @GLuint int id); + + @Reuse("GL40") + void glDeleteTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @Const @GLuint IntBuffer ids); + + @Reuse("GL40") + @Alternate("glDeleteTransformFeedbacks") + void glDeleteTransformFeedbacks(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, id)", keepParam = true) int id); + + @Reuse("GL40") + void glGenTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Reuse("GL40") + @Alternate("glGenTransformFeedbacks") + @GLreturn("ids") + void glGenTransformFeedbacks2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Reuse("GL40") + boolean glIsTransformFeedback(@GLuint int id); + + @Reuse("GL40") + void glPauseTransformFeedback(); + + @Reuse("GL40") + void glResumeTransformFeedback(); + + @Reuse("GL40") + void glDrawTransformFeedback(@GLenum int mode, @GLuint int id); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback3.java new file mode 100644 index 0000000..ddab700 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback3.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_transform_feedback3 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70; + int GL_MAX_VERTEX_STREAMS = 0x8E71; + + @Reuse("GL40") + void glDrawTransformFeedbackStream(@GLenum int mode, @GLuint int id, @GLuint int stream); + + @Reuse("GL40") + void glBeginQueryIndexed(@GLenum int target, @GLuint int index, @GLuint int id); + + @Reuse("GL40") + void glEndQueryIndexed(@GLenum int target, @GLuint int index); + + @Reuse("GL40") + @StripPostfix("params") + void glGetQueryIndexediv(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Reuse("GL40") + @Alternate("glGetQueryIndexediv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryIndexediv2(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback_instanced.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback_instanced.java new file mode 100644 index 0000000..cdedc4c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transform_feedback_instanced.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_transform_feedback_instanced { + + @Reuse("GL42") + void glDrawTransformFeedbackInstanced(@GLenum int mode, @GLuint int id, @GLsizei int primcount); + + @Reuse("GL42") + void glDrawTransformFeedbackStreamInstanced(@GLenum int mode, @GLuint int id, @GLuint int stream, @GLsizei int primcount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transpose_matrix.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transpose_matrix.java new file mode 100644 index 0000000..e160b51 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_transpose_matrix.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +import java.nio.*; + +public interface ARB_transpose_matrix { + int GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = 0x84E3; + int GL_TRANSPOSE_PROJECTION_MATRIX_ARB = 0x84E4; + int GL_TRANSPOSE_TEXTURE_MATRIX_ARB = 0x84E5; + int GL_TRANSPOSE_COLOR_MATRIX_ARB = 0x84E6; + + @StripPostfix("pfMtx") + void glLoadTransposeMatrixfARB(@Check("16") @Const FloatBuffer pfMtx); + + @StripPostfix("pfMtx") + void glMultTransposeMatrixfARB(@Check("16") @Const FloatBuffer pfMtx); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_uniform_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_uniform_buffer_object.java new file mode 100644 index 0000000..3a6c498 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_uniform_buffer_object.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_uniform_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_UNIFORM_BUFFER = 0x8A11; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: */ + int GL_UNIFORM_BUFFER_START = 0x8A29; + int GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; + int GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C; + int GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; + int GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; + int GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; + int GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30; + int GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; + int GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32; + int GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; + int GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35; + int GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformsivARB: */ + int GL_UNIFORM_TYPE = 0x8A37; + int GL_UNIFORM_SIZE = 0x8A38; + int GL_UNIFORM_NAME_LENGTH = 0x8A39; + int GL_UNIFORM_BLOCK_INDEX = 0x8A3A; + int GL_UNIFORM_OFFSET = 0x8A3B; + int GL_UNIFORM_ARRAY_STRIDE = 0x8A3C; + int GL_UNIFORM_MATRIX_STRIDE = 0x8A3D; + int GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockivARB: */ + int GL_UNIFORM_BLOCK_BINDING = 0x8A3F; + int GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40; + int GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; + int GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; + int GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45; + int GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** Returned by GetActiveUniformsivARB and GetUniformBlockIndexARB */ + int GL_INVALID_INDEX = 0xFFFFFFFF; + + @Reuse("GL31") + void glGetUniformIndices(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @NullTerminated("uniformIndices.remaining()") @GLchar @PointerArray("uniformCount") ByteBuffer uniformNames, + @OutParameter @GLuint IntBuffer uniformIndices); + + @Reuse("GL31") + @Alternate(value = "glGetUniformIndices") + void glGetUniformIndices(@GLuint int program, @Constant("uniformNames.length") @GLsizei int uniformCount, + @Const @NullTerminated @PointerArray("uniformCount") CharSequence[] uniformNames, + @OutParameter @Check("uniformNames.length") @GLuint IntBuffer uniformIndices); + + @Reuse("GL31") + @StripPostfix("params") + void glGetActiveUniformsiv(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @GLuint IntBuffer uniformIndices, + @GLenum int pname, + @OutParameter @Check("uniformIndices.remaining()") @GLint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformsi} instead. */ + @Alternate("glGetActiveUniformsiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL31", method = "glGetActiveUniformsi") + @Deprecated + void glGetActiveUniformsiv(@GLuint int program, @Constant("1") @GLsizei int uniformCount, + @Constant(value = "params.put(1, uniformIndex), 1", keepParam = true) int uniformIndex, // Reuse params buffer + @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Reuse("GL31") + @Alternate("glGetActiveUniformsiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformsiv2(@GLuint int program, @Constant("1") @GLsizei int uniformCount, + @Constant(value = "params.put(1, uniformIndex), 1", keepParam = true) int uniformIndex, // Reuse params buffer + @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Reuse("GL31") + void glGetActiveUniformName(@GLuint int program, @GLuint int uniformIndex, @AutoSize("uniformName") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformName); + + @Reuse("GL31") + @Alternate("glGetActiveUniformName") + @GLreturn(value = "uniformName", maxLength = "bufSize") + void glGetActiveUniformName2(@GLuint int program, @GLuint int uniformIndex, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(uniformName_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformName); + + @Reuse("GL31") + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @Const @NullTerminated @GLchar ByteBuffer uniformBlockName); + + @Reuse("GL31") + @Alternate("glGetUniformBlockIndex") + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @NullTerminated CharSequence uniformBlockName); + + @Reuse("GL31") + @StripPostfix("params") + void glGetActiveUniformBlockiv(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @Check(value = "16") @GLint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformBlocki} instead. */ + @Alternate("glGetActiveUniformBlockiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL31", method = "glGetActiveUniformBlocki") + @Deprecated + void glGetActiveUniformBlockiv2(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Reuse("GL31") + @Alternate("glGetActiveUniformBlockiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformBlockiv3(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Reuse("GL31") + void glGetActiveUniformBlockName(@GLuint int program, @GLuint int uniformBlockIndex, @AutoSize("uniformBlockName") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + @Reuse("GL31") + @Alternate("glGetActiveUniformBlockName") + @GLreturn(value = "uniformBlockName", maxLength = "bufSize") + void glGetActiveUniformBlockName2(@GLuint int program, @GLuint int uniformBlockIndex, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(uniformBlockName_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + @Reuse("GL30") + void glBindBufferRange(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset, @GLsizeiptr long size); + + @Reuse("GL30") + void glBindBufferBase(@GLenum int target, @GLuint int index, @GLuint int buffer); + + @Reuse("GL30") + @StripPostfix(value = "data", extension = "") + void glGetIntegeri_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") IntBuffer data); + + @Reuse("GL30") + @Alternate("glGetIntegeri_v") + @GLreturn("data") + @StripPostfix("data") + void glGetIntegeri_v2(@GLenum int value, @GLuint int index, @OutParameter IntBuffer data); + + @Reuse("GL31") + void glUniformBlockBinding(@GLuint int program, @GLuint int uniformBlockIndex, @GLuint int uniformBlockBinding); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_bgra.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_bgra.java new file mode 100644 index 0000000..bcc3e07 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_bgra.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_vertex_array_bgra { + + /** + * Accepted by the &lt;size&gt; parameter of ColorPointer, + * SecondaryColorPointer, and VertexAttribPointer: + */ + int GL_BGRA = 0x80E1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_object.java new file mode 100644 index 0000000..d749340 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_array_object.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface ARB_vertex_array_object { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + @Reuse("GL30") + void glBindVertexArray(@GLuint int array); + + @Reuse("GL30") + void glDeleteVertexArrays(@AutoSize("arrays") @GLsizei int n, @Const @GLuint IntBuffer arrays); + + @Reuse("GL30") + @Alternate("glDeleteVertexArrays") + void glDeleteVertexArrays(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, array)", keepParam = true) int array); + + @Reuse("GL30") + void glGenVertexArrays(@AutoSize("arrays") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Reuse("GL30") + @Alternate("glGenVertexArrays") + @GLreturn("arrays") + void glGenVertexArrays2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Reuse("GL30") + boolean glIsVertexArray(@GLuint int array); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_64bit.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_64bit.java new file mode 100644 index 0000000..83c879a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_64bit.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.DoubleBuffer; + +@Dependent +@Extension(postfix = "") +public interface ARB_vertex_attrib_64bit { + + /** Returned in the &lt;type&gt; parameter of GetActiveAttrib: */ + int GL_DOUBLE_VEC2 = 0x8FFC; + int GL_DOUBLE_VEC3 = 0x8FFD; + int GL_DOUBLE_VEC4 = 0x8FFE; + int GL_DOUBLE_MAT2 = 0x8F46; + int GL_DOUBLE_MAT3 = 0x8F47; + int GL_DOUBLE_MAT4 = 0x8F48; + int GL_DOUBLE_MAT2x3 = 0x8F49; + int GL_DOUBLE_MAT2x4 = 0x8F4A; + int GL_DOUBLE_MAT3x2 = 0x8F4B; + int GL_DOUBLE_MAT3x4 = 0x8F4C; + int GL_DOUBLE_MAT4x2 = 0x8F4D; + int GL_DOUBLE_MAT4x3 = 0x8F4E; + + @Reuse("GL41") + void glVertexAttribL1d(@GLuint int index, double x); + + @Reuse("GL41") + void glVertexAttribL2d(@GLuint int index, double x, double y); + + @Reuse("GL41") + void glVertexAttribL3d(@GLuint int index, double x, double y, double z); + + @Reuse("GL41") + void glVertexAttribL4d(@GLuint int index, double x, double y, double z, double w); + + @Reuse("GL41") + @StripPostfix("v") + void glVertexAttribL1dv(@GLuint int index, @Const @Check("1") DoubleBuffer v); + + @Reuse("GL41") + @StripPostfix("v") + void glVertexAttribL2dv(@GLuint int index, @Const @Check("2") DoubleBuffer v); + + @Reuse("GL41") + @StripPostfix("v") + void glVertexAttribL3dv(@GLuint int index, @Const @Check("3") DoubleBuffer v); + + @Reuse("GL41") + @StripPostfix("v") + void glVertexAttribL4dv(@GLuint int index, @Const @Check("4") DoubleBuffer v); + + @Reuse("GL41") + void glVertexAttribLPointer(@GLuint int index, int size, @Constant("GL11.GL_DOUBLE") @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check @Const @GLdouble Buffer pointer); + + @Reuse("GL41") + @StripPostfix("params") + void glGetVertexAttribLdv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @Dependent("GL_EXT_direct_state_access") + void glVertexArrayVertexAttribLOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLuint int index, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_binding.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_binding.java new file mode 100644 index 0000000..76d2fa3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_attrib_binding.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ARB_vertex_attrib_binding { + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttrib*v: */ + int GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv, ... */ + int GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + @Reuse("GL43") + void glBindVertexBuffer(@GLuint int bindingindex, @GLuint int buffer, @GLintptr long offset, + @GLsizei int stride); + + @Reuse("GL43") + void glVertexAttribFormat(@GLuint int attribindex, int size, @GLenum int type, + boolean normalized, @GLuint int relativeoffset); + + @Reuse("GL43") + void glVertexAttribIFormat(@GLuint int attribindex, int size, @GLenum int type, + @GLuint int relativeoffset); + + @Reuse("GL43") + void glVertexAttribLFormat(@GLuint int attribindex, int size, @GLenum int type, + @GLuint int relativeoffset); + + @Reuse("GL43") + void glVertexAttribBinding(@GLuint int attribindex, @GLuint int bindingindex); + + @Reuse("GL43") + void glVertexBindingDivisor(@GLuint int bindingindex, @GLuint int divisor); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_blend.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_blend.java new file mode 100644 index 0000000..6ef128a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_blend.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ARB_vertex_blend { + + int GL_MAX_VERTEX_UNITS_ARB = 0x86A4; + int GL_ACTIVE_VERTEX_UNITS_ARB = 0x86A5; + int GL_WEIGHT_SUM_UNITY_ARB = 0x86A6; + int GL_VERTEX_BLEND_ARB = 0x86A7; + int GL_CURRENT_WEIGHT_ARB = 0x86A8; + int GL_WEIGHT_ARRAY_TYPE_ARB = 0x86A9; + int GL_WEIGHT_ARRAY_STRIDE_ARB = 0x86AA; + int GL_WEIGHT_ARRAY_SIZE_ARB = 0x86AB; + int GL_WEIGHT_ARRAY_POINTER_ARB = 0x86AC; + int GL_WEIGHT_ARRAY_ARB = 0x86AD; + int GL_MODELVIEW0_ARB = 0x1700; + int GL_MODELVIEW1_ARB = 0x850a; + int GL_MODELVIEW2_ARB = 0x8722; + int GL_MODELVIEW3_ARB = 0x8723; + int GL_MODELVIEW4_ARB = 0x8724; + int GL_MODELVIEW5_ARB = 0x8725; + int GL_MODELVIEW6_ARB = 0x8726; + int GL_MODELVIEW7_ARB = 0x8727; + int GL_MODELVIEW8_ARB = 0x8728; + int GL_MODELVIEW9_ARB = 0x8729; + int GL_MODELVIEW10_ARB = 0x872A; + int GL_MODELVIEW11_ARB = 0x872B; + int GL_MODELVIEW12_ARB = 0x872C; + int GL_MODELVIEW13_ARB = 0x872D; + int GL_MODELVIEW14_ARB = 0x872E; + int GL_MODELVIEW15_ARB = 0x872F; + int GL_MODELVIEW16_ARB = 0x8730; + int GL_MODELVIEW17_ARB = 0x8731; + int GL_MODELVIEW18_ARB = 0x8732; + int GL_MODELVIEW19_ARB = 0x8733; + int GL_MODELVIEW20_ARB = 0x8734; + int GL_MODELVIEW21_ARB = 0x8735; + int GL_MODELVIEW22_ARB = 0x8736; + int GL_MODELVIEW23_ARB = 0x8737; + int GL_MODELVIEW24_ARB = 0x8738; + int GL_MODELVIEW25_ARB = 0x8739; + int GL_MODELVIEW26_ARB = 0x873A; + int GL_MODELVIEW27_ARB = 0x873B; + int GL_MODELVIEW28_ARB = 0x873C; + int GL_MODELVIEW29_ARB = 0x873D; + int GL_MODELVIEW30_ARB = 0x873E; + int GL_MODELVIEW31_ARB = 0x873F; + + @StripPostfix("pWeights") + void glWeightbvARB(@AutoSize("pWeights") int size, ByteBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightsvARB(@AutoSize("pWeights") int size, ShortBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightivARB(@AutoSize("pWeights") int size, IntBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightfvARB(@AutoSize("pWeights") int size, FloatBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightdvARB(@AutoSize("pWeights") int size, DoubleBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightubvARB(@AutoSize("pWeights") int size, @GLubyte ByteBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightusvARB(@AutoSize("pWeights") int size, @GLushort ShortBuffer pWeights); + + @StripPostfix("pWeights") + void glWeightuivARB(@AutoSize("pWeights") int size, @GLuint IntBuffer pWeights); + + void glWeightPointerARB(int size, @AutoType("pPointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer pPointer); + + void glVertexBlendARB(int count); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_buffer_object.java new file mode 100644 index 0000000..913c8bd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_buffer_object.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_vertex_buffer_object extends ARB_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameters of BindBufferARB, BufferDataARB, + * BufferSubDataARB, MapBufferARB, UnmapBufferARB, + * GetBufferSubDataARB, GetBufferParameterivARB, and + * GetBufferPointervARB: + */ + int GL_ARRAY_BUFFER_ARB = 0x8892; + int GL_ELEMENT_ARRAY_BUFFER_ARB = 0x8893; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_ARRAY_BUFFER_BINDING_ARB = 0x8894; + int GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = 0x8895; + int GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = 0x8896; + int GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = 0x8897; + int GL_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x8898; + int GL_INDEX_ARRAY_BUFFER_BINDING_ARB = 0x8899; + int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = 0x889A; + int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = 0x889B; + int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = 0x889C; + int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = 0x889D; + int GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = 0x889E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVertexAttribivARB: + */ + int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = 0x889F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_program.java new file mode 100644 index 0000000..3e6c679 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_program.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ARB_vertex_program extends ARB_program { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of ProgramStringARB, BindProgramARB, + * ProgramEnvParameter4[df][v]ARB, ProgramLocalParameter4[df][v]ARB, + * GetProgramEnvParameter[df]vARB, GetProgramLocalParameter[df]vARB, + * GetProgramivARB, and GetProgramStringARB. + */ + int GL_VERTEX_PROGRAM_ARB = 0x8620; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642; + int GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643; + int GL_COLOR_SUM_ARB = 0x8458; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttrib[dfi]vARB: */ + int GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622; + int GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623; + int GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624; + int GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625; + int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A; + int GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: */ + int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B0; + int GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = 0x88B1; + int GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B2; + int GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = 0x88B3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869; + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib1sARB(@GLuint int index, short x); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib1fARB(@GLuint int index, float x); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib1dARB(@GLuint int index, double x); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib2sARB(@GLuint int index, short x, short y); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib2fARB(@GLuint int index, float x, float y); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib2dARB(@GLuint int index, double x, double y); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib3sARB(@GLuint int index, short x, short y, short z); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib3fARB(@GLuint int index, float x, float y, float z); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib3dARB(@GLuint int index, double x, double y, double z); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib4sARB(@GLuint int index, short x, short y, short z, short w); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib4fARB(@GLuint int index, float x, float y, float z, float w); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib4dARB(@GLuint int index, double x, double y, double z, double w); + + @Reuse("ARBVertexShader") + @NoErrorCheck + void glVertexAttrib4NubARB(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); + + @Reuse("ARBVertexShader") + void glVertexAttribPointerARB(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer buffer); + + @Reuse("ARBVertexShader") + void glEnableVertexAttribArrayARB(@GLuint int index); + + @Reuse("ARBVertexShader") + void glDisableVertexAttribArrayARB(@GLuint int index); + + @Reuse("ARBVertexShader") + @StripPostfix("params") + void glGetVertexAttribfvARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Reuse("ARBVertexShader") + @StripPostfix("params") + void glGetVertexAttribdvARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @Reuse("ARBVertexShader") + @StripPostfix("params") + void glGetVertexAttribivARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Reuse("ARBVertexShader") + @StripPostfix("result") + void glGetVertexAttribPointervARB(@GLuint int index, @GLenum int pname, @Result @GLvoid ByteBuffer result); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java new file mode 100644 index 0000000..65645a2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_shader.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ARB_vertex_shader { + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShaderObjectARB and + * returned by the &lt;params&gt; parameter of GetObjectParameter{if}vARB: + */ + int GL_VERTEX_SHADER_ARB = 0x8B31; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = 0x8B4A; + int GL_MAX_VARYING_FLOATS_ARB = 0x8B4B; + int GL_MAX_VERTEX_ATTRIBS_ARB = 0x8869; + int GL_MAX_TEXTURE_IMAGE_UNITS_ARB = 0x8872; + int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = 0x8B4C; + int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = 0x8B4D; + int GL_MAX_TEXTURE_COORDS_ARB = 0x8871; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_VERTEX_PROGRAM_POINT_SIZE_ARB = 0x8642; + int GL_VERTEX_PROGRAM_TWO_SIDE_ARB = 0x8643; + + /** Accepted by the &lt;pname&gt; parameter GetObjectParameter{if}vARB: */ + int GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = 0x8B89; + int GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = 0x8B8A; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttrib{dfi}vARB: */ + int GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = 0x8622; + int GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = 0x8623; + int GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = 0x8624; + int GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = 0x8625; + int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = 0x886A; + int GL_CURRENT_VERTEX_ATTRIB_ARB = 0x8626; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: */ + int GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = 0x8645; + + /** Returned by the &lt;type&gt; parameter of GetActiveAttribARB: */ + int GL_FLOAT_VEC2_ARB = 0x8B50; + int GL_FLOAT_VEC3_ARB = 0x8B51; + int GL_FLOAT_VEC4_ARB = 0x8B52; + int GL_FLOAT_MAT2_ARB = 0x8B5A; + int GL_FLOAT_MAT3_ARB = 0x8B5B; + int GL_FLOAT_MAT4_ARB = 0x8B5C; + + @NoErrorCheck + void glVertexAttrib1sARB(@GLuint int index, short v0); + + @NoErrorCheck + void glVertexAttrib1fARB(@GLuint int index, float v0); + + @NoErrorCheck + void glVertexAttrib1dARB(@GLuint int index, double v0); + + @NoErrorCheck + void glVertexAttrib2sARB(@GLuint int index, short v0, short v1); + + @NoErrorCheck + void glVertexAttrib2fARB(@GLuint int index, float v0, float v1); + + @NoErrorCheck + void glVertexAttrib2dARB(@GLuint int index, double v0, double v1); + + @NoErrorCheck + void glVertexAttrib3sARB(@GLuint int index, short v0, short v1, short v2); + + @NoErrorCheck + void glVertexAttrib3fARB(@GLuint int index, float v0, float v1, float v2); + + @NoErrorCheck + void glVertexAttrib3dARB(@GLuint int index, double v0, double v1, double v2); + + @NoErrorCheck + void glVertexAttrib4sARB(@GLuint int index, short v0, short v1, short v2, short v3); + + @NoErrorCheck + void glVertexAttrib4fARB(@GLuint int index, float v0, float v1, float v2, float v3); + + @NoErrorCheck + void glVertexAttrib4dARB(@GLuint int index, double v0, double v1, double v2, double v3); + + @NoErrorCheck + void glVertexAttrib4NubARB(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); + + void glVertexAttribPointerARB(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer buffer); + + @Alternate("glVertexAttribPointerARB") + void glVertexAttribPointerARB(@GLuint int index, int size, @GLenum int type, boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const ByteBuffer buffer); + + void glEnableVertexAttribArrayARB(@GLuint int index); + + void glDisableVertexAttribArrayARB(@GLuint int index); + + void glBindAttribLocationARB(@GLhandleARB int programObj, @GLuint int index, @NullTerminated @Const @GLcharARB ByteBuffer name); + + @Alternate("glBindAttribLocationARB") + void glBindAttribLocationARB(@GLhandleARB int programObj, @GLuint int index, @NullTerminated CharSequence name); + + void glGetActiveAttribARB(@GLhandleARB int programObj, @GLuint int index, @AutoSize("name") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveAttribARB. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveAttribARB") + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveAttribARB2(@GLhandleARB int programObj, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") IntBuffer type, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveAttribARB. This version returns only the attrib name. */ + @Alternate(value = "glGetActiveAttribARB", javaAlt = true) + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveAttribARB(@GLhandleARB int programObj, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1)") IntBuffer length, + @OutParameter @GLcharARB ByteBuffer name); + + /** Overloads glGetActiveAttribARB. This version returns only the attrib size. */ + @Alternate(value = "glGetActiveAttribARB", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveAttribSizeARB(@GLhandleARB int programObj, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLcharARB @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + /** Overloads glGetActiveAttribARB. This version returns only the attrib type. */ + @Alternate(value = "glGetActiveAttribARB", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveAttribTypeARB(@GLhandleARB int programObj, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLcharARB @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + int glGetAttribLocationARB(@GLhandleARB int programObj, @NullTerminated @Const @GLcharARB ByteBuffer name); + + @Alternate("glGetAttribLocationARB") + int glGetAttribLocationARB(@GLhandleARB int programObj, @NullTerminated CharSequence name); + + @StripPostfix("params") + void glGetVertexAttribfvARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVertexAttribdvARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetVertexAttribivARB(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("result") + void glGetVertexAttribPointervARB(@GLuint int index, @GLenum int pname, @Result @GLvoid ByteBuffer result); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_10f_11f_11f_rev.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_10f_11f_11f_rev.java new file mode 100644 index 0000000..eb5e10f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_10f_11f_11f_rev.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ARB_vertex_type_10f_11f_11f_rev { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_2_10_10_10_rev.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_2_10_10_10_rev.java new file mode 100644 index 0000000..15fe8bc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_vertex_type_2_10_10_10_rev.java @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +@Extension(postfix = "", className = "ARBVertexType2_10_10_10_REV") +public interface ARB_vertex_type_2_10_10_10_rev { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer, VertexPointer, + * NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, + * ColorP*, SecondaryColorP* and VertexAttribP* + */ + int GL_UNSIGNED_INT_2_10_10_10_REV = GL12.GL_UNSIGNED_INT_2_10_10_10_REV; + int GL_INT_2_10_10_10_REV = 0x8D9F; + + @Reuse("GL33") + @NoErrorCheck + void glVertexP2ui(@GLenum int type, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + void glVertexP3ui(@GLenum int type, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + void glVertexP4ui(@GLenum int type, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexP2uiv(@GLenum int type, @Check("2") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + void glTexCoordP1ui(@GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glTexCoordP2ui(@GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glTexCoordP3ui(@GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glTexCoordP4ui(@GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glTexCoordP1uiv(@GLenum int type, @Check("1") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glTexCoordP2uiv(@GLenum int type, @Check("2") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glTexCoordP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glTexCoordP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + void glMultiTexCoordP1ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glMultiTexCoordP2ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glMultiTexCoordP3ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + void glMultiTexCoordP4ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glMultiTexCoordP1uiv(@GLenum int texture, @GLenum int type, @Check("1") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glMultiTexCoordP2uiv(@GLenum int texture, @GLenum int type, @Check("2") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glMultiTexCoordP3uiv(@GLenum int texture, @GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glMultiTexCoordP4uiv(@GLenum int texture, @GLenum int type, @Check("4") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + void glNormalP3ui(@GLenum int type, @GLuint int coords); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("coords") + void glNormalP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @Reuse("GL33") + @NoErrorCheck + void glColorP3ui(@GLenum int type, @GLuint int color); + + @Reuse("GL33") + @NoErrorCheck + void glColorP4ui(@GLenum int type, @GLuint int color); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("color") + void glColorP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer color); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("color") + void glColorP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer color); + + @Reuse("GL33") + @NoErrorCheck + void glSecondaryColorP3ui(@GLenum int type, @GLuint int color); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("color") + void glSecondaryColorP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer color); + + @Reuse("GL33") + @NoErrorCheck + void glVertexAttribP1ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + void glVertexAttribP2ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + void glVertexAttribP3ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + void glVertexAttribP4ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexAttribP1uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("1") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexAttribP2uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("2") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexAttribP3uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("3") @Const @GLuint IntBuffer value); + + @Reuse("GL33") + @NoErrorCheck + @StripPostfix("value") + void glVertexAttribP4uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("4") @Const @GLuint IntBuffer value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_viewport_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_viewport_array.java new file mode 100644 index 0000000..8ae09f5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_viewport_array.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "") +public interface ARB_viewport_array { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + int GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: */ + int GL_SCISSOR_BOX = 0x0C10; + + /** Accepted by the &lt;pname&gt; parameter of GetFloati_v: */ + int GL_VIEWPORT = 0x0BA2; + + /** Accepted by the &lt;pname&gt; parameter of GetDoublei_v: */ + int GL_DEPTH_RANGE = 0x0B70; + + /** Accepted by the &lt;pname&gt; parameter of Enablei, Disablei, and IsEnabledi: */ + int GL_SCISSOR_TEST = 0x0C11; + + /** + * Returned in the &lt;data&gt; parameter from a Get query with a &lt;pname&gt; of + * LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX: + */ + int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E, + GL_PROVOKING_VERTEX = 0x8E4F, + GL_UNDEFINED_VERTEX = 0x8260; + + @Reuse("GL41") + @StripPostfix("v") + void glViewportArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const FloatBuffer v); + + @Reuse("GL41") + void glViewportIndexedf(@GLuint int index, float x, float y, float w, float h); + + @Reuse("GL41") + @StripPostfix("v") + void glViewportIndexedfv(@GLuint int index, @Check("4") @Const FloatBuffer v); + + @Reuse("GL41") + @StripPostfix("v") + void glScissorArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const IntBuffer v); + + @Reuse("GL41") + void glScissorIndexed(@GLuint int index, int left, int bottom, @GLsizei int width, @GLsizei int height); + + @Reuse("GL41") + @StripPostfix("v") + void glScissorIndexedv(@GLuint int index, @Check("4") @Const IntBuffer v); + + @Reuse("GL41") + @StripPostfix("v") + void glDepthRangeArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 1") @GLsizei int count, @Const @GLclampd DoubleBuffer v); + + @Reuse("GL41") + void glDepthRangeIndexed(@GLuint int index, @GLclampd double n, @GLclampd double f); + + @Reuse("GL41") + @StripPostfix("data") + void glGetFloati_v(@GLenum int target, @GLuint int index, @Check @OutParameter FloatBuffer data); + + @Reuse("GL41") + @Alternate("glGetFloati_v") + @GLreturn("data") + @StripPostfix("data") + void glGetFloati_v2(@GLenum int target, @GLuint int index, @OutParameter FloatBuffer data); + + @Reuse("GL41") + @StripPostfix("data") + void glGetDoublei_v(@GLenum int target, @GLuint int index, @Check @OutParameter DoubleBuffer data); + + @Reuse("GL41") + @Alternate("glGetDoublei_v") + @GLreturn("data") + @StripPostfix("data") + void glGetDoublei_v2(@GLenum int target, @GLuint int index, @OutParameter DoubleBuffer data); + + @Reuse("EXTDrawBuffers2") + @StripPostfix(value = "v", extension = "EXT") + void glGetIntegerIndexedvEXT(@GLenum int target, @GLuint int index, @Check @OutParameter IntBuffer v); + + @Reuse("EXTDrawBuffers2") + @Alternate("glGetIntegerIndexedivEXT") + @GLreturn("v") + @StripPostfix(value = "v", extension = "EXT") + void glGetIntegerIndexedvEXT2(@GLenum int target, @GLuint int index, @OutParameter IntBuffer v); + + @Reuse("EXTDrawBuffers2") + void glEnableIndexedEXT(@GLenum int target, @GLuint int index); + + @Reuse("EXTDrawBuffers2") + void glDisableIndexedEXT(@GLenum int target, @GLuint int index); + + @Reuse("EXTDrawBuffers2") + boolean glIsEnabledIndexedEXT(@GLenum int target, @GLuint int index); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_window_pos.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_window_pos.java new file mode 100644 index 0000000..e8cf8dd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ARB_window_pos.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.DeprecatedGL; + +@DeprecatedGL +public interface ARB_window_pos { + + @DeprecatedGL + void glWindowPos2fARB(float x, float y); + + @DeprecatedGL + void glWindowPos2dARB(double x, double y); + + @DeprecatedGL + void glWindowPos2iARB(int x, int y); + + @DeprecatedGL + void glWindowPos2sARB(short x, short y); + + @DeprecatedGL + void glWindowPos3fARB(float x, float y, float z); + + @DeprecatedGL + void glWindowPos3dARB(double x, double y, double z); + + @DeprecatedGL + void glWindowPos3iARB(int x, int y, int z); + + @DeprecatedGL + void glWindowPos3sARB(short x, short y, short z); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_draw_buffers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_draw_buffers.java new file mode 100644 index 0000000..a64a81a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_draw_buffers.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.*; + +public interface ATI_draw_buffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_DRAW_BUFFERS_ATI = 0x8824; + int GL_DRAW_BUFFER0_ATI = 0x8825; + int GL_DRAW_BUFFER1_ATI = 0x8826; + int GL_DRAW_BUFFER2_ATI = 0x8827; + int GL_DRAW_BUFFER3_ATI = 0x8828; + int GL_DRAW_BUFFER4_ATI = 0x8829; + int GL_DRAW_BUFFER5_ATI = 0x882A; + int GL_DRAW_BUFFER6_ATI = 0x882B; + int GL_DRAW_BUFFER7_ATI = 0x882C; + int GL_DRAW_BUFFER8_ATI = 0x882D; + int GL_DRAW_BUFFER9_ATI = 0x882E; + int GL_DRAW_BUFFER10_ATI = 0x882F; + int GL_DRAW_BUFFER11_ATI = 0x8830; + int GL_DRAW_BUFFER12_ATI = 0x8831; + int GL_DRAW_BUFFER13_ATI = 0x8832; + int GL_DRAW_BUFFER14_ATI = 0x8833; + int GL_DRAW_BUFFER15_ATI = 0x8834; + + void glDrawBuffersATI(@AutoSize("buffers") @GLsizei int size, @Const @GLenum IntBuffer buffers); + + @Alternate("glDrawBuffersATI") + void glDrawBuffersATI(@Constant("1") @GLsizei int size, @Constant(value = "APIUtil.getInt(caps, buffer)", keepParam = true) int buffer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_element_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_element_array.java new file mode 100644 index 0000000..dbe3076 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_element_array.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ATI_element_array { + int GL_ELEMENT_ARRAY_ATI = 0x8768; + int GL_ELEMENT_ARRAY_TYPE_ATI = 0x8769; + int GL_ELEMENT_ARRAY_POINTER_ATI = 0x876A; + + void glElementPointerATI(@AutoType("pPointer") @GLenum int type, + @Check + @Const + @GLubyte + @GLushort + @GLuint Buffer pPointer); + + void glDrawElementArrayATI(@GLenum int mode, @GLsizei int count); + + void glDrawRangeElementArrayATI(@GLenum int mode, @GLuint int start, @GLuint int end, @GLsizei int count); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_envmap_bumpmap.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_envmap_bumpmap.java new file mode 100644 index 0000000..a4c3a35 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_envmap_bumpmap.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.*; + +public interface ATI_envmap_bumpmap { + int GL_BUMP_ROT_MATRIX_ATI = 0x8775; + int GL_BUMP_ROT_MATRIX_SIZE_ATI = 0x8776; + int GL_BUMP_NUM_TEX_UNITS_ATI = 0x8777; + int GL_BUMP_TEX_UNITS_ATI = 0x8778; + int GL_DUDV_ATI = 0x8779; + int GL_DU8DV8_ATI = 0x877A; + int GL_BUMP_ENVMAP_ATI = 0x877B; + int GL_BUMP_TARGET_ATI = 0x877C; + + @StripPostfix("param") + void glTexBumpParameterfvATI(@GLenum int pname, @Check("4") @Const FloatBuffer param); + + @StripPostfix("param") + void glTexBumpParameterivATI(@GLenum int pname, @Check("4") @Const IntBuffer param); + + @StripPostfix("param") + void glGetTexBumpParameterfvATI(@GLenum int pname, @OutParameter @Check("4") FloatBuffer param); + + @StripPostfix("param") + void glGetTexBumpParameterivATI(@GLenum int pname, @OutParameter @Check("4") IntBuffer param); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_fragment_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_fragment_shader.java new file mode 100644 index 0000000..54a51b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_fragment_shader.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface ATI_fragment_shader { + + int GL_FRAGMENT_SHADER_ATI = 0x8920; + int GL_REG_0_ATI = 0x8921; + int GL_REG_1_ATI = 0x8922; + int GL_REG_2_ATI = 0x8923; + int GL_REG_3_ATI = 0x8924; + int GL_REG_4_ATI = 0x8925; + int GL_REG_5_ATI = 0x8926; + int GL_REG_6_ATI = 0x8927; + int GL_REG_7_ATI = 0x8928; + int GL_REG_8_ATI = 0x8929; + int GL_REG_9_ATI = 0x892A; + int GL_REG_10_ATI = 0x892B; + int GL_REG_11_ATI = 0x892C; + int GL_REG_12_ATI = 0x892D; + int GL_REG_13_ATI = 0x892E; + int GL_REG_14_ATI = 0x892F; + int GL_REG_15_ATI = 0x8930; + int GL_REG_16_ATI = 0x8931; + int GL_REG_17_ATI = 0x8932; + int GL_REG_18_ATI = 0x8933; + int GL_REG_19_ATI = 0x8934; + int GL_REG_20_ATI = 0x8935; + int GL_REG_21_ATI = 0x8936; + int GL_REG_22_ATI = 0x8937; + int GL_REG_23_ATI = 0x8938; + int GL_REG_24_ATI = 0x8939; + int GL_REG_25_ATI = 0x893A; + int GL_REG_26_ATI = 0x893B; + int GL_REG_27_ATI = 0x893C; + int GL_REG_28_ATI = 0x893D; + int GL_REG_29_ATI = 0x893E; + int GL_REG_30_ATI = 0x893F; + int GL_REG_31_ATI = 0x8940; + int GL_CON_0_ATI = 0x8941; + int GL_CON_1_ATI = 0x8942; + int GL_CON_2_ATI = 0x8943; + int GL_CON_3_ATI = 0x8944; + int GL_CON_4_ATI = 0x8945; + int GL_CON_5_ATI = 0x8946; + int GL_CON_6_ATI = 0x8947; + int GL_CON_7_ATI = 0x8948; + int GL_CON_8_ATI = 0x8949; + int GL_CON_9_ATI = 0x894A; + int GL_CON_10_ATI = 0x894B; + int GL_CON_11_ATI = 0x894C; + int GL_CON_12_ATI = 0x894D; + int GL_CON_13_ATI = 0x894E; + int GL_CON_14_ATI = 0x894F; + int GL_CON_15_ATI = 0x8950; + int GL_CON_16_ATI = 0x8951; + int GL_CON_17_ATI = 0x8952; + int GL_CON_18_ATI = 0x8953; + int GL_CON_19_ATI = 0x8954; + int GL_CON_20_ATI = 0x8955; + int GL_CON_21_ATI = 0x8956; + int GL_CON_22_ATI = 0x8957; + int GL_CON_23_ATI = 0x8958; + int GL_CON_24_ATI = 0x8959; + int GL_CON_25_ATI = 0x895A; + int GL_CON_26_ATI = 0x895B; + int GL_CON_27_ATI = 0x895C; + int GL_CON_28_ATI = 0x895D; + int GL_CON_29_ATI = 0x895E; + int GL_CON_30_ATI = 0x895F; + int GL_CON_31_ATI = 0x8960; + int GL_MOV_ATI = 0x8961; + int GL_ADD_ATI = 0x8963; + int GL_MUL_ATI = 0x8964; + int GL_SUB_ATI = 0x8965; + int GL_DOT3_ATI = 0x8966; + int GL_DOT4_ATI = 0x8967; + int GL_MAD_ATI = 0x8968; + int GL_LERP_ATI = 0x8969; + int GL_CND_ATI = 0x896A; + int GL_CND0_ATI = 0x896B; + int GL_DOT2_ADD_ATI = 0x896C; + int GL_SECONDARY_INTERPOLATOR_ATI = 0x896D; + int GL_NUM_FRAGMENT_REGISTERS_ATI = 0x896E; + int GL_NUM_FRAGMENT_CONSTANTS_ATI = 0x896F; + int GL_NUM_PASSES_ATI = 0x8970; + int GL_NUM_INSTRUCTIONS_PER_PASS_ATI = 0x8971; + int GL_NUM_INSTRUCTIONS_TOTAL_ATI = 0x8972; + int GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI = 0x8973; + int GL_NUM_LOOPBACK_COMPONENTS_ATI = 0x8974; + int GL_COLOR_ALPHA_PAIRING_ATI = 0x8975; + int GL_SWIZZLE_STR_ATI = 0x8976; + int GL_SWIZZLE_STQ_ATI = 0x8977; + int GL_SWIZZLE_STR_DR_ATI = 0x8978; + int GL_SWIZZLE_STQ_DQ_ATI = 0x8979; + int GL_SWIZZLE_STRQ_ATI = 0x897A; + int GL_SWIZZLE_STRQ_DQ_ATI = 0x897B; + int GL_RED_BIT_ATI = 0x00000001; + int GL_GREEN_BIT_ATI = 0x00000002; + int GL_BLUE_BIT_ATI = 0x00000004; + int GL_2X_BIT_ATI = 0x00000001; + int GL_4X_BIT_ATI = 0x00000002; + int GL_8X_BIT_ATI = 0x00000004; + int GL_HALF_BIT_ATI = 0x00000008; + int GL_QUARTER_BIT_ATI = 0x00000010; + int GL_EIGHTH_BIT_ATI = 0x00000020; + int GL_SATURATE_BIT_ATI = 0x00000040; + int GL_COMP_BIT_ATI = 0x00000002; + int GL_NEGATE_BIT_ATI = 0x00000004; + int GL_BIAS_BIT_ATI = 0x00000008; + + @GLuint + int glGenFragmentShadersATI(@GLuint int range); + + void glBindFragmentShaderATI(@GLuint int id); + + void glDeleteFragmentShaderATI(@GLuint int id); + + void glBeginFragmentShaderATI(); + + void glEndFragmentShaderATI(); + + void glPassTexCoordATI(@GLuint int dst, @GLuint int coord, @GLenum int swizzle); + + void glSampleMapATI(@GLuint int dst, @GLuint int interp, @GLenum int swizzle); + + void glColorFragmentOp1ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMask, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod); + + void glColorFragmentOp2ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMask, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod, @GLuint int arg2, @GLuint int arg2Rep, @GLuint int arg2Mod); + + void glColorFragmentOp3ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMask, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod, @GLuint int arg2, @GLuint int arg2Rep, @GLuint int arg2Mod, @GLuint int arg3, @GLuint int arg3Rep, @GLuint int arg3Mod); + + void glAlphaFragmentOp1ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod); + + void glAlphaFragmentOp2ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod, @GLuint int arg2, @GLuint int arg2Rep, @GLuint int arg2Mod); + + void glAlphaFragmentOp3ATI(@GLenum int op, @GLuint int dst, @GLuint int dstMod, @GLuint int arg1, @GLuint int arg1Rep, @GLuint int arg1Mod, @GLuint int arg2, @GLuint int arg2Rep, @GLuint int arg2Mod, @GLuint int arg3, @GLuint int arg3Rep, @GLuint int arg3Mod); + + // TODO:is the @Check correct? + void glSetFragmentShaderConstantATI(@GLuint int dst, @Check("4") @Const FloatBuffer pfValue); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_map_object_buffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_map_object_buffer.java new file mode 100644 index 0000000..083380c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_map_object_buffer.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLuint; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.*; + +public interface ATI_map_object_buffer { + + /** + * glMapObjectBufferATI maps an ATI vertex array object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the vertex array object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapObjectBufferATI like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapObjectBufferATI(..., null); ... // Another map on the same buffer mapped_buffer = glMapObjectBufferATI(..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetObjectBufferATI internally to + * retrieve the current vertex array object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the vertex array object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the vertex array object size. Reading from or writing to outside + * the memory region that corresponds to the mapped vertex array object will cause native crashes. + * + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult + @GLvoid + @AutoSize("GLChecks.getBufferObjectSizeATI(caps, buffer)") + ByteBuffer glMapObjectBufferATI(@GLuint int buffer); + + void glUnmapObjectBufferATI(@GLuint int buffer); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_meminfo.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_meminfo.java new file mode 100644 index 0000000..27c8351 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_meminfo.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_meminfo { + + /** Accepted by the &lt;value&gt; parameter of GetIntegerv: */ + int GL_VBO_FREE_MEMORY_ATI = 0x87FB; + int GL_TEXTURE_FREE_MEMORY_ATI = 0x87FC; + int GL_RENDERBUFFER_FREE_MEMORY_ATI = 0x87FD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_pn_triangles.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_pn_triangles.java new file mode 100644 index 0000000..11d2a98 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_pn_triangles.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ATI_pn_triangles { + int GL_PN_TRIANGLES_ATI = 0x87F0; + int GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI = 0x87F1; + int GL_PN_TRIANGLES_POINT_MODE_ATI = 0x87F2; + int GL_PN_TRIANGLES_NORMAL_MODE_ATI = 0x87F3; + int GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI = 0x87F4; + int GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI = 0x87F5; + int GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI = 0x87F6; + int GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI = 0x87F7; + int GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI = 0x87F8; + + void glPNTrianglesfATI(@GLenum int pname, float param); + + void glPNTrianglesiATI(@GLenum int pname, int param); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_separate_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_separate_stencil.java new file mode 100644 index 0000000..21f51ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_separate_stencil.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface ATI_separate_stencil { + int GL_STENCIL_BACK_FUNC_ATI = 0x8800; + int GL_STENCIL_BACK_FAIL_ATI = 0x8801; + int GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI = 0x8802; + int GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI = 0x8803; + + void glStencilOpSeparateATI(@GLenum int face, @GLenum int sfail, @GLenum int dpfail, @GLenum int dppass); + + void glStencilFuncSeparateATI(@GLenum int frontfunc, @GLenum int backfunc, int ref, @GLuint int mask); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_shader_texture_lod.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_shader_texture_lod.java new file mode 100644 index 0000000..ee7ac0d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_shader_texture_lod.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_shader_texture_lod { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_text_fragment_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_text_fragment_shader.java new file mode 100644 index 0000000..795cb3d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_text_fragment_shader.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_text_fragment_shader { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4{d,dv,f,fv}ARB, + * ProgramLocalParameter4{d,dv,f,fv}ARB, + * GetProgramEnvParameter{dv,fv}ARB, GetProgramLocalParameter{dv,fv}ARB, + * GetProgramivARB, GetProgramfvATI, and GetProgramStringARB. + */ + int GL_TEXT_FRAGMENT_SHADER_ATI = 0x8200; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_compression_3dc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_compression_3dc.java new file mode 100644 index 0000000..1fe4a40 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_compression_3dc.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +@Extension(postfix = "ATI", className = "ATITextureCompression3DC") +public interface ATI_texture_compression_3dc { + int GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI = 0x8837; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_env_combine3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_env_combine3.java new file mode 100644 index 0000000..e591a3c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_env_combine3.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_texture_env_combine3 { + + /** + * Accepted by the &lt;params&gt; parameter of TexEnvf, TexEnvi, TexEnvfv, + * and TexEnviv when the &lt;pname&gt; parameter value is COMBINE_RGB_ARB + * or COMBINE_ALPHA_ARB + */ + int GL_MODULATE_ADD_ATI = 0x8744; + int GL_MODULATE_SIGNED_ADD_ATI = 0x8745; + int GL_MODULATE_SUBTRACT_ATI = 0x8746; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_float.java new file mode 100644 index 0000000..d8405fc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_float.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_texture_float { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA_FLOAT32_ATI = 0x8814; + int GL_RGB_FLOAT32_ATI = 0x8815; + int GL_ALPHA_FLOAT32_ATI = 0x8816; + int GL_INTENSITY_FLOAT32_ATI = 0x8817; + int GL_LUMINANCE_FLOAT32_ATI = 0x8818; + int GL_LUMINANCE_ALPHA_FLOAT32_ATI = 0x8819; + int GL_RGBA_FLOAT16_ATI = 0x881A; + int GL_RGB_FLOAT16_ATI = 0x881B; + int GL_ALPHA_FLOAT16_ATI = 0x881C; + int GL_INTENSITY_FLOAT16_ATI = 0x881D; + int GL_LUMINANCE_FLOAT16_ATI = 0x881E; + int GL_LUMINANCE_ALPHA_FLOAT16_ATI = 0x881F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_mirror_once.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_mirror_once.java new file mode 100644 index 0000000..e6692df --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_texture_mirror_once.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface ATI_texture_mirror_once { + int GL_MIRROR_CLAMP_ATI = 0x8742; + int GL_MIRROR_CLAMP_TO_EDGE_ATI = 0x8743; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_array_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_array_object.java new file mode 100644 index 0000000..eee7c8f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_array_object.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface ATI_vertex_array_object { + int GL_STATIC_ATI = 0x8760; + int GL_DYNAMIC_ATI = 0x8761; + int GL_PRESERVE_ATI = 0x8762; + int GL_DISCARD_ATI = 0x8763; + int GL_OBJECT_BUFFER_SIZE_ATI = 0x8764; + int GL_OBJECT_BUFFER_USAGE_ATI = 0x8765; + int GL_ARRAY_OBJECT_BUFFER_ATI = 0x8766; + int GL_ARRAY_OBJECT_OFFSET_ATI = 0x8767; + + @GenerateAutos + @GLuint + int glNewObjectBufferATI(@AutoSize("pPointer") @GLsizei int size, + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pPointer, @GLenum int usage); + + boolean glIsObjectBufferATI(@GLuint int buffer); + + void glUpdateObjectBufferATI(@GLuint int buffer, @GLuint int offset, @AutoSize("pPointer") @GLsizei int size, + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pPointer, @GLenum int preserve); + + @StripPostfix("params") + void glGetObjectBufferfvATI(@GLuint int buffer, @GLenum int pname, @OutParameter @Check FloatBuffer params); + + @StripPostfix("params") + void glGetObjectBufferivATI(@GLuint int buffer, @GLenum int pname, @OutParameter @Check IntBuffer params); + + @Alternate("glGetObjectBufferivATI") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetObjectBufferivATI2(@GLuint int buffer, @GLenum int pname, @OutParameter IntBuffer params); + + void glFreeObjectBufferATI(@GLuint int buffer); + + void glArrayObjectATI(@GLenum int array, int size, @GLenum int type, @GLsizei int stride, @GLuint int buffer, @GLuint int offset); + + @StripPostfix("params") + void glGetArrayObjectfvATI(@GLenum int array, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetArrayObjectivATI(@GLenum int array, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + void glVariantArrayObjectATI(@GLuint int id, @GLenum int type, @GLsizei int stride, @GLuint int buffer, @GLuint int offset); + + @StripPostfix("params") + void glGetVariantArrayObjectfvATI(@GLuint int id, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVariantArrayObjectivATI(@GLuint int id, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_attrib_array_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_attrib_array_object.java new file mode 100644 index 0000000..1ffc00f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_attrib_array_object.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface ATI_vertex_attrib_array_object { + void glVertexAttribArrayObjectATI(@GLuint int index, int size, @GLenum int type, boolean normalized, @GLsizei int stride, @GLuint int buffer, @GLuint int offset); + + @StripPostfix("params") + void glGetVertexAttribArrayObjectfvATI(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVertexAttribArrayObjectivATI(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_streams.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_streams.java new file mode 100644 index 0000000..33e5f00 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/ATI_vertex_streams.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ATI_vertex_streams { + int GL_MAX_VERTEX_STREAMS_ATI = 0x876B; + int GL_VERTEX_SOURCE_ATI = 0x876C; + int GL_VERTEX_STREAM0_ATI = 0x876D; + int GL_VERTEX_STREAM1_ATI = 0x876E; + int GL_VERTEX_STREAM2_ATI = 0x876F; + int GL_VERTEX_STREAM3_ATI = 0x8770; + int GL_VERTEX_STREAM4_ATI = 0x8771; + int GL_VERTEX_STREAM5_ATI = 0x8772; + int GL_VERTEX_STREAM6_ATI = 0x8773; + int GL_VERTEX_STREAM7_ATI = 0x8774; + + @NoErrorCheck + void glVertexStream2fATI(@GLenum int stream, float x, float y); + + @NoErrorCheck + void glVertexStream2dATI(@GLenum int stream, double x, double y); + + @NoErrorCheck + void glVertexStream2iATI(@GLenum int stream, int x, int y); + + @NoErrorCheck + void glVertexStream2sATI(@GLenum int stream, short x, short y); + + @NoErrorCheck + void glVertexStream3fATI(@GLenum int stream, float x, float y, float z); + + @NoErrorCheck + void glVertexStream3dATI(@GLenum int stream, double x, double y, double z); + + @NoErrorCheck + void glVertexStream3iATI(@GLenum int stream, int x, int y, int z); + + @NoErrorCheck + void glVertexStream3sATI(@GLenum int stream, short x, short y, short z); + + @NoErrorCheck + void glVertexStream4fATI(@GLenum int stream, float x, float y, float z, float w); + + @NoErrorCheck + void glVertexStream4dATI(@GLenum int stream, double x, double y, double z, double w); + + @NoErrorCheck + void glVertexStream4iATI(@GLenum int stream, int x, int y, int z, int w); + + @NoErrorCheck + void glVertexStream4sATI(@GLenum int stream, short x, short y, short z, short w); + + @NoErrorCheck + void glNormalStream3bATI(@GLenum int stream, byte x, byte y, byte z); + + @NoErrorCheck + void glNormalStream3fATI(@GLenum int stream, float x, float y, float z); + + @NoErrorCheck + void glNormalStream3dATI(@GLenum int stream, double x, double y, double z); + + @NoErrorCheck + void glNormalStream3iATI(@GLenum int stream, int x, int y, int z); + + @NoErrorCheck + void glNormalStream3sATI(@GLenum int stream, short x, short y, short z); + + void glClientActiveVertexStreamATI(@GLenum int stream); + + void glVertexBlendEnvfATI(@GLenum int pname, float param); + + void glVertexBlendEnviATI(@GLenum int pname, int param); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_abgr.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_abgr.java new file mode 100644 index 0000000..09c9615 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_abgr.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_abgr { + int GL_ABGR_EXT = 0x8000; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bgra.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bgra.java new file mode 100644 index 0000000..36e9d65 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bgra.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_bgra { + int GL_BGR_EXT = 0x80E0; + int GL_BGRA_EXT = 0x80E1; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bindable_uniform.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bindable_uniform.java new file mode 100644 index 0000000..f3e39ab --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_bindable_uniform.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLintptr; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_bindable_uniform { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT = 0x8DE2; + int GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT = 0x8DE3; + int GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT = 0x8DE4; + int GL_MAX_BINDABLE_UNIFORM_SIZE_EXT = 0x8DED; + int GL_UNIFORM_BUFFER_BINDING_EXT = 0x8DEF; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_UNIFORM_BUFFER_EXT = 0x8DEE; + + void glUniformBufferEXT(@GLuint int program, int location, @GLuint int buffer); + + int glGetUniformBufferSizeEXT(@GLuint int program, int location); + + @GLintptr + long glGetUniformOffsetEXT(@GLuint int program, int location); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_color.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_color.java new file mode 100644 index 0000000..ee37e7d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_color.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLclampf; + +public interface EXT_blend_color { + + /** Accepted by the &lt;sfactor&gt; and &lt;dfactor&gt; parameters of BlendFunc. */ + int GL_CONSTANT_COLOR_EXT = 0x8001; + int GL_ONE_MINUS_CONSTANT_COLOR_EXT = 0x8002; + int GL_CONSTANT_ALPHA_EXT = 0x8003; + int GL_ONE_MINUS_CONSTANT_ALPHA_EXT = 0x8004; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + int GL_BLEND_COLOR_EXT = 0x8005; + + void glBlendColorEXT(@GLclampf float red, @GLclampf float green, @GLclampf float blue, @GLclampf float alpha); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_equation_separate.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_equation_separate.java new file mode 100644 index 0000000..46e4d44 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_equation_separate.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_blend_equation_separate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_BLEND_EQUATION_RGB_EXT = 0x8009; + int GL_BLEND_EQUATION_ALPHA_EXT = 0x883D; + + void glBlendEquationSeparateEXT(@GLenum int modeRGB, @GLenum int modeAlpha); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_func_separate.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_func_separate.java new file mode 100644 index 0000000..157a531 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_func_separate.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_blend_func_separate { + int GL_BLEND_DST_RGB_EXT = 0x80C8; + int GL_BLEND_SRC_RGB_EXT = 0x80C9; + int GL_BLEND_DST_ALPHA_EXT = 0x80CA; + int GL_BLEND_SRC_ALPHA_EXT = 0x80CB; + + void glBlendFuncSeparateEXT(@GLenum int sfactorRGB, @GLenum int dfactorRGB, @GLenum int sfactorAlpha, @GLenum int dfactorAlpha); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_minmax.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_minmax.java new file mode 100644 index 0000000..d70fee4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_minmax.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_blend_minmax { + + /** Accepted by the &lt;mode&gt; parameter of BlendEquationEXT. */ + int GL_FUNC_ADD_EXT = 0x8006; + int GL_MIN_EXT = 0x8007; + int GL_MAX_EXT = 0x8008; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + int GL_BLEND_EQUATION_EXT = 0x8009; + + void glBlendEquationEXT(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_subtract.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_subtract.java new file mode 100644 index 0000000..df164cf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_blend_subtract.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_blend_subtract { + int GL_FUNC_SUBTRACT_EXT = 0x800A; + int GL_FUNC_REVERSE_SUBTRACT_EXT = 0x800B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_cg_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_cg_shader.java new file mode 100644 index 0000000..d253c11 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_cg_shader.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_Cg_shader { + + /** + * You can pass GL_CG_VERTEX_SHADER_EXT to glCreateShaderARB instead of GL_VERTEX_SHADER_ARB to create a vertex shader object + * that will parse and compile its shader source with the Cg compiler front-end rather than the GLSL front-end. Likewise, you + * can pass GL_CG_FRAGMENT_SHADER_EXT to glCreateShaderARB instead of GL_FRAGMENT_SHADER_ARB to create a fragment shader object + * that will parse and compile its shader source with the Cg front-end rather than the GLSL front-end. + */ + int GL_CG_VERTEX_SHADER_EXT = 0x890E; + int GL_CG_FRAGMENT_SHADER_EXT = 0x890F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_compiled_vertex_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_compiled_vertex_array.java new file mode 100644 index 0000000..4b54a65 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_compiled_vertex_array.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLsizei; + +public interface EXT_compiled_vertex_array { + int GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = 0x81A8; + int GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = 0x81A9; + + void glLockArraysEXT(int first, @GLsizei int count); + + void glUnlockArraysEXT(); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_depth_bounds_test.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_depth_bounds_test.java new file mode 100644 index 0000000..f43d4e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_depth_bounds_test.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLclampd; + +public interface EXT_depth_bounds_test { + + /** + Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev: + */ + int GL_DEPTH_BOUNDS_TEST_EXT = 0x8890; + + /** + Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev: + */ + int GL_DEPTH_BOUNDS_EXT = 0x8891; + + void glDepthBoundsEXT(@GLclampd double zmin, @GLclampd double zmax); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_direct_state_access.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_direct_state_access.java new file mode 100644 index 0000000..d640299 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_direct_state_access.java @@ -0,0 +1,1515 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +@ForceInit +@Dependent +@DeprecatedGL +public interface EXT_direct_state_access { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanIndexedvEXT, + * GetIntegerIndexedvEXT, GetFloatIndexedvEXT, GetDoubleIndexedvEXT: + * GetBooleani_v, GetIntegeri_v, GetFloati_vEXT, GetDoublei_vEXT: + */ + int GL_PROGRAM_MATRIX_EXT = 0x8E2D; + int GL_TRANSPOSE_PROGRAM_MATRIX_EXT = 0x8E2E; + int GL_PROGRAM_MATRIX_STACK_DEPTH_EXT = 0x8E2F; + + /* + OpenGL 1.1: New client commands + */ + + @DeprecatedGL + void glClientAttribDefaultEXT(@GLbitfield int mask); + + @DeprecatedGL + void glPushClientAttribDefaultEXT(@GLbitfield int mask); + + /* + OpenGL 1.0: New matrix commands add "Matrix" prefix to name, + drops "Matrix" suffix from name, and add initial "enum matrixMode" + parameter + */ + + @StripPostfix("m") + @DeprecatedGL + void glMatrixLoadfEXT(@GLenum int matrixMode, @Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMatrixLoaddEXT(@GLenum int matrixMode, @Check("16") @Const DoubleBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMatrixMultfEXT(@GLenum int matrixMode, @Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMatrixMultdEXT(@GLenum int matrixMode, @Check("16") @Const DoubleBuffer m); + + @DeprecatedGL + void glMatrixLoadIdentityEXT(@GLenum int matrixMode); + + @DeprecatedGL + void glMatrixRotatefEXT(@GLenum int matrixMode, float angle, float x, float y, float z); + + @DeprecatedGL + void glMatrixRotatedEXT(@GLenum int matrixMode, double angle, double x, double y, double z); + + @DeprecatedGL + void glMatrixScalefEXT(@GLenum int matrixMode, float x, float y, float z); + + @DeprecatedGL + void glMatrixScaledEXT(@GLenum int matrixMode, double x, double y, double z); + + @DeprecatedGL + void glMatrixTranslatefEXT(@GLenum int matrixMode, float x, float y, float z); + + @DeprecatedGL + void glMatrixTranslatedEXT(@GLenum int matrixMode, double x, double y, double z); + + @DeprecatedGL + void glMatrixOrthoEXT(@GLenum int matrixMode, double l, double r, double b, double t, double n, double f); + + @DeprecatedGL + void glMatrixFrustumEXT(@GLenum int matrixMode, double l, double r, double b, double t, double n, double f); + + @DeprecatedGL + void glMatrixPushEXT(@GLenum int matrixMode); + + @DeprecatedGL + void glMatrixPopEXT(@GLenum int matrixMode); + + /* + OpenGL 1.1: New texture object commands and queries replace "Tex" + in name with "Texture" and add initial "uint texture" parameter + */ + + void glTextureParameteriEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, int param); + + @StripPostfix("param") + void glTextureParameterivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer param); + + void glTextureParameterfEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, float param); + + @StripPostfix("param") + void glTextureParameterfvEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer param); + + void glTextureImage1DEXT(@GLuint int texture, @GLenum int target, int level, + int internalformat, @GLsizei int width, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage1DStorage(pixels, format, type, width)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTextureImage2DEXT(@GLuint int texture, @GLenum int target, int level, + int internalformat, @GLsizei int width, @GLsizei int height, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTextureSubImage1DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, @GLsizei int width, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTextureSubImage2DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glCopyTextureImage1DEXT(@GLuint int texture, @GLenum int target, int level, @GLenum int internalformat, int x, int y, @GLsizei int width, int border); + + void glCopyTextureImage2DEXT(@GLuint int texture, @GLenum int target, int level, @GLenum int internalformat, int x, int y, @GLsizei int width, @GLsizei int height, int border); + + void glCopyTextureSubImage1DEXT(@GLuint int texture, @GLenum int target, int level, int xoffset, int x, int y, @GLsizei int width); + + void glCopyTextureSubImage2DEXT(@GLuint int texture, @GLenum int target, int level, int xoffset, int yoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + void glGetTextureImageEXT(@GLuint int texture, @GLenum int target, int level, + @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @StripPostfix("params") + void glGetTextureParameterfvEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTextureParameterfvEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureParameterfvEXT2(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetTextureParameterivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTextureParameterivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureParameterivEXT2(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetTextureLevelParameterfvEXT(@GLuint int texture, @GLenum int target, int level, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTextureLevelParameterfvEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureLevelParameterfvEXT2(@GLuint int texture, @GLenum int target, int level, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetTextureLevelParameterivEXT(@GLuint int texture, @GLenum int target, int level, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTextureLevelParameterivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureLevelParameterivEXT2(@GLuint int texture, @GLenum int target, int level, @GLenum int pname, @OutParameter IntBuffer params); + + /* + OpenGL 1.2: New 3D texture object commands replace "Tex" in name with + "Texture" and adds initial "uint texture" parameter + */ + + @Dependent("OpenGL12") + void glTextureImage3DEXT(@GLuint int texture, @GLenum int target, int level, + int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL12") + void glTextureSubImage3DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL12") + void glCopyTextureSubImage3DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, int yoffset, int zoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + /* + OpenGL 1.2.1: New multitexture commands and queries prefix "Multi" + before "Tex" and add an initial "enum texunit" parameter (to identify + the texture unit + */ + + @Dependent("OpenGL13") + void glBindMultiTextureEXT(@GLenum int texunit, @GLenum int target, @GLuint int texture); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexCoordPointerEXT(@GLenum int texunit, int size, @AutoType("pointer") @GLenum int type, @GLsizei int stride, + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLfloat + @GLdouble + Buffer pointer); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexEnvfEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, float param); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glMultiTexEnvfvEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexEnviEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, int param); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glMultiTexEnvivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexGendEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, double param); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glMultiTexGendvEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @Const DoubleBuffer params); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexGenfEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, float param); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glMultiTexGenfvEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @Dependent("OpenGL13") + @DeprecatedGL + void glMultiTexGeniEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, int param); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glMultiTexGenivEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glGetMultiTexEnvfvEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glGetMultiTexEnvivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glGetMultiTexGendvEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @OutParameter DoubleBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glGetMultiTexGenfvEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + @DeprecatedGL + void glGetMultiTexGenivEXT(@GLenum int texunit, @GLenum int coord, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Dependent("OpenGL13") + void glMultiTexParameteriEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, int param); + + @Dependent("OpenGL13") + @StripPostfix("param") + void glMultiTexParameterivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer param); + + @Dependent("OpenGL13") + void glMultiTexParameterfEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, float param); + + @Dependent("OpenGL13") + @StripPostfix("param") + void glMultiTexParameterfvEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer param); + + @Dependent("OpenGL13") + void glMultiTexImage1DEXT(@GLenum int texunit, @GLenum int target, int level, + int internalformat, @GLsizei int width, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage1DStorage(pixels, format, type, width)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glMultiTexImage2DEXT(@GLenum int texunit, @GLenum int target, int level, + int internalformat, @GLsizei int width, @GLsizei int height, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glMultiTexSubImage1DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, @GLsizei int width, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glMultiTexSubImage2DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glCopyMultiTexImage1DEXT(@GLenum int texunit, @GLenum int target, int level, @GLenum int internalformat, int x, int y, @GLsizei int width, int border); + + @Dependent("OpenGL13") + void glCopyMultiTexImage2DEXT(@GLenum int texunit, @GLenum int target, int level, @GLenum int internalformat, int x, int y, @GLsizei int width, @GLsizei int height, int border); + + @Dependent("OpenGL13") + void glCopyMultiTexSubImage1DEXT(@GLenum int texunit, @GLenum int target, int level, int xoffset, int x, int y, @GLsizei int width); + + @Dependent("OpenGL13") + void glCopyMultiTexSubImage2DEXT(@GLenum int texunit, @GLenum int target, int level, int xoffset, int yoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + @Dependent("OpenGL13") + void glGetMultiTexImageEXT(@GLenum int texunit, @GLenum int target, int level, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetMultiTexParameterfvEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Alternate("glGetMultiTexParameterfvEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexParameterfvEXT2(@GLenum int texunit, @GLenum int target, @GLenum int pname, @OutParameter FloatBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetMultiTexParameterivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetMultiTexParameterivEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexParameterivEXT2(@GLenum int texunit, @GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetMultiTexLevelParameterfvEXT(@GLenum int texunit, @GLenum int target, int level, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Alternate("glGetMultiTexLevelParameterfvEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexLevelParameterfvEXT2(@GLenum int texunit, @GLenum int target, int level, @GLenum int pname, @OutParameter FloatBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetMultiTexLevelParameterivEXT(@GLenum int texunit, @GLenum int target, int level, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetMultiTexLevelParameterivEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexLevelParameterivEXT2(@GLenum int texunit, @GLenum int target, int level, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("OpenGL13") + void glMultiTexImage3DEXT(@GLenum int texunit, @GLenum int target, int level, + int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glMultiTexSubImage3DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @Dependent("OpenGL13") + void glCopyMultiTexSubImage3DEXT(@GLenum int texunit, @GLenum int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + /* + OpenGL 1.2.1: New indexed texture commands and queries append + "Indexed" to name and add "uint index" parameter (to identify the + texture unit index) after state name parameters (if any) and before + state value parameters + */ + + @Dependent("OpenGL13") + @DeprecatedGL + void glEnableClientStateIndexedEXT(@GLenum int array, @GLuint int index); + + @Dependent("OpenGL13") + @DeprecatedGL + void glDisableClientStateIndexedEXT(@GLenum int array, @GLuint int index); + + /* + OpenGL 3.0: New indexed texture commands and queries append "i" + to name and add "uint index" parameter (to identify the texture + unit index) after state name parameters (if any) and before state + value parameters + */ + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @Dependent("OpenGL30") + void glEnableClientStateiEXT(@GLenum int array, @GLuint int index); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @Dependent("OpenGL30") + void glDisableClientStateiEXT(@GLenum int array, @GLuint int index); + + /* + OpenGL 1.2.1: New indexed generic queries (added for indexed texture + state) append "Indexed" to name and add "uint index" parameter + (to identify the texture unit) after state name parameters (if any) + and before state value parameters + */ + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetFloatIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") FloatBuffer params); + + @Alternate("glGetFloatIndexedvEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetFloatIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter FloatBuffer params); + + @Dependent("OpenGL13") + @StripPostfix(value = "params", hasPostfix = false) + void glGetDoubleIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") DoubleBuffer params); + + @Alternate("glGetDoubleIndexedvEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix(value = "params", hasPostfix = false) + void glGetDoubleIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter DoubleBuffer params); + + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetPointerIndexedvEXT(@GLenum int pname, @GLuint int index, @Result @GLvoid ByteBuffer params); + + /* + OpenGL 3.0: New indexed generic queries (added for indexed texture + state) replace "v" for "i_v" to name and add "uint index" parameter + (to identify the texture unit) after state name parameters (if any) + and before state value parameters + */ + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @Dependent("OpenGL30") + @StripPostfix("params") + void glGetFloati_vEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") FloatBuffer params); + + @Alternate("glGetFloati_vEXT") + @GLreturn("params") + @Dependent("OpenGL30") + @StripPostfix("params") + void glGetFloati_vEXT2(@GLenum int pname, @GLuint int index, @OutParameter FloatBuffer params); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @Dependent("OpenGL30") + @StripPostfix("params") + void glGetDoublei_vEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") DoubleBuffer params); + + @Alternate("glGetDoublei_vEXT") + @GLreturn("params") + @Dependent("OpenGL30") + @StripPostfix("params") + void glGetDoublei_vEXT2(@GLenum int pname, @GLuint int index, @OutParameter DoubleBuffer params); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @Dependent("OpenGL30") + @StripPostfix(value = "params", hasPostfix = false) + void glGetPointeri_vEXT(@GLenum int pname, @GLuint int index, @Result @GLvoid ByteBuffer params); + + /* + OpenGL 1.2.1: Extend the functionality of these EXT_draw_buffers2 + commands and queries for multitexture + TODO: Why 1.2.1 and not EXT_draw_buffers2? + */ + + @Reuse("EXTDrawBuffers2") + @Dependent("OpenGL13") + void glEnableIndexedEXT(@GLenum int cap, @GLuint int index); + + @Reuse("EXTDrawBuffers2") + @Dependent("OpenGL13") + void glDisableIndexedEXT(@GLenum int cap, @GLuint int index); + + @Reuse("EXTDrawBuffers2") + @Dependent("OpenGL13") + boolean glIsEnabledIndexedEXT(@GLenum int cap, @GLuint int index); + + @Reuse("EXTDrawBuffers2") + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetIntegerIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") IntBuffer params); + + @Reuse("EXTDrawBuffers2") + @Alternate("glGetIntegerIndexedvEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetIntegerIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter IntBuffer params); + + @Reuse("EXTDrawBuffers2") + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetBooleanIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("4") @GLboolean ByteBuffer params); + + @Reuse("EXTDrawBuffers2") + @Alternate("glGetBooleanIndexedvEXT") + @GLreturn("params") + @Dependent("OpenGL13") + @StripPostfix("params") + void glGetBooleanIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter @GLboolean ByteBuffer params); + + /* + ARB_vertex_program: New program commands and queries add "Named" + prefix to name and adds initial "uint program" parameter + */ + + @Dependent("GL_ARB_vertex_program") + void glNamedProgramStringEXT(@GLuint int program, @GLenum int target, @GLenum int format, @AutoSize("string") @GLsizei int len, @Const @GLvoid Buffer string); + + @Alternate("glNamedProgramStringEXT") + @Dependent("GL_ARB_vertex_program") + void glNamedProgramStringEXT(@GLuint int program, @GLenum int target, @GLenum int format, @Constant("string.length()") @GLsizei int length, CharSequence string); + + @Dependent("GL_ARB_vertex_program") + void glNamedProgramLocalParameter4dEXT(@GLuint int program, @GLenum int target, @GLuint int index, double x, double y, double z, double w); + + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glNamedProgramLocalParameter4dvEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Const @Check("4") DoubleBuffer params); + + @Dependent("GL_ARB_vertex_program") + void glNamedProgramLocalParameter4fEXT(@GLuint int program, @GLenum int target, @GLuint int index, float x, float y, float z, float w); + + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glNamedProgramLocalParameter4fvEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Const @Check("4") FloatBuffer params); + + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glGetNamedProgramLocalParameterdvEXT(@GLuint int program, @GLenum int target, @GLuint int index, @OutParameter @Check("4") DoubleBuffer params); + + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glGetNamedProgramLocalParameterfvEXT(@GLuint int program, @GLenum int target, @GLuint int index, @OutParameter @Check("4") FloatBuffer params); + + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glGetNamedProgramivEXT(@GLuint int program, @GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetNamedProgramivEXT") + @GLreturn("params") + @Dependent("GL_ARB_vertex_program") + @StripPostfix("params") + void glGetNamedProgramivEXT2(@GLuint int program, @GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("GL_ARB_vertex_program") + void glGetNamedProgramStringEXT(@GLuint int program, @GLenum int target, @GLenum int pname, @OutParameter @Check @GLvoid ByteBuffer string); + + @Alternate("glGetNamedProgramStringEXT") + @Code("\t\tint programLength = glGetNamedProgramEXT(program, target, ARBProgram.GL_PROGRAM_LENGTH_ARB);") + @GLreturn(value = "paramString", maxLength = "programLength", forceMaxLength = true) + void glGetNamedProgramStringEXT2(@GLuint int program, @GLenum int target, @GLenum int pname, @OutParameter @GLchar ByteBuffer paramString); + + /* + OpenGL 1.3: New compressed texture object commands replace "Tex" + in name with "Texture" and add initial "uint texture" parameter + */ + + @Dependent("OpenGL13") + void glCompressedTextureImage3DEXT(@GLuint int texture, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedTextureImage2DEXT(@GLuint int texture, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, @GLsizei int height, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedTextureImage1DEXT(@GLuint int texture, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedTextureSubImage3DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedTextureSubImage2DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedTextureSubImage1DEXT(@GLuint int texture, @GLenum int target, int level, + int xoffset, @GLsizei int width, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glGetCompressedTextureImageEXT(@GLuint int texture, @GLenum int target, int level, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint Buffer img); + + /* + OpenGL 1.3: New multitexture compressed texture commands and queries + prefix "Multi" before "Tex" and add an initial "enum texunit" + parameter (to identify the texture unit) + */ + + @Dependent("OpenGL13") + void glCompressedMultiTexImage3DEXT(@GLenum int texunit, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedMultiTexImage2DEXT(@GLenum int texunit, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, @GLsizei int height, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedMultiTexImage1DEXT(@GLenum int texunit, @GLenum int target, int level, + @GLenum int internalformat, @GLsizei int width, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedMultiTexSubImage3DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedMultiTexSubImage2DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + @Dependent("OpenGL13") + void glCompressedMultiTexSubImage1DEXT(@GLenum int texunit, @GLenum int target, int level, + int xoffset, @GLsizei int width, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + + @Dependent("OpenGL13") + void glGetCompressedMultiTexImageEXT(@GLenum int texunit, @GLenum int target, int level, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint Buffer img); + + /* + OpenGL 1.3: New transpose matrix commands add "Matrix" suffix + to name, drops "Matrix" suffix from name, and add initial "enum + matrixMode" parameter + */ + + @Dependent("OpenGL13") + @StripPostfix("m") + @DeprecatedGL + void glMatrixLoadTransposefEXT(@GLenum int matrixMode, @Check("16") @Const FloatBuffer m); + + @Dependent("OpenGL13") + @StripPostfix("m") + @DeprecatedGL + void glMatrixLoadTransposedEXT(@GLenum int matrixMode, @Check("16") @Const DoubleBuffer m); + + @Dependent("OpenGL13") + @StripPostfix("m") + @DeprecatedGL + void glMatrixMultTransposefEXT(@GLenum int matrixMode, @Check("16") @Const FloatBuffer m); + + @Dependent("OpenGL13") + @StripPostfix("m") + @DeprecatedGL + void glMatrixMultTransposedEXT(@GLenum int matrixMode, @Check("16") @Const DoubleBuffer m); + + /* + OpenGL 1.5: New buffer commands and queries replace "Buffer" with + "NamedBuffer" in name and replace "enum target" parameter with + "uint buffer" + */ + + @Dependent("OpenGL15") + @GenerateAutos + void glNamedBufferDataEXT(@GLuint int buffer, @AutoSize("data") @GLsizeiptr long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data, @GLenum int usage); + + @Dependent("OpenGL15") + void glNamedBufferSubDataEXT(@GLuint int buffer, @GLintptr long offset, @AutoSize("data") @GLsizeiptr long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + /** + * glMapNamedBufferEXT maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapNamedBufferEXT like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapNamedBufferEXT(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapNamedBufferEXT(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetNamedBufferParameterEXT internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * + * @param length the length of the mapped memory in bytes. + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @Dependent("OpenGL15") + @CachedResult + @GLvoid + @AutoSize("GLChecks.getNamedBufferObjectSize(caps, buffer)") + ByteBuffer glMapNamedBufferEXT(@GLuint int buffer, @GLenum int access); + + @Dependent("OpenGL15") + boolean glUnmapNamedBufferEXT(@GLuint int buffer); + + @Dependent("OpenGL15") + @StripPostfix("params") + void glGetNamedBufferParameterivEXT(@GLuint int buffer, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetNamedBufferParameterivEXT") + @GLreturn("params") + @Dependent("OpenGL15") + @StripPostfix("params") + void glGetNamedBufferParameterivEXT2(@GLuint int buffer, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("OpenGL15") + @StripPostfix("params") + @AutoSize("GLChecks.getNamedBufferObjectSize(caps, buffer)") + void glGetNamedBufferPointervEXT(@GLuint int buffer, @GLenum int pname, @OutParameter @Result @GLvoid ByteBuffer params); + + @Dependent("OpenGL15") + void glGetNamedBufferSubDataEXT(@GLuint int buffer, @GLintptr long offset, @AutoSize("data") @GLsizeiptr long size, + @OutParameter + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + /* + OpenGL 2.0: New uniform commands add "Program" prefix to name and + add initial "uint program" parameter + */ + + @Dependent("OpenGL20") + void glProgramUniform1fEXT(@GLuint int program, int location, float v0); + + @Dependent("OpenGL20") + void glProgramUniform2fEXT(@GLuint int program, int location, float v0, float v1); + + @Dependent("OpenGL20") + void glProgramUniform3fEXT(@GLuint int program, int location, float v0, float v1, float v2); + + @Dependent("OpenGL20") + void glProgramUniform4fEXT(@GLuint int program, int location, float v0, float v1, float v2, float v3); + + @Dependent("OpenGL20") + void glProgramUniform1iEXT(@GLuint int program, int location, int v0); + + @Dependent("OpenGL20") + void glProgramUniform2iEXT(@GLuint int program, int location, int v0, int v1); + + @Dependent("OpenGL20") + void glProgramUniform3iEXT(@GLuint int program, int location, int v0, int v1, int v2); + + @Dependent("OpenGL20") + void glProgramUniform4iEXT(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform1fvEXT(@GLuint int program, int location, @AutoSize(value = "value") @GLsizei int count, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform2fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform3fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform4fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform1ivEXT(@GLuint int program, int location, @AutoSize(value = "value") @GLsizei int count, @Const IntBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform2ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform3ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniform4ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniformMatrix2fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniformMatrix3fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL20") + @StripPostfix("value") + void glProgramUniformMatrix4fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + /* + OpenGL 2.1: New uniform matrix commands add "Program" prefix to + name and add initial "uint program" parameter + */ + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix2x3fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix3x2fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix2x4fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix4x2fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix3x4fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @Dependent("OpenGL21") + @StripPostfix("value") + void glProgramUniformMatrix4x3fvEXT(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + /* + EXT_texture_buffer_object: New texture buffer object command + replaces "Tex" in name with "Texture" and adds initial "uint texture" + parameter + */ + + @Dependent("GL_EXT_texture_buffer_object") + void glTextureBufferEXT(@GLuint int texture, @GLenum int target, @GLenum int internalformat, @GLuint int buffer); + + /* + EXT_texture_buffer_object: New multitexture texture buffer command + prefixes "Multi" before "Tex" and add an initial "enum texunit" + parameter (to identify the texture unit) + */ + + @Dependent("GL_EXT_texture_buffer_object") + void glMultiTexBufferEXT(@GLenum int texunit, @GLenum int target, @GLenum int internalformat, @GLuint int buffer); + + /* + EXT_texture_integer: New integer texture object commands and queries + replace "Tex" in name with "Texture" and add initial "uint texture" + parameter + */ + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glTextureParameterIivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Alternate("glTextureParameterIivEXT") + @Dependent("GL_EXT_texture_integer") + @StripPostfix("param") + void glTextureParameterIivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glTextureParameterIuivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @Const @GLuint IntBuffer params); + + @Alternate("glTextureParameterIuivEXT") + @Dependent("GL_EXT_texture_integer") + @StripPostfix("param") + void glTextureParameterIuivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) @GLuint int param); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glGetTextureParameterIivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetTextureParameterIivEXT") + @GLreturn("params") + @Dependent("GL_EXT_texture_integer") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureParameterIivEXT2(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glGetTextureParameterIuivEXT(@GLuint int texture, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter @GLuint IntBuffer params); + + @Alternate("glGetTextureParameterIuivEXT") + @GLreturn("params") + @Dependent("GL_EXT_texture_integer") + @StripPostfix(value = "params", postfix = "v") + void glGetTextureParameterIuivEXT2(@GLuint int texture, @GLenum int target, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + /* + EXT_texture_integer: New multitexture integer texture commands and + queries prefix "Multi" before "Tex" and add an initial "enum texunit" + parameter (to identify the texture unit) + */ + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glMultiTexParameterIivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @Alternate("glMultiTexParameterIivEXT") + @Dependent("GL_EXT_texture_integer") + @StripPostfix("param") + void glMultiTexParameterIivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glMultiTexParameterIuivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @Const @GLuint IntBuffer params); + + @Alternate("glMultiTexParameterIuivEXT") + @Dependent("GL_EXT_texture_integer") + @StripPostfix("param") + void glMultiTexParameterIuivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glGetMultiTexParameterIivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetMultiTexParameterIivEXT") + @GLreturn("params") + @Dependent("GL_EXT_texture_integer") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexParameterIivEXT2(@GLenum int texunit, @GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Dependent("GL_EXT_texture_integer") + @StripPostfix("params") + void glGetMultiTexParameterIuivEXT(@GLenum int texunit, @GLenum int target, @GLenum int pname, @Check("4") @OutParameter @GLuint IntBuffer params); + + @Alternate("glGetMultiTexParameterIuivEXT") + @GLreturn("params") + @Dependent("GL_EXT_texture_integer") + @StripPostfix(value = "params", postfix = "v") + void glGetMultiTexParameterIuivEXT2(@GLenum int texunit, @GLenum int target, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + /* + EXT_gpu_shader4: New integer uniform commands add "Program" prefix + to name and add initial "uint program" parameter + */ + + @Dependent("GL_EXT_gpu_shader4") + void glProgramUniform1uiEXT(@GLuint int program, int location, @GLuint int v0); + + @Dependent("GL_EXT_gpu_shader4") + void glProgramUniform2uiEXT(@GLuint int program, int location, @GLuint int v0, @GLuint int v1); + + @Dependent("GL_EXT_gpu_shader4") + void glProgramUniform3uiEXT(@GLuint int program, int location, @GLuint int v0, @GLuint int v1, @GLuint int v2); + + @Dependent("GL_EXT_gpu_shader4") + void glProgramUniform4uiEXT(@GLuint int program, int location, @GLuint int v0, @GLuint int v1, @GLuint int v2, @GLuint int v3); + + @Dependent("GL_EXT_gpu_shader4") + @StripPostfix("value") + void glProgramUniform1uivEXT(@GLuint int program, int location, @AutoSize(value = "value") @GLsizei int count, @Const @GLuint IntBuffer value); + + @Dependent("GL_EXT_gpu_shader4") + @StripPostfix("value") + void glProgramUniform2uivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint IntBuffer value); + + @Dependent("GL_EXT_gpu_shader4") + @StripPostfix("value") + void glProgramUniform3uivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint IntBuffer value); + + @Dependent("GL_EXT_gpu_shader4") + @StripPostfix("value") + void glProgramUniform4uivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer value); + + /* + EXT_gpu_program_parameters: New program command adds "Named" prefix + to name and adds "uint program" parameter + */ + + @Dependent("GL_EXT_gpu_program_parameters") + @StripPostfix("params") + void glNamedProgramLocalParameters4fvEXT(@GLuint int program, @GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const FloatBuffer params); + + /* + NV_gpu_program4: New program commands and queries add "Named" + prefix to name and replace "enum target" with "uint program" + */ + + @Dependent("GL_NV_gpu_program4") + void glNamedProgramLocalParameterI4iEXT(@GLuint int program, @GLenum int target, @GLuint int index, int x, int y, int z, int w); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glNamedProgramLocalParameterI4ivEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Check("4") @Const IntBuffer params); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glNamedProgramLocalParametersI4ivEXT(@GLuint int program, @GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const IntBuffer params); + + @Dependent("GL_NV_gpu_program4") + void glNamedProgramLocalParameterI4uiEXT(@GLuint int program, @GLenum int target, @GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glNamedProgramLocalParameterI4uivEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Check("4") @Const @GLuint IntBuffer params); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glNamedProgramLocalParametersI4uivEXT(@GLuint int program, @GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer params); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glGetNamedProgramLocalParameterIivEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Check("4") @OutParameter IntBuffer params); + + @Dependent("GL_NV_gpu_program4") + @StripPostfix("params") + void glGetNamedProgramLocalParameterIuivEXT(@GLuint int program, @GLenum int target, @GLuint int index, @Check("4") @OutParameter @GLuint IntBuffer params); + + /* + OpenGL 3.0: New renderbuffer commands add "Named" prefix to name + and replace "enum target" with "uint renderbuffer" + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glNamedRenderbufferStorageEXT(@GLuint int renderbuffer, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("params") + void glGetNamedRenderbufferParameterivEXT(@GLuint int renderbuffer, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetNamedRenderbufferParameterivEXT") + @GLreturn("params") + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("params") + void glGetNamedRenderbufferParameterivEXT2(@GLuint int renderbuffer, @GLenum int pname, @OutParameter IntBuffer params); + + /* + EXT_framebuffer_multisample: New renderbuffer commands add "Named" + prefix to name and replace "enum target" with "uint renderbuffer" + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_multisample") + void glNamedRenderbufferStorageMultisampleEXT(@GLuint int renderbuffer, @GLsizei int samples, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + /* + NV_framebuffer_multisample_coverage: New renderbuffer commands + add "Named" prefix to name and replace "enum target" with "uint + renderbuffer" + */ + + @Dependent("GL_NV_framebuffer_multisample_coverage") + void glNamedRenderbufferStorageMultisampleCoverageEXT(@GLuint int renderbuffer, @GLsizei int coverageSamples, @GLsizei int colorSamples, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + /* + OpenGL 3.0: New framebuffer commands add "Named" prefix to name + and replace "enum target" with "uint framebuffer" + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @GLenum + int glCheckNamedFramebufferStatusEXT(@GLuint int framebuffer, @GLenum int target); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glNamedFramebufferTexture1DEXT(@GLuint int framebuffer, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glNamedFramebufferTexture2DEXT(@GLuint int framebuffer, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glNamedFramebufferTexture3DEXT(@GLuint int framebuffer, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level, int zoffset); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glNamedFramebufferRenderbufferEXT(@GLuint int framebuffer, @GLenum int attachment, @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("params") + void glGetNamedFramebufferAttachmentParameterivEXT(@GLuint int framebuffer, @GLenum int attachment, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetNamedFramebufferAttachmentParameterivEXT") + @GLreturn("params") + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("params") + void glGetNamedFramebufferAttachmentParameterivEXT2(@GLuint int framebuffer, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + /* + OpenGL 3.0: New texture commands add "Texture" within name and + replace "enum target" with "uint texture" + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glGenerateTextureMipmapEXT(@GLuint int texture, @GLenum int target); + + /* + OpenGL 3.0: New texture commands add "MultiTex" within name and + replace "enum target" with "enum texunit" + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glGenerateMultiTexMipmapEXT(@GLenum int texunit, @GLenum int target); + + /* + OpenGL 3.0: New framebuffer commands + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glFramebufferDrawBufferEXT(@GLuint int framebuffer, @GLenum int mode); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glFramebufferDrawBuffersEXT(@GLuint int framebuffer, @AutoSize("bufs") @GLsizei int n, @Const @GLenum IntBuffer bufs); + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + void glFramebufferReadBufferEXT(@GLuint int framebuffer, @GLenum int mode); + + /* + OpenGL 3.0: New framebuffer query + */ + + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("param") + void glGetFramebufferParameterivEXT(@GLuint int framebuffer, @GLenum int pname, @Check("4") @OutParameter IntBuffer param); + + @Alternate("glGetFramebufferParameterivEXT") + @GLreturn("param") + @Dependent("OpenGL30,GL_EXT_framebuffer_object") + @StripPostfix("param") + void glGetFramebufferParameterivEXT2(@GLuint int framebuffer, @GLenum int pname, @OutParameter IntBuffer param); + + /* + OpenGL 3.1: New buffer data copy command + */ + + @Dependent("OpenGL31,GL_ARB_copy_buffer") + void glNamedCopyBufferSubDataEXT(@GLuint int readBuffer, @GLuint int writeBuffer, @GLintptr long readoffset, @GLintptr long writeoffset, @GLsizeiptr long size); + + /* + EXT_geometry_shader4 or NV_geometry_program4: New framebuffer commands + add "Named" prefix to name and replace "enum target" with "uint + framebuffer" + */ + + @Dependent("GL_EXT_geometry_shader4,GL_NV_geometry_program4") + void glNamedFramebufferTextureEXT(@GLuint int framebuffer, @GLenum int attachment, @GLuint int texture, int level); + + @Dependent("GL_EXT_geometry_shader4,GL_NV_geometry_program4") + void glNamedFramebufferTextureLayerEXT(@GLuint int framebuffer, @GLenum int attachment, @GLuint int texture, int level, int layer); + + @Dependent("GL_EXT_geometry_shader4,GL_NV_geometry_program4") + void glNamedFramebufferTextureFaceEXT(@GLuint int framebuffer, @GLenum int attachment, @GLuint int texture, int level, @GLenum int face); + + /* + NV_explicit_multisample: New texture renderbuffer object command + replaces "Tex" in name with "Texture" and add initial "uint texture" + parameter + */ + + @Dependent("GL_NV_explicit_multisample") + void glTextureRenderbufferEXT(@GLuint int texture, @GLenum int target, @GLuint int renderbuffer); + + /* + NV_explicit_multisample: New multitexture texture renderbuffer command + prefixes "Multi" before "Tex" and add an initial "enum texunit" + parameter (to identify the texture unit) + */ + + @Dependent("GL_NV_explicit_multisample") + void glMultiTexRenderbufferEXT(@GLenum int texunit, @GLenum int target, @GLuint int renderbuffer); + + /* + OpenGL 3.0: New vertex array specification commands for vertex + array objects prefix "VertexArray", add initial "uint vaobj" and + "uint buffer" parameters, change "Pointer" suffix to "Offset", + and change the final parameter from "const void *" to "intptr offset" + */ + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayVertexOffsetEXT(@GLuint int vaobj, @GLuint int buffer, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayColorOffsetEXT(@GLuint int vaobj, @GLuint int buffer, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayEdgeFlagOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + void glVertexArrayIndexOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayNormalOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayTexCoordOffsetEXT(@GLuint int vaobj, @GLuint int buffer, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayMultiTexCoordOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLenum int texunit, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArrayFogCoordOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + @DeprecatedGL + void glVertexArraySecondaryColorOffsetEXT(@GLuint int vaobj, @GLuint int buffer, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + void glVertexArrayVertexAttribOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLuint int index, int size, @GLenum int type, boolean normalized, @GLsizei int stride, @GLintptr long offset); + + @Dependent("OpenGL30") + void glVertexArrayVertexAttribIOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLuint int index, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + + /* + OpenGL 3.0: New vertex array enable commands for vertex array + objects change "ClientState" to "VertexArray" and add an initial + "uint vaobj" parameter + */ + + @Dependent("OpenGL30") + void glEnableVertexArrayEXT(@GLuint int vaobj, @GLenum int array); + + @Dependent("OpenGL30") + void glDisableVertexArrayEXT(@GLuint int vaobj, @GLenum int array); + + /* + OpenGL 3.0: New vertex attrib array enable commands for vertex + array objects change "VertexAttribArray" to "VertexArrayAttrib" + and add an initial "uint vaobj" parameter + */ + + @Dependent("OpenGL30") + void glEnableVertexArrayAttribEXT(@GLuint int vaobj, @GLuint int index); + + @Dependent("OpenGL30") + void glDisableVertexArrayAttribEXT(@GLuint int vaobj, @GLuint int index); + + /* + OpenGL 3.0: New queries for vertex array objects + */ + + @Dependent("OpenGL30") + @StripPostfix("param") + void glGetVertexArrayIntegervEXT(@GLuint int vaobj, @GLenum int pname, @OutParameter @Check("16") IntBuffer param); + + @Alternate("glGetVertexArrayIntegervEXT") + @GLreturn("param") + @Dependent("OpenGL30") + @StripPostfix("param") + void glGetVertexArrayIntegervEXT2(@GLuint int vaobj, @GLenum int pname, @OutParameter IntBuffer param); + + @Dependent("OpenGL30") + @StripPostfix("param") + void glGetVertexArrayPointervEXT(@GLuint int vaobj, @GLenum int pname, @Result @GLvoid ByteBuffer param); + + @Dependent("OpenGL30") + @StripPostfix(value = "param") + void glGetVertexArrayIntegeri_vEXT(@GLuint int vaobj, @GLuint int index, @GLenum int pname, @OutParameter @Check("16") IntBuffer param); + + @Alternate("glGetVertexArrayIntegeri_vEXT") + @GLreturn("param") + @Dependent("OpenGL30") + @StripPostfix(value = "param", postfix = "_v") + void glGetVertexArrayIntegeri_vEXT2(@GLuint int vaobj, @GLuint int index, @GLenum int pname, @OutParameter IntBuffer param); + + @Dependent("OpenGL30") + @StripPostfix(value = "param") + void glGetVertexArrayPointeri_vEXT(@GLuint int vaobj, @GLuint int index, @GLenum int pname, @Result @GLvoid ByteBuffer param); + + /* + OpenGL 3.0: New buffer commands replace "Buffer" with "NamedBuffer" + in name and replace "enum target" parameter with "uint buffer" + */ + + /** + * glMapNamedBufferRangeEXT maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapNamedBufferRangeEXT like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapNamedBufferRangeEXT(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapNamedBufferRangeEXT(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @Dependent("OpenGL30") + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapNamedBufferRangeEXT(@GLuint int buffer, @GLintptr long offset, @GLsizeiptr long length, @GLbitfield int access); + + @Dependent("OpenGL30") + void glFlushMappedNamedBufferRangeEXT(@GLuint int buffer, @GLintptr long offset, @GLsizeiptr long length); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_buffers2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_buffers2.java new file mode 100644 index 0000000..b03be19 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_buffers2.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLboolean; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; +import java.nio.ByteBuffer; + +public interface EXT_draw_buffers2 { + + void glColorMaskIndexedEXT(@GLuint int buf, boolean r, boolean g, boolean b, boolean a); + + @StripPostfix("data") + void glGetBooleanIndexedvEXT(@GLenum int value, @GLuint int index, @OutParameter @Check("4") @GLboolean ByteBuffer data); + + @Alternate("glGetBooleanIndexedvEXT") + @GLreturn("data") + @StripPostfix("data") + void glGetBooleanIndexedvEXT2(@GLenum int value, @GLuint int index, @OutParameter @GLboolean ByteBuffer data); + + @StripPostfix("data") + void glGetIntegerIndexedvEXT(@GLenum int value, @GLuint int index, @OutParameter @Check("4") IntBuffer data); + + @Alternate("glGetIntegerIndexedvEXT") + @GLreturn("data") + @StripPostfix("data") + void glGetIntegerIndexedvEXT2(@GLenum int value, @GLuint int index, @OutParameter IntBuffer data); + + void glEnableIndexedEXT(@GLenum int target, @GLuint int index); + + void glDisableIndexedEXT(@GLenum int target, @GLuint int index); + + boolean glIsEnabledIndexedEXT(@GLenum int target, @GLuint int index); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_instanced.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_instanced.java new file mode 100644 index 0000000..70838e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_instanced.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface EXT_draw_instanced { + + void glDrawArraysInstancedEXT(@GLenum int mode, int first, @GLsizei int count, @GLsizei int primcount); + + void glDrawElementsInstancedEXT(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_range_elements.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_range_elements.java new file mode 100644 index 0000000..73ea3b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_draw_range_elements.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface EXT_draw_range_elements { + int GL_MAX_ELEMENTS_VERTICES_EXT = 0x80E8; + int GL_MAX_ELEMENTS_INDICES_EXT = 0x80E9; + + void glDrawRangeElementsEXT(@GLenum int mode, @GLuint int start, @GLuint int end, @AutoSize("pIndices") @GLsizei int count, @AutoType("pIndices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer pIndices); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_fog_coord.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_fog_coord.java new file mode 100644 index 0000000..b7bf860 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_fog_coord.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLdouble; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLfloat; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.*; + +public interface EXT_fog_coord { + int GL_FOG_COORDINATE_SOURCE_EXT = 0x8450; + int GL_FOG_COORDINATE_EXT = 0x8451; + int GL_FRAGMENT_DEPTH_EXT = 0x8452; + int GL_CURRENT_FOG_COORDINATE_EXT = 0x8453; + int GL_FOG_COORDINATE_ARRAY_TYPE_EXT = 0x8454; + int GL_FOG_COORDINATE_ARRAY_STRIDE_EXT = 0x8455; + int GL_FOG_COORDINATE_ARRAY_POINTER_EXT = 0x8456; + int GL_FOG_COORDINATE_ARRAY_EXT = 0x8457; + + void glFogCoordfEXT(float coord); + + void glFogCoorddEXT(double coord); + + void glFogCoordPointerEXT(@AutoType("data") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLfloat + @GLdouble Buffer data); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_blit.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_blit.java new file mode 100644 index 0000000..97490c3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_blit.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLint; + +public interface EXT_framebuffer_blit { + + /** + Accepted by the &lt;target&gt; parameter of BindFramebufferEXT, + CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, + FramebufferRenderbufferEXT, and + GetFramebufferAttachmentParameterivEXT. + */ + int GL_READ_FRAMEBUFFER_EXT = 0x8CA8; + int GL_DRAW_FRAMEBUFFER_EXT = 0x8CA9; + + /** + Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and GetDoublev. + */ + int GL_DRAW_FRAMEBUFFER_BINDING_EXT = 0x8CA6; // alias FRAMEBUFFER_BINDING_EXT + int GL_READ_FRAMEBUFFER_BINDING_EXT = 0x8CAA; + + /** + Transfers a rectangle of pixel values from one + region of the read framebuffer to another in the draw framebuffer. + &lt;mask&gt; is the bitwise OR of a number of values indicating which + buffers are to be copied. The values are COLOR_BUFFER_BIT, + DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + The pixels corresponding to these buffers are + copied from the source rectangle, bound by the locations (srcX0, + srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + inclusive. + If the source and destination rectangle dimensions do not match, + the source image is stretched to fit the destination + rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + method of interpolation to be applied if the image is + stretched. + */ + void glBlitFramebufferEXT( + @GLint int srcX0, @GLint int srcY0, @GLint int srcX1, @GLint int srcY1, + @GLint int dstX0, @GLint int dstY0, @GLint int dstX1, @GLint int dstY1, + @GLbitfield int mask, @GLenum int filter); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample.java new file mode 100644 index 0000000..6ec87fc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +public interface EXT_framebuffer_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT. */ + int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB; + + /** Returned by CheckFramebufferStatusEXT. */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + int GL_MAX_SAMPLES_EXT = 0x8D57; + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + void glRenderbufferStorageMultisampleEXT( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample_blit_scaled.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample_blit_scaled.java new file mode 100644 index 0000000..73c9ff7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_multisample_blit_scaled.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_framebuffer_multisample_blit_scaled { + + /** Accepted by the &lt;filter&gt; parameter of BlitFramebuffer: */ + int GL_SCALED_RESOLVE_FASTEST_EXT = 0x90BA, + GL_SCALED_RESOLVE_NICEST_EXT = 0x90BB; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_object.java new file mode 100644 index 0000000..502fa24 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_object.java @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface EXT_framebuffer_object { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebufferEXT, + * CheckFramebufferStatusEXT, FramebufferTexture{1D|2D|3D}EXT, and + * FramebufferRenderbufferEXT: + */ + int GL_FRAMEBUFFER_EXT = 0x8D40; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbufferEXT, + * RenderbufferStorageEXT, and GetRenderbufferParameterivEXT, and + * returned by GetFramebufferAttachmentParameterivEXT: + */ + int GL_RENDERBUFFER_EXT = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT: + */ + int GL_STENCIL_INDEX1_EXT = 0x8D46; + int GL_STENCIL_INDEX4_EXT = 0x8D47; + int GL_STENCIL_INDEX8_EXT = 0x8D48; + int GL_STENCIL_INDEX16_EXT = 0x8D49; + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT: */ + int GL_RENDERBUFFER_WIDTH_EXT = 0x8D42; + int GL_RENDERBUFFER_HEIGHT_EXT = 0x8D43; + int GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = 0x8D44; + int GL_RENDERBUFFER_RED_SIZE_EXT = 0x8D50; + int GL_RENDERBUFFER_GREEN_SIZE_EXT = 0x8D51; + int GL_RENDERBUFFER_BLUE_SIZE_EXT = 0x8D52; + int GL_RENDERBUFFER_ALPHA_SIZE_EXT = 0x8D53; + int GL_RENDERBUFFER_DEPTH_SIZE_EXT = 0x8D54; + int GL_RENDERBUFFER_STENCIL_SIZE_EXT = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = 0x8CD0; + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = 0x8CD1; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = 0x8CD2; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = 0x8CD3; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = 0x8CD4; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}EXT, FramebufferRenderbufferEXT, and + * GetFramebufferAttachmentParameterivEXT + */ + int GL_COLOR_ATTACHMENT0_EXT = 0x8CE0; + int GL_COLOR_ATTACHMENT1_EXT = 0x8CE1; + int GL_COLOR_ATTACHMENT2_EXT = 0x8CE2; + int GL_COLOR_ATTACHMENT3_EXT = 0x8CE3; + int GL_COLOR_ATTACHMENT4_EXT = 0x8CE4; + int GL_COLOR_ATTACHMENT5_EXT = 0x8CE5; + int GL_COLOR_ATTACHMENT6_EXT = 0x8CE6; + int GL_COLOR_ATTACHMENT7_EXT = 0x8CE7; + int GL_COLOR_ATTACHMENT8_EXT = 0x8CE8; + int GL_COLOR_ATTACHMENT9_EXT = 0x8CE9; + int GL_COLOR_ATTACHMENT10_EXT = 0x8CEA; + int GL_COLOR_ATTACHMENT11_EXT = 0x8CEB; + int GL_COLOR_ATTACHMENT12_EXT = 0x8CEC; + int GL_COLOR_ATTACHMENT13_EXT = 0x8CED; + int GL_COLOR_ATTACHMENT14_EXT = 0x8CEE; + int GL_COLOR_ATTACHMENT15_EXT = 0x8CEF; + int GL_DEPTH_ATTACHMENT_EXT = 0x8D00; + int GL_STENCIL_ATTACHMENT_EXT = 0x8D20; + + /** Returned by CheckFramebufferStatusEXT(): */ + int GL_FRAMEBUFFER_COMPLETE_EXT = 0x8CD5; + int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = 0x8CD6; + int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = 0x8CD7; + int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = 0x8CD9; + int GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = 0x8CDA; + int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = 0x8CDB; + int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = 0x8CDC; + int GL_FRAMEBUFFER_UNSUPPORTED_EXT = 0x8CDD; + + /** Accepted by GetIntegerv(): */ + int GL_FRAMEBUFFER_BINDING_EXT = 0x8CA6; + int GL_RENDERBUFFER_BINDING_EXT = 0x8CA7; + int GL_MAX_COLOR_ATTACHMENTS_EXT = 0x8CDF; + int GL_MAX_RENDERBUFFER_SIZE_EXT = 0x84E8; + + /** Returned by GetError(): */ + int GL_INVALID_FRAMEBUFFER_OPERATION_EXT = 0x0506; + + boolean glIsRenderbufferEXT(@GLuint int renderbuffer); + + void glBindRenderbufferEXT(@GLenum int target, @GLuint int renderbuffer); + + void glDeleteRenderbuffersEXT(@AutoSize("renderbuffers") int n, @Const @GLuint IntBuffer renderbuffers); + + @Alternate("glDeleteRenderbuffersEXT") + void glDeleteRenderbuffersEXT(@Constant("1") int n, @Constant(value = "APIUtil.getInt(caps, renderbuffer)", keepParam = true) int renderbuffer); + + void glGenRenderbuffersEXT(@AutoSize("renderbuffers") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Alternate("glGenRenderbuffersEXT") + @GLreturn("renderbuffers") + void glGenRenderbuffersEXT2(@Constant("1") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + void glRenderbufferStorageEXT(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + @StripPostfix("params") + void glGetRenderbufferParameterivEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteriEXT} instead. */ + @Alternate("glGetRenderbufferParameterivEXT") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "EXTFramebufferObject", method = "glGetRenderbufferParameteriEXT") + @Deprecated + void glGetRenderbufferParameterivEXT2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetRenderbufferParameterivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetRenderbufferParameterivEXT3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + boolean glIsFramebufferEXT(@GLuint int framebuffer); + + void glBindFramebufferEXT(@GLenum int target, @GLuint int framebuffer); + + void glDeleteFramebuffersEXT(@AutoSize("framebuffers") int n, @Const @GLuint IntBuffer framebuffers); + + @Alternate("glDeleteFramebuffersEXT") + void glDeleteFramebuffersEXT(@Constant("1") int n, @Constant(value = "APIUtil.getInt(caps, framebuffer)", keepParam = true) int framebuffer); + + void glGenFramebuffersEXT(@AutoSize("framebuffers") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Alternate("glGenFramebuffersEXT") + @GLreturn("framebuffers") + void glGenFramebuffersEXT2(@Constant("1") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @GLenum + int glCheckFramebufferStatusEXT(@GLenum int target); + + void glFramebufferTexture1DEXT(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + void glFramebufferTexture2DEXT(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + void glFramebufferTexture3DEXT(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level, int zoffset); + + void glFramebufferRenderbufferEXT(@GLenum int target, @GLenum int attachment, @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + @StripPostfix("params") + void glGetFramebufferAttachmentParameterivEXT(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteriEXT} instead. */ + @Alternate("glGetFramebufferAttachmentParameterivEXT") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "EXTFramebufferObject", method = "glGetFramebufferAttachmentParameteriEXT") + @Deprecated + void glGetFramebufferAttachmentParameterivEXT2(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetFramebufferAttachmentParameterivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferAttachmentParameterivEXT3(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + void glGenerateMipmapEXT(@GLenum int target); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_sRGB.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_sRGB.java new file mode 100644 index 0000000..160aed0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_framebuffer_sRGB.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_framebuffer_sRGB { + + /** + * Accepted by the &lt;attribList&gt; parameter of glXChooseVisual, and by + * the &lt;attrib&gt; parameter of glXGetConfig: + */ + int GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20B2; + + /** + * Accepted by the &lt;piAttributes&gt; parameter of + * wglGetPixelFormatAttribivEXT, wglGetPixelFormatAttribfvEXT, and + * the &lt;piAttribIList&gt; and &lt;pfAttribIList&gt; of wglChoosePixelFormatEXT: + */ + int WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x20A9; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB_EXT = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB_CAPABLE_EXT = 0x8DBA; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_geometry_shader4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_geometry_shader4.java new file mode 100644 index 0000000..a12911a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_geometry_shader4.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_geometry_shader4 { + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + int GL_GEOMETRY_SHADER_EXT = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + int GL_GEOMETRY_VERTICES_OUT_EXT = 0x8DDA; + int GL_GEOMETRY_INPUT_TYPE_EXT = 0x8DDB; + int GL_GEOMETRY_OUTPUT_TYPE_EXT = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT = 0x8C29; + int GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT = 0x8DDD; + int GL_MAX_VERTEX_VARYING_COMPONENTS_EXT = 0x8DDE; + int GL_MAX_VARYING_COMPONENTS_EXT = 0x8B4B; + int GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT = 0x8DDF; + int GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT = 0x8DE0; + int GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + int GL_LINES_ADJACENCY_EXT = 0xA; + int GL_LINE_STRIP_ADJACENCY_EXT = 0xB; + int GL_TRIANGLES_ADJACENCY_EXT = 0xC; + int GL_TRIANGLE_STRIP_ADJACENCY_EXT = 0xD; + + /** Returned by CheckFramebufferStatusEXT: */ + int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT = 0x8DA8; + int GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT = 0x8DA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT = 0x8DA7; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + int GL_PROGRAM_POINT_SIZE_EXT = 0x8642; + + void glProgramParameteriEXT(@GLuint int program, @GLenum int pname, int value); + + void glFramebufferTextureEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level); + + void glFramebufferTextureLayerEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + + void glFramebufferTextureFaceEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, @GLenum int face); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_program_parameters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_program_parameters.java new file mode 100644 index 0000000..a8c870b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_program_parameters.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface EXT_gpu_program_parameters { + + @StripPostfix("params") + void glProgramEnvParameters4fvEXT(@GLenum int target, @GLuint int index, @GLsizei int count, @Check("count << 2") @Const FloatBuffer params); + + @StripPostfix("params") + void glProgramLocalParameters4fvEXT(@GLenum int target, @GLuint int index, @GLsizei int count, @Check("count << 2") @Const FloatBuffer params); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_shader4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_shader4.java new file mode 100644 index 0000000..2b6c359 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_gpu_shader4.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +public interface EXT_gpu_shader4 { + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIivEXT, and + * GetVertexAttribIuivEXT: + */ + int GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT = 0x88FD; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + + int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0; + int GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1; + int GL_SAMPLER_BUFFER_EXT = 0x8DC2; + int GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3; + int GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4; + int GL_SAMPLER_CUBE_SHADOW_EXT = 0x8DC5; + int GL_UNSIGNED_INT_VEC2_EXT = 0x8DC6; + int GL_UNSIGNED_INT_VEC3_EXT = 0x8DC7; + int GL_UNSIGNED_INT_VEC4_EXT = 0x8DC8; + int GL_INT_SAMPLER_1D_EXT = 0x8DC9; + int GL_INT_SAMPLER_2D_EXT = 0x8DCA; + int GL_INT_SAMPLER_3D_EXT = 0x8DCB; + int GL_INT_SAMPLER_CUBE_EXT = 0x8DCC; + int GL_INT_SAMPLER_2D_RECT_EXT = 0x8DCD; + int GL_INT_SAMPLER_1D_ARRAY_EXT = 0x8DCE; + int GL_INT_SAMPLER_2D_ARRAY_EXT = 0x8DCF; + int GL_INT_SAMPLER_BUFFER_EXT = 0x8DD0; + int GL_UNSIGNED_INT_SAMPLER_1D_EXT = 0x8DD1; + int GL_UNSIGNED_INT_SAMPLER_2D_EXT = 0x8DD2; + int GL_UNSIGNED_INT_SAMPLER_3D_EXT = 0x8DD3; + int GL_UNSIGNED_INT_SAMPLER_CUBE_EXT = 0x8DD4; + int GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT = 0x8DD5; + int GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT = 0x8DD6; + int GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT = 0x8DD7; + int GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT = 0x8DD8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MIN_PROGRAM_TEXEL_OFFSET_EXT = 0x8904; + int GL_MAX_PROGRAM_TEXEL_OFFSET_EXT = 0x8905; + + @NoErrorCheck + void glVertexAttribI1iEXT(@GLuint int index, int x); + + @NoErrorCheck + void glVertexAttribI2iEXT(@GLuint int index, int x, int y); + + @NoErrorCheck + void glVertexAttribI3iEXT(@GLuint int index, int x, int y, int z); + + @NoErrorCheck + void glVertexAttribI4iEXT(@GLuint int index, int x, int y, int z, int w); + + @NoErrorCheck + void glVertexAttribI1uiEXT(@GLuint int index, @GLuint int x); + + @NoErrorCheck + void glVertexAttribI2uiEXT(@GLuint int index, @GLuint int x, @GLuint int y); + + @NoErrorCheck + void glVertexAttribI3uiEXT(@GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z); + + @NoErrorCheck + void glVertexAttribI4uiEXT(@GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI1ivEXT(@GLuint int index, @Check("1") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI2ivEXT(@GLuint int index, @Check("2") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI3ivEXT(@GLuint int index, @Check("3") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4ivEXT(@GLuint int index, @Check("4") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI1uivEXT(@GLuint int index, @Check("1") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI2uivEXT(@GLuint int index, @Check("2") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI3uivEXT(@GLuint int index, @Check("3") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4uivEXT(@GLuint int index, @Check("4") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4bvEXT(@GLuint int index, @Check("4") @Const ByteBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4svEXT(@GLuint int index, @Check("4") @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4ubvEXT(@GLuint int index, @Check("4") @Const @GLubyte ByteBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4usvEXT(@GLuint int index, @Check("4") @Const @GLushort ShortBuffer v); + + void glVertexAttribIPointerEXT(@GLuint int index, int size, @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint Buffer buffer); + + @StripPostfix("params") + void glGetVertexAttribIivEXT(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetVertexAttribIuivEXT(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") @GLuint IntBuffer params); + + void glUniform1uiEXT(int location, @GLuint int v0); + + void glUniform2uiEXT(int location, @GLuint int v0, @GLuint int v1); + + void glUniform3uiEXT(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2); + + void glUniform4uiEXT(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2, @GLuint int v3); + + @StripPostfix("value") + void glUniform1uivEXT(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform2uivEXT(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform3uivEXT(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform4uivEXT(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("params") + void glGetUniformuivEXT(@GLuint int program, int location, @OutParameter @Check @GLuint IntBuffer params); + + void glBindFragDataLocationEXT(@GLuint int program, @GLuint int colorNumber, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glBindFragDataLocationEXT") + void glBindFragDataLocationEXT(@GLuint int program, @GLuint int colorNumber, @NullTerminated CharSequence name); + + int glGetFragDataLocationEXT(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetFragDataLocationEXT") + int glGetFragDataLocationEXT(@GLuint int program, @NullTerminated CharSequence name); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_multi_draw_arrays.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_multi_draw_arrays.java new file mode 100644 index 0000000..d79249b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_multi_draw_arrays.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.*; + +public interface EXT_multi_draw_arrays { + void glMultiDrawArraysEXT(@GLenum int mode, IntBuffer piFirst, @Check("piFirst.remaining()") @GLsizei IntBuffer piCount, @AutoSize("piFirst") int primcount); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_depth_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_depth_stencil.java new file mode 100644 index 0000000..0f4f10d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_depth_stencil.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_packed_depth_stencil { + + /** + Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + RenderbufferStorageEXT, and returned in the &lt;data&gt; parameter of + GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + int GL_DEPTH_STENCIL_EXT = 0x84F9; + + /** + Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + TexSubImage3D, and GetTexImage. + */ + int GL_UNSIGNED_INT_24_8_EXT = 0x84FA; + + /** + Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + RenderbufferStorageEXT, and returned in the &lt;data&gt; parameter of + GetTexLevelParameter and GetRenderbufferParameterivEXT. + */ + int GL_DEPTH24_STENCIL8_EXT = 0x88F0; + + /** + Accepted by the &lt;value&gt; parameter of GetTexLevelParameter. + */ + int GL_TEXTURE_STENCIL_SIZE_EXT = 0x88F1; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_float.java new file mode 100644 index 0000000..cdbed84 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_float.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_packed_float { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT: + */ + int GL_R11F_G11F_B10F_EXT = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_RGBA_SIGNED_COMPONENTS_EXT = 0x8C3C; + + /** + * Accepted as a value in the &lt;piAttribIList&gt; and &lt;pfAttribFList&gt; + * parameter arrays of wglChoosePixelFormatARB, and returned in the + * &lt;piValues&gt; parameter array of wglGetPixelFormatAttribivARB, and the + * &lt;pfValues&gt; parameter array of wglGetPixelFormatAttribfvARB: + */ + int WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT = 0x20A8; + + /** + * Accepted as values of the &lt;render_type&gt; arguments in the + * glXCreateNewContext and glXCreateContext functions + */ + int GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT = 0x20B1; + + /** + * Returned by glXGetFBConfigAttrib (when &lt;attribute&gt; is set to + * GLX_RENDER_TYPE) and accepted by the &lt;attrib_list&gt; parameter of + * glXChooseFBConfig (following the GLX_RENDER_TYPE token): + */ + int GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT = 0x00000008; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_pixels.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_pixels.java new file mode 100644 index 0000000..a27c59e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_packed_pixels.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_packed_pixels { + int GL_UNSIGNED_BYTE_3_3_2_EXT = 0x8032; + int GL_UNSIGNED_SHORT_4_4_4_4_EXT = 0x8033; + int GL_UNSIGNED_SHORT_5_5_5_1_EXT = 0x8034; + int GL_UNSIGNED_INT_8_8_8_8_EXT = 0x8035; + int GL_UNSIGNED_INT_10_10_10_2_EXT = 0x8036; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_paletted_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_paletted_texture.java new file mode 100644 index 0000000..74b4a8b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_paletted_texture.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface EXT_paletted_texture { + + /** + * Accepted by the internalformat parameter of TexImage1D, TexImage2D and + * TexImage3DEXT: + */ + int GL_COLOR_INDEX1_EXT = 0x80E2; + int GL_COLOR_INDEX2_EXT = 0x80E3; + int GL_COLOR_INDEX4_EXT = 0x80E4; + int GL_COLOR_INDEX8_EXT = 0x80E5; + int GL_COLOR_INDEX12_EXT = 0x80E6; + int GL_COLOR_INDEX16_EXT = 0x80E7; + + /** + * Accepted by the pname parameter of GetColorTableParameterivEXT and + * GetColorTableParameterfvEXT: + */ + int GL_COLOR_TABLE_FORMAT_EXT = 0x80D8; + int GL_COLOR_TABLE_WIDTH_EXT = 0x80D9; + int GL_COLOR_TABLE_RED_SIZE_EXT = 0x80DA; + int GL_COLOR_TABLE_GREEN_SIZE_EXT = 0x80DB; + int GL_COLOR_TABLE_BLUE_SIZE_EXT = 0x80DC; + int GL_COLOR_TABLE_ALPHA_SIZE_EXT = 0x80DD; + int GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = 0x80DE; + int GL_COLOR_TABLE_INTENSITY_SIZE_EXT = 0x80DF; + + /** + * Accepted by the value parameter of GetTexLevelParameter{if}v: + */ + int GL_TEXTURE_INDEX_SIZE_EXT = 0x80ED; + + void glColorTableEXT(@GLenum int target, @GLenum int internalFormat, @GLsizei int width, @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(data, format, type, width, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + void glColorSubTableEXT(@GLenum int target, @GLsizei int start, @GLsizei int count, @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(data, format, type, count, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + void glGetColorTableEXT(@GLenum int target, @GLenum int format, @GLenum int type, + @OutParameter + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + @StripPostfix("params") + void glGetColorTableParameterivEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetColorTableParameterfvEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_pixel_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_pixel_buffer_object.java new file mode 100644 index 0000000..237b489 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_pixel_buffer_object.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_pixel_buffer_object extends ARB_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv: + */ + int GL_PIXEL_PACK_BUFFER_EXT = 0x88EB; + int GL_PIXEL_UNPACK_BUFFER_EXT = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PIXEL_PACK_BUFFER_BINDING_EXT = 0x88ED; + int GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = 0x88EF; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_point_parameters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_point_parameters.java new file mode 100644 index 0000000..234a2ac --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_point_parameters.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.*; + +public interface EXT_point_parameters { + int GL_POINT_SIZE_MIN_EXT = 0x8126; + int GL_POINT_SIZE_MAX_EXT = 0x8127; + int GL_POINT_FADE_THRESHOLD_SIZE_EXT = 0x8128; + int GL_DISTANCE_ATTENUATION_EXT = 0x8129; + + void glPointParameterfEXT(@GLenum int pname, float param); + + @StripPostfix("pfParams") + void glPointParameterfvEXT(@GLenum int pname, @Check("4") @Const FloatBuffer pfParams); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_provoking_vertex.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_provoking_vertex.java new file mode 100644 index 0000000..5037f55 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_provoking_vertex.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_provoking_vertex { + + /** Accepted by the &lt;mode&gt; parameter of ProvokingVertexEXT: */ + int GL_FIRST_VERTEX_CONVENTION_EXT = 0x8E4D; + int GL_LAST_VERTEX_CONVENTION_EXT = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PROVOKING_VERTEX_EXT = 0x8E4F; + int GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT = 0x8E4C; + + void glProvokingVertexEXT(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_rescale_normal.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_rescale_normal.java new file mode 100644 index 0000000..9d38af3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_rescale_normal.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_rescale_normal { + int GL_RESCALE_NORMAL_EXT = 0x803A; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_secondary_color.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_secondary_color.java new file mode 100644 index 0000000..1d151ef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_secondary_color.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +public interface EXT_secondary_color { + + int GL_COLOR_SUM_EXT = 0x8458; + int GL_CURRENT_SECONDARY_COLOR_EXT = 0x8459; + int GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = 0x845A; + int GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = 0x845B; + int GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = 0x845C; + int GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = 0x845D; + int GL_SECONDARY_COLOR_ARRAY_EXT = 0x845E; + + void glSecondaryColor3bEXT(byte red, byte green, byte blue); + + void glSecondaryColor3fEXT(float red, float green, float blue); + + void glSecondaryColor3dEXT(double red, double green, double blue); + + void glSecondaryColor3ubEXT(@GLubyte byte red, @GLubyte byte green, @GLubyte byte blue); + + void glSecondaryColorPointerEXT(int size, @AutoType("pPointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLfloat + @GLdouble Buffer pPointer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_shader_objects.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_shader_objects.java new file mode 100644 index 0000000..f9a064c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_shader_objects.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.ByteBuffer; + +public interface EXT_separate_shader_objects { + + /** Accepted by &lt;type&gt; parameter to GetIntegerv and GetFloatv: */ + int GL_ACTIVE_PROGRAM_EXT = 0x8B8D; + + void glUseShaderProgramEXT(@GLenum int type, @GLuint int program); + + void glActiveProgramEXT(@GLuint int program); + + @GLuint int glCreateShaderProgramEXT(@GLenum int type, @NullTerminated @Const @GLchar ByteBuffer string); + + @Alternate("glCreateShaderProgramEXT") + @GLuint + int glCreateShaderProgramEXT(@GLenum int type, @NullTerminated CharSequence string); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_specular_color.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_specular_color.java new file mode 100644 index 0000000..e8f160f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_separate_specular_color.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_separate_specular_color { + int GL_SINGLE_COLOR_EXT = 0x81F9; + int GL_SEPARATE_SPECULAR_COLOR_EXT = 0x81FA; + int GL_LIGHT_MODEL_COLOR_CONTROL_EXT = 0x81F8; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shader_image_load_store.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shader_image_load_store.java new file mode 100644 index 0000000..0e13f59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shader_image_load_store.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_shader_image_load_store { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_IMAGE_UNITS_EXT = 0x8F38; + int GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT = 0x8F39; + int GL_MAX_IMAGE_SAMPLES_EXT = 0x906D; + + /** Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: */ + int GL_IMAGE_BINDING_NAME_EXT = 0x8F3A; + int GL_IMAGE_BINDING_LEVEL_EXT = 0x8F3B; + int GL_IMAGE_BINDING_LAYERED_EXT = 0x8F3C; + int GL_IMAGE_BINDING_LAYER_EXT = 0x8F3D; + int GL_IMAGE_BINDING_ACCESS_EXT = 0x8F3E; + int GL_IMAGE_BINDING_FORMAT_EXT = 0x906E; + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrierEXT: */ + int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT = 0x00000001; + int GL_ELEMENT_ARRAY_BARRIER_BIT_EXT = 0x00000002; + int GL_UNIFORM_BARRIER_BIT_EXT = 0x00000004; + int GL_TEXTURE_FETCH_BARRIER_BIT_EXT = 0x00000008; + int GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT = 0x00000020; + int GL_COMMAND_BARRIER_BIT_EXT = 0x00000040; + int GL_PIXEL_BUFFER_BARRIER_BIT_EXT = 0x00000080; + int GL_TEXTURE_UPDATE_BARRIER_BIT_EXT = 0x00000100; + int GL_BUFFER_UPDATE_BARRIER_BIT_EXT = 0x00000200; + int GL_FRAMEBUFFER_BARRIER_BIT_EXT = 0x00000400; + int GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT = 0x00000800; + int GL_ATOMIC_COUNTER_BARRIER_BIT_EXT = 0x00001000; + int GL_ALL_BARRIER_BITS_EXT = 0xFFFFFFFF; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_IMAGE_1D_EXT = 0x904C; + int GL_IMAGE_2D_EXT = 0x904D; + int GL_IMAGE_3D_EXT = 0x904E; + int GL_IMAGE_2D_RECT_EXT = 0x904F; + int GL_IMAGE_CUBE_EXT = 0x9050; + int GL_IMAGE_BUFFER_EXT = 0x9051; + int GL_IMAGE_1D_ARRAY_EXT = 0x9052; + int GL_IMAGE_2D_ARRAY_EXT = 0x9053; + int GL_IMAGE_CUBE_MAP_ARRAY_EXT = 0x9054; + int GL_IMAGE_2D_MULTISAMPLE_EXT = 0x9055; + int GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9056; + int GL_INT_IMAGE_1D_EXT = 0x9057; + int GL_INT_IMAGE_2D_EXT = 0x9058; + int GL_INT_IMAGE_3D_EXT = 0x9059; + int GL_INT_IMAGE_2D_RECT_EXT = 0x905A; + int GL_INT_IMAGE_CUBE_EXT = 0x905B; + int GL_INT_IMAGE_BUFFER_EXT = 0x905C; + int GL_INT_IMAGE_1D_ARRAY_EXT = 0x905D; + int GL_INT_IMAGE_2D_ARRAY_EXT = 0x905E; + int GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x905F; + int GL_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x9060; + int GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x9061; + int GL_UNSIGNED_INT_IMAGE_1D_EXT = 0x9062; + int GL_UNSIGNED_INT_IMAGE_2D_EXT = 0x9063; + int GL_UNSIGNED_INT_IMAGE_3D_EXT = 0x9064; + int GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT = 0x9065; + int GL_UNSIGNED_INT_IMAGE_CUBE_EXT = 0x9066; + int GL_UNSIGNED_INT_IMAGE_BUFFER_EXT = 0x9067; + int GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT = 0x9068; + int GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT = 0x9069; + int GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT = 0x906A; + int GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT = 0x906B; + int GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT = 0x906C; + + void glBindImageTextureEXT(@GLuint int index, @GLuint int texture, int level, boolean layered, int layer, @GLenum int access, int format); + + void glMemoryBarrierEXT(@GLbitfield int barriers); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shadow_funcs.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shadow_funcs.java new file mode 100644 index 0000000..1fd57bb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shadow_funcs.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_shadow_funcs { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shared_texture_palette.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shared_texture_palette.java new file mode 100644 index 0000000..1014d89 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_shared_texture_palette.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_shared_texture_palette { + int GL_SHARED_TEXTURE_PALETTE_EXT = 0x81FB; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_clear_tag.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_clear_tag.java new file mode 100644 index 0000000..2e8c460 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_clear_tag.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_stencil_clear_tag { + + /** + Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev. + */ + int GL_STENCIL_TAG_BITS_EXT = 0x88F2; + int GL_STENCIL_CLEAR_TAG_VALUE_EXT = 0x88F3; + + /** + Controls the stencil clear tag state. stencilTagBits is a count of + the number of most-significant stencil buffer bits involved in the + stencil clear tag update. + */ + void glStencilClearTagEXT(@GLsizei int stencilTagBits, @GLuint int stencilClearTag); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_two_side.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_two_side.java new file mode 100644 index 0000000..f687453 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_two_side.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_stencil_two_side { + int GL_STENCIL_TEST_TWO_SIDE_EXT = 0x8910; + int GL_ACTIVE_STENCIL_FACE_EXT = 0x8911; + + void glActiveStencilFaceEXT(@GLenum int face); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_wrap.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_wrap.java new file mode 100644 index 0000000..6b00c53 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_stencil_wrap.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_stencil_wrap { + int GL_INCR_WRAP_EXT = 0x8507; + int GL_DECR_WRAP_EXT = 0x8508; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_3d.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_3d.java new file mode 100644 index 0000000..a5397be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_3d.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_3d { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_array.java new file mode 100644 index 0000000..16912e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_array.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_texture_array { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + int GL_TEXTURE_1D_ARRAY_EXT = 0x8C18; + int GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + int GL_PROXY_TEXTURE_2D_ARRAY_EXT = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + int GL_PROXY_TEXTURE_1D_ARRAY_EXT = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + int GL_TEXTURE_BINDING_1D_ARRAY_EXT = 0x8C1C; + int GL_TEXTURE_BINDING_2D_ARRAY_EXT = 0x8C1D; + int GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = 0x88FF; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_ARB: + */ + int GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT = 0x884E; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0; + int GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1; + int GL_SAMPLER_1D_ARRAY_SHADOW_EXT = 0x8DC3; + int GL_SAMPLER_2D_ARRAY_SHADOW_EXT = 0x8DC4; + + @Reuse("EXTGeometryShader4") + void glFramebufferTextureLayerEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_buffer_object.java new file mode 100644 index 0000000..0f21dae --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_buffer_object.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_texture_buffer_object { + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, BindTexture, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, GetBufferPointerv, and TexBufferEXT, and + * the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + int GL_TEXTURE_BUFFER_EXT = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + int GL_MAX_TEXTURE_BUFFER_SIZE_EXT = 0x8C2B; + int GL_TEXTURE_BINDING_BUFFER_EXT = 0x8C2C; + int GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT = 0x8C2D; + int GL_TEXTURE_BUFFER_FORMAT_EXT = 0x8C2E; + + void glTexBufferEXT(@GLenum int target, @GLenum int internalformat, @GLuint int buffer); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_latc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_latc.java new file mode 100644 index 0000000..927024f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_latc.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionLATC") +public interface EXT_texture_compression_latc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_LUMINANCE_LATC1_EXT = 0x8C70; + int GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = 0x8C71; + int GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C72; + int GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C73; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_rgtc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_rgtc.java new file mode 100644 index 0000000..1517a6c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_rgtc.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionRGTC") +public interface EXT_texture_compression_rgtc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_RED_RGTC1_EXT = 0x8DBB; + int GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC; + int GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD; + int GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_s3tc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_s3tc.java new file mode 100644 index 0000000..d867701 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_compression_s3tc.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionS3TC") +public interface EXT_texture_compression_s3tc { + int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0; + int GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; + int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2; + int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_combine.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_combine.java new file mode 100644 index 0000000..0d3bce1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_combine.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_env_combine { + int GL_COMBINE_EXT = 0x8570; + int GL_COMBINE_RGB_EXT = 0x8571; + int GL_COMBINE_ALPHA_EXT = 0x8572; + int GL_SOURCE0_RGB_EXT = 0x8580; + int GL_SOURCE1_RGB_EXT = 0x8581; + int GL_SOURCE2_RGB_EXT = 0x8582; + int GL_SOURCE0_ALPHA_EXT = 0x8588; + int GL_SOURCE1_ALPHA_EXT = 0x8589; + int GL_SOURCE2_ALPHA_EXT = 0x858A; + int GL_OPERAND0_RGB_EXT = 0x8590; + int GL_OPERAND1_RGB_EXT = 0x8591; + int GL_OPERAND2_RGB_EXT = 0x8592; + int GL_OPERAND0_ALPHA_EXT = 0x8598; + int GL_OPERAND1_ALPHA_EXT = 0x8599; + int GL_OPERAND2_ALPHA_EXT = 0x859A; + int GL_RGB_SCALE_EXT = 0x8573; + int GL_ADD_SIGNED_EXT = 0x8574; + int GL_INTERPOLATE_EXT = 0x8575; + int GL_CONSTANT_EXT = 0x8576; + int GL_PRIMARY_COLOR_EXT = 0x8577; + int GL_PREVIOUS_EXT = 0x8578; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_dot3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_dot3.java new file mode 100644 index 0000000..4346fd8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_env_dot3.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_env_dot3 { + int GL_DOT3_RGB_EXT = 0x8740; + int GL_DOT3_RGBA_EXT = 0x8741; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_filter_anisotropic.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_filter_anisotropic.java new file mode 100644 index 0000000..f369dd9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_filter_anisotropic.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_filter_anisotropic { + int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; + int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_integer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_integer.java new file mode 100644 index 0000000..6103808 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_integer.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface EXT_texture_integer { + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_RGBA_INTEGER_MODE_EXT = 0x8D9E; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA32UI_EXT = 0x8D70; + int GL_RGB32UI_EXT = 0x8D71; + int GL_ALPHA32UI_EXT = 0x8D72; + int GL_INTENSITY32UI_EXT = 0x8D73; + int GL_LUMINANCE32UI_EXT = 0x8D74; + int GL_LUMINANCE_ALPHA32UI_EXT = 0x8D75; + + int GL_RGBA16UI_EXT = 0x8D76; + int GL_RGB16UI_EXT = 0x8D77; + int GL_ALPHA16UI_EXT = 0x8D78; + int GL_INTENSITY16UI_EXT = 0x8D79; + int GL_LUMINANCE16UI_EXT = 0x8D7A; + int GL_LUMINANCE_ALPHA16UI_EXT = 0x8D7B; + + int GL_RGBA8UI_EXT = 0x8D7C; + int GL_RGB8UI_EXT = 0x8D7D; + int GL_ALPHA8UI_EXT = 0x8D7E; + int GL_INTENSITY8UI_EXT = 0x8D7F; + int GL_LUMINANCE8UI_EXT = 0x8D80; + int GL_LUMINANCE_ALPHA8UI_EXT = 0x8D81; + + int GL_RGBA32I_EXT = 0x8D82; + int GL_RGB32I_EXT = 0x8D83; + int GL_ALPHA32I_EXT = 0x8D84; + int GL_INTENSITY32I_EXT = 0x8D85; + int GL_LUMINANCE32I_EXT = 0x8D86; + int GL_LUMINANCE_ALPHA32I_EXT = 0x8D87; + + int GL_RGBA16I_EXT = 0x8D88; + int GL_RGB16I_EXT = 0x8D89; + int GL_ALPHA16I_EXT = 0x8D8A; + int GL_INTENSITY16I_EXT = 0x8D8B; + int GL_LUMINANCE16I_EXT = 0x8D8C; + int GL_LUMINANCE_ALPHA16I_EXT = 0x8D8D; + + int GL_RGBA8I_EXT = 0x8D8E; + int GL_RGB8I_EXT = 0x8D8F; + int GL_ALPHA8I_EXT = 0x8D90; + int GL_INTENSITY8I_EXT = 0x8D91; + int GL_LUMINANCE8I_EXT = 0x8D92; + int GL_LUMINANCE_ALPHA8I_EXT = 0x8D93; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + int GL_RED_INTEGER_EXT = 0x8D94; + int GL_GREEN_INTEGER_EXT = 0x8D95; + int GL_BLUE_INTEGER_EXT = 0x8D96; + int GL_ALPHA_INTEGER_EXT = 0x8D97; + int GL_RGB_INTEGER_EXT = 0x8D98; + int GL_RGBA_INTEGER_EXT = 0x8D99; + int GL_BGR_INTEGER_EXT = 0x8D9A; + int GL_BGRA_INTEGER_EXT = 0x8D9B; + int GL_LUMINANCE_INTEGER_EXT = 0x8D9C; + int GL_LUMINANCE_ALPHA_INTEGER_EXT = 0x8D9D; + + void glClearColorIiEXT(int r, int g, int b, int a); + + void glClearColorIuiEXT(@GLuint int r, @GLuint int g, @GLuint int b, @GLuint int a); + + @StripPostfix("params") + void glTexParameterIivEXT(@GLenum int target, @GLenum int pname, @Check("4") IntBuffer params); + + @Alternate("glTexParameterIivEXT") + @StripPostfix(value = "param", postfix = "v") + void glTexParameterIivEXT(@GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @StripPostfix("params") + void glTexParameterIuivEXT(@GLenum int target, @GLenum int pname, @Check("4") @GLuint IntBuffer params); + + @Alternate("glTexParameterIuivEXT") + @StripPostfix(value = "param", postfix = "v") + void glTexParameterIuivEXT(@GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @StripPostfix("params") + void glGetTexParameterIivEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexParameterIivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterIivEXT2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetTexParameterIuivEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") @GLuint IntBuffer params); + + @Alternate("glGetTexParameterIuivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterIuivEXT2(@GLenum int target, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_lod_bias.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_lod_bias.java new file mode 100644 index 0000000..d17ed9c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_lod_bias.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureLODBias") +public interface EXT_texture_lod_bias { + + /** + * Accepted by the &lt;target&gt; parameters of GetTexEnvfv, GetTexEnviv, + * TexEnvi, TexEnvf, Texenviv, and TexEnvfv: + */ + int GL_TEXTURE_FILTER_CONTROL_EXT = 0x8500; + + /** + * When the &lt;target&gt; parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, + * TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL_EXT, then + * the value of &lt;pname&gt; may be: + */ + int GL_TEXTURE_LOD_BIAS_EXT = 0x8501; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_TEXTURE_LOD_BIAS_EXT = 0x84FD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_mirror_clamp.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_mirror_clamp.java new file mode 100644 index 0000000..33983a0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_mirror_clamp.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_mirror_clamp { + + /** + * Accepted by the &lt;param&gt; parameter of TexParameteri and TexParameterf, + * and by the &lt;params&gt; parameter of TexParameteriv and TexParameterfv, + * when their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, + * or TEXTURE_WRAP_R: + */ + int GL_MIRROR_CLAMP_EXT = 0x8742; + int GL_MIRROR_CLAMP_TO_EDGE_EXT = 0x8743; + int GL_MIRROR_CLAMP_TO_BORDER_EXT = 0x8912; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_rectangle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_rectangle.java new file mode 100644 index 0000000..caa73fe --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_rectangle.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_rectangle { + int GL_TEXTURE_RECTANGLE_EXT = 0x84F5; + int GL_TEXTURE_BINDING_RECTANGLE_EXT = 0x84F6; + int GL_PROXY_TEXTURE_RECTANGLE_EXT = 0x84F7; + int GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT = 0x84F8; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB.java new file mode 100644 index 0000000..e03d496 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_sRGB { + + /** + Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + TexImage3D, CopyTexImage1D, CopyTexImage2D. + */ + int GL_SRGB_EXT = 0x8C40; + int GL_SRGB8_EXT = 0x8C41; + int GL_SRGB_ALPHA_EXT = 0x8C42; + int GL_SRGB8_ALPHA8_EXT = 0x8C43; + int GL_SLUMINANCE_ALPHA_EXT = 0x8C44; + int GL_SLUMINANCE8_ALPHA8_EXT = 0x8C45; + int GL_SLUMINANCE_EXT = 0x8C46; + int GL_SLUMINANCE8_EXT = 0x8C47; + int GL_COMPRESSED_SRGB_EXT = 0x8C48; + int GL_COMPRESSED_SRGB_ALPHA_EXT = 0x8C49; + int GL_COMPRESSED_SLUMINANCE_EXT = 0x8C4A; + int GL_COMPRESSED_SLUMINANCE_ALPHA_EXT = 0x8C4B; + + /** + Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + CopyTexImage2D, and CompressedTexImage2DARB and the &lt;format&gt; parameter + of CompressedTexSubImage2DARB. + */ + int GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C; + int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D; + int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E; + int GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB_decode.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB_decode.java new file mode 100644 index 0000000..b843e30 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_sRGB_decode.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_sRGB_decode { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * GetTexParameterfv, GetTexParameteriv, SamplerParameteri, + * SamplerParameterf, SamplerParameteriv, SamplerParameterfv, + * SamplerParameterIiv, SamplerParameterIuiv, GetSamplerParameteriv, + * GetSamplerParameterfv, GetSamplerParameterIiv, and GetSamplerParameterIuiv: + */ + int GL_TEXTURE_SRGB_DECODE_EXT = 0x8A48; + + /** + * Accepted by the &lt;enum&gt; parameter of TexParameterf, TexParameteri, + * SamplerParameteri, SamplerParameterf, SamplerParameteriv, SamplerParameterfv, + * SamplerParameterIiv and SamplerParameterIuiv: + */ + int GL_DECODE_EXT = 0x8A49, + GL_SKIP_DECODE_EXT = 0x8A4A; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_shared_exponent.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_shared_exponent.java new file mode 100644 index 0000000..6d660d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_shared_exponent.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_shared_exponent { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorageEXT: + */ + int GL_RGB9_E5_EXT = 0x8C3D; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + int GL_UNSIGNED_INT_5_9_9_9_REV_EXT = 0x8C3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + int GL_TEXTURE_SHARED_SIZE_EXT = 0x8C3F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_snorm.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_snorm.java new file mode 100644 index 0000000..7782cc0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_snorm.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_snorm { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RED_SNORM = 0x8F90; + int GL_RG_SNORM = 0x8F91; + int GL_RGB_SNORM = 0x8F92; + int GL_RGBA_SNORM = 0x8F93; + int GL_ALPHA_SNORM = 0x9010; + int GL_LUMINANCE_SNORM = 0x9011; + int GL_LUMINANCE_ALPHA_SNORM = 0x9012; + int GL_INTENSITY_SNORM = 0x9013; + + int GL_R8_SNORM = 0x8F94; + int GL_RG8_SNORM = 0x8F95; + int GL_RGB8_SNORM = 0x8F96; + int GL_RGBA8_SNORM = 0x8F97; + int GL_ALPHA8_SNORM = 0x9014; + int GL_LUMINANCE8_SNORM = 0x9015; + int GL_LUMINANCE8_ALPHA8_SNORM = 0x9016; + int GL_INTENSITY8_SNORM = 0x9017; + + int GL_R16_SNORM = 0x8F98; + int GL_RG16_SNORM = 0x8F99; + int GL_RGB16_SNORM = 0x8F9A; + int GL_RGBA16_SNORM = 0x8F9B; + int GL_ALPHA16_SNORM = 0x9018; + int GL_LUMINANCE16_SNORM = 0x9019; + int GL_LUMINANCE16_ALPHA16_SNORM = 0x901A; + int GL_INTENSITY16_SNORM = 0x901B; + + /** Returned by GetTexLevelParmeter */ + int GL_SIGNED_NORMALIZED = 0x8F9C; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_swizzle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_swizzle.java new file mode 100644 index 0000000..48939b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_texture_swizzle.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_texture_swizzle { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_R_EXT = 0x8E42; + int GL_TEXTURE_SWIZZLE_G_EXT = 0x8E43; + int GL_TEXTURE_SWIZZLE_B_EXT = 0x8E44; + int GL_TEXTURE_SWIZZLE_A_EXT = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_RGBA_EXT = 0x8E46; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_timer_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_timer_query.java new file mode 100644 index 0000000..897aeeb --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_timer_query.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface EXT_timer_query { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_TIME_ELAPSED_EXT = 0x88BF; + + @StripPostfix("params") + void glGetQueryObjecti64vEXT(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLint64EXT LongBuffer params); + + @Alternate("glGetQueryObjecti64vEXT") + @GLreturn("params") + @StripPostfix("params") + void glGetQueryObjecti64vEXT2(@GLuint int id, @GLenum int pname, @OutParameter @GLint64EXT LongBuffer params); + + @StripPostfix("params") + void glGetQueryObjectui64vEXT(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + @Alternate("glGetQueryObjectui64vEXT") + @GLreturn("params") + @StripPostfix("params") + void glGetQueryObjectui64vEXT2(@GLuint int id, @GLenum int pname, @OutParameter @GLuint64EXT LongBuffer params); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_transform_feedback.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_transform_feedback.java new file mode 100644 index 0000000..fd766da --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_transform_feedback.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface EXT_transform_feedback { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRangeEXT, BindBufferOffsetEXT and + * BindBufferBaseEXT: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_EXT = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT = 0x8C84; + int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT = 0x8C85; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT = 0x8C8F; + + /** Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackVaryingsEXT: */ + int GL_INTERLEAVED_ATTRIBS_EXT = 0x8C8C; + int GL_SEPARATE_ATTRIBS_EXT = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_PRIMITIVES_GENERATED_EXT = 0x8C87; + int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_RASTERIZER_DISCARD_EXT = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT = 0x8C8A; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT = 0x8C8B; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT = 0x8C80; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_TRANSFORM_FEEDBACK_VARYINGS_EXT = 0x8C83; + int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT = 0x8C7F; + int GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT = 0x8C76; + + void glBindBufferRangeEXT(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset, @GLsizeiptr long size); + + void glBindBufferOffsetEXT(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset); + + void glBindBufferBaseEXT(@GLenum int target, @GLuint int index, @GLuint int buffer); + + void glBeginTransformFeedbackEXT(@GLenum int primitiveMode); + + void glEndTransformFeedbackEXT(); + + void glTransformFeedbackVaryingsEXT(@GLuint int program, @GLsizei int count, + @Const @NullTerminated("count") @GLchar @PointerArray("count") ByteBuffer varyings, + @GLenum int bufferMode); + + @Alternate("glTransformFeedbackVaryingsEXT") + void glTransformFeedbackVaryingsEXT(@GLuint int program, @Constant("varyings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray("count") CharSequence[] varyings, + @GLenum int bufferMode); + + void glGetTransformFeedbackVaryingEXT(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetTransformFeedbackVaryingEXT") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetTransformFeedbackVaryingEXT2(@GLuint int program, @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_array_bgra.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_array_bgra.java new file mode 100644 index 0000000..3e96161 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_array_bgra.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface EXT_vertex_array_bgra { + + /** + * Accepted by the &lt;size&gt; parameter of ColorPointer, + * SecondaryColorPointer, and VertexAttribPointer: + */ + int GL_BGRA = 0x80E1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_attrib_64bit.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_attrib_64bit.java new file mode 100644 index 0000000..8e5c075 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_attrib_64bit.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.DoubleBuffer; + +@Dependent +public interface EXT_vertex_attrib_64bit { + + /** Returned in the &lt;type&gt; parameter of GetActiveAttrib: */ + int GL_DOUBLE_VEC2_EXT = 0x8FFC; + int GL_DOUBLE_VEC3_EXT = 0x8FFD; + int GL_DOUBLE_VEC4_EXT = 0x8FFE; + int GL_DOUBLE_MAT2_EXT = 0x8F46; + int GL_DOUBLE_MAT3_EXT = 0x8F47; + int GL_DOUBLE_MAT4_EXT = 0x8F48; + int GL_DOUBLE_MAT2x3_EXT = 0x8F49; + int GL_DOUBLE_MAT2x4_EXT = 0x8F4A; + int GL_DOUBLE_MAT3x2_EXT = 0x8F4B; + int GL_DOUBLE_MAT3x4_EXT = 0x8F4C; + int GL_DOUBLE_MAT4x2_EXT = 0x8F4D; + int GL_DOUBLE_MAT4x3_EXT = 0x8F4E; + + void glVertexAttribL1dEXT(@GLuint int index, double x); + + void glVertexAttribL2dEXT(@GLuint int index, double x, double y); + + void glVertexAttribL3dEXT(@GLuint int index, double x, double y, double z); + + void glVertexAttribL4dEXT(@GLuint int index, double x, double y, double z, double w); + + @StripPostfix("v") + void glVertexAttribL1dvEXT(@GLuint int index, @Const @Check("1") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL2dvEXT(@GLuint int index, @Const @Check("2") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL3dvEXT(@GLuint int index, @Const @Check("3") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL4dvEXT(@GLuint int index, @Const @Check("4") DoubleBuffer v); + + void glVertexAttribLPointerEXT(@GLuint int index, int size, @Constant("GL11.GL_DOUBLE") @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check @Const @GLdouble Buffer pointer); + + @StripPostfix("params") + void glGetVertexAttribLdvEXT(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @Reuse("ARBVertexAttrib64bit") + @Dependent("GL_EXT_direct_state_access") + void glVertexArrayVertexAttribLOffsetEXT(@GLuint int vaobj, @GLuint int buffer, @GLuint int index, int size, @GLenum int type, @GLsizei int stride, @GLintptr long offset); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_shader.java new file mode 100644 index 0000000..9834ad8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_shader.java @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface EXT_vertex_shader { + int GL_VERTEX_SHADER_EXT = 0x8780; + int GL_VERTEX_SHADER_BINDING_EXT = 0x8781; + int GL_OP_INDEX_EXT = 0x8782; + int GL_OP_NEGATE_EXT = 0x8783; + int GL_OP_DOT3_EXT = 0x8784; + int GL_OP_DOT4_EXT = 0x8785; + int GL_OP_MUL_EXT = 0x8786; + int GL_OP_ADD_EXT = 0x8787; + int GL_OP_MADD_EXT = 0x8788; + int GL_OP_FRAC_EXT = 0x8789; + int GL_OP_MAX_EXT = 0x878A; + int GL_OP_MIN_EXT = 0x878B; + int GL_OP_SET_GE_EXT = 0x878C; + int GL_OP_SET_LT_EXT = 0x878D; + int GL_OP_CLAMP_EXT = 0x878E; + int GL_OP_FLOOR_EXT = 0x878F; + int GL_OP_ROUND_EXT = 0x8790; + int GL_OP_EXP_BASE_2_EXT = 0x8791; + int GL_OP_LOG_BASE_2_EXT = 0x8792; + int GL_OP_POWER_EXT = 0x8793; + int GL_OP_RECIP_EXT = 0x8794; + int GL_OP_RECIP_SQRT_EXT = 0x8795; + int GL_OP_SUB_EXT = 0x8796; + int GL_OP_CROSS_PRODUCT_EXT = 0x8797; + int GL_OP_MULTIPLY_MATRIX_EXT = 0x8798; + int GL_OP_MOV_EXT = 0x8799; + int GL_OUTPUT_VERTEX_EXT = 0x879A; + int GL_OUTPUT_COLOR0_EXT = 0x879B; + int GL_OUTPUT_COLOR1_EXT = 0x879C; + int GL_OUTPUT_TEXTURE_COORD0_EXT = 0x879D; + int GL_OUTPUT_TEXTURE_COORD1_EXT = 0x879E; + int GL_OUTPUT_TEXTURE_COORD2_EXT = 0x879F; + int GL_OUTPUT_TEXTURE_COORD3_EXT = 0x87A0; + int GL_OUTPUT_TEXTURE_COORD4_EXT = 0x87A1; + int GL_OUTPUT_TEXTURE_COORD5_EXT = 0x87A2; + int GL_OUTPUT_TEXTURE_COORD6_EXT = 0x87A3; + int GL_OUTPUT_TEXTURE_COORD7_EXT = 0x87A4; + int GL_OUTPUT_TEXTURE_COORD8_EXT = 0x87A5; + int GL_OUTPUT_TEXTURE_COORD9_EXT = 0x87A6; + int GL_OUTPUT_TEXTURE_COORD10_EXT = 0x87A7; + int GL_OUTPUT_TEXTURE_COORD11_EXT = 0x87A8; + int GL_OUTPUT_TEXTURE_COORD12_EXT = 0x87A9; + int GL_OUTPUT_TEXTURE_COORD13_EXT = 0x87AA; + int GL_OUTPUT_TEXTURE_COORD14_EXT = 0x87AB; + int GL_OUTPUT_TEXTURE_COORD15_EXT = 0x87AC; + int GL_OUTPUT_TEXTURE_COORD16_EXT = 0x87AD; + int GL_OUTPUT_TEXTURE_COORD17_EXT = 0x87AE; + int GL_OUTPUT_TEXTURE_COORD18_EXT = 0x87AF; + int GL_OUTPUT_TEXTURE_COORD19_EXT = 0x87B0; + int GL_OUTPUT_TEXTURE_COORD20_EXT = 0x87B1; + int GL_OUTPUT_TEXTURE_COORD21_EXT = 0x87B2; + int GL_OUTPUT_TEXTURE_COORD22_EXT = 0x87B3; + int GL_OUTPUT_TEXTURE_COORD23_EXT = 0x87B4; + int GL_OUTPUT_TEXTURE_COORD24_EXT = 0x87B5; + int GL_OUTPUT_TEXTURE_COORD25_EXT = 0x87B6; + int GL_OUTPUT_TEXTURE_COORD26_EXT = 0x87B7; + int GL_OUTPUT_TEXTURE_COORD27_EXT = 0x87B8; + int GL_OUTPUT_TEXTURE_COORD28_EXT = 0x87B9; + int GL_OUTPUT_TEXTURE_COORD29_EXT = 0x87BA; + int GL_OUTPUT_TEXTURE_COORD30_EXT = 0x87BB; + int GL_OUTPUT_TEXTURE_COORD31_EXT = 0x87BC; + int GL_OUTPUT_FOG_EXT = 0x87BD; + int GL_SCALAR_EXT = 0x87BE; + int GL_VECTOR_EXT = 0x87BF; + int GL_MATRIX_EXT = 0x87C0; + int GL_VARIANT_EXT = 0x87C1; + int GL_INVARIANT_EXT = 0x87C2; + int GL_LOCAL_CONSTANT_EXT = 0x87C3; + int GL_LOCAL_EXT = 0x87C4; + int GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87C5; + int GL_MAX_VERTEX_SHADER_VARIANTS_EXT = 0x87C6; + int GL_MAX_VERTEX_SHADER_INVARIANTS_EXT = 0x87C7; + int GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87C8; + int GL_MAX_VERTEX_SHADER_LOCALS_EXT = 0x87C9; + int GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87CA; + int GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT = 0x87CB; + int GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT = 0x87CC; + int GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87CD; + int GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT = 0x87CE; + int GL_VERTEX_SHADER_INSTRUCTIONS_EXT = 0x87CF; + int GL_VERTEX_SHADER_VARIANTS_EXT = 0x87D0; + int GL_VERTEX_SHADER_INVARIANTS_EXT = 0x87D1; + int GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = 0x87D2; + int GL_VERTEX_SHADER_LOCALS_EXT = 0x87D3; + int GL_VERTEX_SHADER_OPTIMIZED_EXT = 0x87D4; + int GL_X_EXT = 0x87D5; + int GL_Y_EXT = 0x87D6; + int GL_Z_EXT = 0x87D7; + int GL_W_EXT = 0x87D8; + int GL_NEGATIVE_X_EXT = 0x87D9; + int GL_NEGATIVE_Y_EXT = 0x87DA; + int GL_NEGATIVE_Z_EXT = 0x87DB; + int GL_NEGATIVE_W_EXT = 0x87DC; + int GL_ZERO_EXT = 0x87DD; + int GL_ONE_EXT = 0x87DE; + int GL_NEGATIVE_ONE_EXT = 0x87DF; + int GL_NORMALIZED_RANGE_EXT = 0x87E0; + int GL_FULL_RANGE_EXT = 0x87E1; + int GL_CURRENT_VERTEX_EXT = 0x87E2; + int GL_MVP_MATRIX_EXT = 0x87E3; + int GL_VARIANT_VALUE_EXT = 0x87E4; + int GL_VARIANT_DATATYPE_EXT = 0x87E5; + int GL_VARIANT_ARRAY_STRIDE_EXT = 0x87E6; + int GL_VARIANT_ARRAY_TYPE_EXT = 0x87E7; + int GL_VARIANT_ARRAY_EXT = 0x87E8; + int GL_VARIANT_ARRAY_POINTER_EXT = 0x87E9; + int GL_INVARIANT_VALUE_EXT = 0x87EA; + int GL_INVARIANT_DATATYPE_EXT = 0x87EB; + int GL_LOCAL_CONSTANT_VALUE_EXT = 0x87EC; + int GL_LOCAL_CONSTANT_DATATYPE_EXT = 0x87ED; + + void glBeginVertexShaderEXT(); + + void glEndVertexShaderEXT(); + + void glBindVertexShaderEXT(@GLuint int id); + + @GLuint + int glGenVertexShadersEXT(@GLuint int range); + + void glDeleteVertexShaderEXT(@GLuint int id); + + void glShaderOp1EXT(@GLenum int op, @GLuint int res, @GLuint int arg1); + + void glShaderOp2EXT(@GLenum int op, @GLuint int res, @GLuint int arg1, @GLuint int arg2); + + void glShaderOp3EXT(@GLenum int op, @GLuint int res, @GLuint int arg1, @GLuint int arg2, @GLuint int arg3); + + void glSwizzleEXT(@GLuint int res, @GLuint int in, @GLenum int outX, @GLenum int outY, @GLenum int outZ, @GLenum int outW); + + void glWriteMaskEXT(@GLuint int res, @GLuint int in, @GLenum int outX, @GLenum int outY, @GLenum int outZ, @GLenum int outW); + + void glInsertComponentEXT(@GLuint int res, @GLuint int src, @GLuint int num); + + void glExtractComponentEXT(@GLuint int res, @GLuint int src, @GLuint int num); + + @GLuint + int glGenSymbolsEXT(@GLenum int dataType, @GLenum int storageType, @GLenum int range, @GLuint int components); + + void glSetInvariantEXT(@GLuint int id, @AutoType("pAddr") @GLenum int type, + @Check("4") + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer pAddr); + + void glSetLocalConstantEXT(@GLuint int id, @AutoType("pAddr") @GLenum int type, + @Check("4") + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer pAddr); + + @StripPostfix("pAddr") + void glVariantbvEXT(@GLuint int id, @Check("4") @Const ByteBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantsvEXT(@GLuint int id, @Check("4") @Const ShortBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantivEXT(@GLuint int id, @Check("4") @Const IntBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantfvEXT(@GLuint int id, @Check("4") @Const FloatBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantdvEXT(@GLuint int id, @Check("4") @Const DoubleBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantubvEXT(@GLuint int id, @Check("4") @Const @GLubyte ByteBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantusvEXT(@GLuint int id, @Check("4") @Const @GLushort ShortBuffer pAddr); + + @StripPostfix("pAddr") + void glVariantuivEXT(@GLuint int id, @Check("4") @Const @GLuint IntBuffer pAddr); + + void glVariantPointerEXT(@GLuint int id, @AutoType("pAddr") @GLenum int type, @GLuint int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLubyte + @GLushort + @GLuint + @GLfloat + @GLdouble Buffer pAddr); + + void glEnableVariantClientStateEXT(@GLuint int id); + + void glDisableVariantClientStateEXT(@GLuint int id); + + @GLuint + int glBindLightParameterEXT(@GLenum int light, @GLenum int value); + + @GLuint + int glBindMaterialParameterEXT(@GLenum int face, @GLenum int value); + + @GLuint + int glBindTexGenParameterEXT(@GLenum int unit, @GLenum int coord, @GLenum int value); + + @GLuint + int glBindTextureUnitParameterEXT(@GLenum int unit, @GLenum int value); + + @GLuint + int glBindParameterEXT(@GLenum int value); + + boolean glIsVariantEnabledEXT(@GLuint int id, @GLenum int cap); + + @StripPostfix("pbData") + void glGetVariantBooleanvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") ByteBuffer pbData); + + @StripPostfix("pbData") + void glGetVariantIntegervEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") IntBuffer pbData); + + @StripPostfix("pbData") + void glGetVariantFloatvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") FloatBuffer pbData); + + @StripPostfix("pbData") + void glGetVariantPointervEXT(@GLuint int id, @GLenum int value, @OutParameter @Result @GLvoid ByteBuffer pbData); + + @StripPostfix("pbData") + void glGetInvariantBooleanvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") ByteBuffer pbData); + + @StripPostfix("pbData") + void glGetInvariantIntegervEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") IntBuffer pbData); + + @StripPostfix("pbData") + void glGetInvariantFloatvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") FloatBuffer pbData); + + @StripPostfix("pbData") + void glGetLocalConstantBooleanvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") ByteBuffer pbData); + + @StripPostfix("pbData") + void glGetLocalConstantIntegervEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") IntBuffer pbData); + + @StripPostfix("pbData") + void glGetLocalConstantFloatvEXT(@GLuint int id, @GLenum int value, @OutParameter @Check("4") FloatBuffer pbData); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_weighting.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_weighting.java new file mode 100644 index 0000000..3c523ea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/EXT_vertex_weighting.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLfloat; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.*; + +public interface EXT_vertex_weighting { + int GL_MODELVIEW0_STACK_DEPTH_EXT = 0x0BA3; + int GL_MODELVIEW1_STACK_DEPTH_EXT = 0x8502; + int GL_MODELVIEW0_MATRIX_EXT = 0x0BA6; + int GL_MODELVIEW1_MATRIX_EXT = 0x8506; + int GL_VERTEX_WEIGHTING_EXT = 0x8509; + int GL_MODELVIEW0_EXT = 0x1700; + int GL_MODELVIEW1_EXT = 0x850A; + int GL_CURRENT_VERTEX_WEIGHT_EXT = 0x850B; + int GL_VERTEX_WEIGHT_ARRAY_EXT = 0x850C; + int GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT = 0x850D; + int GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT = 0x850E; + int GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT = 0x850F; + int GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT = 0x8510; + + @NoErrorCheck + void glVertexWeightfEXT(float weight); + + void glVertexWeightPointerEXT(@GLsizei int size, @AutoType("pPointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLfloat Buffer pPointer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL11.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL11.java new file mode 100644 index 0000000..f82ce64 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL11.java @@ -0,0 +1,1651 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +/** + * The core OpenGL1.1 API. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +@DeprecatedGL +public interface GL11 { + /* AccumOp */ + int GL_ACCUM = 0x0100; + int GL_LOAD = 0x0101; + int GL_RETURN = 0x0102; + int GL_MULT = 0x0103; + int GL_ADD = 0x0104; + + /* AlphaFunction */ + int GL_NEVER = 0x0200; + int GL_LESS = 0x0201; + int GL_EQUAL = 0x0202; + int GL_LEQUAL = 0x0203; + int GL_GREATER = 0x0204; + int GL_NOTEQUAL = 0x0205; + int GL_GEQUAL = 0x0206; + int GL_ALWAYS = 0x0207; + + /* AttribMask */ + int GL_CURRENT_BIT = 0x00000001; + int GL_POINT_BIT = 0x00000002; + int GL_LINE_BIT = 0x00000004; + int GL_POLYGON_BIT = 0x00000008; + int GL_POLYGON_STIPPLE_BIT = 0x00000010; + int GL_PIXEL_MODE_BIT = 0x00000020; + int GL_LIGHTING_BIT = 0x00000040; + int GL_FOG_BIT = 0x00000080; + int GL_DEPTH_BUFFER_BIT = 0x00000100; + int GL_ACCUM_BUFFER_BIT = 0x00000200; + int GL_STENCIL_BUFFER_BIT = 0x00000400; + int GL_VIEWPORT_BIT = 0x00000800; + int GL_TRANSFORM_BIT = 0x00001000; + int GL_ENABLE_BIT = 0x00002000; + int GL_COLOR_BUFFER_BIT = 0x00004000; + int GL_HINT_BIT = 0x00008000; + int GL_EVAL_BIT = 0x00010000; + int GL_LIST_BIT = 0x00020000; + int GL_TEXTURE_BIT = 0x00040000; + int GL_SCISSOR_BIT = 0x00080000; + int GL_ALL_ATTRIB_BITS = 0x000fffff; + + /* BeginMode */ + int GL_POINTS = 0x0000; + int GL_LINES = 0x0001; + int GL_LINE_LOOP = 0x0002; + int GL_LINE_STRIP = 0x0003; + int GL_TRIANGLES = 0x0004; + int GL_TRIANGLE_STRIP = 0x0005; + int GL_TRIANGLE_FAN = 0x0006; + int GL_QUADS = 0x0007; + int GL_QUAD_STRIP = 0x0008; + int GL_POLYGON = 0x0009; + + /* BlendingFactorDest */ + int GL_ZERO = 0; + int GL_ONE = 1; + int GL_SRC_COLOR = 0x0300; + int GL_ONE_MINUS_SRC_COLOR = 0x0301; + int GL_SRC_ALPHA = 0x0302; + int GL_ONE_MINUS_SRC_ALPHA = 0x0303; + int GL_DST_ALPHA = 0x0304; + int GL_ONE_MINUS_DST_ALPHA = 0x0305; + + /* BlendingFactorSrc */ + /* GL_ZERO */ + /* GL_ONE */ + int GL_DST_COLOR = 0x0306; + int GL_ONE_MINUS_DST_COLOR = 0x0307; + int GL_SRC_ALPHA_SATURATE = 0x0308; + int GL_CONSTANT_COLOR = 0x8001; + int GL_ONE_MINUS_CONSTANT_COLOR = 0x8002; + int GL_CONSTANT_ALPHA = 0x8003; + int GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004; + + /* Boolean */ + int GL_TRUE = 1; + int GL_FALSE = 0; + + /* ClipPlaneName */ + int GL_CLIP_PLANE0 = 0x3000; + int GL_CLIP_PLANE1 = 0x3001; + int GL_CLIP_PLANE2 = 0x3002; + int GL_CLIP_PLANE3 = 0x3003; + int GL_CLIP_PLANE4 = 0x3004; + int GL_CLIP_PLANE5 = 0x3005; + + /* DataType */ + int GL_BYTE = 0x1400; + int GL_UNSIGNED_BYTE = 0x1401; + int GL_SHORT = 0x1402; + int GL_UNSIGNED_SHORT = 0x1403; + int GL_INT = 0x1404; + int GL_UNSIGNED_INT = 0x1405; + int GL_FLOAT = 0x1406; + int GL_2_BYTES = 0x1407; + int GL_3_BYTES = 0x1408; + int GL_4_BYTES = 0x1409; + int GL_DOUBLE = 0x140A; + + /* DrawBufferMode */ + int GL_NONE = 0; + int GL_FRONT_LEFT = 0x0400; + int GL_FRONT_RIGHT = 0x0401; + int GL_BACK_LEFT = 0x0402; + int GL_BACK_RIGHT = 0x0403; + int GL_FRONT = 0x0404; + int GL_BACK = 0x0405; + int GL_LEFT = 0x0406; + int GL_RIGHT = 0x0407; + int GL_FRONT_AND_BACK = 0x0408; + int GL_AUX0 = 0x0409; + int GL_AUX1 = 0x040A; + int GL_AUX2 = 0x040B; + int GL_AUX3 = 0x040C; + + /* ErrorCode */ + int GL_NO_ERROR = 0; + int GL_INVALID_ENUM = 0x0500; + int GL_INVALID_VALUE = 0x0501; + int GL_INVALID_OPERATION = 0x0502; + int GL_STACK_OVERFLOW = 0x0503; + int GL_STACK_UNDERFLOW = 0x0504; + int GL_OUT_OF_MEMORY = 0x0505; + + /* FeedBackMode */ + int GL_2D = 0x0600; + int GL_3D = 0x0601; + int GL_3D_COLOR = 0x0602; + int GL_3D_COLOR_TEXTURE = 0x0603; + int GL_4D_COLOR_TEXTURE = 0x0604; + + /* FeedBackToken */ + int GL_PASS_THROUGH_TOKEN = 0x0700; + int GL_POINT_TOKEN = 0x0701; + int GL_LINE_TOKEN = 0x0702; + int GL_POLYGON_TOKEN = 0x0703; + int GL_BITMAP_TOKEN = 0x0704; + int GL_DRAW_PIXEL_TOKEN = 0x0705; + int GL_COPY_PIXEL_TOKEN = 0x0706; + int GL_LINE_RESET_TOKEN = 0x0707; + + /* FogMode */ + /* GL_LINEAR */ + int GL_EXP = 0x0800; + int GL_EXP2 = 0x0801; + + /* FrontFaceDirection */ + int GL_CW = 0x0900; + int GL_CCW = 0x0901; + + /* GetMapTarget */ + int GL_COEFF = 0x0A00; + int GL_ORDER = 0x0A01; + int GL_DOMAIN = 0x0A02; + + /* GetTarget */ + int GL_CURRENT_COLOR = 0x0B00; + int GL_CURRENT_INDEX = 0x0B01; + int GL_CURRENT_NORMAL = 0x0B02; + int GL_CURRENT_TEXTURE_COORDS = 0x0B03; + int GL_CURRENT_RASTER_COLOR = 0x0B04; + int GL_CURRENT_RASTER_INDEX = 0x0B05; + int GL_CURRENT_RASTER_TEXTURE_COORDS = 0x0B06; + int GL_CURRENT_RASTER_POSITION = 0x0B07; + int GL_CURRENT_RASTER_POSITION_VALID = 0x0B08; + int GL_CURRENT_RASTER_DISTANCE = 0x0B09; + int GL_POINT_SMOOTH = 0x0B10; + int GL_POINT_SIZE = 0x0B11; + int GL_POINT_SIZE_RANGE = 0x0B12; + int GL_POINT_SIZE_GRANULARITY = 0x0B13; + int GL_LINE_SMOOTH = 0x0B20; + int GL_LINE_WIDTH = 0x0B21; + int GL_LINE_WIDTH_RANGE = 0x0B22; + int GL_LINE_WIDTH_GRANULARITY = 0x0B23; + int GL_LINE_STIPPLE = 0x0B24; + int GL_LINE_STIPPLE_PATTERN = 0x0B25; + int GL_LINE_STIPPLE_REPEAT = 0x0B26; + int GL_LIST_MODE = 0x0B30; + int GL_MAX_LIST_NESTING = 0x0B31; + int GL_LIST_BASE = 0x0B32; + int GL_LIST_INDEX = 0x0B33; + int GL_POLYGON_MODE = 0x0B40; + int GL_POLYGON_SMOOTH = 0x0B41; + int GL_POLYGON_STIPPLE = 0x0B42; + int GL_EDGE_FLAG = 0x0B43; + int GL_CULL_FACE = 0x0B44; + int GL_CULL_FACE_MODE = 0x0B45; + int GL_FRONT_FACE = 0x0B46; + int GL_LIGHTING = 0x0B50; + int GL_LIGHT_MODEL_LOCAL_VIEWER = 0x0B51; + int GL_LIGHT_MODEL_TWO_SIDE = 0x0B52; + int GL_LIGHT_MODEL_AMBIENT = 0x0B53; + int GL_SHADE_MODEL = 0x0B54; + int GL_COLOR_MATERIAL_FACE = 0x0B55; + int GL_COLOR_MATERIAL_PARAMETER = 0x0B56; + int GL_COLOR_MATERIAL = 0x0B57; + int GL_FOG = 0x0B60; + int GL_FOG_INDEX = 0x0B61; + int GL_FOG_DENSITY = 0x0B62; + int GL_FOG_START = 0x0B63; + int GL_FOG_END = 0x0B64; + int GL_FOG_MODE = 0x0B65; + int GL_FOG_COLOR = 0x0B66; + int GL_DEPTH_RANGE = 0x0B70; + int GL_DEPTH_TEST = 0x0B71; + int GL_DEPTH_WRITEMASK = 0x0B72; + int GL_DEPTH_CLEAR_VALUE = 0x0B73; + int GL_DEPTH_FUNC = 0x0B74; + int GL_ACCUM_CLEAR_VALUE = 0x0B80; + int GL_STENCIL_TEST = 0x0B90; + int GL_STENCIL_CLEAR_VALUE = 0x0B91; + int GL_STENCIL_FUNC = 0x0B92; + int GL_STENCIL_VALUE_MASK = 0x0B93; + int GL_STENCIL_FAIL = 0x0B94; + int GL_STENCIL_PASS_DEPTH_FAIL = 0x0B95; + int GL_STENCIL_PASS_DEPTH_PASS = 0x0B96; + int GL_STENCIL_REF = 0x0B97; + int GL_STENCIL_WRITEMASK = 0x0B98; + int GL_MATRIX_MODE = 0x0BA0; + int GL_NORMALIZE = 0x0BA1; + int GL_VIEWPORT = 0x0BA2; + int GL_MODELVIEW_STACK_DEPTH = 0x0BA3; + int GL_PROJECTION_STACK_DEPTH = 0x0BA4; + int GL_TEXTURE_STACK_DEPTH = 0x0BA5; + int GL_MODELVIEW_MATRIX = 0x0BA6; + int GL_PROJECTION_MATRIX = 0x0BA7; + int GL_TEXTURE_MATRIX = 0x0BA8; + int GL_ATTRIB_STACK_DEPTH = 0x0BB0; + int GL_CLIENT_ATTRIB_STACK_DEPTH = 0x0BB1; + int GL_ALPHA_TEST = 0x0BC0; + int GL_ALPHA_TEST_FUNC = 0x0BC1; + int GL_ALPHA_TEST_REF = 0x0BC2; + int GL_DITHER = 0x0BD0; + int GL_BLEND_DST = 0x0BE0; + int GL_BLEND_SRC = 0x0BE1; + int GL_BLEND = 0x0BE2; + int GL_LOGIC_OP_MODE = 0x0BF0; + int GL_INDEX_LOGIC_OP = 0x0BF1; + int GL_COLOR_LOGIC_OP = 0x0BF2; + int GL_AUX_BUFFERS = 0x0C00; + int GL_DRAW_BUFFER = 0x0C01; + int GL_READ_BUFFER = 0x0C02; + int GL_SCISSOR_BOX = 0x0C10; + int GL_SCISSOR_TEST = 0x0C11; + int GL_INDEX_CLEAR_VALUE = 0x0C20; + int GL_INDEX_WRITEMASK = 0x0C21; + int GL_COLOR_CLEAR_VALUE = 0x0C22; + int GL_COLOR_WRITEMASK = 0x0C23; + int GL_INDEX_MODE = 0x0C30; + int GL_RGBA_MODE = 0x0C31; + int GL_DOUBLEBUFFER = 0x0C32; + int GL_STEREO = 0x0C33; + int GL_RENDER_MODE = 0x0C40; + int GL_PERSPECTIVE_CORRECTION_HINT = 0x0C50; + int GL_POINT_SMOOTH_HINT = 0x0C51; + int GL_LINE_SMOOTH_HINT = 0x0C52; + int GL_POLYGON_SMOOTH_HINT = 0x0C53; + int GL_FOG_HINT = 0x0C54; + int GL_TEXTURE_GEN_S = 0x0C60; + int GL_TEXTURE_GEN_T = 0x0C61; + int GL_TEXTURE_GEN_R = 0x0C62; + int GL_TEXTURE_GEN_Q = 0x0C63; + int GL_PIXEL_MAP_I_TO_I = 0x0C70; + int GL_PIXEL_MAP_S_TO_S = 0x0C71; + int GL_PIXEL_MAP_I_TO_R = 0x0C72; + int GL_PIXEL_MAP_I_TO_G = 0x0C73; + int GL_PIXEL_MAP_I_TO_B = 0x0C74; + int GL_PIXEL_MAP_I_TO_A = 0x0C75; + int GL_PIXEL_MAP_R_TO_R = 0x0C76; + int GL_PIXEL_MAP_G_TO_G = 0x0C77; + int GL_PIXEL_MAP_B_TO_B = 0x0C78; + int GL_PIXEL_MAP_A_TO_A = 0x0C79; + int GL_PIXEL_MAP_I_TO_I_SIZE = 0x0CB0; + int GL_PIXEL_MAP_S_TO_S_SIZE = 0x0CB1; + int GL_PIXEL_MAP_I_TO_R_SIZE = 0x0CB2; + int GL_PIXEL_MAP_I_TO_G_SIZE = 0x0CB3; + int GL_PIXEL_MAP_I_TO_B_SIZE = 0x0CB4; + int GL_PIXEL_MAP_I_TO_A_SIZE = 0x0CB5; + int GL_PIXEL_MAP_R_TO_R_SIZE = 0x0CB6; + int GL_PIXEL_MAP_G_TO_G_SIZE = 0x0CB7; + int GL_PIXEL_MAP_B_TO_B_SIZE = 0x0CB8; + int GL_PIXEL_MAP_A_TO_A_SIZE = 0x0CB9; + int GL_UNPACK_SWAP_BYTES = 0x0CF0; + int GL_UNPACK_LSB_FIRST = 0x0CF1; + int GL_UNPACK_ROW_LENGTH = 0x0CF2; + int GL_UNPACK_SKIP_ROWS = 0x0CF3; + int GL_UNPACK_SKIP_PIXELS = 0x0CF4; + int GL_UNPACK_ALIGNMENT = 0x0CF5; + int GL_PACK_SWAP_BYTES = 0x0D00; + int GL_PACK_LSB_FIRST = 0x0D01; + int GL_PACK_ROW_LENGTH = 0x0D02; + int GL_PACK_SKIP_ROWS = 0x0D03; + int GL_PACK_SKIP_PIXELS = 0x0D04; + int GL_PACK_ALIGNMENT = 0x0D05; + int GL_MAP_COLOR = 0x0D10; + int GL_MAP_STENCIL = 0x0D11; + int GL_INDEX_SHIFT = 0x0D12; + int GL_INDEX_OFFSET = 0x0D13; + int GL_RED_SCALE = 0x0D14; + int GL_RED_BIAS = 0x0D15; + int GL_ZOOM_X = 0x0D16; + int GL_ZOOM_Y = 0x0D17; + int GL_GREEN_SCALE = 0x0D18; + int GL_GREEN_BIAS = 0x0D19; + int GL_BLUE_SCALE = 0x0D1A; + int GL_BLUE_BIAS = 0x0D1B; + int GL_ALPHA_SCALE = 0x0D1C; + int GL_ALPHA_BIAS = 0x0D1D; + int GL_DEPTH_SCALE = 0x0D1E; + int GL_DEPTH_BIAS = 0x0D1F; + int GL_MAX_EVAL_ORDER = 0x0D30; + int GL_MAX_LIGHTS = 0x0D31; + int GL_MAX_CLIP_PLANES = 0x0D32; + int GL_MAX_TEXTURE_SIZE = 0x0D33; + int GL_MAX_PIXEL_MAP_TABLE = 0x0D34; + int GL_MAX_ATTRIB_STACK_DEPTH = 0x0D35; + int GL_MAX_MODELVIEW_STACK_DEPTH = 0x0D36; + int GL_MAX_NAME_STACK_DEPTH = 0x0D37; + int GL_MAX_PROJECTION_STACK_DEPTH = 0x0D38; + int GL_MAX_TEXTURE_STACK_DEPTH = 0x0D39; + int GL_MAX_VIEWPORT_DIMS = 0x0D3A; + int GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 0x0D3B; + int GL_SUBPIXEL_BITS = 0x0D50; + int GL_INDEX_BITS = 0x0D51; + int GL_RED_BITS = 0x0D52; + int GL_GREEN_BITS = 0x0D53; + int GL_BLUE_BITS = 0x0D54; + int GL_ALPHA_BITS = 0x0D55; + int GL_DEPTH_BITS = 0x0D56; + int GL_STENCIL_BITS = 0x0D57; + int GL_ACCUM_RED_BITS = 0x0D58; + int GL_ACCUM_GREEN_BITS = 0x0D59; + int GL_ACCUM_BLUE_BITS = 0x0D5A; + int GL_ACCUM_ALPHA_BITS = 0x0D5B; + int GL_NAME_STACK_DEPTH = 0x0D70; + int GL_AUTO_NORMAL = 0x0D80; + int GL_MAP1_COLOR_4 = 0x0D90; + int GL_MAP1_INDEX = 0x0D91; + int GL_MAP1_NORMAL = 0x0D92; + int GL_MAP1_TEXTURE_COORD_1 = 0x0D93; + int GL_MAP1_TEXTURE_COORD_2 = 0x0D94; + int GL_MAP1_TEXTURE_COORD_3 = 0x0D95; + int GL_MAP1_TEXTURE_COORD_4 = 0x0D96; + int GL_MAP1_VERTEX_3 = 0x0D97; + int GL_MAP1_VERTEX_4 = 0x0D98; + int GL_MAP2_COLOR_4 = 0x0DB0; + int GL_MAP2_INDEX = 0x0DB1; + int GL_MAP2_NORMAL = 0x0DB2; + int GL_MAP2_TEXTURE_COORD_1 = 0x0DB3; + int GL_MAP2_TEXTURE_COORD_2 = 0x0DB4; + int GL_MAP2_TEXTURE_COORD_3 = 0x0DB5; + int GL_MAP2_TEXTURE_COORD_4 = 0x0DB6; + int GL_MAP2_VERTEX_3 = 0x0DB7; + int GL_MAP2_VERTEX_4 = 0x0DB8; + int GL_MAP1_GRID_DOMAIN = 0x0DD0; + int GL_MAP1_GRID_SEGMENTS = 0x0DD1; + int GL_MAP2_GRID_DOMAIN = 0x0DD2; + int GL_MAP2_GRID_SEGMENTS = 0x0DD3; + int GL_TEXTURE_1D = 0x0DE0; + int GL_TEXTURE_2D = 0x0DE1; + int GL_FEEDBACK_BUFFER_POINTER = 0x0DF0; + int GL_FEEDBACK_BUFFER_SIZE = 0x0DF1; + int GL_FEEDBACK_BUFFER_TYPE = 0x0DF2; + int GL_SELECTION_BUFFER_POINTER = 0x0DF3; + int GL_SELECTION_BUFFER_SIZE = 0x0DF4; + + /* GetTextureParameter */ + /* GL_TEXTURE_MAG_FILTER */ + /* GL_TEXTURE_MIN_FILTER */ + /* GL_TEXTURE_WRAP_S */ + /* GL_TEXTURE_WRAP_T */ + int GL_TEXTURE_WIDTH = 0x1000; + int GL_TEXTURE_HEIGHT = 0x1001; + int GL_TEXTURE_INTERNAL_FORMAT = 0x1003; + int GL_TEXTURE_BORDER_COLOR = 0x1004; + int GL_TEXTURE_BORDER = 0x1005; + /* GL_TEXTURE_RED_SIZE */ + /* GL_TEXTURE_GREEN_SIZE */ + /* GL_TEXTURE_BLUE_SIZE */ + /* GL_TEXTURE_ALPHA_SIZE */ + /* GL_TEXTURE_LUMINANCE_SIZE */ + /* GL_TEXTURE_INTENSITY_SIZE */ + /* GL_TEXTURE_PRIORITY */ + /* GL_TEXTURE_RESIDENT */ + + /* HintMode */ + int GL_DONT_CARE = 0x1100; + int GL_FASTEST = 0x1101; + int GL_NICEST = 0x1102; + + /* LightName */ + int GL_LIGHT0 = 0x4000; + int GL_LIGHT1 = 0x4001; + int GL_LIGHT2 = 0x4002; + int GL_LIGHT3 = 0x4003; + int GL_LIGHT4 = 0x4004; + int GL_LIGHT5 = 0x4005; + int GL_LIGHT6 = 0x4006; + int GL_LIGHT7 = 0x4007; + + /* LightParameter */ + int GL_AMBIENT = 0x1200; + int GL_DIFFUSE = 0x1201; + int GL_SPECULAR = 0x1202; + int GL_POSITION = 0x1203; + int GL_SPOT_DIRECTION = 0x1204; + int GL_SPOT_EXPONENT = 0x1205; + int GL_SPOT_CUTOFF = 0x1206; + int GL_CONSTANT_ATTENUATION = 0x1207; + int GL_LINEAR_ATTENUATION = 0x1208; + int GL_QUADRATIC_ATTENUATION = 0x1209; + + /* ListMode */ + int GL_COMPILE = 0x1300; + int GL_COMPILE_AND_EXECUTE = 0x1301; + + /* LogicOp */ + int GL_CLEAR = 0x1500; + int GL_AND = 0x1501; + int GL_AND_REVERSE = 0x1502; + int GL_COPY = 0x1503; + int GL_AND_INVERTED = 0x1504; + int GL_NOOP = 0x1505; + int GL_XOR = 0x1506; + int GL_OR = 0x1507; + int GL_NOR = 0x1508; + int GL_EQUIV = 0x1509; + int GL_INVERT = 0x150A; + int GL_OR_REVERSE = 0x150B; + int GL_COPY_INVERTED = 0x150C; + int GL_OR_INVERTED = 0x150D; + int GL_NAND = 0x150E; + int GL_SET = 0x150F; + + /* MaterialParameter */ + int GL_EMISSION = 0x1600; + int GL_SHININESS = 0x1601; + int GL_AMBIENT_AND_DIFFUSE = 0x1602; + int GL_COLOR_INDEXES = 0x1603; + /* GL_AMBIENT */ + /* GL_DIFFUSE */ + /* GL_SPECULAR */ + + /* MatrixMode */ + int GL_MODELVIEW = 0x1700; + int GL_PROJECTION = 0x1701; + int GL_TEXTURE = 0x1702; + + /* PixelCopyType */ + int GL_COLOR = 0x1800; + int GL_DEPTH = 0x1801; + int GL_STENCIL = 0x1802; + + /* PixelFormat */ + int GL_COLOR_INDEX = 0x1900; + int GL_STENCIL_INDEX = 0x1901; + int GL_DEPTH_COMPONENT = 0x1902; + int GL_RED = 0x1903; + int GL_GREEN = 0x1904; + int GL_BLUE = 0x1905; + int GL_ALPHA = 0x1906; + int GL_RGB = 0x1907; + int GL_RGBA = 0x1908; + int GL_LUMINANCE = 0x1909; + int GL_LUMINANCE_ALPHA = 0x190A; + + /* PixelType */ + int GL_BITMAP = 0x1A00; + /* GL_BYTE */ + /* GL_UNSIGNED_BYTE */ + /* GL_SHORT */ + /* GL_UNSIGNED_SHORT */ + /* GL_INT */ + /* GL_UNSIGNED_INT */ + /* GL_FLOAT */ + + /* PolygonMode */ + int GL_POINT = 0x1B00; + int GL_LINE = 0x1B01; + int GL_FILL = 0x1B02; + + /* RenderingMode */ + int GL_RENDER = 0x1C00; + int GL_FEEDBACK = 0x1C01; + int GL_SELECT = 0x1C02; + + /* ShadingModel */ + int GL_FLAT = 0x1D00; + int GL_SMOOTH = 0x1D01; + + /* StencilOp */ + /* GL_ZERO */ + int GL_KEEP = 0x1E00; + int GL_REPLACE = 0x1E01; + int GL_INCR = 0x1E02; + int GL_DECR = 0x1E03; + /* GL_INVERT */ + + /* StringName */ + int GL_VENDOR = 0x1F00; + int GL_RENDERER = 0x1F01; + int GL_VERSION = 0x1F02; + int GL_EXTENSIONS = 0x1F03; + + /* TextureCoordName */ + int GL_S = 0x2000; + int GL_T = 0x2001; + int GL_R = 0x2002; + int GL_Q = 0x2003; + + /* TexCoordPointerType */ + /* GL_SHORT */ + /* GL_INT */ + /* GL_FLOAT */ + /* GL_DOUBLE */ + + /* TextureEnvMode */ + int GL_MODULATE = 0x2100; + int GL_DECAL = 0x2101; + /* GL_BLEND */ + /* GL_REPLACE */ + + /* TextureEnvParameter */ + int GL_TEXTURE_ENV_MODE = 0x2200; + int GL_TEXTURE_ENV_COLOR = 0x2201; + + /* TextureEnvTarget */ + int GL_TEXTURE_ENV = 0x2300; + + /* TextureGenMode */ + int GL_EYE_LINEAR = 0x2400; + int GL_OBJECT_LINEAR = 0x2401; + int GL_SPHERE_MAP = 0x2402; + + /* TextureGenParameter */ + int GL_TEXTURE_GEN_MODE = 0x2500; + int GL_OBJECT_PLANE = 0x2501; + int GL_EYE_PLANE = 0x2502; + + /* TextureMagFilter */ + int GL_NEAREST = 0x2600; + int GL_LINEAR = 0x2601; + + /* TextureMinFilter */ + /* GL_NEAREST */ + /* GL_LINEAR */ + int GL_NEAREST_MIPMAP_NEAREST = 0x2700; + int GL_LINEAR_MIPMAP_NEAREST = 0x2701; + int GL_NEAREST_MIPMAP_LINEAR = 0x2702; + int GL_LINEAR_MIPMAP_LINEAR = 0x2703; + + /* TextureParameterName */ + int GL_TEXTURE_MAG_FILTER = 0x2800; + int GL_TEXTURE_MIN_FILTER = 0x2801; + int GL_TEXTURE_WRAP_S = 0x2802; + int GL_TEXTURE_WRAP_T = 0x2803; + /* GL_TEXTURE_BORDER_COLOR */ + /* GL_TEXTURE_PRIORITY */ + + /* TextureWrapMode */ + int GL_CLAMP = 0x2900; + int GL_REPEAT = 0x2901; + + /* ClientAttribMask */ + int GL_CLIENT_PIXEL_STORE_BIT = 0x00000001; + int GL_CLIENT_VERTEX_ARRAY_BIT = 0x00000002; + int GL_ALL_CLIENT_ATTRIB_BITS = 0xffffffff; + + /* polygon_offset */ + int GL_POLYGON_OFFSET_FACTOR = 0x8038; + int GL_POLYGON_OFFSET_UNITS = 0x2A00; + int GL_POLYGON_OFFSET_POINT = 0x2A01; + int GL_POLYGON_OFFSET_LINE = 0x2A02; + int GL_POLYGON_OFFSET_FILL = 0x8037; + + /* texture */ + int GL_ALPHA4 = 0x803B; + int GL_ALPHA8 = 0x803C; + int GL_ALPHA12 = 0x803D; + int GL_ALPHA16 = 0x803E; + int GL_LUMINANCE4 = 0x803F; + int GL_LUMINANCE8 = 0x8040; + int GL_LUMINANCE12 = 0x8041; + int GL_LUMINANCE16 = 0x8042; + int GL_LUMINANCE4_ALPHA4 = 0x8043; + int GL_LUMINANCE6_ALPHA2 = 0x8044; + int GL_LUMINANCE8_ALPHA8 = 0x8045; + int GL_LUMINANCE12_ALPHA4 = 0x8046; + int GL_LUMINANCE12_ALPHA12 = 0x8047; + int GL_LUMINANCE16_ALPHA16 = 0x8048; + int GL_INTENSITY = 0x8049; + int GL_INTENSITY4 = 0x804A; + int GL_INTENSITY8 = 0x804B; + int GL_INTENSITY12 = 0x804C; + int GL_INTENSITY16 = 0x804D; + int GL_R3_G3_B2 = 0x2A10; + int GL_RGB4 = 0x804F; + int GL_RGB5 = 0x8050; + int GL_RGB8 = 0x8051; + int GL_RGB10 = 0x8052; + int GL_RGB12 = 0x8053; + int GL_RGB16 = 0x8054; + int GL_RGBA2 = 0x8055; + int GL_RGBA4 = 0x8056; + int GL_RGB5_A1 = 0x8057; + int GL_RGBA8 = 0x8058; + int GL_RGB10_A2 = 0x8059; + int GL_RGBA12 = 0x805A; + int GL_RGBA16 = 0x805B; + int GL_TEXTURE_RED_SIZE = 0x805C; + int GL_TEXTURE_GREEN_SIZE = 0x805D; + int GL_TEXTURE_BLUE_SIZE = 0x805E; + int GL_TEXTURE_ALPHA_SIZE = 0x805F; + int GL_TEXTURE_LUMINANCE_SIZE = 0x8060; + int GL_TEXTURE_INTENSITY_SIZE = 0x8061; + int GL_PROXY_TEXTURE_1D = 0x8063; + int GL_PROXY_TEXTURE_2D = 0x8064; + + /* texture_object */ + int GL_TEXTURE_PRIORITY = 0x8066; + int GL_TEXTURE_RESIDENT = 0x8067; + int GL_TEXTURE_BINDING_1D = 0x8068; + int GL_TEXTURE_BINDING_2D = 0x8069; + + /* vertex_array */ + int GL_VERTEX_ARRAY = 0x8074; + int GL_NORMAL_ARRAY = 0x8075; + int GL_COLOR_ARRAY = 0x8076; + int GL_INDEX_ARRAY = 0x8077; + int GL_TEXTURE_COORD_ARRAY = 0x8078; + int GL_EDGE_FLAG_ARRAY = 0x8079; + int GL_VERTEX_ARRAY_SIZE = 0x807A; + int GL_VERTEX_ARRAY_TYPE = 0x807B; + int GL_VERTEX_ARRAY_STRIDE = 0x807C; + int GL_NORMAL_ARRAY_TYPE = 0x807E; + int GL_NORMAL_ARRAY_STRIDE = 0x807F; + int GL_COLOR_ARRAY_SIZE = 0x8081; + int GL_COLOR_ARRAY_TYPE = 0x8082; + int GL_COLOR_ARRAY_STRIDE = 0x8083; + int GL_INDEX_ARRAY_TYPE = 0x8085; + int GL_INDEX_ARRAY_STRIDE = 0x8086; + int GL_TEXTURE_COORD_ARRAY_SIZE = 0x8088; + int GL_TEXTURE_COORD_ARRAY_TYPE = 0x8089; + int GL_TEXTURE_COORD_ARRAY_STRIDE = 0x808A; + int GL_EDGE_FLAG_ARRAY_STRIDE = 0x808C; + int GL_VERTEX_ARRAY_POINTER = 0x808E; + int GL_NORMAL_ARRAY_POINTER = 0x808F; + int GL_COLOR_ARRAY_POINTER = 0x8090; + int GL_INDEX_ARRAY_POINTER = 0x8091; + int GL_TEXTURE_COORD_ARRAY_POINTER = 0x8092; + int GL_EDGE_FLAG_ARRAY_POINTER = 0x8093; + int GL_V2F = 0x2A20; + int GL_V3F = 0x2A21; + int GL_C4UB_V2F = 0x2A22; + int GL_C4UB_V3F = 0x2A23; + int GL_C3F_V3F = 0x2A24; + int GL_N3F_V3F = 0x2A25; + int GL_C4F_N3F_V3F = 0x2A26; + int GL_T2F_V3F = 0x2A27; + int GL_T4F_V4F = 0x2A28; + int GL_T2F_C4UB_V3F = 0x2A29; + int GL_T2F_C3F_V3F = 0x2A2A; + int GL_T2F_N3F_V3F = 0x2A2B; + int GL_T2F_C4F_N3F_V3F = 0x2A2C; + int GL_T4F_C4F_N3F_V4F = 0x2A2D; + + /* For compatibility with OpenGL v1.0 */ + int GL_LOGIC_OP = GL_INDEX_LOGIC_OP; + int GL_TEXTURE_COMPONENTS = GL_TEXTURE_INTERNAL_FORMAT; + + @DeprecatedGL + void glAccum(@GLenum int op, float value); + + @DeprecatedGL + void glAlphaFunc(@GLenum int func, float ref); + + void glClearColor(float red, float green, float blue, float alpha); + + @DeprecatedGL + void glClearAccum(float red, float green, float blue, float alpha); + + void glClear(@GLbitfield int mask); + + @DeprecatedGL + void glCallLists(@AutoSize("lists") @GLsizei int n, @AutoType("lists") @GLenum int type, + @Const + @GLubyte + @GLushort + @GLuint Buffer lists); + + @DeprecatedGL + void glCallList(@GLuint int list); + + void glBlendFunc(@GLenum int sfactor, @GLenum int dfactor); + + @DeprecatedGL + void glBitmap(@GLsizei int width, @GLsizei int height, float xorig, float yorig, float xmove, float ymove, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "(((width + 7)/8)*height)", canBeNull = true) + @Const + @GLubyte ByteBuffer bitmap); + + void glBindTexture(@GLenum int target, @GLuint int texture); + + @DeprecatedGL + void glPrioritizeTextures(@AutoSize("textures") @GLsizei int n, + @Const + @GLuint IntBuffer textures, + @Const + @Check("textures.remaining()") + FloatBuffer priorities); + + @DeprecatedGL + boolean glAreTexturesResident(@AutoSize("textures") @GLsizei int n, + @Const + @GLuint IntBuffer textures, + @Check("textures.remaining()") + @GLboolean ByteBuffer residences); + + @NoErrorCheck + @DeprecatedGL + @Code("\t\tif ( ContextCapabilities.DEBUG ) StateTracker.setBeginEnd(caps, true);") + void glBegin(@GLenum int mode); + + @DeprecatedGL + @Code("\t\tif ( ContextCapabilities.DEBUG ) StateTracker.setBeginEnd(caps, false);") + void glEnd(); + + @NoErrorCheck + void glArrayElement(int i); + + void glClearDepth(double depth); + + @DeprecatedGL + void glDeleteLists(@GLuint int list, @GLsizei int range); + + void glDeleteTextures(@AutoSize("textures") @GLsizei int n, @Const @GLuint IntBuffer textures); + + @Alternate("glDeleteTextures") + void glDeleteTextures(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, texture)", keepParam = true) int texture); + + void glCullFace(@GLenum int mode); + + void glCopyTexSubImage2D(@GLenum int target, int level, int xoffset, int yoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + void glCopyTexSubImage1D(@GLenum int target, int level, int xoffset, int x, int y, @GLsizei int width); + + void glCopyTexImage2D(@GLenum int target, int level, int internalFormat, int x, int y, @GLsizei int width, @GLsizei int height, int border); + + void glCopyTexImage1D(@GLenum int target, int level, int internalFormat, int x, int y, @GLsizei int width, int border); + + void glCopyPixels(int x, int y, int width, int height, int type); + + @DeprecatedGL + void glColorPointer(int size, @AutoType("pointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @Check + @BufferObject(BufferKind.ArrayVBO) + @Const + @GLfloat + @GLdouble + @GLubyte + @GLbyte Buffer pointer); + + @DeprecatedGL + @Alternate("glColorPointer") + void glColorPointer(int size, @GLenum int type, @GLsizei int stride, + @CachedReference + @Check + @BufferObject(BufferKind.ArrayVBO) + @Const ByteBuffer pointer); + + @DeprecatedGL + void glColorMaterial(@GLenum int face, @GLenum int mode); + + void glColorMask(boolean red, boolean green, boolean blue, boolean alpha); + + @NoErrorCheck + @DeprecatedGL + void glColor3b(byte red, byte green, byte blue); + + @NoErrorCheck + @DeprecatedGL + void glColor3f(float red, float green, float blue); + + @NoErrorCheck + @DeprecatedGL + void glColor3d(double red, double green, double blue); + + @NoErrorCheck + @DeprecatedGL + void glColor3ub(@GLubyte byte red, @GLubyte byte green, @GLubyte byte blue); + + @NoErrorCheck + @DeprecatedGL + void glColor4b(byte red, byte green, byte blue, byte alpha); + + @NoErrorCheck + @DeprecatedGL + void glColor4f(float red, float green, float blue, float alpha); + + @NoErrorCheck + @DeprecatedGL + void glColor4d(double red, double green, double blue, double alpha); + + @NoErrorCheck + @DeprecatedGL + void glColor4ub(@GLubyte byte red, @GLubyte byte green, @GLubyte byte blue, @GLubyte byte alpha); + + void glClipPlane(@GLenum int plane, @Check("4") @Const DoubleBuffer equation); + + void glClearStencil(int s); + + // This function is only used in indexed color mode + // void glClearIndex(float c); + + @DeprecatedGL + void glEvalPoint1(int i); + + @DeprecatedGL + void glEvalPoint2(int i, int j); + + @DeprecatedGL + void glEvalMesh1(@GLenum int mode, int i1, int i2); + + @DeprecatedGL + void glEvalMesh2(@GLenum int mode, int i1, int i2, int j1, int j2); + + @DeprecatedGL + void glEvalCoord1f(float u); + + @DeprecatedGL + void glEvalCoord1d(double u); + + @DeprecatedGL + void glEvalCoord2f(float u, float v); + + @DeprecatedGL + void glEvalCoord2d(double u, double v); + + @DeprecatedGL + void glEnableClientState(@GLenum int cap); + + @DeprecatedGL + void glDisableClientState(@GLenum int cap); + + void glEnable(@GLenum int cap); + + void glDisable(@GLenum int cap); + + @DeprecatedGL + void glEdgeFlagPointer(int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte Buffer pointer); + + @DeprecatedGL + void glEdgeFlag(boolean flag); + + @DeprecatedGL + void glDrawPixels(@GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @BufferObject(BufferKind.UnpackPBO) + @Const + @GLbyte + @GLshort + @GLint Buffer pixels); + + void glDrawElements(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices); + + @Alternate("glDrawElements") + void glDrawElements(@GLenum int mode, @GLsizei int count, @GLenum int type, @BufferObject(BufferKind.ElementVBO) @Const @Check("count") ByteBuffer indices); + + void glDrawBuffer(@GLenum int mode); + + void glDrawArrays(@GLenum int mode, int first, @GLsizei int count); + + void glDepthRange(double zNear, double zFar); + + void glDepthMask(boolean flag); + + void glDepthFunc(@GLenum int func); + + @DeprecatedGL + void glFeedbackBuffer(@AutoSize("buffer") @GLsizei int size, @GLenum int type, FloatBuffer buffer); + + @StripPostfix("values") + @DeprecatedGL + void glGetPixelMapfv(@GLenum int map, @OutParameter @Check("256") @BufferObject(BufferKind.PackPBO) FloatBuffer values); + + @StripPostfix("values") + @DeprecatedGL + void glGetPixelMapuiv(@GLenum int map, @OutParameter @Check("256") @BufferObject(BufferKind.PackPBO) @GLuint IntBuffer values); + + @StripPostfix("values") + @DeprecatedGL + void glGetPixelMapusv(@GLenum int map, @OutParameter @Check("256") @BufferObject(BufferKind.PackPBO) @GLushort ShortBuffer values); + + @StripPostfix("params") + @DeprecatedGL + void glGetMaterialfv(@GLenum int face, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetMaterialiv(@GLenum int face, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("v") + @DeprecatedGL + void glGetMapfv(@GLenum int target, @GLenum int query, @OutParameter @Check("256") FloatBuffer v); + + @StripPostfix("v") + @DeprecatedGL + void glGetMapdv(@GLenum int target, @GLenum int query, @OutParameter @Check("256") DoubleBuffer v); + + @StripPostfix("v") + @DeprecatedGL + void glGetMapiv(@GLenum int target, @GLenum int query, @OutParameter @Check("256") IntBuffer v); + + @StripPostfix("params") + @DeprecatedGL + void glGetLightfv(@GLenum int light, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetLightiv(@GLenum int light, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @NoErrorCheck + int glGetError(); + + void glGetClipPlane(@GLenum int plane, @OutParameter @Check("4") DoubleBuffer equation); + + @StripPostfix("params") + void glGetBooleanv(@GLenum int pname, @OutParameter @Check("16") @GLboolean ByteBuffer params); + + @Alternate("glGetBooleanv") + @GLreturn("params") + @StripPostfix("params") + void glGetBooleanv2(@GLenum int pname, @OutParameter @GLboolean ByteBuffer params); + + @StripPostfix("params") + void glGetDoublev(@GLenum int pname, @OutParameter @Check("16") DoubleBuffer params); + + @Alternate("glGetDoublev") + @GLreturn("params") + @StripPostfix("params") + void glGetDoublev2(@GLenum int pname, @OutParameter DoubleBuffer params); + + @StripPostfix("params") + void glGetFloatv(@GLenum int pname, @OutParameter @Check("16") FloatBuffer params); + + @Alternate("glGetFloatv") + @GLreturn("params") + @StripPostfix("params") + void glGetFloatv2(@GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetIntegerv(@GLenum int pname, @OutParameter @Check("16") IntBuffer params); + + @Alternate("glGetIntegerv") + @GLreturn("params") + @StripPostfix("params") + void glGetIntegerv2(@GLenum int pname, @OutParameter IntBuffer params); + + void glGenTextures(@AutoSize("textures") @GLsizei int n, @OutParameter @GLuint IntBuffer textures); + + @Alternate("glGenTextures") + @GLreturn("textures") + void glGenTextures2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer textures); + + @GLuint + @DeprecatedGL + int glGenLists(@GLsizei int range); + + @DeprecatedGL + void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar); + + void glFrontFace(@GLenum int mode); + + @DeprecatedGL + void glFogf(@GLenum int pname, float param); + + @DeprecatedGL + void glFogi(@GLenum int pname, int param); + + @StripPostfix("params") + @DeprecatedGL + void glFogfv(@GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glFogiv(@GLenum int pname, @Check("4") @Const IntBuffer params); + + void glFlush(); + + void glFinish(); + + @StripPostfix("result") + void glGetPointerv(@GLenum int pname, @Result @GLvoid ByteBuffer result); + + boolean glIsEnabled(@GLenum int cap); + + void glInterleavedArrays(@GLenum int format, @GLsizei int stride, + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pointer); + + @DeprecatedGL + void glInitNames(); + + void glHint(@GLenum int target, @GLenum int mode); + + @StripPostfix("params") + void glGetTexParameterfv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTexParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterfv2(@GLenum int target, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetTexParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetTexLevelParameterfv(@GLenum int target, int level, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTexLevelParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexLevelParameterfv2(@GLenum int target, int level, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetTexLevelParameteriv(@GLenum int target, int level, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexLevelParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexLevelParameteriv2(@GLenum int target, int level, @GLenum int pname, @OutParameter IntBuffer params); + + void glGetTexImage(@GLenum int target, int level, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, 1, 1, 1)") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + @StripPostfix("params") + @DeprecatedGL + void glGetTexGeniv(@GLenum int coord, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexGeniv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + @DeprecatedGL + void glGetTexGeniv2(@GLenum int coord, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetTexGenfv(@GLenum int coord, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTexGenfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + @DeprecatedGL + void glGetTexGenfv2(@GLenum int coord, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glGetTexGendv(@GLenum int coord, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @Alternate("glGetTexGendv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + @DeprecatedGL + void glGetTexGendv2(@GLenum int coord, @GLenum int pname, @OutParameter DoubleBuffer params); + + @StripPostfix("params") + void glGetTexEnviv(@GLenum int coord, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexEnviv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexEnviv2(@GLenum int coord, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetTexEnvfv(@GLenum int coord, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetTexEnvfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexEnvfv2(@GLenum int coord, @GLenum int pname, @OutParameter FloatBuffer params); + + @Const + String glGetString(int name); + + @DeprecatedGL + void glGetPolygonStipple(@OutParameter @BufferObject(BufferKind.PackPBO) @Check("128") @GLubyte ByteBuffer mask); + + @DeprecatedGL + boolean glIsList(@GLuint int list); + + @DeprecatedGL + void glMaterialf(@GLenum int face, @GLenum int pname, float param); + + @DeprecatedGL + void glMateriali(@GLenum int face, @GLenum int pname, int param); + + @StripPostfix("params") + @DeprecatedGL + void glMaterialfv(@GLenum int face, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glMaterialiv(@GLenum int face, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @DeprecatedGL + void glMapGrid1f(int un, float u1, float u2); + + @DeprecatedGL + void glMapGrid1d(int un, double u1, double u2); + + @DeprecatedGL + void glMapGrid2f(int un, float u1, float u2, int vn, float v1, float v2); + + @DeprecatedGL + void glMapGrid2d(int un, double u1, double u2, int vn, double v1, double v2); + + // TODO: check buffer size valid + + @DeprecatedGL + void glMap2f(@GLenum int target, float u1, float u2, int ustride, int uorder, float v1, float v2, int vstride, int vorder, @Check @Const FloatBuffer points); + + @DeprecatedGL + void glMap2d(@GLenum int target, double u1, double u2, int ustride, int uorder, double v1, double v2, int vstride, int vorder, @Check @Const DoubleBuffer points); + + // TODO: check buffer size valid + + @DeprecatedGL + void glMap1f(@GLenum int target, float u1, float u2, int stride, int order, @Check @Const FloatBuffer points); + + @DeprecatedGL + void glMap1d(@GLenum int target, double u1, double u2, int stride, int order, @Check @Const DoubleBuffer points); + + void glLogicOp(@GLenum int opcode); + + @DeprecatedGL + void glLoadName(@GLuint int name); + + @StripPostfix("m") + @DeprecatedGL + void glLoadMatrixf(@Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glLoadMatrixd(@Check("16") @Const DoubleBuffer m); + + @DeprecatedGL + void glLoadIdentity(); + + @DeprecatedGL + void glListBase(@GLuint int base); + + void glLineWidth(float width); + + @DeprecatedGL + void glLineStipple(int factor, @GLushort short pattern); + + @DeprecatedGL + void glLightModelf(@GLenum int pname, float param); + + @DeprecatedGL + void glLightModeli(@GLenum int pname, int param); + + @StripPostfix("params") + @DeprecatedGL + void glLightModelfv(@GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glLightModeliv(@GLenum int pname, @Check("4") @Const IntBuffer params); + + @DeprecatedGL + void glLightf(@GLenum int light, @GLenum int pname, float param); + + @DeprecatedGL + void glLighti(@GLenum int light, @GLenum int pname, int param); + + @StripPostfix("params") + @DeprecatedGL + void glLightfv(@GLenum int light, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glLightiv(@GLenum int light, @GLenum int pname, @Check("4") @Const IntBuffer params); + + boolean glIsTexture(@GLuint int texture); + + @DeprecatedGL + void glMatrixMode(@GLenum int mode); + + @DeprecatedGL + void glPolygonStipple(@BufferObject(BufferKind.UnpackPBO) @Check("128") @Const @GLubyte ByteBuffer mask); + + void glPolygonOffset(float factor, float units); + + void glPolygonMode(@GLenum int face, @GLenum int mode); + + void glPointSize(float size); + + @DeprecatedGL + void glPixelZoom(float xfactor, float yfactor); + + @DeprecatedGL + void glPixelTransferf(@GLenum int pname, float param); + + @DeprecatedGL + void glPixelTransferi(@GLenum int pname, int param); + + void glPixelStoref(@GLenum int pname, float param); + + void glPixelStorei(@GLenum int pname, int param); + + @StripPostfix("values") + @DeprecatedGL + void glPixelMapfv(@GLenum int map, @AutoSize("values") @GLsizei int mapsize, @BufferObject(BufferKind.UnpackPBO) @Const FloatBuffer values); + + @StripPostfix("values") + @DeprecatedGL + void glPixelMapuiv(@GLenum int map, @AutoSize("values") @GLsizei int mapsize, @BufferObject(BufferKind.UnpackPBO) @Const @GLuint IntBuffer values); + + @StripPostfix("values") + @DeprecatedGL + void glPixelMapusv(@GLenum int map, @AutoSize("values") @GLsizei int mapsize, @BufferObject(BufferKind.UnpackPBO) @Const @GLushort ShortBuffer values); + + @DeprecatedGL + void glPassThrough(float token); + + @DeprecatedGL + void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar); + + @DeprecatedGL + void glNormalPointer(@AutoType("pointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLint + @GLbyte + @GLfloat + @GLdouble Buffer pointer); + + @DeprecatedGL + @Alternate("glNormalPointer") + void glNormalPointer(@GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const ByteBuffer pointer); + + @NoErrorCheck + @DeprecatedGL + void glNormal3b(byte nx, byte ny, byte nz); + + @NoErrorCheck + @DeprecatedGL + void glNormal3f(float nx, float ny, float nz); + + @NoErrorCheck + @DeprecatedGL + void glNormal3d(double nx, double ny, double nz); + + @NoErrorCheck + @DeprecatedGL + void glNormal3i(int nx, int ny, int nz); + + @DeprecatedGL + void glNewList(@GLuint int list, @GLenum int mode); + + @DeprecatedGL + void glEndList(); + + @StripPostfix("m") + @DeprecatedGL + void glMultMatrixf(@Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMultMatrixd(@Check("16") @Const DoubleBuffer m); + + void glShadeModel(@GLenum int mode); + + @DeprecatedGL + void glSelectBuffer(@AutoSize("buffer") @GLsizei int size, @GLuint IntBuffer buffer); + + void glScissor(int x, int y, @GLsizei int width, @GLsizei int height); + + @DeprecatedGL + void glScalef(float x, float y, float z); + + @DeprecatedGL + void glScaled(double x, double y, double z); + + @DeprecatedGL + void glRotatef(float angle, float x, float y, float z); + + @DeprecatedGL + void glRotated(double angle, double x, double y, double z); + + @DeprecatedGL + int glRenderMode(@GLenum int mode); + + @DeprecatedGL + void glRectf(float x1, float y1, float x2, float y2); + + @DeprecatedGL + void glRectd(double x1, double y1, double x2, double y2); + + @DeprecatedGL + void glRecti(int x1, int y1, int x2, int y2); + + void glReadPixels(int x, int y, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glReadBuffer(@GLenum int mode); + + @DeprecatedGL + void glRasterPos2f(float x, float y); + + @DeprecatedGL + void glRasterPos2d(double x, double y); + + @DeprecatedGL + void glRasterPos2i(int x, int y); + + @DeprecatedGL + void glRasterPos3f(float x, float y, float z); + + @DeprecatedGL + void glRasterPos3d(double x, double y, double z); + + @DeprecatedGL + void glRasterPos3i(int x, int y, int z); + + @DeprecatedGL + void glRasterPos4f(float x, float y, float z, float w); + + @DeprecatedGL + void glRasterPos4d(double x, double y, double z, double w); + + @DeprecatedGL + void glRasterPos4i(int x, int y, int z, int w); + + @DeprecatedGL + void glPushName(@GLuint int name); + + @DeprecatedGL + void glPopName(); + + @DeprecatedGL + void glPushMatrix(); + + @DeprecatedGL + void glPopMatrix(); + + @Code(" StateTracker.pushAttrib(caps, mask);") + @DeprecatedGL + void glPushClientAttrib(@GLbitfield int mask); + + @Code(" StateTracker.popAttrib(caps);") + @DeprecatedGL + void glPopClientAttrib(); + + @DeprecatedGL + void glPushAttrib(@GLbitfield int mask); + + @DeprecatedGL + void glPopAttrib(); + + void glStencilFunc(@GLenum int func, int ref, @GLuint int mask); + + @DeprecatedGL + void glVertexPointer(int size, @AutoType("pointer") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pointer); + + @DeprecatedGL + @Alternate("glVertexPointer") + void glVertexPointer(int size, @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const ByteBuffer pointer); + + @NoErrorCheck + @DeprecatedGL + void glVertex2f(float x, float y); + + @NoErrorCheck + @DeprecatedGL + void glVertex2d(double x, double y); + + @NoErrorCheck + @DeprecatedGL + void glVertex2i(int x, int y); + + @NoErrorCheck + @DeprecatedGL + void glVertex3f(float x, float y, float z); + + @NoErrorCheck + @DeprecatedGL + void glVertex3d(double x, double y, double z); + + @NoErrorCheck + @DeprecatedGL + void glVertex3i(int x, int y, int z); + + @NoErrorCheck + @DeprecatedGL + void glVertex4f(float x, float y, float z, float w); + + @NoErrorCheck + @DeprecatedGL + void glVertex4d(double x, double y, double z, double w); + + @NoErrorCheck + @DeprecatedGL + void glVertex4i(int x, int y, int z, int w); + + @DeprecatedGL + void glTranslatef(float x, float y, float z); + + @DeprecatedGL + void glTranslated(double x, double y, double z); + + void glTexImage1D(@GLenum int target, int level, int internalformat, @GLsizei int width, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage1DStorage(pixels, format, type, width)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTexImage2D(@GLenum int target, int level, int internalformat, int width, int height, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTexSubImage1D(@GLenum int target, int level, int xoffset, @GLsizei int width, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, 1, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTexSubImage2D(@GLenum int target, int level, int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTexParameterf(@GLenum int target, @GLenum int pname, float param); + + void glTexParameteri(@GLenum int target, @GLenum int pname, int param); + + @StripPostfix("param") + void glTexParameterfv(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer param); + + @StripPostfix("param") + void glTexParameteriv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer param); + + @DeprecatedGL + void glTexGenf(@GLenum int coord, @GLenum int pname, float param); + + @DeprecatedGL + void glTexGend(@GLenum int coord, @GLenum int pname, double param); + + @StripPostfix("params") + @DeprecatedGL + void glTexGenfv(@GLenum int coord, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + @DeprecatedGL + void glTexGendv(@GLenum int coord, @GLenum int pname, @Check("4") @Const DoubleBuffer params); + + @DeprecatedGL + void glTexGeni(@GLenum int coord, @GLenum int pname, int param); + + @StripPostfix("params") + @DeprecatedGL + void glTexGeniv(@GLenum int coord, @GLenum int pname, @Check("4") @Const IntBuffer params); + + void glTexEnvf(@GLenum int target, @GLenum int pname, float param); + + void glTexEnvi(@GLenum int target, @GLenum int pname, int param); + + @StripPostfix("params") + void glTexEnvfv(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glTexEnviv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @DeprecatedGL + void glTexCoordPointer(int size, @AutoType("pointer") @GLenum int type, @GLsizei int stride, + @CachedReference(index = "StateTracker.getReferences(caps).glClientActiveTexture", name = "glTexCoordPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLint + @GLshort + @GLfloat + @GLdouble Buffer pointer); + + @DeprecatedGL + @Alternate("glTexCoordPointer") + void glTexCoordPointer(int size, @GLenum int type, @GLsizei int stride, + @CachedReference(index = "StateTracker.getReferences(caps).glClientActiveTexture", name = "glTexCoordPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const ByteBuffer pointer); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord1f(float s); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord1d(double s); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord2f(float s, float t); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord2d(double s, double t); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord3f(float s, float t, float r); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord3d(double s, double t, double r); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord4f(float s, float t, float r, float q); + + @NoErrorCheck + @DeprecatedGL + void glTexCoord4d(double s, double t, double r, double q); + + void glStencilOp(@GLenum int fail, @GLenum int zfail, @GLenum int zpass); + + void glStencilMask(@GLuint int mask); + + void glViewport(int x, int y, @GLsizei int width, @GLsizei int height); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL12.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL12.java new file mode 100644 index 0000000..251b2b1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL12.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; + +/** + * <p/> + * The core OpenGL1.2.1 API, with the imaging subset. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ + +public interface GL12 { + + int GL_TEXTURE_BINDING_3D = 0x806A; + int GL_PACK_SKIP_IMAGES = 0x806B; + int GL_PACK_IMAGE_HEIGHT = 0x806C; + int GL_UNPACK_SKIP_IMAGES = 0x806D; + int GL_UNPACK_IMAGE_HEIGHT = 0x806E; + int GL_TEXTURE_3D = 0x806F; + int GL_PROXY_TEXTURE_3D = 0x8070; + int GL_TEXTURE_DEPTH = 0x8071; + int GL_TEXTURE_WRAP_R = 0x8072; + int GL_MAX_3D_TEXTURE_SIZE = 0x8073; + int GL_BGR = 0x80E0; + int GL_BGRA = 0x80E1; + int GL_UNSIGNED_BYTE_3_3_2 = 0x8032; + int GL_UNSIGNED_BYTE_2_3_3_REV = 0x8362; + int GL_UNSIGNED_SHORT_5_6_5 = 0x8363; + int GL_UNSIGNED_SHORT_5_6_5_REV = 0x8364; + int GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033; + int GL_UNSIGNED_SHORT_4_4_4_4_REV = 0x8365; + int GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034; + int GL_UNSIGNED_SHORT_1_5_5_5_REV = 0x8366; + int GL_UNSIGNED_INT_8_8_8_8 = 0x8035; + int GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367; + int GL_UNSIGNED_INT_10_10_10_2 = 0x8036; + int GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + int GL_RESCALE_NORMAL = 0x803A; + int GL_LIGHT_MODEL_COLOR_CONTROL = 0x81F8; + int GL_SINGLE_COLOR = 0x81F9; + int GL_SEPARATE_SPECULAR_COLOR = 0x81FA; + int GL_CLAMP_TO_EDGE = 0x812F; + int GL_TEXTURE_MIN_LOD = 0x813A; + int GL_TEXTURE_MAX_LOD = 0x813B; + int GL_TEXTURE_BASE_LEVEL = 0x813C; + int GL_TEXTURE_MAX_LEVEL = 0x813D; + int GL_MAX_ELEMENTS_VERTICES = 0x80E8; + int GL_MAX_ELEMENTS_INDICES = 0x80E9; + int GL_ALIASED_POINT_SIZE_RANGE = 0x846D; + int GL_ALIASED_LINE_WIDTH_RANGE = 0x846E; + + int GL_SMOOTH_POINT_SIZE_RANGE = 0x0B12; + int GL_SMOOTH_POINT_SIZE_GRANULARITY = 0x0B13; + int GL_SMOOTH_LINE_WIDTH_RANGE = 0x0B22; + int GL_SMOOTH_LINE_WIDTH_GRANULARITY = 0x0B23; + + void glDrawRangeElements(@GLenum int mode, @GLuint int start, @GLuint int end, @AutoSize("indices") @GLsizei int count, + @AutoType("indices") + @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices); + + void glTexImage3D(@GLenum int target, int level, int internalFormat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pixels); + + void glCopyTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, @GLsizei int width, @GLsizei int height); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL13.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL13.java new file mode 100644 index 0000000..5d7f7a3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL13.java @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +/** + * <p/> + * The core OpenGL1.3 API. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +@DeprecatedGL +public interface GL13 { + int GL_TEXTURE0 = 0x84C0; + int GL_TEXTURE1 = 0x84C1; + int GL_TEXTURE2 = 0x84C2; + int GL_TEXTURE3 = 0x84C3; + int GL_TEXTURE4 = 0x84C4; + int GL_TEXTURE5 = 0x84C5; + int GL_TEXTURE6 = 0x84C6; + int GL_TEXTURE7 = 0x84C7; + int GL_TEXTURE8 = 0x84C8; + int GL_TEXTURE9 = 0x84C9; + int GL_TEXTURE10 = 0x84CA; + int GL_TEXTURE11 = 0x84CB; + int GL_TEXTURE12 = 0x84CC; + int GL_TEXTURE13 = 0x84CD; + int GL_TEXTURE14 = 0x84CE; + int GL_TEXTURE15 = 0x84CF; + int GL_TEXTURE16 = 0x84D0; + int GL_TEXTURE17 = 0x84D1; + int GL_TEXTURE18 = 0x84D2; + int GL_TEXTURE19 = 0x84D3; + int GL_TEXTURE20 = 0x84D4; + int GL_TEXTURE21 = 0x84D5; + int GL_TEXTURE22 = 0x84D6; + int GL_TEXTURE23 = 0x84D7; + int GL_TEXTURE24 = 0x84D8; + int GL_TEXTURE25 = 0x84D9; + int GL_TEXTURE26 = 0x84DA; + int GL_TEXTURE27 = 0x84DB; + int GL_TEXTURE28 = 0x84DC; + int GL_TEXTURE29 = 0x84DD; + int GL_TEXTURE30 = 0x84DE; + int GL_TEXTURE31 = 0x84DF; + int GL_ACTIVE_TEXTURE = 0x84E0; + int GL_CLIENT_ACTIVE_TEXTURE = 0x84E1; + int GL_MAX_TEXTURE_UNITS = 0x84E2; + + int GL_NORMAL_MAP = 0x8511; + int GL_REFLECTION_MAP = 0x8512; + int GL_TEXTURE_CUBE_MAP = 0x8513; + int GL_TEXTURE_BINDING_CUBE_MAP = 0x8514; + int GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; + int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; + int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; + int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; + int GL_PROXY_TEXTURE_CUBE_MAP = 0x851B; + int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + int GL_COMPRESSED_ALPHA = 0x84E9; + int GL_COMPRESSED_LUMINANCE = 0x84EA; + int GL_COMPRESSED_LUMINANCE_ALPHA = 0x84EB; + int GL_COMPRESSED_INTENSITY = 0x84EC; + int GL_COMPRESSED_RGB = 0x84ED; + int GL_COMPRESSED_RGBA = 0x84EE; + int GL_TEXTURE_COMPRESSION_HINT = 0x84EF; + int GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 0x86A0; + int GL_TEXTURE_COMPRESSED = 0x86A1; + int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2; + int GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + int GL_MULTISAMPLE = 0x809D; + int GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E; + int GL_SAMPLE_ALPHA_TO_ONE = 0x809F; + int GL_SAMPLE_COVERAGE = 0x80A0; + int GL_SAMPLE_BUFFERS = 0x80A8; + int GL_SAMPLES = 0x80A9; + int GL_SAMPLE_COVERAGE_VALUE = 0x80AA; + int GL_SAMPLE_COVERAGE_INVERT = 0x80AB; + int GL_MULTISAMPLE_BIT = 0x20000000; + + int GL_TRANSPOSE_MODELVIEW_MATRIX = 0x84E3; + int GL_TRANSPOSE_PROJECTION_MATRIX = 0x84E4; + int GL_TRANSPOSE_TEXTURE_MATRIX = 0x84E5; + int GL_TRANSPOSE_COLOR_MATRIX = 0x84E6; + + int GL_COMBINE = 0x8570; + int GL_COMBINE_RGB = 0x8571; + int GL_COMBINE_ALPHA = 0x8572; + int GL_SOURCE0_RGB = 0x8580; + int GL_SOURCE1_RGB = 0x8581; + int GL_SOURCE2_RGB = 0x8582; + int GL_SOURCE0_ALPHA = 0x8588; + int GL_SOURCE1_ALPHA = 0x8589; + int GL_SOURCE2_ALPHA = 0x858A; + int GL_OPERAND0_RGB = 0x8590; + int GL_OPERAND1_RGB = 0x8591; + int GL_OPERAND2_RGB = 0x8592; + int GL_OPERAND0_ALPHA = 0x8598; + int GL_OPERAND1_ALPHA = 0x8599; + int GL_OPERAND2_ALPHA = 0x859A; + int GL_RGB_SCALE = 0x8573; + int GL_ADD_SIGNED = 0x8574; + int GL_INTERPOLATE = 0x8575; + int GL_SUBTRACT = 0x84E7; + int GL_CONSTANT = 0x8576; + int GL_PRIMARY_COLOR = 0x8577; + int GL_PREVIOUS = 0x8578; + int GL_DOT3_RGB = 0x86AE; + int GL_DOT3_RGBA = 0x86AF; + int GL_CLAMP_TO_BORDER = 0x812D; + + void glActiveTexture(@GLenum int texture); + + @Code("\t\tStateTracker.getReferences(caps).glClientActiveTexture = texture - GL_TEXTURE0;") + @DeprecatedGL + void glClientActiveTexture(@GLenum int texture); + + void glCompressedTexImage1D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + Buffer data); + + void glCompressedTexImage2D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glCompressedTexImage3D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glCompressedTexSubImage1D(@GLenum int target, int level, int xoffset, @GLsizei int width, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glCompressedTexSubImage2D(@GLenum int target, int level, int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glCompressedTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + // TODO: check buffer size valid + void glGetCompressedTexImage(@GLenum int target, int lod, + @OutParameter + @BufferObject(BufferKind.PackPBO) + @Check + @GLbyte + @GLshort + @GLint Buffer img); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord1f(@GLenum int target, float s); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord1d(@GLenum int target, double s); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord2f(@GLenum int target, float s, float t); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord2d(@GLenum int target, double s, double t); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord3f(@GLenum int target, float s, float t, float r); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord3d(@GLenum int target, double s, double t, double r); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord4f(@GLenum int target, float s, float t, float r, float q); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoord4d(@GLenum int target, double s, double t, double r, double q); + + @StripPostfix("m") + @DeprecatedGL + void glLoadTransposeMatrixf(@Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glLoadTransposeMatrixd(@Check("16") @Const DoubleBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMultTransposeMatrixf(@Check("16") @Const FloatBuffer m); + + @StripPostfix("m") + @DeprecatedGL + void glMultTransposeMatrixd(@Check("16") @Const DoubleBuffer m); + + void glSampleCoverage(float value, boolean invert); +} + diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL14.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL14.java new file mode 100644 index 0000000..bff2d29 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL14.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +/** + * <p/> + * The core OpenGL1.4 API. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @version $Revision$ + * $Id$ + */ +@DeprecatedGL +public interface GL14 { + int GL_GENERATE_MIPMAP = 0x8191; + int GL_GENERATE_MIPMAP_HINT = 0x8192; + int GL_DEPTH_COMPONENT16 = 0x81A5; + int GL_DEPTH_COMPONENT24 = 0x81A6; + int GL_DEPTH_COMPONENT32 = 0x81A7; + int GL_TEXTURE_DEPTH_SIZE = 0x884A; + int GL_DEPTH_TEXTURE_MODE = 0x884B; + int GL_TEXTURE_COMPARE_MODE = 0x884C; + int GL_TEXTURE_COMPARE_FUNC = 0x884D; + int GL_COMPARE_R_TO_TEXTURE = 0x884E; + int GL_FOG_COORDINATE_SOURCE = 0x8450; + int GL_FOG_COORDINATE = 0x8451; + int GL_FRAGMENT_DEPTH = 0x8452; + int GL_CURRENT_FOG_COORDINATE = 0x8453; + int GL_FOG_COORDINATE_ARRAY_TYPE = 0x8454; + int GL_FOG_COORDINATE_ARRAY_STRIDE = 0x8455; + int GL_FOG_COORDINATE_ARRAY_POINTER = 0x8456; + int GL_FOG_COORDINATE_ARRAY = 0x8457; + int GL_POINT_SIZE_MIN = 0x8126; + int GL_POINT_SIZE_MAX = 0x8127; + int GL_POINT_FADE_THRESHOLD_SIZE = 0x8128; + int GL_POINT_DISTANCE_ATTENUATION = 0x8129; + int GL_COLOR_SUM = 0x8458; + int GL_CURRENT_SECONDARY_COLOR = 0x8459; + int GL_SECONDARY_COLOR_ARRAY_SIZE = 0x845A; + int GL_SECONDARY_COLOR_ARRAY_TYPE = 0x845B; + int GL_SECONDARY_COLOR_ARRAY_STRIDE = 0x845C; + int GL_SECONDARY_COLOR_ARRAY_POINTER = 0x845D; + int GL_SECONDARY_COLOR_ARRAY = 0x845E; + int GL_BLEND_DST_RGB = 0x80C8; + int GL_BLEND_SRC_RGB = 0x80C9; + int GL_BLEND_DST_ALPHA = 0x80CA; + int GL_BLEND_SRC_ALPHA = 0x80CB; + int GL_INCR_WRAP = 0x8507; + int GL_DECR_WRAP = 0x8508; + int GL_TEXTURE_FILTER_CONTROL = 0x8500; + int GL_TEXTURE_LOD_BIAS = 0x8501; + int GL_MAX_TEXTURE_LOD_BIAS = 0x84FD; + int GL_MIRRORED_REPEAT = 0x8370; + + int GL_BLEND_COLOR = 0x8005; + int GL_BLEND_EQUATION = 0x8009; + + int GL_FUNC_ADD = 0x8006; + int GL_FUNC_SUBTRACT = 0x800A; + int GL_FUNC_REVERSE_SUBTRACT = 0x800B; + int GL_MIN = 0x8007; + int GL_MAX = 0x8008; + + void glBlendEquation(@GLenum int mode); + + void glBlendColor(float red, float green, float blue, float alpha); + + @DeprecatedGL + void glFogCoordf(float coord); + + @DeprecatedGL + void glFogCoordd(double coord); + + @DeprecatedGL + void glFogCoordPointer(@AutoType("data") @GLenum int type, @GLsizei int stride, + @CachedReference + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLfloat + @GLdouble Buffer data); + + void glMultiDrawArrays(@GLenum int mode, IntBuffer piFirst, @Check("piFirst.remaining()") @GLsizei IntBuffer piCount, @AutoSize("piFirst") @GLsizei int primcount); + + //void glMultiDrawElements(int mode, int piCount, int type, int pIndices, int primcount); + + void glPointParameteri(@GLenum int pname, int param); + + void glPointParameterf(@GLenum int pname, float param); + + @StripPostfix("params") + void glPointParameteriv(@GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glPointParameterfv(@GLenum int pname, @Check("4") @Const FloatBuffer params); + + @DeprecatedGL + void glSecondaryColor3b(byte red, byte green, byte blue); + + @DeprecatedGL + void glSecondaryColor3f(float red, float green, float blue); + + @DeprecatedGL + void glSecondaryColor3d(double red, double green, double blue); + + @DeprecatedGL + void glSecondaryColor3ub(@GLubyte byte red, @GLubyte byte green, @GLubyte byte blue); + + @DeprecatedGL + void glSecondaryColorPointer(int size, @AutoType("data") @GLenum int type, @GLsizei int stride, + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLfloat + @GLdouble Buffer data); + + void glBlendFuncSeparate(@GLenum int sfactorRGB, @GLenum int dfactorRGB, @GLenum int sfactorAlpha, @GLenum int dfactorAlpha); + + @DeprecatedGL + void glWindowPos2f(float x, float y); + + @DeprecatedGL + void glWindowPos2d(double x, double y); + + @DeprecatedGL + void glWindowPos2i(int x, int y); + + @DeprecatedGL + void glWindowPos3f(float x, float y, float z); + + @DeprecatedGL + void glWindowPos3d(double x, double y, double z); + + @DeprecatedGL + void glWindowPos3i(int x, int y, int z); +} + diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL15.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL15.java new file mode 100644 index 0000000..a7fe557 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL15.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface GL15 { + // ---------------------------------------------------------------------- + // ---------------------- ARB_vertex_buffer_object ---------------------- + // ---------------------------------------------------------------------- + + int GL_ARRAY_BUFFER = 0x8892; + int GL_ELEMENT_ARRAY_BUFFER = 0x8893; + int GL_ARRAY_BUFFER_BINDING = 0x8894; + int GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; + int GL_VERTEX_ARRAY_BUFFER_BINDING = 0x8896; + int GL_NORMAL_ARRAY_BUFFER_BINDING = 0x8897; + int GL_COLOR_ARRAY_BUFFER_BINDING = 0x8898; + int GL_INDEX_ARRAY_BUFFER_BINDING = 0x8899; + int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 0x889A; + int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 0x889B; + int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 0x889C; + int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 0x889D; + int GL_WEIGHT_ARRAY_BUFFER_BINDING = 0x889E; + int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + int GL_STREAM_DRAW = 0x88E0; + int GL_STREAM_READ = 0x88E1; + int GL_STREAM_COPY = 0x88E2; + int GL_STATIC_DRAW = 0x88E4; + int GL_STATIC_READ = 0x88E5; + int GL_STATIC_COPY = 0x88E6; + int GL_DYNAMIC_DRAW = 0x88E8; + int GL_DYNAMIC_READ = 0x88E9; + int GL_DYNAMIC_COPY = 0x88EA; + int GL_READ_ONLY = 0x88B8; + int GL_WRITE_ONLY = 0x88B9; + int GL_READ_WRITE = 0x88BA; + int GL_BUFFER_SIZE = 0x8764; + int GL_BUFFER_USAGE = 0x8765; + int GL_BUFFER_ACCESS = 0x88BB; + int GL_BUFFER_MAPPED = 0x88BC; + int GL_BUFFER_MAP_POINTER = 0x88BD; + + int GL_FOG_COORD_SRC = GL14.GL_FOG_COORDINATE_SOURCE; + int GL_FOG_COORD = GL14.GL_FOG_COORDINATE; + int GL_CURRENT_FOG_COORD = GL14.GL_CURRENT_FOG_COORDINATE; + int GL_FOG_COORD_ARRAY_TYPE = GL14.GL_FOG_COORDINATE_ARRAY_TYPE; + int GL_FOG_COORD_ARRAY_STRIDE = GL14.GL_FOG_COORDINATE_ARRAY_STRIDE; + int GL_FOG_COORD_ARRAY_POINTER = GL14.GL_FOG_COORDINATE_ARRAY_POINTER; + int GL_FOG_COORD_ARRAY = GL14.GL_FOG_COORDINATE_ARRAY; + int GL_FOG_COORD_ARRAY_BUFFER_BINDING = GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING; + int GL_SRC0_RGB = GL13.GL_SOURCE0_RGB; + int GL_SRC1_RGB = GL13.GL_SOURCE1_RGB; + int GL_SRC2_RGB = GL13.GL_SOURCE2_RGB; + int GL_SRC0_ALPHA = GL13.GL_SOURCE0_ALPHA; + int GL_SRC1_ALPHA = GL13.GL_SOURCE1_ALPHA; + int GL_SRC2_ALPHA = GL13.GL_SOURCE2_ALPHA; + + @Code(" StateTracker.bindBuffer(caps, target, buffer);") + void glBindBuffer(@GLenum int target, @GLuint int buffer); + + void glDeleteBuffers(@AutoSize("buffers") @GLsizei int n, @Const @GLuint IntBuffer buffers); + + @Alternate("glDeleteBuffers") + void glDeleteBuffers(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, buffer)", keepParam = true) int buffer); + + void glGenBuffers(@AutoSize("buffers") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + @Alternate("glGenBuffers") + @GLreturn("buffers") + void glGenBuffers2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + boolean glIsBuffer(@GLuint int buffer); + + @GenerateAutos + void glBufferData(@GLenum int target, @AutoSize("data") @GLsizeiptr long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data, @GLenum int usage); + + void glBufferSubData(@GLenum int target, @GLintptr long offset, @AutoSize("data") @GLsizeiptr long size, + @Check + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + void glGetBufferSubData(@GLenum int target, @GLintptr long offset, @AutoSize("data") @GLsizeiptr long size, + @OutParameter + @Check + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + /** + * glMapBuffer maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBuffer(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBuffer(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult + @GLvoid + @AutoSize("GLChecks.getBufferObjectSize(caps, target)") + ByteBuffer glMapBuffer(@GLenum int target, @GLenum int access); + + boolean glUnmapBuffer(@GLenum int target); + + @StripPostfix("params") + void glGetBufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri} instead. */ + @Alternate("glGetBufferParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL15", method = "glGetBufferParameteri") + @Deprecated + void glGetBufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetBufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameteriv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("pointer") + @AutoSize("GLChecks.getBufferObjectSize(caps, target)") + void glGetBufferPointerv(@GLenum int target, @GLenum int pname, @OutParameter @Result @GLvoid ByteBuffer pointer); + + // ----------------------------------------------------------------- + // ---------------------- ARB_occlusion_query ---------------------- + // ----------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + int GL_SAMPLES_PASSED = 0x8914; + + /** Accepted by the &lt;pname&gt; parameter of GetQueryiv: */ + int GL_QUERY_COUNTER_BITS = 0x8864; + int GL_CURRENT_QUERY = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv and + * GetQueryObjectuiv: + */ + int GL_QUERY_RESULT = 0x8866; + int GL_QUERY_RESULT_AVAILABLE = 0x8867; + + void glGenQueries(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenQueries") + @GLreturn("ids") + void glGenQueries2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + void glDeleteQueries(@AutoSize("ids") @GLsizei int n, @GLuint IntBuffer ids); + + @Alternate("glDeleteQueries") + void glDeleteQueries(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, id)", keepParam = true) int id); + + boolean glIsQuery(@GLuint int id); + + void glBeginQuery(@GLenum int target, @GLuint int id); + + void glEndQuery(@GLenum int target); + + @StripPostfix("params") + void glGetQueryiv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetQueryi} instead. */ + @Alternate("glGetQueryiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL15", method = "glGetQueryi") + @Deprecated + void glGetQueryiv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetQueryiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryiv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectiv(@GLenum int id, @GLenum int pname, @OutParameter @Check("1") @GLint IntBuffer params); + + @Alternate("glGetQueryObjectiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectiv2(@GLenum int id, @GLenum int pname, @OutParameter @GLint IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectuiv(@GLenum int id, @GLenum int pname, @OutParameter @Check("1") @GLuint IntBuffer params); + + @Alternate("glGetQueryObjectuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectuiv2(@GLenum int id, @GLenum int pname, @OutParameter @GLuint IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL20.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL20.java new file mode 100644 index 0000000..194c02f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL20.java @@ -0,0 +1,596 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface GL20 { + // ------------------------------------------------------------------ + // -------------------[ ARB_shading_language_100 ]------------------- + // ------------------------------------------------------------------ + + /** Accepted by the &lt;name&gt; parameter of GetString: */ + int GL_SHADING_LANGUAGE_VERSION = 0x8B8C; + + // ------------------------------------------------------------------ + // ----------------------[ ARB_shader_objects ]---------------------- + // ------------------------------------------------------------------ + + /** Accepted by the &lt;pname&gt; argument of GetInteger: */ + int GL_CURRENT_PROGRAM = 0x8B8D; + + /** Accepted by the &lt;pname&gt; parameter of GetObjectParameter{fi}vARB: */ + int GL_SHADER_TYPE = 0x8B4F; + int GL_DELETE_STATUS = 0x8B80; + int GL_COMPILE_STATUS = 0x8B81; + int GL_LINK_STATUS = 0x8B82; + int GL_VALIDATE_STATUS = 0x8B83; + int GL_INFO_LOG_LENGTH = 0x8B84; + int GL_ATTACHED_SHADERS = 0x8B85; + int GL_ACTIVE_UNIFORMS = 0x8B86; + int GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87; + int GL_ACTIVE_ATTRIBUTES = 0x8B89; + int GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A; + int GL_SHADER_SOURCE_LENGTH = 0x8B88; + + /** Returned by the &lt;params&gt; parameter of GetObjectParameter{fi}vARB: */ + int GL_SHADER_OBJECT = 0x8B48; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniformARB: */ + int GL_FLOAT_VEC2 = 0x8B50; + int GL_FLOAT_VEC3 = 0x8B51; + int GL_FLOAT_VEC4 = 0x8B52; + int GL_INT_VEC2 = 0x8B53; + int GL_INT_VEC3 = 0x8B54; + int GL_INT_VEC4 = 0x8B55; + int GL_BOOL = 0x8B56; + int GL_BOOL_VEC2 = 0x8B57; + int GL_BOOL_VEC3 = 0x8B58; + int GL_BOOL_VEC4 = 0x8B59; + int GL_FLOAT_MAT2 = 0x8B5A; + int GL_FLOAT_MAT3 = 0x8B5B; + int GL_FLOAT_MAT4 = 0x8B5C; + int GL_SAMPLER_1D = 0x8B5D; + int GL_SAMPLER_2D = 0x8B5E; + int GL_SAMPLER_3D = 0x8B5F; + int GL_SAMPLER_CUBE = 0x8B60; + int GL_SAMPLER_1D_SHADOW = 0x8B61; + int GL_SAMPLER_2D_SHADOW = 0x8B62; + + /** + * The ARB_shader_objects extension allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + * + * @param shader + * @param string + */ + void glShaderSource(@GLuint int shader, @Constant("1") @GLsizei int count, + @Indirect @Const @GLchar @Check ByteBuffer string, + @AutoSize("string") @Indirect @Const @GLint int length); + + @Alternate("glShaderSource") + void glShaderSource2(@GLuint int shader, @Constant("1") @GLsizei int count, CharSequence string, @Constant("string.length()") @Indirect @Const int length); + + @Alternate(value = "glShaderSource", nativeAlt = true) + void glShaderSource3(@GLuint int shader, @Constant("strings.length") @GLsizei int count, + @Const @PointerArray(value = "count", lengths = "length") CharSequence[] strings, + @Constant("APIUtil.getLengths(caps, strings)") @Const IntBuffer length); + + int glCreateShader(@GLuint int type); + + boolean glIsShader(@GLuint int shader); + + void glCompileShader(@GLuint int shader); + + void glDeleteShader(@GLuint int shader); + + int glCreateProgram(); + + boolean glIsProgram(int program); + + void glAttachShader(@GLuint int program, @GLuint int shader); + + void glDetachShader(@GLuint int program, @GLuint int shader); + + void glLinkProgram(@GLuint int program); + + void glUseProgram(@GLuint int program); + + void glValidateProgram(@GLuint int program); + + void glDeleteProgram(@GLuint int program); + + void glUniform1f(int location, float v0); + + void glUniform2f(int location, float v0, float v1); + + void glUniform3f(int location, float v0, float v1, float v2); + + void glUniform4f(int location, float v0, float v1, float v2, float v3); + + void glUniform1i(int location, int v0); + + void glUniform2i(int location, int v0, int v1); + + void glUniform3i(int location, int v0, int v1, int v2); + + void glUniform4i(int location, int v0, int v1, int v2, int v3); + + @StripPostfix("values") + void glUniform1fv(int location, @AutoSize("values") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform2fv(int location, @AutoSize(value = "values", expression = " >> 1") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform3fv(int location, @AutoSize(value = "values", expression = " / 3") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform4fv(int location, @AutoSize(value = "values", expression = " >> 2") @GLsizei int count, @Const FloatBuffer values); + + @StripPostfix("values") + void glUniform1iv(int location, @AutoSize("values") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform2iv(int location, @AutoSize(value = "values", expression = " >> 1") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform3iv(int location, @AutoSize(value = "values", expression = " / 3") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("values") + void glUniform4iv(int location, @AutoSize(value = "values", expression = " >> 2") @GLsizei int count, @Const IntBuffer values); + + @StripPostfix("matrices") + void glUniformMatrix2fv(int location, @AutoSize(value = "matrices", expression = " >> 2") @GLsizei int count, + boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 3)") @GLsizei int count, + boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4fv(int location, @AutoSize(value = "matrices", expression = " >> 4") @GLsizei int count, + boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("params") + void glGetShaderiv(@GLuint int shader, @GLenum int pname, @OutParameter @Check IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetShaderi} instead. */ + @Alternate("glGetShaderiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL20", method = "glGetShaderi") + @Deprecated + void glGetShaderiv2(@GLuint int shader, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetShaderiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetShaderiv3(@GLuint int shader, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetProgramiv(@GLuint int program, @GLenum int pname, @OutParameter @Check IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetProgrami} instead. */ + @Alternate("glGetProgramiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL20", method = "glGetProgrami") + @Deprecated + void glGetProgramiv2(@GLuint int program, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetProgramiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramiv3(@GLuint int program, @GLenum int pname, @OutParameter IntBuffer params); + + void glGetShaderInfoLog(@GLuint int shader, @AutoSize("infoLog") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetShaderInfoLog") + @GLreturn(value = "infoLog", maxLength = "maxLength") + void glGetShaderInfoLog2(@GLuint int shader, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + void glGetProgramInfoLog(@GLuint int program, @AutoSize("infoLog") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetProgramInfoLog") + @GLreturn(value = "infoLog", maxLength = "maxLength") + void glGetProgramInfoLog2(@GLuint int program, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + void glGetAttachedShaders(@GLuint int program, @AutoSize("shaders") @GLsizei int maxCount, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer count, + @OutParameter @GLuint IntBuffer shaders); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a + * <b>null-terminated</b> string. + * + * @param program + * @param name + */ + int glGetUniformLocation(@GLuint int program, @NullTerminated @Check("1") @Const @GLchar ByteBuffer name); + + @Alternate("glGetUniformLocation") + int glGetUniformLocation(@GLuint int program, @NullTerminated CharSequence name); + + void glGetActiveUniform(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveUniform") + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveUniform2(@GLuint int program, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns only the uniform name. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveUniform(@GLuint int program, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns only the uniform size. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveUniformSize(@GLuint int program, @GLuint int index, @Constant("1") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns only the uniform type. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveUniformType(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + @StripPostfix("params") + void glGetUniformfv(@GLuint int program, int location, @OutParameter @Check FloatBuffer params); + + @StripPostfix("params") + void glGetUniformiv(@GLuint int program, int location, @OutParameter @Check IntBuffer params); + + void glGetShaderSource(@GLuint int shader, @AutoSize("source") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer source); + + @Alternate("glGetShaderSource") + @GLreturn(value = "source", maxLength = "maxLength") + void glGetShaderSource2(@GLuint int shader, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(source_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer source); + + // ------------------------------------------------------------------ + // ----------------------[ ARB_vertex_program ]---------------------- + // ------------------------------------------------------------------ + + @NoErrorCheck + void glVertexAttrib1s(@GLuint int index, short x); + + @NoErrorCheck + void glVertexAttrib1f(@GLuint int index, float x); + + @NoErrorCheck + void glVertexAttrib1d(@GLuint int index, double x); + + @NoErrorCheck + void glVertexAttrib2s(@GLuint int index, short x, short y); + + @NoErrorCheck + void glVertexAttrib2f(@GLuint int index, float x, float y); + + @NoErrorCheck + void glVertexAttrib2d(@GLuint int index, double x, double y); + + @NoErrorCheck + void glVertexAttrib3s(@GLuint int index, short x, short y, short z); + + @NoErrorCheck + void glVertexAttrib3f(@GLuint int index, float x, float y, float z); + + @NoErrorCheck + void glVertexAttrib3d(@GLuint int index, double x, double y, double z); + + @NoErrorCheck + void glVertexAttrib4s(@GLuint int index, short x, short y, short z, short w); + + @NoErrorCheck + void glVertexAttrib4f(@GLuint int index, float x, float y, float z, float w); + + @NoErrorCheck + void glVertexAttrib4d(@GLuint int index, double x, double y, double z, double w); + + @NoErrorCheck + void glVertexAttrib4Nub(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); + + void glVertexAttribPointer(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLubyte + @GLbyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer buffer); + + @Alternate("glVertexAttribPointer") + void glVertexAttribPointer(@GLuint int index, int size, @GLenum int type, boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const ByteBuffer buffer); + + void glEnableVertexAttribArray(@GLuint int index); + + void glDisableVertexAttribArray(@GLuint int index); + + @StripPostfix("params") + void glGetVertexAttribfv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVertexAttribdv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetVertexAttribiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("pointer") + void glGetVertexAttribPointerv(@GLuint int index, @GLenum int pname, @Result @GLvoid ByteBuffer pointer); + + @Alternate(value = "glGetVertexAttribPointerv", nativeAlt = true) + @StripPostfix("pointer") + void glGetVertexAttribPointerv2(@GLuint int index, @GLenum int pname, @OutParameter @Check("PointerBuffer.getPointerSize()") @GLvoid ByteBuffer pointer); + + // ----------------------------------------------------------------- + // ----------------------[ ARB_vertex_shader ]---------------------- + // ----------------------------------------------------------------- + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShader and + * returned by the &lt;params&gt; parameter of GetShader{if}v: + */ + int GL_VERTEX_SHADER = 0x8B31; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A; + int GL_MAX_VARYING_FLOATS = 0x8B4B; + int GL_MAX_VERTEX_ATTRIBS = 0x8869; + int GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872; + int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C; + int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D; + int GL_MAX_TEXTURE_COORDS = 0x8871; + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_VERTEX_PROGRAM_POINT_SIZE = 0x8642; + int GL_VERTEX_PROGRAM_TWO_SIDE = 0x8643; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttrib{dfi}vARB: */ + int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622; + int GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623; + int GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624; + int GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625; + int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A; + int GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervARB: */ + int GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + + void glBindAttribLocation(@GLuint int program, @GLuint int index, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glBindAttribLocation") + void glBindAttribLocation(@GLuint int program, @GLuint int index, @NullTerminated CharSequence name); + + void glGetActiveAttrib(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int maxLength, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveAttrib") + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveAttrib2(@GLuint int program, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns only the attrib name. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "name", maxLength = "maxLength") + void glGetActiveAttrib(@GLuint int program, @GLuint int index, @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttribARB. This version returns only the attrib size. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveAttribSize(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns only the attrib type. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveAttribType(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int maxLength, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + int glGetAttribLocation(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetAttribLocation") + int glGetAttribLocation(@GLuint int program, @NullTerminated CharSequence name); + + // ------------------------------------------------------------------- + // ----------------------[ ARB_fragment_shader ]---------------------- + // ------------------------------------------------------------------- + + /** + * Accepted by the &lt;shaderType&gt; argument of CreateShader and + * returned by the &lt;params&gt; parameter of GetShader{fi}vARB: + */ + int GL_FRAGMENT_SHADER = 0x8B30; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + + /** + * Accepted by the &lt;target&gt; parameter of Hint and the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + + // ---------------------------------------------------------------- + // ----------------------[ ARB_draw_buffers ]---------------------- + // ---------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_DRAW_BUFFERS = 0x8824; + int GL_DRAW_BUFFER0 = 0x8825; + int GL_DRAW_BUFFER1 = 0x8826; + int GL_DRAW_BUFFER2 = 0x8827; + int GL_DRAW_BUFFER3 = 0x8828; + int GL_DRAW_BUFFER4 = 0x8829; + int GL_DRAW_BUFFER5 = 0x882A; + int GL_DRAW_BUFFER6 = 0x882B; + int GL_DRAW_BUFFER7 = 0x882C; + int GL_DRAW_BUFFER8 = 0x882D; + int GL_DRAW_BUFFER9 = 0x882E; + int GL_DRAW_BUFFER10 = 0x882F; + int GL_DRAW_BUFFER11 = 0x8830; + int GL_DRAW_BUFFER12 = 0x8831; + int GL_DRAW_BUFFER13 = 0x8832; + int GL_DRAW_BUFFER14 = 0x8833; + int GL_DRAW_BUFFER15 = 0x8834; + + void glDrawBuffers(@AutoSize("buffers") @GLsizei int size, @Const @GLenum IntBuffer buffers); + + @Alternate("glDrawBuffers") + void glDrawBuffers(@Constant("1") @GLsizei int size, @Constant(value = "APIUtil.getInt(caps, buffer)", keepParam = true) int buffer); + + // ---------------------------------------------------------------- + // ----------------------[ ARB_point_sprite ]---------------------- + // ---------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev, and by the &lt;target&gt; parameter of TexEnvi, TexEnviv, + * TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv: + */ + int GL_POINT_SPRITE = 0x8861; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, or GetTexEnviv is POINT_SPRITE, then the value of + * &lt;pname&gt; may be: + */ + int GL_COORD_REPLACE = 0x8862; + + /** + * Accepted by the &lt;pname&gt; parameter of PointParameter{if}vARB, and the + * &lt;pname&gt; of Get: + */ + int GL_POINT_SPRITE_COORD_ORIGIN = 0x8CA0; + + /** Accepted by the &lt;param&gt; parameter of PointParameter{if}vARB: */ + int GL_LOWER_LEFT = 0x8CA1; + int GL_UPPER_LEFT = 0x8CA2; + + // ----------------------------------------------------------------- + // ----------------------[ Two-Sided Stencil ]---------------------- + // ----------------------------------------------------------------- + + int GL_STENCIL_BACK_FUNC = 0x8800; + int GL_STENCIL_BACK_FAIL = 0x8801; + int GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802; + int GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803; + int GL_STENCIL_BACK_REF = 0x8CA3; + int GL_STENCIL_BACK_VALUE_MASK = 0x8CA4; + int GL_STENCIL_BACK_WRITEMASK = 0x8CA5; + + void glStencilOpSeparate(@GLenum int face, @GLenum int sfail, @GLenum int dpfail, @GLenum int dppass); + + void glStencilFuncSeparate(@GLenum int face, @GLenum int func, int ref, @GLuint int mask); + + void glStencilMaskSeparate(@GLenum int face, @GLuint int mask); + + // ------------------------------------------------------------- + // ----------------------[ EXT_blend_equation_separate ]---------------------- + // ------------------------------------------------------------- + + int GL_BLEND_EQUATION_RGB = 0x8009; + int GL_BLEND_EQUATION_ALPHA = 0x883D; + + void glBlendEquationSeparate(@GLenum int modeRGB, @GLenum int modeAlpha); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL21.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL21.java new file mode 100644 index 0000000..4da8e1a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL21.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.StripPostfix; + +import java.nio.FloatBuffer; + +public interface GL21 { + + // ------------------------------------------------------------------ + // --------------------------[ GLSL 1.20 ]--------------------------- + // ------------------------------------------------------------------ + + /** Returned by the &lt;type&gt; parameter of GetActiveAttribARB. */ + int GL_FLOAT_MAT2x3 = 0x8B65; + int GL_FLOAT_MAT2x4 = 0x8B66; + int GL_FLOAT_MAT3x2 = 0x8B67; + int GL_FLOAT_MAT3x4 = 0x8B68; + int GL_FLOAT_MAT4x2 = 0x8B69; + int GL_FLOAT_MAT4x3 = 0x8B6A; + + @StripPostfix("matrices") + void glUniformMatrix2x3fv(int location, @AutoSize(value = "matrices", expression = " / (2 * 3)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3x2fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 2)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix2x4fv(int location, @AutoSize(value = "matrices", expression = " >> 3") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4x2fv(int location, @AutoSize(value = "matrices", expression = " >> 3") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3x4fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 4)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4x3fv(int location, @AutoSize(value = "matrices", expression = " / (4 * 3)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + // ------------------------------------------------------------------ + // -------------------[ ARB_pixel_buffer_object ]-------------------- + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferParameteriv, and GetBufferPointerv. + */ + int GL_PIXEL_PACK_BUFFER = 0x88EB; + int GL_PIXEL_UNPACK_BUFFER = 0x88EC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + int GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED; + int GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + + // ------------------------------------------------------------------ + // ----------------------[ EXT_texture_sRGB ]------------------------ + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D. + */ + int GL_SRGB = 0x8C40; + int GL_SRGB8 = 0x8C41; + int GL_SRGB_ALPHA = 0x8C42; + int GL_SRGB8_ALPHA8 = 0x8C43; + int GL_SLUMINANCE_ALPHA = 0x8C44; + int GL_SLUMINANCE8_ALPHA8 = 0x8C45; + int GL_SLUMINANCE = 0x8C46; + int GL_SLUMINANCE8 = 0x8C47; + int GL_COMPRESSED_SRGB = 0x8C48; + int GL_COMPRESSED_SRGB_ALPHA = 0x8C49; + int GL_COMPRESSED_SLUMINANCE = 0x8C4A; + int GL_COMPRESSED_SLUMINANCE_ALPHA = 0x8C4B; + + // ------------------------------------------------------------------ + // -----------------------[ Misc additions ]------------------------- + // ------------------------------------------------------------------ + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv and GetFloatv. */ + int GL_CURRENT_RASTER_SECONDARY_COLOR = 0x845F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL30.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL30.java new file mode 100644 index 0000000..cb306de --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL30.java @@ -0,0 +1,1059 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface GL30 { + + // ---------------------------------------------------------- + // ----------------------[ OpenGL 3.0 ]---------------------- + // ---------------------------------------------------------- + + int GL_MAJOR_VERSION = 0x821B; + int GL_MINOR_VERSION = 0x821C; + int GL_NUM_EXTENSIONS = 0x821D; + + int GL_CONTEXT_FLAGS = 0x821E; + int GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x0001; + + int GL_DEPTH_BUFFER = 0x8223; + int GL_STENCIL_BUFFER = 0x8224; + + int GL_COMPRESSED_RED = 0x8225; + int GL_COMPRESSED_RG = 0x8226; + + int GL_COMPARE_REF_TO_TEXTURE = ARB_shadow.GL_COMPARE_R_TO_TEXTURE_ARB; + + int GL_CLIP_DISTANCE0 = GL11.GL_CLIP_PLANE0; + int GL_CLIP_DISTANCE1 = GL11.GL_CLIP_PLANE1; + int GL_CLIP_DISTANCE2 = GL11.GL_CLIP_PLANE2; + int GL_CLIP_DISTANCE3 = GL11.GL_CLIP_PLANE3; + int GL_CLIP_DISTANCE4 = GL11.GL_CLIP_PLANE4; + int GL_CLIP_DISTANCE5 = GL11.GL_CLIP_PLANE5; + int GL_CLIP_DISTANCE6 = 0x3006; + int GL_CLIP_DISTANCE7 = 0x3007; + + int GL_MAX_CLIP_DISTANCES = GL11.GL_MAX_CLIP_PLANES; + + int GL_MAX_VARYING_COMPONENTS = GL20.GL_MAX_VARYING_FLOATS; + + int GL_BUFFER_ACCESS_FLAGS = 0x911F; + int GL_BUFFER_MAP_LENGTH = 0x9120; + int GL_BUFFER_MAP_OFFSET = 0x9121; + + String glGetStringi(@GLenum int name, @GLuint int index); + + @StripPostfix("value") + void glClearBufferfv(@GLenum int buffer, int drawbuffer, @Const @Check("4") FloatBuffer value); + + @StripPostfix("value") + void glClearBufferiv(@GLenum int buffer, int drawbuffer, @Const @Check("4") IntBuffer value); + + @StripPostfix("value") + void glClearBufferuiv(@GLenum int buffer, int drawbuffer, @Const @Check("4") IntBuffer value); + + void glClearBufferfi(@GLenum int buffer, int drawbuffer, float depth, int stencil); + + // --------------------------------------------------------------- + // ----------------------[ EXT_gpu_shader4 ]---------------------- + // --------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, GetVertexAttribiv, GetVertexAttribIiv, and + * GetVertexAttribIuiv: + */ + int GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + + int GL_SAMPLER_BUFFER = 0x8DC2; + int GL_SAMPLER_CUBE_SHADOW = 0x8DC5; + int GL_UNSIGNED_INT_VEC2 = 0x8DC6; + int GL_UNSIGNED_INT_VEC3 = 0x8DC7; + int GL_UNSIGNED_INT_VEC4 = 0x8DC8; + int GL_INT_SAMPLER_1D = 0x8DC9; + int GL_INT_SAMPLER_2D = 0x8DCA; + int GL_INT_SAMPLER_3D = 0x8DCB; + int GL_INT_SAMPLER_CUBE = 0x8DCC; + int GL_INT_SAMPLER_2D_RECT = 0x8DCD; + int GL_INT_SAMPLER_1D_ARRAY = 0x8DCE; + int GL_INT_SAMPLER_2D_ARRAY = 0x8DCF; + int GL_INT_SAMPLER_BUFFER = 0x8DD0; + + int GL_UNSIGNED_INT_SAMPLER_1D = 0x8DD1; + int GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2; + int GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3; + int GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4; + int GL_UNSIGNED_INT_SAMPLER_2D_RECT = 0x8DD5; + int GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = 0x8DD6; + int GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + int GL_UNSIGNED_INT_SAMPLER_BUFFER = 0x8DD8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904; + int GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + + @NoErrorCheck + void glVertexAttribI1i(@GLuint int index, int x); + + @NoErrorCheck + void glVertexAttribI2i(@GLuint int index, int x, int y); + + @NoErrorCheck + void glVertexAttribI3i(@GLuint int index, int x, int y, int z); + + @NoErrorCheck + void glVertexAttribI4i(@GLuint int index, int x, int y, int z, int w); + + @NoErrorCheck + void glVertexAttribI1ui(@GLuint int index, @GLuint int x); + + @NoErrorCheck + void glVertexAttribI2ui(@GLuint int index, @GLuint int x, @GLuint int y); + + @NoErrorCheck + void glVertexAttribI3ui(@GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z); + + @NoErrorCheck + void glVertexAttribI4ui(@GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI1iv(@GLuint int index, @Check("1") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI2iv(@GLuint int index, @Check("2") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI3iv(@GLuint int index, @Check("3") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4iv(@GLuint int index, @Check("4") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI1uiv(@GLuint int index, @Check("1") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI2uiv(@GLuint int index, @Check("2") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI3uiv(@GLuint int index, @Check("3") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4uiv(@GLuint int index, @Check("4") @Const @GLuint IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4bv(@GLuint int index, @Check("4") @Const ByteBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4sv(@GLuint int index, @Check("4") @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4ubv(@GLuint int index, @Check("4") @Const @GLubyte ByteBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4usv(@GLuint int index, @Check("4") @Const @GLushort ShortBuffer v); + + void glVertexAttribIPointer(@GLuint int index, int size, @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint Buffer buffer); + + @StripPostfix("params") + void glGetVertexAttribIiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetVertexAttribIuiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") @GLuint IntBuffer params); + + void glUniform1ui(int location, @GLuint int v0); + + void glUniform2ui(int location, @GLuint int v0, @GLuint int v1); + + void glUniform3ui(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2); + + void glUniform4ui(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2, @GLuint int v3); + + @StripPostfix("value") + void glUniform1uiv(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform2uiv(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform3uiv(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform4uiv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("params") + void glGetUniformuiv(@GLuint int program, int location, @OutParameter @Check @GLuint IntBuffer params); + + void glBindFragDataLocation(@GLuint int program, @GLuint int colorNumber, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glBindFragDataLocation") + void glBindFragDataLocation(@GLuint int program, @GLuint int colorNumber, @NullTerminated CharSequence name); + + int glGetFragDataLocation(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetFragDataLocation") + int glGetFragDataLocation(@GLuint int program, @NullTerminated CharSequence name); + + // --------------------------------------------------------------------- + // ----------------------[ NV_conditional_render ]---------------------- + // --------------------------------------------------------------------- + + /** Accepted by the &lt;mode&gt; parameter of BeginConditionalRender: */ + int GL_QUERY_WAIT = 0x8E13; + int GL_QUERY_NO_WAIT = 0x8E14; + int GL_QUERY_BY_REGION_WAIT = 0x8E15; + int GL_QUERY_BY_REGION_NO_WAIT = 0x8E16; + + void glBeginConditionalRender(@GLuint int id, @GLenum int mode); + + void glEndConditionalRender(); + + // -------------------------------------------------------------------- + // ----------------------[ ARB_map_buffer_range ]---------------------- + // -------------------------------------------------------------------- + + /** Accepted by the &lt;access&gt; parameter of MapBufferRange: */ + int GL_MAP_READ_BIT = 0x0001; + int GL_MAP_WRITE_BIT = 0x0002; + int GL_MAP_INVALIDATE_RANGE_BIT = 0x0004; + int GL_MAP_INVALIDATE_BUFFER_BIT = 0x0008; + int GL_MAP_FLUSH_EXPLICIT_BIT = 0x0010; + int GL_MAP_UNSYNCHRONIZED_BIT = 0x0020; + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length, @GLbitfield int access); + + void glFlushMappedBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length); + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_color_buffer_float ]---------------------- + // ---------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of ClampColor and the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + int GL_CLAMP_VERTEX_COLOR = 0x891A; + int GL_CLAMP_FRAGMENT_COLOR = 0x891B; + int GL_CLAMP_READ_COLOR = 0x891C; + + /** Accepted by the &lt;clamp&gt; parameter of ClampColor. */ + int GL_FIXED_ONLY = 0x891D; + + void glClampColor(@GLenum int target, @GLenum int clamp); + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_depth_buffer_float ]---------------------- + // ---------------------------------------------------------------------- + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + int GL_DEPTH_COMPONENT32F = 0x8CAC; + int GL_DEPTH32F_STENCIL8 = 0x8CAD; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + + // ----------------------------------------------------------------- + // ----------------------[ ARB_texture_float ]---------------------- + // ----------------------------------------------------------------- + + /** Accepted by the &lt;value&gt; parameter of GetTexLevelParameter: */ + int GL_TEXTURE_RED_TYPE = 0x8C10; + int GL_TEXTURE_GREEN_TYPE = 0x8C11; + int GL_TEXTURE_BLUE_TYPE = 0x8C12; + int GL_TEXTURE_ALPHA_TYPE = 0x8C13; + int GL_TEXTURE_LUMINANCE_TYPE = 0x8C14; + int GL_TEXTURE_INTENSITY_TYPE = 0x8C15; + int GL_TEXTURE_DEPTH_TYPE = 0x8C16; + + /** Returned by the &lt;params&gt; parameter of GetTexLevelParameter: */ + int GL_UNSIGNED_NORMALIZED = 0x8C17; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA32F = 0x8814; + int GL_RGB32F = 0x8815; + int GL_ALPHA32F = 0x8816; + int GL_RGBA16F = 0x881A; + int GL_RGB16F = 0x881B; + int GL_ALPHA16F = 0x881C; + + // ---------------------------------------------------------------- + // ----------------------[ EXT_packed_float ]---------------------- + // ---------------------------------------------------------------- + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + int GL_R11F_G11F_B10F = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + int GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + + // --------------------------------------------------------------------------- + // ----------------------[ EXT_texture_shared_exponent ]---------------------- + // --------------------------------------------------------------------------- + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + int GL_RGB9_E5 = 0x8C3D; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D, + * GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter, + * ColorTable, ColorSubTable, and GetColorTable: + */ + int GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + int GL_TEXTURE_SHARED_SIZE = 0x8C3F; + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_framebuffer_object ]---------------------- + // ---------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture{1D|2D|3D}, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + int GL_FRAMEBUFFER = 0x8D40; + int GL_READ_FRAMEBUFFER = 0x8CA8; + int GL_DRAW_FRAMEBUFFER = 0x8CA9; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbuffer, + * RenderbufferStorage, and GetRenderbufferParameteriv, and + * returned by GetFramebufferAttachmentParameteriv: + */ + int GL_RENDERBUFFER = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorage: + */ + int GL_STENCIL_INDEX1 = 0x8D46; + int GL_STENCIL_INDEX4 = 0x8D47; + int GL_STENCIL_INDEX8 = 0x8D48; + int GL_STENCIL_INDEX16 = 0x8D49; + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_WIDTH = 0x8D42; + int GL_RENDERBUFFER_HEIGHT = 0x8D43; + int GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44; + int GL_RENDERBUFFER_RED_SIZE = 0x8D50; + int GL_RENDERBUFFER_GREEN_SIZE = 0x8D51; + int GL_RENDERBUFFER_BLUE_SIZE = 0x8D52; + int GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53; + int GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54; + int GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0; + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3; + int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; + int GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; + int GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; + int GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; + int GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; + int GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; + int GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + + /** Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: */ + int GL_FRAMEBUFFER_DEFAULT = 0x8218; + int GL_INDEX = 0x8222; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{1D|2D|3D}, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv + */ + int GL_COLOR_ATTACHMENT0 = 0x8CE0; + int GL_COLOR_ATTACHMENT1 = 0x8CE1; + int GL_COLOR_ATTACHMENT2 = 0x8CE2; + int GL_COLOR_ATTACHMENT3 = 0x8CE3; + int GL_COLOR_ATTACHMENT4 = 0x8CE4; + int GL_COLOR_ATTACHMENT5 = 0x8CE5; + int GL_COLOR_ATTACHMENT6 = 0x8CE6; + int GL_COLOR_ATTACHMENT7 = 0x8CE7; + int GL_COLOR_ATTACHMENT8 = 0x8CE8; + int GL_COLOR_ATTACHMENT9 = 0x8CE9; + int GL_COLOR_ATTACHMENT10 = 0x8CEA; + int GL_COLOR_ATTACHMENT11 = 0x8CEB; + int GL_COLOR_ATTACHMENT12 = 0x8CEC; + int GL_COLOR_ATTACHMENT13 = 0x8CED; + int GL_COLOR_ATTACHMENT14 = 0x8CEE; + int GL_COLOR_ATTACHMENT15 = 0x8CEF; + int GL_DEPTH_ATTACHMENT = 0x8D00; + int GL_STENCIL_ATTACHMENT = 0x8D20; + int GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + + /** Returned by CheckFramebufferStatus(): */ + int GL_FRAMEBUFFER_COMPLETE = 0x8CD5; + int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6; + int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7; + int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0x8CDB; + int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0x8CDC; + int GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD; + int GL_FRAMEBUFFER_UNDEFINED = 0x8219; + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAMEBUFFER_BINDING = 0x8CA6; // alias DRAW_FRAMEBUFFER_BINDING + int GL_RENDERBUFFER_BINDING = 0x8CA7; + int GL_MAX_COLOR_ATTACHMENTS = 0x8CDF; + int GL_MAX_RENDERBUFFER_SIZE = 0x84E8; + + /** Returned by GetError(): */ + int GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506; + + boolean glIsRenderbuffer(@GLuint int renderbuffer); + + void glBindRenderbuffer(@GLenum int target, @GLuint int renderbuffer); + + void glDeleteRenderbuffers(@AutoSize("renderbuffers") int n, @Const @GLuint IntBuffer renderbuffers); + + @Alternate("glDeleteRenderbuffers") + void glDeleteRenderbuffers(@Constant("1") int n, @Constant(value = "APIUtil.getInt(caps, renderbuffer)", keepParam = true) int renderbuffer); + + void glGenRenderbuffers(@AutoSize("renderbuffers") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Alternate("glGenRenderbuffers") + @GLreturn("renderbuffers") + void glGenRenderbuffers2(@Constant("1") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + void glRenderbufferStorage(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + @StripPostfix("params") + void glGetRenderbufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. */ + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL30", method = "glGetRenderbufferParameteri") + @Deprecated + void glGetRenderbufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetRenderbufferParameteriv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + boolean glIsFramebuffer(@GLuint int framebuffer); + + void glBindFramebuffer(@GLenum int target, @GLuint int framebuffer); + + void glDeleteFramebuffers(@AutoSize("framebuffers") int n, @Const @GLuint IntBuffer framebuffers); + + @Alternate("glDeleteFramebuffers") + void glDeleteFramebuffers(@Constant("1") int n, @Constant(value = "APIUtil.getInt(caps, framebuffer)", keepParam = true) int framebuffer); + + void glGenFramebuffers(@AutoSize("framebuffers") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Alternate("glGenFramebuffers") + @GLreturn("framebuffers") + void glGenFramebuffers2(@Constant("1") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @GLenum + int glCheckFramebufferStatus(@GLenum int target); + + void glFramebufferTexture1D(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + void glFramebufferTexture2D(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + void glFramebufferTexture3D(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level, int zoffset); + + void glFramebufferRenderbuffer(@GLenum int target, @GLenum int attachment, @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + @StripPostfix("params") + void glGetFramebufferAttachmentParameteriv(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. */ + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL30", method = "glGetFramebufferAttachmentParameteri") + @Deprecated + void glGetFramebufferAttachmentParameteriv2(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferAttachmentParameteriv3(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + void glGenerateMipmap(@GLenum int target); + + // -------------------------------------------------------------------------------------------- + // ----------------------[ ARB_half_float_vertex & ARB_half_float_pixel ]---------------------- + // -------------------------------------------------------------------------------------------- + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, + * ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, + * SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, + * and GetColorTable: + * <p/> + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, SecondaryColorPointer, FogCoordPointer, TexCoordPointer, + * and VertexAttribPointer: + */ + int GL_HALF_FLOAT = 0x140B; + + // --------------------------------------------------------------------------- + // ----------------------[ EXT_framebuffer_multisample ]---------------------- + // --------------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv. */ + int GL_RENDERBUFFER_SAMPLES = 0x8CAB; + + /** Returned by CheckFramebufferStatus. */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev. + */ + int GL_MAX_SAMPLES = 0x8D57; + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + void glRenderbufferStorageMultisample( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + // -------------------------------------------------------------------- + // ----------------------[ EXT_framebuffer_blit ]---------------------- + // -------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, and GetDoublev. */ + int GL_DRAW_FRAMEBUFFER_BINDING = 0x8CA6; // alias FRAMEBUFFER_BINDING + int GL_READ_FRAMEBUFFER_BINDING = 0x8CAA; + + /** + * Transfers a rectangle of pixel values from one + * region of the read framebuffer to another in the draw framebuffer. + * &lt;mask&gt; is the bitwise OR of a number of values indicating which + * buffers are to be copied. The values are COLOR_BUFFER_BIT, + * DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + * The pixels corresponding to these buffers are + * copied from the source rectangle, bound by the locations (srcX0, + * srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + * bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + * inclusive. + * If the source and destination rectangle dimensions do not match, + * the source image is stretched to fit the destination + * rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + * method of interpolation to be applied if the image is + * stretched. + */ + void glBlitFramebuffer( + @GLint int srcX0, @GLint int srcY0, @GLint int srcX1, @GLint int srcY1, + @GLint int dstX0, @GLint int dstY0, @GLint int dstX1, @GLint int dstY1, + @GLbitfield int mask, @GLenum int filter); + + // ------------------------------------------------------------------- + // ----------------------[ EXT_texture_integer ]---------------------- + // ------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_RGBA_INTEGER_MODE = 0x8D9E; + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, + * TexImage2D, and TexImage3D: + */ + int GL_RGBA32UI = 0x8D70; + int GL_RGB32UI = 0x8D71; + int GL_ALPHA32UI = 0x8D72; + + int GL_RGBA16UI = 0x8D76; + int GL_RGB16UI = 0x8D77; + int GL_ALPHA16UI = 0x8D78; + + int GL_RGBA8UI = 0x8D7C; + int GL_RGB8UI = 0x8D7D; + int GL_ALPHA8UI = 0x8D7E; + + int GL_RGBA32I = 0x8D82; + int GL_RGB32I = 0x8D83; + int GL_ALPHA32I = 0x8D84; + + int GL_RGBA16I = 0x8D88; + int GL_RGB16I = 0x8D89; + int GL_ALPHA16I = 0x8D8A; + + int GL_RGBA8I = 0x8D8E; + int GL_RGB8I = 0x8D8F; + int GL_ALPHA8I = 0x8D90; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + int GL_RED_INTEGER = 0x8D94; + int GL_GREEN_INTEGER = 0x8D95; + int GL_BLUE_INTEGER = 0x8D96; + int GL_ALPHA_INTEGER = 0x8D97; + int GL_RGB_INTEGER = 0x8D98; + int GL_RGBA_INTEGER = 0x8D99; + int GL_BGR_INTEGER = 0x8D9A; + int GL_BGRA_INTEGER = 0x8D9B; + + @StripPostfix("params") + void glTexParameterIiv(@GLenum int target, @GLenum int pname, @Check("4") IntBuffer params); + + @Alternate("glTexParameterIiv") + @StripPostfix(value = "param", postfix = "v") + void glTexParameterIiv(@GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @StripPostfix("params") + void glTexParameterIuiv(@GLenum int target, @GLenum int pname, @Check("4") @GLuint IntBuffer params); + + @Alternate("glTexParameterIuiv") + @StripPostfix(value = "param", postfix = "v") + void glTexParameterIuiv(@GLenum int target, @GLenum int pname, @Constant(value = "APIUtil.getInt(caps, param)", keepParam = true) int param); + + @StripPostfix("params") + void glGetTexParameterIiv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetTexParameterIiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterIiv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetTexParameterIuiv(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") @GLuint IntBuffer params); + + @Alternate("glGetTexParameterIuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterIuiv2(@GLenum int target, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + // ----------------------------------------------------------------- + // ----------------------[ EXT_texture_array ]---------------------- + // ----------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + int GL_TEXTURE_1D_ARRAY = 0x8C18; + int GL_TEXTURE_2D_ARRAY = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + int GL_PROXY_TEXTURE_2D_ARRAY = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + int GL_PROXY_TEXTURE_1D_ARRAY = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + int GL_TEXTURE_BINDING_1D_ARRAY = 0x8C1C; + int GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D; + int GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_ARB: + */ + int GL_COMPARE_REF_DEPTH_TO_TEXTURE = 0x884E; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameteriv: + */ + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_1D_ARRAY = 0x8DC0; + int GL_SAMPLER_2D_ARRAY = 0x8DC1; + int GL_SAMPLER_1D_ARRAY_SHADOW = 0x8DC3; + int GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; + + void glFramebufferTextureLayer(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + + // ------------------------------------------------------------------------ + // ----------------------[ EXT_packed_depth_stencil ]---------------------- + // ------------------------------------------------------------------------ + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage, by the &lt;type&gt; parameter of + * CopyPixels, by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv. + */ + int GL_DEPTH_STENCIL = 0x84F9; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, and GetTexImage. + */ + int GL_UNSIGNED_INT_24_8 = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage, and returned in the &lt;data&gt; parameter of + * GetTexLevelParameter and GetRenderbufferParameteriv. + */ + int GL_DEPTH24_STENCIL8 = 0x88F0; + + /** Accepted by the &lt;value&gt; parameter of GetTexLevelParameter. */ + int GL_TEXTURE_STENCIL_SIZE = 0x88F1; + + // ----------------------------------------------------------------- + // ----------------------[ EXT_draw_buffers2 ]---------------------- + // ----------------------------------------------------------------- + + void glColorMaski(@GLuint int buf, boolean r, boolean g, boolean b, boolean a); + + @StripPostfix(value = "data", hasPostfix = false) + void glGetBooleani_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") @GLboolean ByteBuffer data); + + @Alternate("glGetBooleani_v") + @GLreturn("data") + @StripPostfix(value = "data", hasPostfix = false) + void glGetBooleani_v2(@GLenum int value, @GLuint int index, @OutParameter @GLboolean ByteBuffer data); + + @StripPostfix("data") + void glGetIntegeri_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") IntBuffer data); + + @Alternate("glGetIntegeri_v") + @GLreturn("data") + @StripPostfix("data") + void glGetIntegeri_v2(@GLenum int value, @GLuint int index, @OutParameter IntBuffer data); + + void glEnablei(@GLenum int target, @GLuint int index); + + void glDisablei(@GLenum int target, @GLuint int index); + + boolean glIsEnabledi(@GLenum int target, @GLuint int index); + + // ---------------------------------------------------------------------------- + // ----------------------[ ARB_texture_compression_rgtc ]---------------------- + // ---------------------------------------------------------------------------- + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_RED_RGTC1 = 0x8DBB, + GL_COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC, + GL_COMPRESSED_RG_RGTC2 = 0x8DBD, + GL_COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE; + + // -------------------------------------------------------------- + // ----------------------[ ARB_texture_rg ]---------------------- + // -------------------------------------------------------------- + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, and CopyTexImage2D: + */ + int GL_R8 = 0x8229; + int GL_R16 = 0x822A; + + int GL_RG8 = 0x822B; + int GL_RG16 = 0x822C; + + int GL_R16F = 0x822D; + int GL_R32F = 0x822E; + + int GL_RG16F = 0x822F; + int GL_RG32F = 0x8230; + + int GL_R8I = 0x8231; + int GL_R8UI = 0x8232; + int GL_R16I = 0x8233; + int GL_R16UI = 0x8234; + int GL_R32I = 0x8235; + int GL_R32UI = 0x8236; + + int GL_RG8I = 0x8237; + int GL_RG8UI = 0x8238; + int GL_RG16I = 0x8239; + int GL_RG16UI = 0x823A; + int GL_RG32I = 0x823B; + int GL_RG32UI = 0x823C; + + /** + * Accepted by the &lt;format&gt; parameter of TexImage3D, TexImage2D, + * TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, + * DrawPixels and ReadPixels: + */ + int GL_RG = 0x8227; + int GL_RG_INTEGER = 0x8228; + + // ---------------------------------------------------------------------- + // ----------------------[ EXT_transform_feedback ]---------------------- + // ---------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRange, BindBufferOffset and + * BindBufferBase: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedv and + * GetBooleanIndexedv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84; + int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedv and + * GetBooleanIndexedv, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + + /** Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackVaryings: */ + int GL_INTERLEAVED_ATTRIBS = 0x8C8C; + int GL_SEPARATE_ATTRIBS = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_PRIMITIVES_GENERATED = 0x8C87; + int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_RASTERIZER_DISCARD = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83; + int GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F; + int GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + + void glBindBufferRange(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset, @GLsizeiptr long size); + + void glBindBufferBase(@GLenum int target, @GLuint int index, @GLuint int buffer); + + void glBeginTransformFeedback(@GLenum int primitiveMode); + + void glEndTransformFeedback(); + + void glTransformFeedbackVaryings(@GLuint int program, @GLsizei int count, + @Const @NullTerminated("count") @GLchar @PointerArray("count") ByteBuffer varyings, + @GLenum int bufferMode); + + @Alternate("glTransformFeedbackVaryings") + void glTransformFeedbackVaryings(@GLuint int program, @Constant("varyings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray("count") CharSequence[] varyings, + @GLenum int bufferMode); + + void glGetTransformFeedbackVarying(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetTransformFeedbackVarying") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetTransformFeedbackVarying2(@GLuint int program, @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_vertex_array_object ]---------------------- + // ----------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_VERTEX_ARRAY_BINDING = 0x85B5; + + @Code(" StateTracker.bindVAO(caps, array);") + void glBindVertexArray(@GLuint int array); + + @Code(" StateTracker.deleteVAO(caps, arrays);") + void glDeleteVertexArrays(@AutoSize("arrays") @GLsizei int n, @Const @GLuint IntBuffer arrays); + + @Alternate("glDeleteVertexArrays") + @Code(" StateTracker.deleteVAO(caps, array);") + void glDeleteVertexArrays(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, array)", keepParam = true) int array); + + void glGenVertexArrays(@AutoSize("arrays") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Alternate("glGenVertexArrays") + @GLreturn("arrays") + void glGenVertexArrays2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + boolean glIsVertexArray(@GLuint int array); + + // -------------------------------------------------------------------- + // ----------------------[ ARB_framebuffer_sRGB ]---------------------- + // -------------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB = 0x8DB9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_FRAMEBUFFER_SRGB_CAPABLE = 0x8DBA; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL31.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL31.java new file mode 100644 index 0000000..f6325e4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL31.java @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface GL31 { + + // ---------------------------------------------------------- + // ----------------------[ OpenGL 3.1 ]---------------------- + // ---------------------------------------------------------- + + int GL_RED_SNORM = 0x8F90; + int GL_RG_SNORM = 0x8F91; + int GL_RGB_SNORM = 0x8F92; + int GL_RGBA_SNORM = 0x8F93; + int GL_R8_SNORM = 0x8F94; + int GL_RG8_SNORM = 0x8F95; + int GL_RGB8_SNORM = 0x8F96; + int GL_RGBA8_SNORM = 0x8F97; + int GL_R16_SNORM = 0x8F98; + int GL_RG16_SNORM = 0x8F99; + int GL_RGB16_SNORM = 0x8F9A; + int GL_RGBA16_SNORM = 0x8F9B; + int GL_SIGNED_NORMALIZED = 0x8F9C; + + // ------------------------------------------------------------------ + // ----------------------[ ARB_draw_instanced ]---------------------- + // ------------------------------------------------------------------ + + void glDrawArraysInstanced(@GLenum int mode, int first, @GLsizei int count, @GLsizei int primcount); + + void glDrawElementsInstanced(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount); + + // --------------------------------------------------------------- + // ----------------------[ EXT_copy_buffer ]---------------------- + // --------------------------------------------------------------- + + int GL_COPY_READ_BUFFER_BINDING = 0x8F36; + int GL_COPY_WRITE_BUFFER_BINDING = 0x8F37; + + int GL_COPY_READ_BUFFER = GL_COPY_READ_BUFFER_BINDING; + int GL_COPY_WRITE_BUFFER = GL_COPY_WRITE_BUFFER_BINDING; + + void glCopyBufferSubData(@GLenum int readtarget, @GLenum int writetarget, @GLintptr long readoffset, @GLintptr long writeoffset, @GLsizeiptr long size); + + // -------------------------------------------------------------------- + // ----------------------[ NV_primitive_restart ]---------------------- + // -------------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_PRIMITIVE_RESTART = 0x8F9D; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PRIMITIVE_RESTART_INDEX = 0x8F9E; + + void glPrimitiveRestartIndex(@GLuint int index); + + // ------------------------------------------------------------------------- + // ----------------------[ ARB_texture_buffer_object ]---------------------- + // ------------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, MapBufferRange, BindTexture, UnmapBuffer, + * GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBuffer, + * and the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv, and + * GetIntegerv: + */ + int GL_TEXTURE_BUFFER = 0x8C2A; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetDoublev, + * GetFloatv, and GetIntegerv: + */ + int GL_MAX_TEXTURE_BUFFER_SIZE = 0x8C2B; + int GL_TEXTURE_BINDING_BUFFER = 0x8C2C; + int GL_TEXTURE_BUFFER_DATA_STORE_BINDING = 0x8C2D; + int GL_TEXTURE_BUFFER_FORMAT = 0x8C2E; + + void glTexBuffer(@GLenum int target, @GLenum int internalformat, @GLuint int buffer); + + // --------------------------------------------------------------------- + // ----------------------[ ARB_texture_rectangle ]---------------------- + // --------------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + * GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + * TexParameterfv and TexParameteriv: + * Accepted by the &lt;target&gt; parameter of GetTexImage, + * GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + * CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + int GL_TEXTURE_RECTANGLE = 0x84F5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv and GetDoublev: + */ + int GL_TEXTURE_BINDING_RECTANGLE = 0x84F6; + + /** + * Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + * GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + int GL_PROXY_TEXTURE_RECTANGLE = 0x84F7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + int GL_MAX_RECTANGLE_TEXTURE_SIZE = 0x84F8; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + int GL_SAMPLER_2D_RECT = 0x8B63; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + int GL_SAMPLER_2D_RECT_SHADOW = 0x8B64; + + // ------------------------------------------------------------------------- + // ----------------------[ ARB_uniform_buffer_object ]---------------------- + // ------------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_UNIFORM_BUFFER = 0x8A11; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleanv, + * GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: */ + int GL_UNIFORM_BUFFER_START = 0x8A29; + int GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; + int GL_MAX_GEOMETRY_UNIFORM_BLOCKS = 0x8A2C; + int GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; + int GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; + int GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; + int GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30; + int GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; + int GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = 0x8A32; + int GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; + int GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35; + int GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: */ + int GL_UNIFORM_TYPE = 0x8A37; + int GL_UNIFORM_SIZE = 0x8A38; + int GL_UNIFORM_NAME_LENGTH = 0x8A39; + int GL_UNIFORM_BLOCK_INDEX = 0x8A3A; + int GL_UNIFORM_OFFSET = 0x8A3B; + int GL_UNIFORM_ARRAY_STRIDE = 0x8A3C; + int GL_UNIFORM_MATRIX_STRIDE = 0x8A3D; + int GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: */ + int GL_UNIFORM_BLOCK_BINDING = 0x8A3F; + int GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40; + int GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; + int GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; + int GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = 0x8A45; + int GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + + /** Returned by GetActiveUniformsiv and GetUniformBlockIndex */ + int GL_INVALID_INDEX = 0xFFFFFFFF; + + void glGetUniformIndices(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @NullTerminated("uniformIndices.remaining()") @GLchar @PointerArray("uniformCount") ByteBuffer uniformNames, + @OutParameter @GLuint IntBuffer uniformIndices); + + @Alternate("glGetUniformIndices") + void glGetUniformIndices(@GLuint int program, @Constant("uniformNames.length") @GLsizei int uniformCount, + @Const @NullTerminated @PointerArray("uniformCount") CharSequence[] uniformNames, + @OutParameter @Check("uniformNames.length") @GLuint IntBuffer uniformIndices); + + @StripPostfix("params") + void glGetActiveUniformsiv(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @GLuint IntBuffer uniformIndices, + @GLenum int pname, + @OutParameter @Check("uniformIndices.remaining()") @GLint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformsi} instead. */ + @Alternate("glGetActiveUniformsiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL31", method = "glGetActiveUniformsi") + @Deprecated + void glGetActiveUniformsiv(@GLuint int program, @Constant("1") @GLsizei int uniformCount, + @Constant(value = "MemoryUtil.getAddress(params.put(1, uniformIndex), 1)", keepParam = true) int uniformIndex, // Reuse params buffer + @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Alternate("glGetActiveUniformsiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformsiv2(@GLuint int program, @Constant("1") @GLsizei int uniformCount, + @Constant(value = "MemoryUtil.getAddress(params.put(1, uniformIndex), 1)", keepParam = true) int uniformIndex, // Reuse params buffer + @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + void glGetActiveUniformName(@GLuint int program, @GLuint int uniformIndex, @AutoSize("uniformName") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformName); + + @Alternate("glGetActiveUniformName") + @GLreturn(value = "uniformName", maxLength = "bufSize") + void glGetActiveUniformName2(@GLuint int program, @GLuint int uniformIndex, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(uniformName_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformName); + + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @Const @NullTerminated @GLchar ByteBuffer uniformBlockName); + + @Alternate("glGetUniformBlockIndex") + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @NullTerminated CharSequence uniformBlockName); + + @StripPostfix("params") + void glGetActiveUniformBlockiv(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @Check(value = "16") @GLint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetActiveUniformBlocki} instead. */ + @Alternate("glGetActiveUniformBlockiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL31", method = "glGetActiveUniformBlocki") + @Deprecated + void glGetActiveUniformBlockiv2(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @Alternate("glGetActiveUniformBlockiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformBlockiv3(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + void glGetActiveUniformBlockName(@GLuint int program, @GLuint int uniformBlockIndex, @AutoSize("uniformBlockName") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + @Alternate("glGetActiveUniformBlockName") + @GLreturn(value = "uniformBlockName", maxLength = "bufSize") + void glGetActiveUniformBlockName2(@GLuint int program, @GLuint int uniformBlockIndex, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(uniformBlockName_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + void glUniformBlockBinding(@GLuint int program, @GLuint int uniformBlockIndex, @GLuint int uniformBlockBinding); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL32.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL32.java new file mode 100644 index 0000000..bb948a7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL32.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +public interface GL32 { + + // ---------------------------------------------------------- + // ----------------------[ OpenGL 3.2 ]---------------------- + // ---------------------------------------------------------- + + int GL_CONTEXT_PROFILE_MASK = 0x9126; + int GL_CONTEXT_CORE_PROFILE_BIT = 0x00000001; + int GL_CONTEXT_COMPATIBILITY_PROFILE_BIT = 0x00000002; + + int GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122; + int GL_MAX_GEOMETRY_INPUT_COMPONENTS = 0x9123; + int GL_MAX_GEOMETRY_OUTPUT_COMPONENTS = 0x9124; + int GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + + @StripPostfix("params") + void glGetBufferParameteri64v(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") LongBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri64} instead. */ + @Alternate("glGetBufferParameteri64v") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL32", method = "glGetBufferParameteri64") + @Deprecated + void glGetBufferParameteri64v2(@GLenum int target, @GLenum int pname, @OutParameter LongBuffer params); + + @Alternate("glGetBufferParameteri64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameteri64v3(@GLenum int target, @GLenum int pname, @OutParameter LongBuffer params); + + // ----------------------------------------------------------------------------- + // ----------------------[ ARB_draw_elements_base_vertex ]---------------------- + // ----------------------------------------------------------------------------- + + void glDrawElementsBaseVertex(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, int basevertex); + + void glDrawRangeElementsBaseVertex(@GLenum int mode, @GLuint int start, @GLuint int end, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, int basevertex); + + void glDrawElementsInstancedBaseVertex(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount, int basevertex); + + //void glMultiDrawElementsBaseVertex(@GLenum int mode, @GLsizei*count, @GLenum int type, void**indices, @GLsizei int primcount, int*basevertex) + + // -------------------------------------------------------------------- + // ----------------------[ ARB_provoking_vertex ]---------------------- + // -------------------------------------------------------------------- + + /** Accepted by the &lt;mode&gt; parameter of ProvokingVertex: */ + int GL_FIRST_VERTEX_CONVENTION = 0x8E4D; + int GL_LAST_VERTEX_CONVENTION = 0x8E4E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PROVOKING_VERTEX = 0x8E4F; + int GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C; + + void glProvokingVertex(@GLenum int mode); + + // --------------------------------------------------------------------- + // ----------------------[ ARB_seamless_cube_map ]---------------------- + // --------------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + int GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F; + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_texture_multisample ]---------------------- + // ----------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetMultisamplefv: */ + int GL_SAMPLE_POSITION = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_SAMPLE_MASK = 0x8E51; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v and + * GetIntegeri_v: + */ + int GL_SAMPLE_MASK_VALUE = 0x8E52; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage2DMultisample: + */ + int GL_TEXTURE_2D_MULTISAMPLE = 0x9100; + + /** Accepted by the &lt;target&gt; parameter of TexImage2DMultisample: */ + int GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101; + + /** + * Accepted by the &lt;target&gt; parameter of BindTexture and + * TexImage3DMultisample: + */ + int GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** Accepted by the &lt;target&gt; parameter of TexImage3DMultisample: */ + int GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_SAMPLE_MASK_WORDS = 0x8E59; + int GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E; + int GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F; + int GL_MAX_INTEGER_SAMPLES = 0x9110; + int GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104; + int GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105; + + /** Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter */ + int GL_TEXTURE_SAMPLES = 0x9106; + int GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_2D_MULTISAMPLE = 0x9108; + int GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109; + int GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A; + int GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B; + int GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C; + int GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D; + + void glTexImage2DMultisample(@GLenum int target, @GLsizei int samples, int internalformat, + @GLsizei int width, @GLsizei int height, + boolean fixedsamplelocations); + + void glTexImage3DMultisample(@GLenum int target, @GLsizei int samples, int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + boolean fixedsamplelocations); + + @StripPostfix("val") + void glGetMultisamplefv(@GLenum int pname, @GLuint int index, @OutParameter @Check("2") FloatBuffer val); + + void glSampleMaski(@GLuint int index, @GLbitfield int mask); + + // --------------------------------------------------------------- + // ----------------------[ ARB_depth_clamp ]---------------------- + // --------------------------------------------------------------- + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_DEPTH_CLAMP = 0x864F; + + // -------------------------------------------------------------------- + // ----------------------[ ARB_geometry_shader4 ]---------------------- + // -------------------------------------------------------------------- + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + int GL_GEOMETRY_SHADER = 0x8DD9; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + int GL_GEOMETRY_VERTICES_OUT = 0x8DDA; + int GL_GEOMETRY_INPUT_TYPE = 0x8DDB; + int GL_GEOMETRY_OUTPUT_TYPE = 0x8DDC; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = 0x8C29; + //int GL_MAX_GEOMETRY_VARYING_COMPONENTS = 0x8DDD; -- Missing from 3.2 spec + //int GL_MAX_VERTEX_VARYING_COMPONENTS = 0x8DDE; -- Missing from 3.2 spec + int GL_MAX_VARYING_COMPONENTS = 0x8B4B; + int GL_MAX_GEOMETRY_UNIFORM_COMPONENTS = 0x8DDF; + int GL_MAX_GEOMETRY_OUTPUT_VERTICES = 0x8DE0; + int GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 0x8DE1; + + /** + * Accepted by the &lt;mode&gt; parameter of Begin, DrawArrays, + * MultiDrawArrays, DrawElements, MultiDrawElements, and + * DrawRangeElements: + */ + int GL_LINES_ADJACENCY = 0xA; + int GL_LINE_STRIP_ADJACENCY = 0xB; + int GL_TRIANGLES_ADJACENCY = 0xC; + int GL_TRIANGLE_STRIP_ADJACENCY = 0xD; + + /** Returned by CheckFramebufferStatusEXT: */ + int GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0x8DA8; + + /** + * Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachment- + * ParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_LAYERED = 0x8DA7; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetIntegerv, GetFloatv, GetDoublev, + * and GetBooleanv: + */ + int GL_PROGRAM_POINT_SIZE = 0x8642; + + void glFramebufferTexture(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level); + + // -------------------------------------------------------- + // ----------------------[ ARB_sync ]---------------------- + // -------------------------------------------------------- + + /** Accepted as the &lt;pname&gt; parameter of GetInteger64v: */ + int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + + /** Accepted as the &lt;pname&gt; parameter of GetSynciv: */ + int GL_OBJECT_TYPE = 0x9112; + int GL_SYNC_CONDITION = 0x9113; + int GL_SYNC_STATUS = 0x9114; + int GL_SYNC_FLAGS = 0x9115; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE: */ + int GL_SYNC_FENCE = 0x9116; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_CONDITION: */ + int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; SYNC_STATUS: */ + int GL_UNSIGNALED = 0x9118; + int GL_SIGNALED = 0x9119; + + /** Accepted in the &lt;flags&gt; parameter of ClientWaitSync: */ + int GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001; + + /** Accepted in the &lt;timeout&gt; parameter of WaitSync: */ + long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFl; + + /** Returned by ClientWaitSync: */ + int GL_ALREADY_SIGNALED = 0x911A; + int GL_TIMEOUT_EXPIRED = 0x911B; + int GL_CONDITION_SATISFIED = 0x911C; + int GL_WAIT_FAILED = 0x911D; + + @PointerWrapper("GLsync") + GLSync glFenceSync(@GLenum int condition, @GLbitfield int flags); + + boolean glIsSync(@PointerWrapper("GLsync") GLSync sync); + + void glDeleteSync(@PointerWrapper("GLsync") GLSync sync); + + @GLenum + int glClientWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + void glWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + @StripPostfix("data") + void glGetInteger64v(@GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer data); + + @Alternate("glGetInteger64v") + @GLreturn("data") + @StripPostfix("data") + void glGetInteger64v2(@GLenum int pname, @OutParameter @GLint64 LongBuffer data); + + @StripPostfix("data") + @Optional(reason = "NV's 3.2 implementation does not expose this (last driver checked: 19?.??)") + void glGetInteger64i_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") @GLint64 LongBuffer data); + + @Alternate("glGetInteger64i_v") + @GLreturn("data") + @StripPostfix("data") + void glGetInteger64i_v2(@GLenum int value, @GLuint int index, @OutParameter @GLint64 LongBuffer data); + + @StripPostfix("values") + void glGetSynciv(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @AutoSize("values") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter IntBuffer values); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetSynci} instead. */ + @Alternate("glGetSynciv") + @GLreturn("values") + @StripPostfix("values") + @Reuse(value = "GL32", method = "glGetSynci") + @Deprecated + void glGetSynciv2(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); + + @Alternate("glGetSynciv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetSynciv3(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL33.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL33.java new file mode 100644 index 0000000..3e68488 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL33.java @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +@DeprecatedGL +public interface GL33 { + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_blend_func_extended ]---------------------- + // ----------------------------------------------------------------------- + + /** + * Accepted by the &lt;src&gt; and &lt;dst&gt; parameters of BlendFunc and + * BlendFunci, and by the &lt;srcRGB&gt;, &lt;dstRGB&gt;, &lt;srcAlpha&gt; and &lt;dstAlpha&gt; + * parameters of BlendFuncSeparate and BlendFuncSeparatei: + */ + int GL_SRC1_COLOR = 0x88F9; + int GL_SRC1_ALPHA = GL15.GL_SRC1_ALPHA; + int GL_ONE_MINUS_SRC1_COLOR = 0x88FA; + int GL_ONE_MINUS_SRC1_ALPHA = 0x88FB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev: + */ + int GL_MAX_DUAL_SOURCE_DRAW_BUFFERS = 0x88FC; + + void glBindFragDataLocationIndexed(@GLuint int program, @GLuint int colorNumber, @GLuint int index, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glBindFragDataLocationIndexed") + void glBindFragDataLocationIndexed(@GLuint int program, @GLuint int colorNumber, @GLuint int index, @NullTerminated CharSequence name); + + int glGetFragDataIndex(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetFragDataIndex") + int glGetFragDataIndex(@GLuint int program, @NullTerminated CharSequence name); + + // -------------------------------------------------------------------- + // ----------------------[ ARB_occlusion_query2 ]---------------------- + // -------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * and GetQueryiv: + */ + int GL_ANY_SAMPLES_PASSED = 0x8C2F; + + // ------------------------------------------------------------------- + // ----------------------[ ARB_sampler_objects ]---------------------- + // ------------------------------------------------------------------- + + /** + * Accepted by the &lt;value&gt; parameter of the GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev functions: + */ + int GL_SAMPLER_BINDING = 0x8919; + + void glGenSamplers(@AutoSize("samplers") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + @Alternate("glGenSamplers") + @GLreturn("samplers") + void glGenSamplers2(@Constant("1") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + void glDeleteSamplers(@AutoSize("samplers") @GLsizei int count, @Const @GLuint IntBuffer samplers); + + @Alternate("glDeleteSamplers") + void glDeleteSamplers(@Constant("1") @GLsizei int count, @Constant(value = "APIUtil.getInt(caps, sampler)", keepParam = true) int sampler); + + boolean glIsSampler(@GLuint int sampler); + + void glBindSampler(@GLenum int unit, @GLuint int sampler); + + void glSamplerParameteri(@GLuint int sampler, @GLenum int pname, int param); + + void glSamplerParameterf(@GLuint int sampler, @GLenum int pname, float param); + + @StripPostfix("params") + void glSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glSamplerParameterIiv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glSamplerParameterIuiv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const @GLuint IntBuffer params); + + @StripPostfix("params") + void glGetSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetSamplerParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameteriv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Alternate("glGetSamplerParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterfv2(@GLuint int sampler, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetSamplerParameterIiv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetSamplerParameterIiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterIiv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetSamplerParameterIuiv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetSamplerParameterIuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterIuiv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + // ------------------------------------------------------------------- + // ----------------------[ ARB_texture_rgb10_a2ui ]---------------------- + // ------------------------------------------------------------------- + + /** + * Accepted by the &lt;internalFormat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, RenderbufferStorage and + * RenderbufferStorageMultisample: + */ + int GL_RGB10_A2UI = 0x906F; + + // ------------------------------------------------------------------- + // ----------------------[ ARB_texture_swizzle ]---------------------- + // ------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameterf, TexParameteriv, TexParameterfv, + * GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_R = 0x8E42; + int GL_TEXTURE_SWIZZLE_G = 0x8E43; + int GL_TEXTURE_SWIZZLE_B = 0x8E44; + int GL_TEXTURE_SWIZZLE_A = 0x8E45; + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteriv, + * TexParameterfv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_SWIZZLE_RGBA = 0x8E46; + + // --------------------------------------------------------------- + // ----------------------[ ARB_timer_query ]---------------------- + // --------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_TIME_ELAPSED = 0x88BF; + + /** + * Accepted by the &lt;target&gt; parameter of GetQueryiv and QueryCounter. + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_TIMESTAMP = 0x8E28; + + void glQueryCounter(@GLuint int id, @GLenum int target); + + @StripPostfix("params") + void glGetQueryObjecti64v(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetQueryObjecti64} instead. */ + @Alternate("glGetQueryObjecti64v") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL33", method = "glGetQueryObjecti64") + @Deprecated + void glGetQueryObjecti64v2(@GLuint int id, @GLenum int pname, @OutParameter @GLint64 LongBuffer params); + + @Alternate("glGetQueryObjecti64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjecti64v3(@GLuint int id, @GLenum int pname, @OutParameter @GLint64 LongBuffer params); + + @StripPostfix("params") + void glGetQueryObjectui64v(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLuint64 LongBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetQueryObjectui64} instead. */ + @Alternate("glGetQueryObjectui64v") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL33", method = "glGetQueryObjectui64") + @Deprecated + void glGetQueryObjectui64v2(@GLuint int id, @GLenum int pname, @OutParameter @GLuint64 LongBuffer params); + + @Alternate("glGetQueryObjectui64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectui64v3(@GLuint int id, @GLenum int pname, @OutParameter @GLuint64 LongBuffer params); + + // -------------------------------------------------------------------- + // ----------------------[ ARB_instanced_arrays ]---------------------- + // -------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of GetVertexAttribdv, + * GetVertexAttribfv, and GetVertexAttribiv: + */ + int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + + void glVertexAttribDivisor(@GLuint int index, @GLuint int divisor); + + // ------------------------------------------------------------------------------ + // ----------------------[ ARB_vertex_type_2_10_10_10_rev ]---------------------- + // ------------------------------------------------------------------------------ + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribPointer, VertexPointer, + * NormalPointer, ColorPointer, SecondaryColorPointer, TexCoordPointer, + * VertexAttribP{1234}ui, VertexP*, TexCoordP*, MultiTexCoordP*, NormalP3ui, + * ColorP*, SecondaryColorP* and VertexAttribP* + */ + int GL_INT_2_10_10_10_REV = 0x8D9F; + + @NoErrorCheck + @DeprecatedGL + void glVertexP2ui(@GLenum int type, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + void glVertexP3ui(@GLenum int type, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + void glVertexP4ui(@GLenum int type, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexP2uiv(@GLenum int type, @Check("2") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + void glTexCoordP1ui(@GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glTexCoordP2ui(@GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glTexCoordP3ui(@GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glTexCoordP4ui(@GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glTexCoordP1uiv(@GLenum int type, @Check("1") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glTexCoordP2uiv(@GLenum int type, @Check("2") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glTexCoordP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glTexCoordP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoordP1ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoordP2ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoordP3ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + void glMultiTexCoordP4ui(@GLenum int texture, @GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glMultiTexCoordP1uiv(@GLenum int texture, @GLenum int type, @Check("1") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glMultiTexCoordP2uiv(@GLenum int texture, @GLenum int type, @Check("2") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glMultiTexCoordP3uiv(@GLenum int texture, @GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glMultiTexCoordP4uiv(@GLenum int texture, @GLenum int type, @Check("4") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + void glNormalP3ui(@GLenum int type, @GLuint int coords); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("coords") + void glNormalP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer coords); + + @NoErrorCheck + @DeprecatedGL + void glColorP3ui(@GLenum int type, @GLuint int color); + + @NoErrorCheck + @DeprecatedGL + void glColorP4ui(@GLenum int type, @GLuint int color); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("color") + void glColorP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer color); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("color") + void glColorP4uiv(@GLenum int type, @Check("4") @Const @GLuint IntBuffer color); + + @NoErrorCheck + @DeprecatedGL + void glSecondaryColorP3ui(@GLenum int type, @GLuint int color); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("color") + void glSecondaryColorP3uiv(@GLenum int type, @Check("3") @Const @GLuint IntBuffer color); + + @NoErrorCheck + @DeprecatedGL + void glVertexAttribP1ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + void glVertexAttribP2ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + void glVertexAttribP3ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + void glVertexAttribP4ui(@GLuint int index, @GLenum int type, boolean normalized, @GLuint int value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexAttribP1uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("1") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexAttribP2uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("2") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexAttribP3uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("3") @Const @GLuint IntBuffer value); + + @NoErrorCheck + @DeprecatedGL + @StripPostfix("value") + void glVertexAttribP4uiv(@GLuint int index, @GLenum int type, boolean normalized, @Check("4") @Const @GLuint IntBuffer value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL40.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL40.java new file mode 100644 index 0000000..ce60497 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL40.java @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface GL40 { + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_draw_buffers_blend ]---------------------- + // ---------------------------------------------------------------------- + + void glBlendEquationi(@GLuint int buf, @GLenum int mode); + + void glBlendEquationSeparatei(@GLuint int buf, @GLenum int modeRGB, @GLenum int modeAlpha); + + void glBlendFunci(@GLuint int buf, @GLenum int src, @GLenum int dst); + + void glBlendFuncSeparatei(@GLuint int buf, @GLenum int srcRGB, @GLenum int dstRGB, @GLenum int srcAlpha, @GLenum int dstAlpha); + + // ----------------------------------------------------------------- + // ----------------------[ ARB_draw_indirect ]---------------------- + // ----------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, MapBufferRange, FlushMappedBufferRange, + * GetBufferParameteriv, BindBufferRange, BindBufferBase, and + * CopyBufferSubData: + */ + int GL_DRAW_INDIRECT_BUFFER = 0x8F3F; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * and GetDoublev: + */ + int GL_DRAW_INDIRECT_BUFFER_BINDING = 0x8F43; + + void glDrawArraysIndirect(@GLenum int mode, @BufferObject(BufferKind.IndirectBO) @Check("4 * 4") @Const @GLvoid ByteBuffer indirect); + + @Alternate("glDrawArraysIndirect") + void glDrawArraysIndirect(@GLenum int mode, @BufferObject(BufferKind.IndirectBO) @Check("4") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect); + + void glDrawElementsIndirect(@GLenum int mode, @GLenum int type, @BufferObject(BufferKind.IndirectBO) @Check("5 * 4") @Const @GLvoid ByteBuffer indirect); + + @Alternate("glDrawElementsIndirect") + void glDrawElementsIndirect(@GLenum int mode, @GLenum int type, @BufferObject(BufferKind.IndirectBO) @Check("5") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect); + + // --------------------------------------------------------------- + // ----------------------[ ARB_gpu_shader5 ]---------------------- + // --------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_GEOMETRY_SHADER_INVOCATIONS = 0x887F; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev, and GetInteger64v: + */ + int GL_MAX_GEOMETRY_SHADER_INVOCATIONS = 0x8E5A; + int GL_MIN_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5B; + int GL_MAX_FRAGMENT_INTERPOLATION_OFFSET = 0x8E5C; + int GL_FRAGMENT_INTERPOLATION_OFFSET_BITS = 0x8E5D; + int GL_MAX_VERTEX_STREAMS = 0x8E71; + + // ------------------------------------------------------------------- + // ----------------------[ ARB_gpu_shader_fp64 ]---------------------- + // ------------------------------------------------------------------- + + /** + * Returned in the &lt;type&gt; parameter of GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + int GL_DOUBLE_VEC2 = 0x8FFC; + int GL_DOUBLE_VEC3 = 0x8FFD; + int GL_DOUBLE_VEC4 = 0x8FFE; + int GL_DOUBLE_MAT2 = 0x8F46; + int GL_DOUBLE_MAT3 = 0x8F47; + int GL_DOUBLE_MAT4 = 0x8F48; + int GL_DOUBLE_MAT2x3 = 0x8F49; + int GL_DOUBLE_MAT2x4 = 0x8F4A; + int GL_DOUBLE_MAT3x2 = 0x8F4B; + int GL_DOUBLE_MAT3x4 = 0x8F4C; + int GL_DOUBLE_MAT4x2 = 0x8F4D; + int GL_DOUBLE_MAT4x3 = 0x8F4E; + + void glUniform1d(int location, double x); + + void glUniform2d(int location, double x, double y); + + void glUniform3d(int location, double x, double y, double z); + + void glUniform4d(int location, double x, double y, double z, double w); + + @StripPostfix("value") + void glUniform1dv(int location, @AutoSize("value") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniform2dv(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniform3dv(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniform4dv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix2dv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix3dv(int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix4dv(int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix2x3dv(int location, @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix2x4dv(int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix3x2dv(int location, @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix3x4dv(int location, @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix4x2dv(int location, @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glUniformMatrix4x3dv(int location, @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("params") + void glGetUniformdv(@GLuint int program, int location, @OutParameter @Check DoubleBuffer params); + + // ------------------------------------------------------------------ + // ----------------------[ ARB_sample_shading ]---------------------- + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_SAMPLE_SHADING = 0x8C36; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + int GL_MIN_SAMPLE_SHADING_VALUE = 0x8C37; + + void glMinSampleShading(float value); + + // --------------------------------------------------------------------- + // ----------------------[ ARB_shader_subroutine ]---------------------- + // --------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetProgramStageiv: */ + int GL_ACTIVE_SUBROUTINES = 0x8DE5; + int GL_ACTIVE_SUBROUTINE_UNIFORMS = 0x8DE6; + int GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = 0x8E47; + int GL_ACTIVE_SUBROUTINE_MAX_LENGTH = 0x8E48; + int GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = 0x8E49; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_SUBROUTINES = 0x8DE7; + int GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS = 0x8DE8; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveSubroutineUniformiv: */ + int GL_NUM_COMPATIBLE_SUBROUTINES = 0x8E4A; + int GL_COMPATIBLE_SUBROUTINES = 0x8E4B; + int GL_UNIFORM_SIZE = GL31.GL_UNIFORM_SIZE; + int GL_UNIFORM_NAME_LENGTH = GL31.GL_UNIFORM_NAME_LENGTH; + + int glGetSubroutineUniformLocation(@GLuint int program, @GLenum int shadertype, @Const @NullTerminated ByteBuffer name); + + @Alternate("glGetSubroutineUniformLocation") + int glGetSubroutineUniformLocation(@GLuint int program, @GLenum int shadertype, @NullTerminated CharSequence name); + + @GLuint + int glGetSubroutineIndex(@GLuint int program, @GLenum int shadertype, @Const @NullTerminated ByteBuffer name); + + @Alternate("glGetSubroutineIndex") + @GLuint + int glGetSubroutineIndex(@GLuint int program, @GLenum int shadertype, @NullTerminated CharSequence name); + + @StripPostfix("values") + void glGetActiveSubroutineUniformiv(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLenum int pname, + @OutParameter @Check("1") IntBuffer values); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetActiveSubroutineUniformi} instead. */ + @Alternate("glGetActiveSubroutineUniformiv") + @GLreturn("values") + @StripPostfix("values") + @Reuse(value = "GL40", method = "glGetActiveSubroutineUniformi") + @Deprecated + void glGetActiveSubroutineUniformiv2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLenum int pname, + @OutParameter IntBuffer values); + + @Alternate("glGetActiveSubroutineUniformiv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetActiveSubroutineUniformiv3(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLenum int pname, + @OutParameter IntBuffer values); + + void glGetActiveSubroutineUniformName(@GLuint int program, @GLenum int shadertype, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetActiveSubroutineUniformName") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveSubroutineUniformName2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + void glGetActiveSubroutineName(@GLuint int program, @GLenum int shadertype, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetActiveSubroutineName") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveSubroutineName2(@GLuint int program, @GLenum int shadertype, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @StripPostfix("indices") + void glUniformSubroutinesuiv(@GLenum int shadertype, @AutoSize("indices") @GLsizei int count, @Const @GLuint IntBuffer indices); + + @StripPostfix("params") + void glGetUniformSubroutineuiv(@GLenum int shadertype, int location, @Check("1") @OutParameter @GLuint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetUniformSubroutineui} instead. */ + @Alternate("glGetUniformSubroutineuiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL40", method = "glGetUniformSubroutineui") + @Deprecated + void glGetUniformSubroutineuiv2(@GLenum int shadertype, int location, @OutParameter @GLuint IntBuffer params); + + @Alternate("glGetUniformSubroutineuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetUniformSubroutineuiv3(@GLenum int shadertype, int location, @OutParameter @GLuint IntBuffer params); + + @StripPostfix("values") + void glGetProgramStageiv(@GLuint int program, @GLenum int shadertype, @GLenum int pname, @Check("1") @OutParameter IntBuffer values); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetProgramStagei} instead. */ + @Alternate("glGetProgramStageiv") + @GLreturn("values") + @StripPostfix("values") + @Reuse(value = "GL40", method = "glGetProgramStagei") + @Deprecated + void glGetProgramStageiv2(@GLuint int program, @GLenum int shadertype, @GLenum int pname, @OutParameter IntBuffer values); + + @Alternate("glGetProgramStageiv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetProgramStageiv3(@GLuint int program, @GLenum int shadertype, @GLenum int pname, @OutParameter IntBuffer values); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_tessellation_shader ]---------------------- + // ----------------------------------------------------------------------- + + /** + * Accepted by the &lt;mode&gt; parameter of Begin and all vertex array functions + * that implicitly call Begin: + */ + int GL_PATCHES = 0xE; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameteri, GetBooleanv, + * GetDoublev, GetFloatv, GetIntegerv, and GetInteger64v: + */ + int GL_PATCH_VERTICES = 0x8E72; + + /** + * Accepted by the &lt;pname&gt; parameter of PatchParameterfv, GetBooleanv, + * GetDoublev, GetFloatv, and GetIntegerv, and GetInteger64v: + */ + int GL_PATCH_DEFAULT_INNER_LEVEL = 0x8E73; + int GL_PATCH_DEFAULT_OUTER_LEVEL = 0x8E74; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_TESS_CONTROL_OUTPUT_VERTICES = 0x8E75; + int GL_TESS_GEN_MODE = 0x8E76; + int GL_TESS_GEN_SPACING = 0x8E77; + int GL_TESS_GEN_VERTEX_ORDER = 0x8E78; + int GL_TESS_GEN_POINT_MODE = 0x8E79; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_MODE: */ + int GL_ISOLINES = 0x8E7A; + + /** Returned by GetProgramiv when &lt;pname&gt; is TESS_GEN_SPACING: */ + int GL_FRACTIONAL_ODD = 0x8E7B; + int GL_FRACTIONAL_EVEN = 0x8E7C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetFloatv, + * GetIntegerv, and GetInteger64v: + */ + int GL_MAX_PATCH_VERTICES = 0x8E7D; + int GL_MAX_TESS_GEN_LEVEL = 0x8E7E; + int GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E7F; + int GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E80; + int GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = 0x8E81; + int GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = 0x8E82; + int GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS = 0x8E83; + int GL_MAX_TESS_PATCH_COMPONENTS = 0x8E84; + int GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = 0x8E85; + int GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = 0x8E86; + int GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS = 0x8E89; + int GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS = 0x8E8A; + int GL_MAX_TESS_CONTROL_INPUT_COMPONENTS = 0x886C; + int GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS = 0x886D; + int GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = 0x8E1E; + int GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = 0x8E1F; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: */ + int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = 0x84F0; + int GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x84F1; + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned by the + * &lt;params&gt; parameter of GetShaderiv: + */ + int GL_TESS_EVALUATION_SHADER = 0x8E87; + int GL_TESS_CONTROL_SHADER = 0x8E88; + + void glPatchParameteri(@GLenum int pname, int value); + + @StripPostfix("values") + void glPatchParameterfv(@GLenum int pname, @Check("4") @Const FloatBuffer values); + + // -------------------------------------------------------------------------- + // ----------------------[ ARB_texture_cube_map_array ]---------------------- + // -------------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, BindTexture, and GenerateMipmap: + * <p/> + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + * <p/> + * Accepted by the &lt;tex&gt; parameter of GetTexImage: + */ + int GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + int GL_TEXTURE_BINDING_CUBE_MAP_ARRAY = 0x900A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CompressedTeximage3D, CompressedTexSubImage3D and CopyTexSubImage3D: + */ + int GL_PROXY_TEXTURE_CUBE_MAP_ARRAY = 0x900B; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_CUBE_MAP_ARRAY = 0x900C; + int GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW = 0x900D; + int GL_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900E; + int GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = 0x900F; + + // ------------------------------------------------------------------ + // ----------------------[ ARB_texture_gather ]---------------------- + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E; + int GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F; + int GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB = 0x8F9F; + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_transform_feedback2 ]---------------------- + // ----------------------------------------------------------------------- + + /** Accepted by the &lt;target&gt; parameter of BindTransformFeedback: */ + int GL_TRANSFORM_FEEDBACK = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_PAUSED = 0x8E23; + int GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8E24; + int GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED = GL_TRANSFORM_FEEDBACK_PAUSED; + int GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE = GL_TRANSFORM_FEEDBACK_ACTIVE; + int GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + + void glBindTransformFeedback(@GLenum int target, @GLuint int id); + + void glDeleteTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @Const @GLuint IntBuffer ids); + + @Alternate("glDeleteTransformFeedbacks") + void glDeleteTransformFeedbacks(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, id)", keepParam = true) int id); + + void glGenTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenTransformFeedbacks") + @GLreturn("ids") + void glGenTransformFeedbacks2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + boolean glIsTransformFeedback(@GLuint int id); + + void glPauseTransformFeedback(); + + void glResumeTransformFeedback(); + + void glDrawTransformFeedback(@GLenum int mode, @GLuint int id); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_transform_feedback3 ]---------------------- + // ----------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_TRANSFORM_FEEDBACK_BUFFERS = 0x8E70; + + void glDrawTransformFeedbackStream(@GLenum int mode, @GLuint int id, @GLuint int stream); + + void glBeginQueryIndexed(@GLenum int target, @GLuint int index, @GLuint int id); + + void glEndQueryIndexed(@GLenum int target, @GLuint int index); + + @StripPostfix("params") + void glGetQueryIndexediv(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetQueryIndexedi} instead. */ + @Alternate("glGetQueryIndexediv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GL40", method = "glGetQueryIndexedi") + @Deprecated + void glGetQueryIndexediv2(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetQueryIndexediv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryIndexediv3(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL41.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL41.java new file mode 100644 index 0000000..5543ca3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL41.java @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface GL41 { + + // --------------------------------------------------------------------- + // ----------------------[ ARB_ES2_compatibility ]---------------------- + // --------------------------------------------------------------------- + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_SHADER_COMPILER = 0x8DFA, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Accepted by the &lt;type&gt; parameter of VertexAttribPointer: */ + int GL_FIXED = 0x140C; + + /** + * Accepted by the &lt;precisiontype&gt; parameter of + * GetShaderPrecisionFormat: + */ + int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Accepted by the &lt;format&gt; parameter of most commands taking sized internal formats: */ + int GL_RGB565 = 0x8D62; + + void glReleaseShaderCompiler(); + + void glShaderBinary(@AutoSize("shaders") @GLsizei int count, @Const @GLuint IntBuffer shaders, + @GLenum int binaryformat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + void glGetShaderPrecisionFormat(@GLenum int shadertype, @GLenum int precisiontype, + @OutParameter @Check("2") IntBuffer range, + @OutParameter @Check("1") IntBuffer precision); + + void glDepthRangef(float n, float f); + + void glClearDepthf(float d); + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_get_program_binary ]---------------------- + // ---------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_PROGRAM_BINARY_LENGTH = 0x8741; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv and GetDoublev: + */ + int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE, + GL_PROGRAM_BINARY_FORMATS = 0x87FF; + + void glGetProgramBinary(@GLuint int program, @AutoSize("binary") @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @Check("1") @GLenum IntBuffer binaryFormat, + @OutParameter @GLvoid ByteBuffer binary); + + void glProgramBinary(@GLuint int program, @GLenum int binaryFormat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + void glProgramParameteri(@GLuint int program, @GLenum int pname, int value); + + // --------------------------------------------------------------------------- + // ----------------------[ ARB_separate_shader_objects ]---------------------- + // --------------------------------------------------------------------------- + + /** Accepted by &lt;stages&gt; parameter to UseProgramStages: */ + int GL_VERTEX_SHADER_BIT = 0x00000001, + GL_FRAGMENT_SHADER_BIT = 0x00000002, + GL_GEOMETRY_SHADER_BIT = 0x00000004, + GL_TESS_CONTROL_SHADER_BIT = 0x00000008, + GL_TESS_EVALUATION_SHADER_BIT = 0x00000010, + GL_ALL_SHADER_BITS = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteri and + * GetProgramiv: + */ + int GL_PROGRAM_SEPARABLE = 0x8258; + + /** Accepted by &lt;type&gt; parameter to GetProgramPipelineiv: */ + int GL_ACTIVE_PROGRAM = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_PROGRAM_PIPELINE_BINDING = 0x825A; + + void glUseProgramStages(@GLuint int pipeline, @GLbitfield int stages, @GLuint int program); + + void glActiveShaderProgram(@GLuint int pipeline, @GLuint int program); + + /** Single null-terminated source code string. */ + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated @Check @Const @Indirect @GLchar ByteBuffer string); + + /** Multiple null-terminated source code strings, one after the other. */ + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv2(@GLenum int type, @GLsizei int count, @NullTerminated("count") @Check @Const @Indirect @GLchar @PointerArray("count") ByteBuffer strings); + + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv3(@GLenum int type, @Constant("strings.length") @GLsizei int count, @NullTerminated @Check("1") @PointerArray(value = "count") @Const @NativeType("GLchar") ByteBuffer[] strings); + + @Alternate("glCreateShaderProgramv") + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramv(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated CharSequence string); + + @Alternate(value = "glCreateShaderProgramv", nativeAlt = true, skipNative = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramv2(@GLenum int type, @Constant("strings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings); + + void glBindProgramPipeline(@GLuint int pipeline); + + void glDeleteProgramPipelines(@AutoSize("pipelines") @GLsizei int n, @Const @GLuint IntBuffer pipelines); + + @Alternate("glDeleteProgramPipelines") + void glDeleteProgramPipelines(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, pipeline)", keepParam = true) int pipeline); + + void glGenProgramPipelines(@AutoSize("pipelines") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + @Alternate("glGenProgramPipelines") + @GLreturn("pipelines") + void glGenProgramPipelines2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + boolean glIsProgramPipeline(@GLuint int pipeline); + + @StripPostfix("params") + void glGetProgramPipelineiv(@GLuint int pipeline, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetProgramPipelineiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramPipelineiv2(@GLuint int pipeline, @GLenum int pname, @OutParameter IntBuffer params); + + void glProgramUniform1i(@GLuint int program, int location, int v0); + + void glProgramUniform2i(@GLuint int program, int location, int v0, int v1); + + void glProgramUniform3i(@GLuint int program, int location, int v0, int v1, int v2); + + void glProgramUniform4i(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + void glProgramUniform1f(@GLuint int program, int location, float v0); + + void glProgramUniform2f(@GLuint int program, int location, float v0, float v1); + + void glProgramUniform3f(@GLuint int program, int location, float v0, float v1, float v2); + + void glProgramUniform4f(@GLuint int program, int location, float v0, float v1, float v2, float v3); + + void glProgramUniform1d(@GLuint int program, int location, double v0); + + void glProgramUniform2d(@GLuint int program, int location, double v0, double v1); + + void glProgramUniform3d(@GLuint int program, int location, double v0, double v1, double v2); + + void glProgramUniform4d(@GLuint int program, int location, double v0, double v1, double v2, double v3); + + @StripPostfix("value") + void glProgramUniform1iv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform2iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform3iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform4iv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform1fv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform2fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform3fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform4fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform1dv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniform2dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniform3dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniform4dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const DoubleBuffer value); + + void glProgramUniform1ui(@GLuint int program, int location, int v0); + + void glProgramUniform2ui(@GLuint int program, int location, int v0, int v1); + + void glProgramUniform3ui(@GLuint int program, int location, int v0, int v1, int v2); + + void glProgramUniform4ui(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + @StripPostfix("value") + void glProgramUniform1uiv(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform2uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform3uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform4uiv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4fv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4dv(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2x3fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3x2fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2x4fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4x2fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3x4fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4x3fv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2x3dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (2 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3x2dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 2)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2x4dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4x2dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " >> 3") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3x4dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (3 * 4)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4x3dv(@GLuint int program, int location, + @AutoSize(value = "value", expression = " / (4 * 3)") @GLsizei int count, boolean transpose, @Const DoubleBuffer value); + + void glValidateProgramPipeline(@GLuint int pipeline); + + void glGetProgramPipelineInfoLog(@GLuint int pipeline, @AutoSize("infoLog") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetProgramPipelineInfoLog") + @GLreturn(value = "infoLog", maxLength = "bufSize") + void glGetProgramPipelineInfoLog2(@GLuint int pipeline, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_vertex_attrib_64bit ]---------------------- + // ----------------------------------------------------------------------- + + /** Returned in the &lt;type&gt; parameter of GetActiveAttrib: */ + int GL_DOUBLE_VEC2 = 0x8FFC; + int GL_DOUBLE_VEC3 = 0x8FFD; + int GL_DOUBLE_VEC4 = 0x8FFE; + int GL_DOUBLE_MAT2 = 0x8F46; + int GL_DOUBLE_MAT3 = 0x8F47; + int GL_DOUBLE_MAT4 = 0x8F48; + int GL_DOUBLE_MAT2x3 = 0x8F49; + int GL_DOUBLE_MAT2x4 = 0x8F4A; + int GL_DOUBLE_MAT3x2 = 0x8F4B; + int GL_DOUBLE_MAT3x4 = 0x8F4C; + int GL_DOUBLE_MAT4x2 = 0x8F4D; + int GL_DOUBLE_MAT4x3 = 0x8F4E; + + void glVertexAttribL1d(@GLuint int index, double x); + + void glVertexAttribL2d(@GLuint int index, double x, double y); + + void glVertexAttribL3d(@GLuint int index, double x, double y, double z); + + void glVertexAttribL4d(@GLuint int index, double x, double y, double z, double w); + + @StripPostfix("v") + void glVertexAttribL1dv(@GLuint int index, @Const @Check("1") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL2dv(@GLuint int index, @Const @Check("2") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL3dv(@GLuint int index, @Const @Check("3") DoubleBuffer v); + + @StripPostfix("v") + void glVertexAttribL4dv(@GLuint int index, @Const @Check("4") DoubleBuffer v); + + void glVertexAttribLPointer(@GLuint int index, int size, @Constant("GL11.GL_DOUBLE") @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check @Const @GLdouble Buffer pointer); + + @StripPostfix("params") + void glGetVertexAttribLdv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") DoubleBuffer params); + + // ------------------------------------------------------------------ + // ----------------------[ ARB_viewport_array ]---------------------- + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + int GL_MAX_VIEWPORTS = 0x825B, + GL_VIEWPORT_SUBPIXEL_BITS = 0x825C, + GL_VIEWPORT_BOUNDS_RANGE = 0x825D, + GL_LAYER_PROVOKING_VERTEX = 0x825E, + GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_v: */ + int GL_SCISSOR_BOX = 0x0C10; + + /** Accepted by the &lt;pname&gt; parameter of GetFloati_v: */ + int GL_VIEWPORT = 0x0BA2; + + /** Accepted by the &lt;pname&gt; parameter of GetDoublei_v: */ + int GL_DEPTH_RANGE = 0x0B70; + + /** Accepted by the &lt;pname&gt; parameter of Enablei, Disablei, and IsEnabledi: */ + int GL_SCISSOR_TEST = 0x0C11; + + /** + * Returned in the &lt;data&gt; parameter from a Get query with a &lt;pname&gt; of + * LAYER_PROVOKING_VERTEX or VIEWPORT_INDEX_PROVOKING_VERTEX: + */ + int GL_FIRST_VERTEX_CONVENTION = 0x8E4D, + GL_LAST_VERTEX_CONVENTION = 0x8E4E, + GL_PROVOKING_VERTEX = 0x8E4F, + GL_UNDEFINED_VERTEX = 0x8260; + + @StripPostfix("v") + void glViewportArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const FloatBuffer v); + + void glViewportIndexedf(@GLuint int index, float x, float y, float w, float h); + + @StripPostfix("v") + void glViewportIndexedfv(@GLuint int index, @Check("4") @Const FloatBuffer v); + + @StripPostfix("v") + void glScissorArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const IntBuffer v); + + void glScissorIndexed(@GLuint int index, int left, int bottom, @GLsizei int width, @GLsizei int height); + + @StripPostfix("v") + void glScissorIndexedv(@GLuint int index, @Check("4") @Const IntBuffer v); + + @StripPostfix("v") + void glDepthRangeArrayv(@GLuint int first, @AutoSize(value = "v", expression = " >> 1") @GLsizei int count, @Const DoubleBuffer v); + + void glDepthRangeIndexed(@GLuint int index, double n, double f); + + @StripPostfix("data") + void glGetFloati_v(@GLenum int target, @GLuint int index, @Check @OutParameter FloatBuffer data); + + @Alternate("glGetFloati_v") + @GLreturn("data") + @StripPostfix("data") + void glGetFloati_v2(@GLenum int target, @GLuint int index, @OutParameter FloatBuffer data); + + @StripPostfix("data") + void glGetDoublei_v(@GLenum int target, @GLuint int index, @Check @OutParameter DoubleBuffer data); + + @Alternate("glGetDoublei_v") + @GLreturn("data") + @StripPostfix("data") + void glGetDoublei_v2(@GLenum int target, @GLuint int index, @OutParameter DoubleBuffer data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL42.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL42.java new file mode 100644 index 0000000..92c13cc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL42.java @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.IntBuffer; + +public interface GL42 { + + // ---------------------------------------------------------------------------- + // ----------------------[ ARB_texture_compression_bptc ]---------------------- + // ---------------------------------------------------------------------------- + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, TexImage3D, + * CopyTexImage2D, CopyTexImage3D, CompressedTexImage2DARB, and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB and CompressedTexSubImage3DARB: + */ + int GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C; + int GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D; + int GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E; + int GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; + + // ------------------------------------------------------------------------------------ + // ----------------------[ ARB_compressed_texture_pixel_storage ]---------------------- + // ------------------------------------------------------------------------------------ + + /** + * Accepted by the &lt;pname&gt; parameter of PixelStore[fi], GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_UNPACK_COMPRESSED_BLOCK_WIDTH = 0x9127, + GL_UNPACK_COMPRESSED_BLOCK_HEIGHT = 0x9128, + GL_UNPACK_COMPRESSED_BLOCK_DEPTH = 0x9129, + GL_UNPACK_COMPRESSED_BLOCK_SIZE = 0x912A, + GL_PACK_COMPRESSED_BLOCK_WIDTH = 0x912B, + GL_PACK_COMPRESSED_BLOCK_HEIGHT = 0x912C, + GL_PACK_COMPRESSED_BLOCK_DEPTH = 0x912D, + GL_PACK_COMPRESSED_BLOCK_SIZE = 0x912E; + + // -------------------------------------------------------------------------- + // ----------------------[ ARB_shader_atomic_counters ]---------------------- + // -------------------------------------------------------------------------- + + /** Accepted by the &lt;target&gt; parameter of BindBufferBase and BindBufferRange: */ + int GL_ATOMIC_COUNTER_BUFFER = 0x92C0; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, GetInteger64i_v, GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, GetDoublev, and GetActiveAtomicCounterBufferiv: + */ + int GL_ATOMIC_COUNTER_BUFFER_BINDING = 0x92C1; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegeri_64v: */ + int GL_ATOMIC_COUNTER_BUFFER_START = 0x92C2, + GL_ATOMIC_COUNTER_BUFFER_SIZE = 0x92C3; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: */ + int GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE = 0x92C4, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = 0x92C5, + GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = 0x92C6, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = 0x92C7, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = 0x92C8, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x92C9, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = 0x92CA, + GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = 0x92CB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = 0x92CC, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = 0x92CD, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = 0x92CE, + GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = 0x92CF, + GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = 0x92D0, + GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = 0x92D1, + GL_MAX_VERTEX_ATOMIC_COUNTERS = 0x92D2, + GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS = 0x92D3, + GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS = 0x92D4, + GL_MAX_GEOMETRY_ATOMIC_COUNTERS = 0x92D5, + GL_MAX_FRAGMENT_ATOMIC_COUNTERS = 0x92D6, + GL_MAX_COMBINED_ATOMIC_COUNTERS = 0x92D7, + GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE = 0x92D8, + GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = 0x92DC; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_ACTIVE_ATOMIC_COUNTER_BUFFERS = 0x92D9; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformsiv: */ + int GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = 0x92DA; + + /** Returned in &lt;params&gt; by GetActiveUniform and GetActiveUniformsiv: */ + int GL_UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB; + + @Optional(reason = "AMD's beta 4.2 driver (11.8) does not expose this") + @StripPostfix("params") + void glGetActiveAtomicCounterBufferiv(@GLuint int program, @GLuint int bufferIndex, @GLenum int pname, @Check("1") @OutParameter IntBuffer params); + + @Alternate("glGetActiveAtomicCounterBufferiv") + @StripPostfix("params") + @GLreturn("params") + void glGetActiveAtomicCounterBufferiv2(@GLuint int program, @GLuint int bufferIndex, @GLenum int pname, @OutParameter IntBuffer params); + + // ------------------------------------------------------------------- + // ----------------------[ ARB_texture_storage ]---------------------- + // ------------------------------------------------------------------- + + /** Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: */ + int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + + void glTexStorage1D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width); + + void glTexStorage2D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glTexStorage3D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + // -------------------------------------------------------------------------------- + // ----------------------[ ARB_transform_feedback_instanced ]---------------------- + // -------------------------------------------------------------------------------- + + void glDrawTransformFeedbackInstanced(@GLenum int mode, @GLuint int id, @GLsizei int primcount); + + void glDrawTransformFeedbackStreamInstanced(@GLenum int mode, @GLuint int id, @GLuint int stream, @GLsizei int primcount); + + // ----------------------------------------------------------------- + // ----------------------[ ARB_base_instance ]---------------------- + // ----------------------------------------------------------------- + + void glDrawArraysInstancedBaseInstance(@GLenum int mode, + int first, + @GLsizei int count, + @GLsizei int primcount, + @GLuint int baseinstance); + + void glDrawElementsInstancedBaseInstance(@GLenum int mode, + @AutoSize("indices") @GLsizei int count, + @AutoType("indices") @GLenum int type, + @Const + @BufferObject(BufferKind.ElementVBO) + @GLubyte + @GLushort + @GLuint Buffer indices, + @GLsizei int primcount, + @GLuint int baseinstance); + + void glDrawElementsInstancedBaseVertexBaseInstance(@GLenum int mode, + @AutoSize("indices") @GLsizei int count, + @AutoType("indices") @GLenum int type, + @Const + @BufferObject(BufferKind.ElementVBO) + @GLubyte + @GLushort + @GLuint Buffer indices, + @GLsizei int primcount, + int basevertex, + @GLuint int baseinstance); + + // --------------------------------------------------------------------------- + // ----------------------[ ARB_shader_image_load_store ]---------------------- + // --------------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_IMAGE_UNITS = 0x8F38, + GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = 0x8F39, + GL_MAX_IMAGE_SAMPLES = 0x906D, + GL_MAX_VERTEX_IMAGE_UNIFORMS = 0x90CA, + GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS = 0x90CB, + GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS = 0x90CC, + GL_MAX_GEOMETRY_IMAGE_UNIFORMS = 0x90CD, + GL_MAX_FRAGMENT_IMAGE_UNIFORMS = 0x90CE, + GL_MAX_COMBINED_IMAGE_UNIFORMS = 0x90CF; + + /** Accepted by the &lt;target&gt; parameter of GetIntegeri_v and GetBooleani_v: */ + int GL_IMAGE_BINDING_NAME = 0x8F3A, + GL_IMAGE_BINDING_LEVEL = 0x8F3B, + GL_IMAGE_BINDING_LAYERED = 0x8F3C, + GL_IMAGE_BINDING_LAYER = 0x8F3D, + GL_IMAGE_BINDING_ACCESS = 0x8F3E, + GL_IMAGE_BINDING_FORMAT = 0x906E; + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: */ + int GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT = 0x00000001, + GL_ELEMENT_ARRAY_BARRIER_BIT = 0x00000002, + GL_UNIFORM_BARRIER_BIT = 0x00000004, + GL_TEXTURE_FETCH_BARRIER_BIT = 0x00000008, + GL_SHADER_IMAGE_ACCESS_BARRIER_BIT = 0x00000020, + GL_COMMAND_BARRIER_BIT = 0x00000040, + GL_PIXEL_BUFFER_BARRIER_BIT = 0x00000080, + GL_TEXTURE_UPDATE_BARRIER_BIT = 0x00000100, + GL_BUFFER_UPDATE_BARRIER_BIT = 0x00000200, + GL_FRAMEBUFFER_BARRIER_BIT = 0x00000400, + GL_TRANSFORM_FEEDBACK_BARRIER_BIT = 0x00000800, + GL_ATOMIC_COUNTER_BARRIER_BIT = 0x00001000, + GL_ALL_BARRIER_BITS = 0xFFFFFFFF; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_IMAGE_1D = 0x904C, + GL_IMAGE_2D = 0x904D, + GL_IMAGE_3D = 0x904E, + GL_IMAGE_2D_RECT = 0x904F, + GL_IMAGE_CUBE = 0x9050, + GL_IMAGE_BUFFER = 0x9051, + GL_IMAGE_1D_ARRAY = 0x9052, + GL_IMAGE_2D_ARRAY = 0x9053, + GL_IMAGE_CUBE_MAP_ARRAY = 0x9054, + GL_IMAGE_2D_MULTISAMPLE = 0x9055, + GL_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056, + GL_INT_IMAGE_1D = 0x9057, + GL_INT_IMAGE_2D = 0x9058, + GL_INT_IMAGE_3D = 0x9059, + GL_INT_IMAGE_2D_RECT = 0x905A, + GL_INT_IMAGE_CUBE = 0x905B, + GL_INT_IMAGE_BUFFER = 0x905C, + GL_INT_IMAGE_1D_ARRAY = 0x905D, + GL_INT_IMAGE_2D_ARRAY = 0x905E, + GL_INT_IMAGE_CUBE_MAP_ARRAY = 0x905F, + GL_INT_IMAGE_2D_MULTISAMPLE = 0x9060, + GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061, + GL_UNSIGNED_INT_IMAGE_1D = 0x9062, + GL_UNSIGNED_INT_IMAGE_2D = 0x9063, + GL_UNSIGNED_INT_IMAGE_3D = 0x9064, + GL_UNSIGNED_INT_IMAGE_2D_RECT = 0x9065, + GL_UNSIGNED_INT_IMAGE_CUBE = 0x9066, + GL_UNSIGNED_INT_IMAGE_BUFFER = 0x9067, + GL_UNSIGNED_INT_IMAGE_1D_ARRAY = 0x9068, + GL_UNSIGNED_INT_IMAGE_2D_ARRAY = 0x9069, + GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = 0x906A, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = 0x906B, + GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C; + + /** + * Accepted by the &lt;value&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv: + */ + int GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7; + + /** + * Returned in the &lt;data&gt; parameter of GetTexParameteriv, GetTexParameterfv, + * GetTexParameterIiv, and GetTexParameterIuiv when &lt;value&gt; is + * IMAGE_FORMAT_COMPATIBILITY_TYPE: + */ + int GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = 0x90C8, + IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = 0x90C9; + + void glBindImageTexture(@GLuint int unit, @GLuint int texture, int level, + boolean layered, int layer, @GLenum int access, + @GLenum int format); + + void glMemoryBarrier(@GLbitfield int barriers); + + // ------------------------------------------------------------------------- + // ----------------------[ ARB_internal_format_query ]---------------------- + // ------------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetInternalformativ: */ + int GL_NUM_SAMPLE_COUNTS = 0x9380; + + @StripPostfix("params") + void glGetInternalformativ(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @AutoSize("params") @GLsizei int bufSize, @OutParameter IntBuffer params); + + @Alternate("glGetInternalformativ") + @StripPostfix("params") + @GLreturn("params") + void glGetInternalformativ2(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @Constant("1") @GLsizei int bufSize, @OutParameter IntBuffer params); + + // ------------------------------------------------------------------------ + // ----------------------[ ARB_map_buffer_alignment ]---------------------- + // ------------------------------------------------------------------------ + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MIN_MAP_BUFFER_ALIGNMENT = 0x90BC; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL43.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL43.java new file mode 100644 index 0000000..3be03a0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL43.java @@ -0,0 +1,858 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +import com.sun.mirror.type.PrimitiveType; + +public interface GL43 { + + /** No. of supported Shading Language Versions. Accepted by the &lt;pname&gt; parameter of GetIntegerv. */ + int GL_NUM_SHADING_LANGUAGE_VERSIONS = 0x82E9; + + /** Vertex attrib array has unconverted doubles. Accepted by the &lt;pname&gt; parameter of GetVertexAttribiv. */ + int GL_VERTEX_ATTRIB_ARRAY_LONG = 0x874E; + + // --------------------------------------------------------------------- + // ----------------------[ ARB_ES3_compatibility ]---------------------- + // --------------------------------------------------------------------- + + /** Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D */ + int GL_COMPRESSED_RGB8_ETC2 = 0x9274, + GL_COMPRESSED_SRGB8_ETC2 = 0x9275, + GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276, + GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277, + GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278, + GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279, + GL_COMPRESSED_R11_EAC = 0x9270, + GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, + GL_COMPRESSED_RG11_EAC = 0x9272, + GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + + /** Accepted by the &lt;target&gt; parameter of Enable and Disable: */ + int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, + * GetQueryIndexediv and GetQueryiv: + */ + int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + + /** Accepted by the &lt;value&gt; parameter of the GetInteger* functions: */ + int GL_MAX_ELEMENT_INDEX = 0x8D6B; + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_clear_buffer_object ]---------------------- + // ----------------------------------------------------------------------- + + void glClearBufferData(@GLenum int target, + @GLenum int internalformat, + @GLenum int format, + @GLenum int type, + @Check("1") @Const @GLvoid ByteBuffer data); + + void glClearBufferSubData(@GLenum int target, + @GLenum int internalformat, + @GLintptr long offset, + @AutoSize("data") @GLsizeiptr long size, + @GLenum int format, + @GLenum int type, + @Const @GLvoid ByteBuffer data); + + // ------------------------------------------------------------------ + // ----------------------[ ARB_compute_shader ]---------------------- + // ------------------------------------------------------------------ + + /** + * Accepted by the &lt;type&gt; parameter of CreateShader and returned in the + * &lt;params&gt; parameter by GetShaderiv: + */ + int GL_COMPUTE_SHADER = 0x91B9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, + * GetDoublev and GetInteger64v: + */ + int GL_MAX_COMPUTE_UNIFORM_BLOCKS = 0x91BB, + GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS = 0x91BC, + GL_MAX_COMPUTE_IMAGE_UNIFORMS = 0x91BD, + GL_MAX_COMPUTE_SHARED_MEMORY_SIZE = 0x8262, + GL_MAX_COMPUTE_UNIFORM_COMPONENTS = 0x8263, + GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = 0x8264, + GL_MAX_COMPUTE_ATOMIC_COUNTERS = 0x8265, + GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = 0x8266, + GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = 0x90EB; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetFloati_v, GetDoublei_v and GetInteger64i_v: + */ + + int GL_MAX_COMPUTE_WORK_GROUP_COUNT = 0x91BE, + GL_MAX_COMPUTE_WORK_GROUP_SIZE = 0x91BF; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_COMPUTE_WORK_GROUP_SIZE = 0x8267; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveUniformBlockiv: */ + int GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = 0x90EC; + + /** Accepted by the &lt;pname&gt; parameter of GetActiveAtomicCounterBufferiv: */ + int GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = 0x90ED; + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_DISPATCH_INDIRECT_BUFFER = 0x90EE; + + /** + * Accepted by the &lt;value&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_DISPATCH_INDIRECT_BUFFER_BINDING = 0x90EF; + + /** Accepted by the &lt;stages&gt; parameter of UseProgramStages: */ + int GL_COMPUTE_SHADER_BIT = 0x00000020; + + void glDispatchCompute(@GLuint int num_groups_x, + @GLuint int num_groups_y, + @GLuint int num_groups_z); + + void glDispatchComputeIndirect(@GLintptr long indirect); + + // -------------------------------------------------------------- + // ----------------------[ ARB_copy_image ]---------------------- + // -------------------------------------------------------------- + + void glCopyImageSubData( + @GLuint int srcName, @GLenum int srcTarget, int srcLevel, + int srcX, int srcY, int srcZ, + @GLuint int dstName, @GLenum int dstTarget, int dstLevel, + int dstX, int dstY, int dstZ, + @GLsizei int srcWidth, @GLsizei int srcHeight, @GLsizei int srcDepth); + + // ---------------------------------------------------------------- + // ----------------------[ KHR_debug_output ]---------------------- + // ----------------------[ ARB_debug_output2 ]--------------------- + // ----------------------[ ARB_debug_group ]----------------------- + // ----------------------[ ARB_debug_label ]----------------------- + // ---------------------------------------------------------------- + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: */ + int GL_CONTEXT_FLAG_DEBUG_BIT = 0x00000002; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: */ + int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Returned by GetError: */ + int GL_STACK_UNDERFLOW = 0x0504, + GL_STACK_OVERFLOW = 0x0503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + // ----------------------------- + + void glDebugMessageControl(@GLenum int source, + @GLenum int type, + @GLenum int severity, + @AutoSize(value = "ids", canBeNull = true) @GLsizei int count, + @Check(canBeNull = true) @Const @GLuint IntBuffer ids, + boolean enabled); + + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @AutoSize("buf") @GLsizei int length, + @Const @GLchar ByteBuffer buf); + + @Alternate("glDebugMessageInsert") + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @Constant("buf.length()") @GLsizei int length, + CharSequence buf); + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * + * @param callback the callback function to use + */ + @Code( + // Create a GlobalRef to the callback object and register it with the current context. + javaBeforeNative = "\t\tlong userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler());\n" + + "\t\tCallbackUtil.registerContextCallbackKHR(userParam);" + ) + void glDebugMessageCallback(@PointerWrapper(value = "GLDEBUGPROC", canBeNull = true) KHRDebugCallback callback, + @Constant("userParam") @PointerWrapper("GLvoid *") long userParam); + + @GLuint + int glGetDebugMessageLog(@GLuint int count, + @AutoSize(value = "messageLog", canBeNull = true) @GLsizei int bufsize, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer sources, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer types, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer ids, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer severities, + @Check(value = "count", canBeNull = true) @GLsizei IntBuffer lengths, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer messageLog); + + void glPushDebugGroup(@GLenum int source, @GLuint int id, @AutoSize("message") @GLsizei int length, + @Const @GLchar ByteBuffer message); + + @Alternate("glPushDebugGroup") + void glPushDebugGroup(@GLenum int source, @GLuint int id, @Constant("message.length()") @GLsizei int length, + CharSequence message); + + void glPopDebugGroup(); + + void glObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Alternate("glObjectLabel") + void glObjectLabel(@GLenum int identifier, @GLuint int name, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + void glGetObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Alternate("glGetObjectLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectLabel2(@GLenum int identifier, @GLuint int name, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Alternate("glObjectPtrLabel") + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + void glGetObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Alternate("glGetObjectPtrLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectPtrLabel2(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + // ----------------------------------------------------------------------------- + // ----------------------[ ARB_explicit_uniform_location ]---------------------- + // ----------------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, and GetInteger64v: + */ + int GL_MAX_UNIFORM_LOCATIONS = 0x826E; + + // ----------------------------------------------------------------------------- + // ----------------------[ ARB_framebuffer_no_attachment ]---------------------- + // ----------------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of FramebufferParameteri, + * GetFramebufferParameteriv, NamedFramebufferParameteriEXT, and + * GetNamedFramebufferParameterivEXT: + */ + int GL_FRAMEBUFFER_DEFAULT_WIDTH = 0x9310, + GL_FRAMEBUFFER_DEFAULT_HEIGHT = 0x9311, + GL_FRAMEBUFFER_DEFAULT_LAYERS = 0x9312, + GL_FRAMEBUFFER_DEFAULT_SAMPLES = 0x9313, + GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = 0x9314; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_FRAMEBUFFER_WIDTH = 0x9315, + GL_MAX_FRAMEBUFFER_HEIGHT = 0x9316, + GL_MAX_FRAMEBUFFER_LAYERS = 0x9317, + GL_MAX_FRAMEBUFFER_SAMPLES = 0x9318; + + void glFramebufferParameteri(@GLenum int target, @GLenum int pname, int param); + + @StripPostfix("params") + void glGetFramebufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetFramebufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + // ----------------------------------------------------------------------------- + // ----------------------[ ARB_internalformat_query2 ]---------------------- + // ----------------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + int GL_TEXTURE_1D = 0x0DE0, + GL_TEXTURE_1D_ARRAY = 0x8C18, + GL_TEXTURE_2D = 0x0DE1, + GL_TEXTURE_2D_ARRAY = 0x8C1A, + GL_TEXTURE_3D = 0x806F, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_CUBE_MAP_ARRAY = 0x9009, + GL_TEXTURE_RECTANGLE = 0x84F5, + GL_TEXTURE_BUFFER = 0x8C2A, + GL_RENDERBUFFER = 0x8D41, + GL_TEXTURE_2D_MULTISAMPLE = 0x9100, + GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102; + + /** + * Accepted by the &lt;pname&gt; parameter of GetInternalformativ + * and GetInternalformati64v: + */ + int GL_SAMPLES = 0x80A9, + GL_NUM_SAMPLE_COUNTS = 0x9380, + GL_INTERNALFORMAT_SUPPORTED = 0x826F, + GL_INTERNALFORMAT_PREFERRED = 0x8270, + GL_INTERNALFORMAT_RED_SIZE = 0x8271, + GL_INTERNALFORMAT_GREEN_SIZE = 0x8272, + GL_INTERNALFORMAT_BLUE_SIZE = 0x8273, + GL_INTERNALFORMAT_ALPHA_SIZE = 0x8274, + GL_INTERNALFORMAT_DEPTH_SIZE = 0x8275, + GL_INTERNALFORMAT_STENCIL_SIZE = 0x8276, + GL_INTERNALFORMAT_SHARED_SIZE = 0x8277, + GL_INTERNALFORMAT_RED_TYPE = 0x8278, + GL_INTERNALFORMAT_GREEN_TYPE = 0x8279, + GL_INTERNALFORMAT_BLUE_TYPE = 0x827A, + GL_INTERNALFORMAT_ALPHA_TYPE = 0x827B, + GL_INTERNALFORMAT_DEPTH_TYPE = 0x827C, + GL_INTERNALFORMAT_STENCIL_TYPE = 0x827D, + GL_MAX_WIDTH = 0x827E, + GL_MAX_HEIGHT = 0x827F, + GL_MAX_DEPTH = 0x8280, + GL_MAX_LAYERS = 0x8281, + GL_MAX_COMBINED_DIMENSIONS = 0x8282, + GL_COLOR_COMPONENTS = 0x8283, + GL_DEPTH_COMPONENTS = 0x8284, + GL_STENCIL_COMPONENTS = 0x8285, + GL_COLOR_RENDERABLE = 0x8286, + GL_DEPTH_RENDERABLE = 0x8287, + GL_STENCIL_RENDERABLE = 0x8288, + GL_FRAMEBUFFER_RENDERABLE = 0x8289, + GL_FRAMEBUFFER_RENDERABLE_LAYERED = 0x828A, + GL_FRAMEBUFFER_BLEND = 0x828B, + GL_READ_PIXELS = 0x828C, + GL_READ_PIXELS_FORMAT = 0x828D, + GL_READ_PIXELS_TYPE = 0x828E, + GL_TEXTURE_IMAGE_FORMAT = 0x828F, + GL_TEXTURE_IMAGE_TYPE = 0x8290, + GL_GET_TEXTURE_IMAGE_FORMAT = 0x8291, + GL_GET_TEXTURE_IMAGE_TYPE = 0x8292, + GL_MIPMAP = 0x8293, + GL_MANUAL_GENERATE_MIPMAP = 0x8294, + GL_AUTO_GENERATE_MIPMAP = 0x8295, + GL_COLOR_ENCODING = 0x8296, + GL_SRGB_READ = 0x8297, + GL_SRGB_WRITE = 0x8298, + GL_SRGB_DECODE_ARB = 0x8299, + GL_FILTER = 0x829A, + GL_VERTEX_TEXTURE = 0x829B, + GL_TESS_CONTROL_TEXTURE = 0x829C, + GL_TESS_EVALUATION_TEXTURE = 0x829D, + GL_GEOMETRY_TEXTURE = 0x829E, + GL_FRAGMENT_TEXTURE = 0x829F, + GL_COMPUTE_TEXTURE = 0x82A0, + GL_TEXTURE_SHADOW = 0x82A1, + GL_TEXTURE_GATHER = 0x82A2, + GL_TEXTURE_GATHER_SHADOW = 0x82A3, + GL_SHADER_IMAGE_LOAD = 0x82A4, + GL_SHADER_IMAGE_STORE = 0x82A5, + GL_SHADER_IMAGE_ATOMIC = 0x82A6, + GL_IMAGE_TEXEL_SIZE = 0x82A7, + GL_IMAGE_COMPATIBILITY_CLASS = 0x82A8, + GL_IMAGE_PIXEL_FORMAT = 0x82A9, + GL_IMAGE_PIXEL_TYPE = 0x82AA, + GL_IMAGE_FORMAT_COMPATIBILITY_TYPE = 0x90C7, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = 0x82AC, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = 0x82AD, + GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = 0x82AE, + GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = 0x82AF, + GL_TEXTURE_COMPRESSED = 0x86A1, + GL_TEXTURE_COMPRESSED_BLOCK_WIDTH = 0x82B1, + GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT = 0x82B2, + GL_TEXTURE_COMPRESSED_BLOCK_SIZE = 0x82B3, + GL_CLEAR_BUFFER = 0x82B4, + GL_TEXTURE_VIEW = 0x82B5, + GL_VIEW_COMPATIBILITY_CLASS = 0x82B6; + + /** + * Returned as possible responses for various &lt;pname&gt; queries + * to GetInternalformativ and GetInternalformati64v + */ + int GL_FULL_SUPPORT = 0x82B7, + GL_CAVEAT_SUPPORT = 0x82B8, + GL_IMAGE_CLASS_4_X_32 = 0x82B9, + GL_IMAGE_CLASS_2_X_32 = 0x82BA, + GL_IMAGE_CLASS_1_X_32 = 0x82BB, + GL_IMAGE_CLASS_4_X_16 = 0x82BC, + GL_IMAGE_CLASS_2_X_16 = 0x82BD, + GL_IMAGE_CLASS_1_X_16 = 0x82BE, + GL_IMAGE_CLASS_4_X_8 = 0x82BF, + GL_IMAGE_CLASS_2_X_8 = 0x82C0, + GL_IMAGE_CLASS_1_X_8 = 0x82C1, + GL_IMAGE_CLASS_11_11_10 = 0x82C2, + GL_IMAGE_CLASS_10_10_10_2 = 0x82C3, + GL_VIEW_CLASS_128_BITS = 0x82C4, + GL_VIEW_CLASS_96_BITS = 0x82C5, + GL_VIEW_CLASS_64_BITS = 0x82C6, + GL_VIEW_CLASS_48_BITS = 0x82C7, + GL_VIEW_CLASS_32_BITS = 0x82C8, + GL_VIEW_CLASS_24_BITS = 0x82C9, + GL_VIEW_CLASS_16_BITS = 0x82CA, + GL_VIEW_CLASS_8_BITS = 0x82CB, + GL_VIEW_CLASS_S3TC_DXT1_RGB = 0x82CC, + GL_VIEW_CLASS_S3TC_DXT1_RGBA = 0x82CD, + GL_VIEW_CLASS_S3TC_DXT3_RGBA = 0x82CE, + GL_VIEW_CLASS_S3TC_DXT5_RGBA = 0x82CF, + GL_VIEW_CLASS_RGTC1_RED = 0x82D0, + GL_VIEW_CLASS_RGTC2_RG = 0x82D1, + GL_VIEW_CLASS_BPTC_UNORM = 0x82D2, + GL_VIEW_CLASS_BPTC_FLOAT = 0x82D3; + + @StripPostfix("params") + void glGetInternalformati64v(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @AutoSize("params") @GLsizei int bufSize, @OutParameter @GLint64 LongBuffer params); + + @Alternate("glGetInternalformati64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetInternalformati64v2(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @Constant("1") @GLsizei int bufSize, @OutParameter @GLint64 LongBuffer params); + + // ---------------------------------------------------------------------- + // ----------------------[ ARB_invalidate_subdata ]---------------------- + // ---------------------------------------------------------------------- + + void glInvalidateTexSubImage(@GLuint int texture, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + void glInvalidateTexImage(@GLuint int texture, int level); + + void glInvalidateBufferSubData(@GLuint int buffer, @GLintptr long offset, @GLsizeiptr long length); + + void glInvalidateBufferData(@GLuint int buffer); + + void glInvalidateFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments); + + void glInvalidateSubFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments, + int x, int y, @GLsizei int width, @GLsizei int height); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_multi_draw_indirect ]---------------------- + // ----------------------------------------------------------------------- + + void glMultiDrawArraysIndirect(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Alternate("glMultiDrawArraysIndirect") + void glMultiDrawArraysIndirect(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 4 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + void glMultiDrawElementsIndirect(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 * 4 : stride) * primcount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + @Alternate("glMultiDrawElementsIndirect") + void glMultiDrawElementsIndirect(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 5 : stride >> 2) * primcount") @Const @GLvoid(PrimitiveType.Kind.INT) IntBuffer indirect, + @GLsizei int primcount, + @GLsizei int stride); + + // --------------------------------------------------------------------------- + // ----------------------[ ARB_program_interface_query ]---------------------- + // --------------------------------------------------------------------------- + + /** + * Accepted by the &lt;programInterface&gt; parameter of GetProgramInterfaceiv, + * GetProgramResourceIndex, GetProgramResourceName, GetProgramResourceiv, + * GetProgramResourceLocation, and GetProgramResourceLocationIndex: + */ + int GL_UNIFORM = 0x92E1, + GL_UNIFORM_BLOCK = 0x92E2, + GL_PROGRAM_INPUT = 0x92E3, + GL_PROGRAM_OUTPUT = 0x92E4, + GL_BUFFER_VARIABLE = 0x92E5, + GL_SHADER_STORAGE_BLOCK = 0x92E6, + GL_VERTEX_SUBROUTINE = 0x92E8, + GL_TESS_CONTROL_SUBROUTINE = 0x92E9, + GL_TESS_EVALUATION_SUBROUTINE = 0x92EA, + GL_GEOMETRY_SUBROUTINE = 0x92EB, + GL_FRAGMENT_SUBROUTINE = 0x92EC, + GL_COMPUTE_SUBROUTINE = 0x92ED, + GL_VERTEX_SUBROUTINE_UNIFORM = 0x92EE, + GL_TESS_CONTROL_SUBROUTINE_UNIFORM = 0x92EF, + GL_TESS_EVALUATION_SUBROUTINE_UNIFORM = 0x92F0, + GL_GEOMETRY_SUBROUTINE_UNIFORM = 0x92F1, + GL_FRAGMENT_SUBROUTINE_UNIFORM = 0x92F2, + GL_COMPUTE_SUBROUTINE_UNIFORM = 0x92F3, + GL_TRANSFORM_FEEDBACK_VARYING = 0x92F4; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramInterfaceiv: */ + int GL_ACTIVE_RESOURCES = 0x92F5, + GL_MAX_NAME_LENGTH = 0x92F6, + GL_MAX_NUM_ACTIVE_VARIABLES = 0x92F7, + GL_MAX_NUM_COMPATIBLE_SUBROUTINES = 0x92F8; + + /** Accepted in the &lt;props&gt; array of GetProgramResourceiv: */ + int GL_NAME_LENGTH = 0x92F9, + GL_TYPE = 0x92FA, + GL_ARRAY_SIZE = 0x92FB, + GL_OFFSET = 0x92FC, + GL_BLOCK_INDEX = 0x92FD, + GL_ARRAY_STRIDE = 0x92FE, + GL_MATRIX_STRIDE = 0x92FF, + GL_IS_ROW_MAJOR = 0x9300, + GL_ATOMIC_COUNTER_BUFFER_INDEX = 0x9301, + GL_BUFFER_BINDING = 0x9302, + GL_BUFFER_DATA_SIZE = 0x9303, + GL_NUM_ACTIVE_VARIABLES = 0x9304, + GL_ACTIVE_VARIABLES = 0x9305, + GL_REFERENCED_BY_VERTEX_SHADER = 0x9306, + GL_REFERENCED_BY_TESS_CONTROL_SHADER = 0x9307, + GL_REFERENCED_BY_TESS_EVALUATION_SHADER = 0x9308, + GL_REFERENCED_BY_GEOMETRY_SHADER = 0x9309, + GL_REFERENCED_BY_FRAGMENT_SHADER = 0x930A, + GL_REFERENCED_BY_COMPUTE_SHADER = 0x930B, + GL_TOP_LEVEL_ARRAY_SIZE = 0x930C, + GL_TOP_LEVEL_ARRAY_STRIDE = 0x930D, + GL_LOCATION = 0x930E, + GL_LOCATION_INDEX = 0x930F, + GL_IS_PER_PATCH = 0x92E7; + + @StripPostfix("params") + void glGetProgramInterfaceiv(@GLuint int program, @GLenum int programInterface, + @GLenum int pname, @Check("1") @OutParameter IntBuffer params); + + @Alternate("glGetProgramInterfaceiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramInterfaceiv2(@GLuint int program, @GLenum int programInterface, + @GLenum int pname, @OutParameter IntBuffer params); + + @GLuint + int glGetProgramResourceIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetProgramResourceIndex") + @GLuint + int glGetProgramResourceIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + + void glGetProgramResourceName(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @AutoSize(value = "name", canBeNull = true) @GLsizei int bufSize, @Check(value = "1", canBeNull = true) @OutParameter @GLsizei IntBuffer length, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetProgramResourceName") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetProgramResourceName2(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + @StripPostfix("params") + void glGetProgramResourceiv(@GLuint int program, @GLenum int programInterface, + @GLuint int index, @AutoSize("props") @GLsizei int propCount, + @Const @GLenum IntBuffer props, @AutoSize("params") @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @OutParameter @GLsizei IntBuffer length, @OutParameter IntBuffer params); + + int glGetProgramResourceLocation(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetProgramResourceLocation") + int glGetProgramResourceLocation(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + + int glGetProgramResourceLocationIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetProgramResourceLocationIndex") + int glGetProgramResourceLocationIndex(@GLuint int program, @GLenum int programInterface, + @NullTerminated CharSequence name); + + // -------------------------------------------------------------------------------- + // ----------------------[ ARB_shader_storage_buffer_object ]---------------------- + // -------------------------------------------------------------------------------- + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, and + * GetBufferPointerv: + */ + int GL_SHADER_STORAGE_BUFFER = 0x90D2; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetIntegeri_v, + * GetBooleanv, GetInteger64v, GetFloatv, GetDoublev, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_SHADER_STORAGE_BUFFER_BINDING = 0x90D3; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegeri_v, GetBooleani_v, + * GetIntegeri_v, GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_SHADER_STORAGE_BUFFER_START = 0x90D4, + GL_SHADER_STORAGE_BUFFER_SIZE = 0x90D5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS = 0x90D6, + GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = 0x90D7, + GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = 0x90D8, + GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = 0x90D9, + GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = 0x90DA, + GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS = 0x90DB, + GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS = 0x90DC, + GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS = 0x90DD, + GL_MAX_SHADER_STORAGE_BLOCK_SIZE = 0x90DE, + GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = 0x90DF; + + /** Accepted in the &lt;barriers&gt; bitfield in glMemoryBarrier: */ + int GL_SHADER_STORAGE_BARRIER_BIT = 0x2000; + + /** + * Alias for the existing token + * MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS: + */ + int GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES = 0x8F39; + + void glShaderStorageBlockBinding(@GLuint int program, @GLuint int storageBlockIndex, + @GLuint int storageBlockBinding); + + // --------------------------------------------------------------------- + // ----------------------[ ARB_stencil_texturing ]---------------------- + // --------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of TexParameter* and GetTexParameter*: */ + int GL_DEPTH_STENCIL_TEXTURE_MODE = 0x90EA; + + // ------------------------------------------------------------------------ + // ----------------------[ ARB_texture_buffer_range ]---------------------- + // ------------------------------------------------------------------------ + + /** Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: */ + int GL_TEXTURE_BUFFER_OFFSET = 0x919D, + GL_TEXTURE_BUFFER_SIZE = 0x919E; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 0x919F; + + void glTexBufferRange(@GLenum int target, + @GLenum int internalformat, + @GLuint int buffer, + @GLintptr long offset, + @GLsizeiptr long size); + + // ------------------------------------------------------------------------------- + // ----------------------[ ARB_texture_storage_multisample ]---------------------- + // ------------------------------------------------------------------------------- + + void glTexStorage2DMultisample(@GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + boolean fixedsamplelocations); + + void glTexStorage3DMultisample(@GLenum int target, + @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, + @GLsizei int height, + @GLsizei int depth, + boolean fixedsamplelocations); + + // ---------------------------------------------------------------- + // ----------------------[ ARB_texture_view ]---------------------- + // ---------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv and + * GetTexParameteriv: + */ + int GL_TEXTURE_VIEW_MIN_LEVEL = 0x82DB, + GL_TEXTURE_VIEW_NUM_LEVELS = 0x82DC, + GL_TEXTURE_VIEW_MIN_LAYER = 0x82DD, + GL_TEXTURE_VIEW_NUM_LAYERS = 0x82DE, + GL_TEXTURE_IMMUTABLE_LEVELS = 0x82DF; + + void glTextureView(@GLuint int texture, @GLenum int target, @GLuint int origtexture, + @GLenum int internalformat, + @GLuint int minlevel, @GLuint int numlevels, + @GLuint int minlayer, @GLuint int numlayers); + + // ------------------------------------------------------------------------- + // ----------------------[ ARB_vertex_attrib_binding ]---------------------- + // ------------------------------------------------------------------------- + + /** Accepted by the &lt;pname&gt; parameter of GetVertexAttrib*v: */ + int GL_VERTEX_ATTRIB_BINDING = 0x82D4, + GL_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D5; + + /** + * Accepted by the &lt;target&gt; parameter of GetBooleani_v, GetIntegeri_v, + * GetFloati_v, GetDoublei_v, and GetInteger64i_v: + */ + int GL_VERTEX_BINDING_DIVISOR = 0x82D6, + GL_VERTEX_BINDING_OFFSET = 0x82D7, + GL_VERTEX_BINDING_STRIDE = 0x82D8; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv, ... */ + int GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = 0x82D9, + GL_MAX_VERTEX_ATTRIB_BINDINGS = 0x82DA; + + void glBindVertexBuffer(@GLuint int bindingindex, @GLuint int buffer, @GLintptr long offset, + @GLsizei int stride); + + void glVertexAttribFormat(@GLuint int attribindex, int size, @GLenum int type, + boolean normalized, @GLuint int relativeoffset); + + void glVertexAttribIFormat(@GLuint int attribindex, int size, @GLenum int type, + @GLuint int relativeoffset); + + void glVertexAttribLFormat(@GLuint int attribindex, int size, @GLenum int type, + @GLuint int relativeoffset); + + void glVertexAttribBinding(@GLuint int attribindex, @GLuint int bindingindex); + + void glVertexBindingDivisor(@GLuint int bindingindex, @GLuint int divisor); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL44.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL44.java new file mode 100644 index 0000000..79531d2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GL44.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.PointerBuffer; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.IntBuffer; + +public interface GL44 { + + /** Implementation-dependent state which constrains the maximum value of stride parameters to vertex array pointer-setting commands. */ + int GL_MAX_VERTEX_ATTRIB_STRIDE = 0x82E5; + + // ------------------------------------------------------------------ + // ----------------------[ ARB_buffer_storage ]---------------------- + // ------------------------------------------------------------------ + + /** + * Accepted in the &lt;flags&gt; parameter of BufferStorage and + * NamedBufferStorageEXT: + */ + int GL_MAP_PERSISTENT_BIT = 0x0040, + GL_MAP_COHERENT_BIT = 0x0080, + GL_DYNAMIC_STORAGE_BIT = 0x0100, + GL_CLIENT_STORAGE_BIT = 0x0200; + + /** Accepted by the &lt;pname&gt; parameter of GetBufferParameter{i|i64}v:\ */ + + int GL_BUFFER_IMMUTABLE_STORAGE = 0x821F, + GL_BUFFER_STORAGE_FLAGS = 0x8220; + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrier: */ + int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT = 0x00004000; + + void glBufferStorage(@GLenum int target, + @AutoSize("data") @GLsizeiptr long size, + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data, + @GLbitfield int flags); + + @Alternate("glBufferStorage") + void glBufferStorage2(@GLenum int target, + @GLsizeiptr long size, + @Constant("0L") @Const Buffer data, + @GLbitfield int flags); + + // ----------------------------------------------------------------- + // ----------------------[ ARB_clear_texture ]---------------------- + // ----------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter for GetInternalformativ and + * GetInternalformati64v: + */ + int GL_CLEAR_TEXTURE = 0x9365; + + void glClearTexImage(@GLuint int texture, int level, + @GLenum int format, @GLenum int type, + @Check(value = "1", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data); + + void glClearTexSubImage(@GLuint int texture, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @GLenum int type, + @Check(value = "1", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLuint64 + @GLfloat + @GLdouble Buffer data); + + // -------------------------------------------------------------------- + // ----------------------[ ARB_enhanced_layouts ]---------------------- + // -------------------------------------------------------------------- + + /** Accepted in the &lt;props&gt; array of GetProgramResourceiv: */ + int GL_LOCATION_COMPONENT = 0x934A, + GL_TRANSFORM_FEEDBACK_BUFFER_INDEX = 0x934B, + GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE = 0x934C; + + // -------------------------------------------------------------- + // ----------------------[ ARB_multi_bind ]---------------------- + // -------------------------------------------------------------- + + void glBindBuffersBase(@GLenum int target, @GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers); + + void glBindBuffersRange(@GLenum int target, @GLuint int first, @GLsizei int count, + @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers, + @Check(value = "count", canBeNull = true) @Const @GLintptr PointerBuffer offsets, + @Check(value = "count", canBeNull = true) @Const @GLsizeiptr PointerBuffer sizes); + + void glBindTextures(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer textures); + + void glBindSamplers(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer samplers); + + void glBindImageTextures(@GLuint int first, @GLsizei int count, @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer textures); + + void glBindVertexBuffers(@GLuint int first, @GLsizei int count, + @Check(value = "count", canBeNull = true) @Const @GLuint IntBuffer buffers, + @Check(value = "count", canBeNull = true) @Const @GLintptr PointerBuffer offsets, + @Check(value = "count", canBeNull = true) @Const @GLsizei IntBuffer strides); + + // ----------------------------------------------------------------------- + // ----------------------[ ARB_query_buffer_object ]---------------------- + // ----------------------------------------------------------------------- + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectiv, GetQueryObjectuiv, + * GetQueryObjecti64v and GetQueryObjectui64v: + */ + int GL_QUERY_RESULT_NO_WAIT = 0x9194; + + /** + * Accepted by the &lt;target&gt; parameter of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, MapBufferRange, GetBufferSubData, + * GetBufferParameteriv, GetBufferParameteri64v, GetBufferPointerv, + * ClearBufferSubData, and the &lt;readtarget&gt; and &lt;writetarget&gt; parameters of + * CopyBufferSubData: + */ + int GL_QUERY_BUFFER = 0x9192; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_QUERY_BUFFER_BINDING = 0x9193; + + /** Accepted in the &lt;barriers&gt; bitfield in MemoryBarrier: */ + int GL_QUERY_BUFFER_BARRIER_BIT = 0x00008000; + + // -------------------------------------------------------------------------------- + // ----------------------[ ARB_texture_mirror_clamp_to_edge ]---------------------- + // -------------------------------------------------------------------------------- + + /** + * Accepted by the &lt;param&gt; parameter of TexParameter{if}, SamplerParameter{if} + * and SamplerParameter{if}v, and by the &lt;params&gt; parameter of + * TexParameter{if}v, TexParameterI{i ui}v and SamplerParameterI{i ui}v when + * their &lt;pname&gt; parameter is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or + * TEXTURE_WRAP_R: + */ + int GL_MIRROR_CLAMP_TO_EDGE = 0x8743; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_frame_terminator.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_frame_terminator.java new file mode 100644 index 0000000..5ceea69 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_frame_terminator.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface GREMEDY_frame_terminator { + + void glFrameTerminatorGREMEDY(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_string_marker.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_string_marker.java new file mode 100644 index 0000000..d3dd204 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/GREMEDY_string_marker.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.ByteBuffer; + +public interface GREMEDY_string_marker { + + void glStringMarkerGREMEDY(@AutoSize("string") @GLsizei int len, @Const ByteBuffer string); + + @Alternate("glStringMarkerGREMEDY") + void glStringMarkerGREMEDY(@Constant("string.length()") @GLsizei int len, CharSequence string); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/HP_occlusion_test.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/HP_occlusion_test.java new file mode 100644 index 0000000..f919519 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/HP_occlusion_test.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface HP_occlusion_test { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, by + * the &lt;pname&gt; of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev : + */ + int GL_OCCLUSION_TEST_HP = 0x8165; + + /** + * Accepted by the &lt;pname&gt; of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev : + */ + int GL_OCCLUSION_TEST_RESULT_HP = 0x8166; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/IBM_rasterpos_clip.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/IBM_rasterpos_clip.java new file mode 100644 index 0000000..a88cbee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/IBM_rasterpos_clip.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface IBM_rasterpos_clip { + + /** + * Accepted by the &lt;target&gt; parameter of Enable and Disable and the &lt;value&gt; + * parameter of IsEnabled, GetBooleanv, GetIntegerv, GetFloatv, GetDoublev: + */ + int GL_RASTER_POSITION_UNCLIPPED_IBM = 103010; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/INTEL_map_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/INTEL_map_texture.java new file mode 100644 index 0000000..830725d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/INTEL_map_texture.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface INTEL_map_texture { + + /** Accepted by the &lt;pname&gt; parameter of TexParameteri, for target TEXTURE_2D */ + int GL_TEXTURE_MEMORY_LAYOUT_INTEL = 0x83FF; + + /** + * Accepted by the &lt;params&gt; when &lt;pname&gt; is set to + * &lt;TEXTURE_MEMORY_LAYOUT_INTEL&gt;: + */ + int GL_LAYOUT_DEFAULT_INTEL = 0, + GL_LAYOUT_LINEAR_INTEL = 1, + GL_LAYOUT_LINEAR_CPU_CACHED_INTEL = 2; + + /** + * The length parameter does not exist in the native API. It used by LWJGL to return a ByteBuffer + * with a proper capacity. + */ + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapTexture2DINTEL(@GLuint int texture, int level, @Helper(passToNative = true) @GLsizeiptr long length, @GLbitfield int access, + @Check("1") @OutParameter IntBuffer stride, @Check("1") @OutParameter @GLenum IntBuffer layout); + + void glUnmapTexture2DINTEL(@GLuint int texture, int level); + + void glSyncTextureINTEL(@GLuint int texture); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_debug.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_debug.java new file mode 100644 index 0000000..4ae7543 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_debug.java @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface KHR_debug { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: */ + int GL_CONTEXT_FLAG_DEBUG_BIT = 0x00000002; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: */ + int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Returned by GetError: */ + int GL_STACK_UNDERFLOW = 0x0504, + GL_STACK_OVERFLOW = 0x0503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + // ----------------------------- + + @Reuse("GL43") + void glDebugMessageControl(@GLenum int source, + @GLenum int type, + @GLenum int severity, + @AutoSize(value = "ids", canBeNull = true) @GLsizei int count, + @Check(canBeNull = true) @Const @GLuint IntBuffer ids, + boolean enabled); + + @Reuse("GL43") + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @AutoSize("buf") @GLsizei int length, + @Const @GLchar ByteBuffer buf); + + @Reuse("GL43") + @Alternate("glDebugMessageInsert") + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @Constant("buf.length()") @GLsizei int length, + CharSequence buf); + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * + * @param callback the callback function to use + */ + @Reuse("GL43") + void glDebugMessageCallback(@PointerWrapper(value = "GLDEBUGPROC", canBeNull = true) KHRDebugCallback callback, + @Constant("userParam") @PointerWrapper("GLvoid *") long userParam); + + @Reuse("GL43") + @GLuint + int glGetDebugMessageLog(@GLuint int count, + @AutoSize(value = "messageLog", canBeNull = true) @GLsizei int bufsize, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer sources, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer types, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer ids, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer severities, + @Check(value = "count", canBeNull = true) @GLsizei IntBuffer lengths, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer messageLog); + + // Not really useful and a pain to implement in Java + // void glGetPointerv(@GLenum int pname, void** params); + + @Reuse("GL43") + void glPushDebugGroup(@GLenum int source, @GLuint int id, @AutoSize("message") @GLsizei int length, + @Const @GLchar ByteBuffer message); + + @Reuse("GL43") + @Alternate("glPushDebugGroup") + void glPushDebugGroup(@GLenum int source, @GLuint int id, @Constant("message.length()") @GLsizei int length, + CharSequence message); + + @Reuse("GL43") + void glPopDebugGroup(); + + @Reuse("GL43") + void glObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Reuse("GL43") + @Alternate("glObjectLabel") + void glObjectLabel(@GLenum int identifier, @GLuint int name, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + @Reuse("GL43") + void glGetObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Reuse("GL43") + @Alternate("glGetObjectLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectLabel2(@GLenum int identifier, @GLuint int name, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Reuse("GL43") + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Reuse("GL43") + @Alternate("glObjectPtrLabel") + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + @Reuse("GL43") + void glGetObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Reuse("GL43") + @Alternate("glGetObjectPtrLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectPtrLabel2(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_texture_compression_astc_ldr.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_texture_compression_astc_ldr.java new file mode 100644 index 0000000..6045c60 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/KHR_texture_compression_astc_ldr.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface KHR_texture_compression_astc_ldr { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D, + * CompressedTexSubImage2D, TexStorage2D, TextureStorage2D, TexStorage3D, + * and TextureStorage3D: + */ + int GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, + GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, + GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, + GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, + GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, + GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, + GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, + GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, + GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, + GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, + GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, + GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, + GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NVX_gpu_memory_info.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NVX_gpu_memory_info.java new file mode 100644 index 0000000..694e719 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NVX_gpu_memory_info.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** Experimental extension, may be removed/changed in the future. */ +public interface NVX_gpu_memory_info { + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv: */ + int GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = 0x9047; + int GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = 0x9048; + int GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = 0x9049; + int GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX = 0x904A; + int GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX = 0x904B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_multi_draw_indirect.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_multi_draw_indirect.java new file mode 100644 index 0000000..a112484 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_multi_draw_indirect.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.BufferKind; +import org.lwjgl.util.generator.BufferObject; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; + +public interface NV_bindless_multi_draw_indirect { + + void glMultiDrawArraysIndirectBindlessNV(@GLenum int mode, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 20 + 24 * vertexBufferCount : stride) * drawCount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int drawCount, + @GLsizei int stride, + int vertexBufferCount); + + void glMultiDrawElementsIndirectBindlessNV(@GLenum int mode, + @GLenum int type, + @BufferObject(BufferKind.IndirectBO) @Check("(stride == 0 ? 48 + 24 * vertexBufferCount : stride) * drawCount") @Const @GLvoid ByteBuffer indirect, + @GLsizei int drawCount, + @GLsizei int stride, + int vertexBufferCount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_texture.java new file mode 100644 index 0000000..a154997 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_bindless_texture.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; +import org.lwjgl.util.generator.opengl.GLuint64; + +import java.nio.LongBuffer; + +public interface NV_bindless_texture { + + @GLuint64 + long glGetTextureHandleNV(@GLuint int texture); + + @GLuint64 + long glGetTextureSamplerHandleNV(@GLuint int texture, @GLuint int sampler); + + void glMakeTextureHandleResidentNV(@GLuint64 long handle); + + void glMakeTextureHandleNonResidentNV(@GLuint64 long handle); + + @GLuint64 + long glGetImageHandleNV(@GLuint int texture, int level, boolean layered, + int layer, @GLenum int format); + + void glMakeImageHandleResidentNV(@GLuint64 long handle, @GLenum int access); + + void glMakeImageHandleNonResidentNV(@GLuint64 long handle); + + void glUniformHandleui64NV(int location, @GLuint64 long value); + + @StripPostfix("value") + void glUniformHandleui64vNV(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64 LongBuffer value); + + void glProgramUniformHandleui64NV(@GLuint int program, int location, + @GLuint64 long value); + + @StripPostfix("values") + void glProgramUniformHandleui64vNV(@GLuint int program, int location, + @AutoSize("values") @GLsizei int count, @Const @GLuint64 LongBuffer values); + + boolean glIsTextureHandleResidentNV(@GLuint64 long handle); + + boolean glIsImageHandleResidentNV(@GLuint64 long handle); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_equation_advanced.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_equation_advanced.java new file mode 100644 index 0000000..4856ddf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_equation_advanced.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface NV_blend_equation_advanced { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev + * and GetInteger64v: + */ + int GL_BLEND_ADVANCED_COHERENT_NV = 0x9285; + + /** + * Accepted by the &lt;pname&gt; parameter of BlendParameteriNV, GetBooleanv, + * GetIntegerv, GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_BLEND_PREMULTIPLIED_SRC_NV = 0x9280, + GL_BLEND_OVERLAP_NV = 0x9281; + + /** + * Accepted by the &lt;value&gt; parameter of BlendParameteriNV when &lt;pname&gt; is + * BLEND_OVERLAP_NV: + */ + int GL_UNCORRELATED_NV = 0x9282, + GL_DISJOINT_NV = 0x9283, + GL_CONJOINT_NV = 0x9284; + + /** Accepted by the &lt;mode&gt; parameter of BlendEquation and BlendEquationi: */ + int GL_SRC_NV = 0x9286, + GL_DST_NV = 0x9287, + GL_SRC_OVER_NV = 0x9288, + GL_DST_OVER_NV = 0x9289, + GL_SRC_IN_NV = 0x928A, + GL_DST_IN_NV = 0x928B, + GL_SRC_OUT_NV = 0x928C, + GL_DST_OUT_NV = 0x928D, + GL_SRC_ATOP_NV = 0x928E, + GL_DST_ATOP_NV = 0x928F, + GL_MULTIPLY_NV = 0x9294, + GL_SCREEN_NV = 0x9295, + GL_OVERLAY_NV = 0x9296, + GL_DARKEN_NV = 0x9297, + GL_LIGHTEN_NV = 0x9298, + GL_COLORDODGE_NV = 0x9299, + GL_COLORBURN_NV = 0x929A, + GL_HARDLIGHT_NV = 0x929B, + GL_SOFTLIGHT_NV = 0x929C, + GL_DIFFERENCE_NV = 0x929E, + GL_EXCLUSION_NV = 0x92A0, + GL_INVERT_RGB_NV = 0x92A3, + GL_LINEARDODGE_NV = 0x92A4, + GL_LINEARBURN_NV = 0x92A5, + GL_VIVIDLIGHT_NV = 0x92A6, + GL_LINEARLIGHT_NV = 0x92A7, + GL_PINLIGHT_NV = 0x92A8, + GL_HARDMIX_NV = 0x92A9, + GL_HSL_HUE_NV = 0x92AD, + GL_HSL_SATURATION_NV = 0x92AE, + GL_HSL_COLOR_NV = 0x92AF, + GL_HSL_LUMINOSITY_NV = 0x92B0, + GL_PLUS_NV = 0x9291, + GL_PLUS_CLAMPED_NV = 0x92B1, + GL_PLUS_CLAMPED_ALPHA_NV = 0x92B2, + GL_PLUS_DARKER_NV = 0x9292, + GL_MINUS_NV = 0x929F, + GL_MINUS_CLAMPED_NV = 0x92B3, + GL_CONTRAST_NV = 0x92A1, + GL_INVERT_OVG_NV = 0x92B4; + + void glBlendParameteriNV(@GLenum int pname, int value); + + void glBlendBarrierNV(); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_square.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_square.java new file mode 100644 index 0000000..fc61d50 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_blend_square.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_blend_square { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_compute_program5.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_compute_program5.java new file mode 100644 index 0000000..9298e12 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_compute_program5.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_compute_program5 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4[df][v]ARB, + * ProgramLocalParameter4[df][v]ARB, GetProgramEnvParameter[df]vARB, + * GetProgramLocalParameter[df]vARB, GetProgramivARB and + * GetProgramStringARB: + */ + int GL_COMPUTE_PROGRAM_NV = 0x90FB; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + int GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV = 0x90FC; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_conditional_render.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_conditional_render.java new file mode 100644 index 0000000..a562316 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_conditional_render.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_conditional_render { + + /** + * Accepted by the &lt;mode&gt; parameter of BeginConditionalRenderNV: + */ + int GL_QUERY_WAIT_NV = 0x8E13; + int GL_QUERY_NO_WAIT_NV = 0x8E14; + int GL_QUERY_BY_REGION_WAIT_NV = 0x8E15; + int GL_QUERY_BY_REGION_NO_WAIT_NV = 0x8E16; + + void glBeginConditionalRenderNV(@GLuint int id, @GLenum int mode); + void glEndConditionalRenderNV(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_depth_to_color.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_depth_to_color.java new file mode 100644 index 0000000..4c9acb2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_depth_to_color.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_copy_depth_to_color { + int GL_DEPTH_STENCIL_TO_RGBA_NV = 0x886E; + int GL_DEPTH_STENCIL_TO_BGRA_NV = 0x886F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_image.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_image.java new file mode 100644 index 0000000..9abdd42 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_copy_image.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_copy_image { + + void glCopyImageSubDataNV( + @GLuint int srcName, @GLenum int srcTarget, int srcLevel, + int srcX, int srcY, int srcZ, + @GLuint int dstName, @GLenum int dstTarget, int dstLevel, + int dstX, int dstY, int dstZ, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + // TODO: Implement WGL and GLX cross-context copying. + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_deep_texture3D.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_deep_texture3D.java new file mode 100644 index 0000000..bb73152 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_deep_texture3D.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_deep_texture3D { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + int GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV = 0x90D0, + GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV = 0x90D1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_buffer_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_buffer_float.java new file mode 100644 index 0000000..b842e1f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_buffer_float.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_depth_buffer_float { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, TexImage2D, + * TexImage3D, CopyTexImage1D, CopyTexImage2D, and RenderbufferStorageEXT, + * and returned in the &lt;data&gt; parameter of GetTexLevelParameter and + * GetRenderbufferParameterivEXT: + */ + int GL_DEPTH_COMPONENT32F_NV = 0x8DAB; + int GL_DEPTH32F_STENCIL8_NV = 0x8DAC; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D, and + * GetTexImage: + */ + int GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV = 0x8DAD; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_DEPTH_BUFFER_FLOAT_MODE_NV = 0x8DAF; + + void glDepthRangedNV(double n, double f); + + void glClearDepthdNV(double d); + + void glDepthBoundsdNV(double zmin, double zmax); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_clamp.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_clamp.java new file mode 100644 index 0000000..33b81d6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_depth_clamp.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_depth_clamp { + int GL_DEPTH_CLAMP_NV = 0x864F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_draw_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_draw_texture.java new file mode 100644 index 0000000..3dfa462 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_draw_texture.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLfloat; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_draw_texture { + + void glDrawTextureNV(@GLuint int texture, @GLuint int sampler, + @GLfloat float x0, @GLfloat float y0, + @GLfloat float x1, @GLfloat float y1, + @GLfloat float z, + @GLfloat float s0, @GLfloat float t0, + @GLfloat float s1, @GLfloat float t1); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_evaluators.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_evaluators.java new file mode 100644 index 0000000..e72613c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_evaluators.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLfloat; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface NV_evaluators { + int GL_EVAL_2D_NV = 0x86C0; + int GL_EVAL_TRIANGULAR_2D_NV = 0x86C1; + int GL_MAP_TESSELLATION_NV = 0x86C2; + int GL_MAP_ATTRIB_U_ORDER_NV = 0x86C3; + int GL_MAP_ATTRIB_V_ORDER_NV = 0x86C4; + int GL_EVAL_FRACTIONAL_TESSELLATION_NV = 0x86C5; + int GL_EVAL_VERTEX_ATTRIB0_NV = 0x86C6; + int GL_EVAL_VERTEX_ATTRIB1_NV = 0x86C7; + int GL_EVAL_VERTEX_ATTRIB2_NV = 0x86C8; + int GL_EVAL_VERTEX_ATTRIB3_NV = 0x86C9; + int GL_EVAL_VERTEX_ATTRIB4_NV = 0x86CA; + int GL_EVAL_VERTEX_ATTRIB5_NV = 0x86CB; + int GL_EVAL_VERTEX_ATTRIB6_NV = 0x86CC; + int GL_EVAL_VERTEX_ATTRIB7_NV = 0x86CD; + int GL_EVAL_VERTEX_ATTRIB8_NV = 0x86CE; + int GL_EVAL_VERTEX_ATTRIB9_NV = 0x86CF; + int GL_EVAL_VERTEX_ATTRIB10_NV = 0x86D0; + int GL_EVAL_VERTEX_ATTRIB11_NV = 0x86D1; + int GL_EVAL_VERTEX_ATTRIB12_NV = 0x86D2; + int GL_EVAL_VERTEX_ATTRIB13_NV = 0x86D3; + int GL_EVAL_VERTEX_ATTRIB14_NV = 0x86D4; + int GL_EVAL_VERTEX_ATTRIB15_NV = 0x86D5; + int GL_MAX_MAP_TESSELLATION_NV = 0x86D6; + int GL_MAX_RATIONAL_EVAL_ORDER_NV = 0x86D7; + + void glGetMapControlPointsNV(@GLenum int target, @GLuint int index, @GLenum int type, @GLsizei int ustride, @GLsizei int vstride, boolean packed, + @OutParameter + @Check + @Const + @GLfloat Buffer pPoints); + + void glMapControlPointsNV(@GLenum int target, @GLuint int index, @GLenum int type, @GLsizei int ustride, @GLsizei int vstride, int uorder, int vorder, boolean packed, @Check @Const @GLfloat Buffer pPoints); + + @StripPostfix("params") + void glMapParameterfvNV(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glMapParameterivNV(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glGetMapParameterfvNV(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glGetMapParameterivNV(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glGetMapAttribParameterfvNV(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetMapAttribParameterivNV(@GLenum int target, @GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + void glEvalMapsNV(@GLenum int target, @GLenum int mode); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_explicit_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_explicit_multisample.java new file mode 100644 index 0000000..fb5c05b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_explicit_multisample.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface NV_explicit_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetMultisamplefvNV: */ + int GL_SAMPLE_POSITION_NV = 0x8E50; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + + int GL_SAMPLE_MASK_NV = 0x8E51; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanIndexedvEXT and + * GetIntegerIndexedvEXT: + */ + + int GL_SAMPLE_MASK_VALUE_NV = 0x8E52; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + + int GL_TEXTURE_BINDING_RENDERBUFFER_NV = 0x8E53; + int GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV = 0x8E54; + int GL_MAX_SAMPLE_MASK_WORDS_NV = 0x8E59; + + /** Accepted by the &lt;target&gt; parameter of BindTexture, and TexRenderbufferNV: */ + + int GL_TEXTURE_RENDERBUFFER_NV = 0x8E55; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_RENDERBUFFER_NV = 0x8E56; + int GL_INT_SAMPLER_RENDERBUFFER_NV = 0x8E57; + int GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV = 0x8E58; + + @Reuse("EXTDrawBuffers2") + @StripPostfix(value = "data", extension = "EXT") + void glGetBooleanIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("4") @GLboolean ByteBuffer data); + + @Reuse("EXTDrawBuffers2") + @Alternate("glGetBooleanIndexedvEXT") + @GLreturn("data") + @StripPostfix(value = "data", extension = "EXT") + void glGetBooleanIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter @GLboolean ByteBuffer data); + + @Reuse("EXTDrawBuffers2") + @StripPostfix(value = "data", extension = "EXT") + void glGetIntegerIndexedvEXT(@GLenum int pname, @GLuint int index, @OutParameter @Check("16") IntBuffer data); + + @Reuse("EXTDrawBuffers2") + @Alternate("glGetIntegerIndexedvEXT") + @GLreturn("data") + @StripPostfix(value = "data", extension = "EXT") + void glGetIntegerIndexedvEXT2(@GLenum int pname, @GLuint int index, @OutParameter IntBuffer data); + + @StripPostfix("val") + void glGetMultisamplefvNV(@GLenum int pname, @GLuint int index, @OutParameter @Check("2") FloatBuffer val); + + void glSampleMaskIndexedNV(@GLuint int index, @GLbitfield int mask); + + void glTexRenderbufferNV(@GLenum int target, @GLuint int renderbuffer); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fence.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fence.java new file mode 100644 index 0000000..b52844b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fence.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface NV_fence { + int GL_ALL_COMPLETED_NV = 0x84F2; + int GL_FENCE_STATUS_NV = 0x84F3; + int GL_FENCE_CONDITION_NV = 0x84F4; + + void glGenFencesNV(@AutoSize("piFences") @GLsizei int n, @OutParameter @GLuint IntBuffer piFences); + + @Alternate("glGenFencesNV") + @GLreturn("piFences") + void glGenFencesNV2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer piFences); + + void glDeleteFencesNV(@AutoSize("piFences") @GLsizei int n, @Const @GLuint IntBuffer piFences); + + @Alternate("glDeleteFencesNV") + void glDeleteFencesNV(@Constant("1") @GLsizei int n, @Const @GLuint @Constant(value = "APIUtil.getInt(caps, fence)", keepParam = true) int fence); + + void glSetFenceNV(@GLuint int fence, @GLenum int condition); + + boolean glTestFenceNV(@GLuint int fence); + + void glFinishFenceNV(@GLuint int fence); + + boolean glIsFenceNV(@GLuint int fence); + + void glGetFenceivNV(@GLuint int fence, @GLenum int pname, @OutParameter @Check("4") IntBuffer piParams); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_float_buffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_float_buffer.java new file mode 100644 index 0000000..343aa95 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_float_buffer.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_float_buffer { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D and + * CopyTexImage2D: + */ + int GL_FLOAT_R_NV = 0x8880; + int GL_FLOAT_RG_NV = 0x8881; + int GL_FLOAT_RGB_NV = 0x8882; + int GL_FLOAT_RGBA_NV = 0x8883; + int GL_FLOAT_R16_NV = 0x8884; + int GL_FLOAT_R32_NV = 0x8885; + int GL_FLOAT_RG16_NV = 0x8886; + int GL_FLOAT_RG32_NV = 0x8887; + int GL_FLOAT_RGB16_NV = 0x8888; + int GL_FLOAT_RGB32_NV = 0x8889; + int GL_FLOAT_RGBA16_NV = 0x888A; + int GL_FLOAT_RGBA32_NV = 0x888B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv: + */ + int GL_TEXTURE_FLOAT_COMPONENTS_NV = 0x888C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FLOAT_CLEAR_COLOR_VALUE_NV = 0x888D; + int GL_FLOAT_RGBA_MODE_NV = 0x888E; + + /** + * Accepted in the &lt;piAttributes&gt; array of wglGetPixelFormatAttribivARB and + * wglGetPixelFormatAttribfvARB and in the &lt;piAttribIList&gt; and + * &lt;pfAttribFList&gt; arrays of wglChoosePixelFormatARB: + */ + /* + int WGL_FLOAT_COMPONENTS_NV = 0x20B0; + int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV = 0x20B1; + int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV = 0x20B2; + int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV = 0x20B3; + int WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV = 0x20B4; + */ + + /** + * Accepted in the &lt;piAttribIList&gt; array of wglCreatePbufferARB and returned + * in the &lt;value&gt; parameter of wglQueryPbufferARB when &lt;iAttribute&gt; is + * WGL_TEXTURE_FORMAT_ARB: + */ + /* + int WGL_TEXTURE_FLOAT_R_NV = 0x20B5; + int WGL_TEXTURE_FLOAT_RG_NV = 0x20B6; + int WGL_TEXTURE_FLOAT_RGB_NV = 0x20B7; + int WGL_TEXTURE_FLOAT_RGBA_NV = 0x20B8; + */ + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fog_distance.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fog_distance.java new file mode 100644 index 0000000..201d738 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fog_distance.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_fog_distance { + int GL_FOG_DISTANCE_MODE_NV = 0x855A; + int GL_EYE_RADIAL_NV = 0x855B; + int GL_EYE_PLANE_ABSOLUTE_NV = 0x855C; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program.java new file mode 100644 index 0000000..5cfc981 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLubyte; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface NV_fragment_program extends NV_program { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, by the + * &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, + * and by the &lt;target&gt; parameter of BindProgramNV, LoadProgramNV, + * ProgramLocalParameter4dARB, ProgramLocalParameter4dvARB, + * ProgramLocalParameter4fARB, ProgramLocalParameter4fvARB, + * GetProgramLocalParameterdvARB, and GetProgramLocalParameterfvARB: + */ + int GL_FRAGMENT_PROGRAM_NV = 0x8870; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_TEXTURE_COORDS_NV = 0x8871; + int GL_MAX_TEXTURE_IMAGE_UNITS_NV = 0x8872; + int GL_FRAGMENT_PROGRAM_BINDING_NV = 0x8873; + int GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV = 0x8868; + + void glProgramNamedParameter4fNV(@GLuint int id, @AutoSize("name") @GLsizei int length, @Const @GLubyte ByteBuffer name, float x, float y, float z, float w); + + void glProgramNamedParameter4dNV(@GLuint int id, @AutoSize("name") @GLsizei int length, @Const @GLubyte ByteBuffer name, double x, double y, double z, double w); + + @StripPostfix("params") + void glGetProgramNamedParameterfvNV(@GLuint int id, @AutoSize("name") @GLsizei int length, @Const @GLubyte ByteBuffer name, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetProgramNamedParameterdvNV(@GLuint int id, @AutoSize("name") @GLsizei int length, @Const @GLubyte ByteBuffer name, @OutParameter @Check("4") DoubleBuffer params); +} + diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program2.java new file mode 100644 index 0000000..edb8c38 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program2.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_fragment_program2 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + int GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = 0x88F4; + int GL_MAX_PROGRAM_CALL_DEPTH_NV = 0x88F5; + int GL_MAX_PROGRAM_IF_DEPTH_NV = 0x88F6; + int GL_MAX_PROGRAM_LOOP_DEPTH_NV = 0x88F7; + int GL_MAX_PROGRAM_LOOP_COUNT_NV = 0x88F8; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program4.java new file mode 100644 index 0000000..a9f594d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program4.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_fragment_program4 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program_option.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program_option.java new file mode 100644 index 0000000..56e04b1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_fragment_program_option.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_fragment_program_option { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_framebuffer_multisample_coverage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_framebuffer_multisample_coverage.java new file mode 100644 index 0000000..cc84955 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_framebuffer_multisample_coverage.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +public interface NV_framebuffer_multisample_coverage { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivEXT. */ + int GL_RENDERBUFFER_COVERAGE_SAMPLES_NV = 0x8CAB; + int GL_RENDERBUFFER_COLOR_SAMPLES_NV = 0x8E10; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv. */ + int GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E11; + int GL_MULTISAMPLE_COVERAGE_MODES_NV = 0x8E12; + + void glRenderbufferStorageMultisampleCoverageNV(@GLenum int target, @GLsizei int coverageSamples, @GLsizei int colorSamples, + @GLenum int internalformat, @GLsizei int width, @GLsizei int height); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_program4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_program4.java new file mode 100644 index 0000000..618aa65 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_program4.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Reuse; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_geometry_program4 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_GEOMETRY_PROGRAM_NV = 0x8C26; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_MAX_PROGRAM_OUTPUT_VERTICES_NV = 0x8C27; + int GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV = 0x8C28; + + void glProgramVertexLimitNV(@GLenum int target, int limit); + + @Reuse("EXTGeometryShader4") + void glFramebufferTextureEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level); + + @Reuse("EXTGeometryShader4") + void glFramebufferTextureLayerEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + + @Reuse("EXTGeometryShader4") + void glFramebufferTextureFaceEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, @GLenum int face); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_shader4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_shader4.java new file mode 100644 index 0000000..b1e173c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_geometry_shader4.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_geometry_shader4 { + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program4.java new file mode 100644 index 0000000..f2105c7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program4.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface NV_gpu_program4 { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_PROGRAM_ATTRIB_COMPONENTS_NV = 0x8906; + int GL_PROGRAM_RESULT_COMPONENTS_NV = 0x8907; + int GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV = 0x8908; + int GL_MAX_PROGRAM_RESULT_COMPONENTS_NV = 0x8909; + int GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV = 0x8DA5; + int GL_MAX_PROGRAM_GENERIC_RESULTS_NV = 0x8DA6; + + // --- + + void glProgramLocalParameterI4iNV(@GLenum int target, @GLuint int index, int x, int y, int z, int w); + + @StripPostfix("params") + void glProgramLocalParameterI4ivNV(@GLenum int target, @GLuint int index, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glProgramLocalParametersI4ivNV(@GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const IntBuffer params); + + // --- + + void glProgramLocalParameterI4uiNV(@GLenum int target, @GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @StripPostfix("params") + void glProgramLocalParameterI4uivNV(@GLenum int target, @GLuint int index, @Check("4") @Const @GLuint IntBuffer params); + + @StripPostfix("params") + void glProgramLocalParametersI4uivNV(@GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer params); + + // --- + + void glProgramEnvParameterI4iNV(@GLenum int target, @GLuint int index, int x, int y, int z, int w); + + @StripPostfix("params") + void glProgramEnvParameterI4ivNV(@GLenum int target, @GLuint int index, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glProgramEnvParametersI4ivNV(@GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const IntBuffer params); + + // --- + + void glProgramEnvParameterI4uiNV(@GLenum int target, @GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @StripPostfix("params") + void glProgramEnvParameterI4uivNV(@GLenum int target, @GLuint int index, @Check("4") @Const @GLuint IntBuffer params); + + @StripPostfix("params") + void glProgramEnvParametersI4uivNV(@GLenum int target, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer params); + + // --- + + @StripPostfix("params") + void glGetProgramLocalParameterIivNV(@GLenum int target, @GLuint int index, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetProgramLocalParameterIuivNV(@GLenum int target, @GLuint int index, @OutParameter @Check("4") @GLuint IntBuffer params); + + // --- + + @StripPostfix("params") + void glGetProgramEnvParameterIivNV(@GLenum int target, @GLuint int index, @OutParameter @Check("4")IntBuffer params); + + @StripPostfix("params") + void glGetProgramEnvParameterIuivNV(@GLenum int target, @GLuint int index, @OutParameter @Check("4") @GLuint IntBuffer params); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5.java new file mode 100644 index 0000000..67385b4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_gpu_program5 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV = 0x8E5A; + int GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV = 0x8E5B; + int GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV = 0x8E5C; + int GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV = 0x8E5D; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5_mem_extended.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5_mem_extended.java new file mode 100644 index 0000000..5f1e264 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_program5_mem_extended.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2013 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_gpu_program5_mem_extended { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_shader5.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_shader5.java new file mode 100644 index 0000000..5aef200 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_gpu_shader5.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLint64EXT; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; +import org.lwjgl.util.generator.opengl.GLuint64EXT; + +import java.nio.LongBuffer; + +@Dependent +public interface NV_gpu_shader5 { + + /** + * Returned by the &lt;type&gt; parameter of GetActiveAttrib, GetActiveUniform, and + * GetTransformFeedbackVarying: + */ + int GL_INT64_NV = 0x140E; + int GL_UNSIGNED_INT64_NV = 0x140F; + + int GL_INT8_NV = 0x8FE0; + int GL_INT8_VEC2_NV = 0x8FE1; + int GL_INT8_VEC3_NV = 0x8FE2; + int GL_INT8_VEC4_NV = 0x8FE3; + int GL_INT16_NV = 0x8FE4; + int GL_INT16_VEC2_NV = 0x8FE5; + int GL_INT16_VEC3_NV = 0x8FE6; + int GL_INT16_VEC4_NV = 0x8FE7; + int GL_INT64_VEC2_NV = 0x8FE9; + int GL_INT64_VEC3_NV = 0x8FEA; + int GL_INT64_VEC4_NV = 0x8FEB; + int GL_UNSIGNED_INT8_NV = 0x8FEC; + int GL_UNSIGNED_INT8_VEC2_NV = 0x8FED; + int GL_UNSIGNED_INT8_VEC3_NV = 0x8FEE; + int GL_UNSIGNED_INT8_VEC4_NV = 0x8FEF; + int GL_UNSIGNED_INT16_NV = 0x8FF0; + int GL_UNSIGNED_INT16_VEC2_NV = 0x8FF1; + int GL_UNSIGNED_INT16_VEC3_NV = 0x8FF2; + int GL_UNSIGNED_INT16_VEC4_NV = 0x8FF3; + int GL_UNSIGNED_INT64_VEC2_NV = 0x8FF5; + int GL_UNSIGNED_INT64_VEC3_NV = 0x8FF6; + int GL_UNSIGNED_INT64_VEC4_NV = 0x8FF7; + int GL_FLOAT16_NV = 0x8FF8; + int GL_FLOAT16_VEC2_NV = 0x8FF9; + int GL_FLOAT16_VEC3_NV = 0x8FFA; + int GL_FLOAT16_VEC4_NV = 0x8FFB; + + /** Accepted by the &lt;primitiveMode&gt; parameter of BeginTransformFeedback: */ + int GL_PATCHES = ARB_tessellation_shader.GL_PATCHES; + + void glUniform1i64NV(int location, @GLint64EXT long x); + + void glUniform2i64NV(int location, @GLint64EXT long x, @GLint64EXT long y); + + void glUniform3i64NV(int location, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z); + + void glUniform4i64NV(int location, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z, @GLint64EXT long w); + + @StripPostfix("value") + void glUniform1i64vNV(int location, @AutoSize("value") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform2i64vNV(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform3i64vNV(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform4i64vNV(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + void glUniform1ui64NV(int location, @GLuint64EXT long x); + + void glUniform2ui64NV(int location, @GLuint64EXT long x, @GLuint64EXT long y); + + void glUniform3ui64NV(int location, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z); + + void glUniform4ui64NV(int location, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z, @GLuint64EXT long w); + + @StripPostfix("value") + void glUniform1ui64vNV(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform2ui64vNV(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform3ui64vNV(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @StripPostfix("value") + void glUniform4ui64vNV(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @StripPostfix("params") + void glGetUniformi64vNV(@GLuint int program, int location, @OutParameter @Check("1") @GLint64EXT LongBuffer params); + + @StripPostfix("params") + void glGetUniformui64vNV(@GLuint int program, int location, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + // ------------- + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform1i64NV(@GLuint int program, int location, @GLint64EXT long x); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform2i64NV(@GLuint int program, int location, @GLint64EXT long x, @GLint64EXT long y); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform3i64NV(@GLuint int program, int location, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform4i64NV(@GLuint int program, int location, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z, @GLint64EXT long w); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform1i64vNV(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform2i64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform3i64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform4i64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform1ui64NV(@GLuint int program, int location, @GLuint64EXT long x); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform2ui64NV(@GLuint int program, int location, @GLuint64EXT long x, @GLuint64EXT long y); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform3ui64NV(@GLuint int program, int location, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z); + + @Dependent("GL_EXT_direct_state_access") + void glProgramUniform4ui64NV(@GLuint int program, int location, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z, @GLuint64EXT long w); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform1ui64vNV(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform2ui64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform3ui64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @Dependent("GL_EXT_direct_state_access") + @StripPostfix("value") + void glProgramUniform4ui64vNV(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_half_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_half_float.java new file mode 100644 index 0000000..33b6fbc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_half_float.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLhalf; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.*; + +public interface NV_half_float { + + /** + * Accepted by the &lt;type&gt; argument of VertexPointer, NormalPointer, + * ColorPointer, TexCoordPointer, FogCoordPointerEXT, + * SecondaryColorPointerEXT, VertexWeightPointerEXT, VertexAttribPointerNV, + * DrawPixels, ReadPixels, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, and GetTexImage: + */ + int GL_HALF_FLOAT_NV = 0x140B; + + @NoErrorCheck + void glVertex2hNV(@GLhalf short x, @GLhalf short y); + + @NoErrorCheck + void glVertex3hNV(@GLhalf short x, @GLhalf short y, @GLhalf short z); + + @NoErrorCheck + void glVertex4hNV(@GLhalf short x, @GLhalf short y, @GLhalf short z, @GLhalf short w); + + @NoErrorCheck + void glNormal3hNV(@GLhalf short nx, @GLhalf short ny, @GLhalf short nz); + + @NoErrorCheck + void glColor3hNV(@GLhalf short red, @GLhalf short green, @GLhalf short blue); + + @NoErrorCheck + void glColor4hNV(@GLhalf short red, @GLhalf short green, @GLhalf short blue, @GLhalf short alpha); + + @NoErrorCheck + void glTexCoord1hNV(@GLhalf short s); + + @NoErrorCheck + void glTexCoord2hNV(@GLhalf short s, @GLhalf short t); + + @NoErrorCheck + void glTexCoord3hNV(@GLhalf short s, @GLhalf short t, @GLhalf short r); + + @NoErrorCheck + void glTexCoord4hNV(@GLhalf short s, @GLhalf short t, @GLhalf short r, @GLhalf short q); + + @NoErrorCheck + void glMultiTexCoord1hNV(@GLenum int target, @GLhalf short s); + + @NoErrorCheck + void glMultiTexCoord2hNV(@GLenum int target, @GLhalf short s, @GLhalf short t); + + @NoErrorCheck + void glMultiTexCoord3hNV(@GLenum int target, @GLhalf short s, @GLhalf short t, @GLhalf short r); + + @NoErrorCheck + void glMultiTexCoord4hNV(@GLenum int target, @GLhalf short s, @GLhalf short t, @GLhalf short r, @GLhalf short q); + + @NoErrorCheck + void glFogCoordhNV(@GLhalf short fog); + + @NoErrorCheck + void glSecondaryColor3hNV(@GLhalf short red, @GLhalf short green, @GLhalf short blue); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + void glVertexWeighthNV(@GLhalf short weight); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + void glVertexAttrib1hNV(@GLuint int index, @GLhalf short x); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + void glVertexAttrib2hNV(@GLuint int index, @GLhalf short x, @GLhalf short y); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + void glVertexAttrib3hNV(@GLuint int index, @GLhalf short x, @GLhalf short y, @GLhalf short z); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + void glVertexAttrib4hNV(@GLuint int index, @GLhalf short x, @GLhalf short y, @GLhalf short z, @GLhalf short w); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + @StripPostfix("attribs") + void glVertexAttribs1hvNV(@GLuint int index, @AutoSize("attribs") @GLsizei int n, @Const @GLhalf ShortBuffer attribs); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + @StripPostfix("attribs") + void glVertexAttribs2hvNV(@GLuint int index, @AutoSize(value = "attribs", expression = " >> 1") @GLsizei int n, @Const @GLhalf ShortBuffer attribs); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + @StripPostfix("attribs") + void glVertexAttribs3hvNV(@GLuint int index, @AutoSize(value = "attribs", expression = " / 3") @GLsizei int n, @Const @GLhalf ShortBuffer attribs); + + @Optional(reason = "AMD does not expose this (last driver checked: 11.7)") + @NoErrorCheck + @StripPostfix("attribs") + void glVertexAttribs4hvNV(@GLuint int index, @AutoSize(value = "attribs", expression = " >> 2") @GLsizei int n, @Const @GLhalf ShortBuffer attribs); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_light_max_exponent.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_light_max_exponent.java new file mode 100644 index 0000000..3dde7e6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_light_max_exponent.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_light_max_exponent { + int GL_MAX_SHININESS_NV = 0x8504; + int GL_MAX_SPOT_EXPONENT_NV = 0x8505; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_coverage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_coverage.java new file mode 100644 index 0000000..f57fddf --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_coverage.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_multisample_coverage { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv, and GetFloatv: + */ + int GL_COVERAGE_SAMPLES_NV = 0x80A9; + int GL_COLOR_SAMPLES_NV = 0x8E20; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_filter_hint.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_filter_hint.java new file mode 100644 index 0000000..96f8e4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_multisample_filter_hint.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_multisample_filter_hint { + + /** + * Accepted by the &lt;target&gt; parameter of Hint and by the &lt;pname&gt; + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_MULTISAMPLE_FILTER_HINT_NV = 0x8534; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_occlusion_query.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_occlusion_query.java new file mode 100644 index 0000000..2595ae3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_occlusion_query.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface NV_occlusion_query { + + int GL_OCCLUSION_TEST_HP = 0x8165; + int GL_OCCLUSION_TEST_RESULT_HP = 0x8166; + /* HP_occlusion_test */ + int GL_PIXEL_COUNTER_BITS_NV = 0x8864; + int GL_CURRENT_OCCLUSION_QUERY_ID_NV = 0x8865; + int GL_PIXEL_COUNT_NV = 0x8866; + int GL_PIXEL_COUNT_AVAILABLE_NV = 0x8867; + + void glGenOcclusionQueriesNV(@AutoSize("piIDs") @GLsizei int n, @OutParameter @GLuint IntBuffer piIDs); + + @Alternate("glGenOcclusionQueriesNV") + @GLreturn("piIDs") + void glGenOcclusionQueriesNV2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer piIDs); + + void glDeleteOcclusionQueriesNV(@AutoSize("piIDs") @GLsizei int n, @Const @GLuint IntBuffer piIDs); + + @Alternate("glDeleteOcclusionQueriesNV") + void glDeleteOcclusionQueriesNV(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, piID)", keepParam = true) int piID); + + boolean glIsOcclusionQueryNV(@GLuint int id); + + void glBeginOcclusionQueryNV(@GLuint int id); + + void glEndOcclusionQueryNV(); + + @StripPostfix("params") + void glGetOcclusionQueryuivNV(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") @GLuint IntBuffer params); + + @Alternate("glGetOcclusionQueryuivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetOcclusionQueryuivNV2(@GLuint int id, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + @StripPostfix("params") + void glGetOcclusionQueryivNV(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetOcclusionQueryivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetOcclusionQueryivNV2(@GLuint int id, @GLenum int pname, @OutParameter IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_packed_depth_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_packed_depth_stencil.java new file mode 100644 index 0000000..552447f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_packed_depth_stencil.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_packed_depth_stencil { + int GL_DEPTH_STENCIL_NV = 0x84F9; + int GL_UNSIGNED_INT_24_8_NV = 0x84FA; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object.java new file mode 100644 index 0000000..5b88561 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface NV_parameter_buffer_object { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV = 0x8DA0; + int GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV = 0x8DA1; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + int GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA2; + int GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA3; + int GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV = 0x8DA4; + + @StripPostfix("params") + void glProgramBufferParametersfvNV(@GLenum int target, @GLuint int buffer, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const FloatBuffer params); + + @StripPostfix("params") + void glProgramBufferParametersIivNV(@GLenum int target, @GLuint int buffer, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLsizei int count, @Const IntBuffer params); + + @StripPostfix("params") + void glProgramBufferParametersIuivNV(@GLenum int target, @GLuint int buffer, @GLuint int index, + @AutoSize(value = "params", expression = " >> 2") @GLuint int count, @Const @GLuint IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object2.java new file mode 100644 index 0000000..5704513 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_parameter_buffer_object2.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_parameter_buffer_object2 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_path_rendering.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_path_rendering.java new file mode 100644 index 0000000..28fd9c0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_path_rendering.java @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface NV_path_rendering { + + /** + * Accepted in elements of the &lt;commands&gt; array parameter of + * PathCommandsNV and PathSubCommandsNV: + */ + int GL_CLOSE_PATH_NV = 0x00, + GL_MOVE_TO_NV = 0x02, + GL_RELATIVE_MOVE_TO_NV = 0x03, + GL_LINE_TO_NV = 0x04, + GL_RELATIVE_LINE_TO_NV = 0x05, + GL_HORIZONTAL_LINE_TO_NV = 0x06, + GL_RELATIVE_HORIZONTAL_LINE_TO_NV = 0x07, + GL_VERTICAL_LINE_TO_NV = 0x08, + GL_RELATIVE_VERTICAL_LINE_TO_NV = 0x09, + GL_QUADRATIC_CURVE_TO_NV = 0x0A, + GL_RELATIVE_QUADRATIC_CURVE_TO_NV = 0x0B, + GL_CUBIC_CURVE_TO_NV = 0x0C, + GL_RELATIVE_CUBIC_CURVE_TO_NV = 0x0D, + GL_SMOOTH_QUADRATIC_CURVE_TO_NV = 0x0E, + GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV = 0x0F, + GL_SMOOTH_CUBIC_CURVE_TO_NV = 0x10, + GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV = 0x11, + GL_SMALL_CCW_ARC_TO_NV = 0x12, + GL_RELATIVE_SMALL_CCW_ARC_TO_NV = 0x13, + GL_SMALL_CW_ARC_TO_NV = 0x14, + GL_RELATIVE_SMALL_CW_ARC_TO_NV = 0x15, + GL_LARGE_CCW_ARC_TO_NV = 0x16, + GL_RELATIVE_LARGE_CCW_ARC_TO_NV = 0x17, + GL_LARGE_CW_ARC_TO_NV = 0x18, + GL_RELATIVE_LARGE_CW_ARC_TO_NV = 0x19, + GL_CIRCULAR_CCW_ARC_TO_NV = 0xF8, + GL_CIRCULAR_CW_ARC_TO_NV = 0xFA, + GL_CIRCULAR_TANGENT_ARC_TO_NV = 0xFC, + GL_ARC_TO_NV = 0xFE, + GL_RELATIVE_ARC_TO_NV = 0xFF; + + /** Accepted by the &lt;format&gt; parameter of PathStringNV: */ + int GL_PATH_FORMAT_SVG_NV = 0x9070, + GL_PATH_FORMAT_PS_NV = 0x9071; + + /** + * Accepted by the &lt;fontTarget&gt; parameter of PathGlyphsNV and + * PathGlyphRangeNV: + */ + int GL_STANDARD_FONT_NAME_NV = 0x9072, + GL_SYSTEM_FONT_NAME_NV = 0x9073, + GL_FILE_NAME_NV = 0x9074; + + /** + * Accepted by the &lt;handleMissingGlyph&gt; parameter of PathGlyphsNV and + * PathGlyphRangeNV: + */ + int GL_SKIP_MISSING_GLYPH_NV = 0x90A9, + GL_USE_MISSING_GLYPH_NV = 0x90AA; + + /** + * Accepted by the &lt;pname&gt; parameter of PathParameterfNV, + * PathParameterfvNV, GetPathParameterfvNV, PathParameteriNV, + * PathParameterivNV, and GetPathParameterivNV: + */ + int GL_PATH_STROKE_WIDTH_NV = 0x9075, + GL_PATH_INITIAL_END_CAP_NV = 0x9077, + GL_PATH_TERMINAL_END_CAP_NV = 0x9078, + GL_PATH_JOIN_STYLE_NV = 0x9079, + GL_PATH_MITER_LIMIT_NV = 0x907A, + GL_PATH_INITIAL_DASH_CAP_NV = 0x907C, + GL_PATH_TERMINAL_DASH_CAP_NV = 0x907D, + GL_PATH_DASH_OFFSET_NV = 0x907E, + GL_PATH_CLIENT_LENGTH_NV = 0x907F, + GL_PATH_DASH_OFFSET_RESET_NV = 0x90B4, + + GL_PATH_FILL_MODE_NV = 0x9080, + GL_PATH_FILL_MASK_NV = 0x9081, + GL_PATH_FILL_COVER_MODE_NV = 0x9082, + GL_PATH_STROKE_COVER_MODE_NV = 0x9083, + GL_PATH_STROKE_MASK_NV = 0x9084; + + /** + * Accepted by the &lt;pname&gt; parameter of PathParameterfNV and + * PathParameterfvNV: + */ + int GL_PATH_END_CAPS_NV = 0x9076, + GL_PATH_DASH_CAPS_NV = 0x907B; + + /** + * Accepted by the &lt;fillMode&gt; parameter of StencilFillPathNV and + * StencilFillPathInstancedNV: + */ + int GL_COUNT_UP_NV = 0x9088, + GL_COUNT_DOWN_NV = 0x9089; + + /** + * Accepted by the &lt;color&gt; parameter of PathColorGenNV, + * GetPathColorGenivNV, and GetPathColorGenfvNV: + */ + int GL_PRIMARY_COLOR = 0x8577, // from OpenGL 1.3 + GL_PRIMARY_COLOR_NV = 0x852C, // from NV_register_combiners + GL_SECONDARY_COLOR_NV = 0x852D; // from NV_register_combiners + + /** + * Accepted by the &lt;genMode&gt; parameter of PathColorGenNV and + * PathTexGenNV: + */ + int GL_PATH_OBJECT_BOUNDING_BOX_NV = 0x908A; + + /** + * Accepted by the &lt;coverMode&gt; parameter of CoverFillPathNV and + * CoverFillPathInstancedNV: + */ + int GL_CONVEX_HULL_NV = 0x908B, + GL_BOUNDING_BOX_NV = 0x908D; + + /** + * Accepted by the &lt;transformType&gt; parameter of + * StencilFillPathInstancedNV, StencilStrokePathInstancedNV, + * CoverFillPathInstancedNV, and CoverStrokePathInstancedNV: + */ + int GL_TRANSLATE_X_NV = 0x908E, + GL_TRANSLATE_Y_NV = 0x908F, + GL_TRANSLATE_2D_NV = 0x9090, + GL_TRANSLATE_3D_NV = 0x9091, + GL_AFFINE_2D_NV = 0x9092, + GL_AFFINE_3D_NV = 0x9094, + GL_TRANSPOSE_AFFINE_2D_NV = 0x9096, + GL_TRANSPOSE_AFFINE_3D_NV = 0x9098; + + /** + * Accepted by the &lt;type&gt; or &lt;pathNameType&gt; parameter of CallLists, + * StencilFillPathInstancedNV, StencilStrokePathInstancedNV, + * CoverFillPathInstancedNV, CoverStrokePathInstancedNV, + * GetPathMetricsNV, and GetPathSpacingNV: + */ + int GL_UTF8_NV = 0x909A, + GL_UTF16_NV = 0x909B; + + /** Accepted by the &lt;coverMode&gt; parameter of CoverFillPathInstancedNV: */ + int GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV = 0x909C; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPathParameterfvNV and + * GetPathParameterivNV: + */ + int GL_PATH_COMMAND_COUNT_NV = 0x909D, + GL_PATH_COORD_COUNT_NV = 0x909E, + GL_PATH_DASH_ARRAY_COUNT_NV = 0x909F, + GL_PATH_COMPUTED_LENGTH_NV = 0x90A0, + GL_PATH_FILL_BOUNDING_BOX_NV = 0x90A1, + GL_PATH_STROKE_BOUNDING_BOX_NV = 0x90A2; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV + * when &lt;pname&gt; is one of PATH_END_CAPS_NV, PATH_INTIAL_END_CAP_NV, + * PATH_TERMINAL_END_CAP_NV, PATH_DASH_CAPS_NV, PATH_INITIAL_DASH_CAP_NV, + * and PATH_TERMINAL_DASH_CAP_NV: + */ + int GL_SQUARE_NV = 0x90A3, + GL_ROUND_NV = 0x90A4, + GL_TRIANGULAR_NV = 0x90A5; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV + * when &lt;pname&gt; is PATH_JOIN_STYLE_NV: + */ + int GL_BEVEL_NV = 0x90A6, + GL_MITER_REVERT_NV = 0x90A7, + GL_MITER_TRUNCATE_NV = 0x90A8; + + /** + * Accepted by the &lt;value&gt; parameter of PathParameterfNV, + * PathParameterfvNV, PathParameteriNV, and PathParameterivNV when + * &lt;pname&gt; is PATH_DASH_OFFSET_RESET_NV + */ + int GL_MOVE_TO_RESETS_NV = 0x90B5, + GL_MOVE_TO_CONTINUES_NV = 0x90B6; + + /** Accepted by the &lt;fontStyle&gt; parameter of PathStringNV: */ + int GL_BOLD_BIT_NV = 0x01, + GL_ITALIC_BIT_NV = 0x02; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetInteger64v, GetFloatv, and GetDoublev: + */ + int GL_PATH_ERROR_POSITION_NV = 0x90AB, + + GL_PATH_FOG_GEN_MODE_NV = 0x90AC, + + GL_PATH_STENCIL_FUNC_NV = 0x90B7, + GL_PATH_STENCIL_REF_NV = 0x90B8, + GL_PATH_STENCIL_VALUE_MASK_NV = 0x90B9, + + GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV = 0x90BD, + GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV = 0x90BE, + + GL_PATH_COVER_DEPTH_FUNC_NV = 0x90BF; + + /** + * Accepted as a bit within the &lt;metricQueryMask&gt; parameter of + * GetPathMetricRangeNV or GetPathMetricsNV: + */ + + int GL_GLYPH_WIDTH_BIT_NV = 0x01, // per-glyph metrics + GL_GLYPH_HEIGHT_BIT_NV = 0x02, + GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV = 0x04, + GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV = 0x08, + GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV = 0x10, + GL_GLYPH_VERTICAL_BEARING_X_BIT_NV = 0x20, + GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV = 0x40, + GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV = 0x80, + GL_GLYPH_HAS_KERNING_NV = 0x100, + GL_FONT_X_MIN_BOUNDS_NV = 0x00010000, // per-font face metrics + GL_FONT_Y_MIN_BOUNDS_NV = 0x00020000, + GL_FONT_X_MAX_BOUNDS_NV = 0x00040000, + GL_FONT_Y_MAX_BOUNDS_NV = 0x00080000, + GL_FONT_UNITS_PER_EM_NV = 0x00100000, + GL_FONT_ASCENDER_NV = 0x00200000, + GL_FONT_DESCENDER_NV = 0x00400000, + GL_FONT_HEIGHT_NV = 0x00800000, + GL_FONT_MAX_ADVANCE_WIDTH_NV = 0x01000000, + GL_FONT_MAX_ADVANCE_HEIGHT_NV = 0x02000000, + GL_FONT_UNDERLINE_POSITION_NV = 0x04000000, + GL_FONT_UNDERLINE_THICKNESS_NV = 0x08000000, + GL_FONT_HAS_KERNING_NV = 0x10000000; + + /** Accepted by the &lt;pathListMode&gt; parameter of GetPathSpacingNV: */ + int GL_ACCUM_ADJACENT_PAIRS_NV = 0x90AD, + GL_ADJACENT_PAIRS_NV = 0x90AE, + GL_FIRST_TO_REST_NV = 0x90AF; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPathColorGenivNV, + * GetPathColorGenfvNV, GetPathTexGenivNV and GetPathTexGenfvNV: + */ + int GL_PATH_GEN_MODE_NV = 0x90B0, + GL_PATH_GEN_COEFF_NV = 0x90B1, + GL_PATH_GEN_COLOR_FORMAT_NV = 0x90B2, + GL_PATH_GEN_COMPONENTS_NV = 0x90B3; + + void glPathCommandsNV(@GLuint int path, + @AutoSize("commands") @GLsizei int numCommands, @Const @GLubyte ByteBuffer commands, + @AutoSize("coords") @GLsizei int numCoords, @GLenum int coordType, + @Const @GLvoid ByteBuffer coords); + + void glPathCoordsNV(@GLuint int path, + @AutoSize("coords") @GLsizei int numCoords, @GLenum int coordType, + @Const @GLvoid ByteBuffer coords); + + void glPathSubCommandsNV(@GLuint int path, + @GLsizei int commandStart, @GLsizei int commandsToDelete, + @AutoSize("commands") @GLsizei int numCommands, @Const @GLubyte ByteBuffer commands, + @AutoSize("coords") @GLsizei int numCoords, @GLenum int coordType, + @Const @GLvoid ByteBuffer coords); + + void glPathSubCoordsNV(@GLuint int path, + @GLsizei int coordStart, + @AutoSize("coords") @GLsizei int numCoords, @GLenum int coordType, + @Const @GLvoid ByteBuffer coords); + + void glPathStringNV(@GLuint int path, @GLenum int format, + @AutoSize("pathString") @GLsizei int length, @Const @GLvoid ByteBuffer pathString); + + void glPathGlyphsNV(@GLuint int firstPathName, + @GLenum int fontTarget, + @NullTerminated @Const @GLvoid ByteBuffer fontName, + @GLbitfield int fontStyle, + @AutoSize(value = "charcodes", expression = " / GLChecks.calculateBytesPerCharCode(type)") @GLsizei int numGlyphs, @GLenum int type, + @Const @GLvoid ByteBuffer charcodes, + @GLenum int handleMissingGlyphs, + @GLuint int pathParameterTemplate, + float emScale); + + void glPathGlyphRangeNV(@GLuint int firstPathName, + @GLenum int fontTarget, + @NullTerminated @Const @GLvoid ByteBuffer fontName, + @GLbitfield int fontStyle, + @GLuint int firstGlyph, + @GLsizei int numGlyphs, + @GLenum int handleMissingGlyphs, + @GLuint int pathParameterTemplate, + float emScale); + + void glWeightPathsNV(@GLuint int resultPath, + @AutoSize("paths") @GLsizei int numPaths, + @Const @GLuint IntBuffer paths, @Check("paths.remaining()") @Const FloatBuffer weights); + + void glCopyPathNV(@GLuint int resultPath, @GLuint int srcPath); + + void glInterpolatePathsNV(@GLuint int resultPath, + @GLuint int pathA, @GLuint int pathB, + float weight); + + void glTransformPathNV(@GLuint int resultPath, + @GLuint int srcPath, + @GLenum int transformType, + @Check(value = "GLChecks.calculateTransformPathValues(transformType)", canBeNull = true) @Const FloatBuffer transformValues); + + @StripPostfix("value") + void glPathParameterivNV(@GLuint int path, @GLenum int pname, @Check("4") @Const IntBuffer value); + + void glPathParameteriNV(@GLuint int path, @GLenum int pname, int value); + + @StripPostfix("value") + void glPathParameterfvNV(@GLuint int path, @GLenum int pname, @Check("4") @Const IntBuffer value); + + void glPathParameterfNV(@GLuint int path, @GLenum int pname, float value); + + void glPathDashArrayNV(@GLuint int path, + @AutoSize("dashArray") @GLsizei int dashCount, @Const FloatBuffer dashArray); + + // PATH NAME MANAGEMENT + + @GLuint + int glGenPathsNV(@GLsizei int range); + + void glDeletePathsNV(@GLuint int path, @GLsizei int range); + + boolean glIsPathNV(@GLuint int path); + + // PATH STENCILING + + void glPathStencilFuncNV(@GLenum int func, int ref, @GLuint int mask); + + void glPathStencilDepthOffsetNV(float factor, int units); + + void glStencilFillPathNV(@GLuint int path, + @GLenum int fillMode, @GLuint int mask); + + void glStencilStrokePathNV(@GLuint int path, + int reference, @GLuint int mask); + + void glStencilFillPathInstancedNV(@AutoSize(value="paths", expression = " / GLChecks.calculateBytesPerPathName(pathNameType)") @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + @GLenum int fillMode, @GLuint int mask, + @GLenum int transformType, + @Check(value = "GLChecks.calculateTransformPathValues(transformType)", canBeNull = true) @Const FloatBuffer transformValues); + + void glStencilStrokePathInstancedNV(@AutoSize(value = "paths", expression = " / GLChecks.calculateBytesPerPathName(pathNameType)") @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + int reference, @GLuint int mask, + @GLenum int transformType, + @Check(value = "GLChecks.calculateTransformPathValues(transformType)", canBeNull = true) @Const FloatBuffer transformValues); + + // PATH COVERING + + void glPathCoverDepthFuncNV(@GLenum int zfunc); + + void glPathColorGenNV(@GLenum int color, + @GLenum int genMode, + @GLenum int colorFormat, @Check(value = "GLChecks.calculatePathColorGenCoeffsCount(genMode, colorFormat)", canBeNull = true) @Const FloatBuffer coeffs); + + void glPathTexGenNV(@GLenum int texCoordSet, + @GLenum int genMode, + @AutoSize(value="coeffs", expression="GLChecks.calculatePathTextGenCoeffsPerComponent(coeffs, genMode)", useExpression = true, canBeNull = true) int components, @Check(canBeNull = true) @Const FloatBuffer coeffs); + + void glPathFogGenNV(@GLenum int genMode); + + void glCoverFillPathNV(@GLuint int path, @GLenum int coverMode); + + void glCoverStrokePathNV(@GLuint int name, @GLenum int coverMode); + + void glCoverFillPathInstancedNV(@AutoSize(value = "paths", expression = " / GLChecks.calculateBytesPerPathName(pathNameType)") @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + @GLenum int coverMode, + @GLenum int transformType, + @Check(value = "GLChecks.calculateTransformPathValues(transformType)", canBeNull = true) @Const FloatBuffer transformValues); + + void glCoverStrokePathInstancedNV(@AutoSize(value = "paths", expression = " / GLChecks.calculateBytesPerPathName(pathNameType)") @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + @GLenum int coverMode, + @GLenum int transformType, + @Check(value = "GLChecks.calculateTransformPathValues(transformType)", canBeNull = true) @Const FloatBuffer transformValues); + + // PATH QUERIES + + @StripPostfix("value") + void glGetPathParameterivNV(@GLuint int name, @GLenum int param, @Check("4") @OutParameter IntBuffer value); + + @Alternate("glGetPathParameterivNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathParameterivNV2(@GLuint int name, @GLenum int param, @OutParameter IntBuffer value); + + void glGetPathParameterfvNV(@GLuint int name, @GLenum int param, @Check("4") @OutParameter FloatBuffer value); + + @Alternate("glGetPathParameterfvNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathParameterfvNV2(@GLuint int name, @GLenum int param, @OutParameter FloatBuffer value); + + void glGetPathCommandsNV(@GLuint int name, @Check @OutParameter @GLubyte ByteBuffer commands); + + void glGetPathCoordsNV(@GLuint int name, @Check @OutParameter FloatBuffer coords); + + void glGetPathDashArrayNV(@GLuint int name, @Check @OutParameter FloatBuffer dashArray); + + void glGetPathMetricsNV(@GLbitfield int metricQueryMask, + @AutoSize(value = "paths", expression = " / GLChecks.calculateBytesPerPathName(pathNameType)") @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + @GLsizei int stride, + @Check("GLChecks.calculateMetricsSize(metricQueryMask, stride)") @OutParameter FloatBuffer metrics); + + void glGetPathMetricRangeNV(@GLbitfield int metricQueryMask, + @GLuint int fistPathName, + @GLsizei int numPaths, + @GLsizei int stride, + @Check("GLChecks.calculateMetricsSize(metricQueryMask, stride)") @OutParameter FloatBuffer metrics); + + @Code("\t\tint numPaths = paths.remaining() / GLChecks.calculateBytesPerPathName(pathNameType);") + void glGetPathSpacingNV(@GLenum int pathListMode, + @AutoSize(value = "paths", expression = "numPaths", useExpression = true) @GLsizei int numPaths, + @GLenum int pathNameType, @Const @GLvoid ByteBuffer paths, + @GLuint int pathBase, + float advanceScale, + float kerningScale, + @GLenum int transformType, + @Check("numPaths - 1") @OutParameter FloatBuffer returnedSpacing); + + @StripPostfix("value") + void glGetPathColorGenivNV(@GLenum int color, @GLenum int pname, @Check("16") @OutParameter IntBuffer value); + + @Alternate("glGetPathColorGenivNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathColorGenivNV2(@GLenum int color, @GLenum int pname, @OutParameter IntBuffer value); + + @StripPostfix("value") + void glGetPathColorGenfvNV(@GLenum int color, @GLenum int pname, @Check("16") @OutParameter FloatBuffer value); + + @Alternate("glGetPathColorGenfvNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathColorGenfvNV2(@GLenum int color, @GLenum int pname, @OutParameter FloatBuffer value); + + @StripPostfix("value") + void glGetPathTexGenivNV(@GLenum int texCoordSet, @GLenum int pname, @Check("16") @OutParameter IntBuffer value); + + @Alternate("glGetPathTexGenivNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathTexGenivNV2(@GLenum int texCoordSet, @GLenum int pname, @OutParameter IntBuffer value); + + @StripPostfix("value") + void glGetPathTexGenfvNV(@GLenum int texCoordSet, @GLenum int pname, @Check("16") @OutParameter FloatBuffer value); + + @Alternate("glGetPathTexGenfvNV") + @GLreturn("value") + @StripPostfix(value = "value", postfix = "v") + void glGetPathTexGenfvNV2(@GLenum int texCoordSet, @GLenum int pname, @OutParameter FloatBuffer value); + + boolean glIsPointInFillPathNV(@GLuint int path, + @GLuint int mask, float x, float y); + + boolean glIsPointInStrokePathNV(@GLuint int path, + float x, float y); + + float glGetPathLengthNV(@GLuint int path, + @GLsizei int startSegment, @GLsizei int numSegments); + + boolean glPointAlongPathNV(@GLuint int path, + @GLsizei int startSegment, @GLsizei int numSegments, + float distance, + @Check(value = "1", canBeNull = true) @OutParameter FloatBuffer x, + @Check(value = "1", canBeNull = true) @OutParameter FloatBuffer y, + @Check(value = "1", canBeNull = true) @OutParameter FloatBuffer tangentX, + @Check(value = "1", canBeNull = true) @OutParameter FloatBuffer tangentY); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_pixel_data_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_pixel_data_range.java new file mode 100644 index 0000000..6581382 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_pixel_data_range.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface NV_pixel_data_range { + + /** + * Accepted by the &lt;target&gt; parameter of PixelDataRangeNV and + * FlushPixelDataRangeNV, and by the &lt;cap&gt; parameter of + * EnableClientState, DisableClientState, and IsEnabled: + */ + int GL_WRITE_PIXEL_DATA_RANGE_NV = 0x8878; + int GL_READ_PIXEL_DATA_RANGE_NV = 0x8879; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = 0x887A; + int GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = 0x887B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetPointerv: + */ + int GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = 0x887C; + int GL_READ_PIXEL_DATA_RANGE_POINTER_NV = 0x887D; + + void glPixelDataRangeNV(@GLenum int target, @AutoSize("data") @GLsizei int length, + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer data); + + void glFlushPixelDataRangeNV(@GLenum int target); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_point_sprite.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_point_sprite.java new file mode 100644 index 0000000..416c4b0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_point_sprite.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.*; + +public interface NV_point_sprite { + int GL_POINT_SPRITE_NV = 0x8861; + int GL_COORD_REPLACE_NV = 0x8862; + int GL_POINT_SPRITE_R_MODE_NV = 0x8863; + + void glPointParameteriNV(@GLenum int pname, int param); + + @StripPostfix("params") + void glPointParameterivNV(@GLenum int pname, @Check("4") @Const IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_present_video.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_present_video.java new file mode 100644 index 0000000..17a2574 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_present_video.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +public interface NV_present_video { + + /** + * Accepted by the &lt;type&gt; parameter of PresentFrameKeyedNV and + * PresentFrameDualFillNV: + */ + int GL_FRAME_NV = 0x8E26, + FIELDS_NV = 0x8E27; + + /** + * Accepted by the &lt;pname&gt; parameter of GetVideoivNV, GetVideouivNV, + * GetVideoi64vNV, GetVideoui64vNV: + */ + int GL_CURRENT_TIME_NV = 0x8E28, + GL_NUM_FILL_STREAMS_NV = 0x8E29; + + /** Accepted by the &lt;target&gt; parameter of GetQueryiv: */ + int GL_PRESENT_TIME_NV = 0x8E2A, + GL_PRESENT_DURATION_NV = 0x8E2B; + + /** Accepted by the &lt;attribute&gt; parameter of NVPresentVideoUtil.glQueryContextNV: */ + int GL_NUM_VIDEO_SLOTS_NV = 0x20F0; // GLX_NUM_VIDEO_SLOTS_NV & WGL_NUM_VIDEO_SLOTS_NV + + void glPresentFrameKeyedNV(@GLuint int video_slot, + @GLuint64EXT long minPresentTime, + @GLuint int beginPresentTimeId, + @GLuint int presentDurationId, + @GLenum int type, + @GLenum int target0, @GLuint int fill0, @GLuint int key0, + @GLenum int target1, @GLuint int fill1, @GLuint int key1); + + void glPresentFrameDualFillNV(@GLuint int video_slot, + @GLuint64EXT long minPresentTime, + @GLuint int beginPresentTimeId, + @GLuint int presentDurationId, + @GLenum int type, + @GLenum int target0, @GLuint int fill0, + @GLenum int target1, @GLuint int fill1, + @GLenum int target2, @GLuint int fill2, + @GLenum int target3, @GLuint int fill3); + + @StripPostfix("params") + void glGetVideoivNV(@GLuint int video_slot, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetVideoivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoivNV2(@GLuint int video_slot, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetVideouivNV(@GLuint int video_slot, @GLenum int pname, @OutParameter @Check("1") @GLuint IntBuffer params); + + @Alternate("glGetVideouivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideouivNV2(@GLuint int video_slot, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + @StripPostfix("params") + void glGetVideoi64vNV(@GLuint int video_slot, @GLenum int pname, @OutParameter @Check("1") @GLint64EXT LongBuffer params); + + @Alternate("glGetVideoi64vNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoi64vNV2(@GLuint int video_slot, @GLenum int pname, @OutParameter @GLint64EXT LongBuffer params); + + @StripPostfix("params") + void glGetVideoui64vNV(@GLuint int video_slot, @GLenum int pname, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + @Alternate("glGetVideoui64vNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoui64vNV2(@GLuint int video_slot, @GLenum int pname, @OutParameter @GLuint64EXT LongBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_primitive_restart.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_primitive_restart.java new file mode 100644 index 0000000..ba828e8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_primitive_restart.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLuint; + +@ForceInit +public interface NV_primitive_restart { + + /** + * Accepted by the &lt;array&gt; parameter of EnableClientState and + * DisableClientState, by the &lt;cap&gt; parameter of IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_PRIMITIVE_RESTART_NV = 0x8558; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PRIMITIVE_RESTART_INDEX_NV = 0x8559; + + void glPrimitiveRestartNV(); + + void glPrimitiveRestartIndexNV(@GLuint int index); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_program.java new file mode 100644 index 0000000..128b9ec --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_program.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +@Extension(postfix = "NV", isFinal = false) +public interface NV_program { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivNV: */ + int GL_PROGRAM_TARGET_NV = 0x8646; + int GL_PROGRAM_LENGTH_NV = 0x8627; + int GL_PROGRAM_RESIDENT_NV = 0x8647; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramStringNV: */ + int GL_PROGRAM_STRING_NV = 0x8628; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_PROGRAM_ERROR_POSITION_NV = 0x864B; + + /** Accepted by the &lt;name&gt; parameter of GetString: */ + int GL_PROGRAM_ERROR_STRING_NV = 0x8874; + + void glLoadProgramNV(@GLenum int target, @GLuint int programID, @AutoSize("string") @GLsizei int length, @Const @GLubyte Buffer string); + + @Alternate("glLoadProgramNV") + void glLoadProgramNV(@GLenum int target, @GLuint int programID, @Constant("string.length()") @GLsizei int length, CharSequence string); + + void glBindProgramNV(@GLenum int target, @GLuint int programID); + + void glDeleteProgramsNV(@AutoSize("programs") @GLsizei int n, @Const @GLuint IntBuffer programs); + + @Alternate("glDeleteProgramsNV") + void glDeleteProgramsNV(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, program)", keepParam = true) int program); + + void glGenProgramsNV(@AutoSize("programs") @GLsizei int n, @OutParameter @GLuint IntBuffer programs); + + @Alternate("glGenProgramsNV") + @GLreturn("programs") + void glGenProgramsNV2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer programs); + + @StripPostfix("params") + void glGetProgramivNV(@GLuint int programID, @GLenum int parameterName, @OutParameter @Check @GLint IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetProgramiNV} instead. */ + @Alternate("glGetProgramivNV") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "NVProgram", method = "glGetProgramiNV") + @Deprecated + void glGetProgramivNV2(@GLuint int programID, @GLenum int parameterName, @OutParameter @GLint IntBuffer params); + + @Alternate("glGetProgramivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramivNV3(@GLuint int programID, @GLenum int parameterName, @OutParameter @GLint IntBuffer params); + + void glGetProgramStringNV(@GLuint int programID, @GLenum int parameterName, @OutParameter @Check @GLubyte Buffer paramString); + + @Alternate("glGetProgramStringNV") + @Code("\t\tint programLength = glGetProgramiNV(programID, GL_PROGRAM_LENGTH_NV);") + @GLreturn(value="paramString", maxLength = "programLength", forceMaxLength = true) + void glGetProgramStringNV2(@GLuint int programID, @GLenum int parameterName, @OutParameter @GLchar ByteBuffer paramString); + + boolean glIsProgramNV(@GLuint int programID); + + boolean glAreProgramsResidentNV(@AutoSize("programIDs") @GLsizei int n, + @Const @GLuint IntBuffer programIDs, + @OutParameter @GLboolean @Check("programIDs.remaining()") ByteBuffer programResidences); + + void glRequestResidentProgramsNV(@AutoSize("programIDs") @GLsizei int n, @GLuint IntBuffer programIDs); + + @Alternate("glRequestResidentProgramsNV") + void glRequestResidentProgramsNV(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, programID)", keepParam = true) int programID); +} + diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners.java new file mode 100644 index 0000000..9aa96b3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; + +import java.nio.*; + +public interface NV_register_combiners { + int GL_REGISTER_COMBINERS_NV = 0x8522; + int GL_COMBINER0_NV = 0x8550; + int GL_COMBINER1_NV = 0x8551; + int GL_COMBINER2_NV = 0x8552; + int GL_COMBINER3_NV = 0x8553; + int GL_COMBINER4_NV = 0x8554; + int GL_COMBINER5_NV = 0x8555; + int GL_COMBINER6_NV = 0x8556; + int GL_COMBINER7_NV = 0x8557; + int GL_VARIABLE_A_NV = 0x8523; + int GL_VARIABLE_B_NV = 0x8524; + int GL_VARIABLE_C_NV = 0x8525; + int GL_VARIABLE_D_NV = 0x8526; + int GL_VARIABLE_E_NV = 0x8527; + int GL_VARIABLE_F_NV = 0x8528; + int GL_VARIABLE_G_NV = 0x8529; + int GL_CONSTANT_COLOR0_NV = 0x852A; + int GL_CONSTANT_COLOR1_NV = 0x852B; + int GL_PRIMARY_COLOR_NV = 0x852C; + int GL_SECONDARY_COLOR_NV = 0x852D; + int GL_SPARE0_NV = 0x852E; + int GL_SPARE1_NV = 0x852F; + int GL_UNSIGNED_IDENTITY_NV = 0x8536; + int GL_UNSIGNED_INVERT_NV = 0x8537; + int GL_EXPAND_NORMAL_NV = 0x8538; + int GL_EXPAND_NEGATE_NV = 0x8539; + int GL_HALF_BIAS_NORMAL_NV = 0x853A; + int GL_HALF_BIAS_NEGATE_NV = 0x853B; + int GL_SIGNED_IDENTITY_NV = 0x853C; + int GL_SIGNED_NEGATE_NV = 0x853D; + int GL_E_TIMES_F_NV = 0x8531; + int GL_SPARE0_PLUS_SECONDARY_COLOR_NV = 0x8532; + int GL_SCALE_BY_TWO_NV = 0x853E; + int GL_SCALE_BY_FOUR_NV = 0x853F; + int GL_SCALE_BY_ONE_HALF_NV = 0x8540; + int GL_BIAS_BY_NEGATIVE_ONE_HALF_NV = 0x8541; + int GL_DISCARD_NV = 0x8530; + int GL_COMBINER_INPUT_NV = 0x8542; + int GL_COMBINER_MAPPING_NV = 0x8543; + int GL_COMBINER_COMPONENT_USAGE_NV = 0x8544; + int GL_COMBINER_AB_DOT_PRODUCT_NV = 0x8545; + int GL_COMBINER_CD_DOT_PRODUCT_NV = 0x8546; + int GL_COMBINER_MUX_SUM_NV = 0x8547; + int GL_COMBINER_SCALE_NV = 0x8548; + int GL_COMBINER_BIAS_NV = 0x8549; + int GL_COMBINER_AB_OUTPUT_NV = 0x854A; + int GL_COMBINER_CD_OUTPUT_NV = 0x854B; + int GL_COMBINER_SUM_OUTPUT_NV = 0x854C; + int GL_NUM_GENERAL_COMBINERS_NV = 0x854E; + int GL_COLOR_SUM_CLAMP_NV = 0x854F; + int GL_MAX_GENERAL_COMBINERS_NV = 0x854D; + + void glCombinerParameterfNV(@GLenum int pname, float param); + + @StripPostfix("params") + void glCombinerParameterfvNV(@GLenum int pname, @Check("4") @Const FloatBuffer params); + + void glCombinerParameteriNV(@GLenum int pname, int param); + + @StripPostfix("params") + void glCombinerParameterivNV(@GLenum int pname, @Check("4") @Const IntBuffer params); + + void glCombinerInputNV(@GLenum int stage, @GLenum int portion, @GLenum int variable, @GLenum int input, @GLenum int mapping, @GLenum int componentUsage); + + void glCombinerOutputNV(@GLenum int stage, @GLenum int portion, @GLenum int abOutput, @GLenum int cdOutput, @GLenum int sumOutput, @GLenum int scale, @GLenum int bias, boolean abDotProduct, boolean cdDotProduct, boolean muxSum); + + void glFinalCombinerInputNV(@GLenum int variable, @GLenum int input, @GLenum int mapping, @GLenum int componentUsage); + + @StripPostfix("params") + void glGetCombinerInputParameterfvNV(@GLenum int stage, @GLenum int portion, @GLenum int variable, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetCombinerInputParameterfvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetCombinerInputParameterfvNV2(@GLenum int stage, @GLenum int portion, @GLenum int variable, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetCombinerInputParameterivNV(@GLenum int stage, @GLenum int portion, @GLenum int variable, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetCombinerInputParameterivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetCombinerInputParameterivNV2(@GLenum int stage, @GLenum int portion, @GLenum int variable, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetCombinerOutputParameterfvNV(@GLenum int stage, @GLenum int portion, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetCombinerOutputParameterfvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetCombinerOutputParameterfvNV2(@GLenum int stage, @GLenum int portion, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetCombinerOutputParameterivNV(@GLenum int stage, @GLenum int portion, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetCombinerOutputParameterivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetCombinerOutputParameterivNV2(@GLenum int stage, @GLenum int portion, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetFinalCombinerInputParameterfvNV(@GLenum int variable, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @Alternate("glGetFinalCombinerInputParameterfvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFinalCombinerInputParameterfvNV2(@GLenum int variable, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetFinalCombinerInputParameterivNV(@GLenum int variable, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @Alternate("glGetFinalCombinerInputParameterivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFinalCombinerInputParameterivNV2(@GLenum int variable, @GLenum int pname, @OutParameter IntBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners2.java new file mode 100644 index 0000000..2b4f9fd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_register_combiners2.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; + +import java.nio.*; + +public interface NV_register_combiners2 { + int GL_PER_STAGE_CONSTANTS_NV = 0x8535; + + @StripPostfix("params") + void glCombinerStageParameterfvNV(@GLenum int stage, @GLenum int pname, @Const @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetCombinerStageParameterfvNV(@GLenum int stage, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_counters.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_counters.java new file mode 100644 index 0000000..512da94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_counters.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_shader_atomic_counters { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_float.java new file mode 100644 index 0000000..62283c7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_atomic_float.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_shader_atomic_float { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_load.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_load.java new file mode 100644 index 0000000..230268c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_load.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.LongBuffer; + +public interface NV_shader_buffer_load { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBufferParameterui64vNV, + * GetNamedBufferParameterui64vNV: + */ + int GL_BUFFER_GPU_ADDRESS_NV = 0x8F1D; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_GPU_ADDRESS_NV = 0x8F34; + + /** Accepted by the &lt;value&gt; parameter of GetIntegerui64vNV: */ + int GL_MAX_SHADER_BUFFER_ADDRESS_NV = 0x8F35; + + void glMakeBufferResidentNV(@GLenum int target, @GLenum int access); + + void glMakeBufferNonResidentNV(@GLenum int target); + + boolean glIsBufferResidentNV(@GLenum int target); + + void glMakeNamedBufferResidentNV(@GLuint int buffer, @GLenum int access); + + void glMakeNamedBufferNonResidentNV(@GLuint int buffer); + + boolean glIsNamedBufferResidentNV(@GLuint int buffer); + + @StripPostfix("params") + void glGetBufferParameterui64vNV(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + @Alternate("glGetBufferParameterui64vNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameterui64vNV2(@GLenum int target, @GLenum int pname, @OutParameter @GLuint64EXT LongBuffer params); + + @StripPostfix("params") + void glGetNamedBufferParameterui64vNV(@GLuint int buffer, @GLenum int pname, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + @Alternate("glGetNamedBufferParameterui64vNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetNamedBufferParameterui64vNV2(@GLuint int buffer, @GLenum int pname, @OutParameter @GLuint64EXT LongBuffer params); + + @StripPostfix("result") + void glGetIntegerui64vNV(@GLenum int value, @OutParameter @Check("1") @GLuint64EXT LongBuffer result); + + @Alternate("glGetIntegerui64vNV") + @GLreturn("result") + @StripPostfix(value = "result", postfix = "v") + void glGetIntegerui64vNV2(@GLenum int value, @OutParameter @GLuint64EXT LongBuffer result); + + void glUniformui64NV(int location, @GLuint64EXT long value); + + @StripPostfix("value") + void glUniformui64vNV(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + + @Reuse("NVGpuShader5") + @StripPostfix("params") + void glGetUniformui64vNV(@GLuint int program, int location, @OutParameter @Check("1") @GLuint64EXT LongBuffer params); + + void glProgramUniformui64NV(@GLuint int program, int location, @GLuint64EXT long value); + + @StripPostfix("value") + void glProgramUniformui64vNV(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const @GLuint64EXT LongBuffer value); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_store.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_store.java new file mode 100644 index 0000000..f20da04 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_buffer_store.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_shader_buffer_store { + + /** Accepted by the &lt;barriers&gt; parameter of MemoryBarrierNV: */ + int GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV = 0x00000010; + + /** Accepted by the &lt;access&gt; parameter of MakeBufferResidentNV: */ + int GL_READ_WRITE = GL15.GL_READ_WRITE; + int GL_WRITE_ONLY = GL15.GL_WRITE_ONLY; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_storage_buffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_storage_buffer_object.java new file mode 100644 index 0000000..7c7f261 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_shader_storage_buffer_object.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_shader_storage_buffer_object { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_tessellation_program5.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_tessellation_program5.java new file mode 100644 index 0000000..cc61f78 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_tessellation_program5.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_tessellation_program5 { + + /** + * Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of ProgramStringARB, + * BindProgramARB, ProgramEnvParameter4[df][v]ARB, + * ProgramLocalParameter4[df][v]ARB, GetProgramEnvParameter[df]vARB, + * GetProgramLocalParameter[df]vARB, GetProgramivARB and + * GetProgramStringARB: + */ + int GL_TESS_CONTROL_PROGRAM_NV = 0x891E; + int GL_TESS_EVALUATION_PROGRAM_NV = 0x891F; + + /** + * Accepted by the &lt;target&gt; parameter of ProgramBufferParametersfvNV, + * ProgramBufferParametersIivNV, and ProgramBufferParametersIuivNV, + * BindBufferRangeNV, BindBufferOffsetNV, BindBufferBaseNV, and BindBuffer + * and the &lt;value&gt; parameter of GetIntegerIndexedvEXT: + */ + int GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV = 0x8C74; + int GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV = 0x8C75; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramivARB: */ + int GL_MAX_PROGRAM_PATCH_ATTRIBS_NV = 0x86D8; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texgen_reflection.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texgen_reflection.java new file mode 100644 index 0000000..fe0582a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texgen_reflection.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texgen_reflection { + int GL_NORMAL_MAP_NV = 0x8511; + int GL_REFLECTION_MAP_NV = 0x8512; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_barrier.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_barrier.java new file mode 100644 index 0000000..71858b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_barrier.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_barrier { + + void glTextureBarrierNV(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_compression_vtc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_compression_vtc.java new file mode 100644 index 0000000..f3414be --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_compression_vtc.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +@Extension(postfix = "NV", className = "NVTextureCompressionVTC") +public interface NV_texture_compression_vtc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage3D and + * CompressedTexImage3DARB and the &lt;format&gt; parameter of + * CompressedTexSubImage2DARB: + */ + int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0; + int GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; + int GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2; + int GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_env_combine4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_env_combine4.java new file mode 100644 index 0000000..5e2ae59 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_env_combine4.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_env_combine4 { + int GL_COMBINE4_NV = 0x8503; + int GL_SOURCE3_RGB_NV = 0x8583; + int GL_SOURCE3_ALPHA_NV = 0x858B; + int GL_OPERAND3_RGB_NV = 0x8593; + int GL_OPERAND3_ALPHA_NV = 0x859B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_expand_normal.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_expand_normal.java new file mode 100644 index 0000000..46a1aef --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_expand_normal.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_expand_normal { + + /** + * Accepted by the &lt;pname&gt; parameters of TexParameteri, + * TexParameteriv, TexParameterf, TexParameterfv, GetTexParameteri, + * and GetTexParameteriv: + */ + int GL_TEXTURE_UNSIGNED_REMAP_MODE_NV = 0x888F; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_multisample.java new file mode 100644 index 0000000..a46ddbd --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_multisample.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_texture_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetTexLevelParameter: */ + + int GL_TEXTURE_COVERAGE_SAMPLES_NV = 0x9045, + GL_TEXTURE_COLOR_SAMPLES_NV = 0x9046; + + void glTexImage2DMultisampleCoverageNV(@GLenum int target, + @GLsizei int coverageSamples, @GLsizei int colorSamples, + int internalFormat, + @GLsizei int width, @GLsizei int height, + boolean fixedSampleLocations); + + void glTexImage3DMultisampleCoverageNV(@GLenum int target, + @GLsizei int coverageSamples, @GLsizei int colorSamples, + int internalFormat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + boolean fixedSampleLocations); + + void glTextureImage2DMultisampleNV(@GLuint int texture, @GLenum int target, + @GLsizei int samples, int internalFormat, + @GLsizei int width, @GLsizei int height, + boolean fixedSampleLocations); + + void glTextureImage3DMultisampleNV(@GLuint int texture, @GLenum int target, + @GLsizei int samples, int internalFormat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + boolean fixedSampleLocations); + + void glTextureImage2DMultisampleCoverageNV(@GLuint int texture, @GLenum int target, + @GLsizei int coverageSamples, @GLsizei int colorSamples, + int internalFormat, + @GLsizei int width, @GLsizei int height, + boolean fixedSampleLocations); + + void glTextureImage3DMultisampleCoverageNV(@GLuint int texture, @GLenum int target, + @GLsizei int coverageSamples, @GLsizei int colorSamples, + int internalFormat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + boolean fixedSampleLocations); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_rectangle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_rectangle.java new file mode 100644 index 0000000..5948814 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_rectangle.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_rectangle { + int GL_TEXTURE_RECTANGLE_NV = 0x84F5; + int GL_TEXTURE_BINDING_RECTANGLE_NV = 0x84F6; + int GL_PROXY_TEXTURE_RECTANGLE_NV = 0x84F7; + int GL_MAX_RECTANGLE_TEXTURE_SIZE_NV = 0x84F8; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader.java new file mode 100644 index 0000000..4cf0d7c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_shader { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, + * and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev, and by the &lt;target&gt; parameter of TexEnvf, TexEnvfv, + * TexEnvi, TexEnviv, GetTexEnvfv, and GetTexEnviv. + */ + int GL_TEXTURE_SHADER_NV = 0x86DE; + + /** + * When the &lt;target&gt; parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, + * GetTexEnvfv, and GetTexEnviv is TEXTURE_SHADER_NV, then the value + * of &lt;pname&gt; may be: + */ + int GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = 0x86D9; + int GL_SHADER_OPERATION_NV = 0x86DF; + int GL_OFFSET_TEXTURE_SCALE_NV = 0x86E2; + int GL_OFFSET_TEXTURE_BIAS_NV = 0x86E3; + int GL_OFFSET_TEXTURE_2D_SCALE_NV = GL_OFFSET_TEXTURE_SCALE_NV; + int GL_OFFSET_TEXTURE_2D_BIAS_NV = GL_OFFSET_TEXTURE_BIAS_NV; + int GL_PREVIOUS_TEXTURE_INPUT_NV = 0x86E4; + + /** + * When the &lt;target&gt; parameter of TexEnvfv, TexEnviv, GetTexEnvfv, and + * GetTexEnviv is TEXTURE_SHADER_NV, then the value of &lt;pname&gt; may be: + */ + int GL_CULL_MODES_NV = 0x86E0; + int GL_OFFSET_TEXTURE_MATRIX_NV = 0x86E1; + int GL_OFFSET_TEXTURE_2D_MATRIX_NV = GL_OFFSET_TEXTURE_MATRIX_NV; + int GL_CONST_EYE_NV = 0x86E5; + + /** + * When the &lt;target&gt; parameter GetTexEnvfv and GetTexEnviv is + * TEXTURE_SHADER_NV, then the value of &lt;pname&gt; may be: + */ + int GL_SHADER_CONSISTENT_NV = 0x86DD; + + /** + * When the &lt;target&gt; and &lt;pname&gt; parameters of TexEnvf, TexEnvfv, + * TexEnvi, and TexEnviv are TEXTURE_SHADER_NV and SHADER_OPERATION_NV + * respectively, then the value of &lt;param&gt; or the value pointed to by + * &lt;params&gt; may be: + */ + int GL_PASS_THROUGH_NV = 0x86E6; + int GL_CULL_FRAGMENT_NV = 0x86E7; + + int GL_OFFSET_TEXTURE_2D_NV = 0x86E8; + int GL_OFFSET_TEXTURE_RECTANGLE_NV = 0x864C; + int GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = 0x864D; + int GL_DEPENDENT_AR_TEXTURE_2D_NV = 0x86E9; + int GL_DEPENDENT_GB_TEXTURE_2D_NV = 0x86EA; + + int GL_DOT_PRODUCT_NV = 0x86EC; + int GL_DOT_PRODUCT_DEPTH_REPLACE_NV = 0x86ED; + int GL_DOT_PRODUCT_TEXTURE_2D_NV = 0x86EE; + int GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = 0x864E; + int GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = 0x86F0; + int GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = 0x86F1; + int GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = 0x86F2; + int GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = 0x86F3; + + /** + * Accepted by the &lt;format&gt; parameter of GetTexImage, TexImage1D, + * TexImage2D, TexSubImage1D, and TexSubImage2D. + */ + int GL_HILO_NV = 0x86F4; + int GL_DSDT_NV = 0x86F5; + int GL_DSDT_MAG_NV = 0x86F6; + int GL_DSDT_MAG_VIB_NV = 0x86F7; + + /** + * Accepted by the &lt;type&gt; parameter of GetTexImage, TexImage1D, + * TexImage2D, TexSubImage1D, and TexSubImage2D. + */ + int GL_UNSIGNED_INT_S8_S8_8_8_NV = 0x86DA; + int GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = 0x86DB; + + /** + * Accepted by the &lt;internalformat&gt; parameter of CopyTexImage1D, + * CopyTexImage2D, TexImage1D, and TexImage2D. + */ + int GL_SIGNED_RGBA_NV = 0x86FB; + int GL_SIGNED_RGBA8_NV = 0x86FC; + int GL_SIGNED_RGB_NV = 0x86FE; + int GL_SIGNED_RGB8_NV = 0x86FF; + int GL_SIGNED_LUMINANCE_NV = 0x8701; + int GL_SIGNED_LUMINANCE8_NV = 0x8702; + int GL_SIGNED_LUMINANCE_ALPHA_NV = 0x8703; + int GL_SIGNED_LUMINANCE8_ALPHA8_NV = 0x8704; + int GL_SIGNED_ALPHA_NV = 0x8705; + int GL_SIGNED_ALPHA8_NV = 0x8706; + int GL_SIGNED_INTENSITY_NV = 0x8707; + int GL_SIGNED_INTENSITY8_NV = 0x8708; + int GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = 0x870C; + int GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = 0x870D; + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D and + * TexImage2D. + */ + int GL_HILO16_NV = 0x86F8; + int GL_SIGNED_HILO_NV = 0x86F9; + int GL_SIGNED_HILO16_NV = 0x86FA; + int GL_DSDT8_NV = 0x8709; + int GL_DSDT8_MAG8_NV = 0x870A; + int GL_DSDT_MAG_INTENSITY_NV = 0x86DC; + int GL_DSDT8_MAG8_INTENSITY8_NV = 0x870B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev, PixelTransferf, and PixelTransferi. + */ + int GL_HI_SCALE_NV = 0x870E; + int GL_LO_SCALE_NV = 0x870F; + int GL_DS_SCALE_NV = 0x8710; + int GL_DT_SCALE_NV = 0x8711; + int GL_MAGNITUDE_SCALE_NV = 0x8712; + int GL_VIBRANCE_SCALE_NV = 0x8713; + int GL_HI_BIAS_NV = 0x8714; + int GL_LO_BIAS_NV = 0x8715; + int GL_DS_BIAS_NV = 0x8716; + int GL_DT_BIAS_NV = 0x8717; + int GL_MAGNITUDE_BIAS_NV = 0x8718; + int GL_VIBRANCE_BIAS_NV = 0x8719; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteriv, TexParameterfv, + * GetTexParameterfv and GetTexParameteriv. + */ + int GL_TEXTURE_BORDER_VALUES_NV = 0x871A; + + /** + * Accepted by the &lt;pname&gt; parameter of GetTexLevelParameterfv and + * GetTexLevelParameteriv. + */ + int GL_TEXTURE_HI_SIZE_NV = 0x871B; + int GL_TEXTURE_LO_SIZE_NV = 0x871C; + int GL_TEXTURE_DS_SIZE_NV = 0x871D; + int GL_TEXTURE_DT_SIZE_NV = 0x871E; + int GL_TEXTURE_MAG_SIZE_NV = 0x871F; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader2.java new file mode 100644 index 0000000..3cc4ace --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader2.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_shader2 { + int GL_DOT_PRODUCT_TEXTURE_3D_NV = 0x86EF; + int GL_HILO_NV = 0x86F4; + int GL_DSDT_NV = 0x86F5; + int GL_DSDT_MAG_NV = 0x86F6; + int GL_DSDT_MAG_VIB_NV = 0x86F7; + int GL_UNSIGNED_INT_S8_S8_8_8_NV = 0x86DA; + int GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = 0x86DB; + int GL_SIGNED_RGBA_NV = 0x86FB; + int GL_SIGNED_RGBA8_NV = 0x86FC; + int GL_SIGNED_RGB_NV = 0x86FE; + int GL_SIGNED_RGB8_NV = 0x86FF; + int GL_SIGNED_LUMINANCE_NV = 0x8701; + int GL_SIGNED_LUMINANCE8_NV = 0x8702; + int GL_SIGNED_LUMINANCE_ALPHA_NV = 0x8703; + int GL_SIGNED_LUMINANCE8_ALPHA8_NV = 0x8704; + int GL_SIGNED_ALPHA_NV = 0x8705; + int GL_SIGNED_ALPHA8_NV = 0x8706; + int GL_SIGNED_INTENSITY_NV = 0x8707; + int GL_SIGNED_INTENSITY8_NV = 0x8708; + int GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = 0x870C; + int GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = 0x870D; + int GL_HILO16_NV = 0x86F8; + int GL_SIGNED_HILO_NV = 0x86F9; + int GL_SIGNED_HILO16_NV = 0x86FA; + int GL_DSDT8_NV = 0x8709; + int GL_DSDT8_MAG8_NV = 0x870A; + int GL_DSDT_MAG_INTENSITY_NV = 0x86DC; + int GL_DSDT8_MAG8_INTENSITY8_NV = 0x870B; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader3.java new file mode 100644 index 0000000..f4fecfa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_texture_shader3.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_texture_shader3 { + int GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = 0x8850; + int GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = 0x8851; + int GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8852; + int GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = 0x8853; + int GL_OFFSET_HILO_TEXTURE_2D_NV = 0x8854; + int GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = 0x8855; + int GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = 0x8856; + int GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = 0x8857; + int GL_DEPENDENT_HILO_TEXTURE_2D_NV = 0x8858; + int GL_DEPENDENT_RGB_TEXTURE_3D_NV = 0x8859; + int GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = 0x885A; + int GL_DOT_PRODUCT_PASS_THROUGH_NV = 0x885B; + int GL_DOT_PRODUCT_TEXTURE_1D_NV = 0x885C; + int GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = 0x885D; + int GL_HILO8_NV = 0x885E; + int GL_SIGNED_HILO8_NV = 0x885F; + int GL_FORCE_BLUE_TO_ONE_NV = 0x8860; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback.java new file mode 100644 index 0000000..54fe359 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface NV_transform_feedback { + + /** + * Accepted by the &lt;target&gt; parameters of BindBuffer, BufferData, + * BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData, + * GetBufferPointerv, BindBufferRangeNV, BindBufferOffsetNV and + * BindBufferBaseNV: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_NV = 0x8C8E; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_START_NV = 0x8C84; + int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV = 0x8C85; + int GL_TRANSFORM_FEEDBACK_RECORD_NV = 0x8C86; + + /** + * Accepted by the &lt;param&gt; parameter of GetIntegerIndexedvEXT and + * GetBooleanIndexedvEXT, and by the &lt;pname&gt; parameter of GetBooleanv, + * GetDoublev, GetIntegerv, and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV = 0x8C8F; + + /** + * Accepted by the &lt;bufferMode&gt; parameter of TransformFeedbackAttribsNV and + * TransformFeedbackVaryingsNV: + */ + int GL_INTERLEAVED_ATTRIBS_NV = 0x8C8C; + int GL_SEPARATE_ATTRIBS_NV = 0x8C8D; + + /** + * Accepted by the &lt;target&gt; parameter of BeginQuery, EndQuery, and + * GetQueryiv: + */ + int GL_PRIMITIVES_GENERATED_NV = 0x8C87; + int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV = 0x8C88; + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable, and IsEnabled, and by + * the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + * GetDoublev: + */ + int GL_RASTERIZER_DISCARD_NV = 0x8C89; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV = 0x8C8A; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV = 0x8C8B; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV = 0x8C80; + int GL_TRANSFORM_FEEDBACK_ATTRIBS_NV = 0x8C7E; + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_ACTIVE_VARYINGS_NV = 0x8C81; + int GL_ACTIVE_VARYING_MAX_LENGTH_NV = 0x8C82; + int GL_TRANSFORM_FEEDBACK_VARYINGS_NV = 0x8C83; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * GetFloatv, and GetProgramiv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV = 0x8C7F; + + /** Accepted by the &lt;attribs&gt; parameter of TransformFeedbackAttribsNV: */ + int GL_BACK_PRIMARY_COLOR_NV = 0x8C77; + int GL_BACK_SECONDARY_COLOR_NV = 0x8C78; + int GL_TEXTURE_COORD_NV = 0x8C79; + int GL_CLIP_DISTANCE_NV = 0x8C7A; + int GL_VERTEX_ID_NV = 0x8C7B; + int GL_PRIMITIVE_ID_NV = 0x8C7C; + int GL_GENERIC_ATTRIB_NV = 0x8C7D; + int GL_LAYER_NV = 0x8DAA; + + void glBindBufferRangeNV(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset, @GLsizeiptr long size); + + void glBindBufferOffsetNV(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset); + + void glBindBufferBaseNV(@GLenum int target, @GLuint int index, @GLuint int buffer); + + void glTransformFeedbackAttribsNV(@Constant("attribs.remaining() / 3") @GLsizei int count, @Check("3") @Const IntBuffer attribs, @GLenum int bufferMode); + + void glTransformFeedbackVaryingsNV(@GLuint int program, @AutoSize("locations") @GLsizei int count, @Const IntBuffer locations, @GLenum int bufferMode); + + void glBeginTransformFeedbackNV(@GLenum int primitiveMode); + + void glEndTransformFeedbackNV(); + + int glGetVaryingLocationNV(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetVaryingLocationNV") + int glGetVaryingLocationNV(@GLuint int program, @NullTerminated CharSequence name); + + void glGetActiveVaryingNV(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveVaryingNV. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveVaryingNV") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetActiveVaryingNV2(@GLuint int program, @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveVaryingNV. This version returns only the varying name. */ + @Alternate(value = "glGetActiveVaryingNV", javaAlt = true) + @GLreturn(value = "name", maxLength = "bufSize") + void glGetActiveVaryingNV(@GLuint int program, @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt(caps)), MemoryUtil.getAddress(APIUtil.getBufferInt(caps), 1)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveVaryingNV. This version returns only the varying size. */ + @Alternate(value = "glGetActiveVaryingNV", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveVaryingSizeNV(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + /** Overloads glGetActiveVaryingNV. This version returns only the varying type. */ + @Alternate(value = "glGetActiveVaryingNV", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveVaryingTypeNV(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0(caps)") ByteBuffer name); + + void glActiveVaryingNV(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glActiveVaryingNV") + void glActiveVaryingNV(@GLuint int program, @NullTerminated CharSequence name); + + void glGetTransformFeedbackVaryingNV(@GLuint int program, @GLuint int index, @OutParameter @Check("1") IntBuffer location); + + @Alternate("glGetTransformFeedbackVaryingNV") + @GLreturn("location") + void glGetTransformFeedbackVaryingNV2(@GLuint int program, @GLuint int index, @OutParameter IntBuffer location); + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback2.java new file mode 100644 index 0000000..9390d3a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_transform_feedback2.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface NV_transform_feedback2 { + + /** Accepted by the &lt;target&gt; parameter of BindTransformFeedbackNV: */ + + int GL_TRANSFORM_FEEDBACK_NV = 0x8E22; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv, + * and GetFloatv: + */ + int GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV = 0x8E23; + int GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV = 0x8E24; + int GL_TRANSFORM_FEEDBACK_BINDING_NV = 0x8E25; + + void glBindTransformFeedbackNV(@GLenum int target, @GLuint int id); + + void glDeleteTransformFeedbacksNV(@AutoSize("ids") @GLsizei int n, @Const @GLuint IntBuffer ids); + + @Alternate("glDeleteTransformFeedbacksNV") + void glDeleteTransformFeedbacksNV(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(caps, id)", keepParam = true) int id); + + void glGenTransformFeedbacksNV(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenTransformFeedbacksNV") + @GLreturn("ids") + void glGenTransformFeedbacksNV2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + boolean glIsTransformFeedbackNV(@GLuint int id); + + void glPauseTransformFeedbackNV(); + + void glResumeTransformFeedbackNV(); + + void glDrawTransformFeedbackNV(@GLenum int mode, @GLuint int id); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range.java new file mode 100644 index 0000000..aecc145 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface NV_vertex_array_range { + int GL_VERTEX_ARRAY_RANGE_NV = 0x851D; + int GL_VERTEX_ARRAY_RANGE_LENGTH_NV = 0x851E; + int GL_VERTEX_ARRAY_RANGE_VALID_NV = 0x851F; + int GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = 0x8520; + int GL_VERTEX_ARRAY_RANGE_POINTER_NV = 0x8521; + + void glVertexArrayRangeNV(@AutoSize("pPointer") @GLsizei int size, + @Const + @GLbyte + @GLshort + @GLint + @GLfloat + @GLdouble Buffer pPointer); + + void glFlushVertexArrayRangeNV(); + + @PlatformDependent({Platform.WGL, Platform.GLX}) + @GLvoid + @AutoSize("size") + ByteBuffer glAllocateMemoryNV(int size, float readFrequency, float writeFrequency, float priority); + + @PlatformDependent({Platform.WGL, Platform.GLX}) + void glFreeMemoryNV(@Check @GLbyte Buffer pointer); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range2.java new file mode 100644 index 0000000..2972f1a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_array_range2.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_array_range2 { + int GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = 0x8533; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_attrib_integer_64bit.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_attrib_integer_64bit.java new file mode 100644 index 0000000..63edcc6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_attrib_integer_64bit.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.LongBuffer; + +@Dependent +public interface NV_vertex_attrib_integer_64bit { + + /** + * Accepted by the &lt;type&gt; parameter of VertexAttribLPointerEXT, + * VertexArrayVertexAttribLOffsetEXT, and VertexAttribLFormatNV: + */ + int GL_INT64_NV = 0x140E; + int GL_UNSIGNED_INT64_NV = 0x140F; + + void glVertexAttribL1i64NV(@GLuint int index, @GLint64EXT long x); + + void glVertexAttribL2i64NV(@GLuint int index, @GLint64EXT long x, @GLint64EXT long y); + + void glVertexAttribL3i64NV(@GLuint int index, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z); + + void glVertexAttribL4i64NV(@GLuint int index, @GLint64EXT long x, @GLint64EXT long y, @GLint64EXT long z, @GLint64EXT long w); + + @StripPostfix("v") + void glVertexAttribL1i64vNV(@GLuint int index, @Const @GLint64EXT @Check("1") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL2i64vNV(@GLuint int index, @Const @GLint64EXT @Check("2") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL3i64vNV(@GLuint int index, @Const @GLint64EXT @Check("3") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL4i64vNV(@GLuint int index, @Const @GLint64EXT @Check("4") LongBuffer v); + + void glVertexAttribL1ui64NV(@GLuint int index, @GLuint64EXT long x); + + void glVertexAttribL2ui64NV(@GLuint int index, @GLuint64EXT long x, @GLuint64EXT long y); + + void glVertexAttribL3ui64NV(@GLuint int index, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z); + + void glVertexAttribL4ui64NV(@GLuint int index, @GLuint64EXT long x, @GLuint64EXT long y, @GLuint64EXT long z, @GLuint64EXT long w); + + @StripPostfix("v") + void glVertexAttribL1ui64vNV(@GLuint int index, @Const @GLuint64EXT @Check("1") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL2ui64vNV(@GLuint int index, @Const @GLuint64EXT @Check("2") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL3ui64vNV(@GLuint int index, @Const @GLuint64EXT @Check("3") LongBuffer v); + + @StripPostfix("v") + void glVertexAttribL4ui64vNV(@GLuint int index, @Const @GLuint64EXT @Check("4") LongBuffer v); + + @StripPostfix("params") + void glGetVertexAttribLi64vNV(@GLuint int index, @GLenum int pname, @OutParameter @GLint64EXT @Check("4") LongBuffer params); + + @StripPostfix("params") + void glGetVertexAttribLui64vNV(@GLuint int index, @GLenum int pname, @OutParameter @GLuint64EXT @Check("4") LongBuffer params); + + @Dependent("GL_NV_vertex_buffer_unified_memory") + void glVertexAttribLFormatNV(@GLuint int index, int size, @GLenum int type, @GLsizei int stride); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_buffer_unified_memory.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_buffer_unified_memory.java new file mode 100644 index 0000000..6039b5f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_buffer_unified_memory.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.LongBuffer; + +public interface NV_vertex_buffer_unified_memory { + + /** + * Accepted by the &lt;cap&gt; parameter of DisableClientState, + * EnableClientState, IsEnabled: + */ + int GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV = 0x8F1E; + int GL_ELEMENT_ARRAY_UNIFIED_NV = 0x8F1F; + + /** + * Accepted by the &lt;pname&gt; parameter of BufferAddressRangeNV + * and the &lt;value&gt; parameter of GetIntegerui64i_vNV: + */ + int GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV = 0x8F20; + int GL_TEXTURE_COORD_ARRAY_ADDRESS_NV = 0x8F25; + + /** + * Accepted by the &lt;pname&gt; parameter of BufferAddressRangeNV + * and the &lt;value&gt; parameter of GetIntegerui64vNV: + */ + int GL_VERTEX_ARRAY_ADDRESS_NV = 0x8F21; + int GL_NORMAL_ARRAY_ADDRESS_NV = 0x8F22; + int GL_COLOR_ARRAY_ADDRESS_NV = 0x8F23; + int GL_INDEX_ARRAY_ADDRESS_NV = 0x8F24; + int GL_EDGE_FLAG_ARRAY_ADDRESS_NV = 0x8F26; + int GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV = 0x8F27; + int GL_FOG_COORD_ARRAY_ADDRESS_NV = 0x8F28; + int GL_ELEMENT_ARRAY_ADDRESS_NV = 0x8F29; + + /** Accepted by the &lt;target&gt; parameter of GetIntegeri_vNV: */ + int GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV = 0x8F2A; + int GL_TEXTURE_COORD_ARRAY_LENGTH_NV = 0x8F2F; + + /** Accepted by the &lt;value&gt; parameter of GetIntegerv: */ + int GL_VERTEX_ARRAY_LENGTH_NV = 0x8F2B; + int GL_NORMAL_ARRAY_LENGTH_NV = 0x8F2C; + int GL_COLOR_ARRAY_LENGTH_NV = 0x8F2D; + int GL_INDEX_ARRAY_LENGTH_NV = 0x8F2E; + int GL_EDGE_FLAG_ARRAY_LENGTH_NV = 0x8F30; + int GL_SECONDARY_COLOR_ARRAY_LENGTH_NV = 0x8F31; + int GL_FOG_COORD_ARRAY_LENGTH_NV = 0x8F32; + int GL_ELEMENT_ARRAY_LENGTH_NV = 0x8F33; + + void glBufferAddressRangeNV(@GLenum int pname, @GLuint int index, @GLuint64EXT long address, @GLsizeiptr long length); + + void glVertexFormatNV(int size, @GLenum int type, @GLsizei int stride); + + void glNormalFormatNV(@GLenum int type, @GLsizei int stride); + + void glColorFormatNV(int size, @GLenum int type, @GLsizei int stride); + + void glIndexFormatNV(@GLenum int type, @GLsizei int stride); + + void glTexCoordFormatNV(int size, @GLenum int type, @GLsizei int stride); + + void glEdgeFlagFormatNV(@GLsizei int stride); + + void glSecondaryColorFormatNV(int size, @GLenum int type, @GLsizei int stride); + + void glFogCoordFormatNV(@GLenum int type, @GLsizei int stride); + + void glVertexAttribFormatNV(@GLuint int index, int size, @GLenum int type, boolean normalized, @GLsizei int stride); + + void glVertexAttribIFormatNV(@GLuint int index, int size, @GLenum int type, @GLsizei int stride); + + @StripPostfix("result") + void glGetIntegerui64i_vNV(@GLenum int value, @GLuint int index, @OutParameter @Check("1") @GLuint64EXT LongBuffer result); + + @Alternate("glGetIntegerui64i_vNV") + @GLreturn("result") + @StripPostfix(value = "result", postfix = "i_v") + void glGetIntegerui64i_vNV2(@GLenum int value, @GLuint int index, @OutParameter @GLuint64EXT LongBuffer result); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program.java new file mode 100644 index 0000000..b6fabc6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program.java @@ -0,0 +1,331 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface NV_vertex_program extends NV_program { + + /** + Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + and GetDoublev, and by the &lt;target&gt; parameter of BindProgramNV, + ExecuteProgramNV, GetProgramParameter[df]vNV, GetTrackMatrixivNV, + LoadProgramNV, ProgramParameter[s]4[df][v]NV, and TrackMatrixNV: + */ + int GL_VERTEX_PROGRAM_NV = 0x8620; + + /** + Accepted by the &lt;cap&gt; parameter of Disable, Enable, and IsEnabled, + and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + and GetDoublev: + */ + int GL_VERTEX_PROGRAM_POINT_SIZE_NV = 0x8642; + int GL_VERTEX_PROGRAM_TWO_SIDE_NV = 0x8643; + + /** + Accepted by the &lt;target&gt; parameter of ExecuteProgramNV and + LoadProgramNV: + */ + int GL_VERTEX_STATE_PROGRAM_NV = 0x8621; + + /** + Accepted by the &lt;pname&gt; parameter of GetVertexAttrib[dfi]vNV: + */ + int GL_ATTRIB_ARRAY_SIZE_NV = 0x8623; + int GL_ATTRIB_ARRAY_STRIDE_NV = 0x8624; + int GL_ATTRIB_ARRAY_TYPE_NV = 0x8625; + int GL_CURRENT_ATTRIB_NV = 0x8626; + + /** + Accepted by the &lt;pname&gt; parameter of GetProgramParameterfvNV + and GetProgramParameterdvNV: + */ + int GL_PROGRAM_PARAMETER_NV = 0x8644; + + /** + Accepted by the &lt;pname&gt; parameter of GetVertexAttribPointervNV: + */ + int GL_ATTRIB_ARRAY_POINTER_NV = 0x8645; + + /** + Accepted by the &lt;pname&gt; parameter of GetTrackMatrixivNV: + */ + int GL_TRACK_MATRIX_NV = 0x8648; + int GL_TRACK_MATRIX_TRANSFORM_NV = 0x8649; + + /** + Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev: + */ + int GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV = 0x862E; + int GL_MAX_TRACK_MATRICES_NV = 0x862F; + int GL_CURRENT_MATRIX_STACK_DEPTH_NV = 0x8640; + int GL_CURRENT_MATRIX_NV = 0x8641; + int GL_VERTEX_PROGRAM_BINDING_NV = 0x864A; + + /** + Accepted by the &lt;matrix&gt; parameter of TrackMatrixNV: + */ + int GL_MODELVIEW_PROJECTION_NV = 0x8629; + + /** + Accepted by the &lt;matrix&gt; parameter of TrackMatrixNV and by the + &lt;mode&gt; parameter of MatrixMode: + */ + int GL_MATRIX0_NV = 0x8630; + int GL_MATRIX1_NV = 0x8631; + int GL_MATRIX2_NV = 0x8632; + int GL_MATRIX3_NV = 0x8633; + int GL_MATRIX4_NV = 0x8634; + int GL_MATRIX5_NV = 0x8635; + int GL_MATRIX6_NV = 0x8636; + int GL_MATRIX7_NV = 0x8637; + + /** + Accepted by the &lt;transform&gt; parameter of TrackMatrixNV: + */ + int GL_IDENTITY_NV = 0x862A; + int GL_INVERSE_NV = 0x862B; + int GL_TRANSPOSE_NV = 0x862C; + int GL_INVERSE_TRANSPOSE_NV = 0x862D; + + /** + Accepted by the &lt;array&gt; parameter of EnableClientState and + DisableClientState, by the &lt;cap&gt; parameter of IsEnabled, and by + the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, and + GetDoublev: + */ + int GL_VERTEX_ATTRIB_ARRAY0_NV = 0x8650; + int GL_VERTEX_ATTRIB_ARRAY1_NV = 0x8651; + int GL_VERTEX_ATTRIB_ARRAY2_NV = 0x8652; + int GL_VERTEX_ATTRIB_ARRAY3_NV = 0x8653; + int GL_VERTEX_ATTRIB_ARRAY4_NV = 0x8654; + int GL_VERTEX_ATTRIB_ARRAY5_NV = 0x8655; + int GL_VERTEX_ATTRIB_ARRAY6_NV = 0x8656; + int GL_VERTEX_ATTRIB_ARRAY7_NV = 0x8657; + int GL_VERTEX_ATTRIB_ARRAY8_NV = 0x8658; + int GL_VERTEX_ATTRIB_ARRAY9_NV = 0x8659; + int GL_VERTEX_ATTRIB_ARRAY10_NV = 0x865A; + int GL_VERTEX_ATTRIB_ARRAY11_NV = 0x865B; + int GL_VERTEX_ATTRIB_ARRAY12_NV = 0x865C; + int GL_VERTEX_ATTRIB_ARRAY13_NV = 0x865D; + int GL_VERTEX_ATTRIB_ARRAY14_NV = 0x865E; + int GL_VERTEX_ATTRIB_ARRAY15_NV = 0x865F; + + /** + Accepted by the &lt;target&gt; parameter of GetMapdv, GetMapfv, GetMapiv, + Map1d and Map1f and by the &lt;cap&gt; parameter of Enable, Disable, and + IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev: + */ + int GL_MAP1_VERTEX_ATTRIB0_4_NV = 0x8660; + int GL_MAP1_VERTEX_ATTRIB1_4_NV = 0x8661; + int GL_MAP1_VERTEX_ATTRIB2_4_NV = 0x8662; + int GL_MAP1_VERTEX_ATTRIB3_4_NV = 0x8663; + int GL_MAP1_VERTEX_ATTRIB4_4_NV = 0x8664; + int GL_MAP1_VERTEX_ATTRIB5_4_NV = 0x8665; + int GL_MAP1_VERTEX_ATTRIB6_4_NV = 0x8666; + int GL_MAP1_VERTEX_ATTRIB7_4_NV = 0x8667; + int GL_MAP1_VERTEX_ATTRIB8_4_NV = 0x8668; + int GL_MAP1_VERTEX_ATTRIB9_4_NV = 0x8669; + int GL_MAP1_VERTEX_ATTRIB10_4_NV = 0x866A; + int GL_MAP1_VERTEX_ATTRIB11_4_NV = 0x866B; + int GL_MAP1_VERTEX_ATTRIB12_4_NV = 0x866C; + int GL_MAP1_VERTEX_ATTRIB13_4_NV = 0x866D; + int GL_MAP1_VERTEX_ATTRIB14_4_NV = 0x866E; + int GL_MAP1_VERTEX_ATTRIB15_4_NV = 0x866F; + + /** + Accepted by the &lt;target&gt; parameter of GetMapdv, GetMapfv, GetMapiv, + Map2d and Map2f and by the &lt;cap&gt; parameter of Enable, Disable, and + IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + GetFloatv, and GetDoublev: + */ + int GL_MAP2_VERTEX_ATTRIB0_4_NV = 0x8670; + int GL_MAP2_VERTEX_ATTRIB1_4_NV = 0x8671; + int GL_MAP2_VERTEX_ATTRIB2_4_NV = 0x8672; + int GL_MAP2_VERTEX_ATTRIB3_4_NV = 0x8673; + int GL_MAP2_VERTEX_ATTRIB4_4_NV = 0x8674; + int GL_MAP2_VERTEX_ATTRIB5_4_NV = 0x8675; + int GL_MAP2_VERTEX_ATTRIB6_4_NV = 0x8676; + int GL_MAP2_VERTEX_ATTRIB7_4_NV = 0x8677; + int GL_MAP2_VERTEX_ATTRIB8_4_NV = 0x8678; + int GL_MAP2_VERTEX_ATTRIB9_4_NV = 0x8679; + int GL_MAP2_VERTEX_ATTRIB10_4_NV = 0x867A; + int GL_MAP2_VERTEX_ATTRIB11_4_NV = 0x867B; + int GL_MAP2_VERTEX_ATTRIB12_4_NV = 0x867C; + int GL_MAP2_VERTEX_ATTRIB13_4_NV = 0x867D; + int GL_MAP2_VERTEX_ATTRIB14_4_NV = 0x867E; + int GL_MAP2_VERTEX_ATTRIB15_4_NV = 0x867F; + + void glExecuteProgramNV(@GLenum int target, @GLuint int id, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glGetProgramParameterfvNV(@GLenum int target, @GLuint int index, @GLenum int parameterName, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetProgramParameterdvNV(@GLenum int target, @GLuint int index, @GLenum int parameterName, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetTrackMatrixivNV(@GLenum int target, @GLuint int address, @GLenum int parameterName, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetVertexAttribfvNV(@GLuint int index, @GLenum int parameterName, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVertexAttribdvNV(@GLuint int index, @GLenum int parameterName, @OutParameter @Check("4") DoubleBuffer params); + + @StripPostfix("params") + void glGetVertexAttribivNV(@GLuint int index, @GLenum int parameterName, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("pointer") + void glGetVertexAttribPointervNV(@GLuint int index, @GLenum int parameterName, @Result @GLvoid ByteBuffer pointer); + + void glProgramParameter4fNV(@GLenum int target, @GLuint int index, float x, float y, float z, float w); + + void glProgramParameter4dNV(@GLenum int target, @GLuint int index, double x, double y, double z, double w); + + @StripPostfix("params") + void glProgramParameters4fvNV(@GLenum int target, @GLuint int index, @AutoSize(value = "params", expression = " >> 2") @GLuint int count, + @Const FloatBuffer params); + + @StripPostfix("params") + void glProgramParameters4dvNV(@GLenum int target, @GLuint int index, @AutoSize(value = "params", expression = " >> 2") @GLuint int count, + @Const DoubleBuffer params); + + void glTrackMatrixNV(@GLenum int target, @GLuint int address, @GLenum int matrix, @GLenum int transform); + + void glVertexAttribPointerNV(@GLuint int index, int size, @GLenum int type, @GLsizei int stride, + @CachedReference(index="index",name="glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint + @GLfloat + @GLdouble Buffer buffer); + + @NoErrorCheck + void glVertexAttrib1sNV(@GLuint int index, short x); + + @NoErrorCheck + void glVertexAttrib1fNV(@GLuint int index, float x); + + @NoErrorCheck + void glVertexAttrib1dNV(@GLuint int index, double x); + + @NoErrorCheck + void glVertexAttrib2sNV(@GLuint int index, short x, short y); + + @NoErrorCheck + void glVertexAttrib2fNV(@GLuint int index, float x, float y); + + @NoErrorCheck + void glVertexAttrib2dNV(@GLuint int index, double x, double y); + + @NoErrorCheck + void glVertexAttrib3sNV(@GLuint int index, short x, short y, short z); + + @NoErrorCheck + void glVertexAttrib3fNV(@GLuint int index, float x, float y, float z); + + @NoErrorCheck + void glVertexAttrib3dNV(@GLuint int index, double x, double y, double z); + + @NoErrorCheck + void glVertexAttrib4sNV(@GLuint int index, short x, short y, short z, short w); + + @NoErrorCheck + void glVertexAttrib4fNV(@GLuint int index, float x, float y, float z, float w); + + @NoErrorCheck + void glVertexAttrib4dNV(@GLuint int index, double x, double y, double z, double w); + + @NoErrorCheck + void glVertexAttrib4ubNV(@GLuint int index, @GLubyte byte x, @GLubyte byte y, @GLubyte byte z, @GLubyte byte w); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs1svNV(@GLuint int index, @AutoSize("v") @GLsizei int n, @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs1fvNV(@GLuint int index, @AutoSize("v") @GLsizei int n, @Const FloatBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs1dvNV(@GLuint int index, @AutoSize("v") @GLsizei int n, @Const DoubleBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs2svNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 1") @GLsizei int n, @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs2fvNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 1") @GLsizei int n, @Const FloatBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs2dvNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 1") @GLsizei int n, @Const DoubleBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs3svNV(@GLuint int index, @AutoSize(value = "v", expression = " / 3") @GLsizei int n, @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs3fvNV(@GLuint int index, @AutoSize(value = "v", expression = " / 3") @GLsizei int n, @Const FloatBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs3dvNV(@GLuint int index, @AutoSize(value = "v", expression = " / 3") @GLsizei int n, @Const DoubleBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs4svNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 2") @GLsizei int n, @Const ShortBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs4fvNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 2") @GLsizei int n, @Const FloatBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribs4dvNV(@GLuint int index, @AutoSize(value = "v", expression = " >> 2") @GLsizei int n, @Const DoubleBuffer v); +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program1_1.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program1_1.java new file mode 100644 index 0000000..1f1e89f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program1_1.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_program1_1 { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2.java new file mode 100644 index 0000000..d6f3d74 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_program2 { +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2_option.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2_option.java new file mode 100644 index 0000000..0d87f4e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program2_option.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_program2_option { + + /** + * Accepted by the &lt;pname&gt; parameter of GetProgramivARB: + */ + int GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = 0x88F4; + int GL_MAX_PROGRAM_CALL_DEPTH_NV = 0x88F5; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program3.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program3.java new file mode 100644 index 0000000..61342ea --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program3.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_program3 { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = 0x8B4C; +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program4.java new file mode 100644 index 0000000..7d92d33 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_vertex_program4.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface NV_vertex_program4 { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_video_capture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_video_capture.java new file mode 100644 index 0000000..15a6948 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/NV_video_capture.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +public interface NV_video_capture { + + /** + * Accepted by the &lt;target&gt; parameters of BindBufferARB, BufferDataARB, + * BufferSubDataARB, MapBufferARB, UnmapBufferARB, GetBufferSubDataARB, + * GetBufferParameterivARB, and GetBufferPointervARB: + */ + int GL_VIDEO_BUFFER_NV = 0x9020; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_VIDEO_BUFFER_BINDING_NV = 0x9021; + + /** + * Accepted by the &lt;frame_region&gt; parameter of + * BindVideoCaptureStreamBufferNV, and BindVideoCaptureStreamTextureNV: + */ + int GL_FIELD_UPPER_NV = 0x9022, + GL_FIELD_LOWER_NV = 0x9023; + + /** Accepted by the &lt;pname&gt; parameter of GetVideoCaptureivNV: */ + int GL_NUM_VIDEO_CAPTURE_STREAMS_NV = 0x9024, + GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV = 0x9025; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetVideoCaptureStream{i,f,d}vNV: + */ + int GL_LAST_VIDEO_CAPTURE_STATUS_NV = 0x9027, + GL_VIDEO_BUFFER_PITCH_NV = 0x9028, + GL_VIDEO_CAPTURE_FRAME_WIDTH_NV = 0x9038, + GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV = 0x9039, + GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV = 0x903A, + GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV = 0x903B, + GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV = 0x9026; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetVideoCaptureStream{i,f,d}vNV and as the &lt;pname&gt; parameter of + * VideoCaptureStreamParameter{i,f,d}vNV: + */ + int GL_VIDEO_COLOR_CONVERSION_MATRIX_NV = 0x9029, + GL_VIDEO_COLOR_CONVERSION_MAX_NV = 0x902A, + GL_VIDEO_COLOR_CONVERSION_MIN_NV = 0x902B, + GL_VIDEO_COLOR_CONVERSION_OFFSET_NV = 0x902C, + GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV = 0x902D, + GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV = 0x903C; + /** Returned by VideoCaptureNV: */ + int GL_PARTIAL_SUCCESS_NV = 0x902E; + + /** + * Returned by VideoCaptureNV and GetVideoCaptureStream{i,f,d}vNV + * when &lt;pname&gt; is LAST_VIDEO_CAPTURE_STATUS_NV: + */ + int GL_SUCCESS_NV = 0x902F, + GL_FAILURE_NV = 0x9030; + + /** + * Accepted in the &lt;params&gt; parameter of + * VideoCaptureStreamParameter{i,f,d}vNV when &lt;pname&gt; is + * VIDEO_BUFFER_INTERNAL_FORMAT_NV and returned by + * GetVideoCaptureStream{i,f,d}vNV when &lt;pname&gt; is + * VIDEO_BUFFER_INTERNAL_FORMAT_NV: + */ + int GL_YCBYCR8_422_NV = 0x9031, + GL_YCBAYCR8A_4224_NV = 0x9032, + GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV = 0x9033, + GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV = 0x9034, + GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV = 0x9035, + GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV = 0x9036, + GL_Z4Y12Z4CB12Z4CR12_444_NV = 0x9037; + + /* + * Accepted in the attribute list of the GLX reply to the + * glXEnumerateVideoCaptureDevicesNV command: + */ + /*int GLX_DEVICE_ID_NV = 0x20CD;*/ + + /** Accepted by the &lt;attribute&gt; parameter of NVPresentVideoUtil.glQueryContextNV: */ + int GL_NUM_VIDEO_CAPTURE_SLOTS_NV = 0x20CF; + + /** + * Accepted by the &lt;attribute&gt; parameter of + * glQueryVideoCaptureDeviceNV: + */ + int GL_UNIQUE_ID_NV = 0x20CE; + + void glBeginVideoCaptureNV(@GLuint int video_capture_slot); + + void glBindVideoCaptureStreamBufferNV(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int frame_region, + @GLintptrARB long offset); + + void glBindVideoCaptureStreamTextureNV(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int frame_region, + @GLenum int target, @GLuint int texture); + + void glEndVideoCaptureNV(@GLuint int video_capture_slot); + + @StripPostfix("params") + void glGetVideoCaptureivNV(@GLuint int video_capture_slot, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetVideoCaptureivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoCaptureivNV2(@GLuint int video_capture_slot, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetVideoCaptureStreamivNV(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetVideoCaptureStreamivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoCaptureStreamivNV2(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetVideoCaptureStreamfvNV(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter @Check("1") FloatBuffer params); + + @Alternate("glGetVideoCaptureStreamfvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoCaptureStreamfvNV2(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetVideoCaptureStreamdvNV(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter @Check("1") DoubleBuffer params); + + @Alternate("glGetVideoCaptureStreamdvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetVideoCaptureStreamdvNV2(@GLuint int video_capture_slot, + @GLuint int stream, @GLenum int pname, + @OutParameter DoubleBuffer params); + + @GLenum + int glVideoCaptureNV(@GLuint int video_capture_slot, + @OutParameter @Check("1") @GLuint IntBuffer sequence_num, + @OutParameter @Check("1") @GLuint64EXT LongBuffer capture_time); + + @StripPostfix("params") + void glVideoCaptureStreamParameterivNV(@GLuint int video_capture_slot, @GLuint int stream, @GLenum int pname, @Const @Check("16") IntBuffer params); + + @StripPostfix("params") + void glVideoCaptureStreamParameterfvNV(@GLuint int video_capture_slot, @GLuint int stream, @GLenum int pname, @Const @Check("16") FloatBuffer params); + + @StripPostfix("params") + void glVideoCaptureStreamParameterdvNV(@GLuint int video_capture_slot, @GLuint int stream, @GLenum int pname, @Const @Check("16") DoubleBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_generate_mipmap.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_generate_mipmap.java new file mode 100644 index 0000000..f68622b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_generate_mipmap.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +public interface SGIS_generate_mipmap { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. + */ + int GL_GENERATE_MIPMAP_SGIS = 0x8191; + + /** + * Accepted by the &lt;target&gt; parameter of Hint, and by the <pname> + * parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev. + */ + int GL_GENERATE_MIPMAP_HINT_SGIS = 0x8192; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_texture_lod.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_texture_lod.java new file mode 100644 index 0000000..9cd0cec --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SGIS_texture_lod.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +import org.lwjgl.util.generator.*; + +@Extension(postfix = "SGIS", className = "SGISTextureLOD") +public interface SGIS_texture_lod { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv. + */ + int GL_TEXTURE_MIN_LOD_SGIS = 0x813A; + int GL_TEXTURE_MAX_LOD_SGIS = 0x813B; + int GL_TEXTURE_BASE_LEVEL_SGIS = 0x813C; + int GL_TEXTURE_MAX_LEVEL_SGIS = 0x813D; +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SUN_slice_accum.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SUN_slice_accum.java new file mode 100644 index 0000000..b4f9e27 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengl/SUN_slice_accum.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +public interface SUN_slice_accum { + + /** + * Accepted by the &lt;op&gt; parameter of Accum, + */ + int GL_SLICE_ACCUM_SUN = 0x85CC; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_3DC_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_3DC_texture.java new file mode 100644 index 0000000..7de9d73 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_3DC_texture.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface AMD_compressed_3DC_texture { + + /** + * Accepted by the &lt;internalFormat&gt; parameter of CompressedTexImage2D and + * CompressedTexImage3DOES: + */ + int GL_3DC_X_AMD = 0x87F9, + GL_3DC_XY_AMD = 0x87FA; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_ATC_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_ATC_texture.java new file mode 100644 index 0000000..2b2d41e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_compressed_ATC_texture.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface AMD_compressed_ATC_texture { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D and + * CompressedTexImage3DOES. + */ + int GL_ATC_RGB_AMD = 0x8C92, + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD = 0x8C93, + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD = 0x87EE; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_performance_monitor.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_performance_monitor.java new file mode 100644 index 0000000..93f1db4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_performance_monitor.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface AMD_performance_monitor { + + /** Accepted by the &lt;pame&gt; parameter of GetPerfMonitorCounterInfoAMD */ + int GL_COUNTER_TYPE_AMD = 0x8BC0; + int GL_COUNTER_RANGE_AMD = 0x8BC1; + + /** + * Returned as a valid value in &lt;data&gt; parameter of + * GetPerfMonitorCounterInfoAMD if &lt;pname&gt; = COUNTER_TYPE_AMD + */ + int GL_UNSIGNED_INT64_AMD = 0x8BC2; + int GL_PERCENTAGE_AMD = 0x8BC3; + + /** Accepted by the &lt;pname&gt; parameter of GetPerfMonitorCounterDataAMD */ + + int GL_PERFMON_RESULT_AVAILABLE_AMD = 0x8BC4; + int GL_PERFMON_RESULT_SIZE_AMD = 0x8BC5; + int GL_PERFMON_RESULT_AMD = 0x8BC6; + + void glGetPerfMonitorGroupsAMD(@OutParameter @Check(value = "1", canBeNull = true) @GLint IntBuffer numGroups, + @AutoSize("groups") @GLsizei int groupsSize, @GLuint IntBuffer groups); + + void glGetPerfMonitorCountersAMD(@GLuint int group, + @OutParameter @Check(value = "1") @GLint IntBuffer numCounters, + @OutParameter @Check(value = "1") @GLint IntBuffer maxActiveCounters, + @AutoSize("counters") @GLsizei int countersSize, + @GLuint IntBuffer counters); + + void glGetPerfMonitorGroupStringAMD(@GLuint int group, + @AutoSize("groupString") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer groupString); + + @Alternate("glGetPerfMonitorGroupStringAMD") + @GLreturn(value = "groupString", maxLength = "bufSize") + void glGetPerfMonitorGroupStringAMD2(@GLuint int group, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(groupString_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer groupString); + + void glGetPerfMonitorCounterStringAMD(@GLuint int group, @GLuint int counter, @AutoSize("counterString") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer counterString); + + @Alternate("glGetPerfMonitorCounterStringAMD") + @GLreturn(value = "counterString", maxLength = "bufSize") + void glGetPerfMonitorCounterStringAMD2(@GLuint int group, @GLuint int counter, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(counterString_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer counterString); + + void glGetPerfMonitorCounterInfoAMD(@GLuint int group, @GLuint int counter, @GLenum int pname, @Check(value = "16") @GLvoid ByteBuffer data); + + void glGenPerfMonitorsAMD(@AutoSize("monitors") @GLsizei int n, @OutParameter @GLuint IntBuffer monitors); + + @Alternate("glGenPerfMonitorsAMD") + @GLreturn("monitors") + void glGenPerfMonitorsAMD2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer monitors); + + void glDeletePerfMonitorsAMD(@AutoSize("monitors") @GLsizei int n, @GLuint IntBuffer monitors); + + @Alternate("glDeletePerfMonitorsAMD") + void glDeletePerfMonitorsAMD(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(monitor)", keepParam = true) int monitor); + + void glSelectPerfMonitorCountersAMD(@GLuint int monitor, boolean enable, @GLuint int group, @AutoSize("counterList") int numCounters, @GLuint IntBuffer counterList); + + @Alternate("glSelectPerfMonitorCountersAMD") + void glSelectPerfMonitorCountersAMD(@GLuint int monitor, boolean enable, @GLuint int group, @Constant("1") int numCounters, @Constant(value = "APIUtil.getInt(counter)", keepParam = true) int counter); + + void glBeginPerfMonitorAMD(@GLuint int monitor); + + void glEndPerfMonitorAMD(@GLuint int monitor); + + void glGetPerfMonitorCounterDataAMD(@GLuint int monitor, @GLenum int pname, @AutoSize("data") @GLsizei int dataSize, + @OutParameter @GLuint IntBuffer data, + @OutParameter @GLint @Check(value = "1", canBeNull = true) IntBuffer bytesWritten); + + @Alternate("glGetPerfMonitorCounterDataAMD") + @GLreturn("data") + void glGetPerfMonitorCounterDataAMD2(@GLuint int monitor, @GLenum int pname, @Constant("4") @GLsizei int dataSize, + @OutParameter @GLuint IntBuffer data, + @OutParameter @GLint @Constant("0L") IntBuffer bytesWritten); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_program_binary_Z400.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_program_binary_Z400.java new file mode 100644 index 0000000..0752299 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/AMD_program_binary_Z400.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface AMD_program_binary_Z400 { + + /** Accepted by the &lt;binaryFormat&gt; parameter of ProgramBinaryOES: */ + int GL_Z400_BINARY_AMD = 0x8740; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_blit.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_blit.java new file mode 100644 index 0000000..705e136 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_blit.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface ANGLE_framebuffer_blit { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture2D, FramebufferTexture3DOES, + * FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + int GL_READ_FRAMEBUFFER_ANGLE = 0x8CA8, + GL_DRAW_FRAMEBUFFER_ANGLE = 0x8CA9; + + /** Accepted by the &lt;pname&gt; parameters of GetIntegerv and GetFloatv: */ + int GL_DRAW_FRAMEBUFFER_BINDING_ANGLE = 0x8CA6, // alias FRAMEBUFFER_BINDING + GL_READ_FRAMEBUFFER_BINDING_ANGLE = 0x8CAA; + + void glBlitFramebufferANGLE(int srcX0, int srcY0, int srcX1, int srcY1, + int dstX0, int dstY0, int dstX1, int dstY1, + @GLbitfield int mask, @GLenum int filter); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_multisample.java new file mode 100644 index 0000000..0edabb7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ANGLE_framebuffer_multisample.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +public interface ANGLE_framebuffer_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_SAMPLES_ANGLE = 0x8CAB; + + /** Returned by CheckFramebufferStatus: */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_SAMPLES_ANGLE = 0x8D57; + + void glRenderbufferStorageMultisampleANGLE( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_framebuffer_multisample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_framebuffer_multisample.java new file mode 100644 index 0000000..770eec9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_framebuffer_multisample.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +public interface APPLE_framebuffer_multisample { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_SAMPLES_APPLE = 0x8CAB; + + /** Returned by CheckFramebufferStatus: */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE = 0x8D56; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_MAX_SAMPLES_APPLE = 0x8D57; + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebuffer, + * CheckFramebufferStatus, FramebufferTexture2D, FramebufferRenderbuffer, and + * GetFramebufferAttachmentParameteriv: + */ + int GL_READ_FRAMEBUFFER_APPLE = 0x8CA8, + GL_DRAW_FRAMEBUFFER_APPLE = 0x8CA9; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_DRAW_FRAMEBUFFER_BINDING_APPLE = 0x8CA6, // FRAMEBUFFER_BINDING + GL_READ_FRAMEBUFFER_BINDING_APPLE = 0x8CAA; + + void glRenderbufferStorageMultisampleAPPLE( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glResolveMultisampleFramebufferAPPLE(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_rgb_422.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_rgb_422.java new file mode 100644 index 0000000..de5b56c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_rgb_422.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface APPLE_rgb_422 { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + int GL_RGB_422_APPLE = 0x8A1F; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, TexImage1D, + * TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D, + * TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D, + * ConvolutionFilter2D, GetConvolutionFilter, SeparableFilter2D, + * GetSeparableFilter, ColorTable, GetColorTable: + */ + int GL_UNSIGNED_SHORT_8_8_APPLE = 0x85BA; + int GL_UNSIGNED_SHORT_8_8_REV_APPLE = 0x85BB; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_sync.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_sync.java new file mode 100644 index 0000000..e035545 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_sync.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.opengl.GLSync; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.IntBuffer; +import java.nio.LongBuffer; + +public interface APPLE_sync { + + /** Accepted as the &lt;pname&gt; parameter of GetInteger64vAPPLE: */ + int GL_MAX_SERVER_WAIT_TIMEOUT_APPLE = 0x9111; + + /** Accepted as the &lt;pname&gt; parameter of GetSyncivAPPLE: */ + int GL_OBJECT_TYPE_APPLE = 0x9112, + SYNC_CONDITION_APPLE = 0x9113, + SYNC_STATUS_APPLE = 0x9114, + SYNC_FLAGS_APPLE = 0x9115; + + /** Returned in &lt;values&gt; for GetSynciv &lt;pname&gt; OBJECT_TYPE_APPLE: */ + int GL_SYNC_FENCE_APPLE = 0x9116; + + /** Returned in &lt;values&gt; for GetSyncivAPPLE &lt;pname&gt; SYNC_CONDITION_APPLE: */ + int GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE = 0x9117; + + /** Returned in &lt;values&gt; for GetSyncivAPPLE &lt;pname&gt; SYNC_STATUS_APPLE: */ + int GL_UNSIGNALED_APPLE = 0x9118, + SIGNALED_APPLE = 0x9119; + + /** Accepted in the &lt;flags&gt; parameter of ClientWaitSyncAPPLE: */ + int GL_SYNC_FLUSH_COMMANDS_BIT_APPLE = 0x00000001; + + /** Accepted in the &lt;timeout&gt; parameter of WaitSyncAPPLE: */ + long GL_TIMEOUT_IGNORED_APPLE = 0xFFFFFFFFFFFFFFFFl; + + /** Returned by ClientWaitSyncAPPLE: */ + int GL_ALREADY_SIGNALED_APPLE = 0x911A, + TIMEOUT_EXPIRED_APPLE = 0x911B, + CONDITION_SATISFIED_APPLE = 0x911C, + WAIT_FAILED_APPLE = 0x911D; + + /** + * Accepted by the &lt;type&gt; parameter of LabelObjectEXT and + * GetObjectLabelEXT: + */ + int GL_SYNC_OBJECT_APPLE = 0x8A53; + + @PointerWrapper("GLsync") + org.lwjgl.opengl.GLSync glFenceSyncAPPLE(@GLenum int condition, @GLbitfield int flags); + + boolean glIsSyncAPPLE(@PointerWrapper("GLsync") org.lwjgl.opengl.GLSync sync); + + void glDeleteSyncAPPLE(@PointerWrapper("GLsync") org.lwjgl.opengl.GLSync sync); + + @GLenum + int glClientWaitSyncAPPLE(@PointerWrapper("GLsync") org.lwjgl.opengl.GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + void glWaitSyncAPPLE(@PointerWrapper("GLsync") org.lwjgl.opengl.GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + @StripPostfix("params") + void glGetInteger64vAPPLE(@GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer params); + + @Alternate("glGetInteger64vAPPLE") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetInteger64vAPPLE2(@GLenum int pname, @OutParameter @GLint64 LongBuffer params); + + @StripPostfix("values") + void glGetSyncivAPPLE(@PointerWrapper("GLsync") org.lwjgl.opengl.GLSync sync, @GLenum int pname, @AutoSize("values") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter IntBuffer values); + + @Alternate("glGetSyncivAPPLE") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetSyncivAPPLE2(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_format_BGRA8888.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_format_BGRA8888.java new file mode 100644 index 0000000..1bd5a74 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_format_BGRA8888.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface APPLE_texture_format_BGRA8888 { + + /** Accepted by the &lt;format&gt; parameters of TexImage2D and TexSubImage2D: */ + int GL_BGRA_EXT = 0x80E1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_max_level.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_max_level.java new file mode 100644 index 0000000..defc0b6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/APPLE_texture_max_level.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface APPLE_texture_max_level { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteri, TexParameterf, + * TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv: + */ + int GL_TEXTURE_MAX_LEVEL_APPLE = 0x813D; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_draw_buffers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_draw_buffers.java new file mode 100644 index 0000000..f296996 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_draw_buffers.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Constant; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.IntBuffer; + +public interface ARB_draw_buffers { + + /** Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv: */ + int GL_MAX_DRAW_BUFFERS_ARB = 0x8824, + GL_DRAW_BUFFER0_ARB = 0x8825, + GL_DRAW_BUFFER1_ARB = 0x8826, + GL_DRAW_BUFFER2_ARB = 0x8827, + GL_DRAW_BUFFER3_ARB = 0x8828, + GL_DRAW_BUFFER4_ARB = 0x8829, + GL_DRAW_BUFFER5_ARB = 0x882A, + GL_DRAW_BUFFER6_ARB = 0x882B, + GL_DRAW_BUFFER7_ARB = 0x882C, + GL_DRAW_BUFFER8_ARB = 0x882D, + GL_DRAW_BUFFER9_ARB = 0x882E, + GL_DRAW_BUFFER10_ARB = 0x882F, + GL_DRAW_BUFFER11_ARB = 0x8830, + GL_DRAW_BUFFER12_ARB = 0x8831, + GL_DRAW_BUFFER13_ARB = 0x8832, + GL_DRAW_BUFFER14_ARB = 0x8833, + GL_DRAW_BUFFER15_ARB = 0x8834; + + void glDrawBuffersARB(@AutoSize("buffers") @GLsizei int size, @Const @GLenum IntBuffer buffers); + + @Alternate("glDrawBuffersARB") + void glDrawBuffersARB(@Constant("1") @GLsizei int size, @Constant(value = "APIUtil.getInt(buffer)", keepParam = true) int buffer); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_half_float_pixel.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_half_float_pixel.java new file mode 100644 index 0000000..3ec788d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_half_float_pixel.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface ARB_half_float_pixel { + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, + * TexSubImage2D, TexSubImage3D: + */ + int GL_HALF_FLOAT_ARB = 0x140B; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_texture_rectangle.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_texture_rectangle.java new file mode 100644 index 0000000..7e01274 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARB_texture_rectangle.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface ARB_texture_rectangle { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable, Disable and IsEnabled; + * by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv + * and GetDoublev; and by the &lt;target&gt; parameter of BindTexture, + * GetTexParameterfv, GetTexParameteriv, TexParameterf, TexParameteri, + * TexParameterfv and TexParameteriv: + * Accepted by the &lt;target&gt; parameter of GetTexImage, + * GetTexLevelParameteriv, GetTexLevelParameterfv, TexImage2D, + * CopyTexImage2D, TexSubImage2D and CopySubTexImage2D: + */ + int GL_TEXTURE_RECTANGLE_ARB = 0x84F5; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv and GetDoublev: + */ + int GL_TEXTURE_BINDING_RECTANGLE_ARB = 0x84F6; + + /** + * Accepted by the &lt;target&gt; parameter of GetTexLevelParameteriv, + * GetTexLevelParameterfv, GetTexParameteriv and TexImage2D: + */ + int GL_PROXY_TEXTURE_RECTANGLE_ARB = 0x84F7; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, + * GetIntegerv and GetFloatv: + */ + int GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = 0x84F8; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRect: + */ + int GL_SAMPLER_2D_RECT_ARB = 0x8B63; + + /** + * Returned by &lt;type&gt; parameter of GetActiveUniform when the location + * &lt;index&gt; for program object &lt;program&gt; is of type sampler2DRectShadow: + */ + int GL_SAMPLER_2D_RECT_SHADOW_ARB = 0x8B64; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_mali_shader_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_mali_shader_binary.java new file mode 100644 index 0000000..ee0fa03 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_mali_shader_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface ARM_mali_shader_binary { + + /** Accepted by the &lt;binaryFormat&gt; parameter of ShaderBinary: */ + int GL_MALI_SHADER_BINARY_ARM = 0x8F60; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_rgba8.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_rgba8.java new file mode 100644 index 0000000..d87299a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/ARM_rgba8.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface ARM_rgba8 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage: */ + int GL_RGBA8_OES = 0x8058; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/DMP_shader_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/DMP_shader_binary.java new file mode 100644 index 0000000..4e887ad --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/DMP_shader_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface DMP_shader_binary { + + /** Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: */ + int GL_SHADER_BINARY_DMP = 0x9250; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_Cg_shader.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_Cg_shader.java new file mode 100644 index 0000000..77f77c5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_Cg_shader.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_Cg_shader { + + /** + * You can pass GL_CG_VERTEX_SHADER_EXT to glCreateShader instead of GL_VERTEX_SHADER to create a vertex shader + * that will parse and compile its shader source with the Cg compiler front-end rather than the GLSL front-end. Likewise, you + * can pass GL_CG_FRAGMENT_SHADER_EXT to glCreateShader instead of GL_FRAGMENT_SHADER to create a fragment shader object + * that will parse and compile its shader source with the Cg front-end rather than the GLSL front-end. + */ + int GL_CG_VERTEX_SHADER_EXT = 0x890E, + GL_CG_FRAGMENT_SHADER_EXT = 0x890F; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_bgra.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_bgra.java new file mode 100644 index 0000000..c765d8a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_bgra.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_bgra { + + /** + * Accepted by the &lt;format&gt; parameter of DrawPixels, GetTexImage, + * ReadPixels, TexImage1D, and TexImage2D: + */ + int GL_BGR_EXT = 0x80E0, + GL_BGRA_EXT = 0x80E1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_blend_minmax.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_blend_minmax.java new file mode 100644 index 0000000..34ff001 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_blend_minmax.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface EXT_blend_minmax { + + /** Accepted by the &lt;mode&gt; parameter of BlendEquationEXT: */ + int GL_FUNC_ADD_EXT = 0x8006, + GL_MIN_EXT = 0x8007, + GL_MAX_EXT = 0x8008; + + void glBlendEquationEXT(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_color_buffer_half_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_color_buffer_half_float.java new file mode 100644 index 0000000..9d6593f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_color_buffer_half_float.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_color_buffer_half_float { + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage and + * RenderbufferStorageMultisampleAPPLE: + */ + int GL_RGBA16F_EXT = 0x881A, + GL_RGB16F_EXT = 0x881B, + GL_RG16F_EXT = 0x822F, + GL_R16F_EXT = 0x822D; + + /** Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: */ + int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211; + + /** Returned in &lt;params&gt; by GetFramebufferAttachmentParameteriv: */ + int GL_UNSIGNED_NORMALIZED_EXT = 0x8C17; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_copy_texture_levels.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_copy_texture_levels.java new file mode 100644 index 0000000..4d95ee0 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_copy_texture_levels.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_copy_texture_levels { + + void glCopyTextureLevelsAPPLE(@GLuint int destinationTexture, @GLuint int sourceTexture, + int sourceBaseLevel, @GLsizei int sourceLevelCount); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_label.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_label.java new file mode 100644 index 0000000..e047fb6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_label.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface EXT_debug_label { + + /** + * Accepted by the &lt;type&gt; parameter of LabelObjectEXT and + * GetObjectLabelEXT: + */ + int GL_BUFFER_OBJECT_EXT = 0x9151, + GL_SHADER_OBJECT_EXT = 0x8B48, + GL_PROGRAM_OBJECT_EXT = 0x8B40, + GL_VERTEX_ARRAY_OBJECT_EXT = 0x9154, + GL_QUERY_OBJECT_EXT = 0x9153, + GL_PROGRAM_PIPELINE_OBJECT_EXT = 0x8A4F; + + void glLabelObjectEXT(@GLenum int type, @GLuint int object, + @AutoSize("label") @GLsizei int length, + @Const @GLchar ByteBuffer label); + + @Alternate("glLabelObjectEXT") + void glLabelObjectEXT(@GLenum int type, @GLuint int object, + @Constant("label.length()") @GLsizei int length, + CharSequence label); + + void glGetObjectLabelEXT(@GLenum int type, @GLuint int object, + @AutoSize(value = "label", canBeNull = true) @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @OutParameter @GLsizei IntBuffer length, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer label); + + @Alternate("glGetObjectLabelEXT") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectLabelEXT2(@GLenum int type, @GLuint int object, + @GLsizei int bufSize, + @Constant("MemoryUtil.getAddress0(label_length)") @OutParameter @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_marker.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_marker.java new file mode 100644 index 0000000..4cdab1a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_debug_marker.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Constant; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.ByteBuffer; + +public interface EXT_debug_marker { + + void glInsertEventMarkerEXT(@AutoSize("marker") @GLsizei int length, @Const @GLchar ByteBuffer marker); + + @Alternate("glInsertEventMarkerEXT") + void glInsertEventMarkerEXT(@Constant("marker.length()") @GLsizei int length, CharSequence marker); + + void glPushGroupMarkerEXT(@AutoSize("marker") @GLsizei int length, @Const @GLchar ByteBuffer marker); + + @Alternate("glPushGroupMarkerEXT") + void glPushGroupMarkerEXT(@Constant("marker.length()") @GLsizei int length, CharSequence marker); + + void glPopGroupMarkerEXT(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_discard_framebuffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_discard_framebuffer.java new file mode 100644 index 0000000..6919933 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_discard_framebuffer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.IntBuffer; + +public interface EXT_discard_framebuffer { + + /** + * Accepted in the &lt;attachments&gt; parameter of DiscardFramebufferEXT when the + * default framebuffer is bound to &lt;target&gt;: + */ + int GL_COLOR_EXT = 0x1800, + GL_DEPTH_EXT = 0x1801, + GL_STENCIL_EXT = 0x1802; + + void glDiscardFramebufferEXT(@GLenum int target, @AutoSize("attachments") @GLsizei int numAttachments, @Const @GLenum IntBuffer attachments); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_frag_depth.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_frag_depth.java new file mode 100644 index 0000000..fbe7361 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_frag_depth.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_frag_depth { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_map_buffer_range.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_map_buffer_range.java new file mode 100644 index 0000000..096a74b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_map_buffer_range.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.CachedResult; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; + +public interface EXT_map_buffer_range { + + /** Accepted by the &lt;access&gt; parameter of MapBufferRangeEXT: */ + int GL_MAP_READ_BIT_EXT = 0x0001, + GL_MAP_WRITE_BIT_EXT = 0x0002, + GL_MAP_INVALIDATE_RANGE_BIT_EXT = 0x0004, + GL_MAP_INVALIDATE_BUFFER_BIT_EXT = 0x0008, + GL_MAP_FLUSH_EXPLICIT_BIT_EXT = 0x0010, + GL_MAP_UNSYNCHRONIZED_BIT_EXT = 0x0020; + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapBufferRangeEXT(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length, @GLbitfield int access); + + void glFlushMappedBufferRangeEXT(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multi_draw_arrays.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multi_draw_arrays.java new file mode 100644 index 0000000..11f6f9c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multi_draw_arrays.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLint; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.IntBuffer; + +public interface EXT_multi_draw_arrays { + + void glMultiDrawArraysEXT(@GLenum int mode, @GLint IntBuffer first, @Check("first.remaining()") @GLsizei IntBuffer count, @AutoSize("first") @GLsizei int primcount); + + //void glMultiDrawElementsEXT(GLenum mode, GLsizei*count, GLenum type, const GLvoid**indices, GLsizei primcount) + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multisampled_render_to_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multisampled_render_to_texture.java new file mode 100644 index 0000000..88510aa --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multisampled_render_to_texture.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_multisampled_render_to_texture { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_SAMPLES_EXT = 0x9133; + + /** Returned by CheckFramebufferStatus: */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x9134; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + int GL_MAX_SAMPLES_EXT = 0x9135; + + /** Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: */ + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C; + + void glRenderbufferStorageMultisampleEXT( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glFramebufferTexture2DMultisampleEXT( + @GLenum int target, @GLenum int attachment, + @GLenum int textarget, @GLuint int texture, + int level, @GLsizei int samples); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multiview_draw_buffers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multiview_draw_buffers.java new file mode 100644 index 0000000..42a2726 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_multiview_draw_buffers.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface EXT_multiview_draw_buffers { + + /** Accepted by the &lt;location&gt; parameter of DrawBuffersIndexedEXT: */ + int GL_COLOR_ATTACHMENT_EXT = 0x90F0, + GL_MULTIVIEW_EXT = 0x90F1; + + /** Accepted by the &lt;target&gt; parameter of GetIntegeri_EXT: */ + int GL_DRAW_BUFFER_EXT = 0x0C01, + GL_READ_BUFFER_EXT = 0x0C02; + + /** Accepted by the &lt;target&gt; parameter of GetInteger: */ + int GL_MAX_MULTIVIEW_BUFFERS_EXT = 0x90F2; + + void glReadBufferIndexedEXT(@GLenum int src, int index); + + void glDrawBuffersIndexedEXT(@AutoSize("indices") int n, @Check("indices.remaining()") @Const @GLenum IntBuffer location, + @Const IntBuffer indices); + + @StripPostfix("data") + void glGetIntegeri_vEXT(@GLenum int target, @GLuint int index, @OutParameter @Check("4") IntBuffer data); + + @Alternate("glGetIntegeri_vEXT") + @GLreturn("data") + @StripPostfix("data") + void glGetIntegeri_vEXT2(@GLenum int value, @GLuint int index, @OutParameter IntBuffer data); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_occlusion_query_boolean.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_occlusion_query_boolean.java new file mode 100644 index 0000000..4e07a29 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_occlusion_query_boolean.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface EXT_occlusion_query_boolean { + + /** + * Accepted by the &lt;target&gt; parameter of BeginQueryEXT, EndQueryEXT, + * and GetQueryivEXT: + */ + int GL_ANY_SAMPLES_PASSED_EXT = 0x8C2F, + GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT = 0x8D6A; + + /** Accepted by the &lt;pname&gt; parameter of GetQueryivEXT: */ + int GL_CURRENT_QUERY_EXT = 0x8865; + + /** + * Accepted by the &lt;pname&gt; parameter of GetQueryObjectivEXT and + * GetQueryObjectuivEXT: + */ + int GL_QUERY_RESULT_EXT = 0x8866, + GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867; + + void glGenQueriesEXT(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenQueriesEXT") + @GLreturn("ids") + void glGenQueriesEXT2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + void glDeleteQueriesEXT(@AutoSize("ids") @GLsizei int n, @GLuint IntBuffer ids); + + @Alternate("glDeleteQueriesEXT") + void glDeleteQueriesEXT(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(id)", keepParam = true) int id); + + boolean glIsQueryEXT(@GLuint int id); + + void glBeginQueryEXT(@GLenum int target, @GLuint int id); + + void glEndQueryEXT(@GLenum int target); + + @StripPostfix("params") + void glGetQueryivEXT(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetQueryivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryivEXT2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectuivEXT(@GLuint int id, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetQueryObjectuivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectuivEXT2(@GLuint int id, @GLenum int pname, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_packed_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_packed_float.java new file mode 100644 index 0000000..de8339e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_packed_float.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_packed_float { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage1D, + * TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and + * RenderbufferStorage: + */ + int GL_R11F_G11F_B10F_EXT = 0x8C3A; + + /** + * Accepted by the &lt;type&gt; parameter of DrawPixels, ReadPixels, + * TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D: + */ + int GL_UNSIGNED_INT_10F_11F_11F_REV_EXT = 0x8C3B; + + /** Accepted by the &lt;pname&gt; parameters of GetIntegerv and GetFloatv: */ + int GL_RGBA_SIGNED_COMPONENTS_EXT = 0x8C3C; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_read_format_bgra.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_read_format_bgra.java new file mode 100644 index 0000000..b8d33ca --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_read_format_bgra.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_read_format_bgra { + + /** Accepted by the &lt;format&gt; parameter of ReadPixels: */ + int GL_BGRA_EXT = 0x80E1; + + /** Accepted by the &lt;type&gt; parameter of ReadPixels: */ + int GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT = 0x8365, + GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT = 0x8366; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_robustness.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_robustness.java new file mode 100644 index 0000000..fce325b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_robustness.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface EXT_robustness { + + /** Returned by GetGraphicsResetStatusEXT: */ + int GL_NO_ERROR = 0x0000, + GL_GUILTY_CONTEXT_RESET_EXT = 0x8253, + GL_INNOCENT_CONTEXT_RESET_EXT = 0x8254, + GL_UNKNOWN_CONTEXT_RESET_EXT = 0x8255; + + /** + * Accepted by the &lt;value&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + int GL_CONTEXT_ROBUST_ACCESS_EXT = 0x90F3, + GL_RESET_NOTIFICATION_STRATEGY_EXT = 0x8256; + + /** + * Returned by GetIntegerv and related simple queries when &lt;value&gt; is + * RESET_NOTIFICATION_STRATEGY_EXT : + */ + int GL_LOSE_CONTEXT_ON_RESET_EXT = 0x8252, + GL_NO_RESET_NOTIFICATION_EXT = 0x8261; + + @GLenum + int glGetGraphicsResetStatusEXT(); + + void glReadnPixelsEXT(int x, int y, @GLsizei int width, @GLsizei int height, + @GLenum int format, @GLenum int type, @AutoSize("data") @GLsizei int bufSize, + @OutParameter @GLbyte @GLshort @GLint @GLfloat Buffer data); + + @StripPostfix("params") + void glGetnUniformfvEXT(@GLuint int program, int location, @AutoSize("params") @GLsizei int bufSize, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetnUniformivEXT(@GLuint int program, int location, @AutoSize("params") @GLsizei int bufSize, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_sRGB.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_sRGB.java new file mode 100644 index 0000000..9e4e5c8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_sRGB.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_sRGB { + + /** + * Accepted by the &lt;format&gt; and &lt;internalformat&gt; parameter of TexImage2D, and + * TexImage3DOES. These are also accepted by &lt;format&gt; parameter of + * TexSubImage2D and TexSubImage3DOES: + */ + int GL_SRGB_EXT = 0x8C40, + GL_SRGB_ALPHA_EXT = 0x8C42; + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage: */ + int GL_SRGB8_ALPHA8_EXT = 0x8C43; + + /** Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: */ + int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_separate_shader_objects.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_separate_shader_objects.java new file mode 100644 index 0000000..55a79d7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_separate_shader_objects.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface EXT_separate_shader_objects { + + /** Accepted by &lt;stages&gt; parameter to UseProgramStagesEXT: */ + int GL_VERTEX_SHADER_BIT_EXT = 0x00000001, + GL_FRAGMENT_SHADER_BIT_EXT = 0x00000002, + GL_ALL_SHADER_BITS_EXT = 0xFFFFFFFF; + + /** + * Accepted by the &lt;pname&gt; parameter of ProgramParameteriEXT and + * GetProgramiv: + */ + int GL_PROGRAM_SEPARABLE_EXT = 0x8258; + + /** Accepted by &lt;type&gt; parameter to GetProgramPipelineivEXT: */ + int GL_ACTIVE_PROGRAM_EXT = 0x8259; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_PROGRAM_PIPELINE_BINDING_EXT = 0x825A; + + void glUseProgramStagesEXT(@GLuint int pipeline, @GLbitfield int stages, @GLuint int program); + + void glActiveShaderProgramEXT(@GLuint int pipeline, @GLuint int program); + + /** Single null-terminated source code string. */ + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramvEXT(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated @Check @Const @Indirect @GLchar ByteBuffer string); + + /** Multiple null-terminated source code strings, one after the other. */ + @Alternate(value = "glCreateShaderProgramvEXT", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramvEXT2(@GLenum int type, @GLsizei int count, @NullTerminated("count") @Check @Const @Indirect @GLchar @PointerArray("count") ByteBuffer strings); + + @Alternate(value = "glCreateShaderProgramvEXT", nativeAlt = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramvEXT3(@GLenum int type, @Constant("strings.length") @GLsizei int count, @NullTerminated @Check("1") @PointerArray(value = "count") @Const @NativeType("GLchar") ByteBuffer[] strings); + + @Alternate("glCreateShaderProgramvEXT") + @StripPostfix(value = "string", postfix = "v") + @GLuint + int glCreateShaderProgramvEXT(@GLenum int type, @Constant("1") @GLsizei int count, @NullTerminated CharSequence string); + + @Alternate(value = "glCreateShaderProgramvEXT", nativeAlt = true, skipNative = true) + @StripPostfix(value = "strings", postfix = "v") + @GLuint + int glCreateShaderProgramvEXT2(@GLenum int type, @Constant("strings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray(value = "count") CharSequence[] strings); + + void glBindProgramPipelineEXT(@GLuint int pipeline); + + void glDeleteProgramPipelinesEXT(@AutoSize("pipelines") @GLsizei int n, @Const @GLuint IntBuffer pipelines); + + @Alternate("glDeleteProgramPipelinesEXT") + void glDeleteProgramPipelinesEXT(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(pipeline)", keepParam = true) int pipeline); + + void glGenProgramPipelinesEXT(@AutoSize("pipelines") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + @Alternate("glGenProgramPipelinesEXT") + @GLreturn("pipelines") + void glGenProgramPipelinesEXT2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer pipelines); + + boolean glIsProgramPipelineEXT(@GLuint int pipeline); + + void glProgramParameteriEXT(@GLuint int program, @GLenum int pname, int value); + + @StripPostfix("params") + void glGetProgramPipelineivEXT(@GLuint int pipeline, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetProgramPipelineivEXT") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramPipelineivEXT2(@GLuint int pipeline, @GLenum int pname, @OutParameter IntBuffer params); + + void glProgramUniform1iEXT(@GLuint int program, int location, int v0); + + void glProgramUniform2iEXT(@GLuint int program, int location, int v0, int v1); + + void glProgramUniform3iEXT(@GLuint int program, int location, int v0, int v1, int v2); + + void glProgramUniform4iEXT(@GLuint int program, int location, int v0, int v1, int v2, int v3); + + void glProgramUniform1fEXT(@GLuint int program, int location, float v0); + + void glProgramUniform2fEXT(@GLuint int program, int location, float v0, float v1); + + void glProgramUniform3fEXT(@GLuint int program, int location, float v0, float v1, float v2); + + void glProgramUniform4fEXT(@GLuint int program, int location, float v0, float v1, float v2, float v3); + + @StripPostfix("value") + void glProgramUniform1ivEXT(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform2ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform3ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform4ivEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const IntBuffer value); + + @StripPostfix("value") + void glProgramUniform1fvEXT(@GLuint int program, int location, @AutoSize("value") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform2fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform3fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniform4fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix2fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix3fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " / (3 * 3)") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + @StripPostfix("value") + void glProgramUniformMatrix4fvEXT(@GLuint int program, int location, @AutoSize(value = "value", expression = " >> 4") @GLsizei int count, boolean transpose, @Const FloatBuffer value); + + void glValidateProgramPipelineEXT(@GLuint int pipeline); + + void glGetProgramPipelineInfoLogEXT(@GLuint int pipeline, @AutoSize("infoLog") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetProgramPipelineInfoLogEXT") + @GLreturn(value = "infoLog", maxLength = "bufSize") + void glGetProgramPipelineInfoLogEXT2(@GLuint int pipeline, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_framebuffer_fetch.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_framebuffer_fetch.java new file mode 100644 index 0000000..fa769d1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_framebuffer_fetch.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_shader_framebuffer_fetch { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT = 0x8A52; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_texture_lod.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_texture_lod.java new file mode 100644 index 0000000..d67dfe1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shader_texture_lod.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_shader_texture_lod { + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shadow_samplers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shadow_samplers.java new file mode 100644 index 0000000..23b2a6d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_shadow_samplers.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_shadow_samplers { + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: + */ + int GL_TEXTURE_COMPARE_MODE_EXT = 0x884C, + GL_TEXTURE_COMPARE_FUNC_EXT = 0x884D; + + /** + * Accepted by the &lt;param&gt; parameter of TexParameterf, TexParameteri, + * TexParameterfv, and TexParameteriv when the &lt;pname&gt; parameter is + * TEXTURE_COMPARE_MODE_EXT: + */ + int GL_COMPARE_REF_TO_TEXTURE_EXT = 0x884E; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_array.java new file mode 100644 index 0000000..1b61444 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_array.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_texture_array { + + /** + * Accepted by the &lt;target&gt; parameter of TexParameteri, TexParameteriv, + * TexParameterf, TexParameterfv, and BindTexture: + */ + int GL_TEXTURE_1D_ARRAY_EXT = 0x8C18, + GL_TEXTURE_2D_ARRAY_EXT = 0x8C1A; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3D, TexSubImage3D, + * CopyTexSubImage3D, CompressedTexImage3D, and CompressedTexSubImage3D: + */ + int GL_PROXY_TEXTURE_2D_ARRAY_EXT = 0x8C1B; + + /** + * Accepted by the &lt;target&gt; parameter of TexImage2D, TexSubImage2D, + * CopyTexImage2D, CopyTexSubImage2D, CompressedTexImage2D, and + * CompressedTexSubImage2D: + */ + int GL_PROXY_TEXTURE_1D_ARRAY_EXT = 0x8C19; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetDoublev, GetIntegerv + * and GetFloatv: + */ + int GL_TEXTURE_BINDING_1D_ARRAY_EXT = 0x8C1C, + GL_TEXTURE_BINDING_2D_ARRAY_EXT = 0x8C1D, + GL_MAX_ARRAY_TEXTURE_LAYERS_EXT = 0x88FF; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivEXT: + */ + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT = 0x8CD4; + + /** Returned by the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_1D_ARRAY_EXT = 0x8DC0, + GL_SAMPLER_2D_ARRAY_EXT = 0x8DC1; + + void glFramebufferTextureLayerEXT(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_dxt1.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_dxt1.java new file mode 100644 index 0000000..782f09a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_dxt1.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionDXT1") +public interface EXT_texture_compression_dxt1 { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D + * and the &lt;format&gt; parameter of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_latc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_latc.java new file mode 100644 index 0000000..b54cf01 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_latc.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionLATC") +public interface EXT_texture_compression_latc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, + * CopyTexImage2D, and CompressedTexImage2D and the &lt;format&gt; parameter + * of CompressedTexSubImage2D: + */ + int GL_COMPRESSED_LUMINANCE_LATC1_EXT = 0x8C70, + GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT = 0x8C71, + GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C72, + GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT = 0x8C73; + +} diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_s3tc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_s3tc.java new file mode 100644 index 0000000..1d8e692 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_compression_s3tc.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureCompressionS3TC") +public interface EXT_texture_compression_s3tc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D, CopyTexImage2D, + * and CompressedTexImage2D and the &lt;format&gt; parameter of + * CompressedTexSubImage2D: + */ + int GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_filter_anisotropic.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_filter_anisotropic.java new file mode 100644 index 0000000..86f84ce --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_filter_anisotropic.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_texture_filter_anisotropic { + + /** + * Accepted by the &lt;pname&gt; parameters of GetTexParameterfv, + * GetTexParameteriv, TexParameterf, TexParameterfv, TexParameteri, + * and TexParameteriv: + */ + int GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, + * GetFloatv, and GetIntegerv: + */ + int GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_format_BGRA8888.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_format_BGRA8888.java new file mode 100644 index 0000000..208a7a6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_format_BGRA8888.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_texture_format_BGRA8888 { + + /** + * Accepted by the &lt;format> and &lt;internalformat&gt; parameters of TexImage2D + * and the &lt;format&gt; parameter of TexSubImage2D: + */ + int GL_BGRA_EXT = 0x80E1; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_lod_bias.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_lod_bias.java new file mode 100644 index 0000000..5573484 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_lod_bias.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "EXT", className = "EXTTextureLODBias") +public interface EXT_texture_lod_bias { + + /** + * Accepted by the &lt;target&gt; parameters of GetTexEnvfv, GetTexEnviv, + * TexEnvi, TexEnvf, Texenviv, and TexEnvfv: + */ + int GL_TEXTURE_FILTER_CONTROL_EXT = 0x8500; + + /** + * When the &lt;target&gt; parameter of GetTexEnvfv, GetTexEnviv, TexEnvi, + * TexEnvf, TexEnviv, and TexEnvfv is TEXTURE_FILTER_CONTROL_EXT, then + * the value of &lt;pname&gt; may be: + */ + int GL_TEXTURE_LOD_BIAS_EXT = 0x8501; + + /** + * Accepted by the &lt;pname&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_TEXTURE_LOD_BIAS_EXT = 0x84FD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_rg.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_rg.java new file mode 100644 index 0000000..4182f34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_rg.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_texture_rg { + + /** + * Accepted by the &lt;internalformat&gt; parameter of TexImage2D and CopyTexImage2D, + * and the &lt;format&gt; parameter of TexImage2D, TexSubImage2D, and ReadPixels: + */ + int GL_RED_EXT = 0x1903, + GL_RG_EXT = 0x8227; + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage and + * RenderbufferStorageMultisampleAPPLE: + */ + int GL_R8_EXT = 0x8229, + GL_RG8_EXT = 0x822B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_storage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_storage.java new file mode 100644 index 0000000..dbeb3c9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_storage.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface EXT_texture_storage { + + /** Accepted by the &lt;value&gt; parameter of GetTexParameter{if}v: */ + + int GL_TEXTURE_IMMUTABLE_FORMAT_EXT = 0x912F; + /** + * Accepted by the &lt;internalformat&gt; parameter of TexStorage* when + * implemented on OpenGL ES: + */ + int GL_ALPHA8_EXT = 0x803C, + GL_LUMINANCE8_EXT = 0x8040, + GL_LUMINANCE8_ALPHA8_EXT = 0x8045, + GL_RGBA32F_EXT = 0x8814, + GL_RGB32F_EXT = 0x8815, + GL_ALPHA32F_EXT = 0x8816, + GL_LUMINANCE32F_EXT = 0x8818, + GL_LUMINANCE_ALPHA32F_EXT = 0x8819, + GL_RGBA16F_EXT = 0x881A, + GL_RGB16F_EXT = 0x881B, + GL_ALPHA16F_EXT = 0x881C, + GL_LUMINANCE16F_EXT = 0x881E, + GL_LUMINANCE_ALPHA16F_EXT = 0x881F, + GL_RGB10_A2_EXT = 0x8059, + GL_RGB10_EXT = 0x8052, + GL_BGRA8_EXT = 0x93A1; + + void glTexStorage1DEXT(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width); + + void glTexStorage2DEXT(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glTexStorage3DEXT(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + void glTextureStorage1DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width); + + void glTextureStorage2DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glTextureStorage3DEXT(@GLuint int texture, @GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_type_2_10_10_10_REV.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_type_2_10_10_10_REV.java new file mode 100644 index 0000000..c74ca43 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_texture_type_2_10_10_10_REV.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_texture_type_2_10_10_10_REV { + + /** Accepted by the &lt;type&gt; parameter of TexImage2D and TexImage3D: */ + int GL_UNSIGNED_INT_2_10_10_10_REV_EXT = 0x8368; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_unpack_subimage.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_unpack_subimage.java new file mode 100644 index 0000000..1d9a342 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/EXT_unpack_subimage.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface EXT_unpack_subimage { + + /** + * Accepted by the &lt;pname&gt; parameters of PixelStorei, GetIntegerv, and + * GetFloatv: + */ + int GL_UNPACK_ROW_LENGTH = 0x0CF2, + GL_UNPACK_SKIP_ROWS = 0x0CF3, + GL_UNPACK_SKIP_PIXELS = 0x0CF4; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES20.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES20.java new file mode 100644 index 0000000..9f72bc3 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES20.java @@ -0,0 +1,1050 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface GLES20 { + + /** ClearBufferMask */ + int GL_DEPTH_BUFFER_BIT = 0x00000100, + GL_STENCIL_BUFFER_BIT = 0x00000400, + GL_COLOR_BUFFER_BIT = 0x00004000; + + /** Boolean */ + int GL_FALSE = 0, + GL_TRUE = 1; + + /** BeginMode */ + int GL_POINTS = 0x0000, + GL_LINES = 0x0001, + GL_LINE_LOOP = 0x0002, + GL_LINE_STRIP = 0x0003, + GL_TRIANGLES = 0x0004, + GL_TRIANGLE_STRIP = 0x0005, + GL_TRIANGLE_FAN = 0x0006; + + /** BlendingFactorDest */ + int GL_ZERO = 0, + GL_ONE = 1, + GL_SRC_COLOR = 0x0300, + GL_ONE_MINUS_SRC_COLOR = 0x0301, + GL_SRC_ALPHA = 0x0302, + GL_ONE_MINUS_SRC_ALPHA = 0x0303, + GL_DST_ALPHA = 0x0304, + GL_ONE_MINUS_DST_ALPHA = 0x0305; + + /** BlendingFactorSrc */ + int +/* GL_ZERO */ +/* GL_ONE */ + GL_DST_COLOR = 0x0306, + GL_ONE_MINUS_DST_COLOR = 0x0307, + GL_SRC_ALPHA_SATURATE = 0x0308; +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + + /** BlendEquationSeparate */ + int GL_FUNC_ADD = 0x8006, + GL_BLEND_EQUATION = 0x8009, + GL_BLEND_EQUATION_RGB = 0x8009, /* same as BLEND_EQUATION */ + GL_BLEND_EQUATION_ALPHA = 0x883D; + + /** BlendSubtract */ + int GL_FUNC_SUBTRACT = 0x800A, + GL_FUNC_REVERSE_SUBTRACT = 0x800B; + + /** Separate Blend Functions */ + int GL_BLEND_DST_RGB = 0x80C8, + GL_BLEND_SRC_RGB = 0x80C9, + GL_BLEND_DST_ALPHA = 0x80CA, + GL_BLEND_SRC_ALPHA = 0x80CB, + GL_CONSTANT_COLOR = 0x8001, + GL_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_CONSTANT_ALPHA = 0x8003, + GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_BLEND_COLOR = 0x8005; + + /** Buffer Objects */ + int GL_ARRAY_BUFFER = 0x8892, + GL_ELEMENT_ARRAY_BUFFER = 0x8893, + GL_ARRAY_BUFFER_BINDING = 0x8894, + GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895, + GL_STREAM_DRAW = 0x88E0, + GL_STATIC_DRAW = 0x88E4, + GL_DYNAMIC_DRAW = 0x88E8, + GL_BUFFER_SIZE = 0x8764, + GL_BUFFER_USAGE = 0x8765, + GL_CURRENT_VERTEX_ATTRIB = 0x8626; + + /** CullFaceMode */ + int GL_FRONT = 0x0404, + GL_BACK = 0x0405, + GL_FRONT_AND_BACK = 0x0408; + +/** DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + + /** EnableCap */ + int GL_TEXTURE_2D = 0x0DE1, + GL_CULL_FACE = 0x0B44, + GL_BLEND = 0x0BE2, + GL_DITHER = 0x0BD0, + GL_STENCIL_TEST = 0x0B90, + GL_DEPTH_TEST = 0x0B71, + GL_SCISSOR_TEST = 0x0C11, + GL_POLYGON_OFFSET_FILL = 0x8037, + GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E, + GL_SAMPLE_COVERAGE = 0x80A0; + + /** ErrorCode */ + int GL_NO_ERROR = 0, + GL_INVALID_ENUM = 0x0500, + GL_INVALID_VALUE = 0x0501, + GL_INVALID_OPERATION = 0x0502, + GL_OUT_OF_MEMORY = 0x0505; + + /** FrontFaceDirection */ + int GL_CW = 0x0900, + GL_CCW = 0x0901; + + /** GetPName */ + int GL_LINE_WIDTH = 0x0B21, + GL_ALIASED_POINT_SIZE_RANGE = 0x846D, + GL_ALIASED_LINE_WIDTH_RANGE = 0x846E, + GL_CULL_FACE_MODE = 0x0B45, + GL_FRONT_FACE = 0x0B46, + GL_DEPTH_RANGE = 0x0B70, + GL_DEPTH_WRITEMASK = 0x0B72, + GL_DEPTH_CLEAR_VALUE = 0x0B73, + GL_DEPTH_FUNC = 0x0B74, + GL_STENCIL_CLEAR_VALUE = 0x0B91, + GL_STENCIL_FUNC = 0x0B92, + GL_STENCIL_FAIL = 0x0B94, + GL_STENCIL_PASS_DEPTH_FAIL = 0x0B95, + GL_STENCIL_PASS_DEPTH_PASS = 0x0B96, + GL_STENCIL_REF = 0x0B97, + GL_STENCIL_VALUE_MASK = 0x0B93, + GL_STENCIL_WRITEMASK = 0x0B98, + GL_STENCIL_BACK_FUNC = 0x8800, + GL_STENCIL_BACK_FAIL = 0x8801, + GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802, + GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803, + GL_STENCIL_BACK_REF = 0x8CA3, + GL_STENCIL_BACK_VALUE_MASK = 0x8CA4, + GL_STENCIL_BACK_WRITEMASK = 0x8CA5, + GL_VIEWPORT = 0x0BA2, + GL_SCISSOR_BOX = 0x0C10, + /* GL_SCISSOR_TEST */ + GL_COLOR_CLEAR_VALUE = 0x0C22, + GL_COLOR_WRITEMASK = 0x0C23, + GL_UNPACK_ALIGNMENT = 0x0CF5, + GL_PACK_ALIGNMENT = 0x0D05, + GL_MAX_TEXTURE_SIZE = 0x0D33, + GL_MAX_VIEWPORT_DIMS = 0x0D3A, + GL_SUBPIXEL_BITS = 0x0D50, + GL_RED_BITS = 0x0D52, + GL_GREEN_BITS = 0x0D53, + GL_BLUE_BITS = 0x0D54, + GL_ALPHA_BITS = 0x0D55, + GL_DEPTH_BITS = 0x0D56, + GL_STENCIL_BITS = 0x0D57, + GL_POLYGON_OFFSET_UNITS = 0x2A00, + /* GL_POLYGON_OFFSET_FILL */ + GL_POLYGON_OFFSET_FACTOR = 0x8038, + GL_TEXTURE_BINDING_2D = 0x8069, + GL_SAMPLE_BUFFERS = 0x80A8, + GL_SAMPLES = 0x80A9, + GL_SAMPLE_COVERAGE_VALUE = 0x80AA, + GL_SAMPLE_COVERAGE_INVERT = 0x80AB; + + /** GetTextureParameter */ + int +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + GL_NUM_COMPRESSED_TEXTURE_FORMATS = 0x86A2, + GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + /** HintMode */ + int GL_DONT_CARE = 0x1100, + GL_FASTEST = 0x1101, + GL_NICEST = 0x1102; + + /** HintTarget */ + int GL_GENERATE_MIPMAP_HINT = 0x8192; + + /** DataType */ + int GL_BYTE = 0x1400, + GL_UNSIGNED_BYTE = 0x1401, + GL_SHORT = 0x1402, + GL_UNSIGNED_SHORT = 0x1403, + GL_INT = 0x1404, + GL_UNSIGNED_INT = 0x1405, + GL_FLOAT = 0x1406, + GL_FIXED = 0x140C; + + /** PixelFormat */ + int GL_DEPTH_COMPONENT = 0x1902, + GL_ALPHA = 0x1906, + GL_RGB = 0x1907, + GL_RGBA = 0x1908, + GL_LUMINANCE = 0x1909, + GL_LUMINANCE_ALPHA = 0x190A; + + /** PixelType */ + int +/* GL_UNSIGNED_BYTE */ + GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033, + GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034, + GL_UNSIGNED_SHORT_5_6_5 = 0x8363; + + /** Shaders */ + int GL_FRAGMENT_SHADER = 0x8B30, + GL_VERTEX_SHADER = 0x8B31, + GL_MAX_VERTEX_ATTRIBS = 0x8869, + GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB, + GL_MAX_VARYING_VECTORS = 0x8DFC, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C, + GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872, + GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD, + GL_SHADER_TYPE = 0x8B4F, + GL_DELETE_STATUS = 0x8B80, + GL_LINK_STATUS = 0x8B82, + GL_VALIDATE_STATUS = 0x8B83, + GL_ATTACHED_SHADERS = 0x8B85, + GL_ACTIVE_UNIFORMS = 0x8B86, + GL_ACTIVE_UNIFORM_MAX_LENGTH = 0x8B87, + GL_ACTIVE_ATTRIBUTES = 0x8B89, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 0x8B8A, + GL_SHADING_LANGUAGE_VERSION = 0x8B8C, + GL_CURRENT_PROGRAM = 0x8B8D; + + /** StencilFunction */ + int GL_NEVER = 0x0200, + GL_LESS = 0x0201, + GL_EQUAL = 0x0202, + GL_LEQUAL = 0x0203, + GL_GREATER = 0x0204, + GL_NOTEQUAL = 0x0205, + GL_GEQUAL = 0x0206, + GL_ALWAYS = 0x0207; + + /** StencilOp */ + int +/* GL_ZERO */ + GL_KEEP = 0x1E00, + GL_REPLACE = 0x1E01, + GL_INCR = 0x1E02, + GL_DECR = 0x1E03, + GL_INVERT = 0x150A, + GL_INCR_WRAP = 0x8507, + GL_DECR_WRAP = 0x8508; + + /** StringName */ + int GL_VENDOR = 0x1F00, + GL_RENDERER = 0x1F01, + GL_VERSION = 0x1F02, + GL_EXTENSIONS = 0x1F03; + + /** TextureMagFilter */ + int GL_NEAREST = 0x2600, + GL_LINEAR = 0x2601; + + /** TextureMinFilter */ + int +/* GL_NEAREST */ +/* GL_LINEAR */ + GL_NEAREST_MIPMAP_NEAREST = 0x2700, + GL_LINEAR_MIPMAP_NEAREST = 0x2701, + GL_NEAREST_MIPMAP_LINEAR = 0x2702, + GL_LINEAR_MIPMAP_LINEAR = 0x2703; + + /** TextureParameterName */ + int GL_TEXTURE_MAG_FILTER = 0x2800, + GL_TEXTURE_MIN_FILTER = 0x2801, + GL_TEXTURE_WRAP_S = 0x2802, + GL_TEXTURE_WRAP_T = 0x2803; + + /** TextureTarget */ + int +/* GL_TEXTURE_2D */ + GL_TEXTURE = 0x1702, + GL_TEXTURE_CUBE_MAP = 0x8513, + GL_TEXTURE_BINDING_CUBE_MAP = 0x8514, + GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A, + GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + /** TextureUnit */ + int GL_TEXTURE0 = 0x84C0, + GL_TEXTURE1 = 0x84C1, + GL_TEXTURE2 = 0x84C2, + GL_TEXTURE3 = 0x84C3, + GL_TEXTURE4 = 0x84C4, + GL_TEXTURE5 = 0x84C5, + GL_TEXTURE6 = 0x84C6, + GL_TEXTURE7 = 0x84C7, + GL_TEXTURE8 = 0x84C8, + GL_TEXTURE9 = 0x84C9, + GL_TEXTURE10 = 0x84CA, + GL_TEXTURE11 = 0x84CB, + GL_TEXTURE12 = 0x84CC, + GL_TEXTURE13 = 0x84CD, + GL_TEXTURE14 = 0x84CE, + GL_TEXTURE15 = 0x84CF, + GL_TEXTURE16 = 0x84D0, + GL_TEXTURE17 = 0x84D1, + GL_TEXTURE18 = 0x84D2, + GL_TEXTURE19 = 0x84D3, + GL_TEXTURE20 = 0x84D4, + GL_TEXTURE21 = 0x84D5, + GL_TEXTURE22 = 0x84D6, + GL_TEXTURE23 = 0x84D7, + GL_TEXTURE24 = 0x84D8, + GL_TEXTURE25 = 0x84D9, + GL_TEXTURE26 = 0x84DA, + GL_TEXTURE27 = 0x84DB, + GL_TEXTURE28 = 0x84DC, + GL_TEXTURE29 = 0x84DD, + GL_TEXTURE30 = 0x84DE, + GL_TEXTURE31 = 0x84DF, + GL_ACTIVE_TEXTURE = 0x84E0; + + /** TextureWrapMode */ + int GL_REPEAT = 0x2901, + GL_CLAMP_TO_EDGE = 0x812F, + GL_MIRRORED_REPEAT = 0x8370; + + /** Uniform Types */ + int GL_FLOAT_VEC2 = 0x8B50, + GL_FLOAT_VEC3 = 0x8B51, + GL_FLOAT_VEC4 = 0x8B52, + GL_INT_VEC2 = 0x8B53, + GL_INT_VEC3 = 0x8B54, + GL_INT_VEC4 = 0x8B55, + GL_BOOL = 0x8B56, + GL_BOOL_VEC2 = 0x8B57, + GL_BOOL_VEC3 = 0x8B58, + GL_BOOL_VEC4 = 0x8B59, + GL_FLOAT_MAT2 = 0x8B5A, + GL_FLOAT_MAT3 = 0x8B5B, + GL_FLOAT_MAT4 = 0x8B5C, + GL_SAMPLER_2D = 0x8B5E, + GL_SAMPLER_CUBE = 0x8B60; + + /** Vertex Arrays */ + int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622, + GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623, + GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624, + GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A, + GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645, + GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + + /** Read Format */ + int GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A, + GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /** Shader Source */ + int GL_COMPILE_STATUS = 0x8B81, + GL_INFO_LOG_LENGTH = 0x8B84, + GL_SHADER_SOURCE_LENGTH = 0x8B88, + GL_SHADER_COMPILER = 0x8DFA; + + /** Shader Binary */ + int GL_SHADER_BINARY_FORMATS = 0x8DF8, + GL_NUM_SHADER_BINARY_FORMATS = 0x8DF9; + + /** Shader Precision-Specified Types */ + int GL_LOW_FLOAT = 0x8DF0, + GL_MEDIUM_FLOAT = 0x8DF1, + GL_HIGH_FLOAT = 0x8DF2, + GL_LOW_INT = 0x8DF3, + GL_MEDIUM_INT = 0x8DF4, + GL_HIGH_INT = 0x8DF5; + + /** Framebuffer Object. */ + int GL_FRAMEBUFFER = 0x8D40, + GL_RENDERBUFFER = 0x8D41, + GL_RGBA4 = 0x8056, + GL_RGB5_A1 = 0x8057, + GL_RGB565 = 0x8D62, + GL_DEPTH_COMPONENT16 = 0x81A5, + GL_STENCIL_INDEX = 0x1901, + GL_STENCIL_INDEX8 = 0x8D48, + GL_RENDERBUFFER_WIDTH = 0x8D42, + GL_RENDERBUFFER_HEIGHT = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8D44, + GL_RENDERBUFFER_RED_SIZE = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE = 0x8D55, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3, + GL_COLOR_ATTACHMENT0 = 0x8CE0, + GL_DEPTH_ATTACHMENT = 0x8D00, + GL_STENCIL_ATTACHMENT = 0x8D20, + GL_NONE = 0, + GL_FRAMEBUFFER_COMPLETE = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9, + GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD, + GL_FRAMEBUFFER_BINDING = 0x8CA6, + GL_RENDERBUFFER_BINDING = 0x8CA7, + GL_MAX_RENDERBUFFER_SIZE = 0x84E8, + GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506; + + void glActiveTexture(@GLenum int texture); + + void glAttachShader(@GLuint int program, @GLuint int shader); + + void glBindAttribLocation(@GLuint int program, @GLuint int index, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glBindAttribLocation") + void glBindAttribLocation(@GLuint int program, @GLuint int index, @NullTerminated CharSequence name); + + @Code(" StateTracker.bindBuffer(target, buffer);") + void glBindBuffer(@GLenum int target, @GLuint int buffer); + + void glBindFramebuffer(@GLenum int target, @GLuint int framebuffer); + + void glBindRenderbuffer(@GLenum int target, @GLuint int renderbuffer); + + void glBindTexture(@GLenum int target, @GLuint int texture); + + void glBlendColor(@GLclampf float red, @GLclampf float green, @GLclampf float blue, @GLclampf float alpha); + + void glBlendEquation(@GLenum int mode); + + void glBlendEquationSeparate(@GLenum int modeRGB, @GLenum int modeAlpha); + + void glBlendFunc(@GLenum int sfactor, @GLenum int dfactor); + + void glBlendFuncSeparate(@GLenum int srcRGB, @GLenum int dstRGB, @GLenum int srcAlpha, @GLenum int dstAlpha); + + @GenerateAutos + void glBufferData(@GLenum int target, @AutoSize("data") @GLsizeiptr long size, + @Check @Const @GLbyte @GLshort @GLint @GLfloat Buffer data, @GLenum int usage); + + void glBufferSubData(@GLenum int target, @GLintptr long offset, @AutoSize("data") @GLsizeiptr long size, + @Check @Const @GLbyte @GLshort @GLint @GLfloat Buffer data); + + @GLenum + int glCheckFramebufferStatus(@GLenum int target); + + void glClear(@GLbitfield int mask); + + void glClearColor(@GLclampf float red, @GLclampf float green, @GLclampf float blue, @GLclampf float alpha); + + void glClearDepthf(@GLclampf float depth); + + void glClearStencil(@GLint int s); + + void glColorMask(@GLboolean boolean red, @GLboolean boolean green, @GLboolean boolean blue, @GLboolean boolean alpha); + + void glCompileShader(@GLuint int shader); + + void glCompressedTexImage2D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, int border, @AutoSize("data") @GLsizei int imageSize, + @Check @Const @GLvoid ByteBuffer data); + + void glCompressedTexSubImage2D(@GLenum int target, int level, int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @Check @Const @GLvoid ByteBuffer data); + + void glCopyTexImage2D(@GLenum int target, @GLint int level, @GLenum int internalformat, @GLint int x, @GLint int y, @GLsizei int width, @GLsizei int height, @GLint int border); + + void glCopyTexSubImage2D(@GLenum int target, @GLint int level, @GLint int xoffset, @GLint int yoffset, @GLint int x, @GLint int y, @GLsizei int width, @GLsizei int height); + + @GLuint + int glCreateProgram(); + + @GLuint + int glCreateShader(@GLenum int type); + + void glCullFace(@GLenum int mode); + + void glDeleteBuffers(@AutoSize("buffers") @GLsizei int n, @Const @GLuint IntBuffer buffers); + + @Alternate("glDeleteBuffers") + void glDeleteBuffers(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(buffer)", keepParam = true) int buffer); + + void glDeleteFramebuffers(@AutoSize("framebuffers") int n, @Const @GLuint IntBuffer framebuffers); + + @Alternate("glDeleteFramebuffers") + void glDeleteFramebuffers(@Constant("1") int n, @Constant(value = "APIUtil.getInt(framebuffer)", keepParam = true) int framebuffer); + + void glDeleteProgram(@GLuint int program); + + void glDeleteRenderbuffers(@AutoSize("renderbuffers") int n, @Const @GLuint IntBuffer renderbuffers); + + @Alternate("glDeleteRenderbuffers") + void glDeleteRenderbuffers(@Constant("1") int n, @Constant(value = "APIUtil.getInt(renderbuffer)", keepParam = true) int renderbuffer); + + void glDeleteShader(@GLuint int shader); + + void glDeleteTextures(@AutoSize("textures") @GLsizei int n, @Const @GLuint IntBuffer textures); + + @Alternate("glDeleteTextures") + void glDeleteTextures(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(texture)", keepParam = true) int texture); + + void glDepthFunc(@GLenum int func); + + void glDepthMask(@GLboolean boolean flag); + + void glDepthRangef(@GLclampf float zNear, @GLclampf float zFar); + + void glDetachShader(@GLuint int program, @GLuint int shader); + + void glDisable(@GLenum int cap); + + void glDisableVertexAttribArray(@GLuint int index); + + void glDrawArrays(@GLenum int mode, @GLint int first, @GLsizei int count); + + void glDrawElements(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) @Const @GLubyte @GLushort @GLuint Buffer indices); + + void glEnable(@GLenum int cap); + + void glEnableVertexAttribArray(@GLuint int index); + + void glFinish(); + + void glFlush(); + + void glFramebufferRenderbuffer(@GLenum int target, @GLenum int attachment, @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + void glFramebufferTexture2D(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, @GLint int level); + + void glFrontFace(@GLenum int mode); + + void glGenBuffers(@AutoSize("buffers") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + @Alternate("glGenBuffers") + @GLreturn("buffers") + void glGenBuffers2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer buffers); + + void glGenerateMipmap(@GLenum int target); + + void glGenFramebuffers(@AutoSize("framebuffers") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Alternate("glGenFramebuffers") + @GLreturn("framebuffers") + void glGenFramebuffers2(@Constant("1") int n, @OutParameter @GLuint IntBuffer framebuffers); + + void glGenRenderbuffers(@AutoSize("renderbuffers") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Alternate("glGenRenderbuffers") + @GLreturn("renderbuffers") + void glGenRenderbuffers2(@Constant("1") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + void glGenTextures(@AutoSize("textures") @GLsizei int n, @OutParameter @GLuint IntBuffer textures); + + @Alternate("glGenTextures") + @GLreturn("textures") + void glGenTextures2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer textures); + + void glGetActiveAttrib(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @Check("1") IntBuffer size, + @OutParameter @Check("1") @GLenum IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveAttrib") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveAttrib2(@GLuint int program, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") @GLenum IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns only the attrib name. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveAttrib(@GLuint int program, @GLuint int index, @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt()), MemoryUtil.getAddress(APIUtil.getBufferInt(), 1)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns only the attrib size. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveAttribSize(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0()") ByteBuffer name); + + /** Overloads glGetActiveAttrib. This version returns only the attrib type. */ + @Alternate(value = "glGetActiveAttrib", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveAttribType(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0()") ByteBuffer name); + + void glGetActiveUniform(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @Check("1") @GLsizei IntBuffer size, + @OutParameter @Check("1") @GLenum IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns both size and type in the sizeType buffer (at .position() and .position() + 1). */ + @Alternate("glGetActiveUniform") + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveUniform2(@GLuint int program, @GLuint int index, @GLsizei int bufsize, + @OutParameter @Constant("MemoryUtil.getAddress0(name_length)") @GLsizei IntBuffer length, + @OutParameter @Check("2") IntBuffer sizeType, + @OutParameter @Constant("MemoryUtil.getAddress(sizeType, sizeType.position() + 1)") @GLenum IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniformARB. This version returns only the uniform name. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "name", maxLength = "bufsize") + void glGetActiveUniform(@GLuint int program, @GLuint int index, @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length), MemoryUtil.getAddress0(APIUtil.getBufferInt()), MemoryUtil.getAddress(APIUtil.getBufferInt(), 1)") IntBuffer length, + @OutParameter @GLchar ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns only the uniform size. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "size") + void glGetActiveUniformSize(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer size, + @OutParameter @GLenum @Constant("MemoryUtil.getAddress(size, 1)") IntBuffer type, // Reuse size buffer and ignore + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0()") ByteBuffer name); + + /** Overloads glGetActiveUniform. This version returns only the uniform type. */ + @Alternate(value = "glGetActiveUniform", javaAlt = true) + @GLreturn(value = "type") + void glGetActiveUniformType(@GLuint int program, @GLuint int index, @Constant("0") @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter @Constant("MemoryUtil.getAddress(type, 1)") IntBuffer size, // Reuse type buffer and ignore + @OutParameter @GLenum IntBuffer type, + @OutParameter @GLchar @Constant("APIUtil.getBufferByte0()") ByteBuffer name); + + void glGetAttachedShaders(@GLuint int program, @AutoSize("shaders") @GLsizei int maxCount, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer count, + @OutParameter @GLuint IntBuffer shaders); + + int glGetAttribLocation(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetAttribLocation") + int glGetAttribLocation(@GLuint int program, @NullTerminated CharSequence name); + + @StripPostfix("params") + void glGetBooleanv(@GLenum int pname, @OutParameter @Check("1") @GLboolean ByteBuffer params); + + @Alternate("glGetBooleanv") + @GLreturn("params") + @StripPostfix("params") + void glGetBooleanv2(@GLenum int pname, @OutParameter @GLboolean ByteBuffer params); + + @StripPostfix("params") + void glGetBufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetBufferParameteri} instead. */ + @Alternate("glGetBufferParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GLES20", method = "glGetBufferParameteri") + @Deprecated + void glGetBufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetBufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameteriv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @NoErrorCheck + @GLenum + int glGetError(); + + @StripPostfix("params") + void glGetFloatv(@GLenum int pname, @OutParameter @Check("1") FloatBuffer params); + + @Alternate("glGetFloatv") + @GLreturn("params") + @StripPostfix("params") + void glGetFloatv2(@GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetFramebufferAttachmentParameteriv(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteri} instead. */ + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GLES20", method = "glGetFramebufferAttachmentParameteri") + @Deprecated + void glGetFramebufferAttachmentParameteriv2(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetFramebufferAttachmentParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferAttachmentParameteriv3(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetIntegerv(@GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetIntegerv") + @GLreturn("params") + @StripPostfix("params") + void glGetIntegerv2(@GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetProgramiv(@GLuint int program, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetProgrami} instead. */ + @Alternate("glGetProgramiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GLES20", method = "glGetProgrami") + @Deprecated + void glGetProgramiv2(@GLuint int program, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetProgramiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetProgramiv3(@GLuint int program, @GLenum int pname, @OutParameter IntBuffer params); + + void glGetProgramInfoLog(@GLuint int program, @AutoSize("infoLog") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetProgramInfoLog") + @GLreturn(value = "infoLog", maxLength = "bufsize") + void glGetProgramInfoLog2(@GLuint int program, @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @StripPostfix("params") + void glGetRenderbufferParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteri} instead. */ + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GLES20", method = "glGetRenderbufferParameteri") + @Deprecated + void glGetRenderbufferParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetRenderbufferParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetRenderbufferParameteriv3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetShaderiv(@GLuint int shader, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetShaderi} instead. */ + @Alternate("glGetShaderiv") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "GLES20", method = "glGetShaderi") + @Deprecated + void glGetShaderiv2(@GLuint int shader, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetShaderiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetShaderiv3(@GLuint int shader, @GLenum int pname, @OutParameter IntBuffer params); + + void glGetShaderInfoLog(@GLuint int shader, @AutoSize("infoLog") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + @Alternate("glGetShaderInfoLog") + @GLreturn(value = "infoLog", maxLength = "bufsize") + void glGetShaderInfoLog2(@GLuint int shader, @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(infoLog_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer infoLog); + + void glGetShaderPrecisionFormat(@GLenum int shadertype, @GLenum int precisiontype, @OutParameter @GLint @Check("2") IntBuffer range, @OutParameter @Check("1") @GLint IntBuffer precision); + + void glGetShaderSource(@GLuint int shader, @AutoSize("source") @GLsizei int bufsize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer source); + + @Alternate("glGetShaderSource") + @GLreturn(value = "source", maxLength = "bufsize") + void glGetShaderSource2(@GLuint int shader, @GLsizei int bufsize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(source_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer source); + + @Const + String glGetString(@GLenum int name); + + @StripPostfix("params") + void glGetTexParameterfv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") FloatBuffer params); + + @Alternate("glGetTexParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameterfv2(@GLenum int target, @GLenum int pname, @OutParameter FloatBuffer params); + + @StripPostfix("params") + void glGetTexParameteriv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetTexParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexParameteriv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetUniformfv(@GLuint int program, int location, @OutParameter @Check("1") FloatBuffer params); + + @StripPostfix("params") + void glGetUniformiv(@GLuint int program, int location, @OutParameter @Check("1") IntBuffer params); + + /** + * Returns the location of the uniform with the specified name. The ByteBuffer should contain the uniform name as a + * <b>null-terminated</b> string. + * + * @param program + * @param name + */ + int glGetUniformLocation(@GLuint int program, @NullTerminated @Check("1") @Const @GLchar ByteBuffer name); + + @Alternate("glGetUniformLocation") + int glGetUniformLocation(@GLuint int program, @NullTerminated CharSequence name); + + @StripPostfix("params") + void glGetVertexAttribfv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") FloatBuffer params); + + @StripPostfix("params") + void glGetVertexAttribiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("pointer") + void glGetVertexAttribPointerv(@GLuint int index, @GLenum int pname, @Result @GLvoid ByteBuffer pointer); + + void glHint(@GLenum int target, @GLenum int mode); + + @GLboolean + boolean glIsBuffer(@GLuint int buffer); + + @GLboolean + boolean glIsEnabled(@GLenum int cap); + + @GLboolean + boolean glIsFramebuffer(@GLuint int framebuffer); + + @GLboolean + boolean glIsProgram(@GLuint int program); + + @GLboolean + boolean glIsRenderbuffer(@GLuint int renderbuffer); + + @GLboolean + boolean glIsShader(@GLuint int shader); + + @GLboolean + boolean glIsTexture(@GLuint int texture); + + void glLineWidth(@GLfloat float width); + + void glLinkProgram(@GLuint int program); + + void glPixelStorei(@GLenum int pname, @GLint int param); + + void glPolygonOffset(@GLfloat float factor, @GLfloat float units); + + void glReadPixels(int x, int y, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @OutParameter @GLbyte @GLshort @GLint @GLfloat Buffer pixels); + + void glReleaseShaderCompiler(); + + void glRenderbufferStorage(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + void glSampleCoverage(@GLclampf float value, @GLboolean boolean invert); + + void glScissor(@GLint int x, @GLint int y, @GLsizei int width, @GLsizei int height); + + void glShaderBinary(@AutoSize("shaders") @GLsizei int n, @Const @GLuint IntBuffer shaders, @GLenum int binaryformat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + /** + * glShaderSource allows multiple, optionally null-terminated, source strings to define a shader program. + * <p/> + * This method uses just a single string, that should NOT be null-terminated. + * + * @param shader + * @param string + */ + void glShaderSource(@GLuint int shader, @Constant("1") @GLsizei int count, + @Indirect @Const @Check @GLchar ByteBuffer string, + @AutoSize("string") @Indirect @Const @GLint int length); + + @Alternate("glShaderSource") + void glShaderSource2(@GLuint int shader, @Constant("1") @GLsizei int count, CharSequence string, @Constant("string.length()") @Indirect @Const int length); + + @Alternate(value = "glShaderSource", nativeAlt = true) + void glShaderSource3(@GLuint int shader, @Constant("strings.length") @GLsizei int count, + @Const @PointerArray(value = "count", lengths = "length") CharSequence[] strings, + @Constant("APIUtil.getLengths(strings)") @Const IntBuffer length); + + void glStencilFunc(@GLenum int func, @GLint int ref, @GLuint int mask); + + void glStencilFuncSeparate(@GLenum int face, @GLenum int func, @GLint int ref, @GLuint int mask); + + void glStencilMask(@GLuint int mask); + + void glStencilMaskSeparate(@GLenum int face, @GLuint int mask); + + void glStencilOp(@GLenum int fail, @GLenum int zfail, @GLenum int zpass); + + void glStencilOpSeparate(@GLenum int face, @GLenum int fail, @GLenum int zfail, @GLenum int zpass); + + void glTexImage2D(@GLenum int target, int level, int internalformat, int width, int height, int border, @GLenum int format, @GLenum int type, + @Check(value = "GLChecks.calculateTexImage2DStorage(pixels, format, type, width, height)", canBeNull = true) + @Const @GLbyte @GLshort @GLint @GLfloat Buffer pixels); + + void glTexParameterf(@GLenum int target, @GLenum int pname, @GLfloat float param); + + @StripPostfix("param") + void glTexParameterfv(@GLenum int target, @GLenum int pname, @Check("4") @Const FloatBuffer param); + + void glTexParameteri(@GLenum int target, @GLenum int pname, @GLint int param); + + @StripPostfix("param") + void glTexParameteriv(@GLenum int target, @GLenum int pname, @Check("4") @Const IntBuffer param); + + void glTexSubImage2D(@GLenum int target, int level, int xoffset, int yoffset, @GLsizei int width, @GLsizei int height, @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, 1)") + @Const @GLbyte @GLshort @GLint @GLfloat Buffer pixels); + + void glUniform1f(@GLint int location, @GLfloat float x); + + @StripPostfix("v") + void glUniform1fv(int location, @AutoSize("v") @GLsizei int count, @Const FloatBuffer v); + + void glUniform1i(@GLint int location, @GLint int x); + + @StripPostfix("v") + void glUniform1iv(int location, @AutoSize("v") @GLsizei int count, @Const IntBuffer v); + + void glUniform2f(@GLint int location, @GLfloat float x, @GLfloat float y); + + @StripPostfix("v") + void glUniform2fv(int location, @AutoSize(value = "v", expression = " >> 1") @GLsizei int count, @Const FloatBuffer v); + + void glUniform2i(@GLint int location, @GLint int x, @GLint int y); + + @StripPostfix("v") + void glUniform2iv(int location, @AutoSize(value = "v", expression = " >> 1") @GLsizei int count, @Const IntBuffer v); + + void glUniform3f(@GLint int location, @GLfloat float x, @GLfloat float y, @GLfloat float z); + + @StripPostfix("v") + void glUniform3fv(int location, @AutoSize(value = "v", expression = " / 3") @GLsizei int count, @Const FloatBuffer v); + + void glUniform3i(@GLint int location, @GLint int x, @GLint int y, @GLint int z); + + @StripPostfix("v") + void glUniform3iv(int location, @AutoSize(value = "v", expression = " / 3") @GLsizei int count, @Const IntBuffer v); + + void glUniform4f(@GLint int location, @GLfloat float x, @GLfloat float y, @GLfloat float z, @GLfloat float w); + + @StripPostfix("v") + void glUniform4fv(int location, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const FloatBuffer v); + + void glUniform4i(@GLint int location, @GLint int x, @GLint int y, @GLint int z, @GLint int w); + + @StripPostfix("v") + void glUniform4iv(int location, @AutoSize(value = "v", expression = " >> 2") @GLsizei int count, @Const IntBuffer v); + + @StripPostfix("matrices") + void glUniformMatrix2fv(int location, @AutoSize(value = "matrices", expression = " >> 2") @GLsizei int count, @GLboolean boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 3)") @GLsizei int count, @GLboolean boolean transpose, @Const FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4fv(int location, @AutoSize(value = "matrices", expression = " >> 4") @GLsizei int count, @GLboolean boolean transpose, @Const FloatBuffer matrices); + + void glUseProgram(@GLuint int program); + + void glValidateProgram(@GLuint int program); + + void glVertexAttrib1f(@GLuint int indx, @GLfloat float x); + + @StripPostfix("values") + void glVertexAttrib1fv(@GLuint int indx, @Const @Check("1") FloatBuffer values); + + void glVertexAttrib2f(@GLuint int indx, @GLfloat float x, @GLfloat float y); + + @StripPostfix("values") + void glVertexAttrib2fv(@GLuint int indx, @Const @Check("2") FloatBuffer values); + + void glVertexAttrib3f(@GLuint int indx, @GLfloat float x, @GLfloat float y, @GLfloat float z); + + @StripPostfix("values") + void glVertexAttrib3fv(@GLuint int indx, @Const @Check("3") FloatBuffer values); + + void glVertexAttrib4f(@GLuint int indx, @GLfloat float x, @GLfloat float y, @GLfloat float z, @GLfloat float w); + + @StripPostfix("values") + void glVertexAttrib4fv(@GLuint int indx, @Const @Check("4") FloatBuffer values); + + void glVertexAttribPointer(@GLuint int index, int size, @AutoType("buffer") @GLenum int type, @GLboolean boolean normalized, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) @Check @Const @GLubyte @GLbyte @GLshort @GLushort @GLint @GLuint @GLfloat Buffer buffer); + + void glViewport(@GLint int x, @GLint int y, @GLsizei int width, @GLsizei int height); +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES30.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES30.java new file mode 100644 index 0000000..61156b5 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/GLES30.java @@ -0,0 +1,856 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.opengl.GLSync; +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.*; + +public interface GLES30 { + + int GL_READ_BUFFER = 0x0C02; + int GL_UNPACK_ROW_LENGTH = 0x0CF2; + int GL_UNPACK_SKIP_ROWS = 0x0CF3; + int GL_UNPACK_SKIP_PIXELS = 0x0CF4; + int GL_PACK_ROW_LENGTH = 0x0D02; + int GL_PACK_SKIP_ROWS = 0x0D03; + int GL_PACK_SKIP_PIXELS = 0x0D04; + int GL_COLOR = 0x1800; + int GL_DEPTH = 0x1801; + int GL_STENCIL = 0x1802; + int GL_RED = 0x1903; + int GL_RGB8 = 0x8051; + int GL_RGBA8 = 0x8058; + int GL_RGB10_A2 = 0x8059; + int GL_TEXTURE_BINDING_3D = 0x806A; + int GL_PACK_SKIP_IMAGES = 0x806B; + int GL_PACK_IMAGE_HEIGHT = 0x806C; + int GL_UNPACK_SKIP_IMAGES = 0x806D; + int GL_UNPACK_IMAGE_HEIGHT = 0x806E; + int GL_TEXTURE_3D = 0x806F; + int GL_TEXTURE_WRAP_R = 0x8072; + int GL_MAX_3D_TEXTURE_SIZE = 0x8073; + int GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368; + int GL_MAX_ELEMENTS_VERTICES = 0x80E8; + int GL_MAX_ELEMENTS_INDICES = 0x80E9; + int GL_TEXTURE_MIN_LOD = 0x813A; + int GL_TEXTURE_MAX_LOD = 0x813B; + int GL_TEXTURE_BASE_LEVEL = 0x813C; + int GL_TEXTURE_MAX_LEVEL = 0x813D; + int GL_MIN = 0x8007; + int GL_MAX = 0x8008; + int GL_DEPTH_COMPONENT24 = 0x81A6; + int GL_MAX_TEXTURE_LOD_BIAS = 0x84FD; + int GL_TEXTURE_COMPARE_MODE = 0x884C; + int GL_TEXTURE_COMPARE_FUNC = 0x884D; + int GL_CURRENT_QUERY = 0x8865; + int GL_QUERY_RESULT = 0x8866; + int GL_QUERY_RESULT_AVAILABLE = 0x8867; + int GL_BUFFER_MAPPED = 0x88BC; + int GL_BUFFER_MAP_POINTER = 0x88BD; + int GL_STREAM_READ = 0x88E1; + int GL_STREAM_COPY = 0x88E2; + int GL_STATIC_READ = 0x88E5; + int GL_STATIC_COPY = 0x88E6; + int GL_DYNAMIC_READ = 0x88E9; + int GL_DYNAMIC_COPY = 0x88EA; + int GL_MAX_DRAW_BUFFERS = 0x8824; + int GL_DRAW_BUFFER0 = 0x8825; + int GL_DRAW_BUFFER1 = 0x8826; + int GL_DRAW_BUFFER2 = 0x8827; + int GL_DRAW_BUFFER3 = 0x8828; + int GL_DRAW_BUFFER4 = 0x8829; + int GL_DRAW_BUFFER5 = 0x882A; + int GL_DRAW_BUFFER6 = 0x882B; + int GL_DRAW_BUFFER7 = 0x882C; + int GL_DRAW_BUFFER8 = 0x882D; + int GL_DRAW_BUFFER9 = 0x882E; + int GL_DRAW_BUFFER10 = 0x882F; + int GL_DRAW_BUFFER11 = 0x8830; + int GL_DRAW_BUFFER12 = 0x8831; + int GL_DRAW_BUFFER13 = 0x8832; + int GL_DRAW_BUFFER14 = 0x8833; + int GL_DRAW_BUFFER15 = 0x8834; + int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49; + int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A; + int GL_SAMPLER_3D = 0x8B5F; + int GL_SAMPLER_2D_SHADOW = 0x8B62; + int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B; + int GL_PIXEL_PACK_BUFFER = 0x88EB; + int GL_PIXEL_UNPACK_BUFFER = 0x88EC; + int GL_PIXEL_PACK_BUFFER_BINDING = 0x88ED; + int GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88EF; + int GL_FLOAT_MAT2x3 = 0x8B65; + int GL_FLOAT_MAT2x4 = 0x8B66; + int GL_FLOAT_MAT3x2 = 0x8B67; + int GL_FLOAT_MAT3x4 = 0x8B68; + int GL_FLOAT_MAT4x2 = 0x8B69; + int GL_FLOAT_MAT4x3 = 0x8B6A; + int GL_SRGB = 0x8C40; + int GL_SRGB8 = 0x8C41; + int GL_SRGB8_ALPHA8 = 0x8C43; + int GL_COMPARE_REF_TO_TEXTURE = 0x884E; + int GL_MAJOR_VERSION = 0x821B; + int GL_MINOR_VERSION = 0x821C; + int GL_NUM_EXTENSIONS = 0x821D; + int GL_RGBA32F = 0x8814; + int GL_RGB32F = 0x8815; + int GL_RGBA16F = 0x881A; + int GL_RGB16F = 0x881B; + int GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD; + int GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88FF; + int GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904; + int GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905; + int GL_MAX_VARYING_COMPONENTS = 0x8B4B; + int GL_TEXTURE_2D_ARRAY = 0x8C1A; + int GL_TEXTURE_BINDING_2D_ARRAY = 0x8C1D; + int GL_R11F_G11F_B10F = 0x8C3A; + int GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B; + int GL_RGB9_E5 = 0x8C3D; + int GL_UNSIGNED_INT_5_9_9_9_REV = 0x8C3E; + int GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76; + int GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80; + int GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8C83; + int GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84; + int GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85; + int GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88; + int GL_RASTERIZER_DISCARD = 0x8C89; + int GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A; + int GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B; + int GL_INTERLEAVED_ATTRIBS = 0x8C8C; + int GL_SEPARATE_ATTRIBS = 0x8C8D; + int GL_TRANSFORM_FEEDBACK_BUFFER = 0x8C8E; + int GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F; + int GL_RGBA32UI = 0x8D70; + int GL_RGB32UI = 0x8D71; + int GL_RGBA16UI = 0x8D76; + int GL_RGB16UI = 0x8D77; + int GL_RGBA8UI = 0x8D7C; + int GL_RGB8UI = 0x8D7D; + int GL_RGBA32I = 0x8D82; + int GL_RGB32I = 0x8D83; + int GL_RGBA16I = 0x8D88; + int GL_RGB16I = 0x8D89; + int GL_RGBA8I = 0x8D8E; + int GL_RGB8I = 0x8D8F; + int GL_RED_INTEGER = 0x8D94; + int GL_RGB_INTEGER = 0x8D98; + int GL_RGBA_INTEGER = 0x8D99; + int GL_SAMPLER_2D_ARRAY = 0x8DC1; + int GL_SAMPLER_2D_ARRAY_SHADOW = 0x8DC4; + int GL_SAMPLER_CUBE_SHADOW = 0x8DC5; + int GL_UNSIGNED_INT_VEC2 = 0x8DC6; + int GL_UNSIGNED_INT_VEC3 = 0x8DC7; + int GL_UNSIGNED_INT_VEC4 = 0x8DC8; + int GL_INT_SAMPLER_2D = 0x8DCA; + int GL_INT_SAMPLER_3D = 0x8DCB; + int GL_INT_SAMPLER_CUBE = 0x8DCC; + int GL_INT_SAMPLER_2D_ARRAY = 0x8DCF; + int GL_UNSIGNED_INT_SAMPLER_2D = 0x8DD2; + int GL_UNSIGNED_INT_SAMPLER_3D = 0x8DD3; + int GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4; + int GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7; + int GL_BUFFER_ACCESS_FLAGS = 0x911F; + int GL_BUFFER_MAP_LENGTH = 0x9120; + int GL_BUFFER_MAP_OFFSET = 0x9121; + int GL_DEPTH_COMPONENT32F = 0x8CAC; + int GL_DEPTH32F_STENCIL8 = 0x8CAD; + int GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD; + int GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + int GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211; + int GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212; + int GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213; + int GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214; + int GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215; + int GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216; + int GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217; + int GL_FRAMEBUFFER_DEFAULT = 0x8218; + int GL_FRAMEBUFFER_UNDEFINED = 0x8219; + int GL_DEPTH_STENCIL_ATTACHMENT = 0x821A; + int GL_DEPTH_STENCIL = 0x84F9; + int GL_UNSIGNED_INT_24_8 = 0x84FA; + int GL_DEPTH24_STENCIL8 = 0x88F0; + int GL_UNSIGNED_NORMALIZED = 0x8C17; + int GL_DRAW_FRAMEBUFFER_BINDING = GLES20.GL_FRAMEBUFFER_BINDING; + int GL_READ_FRAMEBUFFER = 0x8CA8; + int GL_DRAW_FRAMEBUFFER = 0x8CA9; + int GL_READ_FRAMEBUFFER_BINDING = 0x8CAA; + int GL_RENDERBUFFER_SAMPLES = 0x8CAB; + int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4; + int GL_MAX_COLOR_ATTACHMENTS = 0x8CDF; + int GL_COLOR_ATTACHMENT1 = 0x8CE1; + int GL_COLOR_ATTACHMENT2 = 0x8CE2; + int GL_COLOR_ATTACHMENT3 = 0x8CE3; + int GL_COLOR_ATTACHMENT4 = 0x8CE4; + int GL_COLOR_ATTACHMENT5 = 0x8CE5; + int GL_COLOR_ATTACHMENT6 = 0x8CE6; + int GL_COLOR_ATTACHMENT7 = 0x8CE7; + int GL_COLOR_ATTACHMENT8 = 0x8CE8; + int GL_COLOR_ATTACHMENT9 = 0x8CE9; + int GL_COLOR_ATTACHMENT10 = 0x8CEA; + int GL_COLOR_ATTACHMENT11 = 0x8CEB; + int GL_COLOR_ATTACHMENT12 = 0x8CEC; + int GL_COLOR_ATTACHMENT13 = 0x8CED; + int GL_COLOR_ATTACHMENT14 = 0x8CEE; + int GL_COLOR_ATTACHMENT15 = 0x8CEF; + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56; + int GL_MAX_SAMPLES = 0x8D57; + int GL_HALF_FLOAT = 0x140B; + int GL_MAP_READ_BIT = 0x0001; + int GL_MAP_WRITE_BIT = 0x0002; + int GL_MAP_INVALIDATE_RANGE_BIT = 0x0004; + int GL_MAP_INVALIDATE_BUFFER_BIT = 0x0008; + int GL_MAP_FLUSH_EXPLICIT_BIT = 0x0010; + int GL_MAP_UNSYNCHRONIZED_BIT = 0x0020; + int GL_RG = 0x8227; + int GL_RG_INTEGER = 0x8228; + int GL_R8 = 0x8229; + int GL_RG8 = 0x822B; + int GL_R16F = 0x822D; + int GL_R32F = 0x822E; + int GL_RG16F = 0x822F; + int GL_RG32F = 0x8230; + int GL_R8I = 0x8231; + int GL_R8UI = 0x8232; + int GL_R16I = 0x8233; + int GL_R16UI = 0x8234; + int GL_R32I = 0x8235; + int GL_R32UI = 0x8236; + int GL_RG8I = 0x8237; + int GL_RG8UI = 0x8238; + int GL_RG16I = 0x8239; + int GL_RG16UI = 0x823A; + int GL_RG32I = 0x823B; + int GL_RG32UI = 0x823C; + int GL_VERTEX_ARRAY_BINDING = 0x85B5; + int GL_R8_SNORM = 0x8F94; + int GL_RG8_SNORM = 0x8F95; + int GL_RGB8_SNORM = 0x8F96; + int GL_RGBA8_SNORM = 0x8F97; + int GL_SIGNED_NORMALIZED = 0x8F9C; + int GL_PRIMITIVE_RESTART_FIXED_INDEX = 0x8D69; + int GL_COPY_READ_BUFFER = 0x8F36; + int GL_COPY_WRITE_BUFFER = 0x8F37; + int GL_COPY_READ_BUFFER_BINDING = GL_COPY_READ_BUFFER; + int GL_COPY_WRITE_BUFFER_BINDING = GL_COPY_WRITE_BUFFER; + int GL_UNIFORM_BUFFER = 0x8A11; + int GL_UNIFORM_BUFFER_BINDING = 0x8A28; + int GL_UNIFORM_BUFFER_START = 0x8A29; + int GL_UNIFORM_BUFFER_SIZE = 0x8A2A; + int GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B; + int GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D; + int GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E; + int GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F; + int GL_MAX_UNIFORM_BLOCK_SIZE = 0x8A30; + int GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31; + int GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33; + int GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34; + int GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = 0x8A35; + int GL_ACTIVE_UNIFORM_BLOCKS = 0x8A36; + int GL_UNIFORM_TYPE = 0x8A37; + int GL_UNIFORM_SIZE = 0x8A38; + int GL_UNIFORM_NAME_LENGTH = 0x8A39; + int GL_UNIFORM_BLOCK_INDEX = 0x8A3A; + int GL_UNIFORM_OFFSET = 0x8A3B; + int GL_UNIFORM_ARRAY_STRIDE = 0x8A3C; + int GL_UNIFORM_MATRIX_STRIDE = 0x8A3D; + int GL_UNIFORM_IS_ROW_MAJOR = 0x8A3E; + int GL_UNIFORM_BLOCK_BINDING = 0x8A3F; + int GL_UNIFORM_BLOCK_DATA_SIZE = 0x8A40; + int GL_UNIFORM_BLOCK_NAME_LENGTH = 0x8A41; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42; + int GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43; + int GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44; + int GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46; + int GL_INVALID_INDEX = 0xFFFFFFFF; + int GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122; + int GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125; + int GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111; + int GL_OBJECT_TYPE = 0x9112; + int GL_SYNC_CONDITION = 0x9113; + int GL_SYNC_STATUS = 0x9114; + int GL_SYNC_FLAGS = 0x9115; + int GL_SYNC_FENCE = 0x9116; + int GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117; + int GL_UNSIGNALED = 0x9118; + int GL_SIGNALED = 0x9119; + int GL_ALREADY_SIGNALED = 0x911A; + int GL_TIMEOUT_EXPIRED = 0x911B; + int GL_CONDITION_SATISFIED = 0x911C; + int GL_WAIT_FAILED = 0x911D; + int GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001; + long GL_TIMEOUT_IGNORED = 0xFFFFFFFFFFFFFFFFl; + int GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE; + int GL_ANY_SAMPLES_PASSED = 0x8C2F; + int GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A; + int GL_SAMPLER_BINDING = 0x8919; + int GL_RGB10_A2UI = 0x906F; + int GL_TEXTURE_SWIZZLE_R = 0x8E42; + int GL_TEXTURE_SWIZZLE_G = 0x8E43; + int GL_TEXTURE_SWIZZLE_B = 0x8E44; + int GL_TEXTURE_SWIZZLE_A = 0x8E45; + int GL_GREEN = 0x1904; + int GL_BLUE = 0x1905; + int GL_INT_2_10_10_10_REV = 0x8D9F; + int GL_TRANSFORM_FEEDBACK = 0x8E22; + int GL_TRANSFORM_FEEDBACK_PAUSED = 0x8E23; + int GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8E24; + int GL_TRANSFORM_FEEDBACK_BINDING = 0x8E25; + int GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257; + int GL_PROGRAM_BINARY_LENGTH = 0x8741; + int GL_NUM_PROGRAM_BINARY_FORMATS = 0x87FE; + int GL_PROGRAM_BINARY_FORMATS = 0x87FF; + int GL_COMPRESSED_R11_EAC = 0x9270; + int GL_COMPRESSED_SIGNED_R11_EAC = 0x9271; + int GL_COMPRESSED_RG11_EAC = 0x9272; + int GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273; + int GL_COMPRESSED_RGB8_ETC2 = 0x9274; + int GL_COMPRESSED_SRGB8_ETC2 = 0x9275; + int GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276; + int GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277; + int GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9278; + int GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279; + int GL_TEXTURE_IMMUTABLE_FORMAT = 0x912F; + int GL_MAX_ELEMENT_INDEX = 0x8D6B; + int GL_NUM_SAMPLE_COUNTS = 0x9380; + + void glReadBuffer(@GLenum int mode); + + void glDrawRangeElements(@GLenum int mode, @GLuint int start, @GLuint int end, @AutoSize("indices") @GLsizei int count, + @AutoType("indices") + @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices); + + void glTexImage3D(@GLenum int target, int level, int internalFormat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check(value = "GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)", canBeNull = true) + @Const + @GLbyte + @GLshort + @GLint + @GLfloat Buffer pixels); + + void glTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @GLenum int type, + @BufferObject(BufferKind.UnpackPBO) + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)") + @Const + @GLbyte + @GLshort + @GLint + @GLfloat Buffer pixels); + + void glCopyTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + void glCompressedTexImage3D(@GLenum int target, int level, @GLenum int internalformat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glCompressedTexSubImage3D(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, @GLsizei int width, @GLsizei int height, @GLsizei int depth, @GLenum int format, @AutoSize("data") @GLsizei int imageSize, + @BufferObject(BufferKind.UnpackPBO) + @Check + @Const + @GLvoid + ByteBuffer data); + + void glGenQueries(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenQueries") + @GLreturn("ids") + void glGenQueries2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + void glDeleteQueries(@AutoSize("ids") @GLsizei int n, @GLuint IntBuffer ids); + + @Alternate("glDeleteQueries") + void glDeleteQueries(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(id)", keepParam = true) int id); + + boolean glIsQuery(@GLuint int id); + + void glBeginQuery(@GLenum int target, @GLuint int id); + + void glEndQuery(@GLenum int target); + + @StripPostfix("params") + void glGetQueryiv(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + @Alternate("glGetQueryiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryiv2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetQueryObjectuiv(@GLenum int id, @GLenum int pname, @OutParameter @Check("1") @GLuint IntBuffer params); + + @Alternate("glGetQueryObjectuiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetQueryObjectuiv2(@GLenum int id, @GLenum int pname, @OutParameter @GLuint IntBuffer params); + + boolean glUnmapBuffer(@GLenum int target); + + @StripPostfix("pointer") + @AutoSize("GLChecks.getBufferObjectSize(target)") + void glGetBufferPointerv(@GLenum int target, @GLenum int pname, @OutParameter @Result @GLvoid ByteBuffer pointer); + + void glDrawBuffers(@AutoSize("buffers") @GLsizei int size, @Const @GLenum IntBuffer buffers); + + @Alternate("glDrawBuffers") + void glDrawBuffers(@Constant("1") @GLsizei int size, @Constant(value = "APIUtil.getInt(buffer)", keepParam = true) int buffer); + + @StripPostfix("matrices") + void glUniformMatrix2x3fv(int location, @AutoSize(value = "matrices", expression = " / (2 * 3)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3x2fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 2)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix2x4fv(int location, @AutoSize(value = "matrices", expression = " >> 3") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4x2fv(int location, @AutoSize(value = "matrices", expression = " >> 3") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix3x4fv(int location, @AutoSize(value = "matrices", expression = " / (3 * 4)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + @StripPostfix("matrices") + void glUniformMatrix4x3fv(int location, @AutoSize(value = "matrices", expression = " / (4 * 3)") @GLsizei int count, + boolean transpose, FloatBuffer matrices); + + /** + * Transfers a rectangle of pixel values from one + * region of the read framebuffer to another in the draw framebuffer. + * &lt;mask&gt; is the bitwise OR of a number of values indicating which + * buffers are to be copied. The values are COLOR_BUFFER_BIT, + * DEPTH_BUFFER_BIT, and STENCIL_BUFFER_BIT. + * The pixels corresponding to these buffers are + * copied from the source rectangle, bound by the locations (srcX0, + * srcY0) and (srcX1, srcY1) inclusive, to the destination rectangle, + * bound by the locations (dstX0, dstY0) and (dstX1, dstY1) + * inclusive. + * If the source and destination rectangle dimensions do not match, + * the source image is stretched to fit the destination + * rectangle. &lt;filter&gt; must be LINEAR or NEAREST and specifies the + * method of interpolation to be applied if the image is + * stretched. + */ + void glBlitFramebuffer( + @GLint int srcX0, @GLint int srcY0, @GLint int srcX1, @GLint int srcY1, + @GLint int dstX0, @GLint int dstY0, @GLint int dstX1, @GLint int dstY1, + @GLbitfield int mask, @GLenum int filter); + + /** + * Establishes the data storage, format, dimensions, and number of + * samples of a renderbuffer object's image. + */ + void glRenderbufferStorageMultisample( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glFramebufferTextureLayer(@GLenum int target, @GLenum int attachment, @GLuint int texture, int level, int layer); + + /** + * glMapBufferRange maps a GL buffer object range to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBufferRange like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferRange(..., ..., ..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferRange(..., ..., ..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult(isRange = true) + @GLvoid + @AutoSize("length") + ByteBuffer glMapBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length, @GLbitfield int access); + + void glFlushMappedBufferRange(@GLenum int target, @GLintptr long offset, @GLsizeiptr long length); + + @Code(" StateTracker.bindVAO(array);") + void glBindVertexArray(@GLuint int array); + + @Code(" StateTracker.deleteVAO(arrays);") + void glDeleteVertexArrays(@AutoSize("arrays") @GLsizei int n, @Const @GLuint IntBuffer arrays); + + @Alternate("glDeleteVertexArrays") + @Code(" StateTracker.deleteVAO(array);") + void glDeleteVertexArrays(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(array)", keepParam = true) int array); + + void glGenVertexArrays(@AutoSize("arrays") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Alternate("glGenVertexArrays") + @GLreturn("arrays") + void glGenVertexArrays2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + boolean glIsVertexArray(@GLuint int array); + + @StripPostfix("data") + void glGetIntegeri_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") IntBuffer data); + + @Alternate("glGetIntegeri_v") + @GLreturn("data") + @StripPostfix("data") + void glGetIntegeri_v2(@GLenum int value, @GLuint int index, @OutParameter IntBuffer data); + + void glBeginTransformFeedback(@GLenum int primitiveMode); + + void glEndTransformFeedback(); + + void glBindBufferRange(@GLenum int target, @GLuint int index, @GLuint int buffer, @GLintptr long offset, @GLsizeiptr long size); + + void glBindBufferBase(@GLenum int target, @GLuint int index, @GLuint int buffer); + + void glTransformFeedbackVaryings(@GLuint int program, @GLsizei int count, + @Const @NullTerminated("count") @GLchar @PointerArray("count") ByteBuffer varyings, + @GLenum int bufferMode); + + @Alternate("glTransformFeedbackVaryings") + void glTransformFeedbackVaryings(@GLuint int program, @Constant("varyings.length") @GLsizei int count, + @Const @NullTerminated @PointerArray("count") CharSequence[] varyings, + @GLenum int bufferMode); + + void glGetTransformFeedbackVarying(@GLuint int program, @GLuint int index, @AutoSize("name") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + @Alternate("glGetTransformFeedbackVarying") + @GLreturn(value = "name", maxLength = "bufSize") + void glGetTransformFeedbackVarying2(@GLuint int program, @GLuint int index, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(name_length)") IntBuffer length, + @OutParameter @GLsizei @Check("1") IntBuffer size, + @OutParameter @GLenum @Check("1") IntBuffer type, + @OutParameter @GLchar ByteBuffer name); + + void glVertexAttribIPointer(@GLuint int index, int size, @GLenum int type, @GLsizei int stride, + @CachedReference(index = "index", name = "glVertexAttribPointer_buffer") + @BufferObject(BufferKind.ArrayVBO) + @Check + @Const + @GLbyte + @GLubyte + @GLshort + @GLushort + @GLint + @GLuint Buffer buffer); + + @StripPostfix("params") + void glGetVertexAttribIiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") IntBuffer params); + + @StripPostfix("params") + void glGetVertexAttribIuiv(@GLuint int index, @GLenum int pname, @OutParameter @Check("4") @GLuint IntBuffer params); + + @NoErrorCheck + void glVertexAttribI4i(@GLuint int index, int x, int y, int z, int w); + + @NoErrorCheck + void glVertexAttribI4ui(@GLuint int index, @GLuint int x, @GLuint int y, @GLuint int z, @GLuint int w); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4iv(@GLuint int index, @Check("4") @Const IntBuffer v); + + @NoErrorCheck + @StripPostfix("v") + void glVertexAttribI4uiv(@GLuint int index, @Check("4") @Const @GLuint IntBuffer v); + + @StripPostfix("params") + void glGetUniformuiv(@GLuint int program, int location, @OutParameter @Check @GLuint IntBuffer params); + + int glGetFragDataLocation(@GLuint int program, @NullTerminated @Const @GLchar ByteBuffer name); + + @Alternate("glGetFragDataLocation") + int glGetFragDataLocation(@GLuint int program, @NullTerminated CharSequence name); + + void glUniform1ui(int location, @GLuint int v0); + + void glUniform2ui(int location, @GLuint int v0, @GLuint int v1); + + void glUniform3ui(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2); + + void glUniform4ui(int location, @GLuint int v0, @GLuint int v1, @GLuint int v2, @GLuint int v3); + + @StripPostfix("value") + void glUniform1uiv(int location, @AutoSize("value") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform2uiv(int location, @AutoSize(value = "value", expression = " >> 1") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform3uiv(int location, @AutoSize(value = "value", expression = " / 3") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glUniform4uiv(int location, @AutoSize(value = "value", expression = " >> 2") @GLsizei int count, @Const @GLuint IntBuffer value); + + @StripPostfix("value") + void glClearBufferfv(@GLenum int buffer, int drawbuffer, @Const @Check("4") FloatBuffer value); + + @StripPostfix("value") + void glClearBufferiv(@GLenum int buffer, int drawbuffer, @Const @Check("4") IntBuffer value); + + @StripPostfix("value") + void glClearBufferuiv(@GLenum int buffer, int drawbuffer, @Const @Check("4") IntBuffer value); + + void glClearBufferfi(@GLenum int buffer, int drawbuffer, float depth, int stencil); + + String glGetStringi(@GLenum int name, @GLuint int index); + + void glCopyBufferSubData(@GLenum int readtarget, @GLenum int writetarget, @GLintptr long readoffset, @GLintptr long writeoffset, @GLsizeiptr long size); + + void glGetUniformIndices(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @NullTerminated("uniformIndices.remaining()") @GLchar @PointerArray("uniformCount") ByteBuffer uniformNames, + @OutParameter @GLuint IntBuffer uniformIndices); + + @Alternate("glGetUniformIndices") + void glGetUniformIndices(@GLuint int program, @Constant("uniformNames.length") @GLsizei int uniformCount, + @Const @NullTerminated @PointerArray("uniformCount") CharSequence[] uniformNames, + @OutParameter @Check("uniformNames.length") @GLuint IntBuffer uniformIndices); + + @StripPostfix("params") + void glGetActiveUniformsiv(@GLuint int program, @AutoSize("uniformIndices") @GLsizei int uniformCount, + @Const @GLuint IntBuffer uniformIndices, + @GLenum int pname, + @OutParameter @Check("uniformIndices.remaining()") @GLint IntBuffer params); + + @Alternate("glGetActiveUniformsiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformsiv(@GLuint int program, @Constant("1") @GLsizei int uniformCount, + @Constant(value = "MemoryUtil.getAddress(params.put(1, uniformIndex), 1)", keepParam = true) int uniformIndex, // Reuse params buffer + @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @Const @NullTerminated @GLchar ByteBuffer uniformBlockName); + + @Alternate("glGetUniformBlockIndex") + @GLuint + int glGetUniformBlockIndex(@GLuint int program, @NullTerminated CharSequence uniformBlockName); + + @StripPostfix("params") + void glGetActiveUniformBlockiv(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @Check(value = "16") @GLint IntBuffer params); + + @Alternate("glGetActiveUniformBlockiv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetActiveUniformBlockiv2(@GLuint int program, @GLuint int uniformBlockIndex, @GLenum int pname, + @OutParameter @GLint IntBuffer params); + + void glGetActiveUniformBlockName(@GLuint int program, @GLuint int uniformBlockIndex, @AutoSize("uniformBlockName") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + @Alternate("glGetActiveUniformBlockName") + @GLreturn(value = "uniformBlockName", maxLength = "bufSize") + void glGetActiveUniformBlockName2(@GLuint int program, @GLuint int uniformBlockIndex, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(uniformBlockName_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer uniformBlockName); + + void glUniformBlockBinding(@GLuint int program, @GLuint int uniformBlockIndex, @GLuint int uniformBlockBinding); + + void glDrawArraysInstanced(@GLenum int mode, int first, @GLsizei int count, @GLsizei int primcount); + + void glDrawElementsInstanced(@GLenum int mode, @AutoSize("indices") @GLsizei int count, @AutoType("indices") @GLenum int type, + @BufferObject(BufferKind.ElementVBO) + @Const + @GLubyte + @GLushort + @GLuint Buffer indices, @GLsizei int primcount); + + @PointerWrapper("GLsync") + GLSync glFenceSync(@GLenum int condition, @GLbitfield int flags); + + boolean glIsSync(@PointerWrapper("GLsync") GLSync sync); + + void glDeleteSync(@PointerWrapper("GLsync") GLSync sync); + + @GLenum + int glClientWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + void glWaitSync(@PointerWrapper("GLsync") GLSync sync, @GLbitfield int flags, @GLuint64 long timeout); + + @StripPostfix("data") + void glGetInteger64v(@GLenum int pname, @OutParameter @Check("1") @GLint64 LongBuffer data); + + @Alternate("glGetInteger64v") + @GLreturn("data") + @StripPostfix("data") + void glGetInteger64v2(@GLenum int pname, @OutParameter @GLint64 LongBuffer data); + + @StripPostfix("data") + @Optional(reason = "NV's 3.2 implementation does not expose this (last driver checked: 19?.??)") + void glGetInteger64i_v(@GLenum int value, @GLuint int index, @OutParameter @Check("4") @GLint64 LongBuffer data); + + @Alternate("glGetInteger64i_v") + @GLreturn("data") + @StripPostfix("data") + void glGetInteger64i_v2(@GLenum int value, @GLuint int index, @OutParameter @GLint64 LongBuffer data); + + @StripPostfix("values") + void glGetSynciv(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @AutoSize("values") @GLsizei int bufSize, + @OutParameter @GLsizei @Check(value = "1", canBeNull = true) IntBuffer length, + @OutParameter IntBuffer values); + + @Alternate("glGetSynciv") + @GLreturn("values") + @StripPostfix(value = "values", postfix = "v") + void glGetSynciv2(@PointerWrapper("GLsync") GLSync sync, @GLenum int pname, @Constant("1") @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("0L") IntBuffer length, + @OutParameter IntBuffer values); + + @StripPostfix("params") + void glGetBufferParameteri64v(@GLenum int target, @GLenum int pname, @OutParameter @Check("4") LongBuffer params); + + @Alternate("glGetBufferParameteri64v") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetBufferParameteri64v2(@GLenum int target, @GLenum int pname, @OutParameter LongBuffer params); + + void glGenSamplers(@AutoSize("samplers") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + @Alternate("glGenSamplers") + @GLreturn("samplers") + void glGenSamplers2(@Constant("1") @GLsizei int count, @OutParameter @GLuint IntBuffer samplers); + + void glDeleteSamplers(@AutoSize("samplers") @GLsizei int count, @Const @GLuint IntBuffer samplers); + + @Alternate("glDeleteSamplers") + void glDeleteSamplers(@Constant("1") @GLsizei int count, @Constant(value = "APIUtil.getInt(sampler)", keepParam = true) int sampler); + + boolean glIsSampler(@GLuint int sampler); + + void glBindSampler(@GLenum int unit, @GLuint int sampler); + + void glSamplerParameteri(@GLuint int sampler, @GLenum int pname, int param); + + void glSamplerParameterf(@GLuint int sampler, @GLenum int pname, float param); + + @StripPostfix("params") + void glSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const IntBuffer params); + + @StripPostfix("params") + void glSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @Const FloatBuffer params); + + @StripPostfix("params") + void glGetSamplerParameteriv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter IntBuffer params); + + @Alternate("glGetSamplerParameteriv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameteriv2(@GLuint int sampler, @GLenum int pname, @OutParameter IntBuffer params); + + @StripPostfix("params") + void glGetSamplerParameterfv(@GLuint int sampler, @GLenum int pname, @Check("4") @OutParameter FloatBuffer params); + + @Alternate("glGetSamplerParameterfv") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetSamplerParameterfv2(@GLuint int sampler, @GLenum int pname, @OutParameter FloatBuffer params); + + void glVertexAttribDivisor(@GLuint int index, @GLuint int divisor); + + void glBindTransformFeedback(@GLenum int target, @GLuint int id); + + void glDeleteTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @Const @GLuint IntBuffer ids); + + @Alternate("glDeleteTransformFeedbacks") + void glDeleteTransformFeedbacks(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(id)", keepParam = true) int id); + + void glGenTransformFeedbacks(@AutoSize("ids") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + @Alternate("glGenTransformFeedbacks") + @GLreturn("ids") + void glGenTransformFeedbacks2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer ids); + + boolean glIsTransformFeedback(@GLuint int id); + + void glPauseTransformFeedback(); + + void glResumeTransformFeedback(); + + void glGetProgramBinary(@GLuint int program, @AutoSize("binary") @GLsizei int bufSize, + @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @Check("1") @GLenum IntBuffer binaryFormat, + @OutParameter @GLvoid ByteBuffer binary); + + void glProgramBinary(@GLuint int program, @GLenum int binaryFormat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") @GLsizei int length); + + void glProgramParameteri(@GLuint int program, @GLenum int pname, int value); + + void glInvalidateFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments); + + void glInvalidateSubFramebuffer(@GLenum int target, + @AutoSize("attachments") @GLsizei int numAttachments, + @Const @GLenum IntBuffer attachments, + int x, int y, @GLsizei int width, @GLsizei int height); + + void glTexStorage2D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glTexStorage3D(@GLenum int target, @GLsizei int levels, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth); + + @StripPostfix("params") + void glGetInternalformativ(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @AutoSize("params") @GLsizei int bufSize, @OutParameter IntBuffer params); + + @Alternate("glGetInternalformativ") + @StripPostfix("params") + @GLreturn("params") + void glGetInternalformativ2(@GLenum int target, @GLenum int internalformat, + @GLenum int pname, @Constant("1") @GLsizei int bufSize, @OutParameter IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_multisampled_render_to_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_multisampled_render_to_texture.java new file mode 100644 index 0000000..8feac03 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_multisampled_render_to_texture.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface IMG_multisampled_render_to_texture { + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameteriv: */ + int GL_RENDERBUFFER_SAMPLES_IMG = 0x9133; + + /** Returned by CheckFramebufferStatus: */ + int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG = 0x9134; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * GetFloatv, and GetDoublev: + */ + int GL_MAX_SAMPLES_IMG = 0x9135; + + /** Accepted by the &lt;pname&gt; parameter of GetFramebufferAttachmentParameteriv: */ + int GL_TEXTURE_SAMPLES_IMG = 0x9136; + + void glRenderbufferStorageMultisampleIMG( + @GLenum int target, @GLsizei int samples, + @GLenum int internalformat, + @GLsizei int width, @GLsizei int height); + + void glFramebufferTexture2DMultisampleIMG( + @GLenum int target, @GLenum int attachment, + @GLenum int textarget, @GLuint int texture, + int level, @GLsizei int samples); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_program_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_program_binary.java new file mode 100644 index 0000000..ed9cbd4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_program_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface IMG_program_binary { + + /** Accepted by the &lt;binaryFormat&gt; parameter of ProgramBinaryOES: */ + int GL_SGX_PROGRAM_BINARY_IMG = 0x9130; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_read_format.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_read_format.java new file mode 100644 index 0000000..8aa389f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_read_format.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface IMG_read_format { + + /** Accepted by the &lt;format&gt; parameter of ReadPixels: */ + int GL_BGRA_IMG = 0x80E1, + GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG = 0x8365; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_shader_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_shader_binary.java new file mode 100644 index 0000000..d36bbf4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_shader_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface IMG_shader_binary { + + /** Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: */ + int GL_SGX_BINARY_IMG = 0x8C0A; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_texture_compression_pvrtc.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_texture_compression_pvrtc.java new file mode 100644 index 0000000..f583e34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/IMG_texture_compression_pvrtc.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface IMG_texture_compression_pvrtc { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2DARB + * and the &lt;format&gt; parameter of CompressedTexSubImage2DARB: + */ + int GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00, + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01, + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02, + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_debug.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_debug.java new file mode 100644 index 0000000..ea2feee --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_debug.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface KHR_debug { + + /** + * Tokens accepted by the &lt;target&gt; parameters of Enable, Disable, and + * IsEnabled: + */ + int GL_DEBUG_OUTPUT = 0x92E0, + GL_DEBUG_OUTPUT_SYNCHRONOUS = 0x8242; + + /** Returned by GetIntegerv when &lt;pname&gt; is CONTEXT_FLAGS: */ + int GL_CONTEXT_FLAG_DEBUG_BIT = 0x00000002; + + /** + * Tokens accepted by the &lt;value&gt; parameters of GetBooleanv, GetIntegerv, + * GetFloatv, GetDoublev and GetInteger64v: + */ + int GL_MAX_DEBUG_MESSAGE_LENGTH = 0x9143, + GL_MAX_DEBUG_LOGGED_MESSAGES = 0x9144, + GL_DEBUG_LOGGED_MESSAGES = 0x9145, + GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = 0x8243, + GL_MAX_DEBUG_GROUP_STACK_DEPTH = 0x826C, + GL_DEBUG_GROUP_STACK_DEPTH = 0x826D, + GL_MAX_LABEL_LENGTH = 0x82E8; + + /** Tokens accepted by the &lt;pname&gt; parameter of GetPointerv: */ + int GL_DEBUG_CALLBACK_FUNCTION = 0x8244, + GL_DEBUG_CALLBACK_USER_PARAM = 0x8245; + + /** + * Tokens accepted or provided by the &lt;source&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;sources&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SOURCE_API = 0x8246, + GL_DEBUG_SOURCE_WINDOW_SYSTEM = 0x8247, + GL_DEBUG_SOURCE_SHADER_COMPILER = 0x8248, + GL_DEBUG_SOURCE_THIRD_PARTY = 0x8249, + GL_DEBUG_SOURCE_APPLICATION = 0x824A, + GL_DEBUG_SOURCE_OTHER = 0x824B; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the &lt;types&gt; + * parameter of GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_ERROR = 0x824C, + GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = 0x824D, + GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = 0x824E, + GL_DEBUG_TYPE_PORTABILITY = 0x824F, + GL_DEBUG_TYPE_PERFORMANCE = 0x8250, + GL_DEBUG_TYPE_OTHER = 0x8251, + GL_DEBUG_TYPE_MARKER = 0x8268; + + /** + * Tokens accepted or provided by the &lt;type&gt; parameters of + * DebugMessageControl and DEBUGPROC, and the &lt;types&gt; parameter of + * GetDebugMessageLog: + */ + int GL_DEBUG_TYPE_PUSH_GROUP = 0x8269, + GL_DEBUG_TYPE_POP_GROUP = 0x826A; + + /** + * Tokens accepted or provided by the &lt;severity&gt; parameters of + * DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions, + * and the &lt;severities&gt; parameter of GetDebugMessageLog: + */ + int GL_DEBUG_SEVERITY_HIGH = 0x9146, + GL_DEBUG_SEVERITY_MEDIUM = 0x9147, + GL_DEBUG_SEVERITY_LOW = 0x9148, + GL_DEBUG_SEVERITY_NOTIFICATION = 0x826B; + + /** Returned by GetError: */ + int GL_STACK_UNDERFLOW = 0x0504, + GL_STACK_OVERFLOW = 0x0503; + + /** + * Tokens accepted or provided by the &lt;identifier&gt; parameters of + * ObjectLabel and GetObjectLabel: + */ + int GL_BUFFER = 0x82E0, + GL_SHADER = 0x82E1, + GL_PROGRAM = 0x82E2, + GL_QUERY = 0x82E3, + GL_PROGRAM_PIPELINE = 0x82E4, + GL_SAMPLER = 0x82E6, + GL_DISPLAY_LIST = 0x82E7; + + // ----------------------------- + + void glDebugMessageControl(@GLenum int source, + @GLenum int type, + @GLenum int severity, + @AutoSize(value = "ids", canBeNull = true) @GLsizei int count, + @Check(canBeNull = true) @Const @GLuint IntBuffer ids, + boolean enabled); + + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @AutoSize("buf") @GLsizei int length, + @Const @GLchar ByteBuffer buf); + + @Alternate("glDebugMessageInsert") + void glDebugMessageInsert(@GLenum int source, + @GLenum int type, + @GLuint int id, + @GLenum int severity, + @Constant("buf.length()") @GLsizei int length, + CharSequence buf); + + /** + * The {@code KHRDebugCallback.Handler} implementation passed to this method will be used for + * KHR_debug messages. If callback is null, any previously registered handler for the current + * thread will be unregistered and stop receiving messages. + * + * @param callback the callback function to use + */ + @Code( + // Create a GlobalRef to the callback object and register it with the current context. + javaBeforeNative = "\t\tlong userParam = callback == null ? 0 : CallbackUtil.createGlobalRef(callback.getHandler());\n" + + "\t\tCallbackUtil.registerContextCallbackKHR(userParam);" + ) + void glDebugMessageCallback(@PointerWrapper(value = "GLDEBUGPROC", canBeNull = true) KHRDebugCallback callback, + @Constant("userParam") @PointerWrapper("GLvoid *") long userParam); + + @GLuint + int glGetDebugMessageLog(@GLuint int count, + @AutoSize(value = "messageLog", canBeNull = true) @GLsizei int bufsize, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer sources, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer types, + @Check(value = "count", canBeNull = true) @GLuint IntBuffer ids, + @Check(value = "count", canBeNull = true) @GLenum IntBuffer severities, + @Check(value = "count", canBeNull = true) @GLsizei IntBuffer lengths, + @Check(canBeNull = true) @OutParameter @GLchar ByteBuffer messageLog); + + // Not really useful and a pain to implement in Java + // void glGetPointerv(@GLenum int pname, void** params); + + void glPushDebugGroup(@GLenum int source, @GLuint int id, @AutoSize("message") @GLsizei int length, + @Const @GLchar ByteBuffer message); + + @Alternate("glPushDebugGroup") + void glPushDebugGroup(@GLenum int source, @GLuint int id, @Constant("message.length()") @GLsizei int length, + CharSequence message); + + void glPopDebugGroup(); + + void glObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Alternate("glObjectLabel") + void glObjectLabel(@GLenum int identifier, @GLuint int name, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + void glGetObjectLabel(@GLenum int identifier, @GLuint int name, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Alternate("glGetObjectLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectLabel2(@GLenum int identifier, @GLuint int name, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize(value = "label", canBeNull = true) @GLsizei int length, + @Check(canBeNull = true) @Const @GLchar ByteBuffer label); + + @Alternate("glObjectPtrLabel") + void glObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @Constant("label.length()") @GLsizei int length, + CharSequence label); + + void glGetObjectPtrLabel(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @AutoSize("label") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + + @Alternate("glGetObjectPtrLabel") + @GLreturn(value = "label", maxLength = "bufSize") + void glGetObjectPtrLabel2(@PointerWrapper("GLvoid *") org.lwjgl.PointerWrapper ptr, @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(label_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer label); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_texture_compression_astc_ldr.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_texture_compression_astc_ldr.java new file mode 100644 index 0000000..b6fb69f --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/KHR_texture_compression_astc_ldr.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface KHR_texture_compression_astc_ldr { + + /** + * Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D, + * CompressedTexSubImage2D, TexStorage2D, TextureStorage2D, TexStorage3D, + * and TextureStorage3D: + */ + int GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0, + GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1, + GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2, + GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3, + GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4, + GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5, + GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6, + GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7, + GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8, + GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9, + GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA, + GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB, + GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC, + GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC, + GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_EGL_stream_consumer_external.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_EGL_stream_consumer_external.java new file mode 100644 index 0000000..1054e2c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_EGL_stream_consumer_external.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_EGL_stream_consumer_external { + + /** Accepted as a target in the &lt;target&gt; parameter of BindTexture: */ + int GL_TEXTURE_EXTERNAL_OES = 0x8D65; + + /** Returned in the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_EXTERNAL_OES = 0x8D66; + + /** Accepted as &lt;value&gt; in GetIntegerv() and GetFloatv() queries: */ + int GL_TEXTURE_BINDING_EXTERNAL_OES = 0x8D67; + + /** Accepted as &lt;value&gt; in GetTexParameter*() queries: */ + int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 0x8D68; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_coverage_sample.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_coverage_sample.java new file mode 100644 index 0000000..ce14ca6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_coverage_sample.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface NV_coverage_sample { + + /** + * Accepted by the &lt;attrib_list&gt; parameter of eglChooseConfig + * and eglCreatePbufferSurface, and by the &lt;attribute&gt; + * parameter of eglGetConfigAttrib: + */ + int EGL_COVERAGE_BUFFERS_NV = 0x30E0, + EGL_COVERAGE_SAMPLES_NV = 0x30E1; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT and the &lt;format&gt; parameter of ReadPixels: + */ + int GL_COVERAGE_COMPONENT_NV = 0x8522; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageEXT: + */ + int GL_COVERAGE_COMPONENT4_NV = 0x8523; + + /** Accepted by the &lt;operation&gt; parameter of CoverageOperationNV: */ + int GL_COVERAGE_ALL_FRAGMENTS_NV = 0x8524, + GL_COVERAGE_EDGE_FRAGMENTS_NV = 0x8525, + GL_COVERAGE_AUTOMATIC_NV = 0x8526; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv: + */ + int GL_COVERAGE_ATTACHMENT_NV = 0x8527; + + /** Accepted by the &lt;buf&gt; parameter of Clear: */ + int GL_COVERAGE_BUFFER_BIT_NV = 0x8000; + + /** Accepted by the &lt;pname&gt; parameter of GetIntegerv: */ + int GL_COVERAGE_BUFFERS_NV = 0x8528, + GL_COVERAGE_SAMPLES_NV = 0x8529; + + void glCoverageMaskNV(boolean mask); + + void glCoverageOperationNV(@GLenum int operation); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_depth_nonlinear.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_depth_nonlinear.java new file mode 100644 index 0000000..83663f4 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_depth_nonlinear.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_depth_nonlinear { + + /** + * Accepted as a valid sized internal format by all functions accepting + * sized internal formats with a base format of DEPTH_COMPONENT: + */ + int GL_DEPTH_COMPONENT16_NONLINEAR_NV = 0x8553; + + /** + * Accepted by the &lt;attrib_list&gt; parameter of eglChooseConfig, + * and by the &lt;attribute&gt; parameter of eglGetConfigAttrib: + */ + int EGL_DEPTH_ENCODING_NV = 0x30E2; + + /** + * Accepted as a value in the &lt;attrib_list&gt; parameter of eglChooseConfig + * and eglCreatePbufferSurface, and returned in the &lt;value&gt; parameter + * of eglGetConfigAttrib: + */ + int EGL_DEPTH_ENCODING_NONE_NV = 0, + EGL_DEPTH_ENCODING_NONLINEAR_NV = 0x30E3; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_buffers.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_buffers.java new file mode 100644 index 0000000..6550106 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_buffers.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.Constant; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; + +import java.nio.IntBuffer; + +public interface NV_draw_buffers { + + /** + * Accepted by the &lt;pname&gt; parameters of GetIntegerv, GetFloatv, + * and GetDoublev: + */ + int GL_MAX_DRAW_BUFFERS_NV = 0x8824, + GL_DRAW_BUFFER0_NV = 0x8825, + GL_DRAW_BUFFER1_NV = 0x8826, + GL_DRAW_BUFFER2_NV = 0x8827, + GL_DRAW_BUFFER3_NV = 0x8828, + GL_DRAW_BUFFER4_NV = 0x8829, + GL_DRAW_BUFFER5_NV = 0x882A, + GL_DRAW_BUFFER6_NV = 0x882B, + GL_DRAW_BUFFER7_NV = 0x882C, + GL_DRAW_BUFFER8_NV = 0x882D, + GL_DRAW_BUFFER9_NV = 0x882E, + GL_DRAW_BUFFER10_NV = 0x882F, + GL_DRAW_BUFFER11_NV = 0x8830, + GL_DRAW_BUFFER12_NV = 0x8831, + GL_DRAW_BUFFER13_NV = 0x8832, + GL_DRAW_BUFFER14_NV = 0x8833, + GL_DRAW_BUFFER15_NV = 0x8834; + + /** Accepted by the &lt;bufs&gt; parameter of DrawBuffersNV: */ + int GL_COLOR_ATTACHMENT0_NV = 0x8CE0, + GL_COLOR_ATTACHMENT1_NV = 0x8CE1, + GL_COLOR_ATTACHMENT2_NV = 0x8CE2, + GL_COLOR_ATTACHMENT3_NV = 0x8CE3, + GL_COLOR_ATTACHMENT4_NV = 0x8CE4, + GL_COLOR_ATTACHMENT5_NV = 0x8CE5, + GL_COLOR_ATTACHMENT6_NV = 0x8CE6, + GL_COLOR_ATTACHMENT7_NV = 0x8CE7, + GL_COLOR_ATTACHMENT8_NV = 0x8CE8, + GL_COLOR_ATTACHMENT9_NV = 0x8CE9, + GL_COLOR_ATTACHMENT10_NV = 0x8CEA, + GL_COLOR_ATTACHMENT11_NV = 0x8CEB, + GL_COLOR_ATTACHMENT12_NV = 0x8CEC, + GL_COLOR_ATTACHMENT13_NV = 0x8CED, + GL_COLOR_ATTACHMENT14_NV = 0x8CEE, + GL_COLOR_ATTACHMENT15_NV = 0x8CEF; + + void glDrawBuffersNV(@AutoSize("bufs") @GLsizei int n, @Const @GLenum IntBuffer bufs); + + @Alternate("glDrawBuffersNV") + void glDrawBuffersNV(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(buf)", keepParam = true) int buf); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_path.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_path.java new file mode 100644 index 0000000..3c26e56 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_path.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; + +public interface NV_draw_path { + + /** Accepted as the &lt;paramType&gt; parameter of PathParameterNV: */ + int GL_PATH_QUALITY_NV = 0x8ED8, + GL_FILL_RULE_NV = 0x8ED9, + GL_STROKE_CAP0_STYLE_NV = 0x8EE0, + GL_STROKE_CAP1_STYLE_NV = 0x8EE1, + GL_STROKE_CAP2_STYLE_NV = 0x8EE2, + GL_STROKE_CAP3_STYLE_NV = 0x8EE3, + GL_STROKE_JOIN_STYLE_NV = 0x8EE8, + GL_STROKE_MITER_LIMIT_NV = 0x8EE9; + + /** Values for the ILL_RULE_NV path parameter: */ + int GL_EVEN_ODD_NV = 0x8EF0, + GL_NON_ZERO_NV = 0x8EF1; + + /** Values for the CAP[0-3]_STYLE_NV path parameter: */ + int GL_CAP_BUTT_NV = 0x8EF4, + GL_CAP_ROUND_NV = 0x8EF5, + GL_CAP_SQUARE_NV = 0x8EF6, + GL_CAP_TRIANGLE_NV = 0x8EF7; + + /** Values for the JOIN_STYLE_NV path parameter: */ + int GL_JOIN_MITER_NV = 0x8EFC, + GL_JOIN_ROUND_NV = 0x8EFD, + GL_JOIN_BEVEL_NV = 0x8EFE, + GL_JOIN_CLIPPED_MITER_NV = 0x8EFF; + + /** Accepted as the &lt;target&gt; parameter of PathMatrixNV: */ + int GL_MATRIX_PATH_TO_CLIP_NV = 0x8F04, + GL_MATRIX_STROKE_TO_PATH_NV = 0x8F05, + GL_MATRIX_PATH_COORD0_NV = 0x8F08, + GL_MATRIX_PATH_COORD1_NV = 0x8F09, + GL_MATRIX_PATH_COORD2_NV = 0x8F0A, + GL_MATRIX_PATH_COORD3_NV = 0x8F0B; + + /** Accepted as the &lt;mode&gt; parameter of DrawPathbufferNV: */ + int GL_FILL_PATH_NV = 0x8F18, + GL_STROKE_PATH_NV = 0x8F19; + + /** Accepted as path commands by CreatePathNV: */ + byte GL_MOVE_TO_NV = 0x00, + GL_LINE_TO_NV = 0x01, + GL_QUADRATIC_BEZIER_TO_NV = 0x02, + GL_CUBIC_BEZIER_TO_NV = 0x03, + GL_START_MARKER_NV = 0x20, + GL_CLOSE_NV = 0x21, + GL_STROKE_CAP0_NV = 0x40, + GL_STROKE_CAP1_NV = 0x41, + GL_STROKE_CAP2_NV = 0x42, + GL_STROKE_CAP3_NV = 0x43; + + @GLuint + int glCreatePathNV(@GLenum int datatype, @AutoSize("commands") @GLsizei int numCommands, @Const @GLubyte ByteBuffer commands); + + void glDeletePathNV(@GLuint int path); + + void glPathVerticesNV(@GLuint int path, @Const @Check @GLvoid ByteBuffer vertices); + + void glPathParameterfNV(@GLuint int path, @GLenum int paramType, float param); + + void glPathParameteriNV(@GLuint int path, @GLenum int paramType, int param); + + @GLuint + int glCreatePathProgramNV(); + + void glPathMatrixNV(@GLenum int target, @Const @Check("16") FloatBuffer value); + + void glDrawPathNV(@GLuint int path, @GLenum int mode); + + @GLuint + int glCreatePathbufferNV(@GLsizei int capacity); + + void glDeletePathbufferNV(@GLuint int buffer); + + void glPathbufferPathNV(@GLuint int buffer, int index, @GLuint int path); + + void glPathbufferPositionNV(@GLuint int buffer, int index, float x, float y); + + void glDrawPathbufferNV(@GLuint int buffer, @GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_texture.java new file mode 100644 index 0000000..cd22e66 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_draw_texture.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLfloat; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface NV_draw_texture { + + void glDrawTextureNV(@GLuint int texture, @GLuint int sampler, + @GLfloat float x0, @GLfloat float y0, + @GLfloat float x1, @GLfloat float y1, + @GLfloat float z, + @GLfloat float s0, @GLfloat float t0, + @GLfloat float s1, @GLfloat float t1); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fbo_color_attachments.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fbo_color_attachments.java new file mode 100644 index 0000000..3ec8062 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fbo_color_attachments.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_fbo_color_attachments { + + int GL_MAX_COLOR_ATTACHMENTS_NV = 0x8CDF, + GL_COLOR_ATTACHMENT0_NV = 0x8CE0, + GL_COLOR_ATTACHMENT1_NV = 0x8CE1, + GL_COLOR_ATTACHMENT2_NV = 0x8CE2, + GL_COLOR_ATTACHMENT3_NV = 0x8CE3, + GL_COLOR_ATTACHMENT4_NV = 0x8CE4, + GL_COLOR_ATTACHMENT5_NV = 0x8CE5, + GL_COLOR_ATTACHMENT6_NV = 0x8CE6, + GL_COLOR_ATTACHMENT7_NV = 0x8CE7, + GL_COLOR_ATTACHMENT8_NV = 0x8CE8, + GL_COLOR_ATTACHMENT9_NV = 0x8CE9, + GL_COLOR_ATTACHMENT10_NV = 0x8CEA, + GL_COLOR_ATTACHMENT11_NV = 0x8CEB, + GL_COLOR_ATTACHMENT12_NV = 0x8CEC, + GL_COLOR_ATTACHMENT13_NV = 0x8CED, + GL_COLOR_ATTACHMENT14_NV = 0x8CEE, + GL_COLOR_ATTACHMENT15_NV = 0x8CEF; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fence.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fence.java new file mode 100644 index 0000000..8f7eca6 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_fence.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface NV_fence { + + /** Accepted by the &lt;condition&gt; parameter of SetFenceNV: */ + int GL_ALL_COMPLETED_NV = 0x84F2; + + /** Accepted by the &lt;pname&gt; parameter of GetFenceivNV: */ + int GL_FENCE_STATUS_NV = 0x84F3, + GL_FENCE_CONDITION_NV = 0x84F4; + + void glGenFencesNV(@AutoSize("fences") @GLsizei int n, @OutParameter @GLuint IntBuffer fences); + + @Alternate("glGenFencesNV") + @GLreturn("fences") + void glGenFencesNV2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer fences); + + void glDeleteFencesNV(@AutoSize("fences") @GLsizei int n, @Const @GLuint IntBuffer fences); + + @Alternate("glDeleteFencesNV") + void glDeleteFencesNV(@Constant("1") @GLsizei int n, @Const @GLuint @Constant(value = "APIUtil.getInt(fence)", keepParam = true) int fence); + + void glSetFenceNV(@GLuint int fence, @GLenum int condition); + + boolean glTestFenceNV(@GLuint int fence); + + void glFinishFenceNV(@GLuint int fence); + + boolean glIsFenceNV(@GLuint int fence); + + void glGetFenceivNV(@GLuint int fence, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_framebuffer_vertex_attrib_array.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_framebuffer_vertex_attrib_array.java new file mode 100644 index 0000000..0a7101c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_framebuffer_vertex_attrib_array.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.*; + +public interface NV_framebuffer_vertex_attrib_array { + + int GL_FRAMEBUFFER_ATTACHABLE_NV = 0x852A, + GL_VERTEX_ATTRIB_ARRAY_NV = 0x852B, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_SIZE_NV = 0x852C, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_TYPE_NV = 0x852D, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_NORMALIZED_NV = 0x852E, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_OFFSET_NV = 0x852F, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_WIDTH_NV = 0x8530, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_STRIDE_NV = 0x8531, + GL_FRAMEBUFFER_ATTACHMENT_VERTEX_ATTRIB_ARRAY_HEIGHT_NV = 0x8532; + + void glFramebufferVertexAttribArrayNV(@GLenum int target, @GLenum int attachment, + @GLenum int buffertarget, @GLuint int bufferobject, + @GLint int size, @GLenum int type, @GLboolean boolean normalized, @GLintptr long offset, + @GLsizeiptr long width, @GLsizeiptr long height, @GLsizei int stride); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_get_tex_image.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_get_tex_image.java new file mode 100644 index 0000000..371dd94 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_get_tex_image.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Alternate; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.StripPostfix; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +public interface NV_get_tex_image { + + int GL_TEXTURE_WIDTH_NV = 0x1000, + GL_TEXTURE_HEIGHT_NV = 0x1001, + GL_TEXTURE_INTERNAL_FORMAT_NV = 0x1003, + GL_TEXTURE_COMPONENTS_NV = GL_TEXTURE_INTERNAL_FORMAT_NV, + GL_TEXTURE_BORDER_NV = 0x1005, + GL_TEXTURE_RED_SIZE_NV = 0x805C, + GL_TEXTURE_GREEN_SIZE_NV = 0x805D, + GL_TEXTURE_BLUE_SIZE_NV = 0x805E, + GL_TEXTURE_ALPHA_SIZE_NV = 0x805F, + GL_TEXTURE_LUMINANCE_SIZE_NV = 0x8060, + GL_TEXTURE_INTENSITY_SIZE_NV = 0x8061, + GL_TEXTURE_DEPTH_NV = 0x8071, + GL_TEXTURE_COMPRESSED_IMAGE_SIZE_NV = 0x86A0, + GL_TEXTURE_COMPRESSED_NV = 0x86A1, + GL_TEXTURE_DEPTH_SIZE_NV = 0x884A; + + void glGetTexImageNV(@GLenum int target, @GLint int level, @GLenum int format, @GLenum int type, + @OutParameter + @Check("GLChecks.calculateImageStorage(img, format, type, 1, 1, 1)") + @GLbyte + @GLshort + @GLint + @GLfloat Buffer img); + + void glGetCompressedTexImageNV(@GLenum int target, @GLint int level, @OutParameter @Check @GLvoid ByteBuffer img); + + @StripPostfix("params") + void glGetTexLevelParameterfvNV(@GLenum int target, @GLint int level, @GLenum int pname, @OutParameter @Check("1") @GLfloat FloatBuffer params); + + @Alternate("glGetTexLevelParameterfvNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexLevelParameterfvNV2(@GLenum int target, @GLint int level, @GLenum int pname, @OutParameter @GLfloat FloatBuffer params); + + @StripPostfix("params") + void glGetTexLevelParameterivNV(@GLenum int target, @GLint int level, @GLenum int pname, @OutParameter @Check("1") @GLint IntBuffer params); + + @Alternate("glGetTexLevelParameterivNV") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetTexLevelParameterivNV2(@GLenum int target, @GLint int level, @GLenum int pname, @OutParameter @GLint IntBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_platform_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_platform_binary.java new file mode 100644 index 0000000..9e409e1 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_platform_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_platform_binary { + + /** Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: */ + int GL_NVIDIA_PLATFORM_BINARY_NV = 0x890B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_buffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_buffer.java new file mode 100644 index 0000000..6d577bc --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_buffer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface NV_read_buffer { + + int GL_READ_BUFFER_NV = 0x0C02, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_NV = 0x8CDC; + + void glReadBufferNV(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_depth_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_depth_stencil.java new file mode 100644 index 0000000..f3f8585 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_read_depth_stencil.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_read_depth_stencil { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_shader_framebuffer_fetch.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_shader_framebuffer_fetch.java new file mode 100644 index 0000000..7df7a34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_shader_framebuffer_fetch.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_shader_framebuffer_fetch { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_system_time.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_system_time.java new file mode 100644 index 0000000..3fa5724 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_system_time.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.EGLuint64NV; + +public interface NV_system_time { + + @EGLuint64NV + long glGetSystemTimeFrequencyNV(); + + @EGLuint64NV + long glGetSystemTimeNV(); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_compression_s3tc_update.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_compression_s3tc_update.java new file mode 100644 index 0000000..d44c540 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_compression_s3tc_update.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_texture_compression_s3tc_update { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_npot_2D_mipmap.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_npot_2D_mipmap.java new file mode 100644 index 0000000..1451ed7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/NV_texture_npot_2D_mipmap.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface NV_texture_npot_2D_mipmap { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image.java new file mode 100644 index 0000000..4ce3435 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface OES_EGL_image { + + void glEGLImageTargetTexture2DOES(@GLenum int target, @PointerWrapper("GLeglImageOES") EGLImageOES image); + + void glEGLImageTargetRenderbufferStorageOES(@GLenum int target, @PointerWrapper("GLeglImageOES") EGLImageOES image); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image_external.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image_external.java new file mode 100644 index 0000000..298750e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_image_external.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.PointerWrapper; +import org.lwjgl.util.generator.opengl.GLenum; + +public interface OES_EGL_image_external { + + /** + * Accepted as a target in the &lt;target&gt; parameter of BindTexture and + * EGLImageTargetTexture2DOES: + */ + int GL_TEXTURE_EXTERNAL_OES = 0x8D65; + + /** Returned in the &lt;type&gt; parameter of GetActiveUniform: */ + int GL_SAMPLER_EXTERNAL_OES = 0x8D66; + + /** Accepted as &lt;value&gt; in GetIntegerv() and GetFloatv() queries: */ + int GL_TEXTURE_BINDING_EXTERNAL_OES = 0x8D67; + + /** Accepted as &lt;value&gt; in GetTexParameter*() queries: */ + int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 0x8D68; + + void glEGLImageTargetTexture2DOES(@GLenum int target, @PointerWrapper("GLeglImageOES") EGLImageOES image); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_sync.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_sync.java new file mode 100644 index 0000000..15aa271 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_EGL_sync.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Alias; + +@Alias("OES_egl_sync") +public interface OES_EGL_sync { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_equation_separate.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_equation_separate.java new file mode 100644 index 0000000..dbc5fe7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_equation_separate.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface OES_blend_equation_separate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_BLEND_EQUATION_RGB_OES = 0x8009, + GL_BLEND_EQUATION_ALPHA_OES = 0x883D; + + void glBlendEquationSeparateOES(@GLenum int modeRGB, @GLenum int modeAlpha); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_func_separate.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_func_separate.java new file mode 100644 index 0000000..b5e2478 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_func_separate.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface OES_blend_func_separate { + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_BLEND_DST_RGB_OES = 0x80C8, + BLEND_SRC_RGB_OES = 0x80C9, + BLEND_DST_ALPHA_OES = 0x80CA, + BLEND_SRC_ALPHA_OES = 0x80CB; + + void glBlendFuncSeparateOES(@GLenum int sfactorRGB, + @GLenum int dfactorRGB, + @GLenum int sfactorAlpha, + @GLenum int dfactorAlpha); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_subtract.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_subtract.java new file mode 100644 index 0000000..4cb2574 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_blend_subtract.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLenum; + +public interface OES_blend_subtract { + + /** Accepted by the &lt;mode&gt; parameter of BlendEquationOES: */ + int GL_FUNC_ADD_OES = 0x8006, + GL_FUNC_SUBTRACT_OES = 0x800A, + GL_FUNC_REVERSE_SUBTRACT_OES = 0x800B; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + int GL_BLEND_EQUATION_OES = 0x8009; + + void glBlendEquationOES(@GLenum int mode); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_ETC1_RGB8_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_ETC1_RGB8_texture.java new file mode 100644 index 0000000..4f56125 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_ETC1_RGB8_texture.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_compressed_ETC1_RGB8_texture { + + /** Accepted by the &lt;internalformat&gt; parameter of CompressedTexImage2D: */ + int GL_ETC1_RGB8_OES = 0x8D64; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_paletted_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_paletted_texture.java new file mode 100644 index 0000000..cb627d7 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_compressed_paletted_texture.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_compressed_paletted_texture { + + /** Accepted by the &lt;internalformat&gt; paramter of CompressedTexImage2D */ + int GL_PALETTE4_RGB8_OES = 0x8B90, + GL_PALETTE4_RGBA8_OES = 0x8B91, + GL_PALETTE4_R5_G6_B5_OES = 0x8B92, + GL_PALETTE4_RGBA4_OES = 0x8B93, + GL_PALETTE4_RGB5_A1_OES = 0x8B94, + GL_PALETTE8_RGB8_OES = 0x8B95, + GL_PALETTE8_RGBA8_OES = 0x8B96, + GL_PALETTE8_R5_G6_B5_OES = 0x8B97, + GL_PALETTE8_RGBA4_OES = 0x8B98, + GL_PALETTE8_RGB5_A1_OES = 0x8B99; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth24.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth24.java new file mode 100644 index 0000000..7fc3b67 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth24.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_depth24 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_DEPTH_COMPONENT24_OES = 0x81A6; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth32.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth32.java new file mode 100644 index 0000000..18f5c1a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth32.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_depth32 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_DEPTH_COMPONENT32_OES = 0x81A7; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth_texture.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth_texture.java new file mode 100644 index 0000000..1f2234c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_depth_texture.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_depth_texture { + + /** + * Accepted by the &lt;format&gt; parameter of TexImage2D and TexSubImage2D and + * &lt;internalFormat&gt; parameter of TexImage2D: + */ + int GL_DEPTH_COMPONENT = 0x1902; + + /** Accepted by the &lt;type&gt; parameter of TexImage2D, TexSubImage2D: */ + int GL_UNSIGNED_SHORT = 0x1403, + GL_UNSIGNED_INT = 0x1405; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_element_index_uint.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_element_index_uint.java new file mode 100644 index 0000000..b01f497 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_element_index_uint.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_element_index_uint { + + /** Accepted by the &lt;type&gt; parameter of DrawElements: */ + int GL_UNSIGNED_INT = 0x1405; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_fbo_render_mipmap.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_fbo_render_mipmap.java new file mode 100644 index 0000000..9328494 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_fbo_render_mipmap.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_fbo_render_mipmap { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_framebuffer_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_framebuffer_object.java new file mode 100644 index 0000000..22d1523 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_framebuffer_object.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface OES_framebuffer_object { + + /** + * Accepted by the &lt;target&gt; parameter of BindFramebufferOES, + * CheckFramebufferStatusOES, FramebufferTexture{2D|3D}OES, + * FramebufferRenderbufferOES, and + * GetFramebufferAttachmentParameterivOES: + */ + int GL_FRAMEBUFFER_OES = 0x8D40; + + /** + * Accepted by the &lt;target&gt; parameter of BindRenderbufferOES, + * RenderbufferStorageOES, and GetRenderbufferParameterivOES, and + * returned by GetFramebufferAttachmentParameterivOES: + */ + int GL_RENDERBUFFER_OES = 0x8D41; + + /** + * Accepted by the &lt;internalformat&gt; parameter of + * RenderbufferStorageOES: + */ + int GL_DEPTH_COMPONENT16_OES = 0x81A5, + GL_RGBA4_OES = 0x8056, + GL_RGB5_A1_OES = 0x8057, + GL_RGB565_OES = 0x8D62, + GL_STENCIL_INDEX1_OES = 0x8D46, + GL_STENCIL_INDEX4_OES = 0x8D47, + GL_STENCIL_INDEX8_OES = 0x8D48; + + /** Accepted by the &lt;pname&gt; parameter of GetRenderbufferParameterivOES: */ + int GL_RENDERBUFFER_WIDTH_OES = 0x8D42, + GL_RENDERBUFFER_HEIGHT_OES = 0x8D43, + GL_RENDERBUFFER_INTERNAL_FORMAT_OES = 0x8D44, + GL_RENDERBUFFER_RED_SIZE_OES = 0x8D50, + GL_RENDERBUFFER_GREEN_SIZE_OES = 0x8D51, + GL_RENDERBUFFER_BLUE_SIZE_OES = 0x8D52, + GL_RENDERBUFFER_ALPHA_SIZE_OES = 0x8D53, + GL_RENDERBUFFER_DEPTH_SIZE_OES = 0x8D54, + GL_RENDERBUFFER_STENCIL_SIZE_OES = 0x8D55; + + /** + * Accepted by the &lt;pname&gt; parameter of + * GetFramebufferAttachmentParameterivOES: + */ + int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES = 0x8CD0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES = 0x8CD1, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES = 0x8CD2, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES = 0x8CD3, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES = 0x8CD4; + + /** + * Accepted by the &lt;attachment&gt; parameter of + * FramebufferTexture{2D|3D}OES, FramebufferRenderbufferOES, and + * GetFramebufferAttachmentParameterivOES + */ + int GL_COLOR_ATTACHMENT0_OES = 0x8CE0, + GL_DEPTH_ATTACHMENT_OES = 0x8D00, + GL_STENCIL_ATTACHMENT_OES = 0x8D20; + + /** + * Returned by GetFramebufferAttachmentParameterivOES when the + * &lt;pname&gt; parameter is FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES: + */ + int GL_NONE_OES = 0; + + /** Returned by CheckFramebufferStatusOES(): */ + int GL_FRAMEBUFFER_COMPLETE_OES = 0x8CD5, + GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES = 0x8CD6, + GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES = 0x8CD7, + GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES = 0x8CD9, + GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES = 0x8CDA, + GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES = 0x8CDB, + GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES = 0x8CDC, + GL_FRAMEBUFFER_UNSUPPORTED_OES = 0x8CDD; + + /** Accepted by GetIntegerv(): */ + int GL_FRAMEBUFFER_BINDING_OES = 0x8CA6, + GL_RENDERBUFFER_BINDING_OES = 0x8CA7, + GL_MAX_RENDERBUFFER_SIZE_OES = 0x84E8; + + /** Returned by GetError(): */ + int GL_INVALID_FRAMEBUFFER_OPERATION_OES = 0x0506; + + boolean glIsRenderbufferOES(@GLuint int renderbuffer); + + void glBindRenderbufferOES(@GLenum int target, @GLuint int renderbuffer); + + void glDeleteRenderbuffersOES(@AutoSize("renderbuffers") int n, @Const @GLuint IntBuffer renderbuffers); + + @Alternate("glDeleteRenderbuffersOES") + void glDeleteRenderbuffersOES(@Constant("1") int n, @Constant(value = "APIUtil.getInt(renderbuffer)", keepParam = true) int renderbuffer); + + void glGenRenderbuffersOES(@AutoSize("renderbuffers") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + @Alternate("glGenRenderbuffersOES") + @GLreturn("renderbuffers") + void glGenRenderbuffersOES2(@Constant("1") int n, @OutParameter @GLuint IntBuffer renderbuffers); + + void glRenderbufferStorageOES(@GLenum int target, @GLenum int internalformat, @GLsizei int width, @GLsizei int height); + + @StripPostfix("params") + void glGetRenderbufferParameterivOES(@GLenum int target, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetRenderbufferParameteriOES} instead. */ + @Alternate("glGetRenderbufferParameterivOES") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "OESFramebufferObject", method = "glGetRenderbufferParameteriOES") + @Deprecated + void glGetRenderbufferParameterivOES2(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetRenderbufferParameterivOES") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetRenderbufferParameterivOES3(@GLenum int target, @GLenum int pname, @OutParameter IntBuffer params); + + boolean glIsFramebufferOES(@GLuint int framebuffer); + + void glBindFramebufferOES(@GLenum int target, @GLuint int framebuffer); + + void glDeleteFramebuffersOES(@AutoSize("framebuffers") int n, @Const @GLuint IntBuffer framebuffers); + + @Alternate("glDeleteFramebuffersOES") + void glDeleteFramebuffersOES(@Constant("1") int n, @Constant(value = "APIUtil.getInt(framebuffer)", keepParam = true) int framebuffer); + + void glGenFramebuffersOES(@AutoSize("framebuffers") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @Alternate("glGenFramebuffersOES") + @GLreturn("framebuffers") + void glGenFramebuffersOES2(@Constant("1") int n, @OutParameter @GLuint IntBuffer framebuffers); + + @GLenum + int glCheckFramebufferStatusOES(@GLenum int target); + + void glFramebufferTexture2DOES(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level); + + void glFramebufferRenderbufferOES(@GLenum int target, @GLenum int attachment, @GLenum int renderbuffertarget, @GLuint int renderbuffer); + + @StripPostfix("params") + void glGetFramebufferAttachmentParameterivOES(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + /** @deprecated Will be removed in 3.0. Use {@link #glGetFramebufferAttachmentParameteriOES} instead. */ + @Alternate("glGetFramebufferAttachmentParameterivOES") + @GLreturn("params") + @StripPostfix("params") + @Reuse(value = "OESFramebufferObject", method = "glGetFramebufferAttachmentParameteriOES") + @Deprecated + void glGetFramebufferAttachmentParameterivOES2(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + @Alternate("glGetFramebufferAttachmentParameterivOES") + @GLreturn("params") + @StripPostfix(value = "params", postfix = "v") + void glGetFramebufferAttachmentParameterivOES3(@GLenum int target, @GLenum int attachment, @GLenum int pname, @OutParameter IntBuffer params); + + void glGenerateMipmapOES(@GLenum int target); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_get_program_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_get_program_binary.java new file mode 100644 index 0000000..4268d1d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_get_program_binary.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface OES_get_program_binary { + + /** Accepted by the &lt;pname&gt; parameter of GetProgramiv: */ + int GL_PROGRAM_BINARY_LENGTH_OES = 0x8741; + + /** + * Accepted by the &lt;pname&lt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_NUM_PROGRAM_BINARY_FORMATS_OES = 0x87FE, + GL_PROGRAM_BINARY_FORMATS_OES = 0x87FF; + + void glGetProgramBinaryOES(@GLuint int program, @AutoSize("binary") @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @Check("1") @GLenum IntBuffer binaryFormat, + @OutParameter @GLvoid ByteBuffer binary); + + void glProgramBinaryOES(@GLuint int program, @GLenum int binaryFormat, @Const @GLvoid ByteBuffer binary, @AutoSize("binary") int length); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_mapbuffer.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_mapbuffer.java new file mode 100644 index 0000000..b954605 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_mapbuffer.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLvoid; + +import java.nio.ByteBuffer; + +public interface OES_mapbuffer { + + /** Accepted by the &lt;access&gt; parameter of MapBufferOES: */ + int GL_WRITE_ONLY_OES = 0x88B9; + + /** Accepted by the &lt;value&gt; parameter of GetBufferParameteriv: */ + int GL_BUFFER_ACCESS_OES = 0x88BB, + GL_BUFFER_MAPPED_OES = 0x88BC; + + /** Accepted by the &lt;pname&gt; parameter of GetBufferPointervOES: */ + int GL_BUFFER_MAP_POINTER_OES = 0x88BD; + + @StripPostfix("pointer") + @CachedResult + @AutoSize("GLChecks.getBufferObjectSize(target)") + void glGetBufferPointervOES(@GLenum int target, @GLenum int pname, @OutParameter @Result @GLvoid ByteBuffer pointer); + + /** + * glMapBufferOES maps a GL buffer object to a ByteBuffer. The old_buffer argument can be null, + * in which case a new ByteBuffer will be created, pointing to the returned memory. If old_buffer is non-null, + * it will be returned if it points to the same mapped memory and has the same capacity as the buffer object, + * otherwise a new ByteBuffer is created. That way, an application will normally use glMapBuffer like this: + * <p/> + * ByteBuffer mapped_buffer; mapped_buffer = glMapBufferOES(..., ..., null); ... // Another map on the same buffer mapped_buffer = glMapBufferOES(..., ..., mapped_buffer); + * <p/> + * Only ByteBuffers returned from this method are to be passed as the old_buffer argument. User-created ByteBuffers cannot be reused. + * <p/> + * The version of this method without an explicit length argument calls glGetBufferParameter internally to + * retrieve the current buffer object size, which may cause a pipeline flush and reduce application performance. + * <p/> + * The version of this method with an explicit length argument is a fast alternative to the one without. No GL call + * is made to retrieve the buffer object size, so the user is responsible for tracking and using the appropriate length.<br> + * Security warning: The length argument should match the buffer object size. Reading from or writing to outside + * the memory region that corresponds to the mapped buffer object will cause native crashes. + * + * @param old_buffer A ByteBuffer. If this argument points to the same address and has the same capacity as the new mapping, it will be returned and no new buffer will be created. + * + * @return A ByteBuffer representing the mapped buffer memory. + */ + @CachedResult + @GLvoid + @AutoSize("GLChecks.getBufferObjectSize(target)") + ByteBuffer glMapBufferOES(@GLenum int target, @GLenum int access); + + boolean glUnmapBufferOES(@GLenum int target); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_packed_depth_stencil.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_packed_depth_stencil.java new file mode 100644 index 0000000..1b79d3c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_packed_depth_stencil.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_packed_depth_stencil { + + /** + * Accepted by the &lt;format&gt; parameter of TexImage2D and TexSubImage2D and by the + * &lt;internalformat&gt; parameter of TexImage2D: + */ + int GL_DEPTH_STENCIL_OES = 0x84F9; + + /** Accepted by the &lt;type&gt; parameter of TexImage2D and TexSubImage2D: */ + int GL_UNSIGNED_INT_24_8_OES = 0x84FA; + + /** + * Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorage, and + * returned in the &lt;params&gt; parameter of GetRenderbufferParameteriv when + * &lt;pname&gt; is RENDERBUFFER_INTERNAL_FORMAT: + */ + int GL_DEPTH24_STENCIL8_OES = 0x88F0; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_required_internalformat.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_required_internalformat.java new file mode 100644 index 0000000..7d2d89e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_required_internalformat.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_required_internalformat { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_rgb8_rgba8.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_rgb8_rgba8.java new file mode 100644 index 0000000..f1c42b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_rgb8_rgba8.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Extension; + +@Extension(postfix = "OES", className = "OESRGB8RGBA8") +public interface OES_rgb8_rgba8 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_RGB8_OES = 0x8051, + GL_RGBA8_OES = 0x8058; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_standard_derivatives.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_standard_derivatives.java new file mode 100644 index 0000000..d15b28b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_standard_derivatives.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_standard_derivatives { + + /** + * Accepted by the &lt;target&gt; parameter of Hint and by the &lt;pname&gt; parameter of + * GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: + */ + int GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil1.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil1.java new file mode 100644 index 0000000..31f865b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil1.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_stencil1 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_STENCIL_INDEX1_OES = 0x8D46; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil4.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil4.java new file mode 100644 index 0000000..1e2c31b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil4.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_stencil4 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_STENCIL_INDEX4_OES = 0x8D47; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil8.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil8.java new file mode 100644 index 0000000..35f5404 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_stencil8.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_stencil8 { + + /** Accepted by the &lt;internalformat&gt; parameter of RenderbufferStorageOES: */ + int GL_STENCIL_INDEX8_OES = 0x8D48; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_surfaceless_context.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_surfaceless_context.java new file mode 100644 index 0000000..e864f6a --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_surfaceless_context.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2012 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_surfaceless_context { + + /** Returned by glCheckFramebufferStatusOES and glCheckFramebufferStatus: */ + int GL_FRAMEBUFFER_UNDEFINED_OES = 0x8219; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_3D.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_3D.java new file mode 100644 index 0000000..3682759 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_3D.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.Const; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public interface OES_texture_3D { + + /** + * Accepted by the &lt;target&gt; parameter of TexImage3DOES, TexSubImage3DOES, + * CopyTexSubImage3DOES, CompressedTexImage3DOES and + * CompressedTexSubImage3DOES, GetTexParameteriv, and GetTexParameterfv: + */ + int GL_TEXTURE_3D_OES = 0x806F; + + /** + * Accepted by the &lt;pname&gt; parameter of TexParameteriv, TexParameterfv, + * GetTexParameteriv, and GetTexParameterfv: + */ + int GL_TEXTURE_WRAP_R_OES = 0x8072; + + /** + * Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, and + * GetFloatv: + */ + int GL_MAX_3D_TEXTURE_SIZE_OES = 0x8073, + GL_TEXTURE_BINDING_3D_OES = 0x806A; + + void glTexImage3DOES(@GLenum int target, int level, + @GLenum int internalFormat, @GLsizei int width, @GLsizei int height, @GLsizei int depth, int border, + @GLenum int format, @GLenum int type, + @Check(value = "GLChecks.calculateTexImage3DStorage(pixels, format, type, width, height, depth)", canBeNull = true) + @Const @GLbyte @GLshort @GLint @GLfloat Buffer pixels); + + void glTexSubImage3DOES(@GLenum int target, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @GLenum int type, + @Check("GLChecks.calculateImageStorage(pixels, format, type, width, height, depth)") + @Const @GLbyte @GLshort @GLint @GLfloat Buffer pixels); + + void glCopyTexSubImage3DOES(@GLenum int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, @GLsizei int width, @GLsizei int height); + + void glCompressedTexImage3DOES(@GLenum int target, int level, @GLenum int internalformat, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + int border, @GLsizei int imageSize, + @Check @Const @GLvoid ByteBuffer data); + + void glCompressedTexSubImage3DOES(@GLenum int target, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @GLsizei int imageSize, + @Check @Const @GLvoid ByteBuffer data); + + void glFramebufferTexture3DOES(@GLenum int target, @GLenum int attachment, @GLenum int textarget, @GLuint int texture, int level, int zoffset); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float.java new file mode 100644 index 0000000..8b20480 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_texture_float { +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float_linear.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float_linear.java new file mode 100644 index 0000000..a6f5c34 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_float_linear.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_texture_float_linear { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float.java new file mode 100644 index 0000000..75e7880 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_texture_half_float { + + /** + * Accepted by the &lt;type&gt; parameter of TexImage2D, TexSubImage2D, + * TexImage3D, and TexSubImage3D: + */ + int GL_HALF_FLOAT_OES = 0x8D61; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float_linear.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float_linear.java new file mode 100644 index 0000000..e8a22d9 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_half_float_linear.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_texture_half_float_linear { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_npot.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_npot.java new file mode 100644 index 0000000..21cc93b --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_texture_npot.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_texture_npot { + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_array_object.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_array_object.java new file mode 100644 index 0000000..e296140 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_array_object.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.IntBuffer; + +public interface OES_vertex_array_object { + + /** Accepted by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, GetFloatv: */ + int GL_VERTEX_ARRAY_BINDING_OES = 0x85B5; + + void glBindVertexArrayOES(@GLuint int array); + + void glDeleteVertexArraysOES(@AutoSize("arrays") @GLsizei int n, @Const @GLuint IntBuffer arrays); + + @Alternate("glDeleteVertexArraysOES") + void glDeleteVertexArraysOES(@Constant("1") @GLsizei int n, @Constant(value = "APIUtil.getInt(array)", keepParam = true) int array); + + void glGenVertexArraysOES(@AutoSize("arrays") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + @Alternate("glGenVertexArraysOES") + @GLreturn("arrays") + void glGenVertexArraysOES2(@Constant("1") @GLsizei int n, @OutParameter @GLuint IntBuffer arrays); + + boolean glIsVertexArrayOES(@GLuint int array); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_half_float.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_half_float.java new file mode 100644 index 0000000..94086ba --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_half_float.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_vertex_half_float { + + /** Accepted by the &lt;type&gt; parameter of VertexAttribPointer: */ + int GL_HALF_FLOAT_OES = 0x8D61; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_type_10_10_10_2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_type_10_10_10_2.java new file mode 100644 index 0000000..ef7c56d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/OES_vertex_type_10_10_10_2.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface OES_vertex_type_10_10_10_2 { + + /** Accepted by the &lt;type&gt; parameter of VertexAttribPointer */ + int GL_UNSIGNED_INT_10_10_10_2_OES = 0x8DF6, + GL_INT_10_10_10_2_OES = 0x8DF7; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_binning_control.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_binning_control.java new file mode 100644 index 0000000..ff6a0b2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_binning_control.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface QCOM_binning_control { + + /** Accepted by the &lt;target&gt; parameter of Hint: */ + int GL_BINNING_CONTROL_HINT_QCOM = 0x8FB0; + + /** Accepted by the &lt;hint&gt; parameter of Hint: */ + int GL_CPU_OPTIMIZED_QCOM = 0x8FB1, + GL_GPU_OPTIMIZED_QCOM = 0x8FB2, + GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM = 0x8FB3, + GL_DONT_CARE = 0x1100; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_driver_control.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_driver_control.java new file mode 100644 index 0000000..ff8863d --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_driver_control.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.*; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLreturn; +import org.lwjgl.util.generator.opengl.GLsizei; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface QCOM_driver_control { + + void glGetDriverControlsQCOM(@OutParameter @Check(value = "1", canBeNull = true) IntBuffer num, + @AutoSize(value = "driverControls", canBeNull = true) @GLsizei int size, + @OutParameter @Check(canBeNull = true) @GLuint IntBuffer driverControls); + + void glGetDriverControlStringQCOM(@GLuint int driverControl, + @AutoSize(value = "driverControlString", canBeNull = true) @GLsizei int bufSize, + @OutParameter @Check(value = "1", canBeNull = true) @GLsizei IntBuffer length, + @OutParameter @Check(canBeNull = true) @GLchar ByteBuffer driverControlString); + + @Alternate("glGetDriverControlStringQCOM") + @GLreturn(value = "driverControlString", maxLength = "bufSize") + void glGetDriverControlStringQCOM2(@GLuint int driverControl, + @GLsizei int bufSize, + @OutParameter @GLsizei @Constant("MemoryUtil.getAddress0(driverControlString_length)") IntBuffer length, + @OutParameter @GLchar ByteBuffer driverControlString); + + void glEnableDriverControlQCOM(@GLuint int driverControl); + + void glDisableDriverControlQCOM(@GLuint int driverControl); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get.java new file mode 100644 index 0000000..9e9b4c2 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.Result; +import org.lwjgl.util.generator.opengl.*; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface QCOM_extended_get { + + /** Accepted by the &lt;pname&gt; parameter of ExtGetTexLevelParameterivQCOM */ + int GL_TEXTURE_WIDTH_QCOM = 0x8BD2, + GL_TEXTURE_HEIGHT_QCOM = 0x8BD3, + GL_TEXTURE_DEPTH_QCOM = 0x8BD4, + GL_TEXTURE_INTERNAL_FORMAT_QCOM = 0x8BD5, + GL_TEXTURE_FORMAT_QCOM = 0x8BD6, + GL_TEXTURE_TYPE_QCOM = 0x8BD7, + GL_TEXTURE_IMAGE_VALID_QCOM = 0x8BD8, + GL_TEXTURE_NUM_LEVELS_QCOM = 0x8BD9, + GL_TEXTURE_TARGET_QCOM = 0x8BDA, + GL_TEXTURE_OBJECT_VALID_QCOM = 0x8BDB; + + /** Accepted by the &lt;pname&gt; parameter of ExtTexObjectStateOverrideiQCOM */ + int GL_STATE_RESTORE = 0x8BDC; + + void glExtGetTexturesQCOM(@OutParameter @Check("1") @GLuint IntBuffer textures, + @AutoSize("textures") int maxTextures, + @OutParameter @Check("1") IntBuffer numTextures); + + void glExtGetBuffersQCOM(@OutParameter @Check("1") @GLuint IntBuffer buffers, + @AutoSize("buffers") int maxBuffers, + @OutParameter @Check("1") IntBuffer numBuffers); + + void glExtGetRenderbuffersQCOM(@OutParameter @Check("1") @GLuint IntBuffer renderbuffers, + @AutoSize("renderbuffers") int maxRenderbuffers, + @OutParameter @Check("1") IntBuffer numRenderbuffers); + + void glExtGetFramebuffersQCOM(@OutParameter @Check("1") @GLuint IntBuffer framebuffers, + @AutoSize("framebuffers") int maxFramebuffers, + @OutParameter @Check("1") IntBuffer numFramebuffers); + + void glExtGetTexLevelParameterivQCOM(@GLuint int texture, @GLenum int face, int level, + @GLenum int pname, @OutParameter @Check("1") IntBuffer params); + + void glExtTexObjectStateOverrideiQCOM(@GLenum int target, @GLenum int pname, int param); + + void glExtGetTexSubImageQCOM(@GLenum int target, int level, + int xoffset, int yoffset, int zoffset, + @GLsizei int width, @GLsizei int height, @GLsizei int depth, + @GLenum int format, @GLenum int type, + @OutParameter + @Check("GLChecks.calculateImageStorage(texels, format, type, width, height, depth)") + @GLbyte + @GLshort + @GLint + @GLfloat Buffer texels); + + void glExtGetBufferPointervQCOM(@GLenum int target, @Result @GLvoid ByteBuffer params); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get2.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get2.java new file mode 100644 index 0000000..2a0fd7e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_extended_get2.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.AutoSize; +import org.lwjgl.util.generator.Check; +import org.lwjgl.util.generator.OutParameter; +import org.lwjgl.util.generator.opengl.GLchar; +import org.lwjgl.util.generator.opengl.GLenum; +import org.lwjgl.util.generator.opengl.GLuint; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public interface QCOM_extended_get2 { + + void glExtGetShadersQCOM(@OutParameter @Check("1") @GLuint IntBuffer shaders, + @AutoSize("shaders") int maxShaders, + @OutParameter @Check("1") IntBuffer numShaders); + + void glExtGetProgramsQCOM(@OutParameter @Check("1") @GLuint IntBuffer programs, + @AutoSize("programs") int maxPrograms, + @OutParameter @Check("1") IntBuffer numPrograms); + + boolean glExtIsProgramBinaryQCOM(@GLuint int program); + + void glExtGetProgramBinarySourceQCOM(@GLuint int program, @GLenum int shadertype, + @OutParameter @Check @GLchar ByteBuffer source, @OutParameter @Check("1") IntBuffer length); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_performance_monitor_global_mode.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_performance_monitor_global_mode.java new file mode 100644 index 0000000..45d145c --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_performance_monitor_global_mode.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface QCOM_performance_monitor_global_mode { + + /** + * Accepted by the &lt;cap&gt; parameter of Enable and Disable, and + * IsEnabled, and by the &lt;pname&gt; parameter of GetBooleanv, GetIntegerv, + * and GetFloatv: + */ + int GL_PERFMON_GLOBAL_MODE_QCOM = 0x8FA0; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_tiled_rendering.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_tiled_rendering.java new file mode 100644 index 0000000..5ba1e91 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_tiled_rendering.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +import org.lwjgl.util.generator.opengl.GLbitfield; +import org.lwjgl.util.generator.opengl.GLuint; + +public interface QCOM_tiled_rendering { + + /** + * Accepted by the &lt;preserveMask&gt; parameter of StartTilingQCOM and + * EndTilingQCOM + */ + int GL_COLOR_BUFFER_BIT0_QCOM = 0x00000001, + GL_COLOR_BUFFER_BIT1_QCOM = 0x00000002, + GL_COLOR_BUFFER_BIT2_QCOM = 0x00000004, + GL_COLOR_BUFFER_BIT3_QCOM = 0x00000008, + GL_COLOR_BUFFER_BIT4_QCOM = 0x00000010, + GL_COLOR_BUFFER_BIT5_QCOM = 0x00000020, + GL_COLOR_BUFFER_BIT6_QCOM = 0x00000040, + GL_COLOR_BUFFER_BIT7_QCOM = 0x00000080, + GL_DEPTH_BUFFER_BIT0_QCOM = 0x00000100, + GL_DEPTH_BUFFER_BIT1_QCOM = 0x00000200, + GL_DEPTH_BUFFER_BIT2_QCOM = 0x00000400, + GL_DEPTH_BUFFER_BIT3_QCOM = 0x00000800, + GL_DEPTH_BUFFER_BIT4_QCOM = 0x00001000, + GL_DEPTH_BUFFER_BIT5_QCOM = 0x00002000, + GL_DEPTH_BUFFER_BIT6_QCOM = 0x00004000, + GL_DEPTH_BUFFER_BIT7_QCOM = 0x00008000, + GL_STENCIL_BUFFER_BIT0_QCOM = 0x00010000, + GL_STENCIL_BUFFER_BIT1_QCOM = 0x00020000, + GL_STENCIL_BUFFER_BIT2_QCOM = 0x00040000, + GL_STENCIL_BUFFER_BIT3_QCOM = 0x00080000, + GL_STENCIL_BUFFER_BIT4_QCOM = 0x00100000, + GL_STENCIL_BUFFER_BIT5_QCOM = 0x00200000, + GL_STENCIL_BUFFER_BIT6_QCOM = 0x00400000, + GL_STENCIL_BUFFER_BIT7_QCOM = 0x00800000, + GL_MULTISAMPLE_BUFFER_BIT0_QCOM = 0x01000000, + GL_MULTISAMPLE_BUFFER_BIT1_QCOM = 0x02000000, + GL_MULTISAMPLE_BUFFER_BIT2_QCOM = 0x04000000, + GL_MULTISAMPLE_BUFFER_BIT3_QCOM = 0x08000000, + GL_MULTISAMPLE_BUFFER_BIT4_QCOM = 0x10000000, + GL_MULTISAMPLE_BUFFER_BIT5_QCOM = 0x20000000, + GL_MULTISAMPLE_BUFFER_BIT6_QCOM = 0x40000000, + GL_MULTISAMPLE_BUFFER_BIT7_QCOM = 0x80000000; + + void glStartTilingQCOM(@GLuint int x, @GLuint int y, @GLuint int width, @GLuint int height, + @GLbitfield int preserveMask); + + void glEndTilingQCOM(@GLbitfield int preserveMask); + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_writeonly_rendering.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_writeonly_rendering.java new file mode 100644 index 0000000..c1d9fc8 --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/QCOM_writeonly_rendering.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface QCOM_writeonly_rendering { + + /** Accepted by the &lt;cap&gt; parameter of Enable, Disable. */ + int GL_WRITEONLY_RENDERING_QCOM = 0x8823; + +} \ No newline at end of file diff --git a/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/VIV_shader_binary.java b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/VIV_shader_binary.java new file mode 100644 index 0000000..249cd1e --- /dev/null +++ b/etc/lwjgl-2.9.1/src/templates/org/lwjgl/opengles/VIV_shader_binary.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2002-2011 LWJGL Project + * 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. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengles; + +public interface VIV_shader_binary { + + /** Accepted by the &lt;binaryformat&gt; parameter of ShaderBinary: */ + int GL_SHADER_BINARY_VIV = 0x8FC4; + +} diff --git a/etc/slick-util.jar b/etc/slick-util.jar new file mode 100644 index 0000000000000000000000000000000000000000..10b552a987ffa3045f4bf016a41972de1739fa14 GIT binary patch literal 102748 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 literal 0 HcmV?d00001 diff --git a/upload all.sh b/upload all.sh new file mode 100644 index 0000000..e69de29